diff --git a/.github/workflows/advisory-cron.yaml b/.github/workflows/advisory-cron.yaml new file mode 100644 index 00000000..31bac5a3 --- /dev/null +++ b/.github/workflows/advisory-cron.yaml @@ -0,0 +1,17 @@ +name: Advisories +on: + schedule: + - cron: '0 18 * * *' +jobs: + cargo-deny: + runs-on: ubuntu-latest + strategy: + matrix: + checks: + - advisories + - bans licenses sources + steps: + - uses: actions/checkout@v2 + - uses: EmbarkStudios/cargo-deny-action@v1 + with: + command: check ${{ matrix.checks }} diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..8519ac5e --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,177 @@ +name: CI +on: + push: + branches: + - main + pull_request: + branches: + - main +jobs: + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + default: true + components: rustfmt + - uses: Swatinem/rust-cache@v1 + - run: ./scripts/ci/fmt + shell: bash + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + default: true + components: clippy + - uses: Swatinem/rust-cache@v1 + - run: ./scripts/ci/lint + shell: bash + + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + default: true + - uses: Swatinem/rust-cache@v1 + - name: Build rust docs + run: ./scripts/ci/rust-docs + shell: bash + - name: Install doxygen + run: sudo apt-get install -y doxygen + shell: bash + + cargo-deny: + runs-on: ubuntu-latest + strategy: + matrix: + checks: + - advisories + - bans licenses sources + continue-on-error: ${{ matrix.checks == 'advisories' }} + steps: + - uses: actions/checkout@v2 + - uses: EmbarkStudios/cargo-deny-action@v1 + with: + arguments: '--manifest-path ./rust/Cargo.toml' + command: check ${{ matrix.checks }} + + wasm_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install wasm-bindgen-cli + run: cargo install wasm-bindgen-cli wasm-opt + - name: Install wasm32 target + run: rustup target add wasm32-unknown-unknown + - name: run tests + run: ./scripts/ci/wasm_tests + deno_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: denoland/setup-deno@v1 + with: + deno-version: v1.x + - name: Install wasm-bindgen-cli + run: cargo install wasm-bindgen-cli wasm-opt + - name: Install wasm32 target + run: rustup target add wasm32-unknown-unknown + - name: run tests + run: ./scripts/ci/deno_tests + + js_fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: install + run: yarn global add prettier + - name: format + run: prettier -c javascript/.prettierrc javascript + + js_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install wasm-bindgen-cli + run: cargo install wasm-bindgen-cli wasm-opt + - name: Install wasm32 target + run: rustup target add wasm32-unknown-unknown + - name: run tests + run: ./scripts/ci/js_tests + + cmake_build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly-2023-01-26 + default: true + - uses: Swatinem/rust-cache@v1 + - name: Install CMocka + run: sudo apt-get install -y libcmocka-dev + - name: Install/update CMake + uses: jwlawson/actions-setup-cmake@v1.12 + with: + cmake-version: latest + - name: Install rust-src + run: rustup component add rust-src + - name: Build and test C bindings + run: ./scripts/ci/cmake-build Release Static + shell: bash + + linux: + runs-on: ubuntu-latest + strategy: + matrix: + toolchain: + - 1.67.0 + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: ${{ matrix.toolchain }} + default: true + - uses: Swatinem/rust-cache@v1 + - run: ./scripts/ci/build-test + shell: bash + + macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + default: true + - uses: Swatinem/rust-cache@v1 + - run: ./scripts/ci/build-test + shell: bash + + windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.67.0 + default: true + - uses: Swatinem/rust-cache@v1 + - run: ./scripts/ci/build-test + shell: bash diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 00000000..b501d526 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,52 @@ +on: + push: + branches: + - main + +name: Documentation + +jobs: + deploy-docs: + concurrency: deploy-docs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Cache + uses: Swatinem/rust-cache@v1 + + - name: Clean docs dir + run: rm -rf docs + shell: bash + + - name: Clean Rust docs dir + uses: actions-rs/cargo@v1 + with: + command: clean + args: --manifest-path ./rust/Cargo.toml --doc + + - name: Build Rust docs + uses: actions-rs/cargo@v1 + with: + command: doc + args: --manifest-path ./rust/Cargo.toml --workspace --all-features --no-deps + + - name: Move Rust docs + run: mkdir -p docs && mv rust/target/doc/* docs/. + shell: bash + + - name: Configure root page + run: echo '' > docs/index.html + + - name: Deploy docs + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000..762671ff --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,214 @@ +name: Release +on: + push: + branches: + - main + +jobs: + check_if_wasm_version_upgraded: + name: Check if WASM version has been upgraded + runs-on: ubuntu-latest + outputs: + wasm_version: ${{ steps.version-updated.outputs.current-package-version }} + wasm_has_updated: ${{ steps.version-updated.outputs.has-updated }} + steps: + - uses: JiPaix/package-json-updated-action@v1.0.5 + id: version-updated + with: + path: rust/automerge-wasm/package.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-wasm: + name: Publish WASM package + runs-on: ubuntu-latest + needs: + - check_if_wasm_version_upgraded + # We create release only if the version in the package.json has been upgraded + if: needs.check_if_wasm_version_upgraded.outputs.wasm_has_updated == 'true' + steps: + - uses: actions/setup-node@v3 + with: + node-version: '16.x' + registry-url: 'https://registry.npmjs.org' + - uses: denoland/setup-deno@v1 + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{ github.ref }} + - name: Get rid of local github workflows + run: rm -r .github/workflows + - name: Remove tmp_branch if it exists + run: git push origin :tmp_branch || true + - run: git checkout -b tmp_branch + - name: Install wasm-bindgen-cli + run: cargo install wasm-bindgen-cli wasm-opt + - name: Install wasm32 target + run: rustup target add wasm32-unknown-unknown + - name: run wasm js tests + id: wasm_js_tests + run: ./scripts/ci/wasm_tests + - name: run wasm deno tests + id: wasm_deno_tests + run: ./scripts/ci/deno_tests + - name: build release + id: build_release + run: | + npm --prefix $GITHUB_WORKSPACE/rust/automerge-wasm run release + - name: Collate deno release files + if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success' + run: | + mkdir $GITHUB_WORKSPACE/deno_wasm_dist + cp $GITHUB_WORKSPACE/rust/automerge-wasm/deno/* $GITHUB_WORKSPACE/deno_wasm_dist + cp $GITHUB_WORKSPACE/rust/automerge-wasm/index.d.ts $GITHUB_WORKSPACE/deno_wasm_dist + cp $GITHUB_WORKSPACE/rust/automerge-wasm/README.md $GITHUB_WORKSPACE/deno_wasm_dist + cp $GITHUB_WORKSPACE/rust/automerge-wasm/LICENSE $GITHUB_WORKSPACE/deno_wasm_dist + sed -i '1i /// ' $GITHUB_WORKSPACE/deno_wasm_dist/automerge_wasm.js + - name: Create npm release + if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success' + run: | + if [ "$(npm --prefix $GITHUB_WORKSPACE/rust/automerge-wasm show . version)" = "$VERSION" ]; then + echo "This version is already published" + exit 0 + fi + EXTRA_ARGS="--access public" + if [[ $VERSION == *"alpha."* ]] || [[ $VERSION == *"beta."* ]] || [[ $VERSION == *"rc."* ]]; then + echo "Is pre-release version" + EXTRA_ARGS="$EXTRA_ARGS --tag next" + fi + if [ "$NODE_AUTH_TOKEN" = "" ]; then + echo "Can't publish on NPM, You need a NPM_TOKEN secret." + false + fi + npm publish $GITHUB_WORKSPACE/rust/automerge-wasm $EXTRA_ARGS + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + VERSION: ${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }} + - name: Commit wasm deno release files + run: | + git config --global user.name "actions" + git config --global user.email actions@github.com + git add $GITHUB_WORKSPACE/deno_wasm_dist + git commit -am "Add deno release files" + git push origin tmp_branch + - name: Tag wasm release + if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success' + uses: softprops/action-gh-release@v1 + with: + name: Automerge Wasm v${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }} + tag_name: js/automerge-wasm-${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }} + target_commitish: tmp_branch + generate_release_notes: false + draft: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Remove tmp_branch + run: git push origin :tmp_branch + check_if_js_version_upgraded: + name: Check if JS version has been upgraded + runs-on: ubuntu-latest + outputs: + js_version: ${{ steps.version-updated.outputs.current-package-version }} + js_has_updated: ${{ steps.version-updated.outputs.has-updated }} + steps: + - uses: JiPaix/package-json-updated-action@v1.0.5 + id: version-updated + with: + path: javascript/package.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-js: + name: Publish JS package + runs-on: ubuntu-latest + needs: + - check_if_js_version_upgraded + - check_if_wasm_version_upgraded + - publish-wasm + # We create release only if the version in the package.json has been upgraded and after the WASM release + if: | + (always() && ! cancelled()) && + (needs.publish-wasm.result == 'success' || needs.publish-wasm.result == 'skipped') && + needs.check_if_js_version_upgraded.outputs.js_has_updated == 'true' + steps: + - uses: actions/setup-node@v3 + with: + node-version: '16.x' + registry-url: 'https://registry.npmjs.org' + - uses: denoland/setup-deno@v1 + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{ github.ref }} + - name: Get rid of local github workflows + run: rm -r .github/workflows + - name: Remove js_tmp_branch if it exists + run: git push origin :js_tmp_branch || true + - run: git checkout -b js_tmp_branch + - name: check js formatting + run: | + yarn global add prettier + prettier -c javascript/.prettierrc javascript + - name: run js tests + id: js_tests + run: | + cargo install wasm-bindgen-cli wasm-opt + rustup target add wasm32-unknown-unknown + ./scripts/ci/js_tests + - name: build js release + id: build_release + run: | + npm --prefix $GITHUB_WORKSPACE/javascript run build + - name: build js deno release + id: build_deno_release + run: | + VERSION=$WASM_VERSION npm --prefix $GITHUB_WORKSPACE/javascript run deno:build + env: + WASM_VERSION: ${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }} + - name: run deno tests + id: deno_tests + run: | + npm --prefix $GITHUB_WORKSPACE/javascript run deno:test + - name: Collate deno release files + if: steps.js_tests.outcome == 'success' && steps.deno_tests.outcome == 'success' + run: | + mkdir $GITHUB_WORKSPACE/deno_js_dist + cp $GITHUB_WORKSPACE/javascript/deno_dist/* $GITHUB_WORKSPACE/deno_js_dist + - name: Create npm release + if: steps.js_tests.outcome == 'success' && steps.deno_tests.outcome == 'success' + run: | + if [ "$(npm --prefix $GITHUB_WORKSPACE/javascript show . version)" = "$VERSION" ]; then + echo "This version is already published" + exit 0 + fi + EXTRA_ARGS="--access public" + if [[ $VERSION == *"alpha."* ]] || [[ $VERSION == *"beta."* ]] || [[ $VERSION == *"rc."* ]]; then + echo "Is pre-release version" + EXTRA_ARGS="$EXTRA_ARGS --tag next" + fi + if [ "$NODE_AUTH_TOKEN" = "" ]; then + echo "Can't publish on NPM, You need a NPM_TOKEN secret." + false + fi + npm publish $GITHUB_WORKSPACE/javascript $EXTRA_ARGS + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + VERSION: ${{ needs.check_if_js_version_upgraded.outputs.js_version }} + - name: Commit js deno release files + run: | + git config --global user.name "actions" + git config --global user.email actions@github.com + git add $GITHUB_WORKSPACE/deno_js_dist + git commit -am "Add deno js release files" + git push origin js_tmp_branch + - name: Tag JS release + if: steps.js_tests.outcome == 'success' && steps.deno_tests.outcome == 'success' + uses: softprops/action-gh-release@v1 + with: + name: Automerge v${{ needs.check_if_js_version_upgraded.outputs.js_version }} + tag_name: js/automerge-${{ needs.check_if_js_version_upgraded.outputs.js_version }} + target_commitish: js_tmp_branch + generate_release_notes: false + draft: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Remove js_tmp_branch + run: git push origin :js_tmp_branch diff --git a/.gitignore b/.gitignore index d5e150a5..f77865d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ +/.direnv +perf.* +/Cargo.lock +build/ +.vim/* /target -**/*.rs.bk -Cargo.lock -libtest.rmeta - -.direnv/ -result -result-lib diff --git a/.rustfmt.toml b/.rustfmt.toml deleted file mode 100644 index 44b6aab5..00000000 --- a/.rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ -group_imports = "StdExternalCrate" -imports_granularity = "Crate" diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9160c704..00000000 --- a/.travis.yml +++ /dev/null @@ -1,71 +0,0 @@ -os: linux -dist: xenial -language: rust - -if: branch = main - -install: -- rustup self update -- rustup component add clippy -- rustup component add rustfmt -- curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -- nvm install 10 - -jobs: - allow_failures: - - rust: nightly - fast_finish: true - include: - - name: Stable - Format and Clippy - rust: stable - script: - - cargo fmt --all -- --check - - cargo clippy --all-targets --all-features -- -D warnings - - name: Stable - Build and Test - rust: stable - script: - - cargo build --all-targets --workspace - - cargo test --workspace - - name: Stable - Wasm and Interop - rust: stable - script: - - wasm-pack test automerge-frontend --node - - cd automerge-backend-wasm - - yarn release - - yarn test:js - - - name: Beta - Format and Clippy - rust: beta - script: - - cargo fmt --all -- --check - - cargo clippy --all-targets --all-features -- -D warnings - - name: Beta - Build and Test - rust: beta - script: - - cargo build --all-targets --workspace - - cargo test --workspace - - name: Beta - Wasm and Interop - rust: beta - script: - - wasm-pack test automerge-frontend --node - - cd automerge-backend-wasm - - yarn release - - yarn test:js - - - name: Nightly - Format and Clippy - rust: nightly - script: - - cargo fmt --all -- --check - - cargo clippy --all-targets --all-features -- -D warnings - - name: Nightly - Build and Test - rust: nightly - script: - - cargo build --all-targets --workspace - - cargo test --workspace - - name: Nightly - Wasm and Interop - rust: nightly - script: - - wasm-pack test automerge-frontend --node - - cd automerge-backend-wasm - - yarn release - - yarn test:js diff --git a/Cargo.nix b/Cargo.nix deleted file mode 100644 index 64540fd8..00000000 --- a/Cargo.nix +++ /dev/null @@ -1,6345 +0,0 @@ - -# This file was @generated by crate2nix 0.9.0 with the command: -# "generate" -# See https://github.com/kolloch/crate2nix for more info. - -{ nixpkgs ? -, pkgs ? import nixpkgs { config = {}; } -, lib ? pkgs.lib -, stdenv ? pkgs.stdenv -, buildRustCrateForPkgs ? if buildRustCrate != null - then lib.warn "`buildRustCrate` is deprecated, use `buildRustCrateForPkgs` instead" (_: buildRustCrate) - else pkgs: pkgs.buildRustCrate - # Deprecated -, buildRustCrate ? null - # This is used as the `crateOverrides` argument for `buildRustCrate`. -, defaultCrateOverrides ? pkgs.defaultCrateOverrides - # The features to enable for the root_crate or the workspace_members. -, rootFeatures ? [ "default" ] - # If true, throw errors instead of issueing deprecation warnings. -, strictDeprecation ? false - # Used for conditional compilation based on CPU feature detection. -, targetFeatures ? [] - # Whether to perform release builds: longer compile times, faster binaries. -, release ? true - # Additional crate2nix configuration if it exists. -, crateConfig - ? if builtins.pathExists ./crate-config.nix - then pkgs.callPackage ./crate-config.nix {} - else {} -}: - -rec { - # - # "public" attributes that we attempt to keep stable with new versions of crate2nix. - # - - - # Refer your crate build derivation by name here. - # You can override the features with - # workspaceMembers."${crateName}".build.override { features = [ "default" "feature1" ... ]; }. - workspaceMembers = { - "automerge" = rec { - packageId = "automerge"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-backend" = rec { - packageId = "automerge-backend"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-backend"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-backend-wasm" = rec { - packageId = "automerge-backend-wasm"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-backend-wasm"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-c" = rec { - packageId = "automerge-c"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-c"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-cli" = rec { - packageId = "automerge-cli"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-cli"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-frontend" = rec { - packageId = "automerge-frontend"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-frontend"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - "automerge-protocol" = rec { - packageId = "automerge-protocol"; - build = internal.buildRustCrateWithFeatures { - packageId = "automerge-protocol"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; - }; - - # A derivation that joins the outputs of all workspace members together. - allWorkspaceMembers = pkgs.symlinkJoin { - name = "all-workspace-members"; - paths = - let members = builtins.attrValues workspaceMembers; - in builtins.map (m: m.build) members; - }; - - # - # "internal" ("private") attributes that may change in every new version of crate2nix. - # - - internal = rec { - # Build and dependency information for crates. - # Many of the fields are passed one-to-one to buildRustCrate. - # - # Noteworthy: - # * `dependencies`/`buildDependencies`: similar to the corresponding fields for buildRustCrate. - # but with additional information which is used during dependency/feature resolution. - # * `resolvedDependencies`: the selected default features reported by cargo - only included for debugging. - # * `devDependencies` as of now not used by `buildRustCrate` but used to - # inject test dependencies into the build - - crates = { - "adler" = rec { - crateName = "adler"; - version = "1.0.2"; - edition = "2015"; - sha256 = "1zim79cvzd5yrkzl3nyfx0avijwgk9fqv3yrscdy1cc79ih02qpj"; - authors = [ - "Jonas Schievink " - ]; - features = { - "default" = [ "std" ]; - "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; - }; - }; - "aho-corasick" = rec { - crateName = "aho-corasick"; - version = "0.7.15"; - edition = "2015"; - sha256 = "1rb8gzhljl8r87dpf2n5pnqnkl694casgns4ma0sqzd4zazzw13l"; - libName = "aho_corasick"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "memchr"; - packageId = "memchr"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "memchr/use_std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "ansi_term 0.11.0" = rec { - crateName = "ansi_term"; - version = "0.11.0"; - edition = "2015"; - sha256 = "16wpvrghvd0353584i1idnsgm0r3vchg8fyrm0x8ayv1rgvbljgf"; - authors = [ - "ogham@bsago.me" - "Ryan Scheel (Havvy) " - "Josh Triplett " - ]; - dependencies = [ - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."os" == "windows"); - features = [ "errhandlingapi" "consoleapi" "processenv" ]; - } - ]; - - }; - "ansi_term 0.12.1" = rec { - crateName = "ansi_term"; - version = "0.12.1"; - edition = "2015"; - sha256 = "1ljmkbilxgmhavxvxqa7qvm6f3fjggi7q2l3a72q9x0cxjvrnanm"; - authors = [ - "ogham@bsago.me" - "Ryan Scheel (Havvy) " - "Josh Triplett " - ]; - dependencies = [ - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."os" == "windows"); - features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; - } - ]; - features = { - "derive_serde_style" = [ "serde" ]; - }; - }; - "anyhow" = rec { - crateName = "anyhow"; - version = "1.0.40"; - edition = "2018"; - sha256 = "0fq6qxlzp3bwrjbs3wp4i470k8vsvlkpx3q2wpl79gawvf9cvci8"; - authors = [ - "David Tolnay " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "atty" = rec { - crateName = "atty"; - version = "0.2.14"; - edition = "2015"; - sha256 = "1s7yslcs6a28c5vz7jwj63lkfgyx8mx99fdirlhi9lbhhzhrpcyr"; - authors = [ - "softprops " - ]; - dependencies = [ - { - name = "hermit-abi"; - packageId = "hermit-abi"; - target = { target, features }: (target."os" == "hermit"); - } - { - name = "libc"; - packageId = "libc"; - usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; - } - ]; - - }; - "autocfg" = rec { - crateName = "autocfg"; - version = "1.0.1"; - edition = "2015"; - sha256 = "0jj6i9zn4gjl03kjvziqdji6rwx8ykz8zk2ngpc331z2g3fk3c6d"; - authors = [ - "Josh Stone " - ]; - - }; - "automerge" = rec { - crateName = "automerge"; - version = "0.0.2"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge; }; - authors = [ - "Alex Good " - ]; - dependencies = [ - { - name = "automerge-backend"; - packageId = "automerge-backend"; - } - { - name = "automerge-frontend"; - packageId = "automerge-frontend"; - } - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "uuid"; - packageId = "uuid"; - features = [ "v4" ]; - } - ]; - devDependencies = [ - { - name = "criterion"; - packageId = "criterion"; - } - { - name = "env_logger"; - packageId = "env_logger"; - } - { - name = "hex"; - packageId = "hex"; - } - { - name = "pretty_assertions"; - packageId = "pretty_assertions"; - } - { - name = "rand"; - packageId = "rand 0.8.3"; - } - { - name = "test-env-log"; - packageId = "test-env-log"; - usesDefaultFeatures = false; - features = [ "trace" ]; - } - { - name = "tracing"; - packageId = "tracing"; - } - { - name = "tracing-subscriber"; - packageId = "tracing-subscriber"; - features = [ "chrono" "env-filter" "fmt" ]; - } - { - name = "unicode-segmentation"; - packageId = "unicode-segmentation"; - } - ]; - - }; - "automerge-backend" = rec { - crateName = "automerge-backend"; - version = "0.0.1"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-backend; }; - authors = [ - "Alex Good " - ]; - dependencies = [ - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "flate2"; - packageId = "flate2"; - } - { - name = "fxhash"; - packageId = "fxhash"; - } - { - name = "hex"; - packageId = "hex"; - } - { - name = "itertools"; - packageId = "itertools 0.9.0"; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "leb128"; - packageId = "leb128"; - } - { - name = "maplit"; - packageId = "maplit"; - } - { - name = "rand"; - packageId = "rand 0.7.3"; - features = [ "small_rng" ]; - } - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "sha2"; - packageId = "sha2"; - } - { - name = "thiserror"; - packageId = "thiserror"; - } - { - name = "tracing"; - packageId = "tracing"; - features = [ "log" ]; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - { - name = "web-sys"; - packageId = "web-sys"; - features = [ "console" ]; - } - ]; - devDependencies = [ - { - name = "env_logger"; - packageId = "env_logger"; - } - { - name = "test-env-log"; - packageId = "test-env-log"; - } - { - name = "tracing-subscriber"; - packageId = "tracing-subscriber"; - features = [ "chrono" "env-filter" "fmt" ]; - } - ]; - - }; - "automerge-backend-wasm" = rec { - crateName = "automerge-backend-wasm"; - version = "0.1.0"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-backend-wasm; };type = [ "cdylib" "rlib" ]; - authors = [ - "Alex Good " - "Orion Henry " - "Martin Kleppmann" - ]; - dependencies = [ - { - name = "automerge-backend"; - packageId = "automerge-backend"; - } - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "console_error_panic_hook"; - packageId = "console_error_panic_hook"; - optional = true; - } - { - name = "getrandom"; - packageId = "getrandom 0.2.2"; - features = [ "js" ]; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "serde"; - packageId = "serde"; - } - { - name = "serde-wasm-bindgen"; - packageId = "serde-wasm-bindgen"; - } - { - name = "serde_bytes"; - packageId = "serde_bytes"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "uuid"; - packageId = "uuid"; - features = [ "v4" "wasm-bindgen" "serde" ]; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - features = [ "serde-serialize" ]; - } - { - name = "web-sys"; - packageId = "web-sys"; - features = [ "console" ]; - } - ]; - devDependencies = [ - { - name = "futures"; - packageId = "futures 0.1.31"; - } - { - name = "wasm-bindgen-futures"; - packageId = "wasm-bindgen-futures 0.3.27"; - } - { - name = "wasm-bindgen-test"; - packageId = "wasm-bindgen-test"; - } - ]; - features = { - "default" = [ "console_error_panic_hook" ]; - }; - resolvedDefaultFeatures = [ "console_error_panic_hook" "default" ]; - }; - "automerge-c" = rec { - crateName = "automerge-c"; - version = "0.1.0"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-c; };type = [ "cdylib" "staticlib" ]; - authors = [ - "Orion Henry " - ]; - dependencies = [ - { - name = "automerge-backend"; - packageId = "automerge-backend"; - } - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "errno"; - packageId = "errno"; - } - { - name = "libc"; - packageId = "libc"; - } - { - name = "serde"; - packageId = "serde"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - ]; - buildDependencies = [ - { - name = "cbindgen"; - packageId = "cbindgen"; - } - ]; - - }; - "automerge-cli" = rec { - crateName = "automerge-cli"; - version = "0.1.0"; - edition = "2018"; - crateBin = [ - { name = "automerge"; path = "src/main.rs"; } - ]; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-cli; }; - authors = [ - "Alex Good " - ]; - dependencies = [ - { - name = "anyhow"; - packageId = "anyhow"; - } - { - name = "atty"; - packageId = "atty"; - } - { - name = "automerge-backend"; - packageId = "automerge-backend"; - } - { - name = "automerge-frontend"; - packageId = "automerge-frontend"; - } - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "clap"; - packageId = "clap 3.0.0-beta.2"; - } - { - name = "colored_json"; - packageId = "colored_json"; - } - { - name = "combine"; - packageId = "combine"; - } - { - name = "maplit"; - packageId = "maplit"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "thiserror"; - packageId = "thiserror"; - } - ]; - devDependencies = [ - { - name = "duct"; - packageId = "duct"; - } - ]; - - }; - "automerge-frontend" = rec { - crateName = "automerge-frontend"; - version = "0.1.0"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-frontend; }; - authors = [ - "Alex Good " - ]; - dependencies = [ - { - name = "automerge-protocol"; - packageId = "automerge-protocol"; - } - { - name = "futures"; - packageId = "futures 0.3.14"; - } - { - name = "getrandom"; - packageId = "getrandom 0.2.2"; - target = { target, features }: ((target."arch" == "wasm32") && (target."os" == "unknown")); - features = [ "js" ]; - } - { - name = "im-rc"; - packageId = "im-rc"; - } - { - name = "maplit"; - packageId = "maplit"; - } - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "thiserror"; - packageId = "thiserror"; - } - { - name = "unicode-segmentation"; - packageId = "unicode-segmentation"; - } - { - name = "uuid"; - packageId = "uuid"; - features = [ "v4" ]; - } - { - name = "uuid"; - packageId = "uuid"; - target = { target, features }: ((target."arch" == "wasm32") && (target."os" == "unknown")); - features = [ "wasm-bindgen" "v4" "serde" ]; - } - ]; - devDependencies = [ - { - name = "automerge-backend"; - packageId = "automerge-backend"; - } - { - name = "criterion"; - packageId = "criterion"; - } - { - name = "env_logger"; - packageId = "env_logger"; - } - { - name = "log"; - packageId = "log"; - } - { - name = "rand"; - packageId = "rand 0.8.3"; - } - { - name = "wasm-bindgen-test"; - packageId = "wasm-bindgen-test"; - } - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "automerge-protocol" = rec { - crateName = "automerge-protocol"; - version = "0.1.0"; - edition = "2018"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-protocol; }; - authors = [ - "Alex Good " - ]; - dependencies = [ - { - name = "hex"; - packageId = "hex"; - } - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - { - name = "thiserror"; - packageId = "thiserror"; - } - { - name = "uuid"; - packageId = "uuid"; - features = [ "v4" ]; - } - ]; - devDependencies = [ - { - name = "maplit"; - packageId = "maplit"; - } - { - name = "proptest"; - packageId = "proptest"; - } - { - name = "serde_json"; - packageId = "serde_json"; - features = [ "float_roundtrip" ]; - } - ]; - - }; - "bit-set" = rec { - crateName = "bit-set"; - version = "0.5.2"; - edition = "2015"; - sha256 = "1pjrmpsnad5ipwjsv8ppi0qrhqvgpyn3wfbvk7jy8dga6mhf24bf"; - authors = [ - "Alexis Beingessner " - ]; - dependencies = [ - { - name = "bit-vec"; - packageId = "bit-vec"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "bit-vec/std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "bit-vec" = rec { - crateName = "bit-vec"; - version = "0.6.3"; - edition = "2015"; - sha256 = "1ywqjnv60cdh1slhz67psnp422md6jdliji6alq0gmly2xm9p7rl"; - authors = [ - "Alexis Beingessner " - ]; - features = { - "default" = [ "std" ]; - "serde_no_std" = [ "serde/alloc" ]; - "serde_std" = [ "std" "serde/std" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "bitflags" = rec { - crateName = "bitflags"; - version = "1.2.1"; - edition = "2015"; - sha256 = "14qnd5nq8p2almk79m4m8ydqhd413yaxsyjp5xd19g3mikzf47fg"; - authors = [ - "The Rust Project Developers" - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "bitmaps" = rec { - crateName = "bitmaps"; - version = "2.1.0"; - edition = "2018"; - sha256 = "18k4mcwxl96yvii5kcljkpb8pg5j4jj1zbsdn26nsx4r83846403"; - authors = [ - "Bodil Stokke " - ]; - dependencies = [ - { - name = "typenum"; - packageId = "typenum"; - } - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "block-buffer" = rec { - crateName = "block-buffer"; - version = "0.7.3"; - edition = "2015"; - sha256 = "12v8wizynqin0hqf140kmp9s38q223mp1b0hkqk8j5pk8720v560"; - authors = [ - "RustCrypto Developers" - ]; - dependencies = [ - { - name = "block-padding"; - packageId = "block-padding"; - } - { - name = "byte-tools"; - packageId = "byte-tools"; - } - { - name = "byteorder"; - packageId = "byteorder"; - usesDefaultFeatures = false; - } - { - name = "generic-array"; - packageId = "generic-array"; - } - ]; - - }; - "block-padding" = rec { - crateName = "block-padding"; - version = "0.1.5"; - edition = "2015"; - sha256 = "1xbkmysiz23vimd17rnsjpw9bgjxipwfslwyygqlkx4in3dxwygs"; - authors = [ - "RustCrypto Developers" - ]; - dependencies = [ - { - name = "byte-tools"; - packageId = "byte-tools"; - } - ]; - - }; - "bstr" = rec { - crateName = "bstr"; - version = "0.2.15"; - edition = "2015"; - sha256 = "0gca4v6448clsssll3y787jgw542c9mw9phqdi7419g1jfnlf2x4"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - { - name = "memchr"; - packageId = "memchr"; - usesDefaultFeatures = false; - } - { - name = "regex-automata"; - packageId = "regex-automata"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" "unicode" ]; - "serde1" = [ "std" "serde1-nostd" "serde/std" ]; - "serde1-nostd" = [ "serde" ]; - "std" = [ "memchr/use_std" ]; - "unicode" = [ "lazy_static" "regex-automata" ]; - }; - resolvedDefaultFeatures = [ "default" "lazy_static" "regex-automata" "serde" "serde1" "serde1-nostd" "std" "unicode" ]; - }; - "bumpalo" = rec { - crateName = "bumpalo"; - version = "3.6.1"; - edition = "2018"; - sha256 = "1gndni6ng6z1v14lq5zgm1k2y9320w4bc2ijzgyz9qwx9f56nfb3"; - authors = [ - "Nick Fitzgerald " - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "byte-tools" = rec { - crateName = "byte-tools"; - version = "0.3.1"; - edition = "2015"; - sha256 = "1mqi29wsm8njpl51pfwr31wmpzs5ahlcb40wsjyd92l90ixcmdg3"; - authors = [ - "RustCrypto Developers" - ]; - - }; - "byteorder" = rec { - crateName = "byteorder"; - version = "1.4.3"; - edition = "2018"; - sha256 = "0456lv9xi1a5bcm32arknf33ikv76p3fr9yzki4lb2897p2qkh8l"; - authors = [ - "Andrew Gallant " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "bytes" = rec { - crateName = "bytes"; - version = "1.0.1"; - edition = "2018"; - sha256 = "0h6h1c8g3yj2b4k8g25gr3246mq985y0kl3z685cs784fr1ww05p"; - authors = [ - "Carl Lerche " - "Sean McArthur " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "cast" = rec { - crateName = "cast"; - version = "0.2.5"; - edition = "2018"; - sha256 = "0xdbmxf2wz6b263bg8fzpiv1rpa01y129fqi81349r6ppy2w6f6c"; - authors = [ - "Jorge Aparicio " - ]; - buildDependencies = [ - { - name = "rustc_version"; - packageId = "rustc_version"; - } - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "cbindgen" = rec { - crateName = "cbindgen"; - version = "0.14.3"; - edition = "2018"; - crateBin = []; - sha256 = "0n88s072g09sfnvsbbkfw0mgga15isj09wc6ak63brzjbmq3mq76"; - authors = [ - "Jeff Muizelaar " - "Kartikaya Gupta " - "Ryan Hunt " - ]; - dependencies = [ - { - name = "clap"; - packageId = "clap 2.33.3"; - optional = true; - } - { - name = "heck"; - packageId = "heck"; - } - { - name = "log"; - packageId = "log"; - } - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "serde"; - packageId = "serde"; - usesDefaultFeatures = false; - features = [ "derive" ]; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "syn"; - packageId = "syn"; - usesDefaultFeatures = false; - features = [ "clone-impls" "extra-traits" "full" "parsing" "printing" ]; - } - { - name = "tempfile"; - packageId = "tempfile"; - } - { - name = "toml"; - packageId = "toml"; - } - ]; - features = { - "default" = [ "clap" ]; - }; - resolvedDefaultFeatures = [ "clap" "default" ]; - }; - "cfg-if 0.1.10" = rec { - crateName = "cfg-if"; - version = "0.1.10"; - edition = "2018"; - sha256 = "08h80ihs74jcyp24cd75wwabygbbdgl05k6p5dmq8akbr78vv1a7"; - authors = [ - "Alex Crichton " - ]; - features = { - "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; - }; - }; - "cfg-if 1.0.0" = rec { - crateName = "cfg-if"; - version = "1.0.0"; - edition = "2018"; - sha256 = "1za0vb97n4brpzpv8lsbnzmq5r8f2b0cpqqr0sy8h5bn751xxwds"; - authors = [ - "Alex Crichton " - ]; - features = { - "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; - }; - }; - "chrono" = rec { - crateName = "chrono"; - version = "0.4.19"; - edition = "2015"; - sha256 = "0wyfl6c00vhfl562spnfcna3zkw8jqvcp652m9iskhl8j26dc2k7"; - authors = [ - "Kang Seonghoon " - "Brandon W Maister " - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - optional = true; - } - { - name = "num-integer"; - packageId = "num-integer"; - usesDefaultFeatures = false; - } - { - name = "num-traits"; - packageId = "num-traits"; - usesDefaultFeatures = false; - } - { - name = "winapi"; - packageId = "winapi"; - optional = true; - target = { target, features }: (target."windows" or false); - features = [ "std" "minwinbase" "minwindef" "timezoneapi" ]; - } - ]; - features = { - "clock" = [ "libc" "std" "winapi" ]; - "default" = [ "clock" "std" "oldtime" ]; - "oldtime" = [ "time" ]; - "unstable-locales" = [ "pure-rust-locales" "alloc" ]; - "wasmbind" = [ "wasm-bindgen" "js-sys" ]; - }; - resolvedDefaultFeatures = [ "clock" "libc" "std" "winapi" ]; - }; - "clap 2.33.3" = rec { - crateName = "clap"; - version = "2.33.3"; - edition = "2015"; - sha256 = "00i065a58987k1sbzqmlz721rw521zcg08jmsh40gi3khp3qmr9p"; - authors = [ - "Kevin K. " - ]; - dependencies = [ - { - name = "ansi_term"; - packageId = "ansi_term 0.11.0"; - optional = true; - target = { target, features }: (!(target."windows" or false)); - } - { - name = "atty"; - packageId = "atty"; - optional = true; - } - { - name = "bitflags"; - packageId = "bitflags"; - } - { - name = "strsim"; - packageId = "strsim 0.8.0"; - optional = true; - } - { - name = "textwrap"; - packageId = "textwrap 0.11.0"; - } - { - name = "unicode-width"; - packageId = "unicode-width"; - } - { - name = "vec_map"; - packageId = "vec_map"; - optional = true; - } - ]; - features = { - "color" = [ "ansi_term" "atty" ]; - "default" = [ "suggestions" "color" "vec_map" ]; - "doc" = [ "yaml" ]; - "lints" = [ "clippy" ]; - "suggestions" = [ "strsim" ]; - "wrap_help" = [ "term_size" "textwrap/term_size" ]; - "yaml" = [ "yaml-rust" ]; - }; - resolvedDefaultFeatures = [ "ansi_term" "atty" "color" "default" "strsim" "suggestions" "vec_map" ]; - }; - "clap 3.0.0-beta.2" = rec { - crateName = "clap"; - version = "3.0.0-beta.2"; - edition = "2018"; - sha256 = "0hm1kivw6190rxbfqhdr4hqwlrijvwh90i3d9dyyw0d5k0chdlab"; - authors = [ - "Kevin K. " - "Clap Maintainers" - ]; - dependencies = [ - { - name = "atty"; - packageId = "atty"; - optional = true; - } - { - name = "bitflags"; - packageId = "bitflags"; - } - { - name = "clap_derive"; - packageId = "clap_derive"; - optional = true; - } - { - name = "indexmap"; - packageId = "indexmap"; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - { - name = "os_str_bytes"; - packageId = "os_str_bytes"; - features = [ "raw" ]; - } - { - name = "strsim"; - packageId = "strsim 0.10.0"; - optional = true; - } - { - name = "termcolor"; - packageId = "termcolor"; - optional = true; - } - { - name = "textwrap"; - packageId = "textwrap 0.12.1"; - } - { - name = "unicode-width"; - packageId = "unicode-width"; - } - { - name = "vec_map"; - packageId = "vec_map"; - } - ]; - devDependencies = [ - { - name = "lazy_static"; - packageId = "lazy_static"; - } - ]; - features = { - "cargo" = [ "lazy_static" ]; - "color" = [ "atty" "termcolor" ]; - "debug" = [ "clap_derive/debug" ]; - "default" = [ "suggestions" "color" "derive" "std" "cargo" ]; - "derive" = [ "clap_derive" "lazy_static" ]; - "doc" = [ "yaml" "regex" ]; - "suggestions" = [ "strsim" ]; - "unstable" = [ "clap_derive/unstable" ]; - "wrap_help" = [ "terminal_size" "textwrap/terminal_size" ]; - "yaml" = [ "yaml-rust" ]; - }; - resolvedDefaultFeatures = [ "atty" "cargo" "clap_derive" "color" "default" "derive" "lazy_static" "std" "strsim" "suggestions" "termcolor" ]; - }; - "clap_derive" = rec { - crateName = "clap_derive"; - version = "3.0.0-beta.2"; - edition = "2018"; - sha256 = "18cn82jhcha7m0nkpi1a03jx8k7aaq5kxfcxnsqpaa8ih5dp23rp"; - procMacro = true; - authors = [ - "Guillaume Pinot " - "Clap Maintainers" - ]; - dependencies = [ - { - name = "heck"; - packageId = "heck"; - } - { - name = "proc-macro-error"; - packageId = "proc-macro-error"; - } - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - features = [ "full" ]; - } - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "colored_json" = rec { - crateName = "colored_json"; - version = "2.1.0"; - edition = "2018"; - sha256 = "0r0sfwhwmzmfd54cr373j8x88x9ch2ky6016ghxj0vh19nsjxlqz"; - authors = [ - "Jens Reimann " - "Harald Hoyer " - ]; - dependencies = [ - { - name = "ansi_term"; - packageId = "ansi_term 0.12.1"; - } - { - name = "atty"; - packageId = "atty"; - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); - } - { - name = "serde"; - packageId = "serde"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - ]; - - }; - "combine" = rec { - crateName = "combine"; - version = "4.5.2"; - edition = "2018"; - sha256 = "0zkvqp21fbhznf7sjssdiw3zgx3x3q8w10c9mmjdzkf0wjsnjhyc"; - authors = [ - "Markus Westerlind " - ]; - dependencies = [ - { - name = "bytes"; - packageId = "bytes"; - optional = true; - } - { - name = "memchr"; - packageId = "memchr"; - usesDefaultFeatures = false; - } - ]; - devDependencies = [ - { - name = "bytes"; - packageId = "bytes"; - } - ]; - features = { - "default" = [ "std" ]; - "futures-03" = [ "pin-project" "std" "futures-io-03" "futures-util-03" "pin-project-lite" ]; - "pin-project" = [ "pin-project-lite" ]; - "std" = [ "memchr/use_std" "bytes" ]; - "tokio" = [ "tokio-dep" "futures-util-03" "pin-project-lite" ]; - "tokio-02" = [ "pin-project" "std" "tokio-02-dep" "futures-util-03" "pin-project-lite" "bytes_05" ]; - "tokio-03" = [ "pin-project" "std" "tokio-03-dep" "futures-util-03" "pin-project-lite" ]; - }; - resolvedDefaultFeatures = [ "bytes" "default" "std" ]; - }; - "console_error_panic_hook" = rec { - crateName = "console_error_panic_hook"; - version = "0.1.6"; - edition = "2015"; - sha256 = "04d2narcrzk9bnddz17rr2l819l82pr0h6d98s2w9q236n87dndq"; - authors = [ - "Nick Fitzgerald " - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 0.1.10"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - ]; - - }; - "crc32fast" = rec { - crateName = "crc32fast"; - version = "1.2.1"; - edition = "2015"; - sha256 = "06ivjlkzcxxxk7nyshc44aql4zjpmvirq46vmzrakdjax3n6y5c1"; - authors = [ - "Sam Rijs " - "Alex Crichton " - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "criterion" = rec { - crateName = "criterion"; - version = "0.3.4"; - edition = "2018"; - sha256 = "08rx789365x6l9kbsg2r9c5yg25rd3pj1giwyhpcqis56pbpwcmb"; - authors = [ - "Jorge Aparicio " - "Brook Heisler " - ]; - dependencies = [ - { - name = "atty"; - packageId = "atty"; - } - { - name = "cast"; - packageId = "cast"; - } - { - name = "clap"; - packageId = "clap 2.33.3"; - usesDefaultFeatures = false; - } - { - name = "criterion-plot"; - packageId = "criterion-plot"; - } - { - name = "csv"; - packageId = "csv"; - } - { - name = "itertools"; - packageId = "itertools 0.10.0"; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - } - { - name = "num-traits"; - packageId = "num-traits"; - usesDefaultFeatures = false; - } - { - name = "oorandom"; - packageId = "oorandom"; - } - { - name = "plotters"; - packageId = "plotters"; - usesDefaultFeatures = false; - features = [ "svg_backend" "area_series" "line_series" ]; - } - { - name = "rayon"; - packageId = "rayon"; - } - { - name = "regex"; - packageId = "regex"; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "serde"; - packageId = "serde"; - } - { - name = "serde_cbor"; - packageId = "serde_cbor"; - } - { - name = "serde_derive"; - packageId = "serde_derive"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "tinytemplate"; - packageId = "tinytemplate"; - } - { - name = "walkdir"; - packageId = "walkdir"; - } - ]; - features = { - "async" = [ "futures" ]; - "async_futures" = [ "futures/executor" "async" ]; - "async_smol" = [ "smol" "async" ]; - "async_std" = [ "async-std" "async" ]; - "async_tokio" = [ "tokio" "async" ]; - "default" = [ "cargo_bench_support" ]; - }; - resolvedDefaultFeatures = [ "cargo_bench_support" "default" ]; - }; - "criterion-plot" = rec { - crateName = "criterion-plot"; - version = "0.4.3"; - edition = "2018"; - sha256 = "17c8v5fv064181yspagkdcfd6jhs7233ba6g94bbl7v0xjnzw8p0"; - authors = [ - "Jorge Aparicio " - "Brook Heisler " - ]; - dependencies = [ - { - name = "cast"; - packageId = "cast"; - } - { - name = "itertools"; - packageId = "itertools 0.9.0"; - } - ]; - - }; - "crossbeam-channel" = rec { - crateName = "crossbeam-channel"; - version = "0.5.1"; - edition = "2018"; - sha256 = "1d1dnp61g51gnmc45cb4vpjsr5n62wz22an2y3q6avgifzhjgv86"; - authors = [ - "The Crossbeam Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "crossbeam-utils"; - packageId = "crossbeam-utils"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "crossbeam-utils/std" ]; - }; - resolvedDefaultFeatures = [ "crossbeam-utils" "default" "std" ]; - }; - "crossbeam-deque" = rec { - crateName = "crossbeam-deque"; - version = "0.8.0"; - edition = "2018"; - sha256 = "1ad995vzq74k7jd1pgn9zxbacyzj9ii6l0svhlb2dxzy8vxnxbwl"; - authors = [ - "The Crossbeam Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "crossbeam-epoch"; - packageId = "crossbeam-epoch"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "crossbeam-utils"; - packageId = "crossbeam-utils"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "crossbeam-epoch/std" "crossbeam-utils/std" ]; - }; - resolvedDefaultFeatures = [ "crossbeam-epoch" "crossbeam-utils" "default" "std" ]; - }; - "crossbeam-epoch" = rec { - crateName = "crossbeam-epoch"; - version = "0.9.3"; - edition = "2018"; - sha256 = "04jbrwrm6ibmd83anc3difsvk0fgjyr1aqs9k33sizlmxcwzd115"; - authors = [ - "The Crossbeam Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "crossbeam-utils"; - packageId = "crossbeam-utils"; - usesDefaultFeatures = false; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - { - name = "memoffset"; - packageId = "memoffset"; - } - { - name = "scopeguard"; - packageId = "scopeguard"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "loom" = [ "loom-crate" "crossbeam-utils/loom" ]; - "nightly" = [ "crossbeam-utils/nightly" "const_fn" ]; - "std" = [ "alloc" "crossbeam-utils/std" "lazy_static" ]; - }; - resolvedDefaultFeatures = [ "alloc" "lazy_static" "std" ]; - }; - "crossbeam-utils" = rec { - crateName = "crossbeam-utils"; - version = "0.8.3"; - edition = "2018"; - sha256 = "0j9cjldgd1x6l8lc8kvqryw35fny9iix9in5k7zfya0lm6gxksg7"; - authors = [ - "The Crossbeam Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "lazy_static" ]; - }; - resolvedDefaultFeatures = [ "default" "lazy_static" "std" ]; - }; - "csv" = rec { - crateName = "csv"; - version = "1.1.6"; - edition = "2018"; - sha256 = "1q9nqn0qlamwl18v57p82c8yhxy43lkzf2z1mndmycsvqinkm092"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "bstr"; - packageId = "bstr"; - features = [ "serde1" ]; - } - { - name = "csv-core"; - packageId = "csv-core"; - } - { - name = "itoa"; - packageId = "itoa"; - } - { - name = "ryu"; - packageId = "ryu"; - } - { - name = "serde"; - packageId = "serde"; - } - ]; - devDependencies = [ - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - ]; - - }; - "csv-core" = rec { - crateName = "csv-core"; - version = "0.1.10"; - edition = "2018"; - sha256 = "145wcc3560v1kmysqqspvddppiysr2rifqzy4nnlh3r6kxanc91b"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "memchr"; - packageId = "memchr"; - usesDefaultFeatures = false; - } - ]; - features = { - "libc" = [ "memchr/libc" ]; - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "ctor" = rec { - crateName = "ctor"; - version = "0.1.20"; - edition = "2018"; - sha256 = "0v80naiw5fp81xkyfkds6jpyamf3wx43kz4nif936bkq3any562y"; - procMacro = true; - authors = [ - "Matt Mastracci " - ]; - dependencies = [ - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - usesDefaultFeatures = false; - features = [ "full" "parsing" "printing" "proc-macro" ]; - } - ]; - - }; - "diff" = rec { - crateName = "diff"; - version = "0.1.12"; - edition = "2015"; - sha256 = "16b40bhsa2qgvgvxs983l625pkxyp6m0mzmpwg2605cvj53yl98f"; - authors = [ - "Utkarsh Kukreti " - ]; - - }; - "digest" = rec { - crateName = "digest"; - version = "0.8.1"; - edition = "2015"; - sha256 = "1madjl27f3kj5ql7kwgvb9c8b7yb7bv7yfgx7rqzj4i3fp4cil7k"; - authors = [ - "RustCrypto Developers" - ]; - dependencies = [ - { - name = "generic-array"; - packageId = "generic-array"; - } - ]; - features = { - "dev" = [ "blobby" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "duct" = rec { - crateName = "duct"; - version = "0.13.5"; - edition = "2018"; - crateBin = []; - sha256 = "13bxiy0y1dck3xz28rqw5ylf2ykv6mk8ww6g8408x26hksjs1ihg"; - authors = [ - "oconnor663@gmail.com" - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); - } - { - name = "once_cell"; - packageId = "once_cell"; - } - { - name = "os_pipe"; - packageId = "os_pipe"; - } - { - name = "shared_child"; - packageId = "shared_child"; - } - ]; - - }; - "either" = rec { - crateName = "either"; - version = "1.6.1"; - edition = "2015"; - sha256 = "0mwl9vngqf5jvrhmhn9x60kr5hivxyjxbmby2pybncxfqhf4z3g7"; - authors = [ - "bluss" - ]; - features = { - "default" = [ "use_std" ]; - }; - }; - "env_logger" = rec { - crateName = "env_logger"; - version = "0.8.3"; - edition = "2018"; - sha256 = "0gwx1pvbv99fj9wpicknyv4p2vj997xpva8ac5dg03m35q0jlf8p"; - authors = [ - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "atty"; - packageId = "atty"; - optional = true; - } - { - name = "humantime"; - packageId = "humantime"; - optional = true; - } - { - name = "log"; - packageId = "log"; - features = [ "std" ]; - } - { - name = "regex"; - packageId = "regex"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" "perf" ]; - } - { - name = "termcolor"; - packageId = "termcolor"; - optional = true; - } - ]; - features = { - "default" = [ "termcolor" "atty" "humantime" "regex" ]; - }; - resolvedDefaultFeatures = [ "atty" "default" "humantime" "regex" "termcolor" ]; - }; - "errno" = rec { - crateName = "errno"; - version = "0.2.7"; - edition = "2015"; - sha256 = "1zj6rra8n7d7gagppvvs5pvrfblad6x4ln5knb4kg7dfkkxz4s7s"; - authors = [ - "Chris Wong " - ]; - dependencies = [ - { - name = "errno-dragonfly"; - packageId = "errno-dragonfly"; - target = { target, features }: (target."os" == "dragonfly"); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."os" == "hermit"); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."os" == "wasi"); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "errhandlingapi" "minwindef" "ntdef" "winbase" ]; - } - ]; - - }; - "errno-dragonfly" = rec { - crateName = "errno-dragonfly"; - version = "0.1.1"; - edition = "2015"; - sha256 = "0rshlc00nv45f14v2l1w0ma2nf1jg5j7q9pvw7hh018r6r73bjhl"; - authors = [ - "Michael Neumann " - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - } - ]; - buildDependencies = [ - { - name = "gcc"; - packageId = "gcc"; - } - ]; - - }; - "fake-simd" = rec { - crateName = "fake-simd"; - version = "0.1.2"; - edition = "2015"; - sha256 = "1vfylvk4va2ivqx85603lyqqp0zk52cgbs4n5nfbbbqx577qm2p8"; - authors = [ - "The Rust-Crypto Project Developers" - ]; - - }; - "flate2" = rec { - crateName = "flate2"; - version = "1.0.20"; - edition = "2018"; - sha256 = "1q5b4r2rclhjbcxlbv5231avp1y6y8bynrf5v3brdzhhvr9yqfnd"; - authors = [ - "Alex Crichton " - "Josh Triplett " - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "crc32fast"; - packageId = "crc32fast"; - } - { - name = "libc"; - packageId = "libc"; - } - { - name = "miniz_oxide"; - packageId = "miniz_oxide"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "miniz_oxide"; - packageId = "miniz_oxide"; - usesDefaultFeatures = false; - target = { target, features }: ((target."arch" == "wasm32") && (!(target."os" == "emscripten"))); - } - ]; - features = { - "cloudflare_zlib" = [ "any_zlib" "cloudflare-zlib-sys" ]; - "default" = [ "rust_backend" ]; - "rust_backend" = [ "miniz_oxide" ]; - "tokio" = [ "tokio-io" "futures" ]; - "zlib" = [ "any_zlib" "libz-sys" ]; - "zlib-ng-compat" = [ "zlib" "libz-sys/zlib-ng" ]; - }; - resolvedDefaultFeatures = [ "default" "miniz_oxide" "rust_backend" ]; - }; - "fnv" = rec { - crateName = "fnv"; - version = "1.0.7"; - edition = "2015"; - sha256 = "1hc2mcqha06aibcaza94vbi81j6pr9a1bbxrxjfhc91zin8yr7iz"; - libPath = "lib.rs"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "futures 0.1.31" = rec { - crateName = "futures"; - version = "0.1.31"; - edition = "2015"; - sha256 = "0y46qbmhi37dqkch8dlfq5aninqpzqgrr98awkb3rn4fxww1lirs"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "use_std" "with-deprecated" ]; - }; - resolvedDefaultFeatures = [ "default" "use_std" "with-deprecated" ]; - }; - "futures 0.3.14" = rec { - crateName = "futures"; - version = "0.3.14"; - edition = "2018"; - sha256 = "0lyjglxqdm91wdy646x9qrys9wfpk9g93ydzl4yasng48lsq3md9"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "futures-channel"; - packageId = "futures-channel"; - usesDefaultFeatures = false; - features = [ "sink" ]; - } - { - name = "futures-core"; - packageId = "futures-core"; - usesDefaultFeatures = false; - } - { - name = "futures-executor"; - packageId = "futures-executor"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "futures-io"; - packageId = "futures-io"; - usesDefaultFeatures = false; - } - { - name = "futures-sink"; - packageId = "futures-sink"; - usesDefaultFeatures = false; - } - { - name = "futures-task"; - packageId = "futures-task"; - usesDefaultFeatures = false; - } - { - name = "futures-util"; - packageId = "futures-util"; - usesDefaultFeatures = false; - features = [ "sink" ]; - } - ]; - features = { - "alloc" = [ "futures-core/alloc" "futures-task/alloc" "futures-sink/alloc" "futures-channel/alloc" "futures-util/alloc" ]; - "async-await" = [ "futures-util/async-await" "futures-util/async-await-macro" ]; - "bilock" = [ "futures-util/bilock" ]; - "cfg-target-has-atomic" = [ "futures-core/cfg-target-has-atomic" "futures-task/cfg-target-has-atomic" "futures-channel/cfg-target-has-atomic" "futures-util/cfg-target-has-atomic" ]; - "compat" = [ "std" "futures-util/compat" ]; - "default" = [ "std" "async-await" "executor" ]; - "executor" = [ "std" "futures-executor/std" ]; - "io-compat" = [ "compat" "futures-util/io-compat" ]; - "read-initializer" = [ "futures-io/read-initializer" "futures-util/read-initializer" ]; - "std" = [ "alloc" "futures-core/std" "futures-task/std" "futures-io/std" "futures-sink/std" "futures-util/std" "futures-util/io" "futures-util/channel" ]; - "thread-pool" = [ "executor" "futures-executor/thread-pool" ]; - "unstable" = [ "futures-core/unstable" "futures-task/unstable" "futures-channel/unstable" "futures-io/unstable" "futures-util/unstable" ]; - "write-all-vectored" = [ "futures-util/write-all-vectored" ]; - }; - resolvedDefaultFeatures = [ "alloc" "async-await" "default" "executor" "futures-executor" "std" ]; - }; - "futures-channel" = rec { - crateName = "futures-channel"; - version = "0.3.14"; - edition = "2018"; - sha256 = "09gc57djz490yljh3ihvgxfwx3v81v7y0q9h06k3g4995ajwcyff"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "futures-core"; - packageId = "futures-core"; - usesDefaultFeatures = false; - } - { - name = "futures-sink"; - packageId = "futures-sink"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "alloc" = [ "futures-core/alloc" ]; - "cfg-target-has-atomic" = [ "futures-core/cfg-target-has-atomic" ]; - "default" = [ "std" ]; - "sink" = [ "futures-sink" ]; - "std" = [ "alloc" "futures-core/std" ]; - "unstable" = [ "futures-core/unstable" ]; - }; - resolvedDefaultFeatures = [ "alloc" "futures-sink" "sink" "std" ]; - }; - "futures-core" = rec { - crateName = "futures-core"; - version = "0.3.14"; - edition = "2018"; - sha256 = "058qmyvpvhzkw9aykm6ls20k3dsy4jaafdqs1xjh3jm6vp3d3309"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "std" ]; - "std" = [ "alloc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "std" ]; - }; - "futures-executor" = rec { - crateName = "futures-executor"; - version = "0.3.14"; - edition = "2018"; - sha256 = "17acz5vpbgg850wfn1z5gscl4d5rlh50ilmi9400z87d89qcpxhh"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "futures-core"; - packageId = "futures-core"; - usesDefaultFeatures = false; - } - { - name = "futures-task"; - packageId = "futures-task"; - usesDefaultFeatures = false; - } - { - name = "futures-util"; - packageId = "futures-util"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "futures-core/std" "futures-task/std" "futures-util/std" ]; - "thread-pool" = [ "std" "num_cpus" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "futures-io" = rec { - crateName = "futures-io"; - version = "0.3.14"; - edition = "2018"; - sha256 = "016b6pfcsaavwcpx22psh6n36s13ymc23nqghcxc188fncgilnin"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "futures-macro" = rec { - crateName = "futures-macro"; - version = "0.3.14"; - edition = "2018"; - sha256 = "12xvq5rsgi6jyynbxkrvbf1j620jy8xvmrqx9zmpvkc2l4rng336"; - procMacro = true; - authors = [ - "Taylor Cramer " - "Taiki Endo " - ]; - dependencies = [ - { - name = "proc-macro-hack"; - packageId = "proc-macro-hack"; - } - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - features = [ "full" ]; - } - ]; - - }; - "futures-sink" = rec { - crateName = "futures-sink"; - version = "0.3.14"; - edition = "2018"; - sha256 = "08vc88majhvizpxpr44h0c240k2ag7is99v153cf6pam7i1jjmjw"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "std" ]; - "std" = [ "alloc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "std" ]; - }; - "futures-task" = rec { - crateName = "futures-task"; - version = "0.3.14"; - edition = "2018"; - sha256 = "1g41ymlqvfjm7l1x4w2xamgwcpnh9gvh5xx1v6k3nvq7jl8aayms"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "std" ]; - "std" = [ "alloc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "std" ]; - }; - "futures-util" = rec { - crateName = "futures-util"; - version = "0.3.14"; - edition = "2018"; - sha256 = "09f0x4nisa9m9rgdcnh09yv7h4i7whbdidm6y0kkkwk09pall51w"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "futures-channel"; - packageId = "futures-channel"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "futures-core"; - packageId = "futures-core"; - usesDefaultFeatures = false; - } - { - name = "futures-io"; - packageId = "futures-io"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "futures-macro"; - packageId = "futures-macro"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "futures-sink"; - packageId = "futures-sink"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "futures-task"; - packageId = "futures-task"; - usesDefaultFeatures = false; - } - { - name = "memchr"; - packageId = "memchr"; - optional = true; - } - { - name = "pin-project-lite"; - packageId = "pin-project-lite"; - } - { - name = "pin-utils"; - packageId = "pin-utils"; - } - { - name = "proc-macro-hack"; - packageId = "proc-macro-hack"; - optional = true; - } - { - name = "proc-macro-nested"; - packageId = "proc-macro-nested"; - optional = true; - } - { - name = "slab"; - packageId = "slab"; - optional = true; - } - ]; - features = { - "alloc" = [ "futures-core/alloc" "futures-task/alloc" ]; - "async-await-macro" = [ "async-await" "futures-macro" "proc-macro-hack" "proc-macro-nested" ]; - "cfg-target-has-atomic" = [ "futures-core/cfg-target-has-atomic" "futures-task/cfg-target-has-atomic" ]; - "channel" = [ "std" "futures-channel" ]; - "compat" = [ "std" "futures_01" ]; - "default" = [ "std" "async-await" "async-await-macro" ]; - "io" = [ "std" "futures-io" "memchr" ]; - "io-compat" = [ "io" "compat" "tokio-io" ]; - "read-initializer" = [ "io" "futures-io/read-initializer" "futures-io/unstable" ]; - "sink" = [ "futures-sink" ]; - "std" = [ "alloc" "futures-core/std" "futures-task/std" "slab" ]; - "unstable" = [ "futures-core/unstable" "futures-task/unstable" ]; - "write-all-vectored" = [ "io" ]; - }; - resolvedDefaultFeatures = [ "alloc" "async-await" "async-await-macro" "channel" "futures-channel" "futures-io" "futures-macro" "futures-sink" "io" "memchr" "proc-macro-hack" "proc-macro-nested" "sink" "slab" "std" ]; - }; - "fxhash" = rec { - crateName = "fxhash"; - version = "0.2.1"; - edition = "2015"; - sha256 = "037mb9ichariqi45xm6mz0b11pa92gj38ba0409z3iz239sns6y3"; - libPath = "lib.rs"; - authors = [ - "cbreeden " - ]; - dependencies = [ - { - name = "byteorder"; - packageId = "byteorder"; - } - ]; - - }; - "gcc" = rec { - crateName = "gcc"; - version = "0.3.55"; - edition = "2015"; - crateBin = []; - sha256 = "1hng1sajn4r67hndvhjysswz8niayjwvcj42zphpxzhbz89kjpwg"; - authors = [ - "Alex Crichton " - ]; - features = { - "parallel" = [ "rayon" ]; - }; - }; - "generic-array" = rec { - crateName = "generic-array"; - version = "0.12.4"; - edition = "2015"; - sha256 = "1gfpay78vijl9vrwl1k9v7fbvbhkhcmnrk4kfg9l6x24y4s9zpzz"; - libName = "generic_array"; - authors = [ - "Bartłomiej Kamiński " - "Aaron Trent " - ]; - dependencies = [ - { - name = "typenum"; - packageId = "typenum"; - } - ]; - - }; - "getrandom 0.1.16" = rec { - crateName = "getrandom"; - version = "0.1.16"; - edition = "2018"; - sha256 = "1kjzmz60qx9mn615ks1akjbf36n3lkv27zfwbcam0fzmj56wphwg"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "libc"; - packageId = "libc"; - usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); - } - { - name = "wasi"; - packageId = "wasi 0.9.0+wasi-snapshot-preview1"; - target = { target, features }: (target."os" == "wasi"); - } - ]; - features = { - "rustc-dep-of-std" = [ "compiler_builtins" "core" ]; - "test-in-browser" = [ "wasm-bindgen" ]; - "wasm-bindgen" = [ "bindgen" "js-sys" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "getrandom 0.2.2" = rec { - crateName = "getrandom"; - version = "0.2.2"; - edition = "2018"; - sha256 = "1j1jcwahnkn45kapq9i5nvw2s5hcfmp1zpjx0fzl0wcy4w2mfjf9"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "js-sys"; - packageId = "js-sys"; - optional = true; - target = { target, features }: ((target."arch" == "wasm32") && (target."os" == "unknown")); - } - { - name = "libc"; - packageId = "libc"; - usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); - } - { - name = "wasi"; - packageId = "wasi 0.10.2+wasi-snapshot-preview1"; - target = { target, features }: (target."os" == "wasi"); - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - optional = true; - usesDefaultFeatures = false; - target = { target, features }: ((target."arch" == "wasm32") && (target."os" == "unknown")); - } - ]; - features = { - "js" = [ "wasm-bindgen" "js-sys" ]; - "rustc-dep-of-std" = [ "compiler_builtins" "core" "libc/rustc-dep-of-std" "wasi/rustc-dep-of-std" ]; - }; - resolvedDefaultFeatures = [ "js" "js-sys" "std" "wasm-bindgen" ]; - }; - "half" = rec { - crateName = "half"; - version = "1.7.1"; - edition = "2018"; - sha256 = "1wzavaaaa2jwkm4i1dbglmwjfsdhn4n73wrkbdzllaynlams5b32"; - authors = [ - "Kathryn Long " - ]; - features = { - "serialize" = [ "serde" ]; - "std" = [ "alloc" ]; - }; - }; - "hashbrown" = rec { - crateName = "hashbrown"; - version = "0.9.1"; - edition = "2018"; - sha256 = "016dsm9s4xmxlkw2jfikm54qlz6vyk0qr280gab7kzp342jf9byp"; - authors = [ - "Amanieu d'Antras " - ]; - features = { - "ahash-compile-time-rng" = [ "ahash/compile-time-rng" ]; - "default" = [ "ahash" "inline-more" ]; - "rustc-dep-of-std" = [ "nightly" "core" "compiler_builtins" "alloc" "rustc-internal-api" ]; - }; - resolvedDefaultFeatures = [ "raw" ]; - }; - "heck" = rec { - crateName = "heck"; - version = "0.3.2"; - edition = "2018"; - sha256 = "1b56s2c1ymdd0qmy31bw0ndhm31hcdamnhg3npp7ssrmc1ag9jw7"; - authors = [ - "Without Boats " - ]; - dependencies = [ - { - name = "unicode-segmentation"; - packageId = "unicode-segmentation"; - } - ]; - - }; - "hermit-abi" = rec { - crateName = "hermit-abi"; - version = "0.1.18"; - edition = "2018"; - sha256 = "0p6czgbk1izviwxzm6ypy3vz2wqj1yd3ab03wp82xqjng7klsbrj"; - authors = [ - "Stefan Lankes" - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - usesDefaultFeatures = false; - } - ]; - features = { - "rustc-dep-of-std" = [ "core" "compiler_builtins/rustc-dep-of-std" "libc/rustc-dep-of-std" ]; - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "hex" = rec { - crateName = "hex"; - version = "0.4.3"; - edition = "2018"; - sha256 = "0w1a4davm1lgzpamwnba907aysmlrnygbqmfis2mqjx5m552a93z"; - authors = [ - "KokaKiwi " - ]; - features = { - "default" = [ "std" ]; - "std" = [ "alloc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "default" "std" ]; - }; - "humantime" = rec { - crateName = "humantime"; - version = "2.1.0"; - edition = "2018"; - sha256 = "1r55pfkkf5v0ji1x6izrjwdq9v6sc7bv99xj6srywcar37xmnfls"; - authors = [ - "Paul Colomiets " - ]; - - }; - "im-rc" = rec { - crateName = "im-rc"; - version = "15.0.0"; - edition = "2018"; - sha256 = "0gsgcs1nn38r40973l6zr1v4d85f4s9qyl32n5f20jphf5z9ba1w"; - authors = [ - "Bodil Stokke " - ]; - dependencies = [ - { - name = "bitmaps"; - packageId = "bitmaps"; - } - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - { - name = "rand_xoshiro"; - packageId = "rand_xoshiro"; - } - { - name = "sized-chunks"; - packageId = "sized-chunks"; - } - { - name = "typenum"; - packageId = "typenum"; - } - ]; - buildDependencies = [ - { - name = "version_check"; - packageId = "version_check"; - } - ]; - features = { - "pool" = [ "refpool" "sized-chunks/refpool" ]; - }; - }; - "indexmap" = rec { - crateName = "indexmap"; - version = "1.6.2"; - edition = "2018"; - sha256 = "1wxfh55zlrlpdxfcvvvj6wwc46f23cnb0j9q71190yl9pyh4aj42"; - authors = [ - "bluss" - "Josh Stone " - ]; - dependencies = [ - { - name = "hashbrown"; - packageId = "hashbrown"; - usesDefaultFeatures = false; - features = [ "raw" ]; - } - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - "serde-1" = [ "serde" ]; - }; - }; - "itertools 0.10.0" = rec { - crateName = "itertools"; - version = "0.10.0"; - edition = "2018"; - sha256 = "06dkghwi1a6ah2103gibxnr2ys762m5x4rp75x0q43imis8p5m9p"; - authors = [ - "bluss" - ]; - dependencies = [ - { - name = "either"; - packageId = "either"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "use_std" ]; - "use_std" = [ "use_alloc" ]; - }; - resolvedDefaultFeatures = [ "default" "use_alloc" "use_std" ]; - }; - "itertools 0.9.0" = rec { - crateName = "itertools"; - version = "0.9.0"; - edition = "2018"; - sha256 = "0jyml7ygr7kijkcjdl3fk5f34y5h5jsavclim7l13zjiavw1hkr8"; - authors = [ - "bluss" - ]; - dependencies = [ - { - name = "either"; - packageId = "either"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "use_std" ]; - }; - resolvedDefaultFeatures = [ "default" "use_std" ]; - }; - "itoa" = rec { - crateName = "itoa"; - version = "0.4.7"; - edition = "2015"; - sha256 = "0di7fggbknwfjcw8cgzm1dnm3ik32l2m1f7nmyh8ipmh45h069fx"; - authors = [ - "David Tolnay " - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "js-sys" = rec { - crateName = "js-sys"; - version = "0.3.50"; - edition = "2018"; - sha256 = "0k526bcp63ma05pwxjwzfmn9zhmiqfxlqnzg8vw6g3sbx3izk69d"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - ]; - - }; - "lazy_static" = rec { - crateName = "lazy_static"; - version = "1.4.0"; - edition = "2015"; - sha256 = "0in6ikhw8mgl33wjv6q6xfrb5b9jr16q8ygjy803fay4zcisvaz2"; - authors = [ - "Marvin Löbel " - ]; - features = { - "spin_no_std" = [ "spin" ]; - }; - }; - "leb128" = rec { - crateName = "leb128"; - version = "0.2.4"; - edition = "2015"; - crateBin = []; - sha256 = "0aid6qy7qlyqr9rhb3md4s5693b93pdidkfzdw86y3x05dzshxim"; - authors = [ - "Nick Fitzgerald " - "Philip Craig " - ]; - features = { - }; - }; - "libc" = rec { - crateName = "libc"; - version = "0.2.93"; - edition = "2015"; - sha256 = "0hcd6xzln31gmi8bpydrbikgq3pj7s9cnqaslqd28nqhyrmzd1ck"; - authors = [ - "The Rust Project Developers" - ]; - features = { - "default" = [ "std" ]; - "rustc-dep-of-std" = [ "align" "rustc-std-workspace-core" ]; - "use_std" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "log" = rec { - crateName = "log"; - version = "0.4.14"; - edition = "2015"; - sha256 = "04175hv0v62shd82qydq58a48k3bjijmk54v38zgqlbxqkkbpfai"; - authors = [ - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - ]; - features = { - "kv_unstable" = [ "value-bag" ]; - "kv_unstable_serde" = [ "kv_unstable_std" "value-bag/serde" "serde" ]; - "kv_unstable_std" = [ "std" "kv_unstable" "value-bag/error" ]; - "kv_unstable_sval" = [ "kv_unstable" "value-bag/sval" "sval" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "maplit" = rec { - crateName = "maplit"; - version = "1.0.2"; - edition = "2015"; - sha256 = "07b5kjnhrrmfhgqm9wprjw8adx6i225lqp49gasgqg74lahnabiy"; - authors = [ - "bluss" - ]; - - }; - "matchers" = rec { - crateName = "matchers"; - version = "0.0.1"; - edition = "2018"; - sha256 = "1q8ckqmkjqkznvdi9x0z769yz2bmvlqcwx51ad2lpk4mfmgpi6gh"; - authors = [ - "Eliza Weisman " - ]; - dependencies = [ - { - name = "regex-automata"; - packageId = "regex-automata"; - } - ]; - - }; - "memchr" = rec { - crateName = "memchr"; - version = "2.3.4"; - edition = "2015"; - sha256 = "098m9clfs495illlw00hv2gg67mhm7jflld3msyclvi5m9xc9q8f"; - authors = [ - "Andrew Gallant " - "bluss" - ]; - features = { - "default" = [ "std" ]; - "use_std" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" "use_std" ]; - }; - "memoffset" = rec { - crateName = "memoffset"; - version = "0.6.3"; - edition = "2015"; - sha256 = "079nahsp9sr5dhahd173i6a8k0sl82w6s4awsigzilcf3rcbcgzq"; - authors = [ - "Gilad Naaman " - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "miniz_oxide" = rec { - crateName = "miniz_oxide"; - version = "0.4.4"; - edition = "2018"; - sha256 = "0jsfv00hl5rmx1nijn59sr9jmjd4rjnjhh4kdjy8d187iklih9d9"; - authors = [ - "Frommi " - "oyvindln " - ]; - dependencies = [ - { - name = "adler"; - packageId = "adler"; - usesDefaultFeatures = false; - } - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - "rustc-dep-of-std" = [ "core" "alloc" "compiler_builtins" "adler/rustc-dep-of-std" ]; - }; - }; - "num-integer" = rec { - crateName = "num-integer"; - version = "0.1.44"; - edition = "2015"; - sha256 = "1nq152y3304as1iai95hqz8prqnc94lks1s7q05sfjdmcf56kk6j"; - authors = [ - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "num-traits"; - packageId = "num-traits"; - usesDefaultFeatures = false; - } - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - "default" = [ "std" ]; - "i128" = [ "num-traits/i128" ]; - "std" = [ "num-traits/std" ]; - }; - }; - "num-traits" = rec { - crateName = "num-traits"; - version = "0.2.14"; - edition = "2015"; - sha256 = "144j176s2p76azy2ngk2vkdzgwdc0bc8c93jhki8c9fsbknb2r4s"; - authors = [ - "The Rust Project Developers" - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "num_cpus" = rec { - crateName = "num_cpus"; - version = "1.13.0"; - edition = "2015"; - sha256 = "1cv6yxhz2zbnwn8pn1yn8grg7zsnd523947fby41a737aqvryj85"; - authors = [ - "Sean McArthur " - ]; - dependencies = [ - { - name = "hermit-abi"; - packageId = "hermit-abi"; - target = { target, features }: (((target."arch" == "x86_64") || (target."arch" == "aarch64")) && (target."os" == "hermit")); - } - { - name = "libc"; - packageId = "libc"; - } - ]; - - }; - "once_cell" = rec { - crateName = "once_cell"; - version = "1.7.2"; - edition = "2018"; - sha256 = "18qmpyfigg4ibdhjy5mwcjhzk9adwlgfaqv7nj430ivm86q0i2xg"; - authors = [ - "Aleksey Kladov " - ]; - features = { - "alloc" = [ "race" ]; - "default" = [ "std" ]; - "std" = [ "alloc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "default" "race" "std" ]; - }; - "oorandom" = rec { - crateName = "oorandom"; - version = "11.1.3"; - edition = "2018"; - sha256 = "0xdm4vd89aiwnrk1xjwzklnchjqvib4klcihlc2bsd4x50mbrc8a"; - authors = [ - "Simon Heath " - ]; - - }; - "opaque-debug" = rec { - crateName = "opaque-debug"; - version = "0.2.3"; - edition = "2015"; - sha256 = "172j6bs8ndclqxa2m64qc0y1772rr73g4l9fg2svscgicnbfff98"; - authors = [ - "RustCrypto Developers" - ]; - - }; - "os_pipe" = rec { - crateName = "os_pipe"; - version = "0.9.2"; - edition = "2018"; - crateBin = []; - sha256 = "04yjs1hf88jjm17g8a2lr7ibxyyg460rzbgcw9f1yzihq833y8zv"; - authors = [ - "Jack O'Connor" - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (!(target."windows" or false)); - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "handleapi" "namedpipeapi" "processthreadsapi" "winnt" ]; - } - ]; - - }; - "os_str_bytes" = rec { - crateName = "os_str_bytes"; - version = "2.4.0"; - edition = "2018"; - sha256 = "11agh8n3x2l4sr3sxvx6byc1j3ryb1g6flb1ywn0qhq7xv1y3cmg"; - authors = [ - "dylni" - ]; - features = { - }; - resolvedDefaultFeatures = [ "raw" ]; - }; - "output_vt100" = rec { - crateName = "output_vt100"; - version = "0.1.2"; - edition = "2018"; - sha256 = "1ygqplpxz4gg3i8f3rkan2q69pqll7gv65l2mmd8r9dphnvwbkak"; - authors = [ - "Phuntsok Drak-pa " - ]; - dependencies = [ - { - name = "winapi"; - packageId = "winapi"; - features = [ "winuser" "winbase" "consoleapi" "processenv" ]; - } - ]; - - }; - "pin-project-lite" = rec { - crateName = "pin-project-lite"; - version = "0.2.6"; - edition = "2018"; - sha256 = "01g96zxghb33s1vsjmjpn9l3a2nxdqj7glf9lhq7q5wjkhjiy3nw"; - authors = [ - "Taiki Endo " - ]; - - }; - "pin-utils" = rec { - crateName = "pin-utils"; - version = "0.1.0"; - edition = "2018"; - sha256 = "117ir7vslsl2z1a7qzhws4pd01cg2d3338c47swjyvqv2n60v1wb"; - authors = [ - "Josef Brandl " - ]; - - }; - "plotters" = rec { - crateName = "plotters"; - version = "0.3.0"; - edition = "2018"; - sha256 = "0yihxbpqin9y6ywd57ajizqri59x7ld9qnkzgix93l39y7jhmjj5"; - authors = [ - "Hao Hou " - ]; - dependencies = [ - { - name = "num-traits"; - packageId = "num-traits"; - } - { - name = "plotters-backend"; - packageId = "plotters-backend"; - } - { - name = "plotters-svg"; - packageId = "plotters-svg"; - optional = true; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - target = { target, features }: (target."arch" == "wasm32"); - } - { - name = "web-sys"; - packageId = "web-sys"; - target = { target, features }: (target."arch" == "wasm32"); - features = [ "Document" "DomRect" "Element" "HtmlElement" "Node" "Window" "HtmlCanvasElement" "CanvasRenderingContext2d" ]; - } - ]; - features = { - "all_elements" = [ "errorbar" "candlestick" "boxplot" "histogram" ]; - "all_series" = [ "area_series" "line_series" "point_series" "surface_series" ]; - "bitmap_backend" = [ "plotters-bitmap" "ttf" ]; - "bitmap_encoder" = [ "plotters-bitmap/image_encoder" ]; - "bitmap_gif" = [ "plotters-bitmap/gif_backend" ]; - "datetime" = [ "chrono" ]; - "default" = [ "bitmap_backend" "bitmap_encoder" "bitmap_gif" "svg_backend" "chrono" "ttf" "image" "deprecated_items" "all_series" "all_elements" ]; - "evcxr" = [ "svg_backend" ]; - "svg_backend" = [ "plotters-svg" ]; - "ttf" = [ "font-kit" "rusttype" "lazy_static" ]; - }; - resolvedDefaultFeatures = [ "area_series" "line_series" "plotters-svg" "svg_backend" ]; - }; - "plotters-backend" = rec { - crateName = "plotters-backend"; - version = "0.3.0"; - edition = "2018"; - sha256 = "1425kzgyimxxq6n85y1wlhmr4y9vy16lxaiwfpga3cqwvk6zyzxh"; - authors = [ - "Hao Hou " - ]; - - }; - "plotters-svg" = rec { - crateName = "plotters-svg"; - version = "0.3.0"; - edition = "2018"; - sha256 = "04fj393irdjb4mavcdwwk1bjnw7gqjp668415a24nq6r7gi052mk"; - authors = [ - "Hao Hou " - ]; - dependencies = [ - { - name = "plotters-backend"; - packageId = "plotters-backend"; - } - ]; - features = { - }; - }; - "ppv-lite86" = rec { - crateName = "ppv-lite86"; - version = "0.2.10"; - edition = "2018"; - sha256 = "0ms8198kclg4h96ggbziixxmsdl847s648kmbx11zlmjsqjccx5c"; - authors = [ - "The CryptoCorrosion Contributors" - ]; - features = { - "default" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "simd" "std" ]; - }; - "pretty_assertions" = rec { - crateName = "pretty_assertions"; - version = "0.7.1"; - edition = "2018"; - sha256 = "1101lnyl9qf3davi8v6h6b93m25b101n43ibvr2qvpx74wn595zj"; - authors = [ - "Colin Kiegel " - "Florent Fayolle " - "Tom Milligan " - ]; - dependencies = [ - { - name = "ansi_term"; - packageId = "ansi_term 0.12.1"; - } - { - name = "ctor"; - packageId = "ctor"; - target = { target, features }: (target."windows" or false); - } - { - name = "diff"; - packageId = "diff"; - } - { - name = "output_vt100"; - packageId = "output_vt100"; - target = { target, features }: (target."windows" or false); - } - ]; - - }; - "proc-macro-error" = rec { - crateName = "proc-macro-error"; - version = "1.0.4"; - edition = "2018"; - sha256 = "1373bhxaf0pagd8zkyd03kkx6bchzf6g0dkwrwzsnal9z47lj9fs"; - authors = [ - "CreepySkeleton " - ]; - dependencies = [ - { - name = "proc-macro-error-attr"; - packageId = "proc-macro-error-attr"; - } - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - optional = true; - usesDefaultFeatures = false; - } - ]; - buildDependencies = [ - { - name = "version_check"; - packageId = "version_check"; - } - ]; - features = { - "default" = [ "syn-error" ]; - "syn-error" = [ "syn" ]; - }; - resolvedDefaultFeatures = [ "default" "syn" "syn-error" ]; - }; - "proc-macro-error-attr" = rec { - crateName = "proc-macro-error-attr"; - version = "1.0.4"; - edition = "2018"; - sha256 = "0sgq6m5jfmasmwwy8x4mjygx5l7kp8s4j60bv25ckv2j1qc41gm1"; - procMacro = true; - authors = [ - "CreepySkeleton " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - ]; - buildDependencies = [ - { - name = "version_check"; - packageId = "version_check"; - } - ]; - - }; - "proc-macro-hack" = rec { - crateName = "proc-macro-hack"; - version = "0.5.19"; - edition = "2018"; - sha256 = "1rg0kzsj7lj00qj602d3h77spwfz48vixn1wbjp7a4yrq65w9w6v"; - procMacro = true; - authors = [ - "David Tolnay " - ]; - - }; - "proc-macro-nested" = rec { - crateName = "proc-macro-nested"; - version = "0.1.7"; - edition = "2015"; - sha256 = "11hh1jynh62f3m1ii0f9gf1l3y0fhkwpmr40lz3704v848n1p25w"; - authors = [ - "David Tolnay " - ]; - - }; - "proc-macro2" = rec { - crateName = "proc-macro2"; - version = "1.0.26"; - edition = "2018"; - sha256 = "1v4w5jchgsssr727iyv986r8jaw6z80bzlhqgrbp78nw2lr02lm1"; - authors = [ - "Alex Crichton " - "David Tolnay " - ]; - dependencies = [ - { - name = "unicode-xid"; - packageId = "unicode-xid"; - } - ]; - features = { - "default" = [ "proc-macro" ]; - }; - resolvedDefaultFeatures = [ "default" "proc-macro" ]; - }; - "proptest" = rec { - crateName = "proptest"; - version = "0.10.1"; - edition = "2018"; - sha256 = "0vv4cvwn1v7h0zjajmhznll554a2ri8dqw26xql3q49r246cirhj"; - authors = [ - "Jason Lingle" - ]; - dependencies = [ - { - name = "bit-set"; - packageId = "bit-set"; - optional = true; - } - { - name = "bitflags"; - packageId = "bitflags"; - } - { - name = "byteorder"; - packageId = "byteorder"; - usesDefaultFeatures = false; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - { - name = "num-traits"; - packageId = "num-traits"; - usesDefaultFeatures = false; - } - { - name = "quick-error"; - packageId = "quick-error"; - optional = true; - } - { - name = "rand"; - packageId = "rand 0.7.3"; - usesDefaultFeatures = false; - features = [ "alloc" ]; - } - { - name = "rand_chacha"; - packageId = "rand_chacha 0.2.2"; - usesDefaultFeatures = false; - } - { - name = "rand_xorshift"; - packageId = "rand_xorshift"; - } - { - name = "regex-syntax"; - packageId = "regex-syntax"; - optional = true; - } - { - name = "rusty-fork"; - packageId = "rusty-fork"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "tempfile"; - packageId = "tempfile"; - optional = true; - } - ]; - features = { - "default" = [ "std" "fork" "timeout" "bit-set" "break-dead-code" ]; - "default-code-coverage" = [ "std" "fork" "timeout" "bit-set" ]; - "fork" = [ "std" "rusty-fork" "tempfile" ]; - "hardware-rng" = [ "x86" ]; - "std" = [ "rand/std" "byteorder/std" "lazy_static" "quick-error" "regex-syntax" "num-traits/std" ]; - "timeout" = [ "fork" "rusty-fork/timeout" ]; - }; - resolvedDefaultFeatures = [ "bit-set" "break-dead-code" "default" "fork" "lazy_static" "quick-error" "regex-syntax" "rusty-fork" "std" "tempfile" "timeout" ]; - }; - "quick-error" = rec { - crateName = "quick-error"; - version = "1.2.3"; - edition = "2015"; - sha256 = "1q6za3v78hsspisc197bg3g7rpc989qycy8ypr8ap8igv10ikl51"; - authors = [ - "Paul Colomiets " - "Colin Kiegel " - ]; - - }; - "quote" = rec { - crateName = "quote"; - version = "1.0.9"; - edition = "2018"; - sha256 = "19rjmfqzk26rxbgxy5j2ckqc2v12sw2xw8l4gi8bzpn2bmsbkl63"; - authors = [ - "David Tolnay " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "proc-macro" ]; - "proc-macro" = [ "proc-macro2/proc-macro" ]; - }; - resolvedDefaultFeatures = [ "default" "proc-macro" ]; - }; - "rand 0.7.3" = rec { - crateName = "rand"; - version = "0.7.3"; - edition = "2018"; - sha256 = "00sdaimkbz491qgi6qxkv582yivl32m2jd401kzbn94vsiwicsva"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "getrandom"; - packageId = "getrandom 0.1.16"; - rename = "getrandom_package"; - optional = true; - } - { - name = "libc"; - packageId = "libc"; - optional = true; - usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); - } - { - name = "rand_chacha"; - packageId = "rand_chacha 0.2.2"; - usesDefaultFeatures = false; - target = { target, features }: (!(target."os" == "emscripten")); - } - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - { - name = "rand_hc"; - packageId = "rand_hc 0.2.0"; - target = { target, features }: (target."os" == "emscripten"); - } - { - name = "rand_pcg"; - packageId = "rand_pcg"; - optional = true; - } - ]; - devDependencies = [ - { - name = "rand_hc"; - packageId = "rand_hc 0.2.0"; - } - { - name = "rand_pcg"; - packageId = "rand_pcg"; - } - ]; - features = { - "alloc" = [ "rand_core/alloc" ]; - "default" = [ "std" ]; - "getrandom" = [ "getrandom_package" "rand_core/getrandom" ]; - "nightly" = [ "simd_support" ]; - "simd_support" = [ "packed_simd" ]; - "small_rng" = [ "rand_pcg" ]; - "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; - "stdweb" = [ "getrandom_package/stdweb" ]; - "wasm-bindgen" = [ "getrandom_package/wasm-bindgen" ]; - }; - resolvedDefaultFeatures = [ "alloc" "default" "getrandom" "getrandom_package" "libc" "rand_pcg" "small_rng" "std" ]; - }; - "rand 0.8.3" = rec { - crateName = "rand"; - version = "0.8.3"; - edition = "2018"; - sha256 = "0zldxfx4gi551n2fna4zz9ab22zsnzw1mj5hzi5nfs24dgkfgy8f"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - optional = true; - usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); - } - { - name = "rand_chacha"; - packageId = "rand_chacha 0.3.0"; - optional = true; - usesDefaultFeatures = false; - target = { target, features }: (!(target."os" == "emscripten")); - } - { - name = "rand_core"; - packageId = "rand_core 0.6.2"; - } - { - name = "rand_hc"; - packageId = "rand_hc 0.3.0"; - optional = true; - target = { target, features }: (target."os" == "emscripten"); - } - ]; - devDependencies = [ - { - name = "rand_hc"; - packageId = "rand_hc 0.3.0"; - } - ]; - features = { - "alloc" = [ "rand_core/alloc" ]; - "default" = [ "std" "std_rng" ]; - "getrandom" = [ "rand_core/getrandom" ]; - "serde1" = [ "serde" ]; - "simd_support" = [ "packed_simd" ]; - "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; - "std_rng" = [ "rand_chacha" "rand_hc" ]; - }; - resolvedDefaultFeatures = [ "alloc" "default" "getrandom" "libc" "rand_chacha" "rand_hc" "std" "std_rng" ]; - }; - "rand_chacha 0.2.2" = rec { - crateName = "rand_chacha"; - version = "0.2.2"; - edition = "2018"; - sha256 = "00il36fkdbsmpr99p9ksmmp6dn1md7rmnwmz0rr77jbrca2yvj7l"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - "The CryptoCorrosion Contributors" - ]; - dependencies = [ - { - name = "ppv-lite86"; - packageId = "ppv-lite86"; - usesDefaultFeatures = false; - features = [ "simd" ]; - } - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - ]; - features = { - "default" = [ "std" "simd" ]; - "std" = [ "ppv-lite86/std" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "rand_chacha 0.3.0" = rec { - crateName = "rand_chacha"; - version = "0.3.0"; - edition = "2018"; - sha256 = "03df2xh5nbdvwr17qm3sviaxa95r8yhm1nil2pr0pqf90p7ka9z1"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - "The CryptoCorrosion Contributors" - ]; - dependencies = [ - { - name = "ppv-lite86"; - packageId = "ppv-lite86"; - usesDefaultFeatures = false; - features = [ "simd" ]; - } - { - name = "rand_core"; - packageId = "rand_core 0.6.2"; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "ppv-lite86/std" ]; - }; - resolvedDefaultFeatures = [ "std" ]; - }; - "rand_core 0.5.1" = rec { - crateName = "rand_core"; - version = "0.5.1"; - edition = "2018"; - sha256 = "06bdvx08v3rkz451cm7z59xwwqn1rkfh6v9ay77b14f8dwlybgch"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "getrandom"; - packageId = "getrandom 0.1.16"; - optional = true; - } - ]; - features = { - "serde1" = [ "serde" ]; - "std" = [ "alloc" "getrandom" "getrandom/std" ]; - }; - resolvedDefaultFeatures = [ "alloc" "getrandom" "std" ]; - }; - "rand_core 0.6.2" = rec { - crateName = "rand_core"; - version = "0.6.2"; - edition = "2018"; - sha256 = "1rvas1afjvd2827b8mf2ilg78h3ksl9npkrdds3wbw9x33mndkrl"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "getrandom"; - packageId = "getrandom 0.2.2"; - optional = true; - } - ]; - features = { - "serde1" = [ "serde" ]; - "std" = [ "alloc" "getrandom" "getrandom/std" ]; - }; - resolvedDefaultFeatures = [ "alloc" "getrandom" "std" ]; - }; - "rand_hc 0.2.0" = rec { - crateName = "rand_hc"; - version = "0.2.0"; - edition = "2018"; - sha256 = "0g31sqwpmsirdlwr0svnacr4dbqyz339im4ssl9738cjgfpjjcfa"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - ]; - - }; - "rand_hc 0.3.0" = rec { - crateName = "rand_hc"; - version = "0.3.0"; - edition = "2018"; - sha256 = "0wra6ar22zdjkry9dsq1mg620m4h3qb9s8rfykkz4im4crqfz41i"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "rand_core"; - packageId = "rand_core 0.6.2"; - } - ]; - - }; - "rand_pcg" = rec { - crateName = "rand_pcg"; - version = "0.2.1"; - edition = "2018"; - sha256 = "0ab4h6s6x3py833jk61lwadq83qd1c8bih2hgi6yps9rnv0x1aqn"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - ]; - features = { - "serde1" = [ "serde" ]; - }; - }; - "rand_xorshift" = rec { - crateName = "rand_xorshift"; - version = "0.2.0"; - edition = "2018"; - sha256 = "1a6wy76lc5fimm1n9n8fzhp4cfjwfwxh4hx63bg3vlh1d2w1dm3p"; - authors = [ - "The Rand Project Developers" - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - ]; - features = { - "serde1" = [ "serde" ]; - }; - }; - "rand_xoshiro" = rec { - crateName = "rand_xoshiro"; - version = "0.4.0"; - edition = "2018"; - sha256 = "013h45rikipv5bda2ixmwx5rwsk9wpc7mr0a77cz20hxi0pdvz59"; - authors = [ - "The Rand Project Developers" - ]; - dependencies = [ - { - name = "rand_core"; - packageId = "rand_core 0.5.1"; - } - ]; - features = { - "serde1" = [ "serde" ]; - }; - }; - "rayon" = rec { - crateName = "rayon"; - version = "1.5.0"; - edition = "2018"; - sha256 = "0x2n4zkrm6z3avdfh7zgcwx0wq6hx8332dx89v3j1p7s3448w3cb"; - authors = [ - "Niko Matsakis " - "Josh Stone " - ]; - dependencies = [ - { - name = "crossbeam-deque"; - packageId = "crossbeam-deque"; - } - { - name = "either"; - packageId = "either"; - usesDefaultFeatures = false; - } - { - name = "rayon-core"; - packageId = "rayon-core"; - } - ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; - - }; - "rayon-core" = rec { - crateName = "rayon-core"; - version = "1.9.0"; - edition = "2018"; - sha256 = "0jpsi8zf66xyx4m5f329lpgiql8775vpm6zqm7zn5p11b6n4dcws"; - authors = [ - "Niko Matsakis " - "Josh Stone " - ]; - dependencies = [ - { - name = "crossbeam-channel"; - packageId = "crossbeam-channel"; - } - { - name = "crossbeam-deque"; - packageId = "crossbeam-deque"; - } - { - name = "crossbeam-utils"; - packageId = "crossbeam-utils"; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - } - { - name = "num_cpus"; - packageId = "num_cpus"; - } - ]; - - }; - "redox_syscall" = rec { - crateName = "redox_syscall"; - version = "0.2.6"; - edition = "2018"; - sha256 = "0hchadrvdfvsrxg7zxz808nj521bnzq552apgs753sycbi5k2w42"; - libName = "syscall"; - authors = [ - "Jeremy Soller " - ]; - dependencies = [ - { - name = "bitflags"; - packageId = "bitflags"; - } - ]; - - }; - "regex" = rec { - crateName = "regex"; - version = "1.4.5"; - edition = "2015"; - sha256 = "06awg9164h7w4pmbchmj9pkrqn78sa8y252ijqk1pfmyvpn5cw4m"; - authors = [ - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "aho-corasick"; - packageId = "aho-corasick"; - optional = true; - } - { - name = "memchr"; - packageId = "memchr"; - optional = true; - } - { - name = "regex-syntax"; - packageId = "regex-syntax"; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" "perf" "unicode" "regex-syntax/default" ]; - "perf" = [ "perf-cache" "perf-dfa" "perf-inline" "perf-literal" ]; - "perf-literal" = [ "aho-corasick" "memchr" ]; - "unicode" = [ "unicode-age" "unicode-bool" "unicode-case" "unicode-gencat" "unicode-perl" "unicode-script" "unicode-segment" "regex-syntax/unicode" ]; - "unicode-age" = [ "regex-syntax/unicode-age" ]; - "unicode-bool" = [ "regex-syntax/unicode-bool" ]; - "unicode-case" = [ "regex-syntax/unicode-case" ]; - "unicode-gencat" = [ "regex-syntax/unicode-gencat" ]; - "unicode-perl" = [ "regex-syntax/unicode-perl" ]; - "unicode-script" = [ "regex-syntax/unicode-script" ]; - "unicode-segment" = [ "regex-syntax/unicode-segment" ]; - "unstable" = [ "pattern" ]; - "use_std" = [ "std" ]; - }; - resolvedDefaultFeatures = [ "aho-corasick" "memchr" "perf" "perf-cache" "perf-dfa" "perf-inline" "perf-literal" "std" ]; - }; - "regex-automata" = rec { - crateName = "regex-automata"; - version = "0.1.9"; - edition = "2015"; - sha256 = "1r3aqa9c0s9sfrmd2w0mli16ldjzbar0rzb1x7srfjkasrqys7df"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "byteorder"; - packageId = "byteorder"; - usesDefaultFeatures = false; - } - { - name = "regex-syntax"; - packageId = "regex-syntax"; - optional = true; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "regex-syntax" ]; - "transducer" = [ "std" "fst" ]; - }; - resolvedDefaultFeatures = [ "default" "regex-syntax" "std" ]; - }; - "regex-syntax" = rec { - crateName = "regex-syntax"; - version = "0.6.23"; - edition = "2015"; - sha256 = "0j25v3pbfaprpr1k7h8smw5xrs6j5kzznddq50nzcq1f2n4z1m94"; - authors = [ - "The Rust Project Developers" - ]; - features = { - "default" = [ "unicode" ]; - "unicode" = [ "unicode-age" "unicode-bool" "unicode-case" "unicode-gencat" "unicode-perl" "unicode-script" "unicode-segment" ]; - }; - resolvedDefaultFeatures = [ "default" "unicode" "unicode-age" "unicode-bool" "unicode-case" "unicode-gencat" "unicode-perl" "unicode-script" "unicode-segment" ]; - }; - "remove_dir_all" = rec { - crateName = "remove_dir_all"; - version = "0.5.3"; - edition = "2015"; - sha256 = "1rzqbsgkmr053bxxl04vmvsd1njyz0nxvly97aip6aa2cmb15k9s"; - authors = [ - "Aaronepower " - ]; - dependencies = [ - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "std" "errhandlingapi" "winerror" "fileapi" "winbase" ]; - } - ]; - - }; - "rustc_version" = rec { - crateName = "rustc_version"; - version = "0.2.3"; - edition = "2015"; - sha256 = "02h3x57lcr8l2pm0a645s9whdh33pn5cnrwvn5cb57vcrc53x3hk"; - authors = [ - "Marvin Löbel " - ]; - dependencies = [ - { - name = "semver"; - packageId = "semver"; - } - ]; - - }; - "rusty-fork" = rec { - crateName = "rusty-fork"; - version = "0.3.0"; - edition = "2018"; - sha256 = "0kxwq5c480gg6q0j3bg4zzyfh2kwmc3v2ba94jw8ncjc8mpcqgfb"; - authors = [ - "Jason Lingle" - ]; - dependencies = [ - { - name = "fnv"; - packageId = "fnv"; - } - { - name = "quick-error"; - packageId = "quick-error"; - } - { - name = "tempfile"; - packageId = "tempfile"; - } - { - name = "wait-timeout"; - packageId = "wait-timeout"; - optional = true; - } - ]; - features = { - "default" = [ "timeout" ]; - "timeout" = [ "wait-timeout" ]; - }; - resolvedDefaultFeatures = [ "timeout" "wait-timeout" ]; - }; - "ryu" = rec { - crateName = "ryu"; - version = "1.0.5"; - edition = "2018"; - sha256 = "0vpqv1dj7fksa6hm3zpk5rbsjs0ifbfy7xwzsyyil0rx37a03lvi"; - authors = [ - "David Tolnay " - ]; - features = { - }; - }; - "same-file" = rec { - crateName = "same-file"; - version = "1.0.6"; - edition = "2018"; - sha256 = "00h5j1w87dmhnvbv9l8bic3y7xxsnjmssvifw2ayvgx9mb1ivz4k"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "winapi-util"; - packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); - } - ]; - - }; - "scoped-tls" = rec { - crateName = "scoped-tls"; - version = "1.0.0"; - edition = "2015"; - sha256 = "1hj8lifzvivdb1z02lfnzkshpvk85nkgzxsy2hc0zky9wf894spa"; - authors = [ - "Alex Crichton " - ]; - - }; - "scopeguard" = rec { - crateName = "scopeguard"; - version = "1.1.0"; - edition = "2015"; - sha256 = "1kbqm85v43rq92vx7hfiay6pmcga03vrjbbfwqpyj3pwsg3b16nj"; - authors = [ - "bluss" - ]; - features = { - "default" = [ "use_std" ]; - }; - }; - "semver" = rec { - crateName = "semver"; - version = "0.9.0"; - edition = "2015"; - sha256 = "00q4lkcj0rrgbhviv9sd4p6qmdsipkwkbra7rh11jrhq5kpvjzhx"; - authors = [ - "Steve Klabnik " - "The Rust Project Developers" - ]; - dependencies = [ - { - name = "semver-parser"; - packageId = "semver-parser"; - } - ]; - features = { - "ci" = [ "serde" ]; - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "semver-parser" = rec { - crateName = "semver-parser"; - version = "0.7.0"; - edition = "2015"; - sha256 = "18vhypw6zgccnrlm5ps1pwa0khz7ry927iznpr88b87cagr1v2iq"; - authors = [ - "Steve Klabnik " - ]; - - }; - "serde" = rec { - crateName = "serde"; - version = "1.0.125"; - edition = "2015"; - sha256 = "0w8i0f4wsq4zd9vz1k6lq00066rjrgzlxkm25h8sfpss387cb3am"; - authors = [ - "Erick Tryzelaar " - "David Tolnay " - ]; - dependencies = [ - { - name = "serde_derive"; - packageId = "serde_derive"; - optional = true; - } - ]; - devDependencies = [ - { - name = "serde_derive"; - packageId = "serde_derive"; - } - ]; - features = { - "default" = [ "std" ]; - "derive" = [ "serde_derive" ]; - }; - resolvedDefaultFeatures = [ "default" "derive" "serde_derive" "std" ]; - }; - "serde-wasm-bindgen" = rec { - crateName = "serde-wasm-bindgen"; - version = "0.1.3"; - edition = "2018"; - sha256 = "0djnmksp2dxa56vcam93jkmssb5wp9ys6390alpavryhgqpz3rky"; - authors = [ - "Ingvar Stepanyan " - ]; - dependencies = [ - { - name = "fnv"; - packageId = "fnv"; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "serde"; - packageId = "serde"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - ]; - devDependencies = [ - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - ]; - features = { - }; - }; - "serde_bytes" = rec { - crateName = "serde_bytes"; - version = "0.11.5"; - edition = "2018"; - sha256 = "1fcb6sw8wkrj4ylm118wkb31hw124nkjnqyhbgqnd8w85zfhgbhn"; - authors = [ - "David Tolnay " - ]; - dependencies = [ - { - name = "serde"; - packageId = "serde"; - usesDefaultFeatures = false; - } - ]; - features = { - "alloc" = [ "serde/alloc" ]; - "default" = [ "std" ]; - "std" = [ "serde/std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "serde_cbor" = rec { - crateName = "serde_cbor"; - version = "0.11.1"; - edition = "2018"; - sha256 = "08m62mfqjnpa543kd9r9cyxlqc6y73avhsl3n8svgs4h5zxaq60y"; - authors = [ - "Pyfisch " - "Steven Fackler " - ]; - dependencies = [ - { - name = "half"; - packageId = "half"; - } - { - name = "serde"; - packageId = "serde"; - usesDefaultFeatures = false; - } - ]; - features = { - "alloc" = [ "serde/alloc" ]; - "default" = [ "std" ]; - "std" = [ "serde/std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "serde_derive" = rec { - crateName = "serde_derive"; - version = "1.0.125"; - edition = "2015"; - sha256 = "0vfhndim4sa1i1x38dyvrxyq5v8zxjs0av05ldfkn82qpfibg4xh"; - procMacro = true; - authors = [ - "Erick Tryzelaar " - "David Tolnay " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - } - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "serde_json" = rec { - crateName = "serde_json"; - version = "1.0.64"; - edition = "2018"; - sha256 = "0y9gk3yikncrc0zajmwc0pidr7zfwafawb4gidf6mqyskzf9g7kr"; - authors = [ - "Erick Tryzelaar " - "David Tolnay " - ]; - dependencies = [ - { - name = "itoa"; - packageId = "itoa"; - usesDefaultFeatures = false; - } - { - name = "ryu"; - packageId = "ryu"; - } - { - name = "serde"; - packageId = "serde"; - usesDefaultFeatures = false; - } - ]; - features = { - "alloc" = [ "serde/alloc" ]; - "default" = [ "std" ]; - "preserve_order" = [ "indexmap" ]; - "std" = [ "serde/std" ]; - }; - resolvedDefaultFeatures = [ "default" "float_roundtrip" "std" ]; - }; - "sha2" = rec { - crateName = "sha2"; - version = "0.8.2"; - edition = "2015"; - sha256 = "0s9yddvyg6anaikdl86wmwfim25c0d4m0xq0y2ghs34alxpg8mm2"; - authors = [ - "RustCrypto Developers" - ]; - dependencies = [ - { - name = "block-buffer"; - packageId = "block-buffer"; - } - { - name = "digest"; - packageId = "digest"; - } - { - name = "fake-simd"; - packageId = "fake-simd"; - } - { - name = "opaque-debug"; - packageId = "opaque-debug"; - } - ]; - devDependencies = [ - { - name = "digest"; - packageId = "digest"; - features = [ "dev" ]; - } - ]; - features = { - "asm" = [ "sha2-asm" ]; - "asm-aarch64" = [ "asm" "libc" ]; - "default" = [ "std" ]; - "std" = [ "digest/std" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "sharded-slab" = rec { - crateName = "sharded-slab"; - version = "0.1.1"; - edition = "2018"; - sha256 = "1qqlmr2jfhpfgav4y7lax46a7rcrzjn4a2pqj1sgjpg0krqikivr"; - authors = [ - "Eliza Weisman " - ]; - dependencies = [ - { - name = "lazy_static"; - packageId = "lazy_static"; - } - ]; - - }; - "shared_child" = rec { - crateName = "shared_child"; - version = "0.3.5"; - edition = "2018"; - sha256 = "0np6g5fmixncky9c0j5xhqxrp1rkxqnmx5vj7spq652vavazgsbb"; - authors = [ - "jacko" - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (!(target."windows" or false)); - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "synchapi" "winbase" "winerror" "winnt" ]; - } - ]; - - }; - "sized-chunks" = rec { - crateName = "sized-chunks"; - version = "0.6.4"; - edition = "2018"; - sha256 = "01yjydh1a45yp4b07fi1lkfprmj57bsjqnpac7rpik8kkxm5vrk5"; - authors = [ - "Bodil Stokke " - ]; - dependencies = [ - { - name = "bitmaps"; - packageId = "bitmaps"; - } - { - name = "typenum"; - packageId = "typenum"; - } - ]; - features = { - "default" = [ "std" ]; - "ringbuffer" = [ "array-ops" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "slab" = rec { - crateName = "slab"; - version = "0.4.2"; - edition = "2015"; - sha256 = "1y59xsa27jk84sxzswjk60xcjf8b4fm5960jwpznrrcmasyva4f1"; - authors = [ - "Carl Lerche " - ]; - - }; - "smallvec" = rec { - crateName = "smallvec"; - version = "1.6.1"; - edition = "2018"; - sha256 = "0kk08axr0ybfbjzk65a41k84mb6sfhyajmfndaka9igkx34kf3zy"; - authors = [ - "The Servo Project Developers" - ]; - features = { - }; - }; - "strsim 0.10.0" = rec { - crateName = "strsim"; - version = "0.10.0"; - edition = "2015"; - sha256 = "08s69r4rcrahwnickvi0kq49z524ci50capybln83mg6b473qivk"; - authors = [ - "Danny Guo " - ]; - - }; - "strsim 0.8.0" = rec { - crateName = "strsim"; - version = "0.8.0"; - edition = "2015"; - sha256 = "0sjsm7hrvjdifz661pjxq5w4hf190hx53fra8dfvamacvff139cf"; - authors = [ - "Danny Guo " - ]; - - }; - "syn" = rec { - crateName = "syn"; - version = "1.0.69"; - edition = "2018"; - sha256 = "1ywgmchw8cxsafmpvb415j89v46y88c0gk0bi4vcc74bpp39kzj8"; - authors = [ - "David Tolnay " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - usesDefaultFeatures = false; - } - { - name = "quote"; - packageId = "quote"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "unicode-xid"; - packageId = "unicode-xid"; - } - ]; - features = { - "default" = [ "derive" "parsing" "printing" "clone-impls" "proc-macro" ]; - "printing" = [ "quote" ]; - "proc-macro" = [ "proc-macro2/proc-macro" "quote/proc-macro" ]; - "test" = [ "syn-test-suite/all-features" ]; - }; - resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "full" "parsing" "printing" "proc-macro" "quote" "visit" "visit-mut" ]; - }; - "tempfile" = rec { - crateName = "tempfile"; - version = "3.2.0"; - edition = "2018"; - sha256 = "08pbf3c1i42382dc44dil5bgiawcsi0qk6zdibw10f69rxiwdhfs"; - authors = [ - "Steven Allen " - "The Rust Project Developers" - "Ashley Mannix " - "Jason White " - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); - } - { - name = "rand"; - packageId = "rand 0.8.3"; - } - { - name = "redox_syscall"; - packageId = "redox_syscall"; - target = { target, features }: (target."os" == "redox"); - } - { - name = "remove_dir_all"; - packageId = "remove_dir_all"; - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "fileapi" "handleapi" "winbase" ]; - } - ]; - - }; - "termcolor" = rec { - crateName = "termcolor"; - version = "1.1.2"; - edition = "2018"; - sha256 = "1x65i1ny4m6z1by62ra6wdcrd557p2ysm866x0pg60zby2cxizid"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "winapi-util"; - packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); - } - ]; - - }; - "test-env-log" = rec { - crateName = "test-env-log"; - version = "0.2.7"; - edition = "2018"; - sha256 = "0i151j7r14j65lrv753s138g7pkslq6l1jyg0q6qmk1hlqrb3r5k"; - procMacro = true; - authors = [ - "Daniel Mueller " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - features = [ "full" ]; - } - ]; - features = { - "default" = [ "log" ]; - }; - resolvedDefaultFeatures = [ "default" "log" "trace" ]; - }; - "textwrap 0.11.0" = rec { - crateName = "textwrap"; - version = "0.11.0"; - edition = "2015"; - sha256 = "0q5hky03ik3y50s9sz25r438bc4nwhqc6dqwynv4wylc807n29nk"; - authors = [ - "Martin Geisler " - ]; - dependencies = [ - { - name = "unicode-width"; - packageId = "unicode-width"; - } - ]; - - }; - "textwrap 0.12.1" = rec { - crateName = "textwrap"; - version = "0.12.1"; - edition = "2018"; - sha256 = "12978qmkl5gcp94lxndpvp9qxq8mxp7hm9xbrw3422dgikchhc10"; - authors = [ - "Martin Geisler " - ]; - dependencies = [ - { - name = "unicode-width"; - packageId = "unicode-width"; - } - ]; - - }; - "thiserror" = rec { - crateName = "thiserror"; - version = "1.0.24"; - edition = "2018"; - sha256 = "13m99wjikivkkwd209fgxhdprjxj17s39ldfvn1l8k89jxasdx70"; - authors = [ - "David Tolnay " - ]; - dependencies = [ - { - name = "thiserror-impl"; - packageId = "thiserror-impl"; - } - ]; - - }; - "thiserror-impl" = rec { - crateName = "thiserror-impl"; - version = "1.0.24"; - edition = "2018"; - sha256 = "1h7kh6rr4vsm79dmv8qk8drhh2if3zyxc1lqa921l96q22b1hrbp"; - procMacro = true; - authors = [ - "David Tolnay " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - } - ]; - - }; - "thread_local" = rec { - crateName = "thread_local"; - version = "1.1.3"; - edition = "2018"; - sha256 = "1gccp3grndpi6dyhzylz4hkqnkzc1xyri98n0xwwhnn90i7d4640"; - authors = [ - "Amanieu d'Antras " - ]; - dependencies = [ - { - name = "once_cell"; - packageId = "once_cell"; - } - ]; - - }; - "tinytemplate" = rec { - crateName = "tinytemplate"; - version = "1.2.1"; - edition = "2015"; - sha256 = "1g5n77cqkdh9hy75zdb01adxn45mkh9y40wdr7l68xpz35gnnkdy"; - authors = [ - "Brook Heisler " - ]; - dependencies = [ - { - name = "serde"; - packageId = "serde"; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - ]; - - }; - "toml" = rec { - crateName = "toml"; - version = "0.5.8"; - edition = "2018"; - sha256 = "1apcmjrrjw429pjw7mqlmdwwd67g8305vwqy4kw3swr612bl44d3"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "serde"; - packageId = "serde"; - } - ]; - features = { - "preserve_order" = [ "indexmap" ]; - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "tracing" = rec { - crateName = "tracing"; - version = "0.1.25"; - edition = "2018"; - sha256 = "17wmgw7bxqvhh5ls1jww4ach3ri5720cawsvbymv32j9nhmxrsq1"; - authors = [ - "Eliza Weisman " - "Tokio Contributors " - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "log"; - packageId = "log"; - optional = true; - } - { - name = "pin-project-lite"; - packageId = "pin-project-lite"; - } - { - name = "tracing-attributes"; - packageId = "tracing-attributes"; - optional = true; - } - { - name = "tracing-core"; - packageId = "tracing-core"; - usesDefaultFeatures = false; - } - ]; - devDependencies = [ - { - name = "log"; - packageId = "log"; - } - ]; - features = { - "attributes" = [ "tracing-attributes" ]; - "default" = [ "std" "attributes" ]; - "log-always" = [ "log" ]; - "std" = [ "tracing-core/std" ]; - }; - resolvedDefaultFeatures = [ "attributes" "default" "log" "std" "tracing-attributes" ]; - }; - "tracing-attributes" = rec { - crateName = "tracing-attributes"; - version = "0.1.15"; - edition = "2018"; - sha256 = "1qni83p58nrp20i256zm169dnf7cylfchkfd9iza3j076fjnybn4"; - procMacro = true; - authors = [ - "Tokio Contributors " - "Eliza Weisman " - "David Barsky " - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - usesDefaultFeatures = false; - features = [ "full" "parsing" "printing" "visit" "visit-mut" "clone-impls" "extra-traits" "proc-macro" ]; - } - ]; - features = { - }; - }; - "tracing-core" = rec { - crateName = "tracing-core"; - version = "0.1.17"; - edition = "2018"; - sha256 = "0pvbgv301vw6dq4krc14yqbyyixb42lcs4s57xw05llkgy9f63gm"; - authors = [ - "Tokio Contributors " - ]; - dependencies = [ - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - ]; - features = { - "default" = [ "std" ]; - "std" = [ "lazy_static" ]; - }; - resolvedDefaultFeatures = [ "default" "lazy_static" "std" ]; - }; - "tracing-log" = rec { - crateName = "tracing-log"; - version = "0.1.2"; - edition = "2018"; - sha256 = "1qv1cwvdqrgvizkszbff4fvkw0m3nn5yz68r3yaw2hcflivk94m6"; - authors = [ - "Tokio Contributors " - ]; - dependencies = [ - { - name = "lazy_static"; - packageId = "lazy_static"; - } - { - name = "log"; - packageId = "log"; - } - { - name = "tracing-core"; - packageId = "tracing-core"; - } - ]; - features = { - "default" = [ "log-tracer" "trace-logger" "std" ]; - "std" = [ "log/std" ]; - }; - resolvedDefaultFeatures = [ "log-tracer" "std" ]; - }; - "tracing-serde" = rec { - crateName = "tracing-serde"; - version = "0.1.2"; - edition = "2018"; - sha256 = "12xjirg0b3cparjdhkd9pksrmv33gz7rdm4gfkvgk15v3x2flrgv"; - authors = [ - "Tokio Contributors " - ]; - dependencies = [ - { - name = "serde"; - packageId = "serde"; - } - { - name = "tracing-core"; - packageId = "tracing-core"; - } - ]; - - }; - "tracing-subscriber" = rec { - crateName = "tracing-subscriber"; - version = "0.2.17"; - edition = "2018"; - sha256 = "1ajv10w2k16aprdb8mxk672xmnwxh80sm9jpsfjqxxivz339cl3h"; - authors = [ - "Eliza Weisman " - "David Barsky " - "Tokio Contributors " - ]; - dependencies = [ - { - name = "ansi_term"; - packageId = "ansi_term 0.12.1"; - optional = true; - } - { - name = "chrono"; - packageId = "chrono"; - optional = true; - usesDefaultFeatures = false; - features = [ "clock" "std" ]; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - optional = true; - } - { - name = "matchers"; - packageId = "matchers"; - optional = true; - } - { - name = "regex"; - packageId = "regex"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - } - { - name = "serde_json"; - packageId = "serde_json"; - optional = true; - } - { - name = "sharded-slab"; - packageId = "sharded-slab"; - optional = true; - } - { - name = "smallvec"; - packageId = "smallvec"; - optional = true; - } - { - name = "thread_local"; - packageId = "thread_local"; - optional = true; - } - { - name = "tracing"; - packageId = "tracing"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "tracing-core"; - packageId = "tracing-core"; - } - { - name = "tracing-log"; - packageId = "tracing-log"; - optional = true; - usesDefaultFeatures = false; - features = [ "log-tracer" "std" ]; - } - { - name = "tracing-serde"; - packageId = "tracing-serde"; - optional = true; - } - ]; - devDependencies = [ - { - name = "regex"; - packageId = "regex"; - usesDefaultFeatures = false; - features = [ "std" ]; - } - { - name = "tracing"; - packageId = "tracing"; - } - { - name = "tracing-log"; - packageId = "tracing-log"; - } - ]; - features = { - "ansi" = [ "fmt" "ansi_term" ]; - "default" = [ "env-filter" "smallvec" "fmt" "ansi" "chrono" "tracing-log" "json" ]; - "env-filter" = [ "matchers" "regex" "lazy_static" "tracing" ]; - "fmt" = [ "registry" ]; - "json" = [ "tracing-serde" "serde" "serde_json" ]; - "registry" = [ "sharded-slab" "thread_local" ]; - }; - resolvedDefaultFeatures = [ "ansi" "ansi_term" "chrono" "default" "env-filter" "fmt" "json" "lazy_static" "matchers" "regex" "registry" "serde" "serde_json" "sharded-slab" "smallvec" "thread_local" "tracing" "tracing-log" "tracing-serde" ]; - }; - "typenum" = rec { - crateName = "typenum"; - version = "1.13.0"; - edition = "2018"; - sha256 = "01lbbspn4080yg8wp6y7q3xcqih1c1dmkkx4pwax4z1a9436k7w7"; - build = "build/main.rs"; - authors = [ - "Paho Lurie-Gregg " - "Andre Bogus " - ]; - features = { - }; - }; - "unicode-segmentation" = rec { - crateName = "unicode-segmentation"; - version = "1.7.1"; - edition = "2015"; - sha256 = "15n736z0pbj30pj44jb9s9rjavzrmx8v8pzdgsl5yfmfwrxjw3dv"; - authors = [ - "kwantam " - "Manish Goregaokar " - ]; - features = { - }; - }; - "unicode-width" = rec { - crateName = "unicode-width"; - version = "0.1.8"; - edition = "2015"; - sha256 = "1qxizyi6xbcqyi4z79p523ywvmgsfcgfqb3zv3c8i6x1jcc5jdwk"; - authors = [ - "kwantam " - "Manish Goregaokar " - ]; - features = { - "rustc-dep-of-std" = [ "std" "core" "compiler_builtins" ]; - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "unicode-xid" = rec { - crateName = "unicode-xid"; - version = "0.2.1"; - edition = "2015"; - sha256 = "0r6mknipyy9vpz8mwmxvkx65ff2ha1n2pxqjj6f46lcn8yrhpzpp"; - authors = [ - "erick.tryzelaar " - "kwantam " - ]; - features = { - }; - resolvedDefaultFeatures = [ "default" ]; - }; - "uuid" = rec { - crateName = "uuid"; - version = "0.8.2"; - edition = "2018"; - sha256 = "1dy4ldcp7rnzjy56dxh7d2sgrcvn4q77y0a8r0a48946h66zjp5w"; - authors = [ - "Ashley Mannix" - "Christopher Armstrong" - "Dylan DPC" - "Hunar Roop Kahlon" - ]; - dependencies = [ - { - name = "getrandom"; - packageId = "getrandom 0.2.2"; - optional = true; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - usesDefaultFeatures = false; - } - ]; - features = { - "default" = [ "std" ]; - "guid" = [ "winapi" ]; - "stdweb" = [ "getrandom" "getrandom/js" ]; - "v3" = [ "md5" ]; - "v4" = [ "getrandom" ]; - "v5" = [ "sha1" ]; - "wasm-bindgen" = [ "getrandom" "getrandom/js" ]; - }; - resolvedDefaultFeatures = [ "default" "getrandom" "serde" "std" "v4" "wasm-bindgen" ]; - }; - "vec_map" = rec { - crateName = "vec_map"; - version = "0.8.2"; - edition = "2015"; - sha256 = "1481w9g1dw9rxp3l6snkdqihzyrd2f8vispzqmwjwsdyhw8xzggi"; - authors = [ - "Alex Crichton " - "Jorge Aparicio " - "Alexis Beingessner " - "Brian Anderson <>" - "tbu- <>" - "Manish Goregaokar <>" - "Aaron Turon " - "Adolfo Ochagavía <>" - "Niko Matsakis <>" - "Steven Fackler <>" - "Chase Southwood " - "Eduard Burtescu <>" - "Florian Wilkens <>" - "Félix Raimundo <>" - "Tibor Benke <>" - "Markus Siemens " - "Josh Branchaud " - "Huon Wilson " - "Corey Farwell " - "Aaron Liblong <>" - "Nick Cameron " - "Patrick Walton " - "Felix S Klock II <>" - "Andrew Paseltiner " - "Sean McArthur " - "Vadim Petrochenkov <>" - ]; - features = { - "eders" = [ "serde" ]; - }; - }; - "version_check" = rec { - crateName = "version_check"; - version = "0.9.3"; - edition = "2015"; - sha256 = "1zmkcgj2m0pq0l4wnhrp1wl1lygf7x2h5p7pvjwc4719lnlxrv2z"; - authors = [ - "Sergio Benitez " - ]; - - }; - "wait-timeout" = rec { - crateName = "wait-timeout"; - version = "0.2.0"; - edition = "2015"; - crateBin = []; - sha256 = "1xpkk0j5l9pfmjfh1pi0i89invlavfrd9av5xp0zhxgb29dhy84z"; - authors = [ - "Alex Crichton " - ]; - dependencies = [ - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); - } - ]; - - }; - "walkdir" = rec { - crateName = "walkdir"; - version = "2.3.2"; - edition = "2018"; - sha256 = "0mnszy33685v8y9js8mw6x2p3iddqs8vfj7n2dhqddnlbirz5340"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "same-file"; - packageId = "same-file"; - } - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "std" "winnt" ]; - } - { - name = "winapi-util"; - packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); - } - ]; - - }; - "wasi 0.10.2+wasi-snapshot-preview1" = rec { - crateName = "wasi"; - version = "0.10.2+wasi-snapshot-preview1"; - edition = "2018"; - sha256 = "1ii7nff4y1mpcrxzzvbpgxm7a1nn3szjf1n21jnx37c2g6dbsvzx"; - authors = [ - "The Cranelift Project Developers" - ]; - features = { - "default" = [ "std" ]; - "rustc-dep-of-std" = [ "compiler_builtins" "core" "rustc-std-workspace-alloc" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "wasi 0.9.0+wasi-snapshot-preview1" = rec { - crateName = "wasi"; - version = "0.9.0+wasi-snapshot-preview1"; - edition = "2018"; - sha256 = "06g5v3vrdapfzvfq662cij7v8a1flwr2my45nnncdv2galrdzkfc"; - authors = [ - "The Cranelift Project Developers" - ]; - features = { - "default" = [ "std" ]; - "rustc-dep-of-std" = [ "compiler_builtins" "core" "rustc-std-workspace-alloc" ]; - }; - resolvedDefaultFeatures = [ "default" "std" ]; - }; - "wasm-bindgen" = rec { - crateName = "wasm-bindgen"; - version = "0.2.73"; - edition = "2018"; - sha256 = "1n93yq72c7bd2464gg48405yzgvwakwc0cqzz647864xcm4ha943"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - } - { - name = "serde_json"; - packageId = "serde_json"; - optional = true; - } - { - name = "wasm-bindgen-macro"; - packageId = "wasm-bindgen-macro"; - } - ]; - features = { - "default" = [ "spans" "std" ]; - "enable-interning" = [ "std" ]; - "serde-serialize" = [ "serde" "serde_json" "std" ]; - "spans" = [ "wasm-bindgen-macro/spans" ]; - "strict-macro" = [ "wasm-bindgen-macro/strict-macro" ]; - "xxx_debug_only_print_generated_code" = [ "wasm-bindgen-macro/xxx_debug_only_print_generated_code" ]; - }; - resolvedDefaultFeatures = [ "default" "serde" "serde-serialize" "serde_json" "spans" "std" ]; - }; - "wasm-bindgen-backend" = rec { - crateName = "wasm-bindgen-backend"; - version = "0.2.73"; - edition = "2018"; - sha256 = "1bkxxkmxfy182aav9qqkcq7mz48yxgmx61kdr8ak55fa24j64w5f"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "bumpalo"; - packageId = "bumpalo"; - } - { - name = "lazy_static"; - packageId = "lazy_static"; - } - { - name = "log"; - packageId = "log"; - } - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - features = [ "full" ]; - } - { - name = "wasm-bindgen-shared"; - packageId = "wasm-bindgen-shared"; - } - ]; - features = { - "extra-traits" = [ "syn/extra-traits" ]; - }; - resolvedDefaultFeatures = [ "spans" ]; - }; - "wasm-bindgen-futures 0.3.27" = rec { - crateName = "wasm-bindgen-futures"; - version = "0.3.27"; - edition = "2018"; - sha256 = "073p71skp91d9v2wczl6k7z9p0w25vn43br2v2g1ncbc6hvhnhl3"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 0.1.10"; - } - { - name = "futures"; - packageId = "futures 0.1.31"; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - { - name = "web-sys"; - packageId = "web-sys"; - target = { target, features }: (builtins.elem "atomics" targetFeatures); - features = [ "MessageEvent" "Worker" ]; - } - ]; - features = { - "futures_0_3" = [ "futures-util-preview" "futures-channel-preview" "lazy_static" ]; - }; - }; - "wasm-bindgen-futures 0.4.23" = rec { - crateName = "wasm-bindgen-futures"; - version = "0.4.23"; - edition = "2018"; - sha256 = "1sk3zhmrwvz3aa9b63yz7ms04agd1dlqn5pjig0nmpi3mxkvgf41"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if 1.0.0"; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - { - name = "web-sys"; - packageId = "web-sys"; - target = { target, features }: (builtins.elem "atomics" targetFeatures); - features = [ "MessageEvent" "Worker" ]; - } - ]; - features = { - "futures-core-03-stream" = [ "futures-core" ]; - }; - }; - "wasm-bindgen-macro" = rec { - crateName = "wasm-bindgen-macro"; - version = "0.2.73"; - edition = "2018"; - sha256 = "0vqgbnbnh6zs339v6g9w3j9idi8m3s1dws8rnkypn5rz8j8lswry"; - procMacro = true; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "quote"; - packageId = "quote"; - } - { - name = "wasm-bindgen-macro-support"; - packageId = "wasm-bindgen-macro-support"; - } - ]; - features = { - "spans" = [ "wasm-bindgen-macro-support/spans" ]; - "strict-macro" = [ "wasm-bindgen-macro-support/strict-macro" ]; - }; - resolvedDefaultFeatures = [ "spans" ]; - }; - "wasm-bindgen-macro-support" = rec { - crateName = "wasm-bindgen-macro-support"; - version = "0.2.73"; - edition = "2018"; - sha256 = "0b0vcb8pvg03cmq9sg5b94a0p05bp1rc6m6dvc7qp9n813zkjdym"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - { - name = "syn"; - packageId = "syn"; - features = [ "visit" "full" ]; - } - { - name = "wasm-bindgen-backend"; - packageId = "wasm-bindgen-backend"; - } - { - name = "wasm-bindgen-shared"; - packageId = "wasm-bindgen-shared"; - } - ]; - features = { - "extra-traits" = [ "syn/extra-traits" ]; - "spans" = [ "wasm-bindgen-backend/spans" ]; - }; - resolvedDefaultFeatures = [ "spans" ]; - }; - "wasm-bindgen-shared" = rec { - crateName = "wasm-bindgen-shared"; - version = "0.2.73"; - edition = "2018"; - sha256 = "12a4kq5wvy3znkqlqn6ib25ips1k9apxjpknpca3s8xacsp479fr"; - authors = [ - "The wasm-bindgen Developers" - ]; - - }; - "wasm-bindgen-test" = rec { - crateName = "wasm-bindgen-test"; - version = "0.3.23"; - edition = "2018"; - sha256 = "0ym6d8wc0qm655ikmgp5916jggb1qzsm8pl6hjym7ak3vqafjwp9"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "console_error_panic_hook"; - packageId = "console_error_panic_hook"; - } - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "scoped-tls"; - packageId = "scoped-tls"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - { - name = "wasm-bindgen-futures"; - packageId = "wasm-bindgen-futures 0.4.23"; - } - { - name = "wasm-bindgen-test-macro"; - packageId = "wasm-bindgen-test-macro"; - } - ]; - - }; - "wasm-bindgen-test-macro" = rec { - crateName = "wasm-bindgen-test-macro"; - version = "0.3.23"; - edition = "2018"; - sha256 = "1dm8d13sn3hg5923m3gn95015zsg84ip5j15ky75h95zz6l56qga"; - procMacro = true; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "proc-macro2"; - packageId = "proc-macro2"; - } - { - name = "quote"; - packageId = "quote"; - } - ]; - - }; - "web-sys" = rec { - crateName = "web-sys"; - version = "0.3.50"; - edition = "2018"; - sha256 = "1gl1akzrzprc3hc16h1lcai2f3dm1xkr6cvd8ihqiv4g91zda1d9"; - authors = [ - "The wasm-bindgen Developers" - ]; - dependencies = [ - { - name = "js-sys"; - packageId = "js-sys"; - } - { - name = "wasm-bindgen"; - packageId = "wasm-bindgen"; - } - ]; - features = { - "AbortSignal" = [ "EventTarget" ]; - "AnalyserNode" = [ "AudioNode" "EventTarget" ]; - "Animation" = [ "EventTarget" ]; - "AnimationEvent" = [ "Event" ]; - "AnimationPlaybackEvent" = [ "Event" ]; - "Attr" = [ "EventTarget" "Node" ]; - "AudioBufferSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; - "AudioContext" = [ "BaseAudioContext" "EventTarget" ]; - "AudioDestinationNode" = [ "AudioNode" "EventTarget" ]; - "AudioNode" = [ "EventTarget" ]; - "AudioProcessingEvent" = [ "Event" ]; - "AudioScheduledSourceNode" = [ "AudioNode" "EventTarget" ]; - "AudioStreamTrack" = [ "EventTarget" "MediaStreamTrack" ]; - "AudioTrackList" = [ "EventTarget" ]; - "AudioWorklet" = [ "Worklet" ]; - "AudioWorkletGlobalScope" = [ "WorkletGlobalScope" ]; - "AudioWorkletNode" = [ "AudioNode" "EventTarget" ]; - "AuthenticatorAssertionResponse" = [ "AuthenticatorResponse" ]; - "AuthenticatorAttestationResponse" = [ "AuthenticatorResponse" ]; - "BaseAudioContext" = [ "EventTarget" ]; - "BatteryManager" = [ "EventTarget" ]; - "BeforeUnloadEvent" = [ "Event" ]; - "BiquadFilterNode" = [ "AudioNode" "EventTarget" ]; - "BlobEvent" = [ "Event" ]; - "Bluetooth" = [ "EventTarget" ]; - "BluetoothAdvertisingEvent" = [ "Event" ]; - "BluetoothDevice" = [ "EventTarget" ]; - "BluetoothPermissionResult" = [ "EventTarget" "PermissionStatus" ]; - "BluetoothRemoteGattCharacteristic" = [ "EventTarget" ]; - "BluetoothRemoteGattService" = [ "EventTarget" ]; - "BroadcastChannel" = [ "EventTarget" ]; - "CanvasCaptureMediaStream" = [ "EventTarget" "MediaStream" ]; - "CdataSection" = [ "CharacterData" "EventTarget" "Node" "Text" ]; - "ChannelMergerNode" = [ "AudioNode" "EventTarget" ]; - "ChannelSplitterNode" = [ "AudioNode" "EventTarget" ]; - "CharacterData" = [ "EventTarget" "Node" ]; - "ChromeWorker" = [ "EventTarget" "Worker" ]; - "Clipboard" = [ "EventTarget" ]; - "ClipboardEvent" = [ "Event" ]; - "CloseEvent" = [ "Event" ]; - "Comment" = [ "CharacterData" "EventTarget" "Node" ]; - "CompositionEvent" = [ "Event" "UiEvent" ]; - "ConstantSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; - "ConvolverNode" = [ "AudioNode" "EventTarget" ]; - "CssAnimation" = [ "Animation" "EventTarget" ]; - "CssConditionRule" = [ "CssGroupingRule" "CssRule" ]; - "CssCounterStyleRule" = [ "CssRule" ]; - "CssFontFaceRule" = [ "CssRule" ]; - "CssFontFeatureValuesRule" = [ "CssRule" ]; - "CssGroupingRule" = [ "CssRule" ]; - "CssImportRule" = [ "CssRule" ]; - "CssKeyframeRule" = [ "CssRule" ]; - "CssKeyframesRule" = [ "CssRule" ]; - "CssMediaRule" = [ "CssConditionRule" "CssGroupingRule" "CssRule" ]; - "CssNamespaceRule" = [ "CssRule" ]; - "CssPageRule" = [ "CssRule" ]; - "CssStyleRule" = [ "CssRule" ]; - "CssStyleSheet" = [ "StyleSheet" ]; - "CssSupportsRule" = [ "CssConditionRule" "CssGroupingRule" "CssRule" ]; - "CssTransition" = [ "Animation" "EventTarget" ]; - "CustomEvent" = [ "Event" ]; - "DedicatedWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; - "DelayNode" = [ "AudioNode" "EventTarget" ]; - "DeviceLightEvent" = [ "Event" ]; - "DeviceMotionEvent" = [ "Event" ]; - "DeviceOrientationEvent" = [ "Event" ]; - "DeviceProximityEvent" = [ "Event" ]; - "Document" = [ "EventTarget" "Node" ]; - "DocumentFragment" = [ "EventTarget" "Node" ]; - "DocumentTimeline" = [ "AnimationTimeline" ]; - "DocumentType" = [ "EventTarget" "Node" ]; - "DomMatrix" = [ "DomMatrixReadOnly" ]; - "DomPoint" = [ "DomPointReadOnly" ]; - "DomRect" = [ "DomRectReadOnly" ]; - "DomRequest" = [ "EventTarget" ]; - "DragEvent" = [ "Event" "MouseEvent" "UiEvent" ]; - "DynamicsCompressorNode" = [ "AudioNode" "EventTarget" ]; - "Element" = [ "EventTarget" "Node" ]; - "ErrorEvent" = [ "Event" ]; - "EventSource" = [ "EventTarget" ]; - "ExtendableEvent" = [ "Event" ]; - "ExtendableMessageEvent" = [ "Event" "ExtendableEvent" ]; - "FetchEvent" = [ "Event" "ExtendableEvent" ]; - "FetchObserver" = [ "EventTarget" ]; - "File" = [ "Blob" ]; - "FileReader" = [ "EventTarget" ]; - "FileSystemDirectoryEntry" = [ "FileSystemEntry" ]; - "FileSystemFileEntry" = [ "FileSystemEntry" ]; - "FocusEvent" = [ "Event" "UiEvent" ]; - "FontFaceSet" = [ "EventTarget" ]; - "FontFaceSetLoadEvent" = [ "Event" ]; - "GainNode" = [ "AudioNode" "EventTarget" ]; - "GamepadAxisMoveEvent" = [ "Event" "GamepadEvent" ]; - "GamepadButtonEvent" = [ "Event" "GamepadEvent" ]; - "GamepadEvent" = [ "Event" ]; - "GpuDevice" = [ "EventTarget" ]; - "GpuUncapturedErrorEvent" = [ "Event" ]; - "HashChangeEvent" = [ "Event" ]; - "HtmlAnchorElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlAreaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlAudioElement" = [ "Element" "EventTarget" "HtmlElement" "HtmlMediaElement" "Node" ]; - "HtmlBaseElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlBodyElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlBrElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlButtonElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlCanvasElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDataElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDataListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDetailsElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDialogElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDirectoryElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDivElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlDocument" = [ "Document" "EventTarget" "Node" ]; - "HtmlElement" = [ "Element" "EventTarget" "Node" ]; - "HtmlEmbedElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlFieldSetElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlFontElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlFormControlsCollection" = [ "HtmlCollection" ]; - "HtmlFormElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlFrameElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlFrameSetElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlHeadElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlHeadingElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlHrElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlHtmlElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlIFrameElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlImageElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlInputElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlLabelElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlLegendElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlLiElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlLinkElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMapElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMediaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMenuElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMenuItemElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMetaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlMeterElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlModElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlOListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlObjectElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlOptGroupElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlOptionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlOptionsCollection" = [ "HtmlCollection" ]; - "HtmlOutputElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlParagraphElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlParamElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlPictureElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlPreElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlProgressElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlQuoteElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlScriptElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlSelectElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlSlotElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlSourceElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlSpanElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlStyleElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableCaptionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableCellElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableColElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableRowElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTableSectionElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTemplateElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTextAreaElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTimeElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTitleElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlTrackElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlUListElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlUnknownElement" = [ "Element" "EventTarget" "HtmlElement" "Node" ]; - "HtmlVideoElement" = [ "Element" "EventTarget" "HtmlElement" "HtmlMediaElement" "Node" ]; - "IdbCursorWithValue" = [ "IdbCursor" ]; - "IdbDatabase" = [ "EventTarget" ]; - "IdbFileHandle" = [ "EventTarget" ]; - "IdbFileRequest" = [ "DomRequest" "EventTarget" ]; - "IdbLocaleAwareKeyRange" = [ "IdbKeyRange" ]; - "IdbMutableFile" = [ "EventTarget" ]; - "IdbOpenDbRequest" = [ "EventTarget" "IdbRequest" ]; - "IdbRequest" = [ "EventTarget" ]; - "IdbTransaction" = [ "EventTarget" ]; - "IdbVersionChangeEvent" = [ "Event" ]; - "IirFilterNode" = [ "AudioNode" "EventTarget" ]; - "ImageCaptureErrorEvent" = [ "Event" ]; - "InputEvent" = [ "Event" "UiEvent" ]; - "KeyboardEvent" = [ "Event" "UiEvent" ]; - "KeyframeEffect" = [ "AnimationEffect" ]; - "LocalMediaStream" = [ "EventTarget" "MediaStream" ]; - "MediaDevices" = [ "EventTarget" ]; - "MediaElementAudioSourceNode" = [ "AudioNode" "EventTarget" ]; - "MediaEncryptedEvent" = [ "Event" ]; - "MediaKeyError" = [ "Event" ]; - "MediaKeyMessageEvent" = [ "Event" ]; - "MediaKeySession" = [ "EventTarget" ]; - "MediaQueryList" = [ "EventTarget" ]; - "MediaQueryListEvent" = [ "Event" ]; - "MediaRecorder" = [ "EventTarget" ]; - "MediaRecorderErrorEvent" = [ "Event" ]; - "MediaSource" = [ "EventTarget" ]; - "MediaStream" = [ "EventTarget" ]; - "MediaStreamAudioDestinationNode" = [ "AudioNode" "EventTarget" ]; - "MediaStreamAudioSourceNode" = [ "AudioNode" "EventTarget" ]; - "MediaStreamEvent" = [ "Event" ]; - "MediaStreamTrack" = [ "EventTarget" ]; - "MediaStreamTrackEvent" = [ "Event" ]; - "MessageEvent" = [ "Event" ]; - "MessagePort" = [ "EventTarget" ]; - "MidiAccess" = [ "EventTarget" ]; - "MidiConnectionEvent" = [ "Event" ]; - "MidiInput" = [ "EventTarget" "MidiPort" ]; - "MidiMessageEvent" = [ "Event" ]; - "MidiOutput" = [ "EventTarget" "MidiPort" ]; - "MidiPort" = [ "EventTarget" ]; - "MouseEvent" = [ "Event" "UiEvent" ]; - "MouseScrollEvent" = [ "Event" "MouseEvent" "UiEvent" ]; - "MutationEvent" = [ "Event" ]; - "NetworkInformation" = [ "EventTarget" ]; - "Node" = [ "EventTarget" ]; - "Notification" = [ "EventTarget" ]; - "NotificationEvent" = [ "Event" "ExtendableEvent" ]; - "OfflineAudioCompletionEvent" = [ "Event" ]; - "OfflineAudioContext" = [ "BaseAudioContext" "EventTarget" ]; - "OfflineResourceList" = [ "EventTarget" ]; - "OffscreenCanvas" = [ "EventTarget" ]; - "OscillatorNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; - "PageTransitionEvent" = [ "Event" ]; - "PaintWorkletGlobalScope" = [ "WorkletGlobalScope" ]; - "PannerNode" = [ "AudioNode" "EventTarget" ]; - "PaymentMethodChangeEvent" = [ "Event" "PaymentRequestUpdateEvent" ]; - "PaymentRequestUpdateEvent" = [ "Event" ]; - "Performance" = [ "EventTarget" ]; - "PerformanceMark" = [ "PerformanceEntry" ]; - "PerformanceMeasure" = [ "PerformanceEntry" ]; - "PerformanceNavigationTiming" = [ "PerformanceEntry" "PerformanceResourceTiming" ]; - "PerformanceResourceTiming" = [ "PerformanceEntry" ]; - "PermissionStatus" = [ "EventTarget" ]; - "PointerEvent" = [ "Event" "MouseEvent" "UiEvent" ]; - "PopStateEvent" = [ "Event" ]; - "PopupBlockedEvent" = [ "Event" ]; - "PresentationAvailability" = [ "EventTarget" ]; - "PresentationConnection" = [ "EventTarget" ]; - "PresentationConnectionAvailableEvent" = [ "Event" ]; - "PresentationConnectionCloseEvent" = [ "Event" ]; - "PresentationConnectionList" = [ "EventTarget" ]; - "PresentationRequest" = [ "EventTarget" ]; - "ProcessingInstruction" = [ "CharacterData" "EventTarget" "Node" ]; - "ProgressEvent" = [ "Event" ]; - "PromiseRejectionEvent" = [ "Event" ]; - "PublicKeyCredential" = [ "Credential" ]; - "PushEvent" = [ "Event" "ExtendableEvent" ]; - "RadioNodeList" = [ "NodeList" ]; - "RtcDataChannel" = [ "EventTarget" ]; - "RtcDataChannelEvent" = [ "Event" ]; - "RtcPeerConnection" = [ "EventTarget" ]; - "RtcPeerConnectionIceEvent" = [ "Event" ]; - "RtcTrackEvent" = [ "Event" ]; - "RtcdtmfSender" = [ "EventTarget" ]; - "RtcdtmfToneChangeEvent" = [ "Event" ]; - "Screen" = [ "EventTarget" ]; - "ScreenOrientation" = [ "EventTarget" ]; - "ScriptProcessorNode" = [ "AudioNode" "EventTarget" ]; - "ScrollAreaEvent" = [ "Event" "UiEvent" ]; - "SecurityPolicyViolationEvent" = [ "Event" ]; - "ServiceWorker" = [ "EventTarget" ]; - "ServiceWorkerContainer" = [ "EventTarget" ]; - "ServiceWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; - "ServiceWorkerRegistration" = [ "EventTarget" ]; - "ShadowRoot" = [ "DocumentFragment" "EventTarget" "Node" ]; - "SharedWorker" = [ "EventTarget" ]; - "SharedWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; - "SourceBuffer" = [ "EventTarget" ]; - "SourceBufferList" = [ "EventTarget" ]; - "SpeechRecognition" = [ "EventTarget" ]; - "SpeechRecognitionError" = [ "Event" ]; - "SpeechRecognitionEvent" = [ "Event" ]; - "SpeechSynthesis" = [ "EventTarget" ]; - "SpeechSynthesisErrorEvent" = [ "Event" "SpeechSynthesisEvent" ]; - "SpeechSynthesisEvent" = [ "Event" ]; - "SpeechSynthesisUtterance" = [ "EventTarget" ]; - "StereoPannerNode" = [ "AudioNode" "EventTarget" ]; - "StorageEvent" = [ "Event" ]; - "SvgAnimateElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; - "SvgAnimateMotionElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; - "SvgAnimateTransformElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; - "SvgAnimationElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgCircleElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgClipPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgComponentTransferFunctionElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgDefsElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgDescElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgElement" = [ "Element" "EventTarget" "Node" ]; - "SvgEllipseElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgFilterElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgForeignObjectElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgGeometryElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgGraphicsElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgImageElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgLineElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgLinearGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGradientElement" ]; - "SvgMarkerElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgMaskElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgMetadataElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgPathSegArcAbs" = [ "SvgPathSeg" ]; - "SvgPathSegArcRel" = [ "SvgPathSeg" ]; - "SvgPathSegClosePath" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoCubicAbs" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoCubicRel" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoCubicSmoothAbs" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoCubicSmoothRel" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoQuadraticAbs" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoQuadraticRel" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoQuadraticSmoothAbs" = [ "SvgPathSeg" ]; - "SvgPathSegCurvetoQuadraticSmoothRel" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoAbs" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoHorizontalAbs" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoHorizontalRel" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoRel" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoVerticalAbs" = [ "SvgPathSeg" ]; - "SvgPathSegLinetoVerticalRel" = [ "SvgPathSeg" ]; - "SvgPathSegMovetoAbs" = [ "SvgPathSeg" ]; - "SvgPathSegMovetoRel" = [ "SvgPathSeg" ]; - "SvgPatternElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgPolygonElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgPolylineElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgRadialGradientElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGradientElement" ]; - "SvgRectElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGeometryElement" "SvgGraphicsElement" ]; - "SvgScriptElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgSetElement" = [ "Element" "EventTarget" "Node" "SvgAnimationElement" "SvgElement" ]; - "SvgStopElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgStyleElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgSwitchElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgSymbolElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgTextContentElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgTextElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" "SvgTextPositioningElement" ]; - "SvgTextPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" ]; - "SvgTextPositioningElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" ]; - "SvgTitleElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgUseElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgViewElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgaElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgfeBlendElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeColorMatrixElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeComponentTransferElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeCompositeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeConvolveMatrixElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeDiffuseLightingElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeDisplacementMapElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeDistantLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeDropShadowElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeFloodElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeFuncAElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; - "SvgfeFuncBElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; - "SvgfeFuncGElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; - "SvgfeFuncRElement" = [ "Element" "EventTarget" "Node" "SvgComponentTransferFunctionElement" "SvgElement" ]; - "SvgfeGaussianBlurElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeImageElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeMergeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeMergeNodeElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeMorphologyElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeOffsetElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfePointLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeSpecularLightingElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeSpotLightElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeTileElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgfeTurbulenceElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvggElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgmPathElement" = [ "Element" "EventTarget" "Node" "SvgElement" ]; - "SvgsvgElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" ]; - "SvgtSpanElement" = [ "Element" "EventTarget" "Node" "SvgElement" "SvgGraphicsElement" "SvgTextContentElement" "SvgTextPositioningElement" ]; - "TcpServerSocket" = [ "EventTarget" ]; - "TcpServerSocketEvent" = [ "Event" ]; - "TcpSocket" = [ "EventTarget" ]; - "TcpSocketErrorEvent" = [ "Event" ]; - "TcpSocketEvent" = [ "Event" ]; - "Text" = [ "CharacterData" "EventTarget" "Node" ]; - "TextTrack" = [ "EventTarget" ]; - "TextTrackCue" = [ "EventTarget" ]; - "TextTrackList" = [ "EventTarget" ]; - "TimeEvent" = [ "Event" ]; - "TouchEvent" = [ "Event" "UiEvent" ]; - "TrackEvent" = [ "Event" ]; - "TransitionEvent" = [ "Event" ]; - "UiEvent" = [ "Event" ]; - "Usb" = [ "EventTarget" ]; - "UsbConnectionEvent" = [ "Event" ]; - "UsbPermissionResult" = [ "EventTarget" "PermissionStatus" ]; - "UserProximityEvent" = [ "Event" ]; - "ValueEvent" = [ "Event" ]; - "VideoStreamTrack" = [ "EventTarget" "MediaStreamTrack" ]; - "VideoTrackList" = [ "EventTarget" ]; - "VrDisplay" = [ "EventTarget" ]; - "VttCue" = [ "EventTarget" "TextTrackCue" ]; - "WaveShaperNode" = [ "AudioNode" "EventTarget" ]; - "WebGlContextEvent" = [ "Event" ]; - "WebKitCssMatrix" = [ "DomMatrix" "DomMatrixReadOnly" ]; - "WebSocket" = [ "EventTarget" ]; - "WheelEvent" = [ "Event" "MouseEvent" "UiEvent" ]; - "Window" = [ "EventTarget" ]; - "WindowClient" = [ "Client" ]; - "Worker" = [ "EventTarget" ]; - "WorkerDebuggerGlobalScope" = [ "EventTarget" ]; - "WorkerGlobalScope" = [ "EventTarget" ]; - "XmlDocument" = [ "Document" "EventTarget" "Node" ]; - "XmlHttpRequest" = [ "EventTarget" "XmlHttpRequestEventTarget" ]; - "XmlHttpRequestEventTarget" = [ "EventTarget" ]; - "XmlHttpRequestUpload" = [ "EventTarget" "XmlHttpRequestEventTarget" ]; - "Xr" = [ "EventTarget" ]; - "XrBoundedReferenceSpace" = [ "EventTarget" "XrReferenceSpace" "XrSpace" ]; - "XrInputSourceEvent" = [ "Event" ]; - "XrInputSourcesChangeEvent" = [ "Event" ]; - "XrReferenceSpace" = [ "EventTarget" "XrSpace" ]; - "XrReferenceSpaceEvent" = [ "Event" ]; - "XrSession" = [ "EventTarget" ]; - "XrSessionEvent" = [ "Event" ]; - "XrSpace" = [ "EventTarget" ]; - "XrViewerPose" = [ "XrPose" ]; - }; - resolvedDefaultFeatures = [ "CanvasRenderingContext2d" "Document" "DomRect" "DomRectReadOnly" "Element" "Event" "EventTarget" "HtmlCanvasElement" "HtmlElement" "MessageEvent" "Node" "Window" "Worker" "console" ]; - }; - "winapi" = rec { - crateName = "winapi"; - version = "0.3.9"; - edition = "2015"; - sha256 = "06gl025x418lchw1wxj64ycr7gha83m44cjr5sarhynd9xkrm0sw"; - authors = [ - "Peter Atashian " - ]; - dependencies = [ - { - name = "winapi-i686-pc-windows-gnu"; - packageId = "winapi-i686-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.config == "i686-pc-windows-gnu"); - } - { - name = "winapi-x86_64-pc-windows-gnu"; - packageId = "winapi-x86_64-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.config == "x86_64-pc-windows-gnu"); - } - ]; - features = { - "debug" = [ "impl-debug" ]; - }; - resolvedDefaultFeatures = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "minwinbase" "minwindef" "namedpipeapi" "ntdef" "processenv" "processthreadsapi" "std" "synchapi" "timezoneapi" "winbase" "wincon" "winerror" "winnt" "winuser" ]; - }; - "winapi-i686-pc-windows-gnu" = rec { - crateName = "winapi-i686-pc-windows-gnu"; - version = "0.4.0"; - edition = "2015"; - sha256 = "1dmpa6mvcvzz16zg6d5vrfy4bxgg541wxrcip7cnshi06v38ffxc"; - authors = [ - "Peter Atashian " - ]; - - }; - "winapi-util" = rec { - crateName = "winapi-util"; - version = "0.1.5"; - edition = "2018"; - sha256 = "0y71bp7f6d536czj40dhqk0d55wfbbwqfp2ymqf1an5ibgl6rv3h"; - authors = [ - "Andrew Gallant " - ]; - dependencies = [ - { - name = "winapi"; - packageId = "winapi"; - target = { target, features }: (target."windows" or false); - features = [ "std" "consoleapi" "errhandlingapi" "fileapi" "minwindef" "processenv" "winbase" "wincon" "winerror" "winnt" ]; - } - ]; - - }; - "winapi-x86_64-pc-windows-gnu" = rec { - crateName = "winapi-x86_64-pc-windows-gnu"; - version = "0.4.0"; - edition = "2015"; - sha256 = "0gqq64czqb64kskjryj8isp62m2sgvx25yyj3kpc2myh85w24bki"; - authors = [ - "Peter Atashian " - ]; - - }; - }; - - # -# crate2nix/default.nix (excerpt start) -# - - /* Target (platform) data for conditional dependencies. - This corresponds roughly to what buildRustCrate is setting. - */ - defaultTarget = { - unix = true; - windows = false; - fuchsia = true; - test = false; - - # This doesn't appear to be officially documented anywhere yet. - # See https://github.com/rust-lang-nursery/rust-forge/issues/101. - os = - if stdenv.hostPlatform.isDarwin - then "macos" - else stdenv.hostPlatform.parsed.kernel.name; - arch = stdenv.hostPlatform.parsed.cpu.name; - family = "unix"; - env = "gnu"; - endian = - if stdenv.hostPlatform.parsed.cpu.significantByte.name == "littleEndian" - then "little" else "big"; - pointer_width = toString stdenv.hostPlatform.parsed.cpu.bits; - vendor = stdenv.hostPlatform.parsed.vendor.name; - debug_assertions = false; - }; - - /* Filters common temp files and build files. */ - # TODO(pkolloch): Substitute with gitignore filter - sourceFilter = name: type: - let - baseName = builtins.baseNameOf (builtins.toString name); - in - ! ( - # Filter out git - baseName == ".gitignore" - || (type == "directory" && baseName == ".git") - - # Filter out build results - || ( - type == "directory" && ( - baseName == "target" - || baseName == "_site" - || baseName == ".sass-cache" - || baseName == ".jekyll-metadata" - || baseName == "build-artifacts" - ) - ) - - # Filter out nix-build result symlinks - || ( - type == "symlink" && lib.hasPrefix "result" baseName - ) - - # Filter out IDE config - || ( - type == "directory" && ( - baseName == ".idea" || baseName == ".vscode" - ) - ) || lib.hasSuffix ".iml" baseName - - # Filter out nix build files - || baseName == "Cargo.nix" - - # Filter out editor backup / swap files. - || lib.hasSuffix "~" baseName - || builtins.match "^\\.sw[a-z]$$" baseName != null - || builtins.match "^\\..*\\.sw[a-z]$$" baseName != null - || lib.hasSuffix ".tmp" baseName - || lib.hasSuffix ".bak" baseName - || baseName == "tests.nix" - ); - - /* Returns a crate which depends on successful test execution - of crate given as the second argument. - - testCrateFlags: list of flags to pass to the test exectuable - testInputs: list of packages that should be available during test execution - */ - crateWithTest = { crate, testCrate, testCrateFlags, testInputs }: - assert builtins.typeOf testCrateFlags == "list"; - assert builtins.typeOf testInputs == "list"; - let - # override the `crate` so that it will build and execute tests instead of - # building the actual lib and bin targets We just have to pass `--test` - # to rustc and it will do the right thing. We execute the tests and copy - # their log and the test executables to $out for later inspection. - test = - let - drv = testCrate.override - ( - _: { - buildTests = true; - } - ); - in - pkgs.runCommand "run-tests-${testCrate.name}" - { - inherit testCrateFlags; - buildInputs = testInputs; - } '' - set -ex - - export RUST_BACKTRACE=1 - - # recreate a file hierarchy as when running tests with cargo - - # the source for test data - ${pkgs.xorg.lndir}/bin/lndir ${crate.src} - - # build outputs - testRoot=target/debug - mkdir -p $testRoot - - # executables of the crate - # we copy to prevent std::env::current_exe() to resolve to a store location - for i in ${crate}/bin/*; do - cp "$i" "$testRoot" - done - chmod +w -R . - - # test harness executables are suffixed with a hash, like cargo does - # this allows to prevent name collision with the main - # executables of the crate - hash=$(basename $out) - for file in ${drv}/tests/*; do - f=$testRoot/$(basename $file)-$hash - cp $file $f - $f $testCrateFlags 2>&1 | tee -a $out - done - ''; - in - pkgs.runCommand "${crate.name}-linked" - { - inherit (crate) outputs crateName; - passthru = (crate.passthru or { }) // { - inherit test; - }; - } '' - echo tested by ${test} - ${lib.concatMapStringsSep "\n" (output: "ln -s ${crate.${output}} ${"$"}${output}") crate.outputs} - ''; - - /* A restricted overridable version of builtRustCratesWithFeatures. */ - buildRustCrateWithFeatures = - { packageId - , features ? rootFeatures - , crateOverrides ? defaultCrateOverrides - , buildRustCrateForPkgsFunc ? null - , runTests ? false - , testCrateFlags ? [ ] - , testInputs ? [ ] - }: - lib.makeOverridable - ( - { features - , crateOverrides - , runTests - , testCrateFlags - , testInputs - }: - let - buildRustCrateForPkgsFuncOverriden = - if buildRustCrateForPkgsFunc != null - then buildRustCrateForPkgsFunc - else - ( - if crateOverrides == pkgs.defaultCrateOverrides - then buildRustCrateForPkgs - else - pkgs: (buildRustCrateForPkgs pkgs).override { - defaultCrateOverrides = crateOverrides; - } - ); - builtRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; - runTests = false; - }; - builtTestRustCrates = builtRustCratesWithFeatures { - inherit packageId features; - buildRustCrateForPkgsFunc = buildRustCrateForPkgsFuncOverriden; - runTests = true; - }; - drv = builtRustCrates.crates.${packageId}; - testDrv = builtTestRustCrates.crates.${packageId}; - derivation = - if runTests then - crateWithTest - { - crate = drv; - testCrate = testDrv; - inherit testCrateFlags testInputs; - } - else drv; - in - derivation - ) - { inherit features crateOverrides runTests testCrateFlags testInputs; }; - - /* Returns an attr set with packageId mapped to the result of buildRustCrateForPkgsFunc - for the corresponding crate. - */ - builtRustCratesWithFeatures = - { packageId - , features - , crateConfigs ? crates - , buildRustCrateForPkgsFunc - , runTests - , target ? defaultTarget - } @ args: - assert (builtins.isAttrs crateConfigs); - assert (builtins.isString packageId); - assert (builtins.isList features); - assert (builtins.isAttrs target); - assert (builtins.isBool runTests); - let - rootPackageId = packageId; - mergedFeatures = mergePackageFeatures - ( - args // { - inherit rootPackageId; - target = target // { test = runTests; }; - } - ); - # Memoize built packages so that reappearing packages are only built once. - builtByPackageIdByPkgs = mkBuiltByPackageIdByPkgs pkgs; - mkBuiltByPackageIdByPkgs = pkgs: - let - self = { - crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; - }; - in - self; - buildByPackageIdForPkgsImpl = self: pkgs: packageId: - let - features = mergedFeatures."${packageId}" or [ ]; - crateConfig' = crateConfigs."${packageId}"; - crateConfig = - builtins.removeAttrs crateConfig' [ "resolvedDefaultFeatures" "devDependencies" ]; - devDependencies = - lib.optionals - (runTests && packageId == rootPackageId) - (crateConfig'.devDependencies or [ ]); - dependencies = - dependencyDerivations { - inherit features target; - buildByPackageId = depPackageId: - # proc_macro crates must be compiled for the build architecture - if crateConfigs.${depPackageId}.procMacro or false - then self.build.crates.${depPackageId} - else self.crates.${depPackageId}; - dependencies = - (crateConfig.dependencies or [ ]) - ++ devDependencies; - }; - buildDependencies = - dependencyDerivations { - inherit features target; - buildByPackageId = depPackageId: - self.build.crates.${depPackageId}; - dependencies = crateConfig.buildDependencies or [ ]; - }; - filterEnabledDependenciesForThis = dependencies: filterEnabledDependencies { - inherit dependencies features target; - }; - dependenciesWithRenames = - lib.filter (d: d ? "rename") - ( - filterEnabledDependenciesForThis - ( - (crateConfig.buildDependencies or [ ]) - ++ (crateConfig.dependencies or [ ]) - ++ devDependencies - ) - ); - # Crate renames have the form: - # - # { - # crate_name = [ - # { version = "1.2.3"; rename = "crate_name01"; } - # ]; - # # ... - # } - crateRenames = - let - grouped = - lib.groupBy - (dependency: dependency.name) - dependenciesWithRenames; - versionAndRename = dep: - let - package = crateConfigs."${dep.packageId}"; - in - { inherit (dep) rename; version = package.version; }; - in - lib.mapAttrs (name: choices: builtins.map versionAndRename choices) grouped; - in - buildRustCrateForPkgsFunc pkgs - ( - crateConfig // { - src = crateConfig.src or ( - pkgs.fetchurl rec { - name = "${crateConfig.crateName}-${crateConfig.version}.tar.gz"; - # https://www.pietroalbini.org/blog/downloading-crates-io/ - # Not rate-limited, CDN URL. - url = "https://static.crates.io/crates/${crateConfig.crateName}/${crateConfig.crateName}-${crateConfig.version}.crate"; - sha256 = - assert (lib.assertMsg (crateConfig ? sha256) "Missing sha256 for ${name}"); - crateConfig.sha256; - } - ); - extraRustcOpts = lib.lists.optional (targetFeatures != [ ]) "-C target-feature=${lib.concatMapStringsSep "," (x: "+${x}") targetFeatures}"; - inherit features dependencies buildDependencies crateRenames release; - } - ); - in - builtByPackageIdByPkgs; - - /* Returns the actual derivations for the given dependencies. */ - dependencyDerivations = - { buildByPackageId - , features - , dependencies - , target - }: - assert (builtins.isList features); - assert (builtins.isList dependencies); - assert (builtins.isAttrs target); - let - enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; - }; - depDerivation = dependency: buildByPackageId dependency.packageId; - in - map depDerivation enabledDependencies; - - /* Returns a sanitized version of val with all values substituted that cannot - be serialized as JSON. - */ - sanitizeForJson = val: - if builtins.isAttrs val - then lib.mapAttrs (n: v: sanitizeForJson v) val - else if builtins.isList val - then builtins.map sanitizeForJson val - else if builtins.isFunction val - then "function" - else val; - - /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? defaultTarget }: - assert (builtins.isString packageId); - let - debug = rec { - # The built tree as passed to buildRustCrate. - buildTree = buildRustCrateWithFeatures { - buildRustCrateForPkgsFunc = _: lib.id; - inherit packageId; - }; - sanitizedBuildTree = sanitizeForJson buildTree; - dependencyTree = sanitizeForJson - ( - buildRustCrateWithFeatures { - buildRustCrateForPkgsFunc = _: crate: { - "01_crateName" = crate.crateName or false; - "02_features" = crate.features or [ ]; - "03_dependencies" = crate.dependencies or [ ]; - }; - inherit packageId; - } - ); - mergedPackageFeatures = mergePackageFeatures { - features = rootFeatures; - inherit packageId target; - }; - diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; - }; - }; - in - { internal = debug; }; - - /* Returns differences between cargo default features and crate2nix default - features. - - This is useful for verifying the feature resolution in crate2nix. - */ - diffDefaultPackageFeatures = - { crateConfigs ? crates - , packageId - , target - }: - assert (builtins.isAttrs crateConfigs); - let - prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); - mergedFeatures = - prefixValues - "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); - configs = prefixValues "cargo" crateConfigs; - combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; - onlyInCargo = - builtins.attrNames - (lib.filterAttrs (n: v: !(v ? "crate2nix") && (v ? "cargo")) combined); - onlyInCrate2Nix = - builtins.attrNames - (lib.filterAttrs (n: v: (v ? "crate2nix") && !(v ? "cargo")) combined); - differentFeatures = lib.filterAttrs - ( - n: v: - (v ? "crate2nix") - && (v ? "cargo") - && (v.crate2nix.features or [ ]) != (v."cargo".resolved_default_features or [ ]) - ) - combined; - in - builtins.toJSON { - inherit onlyInCargo onlyInCrate2Nix differentFeatures; - }; - - /* Returns an attrset mapping packageId to the list of enabled features. - - If multiple paths to a dependency enable different features, the - corresponding feature sets are merged. Features in rust are additive. - */ - mergePackageFeatures = - { crateConfigs ? crates - , packageId - , rootPackageId ? packageId - , features ? rootFeatures - , dependencyPath ? [ crates.${packageId}.crateName ] - , featuresByPackageId ? { } - , target - # Adds devDependencies to the crate with rootPackageId. - , runTests ? false - , ... - } @ args: - assert (builtins.isAttrs crateConfigs); - assert (builtins.isString packageId); - assert (builtins.isString rootPackageId); - assert (builtins.isList features); - assert (builtins.isList dependencyPath); - assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); - assert (builtins.isBool runTests); - let - crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); - expandedFeatures = expandFeatures (crateConfig.features or { }) features; - depWithResolvedFeatures = dependency: - let - packageId = dependency.packageId; - features = dependencyFeatures expandedFeatures dependency; - in - { inherit packageId features; }; - resolveDependencies = cache: path: dependencies: - assert (builtins.isAttrs cache); - assert (builtins.isList dependencies); - let - enabledDependencies = filterEnabledDependencies { - inherit dependencies target; - features = expandedFeatures; - }; - directDependencies = map depWithResolvedFeatures enabledDependencies; - foldOverCache = op: lib.foldl op cache directDependencies; - in - foldOverCache - ( - cache: { packageId, features }: - let - cacheFeatures = cache.${packageId} or [ ]; - combinedFeatures = sortedUnique (cacheFeatures ++ features); - in - if cache ? ${packageId} && cache.${packageId} == combinedFeatures - then cache - else - mergePackageFeatures { - features = combinedFeatures; - featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; - } - ); - cacheWithSelf = - let - cacheFeatures = featuresByPackageId.${packageId} or [ ]; - combinedFeatures = sortedUnique (cacheFeatures ++ expandedFeatures); - in - featuresByPackageId // { - "${packageId}" = combinedFeatures; - }; - cacheWithDependencies = - resolveDependencies cacheWithSelf "dep" - ( - crateConfig.dependencies or [ ] - ++ lib.optionals - (runTests && packageId == rootPackageId) - (crateConfig.devDependencies or [ ]) - ); - cacheWithAll = - resolveDependencies - cacheWithDependencies "build" - (crateConfig.buildDependencies or [ ]); - in - cacheWithAll; - - /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: - assert (builtins.isList dependencies); - assert (builtins.isList features); - assert (builtins.isAttrs target); - - lib.filter - ( - dep: - let - targetFunc = dep.target or (features: true); - in - targetFunc { inherit features target; } - && ( - !(dep.optional or false) - || builtins.any (doesFeatureEnableDependency dep) features - ) - ) - dependencies; - - /* Returns whether the given feature should enable the given dependency. */ - doesFeatureEnableDependency = { name, rename ? null, ... }: feature: - let - prefix = "${name}/"; - len = builtins.stringLength prefix; - startsWithPrefix = builtins.substring 0 len feature == prefix; - in - (rename == null && feature == name) - || (rename != null && rename == feature) - || startsWithPrefix; - - /* Returns the expanded features for the given inputFeatures by applying the - rules in featureMap. - - featureMap is an attribute set which maps feature names to lists of further - feature names to enable in case this feature is selected. - */ - expandFeatures = featureMap: inputFeatures: - assert (builtins.isAttrs featureMap); - assert (builtins.isList inputFeatures); - let - expandFeature = feature: - assert (builtins.isString feature); - [ feature ] ++ (expandFeatures featureMap (featureMap."${feature}" or [ ])); - outFeatures = lib.concatMap expandFeature inputFeatures; - in - sortedUnique outFeatures; - - /* - Returns the actual features for the given dependency. - - features: The features of the crate that refers this dependency. - */ - dependencyFeatures = features: dependency: - assert (builtins.isList features); - assert (builtins.isAttrs dependency); - let - defaultOrNil = - if dependency.usesDefaultFeatures or true - then [ "default" ] - else [ ]; - explicitFeatures = dependency.features or [ ]; - additionalDependencyFeatures = - let - dependencyPrefix = (dependency.rename or dependency.name) + "/"; - dependencyFeatures = - builtins.filter (f: lib.hasPrefix dependencyPrefix f) features; - in - builtins.map (lib.removePrefix dependencyPrefix) dependencyFeatures; - in - defaultOrNil ++ explicitFeatures ++ additionalDependencyFeatures; - - /* Sorts and removes duplicates from a list of strings. */ - sortedUnique = features: - assert (builtins.isList features); - assert (builtins.all builtins.isString features); - let - outFeaturesSet = lib.foldl (set: feature: set // { "${feature}" = 1; }) { } features; - outFeaturesUnique = builtins.attrNames outFeaturesSet; - in - builtins.sort (a: b: a < b) outFeaturesUnique; - - deprecationWarning = message: value: - if strictDeprecation - then builtins.throw "strictDeprecation enabled, aborting: ${message}" - else builtins.trace message value; - - # - # crate2nix/default.nix (excerpt end) - # - - }; -} \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 8daecc51..00000000 --- a/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[workspace] - -members = [ - "automerge", - "automerge-c", - "automerge-c-v2", - "automerge-backend", - "automerge-backend-wasm", - "automerge-frontend", - "automerge-cli", - "automerge-protocol", - "fuzz", - "perf", -] - -[profile.release] -debug = true diff --git a/LICENSE b/LICENSE index dfa2838f..18812465 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,19 @@ -Copyright 2019 Alex Good +Copyright (c) 2019-2021 the Automerge contributors -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 7668a018..ad174da4 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,147 @@ # Automerge -[![docs](https://docs.rs/automerge/badge.svg)](https://docs.rs/automerge) -[![crates](https://img.shields.io/crates/v/automerge.svg)](https://crates.io/crates/automerge) -[![Build Status](https://travis-ci.org/automerge/automerge-rs.svg?branch=main)](https://travis-ci.org/automerge/automerge-rs) +Automerge logo -This is a rust implementation of -[automerge](https://github.com/automerge/automerge). Currently this repo -contains an implementation of the "backend" of the Automerge library, designed -to be used via FFI from many different platforms. Very soon there will also be -a frontend which will be designed for Rust application developers to use. +[![homepage](https://img.shields.io/badge/homepage-published-informational)](https://automerge.org/) +[![main docs](https://img.shields.io/badge/docs-main-informational)](https://automerge.org/automerge-rs/automerge/) +[![ci](https://github.com/automerge/automerge-rs/actions/workflows/ci.yaml/badge.svg)](https://github.com/automerge/automerge-rs/actions/workflows/ci.yaml) +[![docs](https://github.com/automerge/automerge-rs/actions/workflows/docs.yaml/badge.svg)](https://github.com/automerge/automerge-rs/actions/workflows/docs.yaml) -This project is tracking the `performance` branch of the JavaScript reference implementation of Automerge. The `performance` branch contains a lot of backwards incompatible changes and is intended to become a 1.0 release of the library, you can find more information about that [here](https://github.com/automerge/automerge/pull/253). Our goal is to release a pre 1.0 version of the rust library once the JavaScript library hits 1.0. As such we are keeping this project up to date with the frequent and often quite large changes in the `performance` branch of the JavaScript repo - that is to say, don't depend on anything in this repo to stay constant right now. +Automerge is a library which provides fast implementations of several different +CRDTs, a compact compression format for these CRDTs, and a sync protocol for +efficiently transmitting those changes over the network. The objective of the +project is to support [local-first](https://www.inkandswitch.com/local-first/) applications in the same way that relational +databases support server applications - by providing mechanisms for persistence +which allow application developers to avoid thinking about hard distributed +computing problems. Automerge aims to be PostgreSQL for your local-first app. +If you're looking for documentation on the JavaScript implementation take a look +at https://automerge.org/docs/hello/. There are other implementations in both +Rust and C, but they are earlier and don't have documentation yet. You can find +them in `rust/automerge` and `rust/automerge-c` if you are comfortable +reading the code and tests to figure out how to use them. -## Using automerge-backend-wasm with automerge +If you're familiar with CRDTs and interested in the design of Automerge in +particular take a look at https://automerge.org/docs/how-it-works/backend/ -This backend is tracking the [performance branch of automerge](https://github.com/automerge/automerge/tree/performance) +Finally, if you want to talk to us about this project please [join the +Slack](https://join.slack.com/t/automerge/shared_invite/zt-e4p3760n-kKh7r3KRH1YwwNfiZM8ktw) -To build the wasm backend you'll need to install [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/). Then: +## Status -``` - $ cd automerge-backend-wasm - $ yarn release +This project is formed of a core Rust implementation which is exposed via FFI in +javascript+WASM, C, and soon other languages. Alex +([@alexjg](https://github.com/alexjg/)]) is working full time on maintaining +automerge, other members of Ink and Switch are also contributing time and there +are several other maintainers. The focus is currently on shipping the new JS +package. We expect to be iterating the API and adding new features over the next +six months so there will likely be several major version bumps in all packages +in that time. + +In general we try and respect semver. + +### JavaScript + +A stable release of the javascript package is currently available as +`@automerge/automerge@2.0.0` where. pre-release verisions of the `2.0.1` are +available as `2.0.1-alpha.n`. `2.0.1*` packages are also available for Deno at +https://deno.land/x/automerge + +### Rust + +The rust codebase is currently oriented around producing a performant backend +for the Javascript wrapper and as such the API for Rust code is low level and +not well documented. We will be returning to this over the next few months but +for now you will need to be comfortable reading the tests and asking questions +to figure out how to use it. If you are looking to build rust applications which +use automerge you may want to look into +[autosurgeon](https://github.com/alexjg/autosurgeon) + +## Repository Organisation + +- `./rust` - the rust rust implementation and also the Rust components of + platform specific wrappers (e.g. `automerge-wasm` for the WASM API or + `automerge-c` for the C FFI bindings) +- `./javascript` - The javascript library which uses `automerge-wasm` + internally but presents a more idiomatic javascript interface +- `./scripts` - scripts which are useful to maintenance of the repository. + This includes the scripts which are run in CI. +- `./img` - static assets for use in `.md` files + +## Building + +To build this codebase you will need: + +- `rust` +- `node` +- `yarn` +- `cmake` +- `cmocka` + +You will also need to install the following with `cargo install` + +- `wasm-bindgen-cli` +- `wasm-opt` +- `cargo-deny` + +And ensure you have added the `wasm32-unknown-unknown` target for rust cross-compilation. + +The various subprojects (the rust code, the wrapper projects) have their own +build instructions, but to run the tests that will be run in CI you can run +`./scripts/ci/run`. + +### For macOS + +These instructions worked to build locally on macOS 13.1 (arm64) as of +Nov 29th 2022. + +```bash +# clone the repo +git clone https://github.com/automerge/automerge-rs +cd automerge-rs + +# install rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# install homebrew +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +# install cmake, node, cmocka +brew install cmake node cmocka + +# install yarn +npm install --global yarn + +# install javascript dependencies +yarn --cwd ./javascript + +# install rust dependencies +cargo install wasm-bindgen-cli wasm-opt cargo-deny + +# get nightly rust to produce optimized automerge-c builds +rustup toolchain install nightly +rustup component add rust-src --toolchain nightly + +# add wasm target in addition to current architecture +rustup target add wasm32-unknown-unknown + +# Run ci script +./scripts/ci/run ``` -Once it is built set the new default backend in your js application like this. +If your build fails to find `cmocka.h` you may need to teach it about homebrew's +installation location: -```js - const wasmBackend = require(path.resolve(WASM_BACKEND_PATH)) - Automerge.setDefaultBackend(wasmBackend) +``` +export CPATH=/opt/homebrew/include +export LIBRARY_PATH=/opt/homebrew/lib +./scripts/ci/run ``` -## Backend? Frontend? - -Automerge is a JSON CRDT, in this sense it is just a data structure with a set -of rules about how to merge two different versions of that data structure. -However, in practice one often needs two separate roles when writing -applications which use the CRDT: - -- A very low latency process, usually running on some kind of UI thread, which - records changes made by the user and reflects them in the UI -- A less latency sensitive process which executes the complex logic of merging changes - received from the UI and over the network and send diffs to the frontend to apply - -More details can be found [here](https://github.com/automerge/automerge/blob/performance/BINARY_FORMAT.md). - -Note that the performance branch of automerge is under active development and is changing quickly. - -## Community - -Development of automerge rust is currently being coordinated at our [slack channel](https://automerge.slack.com/archives/CTQARU3NZ). Come say hi. =) - - +## Contributing +Please try and split your changes up into relatively independent commits which +change one subsystem at a time and add good commit messages which describe what +the change is and why you're making it (err on the side of longer commit +messages). `git blame` should give future maintainers a good idea of why +something is the way it is. diff --git a/automerge-backend-wasm/.gitignore b/automerge-backend-wasm/.gitignore deleted file mode 100644 index b4fa7794..00000000 --- a/automerge-backend-wasm/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules -/wasm-pack.log -/build -/dev - -# Used for js-interop tests -/automerge-js-temp diff --git a/automerge-backend-wasm/GOALS_AND_ISSUES.md b/automerge-backend-wasm/GOALS_AND_ISSUES.md deleted file mode 100644 index ee9b5096..00000000 --- a/automerge-backend-wasm/GOALS_AND_ISSUES.md +++ /dev/null @@ -1,78 +0,0 @@ - -# WASM Goals and Issues - -We set out with this project to see if we could create a backend implementation -for Automerge that could serve as a basis for native ports to many different -languages but also replace the javascript backend of the current implementation -without any compromises. - -We chose Rust as the basis of this project.  It has the same performance -characteristics as C and C++ making it ideal for implementing a database-like -tool. It also has safety guarantees C and C++ which will protect us from -synchronization issues and data races that plague projects like this.  Rust -also has a very mature WASM integration suite of tools. - -Our goal was to create a zero compromise implementation of the backend. We -almost achieved this goal. Here are the details of the compromises we found. - -## Problem: WASM memory and garbage collection - -Memory allocated in WASM needs to be explicitly freed. And there is no feature -(yet) in javascript to alert you when an object has been collected by the -GC. This makes immutable API's undoable since you need the GC to collect old -versions of objects. - -Also this means that an Automerge backend would need to be explicitly freed at the -end of its life. Under normal circumstances a backend will live indefinitely so this -would not require a change but in situations where many small databases are being -created and thrown away this requires an API change. - -## Solution - -The performance branch of Automerge has made some small but important adjustments to -the Frontend/Backend API. These now assume the backends to be long lived and possibly -mutable and disallows creating divergent histories with old handles to the backend. -A `clone` function was added to allow this behavior if it was intentional and a `free` -that can do cleanup. - -```js - let doc1 = Automerge.init(); - let doc2 = Automerge.clone(doc1); - Automerge.free(doc1); -``` - -## Problem: WASM in fundamentally async - Automerge is sync - -WASM's love of all things async was surely the largest thorn in our side was dealing with this. It basically boils down to this... - -1. ### Loading WASM requires IO - IO is async - - WASM binaries are not js - loading them from JS is async (with the notable exception of node's `readFileSync()`) - -2. ### WebAssembly.Module(buffer) has a 4k limit on the render thread in browsers - - Even if you can synchronously load and compile the wasm, most browsers impose a 4k limit on synchronous (but not asynchronous) WASM compilation in the render thread. This is not an issue in node applications or in web workers. - -## Solutions - -1. ### Compile Rust to ASM.js - (no problems except it's big and slow) - - Now it's javascript. All the strangeness of WASM goes away. Webpack will happily inline the code into a bundle. The only downside, 400k of WASM becomes 5M of js and it runs 3 times slower. - -2. ### Inline the WASM as a base64 encoded string - (no problems except the render thread) - - This is actually surprisingly effective. The sized added to the js bundle is reasonable and the decode time is trivial. The only issue is, it still wont work in the render thread - -3. ### Wait for top level await (no problems - someday) - - There is a proposal for top level await support in js modules. This would allow us to insert an internal await into the backend module and hide the async load from users. Unfortunately its not in JS yet... - -4. ### Change Automerge.init to be async (no problems except a breaking api change) - - All of the async strangeness can be boiled down to the Automerge.init() call. This would require introducing an api change that has no purpose in the JS only implementation and represents a non-trivial compromise in adopting WASM - ```js - const doc = Automerge.init(); - // becomes - const doc = await Automerge.init(); - ``` - diff --git a/automerge-backend-wasm/LICENSE b/automerge-backend-wasm/LICENSE deleted file mode 100644 index 592e2105..00000000 --- a/automerge-backend-wasm/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2020 Ink & Switch LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/automerge-backend-wasm/README.md b/automerge-backend-wasm/README.md deleted file mode 100644 index 71f47ae2..00000000 --- a/automerge-backend-wasm/README.md +++ /dev/null @@ -1,22 +0,0 @@ -## automerge-backend-wasm - -This is a wrapper for the rust implementation of [automerge-backend](https://github.com/automerge/automerge-rs/tree/master/automerge-backend) to be used with [Automerge](https://github.com/automerge/automerge). - -### Using - -You can require this synchronously as a CommonJS module or import it as a ES6 module - -```js -let Automerge = require("automerge") -let Backend = require("automerge-backend-wasm") -Automerge.setDefaultBackend(Backend) -``` - -```js -import * as Automerge from "automerge" -import * as Backend from "automerge-backend-wasm" -Automerge.setDefaultBackend(Backend) -``` - -Note that the first uses a synchronous filesystem load of the wasm and will not be transferable to a browser bundle. The second uses ES6 wasm import statements which should work in all modern browsers but require a '--experimental-wasm-modules' flag on nodejs (v13 on) unless you pack/bundle the code into compatible format. - diff --git a/automerge-backend-wasm/package.json b/automerge-backend-wasm/package.json deleted file mode 100644 index 7d796c20..00000000 --- a/automerge-backend-wasm/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "collaborators": [ - "Orion Henry ", - "Alex Good " - ], - "name": "automerge-backend-wasm", - "description": "wasm-bindgen bindings to the automerge-backend rust implementation", - "version": "0.1.0", - "license": "MIT", - "files": [ - "README.md", - "pkg.js", - "LICENSE", - "package.json", - "automerge_backend_wasm_bg.wasm", - "automerge_backend_wasm.js" - ], - "main": "./dev/index.js", - "scripts": { - "cjs-release": "wasm-pack build --target nodejs --release --out-name index -d build/cjs && rm build/cjs/package.json", - "mjs-release": "wasm-pack build --target bundler --release --out-name index -d build/mjs && cp package.mjs.json build/mjs/package.json", - "prep-release": "rm build/*/.gitignore build/*/README.md build/*/LICENSE build/*/*.ts", - "release": "yarn cjs-release && yarn mjs-release && yarn prep-release && cp package.pkg.json build/package.json && cp README.md LICENSE build", - "build": "rm -rf dev && wasm-pack build --target nodejs --dev --out-name index -d dev", - "profiling": "wasm-pack build --target nodejs --profiling --out-name index -d dev", - "mocha": "yarn build && mocha --bail --full-trace", - "webpack": "webpack", - "test": "cargo test && wasm-pack test --node", - "test:js": "./scripts/js_tests.sh" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "^7.1.1" - } -} diff --git a/automerge-backend-wasm/package.mjs.json b/automerge-backend-wasm/package.mjs.json deleted file mode 100644 index 3dbc1ca5..00000000 --- a/automerge-backend-wasm/package.mjs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/automerge-backend-wasm/package.pkg.json b/automerge-backend-wasm/package.pkg.json deleted file mode 100644 index 208b16d0..00000000 --- a/automerge-backend-wasm/package.pkg.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "automerge-backend-wasm", - "collaborators": [ - "Alex Good ", - "Orion Henry ", - "Martin Kleppmann" - ], - "description": "A js/wasm wrapper for the rust implementation of automerge-backend", - "version": "0.1.4", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/automerge/automerge-rs" - }, - "files": [ - "README.md", - "LICENSE", - "cjs/index_bg.wasm", - "cjs/index.js", - "mjs/package.json", - "mjs/index_bg.wasm", - "mjs/index_bg.js", - "mjs/index.js" - ], - "type": "commonjs", - "exports": { - ".": { - "require": "./cjs/index.js", - "default": "./mjs/index.js" - } - }, - "main" : "./cjs/index.js", - "module" : "./mjs/index.js", - "sideEffects": false -} diff --git a/automerge-backend-wasm/scripts/js_tests.sh b/automerge-backend-wasm/scripts/js_tests.sh deleted file mode 100755 index 019e21cd..00000000 --- a/automerge-backend-wasm/scripts/js_tests.sh +++ /dev/null @@ -1,40 +0,0 @@ -#! /usr/bin/env bash -set -e - -ORIGINAL_PWD=$PWD -if [[ -z $AUTOMERGE_JS_DIR ]]; then - COMMIT_HASH=d8334d3ea9584c66fd51de1e705a71a5a6e64d91 - AUTOMERGE_JS_DIR="./automerge-js-temp" - echo "'AUTOMERGE_JS_DIR' var not set. Using temporary dir: $AUTOMERGE_JS_DIR & commit hash: $COMMIT_HASH" - if [[ -d $AUTOMERGE_JS_DIR ]]; then - echo "Dir found, skipping clone" - cd $AUTOMERGE_JS_DIR - if ! git cat-file -e $COMMIT_HASH; then - echo "Commit hash: $COMMIT_HASH not found in $AUTOMERGE_JS_DIR" - exit 1 - fi - else - git clone https://github.com/orionz/automerge.git $AUTOMERGE_JS_DIR - fi - cd $ORIGINAL_PWD - cd $AUTOMERGE_JS_DIR - git checkout $COMMIT_HASH -else - # if the env var is set, assume the user is using an existing checkout of automerge - echo "Using $AUTOMERGE_JS_DIR" - if [[ ! -d $AUTOMERGE_JS_DIR ]]; then - echo "$AUTOMERGE_JS_DIR dir not found." - exit 1 - fi -fi - -cd $ORIGINAL_PWD -cd $AUTOMERGE_JS_DIR - -WASM_BACKEND_PATH="$ORIGINAL_PWD/build" -if [[ ! -d $WASM_BACKEND_PATH ]]; then - echo "$WASM_BACKEND_PATH does not exist. Run 'yarn release' to build WASM backend" - exit 1 -fi -yarn install -WASM_BACKEND_PATH=$WASM_BACKEND_PATH yarn testwasm diff --git a/automerge-backend-wasm/src/lib.rs b/automerge-backend-wasm/src/lib.rs deleted file mode 100644 index 8c375fce..00000000 --- a/automerge-backend-wasm/src/lib.rs +++ /dev/null @@ -1,406 +0,0 @@ -//#![feature(set_stdio)] - -mod types; - -use std::{ - collections::{HashMap, HashSet}, - convert::TryFrom, - fmt::Display, -}; - -use automerge_backend::{AutomergeError, Backend, Change, SyncMessage, SyncState}; -use automerge_protocol as amp; -use automerge_protocol::ChangeHash; -use js_sys::Array; -use serde::{de::DeserializeOwned, Serialize}; -use types::{BinaryChange, BinaryDocument, BinarySyncMessage, BinarySyncState, RawSyncMessage}; -use wasm_bindgen::prelude::*; - -extern crate web_sys; -#[allow(unused_macros)] -macro_rules! log { - ( $( $t:tt )* ) => { - web_sys::console::log_1(&format!( $( $t )* ).into()); - }; -} - -fn array(data: &[T]) -> Result { - let result = Array::new(); - for d in data { - result.push(&rust_to_js(d)?); - } - Ok(result) -} - -#[cfg(feature = "wee_alloc")] -#[global_allocator] -static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; - -fn js_to_rust(value: &JsValue) -> Result { - value.into_serde().map_err(json_error_to_js) -} - -fn rust_to_js(value: T) -> Result { - JsValue::from_serde(&value).map_err(json_error_to_js) -} - -#[wasm_bindgen] -#[derive(Debug)] -struct State(Backend); - -#[wasm_bindgen] -extern "C" { - pub type Object; - - #[wasm_bindgen(constructor)] - fn new() -> Object; - - #[wasm_bindgen(method, getter)] - fn state(this: &Object) -> State; - - #[wasm_bindgen(method, setter)] - fn set_state(this: &Object, state: State); - - #[wasm_bindgen(method, getter)] - fn frozen(this: &Object) -> bool; - - #[wasm_bindgen(method, setter)] - fn set_frozen(this: &Object, frozen: bool); - - #[wasm_bindgen(method, getter)] - fn heads(this: &Object) -> Array; - - #[wasm_bindgen(method, setter)] - fn set_heads(this: &Object, heads: Array); -} - -#[wasm_bindgen] -#[derive(Clone)] -pub struct JsSyncState(SyncState); - -#[wasm_bindgen] -impl JsSyncState { - #[wasm_bindgen(getter, js_name = sharedHeads)] - pub fn shared_heads(&self) -> JsValue { - rust_to_js(&self.0.shared_heads).unwrap() - } - - #[wasm_bindgen(getter, js_name = lastSentHeads)] - pub fn last_sent_heads(&self) -> JsValue { - rust_to_js(self.0.last_sent_heads.as_ref()).unwrap() - } - - #[wasm_bindgen(setter, js_name = lastSentHeads)] - pub fn set_last_sent_heads(&mut self, heads: JsValue) { - let heads: Option> = js_to_rust(&heads).unwrap(); - self.0.last_sent_heads = heads - } - - #[wasm_bindgen(setter, js_name = sentHashes)] - pub fn set_sent_hashes(&mut self, hashes: JsValue) { - let hashes_map: HashMap = js_to_rust(&hashes).unwrap(); - let hashes_set: HashSet = hashes_map.keys().cloned().collect(); - self.0.sent_hashes = hashes_set - } -} - -#[wasm_bindgen] -pub fn init() -> Result { - console_error_panic_hook::set_once(); - Ok(wrapper(State(Backend::new()), false, Vec::new())) -} - -#[wasm_bindgen(js_name = getHeads)] -pub fn get_heads(input: Object) -> Result { - Ok(input.heads()) -} - -#[wasm_bindgen(js_name = free)] -pub fn free(input: Object) -> Result<(), JsValue> { - let state: State = get_state(&input)?; - std::mem::drop(state); - input.set_frozen(true); - input.set_heads(Array::new()); - Ok(()) -} -#[wasm_bindgen(js_name = applyLocalChange)] -pub fn apply_local_change(input: Object, change: JsValue) -> Result { - get_mut_input(input, |state| { - let change: amp::Change = change.into_serde().map_err(json_to_err)?; - let (patch, change) = state.0.apply_local_change(change)?; - let result = Array::new(); - let change_bytes = types::BinaryChange(change.raw_bytes().to_vec()); - // FIXME unwrap - let p = rust_to_js(&patch).unwrap(); - result.push(&p); - result.push(&serde_wasm_bindgen::to_value(&change_bytes).unwrap()); - Ok(result) - }) -} - -#[wasm_bindgen(js_name = applyChanges)] -pub fn apply_changes(input: Object, changes: Array) -> Result { - get_mut_input(input, |state| { - let ch = import_changes(&changes)?; - let patch = state.0.apply_changes(ch)?; - Ok(array(&[patch]).unwrap()) - }) -} - -#[wasm_bindgen(js_name = loadChanges)] -pub fn load_changes(input: Object, changes: Array) -> Result { - get_mut_input(input, |state| { - let ch = import_changes(&changes)?; - state.0.load_changes(ch)?; - Ok(Array::new()) - }) -} - -#[wasm_bindgen(js_name = load)] -pub fn load(data: JsValue) -> Result { - let binary_document: BinaryDocument = serde_wasm_bindgen::from_value(data)?; - let backend = Backend::load(binary_document.0).map_err(to_js_err)?; - let heads = backend.get_heads(); - Ok(wrapper(State(backend), false, heads).into()) -} - -#[wasm_bindgen(js_name = getPatch)] -pub fn get_patch(input: Object) -> Result { - get_input(input, |state| { - state.0.get_patch().map_err(to_js_err).and_then(rust_to_js) - }) -} - -#[wasm_bindgen(js_name = clone)] -pub fn clone(input: Object) -> Result { - let old_state = get_state(&input)?; - let state = State(old_state.0.clone()); - let heads = state.0.get_heads(); - input.set_state(old_state); - Ok(wrapper(state, false, heads)) -} - -#[wasm_bindgen(js_name = save)] -pub fn save(input: Object) -> Result { - get_input(input, |state| { - state - .0 - .save() - .map(BinaryDocument) - .as_ref() - .map_err(to_js_err) - .and_then(|binary_document| Ok(serde_wasm_bindgen::to_value(binary_document)?)) - }) -} - -#[wasm_bindgen(js_name = getChanges)] -pub fn get_changes(input: Object, have_deps: JsValue) -> Result { - let deps: Vec = js_to_rust(&have_deps)?; - get_input(input, |state| { - Ok(export_changes(state.0.get_changes(&deps)).into()) - }) -} - -#[wasm_bindgen(js_name = getAllChanges)] -pub fn get_all_changes(input: Object) -> Result { - let deps: Vec = vec![]; - get_input(input, |state| { - Ok(export_changes(state.0.get_changes(&deps)).into()) - }) -} - -#[wasm_bindgen(js_name = getChangesAdded)] -pub fn get_changes_added(input: Object, input2: Object) -> Result { - get_input(input, |state| { - get_input(input2, |state2| { - let changes = state.0.get_changes_added(&state2.0); - Ok(export_changes(changes).into()) - }) - }) -} - -#[wasm_bindgen(js_name = getMissingDeps)] -pub fn get_missing_deps(input: Object) -> Result { - get_input(input, |state| rust_to_js(state.0.get_missing_deps(&[]))) -} - -fn import_changes(changes: &Array) -> Result, AutomergeError> { - let mut ch = Vec::with_capacity(changes.length() as usize); - for c in changes.iter() { - let change_bytes: types::BinaryChange = serde_wasm_bindgen::from_value(c).unwrap(); - ch.push(Change::from_bytes(change_bytes.0)?); - } - Ok(ch) -} - -fn export_changes(changes: Vec<&Change>) -> Array { - let result = Array::new(); - for c in changes { - let change_bytes = BinaryChange(c.raw_bytes().to_vec()); - result.push(&serde_wasm_bindgen::to_value(&change_bytes).unwrap()); - } - result -} - -#[wasm_bindgen(js_name = generateSyncMessage)] -pub fn generate_sync_message(input: Object, sync_state: &JsSyncState) -> Result { - get_input(input, |state| { - let mut sync_state = sync_state.clone(); - let message = state.0.generate_sync_message(&mut sync_state.0); - let result = Array::new(); - result.push(&JsValue::from(sync_state)); - let message = if let Some(message) = message { - serde_wasm_bindgen::to_value(&BinarySyncMessage(message.encode().map_err(to_js_err)?))? - } else { - JsValue::NULL - }; - result.push(&message); - Ok(result.into()) - }) -} - -#[wasm_bindgen(js_name = receiveSyncMessage)] -pub fn receive_sync_message( - input: Object, - sync_state: &JsSyncState, - message: JsValue, -) -> Result { - let mut state: State = get_state(&input)?; - - let binary_message: BinarySyncMessage = serde_wasm_bindgen::from_value(message)?; - let message = SyncMessage::decode(&binary_message.0).map_err(to_js_err)?; - - let mut sync_state = sync_state.clone(); - let patch = match state.0.receive_sync_message(&mut sync_state.0, message) { - Ok(r) => r, - Err(err) => { - input.set_state(state); - return Err(to_js_err(err)); - } - }; - - let result = Array::new(); - - if patch.is_some() { - let heads = state.0.get_heads(); - let new_state = wrapper(state, false, heads); - // the receiveSyncMessage in automerge.js returns the original doc when there is no patch so we should only freeze it when there is a patch - input.set_frozen(true); - result.push(&new_state.into()); - } else { - input.set_state(state); - result.push(&input); - } - - result.push(&JsValue::from(sync_state)); - - let p = rust_to_js(&patch)?; - result.push(&p); - - Ok(result.into()) -} - -#[wasm_bindgen(js_name = initSyncState)] -pub fn init_sync_state() -> Result { - Ok(JsSyncState(SyncState::default())) -} - -#[wasm_bindgen(js_name = encodeSyncState)] -pub fn encode_sync_state(sync_state: &JsSyncState) -> Result { - let binary_sync_state = BinarySyncState(sync_state.0.clone().encode().map_err(to_js_err)?); - Ok(serde_wasm_bindgen::to_value(&binary_sync_state)?) -} - -#[wasm_bindgen(js_name = decodeSyncState)] -pub fn decode_sync_state(sync_state_bytes: JsValue) -> Result { - let bytes: BinarySyncState = serde_wasm_bindgen::from_value(sync_state_bytes)?; - let sync_state = SyncState::decode(&bytes.0).map_err(to_js_err)?; - Ok(JsSyncState(sync_state)) -} - -#[wasm_bindgen(js_name = encodeSyncMessage)] -pub fn encode_sync_message(sync_message: JsValue) -> Result { - let sync_message = SyncMessage::try_from(serde_wasm_bindgen::from_value::( - sync_message, - )?) - .map_err(to_js_err)?; - - let binary_sync_message = BinarySyncMessage(sync_message.encode().map_err(to_js_err)?); - Ok(serde_wasm_bindgen::to_value(&binary_sync_message)?) -} - -#[wasm_bindgen(js_name = decodeSyncMessage)] -pub fn decode_sync_message(sync_message_bytes: JsValue) -> Result { - let bytes: BinarySyncMessage = serde_wasm_bindgen::from_value(sync_message_bytes)?; - let sync_message = SyncMessage::decode(&bytes.0).map_err(to_js_err)?; - serde_wasm_bindgen::to_value(&RawSyncMessage::try_from(sync_message).map_err(to_js_err)?) - .map_err(to_js_err) -} - -fn get_state(input: &Object) -> Result { - if input.frozen() { - Err(js_sys::Error::new("Attempting to use an outdated Automerge document that has already been updated. Please use the latest document state, or call Automerge.clone() if you really need to use this old document state.").into()) - } else { - Ok(input.state()) - } -} - -fn wrapper(state: State, frozen: bool, heads: Vec) -> Object { - let heads_array = Array::new(); - for h in heads { - heads_array.push(&rust_to_js(h).unwrap()); - } - - let wrapper = Object::new(); - wrapper.set_heads(heads_array); - wrapper.set_frozen(frozen); - wrapper.set_state(state); - wrapper -} - -fn get_input(input: Object, action: F) -> Result -where - F: FnOnce(&State) -> Result, -{ - let state: State = get_state(&input)?; - let result = action(&state); - input.set_state(state); - result -} - -fn get_mut_input(input: Object, action: F) -> Result -where - F: Fn(&mut State) -> Result, -{ - let mut state: State = get_state(&input)?; - - match action(&mut state) { - Ok(result) => { - let heads = state.0.get_heads(); - let new_state = wrapper(state, false, heads); - input.set_frozen(true); - if result.length() == 0 { - Ok(new_state.into()) - } else { - result.unshift(&new_state.into()); - Ok(result.into()) - } - } - Err(err) => { - input.set_state(state); - Err(to_js_err(err)) - } - } -} - -fn json_to_err(_err: T) -> AutomergeError { - AutomergeError::DecodeFailed -} - -fn to_js_err(err: T) -> JsValue { - js_sys::Error::new(&std::format!("Automerge error: {}", err)).into() -} - -fn json_error_to_js(err: serde_json::Error) -> JsValue { - js_sys::Error::new(&std::format!("serde_json error: {}", err)).into() -} diff --git a/automerge-backend-wasm/src/types.rs b/automerge-backend-wasm/src/types.rs deleted file mode 100644 index 37e70eee..00000000 --- a/automerge-backend-wasm/src/types.rs +++ /dev/null @@ -1,102 +0,0 @@ -use std::convert::TryFrom; - -use automerge_backend::{AutomergeError, BloomFilter, Change, SyncHave, SyncMessage}; -use automerge_protocol::ChangeHash; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct BinaryChange(#[serde(with = "serde_bytes")] pub Vec); - -#[derive(Serialize, Deserialize)] -pub struct BinaryDocument(#[serde(with = "serde_bytes")] pub Vec); - -#[derive(Serialize, Deserialize)] -pub struct BinarySyncState(#[serde(with = "serde_bytes")] pub Vec); - -#[derive(Serialize, Deserialize)] -pub struct BinarySyncMessage(#[serde(with = "serde_bytes")] pub Vec); - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawSyncMessage { - pub heads: Vec, - pub need: Vec, - pub have: Vec, - pub changes: Vec, -} - -impl TryFrom for RawSyncMessage { - type Error = AutomergeError; - - fn try_from(value: SyncMessage) -> Result { - let have = value - .have - .into_iter() - .map(RawSyncHave::try_from) - .collect::>()?; - let changes = value - .changes - .into_iter() - .map(|c| BinaryChange(c.raw_bytes().to_vec())) - .collect(); - Ok(Self { - heads: value.heads, - need: value.need, - have, - changes, - }) - } -} - -impl TryFrom for SyncMessage { - type Error = AutomergeError; - - fn try_from(value: RawSyncMessage) -> Result { - let have = value - .have - .into_iter() - .map(SyncHave::try_from) - .collect::>()?; - let changes = value - .changes - .into_iter() - .map(|b| Change::from_bytes(b.0)) - .collect::>()?; - Ok(Self { - heads: value.heads, - need: value.need, - have, - changes, - }) - } -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawSyncHave { - pub last_sync: Vec, - #[serde(with = "serde_bytes")] - pub bloom: Vec, -} - -impl TryFrom for RawSyncHave { - type Error = AutomergeError; - - fn try_from(value: SyncHave) -> Result { - Ok(Self { - last_sync: value.last_sync, - bloom: value.bloom.into_bytes()?, - }) - } -} - -impl TryFrom for SyncHave { - type Error = AutomergeError; - - fn try_from(raw: RawSyncHave) -> Result { - Ok(Self { - last_sync: raw.last_sync, - bloom: BloomFilter::try_from(raw.bloom.as_slice())?, - }) - } -} diff --git a/automerge-backend-wasm/test/backend_test.js b/automerge-backend-wasm/test/backend_test.js deleted file mode 100644 index 27e810a2..00000000 --- a/automerge-backend-wasm/test/backend_test.js +++ /dev/null @@ -1,52 +0,0 @@ -const assert = require('assert') -const Backend = require('..') - -describe('Automerge.Backend', () => { - describe('incremental diffs', () => { - it('should assign to a key in a map', () => { - const doc1 = Backend.init() - const change = { - actor: '55f250d0f76b4e15923600f98ebed8d7', - seq: 1, - startOp: 1, - deps: [], - time: 1609190674, - message: '', - ops: [ - { - action: 'makeText', - obj: '_root', - key: 'text', - insert: false, - pred: [] - }, - { - action: 'set', - obj: '1@55f250d0f76b4e15923600f98ebed8d7', - key: '_head', - insert: true, - pred: [], - value: 'a' - }, - { - action: 'makeMap', - obj: '1@55f250d0f76b4e15923600f98ebed8d7', - key: '2@55f250d0f76b4e15923600f98ebed8d7', - insert: true, - pred: [] - }, - { - action: 'set', - obj: '3@55f250d0f76b4e15923600f98ebed8d7', - key: 'attribute', - insert: false, - pred: [], - value: 'bold' - }, - ], - extra_bytes: [] - } - const doc2 = Backend.applyLocalChange(doc1, change) - }) - }) -}) diff --git a/automerge-backend-wasm/test/mocha.opts b/automerge-backend-wasm/test/mocha.opts deleted file mode 100644 index feb9721d..00000000 --- a/automerge-backend-wasm/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---use_strict ---watch-extensions js -test/*test*.js diff --git a/automerge-backend-wasm/yarn.lock b/automerge-backend-wasm/yarn.lock deleted file mode 100644 index f44ff394..00000000 --- a/automerge-backend-wasm/yarn.lock +++ /dev/null @@ -1,735 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.1" - is-regex "^1.1.1" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.1" - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.15: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -picomatch@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" diff --git a/automerge-backend/Cargo.toml b/automerge-backend/Cargo.toml deleted file mode 100644 index a8d30261..00000000 --- a/automerge-backend/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "automerge-backend" -version = "0.0.1" -authors = ["Alex Good "] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -bench = false - -[dependencies] -serde = { version = "^1.0", features=["derive"] } -serde_json = "^1.0" -wasm-bindgen = "^0.2" -js-sys = "^0.3" -hex = "^0.4.2" -rand = { version = "^0.7.3", features=["small_rng"] } -maplit = "^1.0.2" -sha2 = "^0.8.1" -leb128 = "^0.2.4" -automerge-protocol = { path = "../automerge-protocol" } -fxhash = "^0.2.1" -thiserror = "1.0.16" -itertools = "0.9.0" -tracing = { version = "0.1.25", features = ["log"] } -flate2 = "1.0.20" -nonzero_ext = "^0.2.0" -base64 = "^0.13.0" - -[dependencies.web-sys] -version = "0.3" -features = [ - "console", -] - -[dev-dependencies] -test-env-log = "0.2.6" -env_logger = "*" -tracing-subscriber = {version = "0.2", features = ["chrono", "env-filter", "fmt"]} -pretty_assertions = "0.7.1" diff --git a/automerge-backend/TODO.md b/automerge-backend/TODO.md deleted file mode 100644 index b7e703df..00000000 --- a/automerge-backend/TODO.md +++ /dev/null @@ -1,9 +0,0 @@ - - -### TODO - -1. Performance work -2. Multi-Change compression `save() / load()` -3. `Automerge.ack()` -4. `Automerge.getLastLocalChange()` - diff --git a/automerge-backend/src/actor_map.rs b/automerge-backend/src/actor_map.rs deleted file mode 100644 index f5ded83f..00000000 --- a/automerge-backend/src/actor_map.rs +++ /dev/null @@ -1,125 +0,0 @@ -use std::cmp::Ordering; - -use automerge_protocol as amp; - -use crate::{ - expanded_op::ExpandedOp, - internal::{ActorId, ElementId, InternalOp, Key, ObjectId, OpId}, -}; - -#[derive(PartialEq, Debug, Clone, Default)] -pub(crate) struct ActorMap(Vec); - -impl ActorMap { - pub fn import_key(&mut self, key: &::Key) -> Key { - match key { - amp::Key::Map(string) => Key::Map(string.to_string()), - amp::Key::Seq(eid) => Key::Seq(self.import_element_id(eid)), - } - } - - pub fn import_actor(&mut self, actor: &::ActorId) -> ActorId { - if let Some(idx) = self.0.iter().position(|a| a == actor) { - ActorId(idx) - } else { - self.0.push(actor.clone()); - ActorId(self.0.len() - 1) - } - } - - pub fn import_opid(&mut self, opid: &::OpId) -> OpId { - OpId(opid.0, self.import_actor(&opid.1)) - } - - pub fn import_obj(&mut self, obj: &::ObjectId) -> ObjectId { - match obj { - amp::ObjectId::Root => ObjectId::Root, - amp::ObjectId::Id(ref opid) => ObjectId::Id(self.import_opid(opid)), - } - } - - pub fn import_element_id(&mut self, eid: &::ElementId) -> ElementId { - match eid { - amp::ElementId::Head => ElementId::Head, - amp::ElementId::Id(ref opid) => ElementId::Id(self.import_opid(opid)), - } - } - - pub fn import_op(&mut self, op: ExpandedOp) -> InternalOp { - let pred: Vec = op.pred.iter().map(|id| self.import_opid(id)).collect(); - InternalOp { - action: op.action, - obj: self.import_obj(&op.obj), - key: self.import_key(&op.key), - pred, - insert: op.insert, - } - } - - pub fn export_actor(&self, actor: ActorId) -> amp::ActorId { - self.0[actor.0].clone() - } - - pub fn export_opid(&self, opid: &OpId) -> amp::OpId { - amp::OpId(opid.0, self.export_actor(opid.1)) - } - - pub fn export_obj(&self, obj: &ObjectId) -> amp::ObjectId { - match obj { - ObjectId::Root => amp::ObjectId::Root, - ObjectId::Id(opid) => amp::ObjectId::Id(self.export_opid(opid)), - } - } - - #[allow(dead_code)] - pub fn index_of(&mut self, actor: &::ActorId) -> usize { - if let Some(index) = self.0.iter().position(|a| a == actor) { - return index; - } - self.0.push(actor.clone()); - self.0.len() - 1 - } - - #[allow(dead_code)] - pub fn actor_for(&self, index: usize) -> Option<&::ActorId> { - self.0.get(index) - } - - pub fn cmp(&self, eid1: &ElementId, eid2: &ElementId) -> Ordering { - match (eid1, eid2) { - (ElementId::Head, ElementId::Head) => Ordering::Equal, - (ElementId::Head, _) => Ordering::Less, - (_, ElementId::Head) => Ordering::Greater, - (ElementId::Id(opid1), ElementId::Id(opid2)) => self.cmp_opid(opid1, opid2), - } - } - - pub fn opid_to_string(&self, id: &OpId) -> String { - format!("{}@{}", id.0, self.export_actor(id.1).to_hex_string()) - } - - pub fn elementid_to_string(&self, eid: &ElementId) -> String { - match eid { - ElementId::Head => "_head".into(), - ElementId::Id(id) => self.opid_to_string(id), - } - } - - pub fn key_to_string(&self, key: &Key) -> String { - match &key { - Key::Map(s) => s.clone(), - Key::Seq(eid) => self.elementid_to_string(eid), - } - } - - fn cmp_opid(&self, op1: &OpId, op2: &OpId) -> Ordering { - if op1.0 == op2.0 { - let actor1 = &self.0[(op1.1).0]; - let actor2 = &self.0[(op2.1).0]; - actor1.cmp(actor2) - //op1.1.cmp(&op2.1) - } else { - op1.0.cmp(&op2.0) - } - } -} diff --git a/automerge-backend/src/backend.rs b/automerge-backend/src/backend.rs deleted file mode 100644 index 785f4291..00000000 --- a/automerge-backend/src/backend.rs +++ /dev/null @@ -1,629 +0,0 @@ -use core::cmp::max; -use std::{ - collections::{HashMap, HashSet, VecDeque}, - fmt::Debug, -}; - -use amp::ChangeHash; -use automerge_protocol as amp; - -use crate::{ - actor_map::ActorMap, - change::encode_document, - error::AutomergeError, - event_handlers::{EventHandlerId, EventHandlers}, - mark2, - op_handle::OpHandle, - op_set::OpSet, - patches::{generate_from_scratch_diff, IncrementalPatch}, - Change, EventHandler, -}; - -#[derive(Debug, Default, Clone)] -pub struct Backend { - queue: Vec, - op_set: OpSet, - op_set2: mark2::OpSet, - states: HashMap>, - actors: ActorMap, - history: Vec, - history_index: HashMap, - event_handlers: EventHandlers, -} - -impl Backend { - pub fn new() -> Self { - Self::default() - } - - fn make_patch( - &self, - diffs: amp::RootDiff, - actor_seq: Option<(amp::ActorId, u64)>, - ) -> Result { - let mut deps: Vec<_> = if let Some((ref actor, ref seq)) = actor_seq { - let last_hash = self.get_hash(actor, *seq)?; - self.op_set - .deps - .iter() - .filter(|&dep| dep != &last_hash) - .copied() - .collect() - } else { - self.op_set.deps.iter().copied().collect() - }; - deps.sort_unstable(); - let pending_changes = self.get_missing_deps(&[]).len(); - Ok(amp::Patch { - diffs, - deps, - max_op: self.op_set.max_op, - clock: self - .states - .iter() - .map(|(k, v)| (k.clone(), v.len() as u64)) - .collect(), - actor: actor_seq.clone().map(|(actor, _)| actor), - seq: actor_seq.map(|(_, seq)| seq), - pending_changes, - }) - } - - pub fn load_changes(&mut self, changes: Vec) -> Result<(), AutomergeError> { - self.apply(changes, None)?; - Ok(()) - } - - pub fn apply_changes(&mut self, changes: Vec) -> Result { - self.apply(changes, None) - } - - pub fn get_heads(&self) -> Vec { - self.op_set.heads() - } - - fn apply( - &mut self, - changes: Vec, - actor: Option<(amp::ActorId, u64)>, - ) -> Result { - let mut patch = IncrementalPatch::new(); - - for change in changes { - self.add_change(change, actor.is_some(), &mut patch)?; - } - - let workshop = self.op_set.patch_workshop(&self.actors); - let diffs = patch.finalize(&workshop); - self.make_patch(diffs, actor) - } - - fn get_hash(&self, actor: &::ActorId, seq: u64) -> Result { - self.states - .get(actor) - .and_then(|v| v.get(seq as usize - 1)) - .and_then(|&i| self.history.get(i)) - .map(|c| c.hash) - .ok_or(AutomergeError::InvalidSeq(seq)) - } - - pub fn apply_local_change( - &mut self, - mut change: amp::Change, - ) -> Result<(amp::Patch, Change), AutomergeError> { - self.check_for_duplicate(&change)?; // Change has already been applied - - let actor_seq = (change.actor_id.clone(), change.seq); - - if change.seq > 1 { - let last_hash = self.get_hash(&change.actor_id, change.seq - 1)?; - if !change.deps.contains(&last_hash) { - change.deps.push(last_hash) - } - } - - let bin_change: Change = change.into(); - let patch: amp::Patch = self.apply(vec![bin_change.clone()], Some(actor_seq))?; - - Ok((patch, bin_change)) - } - - fn check_for_duplicate(&self, change: &::Change) -> Result<(), AutomergeError> { - if self - .states - .get(&change.actor_id) - .map_or(0, |v| v.len() as u64) - >= change.seq - { - return Err(AutomergeError::DuplicateChange(format!( - "Change request has already been applied {}:{}", - change.actor_id.to_hex_string(), - change.seq - ))); - } - Ok(()) - } - - fn add_change( - &mut self, - change: Change, - local: bool, - diffs: &mut IncrementalPatch, - ) -> Result<(), AutomergeError> { - if local { - self.apply_change(change, diffs) - } else { - self.queue.push(change); - self.apply_queued_ops(diffs) - } - } - - fn apply_queued_ops(&mut self, diffs: &mut IncrementalPatch) -> Result<(), AutomergeError> { - while let Some(next_change) = self.pop_next_causally_ready_change() { - self.apply_change(next_change, diffs)?; - } - Ok(()) - } - - fn apply_change( - &mut self, - change: Change, - diffs: &mut IncrementalPatch, - ) -> Result<(), AutomergeError> { - if self.history_index.contains_key(&change.hash) { - return Ok(()); - } - - self.event_handlers.before_apply_change(&change); - - let change_index = self.update_history(change); - - // SAFETY: change_index is the index for the change we've just added so this can't (and - // shouldn't) panic. This is to get around the borrow checker. - let change = &self.history[change_index]; - - let op_set = &mut self.op_set; - - let start_op = change.start_op; - - op_set.update_deps(change); - - let ops = OpHandle::extract(change, &mut self.actors); - - op_set.max_op = max( - op_set.max_op, - (start_op + (ops.len() as u64)).saturating_sub(1), - ); - - op_set.apply_ops(ops, diffs, &mut self.actors)?; - - self.event_handlers.after_apply_change(change); - - Ok(()) - } - - fn update_history(&mut self, change: Change) -> usize { - let history_index = self.history.len(); - - self.states - .entry(change.actor_id().clone()) - .or_default() - .push(history_index); - - self.history_index.insert(change.hash, history_index); - self.history.push(change); - - history_index - } - - fn pop_next_causally_ready_change(&mut self) -> Option { - let mut index = 0; - while index < self.queue.len() { - let change = self.queue.get(index).unwrap(); - if change - .deps - .iter() - .all(|d| self.history_index.contains_key(d)) - { - return Some(self.queue.remove(index)); - } - index += 1 - } - None - } - - pub fn get_patch(&self) -> Result { - let workshop = self.op_set.patch_workshop(&self.actors); - let diffs = generate_from_scratch_diff(&workshop); - self.make_patch(diffs, None) - } - - pub fn get_changes_for_actor_id( - &self, - actor_id: &::ActorId, - ) -> Result, AutomergeError> { - Ok(self - .states - .get(actor_id) - .map(|vec| vec.iter().filter_map(|&i| self.history.get(i)).collect()) - .unwrap_or_default()) - } - - fn get_changes_fast(&self, have_deps: &[amp::ChangeHash]) -> Option> { - if have_deps.is_empty() { - return Some(self.history.iter().collect()); - } - - let lowest_idx = have_deps - .iter() - .filter_map(|h| self.history_index.get(h)) - .min()? - + 1; - - let mut missing_changes = vec![]; - let mut has_seen: HashSet<_> = have_deps.iter().collect(); - for change in &self.history[lowest_idx..] { - let deps_seen = change.deps.iter().filter(|h| has_seen.contains(h)).count(); - if deps_seen > 0 { - if deps_seen != change.deps.len() { - // future change depends on something we haven't seen - fast path cant work - return None; - } - missing_changes.push(change); - has_seen.insert(&change.hash); - } - } - - // if we get to the end and there is a head we haven't seen then fast path cant work - if self.get_heads().iter().all(|h| has_seen.contains(h)) { - Some(missing_changes) - } else { - None - } - } - - fn get_changes_slow(&self, have_deps: &[amp::ChangeHash]) -> Vec<&Change> { - let mut stack: Vec<_> = have_deps.iter().collect(); - let mut has_seen = HashSet::new(); - while let Some(hash) = stack.pop() { - if has_seen.contains(&hash) { - continue; - } - if let Some(change) = self - .history_index - .get(hash) - .and_then(|i| self.history.get(*i)) - { - stack.extend(change.deps.iter()); - } - has_seen.insert(hash); - } - self.history - .iter() - .filter(|change| !has_seen.contains(&change.hash)) - .collect() - } - - pub fn get_changes(&self, have_deps: &[amp::ChangeHash]) -> Vec<&Change> { - if let Some(changes) = self.get_changes_fast(have_deps) { - changes - } else { - self.get_changes_slow(have_deps) - } - } - - pub fn save(&self) -> Result, AutomergeError> { - let changes: Vec = self.history.iter().map(Change::decode).collect(); - //self.history.iter().map(|change| change.decode()).collect(); - Ok(encode_document(&changes)?) - } - - // allow this for API reasons - #[allow(clippy::needless_pass_by_value)] - pub fn load(data: Vec) -> Result { - let changes = Change::load_document(&data)?; - let mut backend = Self::new(); - backend.load_changes(changes)?; - Ok(backend) - } - - pub fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec { - let in_queue: HashSet<_> = self.queue.iter().map(|change| change.hash).collect(); - let mut missing = HashSet::new(); - - for head in self.queue.iter().flat_map(|change| &change.deps) { - if !self.history_index.contains_key(head) { - missing.insert(head); - } - } - - for head in heads { - if !self.history_index.contains_key(head) { - missing.insert(head); - } - } - - let mut missing = missing - .into_iter() - .filter(|hash| !in_queue.contains(hash)) - .copied() - .collect::>(); - missing.sort(); - missing - } - - pub fn get_change_by_hash(&self, hash: &::ChangeHash) -> Option<&Change> { - self.history_index - .get(hash) - .and_then(|index| self.history.get(*index)) - } - - /** - * Returns all changes that are present in `self` but not present in `other`. - */ - pub fn get_changes_added<'a>(&self, other: &'a Self) -> Vec<&'a Change> { - // Depth-first traversal from the heads through the dependency graph, - // until we reach a change that is already present in other - let mut stack: Vec<_> = other.op_set.deps.iter().collect(); - let mut seen_hashes = HashSet::new(); - let mut added_change_hashes = Vec::new(); - while let Some(hash) = stack.pop() { - if !seen_hashes.contains(&hash) && self.get_change_by_hash(hash).is_none() { - seen_hashes.insert(hash); - added_change_hashes.push(hash); - if let Some(change) = other.get_change_by_hash(hash) { - stack.extend(&change.deps); - } - } - } - // Return those changes in the reverse of the order in which the depth-first search - // found them. This is not necessarily a topological sort, but should usually be close. - added_change_hashes - .into_iter() - .filter_map(|h| other.get_change_by_hash(h)) - .collect() - } - - /// Filter the changes down to those that are not transitive dependencies of the heads. - /// - /// Thus a graph with these heads has not seen the remaining changes. - pub(crate) fn filter_changes( - &self, - heads: &[amp::ChangeHash], - changes: &mut HashSet, - ) { - // Reduce the working set to find to those which we may be able to find. - // This filters out those hashes that are successors of or concurrent with all of the - // heads. - // This can help in avoiding traversing the entire graph back to the roots when we try to - // search for a hash we can know won't be found there. - let max_head_index = heads - .iter() - .map(|h| self.history_index.get(h).unwrap_or(&0)) - .max() - .unwrap_or(&0); - let mut may_find: HashSet = changes - .iter() - .filter(|hash| { - let change_index = self.history_index.get(hash).unwrap_or(&0); - change_index <= max_head_index - }) - .copied() - .collect(); - - if may_find.is_empty() { - return; - } - - let mut queue: VecDeque<_> = heads.iter().collect(); - let mut seen = HashSet::new(); - while let Some(hash) = queue.pop_front() { - if seen.contains(hash) { - continue; - } - seen.insert(hash); - - let removed = may_find.remove(hash); - changes.remove(hash); - if may_find.is_empty() { - break; - } - - for dep in self - .history_index - .get(hash) - .and_then(|i| self.history.get(*i)) - .map(|c| c.deps.as_slice()) - .unwrap_or_default() - { - // if we just removed something from our hashes then it is likely there is more - // down here so do a quick inspection on the children. - // When we don't remove anything it is less likely that there is something down - // that chain so delay it. - if removed { - queue.push_front(dep) - } else { - queue.push_back(dep) - } - } - } - } - - /// Adds the event handler and returns the id of the handler. - pub fn add_event_handler(&mut self, handler: EventHandler) -> EventHandlerId { - self.event_handlers.add_handler(handler) - } - - /// Remove the handler with the given id, returning whether it removed a handler or not. - pub fn remove_event_handler(&mut self, id: EventHandlerId) -> bool { - self.event_handlers.remove_handler(id) - } -} - -#[cfg(test)] -mod tests { - use std::convert::TryInto; - - use automerge_protocol::{ActorId, ObjectId, Op, OpType}; - - use super::*; - - #[test] - fn test_get_changes_fast_behavior() { - let actor_a: ActorId = "7b7723afd9e6480397a4d467b7693156".try_into().unwrap(); - let actor_b: ActorId = "37704788917a499cb0206fa8519ac4d9".try_into().unwrap(); - let change_a1: Change = amp::Change { - actor_id: actor_a.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: OpType::Set("magpie".into()), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - let change_a2: Change = amp::Change { - actor_id: actor_a, - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change_a1.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: OpType::Set("ant".into()), - key: "bug".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - let change_b1: Change = amp::Change { - actor_id: actor_b.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: vec![], - operations: vec![Op { - obj: ObjectId::Root, - action: OpType::Set("dove".into()), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - let change_b2: Change = amp::Change { - actor_id: actor_b.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change_b1.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: OpType::Set("stag beetle".into()), - key: "bug".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - let change_b3: Change = amp::Change { - actor_id: actor_b, - seq: 3, - start_op: 3, - time: 0, - message: None, - hash: None, - deps: vec![change_a2.hash, change_b2.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: OpType::Set("bugs and birds".into()), - key: "title".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - let mut backend = Backend::new(); - - backend - .apply_changes(vec![change_a1.clone(), change_a2.clone()]) - .unwrap(); - - assert_eq!( - backend.get_changes_fast(&[]), - Some(vec![&change_a1, &change_a2]) - ); - assert_eq!( - backend.get_changes_fast(&[change_a1.hash]), - Some(vec![&change_a2]) - ); - assert_eq!(backend.get_heads(), vec![change_a2.hash]); - - backend - .apply_changes(vec![change_b1.clone(), change_b2.clone()]) - .unwrap(); - - assert_eq!( - backend.get_changes_fast(&[]), - Some(vec![&change_a1, &change_a2, &change_b1, &change_b2]) - ); - assert_eq!(backend.get_changes_fast(&[change_a1.hash]), None); - assert_eq!(backend.get_changes_fast(&[change_a2.hash]), None); - assert_eq!( - backend.get_changes_fast(&[change_a1.hash, change_b1.hash]), - Some(vec![&change_a2, &change_b2]) - ); - assert_eq!( - backend.get_changes_fast(&[change_a2.hash, change_b1.hash]), - Some(vec![&change_b2]) - ); - assert_eq!(backend.get_heads(), vec![change_b2.hash, change_a2.hash]); - - backend.apply_changes(vec![change_b3.clone()]).unwrap(); - - assert_eq!(backend.get_heads(), vec![change_b3.hash]); - assert_eq!( - backend.get_changes_fast(&[]), - Some(vec![ - &change_a1, &change_a2, &change_b1, &change_b2, &change_b3 - ]) - ); - assert_eq!(backend.get_changes_fast(&[change_a1.hash]), None); - assert_eq!(backend.get_changes_fast(&[change_a2.hash]), None); - assert_eq!(backend.get_changes_fast(&[change_b1.hash]), None); - assert_eq!(backend.get_changes_fast(&[change_b2.hash]), None); - assert_eq!( - backend.get_changes_fast(&[change_a1.hash, change_b1.hash]), - Some(vec![&change_a2, &change_b2, &change_b3]) - ); - assert_eq!( - backend.get_changes_fast(&[change_a2.hash, change_b1.hash]), - Some(vec![&change_b2, &change_b3]) - ); - assert_eq!(backend.get_changes_fast(&[change_b3.hash]), Some(vec![])); - } -} diff --git a/automerge-backend/src/change.rs b/automerge-backend/src/change.rs deleted file mode 100644 index abd5db1b..00000000 --- a/automerge-backend/src/change.rs +++ /dev/null @@ -1,1377 +0,0 @@ -//use crate::columnar; -use core::fmt::Debug; -use std::{ - borrow::Cow, - collections::{HashMap, HashSet}, - convert::{TryFrom, TryInto}, - io::{Read, Write}, - ops::Range, - str, -}; - -use amp::OpType; -use automerge_protocol as amp; -use flate2::{ - bufread::{DeflateDecoder, DeflateEncoder}, - Compression, -}; -use itertools::Itertools; -use nonzero_ext::nonzero; -use sha2::{Digest, Sha256}; -use tracing::instrument; - -use crate::{ - columnar::{ - ChangeEncoder, ChangeIterator, ColumnEncoder, DocChange, DocOp, DocOpEncoder, - DocOpIterator, OperationIterator, COLUMN_TYPE_DEFLATE, - }, - decoding, - decoding::{Decodable, InvalidChangeError}, - encoding, - encoding::{Encodable, DEFLATE_MIN_SIZE}, - error::AutomergeError, - expanded_op::ExpandedOpIterator, - internal::InternalOpType, -}; - -const HASH_BYTES: usize = 32; -const BLOCK_TYPE_DOC: u8 = 0; -const BLOCK_TYPE_CHANGE: u8 = 1; -const BLOCK_TYPE_DEFLATE: u8 = 2; -const CHUNK_START: usize = 8; -const HASH_RANGE: Range = 4..8; - -impl From for Change { - fn from(value: amp::Change) -> Self { - encode(&value) - } -} - -impl From<&::Change> for Change { - fn from(value: &::Change) -> Self { - encode(value) - } -} - -fn encode(change: &::Change) -> Change { - let mut bytes: Vec = Vec::new(); - let mut hasher = Sha256::new(); - - let mut deps = change.deps.clone(); - deps.sort_unstable(); - - let mut chunk = encode_chunk(change, &deps); - - bytes.extend(&MAGIC_BYTES); - - bytes.extend(vec![0, 0, 0, 0]); // we dont know the hash yet so fill in a fake - - bytes.push(BLOCK_TYPE_CHANGE); - - leb128::write::unsigned(&mut bytes, chunk.bytes.len() as u64).unwrap(); - - increment_range(&mut chunk.body, bytes.len()); - increment_range(&mut chunk.message, bytes.len()); - increment_range(&mut chunk.extra_bytes, bytes.len()); - increment_range_map(&mut chunk.ops, bytes.len()); - - bytes.extend(&chunk.bytes); - - hasher.input(&bytes[CHUNK_START..bytes.len()]); - let hash_result = hasher.result(); - let hash: amp::ChangeHash = hash_result[..].try_into().unwrap(); - - bytes.splice(HASH_RANGE, hash_result[0..4].iter().copied()); - - // any time I make changes to the encoder decoder its a good idea - // to run it through a round trip to detect errors the tests might not - // catch - // let c0 = Change::from_bytes(bytes.clone()).unwrap(); - // std::assert_eq!(c1, c0); - // perhaps we should add something like this to the test suite - - let bytes = if bytes.len() > DEFLATE_MIN_SIZE { - let mut result = Vec::with_capacity(bytes.len()); - result.extend(&bytes[0..8]); - result.push(BLOCK_TYPE_DEFLATE); - let mut deflater = DeflateEncoder::new(&chunk.bytes[..], Compression::best()); - let mut deflated = Vec::new(); - let deflated_len = deflater.read_to_end(&mut deflated).unwrap(); - leb128::write::unsigned(&mut result, deflated_len as u64).unwrap(); - result.extend(&deflated[..]); - ChangeBytes::Compressed { - compressed: result, - uncompressed: bytes, - } - } else { - ChangeBytes::Uncompressed(bytes) - }; - - Change { - bytes, - hash, - seq: change.seq, - start_op: change.start_op, - time: change.time, - actors: chunk.actors, - message: chunk.message, - deps, - ops: chunk.ops, - extra_bytes: chunk.extra_bytes, - } -} - -struct ChunkIntermediate { - bytes: Vec, - body: Range, - actors: Vec, - message: Range, - ops: HashMap>, - extra_bytes: Range, -} - -fn encode_chunk(change: &::Change, deps: &[amp::ChangeHash]) -> ChunkIntermediate { - let mut bytes = Vec::new(); - - // All these unwraps are okay because we're writing to an in memory buffer so io erros should - // not happen - - // encode deps - deps.len().encode(&mut bytes).unwrap(); - for hash in deps.iter() { - bytes.write_all(&hash.0).unwrap(); - } - - // encode first actor - let mut actors = vec![change.actor_id.clone()]; - change.actor_id.to_bytes().encode(&mut bytes).unwrap(); - - // encode seq, start_op, time, message - change.seq.encode(&mut bytes).unwrap(); - change.start_op.encode(&mut bytes).unwrap(); - change.time.encode(&mut bytes).unwrap(); - let message = bytes.len() + 1; - change.message.encode(&mut bytes).unwrap(); - let message = message..bytes.len(); - - let expanded_ops = - ExpandedOpIterator::new(&change.operations, change.start_op, change.actor_id.clone()); - - // encode ops into a side buffer - collect all other actors - let (ops_buf, mut ops) = ColumnEncoder::encode_ops(expanded_ops, &mut actors); - - // encode all other actors - actors[1..].encode(&mut bytes).unwrap(); - - // now we know how many bytes ops are offset by so we can adjust the ranges - increment_range_map(&mut ops, bytes.len()); - - // write out the ops - - bytes.write_all(&ops_buf).unwrap(); - - // write out the extra bytes - let extra_bytes = bytes.len()..(bytes.len() + change.extra_bytes.len()); - bytes.write_all(&change.extra_bytes).unwrap(); - let body = 0..bytes.len(); - - ChunkIntermediate { - bytes, - body, - actors, - message, - ops, - extra_bytes, - } -} - -#[derive(PartialEq, Debug, Clone)] -enum ChangeBytes { - Compressed { - compressed: Vec, - uncompressed: Vec, - }, - Uncompressed(Vec), -} - -impl ChangeBytes { - fn uncompressed(&self) -> &[u8] { - match self { - ChangeBytes::Compressed { uncompressed, .. } => &uncompressed[..], - ChangeBytes::Uncompressed(b) => &b[..], - } - } - - fn raw(&self) -> &[u8] { - match self { - ChangeBytes::Compressed { compressed, .. } => &compressed[..], - ChangeBytes::Uncompressed(b) => &b[..], - } - } -} - -#[derive(PartialEq, Debug, Clone)] -pub struct Change { - bytes: ChangeBytes, - pub hash: amp::ChangeHash, - pub seq: u64, - pub start_op: u64, - pub time: i64, - pub message: Range, - pub actors: Vec, - pub deps: Vec, - ops: HashMap>, - pub extra_bytes: Range, -} - -impl Change { - pub fn actor_id(&self) -> &::ActorId { - &self.actors[0] - } - - #[instrument(level = "debug", skip(bytes))] - pub fn load_document(bytes: &[u8]) -> Result, AutomergeError> { - load_blocks(bytes) - } - - pub fn from_bytes(bytes: Vec) -> Result { - decode_change(bytes) - } - - pub fn max_op(&self) -> u64 { - // TODO - this could be a lot more efficient - let len = self.iter_ops().count(); - self.start_op + (len as u64) - 1 - } - - pub fn message(&self) -> Option { - let m = &self.bytes.uncompressed()[self.message.clone()]; - if m.is_empty() { - None - } else { - str::from_utf8(m).map(ToString::to_string).ok() - } - } - - pub fn decode(&self) -> amp::Change { - amp::Change { - start_op: self.start_op, - seq: self.seq, - time: self.time, - hash: Some(self.hash), - message: self.message(), - actor_id: self.actors[0].clone(), - deps: self.deps.clone(), - operations: self - .iter_ops() - .map(|op| amp::Op { - action: match op.action { - InternalOpType::Make(obj_type) => OpType::Make(obj_type), - InternalOpType::Del => OpType::Del(nonzero!(1_u32)), - InternalOpType::Inc(i) => OpType::Inc(i), - InternalOpType::Set(value) => OpType::Set(value), - }, - obj: op.obj.clone().into_owned(), - key: op.key.into_owned(), - pred: op.pred.into_owned(), - insert: op.insert, - }) - .collect(), - extra_bytes: self.extra_bytes().into(), - } - } - - pub fn iter_ops(&self) -> OperationIterator { - OperationIterator::new(self.bytes.uncompressed(), &self.actors, &self.ops) - } - - pub fn extra_bytes(&self) -> &[u8] { - &self.bytes.uncompressed()[self.extra_bytes.clone()] - } - - pub fn raw_bytes(&self) -> &[u8] { - self.bytes.raw() - } -} - -impl TryFrom<&[u8]> for Change { - type Error = decoding::Error; - - fn try_from(bytes: &[u8]) -> Result { - Change::from_bytes(bytes.to_vec()) - } -} - -fn read_leb128(bytes: &mut &[u8]) -> Result<(usize, usize), decoding::Error> { - let mut buf = &bytes[..]; - let val = leb128::read::unsigned(&mut buf)? as usize; - let leb128_bytes = bytes.len() - buf.len(); - Ok((val, leb128_bytes)) -} - -fn read_slice( - bytes: &[u8], - cursor: &mut Range, -) -> Result { - let mut view = &bytes[cursor.clone()]; - let init_len = view.len(); - let val = T::decode::<&[u8]>(&mut view).ok_or(decoding::Error::NoDecodedValue); - let bytes_read = init_len - view.len(); - *cursor = (cursor.start + bytes_read)..cursor.end; - val -} - -fn slice_bytes(bytes: &[u8], cursor: &mut Range) -> Result, decoding::Error> { - let (val, len) = read_leb128(&mut &bytes[cursor.clone()])?; - let start = cursor.start + len; - let end = start + val; - *cursor = end..cursor.end; - Ok(start..end) -} - -fn increment_range(range: &mut Range, len: usize) { - range.end += len; - range.start += len; -} - -fn increment_range_map(ranges: &mut HashMap>, len: usize) { - for range in ranges.values_mut() { - increment_range(range, len) - } -} - -#[allow(dead_code)] -pub(crate) struct Document { - pub bytes: Vec, - pub hash: amp::ChangeHash, - pub seq: u64, - pub start_op: u64, - pub time: i64, - body: Range, - message: Range, - actors: Vec, - pub deps: Vec, - ops: HashMap>, - extra_bytes: Range, -} - -fn decode_header(bytes: &[u8]) -> Result<(u8, amp::ChangeHash, Range), decoding::Error> { - let (chunktype, body) = decode_header_without_hash(bytes)?; - - let mut hasher = Sha256::new(); - hasher.input(&bytes[PREAMBLE_BYTES..]); - let calculated_hash = hasher.result(); - - let checksum = &bytes[4..8]; - if checksum != &calculated_hash[0..4] { - return Err(decoding::Error::InvalidChecksum { - found: checksum.try_into().unwrap(), - calculated: calculated_hash[0..4].try_into().unwrap(), - }); - } - - let hash = calculated_hash[..] - .try_into() - .map_err(InvalidChangeError::from)?; - - Ok((chunktype, hash, body)) -} - -fn decode_header_without_hash(bytes: &[u8]) -> Result<(u8, Range), decoding::Error> { - if bytes.len() <= HEADER_BYTES { - return Err(decoding::Error::NotEnoughBytes); - } - - if bytes[0..4] != MAGIC_BYTES { - return Err(decoding::Error::WrongMagicBytes); - } - - let (val, len) = read_leb128(&mut &bytes[HEADER_BYTES..])?; - let body = (HEADER_BYTES + len)..(HEADER_BYTES + len + val); - if bytes.len() != body.end { - return Err(decoding::Error::WrongByteLength { - expected: body.end, - found: bytes.len(), - }); - } - - let chunktype = bytes[PREAMBLE_BYTES]; - - Ok((chunktype, body)) -} - -fn decode_hashes( - bytes: &[u8], - cursor: &mut Range, -) -> Result, decoding::Error> { - let num_hashes = read_slice(bytes, cursor)?; - let mut hashes = Vec::with_capacity(num_hashes); - for _ in 0..num_hashes { - let hash = cursor.start..(cursor.start + HASH_BYTES); - *cursor = hash.end..cursor.end; - hashes.push( - bytes - .get(hash) - .ok_or(decoding::Error::NotEnoughBytes)? - .try_into() - .map_err(InvalidChangeError::from)?, - ); - } - Ok(hashes) -} - -fn decode_actors( - bytes: &[u8], - cursor: &mut Range, - first: Option, -) -> Result, decoding::Error> { - let num_actors: usize = read_slice(bytes, cursor)?; - let mut actors = Vec::with_capacity(num_actors + 1); - if let Some(actor) = first { - actors.push(actor) - } - for _ in 0..num_actors { - actors.push(amp::ActorId::from( - bytes - .get(slice_bytes(bytes, cursor)?) - .ok_or(decoding::Error::NotEnoughBytes)?, - )); - } - Ok(actors) -} - -fn decode_column_info( - bytes: &[u8], - cursor: &mut Range, - allow_compressed_column: bool, -) -> Result, decoding::Error> { - let num_columns = read_slice(bytes, cursor)?; - let mut columns = Vec::with_capacity(num_columns); - let mut last_id = 0; - for _ in 0..num_columns { - let id: u32 = read_slice(bytes, cursor)?; - if (id & !COLUMN_TYPE_DEFLATE) <= (last_id & !COLUMN_TYPE_DEFLATE) { - return Err(decoding::Error::ColumnsNotInAscendingOrder { - last: last_id, - found: id, - }); - } - if id & COLUMN_TYPE_DEFLATE != 0 && !allow_compressed_column { - return Err(decoding::Error::ChangeContainedCompressedColumns); - } - last_id = id; - let length = read_slice(bytes, cursor)?; - columns.push((id, length)); - } - Ok(columns) -} - -fn decode_columns( - cursor: &mut Range, - columns: &[(u32, usize)], -) -> HashMap> { - let mut ops = HashMap::new(); - for (id, length) in columns { - let start = cursor.start; - let end = start + length; - *cursor = end..cursor.end; - ops.insert(*id, start..end); - } - ops -} - -fn decode_block(bytes: &[u8], changes: &mut Vec) -> Result<(), decoding::Error> { - match bytes[PREAMBLE_BYTES] { - BLOCK_TYPE_DOC => { - changes.extend(decode_document(bytes)?); - Ok(()) - } - BLOCK_TYPE_CHANGE | BLOCK_TYPE_DEFLATE => { - changes.push(decode_change(bytes.to_vec())?); - Ok(()) - } - found => Err(decoding::Error::WrongType { - expected_one_of: vec![BLOCK_TYPE_DOC, BLOCK_TYPE_CHANGE, BLOCK_TYPE_DEFLATE], - found, - }), - } -} - -fn decode_change(bytes: Vec) -> Result { - let (chunktype, body) = decode_header_without_hash(&bytes)?; - let bytes = if chunktype == BLOCK_TYPE_DEFLATE { - decompress_chunk(0..PREAMBLE_BYTES, body, bytes)? - } else { - ChangeBytes::Uncompressed(bytes) - }; - - let (chunktype, hash, body) = decode_header(bytes.uncompressed())?; - - if chunktype != BLOCK_TYPE_CHANGE { - return Err(decoding::Error::WrongType { - expected_one_of: vec![BLOCK_TYPE_CHANGE], - found: chunktype, - }); - } - - let mut cursor = body; - - let deps = decode_hashes(bytes.uncompressed(), &mut cursor)?; - - let actor = - amp::ActorId::from(&bytes.uncompressed()[slice_bytes(bytes.uncompressed(), &mut cursor)?]); - let seq = read_slice(bytes.uncompressed(), &mut cursor)?; - let start_op = read_slice(bytes.uncompressed(), &mut cursor)?; - let time = read_slice(bytes.uncompressed(), &mut cursor)?; - let message = slice_bytes(bytes.uncompressed(), &mut cursor)?; - - let actors = decode_actors(bytes.uncompressed(), &mut cursor, Some(actor))?; - - let ops_info = decode_column_info(bytes.uncompressed(), &mut cursor, false)?; - let ops = decode_columns(&mut cursor, &ops_info); - - Ok(Change { - bytes, - hash, - seq, - start_op, - time, - actors, - message, - deps, - ops, - extra_bytes: cursor, - }) -} - -fn decompress_chunk( - preamble: Range, - body: Range, - compressed: Vec, -) -> Result { - let mut decoder = DeflateDecoder::new(&compressed[body]); - let mut decompressed = Vec::new(); - decoder.read_to_end(&mut decompressed)?; - let mut result = Vec::with_capacity(decompressed.len() + preamble.len()); - result.extend(&compressed[preamble]); - result.push(BLOCK_TYPE_CHANGE); - leb128::write::unsigned::>(&mut result, decompressed.len() as u64).unwrap(); - result.extend(decompressed); - Ok(ChangeBytes::Compressed { - uncompressed: result, - compressed, - }) -} - -// -// group all the ops together with the appropriate change and reconstitute the del ops -// mutates the arguments - returns nothing -// - -fn group_doc_change_and_doc_ops( - changes: &mut [DocChange], - mut ops: Vec, - actors: &[amp::ActorId], -) -> Result<(), decoding::Error> { - let mut changes_by_actor: HashMap> = HashMap::new(); - - for (i, change) in changes.iter().enumerate() { - let actor_change_index = changes_by_actor.entry(change.actor).or_default(); - if change.seq != (actor_change_index.len() + 1) as u64 { - return Err(decoding::Error::ChangeDecompressFailed( - "Doc Seq Invalid".into(), - )); - } - if change.actor >= actors.len() { - return Err(decoding::Error::ChangeDecompressFailed( - "Doc Actor Invalid".into(), - )); - } - actor_change_index.push(i); - } - - let mut op_by_id = HashMap::new(); - ops.iter().enumerate().for_each(|(i, op)| { - op_by_id.insert((op.ctr, op.actor), i); - }); - - for i in 0..ops.len() { - let op = ops[i].clone(); // this is safe - avoid borrow checker issues - //let id = (op.ctr, op.actor); - //op_by_id.insert(id, i); - for succ in &op.succ { - if let Some(index) = op_by_id.get(succ) { - ops[*index].pred.push((op.ctr, op.actor)) - } else { - let key = if op.insert { - amp::OpId(op.ctr, actors[op.actor].clone()).into() - } else { - op.key.clone() - }; - let del = DocOp { - actor: succ.1, - ctr: succ.0, - action: InternalOpType::Del, - obj: op.obj.clone(), - key, - succ: Vec::new(), - pred: vec![(op.ctr, op.actor)], - insert: false, - }; - op_by_id.insert(*succ, ops.len()); - ops.push(del); - } - } - } - - for op in ops { - // binary search for our change - let actor_change_index = changes_by_actor.entry(op.actor).or_default(); - let mut left = 0; - let mut right = actor_change_index.len(); - while left < right { - let seq = (left + right) / 2; - if changes[actor_change_index[seq]].max_op < op.ctr { - left = seq + 1 - } else { - right = seq - } - } - if left >= actor_change_index.len() { - return Err(decoding::Error::ChangeDecompressFailed( - "Doc MaxOp Invalid".into(), - )); - } - changes[actor_change_index[left]].ops.push(op) - } - - changes - .iter_mut() - .for_each(|change| change.ops.sort_unstable()); - - Ok(()) -} - -fn pred_into(pred: &[(u64, usize)], actors: &[amp::ActorId]) -> Vec { - pred.iter() - .map(|(ctr, actor)| amp::OpId(*ctr, actors[*actor].clone())) - .collect() -} - -fn doc_changes_to_uncompressed_changes( - changes: &[DocChange], - actors: &[amp::ActorId], -) -> Vec { - changes - .iter() - .map(|change| amp::Change { - // we've already confirmed that all change.actor's are valid - actor_id: actors[change.actor].clone(), - seq: change.seq, - time: change.time, - start_op: change.max_op - change.ops.len() as u64 + 1, - hash: None, - message: change.message.clone(), - operations: change - .ops - .iter() - .map(|op| amp::Op { - action: (&op.action).into(), - insert: op.insert, - key: op.key.clone(), - obj: op.obj.clone(), - // we've already confirmed that all op.actor's are valid - pred: pred_into(&op.pred, actors), - }) - .collect(), - deps: Vec::new(), - extra_bytes: change.extra_bytes.clone(), - }) - .collect() -} - -fn load_blocks(bytes: &[u8]) -> Result, AutomergeError> { - let mut changes = Vec::new(); - for slice in split_blocks(bytes)? { - decode_block(slice, &mut changes)?; - } - Ok(changes) -} - -fn split_blocks(bytes: &[u8]) -> Result, decoding::Error> { - // split off all valid blocks - ignore the rest if its corrupted or truncated - let mut blocks = Vec::new(); - let mut cursor = bytes; - while let Some(block) = pop_block(cursor)? { - blocks.push(&cursor[block.clone()]); - if cursor.len() <= block.end { - break; - } - cursor = &cursor[block.end..]; - } - Ok(blocks) -} - -fn pop_block(bytes: &[u8]) -> Result>, decoding::Error> { - if bytes.len() < 4 || bytes[0..4] != MAGIC_BYTES { - // not reporting error here - file got corrupted? - return Ok(None); - } - let (val, len) = read_leb128( - &mut bytes - .get(HEADER_BYTES..) - .ok_or(decoding::Error::NotEnoughBytes)?, - )?; - // val is arbitrary so it could overflow - let end = (HEADER_BYTES + len) - .checked_add(val) - .ok_or(decoding::Error::Overflow)?; - if end > bytes.len() { - // not reporting error here - file got truncated? - return Ok(None); - } - Ok(Some(0..end)) -} - -fn decode_document(bytes: &[u8]) -> Result, decoding::Error> { - let (chunktype, _hash, mut cursor) = decode_header(bytes)?; - - // chunktype == 0 is a document, chunktype = 1 is a change - if chunktype > 0 { - return Err(decoding::Error::WrongType { - expected_one_of: vec![0], - found: chunktype, - }); - } - - let actors = decode_actors(bytes, &mut cursor, None)?; - // FIXME - // I should calculate the deads generated on decode and confirm they match these - let _heads = decode_hashes(bytes, &mut cursor)?; - - let changes_info = decode_column_info(bytes, &mut cursor, true)?; - let ops_info = decode_column_info(bytes, &mut cursor, true)?; - - let changes_data = decode_columns(&mut cursor, &changes_info); - let mut doc_changes: Vec<_> = ChangeIterator::new(bytes, &changes_data).collect(); - - let ops_data = decode_columns(&mut cursor, &ops_info); - let doc_ops: Vec<_> = DocOpIterator::new(bytes, &actors, &ops_data).collect(); - - group_doc_change_and_doc_ops(&mut doc_changes, doc_ops, &actors)?; - - let mut uncompressed_changes = doc_changes_to_uncompressed_changes(&doc_changes, &actors); - - compress_doc_changes(&mut uncompressed_changes, &doc_changes) - .ok_or(decoding::Error::NoDocChanges) -} - -// this function is only used for testing - delete after mark2 is done -#[allow(dead_code)] -pub (crate) fn decode_document_opids(bytes: &[u8]) -> Result, decoding::Error> { - let (chunktype, _hash, mut cursor) = decode_header(bytes)?; - - // chunktype == 0 is a document, chunktype = 1 is a change - if chunktype > 0 { - return Err(decoding::Error::WrongType { - expected_one_of: vec![0], - found: chunktype, - }); - } - - let actors = decode_actors(bytes, &mut cursor, None)?; - // FIXME - // I should calculate the deads generated on decode and confirm they match these - let _heads = decode_hashes(bytes, &mut cursor)?; - - let changes_info = decode_column_info(bytes, &mut cursor, true)?; - let ops_info = decode_column_info(bytes, &mut cursor, true)?; - - let changes_data = decode_columns(&mut cursor, &changes_info); - let _doc_changes: Vec<_> = ChangeIterator::new(bytes, &changes_data).collect(); - - let ops_data = decode_columns(&mut cursor, &ops_info); - let doc_ops: Vec<_> = DocOpIterator::new(bytes, &actors, &ops_data).collect(); - - Ok(doc_ops.iter().map(|op| amp::OpId(op.ctr,actors[op.actor].clone())).collect()) - - /* - group_doc_change_and_doc_ops(&mut doc_changes, doc_ops, &actors)?; - - let mut uncompressed_changes = doc_changes_to_uncompressed_changes(&doc_changes, &actors); - - compress_doc_changes(&mut uncompressed_changes, &doc_changes) - .ok_or(decoding::Error::NoDocChanges) - */ -} - -fn compress_doc_changes( - uncompressed_changes: &mut [amp::Change], - doc_changes: &[DocChange], -) -> Option> { - let mut changes: Vec = Vec::with_capacity(doc_changes.len()); - - // fill out the hashes as we go - - for i in 0..doc_changes.len() { - let deps = &mut uncompressed_changes.get_mut(i)?.deps; - for idx in &doc_changes.get(i)?.deps { - deps.push(changes.get(*idx)?.hash) - } - changes.push(uncompressed_changes.get(i)?.into()); - } - - Some(changes) -} - -#[instrument(level = "debug", skip(changes, actors))] -fn group_doc_ops(changes: &[amp::Change], actors: &[amp::ActorId]) -> Vec { - let mut by_obj_id = HashMap::>>::new(); - let mut by_ref = HashMap::>>::new(); - let mut is_seq = HashSet::::new(); - let mut ops = Vec::new(); - - for change in changes { - for (i, op) in - ExpandedOpIterator::new(&change.operations, change.start_op, change.actor_id.clone()) - .enumerate() - { - //for (i, op) in change.operations.iter().enumerate() { - let opid = amp::OpId(change.start_op + i as u64, change.actor_id.clone()); - let objid = op.obj.clone(); - if let InternalOpType::Make(obj_type) = op.action { - if obj_type.is_sequence() { - is_seq.insert(opid.clone().into()); - } - } - - let key = if op.insert { - by_ref - .entry(objid.clone().into_owned()) - .or_default() - .entry(op.key.clone().into_owned()) - .or_default() - .push(opid.clone()); - Cow::Owned(opid.clone().into()) - } else { - op.key.clone() - }; - - by_obj_id - .entry(objid.clone().into_owned()) - .or_default() - .entry(key.clone().into_owned()) - .or_default() - .insert( - opid.clone(), - DocOp { - actor: actors.iter().position(|a| a == &opid.1).unwrap(), - ctr: opid.0, - action: op.action.clone(), - obj: op.obj.clone().into_owned(), - key: op.key.into_owned(), - succ: Vec::new(), - pred: Vec::new(), - insert: op.insert, - }, - ); - - for pred in op.pred.iter() { - by_obj_id - .entry(objid.clone().into_owned()) - .or_default() - .entry(key.clone().into_owned()) - .or_default() - .get_mut(pred) - .unwrap() - .succ - .push((opid.0, actors.iter().position(|a| a == &opid.1).unwrap())); - } - } - } - - for objid in by_obj_id.keys().sorted() { - let mut keys = Vec::new(); - if is_seq.contains(objid) { - let mut stack = vec![amp::ElementId::Head]; - while let Some(key) = stack.pop() { - if key != amp::ElementId::Head { - keys.push(amp::Key::Seq(key.clone())) - } - for opid in by_ref - .entry(objid.clone()) - .or_default() - .entry(key.into()) - .or_default() - .iter() - .sorted() - { - stack.push(opid.into()) - } - } - } else { - keys = by_obj_id - .get(objid) - .map(|d| d.keys().sorted().cloned().collect()) - .unwrap_or_default() - } - - for key in keys { - if let Some(key_ops) = by_obj_id.get(objid).and_then(|d| d.get(&key)) { - for opid in key_ops.keys().sorted() { - let op = key_ops.get(opid).unwrap(); - if op.action != InternalOpType::Del { - ops.push(op.clone()); - } - } - } - } - } - - ops -} - -fn get_heads(changes: &[amp::Change]) -> HashSet { - changes.iter().fold(HashSet::new(), |mut acc, c| { - if let Some(hash) = c.hash { - acc.insert(hash); - } - for dep in &c.deps { - acc.remove(dep); - } - acc - }) -} - -#[instrument(level = "debug", skip(changes))] -pub(crate) fn encode_document(changes: &[amp::Change]) -> Result, encoding::Error> { - let mut bytes: Vec = Vec::new(); - let mut hasher = Sha256::new(); - - let heads = get_heads(changes); - - // this assumes that all actor_ids referenced are seen in changes.actor_id which is true - // so long as we have a full history - let mut actors: Vec<_> = changes - .iter() - .map(|c| &c.actor_id) - .unique() - .sorted() - .cloned() - .collect(); - - let (change_bytes, change_info) = ChangeEncoder::encode_changes(changes, &actors); - - let doc_ops = group_doc_ops(changes, &actors); - - let (ops_bytes, ops_info) = DocOpEncoder::encode_doc_ops(&doc_ops, &mut actors); - - bytes.extend(&MAGIC_BYTES); - bytes.extend(vec![0, 0, 0, 0]); // we dont know the hash yet so fill in a fake - bytes.push(BLOCK_TYPE_DOC); - - let mut chunk = Vec::new(); - - actors.len().encode(&mut chunk)?; - - for a in &actors { - a.to_bytes().encode(&mut chunk)?; - } - - heads.len().encode(&mut chunk)?; - for head in heads.iter().sorted() { - chunk.write_all(&head.0).unwrap(); - } - - chunk.extend(change_info); - chunk.extend(ops_info); - - chunk.extend(change_bytes); - chunk.extend(ops_bytes); - - leb128::write::unsigned(&mut bytes, chunk.len() as u64).unwrap(); - - bytes.extend(&chunk); - - hasher.input(&bytes[CHUNK_START..bytes.len()]); - let hash_result = hasher.result(); - //let hash: amp::ChangeHash = hash_result[..].try_into().unwrap(); - - bytes.splice(HASH_RANGE, hash_result[0..4].iter().copied()); - - Ok(bytes) -} - -pub(crate) const MAGIC_BYTES: [u8; 4] = [0x85, 0x6f, 0x4a, 0x83]; -pub(crate) const PREAMBLE_BYTES: usize = 8; -pub(crate) const HEADER_BYTES: usize = PREAMBLE_BYTES + 1; - -#[cfg(test)] -mod tests { - use std::{num::NonZeroU32, str::FromStr}; - - use amp::ActorId; - - use super::*; - - #[test] - fn test_empty_change() { - let change1 = amp::Change { - start_op: 1, - seq: 2, - time: 1234, - message: None, - hash: None, - actor_id: amp::ActorId::from_str("deadbeefdeadbeef").unwrap(), - deps: vec![], - operations: vec![], - extra_bytes: vec![1, 1, 1], - }; - let bin1: Change = change1.clone().try_into().unwrap(); - let change2 = bin1.decode(); - let bin2 = Change::try_from(change2.clone()).unwrap(); - assert_eq!(bin1, bin2); - assert_eq!(change1, change2); - } - - #[test] - fn test_complex_change() { - let actor1 = amp::ActorId::from_str("deadbeefdeadbeef").unwrap(); - let actor2 = amp::ActorId::from_str("feeddefaff").unwrap(); - let actor3 = amp::ActorId::from_str("00101010fafafafa").unwrap(); - let opid1 = amp::OpId::new(102, &actor1); - let opid2 = amp::OpId::new(391, &actor1); - let opid3 = amp::OpId::new(299, &actor2); - let opid4 = amp::OpId::new(762, &actor3); - let opid5 = amp::OpId::new(100_203, &actor2); - let obj1 = amp::ObjectId::Id(opid1.clone()); - let obj2 = amp::ObjectId::Root; - let obj3 = amp::ObjectId::Id(opid4.clone()); - let key1 = amp::Key::Map("field1".into()); - let key2 = amp::Key::Map("field2".into()); - let key3 = amp::Key::Map("field3".into()); - let head = amp::Key::head(); - let keyseq1 = amp::Key::from(&opid1); - let keyseq2 = amp::Key::from(&opid2); - let insert = false; - let change1 = amp::Change { - start_op: 123, - seq: 29291, - time: 12_341_231, - message: Some("This is my message".into()), - hash: None, - actor_id: actor1, - deps: vec![], - operations: vec![ - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::F64(10.0)), - key: key1, - obj: obj1.clone(), - insert, - pred: vec![opid1.clone(), opid2.clone()], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Counter(-11)), - key: key2.clone(), - obj: obj1.clone(), - insert, - pred: vec![opid1.clone(), opid2.clone()], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Timestamp(20)), - key: key3, - obj: obj1, - insert, - pred: vec![opid1.clone(), opid2], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("some value".into())), - key: key2.clone(), - obj: obj2.clone(), - insert, - pred: vec![opid3.clone(), opid4.clone()], - }, - amp::Op { - action: amp::OpType::Make(amp::ObjType::Map), - key: key2.clone(), - obj: obj2.clone(), - insert, - pred: vec![opid3.clone(), opid4.clone()], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("val1".into())), - key: head.clone(), - obj: obj3.clone(), - insert: true, - pred: vec![opid3, opid4.clone()], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("val2".into())), - key: head, - obj: obj3.clone(), - insert: true, - pred: vec![opid4.clone(), opid5.clone()], - }, - amp::Op { - action: amp::OpType::Inc(10), - key: key2, - obj: obj2, - insert, - pred: vec![opid1.clone(), opid5.clone()], - }, - amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: obj3.clone(), - key: keyseq1, - insert: true, - pred: vec![opid4.clone(), opid5.clone()], - }, - amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: obj3.clone(), - key: keyseq2, - insert: true, - pred: vec![opid4, opid5], - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Cursor(opid1)), - obj: obj3, - key: "somekey".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: vec![1, 2, 3], - }; - let bin1 = Change::from(change1.clone()); - let change2 = bin1.decode(); - let bin2 = Change::from(change2.clone()); - assert_eq!(change1, change2); - assert_eq!(bin1, bin2); - } - - #[test_env_log::test] - fn test_multiops() { - let actor1 = amp::ActorId::from_str("deadbeefdeadbeef").unwrap(); - let change1 = amp::Change { - start_op: 123, - seq: 29291, - time: 12_341_231, - message: Some("A multiop change".into()), - hash: None, - actor_id: actor1.clone(), - deps: vec![], - operations: vec![amp::Op { - action: amp::OpType::MultiSet( - vec![amp::ScalarValue::Uint(1), amp::ScalarValue::Uint(2)] - .try_into() - .unwrap(), - ), - key: amp::ElementId::Head.into(), - obj: actor1.op_id_at(10).into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let bin1 = Change::try_from(change1).unwrap(); - let change2 = bin1.decode(); - let bin2 = Change::try_from(change2).unwrap(); - assert_eq!(bin1, bin2); - } - - #[test_env_log::test] - fn test_encode_decode_document() { - let actor = amp::ActorId::random(); - let mut backend = crate::Backend::new(); - let change1 = amp::Change { - start_op: 1, - seq: 1, - time: 0, - message: None, - hash: None, - actor_id: actor.clone(), - deps: Vec::new(), - operations: vec![ - amp::Op { - action: amp::OpType::Set("somevalue".into()), - obj: amp::ObjectId::Root, - key: "somekey".into(), - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: amp::ObjectId::Root, - key: "somelist".into(), - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("elem".into())), - obj: actor.op_id_at(2).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Cursor(actor.op_id_at(3))), - obj: amp::ObjectId::Root, - key: "cursor".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: vec![1, 2, 3], - }; - let binchange1: Change = Change::try_from(change1.clone()).unwrap(); - backend.apply_changes(vec![binchange1.clone()]).unwrap(); - - let change2 = amp::Change { - start_op: 5, - seq: 2, - time: 0, - message: None, - hash: None, - actor_id: change1.actor_id, - deps: vec![binchange1.hash], - operations: vec![ - amp::Op { - action: amp::OpType::Set("someothervalue".into()), - obj: amp::ObjectId::Root, - key: "someotherkey".into(), - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::MultiSet( - vec![ - amp::ScalarValue::Uint(1), - amp::ScalarValue::Uint(2), - amp::ScalarValue::Uint(3), - ] - .try_into() - .unwrap(), - ), - obj: actor.op_id_at(2).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: vec![], - }; - let binchange2: Change = Change::try_from(change2).unwrap(); - backend.apply_changes(vec![binchange2]).unwrap(); - - let changes = backend.get_changes(&[]); - let encoded = backend.save().unwrap(); - let loaded_changes = Change::load_document(&encoded).unwrap(); - let decoded_loaded: Vec = loaded_changes - .clone() - .into_iter() - .map(|c| c.decode()) - .collect(); - let decoded_preload: Vec = - changes.clone().into_iter().map(Change::decode).collect(); - assert_eq!(decoded_loaded, decoded_preload); - assert_eq!( - loaded_changes, - changes.into_iter().cloned().collect::>() - ); - // Check that expanded ops are accounted for in max_op - assert_eq!(loaded_changes[1].max_op(), 8); - } - - #[test_env_log::test] - fn test_encode_decode_document_large_enough_for_compression() { - let actor = amp::ActorId::random(); - let mut backend = crate::Backend::new(); - let mut change1 = amp::Change { - start_op: 1, - seq: 1, - time: 0, - message: None, - hash: None, - actor_id: actor.clone(), - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: amp::ObjectId::Root, - key: "somelist".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: vec![1, 2, 3], - }; - let mut last_elem_id: amp::Key = amp::ElementId::Head.into(); - for i in 0..256 { - change1.operations.push(amp::Op { - action: amp::OpType::Set(format!("value {}", i).as_str().into()), - obj: actor.op_id_at(1).into(), - key: last_elem_id, - insert: true, - pred: Vec::new(), - }); - last_elem_id = actor.op_id_at(i + 2).into(); - } - let binchange1: Change = Change::try_from(change1).unwrap(); - backend.apply_changes(vec![binchange1]).unwrap(); - - let changes = backend.get_changes(&[]); - let encoded = backend.save().unwrap(); - let loaded_changes = Change::load_document(&encoded).unwrap(); - let decoded_loaded: Vec = loaded_changes - .clone() - .into_iter() - .map(|c| c.decode()) - .collect(); - let decoded_preload: Vec = - changes.clone().into_iter().map(Change::decode).collect(); - assert_eq!(decoded_loaded[0].operations.len(), 257); - assert_eq!(decoded_loaded, decoded_preload); - assert_eq!( - loaded_changes, - changes.into_iter().cloned().collect::>() - ); - } - - #[test] - fn test_invalid_document_checksum() { - let change = amp::Change { - operations: Vec::new(), - actor_id: ActorId::random(), - hash: None, - seq: 1, - start_op: 1, - time: 0, - message: None, - deps: Vec::new(), - extra_bytes: Vec::new(), - }; - let mut doc = encode_document(&[change]).unwrap(); - let hash: [u8; 4] = doc[4..8].try_into().unwrap(); - doc[4] = 0; - doc[5] = 0; - doc[6] = 0; - doc[7] = 1; - let decode_result = decode_document(&doc); - if let Err(decoding::Error::InvalidChecksum { - found: [0, 0, 0, 1], - calculated, - }) = decode_result - { - if calculated != hash { - panic!( - "expected invalid checksum error with hash {:?} but found one with hash {:?}", - calculated, hash - ) - } - } else { - panic!( - "expected invalid checksum error but found {:?}", - decode_result - ) - } - } -} diff --git a/automerge-backend/src/columnar.rs b/automerge-backend/src/columnar.rs deleted file mode 100644 index 4bc78f0f..00000000 --- a/automerge-backend/src/columnar.rs +++ /dev/null @@ -1,1365 +0,0 @@ -use core::fmt::Debug; -use std::{ - borrow::Cow, - cmp::Ordering, - collections::HashMap, - io, - io::{Read, Write}, - ops::Range, - str, -}; - -use automerge_protocol as amp; -use flate2::bufread::DeflateDecoder; -use tracing::instrument; - -use crate::{ - decoding::{BooleanDecoder, Decodable, Decoder, DeltaDecoder, RleDecoder}, - encoding::{BooleanEncoder, ColData, DeltaEncoder, Encodable, RleEncoder}, - expanded_op::ExpandedOp, - internal::InternalOpType, -}; - -impl Encodable for Action { - fn encode(&self, buf: &mut R) -> io::Result { - (*self as u32).encode(buf) - } -} - -impl Encodable for [amp::ActorId] { - fn encode(&self, buf: &mut R) -> io::Result { - let mut len = self.len().encode(buf)?; - for i in self { - len += i.to_bytes().encode(buf)?; - } - Ok(len) - } -} - -fn map_actor(actor: &::ActorId, actors: &mut Vec) -> usize { - if let Some(pos) = actors.iter().position(|a| a == actor) { - pos - } else { - actors.push(actor.clone()); - actors.len() - 1 - } -} - -impl Encodable for amp::ActorId { - fn encode_with_actors( - &self, - buf: &mut R, - actors: &mut Vec, - ) -> io::Result { - map_actor(self, actors).encode(buf) - } - - fn encode(&self, _buf: &mut R) -> io::Result { - // we instead encode actors as their position on a sequence - Ok(0) - } -} - -impl Encodable for Vec { - fn encode(&self, buf: &mut R) -> io::Result { - self.as_slice().encode(buf) - } -} - -impl Encodable for &[u8] { - fn encode(&self, buf: &mut R) -> io::Result { - let head = self.len().encode(buf)?; - buf.write_all(self)?; - Ok(head + self.len()) - } -} - -pub struct OperationIterator<'a> { - pub(crate) action: RleDecoder<'a, Action>, - pub(crate) objs: ObjIterator<'a>, - pub(crate) keys: KeyIterator<'a>, - pub(crate) insert: BooleanDecoder<'a>, - pub(crate) value: ValueIterator<'a>, - pub(crate) pred: PredIterator<'a>, -} - -impl<'a> OperationIterator<'a> { - pub(crate) fn new( - bytes: &'a [u8], - actors: &'a [amp::ActorId], - ops: &'a HashMap>, - ) -> OperationIterator<'a> { - OperationIterator { - objs: ObjIterator { - actors, - actor: col_iter(bytes, ops, COL_OBJ_ACTOR), - ctr: col_iter(bytes, ops, COL_OBJ_CTR), - }, - keys: KeyIterator { - actors, - actor: col_iter(bytes, ops, COL_KEY_ACTOR), - ctr: col_iter(bytes, ops, COL_KEY_CTR), - str: col_iter(bytes, ops, COL_KEY_STR), - }, - value: ValueIterator { - val_len: col_iter(bytes, ops, COL_VAL_LEN), - val_raw: col_iter(bytes, ops, COL_VAL_RAW), - actors, - actor: col_iter(bytes, ops, COL_REF_ACTOR), - ctr: col_iter(bytes, ops, COL_REF_CTR), - }, - pred: PredIterator { - actors, - pred_num: col_iter(bytes, ops, COL_PRED_NUM), - pred_actor: col_iter(bytes, ops, COL_PRED_ACTOR), - pred_ctr: col_iter(bytes, ops, COL_PRED_CTR), - }, - insert: col_iter(bytes, ops, COL_INSERT), - action: col_iter(bytes, ops, COL_ACTION), - } - } -} - -impl<'a> Iterator for OperationIterator<'a> { - type Item = ExpandedOp<'a>; - - fn next(&mut self) -> Option { - let action = self.action.next()??; - let insert = self.insert.next()?; - let obj = self.objs.next()?; - let key = self.keys.next()?; - let pred = self.pred.next()?; - #[cfg(debug_assertions)] - { - let mut pred_sorted = pred.clone(); - pred_sorted.sort(); - debug_assert_eq!(pred, pred_sorted, "pred should be sorted"); - } - let value = self.value.next()?; - let action = match action { - Action::Set => InternalOpType::Set(value), - Action::MakeList => InternalOpType::Make(amp::ObjType::List), - Action::MakeText => InternalOpType::Make(amp::ObjType::Text), - Action::MakeMap => InternalOpType::Make(amp::ObjType::Map), - Action::MakeTable => InternalOpType::Make(amp::ObjType::Table), - Action::Del => InternalOpType::Del, - Action::Inc => InternalOpType::Inc(value.to_i64()?), - }; - Some(ExpandedOp { - action, - obj: Cow::Owned(obj), - key: Cow::Owned(key), - pred: Cow::Owned(pred), - insert, - }) - } -} - -pub(crate) struct DocOpIterator<'a> { - pub(crate) actor: RleDecoder<'a, usize>, - pub(crate) ctr: DeltaDecoder<'a>, - pub(crate) action: RleDecoder<'a, Action>, - pub(crate) objs: ObjIterator<'a>, - pub(crate) keys: KeyIterator<'a>, - pub(crate) insert: BooleanDecoder<'a>, - pub(crate) value: ValueIterator<'a>, - pub(crate) succ: SuccIterator<'a>, -} - -impl<'a> Iterator for DocOpIterator<'a> { - type Item = DocOp; - fn next(&mut self) -> Option { - let action = self.action.next()??; - let actor = self.actor.next()??; - let ctr = self.ctr.next()??; - let insert = self.insert.next()?; - let obj = self.objs.next()?; - let key = self.keys.next()?; - let succ = self.succ.next()?; - let value = self.value.next()?; - let action = match action { - Action::Set => InternalOpType::Set(value), - Action::MakeList => InternalOpType::Make(amp::ObjType::List), - Action::MakeText => InternalOpType::Make(amp::ObjType::Text), - Action::MakeMap => InternalOpType::Make(amp::ObjType::Map), - Action::MakeTable => InternalOpType::Make(amp::ObjType::Table), - Action::Del => InternalOpType::Del, - Action::Inc => InternalOpType::Inc(value.to_i64()?), - }; - Some(DocOp { - actor, - ctr, - action, - obj, - key, - succ, - pred: Vec::new(), - insert, - }) - } -} - -impl<'a> DocOpIterator<'a> { - pub(crate) fn new( - bytes: &'a [u8], - actors: &'a [amp::ActorId], - ops: &'a HashMap>, - ) -> DocOpIterator<'a> { - DocOpIterator { - actor: col_iter(bytes, ops, COL_ID_ACTOR), - ctr: col_iter(bytes, ops, COL_ID_CTR), - objs: ObjIterator { - actors, - actor: col_iter(bytes, ops, COL_OBJ_ACTOR), - ctr: col_iter(bytes, ops, COL_OBJ_CTR), - }, - keys: KeyIterator { - actors, - actor: col_iter(bytes, ops, COL_KEY_ACTOR), - ctr: col_iter(bytes, ops, COL_KEY_CTR), - str: col_iter(bytes, ops, COL_KEY_STR), - }, - value: ValueIterator { - val_len: col_iter(bytes, ops, COL_VAL_LEN), - val_raw: col_iter(bytes, ops, COL_VAL_RAW), - actors, - actor: col_iter(bytes, ops, COL_REF_ACTOR), - ctr: col_iter(bytes, ops, COL_REF_CTR), - }, - succ: SuccIterator { - succ_num: col_iter(bytes, ops, COL_SUCC_NUM), - succ_actor: col_iter(bytes, ops, COL_SUCC_ACTOR), - succ_ctr: col_iter(bytes, ops, COL_SUCC_CTR), - }, - insert: col_iter(bytes, ops, COL_INSERT), - action: col_iter(bytes, ops, COL_ACTION), - } - } -} - -pub(crate) struct ChangeIterator<'a> { - pub(crate) actor: RleDecoder<'a, usize>, - pub(crate) seq: DeltaDecoder<'a>, - pub(crate) max_op: DeltaDecoder<'a>, - pub(crate) time: DeltaDecoder<'a>, - pub(crate) message: RleDecoder<'a, String>, - pub(crate) deps: DepsIterator<'a>, - pub(crate) extra: ExtraIterator<'a>, -} - -impl<'a> ChangeIterator<'a> { - pub(crate) fn new(bytes: &'a [u8], ops: &'a HashMap>) -> ChangeIterator<'a> { - ChangeIterator { - actor: col_iter(bytes, ops, DOC_ACTOR), - seq: col_iter(bytes, ops, DOC_SEQ), - max_op: col_iter(bytes, ops, DOC_MAX_OP), - time: col_iter(bytes, ops, DOC_TIME), - message: col_iter(bytes, ops, DOC_MESSAGE), - deps: DepsIterator { - num: col_iter(bytes, ops, DOC_DEPS_NUM), - dep: col_iter(bytes, ops, DOC_DEPS_INDEX), - }, - extra: ExtraIterator { - len: col_iter(bytes, ops, DOC_EXTRA_LEN), - extra: col_iter(bytes, ops, DOC_EXTRA_RAW), - }, - } - } -} - -impl<'a> Iterator for ChangeIterator<'a> { - type Item = DocChange; - fn next(&mut self) -> Option { - let actor = self.actor.next()??; - let seq = self.seq.next()??; - let max_op = self.max_op.next()??; - let time = self.time.next()?? as i64; - let message = self.message.next()?; - let deps = self.deps.next()?; - let extra_bytes = self.extra.next().unwrap_or_else(Vec::new); - Some(DocChange { - actor, - seq, - max_op, - time, - message, - deps, - extra_bytes, - ops: Vec::new(), - }) - } -} - -pub struct ObjIterator<'a> { - //actors: &'a Vec<&'a [u8]>, - pub(crate) actors: &'a [amp::ActorId], - pub(crate) actor: RleDecoder<'a, usize>, - pub(crate) ctr: RleDecoder<'a, u64>, -} - -pub struct DepsIterator<'a> { - pub(crate) num: RleDecoder<'a, usize>, - pub(crate) dep: DeltaDecoder<'a>, -} - -pub struct ExtraIterator<'a> { - pub(crate) len: RleDecoder<'a, usize>, - pub(crate) extra: Decoder<'a>, -} - -pub struct PredIterator<'a> { - pub(crate) actors: &'a [amp::ActorId], - pub(crate) pred_num: RleDecoder<'a, usize>, - pub(crate) pred_actor: RleDecoder<'a, usize>, - pub(crate) pred_ctr: DeltaDecoder<'a>, -} - -pub struct SuccIterator<'a> { - pub(crate) succ_num: RleDecoder<'a, usize>, - pub(crate) succ_actor: RleDecoder<'a, usize>, - pub(crate) succ_ctr: DeltaDecoder<'a>, -} - -pub struct KeyIterator<'a> { - pub(crate) actors: &'a [amp::ActorId], - pub(crate) actor: RleDecoder<'a, usize>, - pub(crate) ctr: DeltaDecoder<'a>, - pub(crate) str: RleDecoder<'a, String>, -} - -pub struct ValueIterator<'a> { - pub(crate) actors: &'a [amp::ActorId], - pub(crate) val_len: RleDecoder<'a, usize>, - pub(crate) val_raw: Decoder<'a>, - pub(crate) actor: RleDecoder<'a, usize>, - pub(crate) ctr: RleDecoder<'a, u64>, -} - -impl<'a> Iterator for DepsIterator<'a> { - type Item = Vec; - fn next(&mut self) -> Option> { - let num = self.num.next()??; - // I bet there's something simple like `self.dep.take(num).collect()` - let mut p = Vec::with_capacity(num); - for _ in 0..num { - let dep = self.dep.next()??; - p.push(dep as usize); - } - Some(p) - } -} - -impl<'a> Iterator for ExtraIterator<'a> { - type Item = Vec; - fn next(&mut self) -> Option> { - let v = self.len.next()??; - // if v % 16 == VALUE_TYPE_BYTES => { // this should be bytes - let len = v >> 4; - self.extra.read_bytes(len).ok().map(|s| s.to_vec()) - } -} - -impl<'a> Iterator for PredIterator<'a> { - type Item = Vec; - fn next(&mut self) -> Option> { - let num = self.pred_num.next()??; - let mut p = Vec::with_capacity(num); - for _ in 0..num { - let actor = self.pred_actor.next()??; - let ctr = self.pred_ctr.next()??; - let actor_id = self.actors.get(actor)?.clone(); - let op_id = amp::OpId::new(ctr, &actor_id); - p.push(op_id) - } - Some(p) - } -} - -impl<'a> Iterator for SuccIterator<'a> { - type Item = Vec<(u64, usize)>; - fn next(&mut self) -> Option> { - let num = self.succ_num.next()??; - let mut p = Vec::with_capacity(num); - for _ in 0..num { - let actor = self.succ_actor.next()??; - let ctr = self.succ_ctr.next()??; - p.push((ctr, actor)) - } - Some(p) - } -} - -impl<'a> Iterator for ValueIterator<'a> { - type Item = amp::ScalarValue; - fn next(&mut self) -> Option { - let val_type = self.val_len.next()??; - let actor = self.actor.next()?; - let ctr = self.ctr.next()?; - match val_type { - VALUE_TYPE_NULL => Some(amp::ScalarValue::Null), - VALUE_TYPE_FALSE => Some(amp::ScalarValue::Boolean(false)), - VALUE_TYPE_TRUE => Some(amp::ScalarValue::Boolean(true)), - v if v % 16 == VALUE_TYPE_COUNTER => { - let len = v >> 4; - let val = self.val_raw.read().ok()?; - if len != self.val_raw.last_read { - return None; - } - Some(amp::ScalarValue::Counter(val)) - } - v if v % 16 == VALUE_TYPE_TIMESTAMP => { - let len = v >> 4; - let val = self.val_raw.read().ok()?; - if len != self.val_raw.last_read { - return None; - } - Some(amp::ScalarValue::Timestamp(val)) - } - v if v % 16 == VALUE_TYPE_LEB128_UINT => { - let len = v >> 4; - let val = self.val_raw.read().ok()?; - if len != self.val_raw.last_read { - return None; - } - Some(amp::ScalarValue::Uint(val)) - } - v if v % 16 == VALUE_TYPE_LEB128_INT => { - let len = v >> 4; - let val = self.val_raw.read().ok()?; - if len != self.val_raw.last_read { - return None; - } - Some(amp::ScalarValue::Int(val)) - } - v if v % 16 == VALUE_TYPE_UTF8 => { - let len = v >> 4; - let data = self.val_raw.read_bytes(len).ok()?; - let s = str::from_utf8(data).ok()?; - Some(amp::ScalarValue::Str(s.to_string())) - } - v if v % 16 == VALUE_TYPE_BYTES => { - let len = v >> 4; - let data = self.val_raw.read_bytes(len).ok()?; - Some(amp::ScalarValue::Bytes(data.to_vec())) - } - v if v % 16 >= VALUE_TYPE_MIN_UNKNOWN && v % 16 <= VALUE_TYPE_MAX_UNKNOWN => { - let len = v >> 4; - let _data = self.val_raw.read_bytes(len).ok()?; - unimplemented!() - //Some((amp::Value::Bytes(data)) - } - v if v % 16 == VALUE_TYPE_IEEE754 => { - let len = v >> 4; - if len == 8 { - // confirm only 8 bytes read - let num = self.val_raw.read().ok()?; - Some(amp::ScalarValue::F64(num)) - } else { - // bad size of float - None - } - } - v if v % 16 == VALUE_TYPE_CURSOR => { - if let (Some(actor), Some(ctr)) = (actor, ctr) { - let actor_id = self.actors.get(actor)?; - Some(amp::ScalarValue::Cursor(amp::OpId(ctr, actor_id.clone()))) - } else { - None - } - } - _ => { - // unknown command - None - } - } - } -} - -impl<'a> Iterator for KeyIterator<'a> { - type Item = amp::Key; - fn next(&mut self) -> Option { - match (self.actor.next()?, self.ctr.next()?, self.str.next()?) { - (None, None, Some(string)) => Some(amp::Key::Map(string)), - (None, Some(0), None) => Some(amp::Key::head()), - (Some(actor), Some(ctr), None) => { - let actor_id = self.actors.get(actor)?; - Some(amp::OpId::new(ctr, actor_id).into()) - } - _ => None, - } - } -} - -impl<'a> Iterator for ObjIterator<'a> { - type Item = amp::ObjectId; - fn next(&mut self) -> Option { - if let (Some(actor), Some(ctr)) = (self.actor.next()?, self.ctr.next()?) { - let actor_id = self.actors.get(actor)?; - Some(amp::ObjectId::Id(amp::OpId::new(ctr, actor_id))) - } else { - Some(amp::ObjectId::Root) - } - } -} - -#[derive(PartialEq, Debug, Clone)] -pub(crate) struct DocChange { - pub actor: usize, - pub seq: u64, - pub max_op: u64, - pub time: i64, - pub message: Option, - pub deps: Vec, - pub extra_bytes: Vec, - pub ops: Vec, -} - -#[derive(Debug, Clone)] -pub(crate) struct DocOp { - pub actor: usize, - pub ctr: u64, - pub action: InternalOpType, - pub obj: amp::ObjectId, - pub key: amp::Key, - pub succ: Vec<(u64, usize)>, - pub pred: Vec<(u64, usize)>, - pub insert: bool, -} - -impl Ord for DocOp { - fn cmp(&self, other: &Self) -> Ordering { - self.ctr.cmp(&other.ctr) - } -} - -impl PartialOrd for DocOp { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl PartialEq for DocOp { - fn eq(&self, other: &Self) -> bool { - self.ctr == other.ctr - } -} - -impl Eq for DocOp {} - -struct ValEncoder { - len: RleEncoder, - ref_actor: RleEncoder, - ref_counter: RleEncoder, - raw: Vec, -} - -impl ValEncoder { - fn new() -> ValEncoder { - ValEncoder { - len: RleEncoder::new(), - raw: Vec::new(), - ref_actor: RleEncoder::new(), - ref_counter: RleEncoder::new(), - } - } - - fn append_value(&mut self, val: &::ScalarValue, actors: &mut Vec) { - // It may seem weird to have two consecutive matches on the same value. The reason is so - // that we don't have to repeat the `append_null` calls on ref_actor and ref_counter in - // every arm of the next match - if !matches!(val, amp::ScalarValue::Cursor(_)) { - self.ref_actor.append_null(); - self.ref_counter.append_null(); - } - match val { - amp::ScalarValue::Null => self.len.append_value(VALUE_TYPE_NULL), - amp::ScalarValue::Boolean(true) => self.len.append_value(VALUE_TYPE_TRUE), - amp::ScalarValue::Boolean(false) => self.len.append_value(VALUE_TYPE_FALSE), - amp::ScalarValue::Bytes(bytes) => { - let len = bytes.len(); - self.raw.extend(bytes); - self.len.append_value(len << 4 | VALUE_TYPE_BYTES) - } - amp::ScalarValue::Str(s) => { - let bytes = s.as_bytes(); - let len = bytes.len(); - self.raw.extend(bytes); - self.len.append_value(len << 4 | VALUE_TYPE_UTF8) - } - amp::ScalarValue::Counter(count) => { - let len = count.encode(&mut self.raw).unwrap(); - self.len.append_value(len << 4 | VALUE_TYPE_COUNTER) - } - amp::ScalarValue::Timestamp(time) => { - let len = time.encode(&mut self.raw).unwrap(); - self.len.append_value(len << 4 | VALUE_TYPE_TIMESTAMP) - } - amp::ScalarValue::Int(n) => { - let len = n.encode(&mut self.raw).unwrap(); - self.len.append_value(len << 4 | VALUE_TYPE_LEB128_INT) - } - amp::ScalarValue::Uint(n) => { - let len = n.encode(&mut self.raw).unwrap(); - self.len.append_value(len << 4 | VALUE_TYPE_LEB128_UINT) - } - amp::ScalarValue::F64(n) => { - let len = (*n).encode(&mut self.raw).unwrap(); - self.len.append_value(len << 4 | VALUE_TYPE_IEEE754) - } - amp::ScalarValue::Cursor(opid) => { - // the cursor opid are encoded in DocOpEncoder::encode and ColumnEncoder::encode - self.len.append_value(VALUE_TYPE_CURSOR); - let actor_index = map_actor(&opid.1, actors); - self.ref_actor.append_value(actor_index); - self.ref_counter.append_value(opid.0); - } - } - } - - fn append_null(&mut self) { - self.ref_counter.append_null(); - self.ref_actor.append_null(); - self.len.append_value(VALUE_TYPE_NULL) - } - - fn finish(self) -> Vec { - vec![ - self.ref_counter.finish(COL_REF_CTR), - self.ref_actor.finish(COL_REF_ACTOR), - self.len.finish(COL_VAL_LEN), - ColData::new(COL_VAL_RAW, self.raw), - ] - } -} - -struct KeyEncoder { - actor: RleEncoder, - ctr: DeltaEncoder, - str: RleEncoder, -} - -impl KeyEncoder { - fn new() -> KeyEncoder { - KeyEncoder { - actor: RleEncoder::new(), - ctr: DeltaEncoder::new(), - str: RleEncoder::new(), - } - } - - fn append(&mut self, key: &::Key, actors: &mut Vec) { - match &key { - amp::Key::Map(s) => { - self.actor.append_null(); - self.ctr.append_null(); - self.str.append_value(s.clone()); - } - amp::Key::Seq(amp::ElementId::Head) => { - self.actor.append_null(); - self.ctr.append_value(0); - self.str.append_null(); - } - amp::Key::Seq(amp::ElementId::Id(amp::OpId(ctr, actor))) => { - self.actor.append_value(map_actor(actor, actors)); - self.ctr.append_value(*ctr); - self.str.append_null(); - } - } - } - - fn finish(self) -> Vec { - vec![ - self.actor.finish(COL_KEY_ACTOR), - self.ctr.finish(COL_KEY_CTR), - self.str.finish(COL_KEY_STR), - ] - } -} - -struct SuccEncoder { - num: RleEncoder, - actor: RleEncoder, - ctr: DeltaEncoder, -} - -impl SuccEncoder { - fn new() -> SuccEncoder { - SuccEncoder { - num: RleEncoder::new(), - actor: RleEncoder::new(), - ctr: DeltaEncoder::new(), - } - } - - fn append(&mut self, succ: &[(u64, usize)]) { - self.num.append_value(succ.len()); - for s in succ.iter() { - self.ctr.append_value(s.0); - self.actor.append_value(s.1); - } - } - - fn finish(self) -> Vec { - vec![ - self.num.finish(COL_SUCC_NUM), - self.actor.finish(COL_SUCC_ACTOR), - self.ctr.finish(COL_SUCC_CTR), - ] - } -} - -struct PredEncoder { - num: RleEncoder, - actor: RleEncoder, - ctr: DeltaEncoder, -} - -impl PredEncoder { - fn new() -> PredEncoder { - PredEncoder { - num: RleEncoder::new(), - actor: RleEncoder::new(), - ctr: DeltaEncoder::new(), - } - } - - fn append(&mut self, pred: &[amp::OpId], actors: &mut Vec) { - self.num.append_value(pred.len()); - for p in pred.iter() { - self.ctr.append_value(p.0); - self.actor.append_value(map_actor(&p.1, actors)); - } - } - - fn finish(self) -> Vec { - vec![ - self.num.finish(COL_PRED_NUM), - self.actor.finish(COL_PRED_ACTOR), - self.ctr.finish(COL_PRED_CTR), - ] - } -} - -struct ObjEncoder { - actor: RleEncoder, - ctr: RleEncoder, -} - -impl ObjEncoder { - fn new() -> ObjEncoder { - ObjEncoder { - actor: RleEncoder::new(), - ctr: RleEncoder::new(), - } - } - - fn append(&mut self, obj: &::ObjectId, actors: &mut Vec) { - match obj { - amp::ObjectId::Root => { - self.actor.append_null(); - self.ctr.append_null(); - } - amp::ObjectId::Id(amp::OpId(ctr, actor)) => { - self.actor.append_value(map_actor(actor, actors)); - self.ctr.append_value(*ctr); - } - } - } - - fn finish(self) -> Vec { - vec![ - self.actor.finish(COL_OBJ_ACTOR), - self.ctr.finish(COL_OBJ_CTR), - ] - } -} - -pub(crate) struct ChangeEncoder { - actor: RleEncoder, - seq: DeltaEncoder, - max_op: DeltaEncoder, - time: DeltaEncoder, - message: RleEncoder>, - deps_num: RleEncoder, - deps_index: DeltaEncoder, - extra_len: RleEncoder, - extra_raw: Vec, -} - -impl ChangeEncoder { - #[instrument(level = "debug", skip(changes, actors))] - pub fn encode_changes<'a, 'b, I>(changes: I, actors: &'a [amp::ActorId]) -> (Vec, Vec) - where - I: IntoIterator, - { - let mut e = Self::new(); - e.encode(changes, actors); - e.finish() - } - - fn new() -> ChangeEncoder { - ChangeEncoder { - actor: RleEncoder::new(), - seq: DeltaEncoder::new(), - max_op: DeltaEncoder::new(), - time: DeltaEncoder::new(), - message: RleEncoder::new(), - deps_num: RleEncoder::new(), - deps_index: DeltaEncoder::new(), - extra_len: RleEncoder::new(), - extra_raw: Vec::new(), - } - } - - fn encode<'a, 'b, 'c, I>(&'a mut self, changes: I, actors: &'b [amp::ActorId]) - where - I: IntoIterator, - { - let mut index_by_hash: HashMap = HashMap::new(); - for (index, change) in changes.into_iter().enumerate() { - if let Some(hash) = change.hash { - index_by_hash.insert(hash, index); - } - self.actor - .append_value(actors.iter().position(|a| a == &change.actor_id).unwrap()); - self.seq.append_value(change.seq); - self.max_op - .append_value(change.start_op + change.operations.len() as u64 - 1); - self.time.append_value(change.time as u64); - self.message.append_value(change.message.clone()); - self.deps_num.append_value(change.deps.len()); - for dep in &change.deps { - if let Some(dep_index) = index_by_hash.get(dep) { - self.deps_index.append_value(*dep_index as u64) - } else { - // FIXME This relies on the changes being in causal order, which they may not - // be, we could probably do something cleverer like accumulate the values to - // write and the dependency tree in an intermediate value, then write it to the - // encoder in a second pass over the intermediates - panic!("Missing dependency for hash: {:?}", dep); - } - } - self.extra_len - .append_value(change.extra_bytes.len() << 4 | VALUE_TYPE_BYTES); - self.extra_raw.extend(&change.extra_bytes); - } - } - - fn finish(self) -> (Vec, Vec) { - let mut coldata = vec![ - self.actor.finish(DOC_ACTOR), - self.seq.finish(DOC_SEQ), - self.max_op.finish(DOC_MAX_OP), - self.time.finish(DOC_TIME), - self.message.finish(DOC_MESSAGE), - self.deps_num.finish(DOC_DEPS_NUM), - self.deps_index.finish(DOC_DEPS_INDEX), - self.extra_len.finish(DOC_EXTRA_LEN), - ColData::new(DOC_EXTRA_RAW, self.extra_raw), - ]; - coldata.sort_by(|a, b| a.col.cmp(&b.col)); - - let mut data = Vec::new(); - let mut info = Vec::new(); - coldata - .iter() - .filter(|&d| !d.data.is_empty()) - .count() - .encode(&mut info) - .ok(); - for d in &mut coldata { - d.deflate(); - d.encode_col_len(&mut info).ok(); - } - for d in &coldata { - data.write_all(d.data.as_slice()).ok(); - } - (data, info) - } -} - -pub(crate) struct DocOpEncoder { - actor: RleEncoder, - ctr: DeltaEncoder, - obj: ObjEncoder, - key: KeyEncoder, - insert: BooleanEncoder, - action: RleEncoder, - val: ValEncoder, - succ: SuccEncoder, -} - -// FIXME - actors should not be mut here - -impl DocOpEncoder { - #[instrument(level = "debug", skip(ops, actors))] - pub(crate) fn encode_doc_ops<'a, 'b, I>( - ops: I, - actors: &'a mut Vec, - ) -> (Vec, Vec) - where - I: IntoIterator, - { - let mut e = Self::new(); - e.encode(ops, actors); - e.finish() - } - - fn new() -> DocOpEncoder { - DocOpEncoder { - actor: RleEncoder::new(), - ctr: DeltaEncoder::new(), - obj: ObjEncoder::new(), - key: KeyEncoder::new(), - insert: BooleanEncoder::new(), - action: RleEncoder::new(), - val: ValEncoder::new(), - succ: SuccEncoder::new(), - } - } - - fn encode<'a, 'b, 'c, I>(&'a mut self, ops: I, actors: &'b mut Vec) - where - I: IntoIterator, - { - for op in ops { - self.actor.append_value(op.actor); - self.ctr.append_value(op.ctr); - self.obj.append(&op.obj, actors); - self.key.append(&op.key, actors); - self.insert.append(op.insert); - self.succ.append(&op.succ); - let action = match &op.action { - InternalOpType::Set(value) => { - self.val.append_value(value, actors); - Action::Set - } - InternalOpType::Inc(val) => { - self.val.append_value(&::ScalarValue::Int(*val), actors); - Action::Inc - } - InternalOpType::Del => { - // FIXME throw error - self.val.append_null(); - Action::Del - } - InternalOpType::Make(kind) => { - self.val.append_null(); - match kind { - amp::ObjType::Map => Action::MakeMap, - amp::ObjType::Table => Action::MakeTable, - amp::ObjType::List => Action::MakeList, - amp::ObjType::Text => Action::MakeText, - } - } - }; - self.action.append_value(action); - } - } - - fn finish(self) -> (Vec, Vec) { - let mut coldata = vec![ - self.actor.finish(COL_ID_ACTOR), - self.ctr.finish(COL_ID_CTR), - self.insert.finish(COL_INSERT), - self.action.finish(COL_ACTION), - ]; - coldata.extend(self.obj.finish()); - coldata.extend(self.key.finish()); - coldata.extend(self.val.finish()); - coldata.extend(self.succ.finish()); - coldata.sort_by(|a, b| a.col.cmp(&b.col)); - - let mut info = Vec::new(); - let mut data = Vec::new(); - coldata - .iter() - .filter(|&d| !d.data.is_empty()) - .count() - .encode(&mut info) - .ok(); - for d in &mut coldata { - d.deflate(); - d.encode_col_len(&mut info).ok(); - } - for d in &coldata { - data.write_all(d.data.as_slice()).ok(); - } - (data, info) - } -} - -//pub(crate) encode_cols(a) -> (Vec, HashMap>) { } - -struct ColumnOp<'a> { - action: InternalOpType, - obj: Cow<'a, amp::ObjectId>, - key: Cow<'a, amp::Key>, - pred: Vec, - insert: bool, -} - -pub(crate) struct ColumnEncoder { - obj: ObjEncoder, - key: KeyEncoder, - insert: BooleanEncoder, - action: RleEncoder, - val: ValEncoder, - pred: PredEncoder, -} - -impl ColumnEncoder { - pub fn encode_ops<'a, 'b, I>( - ops: I, - actors: &'a mut Vec, - ) -> (Vec, HashMap>) - where - I: IntoIterator>, - { - let mut e = Self::new(); - let colops = ops.into_iter().map(|o| ColumnOp { - obj: o.obj, - key: o.key, - action: o.action, - pred: o.pred.into_owned(), - insert: o.insert, - }); - e.encode(colops, actors); - e.finish() - } - - fn new() -> ColumnEncoder { - ColumnEncoder { - obj: ObjEncoder::new(), - key: KeyEncoder::new(), - insert: BooleanEncoder::new(), - action: RleEncoder::new(), - val: ValEncoder::new(), - pred: PredEncoder::new(), - } - } - - fn encode<'a, 'b, 'c, I>(&'a mut self, ops: I, actors: &'b mut Vec) - where - I: IntoIterator>, - { - for mut op in ops { - self.append(&mut op, actors) - } - } - - fn append<'a>(&mut self, op: &mut ColumnOp<'a>, actors: &mut Vec) { - self.obj.append(&op.obj, actors); - self.key.append(&op.key, actors); - self.insert.append(op.insert); - - op.pred.sort(); - self.pred.append(&op.pred, actors); - let action = match &op.action { - InternalOpType::Set(value) => { - self.val.append_value(value, actors); - Action::Set - } - InternalOpType::Inc(val) => { - self.val.append_value(&::ScalarValue::Int(*val), actors); - Action::Inc - } - InternalOpType::Del => { - self.val.append_null(); - Action::Del - } - InternalOpType::Make(kind) => { - self.val.append_null(); - match kind { - amp::ObjType::Map => Action::MakeMap, - amp::ObjType::Table => Action::MakeTable, - amp::ObjType::List => Action::MakeList, - amp::ObjType::Text => Action::MakeText, - } - } - }; - self.action.append_value(action); - } - - fn finish(self) -> (Vec, HashMap>) { - let mut coldata = vec![ - self.insert.finish(COL_INSERT), - self.action.finish(COL_ACTION), - ]; - coldata.extend(self.obj.finish()); - coldata.extend(self.key.finish()); - coldata.extend(self.val.finish()); - coldata.extend(self.pred.finish()); - coldata.sort_by(|a, b| a.col.cmp(&b.col)); - - let mut data = Vec::new(); - let mut rangemap = HashMap::new(); - coldata - .iter() - .filter(|&d| !d.data.is_empty()) - .count() - .encode(&mut data) - .ok(); - for d in &mut coldata { - d.encode_col_len(&mut data).ok(); - } - for d in &coldata { - let begin = data.len(); - data.write_all(d.data.as_slice()).ok(); - if !d.data.is_empty() { - rangemap.insert(d.col, begin..data.len()); - } - } - (data, rangemap) - } -} - -fn col_iter<'a, T>(bytes: &'a [u8], ops: &'a HashMap>, col_id: u32) -> T -where - T: From>, -{ - let bytes = if let Some(r) = ops.get(&col_id) { - Cow::Borrowed(&bytes[r.clone()]) - } else if let Some(r) = ops.get(&(col_id | COLUMN_TYPE_DEFLATE)) { - let mut decoder = DeflateDecoder::new(&bytes[r.clone()]); - let mut inflated = Vec::new(); - //TODO this could throw if the compression is corrupt, we should propagate the error rather - //than unwrapping - decoder.read_to_end(&mut inflated).unwrap(); - Cow::Owned(inflated) - } else { - Cow::from(&[] as &[u8]) - }; - T::from(bytes) -} - -const VALUE_TYPE_NULL: usize = 0; -const VALUE_TYPE_FALSE: usize = 1; -const VALUE_TYPE_TRUE: usize = 2; -const VALUE_TYPE_LEB128_UINT: usize = 3; -const VALUE_TYPE_LEB128_INT: usize = 4; -const VALUE_TYPE_IEEE754: usize = 5; -const VALUE_TYPE_UTF8: usize = 6; -const VALUE_TYPE_BYTES: usize = 7; -const VALUE_TYPE_COUNTER: usize = 8; -const VALUE_TYPE_TIMESTAMP: usize = 9; -const VALUE_TYPE_CURSOR: usize = 10; -const VALUE_TYPE_MIN_UNKNOWN: usize = 11; -const VALUE_TYPE_MAX_UNKNOWN: usize = 15; - -pub(crate) const COLUMN_TYPE_GROUP_CARD: u32 = 0; -pub(crate) const COLUMN_TYPE_ACTOR_ID: u32 = 1; -pub(crate) const COLUMN_TYPE_INT_RLE: u32 = 2; -pub(crate) const COLUMN_TYPE_INT_DELTA: u32 = 3; -pub(crate) const COLUMN_TYPE_BOOLEAN: u32 = 4; -pub(crate) const COLUMN_TYPE_STRING_RLE: u32 = 5; -pub(crate) const COLUMN_TYPE_VALUE_LEN: u32 = 6; -pub(crate) const COLUMN_TYPE_VALUE_RAW: u32 = 7; -pub(crate) const COLUMN_TYPE_DEFLATE: u32 = 8; - -#[derive(PartialEq, Debug, Clone, Copy)] -#[repr(u32)] -pub(crate) enum Action { - MakeMap, - Set, - MakeList, - Del, - MakeText, - Inc, - MakeTable, -} -const ACTIONS: [Action; 7] = [ - Action::MakeMap, - Action::Set, - Action::MakeList, - Action::Del, - Action::MakeText, - Action::Inc, - Action::MakeTable, -]; - -impl Decodable for Action { - fn decode(bytes: &mut R) -> Option - where - R: Read, - { - let num = usize::decode::(bytes)?; - ACTIONS.get(num).copied() - } -} - -const COL_OBJ_ACTOR: u32 = COLUMN_TYPE_ACTOR_ID; -const COL_OBJ_CTR: u32 = COLUMN_TYPE_INT_RLE; -const COL_KEY_ACTOR: u32 = 1 << 4 | COLUMN_TYPE_ACTOR_ID; -const COL_KEY_CTR: u32 = 1 << 4 | COLUMN_TYPE_INT_DELTA; -const COL_KEY_STR: u32 = 1 << 4 | COLUMN_TYPE_STRING_RLE; -const COL_ID_ACTOR: u32 = 2 << 4 | COLUMN_TYPE_ACTOR_ID; -const COL_ID_CTR: u32 = 2 << 4 | COLUMN_TYPE_INT_DELTA; -const COL_INSERT: u32 = 3 << 4 | COLUMN_TYPE_BOOLEAN; -const COL_ACTION: u32 = 4 << 4 | COLUMN_TYPE_INT_RLE; -const COL_VAL_LEN: u32 = 5 << 4 | COLUMN_TYPE_VALUE_LEN; -const COL_VAL_RAW: u32 = 5 << 4 | COLUMN_TYPE_VALUE_RAW; -const COL_PRED_NUM: u32 = 7 << 4 | COLUMN_TYPE_GROUP_CARD; -const COL_PRED_ACTOR: u32 = 7 << 4 | COLUMN_TYPE_ACTOR_ID; -const COL_PRED_CTR: u32 = 7 << 4 | COLUMN_TYPE_INT_DELTA; -const COL_SUCC_NUM: u32 = 8 << 4 | COLUMN_TYPE_GROUP_CARD; -const COL_SUCC_ACTOR: u32 = 8 << 4 | COLUMN_TYPE_ACTOR_ID; -const COL_SUCC_CTR: u32 = 8 << 4 | COLUMN_TYPE_INT_DELTA; -const COL_REF_CTR: u32 = 6 << 4 | COLUMN_TYPE_INT_RLE; -const COL_REF_ACTOR: u32 = 6 << 4 | COLUMN_TYPE_ACTOR_ID; - -const DOC_ACTOR: u32 = /* 0 << 4 */ COLUMN_TYPE_ACTOR_ID; -const DOC_SEQ: u32 = /* 0 << 4 */ COLUMN_TYPE_INT_DELTA; -const DOC_MAX_OP: u32 = 1 << 4 | COLUMN_TYPE_INT_DELTA; -const DOC_TIME: u32 = 2 << 4 | COLUMN_TYPE_INT_DELTA; -const DOC_MESSAGE: u32 = 3 << 4 | COLUMN_TYPE_STRING_RLE; -const DOC_DEPS_NUM: u32 = 4 << 4 | COLUMN_TYPE_GROUP_CARD; -const DOC_DEPS_INDEX: u32 = 4 << 4 | COLUMN_TYPE_INT_DELTA; -const DOC_EXTRA_LEN: u32 = 5 << 4 | COLUMN_TYPE_VALUE_LEN; -const DOC_EXTRA_RAW: u32 = 5 << 4 | COLUMN_TYPE_VALUE_RAW; - -/* -const DOCUMENT_COLUMNS = { - actor: 0 << 3 | COLUMN_TYPE.ACTOR_ID, - seq: 0 << 3 | COLUMN_TYPE.INT_DELTA, - maxOp: 1 << 3 | COLUMN_TYPE.INT_DELTA, - time: 2 << 3 | COLUMN_TYPE.INT_DELTA, - message: 3 << 3 | COLUMN_TYPE.STRING_RLE, - depsNum: 4 << 3 | COLUMN_TYPE.GROUP_CARD, - depsIndex: 4 << 3 | COLUMN_TYPE.INT_DELTA, - extraLen: 5 << 3 | COLUMN_TYPE.VALUE_LEN, - extraRaw: 5 << 3 | COLUMN_TYPE.VALUE_RAW -} -*/ - -#[cfg(test)] -mod tests { - use amp::{ActorId, Key, ScalarValue}; - use pretty_assertions::assert_eq; - - use super::*; - - #[test] - fn test_rle_encoder_for_strings_from_key() { - // this seems like a strange case but checks that we write nulls into the encoder as usize and read them out the same. - // if we don't then the 64 nulls gets interpreted as -64 and causes the rle decoder to never read the next values. - let ops = vec![ - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - Some("a".to_owned()), - ]; - let mut encoder = RleEncoder::new(); - for op in &ops { - if let Some(v) = op { - encoder.append_value(v.clone()) - } else { - encoder.append_null() - } - } - let encoded = encoder.finish(0).data; - - assert_eq!(encoded, vec![0, 64, 127, 1, 97]); - - let decoder: RleDecoder = RleDecoder::from(Cow::from(&encoded[..])); - - let decoded = decoder.take(ops.len()).collect::>(); - assert_eq!(decoded, ops); - } - - #[test] - fn pred_sorted() { - let actor = ActorId::random(); - let actor2 = ActorId::random(); - - let mut actors = vec![actor.clone(), actor2.clone()]; - actors.sort(); - - let col_op = ColumnOp { - action: InternalOpType::Set(ScalarValue::Null), - obj: Cow::Owned(amp::ObjectId::Root), - key: Cow::Owned(Key::Map("r".to_owned())), - pred: vec![actor.op_id_at(1), actor2.op_id_at(1)], - insert: false, - }; - - let mut column_encoder = ColumnEncoder::new(); - column_encoder.encode(vec![col_op], &mut actors); - let (bytes, _) = column_encoder.finish(); - - let col_op2 = ColumnOp { - action: InternalOpType::Set(ScalarValue::Null), - obj: Cow::Owned(amp::ObjectId::Root), - key: Cow::Owned(Key::Map("r".to_owned())), - pred: vec![actor2.op_id_at(1), actor.op_id_at(1)], - insert: false, - }; - - let mut column_encoder = ColumnEncoder::new(); - column_encoder.encode(vec![col_op2], &mut actors); - let (bytes2, _) = column_encoder.finish(); - - assert_eq!(bytes, bytes2); - } -} diff --git a/automerge-backend/src/concurrent_operations.rs b/automerge-backend/src/concurrent_operations.rs deleted file mode 100644 index 15445968..00000000 --- a/automerge-backend/src/concurrent_operations.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::ops::Deref; - -use crate::{error::AutomergeError, internal::InternalOpType, op_handle::OpHandle}; - -/// Represents a set of operations which are relevant to either an element ID -/// or object ID and which occurred without knowledge of each other -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct ConcurrentOperations { - pub ops: Vec, -} - -impl Deref for ConcurrentOperations { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.ops - } -} - -impl Default for ConcurrentOperations { - fn default() -> Self { - Self::new() - } -} - -impl ConcurrentOperations { - pub fn new() -> ConcurrentOperations { - ConcurrentOperations { ops: Vec::new() } - } - - pub fn is_empty(&self) -> bool { - self.ops.is_empty() - } - - /// Updates this set of operations based on a new operation. - /// - /// Returns the operation representing the update and the previous operations that this op - /// replaces. - /// This is to cover the case of increment operations actually being reflected as Sets on - /// counters. - pub fn incorporate_new_op( - &mut self, - new_op: OpHandle, - ) -> Result<(OpHandle, Vec), AutomergeError> { - if new_op.is_inc() { - for op in &mut self.ops { - if op.maybe_increment(&new_op) { - return Ok((op.clone(), Vec::new())); - } - } - Ok((new_op, Vec::new())) - } else { - let mut overwritten_ops = Vec::new(); - let mut i = 0; - while i != self.ops.len() { - if new_op.pred.contains(&self.ops[i].id) { - overwritten_ops.push(self.ops.swap_remove(i)); - } else { - i += 1; - } - } - - match new_op.action { - InternalOpType::Set(_) | InternalOpType::Make(_) => { - self.ops.push(new_op.clone()); - } - _ => {} - } - - Ok((new_op, overwritten_ops)) - } - } -} diff --git a/automerge-backend/src/encoding.rs b/automerge-backend/src/encoding.rs deleted file mode 100644 index f23b28c0..00000000 --- a/automerge-backend/src/encoding.rs +++ /dev/null @@ -1,364 +0,0 @@ -use core::fmt::Debug; -use std::{ - io, - io::{Read, Write}, - mem, -}; - -use automerge_protocol as amp; -use flate2::{bufread::DeflateEncoder, Compression}; - -use crate::columnar::COLUMN_TYPE_DEFLATE; - -pub(crate) const DEFLATE_MIN_SIZE: usize = 256; - -/// The error type for encoding operations. -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error(transparent)] - Io(#[from] io::Error), -} - -/// Encodes booleans by storing the count of the same value. -/// -/// The sequence of numbers describes the count of false values on even indices (0-indexed) and the -/// count of true values on odd indices (0-indexed). -/// -/// Counts are encoded as usize. -pub(crate) struct BooleanEncoder { - buf: Vec, - last: bool, - count: usize, -} - -impl BooleanEncoder { - pub fn new() -> BooleanEncoder { - BooleanEncoder { - buf: Vec::new(), - last: false, - count: 0, - } - } - - pub fn append(&mut self, value: bool) { - if value == self.last { - self.count += 1; - } else { - self.count.encode(&mut self.buf).ok(); - self.last = value; - self.count = 1; - } - } - - pub fn finish(mut self, col: u32) -> ColData { - if self.count > 0 { - self.count.encode(&mut self.buf).ok(); - } - ColData::new(col, self.buf) - } -} - -/// Encodes integers as the change since the previous value. -/// -/// The initial value is 0 encoded as u64. Deltas are encoded as i64. -/// -/// Run length encoding is then applied to the resulting sequence. -pub(crate) struct DeltaEncoder { - rle: RleEncoder, - absolute_value: u64, -} - -impl DeltaEncoder { - pub fn new() -> DeltaEncoder { - DeltaEncoder { - rle: RleEncoder::new(), - absolute_value: 0, - } - } - - pub fn append_value(&mut self, value: u64) { - self.rle - .append_value(value as i64 - self.absolute_value as i64); - self.absolute_value = value; - } - - pub fn append_null(&mut self) { - self.rle.append_null(); - } - - pub fn finish(self, col: u32) -> ColData { - self.rle.finish(col) - } -} - -enum RleState { - Empty, - NullRun(usize), - LiteralRun(T, Vec), - LoneVal(T), - Run(T, usize), -} - -/// Encodes data in run lengh encoding format. This is very efficient for long repeats of data -/// -/// There are 3 types of 'run' in this encoder: -/// - a normal run (compresses repeated values) -/// - a null run (compresses repeated nulls) -/// - a literal run (no compression) -/// -/// A normal run consists of the length of the run (encoded as an i64) followed by the encoded value that this run contains. -/// -/// A null run consists of a zero value (encoded as an i64) followed by the length of the null run (encoded as a usize). -/// -/// A literal run consists of the **negative** length of the run (encoded as an i64) followed by the values in the run. -/// -/// Therefore all the types start with an encoded i64, the value of which determines the type of the following data. -pub(crate) struct RleEncoder -where - T: Encodable + PartialEq + Clone, -{ - buf: Vec, - state: RleState, -} - -impl RleEncoder -where - T: Encodable + PartialEq + Clone, -{ - pub fn new() -> RleEncoder { - RleEncoder { - buf: Vec::new(), - state: RleState::Empty, - } - } - - pub fn finish(mut self, col: u32) -> ColData { - match self.take_state() { - // this covers `only_nulls` - RleState::NullRun(size) => { - if !self.buf.is_empty() { - self.flush_null_run(size) - } - } - RleState::LoneVal(value) => self.flush_lit_run(vec![value]), - RleState::Run(value, len) => self.flush_run(&value, len), - RleState::LiteralRun(last, mut run) => { - run.push(last); - self.flush_lit_run(run); - } - RleState::Empty => {} - } - ColData::new(col, self.buf) - } - - fn flush_run(&mut self, val: &T, len: usize) { - self.encode(&(len as i64)); - self.encode(val); - } - - fn flush_null_run(&mut self, len: usize) { - self.encode::(&0); - self.encode(&len); - } - - fn flush_lit_run(&mut self, run: Vec) { - self.encode(&-(run.len() as i64)); - for val in run { - self.encode(&val); - } - } - - fn take_state(&mut self) -> RleState { - let mut state = RleState::Empty; - mem::swap(&mut self.state, &mut state); - state - } - - pub fn append_null(&mut self) { - self.state = match self.take_state() { - RleState::Empty => RleState::NullRun(1), - RleState::NullRun(size) => RleState::NullRun(size + 1), - RleState::LoneVal(other) => { - self.flush_lit_run(vec![other]); - RleState::NullRun(1) - } - RleState::Run(other, len) => { - self.flush_run(&other, len); - RleState::NullRun(1) - } - RleState::LiteralRun(last, mut run) => { - run.push(last); - self.flush_lit_run(run); - RleState::NullRun(1) - } - } - } - - pub fn append_value(&mut self, value: T) { - self.state = match self.take_state() { - RleState::Empty => RleState::LoneVal(value), - RleState::LoneVal(other) => { - if other == value { - RleState::Run(value, 2) - } else { - RleState::LiteralRun(value, vec![other]) - } - } - RleState::Run(other, len) => { - if other == value { - RleState::Run(other, len + 1) - } else { - self.flush_run(&other, len); - RleState::LoneVal(value) - } - } - RleState::LiteralRun(last, mut run) => { - if last == value { - self.flush_lit_run(run); - RleState::Run(value, 2) - } else { - run.push(last); - RleState::LiteralRun(value, run) - } - } - RleState::NullRun(size) => { - self.flush_null_run(size); - RleState::LoneVal(value) - } - } - } - - fn encode(&mut self, val: &V) - where - V: Encodable, - { - val.encode(&mut self.buf).ok(); - } -} - -pub(crate) trait Encodable { - fn encode_with_actors_to_vec(&self, actors: &mut Vec) -> io::Result> { - let mut buf = Vec::new(); - self.encode_with_actors(&mut buf, actors)?; - Ok(buf) - } - - fn encode_with_actors( - &self, - buf: &mut R, - _actors: &mut Vec, - ) -> io::Result { - self.encode(buf) - } - - fn encode(&self, buf: &mut R) -> io::Result; -} - -impl Encodable for String { - fn encode(&self, buf: &mut R) -> io::Result { - let bytes = self.as_bytes(); - let head = bytes.len().encode(buf)?; - buf.write_all(bytes)?; - Ok(head + bytes.len()) - } -} - -impl Encodable for Option { - fn encode(&self, buf: &mut R) -> io::Result { - if let Some(s) = self { - s.encode(buf) - } else { - 0.encode(buf) - } - } -} - -impl Encodable for u64 { - fn encode(&self, buf: &mut R) -> io::Result { - leb128::write::unsigned(buf, *self) - } -} - -impl Encodable for f64 { - fn encode(&self, buf: &mut R) -> io::Result { - let bytes = self.to_le_bytes(); - buf.write_all(&bytes)?; - Ok(bytes.len()) - } -} - -impl Encodable for f32 { - fn encode(&self, buf: &mut R) -> io::Result { - let bytes = self.to_le_bytes(); - buf.write_all(&bytes)?; - Ok(bytes.len()) - } -} - -impl Encodable for i64 { - fn encode(&self, buf: &mut R) -> io::Result { - leb128::write::signed(buf, *self) - } -} - -impl Encodable for usize { - fn encode(&self, buf: &mut R) -> io::Result { - (*self as u64).encode(buf) - } -} - -impl Encodable for u32 { - fn encode(&self, buf: &mut R) -> io::Result { - u64::from(*self).encode(buf) - } -} - -impl Encodable for i32 { - fn encode(&self, buf: &mut R) -> io::Result { - i64::from(*self).encode(buf) - } -} - -#[derive(Debug)] -pub(crate) struct ColData { - pub col: u32, - pub data: Vec, - #[cfg(debug_assertions)] - has_been_deflated: bool, -} - -impl ColData { - pub fn new(col_id: u32, data: Vec) -> ColData { - ColData { - col: col_id, - data, - #[cfg(debug_assertions)] - has_been_deflated: false, - } - } - - pub fn encode_col_len(&self, buf: &mut R) -> io::Result { - let mut len = 0; - if !self.data.is_empty() { - len += self.col.encode(buf)?; - len += self.data.len().encode(buf)?; - } - Ok(len) - } - - pub fn deflate(&mut self) { - #[cfg(debug_assertions)] - { - debug_assert!(!self.has_been_deflated); - self.has_been_deflated = true; - } - if self.data.len() > DEFLATE_MIN_SIZE { - let mut deflated = Vec::new(); - let mut deflater = DeflateEncoder::new(&self.data[..], Compression::best()); - //This unwrap should be okay as we're reading and writing to in memory buffers - deflater.read_to_end(&mut deflated).unwrap(); - self.col |= COLUMN_TYPE_DEFLATE; - self.data = deflated; - } - } -} diff --git a/automerge-backend/src/error.rs b/automerge-backend/src/error.rs deleted file mode 100644 index b64a9325..00000000 --- a/automerge-backend/src/error.rs +++ /dev/null @@ -1,67 +0,0 @@ -//use std::error::Error; -use std::fmt::Debug; - -use automerge_protocol as amp; -use thiserror::Error; - -use crate::{decoding, encoding}; - -#[derive(Error, Debug)] -pub enum AutomergeError { - #[error("Missing object ID")] - MissingObjectError, - #[error("Missing index in op {0}")] - MissingIndex(amp::OpId), - #[error("Missing element ID: {0}")] - MissingElement(amp::ObjectId, amp::ElementId), - #[error("No path to object: {0}")] - NoPathToObject(amp::ObjectId), - #[error("Cant extract object: {0}")] - CantExtractObject(amp::ObjectId), - #[error("Skiplist error: {0}")] - SkipListError(String), - #[error("Index out of bounds: {0}")] - IndexOutOfBounds(usize), - #[error("Invalid op id: {0}")] - InvalidOpId(String), - #[error("Invalid object ID: {0}")] - InvalidObjectId(String), - #[error("Missing value")] - MissingValue, - #[error("Unknown error: {0}")] - GeneralError(String), - #[error("Missing number value")] - MissingNumberValue, - #[error("Unknown version: {0}")] - UnknownVersion(u64), - #[error("Duplicate change {0}")] - DuplicateChange(String), - #[error("Diverged state {0}")] - DivergedState(String), - #[error("Invalid seq {0}")] - InvalidSeq(u64), - #[error("Map key in seq")] - MapKeyInSeq, - #[error("Head to opid")] - HeadToOpId, - #[error("Doc format not implemented yet")] - DocFormatUnimplemented, - #[error("Divergent change {0}")] - DivergentChange(String), - #[error("Encode failed")] - EncodeFailed, - #[error("Decode failed")] - DecodeFailed, - #[error("Encoding error {0}")] - EncodingError(#[from] encoding::Error), - #[error("Decoding error {0}")] - DecodingError(#[from] decoding::Error), - #[error("Attempted to create a cursor for opid {opid} which was not an element in a sequence")] - InvalidCursor { opid: amp::OpId }, - #[error("A compressed chunk could not be decompressed")] - BadCompressedChunk, -} - -#[derive(Error, Debug)] -#[error("Invalid element ID: {0}")] -pub struct InvalidElementId(pub String); diff --git a/automerge-backend/src/event_handlers.rs b/automerge-backend/src/event_handlers.rs deleted file mode 100644 index 394272d3..00000000 --- a/automerge-backend/src/event_handlers.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::fmt::Debug; - -use crate::Change; - -#[derive(Clone, Copy)] -pub struct EventHandlerId(usize); - -/// A sequence of event handlers. -/// -/// This maintains the order of insertion so handlers will be called in a consistent order. -#[derive(Debug, Default)] -pub struct EventHandlers(Vec); - -impl Clone for EventHandlers { - fn clone(&self) -> Self { - EventHandlers(Vec::new()) - } -} - -impl EventHandlers { - pub(crate) fn before_apply_change(&mut self, change: &Change) { - for handler in &mut self.0 { - if let EventHandler::BeforeApplyChange(f) = handler { - f.0(change) - } - } - } - - pub(crate) fn after_apply_change(&mut self, change: &Change) { - for handler in &mut self.0 { - if let EventHandler::AfterApplyChange(f) = handler { - f.0(change) - } - } - } - - /// Adds the event handler and returns the id of the handler. - pub fn add_handler(&mut self, handler: EventHandler) -> EventHandlerId { - self.0.push(handler); - EventHandlerId(self.0.len() - 1) - } - - /// Remove the handler with the given id, returning whether it removed a handler or not. - pub fn remove_handler(&mut self, id: EventHandlerId) -> bool { - if id.0 < self.0.len() { - self.0.remove(id.0); - true - } else { - false - } - } -} - -/// A handler for changes. -pub struct ChangeEventHandler(pub Box); - -/// An general event handler. -pub enum EventHandler { - /// An event handler that gets called before a change is applied to the history. - BeforeApplyChange(ChangeEventHandler), - /// An event handler that gets called after a change has been applied to the history. - AfterApplyChange(ChangeEventHandler), -} - -impl Debug for EventHandler { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - match self { - Self::BeforeApplyChange(_) => write!(f, "BeforeApplyChange"), - Self::AfterApplyChange(_) => write!(f, "AfterApplyChange"), - } - } -} diff --git a/automerge-backend/src/expanded_op.rs b/automerge-backend/src/expanded_op.rs deleted file mode 100644 index 9fc463f5..00000000 --- a/automerge-backend/src/expanded_op.rs +++ /dev/null @@ -1,310 +0,0 @@ -use std::borrow::Cow; - -use amp::{ActorId, ElementId, Key, OpId}; -use automerge_protocol as amp; - -use crate::internal::InternalOpType; - -/// The same as amp::Op except the `action` is an `InternalOpType`. This allows us to expand -/// collections of `amp::Op` into `ExpandedOp`s and remove optypes which perform multiple -/// operations (`amp::OpType::MultiSet` and `amp::OpType::Del`) -#[derive(Debug, PartialEq)] -pub struct ExpandedOp<'a> { - pub(crate) action: InternalOpType, - pub obj: Cow<'a, amp::ObjectId>, - pub key: Cow<'a, amp::Key>, - pub pred: Cow<'a, [amp::OpId]>, - pub insert: bool, -} - -/// An iterator which expands `amp::OpType::MultiSet` and `amp::OpType::Del` operations into -/// multiple `amp::InternalOpType`s -pub(super) struct ExpandedOpIterator<'a> { - actor: ActorId, - offset: usize, - ops: &'a [amp::Op], - expand_count: Option, - op_num: u64, -} - -impl<'a> Iterator for ExpandedOpIterator<'a> { - type Item = ExpandedOp<'a>; - - fn next(&mut self) -> Option { - if self.offset >= self.ops.len() { - None - } else { - self.op_num += 1; - let op = &self.ops[self.offset]; - let action = match &op.action { - amp::OpType::Set(v) => InternalOpType::Set(v.clone()), - amp::OpType::Make(ot) => InternalOpType::Make(*ot), - amp::OpType::Inc(i) => InternalOpType::Inc(*i), - amp::OpType::Del(count) => { - if count.get() == 1 { - InternalOpType::Del - } else { - assert_eq!( - op.pred.len(), - 1, - "multiOp deletion must have exactly one pred" - ); - let index = if let Some(c) = self.expand_count { - if c == count.get() as usize - 1 { - // the last - self.offset += 1; - self.expand_count = None; - } else { - // somewhere in the middle - self.expand_count = Some(c + 1); - } - c - } else { - // first one of the series - self.expand_count = Some(1); - 0 - }; - let pred = op.pred[0].increment_by(index as u64); - let key = op.key.increment_by(index as u64).unwrap(); - return Some(ExpandedOp { - action: InternalOpType::Del, - insert: op.insert, - pred: Cow::Owned(vec![pred]), - key: Cow::Owned(key), - obj: Cow::Borrowed(&op.obj), - }); - } - } - amp::OpType::MultiSet(values) => { - assert!(op.pred.is_empty(), "multi-insert pred must be empty"); - let expanded_offset = match self.expand_count { - None => { - self.expand_count = Some(0); - 0 - } - Some(o) => o, - }; - - let key = if expanded_offset == 0 { - Cow::Borrowed(&op.key) - } else { - Cow::Owned(Key::Seq(ElementId::Id(OpId( - self.op_num - 1, - self.actor.clone(), - )))) - }; - - if expanded_offset == values.len() - 1 { - self.offset += 1; - self.expand_count = None; - } else { - self.expand_count = Some(expanded_offset + 1); - } - - let v = values.get(expanded_offset).unwrap(); - return Some(ExpandedOp { - action: InternalOpType::Set(v.clone()), - insert: op.insert, - pred: Cow::Borrowed(&op.pred), - key, - obj: Cow::Borrowed(&op.obj), - }); - } - }; - self.offset += 1; - Some(ExpandedOp { - action, - insert: op.insert, - pred: Cow::Borrowed(&op.pred), - key: Cow::Borrowed(&op.key), - obj: Cow::Borrowed(&op.obj), - }) - } - } -} - -impl<'a> ExpandedOpIterator<'a> { - pub(super) fn new(ops: &'a [amp::Op], start_op: u64, actor: ActorId) -> ExpandedOpIterator<'a> { - ExpandedOpIterator { - ops, - offset: 0, - expand_count: None, - op_num: start_op - 1, - actor, - } - } -} - -#[cfg(test)] -mod tests { - use std::{convert::TryInto, num::NonZeroU32}; - - use amp::{ObjectId, Op, OpType, ScalarValue}; - use pretty_assertions::assert_eq; - - use super::*; - - #[test] - fn expand_multi_set() { - let actor = ActorId::from_bytes(b"7f12a4d3567c4257af34f216aa16fe48"); - let ops = [Op { - action: OpType::MultiSet( - vec![ - ScalarValue::Uint(1), - ScalarValue::Uint(2), - ScalarValue::Uint(3), - ] - .try_into() - .unwrap(), - ), - obj: ObjectId::Id(OpId(1, actor.clone())), - key: Key::Seq(ElementId::Head), - pred: vec![], - insert: true, - }]; - let expanded_ops = ExpandedOpIterator::new(&ops, 2, actor.clone()).collect::>(); - assert_eq!( - expanded_ops, - vec![ - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(1)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Head)), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(2)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(2, actor.clone())))), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(3)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(3, actor)))), - pred: Cow::Owned(vec![]), - insert: true - }, - ] - ); - } - - #[test] - fn expand_multi_set_double() { - let actor = ActorId::from_bytes(b"7f12a4d3567c4257af34f216aa16fe48"); - let ops = [ - Op { - action: OpType::MultiSet( - vec![ - ScalarValue::Uint(1), - ScalarValue::Uint(2), - ScalarValue::Uint(3), - ] - .try_into() - .unwrap(), - ), - obj: ObjectId::Id(OpId(1, actor.clone())), - key: Key::Seq(ElementId::Head), - pred: vec![], - insert: true, - }, - Op { - action: OpType::MultiSet( - vec![ - ScalarValue::Str("hi".into()), - ScalarValue::Str("world".into()), - ] - .try_into() - .unwrap(), - ), - obj: ObjectId::Id(OpId(1, actor.clone())), - key: Key::Seq(ElementId::Id(OpId(4, actor.clone()))), - pred: vec![], - insert: true, - }, - ]; - let expanded_ops = ExpandedOpIterator::new(&ops, 2, actor.clone()).collect::>(); - assert_eq!( - expanded_ops, - vec![ - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(1)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Head)), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(2)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(2, actor.clone())))), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Uint(3)), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(3, actor.clone())))), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Str("hi".to_owned())), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(4, actor.clone())))), - pred: Cow::Owned(vec![]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Set(ScalarValue::Str("world".to_owned())), - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(5, actor)))), - pred: Cow::Owned(vec![]), - insert: true - }, - ] - ); - } - - #[test] - fn expand_multi_del() { - let actor = ActorId::from_bytes(b"7f12a4d3567c4257af34f216aa16fe48"); - let pred = OpId(1, actor.clone()); - let ops = [Op { - action: OpType::Del(NonZeroU32::new(3).unwrap()), - obj: ObjectId::Id(OpId(1, actor.clone())), - key: Key::Seq(ElementId::Id(OpId(1, actor.clone()))), - pred: vec![pred], - insert: true, - }]; - let expanded_ops = ExpandedOpIterator::new(&ops, 2, actor.clone()).collect::>(); - assert_eq!( - expanded_ops, - vec![ - ExpandedOp { - action: InternalOpType::Del, - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(1, actor.clone())))), - pred: Cow::Owned(vec![OpId(1, actor.clone())]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Del, - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(2, actor.clone())))), - pred: Cow::Owned(vec![OpId(2, actor.clone())]), - insert: true - }, - ExpandedOp { - action: InternalOpType::Del, - obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), - key: Cow::Owned(Key::Seq(ElementId::Id(OpId(3, actor.clone())))), - pred: Cow::Owned(vec![OpId(3, actor)]), - insert: true - }, - ] - ); - } -} diff --git a/automerge-backend/src/internal.rs b/automerge-backend/src/internal.rs deleted file mode 100644 index 6ebc59b3..00000000 --- a/automerge-backend/src/internal.rs +++ /dev/null @@ -1,101 +0,0 @@ -use automerge_protocol as amp; -use nonzero_ext::nonzero; - -#[derive(Eq, PartialEq, Hash, Debug, Clone, Copy)] -pub(crate) struct ActorId(pub usize); - -#[derive(Eq, PartialEq, Debug, Hash, Clone, Copy)] -pub(crate) struct OpId(pub u64, pub ActorId); - -#[derive(Eq, PartialEq, Debug, Hash, Clone, Copy)] -pub(crate) enum ObjectId { - Id(OpId), - Root, -} - -#[derive(PartialEq, Eq, Debug, Hash, Clone, Copy)] -pub(crate) enum ElementId { - Head, - Id(OpId), -} - -#[derive(PartialEq, Eq, Debug, Hash, Clone)] -pub(crate) enum Key { - Map(String), - Seq(ElementId), -} - -#[derive(PartialEq, Debug, Clone)] -pub(crate) struct InternalOp { - pub action: InternalOpType, - pub obj: ObjectId, - pub key: Key, - pub pred: Vec, - pub insert: bool, -} - -impl InternalOp { - pub fn obj_type(&self) -> Option { - match self.action { - InternalOpType::Make(objtype) => Some(objtype), - _ => None, - } - } - - pub fn is_inc(&self) -> bool { - matches!(self.action, InternalOpType::Inc(_)) - } -} - -#[derive(PartialEq, Debug, Clone)] -pub(crate) enum InternalOpType { - Make(amp::ObjType), - Del, - Inc(i64), - Set(amp::ScalarValue), -} - -impl Key { - pub fn as_element_id(&self) -> Option { - match self { - Key::Map(_) => None, - Key::Seq(eid) => Some(*eid), - } - } - - pub fn to_opid(&self) -> Option { - match self.as_element_id()? { - ElementId::Id(id) => Some(id), - ElementId::Head => None, - } - } -} - -impl From for ObjectId { - fn from(id: OpId) -> ObjectId { - ObjectId::Id(id) - } -} - -impl From for ElementId { - fn from(id: OpId) -> ElementId { - ElementId::Id(id) - } -} - -impl From for Key { - fn from(id: OpId) -> Key { - Key::Seq(ElementId::Id(id)) - } -} - -impl From<&InternalOpType> for amp::OpType { - fn from(i: &InternalOpType) -> amp::OpType { - match i { - InternalOpType::Del => amp::OpType::Del(nonzero!(1_u32)), - InternalOpType::Make(ot) => amp::OpType::Make(*ot), - InternalOpType::Set(v) => amp::OpType::Set(v.clone()), - InternalOpType::Inc(i) => amp::OpType::Inc(*i), - } - } -} diff --git a/automerge-backend/src/lib.rs b/automerge-backend/src/lib.rs deleted file mode 100644 index 434b5ea5..00000000 --- a/automerge-backend/src/lib.rs +++ /dev/null @@ -1,77 +0,0 @@ -#![warn(clippy::pedantic)] -#![warn(clippy::nursery)] -#![allow(clippy::missing_errors_doc)] -#![allow(clippy::must_use_candidate)] -#![allow(clippy::option_if_let_else)] -#![allow(clippy::cast_sign_loss)] -#![allow(clippy::cast_possible_truncation)] -#![allow(clippy::cast_possible_wrap)] -#![allow(clippy::doc_markdown)] -#![allow(clippy::similar_names)] -#![allow(clippy::shadow_unrelated)] -#![allow(clippy::module_name_repetitions)] -#![allow(clippy::redundant_pub_crate)] -#![allow(clippy::missing_const_for_fn)] -#![allow(clippy::use_self)] -#![allow(clippy::too_many_lines)] - -extern crate fxhash; -extern crate hex; -extern crate itertools; -extern crate maplit; -extern crate rand; -extern crate web_sys; -extern crate base64; - -// this is needed for print debugging via WASM -#[allow(unused_macros)] -macro_rules! log { - ( $( $t:tt )* ) => { - web_sys::console::log_1(&format!( $( $t )* ).into()); - } -} - -mod actor_map; -mod backend; -mod change; -mod columnar; -mod concurrent_operations; -mod decoding; -mod encoding; -mod error; -mod event_handlers; -mod expanded_op; -mod internal; -mod mark2; -mod object_store; -mod op_handle; -mod op_set; -mod ordered_set; -mod patches; -mod sync; - -pub use backend::Backend; -pub use change::Change; -pub use decoding::Error as DecodingError; -pub use encoding::Error as EncodingError; -pub use error::AutomergeError; -pub use event_handlers::{ChangeEventHandler, EventHandler, EventHandlerId}; -pub use sync::{BloomFilter, SyncHave, SyncMessage, SyncState}; - -#[cfg(test)] -mod tests { - use std::{ - sync::{Arc, Mutex}, - thread, - }; - - #[test] - fn sync_and_send_backend() { - let b = crate::Backend::new(); - let mb = Arc::new(Mutex::new(b)); - thread::spawn(move || { - let b = mb.lock().unwrap(); - b.get_changes(&[]); - }); - } -} diff --git a/automerge-backend/src/mark2/mod.rs b/automerge-backend/src/mark2/mod.rs deleted file mode 100644 index 50d7c768..00000000 --- a/automerge-backend/src/mark2/mod.rs +++ /dev/null @@ -1,421 +0,0 @@ -#![allow(dead_code)] - -use std::cmp::Ordering; - -use automerge_protocol as amp; - -use crate::{error::AutomergeError, internal::InternalOpType, patches::IncrementalPatch}; - -#[derive(Debug, PartialEq, Clone, Default)] -pub struct OpSet { - actors: Vec, - changes: Vec, - ops: Vec, -} -/* - -#[derive(PartialEq, Debug, Clone)] -pub struct Change { - bytes: ChangeBytes, - pub hash: amp::ChangeHash, - pub seq: u64, - pub start_op: u64, - pub time: i64, - message: Range, - actors: Vec, - pub deps: Vec, - ops: HashMap>, - extra_bytes: Range, -} - - */ - -fn inc_visible(next: &Op, elem_visible: &mut bool, visible: &mut usize) { - if next.insert { - *elem_visible = false - } - if next.succ.is_empty() && !*elem_visible { - *visible += 1; - *elem_visible = true - } -} - -impl OpSet { - fn index_for_actor(&self, actor: &::ActorId) -> Option { - self.actors.iter().position(|n| n == actor) - } - - fn import_key(&self, key: &::Key) -> Key { - match key { - amp::Key::Map(string) => Key::Map(string.clone()), - amp::Key::Seq(amp::ElementId::Head) => Key::Seq(OpId(0, 0)), - amp::Key::Seq(amp::ElementId::Id(id)) => Key::Seq(self.import_opid(id)), - } - } - - fn import_objectid(&self, obj: &::ObjectId) -> OpId { - match obj { - amp::ObjectId::Root => OpId(0, 0), - amp::ObjectId::Id(id) => self.import_opid(id), - } - } - - fn import_opid(&self, opid: &::OpId) -> OpId { - OpId(opid.0, self.index_for_actor(&opid.1).unwrap()) - } - - fn lamport_compare(&self, op1: &OpId, op2: &OpId) -> Ordering { - match (op1, op2) { - (OpId(0, 0), OpId(0, 0)) => Ordering::Equal, - (OpId(0, 0), OpId(_, _)) => Ordering::Less, - (OpId(_, _), OpId(0, 0)) => Ordering::Greater, - (OpId(ctr1, actor1), OpId(ctr2, actor2)) => { - if ctr1 == ctr2 { - let actor1 = &self.actors[*actor1]; - let actor2 = &self.actors[*actor2]; - actor1.cmp(actor2) - } else { - op1.0.cmp(&op2.0) - } - } - } - } - - fn seek_to_obj(&self, obj: &OpId) -> usize { - if self.ops.is_empty() { - return 0; - } - let mut current_obj = None; - for (i, next) in self.ops.iter().enumerate() { - if current_obj == Some(&next.obj) { - continue; - } - if &next.obj == obj || self.lamport_compare(&next.obj, obj) == Ordering::Greater { - return i; - } - current_obj = Some(&next.obj); - } - self.ops.len() - } - - fn seek_to_op(&self, op: &Op) -> Result<(usize, usize),AutomergeError> { - let obj_start = self.seek_to_obj(&op.obj); - let mut elem_visible = false; - let mut visible = 0; - - match &op.key { - Key::Map(_) => { - for (i, next) in self.ops[obj_start..].iter().enumerate() { - if next.key >= op.key || next.obj != op.obj { - return Ok((obj_start + i, 0)); - } - } - Ok((self.ops.len(), 0)) - } - Key::Seq(_) => { - //println!("seek to obj - {:?}", obj_start); - if op.insert { - let mut insert_start = obj_start; - if !op.key.is_head() { - let mut found = false; - for (i, next) in self.ops[obj_start..].iter().enumerate() { - if next.obj != op.obj { - break; - } - if Key::Seq(next.id) == op.key { - found = true; - insert_start += i + 1; - //println!("step {:?}", insert_start); - inc_visible(next,&mut elem_visible, &mut visible); - break; - } - inc_visible(next,&mut elem_visible, &mut visible); - } - if !found { - return Err(AutomergeError::GeneralError("Cant find elemid to insert after".into())) - } - //println!("not head - seek to {:?}", insert_start); - } - for next in &self.ops[insert_start..] { - if next.obj != op.obj || (next.insert && self.lamport_compare(&next.id,&op.id) == Ordering::Less) { - //println!("less - break"); - break - } - insert_start += 1; - //println!("step {:?}", insert_start); - inc_visible(next,&mut elem_visible, &mut visible); - } - Ok((insert_start, visible)) - } else { - for (i, next) in self.ops[obj_start..].iter().enumerate() { - if next.insert && next.key == op.key || next.obj != op.obj { - return Ok((obj_start + i, visible)); - } - inc_visible(next,&mut elem_visible, &mut visible); - } - Err(AutomergeError::GeneralError("Cant find elemid to replace".into())) - } - } - } - } - - fn import_change(&mut self, change: crate::Change) -> Vec { - for actor in &change.actors { - if self.index_for_actor(actor).is_none() { - self.actors.push(actor.clone()); - } - } - - let actor = self.index_for_actor(change.actor_id()).unwrap(); // can unwrap b/c we added it above - let extra_bytes = change.extra_bytes().to_vec(); - - let change_id = self.changes.len(); - let ops: Vec = change - .iter_ops() - .enumerate() - .map(|(i, expanded_op)| Op { - change: change_id, - id: OpId(change.start_op + i as u64, actor), - action: expanded_op.action, - insert: expanded_op.insert, - key: self.import_key(&expanded_op.key), - obj: self.import_objectid(&expanded_op.obj), - pred: expanded_op - .pred - .iter() - .map(|id| self.import_opid(id)) - .collect(), - succ: vec![], - }) - .collect(); - - self.changes.push(Change { - actor, - hash: change.hash, - seq: change.seq, - max_op: change.max_op(), - time: change.time, - message: change.message(), - deps: change.deps, - extra_bytes, - }); - - ops - } - - pub(crate) fn apply_changes(&mut self, changes: Vec) -> Result<(), AutomergeError> { - let mut patch = crate::patches::IncrementalPatch::new(); - for change in changes { - self.apply_change(change, &mut patch)?; - } - Ok(()) - } - - pub(crate) fn apply_change( - &mut self, - change: crate::Change, - _diffs: &mut IncrementalPatch, - ) -> Result<(), AutomergeError> { - - let ops = self.import_change(change); - - for op in ops { - // slow as balls - // *** put them in the right place - let (pos, _visible_count) = self.seek_to_op(&op)?; - - // 1. insert the ops into the list at the right place - // 2. update the succ[] vecs - seek_to_op_id + update - // 3. --> generate the diffs *** - // 4. make it fast (b-tree) - - //println!("op {:?} {:?}",pos, op); - if op.action != InternalOpType::Del { - self.ops.insert(pos, op); - } - } - - Ok(()) - // update pred/succ properly - // handle inc/del - they are special - // generate diffs as we do it - // - // look at old code below and see what we might also need to do - - /* - if self.history_index.contains_key(&change.hash) { - return Ok(()); - } - - self.event_handlers.before_apply_change(&change); - - let change_index = self.update_history(change); - - // SAFETY: change_index is the index for the change we've just added so this can't (and - // shouldn't) panic. This is to get around the borrow checker. - let change = &self.history[change_index]; - - let op_set = &mut self.op_set; - - let start_op = change.start_op; - - op_set.update_deps(change); - - let ops = OpHandle::extract(change, &mut self.actors); - - op_set.max_op = max( - op_set.max_op, - (start_op + (ops.len() as u64)).saturating_sub(1), - ); - - op_set.apply_ops(ops, diffs, &mut self.actors)?; - - self.event_handlers.after_apply_change(change); - - Ok(()) - */ - } - - fn opids(&self) -> Vec { - self.ops.iter().map(|op| amp::OpId(op.id.0, self.actors[op.id.1].clone())).collect() - } -} - -#[derive(PartialEq, Debug, Copy, Clone)] -pub struct OpId(u64, usize); - -#[derive(PartialEq, Debug, Clone)] -pub struct Change { - pub actor: usize, - pub hash: amp::ChangeHash, - pub seq: u64, - pub max_op: u64, - pub time: i64, - pub message: Option, - pub deps: Vec, - pub extra_bytes: Vec, -} - -#[derive(Debug, Clone, PartialEq)] -struct Op { - pub change: usize, - pub id: OpId, - pub action: InternalOpType, - pub obj: OpId, - pub key: Key, - pub succ: Vec, - pub pred: Vec, - pub insert: bool, -} - -#[derive(Debug, Clone, PartialEq)] -pub enum Key { - Map(String), - Seq(OpId), -} - -impl Key { - fn is_head(&self) -> bool { - matches!(self, Key::Seq(OpId(0,_))) - } -} - -impl PartialOrd for Key { - fn partial_cmp(&self, other: &Self) -> Option { - match (self, other) { - (Key::Map(p1), Key::Map(p2)) => p1.partial_cmp(p2), - _ => None, - } - } -} - -#[cfg(test)] -mod tests { - use std::convert::TryInto; - - use automerge_protocol as amp; - - use automerge_protocol::{ ObjectId, OpType, ActorId }; - - use base64; - - use crate::{ Change, Backend }; - - use crate::change::{decode_document_opids}; - use super::*; - - fn compare_backends(save: Vec) { -// let mut mark1 = crate::Backend::new(); - let mark1 = Backend::load(save).unwrap(); - let mut mark2 = OpSet::default(); - - let changes = mark1.get_changes(&[]); - mark2.apply_changes(changes.into_iter().cloned().collect()).unwrap(); - - let saved = mark1.save().unwrap(); - let ops1 = decode_document_opids(&saved).unwrap(); - let ops2 = mark2.opids(); - //println!("--- OPS ---"); - //println!("OPS1 {:?}",ops1); - //println!("OPS2 {:?}",ops2); - //println!("--- OPS ---"); - assert_eq!(ops1,ops2); - } - - #[test] - fn test_save_vs_mark2() { - let actor_a: ActorId = "aaaaaa".try_into().unwrap(); - let change_a1: Change = amp::Change { - actor_id: actor_a.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - amp::Op { obj: ObjectId::Root, action: OpType::Set("magpie".into()), key: "bird".into(), insert: false, pred: Vec::new() }, - amp::Op { obj: ObjectId::Root, action: OpType::Set("xxx".into()), key: "xxx".into(), insert: false, pred: Vec::new() }, - amp::Op { obj: ObjectId::Root, action: OpType::Set("aaa".into()), key: "aaa".into(), insert: false, pred: Vec::new() }, - amp::Op { obj: ObjectId::Root, action: OpType::Set("fff".into()), key: "fff".into(), insert: false, pred: Vec::new() } - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - compare_backends(change_a1.raw_bytes().to_vec()); - - let simple_list = base64::decode("hW9Kg4GAiacArQEBECmUwPz1kEZagKFl16rGqPYBmOik0/Zv7jELzKiUMyOFtA3XUZzGwxc8O12ssIsw0AsHAQIDAhMCIwY1EEACVgIMAQQCBBEEEwcVCCECIwI0AkIEVgRXBoABAn8AfwF/B3+doaqGBn8OSW5pdGlhbGl6YXRpb25/AH8HAAEGAAABBgEAAgUAAAF+AAIEAX8EbGlzdAAGBwAHAQEGfwIGAX8ABhMBAgMEBQYHAA==").unwrap(); - let test1a = base64::decode("hW9Kg0rKILsAnwIBEJu7Qtn7K0smqt1Q/BCcrvwBcDC+HoGmfNIk6Oqjq/BlGAwWZcvHHv3f5jkYU/koDpUHAQIDAhMCIwY1EEACVgIMAQQCDBEIEw4VMSECIws0BEIOVg9XHIABAn8AfwF/FX+Xr6qGBn8OSW5pdGlhbGl6YXRpb25/AH8HAAMSAAADBgICCQILAg0GDwAEBQAABwUAAAN+AAMEAQAGfnkQBAF9BWhlbGxvBGxpc3QEb2JqMQAGegNrZXkEb2JqMgNrZXkEb2JqMwNrZXkEbGlzdAAGFQACAX4HegUBfwILAQMGBgZ9AQIABwF7AAEAAQIGAX9WAgAGE3o2AEYARgAGE3dvcmxkAQIDBAUGdmFsdmFsMnZhbDMBAgMEBQYVAA==").unwrap(); - let test1b = base64::decode("hW9Kg7Cumy8AwgIBEJu7Qtn7K0smqt1Q/BCcrvwBXEUEIn/UuOAWRdn6Ezo5VWU7g8yFWWHfdNkrrLKnzDEIAQIDAhMDIwc1EUADQwJWAg4BBAIMEQgTERUxIQIjDjQGQg5WE1cdgAEGgQECgwECAgACAX4VAX6Xr6qGBgB+DkluaXRpYWxpemF0aW9uAH4AAX8AAgcAAxMAAAMHAgIJAgsCDQYPAAQGAAAHBQAAA34AAwMBfgABAAZ+eRAEAX0FaGVsbG8EbGlzdARvYmoxAAd6A2tleQRvYmoyA2tleQRvYmozA2tleQRsaXN0AAYWAAIBfgd6AwF8EHEBAgsBAwQBAgYGfQECAAgBewABAAECBgF/VgIABBN/FgITejYARgBGAAYTd29ybGQBAgMEYQUGdmFsdmFsMnZhbDMBAgMEBQYGAH8BDwB/AH8W").unwrap(); - let test1c = base64::decode("hW9Kg3IGRdUA0gIBEJu7Qtn7K0smqt1Q/BCcrvwB8yfjx27fDO1zrPWviQDKX5rwvZ/ekvhmnA6m+rterhQIAQIDAhMEIwg1EkAEQwNWAg4BBAIMEQgTFRUxIQIjEjQGQg5WE1cggAEGgQECgwECAwADAX0VAQN/l6+qhgYCAH8OSW5pdGlhbGl6YXRpb24CAH8AAgF+AAEDBwADFgAAAwoCAgkCCwINBg8ABAkAAAcFAAADfgADAwF/AAIBfg8BAAZ+aBAEAX0FaGVsbG8EbGlzdARvYmoxAAp6A2tleQRvYmoyA2tleQRvYmozA2tleQRsaXN0AAYZAAIBfgd6AwF8EHEBDwIBf3ELAQMEAQUGBn0BAgALAXsAAQABAgYBf1YCAAQTfxYFE3o2AEYARgAGE3dvcmxkAQIDBGEFBgQFBnZhbHZhbDJ2YWwzAQIDBAUGBgB/ARIAfwB/Fg==").unwrap(); - let test1d = base64::decode("hW9Kg+X6dsUA2wIBEJu7Qtn7K0smqt1Q/BCcrvwBoXwYdv30XZI1roqo/Ox7ilRrThYI3jBgTZzkAnOnqO4IAQIDAhMFIwg1EkAEQwRWAg4BBAIMEQgTFhUxIQIjFDQGQg5WFVcigAEGgQECgwECBAAEAXwVAQMCf5evqoYGAwB/DkluaXRpYWxpemF0aW9uAwB/AAMBfwACAQQHAAMYAAADDAICCQILAg0GDwAGCQAABwUAAAMDAH8DAwF/AAIBfg8BAAZ+aBAEAX0FaGVsbG8EbGlzdARvYmoxAAx6A2tleQRvYmoyA2tleQRvYmozA2tleQRsaXN0AAYbAAIBfAcSf2kDAXwQcQEPAgF/cQsBAwYBBQYGfQECAA0BewABAAECBgF/VgIAfxQFE38WBRN6NgBGAEYABhN3b3JsZH8AAQIDBGEFBgQFBnZhbHZhbDJ2YWwzAQIDBAUGCAB/ARIAfwB/Fg==").unwrap(); - let nested_objects_and_list_inserts2 = base64::decode("hW9Kg3VDsTMA2QIBEFi6HuSjyUELm4iTM1VtpFsBSaXXvVAz2BHS9i8jlWwqohfGPGPFqAkEG4BN0gWfgX8IAQIDAhMEIwg1EkAEQwNWAg4BBAIMEQgTFhUxIQIjFDQGQg5WFVcigAEGgQECgwECAwADAX8VAgN/gKiqhgYCAH8OSW5pdGlhbGl6YXRpb24CAH8AAgF+AAEDBwADGAAAAwwCAgkCCwINBg8ABgkAAAcFAAADAwB/AwMBfwACAX4OAQAGfmkQBAF9BWhlbGxvBGxpc3QEb2JqMQAMegNrZXkEb2JqMgNrZXkEb2JqMwNrZXkEbGlzdAAGGwACAXwHEn9pAwF8E24BDgIBf3ILAQMGAQUGBn0BAgANAXsAAQABAgYBf1YCAH8UBRN/FgUTejYARgBGAAYTd29ybGR/AAECAwRhBQYEBQZ2YWx2YWwydmFsMwECAwQFBggAfwESAH8Afxk=").unwrap(); - let nested_objects_with_deletes = base64::decode("hW9Kg1G4LGoAvQIBEJSubXV2MUdBlah2/lbGXfUBmozh93gHSQmP+3KPhwFEbEUyMf+or+B4o6kgIh1j0IcIAQIDAhMDIwc1EUADQwJWAg4BBAIMEQgTDhUxIQIjCzQEQg5WD1ccgAEMgQECgwEEAgACAX4VA36fqKqGBgB+DkluaXRpYWxpemF0aW9uAH4AAX8AAgcAAxIAAAMGAgIJAgsCDQYPAAQFAAAHBQAAA34AAwQBAAZ+eRAEAX0FaGVsbG8EbGlzdARvYmoxAAZ6A2tleQRvYmoyA2tleQRvYmozA2tleQRsaXN0AAYVAAIBfgd6BQF/AgsBAwYGBn0BAgAHAXsAAQABAgYBf1YCAAYTejYARgBGAAYTd29ybGQBAgMEBQZ2YWx2YWwydmFsMwECAwQFBn8BAgB/AQQAfwEMAAMAfRYCfw==").unwrap(); - - let test2a = base64::decode("hW9KgzBGpZIAnQEBEI1ypR4ywkNNpp96l7zXTxUB6LDl3wzr1G2U8Iy19fzBzhdDdhnH/+FcM+KyKGuJPS8HAQIDAhMCIwY1EEACVgILAQQCBBMEFQghAiMCNAJCA1YDVwGAAQJ/AH8BfwJ/mMu4hgZ/DkluaXRpYWxpemF0aW9ufwB/BwABfwAAAX8BAAF/AH8EbGlzdAABAgACAQEBfgIBfgAUAQIA").unwrap(); - let test2b = base64::decode("hW9Kg5pvmycArwEBEI1ypR4ywkNNpp96l7zXTxUBeFm40CfXxlImmWuVOoPY8xAJeyUKW1oVoRZcamH3CjsIAQIDAhMDIwc1EUADQwJWAgwBBAIEEQQTBRUIIQIjAjQCQgRWBFcCgAECAgACAX4CAX6Yy7iGBgB+DkluaXRpYWxpemF0aW9uAH4AAX8AAgcAAQIAAAECAQACfwAAAX4AAn8EbGlzdAACAwADAQECfwICAX8AAhQBAgMA").unwrap(); - let test2c = base64::decode("hW9Kg8RtIrUAuQEBEI1ypR4ywkNNpp96l7zXTxUBnVTRJYAjAI4VFCHV/Sf8G/neum+KYZVmywMClPvNoZwIAQIDAhMEIwg1EkAEQwNWAgwBBAIEEQQTBhUIIQIjBTQCQgRWBFcDgAECAwADAX8CAgF/mMu4hgYCAH8OSW5pdGlhbGl6YXRpb24CAH8AAgF+AAEDBwABAwAAAQMBAAN/AAABAgB/An8EbGlzdAADBAB8AQN+AQEDfwIDAX8AAxQAAQIEAA==").unwrap(); - - let test2d = base64::decode("hW9Kg9VXZL4A0AEBEMwPa/zJ3Ewzr0WmHsBddIoBUvT34IK8sCqecfLDuuAmVuij0/OK4NO60JYIajJ5VKgIAQIDAhMEIwg1EkAEQwRWAg4BBAIEEQQTBxUIIQIjBjQEQgRWB1cEgAEGgQECgwECBAAEAX8CAwF/wNG4hgYDAH8OSW5pdGlhbGl6YXRpb24DAH8AAwF/AAIBBAcAAQQAAAEEAQADAgAAAQIAfgIAfwRsaXN0AAQFAHsBA34DfgECAQF/AgQBfwACFH4WFAABYgICAH8BAgB/AH8F").unwrap(); - let test2e = base64::decode("hW9KgzVDLxEA4gEBEMwPa/zJ3Ewzr0WmHsBddIoBTQS9F2q3aVXqmepEcgRu7fYg7X4JLpT48JQO1as/GxcIAQIDAhMGIwg1EkAEQwRWAg4BBAIEEQgTChUIIQIjCjQEQgRWCVcHgAEGgQECgwECBQAFAX8CAwF/A3/A0biGBgQAfw5Jbml0aWFsaXphdGlvbgQAfwAEAX8AAwEFBwABBwAAAQcBAAIDAAABAgAAAXkABAIBeQIAfwRsaXN0AAcIAH0BAwICAX16A34BBQEBfwIHAX4AFAMWfRQWFAB4eXoBYgIFAH8BAgB/AH8F").unwrap(); - let test2f = base64::decode("hW9Kg8lkGKoA6wEBEMwPa/zJ3Ewzr0WmHsBddIoBOJQny6rv0rp5VuaCBRuBEGkSi9rKJ+BA/xkHhXtXD0AIAQIDAhMHIwg1EkAEQwRWAg4BBAIEEQgTCxUIIQIjDDQEQgRWDFcJgAEGgQECgwECBgAGAX8CAwF+AwJ/wNG4hgYFAH8OSW5pdGlhbGl6YXRpb24FAH8ABQF/AAQBBgcAAQkAAAEJAQAEAwAAAQIAAAEDAHoEAgF5AgB/BGxpc3QACQoAewEJf3sCAgF9egN+AQcBAX8CCQF/AAIWfxQDFn0UFhRycQB4eXoBYgIHAH8BAgB/AH8F").unwrap(); - let test2g = base64::decode("hW9Kg8+YqnIA9AEBEMwPa/zJ3Ewzr0WmHsBddIoB5tFFgKkrur3AcdnC+OV5y08zXGq1Eaa/L8JLu9JZtVoIAQIDAhMIIwg1EkAEQwRWAg4BBAIEEQgTDRUIIQIjDjQEQgRWDlcLgAEGgQECgwECBwAHAX8CAwF/AwICf8DRuIYGBgB/DkluaXRpYWxpemF0aW9uBgB/AAYBfwAFAQcHAAELAAABCwEABAMAAAEEAAABAwB4BAIBeQIAAQh/BGxpc3QACwwAewEJf3sCAgF7egN+CAEBBwEDfwILAX8AAhZ/FAMWfRQWFAIWcnEAeHl6AWICc3QHAH8BBAB/AH8F").unwrap(); - - compare_backends(simple_list); - compare_backends(test1a); - compare_backends(test1b); - compare_backends(test1c); - compare_backends(test1d); - compare_backends(test2a); - compare_backends(test2b); - compare_backends(test2c); - compare_backends(test2d); - compare_backends(test2e); - compare_backends(test2f); - compare_backends(test2g); - compare_backends(nested_objects_and_list_inserts2); - compare_backends(nested_objects_with_deletes); - } -} diff --git a/automerge-backend/src/object_store.rs b/automerge-backend/src/object_store.rs deleted file mode 100644 index 2241706a..00000000 --- a/automerge-backend/src/object_store.rs +++ /dev/null @@ -1,111 +0,0 @@ -use std::collections::HashMap; - -use automerge_protocol as amp; -use fxhash::FxBuildHasher; - -use crate::{ - actor_map::ActorMap, - concurrent_operations::ConcurrentOperations, - internal::{ElementId, Key, OpId}, - op_handle::OpHandle, - ordered_set::{OrderedSet, SkipList}, -}; - -/// ObjectHistory is what the OpSet uses to store operations for a particular -/// key, they represent the two possible container types in automerge, a map or -/// a sequence (tables and text are effectively the maps and sequences -/// respectively). - -/// Stores operations on map objects -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct ObjState { - pub props: HashMap, - pub obj_type: amp::ObjType, - pub inbound: Option, - pub following: HashMap, FxBuildHasher>, - pub insertions: HashMap, - pub seq: SkipList, -} - -impl ObjState { - pub fn new(obj_type: amp::ObjType) -> ObjState { - let mut following = HashMap::default(); - following.insert(ElementId::Head, Vec::new()); - ObjState { - props: HashMap::default(), - following, - insertions: HashMap::default(), - obj_type, - inbound: None, - seq: SkipList::new(), - } - } - - pub fn is_seq(&self) -> bool { - self.obj_type.is_sequence() - } - - fn get_parent(&self, id: &ElementId) -> Option { - self.insertions.get(id).and_then(|i| i.key.as_element_id()) - } - - fn insertions_after(&self, parent: &ElementId) -> Vec { - self.following.get(parent).cloned().unwrap_or_default() - } - - pub fn conflicts(&self, key: &Key) -> impl Iterator { - self.props.get(key).into_iter().flat_map(|i| i.iter()) - } - - #[tracing::instrument(level = "debug", skip(self))] - pub fn index_of(&self, id: OpId) -> Option { - let mut prev_id = id.into(); - let mut index = None; - // reverse walk through the following/insertions and looking for something that not deleted - while index.is_none() { - prev_id = match self.get_previous(&prev_id) { - Some(p) => p, - None => return None, - }; - match prev_id { - ElementId::Id(id) => { - // FIXME maybe I can speed this up with self.props.get before looking for - index = self.seq.index_of(&id); - } - ElementId::Head => return None, - } - } - index.map(|i| i + 1) - } - - fn get_previous(&self, element: &ElementId) -> Option { - let parent_id = match self.get_parent(element) { - Some(p) => p, - None => return None, - }; - let children = self.insertions_after(&parent_id); - let pos = match children.iter().position(|k| k == element) { - Some(p) => p, - None => return None, - }; - if pos == 0 { - Some(parent_id) - } else { - let mut prev_id = children[pos - 1]; // FIXME - use refs here - loop { - match self.insertions_after(&prev_id).last() { - Some(id) => prev_id = *id, - None => return Some(prev_id), - } - } - } - } - - pub fn insert_after(&mut self, elem: ElementId, op: OpHandle, actors: &ActorMap) { - let eid = op.id.into(); - self.insertions.insert(eid, op); - let following = self.following.entry(elem).or_default(); - following.push(eid); - following.sort_unstable_by(|a, b| actors.cmp(b, a)); - } -} diff --git a/automerge-backend/src/op_handle.rs b/automerge-backend/src/op_handle.rs deleted file mode 100644 index 46129501..00000000 --- a/automerge-backend/src/op_handle.rs +++ /dev/null @@ -1,109 +0,0 @@ -use std::{ - fmt, - hash::{Hash, Hasher}, - ops::Deref, -}; - -use automerge_protocol as amp; - -use crate::{ - actor_map::ActorMap, - internal::{InternalOp, InternalOpType, Key, ObjectId, OpId}, - Change, -}; - -#[derive(Clone)] -pub(crate) struct OpHandle { - pub id: OpId, - pub op: InternalOp, - pub delta: i64, -} - -impl OpHandle { - pub fn extract(change: &Change, actors: &mut ActorMap) -> Vec { - let mut opnum = change.start_op; - change - .iter_ops() - .map(|op| { - let internal_op = actors.import_op(op); - let id = OpId(opnum, actors.import_actor(change.actor_id())); - opnum += 1; - OpHandle { - id, - op: internal_op, - delta: 0, - } - }) - .collect() - } - - pub fn adjusted_value(&self) -> amp::ScalarValue { - match &self.action { - InternalOpType::Set(amp::ScalarValue::Counter(a)) => { - amp::ScalarValue::Counter(a + self.delta) - } - InternalOpType::Set(val) => val.clone(), - _ => amp::ScalarValue::Null, - } - } - - pub fn child(&self) -> Option { - match &self.action { - InternalOpType::Make(_) => Some(self.id.into()), - _ => None, - } - } - - pub fn operation_key(&self) -> Key { - if self.insert { - self.id.into() - } else { - self.key.clone() - } - } - - pub fn maybe_increment(&mut self, inc: &OpHandle) -> bool { - if let InternalOpType::Inc(amount) = inc.action { - if inc.pred.contains(&self.id) { - if let InternalOpType::Set(amp::ScalarValue::Counter(_)) = self.action { - self.delta += amount; - return true; - } - } - } - false - } -} - -impl fmt::Debug for OpHandle { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OpHandle") - .field("id", &self.id) - .field("action", &self.action) - .field("obj", &self.obj) - .field("key", &self.key) - .finish() - } -} - -impl Hash for OpHandle { - fn hash(&self, state: &mut H) { - self.id.hash(state); - } -} - -impl PartialEq for OpHandle { - fn eq(&self, other: &Self) -> bool { - self.id.eq(&other.id) - } -} - -impl Eq for OpHandle {} - -impl Deref for OpHandle { - type Target = InternalOp; - - fn deref(&self) -> &Self::Target { - &self.op - } -} diff --git a/automerge-backend/src/op_set.rs b/automerge-backend/src/op_set.rs deleted file mode 100644 index 34adea7b..00000000 --- a/automerge-backend/src/op_set.rs +++ /dev/null @@ -1,349 +0,0 @@ -//! The OpSet is where most of the interesting work is done in this library. -//! It maintains a mapping from each object ID to a set of concurrent -//! operations which have been seen for that object ID. -//! -//! When the client requests the value of the CRDT (via -//! document::state) the implementation fetches the root object ID's history -//! and then recursively walks through the tree of histories constructing the -//! state. Obviously this is not very efficient. -use std::collections::{HashMap, HashSet}; - -use automerge_protocol as amp; -use fxhash::FxBuildHasher; -use tracing::instrument; - -use crate::{ - actor_map::ActorMap, - error::AutomergeError, - internal::{InternalOpType, Key, ObjectId}, - object_store::ObjState, - op_handle::OpHandle, - ordered_set::OrderedSet, - patches::{IncrementalPatch, PatchWorkshop}, - Change, -}; - -/// The OpSet manages an ObjectStore, and a queue of incoming changes in order -/// to ensure that operations are delivered to the object store in causal order -/// -/// Whenever a new change is received we iterate through any causally ready -/// changes in the queue and apply them to the object store, then repeat until -/// there are no causally ready changes left. The end result of this is that -/// the object store will contain sets of concurrent operations for each object -/// ID or element ID. -/// -/// When we want to get the state of the CRDT we walk through the -/// object store, starting with the root object ID and constructing the value -/// at each node by examining the concurrent operations which are active for -/// that node. -/// - -#[derive(Debug, PartialEq, Clone)] -pub(crate) struct OpSet { - pub objs: HashMap, - pub deps: HashSet, - pub max_op: u64, - cursors: HashMap>, -} - -impl Default for OpSet { - fn default() -> Self { - Self::new() - } -} - -impl OpSet { - pub fn new() -> OpSet { - let mut objs = HashMap::default(); - objs.insert(ObjectId::Root, ObjState::new(amp::ObjType::Map)); - - OpSet { - objs, - max_op: 0, - deps: HashSet::default(), - cursors: HashMap::new(), - } - } - - pub(crate) fn apply_ops( - &mut self, - ops: Vec, - patch: &mut IncrementalPatch, - actors: &mut ActorMap, - ) -> Result<(), AutomergeError> { - for op in ops { - self.apply_op(op, actors, patch)?; - } - self.update_cursors(patch); - Ok(()) - } - - pub fn heads(&self) -> Vec { - let mut deps: Vec<_> = self.deps.iter().copied().collect(); - deps.sort_unstable(); - deps - } - - #[instrument(level = "debug", skip(self))] - fn apply_op( - &mut self, - op: OpHandle, - actors: &mut ActorMap, - patch: &mut IncrementalPatch, - ) -> Result<(), AutomergeError> { - if let (Some(child), Some(obj_type)) = (op.child(), op.obj_type()) { - //let child = actors.import_obj(child); - self.objs.insert(child, ObjState::new(obj_type)); - } - - if let InternalOpType::Set(amp::ScalarValue::Cursor(ref oid)) = op.op.action { - tracing::debug!(referred_opid=?oid, "Adding cursor"); - let internal_opid = actors.import_opid(oid); - let mut target_found = false; - for (obj_id, obj) in &self.objs { - if obj.insertions.contains_key(&internal_opid.into()) { - target_found = true; - self.cursors.entry(*obj_id).or_default().push(CursorState { - referring_object_id: actors.export_obj(&op.obj), - internal_referring_object_id: op.obj, - key: op.key.clone(), - element_opid: oid.clone(), - internal_element_opid: internal_opid, - index: obj.index_of(internal_opid).unwrap_or(0), - referred_object_id: actors.export_obj(obj_id), - internal_referred_object_id: *obj_id, - }); - } - } - if !target_found { - return Err(AutomergeError::InvalidCursor { opid: oid.clone() }); - } - } - - let object_id = op.obj; - let object = self.get_obj_mut(&object_id)?; - - let overwritten = if object.is_seq() { - if op.insert { - object.insert_after( - op.key.as_element_id().ok_or(AutomergeError::MapKeyInSeq)?, - op.clone(), - actors, - ); - } - - let ops = object.props.entry(op.operation_key()).or_default(); - let before = !ops.is_empty(); - let (op, overwritten_ops) = ops.incorporate_new_op(op)?; - let after = !ops.is_empty(); - - match (before, after) { - (true, true) => { - tracing::debug!("updating existing element"); - let opid = op - .operation_key() - .to_opid() - .ok_or(AutomergeError::HeadToOpId)?; - let ops = ops.clone(); - let index = object.index_of(opid).unwrap_or(0); - - patch.record_seq_updates(&object_id, object, index, ops.iter(), actors); - } - (true, false) => { - let opid = op - .operation_key() - .to_opid() - .ok_or(AutomergeError::HeadToOpId)?; - let index = object.seq.remove_key(&opid).unwrap(); - tracing::debug!(opid=?opid, index=%index, "deleting element"); - patch.record_seq_remove(&object_id, op.clone(), index); - } - (false, true) => { - let id = op - .operation_key() - .to_opid() - .ok_or(AutomergeError::HeadToOpId)?; - let index = object.index_of(id).unwrap_or(0); - tracing::debug!(new_id=?id, index=%index, after=?op.operation_key(), "inserting new element"); - object.seq.insert_index(index, id); - patch.record_seq_insert(&object_id, op.clone(), index, op.id); - } - (false, false) => {} - }; - - self.unlink(&op, &overwritten_ops)?; - - overwritten_ops - } else { - let ops = object.props.entry(op.key.clone()).or_default(); - let before = !ops.is_empty(); - let (op, overwritten_ops) = ops.incorporate_new_op(op)?; - let after = !ops.is_empty(); - self.unlink(&op, &overwritten_ops)?; - - if before || after { - patch.record_set(&object_id, op); - } - overwritten_ops - }; - - for op in overwritten { - if let InternalOpType::Set(amp::ScalarValue::Cursor(ref oid)) = op.op.action { - if let Some(opids) = self.cursors.get_mut(&op.op.obj) { - opids.retain(|o| o.element_opid != *oid); - } - } - } - Ok(()) - } - - fn unlink(&mut self, op: &OpHandle, overwritten: &[OpHandle]) -> Result<(), AutomergeError> { - if let Some(child) = op.child() { - self.get_obj_mut(&child)?.inbound = Some(op.clone()); - } - - for old in overwritten.iter() { - if let Some(child) = old.child() { - self.get_obj_mut(&child)?.inbound = None; - } - } - Ok(()) - } - - pub fn get_obj(&self, object_id: &ObjectId) -> Result<&ObjState, AutomergeError> { - self.objs - .get(object_id) - .ok_or(AutomergeError::MissingObjectError) - } - - fn get_obj_mut(&mut self, object_id: &ObjectId) -> Result<&mut ObjState, AutomergeError> { - self.objs - .get_mut(object_id) - .ok_or(AutomergeError::MissingObjectError) - } - - /// Update any cursors which will be affected by the changes in `pending` - /// and add the changed cursors to `pending` - fn update_cursors(&mut self, patch: &mut IncrementalPatch) { - // For each cursor, if the cursor references an object which has been changed we generate a - // diff for the cursor - if self.cursors.is_empty() { - return; - } - - let mut cursor_changes: HashMap> = HashMap::new(); - for obj_id in patch.changed_object_ids() { - if let Some(cursors) = self.cursors.get_mut(obj_id) { - for cursor in cursors.iter_mut() { - if let Some(obj) = self.objs.get(&cursor.internal_referred_object_id) { - cursor.index = obj.index_of(cursor.internal_element_opid).unwrap_or(0); - cursor_changes - .entry(cursor.internal_referring_object_id) - .or_default() - .push(cursor.key.clone()) - } - } - } - } - for (obj_id, keys) in cursor_changes { - for key in keys { - patch.record_cursor_change(&obj_id, key) - } - } - } - - pub fn update_deps(&mut self, change: &Change) { - //self.max_op = max(self.max_op, change.max_op()); - - for d in &change.deps { - self.deps.remove(d); - } - self.deps.insert(change.hash); - } - - pub(crate) fn patch_workshop<'a>(&'a self, actors: &'a ActorMap) -> impl PatchWorkshop + 'a { - PatchWorkshopImpl { - opset: self, - actors, - } - } -} - -/// `CursorState` is the information we need to track in order to update cursors as changes come -/// in. Cursors are created by `Set` operations and therefore live in a particular object (the -/// "referring object") and point at an element in a sequence (the "referred" object). For example -/// this operation: -/// -/// ```json -/// { -/// "action": "set", -/// "obj": "_root", -/// "key": "a_cursor", -/// "refObjectId": "1@222" -/// } -/// ``` -/// -/// Creates a cursor in the root object under the "a_cursor" key which points at element "1@222". -/// When we process a set operation which is a cursor we find the object which contains "1@222" and -/// populate this `CursorState`. -/// -/// Note that several fields are duplicated for internal and `automerge_protocol` types. This is -/// because we need to compare those fields against internal types when processing cursors, but we -/// need to create patches which use the `automerge_protocol` types. -#[derive(Debug, PartialEq, Clone)] -struct CursorState { - /// The id of the object this cursor lives in - referring_object_id: amp::ObjectId, - /// The same as `referring_object_id` but as an internal::ObjectID - internal_referring_object_id: ObjectId, - /// The key withing the referring object this cursor lives at - key: crate::internal::Key, - /// The id of the sequence this cursor refers - referred_object_id: amp::ObjectId, - /// The same as the `referred_object_id` but as an internal::ObjectID - internal_referred_object_id: ObjectId, - /// The OpID of the element within the sequence this cursor refers to - element_opid: amp::OpId, - /// The same as the `element_opid` but as an internal::OpID, - internal_element_opid: crate::internal::OpId, - index: usize, -} - -/// Implementation of `patches::PatchWorkshop` to pass to the various patch -/// generation mechanisms, defined here to avoid having to make members of the -/// OpSet public. -struct PatchWorkshopImpl<'a> { - opset: &'a OpSet, - actors: &'a ActorMap, -} - -impl<'a> PatchWorkshop for PatchWorkshopImpl<'a> { - fn get_obj(&self, object_id: &ObjectId) -> Option<&ObjState> { - self.opset.get_obj(object_id).ok() - } - - fn find_cursor(&self, opid: &::OpId) -> Option { - self.opset - .cursors - .values() - .flatten() - .find(|c| c.element_opid == *opid) - .map(|c| amp::CursorDiff { - object_id: c.referred_object_id.clone(), - index: c.index as u32, - elem_id: opid.clone(), - }) - } - - fn key_to_string(&self, key: &crate::internal::Key) -> String { - self.actors.key_to_string(key) - } - - fn make_external_opid(&self, opid: &crate::internal::OpId) -> amp::OpId { - self.actors.export_opid(opid) - } - - fn make_external_objid(&self, object_id: &ObjectId) -> amp::ObjectId { - self.actors.export_obj(object_id) - } -} diff --git a/automerge-backend/src/ordered_set.rs b/automerge-backend/src/ordered_set.rs deleted file mode 100644 index cdebe87f..00000000 --- a/automerge-backend/src/ordered_set.rs +++ /dev/null @@ -1,897 +0,0 @@ -#![allow(dead_code)] - -use std::{ - cmp::{max, min}, - collections::HashMap, - fmt::Debug, - hash::Hash, - iter::Iterator, - mem, - ops::AddAssign, -}; - -use fxhash::FxBuildHasher; -use rand::{rngs::SmallRng, Rng, SeedableRng}; - -#[derive(Debug, Copy, Clone, PartialEq)] -struct Link -where - K: Clone + Copy + Debug + PartialEq, -{ - key: Option, - count: usize, -} - -#[derive(Debug, Clone, PartialEq)] -struct LinkLevel -where - K: Copy + Clone + Debug + PartialEq, -{ - next: Link, - prev: Link, -} - -#[derive(Debug, Clone, PartialEq)] -struct Node -where - K: Copy + Clone + Debug + PartialEq, -{ - level: usize, - links: Vec>, - // IDEA: can I make this an unsized array?? - // IDEA - Node could be Node(Vec) -} - -impl AddAssign for Link -where - K: Copy + Clone + Debug + PartialEq, -{ - fn add_assign(&mut self, other: Self) { - self.key = other.key; - self.count += other.count; - } -} - -impl Node -where - K: Debug + Copy + Clone + PartialEq, -{ - fn successor(&self) -> Option<&K> { - if self.links.is_empty() { - None - } else { - self.links[0].next.key.as_ref() - } - } - - fn remove_node_after(&mut self, from_level: usize, removed_level: usize, links: &[Link]) { - for (level, link) in links.iter().enumerate().take(self.level).skip(from_level) { - if level < removed_level { - self.links[level].next = *link; - } else { - self.links[level].next.count -= 1; - } - } - } - - fn remove_node_before(&mut self, from_level: usize, removed_level: usize, links: &[Link]) { - for (level, link) in links.iter().enumerate().take(self.level).skip(from_level) { - if level < removed_level { - self.links[level].prev = *link; - } else { - self.links[level].prev.count -= 1; - } - } - } - - fn insert_node_after( - &mut self, - new_key: &K, - new_level: usize, - from_level: usize, - distance: usize, - is_head: bool, - ) { - if new_level > self.level && !is_head { - panic!("Cannot increase the level of a non-head node") - } - self.level = max(self.level, new_level); - - for level in from_level..self.level { - if level < new_level { - let next = Link { - key: Some(*new_key), - count: distance, - }; - let prev = Link { - key: None, - count: 0, - }; - if self.links.len() == level { - self.links.push(LinkLevel { next, prev }); - } else { - self.links[level].next = next; - } - } else { - self.links[level].next.count += 1; - } - } - } - - fn insert_node_before( - &mut self, - new_key: &K, - new_level: usize, - from_level: usize, - distance: usize, - ) { - if new_level > self.level { - panic!("Cannot increase the level on insert_node_before") - } - for level in from_level..self.level { - if level < new_level { - self.links[level].prev = Link { - key: Some(*new_key), - count: distance, - }; - } else { - self.links[level].prev.count += 1; - } - } - } -} - -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct VecOrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - keys: Vec, -} - -impl VecOrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - pub fn new() -> VecOrderedSet { - VecOrderedSet { keys: Vec::new() } - } -} - -pub trait OrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - fn index_of(&self, key: &K) -> Option; - fn remove_key(&mut self, key: &K) -> Option; - fn insert_index(&mut self, index: usize, key: K) -> bool; - fn remove_index(&mut self, index: usize) -> Option; - fn key_of(&self, index: usize) -> Option<&K>; -} - -impl OrderedSet for SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - fn remove_index(&mut self, index: usize) -> Option { - let key = self.key_of(index).copied(); - if let Some(ref k) = &key { - self.remove(k); - } - key - } - - fn remove_key(&mut self, key: &K) -> Option { - let index = self.index_of(key); - if index.is_some() { - self.remove(key); - } - index - } - - fn key_of(&self, index: usize) -> Option<&K> { - if index >= self.len { - return None; - } - let target = index + 1; - let mut node = &self.head; - let mut level = node.level - 1; - let mut count = 0; - loop { - while count + node.links[level].next.count > target { - level -= 1 - } - count += node.links[level].next.count; - let k = node.links[level].next.key.as_ref(); - if count == target { - return k; - } - node = self.get_node(k) - } - } - - fn index_of(&self, key: &K) -> Option { - let mut count = 0; - let mut key = key; - loop { - if let Some(node) = self.nodes.get(key) { - let link = &node.links[node.level - 1].prev; - count += link.count; - if let Some(ref k) = &link.key { - key = k; - } else { - break; - } - } else { - return None; - } - } - Some(count - 1) - } - - fn insert_index(&mut self, index: usize, key: K) -> bool { - if index == 0 { - self.insert_head(key) - } else { - self.key_of(index - 1) - .copied() - .map_or(false, |suc| self.insert_after(&suc, key)) - } - } -} - -impl OrderedSet for VecOrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - fn remove_index(&mut self, index: usize) -> Option { - if self.keys.len() > index { - let k = self.keys.remove(index); - Some(k) - } else { - None - } - } - - fn key_of(&self, index: usize) -> Option<&K> { - self.keys.get(index) - } - - fn index_of(&self, key: &K) -> Option { - self.keys.iter().position(|o| o == key) - } - - fn insert_index(&mut self, index: usize, key: K) -> bool { - self.keys.insert(index, key); - true - } - - fn remove_key(&mut self, key: &K) -> Option { - if let Some(index) = self.keys.iter().position(|o| o == key) { - self.keys.remove(index); - Some(index) - } else { - None - } - } -} - -impl Default for SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - fn default() -> Self { - Self::new() - } -} - -impl Default for VecOrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - fn default() -> Self { - Self::new() - } -} - -impl<'a, K> IntoIterator for &'a VecOrderedSet -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - type Item = &'a K; - type IntoIter = std::slice::Iter<'a, K>; - - fn into_iter(self) -> std::slice::Iter<'a, K> { - self.keys.as_slice().iter() - } -} - -impl<'a, K> IntoIterator for &'a SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - type Item = &'a K; - type IntoIter = SkipIterator<'a, K>; - - fn into_iter(self) -> Self::IntoIter { - SkipIterator { - id: self.head.successor(), - nodes: &self.nodes, - } - } -} - -#[derive(Debug, Clone)] -pub(crate) struct SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - nodes: HashMap, FxBuildHasher>, - head: Node, - rng: SmallRng, - pub len: usize, -} - -impl PartialEq for SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - fn eq(&self, other: &Self) -> bool { - self.nodes.eq(&other.nodes) - } -} - -impl SkipList -where - K: Copy + Clone + Debug + Hash + PartialEq + Eq, -{ - pub fn new() -> SkipList { - let nodes = HashMap::default(); - let head = Node { - links: Vec::new(), - level: 1, - //is_head: true, - }; - let len = 0; - let rng = SmallRng::seed_from_u64(0); - SkipList { - nodes, - head, - rng, - len, - } - } - - fn remove(&mut self, key: &K) { - let removed = self - .nodes - .remove(key) - .unwrap_or_else(|| panic!("The given key cannot be removed because it does not exist")); - - let max_level = self.head.level; - let mut pre = self.predecessors(removed.links[0].prev.key.as_ref(), max_level); - let mut suc = self.successors(removed.links[0].next.key.as_ref(), max_level); - - for i in 0..max_level { - let distance = pre[i].count + suc[i].count - 1; - pre[i].count = distance; - suc[i].count = distance; - } - - self.len -= 1; - let mut pre_level = 0; - let mut suc_level = 0; - - for level in 1..=max_level { - let update_level = min(level, removed.level); - if level == max_level - || pre.get(level).map(|l| &l.key) != pre.get(pre_level).map(|l| &l.key) - { - self.get_node_mut(pre[pre_level].key.as_ref()) - .remove_node_after(pre_level, update_level, &suc); - pre_level = level; - } - if suc[suc_level].key.is_some() - && (level == max_level - || suc.get(level).map(|l| &l.key) != suc.get(suc_level).map(|l| &l.key)) - { - self.get_node_mut(suc[suc_level].key.as_ref()) - .remove_node_before(suc_level, update_level, &pre); - suc_level = level; - } - } - } - - fn get_node(&self, key: Option<&K>) -> &Node { - if let Some(k) = key { - self.nodes - .get(k) - .unwrap_or_else(|| panic!("get_node - missing key {:?}", key)) - } else { - &self.head - } - } - - fn get_node_mut(&mut self, key: Option<&K>) -> &mut Node { - if let Some(k) = key { - self.nodes - .get_mut(k) - .unwrap_or_else(|| panic!("get_node - missing key {:?}", key)) - } else { - &mut self.head - } - } - - // IDEA: Can i merge the successors and predecessors into a singlue unified function - // so we dont need to zip the results? - fn predecessors(&self, predecessor: Option<&K>, max_level: usize) -> Vec> { - let mut pre = Vec::with_capacity(max_level); - pre.push(Link { - key: predecessor.copied(), - count: 1, - }); - - for level in 1..max_level { - let mut link = pre[level - 1]; - while link.key.is_some() { - let node = self.get_node(link.key.as_ref()); - if node.level > level { - break; - } - if node.level < level { - panic!("Level lower than expected"); - } - link += node.links[level - 1].prev; - } - pre.push(link); - } - pre - } - - fn successors(&self, successor: Option<&K>, max_level: usize) -> Vec> { - let mut suc = Vec::with_capacity(max_level); - suc.push(Link { - key: successor.copied(), - count: 1, - }); - - for level in 1..max_level { - let mut link = suc[level - 1]; - while link.key.is_some() { - let node = self.get_node(link.key.as_ref()); - if node.level > level { - break; - } - if node.level < level { - panic!("Level lower than expected"); - } - link += node.links[level - 1].next; - } - suc.push(link); - } - suc - } - - pub fn insert_head(&mut self, key: K) -> bool { - self.insert(None, key) - } - - pub fn insert_after(&mut self, predecessor: &K, key: K) -> bool { - // TODO add check that `predecessor` is actually in the list and is not identical to `K`. - // The latter point is especially important as allowing cycles leads to an infinite loop in - // `ObjState.index_of` - self.insert(Some(predecessor), key) - } - - fn insert(&mut self, predecessor: Option<&K>, key: K) -> bool { - if self.nodes.contains_key(&key) { - return false; - } - - let new_level = self.random_level(); - let max_level = max(new_level, self.head.level); - let successor = self.get_node(predecessor).successor(); - let mut pre = self.predecessors(predecessor, max_level); - let mut suc = self.successors(successor, max_level); - - self.len += 1; - - let mut pre_level = 0; - let mut suc_level = 0; - for level in 1..=max_level { - let update_level = min(level, new_level); - if level == max_level - || pre.get(level).map(|l| &l.key) != pre.get(pre_level).map(|l| &l.key) - { - self.get_node_mut(pre[pre_level].key.as_ref()) - .insert_node_after( - &key, - update_level, - pre_level, - pre[pre_level].count, - pre[pre_level].key.is_none(), - ); - pre_level = level; - } - if suc[suc_level].key.is_some() - && (level == max_level - || suc.get(level).map(|l| &l.key) != suc.get(suc_level).map(|l| &l.key)) - { - self.get_node_mut(suc[suc_level].key.as_ref()) - .insert_node_before(&key, update_level, suc_level, suc[suc_level].count); - suc_level = level; - } - } - - pre.truncate(new_level); - suc.truncate(new_level); - let links = pre - .into_iter() - .zip(suc.into_iter()) - .map(|(prev, next)| LinkLevel { next, prev }) - .collect(); - self.nodes.insert( - key, - Node { - level: new_level, - links, - }, - ); - true - } - - // Returns a random number from the geometric distribution with p = 0.75. - // That is, returns k with probability p * (1 - p)^(k - 1). - // For example, returns 1 with probability 3/4, returns 2 with probability 3/16, - // returns 3 with probability 3/64, and so on. - - fn random_level(&mut self) -> usize { - // Create random number between 0 and 2^32 - 1 - // Count leading zeros in that 32-bit number - let rand: u32 = self.rng.gen(); - let mut level = 1; - while rand < 1 << (32 - 2 * level) && level < 16 { - level += 1 - } - level - } -} - -pub(crate) struct SkipIterator<'a, K> -where - K: Debug + Copy + Clone + PartialEq, -{ - id: Option<&'a K>, - nodes: &'a HashMap, FxBuildHasher>, -} - -impl<'a, K> Iterator for SkipIterator<'a, K> -where - K: Debug + Copy + Clone + Hash + PartialEq + Eq, -{ - type Item = &'a K; - - fn next(&mut self) -> Option<&'a K> { - let mut successor = match self.id { - None => None, - Some(key) => self.nodes.get(key).and_then(Node::successor), - }; - mem::swap(&mut successor, &mut self.id); - successor - } -} - -#[derive(Debug, Clone, PartialEq)] -struct Delta -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - index: isize, - key: Option, -} - -// this is an experiment to if I can change request processing -// index lookups by not mutating the skip list -// throughput was quite significant actually - about 1.5x over in the -// mass edit perf test -// ideally we can speed up the skip list enough to not need this -// also this could perform worse if the ops per change were huge -// eg.. 10,000 changes with 10 ops each vs 10 changes with 10,000 ops each - -/* -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct OrdDelta<'a, K> -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - list: Option<&'a SkipList>, - delta: Vec>, -} - -impl<'a, K> OrdDelta<'a, K> -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - pub fn new(list: Option<&'a SkipList>) -> OrdDelta<'a, K> { - OrdDelta { - list, - delta: Vec::new(), - } - } -} - -impl<'a, K> OrderedSet for OrdDelta<'a, K> -where - K: Clone + Debug + Hash + PartialEq + Eq, -{ - fn insert_index(&mut self, index: usize, key: K) -> bool { - let index = index as isize; - let delta = Delta { - index, - key: Some(key), - }; - for i in 0..self.delta.len() { - if self.delta[i].index >= index { - self.delta.iter_mut().skip(i).for_each(|d| d.index += 1); - self.delta.insert(i, delta); - return true; - } - } - self.delta.push(delta); - true - } - - fn key_of(&self, index: usize) -> Option<&K> { - let index = index as isize; - let mut acc: isize = 0; - for i in 0..self.delta.len() { - match &self.delta[i] { - Delta { - index: j, - key: Some(key), - } => { - if j == &index { - return Some(&key); - } - if j > &index { - break; - } - acc += 1; - } - Delta { - index: j, - key: None, - } => { - if j > &index { - break; - } - acc -= 1; - } - } - } - self.list - .and_then(|l| l.key_of((index as isize - acc) as usize)) - } - - fn remove_index(&mut self, index: usize) -> Option { - let index = index as isize; - let delta = Delta { index, key: None }; - for i in 0..self.delta.len() { - if self.delta[i].index == index && self.delta[i].key.is_some() { - let old_insert = self.delta.remove(i); - self.delta.iter_mut().skip(i).for_each(|d| d.index -= 1); - return old_insert.key; - } - if self.delta[i].index > index { - let key = self.key_of(index as usize).cloned(); - self.delta.iter_mut().skip(i).for_each(|d| d.index -= 1); - self.delta.insert(i, delta); - return key; - } - } - let key = self.key_of(index as usize).cloned(); - self.delta.push(delta); - key - } - - fn index_of(&self, _key: &K) -> Option { - panic!("not implemented"); - } - - fn remove_key(&mut self, _key: &K) -> Option { - panic!("not implemented"); - } -} -*/ - -// get(n) -// insert(n) -// len() -// remove(n) -// get_index_for(T) -// insert_after_(i,K,V) - -#[cfg(test)] -mod tests { - use super::*; - //use std::str::FromStr; - - #[test] - fn test_index_of() { - let mut s = SkipList::<&str>::new(); - - // should return None on an empty list - assert_eq!(s.index_of(&"foo"), None); - - // should return None for a nonexistent key - s.insert_head("foo"); - assert_eq!(s.index_of(&"baz"), None); - - // should return 0 for the first list element - assert_eq!(s.index_of(&"foo"), Some(0)); - - // should return length-1 for the last list element - s.insert_after(&"foo", "bar"); - s.insert_after(&"bar", "baz"); - assert_eq!(s.index_of(&"baz"), Some(s.len - 1)); - - // should adjust based on removed elements - s.remove_key(&"foo"); - assert_eq!(s.index_of(&"bar"), Some(0)); - assert_eq!(s.index_of(&"baz"), Some(1)); - s.remove_key(&"bar"); - assert_eq!(s.index_of(&"baz"), Some(0)); - } - - #[test] - fn test_len() { - let mut s = SkipList::<&str>::new(); - - //should be 0 for an empty list - assert_eq!(s.len, 0); - - // should increase by 1 for every insertion - s.insert_head("a3"); - s.insert_head("a2"); - s.insert_head("a1"); - assert_eq!(s.len, 3); - - //should decrease by 1 for every removal - s.remove_key(&"a2"); - assert_eq!(s.len, 2); - } - - #[test] - fn test_key_of() { - let mut s = SkipList::<&str>::new(); - - // should return None on an empty list - assert_eq!(s.key_of(0), None); - - // should return None for an index past the end of the list - s.insert_head("a3"); - s.insert_head("a2"); - s.insert_head("a1"); - assert_eq!(s.key_of(10), None); - - // should return the first key for index 0 - assert_eq!(s.key_of(0), Some(&"a1")); - - // should return the last key for index -1 - // assert_eq!(s.key_of(-1), Some("a3")); - - // should return the last key for index length-1 - assert_eq!(s.key_of(s.len - 1), Some(&"a3")); - - // should not count removed elements - s.remove_key(&"a1"); - s.remove_key(&"a3"); - assert_eq!(s.key_of(0), Some(&"a2")); - } - - #[test] - fn test_insert_index() { - let mut s = SkipList::<&str>::new(); - - // should insert the new key-value pair at the given index - s.insert_head("aaa"); - s.insert_after(&"aaa", "ccc"); - s.insert_index(1, "bbb"); - assert_eq!(s.index_of(&"aaa"), Some(0)); - assert_eq!(s.index_of(&"bbb"), Some(1)); - assert_eq!(s.index_of(&"ccc"), Some(2)); - - // should insert at the head if the index is zero - s.insert_index(0, "a"); - assert_eq!(s.key_of(0), Some(&"a")); - } - - #[test] - fn test_remove_index() { - let mut s = SkipList::<&str>::new(); - - // should remove the value at the given index - s.insert_head("ccc"); - s.insert_head("bbb"); - s.insert_head("aaa"); - s.remove_index(1); - assert_eq!(s.index_of(&"aaa"), Some(0)); - assert_eq!(s.index_of(&"bbb"), None); - assert_eq!(s.index_of(&"ccc"), Some(1)); - - // should raise an error if the given index is out of bounds - assert_eq!(s.remove_index(100), None); - } - - #[test] - fn test_remove_key_big() { - //String is not Copy so we have to create our elements first and then insert them - let elems: Vec = (0..10000) - .map(|i| { - let j = 9999 - i; - format!("a{}", j) - }) - .collect(); - - let mut s = SkipList::<&str>::new(); - for elem in &elems { - s.insert_head(elem); - } - - assert_eq!(s.index_of(&"a20"), Some(20)); - assert_eq!(s.index_of(&"a500"), Some(500)); - assert_eq!(s.index_of(&"a1000"), Some(1000)); - - for i in 0..5000 { - let j = (4999 - i) * 2 + 1; - s.remove_index(j); - } - - assert_eq!(s.index_of(&"a4000"), Some(2000)); - assert_eq!(s.index_of(&"a1000"), Some(500)); - assert_eq!(s.index_of(&"a500"), Some(250)); - assert_eq!(s.index_of(&"a20"), Some(10)); - } - - #[test] - fn test_remove_key() { - let mut s = SkipList::<&str>::new(); - s.insert_head("a20"); - s.insert_head("a19"); - s.insert_head("a18"); - s.insert_head("a17"); - s.insert_head("a16"); - s.insert_head("a15"); - s.insert_head("a14"); - s.insert_head("a13"); - s.insert_head("a12"); - s.insert_head("a11"); - s.insert_head("a10"); - s.insert_head("a9"); - s.insert_head("a8"); - s.insert_head("a7"); - s.insert_head("a6"); - s.insert_head("a5"); - s.insert_head("a4"); - s.insert_head("a3"); - s.insert_head("a2"); - s.insert_head("a1"); - s.insert_head("a0"); - - assert_eq!(s.index_of(&"a20"), Some(20)); - - s.remove_key(&"a1"); - s.remove_key(&"a3"); - s.remove_key(&"a5"); - s.remove_key(&"a7"); - s.remove_key(&"a9"); - s.remove_key(&"a11"); - s.remove_key(&"a13"); - s.remove_key(&"a15"); - s.remove_key(&"a17"); - s.remove_key(&"a19"); - - assert_eq!(s.index_of(&"a20"), Some(10)); - assert_eq!(s.index_of(&"a10"), Some(5)); - } -} diff --git a/automerge-backend/src/patches.rs b/automerge-backend/src/patches.rs deleted file mode 100644 index f32e9089..00000000 --- a/automerge-backend/src/patches.rs +++ /dev/null @@ -1,10 +0,0 @@ -mod edits; -mod from_scratch_diff; -mod gen_value_diff; -mod incremental_diff; -mod patch_workshop; - -pub(crate) use edits::Edits; -pub(crate) use from_scratch_diff::generate_from_scratch_diff; -pub(crate) use incremental_diff::IncrementalPatch; -pub(crate) use patch_workshop::PatchWorkshop; diff --git a/automerge-backend/src/patches/edits.rs b/automerge-backend/src/patches/edits.rs deleted file mode 100644 index bcab4563..00000000 --- a/automerge-backend/src/patches/edits.rs +++ /dev/null @@ -1,98 +0,0 @@ -use std::{convert::TryInto, mem}; - -use automerge_protocol as amp; - -#[derive(Debug)] -pub(crate) struct Edits(Vec); - -impl Edits { - pub(crate) fn new() -> Edits { - Edits(Vec::new()) - } - - /// Append an edit to this sequence, collapsing it into the last edit if possible. - /// - /// The collapsing handles conversion of a sequence of inserts to a multi-insert. - pub(crate) fn append_edit(&mut self, edit: amp::DiffEdit) { - if let Some(mut last) = self.0.last_mut() { - match (&mut last, edit) { - ( - amp::DiffEdit::SingleElementInsert { - index, - elem_id, - op_id, - value: amp::Diff::Value(value), - }, - amp::DiffEdit::SingleElementInsert { - index: next_index, - elem_id: next_elem_id, - op_id: next_op_id, - value: amp::Diff::Value(next_value), - }, - ) if *index + 1 == next_index - && elem_id.as_opid() == Some(op_id) - && next_elem_id.as_opid() == Some(&next_op_id) - // Ensure the values have a common type - && std::mem::discriminant(value) == std::mem::discriminant(&next_value) - && op_id.delta(&next_op_id, 1) => - { - let values: amp::ScalarValues = vec![ - // We need ownership of `value`. We can either `clone` it - // or swap it with a junk value using `mem::replace` - mem::replace(value, amp::ScalarValue::Null), - next_value, - ] - .try_into() - // `unwrap` is safe: we check for same types above - // in the if stmt - .unwrap(); - *last = amp::DiffEdit::MultiElementInsert(amp::MultiElementInsert { - index: *index, - elem_id: elem_id.clone(), - values, - }); - } - ( - amp::DiffEdit::MultiElementInsert(amp::MultiElementInsert { - index, - elem_id, - values, - }), - amp::DiffEdit::SingleElementInsert { - index: next_index, - elem_id: next_elem_id, - op_id, - value: amp::Diff::Value(value), - }, - ) if *index + (values.len() as u64) == next_index - && next_elem_id.as_opid() == Some(&op_id) - // Ensure the values have a common type - // `unwrap` is safe: `values` always has a length of at this point - && std::mem::discriminant(values.get(0).unwrap()) == std::mem::discriminant(&value) - && elem_id - .as_opid() - .unwrap() - .delta(&op_id, values.len() as u64) => - { - // `unwrap_none` is safe: we check if they are the same type above - //values.append(value).unwrap_none(); - values.append(value); - } - ( - amp::DiffEdit::Remove { index, count }, - amp::DiffEdit::Remove { - index: new_index, - count: new_count, - }, - ) if *index == new_index => *count += new_count, - (_, edit) => self.0.push(edit), - } - } else { - self.0.push(edit) - } - } - - pub(crate) fn into_vec(self) -> Vec { - self.0 - } -} diff --git a/automerge-backend/src/patches/from_scratch_diff.rs b/automerge-backend/src/patches/from_scratch_diff.rs deleted file mode 100644 index 7fbcc2c4..00000000 --- a/automerge-backend/src/patches/from_scratch_diff.rs +++ /dev/null @@ -1,201 +0,0 @@ -use core::cmp::max; -use std::collections::HashMap; - -use automerge_protocol as amp; - -use super::{gen_value_diff::gen_value_diff, Edits, PatchWorkshop}; -use crate::{internal::ObjectId, object_store::ObjState}; - -/// Used to generate a diff when there is no previous state to diff against. -/// This works by starting at the root object and then recursively constructing -/// all the objects contained in it. -pub(crate) fn generate_from_scratch_diff(workshop: &dyn PatchWorkshop) -> amp::RootDiff { - let mut props = HashMap::new(); - - for (key, ops) in &workshop.get_obj(&ObjectId::Root).unwrap().props { - if !ops.is_empty() { - let mut opid_to_value = HashMap::new(); - for op in ops.iter() { - let amp_opid = workshop.make_external_opid(&op.id); - if let Some(child_id) = op.child() { - opid_to_value.insert(amp_opid, construct_object(&child_id, workshop)); - } else { - opid_to_value - .insert(amp_opid, gen_value_diff(op, &op.adjusted_value(), workshop)); - } - } - props.insert(workshop.key_to_string(key), opid_to_value); - } - } - amp::RootDiff { props } -} - -fn construct_map( - object_id: &ObjectId, - object: &ObjState, - workshop: &dyn PatchWorkshop, -) -> amp::MapDiff { - let mut props = HashMap::new(); - - for (key, ops) in &object.props { - if !ops.is_empty() { - let mut opid_to_value = HashMap::new(); - for op in ops.iter() { - let amp_opid = workshop.make_external_opid(&op.id); - if let Some(child_id) = op.child() { - opid_to_value.insert(amp_opid, construct_object(&child_id, workshop)); - } else { - opid_to_value - .insert(amp_opid, gen_value_diff(op, &op.adjusted_value(), workshop)); - } - } - props.insert(workshop.key_to_string(key), opid_to_value); - } - } - amp::MapDiff { - object_id: workshop.make_external_objid(object_id), - props, - } -} - -fn construct_table( - object_id: &ObjectId, - object: &ObjState, - workshop: &dyn PatchWorkshop, -) -> amp::TableDiff { - let mut props = HashMap::new(); - - for (key, ops) in &object.props { - if !ops.is_empty() { - let mut opid_to_value = HashMap::new(); - for op in ops.iter() { - let amp_opid = workshop.make_external_opid(&op.id); - if let Some(child_id) = op.child() { - opid_to_value.insert(amp_opid, construct_object(&child_id, workshop)); - } else { - opid_to_value - .insert(amp_opid, gen_value_diff(op, &op.adjusted_value(), workshop)); - } - } - props.insert(workshop.key_to_string(key), opid_to_value); - } - } - amp::TableDiff { - object_id: workshop.make_external_objid(object_id), - props, - } -} - -fn construct_list( - object_id: &ObjectId, - object: &ObjState, - workshop: &dyn PatchWorkshop, -) -> amp::ListDiff { - let mut edits = Edits::new(); - let mut index = 0; - let mut max_counter = 0; - let mut seen_indices: std::collections::HashSet = std::collections::HashSet::new(); - - for opid in &object.seq { - max_counter = max(max_counter, opid.0); - let key = (*opid).into(); // FIXME - something is wrong here - if let Some(ops) = object.props.get(&key) { - if !ops.is_empty() { - for op in ops.iter() { - let value = if let Some(child_id) = op.child() { - construct_object(&child_id, workshop) - } else { - gen_value_diff(op, &op.adjusted_value(), workshop) - }; - let amp_opid = workshop.make_external_opid(&op.id); - if seen_indices.contains(&index) { - edits.append_edit(amp::DiffEdit::Update { - index, - op_id: amp_opid, - value, - }); - } else { - let key = workshop - .make_external_opid(&key.to_opid().unwrap_or(op.id)) - .into(); - edits.append_edit(amp::DiffEdit::SingleElementInsert { - index, - elem_id: key, - op_id: amp_opid, - value, - }); - } - seen_indices.insert(index); - } - index += 1; - } - } - } - amp::ListDiff { - object_id: workshop.make_external_objid(object_id), - edits: edits.into_vec(), - } -} - -fn construct_text( - object_id: &ObjectId, - object: &ObjState, - workshop: &dyn PatchWorkshop, -) -> amp::TextDiff { - let mut edits = Edits::new(); - let mut index = 0; - let mut max_counter = 0; - let mut seen_indices: std::collections::HashSet = std::collections::HashSet::new(); - - for opid in &object.seq { - max_counter = max(max_counter, opid.0); - let key = (*opid).into(); // FIXME - something is wrong here - if let Some(ops) = object.props.get(&key) { - if !ops.is_empty() { - for op in ops.iter() { - let value = if let Some(child_id) = op.child() { - construct_object(&child_id, workshop) - } else { - gen_value_diff(op, &op.adjusted_value(), workshop) - }; - let amp_opid = workshop.make_external_opid(&op.id); - if seen_indices.contains(&index) { - edits.append_edit(amp::DiffEdit::Update { - index, - op_id: amp_opid, - value, - }); - } else { - let key = workshop - .make_external_opid(&key.to_opid().unwrap_or(op.id)) - .into(); - edits.append_edit(amp::DiffEdit::SingleElementInsert { - index, - elem_id: key, - op_id: amp_opid, - value, - }); - } - seen_indices.insert(index); - } - index += 1; - } - } - } - amp::TextDiff { - object_id: workshop.make_external_objid(object_id), - edits: edits.into_vec(), - } -} - -fn construct_object(object_id: &ObjectId, workshop: &dyn PatchWorkshop) -> amp::Diff { - // Safety: if the object is missing when we're generating a diff from - // scratch then the document is corrupt - let object = workshop.get_obj(object_id).expect("missing object"); - match object.obj_type { - amp::ObjType::Map => amp::Diff::Map(construct_map(object_id, object, workshop)), - amp::ObjType::Table => amp::Diff::Table(construct_table(object_id, object, workshop)), - amp::ObjType::List => amp::Diff::List(construct_list(object_id, object, workshop)), - amp::ObjType::Text => amp::Diff::Text(construct_text(object_id, object, workshop)), - } -} diff --git a/automerge-backend/src/patches/gen_value_diff.rs b/automerge-backend/src/patches/gen_value_diff.rs deleted file mode 100644 index e0c4500c..00000000 --- a/automerge-backend/src/patches/gen_value_diff.rs +++ /dev/null @@ -1,19 +0,0 @@ -use automerge_protocol as amp; - -use super::PatchWorkshop; -use crate::op_handle::OpHandle; - -pub(super) fn gen_value_diff( - op: &OpHandle, - value: &::ScalarValue, - workshop: &dyn PatchWorkshop, -) -> amp::Diff { - match value { - amp::ScalarValue::Cursor(oid) => { - // .expect() is okay here because we check that the cursr exists at the start of - // `OpSet::apply_op()` - amp::Diff::Cursor(workshop.find_cursor(oid).expect("missing cursor")) - } - _ => op.adjusted_value().into(), - } -} diff --git a/automerge-backend/src/patches/incremental_diff.rs b/automerge-backend/src/patches/incremental_diff.rs deleted file mode 100644 index 3c11a04d..00000000 --- a/automerge-backend/src/patches/incremental_diff.rs +++ /dev/null @@ -1,454 +0,0 @@ -use std::collections::{HashMap, HashSet}; - -use automerge_protocol as amp; - -use super::{gen_value_diff::gen_value_diff, Edits, PatchWorkshop}; -use crate::{ - actor_map::ActorMap, - internal::{InternalOpType, Key, ObjectId, OpId}, - object_store::ObjState, - op_handle::OpHandle, -}; - -/// Records a change that has happened as a result of an operation -#[derive(Debug, Clone, PartialEq)] -enum PendingDiff { - // contains the op handle, the index to insert after and the new element's id - SeqInsert(OpHandle, usize, OpId), - // contains the op handle, the index to insert after and the new element's id - SeqUpdate(OpHandle, usize, OpId), - SeqRemove(OpHandle, usize), - Set(OpHandle), - CursorChange(Key), -} - -impl PendingDiff { - pub fn operation_key(&self) -> Key { - match self { - Self::SeqInsert(op, ..) - | Self::SeqUpdate(op, ..) - | Self::SeqRemove(op, ..) - | Self::Set(op) => op.operation_key(), - Self::CursorChange(k) => k.clone(), - } - } -} - -/// `IncrementalPatch` is used to build patches which are a result of applying a `Change`. As the -/// `OpSet` applies each op in the change it records the difference that will make in the -/// `IncrementalPatch` using the various `record_*` methods. At the end of the change process the -/// `IncrementalPatch::finalize` method is used to generate a `automerge_protocol::Diff` to send to -/// the frontend. -/// -/// The reason this is called an "incremental" patch is because it impliciatly generates a diff -/// between the "current" state - represented by whatever was in the OpSet before the change was -/// received - and the new state after the change is applied. This is in contrast to when we are -/// generating a diff without any existing state, as in the case when we first load a saved -/// document. -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct IncrementalPatch(HashMap>); - -impl IncrementalPatch { - pub(crate) fn new() -> IncrementalPatch { - IncrementalPatch(HashMap::new()) - } - - pub(crate) fn record_set(&mut self, oid: &ObjectId, op: OpHandle) { - self.append_diff(oid, PendingDiff::Set(op)) - } - - pub(crate) fn record_cursor_change(&mut self, oid: &ObjectId, key: Key) { - self.append_diff(oid, PendingDiff::CursorChange(key)); - } - - pub(crate) fn record_seq_insert( - &mut self, - oid: &ObjectId, - op: OpHandle, - index: usize, - opid: OpId, - ) { - self.append_diff(oid, PendingDiff::SeqInsert(op, index, opid)); - } - - pub(crate) fn record_seq_updates<'a, 'b, I: Iterator>( - &'a mut self, - oid: &ObjectId, - object: &ObjState, - index: usize, - ops: I, - actors: &ActorMap, - ) { - // TODO: Remove the actors argument and instead add a new case to the `PendingDiff` - // enum to represent multiple seq updates, then sort by actor ID at the point at which we - // finalize the diffs, when we have access to a `PatchWorkshop` to perform the sorting - let diffs = self.0.entry(*oid).or_default(); - let mut new_diffs = Vec::new(); - 'outer: for op in ops { - let i = op - .key - .to_opid() - .and_then(|opid| object.index_of(opid)) - .unwrap_or(0); - if i == index { - // go through existing diffs and find an insert - for diff in diffs.iter_mut() { - match diff { - // if this insert was for the index we are now updating, and it is from the - // same actor, - // then change the insert to just insert our data instead - PendingDiff::SeqInsert(original_op, index, original_opid) - if i == *index && original_op.id.1 == op.id.1 => - { - *diff = PendingDiff::SeqInsert(op.clone(), *index, *original_opid); - continue 'outer; - } - _ => {} - } - } - new_diffs.push(PendingDiff::SeqUpdate(op.clone(), index, op.id)) - } - } - new_diffs.sort_by_key(|d| { - if let PendingDiff::SeqUpdate(op, _, _) = d { - actors.export_actor(op.id.1) - } else { - // SAFETY: we only add SeqUpdates to this vec above. - unreachable!() - } - }); - self.append_diffs(oid, new_diffs); - } - - pub(crate) fn record_seq_remove(&mut self, oid: &ObjectId, op: OpHandle, index: usize) { - self.append_diff(oid, PendingDiff::SeqRemove(op, index)) - } - - fn append_diff(&mut self, oid: &ObjectId, diff: PendingDiff) { - self.0.entry(*oid).or_default().push(diff); - } - - fn append_diffs(&mut self, oid: &ObjectId, mut diffs: Vec) { - self.0.entry(*oid).or_default().append(&mut diffs) - } - - pub(crate) fn changed_object_ids(&self) -> impl Iterator { - self.0.keys() - } - - pub(crate) fn finalize(mut self, workshop: &dyn PatchWorkshop) -> amp::RootDiff { - if self.0.is_empty() { - return amp::RootDiff::default(); - } - - let mut objs: Vec<_> = self.changed_object_ids().copied().collect(); - while let Some(obj_id) = objs.pop() { - if let Some(inbound) = workshop - .get_obj(&obj_id) - .and_then(|obj| obj.inbound.as_ref()) - { - if !self.0.contains_key(&inbound.obj) { - // our parent was not changed - walk up the tree and try them too - objs.push(inbound.obj); - } - self.append_diff(&inbound.obj, PendingDiff::Set(inbound.clone())); - } - } - - if let Some(root) = self.0.remove(&ObjectId::Root) { - let mut props = HashMap::new(); - // I may have duplicate keys - I do this to make sure I visit each one only once - let keys: HashSet<_> = root.iter().map(PendingDiff::operation_key).collect(); - let obj = workshop.get_obj(&ObjectId::Root).expect("no root found"); - for key in &keys { - let key_string = workshop.key_to_string(key); - let mut opid_to_value = HashMap::new(); - for op in obj.conflicts(key) { - let link = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - _ => panic!("del or inc found in field_operations"), - }; - opid_to_value.insert(workshop.make_external_opid(&op.id), link); - } - props.insert(key_string, opid_to_value); - } - amp::RootDiff { props } - } else { - amp::RootDiff { - props: HashMap::new(), - } - } - } - - fn gen_obj_diff(&self, obj_id: &ObjectId, workshop: &dyn PatchWorkshop) -> amp::Diff { - // Safety: the pending diffs we are working with are all generated by - // the OpSet, we should never have a missing object and if we do - // there's nothing the user can do about that - let obj = workshop - .get_obj(obj_id) - .expect("Missing object in internal diff"); - if let Some(pending) = self.0.get(obj_id) { - match obj.obj_type { - amp::ObjType::List => { - amp::Diff::List(self.gen_list_diff(obj_id, obj, pending, workshop)) - } - amp::ObjType::Text => { - amp::Diff::Text(self.gen_text_diff(obj_id, obj, pending, workshop)) - } - amp::ObjType::Map => { - amp::Diff::Map(self.gen_map_diff(obj_id, obj, pending, workshop)) - } - amp::ObjType::Table => { - amp::Diff::Table(self.gen_table_diff(obj_id, obj, pending, workshop)) - } - } - } else { - // no changes so just return empty edits or props - match obj.obj_type { - amp::ObjType::Map => amp::Diff::Map(amp::MapDiff { - object_id: workshop.make_external_objid(obj_id), - props: HashMap::new(), - }), - amp::ObjType::Table => amp::Diff::Table(amp::TableDiff { - object_id: workshop.make_external_objid(obj_id), - props: HashMap::new(), - }), - amp::ObjType::List => amp::Diff::List(amp::ListDiff { - object_id: workshop.make_external_objid(obj_id), - edits: Vec::new(), - }), - amp::ObjType::Text => amp::Diff::Text(amp::TextDiff { - object_id: workshop.make_external_objid(obj_id), - edits: Vec::new(), - }), - } - } - } - - fn gen_list_diff( - &self, - obj_id: &ObjectId, - obj: &ObjState, - pending: &[PendingDiff], - workshop: &dyn PatchWorkshop, - ) -> amp::ListDiff { - let mut edits = Edits::new(); - // used to ensure we don't generate duplicate patches for some op ids (added to the pending - // list to ensure we have a tree for deeper operations) - let mut seen_op_ids = HashSet::new(); - for pending_edit in pending.iter() { - match pending_edit { - PendingDiff::SeqInsert(op, index, opid) => { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - _ => panic!("del or inc found in field operations"), - }; - let op_id = workshop.make_external_opid(opid); - edits.append_edit(amp::DiffEdit::SingleElementInsert { - index: *index as u64, - elem_id: op_id.clone().into(), - op_id: workshop.make_external_opid(&op.id), - value, - }); - } - PendingDiff::SeqUpdate(op, index, opid) => { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - InternalOpType::Del | InternalOpType::Inc(..) => { - // do nothing - continue; - } - }; - edits.append_edit(amp::DiffEdit::Update { - index: *index as u64, - op_id: workshop.make_external_opid(opid), - value, - }); - } - PendingDiff::SeqRemove(op, index) => { - seen_op_ids.insert(op.id); - - edits.append_edit(amp::DiffEdit::Remove { - index: (*index) as u64, - count: 1, - }) - } - PendingDiff::Set(op) => { - for op in obj.conflicts(&op.operation_key()) { - if !seen_op_ids.contains(&op.id) { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => { - gen_value_diff(op, value, workshop) - } - InternalOpType::Make(_) => { - self.gen_obj_diff(&op.id.into(), workshop) - } - _ => panic!("del or inc found in field operations"), - }; - edits.append_edit(amp::DiffEdit::Update { - index: obj.index_of(op.id).unwrap_or(0) as u64, - op_id: workshop.make_external_opid(&op.id), - value, - }) - } - } - } - PendingDiff::CursorChange(_) => { - panic!("found cursor change pending diff while generating sequence diff") - } - } - } - amp::ListDiff { - object_id: workshop.make_external_objid(obj_id), - edits: edits.into_vec(), - } - } - - fn gen_text_diff( - &self, - obj_id: &ObjectId, - obj: &ObjState, - pending: &[PendingDiff], - workshop: &dyn PatchWorkshop, - ) -> amp::TextDiff { - let mut edits = Edits::new(); - // used to ensure we don't generate duplicate patches for some op ids (added to the pending - // list to ensure we have a tree for deeper operations) - let mut seen_op_ids = HashSet::new(); - for pending_edit in pending.iter() { - match pending_edit { - PendingDiff::SeqInsert(op, index, opid) => { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - _ => panic!("del or inc found in field operations"), - }; - let op_id = workshop.make_external_opid(opid); - edits.append_edit(amp::DiffEdit::SingleElementInsert { - index: *index as u64, - elem_id: op_id.clone().into(), - op_id: workshop.make_external_opid(&op.id), - value, - }); - } - PendingDiff::SeqUpdate(op, index, opid) => { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - InternalOpType::Del | InternalOpType::Inc(..) => { - // do nothing - continue; - } - }; - edits.append_edit(amp::DiffEdit::Update { - index: *index as u64, - op_id: workshop.make_external_opid(opid), - value, - }); - } - PendingDiff::SeqRemove(op, index) => { - seen_op_ids.insert(op.id); - - edits.append_edit(amp::DiffEdit::Remove { - index: (*index) as u64, - count: 1, - }) - } - PendingDiff::Set(op) => { - for op in obj.conflicts(&op.operation_key()) { - if !seen_op_ids.contains(&op.id) { - seen_op_ids.insert(op.id); - let value = match op.action { - InternalOpType::Set(ref value) => { - gen_value_diff(op, value, workshop) - } - InternalOpType::Make(_) => { - self.gen_obj_diff(&op.id.into(), workshop) - } - _ => panic!("del or inc found in field operations"), - }; - edits.append_edit(amp::DiffEdit::Update { - index: obj.index_of(op.id).unwrap_or(0) as u64, - op_id: workshop.make_external_opid(&op.id), - value, - }) - } - } - } - PendingDiff::CursorChange(_) => { - panic!("found cursor change pending diff while generating sequence diff") - } - } - } - amp::TextDiff { - object_id: workshop.make_external_objid(obj_id), - edits: edits.into_vec(), - } - } - - fn gen_map_diff( - &self, - obj_id: &ObjectId, - obj: &ObjState, - pending: &[PendingDiff], - workshop: &dyn PatchWorkshop, - ) -> amp::MapDiff { - let mut props = HashMap::new(); - // I may have duplicate keys - I do this to make sure I visit each one only once - let keys: HashSet<_> = pending.iter().map(PendingDiff::operation_key).collect(); - for key in &keys { - let key_string = workshop.key_to_string(key); - let mut opid_to_value = HashMap::new(); - for op in obj.conflicts(key) { - let link = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - _ => panic!("del or inc found in field_operations"), - }; - opid_to_value.insert(workshop.make_external_opid(&op.id), link); - } - props.insert(key_string, opid_to_value); - } - amp::MapDiff { - object_id: workshop.make_external_objid(obj_id), - props, - } - } - - fn gen_table_diff( - &self, - obj_id: &ObjectId, - obj: &ObjState, - pending: &[PendingDiff], - workshop: &dyn PatchWorkshop, - ) -> amp::TableDiff { - let mut props = HashMap::new(); - // I may have duplicate keys - I do this to make sure I visit each one only once - let keys: HashSet<_> = pending.iter().map(PendingDiff::operation_key).collect(); - for key in &keys { - let key_string = workshop.key_to_string(key); - let mut opid_to_value = HashMap::new(); - for op in obj.conflicts(key) { - let link = match op.action { - InternalOpType::Set(ref value) => gen_value_diff(op, value, workshop), - InternalOpType::Make(_) => self.gen_obj_diff(&op.id.into(), workshop), - _ => panic!("del or inc found in field_operations"), - }; - opid_to_value.insert(workshop.make_external_opid(&op.id), link); - } - props.insert(key_string, opid_to_value); - } - amp::TableDiff { - object_id: workshop.make_external_objid(obj_id), - props, - } - } -} diff --git a/automerge-backend/src/patches/patch_workshop.rs b/automerge-backend/src/patches/patch_workshop.rs deleted file mode 100644 index 4c7860b2..00000000 --- a/automerge-backend/src/patches/patch_workshop.rs +++ /dev/null @@ -1,22 +0,0 @@ -use automerge_protocol as amp; - -use crate::{ - internal::{Key, ObjectId, OpId}, - object_store::ObjState, -}; - -/// An abstraction over the information `PendingDiffs` needs access to in order -/// to generate a `Patch`. In practice the implementation will always be an -/// `OpSet` but this abstraction boundary makes it easier to avoid accidentally -/// coupling the patch generation to internals of the `OpSet` -/// -/// It's a "workshop" because it's not a factory, it doesn't do the actual -/// building of the patch. It's just where some tools to make the patch can be -/// found -pub(crate) trait PatchWorkshop { - fn key_to_string(&self, key: &Key) -> String; - fn find_cursor(&self, opid: &::OpId) -> Option; - fn get_obj(&self, object_id: &ObjectId) -> Option<&ObjState>; - fn make_external_objid(&self, object_id: &ObjectId) -> amp::ObjectId; - fn make_external_opid(&self, opid: &OpId) -> amp::OpId; -} diff --git a/automerge-backend/src/sync.rs b/automerge-backend/src/sync.rs deleted file mode 100644 index 8df37ccf..00000000 --- a/automerge-backend/src/sync.rs +++ /dev/null @@ -1,367 +0,0 @@ -use std::{ - borrow::Cow, - collections::{HashMap, HashSet}, - convert::TryFrom, - io, - io::Write, -}; - -use automerge_protocol::{ChangeHash, Patch}; - -use crate::{ - decoding, decoding::Decoder, encoding, encoding::Encodable, AutomergeError, Backend, Change, -}; - -mod bloom; -mod state; - -pub use bloom::BloomFilter; -pub use state::{SyncHave, SyncState}; - -const HASH_SIZE: usize = 32; // 256 bits = 32 bytes -const MESSAGE_TYPE_SYNC: u8 = 0x42; // first byte of a sync message, for identification - -impl Backend { - pub fn generate_sync_message(&self, sync_state: &mut SyncState) -> Option { - let our_heads = self.get_heads(); - - let our_need = self.get_missing_deps(sync_state.their_heads.as_ref().unwrap_or(&vec![])); - - let their_heads_set = if let Some(ref heads) = sync_state.their_heads { - heads.iter().collect::>() - } else { - HashSet::new() - }; - let our_have = if our_need.iter().all(|hash| their_heads_set.contains(hash)) { - vec![self.make_bloom_filter(sync_state.shared_heads.clone())] - } else { - Vec::new() - }; - - if let Some(ref their_have) = sync_state.their_have { - if let Some(first_have) = their_have.first().as_ref() { - if !first_have - .last_sync - .iter() - .all(|hash| self.get_change_by_hash(hash).is_some()) - { - let reset_msg = SyncMessage { - heads: our_heads, - need: Vec::new(), - have: vec![SyncHave::default()], - changes: Vec::new(), - }; - return Some(reset_msg); - } - } - } - - let mut changes_to_send = if let (Some(their_have), Some(their_need)) = ( - sync_state.their_have.as_ref(), - sync_state.their_need.as_ref(), - ) { - self.get_changes_to_send(their_have.clone(), their_need) - } else { - Vec::new() - }; - - let heads_unchanged = if let Some(last_sent_heads) = sync_state.last_sent_heads.as_ref() { - last_sent_heads == &our_heads - } else { - false - }; - - let heads_equal = if let Some(their_heads) = sync_state.their_heads.as_ref() { - their_heads == &our_heads - } else { - false - }; - - if heads_unchanged && heads_equal && changes_to_send.is_empty() && our_need.is_empty() { - return None; - } - - // deduplicate the changes to send with those we have already sent - changes_to_send.retain(|change| !sync_state.sent_hashes.contains(&change.hash)); - - sync_state.last_sent_heads = Some(our_heads.clone()); - sync_state - .sent_hashes - .extend(changes_to_send.iter().map(|c| c.hash)); - - let sync_message = SyncMessage { - heads: our_heads, - have: our_have, - need: our_need, - changes: changes_to_send.into_iter().cloned().collect(), - }; - - Some(sync_message) - } - - pub fn receive_sync_message( - &mut self, - sync_state: &mut SyncState, - message: SyncMessage, - ) -> Result, AutomergeError> { - let mut patch = None; - - let before_heads = self.get_heads(); - - let SyncMessage { - heads: message_heads, - changes: message_changes, - need: message_need, - have: message_have, - } = message; - - let changes_is_empty = message_changes.is_empty(); - if !changes_is_empty { - patch = Some(self.apply_changes(message_changes)?); - sync_state.shared_heads = advance_heads( - &before_heads.iter().collect(), - &self.get_heads().into_iter().collect(), - &sync_state.shared_heads, - ) - } - - // trim down the sent hashes to those that we know they haven't seen - self.filter_changes(&message_heads, &mut sync_state.sent_hashes); - - if changes_is_empty && message_heads == before_heads { - sync_state.last_sent_heads = Some(message_heads.clone()) - } - - let known_heads = message_heads - .iter() - .filter(|head| self.get_change_by_hash(head).is_some()) - .collect::>(); - if known_heads.len() == message_heads.len() { - sync_state.shared_heads = message_heads.clone() - } else { - sync_state.shared_heads = sync_state - .shared_heads - .iter() - .chain(known_heads) - .collect::>() - .into_iter() - .copied() - .collect::>(); - sync_state.shared_heads.sort(); - } - - sync_state.their_have = Some(message_have); - sync_state.their_heads = Some(message_heads); - sync_state.their_need = Some(message_need); - - Ok(patch) - } - - fn make_bloom_filter(&self, last_sync: Vec) -> SyncHave { - let new_changes = self.get_changes(&last_sync); - let hashes = new_changes - .into_iter() - .map(|change| change.hash) - .collect::>(); - SyncHave { - last_sync, - bloom: BloomFilter::from(&hashes[..]), - } - } - - pub fn get_changes_to_send(&self, have: Vec, need: &[ChangeHash]) -> Vec<&Change> { - if have.is_empty() { - need.iter() - .filter_map(|hash| self.get_change_by_hash(hash)) - .collect() - } else { - let mut last_sync_hashes = HashSet::new(); - let mut bloom_filters = Vec::with_capacity(have.len()); - - for h in have { - let SyncHave { last_sync, bloom } = h; - for hash in last_sync { - last_sync_hashes.insert(hash); - } - bloom_filters.push(bloom) - } - let last_sync_hashes = last_sync_hashes.into_iter().collect::>(); - - let changes = self.get_changes(&last_sync_hashes); - - let mut change_hashes = HashSet::with_capacity(changes.len()); - let mut dependents: HashMap> = HashMap::new(); - let mut hashes_to_send = HashSet::new(); - - for change in &changes { - change_hashes.insert(change.hash); - - for dep in &change.deps { - dependents.entry(*dep).or_default().push(change.hash); - } - - if bloom_filters - .iter() - .all(|bloom| !bloom.contains_hash(&change.hash)) - { - hashes_to_send.insert(change.hash); - } - } - - let mut stack = hashes_to_send.iter().copied().collect::>(); - while let Some(hash) = stack.pop() { - if let Some(deps) = dependents.get(&hash) { - for dep in deps { - if hashes_to_send.insert(*dep) { - stack.push(*dep) - } - } - } - } - - let mut changes_to_send = Vec::new(); - for hash in need { - hashes_to_send.insert(*hash); - if !change_hashes.contains(hash) { - let change = self.get_change_by_hash(hash); - if let Some(change) = change { - changes_to_send.push(change) - } - } - } - - for change in changes { - if hashes_to_send.contains(&change.hash) { - changes_to_send.push(change) - } - } - changes_to_send - } - } -} - -#[derive(Debug, Clone)] -pub struct SyncMessage { - pub heads: Vec, - pub need: Vec, - pub have: Vec, - pub changes: Vec, -} - -impl SyncMessage { - pub fn encode(self) -> Result, encoding::Error> { - let mut buf = vec![MESSAGE_TYPE_SYNC]; - - encode_hashes(&mut buf, &self.heads)?; - encode_hashes(&mut buf, &self.need)?; - (self.have.len() as u32).encode(&mut buf)?; - for have in self.have { - encode_hashes(&mut buf, &have.last_sync)?; - have.bloom.into_bytes()?.encode(&mut buf)?; - } - - (self.changes.len() as u32).encode(&mut buf)?; - for change in self.changes { - change.raw_bytes().encode(&mut buf)?; - } - - Ok(buf) - } - - pub fn decode(bytes: &[u8]) -> Result { - let mut decoder = Decoder::new(Cow::Borrowed(bytes)); - - let message_type = decoder.read::()?; - if message_type != MESSAGE_TYPE_SYNC { - return Err(decoding::Error::WrongType { - expected_one_of: vec![MESSAGE_TYPE_SYNC], - found: message_type, - }); - } - - let heads = decode_hashes(&mut decoder)?; - let need = decode_hashes(&mut decoder)?; - let have_count = decoder.read::()?; - let mut have = Vec::with_capacity(have_count as usize); - for _ in 0..have_count { - let last_sync = decode_hashes(&mut decoder)?; - let bloom_bytes: Vec = decoder.read()?; - let bloom = BloomFilter::try_from(bloom_bytes.as_slice())?; - have.push(SyncHave { last_sync, bloom }); - } - - let change_count = decoder.read::()?; - let mut changes = Vec::with_capacity(change_count as usize); - for _ in 0..change_count { - let change = decoder.read()?; - changes.push(Change::from_bytes(change)?); - } - - Ok(SyncMessage { - heads, - need, - have, - changes, - }) - } -} - -fn encode_hashes(buf: &mut Vec, hashes: &[ChangeHash]) -> Result<(), encoding::Error> { - debug_assert!( - hashes.windows(2).all(|h| h[0] <= h[1]), - "hashes were not sorted" - ); - hashes.encode(buf)?; - Ok(()) -} - -impl Encodable for &[ChangeHash] { - fn encode(&self, buf: &mut W) -> io::Result { - let head = self.len().encode(buf)?; - let mut body = 0; - for hash in self.iter() { - buf.write_all(&hash.0)?; - body += hash.0.len() - } - Ok(head + body) - } -} - -fn decode_hashes(decoder: &mut Decoder) -> Result, decoding::Error> { - let length = decoder.read::()?; - let mut hashes = Vec::with_capacity(length as usize); - - for _ in 0..length { - let hash_bytes = decoder.read_bytes(HASH_SIZE)?; - let hash = ChangeHash::try_from(hash_bytes).map_err(decoding::Error::BadChangeFormat)?; - hashes.push(hash); - } - - Ok(hashes) -} - -fn advance_heads( - my_old_heads: &HashSet<&ChangeHash>, - my_new_heads: &HashSet, - our_old_shared_heads: &[ChangeHash], -) -> Vec { - let new_heads = my_new_heads - .iter() - .filter(|head| !my_old_heads.contains(head)) - .copied() - .collect::>(); - - let common_heads = our_old_shared_heads - .iter() - .filter(|head| my_new_heads.contains(head)) - .copied() - .collect::>(); - - let mut advanced_heads = HashSet::with_capacity(new_heads.len() + common_heads.len()); - for head in new_heads.into_iter().chain(common_heads) { - advanced_heads.insert(head); - } - let mut advanced_heads = advanced_heads.into_iter().collect::>(); - advanced_heads.sort(); - advanced_heads -} diff --git a/automerge-backend/src/sync/state.rs b/automerge-backend/src/sync/state.rs deleted file mode 100644 index 8552a93e..00000000 --- a/automerge-backend/src/sync/state.rs +++ /dev/null @@ -1,67 +0,0 @@ -use std::{borrow::Cow, collections::HashSet}; - -use automerge_protocol::ChangeHash; - -use super::{decode_hashes, encode_hashes}; -use crate::{decoding, decoding::Decoder, encoding, BloomFilter}; - -const SYNC_STATE_TYPE: u8 = 0x43; // first byte of an encoded sync state, for identification - -#[derive(Debug, Clone)] -pub struct SyncState { - pub shared_heads: Vec, - pub last_sent_heads: Option>, - pub their_heads: Option>, - pub their_need: Option>, - pub their_have: Option>, - pub sent_hashes: HashSet, -} - -#[derive(Debug, Clone, Default)] -pub struct SyncHave { - pub last_sync: Vec, - pub bloom: BloomFilter, -} - -impl SyncState { - pub fn encode(&self) -> Result, encoding::Error> { - let mut buf = vec![SYNC_STATE_TYPE]; - encode_hashes(&mut buf, &self.shared_heads)?; - Ok(buf) - } - - pub fn decode(bytes: &[u8]) -> Result { - let mut decoder = Decoder::new(Cow::Borrowed(bytes)); - - let record_type = decoder.read::()?; - if record_type != SYNC_STATE_TYPE { - return Err(decoding::Error::WrongType { - expected_one_of: vec![SYNC_STATE_TYPE], - found: record_type, - }); - } - - let shared_heads = decode_hashes(&mut decoder)?; - Ok(Self { - shared_heads, - last_sent_heads: Some(Vec::new()), - their_heads: None, - their_need: None, - their_have: Some(Vec::new()), - sent_hashes: HashSet::new(), - }) - } -} - -impl Default for SyncState { - fn default() -> Self { - Self { - shared_heads: Vec::new(), - last_sent_heads: Some(Vec::new()), - their_heads: None, - their_need: None, - their_have: None, - sent_hashes: HashSet::new(), - } - } -} diff --git a/automerge-backend/tests/apply_change.rs b/automerge-backend/tests/apply_change.rs deleted file mode 100644 index 5faed77f..00000000 --- a/automerge-backend/tests/apply_change.rs +++ /dev/null @@ -1,1435 +0,0 @@ -extern crate automerge_backend; -use std::{convert::TryInto, num::NonZeroU32, str::FromStr}; - -use amp::RootDiff; -use automerge_backend::{AutomergeError, Backend, Change}; -use automerge_protocol as amp; -use automerge_protocol::{ - ActorId, CursorDiff, Diff, DiffEdit, ElementId, ListDiff, MapDiff, ObjectId, Op, Patch, - ScalarValue, -}; -use maplit::hashmap; -use pretty_assertions::assert_eq; - -#[test] -fn test_incremental_diffs_in_a_map() { - let actor: ActorId = "7b7723afd9e6480397a4d467b7693156".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set("magpie".into()), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change.clone()]).unwrap(); - let expected_patch = Patch { - actor: None, - seq: None, - deps: vec![change.hash], - clock: hashmap! {actor.clone() => 1}, - max_op: 1, - pending_changes: 0, - diffs: RootDiff { - props: hashmap!( "bird".into() => hashmap!( actor.op_id_at(1) => "magpie".into() )), - }, - }; - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_bytes() { - let actor: ActorId = "7b7723afd9e6480397a4d467b7693156".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set(ScalarValue::Bytes("AQID".into())), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change.clone()]).unwrap(); - let expected_patch = Patch { - actor: None, - seq: None, - deps: vec![change.hash], - clock: hashmap! {actor.clone() => 1}, - max_op: 1, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Value(amp::ScalarValue::Bytes("AQID".into())), - } - }, - }, - }; - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_increment_key_in_map() { - let actor: ActorId = "cdee6963c1664645920be8b41a933c2b".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set(ScalarValue::Counter(1)), - key: "counter".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 2, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Inc(2), - key: "counter".into(), - insert: false, - pred: vec![actor.op_id_at(1)], - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - clock: hashmap! {actor.clone() => 2}, - max_op: 2, - pending_changes: 0, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap!( - "counter".into() => hashmap!{ - actor.op_id_at(1) => ScalarValue::Counter(3).into(), - }), - }, - }; - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch); -} - -#[test] -fn test_conflict_on_assignment_to_same_map_key() { - let actor_1 = ActorId::from_str("ac11").unwrap(); - let change1: Change = amp::Change { - actor_id: actor_1.clone(), - seq: 1, - message: None, - hash: None, - start_op: 1, - time: 0, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set("magpie".into()), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let actor_2 = ActorId::from_str("ac22").unwrap(); - let change2: Change = amp::Change { - actor_id: actor_2.clone(), - start_op: 2, - seq: 1, - message: None, - hash: None, - deps: vec![change1.hash], - time: 0, - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set("blackbird".into()), - key: "bird".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - clock: hashmap! { - actor_1.clone() => 1, - actor_2.clone() => 1, - }, - deps: vec![change2.hash], - max_op: 2, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor_1.op_id_at(1) => "magpie".into(), - actor_2.op_id_at(2) => "blackbird".into(), - } - }, - }, - }; - let mut backend = Backend::new(); - let _patch1 = backend.apply_changes(vec![change1]).unwrap(); - let patch2 = backend.apply_changes(vec![change2]).unwrap(); - //let patch = backend.get_patch().unwrap(); - assert_eq!(patch2, expected_patch); -} - -#[test] -fn delete_key_from_map() { - let actor: ActorId = "cd86c07f109348f494af5be30fdc4c71".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set(ScalarValue::Str("magpie".into())), - key: "bird".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - key: "bird".into(), - pred: vec![actor.op_id_at(1)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - clock: hashmap! {actor => 2}, - deps: vec![change2.hash], - max_op: 2, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{} - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn create_nested_maps() { - let actor: ActorId = "d6226fcd55204b82b396f2473da3e26f".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::F64(3.0)), - obj: ObjectId::from(actor.op_id_at(1)), - key: "wrens".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch: Patch = Patch { - actor: None, - max_op: 2, - pending_changes: 0, - deps: vec![change.hash], - seq: None, - clock: hashmap! {actor.clone() => 1}, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::Map(MapDiff{ - object_id: actor.op_id_at(1).into(), - props: hashmap!{ - "wrens".into() => hashmap!{ - actor.op_id_at(2) => Diff::Value(ScalarValue::F64(3.0)) - } - } - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_assign_to_nested_keys_in_map() { - let actor: ActorId = "3c39c994039042778f4779a01a59a917".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set(ScalarValue::F64(3.0)), - key: "wrens".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 3, - time: 0, - deps: vec![change1.hash], - message: None, - hash: None, - operations: vec![Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set(ScalarValue::F64(15.0)), - key: "sparrows".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 2, - }, - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::Map(MapDiff{ - object_id: actor.op_id_at(1).into(), - props: hashmap!{ - "sparrows".into() => hashmap!{ - actor.op_id_at(3) => Diff::Value(ScalarValue::F64(15.0)) - } - } - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_create_lists() { - let actor: ActorId = "f82cb62dabe64372ab87466b77792010".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set("chaffinch".into()), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 2, - pending_changes: 0, - actor: None, - seq: None, - deps: vec![change.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value(ScalarValue::Str("chaffinch".into())), - - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_apply_updates_inside_lists() { - let actor: ActorId = "4ee4a0d033b841c4b26d73d70a879547".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set("chaffinch".into()), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - pred: Vec::new(), - insert: true, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 3, - time: 0, - deps: vec![change1.hash], - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set("greenfinch".into()), - obj: ObjectId::from(actor.op_id_at(1)), - key: actor.op_id_at(2).into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - deps: vec![change2.hash], - clock: hashmap! { - actor.clone() => 2 - }, - max_op: 3, - pending_changes: 0, - seq: None, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::Update{ - index: 0, - op_id: actor.op_id_at(3), - value: Diff::Value("greenfinch".into()), - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_delete_list_elements() { - let actor: ActorId = "8a3d4716fdca49f4aa5835901f2034c7".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set("chaffinch".into()), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 3, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: ObjectId::from(actor.op_id_at(1)), - key: actor.op_id_at(2).into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - seq: None, - actor: None, - max_op: 3, - pending_changes: 0, - clock: hashmap! { - actor.clone() => 2 - }, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::Remove{index: 0, count: 1}] - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_handle_list_element_insertion_and_deletion_in_same_change() { - let actor: ActorId = "ca95bc759404486bbe7b9dd2be779fa8".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![ - Op { - action: amp::OpType::Set("chaffinch".into()), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: ObjectId::from(actor.op_id_at(1)), - key: actor.op_id_at(2).into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 2 - }, - seq: None, - actor: None, - max_op: 3, - pending_changes: 0, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![ - DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("chaffinch".into()), - }, - DiffEdit::Remove{index: 0, count: 1}, - ], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - let patch = backend.apply_changes(vec![change2]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_handle_changes_within_conflicted_objects() { - let actor1: ActorId = "9f17517523e54ee888e9cd51dfd7a572".try_into().unwrap(); - let actor2: ActorId = "83768a19a13842beb6dde8c68a662fad".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor1.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "conflict".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor2.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: ObjectId::Root, - key: "conflict".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change3: Change = amp::Change { - actor_id: actor2.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change2.hash], - operations: vec![Op { - action: amp::OpType::Set(ScalarValue::F64(12.0)), - obj: ObjectId::from(actor2.op_id_at(1)), - key: "sparrow".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - clock: hashmap! { - actor1.clone() => 1, - actor2.clone() => 2, - }, - max_op: 2, - pending_changes: 0, - deps: vec![change1.hash, change3.hash], - diffs: RootDiff { - props: hashmap! { - "conflict".into() => hashmap!{ - actor1.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor1.op_id_at(1).into(), - edits: Vec::new(), - }), - actor2.op_id_at(1) => Diff::Map(MapDiff{ - object_id: actor2.op_id_at(1).into(), - props: hashmap!{ - "sparrow".into() => hashmap!{ - actor2.op_id_at(2) => Diff::Value(ScalarValue::F64(12.0)) - } - } - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![change1]).unwrap(); - backend.apply_changes(vec![change2]).unwrap(); - let patch = backend.apply_changes(vec![change3]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test_env_log::test] -fn test_handle_changes_within_conflicted_lists() { - let actor1: ActorId = "01234567".try_into().unwrap(); - let actor2: ActorId = "89abcdef".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor1.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "todos".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: actor1.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor1.clone(), - seq: 2, - start_op: 3, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: actor1.op_id_at(1).into(), - key: actor1.op_id_at(2).into(), - pred: vec![actor1.op_id_at(2)], - insert: false, - }, - Op { - action: amp::OpType::Set("buy milk".into()), - obj: actor1.op_id_at(3).into(), - key: "title".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(false.into()), - obj: actor1.op_id_at(3).into(), - key: "done".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change3: Change = amp::Change { - actor_id: actor2.clone(), - seq: 1, - start_op: 3, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: actor1.op_id_at(1).into(), - key: actor1.op_id_at(2).into(), - pred: vec![actor1.op_id_at(2)], - insert: false, - }, - Op { - action: amp::OpType::Set("water plants".into()), - obj: actor2.op_id_at(3).into(), - key: "title".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(false.into()), - obj: actor2.op_id_at(3).into(), - key: "done".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let mut change4_deps = vec![change2.hash, change3.hash]; - change4_deps.sort(); - - let change4: Change = amp::Change { - actor_id: actor1.clone(), - seq: 3, - start_op: 6, - time: 0, - message: None, - hash: None, - deps: change4_deps, - operations: vec![Op { - action: amp::OpType::Set(true.into()), - obj: actor1.op_id_at(3).into(), - key: "done".into(), - pred: vec![actor1.op_id_at(5)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - clock: hashmap! { - actor2.clone() => 1, - actor1.clone() => 3, - }, - max_op: 6, - pending_changes: 0, - deps: vec![change4.hash], - diffs: RootDiff { - props: hashmap! { - "todos".into() => hashmap!{ - actor1.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor1.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::Update{ - index: 0, - op_id: actor1.op_id_at(3), - value: Diff::Map(MapDiff{ - object_id: actor1.op_id_at(3).into(), - props: hashmap!{ - "done".to_string() => hashmap!{ - actor1.op_id_at(6) => Diff::Value(true.into()) - } - } - }) - }, - amp::DiffEdit::Update{ - index: 0, - op_id: actor2.op_id_at(3), - value: Diff::Map(MapDiff{ - object_id: actor2.op_id_at(3).into(), - props: hashmap!{}, - }) - } - ] - }), - } - }, - }, - }; - - let mut backend = Backend::new(); - let _patch = backend - .apply_changes(vec![change1, change2, change3]) - .unwrap(); - //println!("patch {:#?}", patch); - let patch = backend.apply_changes(vec![change4]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_support_date_objects_at_root() { - let actor: ActorId = "955afa3bbcc140b3b4bac8836479d650".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set(ScalarValue::Timestamp(1_586_528_122_277)), - obj: ObjectId::Root, - key: "now".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 1, - pending_changes: 0, - seq: None, - actor: None, - deps: vec![change.hash], - diffs: RootDiff { - props: hashmap! { - "now".into() => hashmap!{ - actor.op_id_at(1) => Diff::Value(ScalarValue::Timestamp(1_586_528_122_277)) - } - }, - }, - }; - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_support_date_objects_in_a_list() { - let actor: ActorId = "27d467ecb1a640fb9bed448ce7cf6a44".try_into().unwrap(); - let change: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::Timestamp(1_586_528_191_421)), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 2, - pending_changes: 0, - deps: vec![change.hash], - actor: None, - seq: None, - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value(ScalarValue::Timestamp(1_586_528_191_421)) - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![change]).unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_cursor_objects() { - let actor = ActorId::random(); - let change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::Str("something".into())), - obj: actor.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), - obj: ObjectId::Root, - key: "cursor".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - let binchange: Change = (&change).try_into().unwrap(); - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![Change::from(change)]).unwrap(); - let expected_patch = amp::Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 3, - pending_changes: 0, - deps: vec![binchange.hash], - actor: None, - seq: None, - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value(ScalarValue::Str("something".into())), - }], - }) - }, - "cursor".into() => hashmap!{ - actor.op_id_at(3) => Diff::Cursor(CursorDiff{ - object_id: actor.op_id_at(1).into(), - elem_id: actor.op_id_at(2), - index: 0, - }), - }, - }, - }, - }; - assert_eq!(patch, expected_patch); -} - -#[test] -fn test_throws_on_attempt_to_create_missing_cursor() { - let actor = ActorId::random(); - let change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), - obj: ObjectId::Root, - key: "cursor".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let mut backend = Backend::new(); - let err = backend - .apply_changes(vec![Change::from(change)]) - .expect_err("Should be an error"); - if let AutomergeError::InvalidCursor { opid } = err { - if opid != actor.op_id_at(2) { - panic!( - "Expected InvalidCursor error with opid {:?} but found one with {:?}", - actor.op_id_at(2), - opid - ) - } - } else { - panic!("Expected InvalidCursor error but found {:?}", err) - } -} - -#[test] -fn test_updating_sequences_updates_referring_cursors() { - let actor = ActorId::random(); - let change1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::Str("something".into())), - obj: actor.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), - obj: ObjectId::Root, - key: "cursor".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - let binchange1: Change = (&change1).try_into().unwrap(); - let change2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 4, - time: 0, - deps: vec![binchange1.hash], - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set(ScalarValue::Str("something else".into())), - obj: actor.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let binchange2: Change = change2.try_into().unwrap(); - let mut backend = Backend::new(); - backend.apply_changes(vec![binchange1]).unwrap(); - let patch = backend.apply_changes(vec![binchange2.clone()]).unwrap(); - let expected_patch = amp::Patch { - clock: hashmap! { - actor.clone() => 2, - }, - max_op: 4, - pending_changes: 0, - deps: vec![binchange2.hash], - actor: None, - seq: None, - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(4).into(), - op_id: actor.op_id_at(4), - value: Diff::Value(ScalarValue::Str("something else".into())), - }], - }) - }, - "cursor".into() => hashmap!{ - actor.op_id_at(3) => Diff::Cursor(CursorDiff{ - object_id: actor.op_id_at(1).into(), - elem_id: actor.op_id_at(2), - index: 1, - }), - }, - }, - }, - }; - assert_eq!(patch, expected_patch); -} - -#[test] -fn test_updating_sequences_updates_referring_cursors_with_deleted_items() { - let actor = ActorId::random(); - let change1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::Str("something".into())), - obj: actor.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - action: amp::OpType::Set(ScalarValue::Str("something else".into())), - obj: actor.op_id_at(1).into(), - key: actor.op_id_at(2).into(), - insert: true, - pred: Vec::new(), - }, - Op { - action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(3))), - obj: ObjectId::Root, - key: "cursor".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - let binchange1: Change = (&change1).try_into().unwrap(); - let change2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 5, - time: 0, - deps: vec![binchange1.hash], - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: actor.op_id_at(1).into(), - key: actor.op_id_at(2).into(), - insert: false, - pred: vec![actor.op_id_at(2)], - }], - extra_bytes: Vec::new(), - }; - let binchange2: Change = change2.try_into().unwrap(); - let mut backend = Backend::new(); - backend.apply_changes(vec![binchange1]).unwrap(); - let patch = backend.apply_changes(vec![binchange2.clone()]).unwrap(); - let expected_patch = amp::Patch { - clock: hashmap! { - actor.clone() => 2, - }, - max_op: 5, - pending_changes: 0, - deps: vec![binchange2.hash], - actor: None, - seq: None, - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![DiffEdit::Remove{index: 0, count: 1}], - }) - }, - "cursor".into() => hashmap!{ - actor.op_id_at(4) => Diff::Cursor(CursorDiff{ - object_id: actor.op_id_at(1).into(), - elem_id: actor.op_id_at(3), - index: 0, - }), - }, - }, - }, - }; - assert_eq!(patch, expected_patch); -} diff --git a/automerge-backend/tests/apply_local_change.rs b/automerge-backend/tests/apply_local_change.rs deleted file mode 100644 index c0784346..00000000 --- a/automerge-backend/tests/apply_local_change.rs +++ /dev/null @@ -1,611 +0,0 @@ -extern crate automerge_backend; -use std::{collections::HashSet, convert::TryInto, num::NonZeroU32}; - -use amp::RootDiff; -use automerge_backend::{Backend, Change}; -use automerge_protocol as amp; -use automerge_protocol::{ - ActorId, ChangeHash, Diff, DiffEdit, ElementId, ListDiff, ObjType, ObjectId, Op, OpType, Patch, -}; -use maplit::hashmap; - -#[test] -fn test_apply_local_change() { - let actor: ActorId = "eb738e04ef8848ce8b77309b6c7f7e39".try_into().unwrap(); - let change_request = amp::Change { - actor_id: actor.clone(), - time: 0, - message: None, - hash: None, - seq: 1, - deps: Vec::new(), - start_op: 1, - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - key: "bird".into(), - obj: ObjectId::Root, - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - let mut backend = Backend::new(); - let patch = backend.apply_local_change(change_request).unwrap().0; - - let changes = backend.get_changes(&[]); - let expected_change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: changes[0].time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: OpType::Set("magpie".into()), - obj: ObjectId::Root, - key: "bird".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - assert_eq!(changes[0], &expected_change); - - let expected_patch = Patch { - actor: Some(actor.clone()), - max_op: 1, - pending_changes: 0, - seq: Some(1), - clock: hashmap! { - actor => 1, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - "1@eb738e04ef8848ce8b77309b6c7f7e39".try_into().unwrap() => Diff::Value("magpie".into()) - } - }, - }, - }; - assert_eq!(patch, expected_patch); -} - -#[test] -fn test_error_on_duplicate_requests() { - let actor: ActorId = "37704788917a499cb0206fa8519ac4d9".try_into().unwrap(); - let change_request1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - message: None, - hash: None, - time: 0, - deps: Vec::new(), - start_op: 1, - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - obj: ObjectId::Root, - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - let change_request2 = amp::Change { - actor_id: actor, - seq: 2, - message: None, - hash: None, - time: 0, - deps: Vec::new(), - start_op: 2, - operations: vec![Op { - action: amp::OpType::Set("jay".into()), - obj: ObjectId::Root, - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let mut backend = Backend::new(); - backend.apply_local_change(change_request1.clone()).unwrap(); - backend.apply_local_change(change_request2.clone()).unwrap(); - assert!(backend.apply_local_change(change_request1).is_err()); - assert!(backend.apply_local_change(change_request2).is_err()); -} - -#[test] -fn test_handle_concurrent_frontend_and_backend_changes() { - let actor: ActorId = "cb55260e9d7e457886a4fc73fd949202".try_into().unwrap(); - let local1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - start_op: 1, - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - obj: ObjectId::Root, - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - let local2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set("jay".into()), - obj: ObjectId::Root, - key: "bird".into(), - insert: false, - pred: vec![actor.op_id_at(1)], - }], - extra_bytes: Vec::new(), - }; - let remote_actor: ActorId = "6d48a01318644eed90455d2cb68ac657".try_into().unwrap(); - let remote1 = amp::Change { - actor_id: remote_actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set("goldfish".into()), - obj: ObjectId::Root, - key: "fish".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let mut expected_change1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - obj: ObjectId::Root, - key: "bird".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - }; - - let mut expected_change2 = amp::Change { - actor_id: remote_actor, - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("goldfish".into()), - key: "fish".into(), - obj: ObjectId::Root, - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - }; - - let mut expected_change3 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("jay".into()), - obj: ObjectId::Root, - key: "bird".into(), - pred: vec![actor.op_id_at(1)], - insert: false, - }], - extra_bytes: Vec::new(), - }; - let mut backend = Backend::new(); - backend.apply_local_change(local1).unwrap(); - let backend_after_first = backend.clone(); - let changes1 = backend_after_first.get_changes(&[]); - let change01 = changes1.get(0).unwrap(); - - backend.apply_changes(vec![remote1]).unwrap(); - let backend_after_second = backend.clone(); - let changes2 = backend_after_second.get_changes(&[change01.hash]); - let change12 = *changes2.get(0).unwrap(); - - backend.apply_local_change(local2).unwrap(); - let changes3 = backend.get_changes(&[change01.hash, change12.hash]); - let change23 = changes3.get(0).unwrap(); - - expected_change1.time = change01.time; - expected_change2.time = change12.time; - expected_change3.time = change23.time; - expected_change3.deps = vec![change01.hash]; - - assert_eq!(change01, &&expected_change1.try_into().unwrap()); - assert_eq!(change12, &expected_change2.try_into().unwrap()); - assert_changes_equal(change23.decode(), expected_change3.clone()); - assert_eq!(change23, &&expected_change3.try_into().unwrap()); -} - -#[test] -fn test_transform_list_indexes_into_element_ids() { - let actor: ActorId = "8f389df8fecb4ddc989102321af3578e".try_into().unwrap(); - let remote_actor: ActorId = "9ba21574dc44411b8ce37bc6037a9687".try_into().unwrap(); - let remote1: Change = amp::Change { - actor_id: remote_actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Make(ObjType::List), - key: "birds".into(), - obj: ObjectId::Root, - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let remote2: Change = amp::Change { - actor_id: remote_actor.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![remote1.hash], - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - obj: ObjectId::from(remote_actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let local1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - message: None, - hash: None, - time: 0, - deps: vec![remote1.hash], - start_op: 2, - operations: vec![Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("goldfinch".into()), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let local2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - message: None, - hash: None, - deps: Vec::new(), - time: 0, - start_op: 3, - operations: vec![Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("wagtail".into()), - key: actor.op_id_at(2).into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - let local3 = amp::Change { - actor_id: actor.clone(), - seq: 3, - message: None, - hash: None, - deps: vec![remote2.hash], - time: 0, - start_op: 4, - operations: vec![ - Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("Magpie".into()), - key: remote_actor.op_id_at(2).into(), - insert: false, - pred: vec![remote_actor.op_id_at(2)], - }, - Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("Goldfinch".into()), - key: actor.op_id_at(2).into(), - insert: false, - pred: vec![actor.op_id_at(2)], - }, - ], - extra_bytes: Vec::new(), - }; - - let mut expected_change1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![remote1.hash], - operations: vec![Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("goldfinch".into()), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let mut expected_change2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 3, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("wagtail".into()), - key: actor.op_id_at(2).into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - let mut expected_change3 = amp::Change { - actor_id: actor.clone(), - seq: 3, - start_op: 4, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("Magpie".into()), - key: remote_actor.op_id_at(2).into(), - pred: vec![remote_actor.op_id_at(2)], - insert: false, - }, - Op { - obj: ObjectId::from(remote_actor.op_id_at(1)), - action: amp::OpType::Set("Goldfinch".into()), - key: actor.op_id_at(2).into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }, - ], - extra_bytes: Vec::new(), - }; - - let mut backend = Backend::new(); - backend.apply_changes(vec![remote1.clone()]).unwrap(); - backend.apply_local_change(local1).unwrap(); - let backend_after_first = backend.clone(); - let changes1 = backend_after_first.get_changes(&[remote1.hash]); - let change12 = *changes1.get(0).unwrap(); - - backend.apply_changes(vec![remote2.clone()]).unwrap(); - backend.apply_local_change(local2).unwrap(); - let backend_after_second = backend.clone(); - let changes2 = backend_after_second.get_changes(&[remote2.hash, change12.hash]); - let change23 = *changes2.get(0).unwrap(); - - backend.apply_local_change(local3).unwrap(); - let changes3 = backend.get_changes(&[remote2.hash, change23.hash]); - let change34 = changes3.get(0).unwrap().decode(); - - expected_change1.time = change12.time; - expected_change2.time = change23.time; - expected_change2.deps = vec![change12.hash]; - expected_change3.time = change34.time; - expected_change3.deps = vec![remote2.hash, change23.hash]; - - assert_changes_equal(change34, expected_change3); - assert_eq!(change12, &expected_change1.try_into().unwrap()); - assert_changes_equal(change23.decode(), expected_change2.clone()); - assert_eq!(change23, &expected_change2.try_into().unwrap()); -} - -#[test] -fn test_handle_list_insertion_and_deletion_in_same_change() { - let actor: ActorId = "0723d2a1940744868ffd6b294ada813f".try_into().unwrap(); - let local1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - message: None, - hash: None, - time: 0, - deps: Vec::new(), - start_op: 1, - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Make(ObjType::List), - key: "birds".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - let local2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - message: None, - hash: None, - time: 0, - deps: Vec::new(), - start_op: 2, - operations: vec![ - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set("magpie".into()), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: OpType::Del(NonZeroU32::new(1).unwrap()), - key: actor.op_id_at(2).into(), - insert: false, - pred: vec![actor.op_id_at(2)], - }, - ], - extra_bytes: Vec::new(), - }; - - let mut expected_patch = Patch { - actor: Some(actor.clone()), - seq: Some(2), - max_op: 3, - pending_changes: 0, - clock: hashmap! { - actor.clone() => 2 - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: ObjectId::from(actor.op_id_at(1)), - edits: vec![ - DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value("magpie".into()), - }, - DiffEdit::Remove{index: 0, count: 1}, - ], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.apply_local_change(local1).unwrap(); - let patch = backend.apply_local_change(local2).unwrap().0; - expected_patch.deps = patch.deps.clone(); - assert_eq!(patch, expected_patch); - - let changes = backend.get_changes(&[]); - assert_eq!(changes.len(), 2); - let change1 = changes[0].clone(); - let change2 = changes[1].clone(); - - let expected_change1 = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: change1.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Make(ObjType::List), - key: "birds".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_change2 = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: change2.time, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![ - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set("magpie".into()), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: OpType::Del(NonZeroU32::new(1).unwrap()), - key: actor.op_id_at(2).into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - assert_eq!(change1, expected_change1); - assert_eq!(change2, expected_change2); -} - -/// Asserts that the changes are equal without respect to order of the hashes -/// in the change dependencies -fn assert_changes_equal(mut change1: amp::Change, change2: amp::Change) { - let change2_clone = change2.clone(); - let deps1: HashSet<&ChangeHash> = change1.deps.iter().collect(); - let deps2: HashSet<&ChangeHash> = change2.deps.iter().collect(); - assert_eq!( - deps1, deps2, - "The two changes did not have equal dependencies, left: {:?}, right: {:?}", - deps1, deps2 - ); - change1.deps = change2.deps; - assert_eq!(change1, change2_clone) -} diff --git a/automerge-backend/tests/get_changes.rs b/automerge-backend/tests/get_changes.rs deleted file mode 100644 index 8d0e0184..00000000 --- a/automerge-backend/tests/get_changes.rs +++ /dev/null @@ -1,33 +0,0 @@ -use automerge_backend::{Backend, Change}; - -// This test reproduces issue 95 (https://github.com/automerge/automerge-rs/issues/95) -// where compressed changes were losing their header during decompression such -// that when the compressed changes were written out again they were invalid. -#[test] -fn test_deflate_correctly() { - let init_change: Vec = vec![ - 133, 111, 74, 131, 252, 38, 106, 255, 2, 195, 2, 117, 143, 189, 74, 4, 49, 16, 128, 147, - 189, 61, 239, 7, 185, 83, 196, 43, 101, 26, 75, 183, 178, 179, 17, 181, 177, 17, 27, 181, - 14, 217, 120, 55, 144, 77, 150, 73, 178, 156, 87, 172, 133, 224, 3, 88, 248, 58, 98, 227, - 29, 86, 98, 167, 22, 118, 190, 133, 96, 86, 177, 176, 48, 153, 129, 249, 253, 102, 134, - 173, 124, 108, 220, 111, 221, 188, 239, 14, 239, 6, 184, 57, 111, 157, 84, 156, 127, 190, - 190, 93, 45, 13, 14, 13, 122, 20, 26, 103, 194, 163, 53, 172, 207, 219, 201, 112, 181, 179, - 54, 90, 223, 217, 238, 239, 45, 159, 246, 207, 94, 120, 217, 98, 201, 19, 103, 44, 153, 37, - 173, 180, 189, 212, 89, 240, 110, 221, 110, 177, 222, 188, 137, 177, 228, 146, 49, 254, - 171, 53, 235, 61, 112, 206, 146, 186, 35, 3, 57, 75, 174, 43, 39, 168, 115, 82, 38, 230, - 255, 179, 83, 175, 166, 158, 45, 120, 146, 250, 139, 82, 37, 252, 251, 69, 119, 218, 208, - 227, 79, 31, 57, 239, 198, 252, 168, 190, 229, 215, 252, 192, 26, 37, 161, 176, 90, 163, - 131, 137, 50, 17, 66, 232, 129, 208, 5, 151, 193, 49, 9, 229, 148, 241, 80, 41, 163, 76, - 188, 201, 65, 161, 124, 112, 32, 60, 120, 75, 81, 160, 12, 186, 66, 35, 8, 42, 65, 216, - 244, 252, 16, 43, 244, 66, 129, 37, 137, 224, 84, 14, 185, 213, 177, 150, 130, 167, 80, - 128, 8, 50, 118, 102, 112, 20, 180, 22, 5, 52, 183, 69, 164, 22, 18, 13, 10, 80, 36, 124, - 6, 251, 36, 28, 4, 237, 9, 37, 170, 56, 21, 65, 5, 240, 129, 202, 63, 107, 158, 19, 154, - 49, 70, 74, 86, 10, 18, 99, 18, 229, 36, 183, 50, 20, 113, 229, 103, 206, 190, 0, - ]; - let change: Change = Change::from_bytes(init_change.clone()).unwrap(); - let mut backend = Backend::new(); - backend.apply_changes(vec![change]).unwrap(); - - let change_back = backend.get_changes(&[]); - assert_eq!(change_back[0].raw_bytes().to_vec(), init_change); -} diff --git a/automerge-backend/tests/get_patch.rs b/automerge-backend/tests/get_patch.rs deleted file mode 100644 index 08eaec48..00000000 --- a/automerge-backend/tests/get_patch.rs +++ /dev/null @@ -1,690 +0,0 @@ -extern crate automerge_backend; -use std::{convert::TryInto, num::NonZeroU32}; - -use amp::RootDiff; -use automerge_backend::{Backend, Change}; -use automerge_protocol as amp; -use automerge_protocol::{ - ActorId, Diff, DiffEdit, ElementId, ListDiff, MapDiff, ObjectId, Op, Patch, ScalarValue, -}; -use maplit::hashmap; -use pretty_assertions::assert_eq; - -#[test] -fn test_include_most_recent_value_for_key() { - let actor: ActorId = "ec28cfbcdb9e4f32ad24b3c776e651b0".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - key: "bird".into(), - obj: ObjectId::Root, - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - message: None, - hash: None, - deps: vec![change1.hash], - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set("blackbird".into()), - key: "bird".into(), - pred: vec![actor.op_id_at(1)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - clock: hashmap! { - actor.clone() => 2, - }, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor.op_id_at(2) => Diff::Value("blackbird".into()), - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1, change2]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_includes_conflicting_values_for_key() { - let actor1: ActorId = "111111".try_into().unwrap(); - let actor2: ActorId = "222222".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor1.clone(), - seq: 1, - start_op: 1, - time: 0, - deps: Vec::new(), - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Set("magpie".into()), - obj: ObjectId::Root, - key: "bird".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor2.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("blackbird".into()), - key: "bird".into(), - obj: ObjectId::Root, - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor1.clone() => 1, - actor2.clone() => 1, - }, - max_op: 1, - pending_changes: 0, - seq: None, - actor: None, - deps: vec![change1.hash, change2.hash], - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor1.op_id_at(1) => Diff::Value("magpie".into()), - actor2.op_id_at(1) => Diff::Value("blackbird".into()), - }, - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1, change2]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_handles_counter_increment_at_keys_in_a_map() { - let actor: ActorId = "46c92088e4484ae5945dc63bf606a4a5".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set(ScalarValue::Counter(1)), - obj: ObjectId::Root, - key: "counter".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 2, - time: 0, - deps: vec![change1.hash], - message: None, - hash: None, - operations: vec![Op { - action: amp::OpType::Inc(2), - obj: ObjectId::Root, - key: "counter".into(), - pred: vec![actor.op_id_at(1)], - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - seq: None, - actor: None, - clock: hashmap! { - actor.clone() => 2, - }, - max_op: 2, - pending_changes: 0, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "counter".into() => hashmap!{ - actor.op_id_at(1) => Diff::Value(ScalarValue::Counter(3)) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1, change2]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_creates_nested_maps() { - let actor: ActorId = "06148f9422cb40579fd02f1975c34a51".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set(ScalarValue::F64(3.0)), - key: "wrens".into(), - obj: ObjectId::from(actor.op_id_at(1)), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let change2: Change = amp::Change { - actor_id: actor.clone(), - seq: 2, - start_op: 3, - time: 0, - deps: vec![change1.hash], - message: None, - hash: None, - operations: vec![ - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - key: "wrens".into(), - pred: vec![actor.op_id_at(2)], - insert: false, - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set(ScalarValue::F64(15.0)), - key: "sparrows".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 2, - }, - actor: None, - seq: None, - max_op: 4, - pending_changes: 0, - deps: vec![change2.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::Map(MapDiff{ - object_id: ObjectId::from(actor.op_id_at(1)), - props: hashmap!{ - "sparrows".into() => hashmap!{ - actor.op_id_at(4) => Diff::Value(ScalarValue::F64(15.0)) - } - } - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1, change2]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_create_lists() { - let actor: ActorId = "90bf7df682f747fa82ac604b35010906".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "birds".into(), - pred: Vec::new(), - insert: false, - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set("chaffinch".into()), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 2, - pending_changes: 0, - actor: None, - seq: None, - deps: vec![change1.hash], - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: ObjectId::from(actor.op_id_at(1)), - edits: vec![DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value("chaffinch".into()), - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_includes_latests_state_of_list() { - let actor: ActorId = "6caaa2e433de42ae9c3fa65c9ff3f03e".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "todos".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: ObjectId::from(actor.op_id_at(1)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - Op { - obj: ObjectId::from(actor.op_id_at(2)), - action: amp::OpType::Set("water plants".into()), - key: "title".into(), - pred: Vec::new(), - insert: false, - }, - Op { - obj: ObjectId::from(actor.op_id_at(2)), - action: amp::OpType::Set(false.into()), - key: "done".into(), - pred: Vec::new(), - insert: false, - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1 - }, - max_op: 4, - pending_changes: 0, - actor: None, - seq: None, - deps: vec![change1.hash], - diffs: RootDiff { - props: hashmap! { - "todos".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: ObjectId::from(actor.op_id_at(1)), - edits: vec![DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Map(MapDiff{ - object_id: actor.op_id_at(2).into(), - props: hashmap!{ - "title".into() => hashmap!{ - actor.op_id_at(3) => Diff::Value("water plants".into()), - }, - "done".into() => hashmap!{ - actor.op_id_at(4) => Diff::Value(false.into()) - } - } - }) - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_includes_date_objects_at_root() { - let actor: ActorId = "90f5dd5d4f524e95ad5929e08d1194f1".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![Op { - obj: ObjectId::Root, - action: amp::OpType::Set(ScalarValue::Timestamp(1_586_541_033_457)), - key: "now".into(), - pred: Vec::new(), - insert: false, - }], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 1, - pending_changes: 0, - actor: None, - seq: None, - deps: vec![change1.hash], - diffs: RootDiff { - props: hashmap! { - "now".into() => hashmap!{ - actor.op_id_at(1) => Diff::Value(ScalarValue::Timestamp(1_586_541_033_457)) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_includes_date_objects_in_a_list() { - let actor: ActorId = "08b050f976a249349021a2e63d99c8e8".try_into().unwrap(); - let change1: Change = amp::Change { - actor_id: actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - obj: ObjectId::Root, - action: amp::OpType::Make(amp::ObjType::List), - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - obj: ObjectId::from(actor.op_id_at(1)), - action: amp::OpType::Set(ScalarValue::Timestamp(1_586_541_089_595)), - key: ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - } - .try_into() - .unwrap(); - - let expected_patch = Patch { - clock: hashmap! { - actor.clone() => 1, - }, - max_op: 2, - pending_changes: 0, - actor: None, - seq: None, - deps: vec![change1.hash], - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: ObjectId::from(actor.op_id_at(1)), - edits: vec![DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: Diff::Value(ScalarValue::Timestamp(1_586_541_089_595)), - }], - }) - } - }, - }, - }; - - let mut backend = Backend::new(); - backend.load_changes(vec![change1]).unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} - -#[test] -fn test_includes_updates_for_conflicting_list_elements() { - let local_actor = ActorId::random(); - let actor1: ActorId = "da45d93f2b18456f8318c723d1430563".try_into().unwrap(); - let actor2: ActorId = "6caaa2e433de42ae9c3fa65c9ff3f03e".try_into().unwrap(); - let local_change = amp::Change { - actor_id: local_actor.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: ObjectId::Root, - key: "list".into(), - pred: Vec::new(), - insert: false, - }, - Op { - action: amp::OpType::Set("local".into()), - obj: local_actor.op_id_at(1).into(), - key: amp::ElementId::Head.into(), - pred: Vec::new(), - insert: true, - }, - ], - extra_bytes: Vec::new(), - }; - let binchange: Change = local_change.clone().try_into().unwrap(); - - let remote_change_1: Change = amp::Change { - actor_id: actor1.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: vec![binchange.hash], - extra_bytes: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("remote1".into()), - obj: local_actor.op_id_at(1).into(), - key: local_actor.op_id_at(2).into(), - pred: vec![local_actor.op_id_at(2)], - insert: false, - }], - } - .try_into() - .unwrap(); - - let remote_change_2: Change = amp::Change { - actor_id: actor2.clone(), - seq: 1, - start_op: 1, - time: 0, - message: None, - hash: None, - deps: vec![binchange.hash], - extra_bytes: Vec::new(), - operations: vec![Op { - action: amp::OpType::Set("remote2".into()), - obj: local_actor.op_id_at(1).into(), - key: local_actor.op_id_at(2).into(), - pred: vec![local_actor.op_id_at(2)], - insert: false, - }], - } - .try_into() - .unwrap(); - - let mut deps = vec![remote_change_2.hash, remote_change_1.hash]; - deps.sort(); - - let expected_patch = Patch { - clock: hashmap! { - local_actor.clone() => 1, - actor1.clone() => 1, - actor2.clone() => 1, - }, - max_op: 2, - actor: None, - seq: None, - deps, - diffs: RootDiff { - props: hashmap! { - "list".into() => hashmap!{ - local_actor.op_id_at(1) => Diff::List(ListDiff{ - object_id: ObjectId::from(local_actor.op_id_at(1)), - edits: vec![ - DiffEdit::SingleElementInsert{ - index: 0, - elem_id: local_actor.op_id_at(2).into(), - op_id: actor1.op_id_at(1), - value: Diff::Value("remote1".into()), - }, - DiffEdit::Update{ - index: 0, - op_id: actor2.op_id_at(1), - value: Diff::Value("remote2".into()) - }, - ], - }) - } - }, - }, - pending_changes: 0, - }; - - let mut backend = Backend::new(); - backend.apply_local_change(local_change).unwrap(); - backend - .load_changes(vec![remote_change_1, remote_change_2]) - .unwrap(); - let patch = backend.get_patch().unwrap(); - assert_eq!(patch, expected_patch) -} diff --git a/automerge-backend/tests/load.rs b/automerge-backend/tests/load.rs deleted file mode 100644 index 7d291f7b..00000000 --- a/automerge-backend/tests/load.rs +++ /dev/null @@ -1,52 +0,0 @@ -use automerge_backend::Backend; - -#[test] -fn test_load_index_out_of_bounds() { - // these are just random bytes - let bytes = vec![133, 111, 74, 131, 0, 46, 128, 0]; - let _ = Backend::load(bytes); -} - -#[test] -fn test_load_index_out_of_bounds_2() { - // these are just random bytes - let bytes = vec![ - 133, 111, 74, 131, 171, 99, 102, 54, 2, 16, 42, 0, 18, 255, 255, 61, 57, 57, 57, 29, 48, - 48, 48, 116, 0, 0, 0, 46, 46, - ]; - let _ = Backend::load(bytes); -} - -#[test] -fn test_load_index_out_of_bounds_3() { - // these are just random bytes - let bytes = vec![133, 111, 74, 131, 29, 246, 20, 11, 0, 2, 8, 61, 44]; - let _ = Backend::load(bytes); -} - -#[test] -fn test_load_leb_failed_to_read_whole_buffer() { - // these are just random bytes - let bytes = vec![133, 111, 74, 131, 46, 46, 46, 46, 46]; - let _ = Backend::load(bytes); -} - -#[test] -fn test_load_overflowing_add() { - // these are just random bytes - let bytes = vec![ - 133, 111, 74, 131, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, - 16, - ]; - let _ = Backend::load(bytes); -} - -#[test] -fn test_load_overflowing_sub() { - // these are just random bytes - let bytes = vec![ - 133, 111, 74, 131, 68, 193, 221, 243, 2, 16, 35, 80, 80, 10, 131, 0, 255, 28, 10, 0, 0, 65, - 8, 0, 133, 0, - ]; - let _ = Backend::load(bytes); -} diff --git a/automerge-c-v2/.gitignore b/automerge-c-v2/.gitignore deleted file mode 100644 index 0ae7bbac..00000000 --- a/automerge-c-v2/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -automerge -automerge.o diff --git a/automerge-c-v2/Cargo.toml b/automerge-c-v2/Cargo.toml deleted file mode 100644 index 20bf4595..00000000 --- a/automerge-c-v2/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "automerge-c-v2" -version = "0.1.0" -authors = ["Orion Henry "] -edition = "2018" - -[lib] -name = "automerge" -crate-type = ["cdylib", "staticlib"] -bench = false - -[dependencies] -automerge-backend = { path = "../automerge-backend" } -automerge-protocol = { path = "../automerge-protocol" } -libc = "^0.2" -serde = "^1.0" -serde_json = "^1.0" -errno = "^0.2" -thiserror = "1.0.16" -rmp = "0.8.10" -rmp-serde = "0.15.4" - -[build-dependencies] -cbindgen = "^0.14" diff --git a/automerge-c-v2/Makefile b/automerge-c-v2/Makefile deleted file mode 100644 index f71b1b8a..00000000 --- a/automerge-c-v2/Makefile +++ /dev/null @@ -1,30 +0,0 @@ - -CC=gcc -CFLAGS=-I. -DEPS=automerge.h -LIBS=-lpthread -ldl -lm -LDIR=../target/release -LIB=../target/release/libautomerge.a -DEBUG_LIB=../target/debug/libautomerge.a - -all: automerge $(LIB) - -debug: LDIR=../target/debug -debug: automerge $(DEBUG_LIB) - -automerge: automerge.o $(LDIR)/libautomerge.a - $(CC) -o $@ automerge.o $(LDIR)/libautomerge.a $(LIBS) -L$(LDIR) - -$(DEBUG_LIB): src/lib.rs - cargo build - -$(LIB): src/lib.rs - cargo build --release - -%.o: %.c $(DEPS) - $(CC) -c -o $@ $< $(CFLAGS) - -.PHONY: clean - -clean: - rm -f *.o automerge $(LIB) $(DEBUG_LIB) diff --git a/automerge-c-v2/automerge.c b/automerge-c-v2/automerge.c deleted file mode 100644 index 12df1cbd..00000000 --- a/automerge-c-v2/automerge.c +++ /dev/null @@ -1,271 +0,0 @@ - -#include -#include -#include -#include "automerge.h" - -#define BUFSIZE 4096 -#define CMP_PATCH(x, y) \ - do { \ - char _buff[BUFSIZE]; \ - char _buff2[BUFSIZE]; \ - Buffer _rbuff = automerge_create_buff(); \ - int ret = automerge_get_patch(x, &_rbuff); \ - int len1 = _rbuff.len; \ - ASSERT_RET(x, 0); \ - ret = automerge_get_patch(y, &_rbuff); \ - int len2 = _rbuff.len; \ - ASSERT_RET(y, 0); \ - printf("*** get_patch of " #x " & " #y " -- (likely) equal? *** --> %s\n\n", len1 == len2 ? "true": "false"); \ - assert(len1 == len2); \ - automerge_free_buff(&_rbuff); \ - } while (0) - -// Probably shouldn't use implicit declaration of `ret`... -#define ASSERT_RET(db, expected) \ - do { \ - if (ret != expected) { \ - printf("LINE: %d, expected ret to be: %d, but it was: %d. Error: %s\n", __LINE__, expected, ret, automerge_error(db)); \ - assert(ret == expected); \ - } \ - } while(0) - -#define SEND_MSG(x, y) \ - do { \ - ret = automerge_generate_sync_message(db ## x, &rbuff, ss ## x); \ - ASSERT_RET(db ## x, 0); \ - ret = automerge_receive_sync_message(db ## y, &rbuff, ss ## y, rbuff.data, rbuff.len); \ - ASSERT_RET(db ## y, 0); \ - } while (0) - -void test_sync_basic() { - printf("begin sync test - basic\n"); - int ret; - - Buffer rbuff = automerge_create_buff(); - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - - SyncState * ssA = automerge_sync_state_init(); - SyncState * ssB = automerge_sync_state_init(); - - ret = automerge_generate_sync_message(dbA, &rbuff, ssA); - ASSERT_RET(dbA, 0); - ret = automerge_receive_sync_message(dbB, &rbuff, ssB, rbuff.data, rbuff.len); - ASSERT_RET(dbB, 0); - - ret = automerge_generate_sync_message(dbB, &rbuff, ssB); - ASSERT_RET(dbB, 0); - assert(rbuff.len == 0); - - automerge_sync_state_free(ssA); - automerge_sync_state_free(ssB); - automerge_free_buff(&rbuff); -} - -void test_sync_encode_decode() { - printf("begin sync test - encode/decode\n"); - int ret; - - char buff[BUFSIZE]; - char sync_state_buff[BUFSIZE]; - - Buffer rbuff = automerge_create_buff(); - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - SyncState * ssA = automerge_sync_state_init(); - SyncState * ssB = automerge_sync_state_init(); - - const char * requestA1 = "{\"actor\":\"111111\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"magpie\",\"pred\":[]}]}"; - const char * requestB1 = "{\"actor\":\"222222\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"crow\",\"pred\":[]}]}"; - - unsigned char * A1msgpack = NULL; - unsigned char * B1msgpack = NULL; - uintptr_t A1msgpack_len = 0; - uintptr_t B1msgpack_len = 0; - - debug_json_change_to_msgpack(requestA1, &A1msgpack, &A1msgpack_len); - debug_json_change_to_msgpack(requestB1, &B1msgpack, &B1msgpack_len); - - ret = automerge_apply_local_change(dbA, &rbuff, A1msgpack, A1msgpack_len); - ASSERT_RET(dbA, 0); - ret = automerge_apply_local_change(dbB, &rbuff, B1msgpack, B1msgpack_len); - ASSERT_RET(dbB, 0); - - // A -> B - SEND_MSG(A, B); - - // B -> A - SEND_MSG(B, A); - - // A -> B - SEND_MSG(A, B); - - // B -> A - SEND_MSG(B, A); - - ret = automerge_generate_sync_message(dbA, &rbuff, ssA); - ASSERT_RET(dbA, 0); - - // Save the sync state - ret = automerge_encode_sync_state(dbB, &rbuff, ssB); - ASSERT_RET(dbB, 0); - // Read it back - ret = automerge_decode_sync_state(dbB, rbuff.data, rbuff.len, &ssB); - ASSERT_RET(dbB, 0); - - // Redo B -> A - SEND_MSG(B, A); - - ret = automerge_generate_sync_message(dbA, &rbuff, ssA); - ASSERT_RET(dbA, 0); - assert(rbuff.len == 0); -} - -int main() { - int ret; - - // In a real application you would need to check to make sure your buffer is large enough for any given read - char buff[BUFSIZE]; - char buff2[BUFSIZE]; - char buff3[BUFSIZE]; - - printf("begin\n"); - - Buffer rbuff = automerge_create_buff(); - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - - const char * requestA1 = "{\"actor\":\"111111\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"magpie\",\"pred\":[]}]}"; - const char * requestA2 = "{\"actor\":\"111111\",\"seq\":2,\"time\":0,\"deps\":[],\"startOp\":2,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"dog\",\"value\":\"mastiff\",\"pred\":[]}]}"; - const char * requestB1 = "{\"actor\":\"222222\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"crow\",\"pred\":[]}]}"; - const char * requestB2 = "{\"actor\":\"222222\",\"seq\":2,\"time\":0,\"deps\":[],\"startOp\":2,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"cat\",\"value\":\"tabby\",\"pred\":[]}]}"; - - unsigned char * A1msgpack = NULL; - unsigned char * A2msgpack = NULL; - unsigned char * B1msgpack = NULL; - unsigned char * B2msgpack = NULL; - uintptr_t A1msgpack_len = 0; - uintptr_t A2msgpack_len = 0; - uintptr_t B1msgpack_len = 0; - uintptr_t B2msgpack_len = 0; - - debug_json_change_to_msgpack(requestA1, &A1msgpack, &A1msgpack_len); - debug_json_change_to_msgpack(requestA2, &A2msgpack, &A2msgpack_len); - debug_json_change_to_msgpack(requestB1, &B1msgpack, &B1msgpack_len); - debug_json_change_to_msgpack(requestB2, &B2msgpack, &B2msgpack_len); - - ret = automerge_apply_local_change(dbA, &rbuff, A1msgpack, A1msgpack_len); - ASSERT_RET(dbA, 0); - printf("cap: %ld, len: %ld, ptr: %p\n",rbuff.cap, rbuff.len, rbuff.data); - debug_print_msgpack_patch("*** patchA1 ***", rbuff.data, rbuff.len); - - // TODO: Port this test to msgpack - // ret = automerge_apply_local_change(dbA, &rbuff, "{}"); - // ASSERT_RET(dbA, 0); - // printf("*** patchA2 expected error string ** (%s)\n\n",automerge_error(dbA)); - - ret = automerge_apply_local_change(dbA, &rbuff, A2msgpack, A2msgpack_len); - ASSERT_RET(dbA, 0); - debug_print_msgpack_patch("*** patchA2 ***", rbuff.data, rbuff.len); - - ret = automerge_apply_local_change(dbB, &rbuff, B1msgpack, B1msgpack_len); - ASSERT_RET(dbB, 0); - debug_print_msgpack_patch("*** patchB1 ***", rbuff.data, rbuff.len); - - ret = automerge_apply_local_change(dbB, &rbuff, B2msgpack, B2msgpack_len); - ASSERT_RET(dbB, 0); - debug_print_msgpack_patch("*** patchB2 ***", rbuff.data, rbuff.len); - - printf("*** clone dbA -> dbC ***\n\n"); - Backend * dbC = NULL; - ret = automerge_clone(dbA, &dbC); - ASSERT_RET(dbA, 0); - - CMP_PATCH(dbA, dbC); - - ret = automerge_save(dbA, &rbuff); - ASSERT_RET(dbA, 0); - printf("*** save dbA - %ld bytes ***\n\n", rbuff.len); - - printf("*** load the save into dbD ***\n\n"); - Backend * dbD = automerge_load(rbuff.data, rbuff.len); - - CMP_PATCH(dbA, dbD); - - ret = automerge_get_changes_for_actor(dbA, &rbuff, "111111"); - ASSERT_RET(dbA, 0); - - // We are reading one return value (rbuff) while needing to return - // something else, so we need another `Buffers` struct - // Buffers rbuff2 = automerge_create_buffs(); - // int start = 0; - // for(int i = 0; i < rbuff.lens_len; ++i) { - // int len = rbuff.lens[i]; - // char * data_start = rbuff.data + start; - // automerge_decode_change(dbA, &rbuff2, data_start, len); - // util_read_buffs(&rbuff2, 0, buff2); - // printf("Change decoded to msgpack\n"); - // start += len; - // automerge_encode_change(dbB, &rbuff2, buff2, rbuff2.lens[0]); - // assert(memcmp(data_start, rbuff2.data, len) == 0); - // } - // CBuffers cbuffs = { data: rbuff.data, data_len: rbuff.data_len, lens: rbuff.lens, lens_len: rbuff.lens_len }; - // ret = automerge_apply_changes(dbB, &rbuff, cbuffs); - // ASSERT_RET(dbB, 0); - // automerge_free_buffs(&rbuff2); - - ret = automerge_apply_changes(dbB, &rbuff, rbuff.data, rbuff.len); - ASSERT_RET(dbB, 0); - - printf("*** get head from dbB ***\n\n"); - ret = automerge_get_heads(dbB, &rbuff); - ASSERT_RET(dbB,0); - - //int num_heads = 0; - //for (int i = 0; i < rbuff.lens_len; ++i) { - // assert(rbuff.lens[i] == 32); - // util_read_buffs(&rbuff, i, buff3 + (num_heads * 32)); - // num_heads++; - //} - //assert(num_heads == 2); - ret = automerge_get_changes(dbB, &rbuff, rbuff.data, rbuff.len); - ASSERT_RET(dbB, 0); - - printf("*** copy changes from dbB to A ***\n\n"); - ret = automerge_get_changes_for_actor(dbB, &rbuff, "222222"); - ASSERT_RET(dbB, 0); - - ret = automerge_apply_changes(dbA, &rbuff, rbuff.data, rbuff.len); - ASSERT_RET(dbA, 0); - - CMP_PATCH(dbA, dbB); - - printf("*** copy changes from dbA to E using load ***\n\n"); - Backend * dbE = automerge_init(); - ret = automerge_get_changes(dbA, &rbuff, NULL, 0); - ASSERT_RET(dbA, 0); - ret = automerge_load_changes(dbE, rbuff.data, rbuff.len); - ASSERT_RET(dbE, 0); - - CMP_PATCH(dbA, dbE); - CMP_PATCH(dbA, dbB); - - //ret = automerge_get_missing_deps(dbE, &rbuff, buff3, num_heads); - //ASSERT_RET(dbE, 0); - //util_read_buffs(&rbuff, 0, buff); - //assert(strlen(buff) == 2); // [] - nothing missing - - test_sync_basic(); - test_sync_encode_decode(); - - printf("free resources\n"); - automerge_free(dbA); - automerge_free(dbB); - automerge_free(dbC); - automerge_free(dbD); - automerge_free(dbE); - automerge_free_buff(&rbuff); - - printf("end\n"); -} diff --git a/automerge-c-v2/automerge.h b/automerge-c-v2/automerge.h deleted file mode 100644 index d4b00f4a..00000000 --- a/automerge-c-v2/automerge.h +++ /dev/null @@ -1,214 +0,0 @@ -#ifndef automerge_h -#define automerge_h - -/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ - -#include -#include - -typedef struct Backend Backend; - -typedef struct SyncState SyncState; - -/** - * A sequence of byte buffers that are contiguous in memory - * The C caller allocates one of these with `create_buffs` - * and passes it into each API call. This prevents allocating memory - * on each call. The struct fields are just the constituent fields in a Vec - * This is used for returning data to C. - */ -typedef struct { - /** - * A pointer to the bytes - */ - uint8_t *data; - /** - * The amount of meaningful bytes - */ - uintptr_t len; - /** - * The total allocated memory `data` points to - * This is needed so Rust can free `data` - */ - uintptr_t cap; -} Buffer; - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - * `CBuffers` should be non-null & have valid fields. - */ -intptr_t automerge_apply_changes(Backend *backend, Buffer *buffs, const uint8_t *changes, uintptr_t changes_len); - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - * and a valid pointer to a `Buffers`` - */ -intptr_t automerge_apply_local_change(Backend *backend, Buffer *buffs, const uint8_t *request, uintptr_t len); - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - */ -intptr_t automerge_clone(Backend *backend, Backend **new_); - -/** - * Create a `Buffers` struct to store return values - */ -Buffer automerge_create_buff(void); - -/** - * # Safety - * This must me called with a valid pointer to a change and the correct len - */ -intptr_t automerge_decode_change(Backend *backend, Buffer *buffs, const uint8_t *change, uintptr_t len); - -/** - * # Safety - * `encoded_state_[ptr|len]` must be the address & length of a byte array - */ -intptr_t automerge_decode_sync_state(Backend *backend, - const uint8_t *encoded_state_ptr, - uintptr_t encoded_state_len, - SyncState **sync_state); - -/** - * # Safety - * This must me called with a valid pointer to a JSON string of a change - */ -intptr_t automerge_encode_change(Backend *backend, Buffer *buffs, const uint8_t *change, uintptr_t len); - -/** - * # Safety - * Must be called with a pointer to a valid Backend, sync_state, and buffs - */ -intptr_t automerge_encode_sync_state(Backend *backend, Buffer *buffs, SyncState *sync_state); - -/** - * # Safety - * This must be called with a valid backend pointer - */ -const char *automerge_error(Backend *backend); - -/** - * # Safety - * This must be called with a valid backend pointer - */ -void automerge_free(Backend *backend); - -/** - * # Safety - * Must point to a valid `Buffers` struct - * Free the memory a `Buffers` struct points to - */ -intptr_t automerge_free_buff(Buffer *buffs); - -/** - * # Safety - * Must be called with a valid backend pointer - * sync_state must be a valid pointer to a SyncState - * Returns an `isize` indicating the length of the binary message - * (-1 if there was an error, 0 if there is no message) - */ -intptr_t automerge_generate_sync_message(Backend *backend, Buffer *buffs, SyncState *sync_state); - -/** - * # Safety - * This must be called with a valid backend pointer, - * binary must be a valid pointer to `hashes` hashes - */ -intptr_t automerge_get_changes(Backend *backend, Buffer *buffs, const uint8_t *bin, uintptr_t hashes); - -/** - * # Safety - * This must be called with a valid pointer to a `Backend` - * and a valid C String - */ -intptr_t automerge_get_changes_for_actor(Backend *backend, Buffer *buffs, const char *actor); - -/** - * # Safety - * This must be called with a valid backend pointer - */ -intptr_t automerge_get_heads(Backend *backend, Buffer *buffs); - -/** - * # Safety - */ -intptr_t automerge_get_last_local_change(Backend *backend, Buffer *buffs); - -/** - * # Safety - * This must be called with a valid backend pointer, - * binary must be a valid pointer to len bytes - */ -intptr_t automerge_get_missing_deps(Backend *backend, Buffer *buffs, const uint8_t *bin, uintptr_t len); - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - * and a valid pointer to a `Buffers`` - */ -intptr_t automerge_get_patch(Backend *backend, Buffer *buffs); - -Backend *automerge_init(void); - -/** - * # Safety - * This must be called with a valid pointer to len bytes - */ -Backend *automerge_load(const uint8_t *data, uintptr_t len); - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - * and a valid pointers to a `CBuffers` - */ -intptr_t automerge_load_changes(Backend *backend, const uint8_t *changes, uintptr_t changes_len); - -/** - * # Safety - * Must be called with a valid backend pointer - * sync_state must be a valid pointer to a SyncState - * `encoded_msg_[ptr|len]` must be the address & length of a byte array - */ -intptr_t automerge_receive_sync_message(Backend *backend, - Buffer *buffs, - SyncState *sync_state, - const uint8_t *encoded_msg_ptr, - uintptr_t encoded_msg_len); - -/** - * # Safety - * This should be called with a valid pointer to a `Backend` - */ -intptr_t automerge_save(Backend *backend, Buffer *buffs); - -/** - * # Safety - * sync_state must be a valid pointer to a SyncState - */ -void automerge_sync_state_free(SyncState *sync_state); - -SyncState *automerge_sync_state_init(void); - -/** - * # Safety - * This must be called with a valid C-string - */ -intptr_t debug_json_change_to_msgpack(const char *change, uint8_t **out_msgpack, uintptr_t *out_len); - -/** - * # Safety - * This must be called with a valid pointer to len bytes - */ -intptr_t debug_msgpack_change_to_json(const uint8_t *msgpack, uintptr_t len, uint8_t *out_json); - -/** - * # Safety - * `prefix` & `buff` must be valid pointers - */ -void debug_print_msgpack_patch(const char *prefix, const uint8_t *buff, uintptr_t len); - -#endif /* automerge_h */ diff --git a/automerge-c-v2/build.rs b/automerge-c-v2/build.rs deleted file mode 100644 index 4a0d0155..00000000 --- a/automerge-c-v2/build.rs +++ /dev/null @@ -1,16 +0,0 @@ -extern crate cbindgen; - -use std::{env, path::PathBuf}; - -fn main() { - let crate_dir = PathBuf::from( - env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR env var is not defined"), - ); - - let config = cbindgen::Config::from_file("cbindgen.toml") - .expect("Unable to find cbindgen.toml configuration file"); - - if let Ok(writer) = cbindgen::generate_with_config(&crate_dir, config) { - writer.write_to_file(crate_dir.join("automerge.h")); - } -} diff --git a/automerge-c-v2/cbindgen.toml b/automerge-c-v2/cbindgen.toml deleted file mode 100644 index a0ea9e1e..00000000 --- a/automerge-c-v2/cbindgen.toml +++ /dev/null @@ -1,8 +0,0 @@ -include_guard = "automerge_h" -autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */" -language = "C" -includes = [] -sys_includes = ["stdint.h", "stdbool.h"] -no_includes = true -line_length = 140 - diff --git a/automerge-c-v2/src/lib.rs b/automerge-c-v2/src/lib.rs deleted file mode 100644 index e25f50bf..00000000 --- a/automerge-c-v2/src/lib.rs +++ /dev/null @@ -1,735 +0,0 @@ -extern crate automerge_backend; -extern crate errno; -extern crate libc; -extern crate serde; - -use core::fmt::Debug; -use std::{ - borrow::Cow, - convert::TryInto, - ffi::{CStr, CString}, - mem::ManuallyDrop, - ops::{Deref, DerefMut}, - os::raw::c_char, - ptr, -}; - -use automerge_backend::{AutomergeError, Change}; -use automerge_protocol as amp; -use automerge_protocol::{error::InvalidActorId, ActorId, ChangeHash, Patch}; -use errno::{set_errno, Errno}; - -// I dislike using macros but it saves me a bunch of typing -// This is especially true b/c the V2 backend returns a bunch more errors -// And we need to return an `isize` (not a Result), so we can't use the `?` operator - -/// Try to turn a `*mut Backend` into a &mut Backend, -/// return an error code if failure -macro_rules! get_backend_mut { - ($backend:expr) => {{ - let backend = $backend.as_mut(); - match backend { - Some(b) => b, - // Don't call `handle_error` b/c there is no valid backend! - None => return CError::NullBackend.error_code(), - } - }}; -} - -/// Turn a `*mut Buffer` into a `&mut Buffer` -macro_rules! get_buff_mut { - ($buffs:expr) => {{ - let buffs = $buffs.as_mut(); - match buffs { - Some(b) => b, - None => return CError::NullBuffers.error_code(), - } - }}; -} - -macro_rules! get_data_vec { - ($buff:expr) => {{ - let data: Vec = Vec::from_raw_parts($buff.data, $buff.len, $buff.cap); - data - }}; -} - -/// Turn a `*const CBuffers` into a `&CBuffers` -macro_rules! write_to_buff_epilogue { - ($buff:expr, $vec:expr) => {{ - $buff.cap = $vec.capacity(); - $buff.len = $vec.len(); - $buff.data = $vec.as_mut_ptr(); - let _ = ManuallyDrop::new($vec); - }}; -} - -/// Try to deserialize some bytes into a value using MessagePack -/// return an error code if failure -macro_rules! from_msgpack { - ($backend:expr, $ptr:expr, $len:expr) => {{ - // Null pointer check? - if $ptr.as_ref().is_none() { - return $backend.handle_error(CError::NullChange); - } - let slice = std::slice::from_raw_parts($ptr, $len); - match rmp_serde::from_read_ref(slice) { - Ok(v) => v, - Err(e) => return $backend.handle_error(CError::FromMessagePack(e)), - } - }}; -} - -/// Get hashes from a binary buffer -macro_rules! get_hashes { - ($backend:expr, $bin:expr, $hashes:expr) => {{ - let mut hashes: Vec = vec![]; - if $hashes > 0 { - let bytes: Vec> = from_msgpack!($backend, $bin, $hashes); - for chunk in bytes { - let hash: ChangeHash = match chunk.as_slice().try_into() { - Ok(v) => v, - Err(e) => return $backend.handle_error(CError::InvalidHashes(e.to_string())), - }; - hashes.push(hash); - } - } - hashes - }}; -} - -/// Try to call an Automerge method, -/// return an error code if failure -macro_rules! call_automerge { - ($backend:expr, $expr:expr) => { - match $expr { - Ok(x) => x, - // We have to do `AutomergeError::from` to convert a `DecodeError` to a - // `AutomergeError` - Err(e) => return $backend.handle_error(CError::Automerge(AutomergeError::from(e))), - } - }; -} - -/// Get a `Vec` from a `*const CBuffers` -/// Using a macro instead of a method so we can return if there is an error -macro_rules! get_changes { - ($backend:expr, $changes:expr, $len:expr) => {{ - let raws: Vec> = from_msgpack!($backend, $changes, $len); - let mut changes = vec![]; - for raw in raws { - let change = call_automerge!($backend, Change::from_bytes(raw)); - changes.push(change); - } - changes - }}; -} - -/// All possible errors that a C caller could face -#[derive(thiserror::Error, Debug)] -pub enum CError { - // TODO: The `NullBackend` and error is not attached to anything - // (since normally we attach errors to a specific backend) - // We could solve this by using a technique like this: - // https://michael-f-bryan.github.io/rust-ffi-guide/errors/return_types.html - // to create a `get_last_error_message` function, but the benefit seems very low - // b/c the NullBackend error message is always the same - #[error("Invalid pointer to Backend")] - NullBackend, - #[error("Invalid pointer to Buffers")] - NullBuffers, - #[error("Invalid pointer to CBuffers")] - NullCBuffers, - #[error("Invalid pointer to change")] - NullChange, - #[error("Invalid byte buffer of hashes: `{0}`")] - InvalidHashes(String), - #[error(transparent)] - ToMessagePack(#[from] rmp_serde::encode::Error), - #[error(transparent)] - FromMessagePack(#[from] rmp_serde::decode::Error), - #[error(transparent)] - FromUtf8(#[from] std::string::FromUtf8Error), - #[error("No local change")] - NoLocalChange, - #[error(transparent)] - Automerge(#[from] AutomergeError), - #[error(transparent)] - InvalidActorid(#[from] InvalidActorId), -} - -impl CError { - fn error_code(&self) -> isize { - // 0 is reserved for "success" - // TODO: This -1 code might be useless since we wipe the *actual* error code - // and replace it with an uninformative`-1` that only tells us we couldn't - // format the error message. - // -1 is reserved for "we had an error & we could't convert it to a CString" - const BASE: isize = 2; - let code = match self { - CError::NullBackend => BASE, - CError::NullBuffers => BASE + 1, - CError::NullCBuffers => BASE + 2, - CError::NullChange => BASE + 3, - CError::InvalidHashes(_) => BASE + 4, - CError::ToMessagePack(_) => BASE + 5, - CError::FromMessagePack(_) => BASE + 6, - CError::FromUtf8(_) => BASE + 7, - CError::InvalidActorid(_) => BASE + 8, - CError::NoLocalChange => BASE + 9, - CError::Automerge(_) => BASE + 10, - }; - -code - } -} - -#[derive(Clone)] -pub struct Backend { - handle: automerge_backend::Backend, - error: Option, - last_local_change: Option>, -} - -/// A sequence of byte buffers that are contiguous in memory -/// The C caller allocates one of these with `create_buffs` -/// and passes it into each API call. This prevents allocating memory -/// on each call. The struct fields are just the constituent fields in a Vec -/// This is used for returning data to C. -// This struct is accidentally an SoA layout, so it should be more performant! -#[repr(C)] -pub struct Buffer { - /// A pointer to the bytes - data: *mut u8, - /// The amount of meaningful bytes - len: usize, - /// The total allocated memory `data` points to - /// This is needed so Rust can free `data` - cap: usize, -} - -impl Backend { - fn init(handle: automerge_backend::Backend) -> Backend { - Backend { - handle, - error: None, - last_local_change: None, - } - } - - fn handle_error(&mut self, err: CError) -> isize { - let c_error = match CString::new(format!("{}", err)) { - Ok(e) => e, - Err(_) => { - return -1; - } - }; - self.error = Some(c_error); - err.error_code() - } - - unsafe fn write_msgpack( - &mut self, - vals: &T, - buffers: &mut Buffer, - ) -> isize { - match write_msgpack_to_buff(vals, buffers) { - Ok(()) => 0, - Err(e) => self.handle_error(CError::ToMessagePack(e)), - } - } -} - -impl Deref for Backend { - type Target = automerge_backend::Backend; - - fn deref(&self) -> &Self::Target { - &self.handle - } -} - -impl DerefMut for Backend { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.handle - } -} - -impl From for *mut Backend { - fn from(b: Backend) -> Self { - Box::into_raw(Box::new(b)) - } -} - -#[no_mangle] -pub extern "C" fn automerge_init() -> *mut Backend { - Backend::init(automerge_backend::Backend::new()).into() -} - -/// # Safety -/// This must be called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_free(backend: *mut Backend) { - // TODO: Can we do a null pointer check here by using `get_backend_mut` - let backend: Backend = *Box::from_raw(backend); - drop(backend) -} - -/// Create a `Buffers` struct to store return values -#[no_mangle] -pub extern "C" fn automerge_create_buff() -> Buffer { - // Don't drop the vectors so their underlying buffers aren't de-allocated - let mut data = ManuallyDrop::new(Vec::new()); - Buffer { - data: data.as_mut_ptr(), - len: data.len(), - cap: data.capacity(), - } -} - -/// # Safety -/// Must point to a valid `Buffers` struct -/// Free the memory a `Buffers` struct points to -#[no_mangle] -pub unsafe extern "C" fn automerge_free_buff(buffs: *mut Buffer) -> isize { - let buff = get_buff_mut!(buffs); - // We construct the vec & drop it at the end of this function - get_data_vec!(buff); - 0 -} - -unsafe fn write_msgpack_to_buff( - vals: &T, - buff: &mut Buffer, -) -> Result<(), rmp_serde::encode::Error> { - let mut data = get_data_vec!(buff); - let mut writer = std::io::Cursor::new(&mut data); - rmp_serde::encode::write_named(&mut writer, &vals)?; - write_to_buff_epilogue!(buff, data); - Ok(()) -} - -unsafe fn write_bin_to_buff(bin: &[u8], buff: &mut Buffer) { - let mut data = get_data_vec!(buff); - data.set_len(0); - data.extend(bin); - write_to_buff_epilogue!(buff, data); -} - -unsafe fn clear_buffs(buff: &mut Buffer) { - let mut data = get_data_vec!(buff); - data.set_len(0); - write_to_buff_epilogue!(buff, data); -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -/// and a valid pointer to a `Buffers`` -#[no_mangle] -pub unsafe extern "C" fn automerge_apply_local_change( - backend: *mut Backend, - buffs: *mut Buffer, - request: *const u8, - len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let request: amp::Change = from_msgpack!(backend, request, len); - let (patch, change) = call_automerge!(backend, backend.apply_local_change(request)); - backend.last_local_change = Some(change.raw_bytes().to_vec()); - backend.write_msgpack(&patch, buffs) -} - -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn automerge_get_last_local_change( - backend: *mut Backend, - buffs: *mut Buffer, -) -> isize { - let backend = get_backend_mut!(backend); - let buff = get_buff_mut!(buffs); - let change = match &backend.last_local_change { - Some(c) => c, - None => return backend.handle_error(CError::NoLocalChange), - }; - write_bin_to_buff(change, buff); - 0 -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -/// `CBuffers` should be non-null & have valid fields. -#[no_mangle] -pub unsafe extern "C" fn automerge_apply_changes( - backend: *mut Backend, - buffs: *mut Buffer, - changes: *const u8, - changes_len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let changes = get_changes!(backend, changes, changes_len); - let patch = call_automerge!(backend, backend.apply_changes(changes)); - backend.write_msgpack(&patch, buffs) -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -/// and a valid pointer to a `Buffers`` -#[no_mangle] -pub unsafe extern "C" fn automerge_get_patch(backend: *mut Backend, buffs: *mut Buffer) -> isize { - let backend = get_backend_mut!(backend); - let buff = get_buff_mut!(buffs); - let patch = call_automerge!(backend, backend.get_patch()); - backend.write_msgpack(&patch, buff) -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -/// and a valid pointers to a `CBuffers` -#[no_mangle] -pub unsafe extern "C" fn automerge_load_changes( - backend: *mut Backend, - changes: *const u8, - changes_len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let changes = get_changes!(backend, changes, changes_len); - call_automerge!(backend, backend.load_changes(changes)); - 0 -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -#[no_mangle] -pub unsafe extern "C" fn automerge_save(backend: *mut Backend, buffs: *mut Buffer) -> isize { - let backend = get_backend_mut!(backend); - let buff = get_buff_mut!(buffs); - let bin = call_automerge!(backend, backend.save()); - write_bin_to_buff(&bin, buff); - 0 -} - -/// # Safety -/// This should be called with a valid pointer to a `Backend` -#[no_mangle] -pub unsafe extern "C" fn automerge_clone(backend: *mut Backend, new: *mut *mut Backend) -> isize { - let backend = get_backend_mut!(backend); - (*new) = backend.clone().into(); - 0 -} - -/// # Safety -/// This must be called with a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_load(data: *const u8, len: usize) -> *mut Backend { - let bytes = std::slice::from_raw_parts(data, len); - let result = automerge_backend::Backend::load(bytes.to_vec()); - match result { - Ok(b) => Backend::init(b).into(), - Err(_) => { - set_errno(Errno(1)); - ptr::null_mut() - } - } -} - -/// # Safety -/// Lossily converts a C String into a Cow<...> -// TODO: Should we do UTF-8 check? -unsafe fn from_cstr<'a>(s: *const c_char) -> Cow<'a, str> { - let s: &'a CStr = CStr::from_ptr(s); - s.to_string_lossy() -} - -/// # Safety -/// This must be called with a valid pointer to a `Backend` -/// and a valid C String -#[no_mangle] -pub unsafe extern "C" fn automerge_get_changes_for_actor( - backend: *mut Backend, - buffs: *mut Buffer, - actor: *const c_char, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let actor = from_cstr(actor); - let actor_id: ActorId = match actor.as_ref().try_into() { - Ok(id) => id, - Err(e) => return backend.handle_error(CError::InvalidActorid(e)), - }; - let changes = call_automerge!(backend, backend.get_changes_for_actor_id(&actor_id)); - let bytes: Vec<_> = changes - .into_iter() - .map(|c| c.raw_bytes().to_vec()) - .collect(); - backend.write_msgpack(&bytes, buffs) -} - -/// # Safety -/// This must me called with a valid pointer to a change and the correct len -#[no_mangle] -pub unsafe extern "C" fn automerge_decode_change( - backend: *mut Backend, - buffs: *mut Buffer, - change: *const u8, - len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let bytes = std::slice::from_raw_parts(change, len); - let change = call_automerge!(backend, Change::from_bytes(bytes.to_vec())); - backend.write_msgpack(&change.decode(), buffs); - 0 -} - -/// # Safety -/// This must me called with a valid pointer to a JSON string of a change -#[no_mangle] -pub unsafe extern "C" fn automerge_encode_change( - backend: *mut Backend, - buffs: *mut Buffer, - change: *const u8, - len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buff = get_buff_mut!(buffs); - let uncomp: amp::Change = from_msgpack!(backend, change, len); - // This should never panic? - let change: Change = uncomp.try_into().unwrap(); - write_bin_to_buff(change.raw_bytes(), buff); - 0 -} - -/// # Safety -/// This must be called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_get_heads(backend: *mut Backend, buffs: *mut Buffer) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let hashes = backend.get_heads(); - let bytes: Vec<_> = hashes.iter().map(|h| h.0.as_ref()).collect(); - backend.write_msgpack(&bytes, buffs) -} - -/// # Safety -/// This must be called with a valid backend pointer, -/// binary must be a valid pointer to `hashes` hashes -#[no_mangle] -pub unsafe extern "C" fn automerge_get_changes( - backend: *mut Backend, - buffs: *mut Buffer, - bin: *const u8, - hashes: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let hashes = get_hashes!(backend, bin, hashes); - let changes = backend.get_changes(&hashes); - let bytes: Vec<_> = changes - .into_iter() - .map(|c| c.raw_bytes().to_vec()) - .collect(); - backend.write_msgpack(&bytes, buffs) -} - -/// # Safety -/// This must be called with a valid backend pointer, -/// binary must be a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_get_missing_deps( - backend: *mut Backend, - buffs: *mut Buffer, - bin: *const u8, - len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let heads = get_hashes!(backend, bin, len); - let missing = backend.get_missing_deps(&heads); - backend.write_msgpack(&missing, buffs) -} - -/// # Safety -/// This must be called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_error(backend: *mut Backend) -> *const c_char { - (*backend) - .error - .as_ref() - .map(|e| e.as_ptr()) - .unwrap_or_else(|| ptr::null_mut()) -} - -#[derive(Debug)] -pub struct SyncState { - handle: automerge_backend::SyncState, -} - -impl From for *mut SyncState { - fn from(s: SyncState) -> Self { - Box::into_raw(Box::new(s)) - } -} - -/// # Safety -/// Must be called with a valid backend pointer -/// sync_state must be a valid pointer to a SyncState -/// `encoded_msg_[ptr|len]` must be the address & length of a byte array -// Returns an `isize` indicating the length of the patch as a JSON string -// (-1 if there was an error, 0 if there is no patch) -#[no_mangle] -pub unsafe extern "C" fn automerge_receive_sync_message( - backend: *mut Backend, - buffs: *mut Buffer, - sync_state: &mut SyncState, - encoded_msg_ptr: *const u8, - encoded_msg_len: usize, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let slice = std::slice::from_raw_parts(encoded_msg_ptr, encoded_msg_len); - let msg = call_automerge!(backend, automerge_backend::SyncMessage::decode(slice)); - let patch = call_automerge!( - backend, - backend.receive_sync_message(&mut sync_state.handle, msg) - ); - if let Some(patch) = patch { - backend.write_msgpack(&patch, buffs) - } else { - // There is nothing to return, clear the buffs - clear_buffs(buffs); - 0 - } -} - -/// # Safety -/// Must be called with a valid backend pointer -/// sync_state must be a valid pointer to a SyncState -/// Returns an `isize` indicating the length of the binary message -/// (-1 if there was an error, 0 if there is no message) -#[no_mangle] -pub unsafe extern "C" fn automerge_generate_sync_message( - backend: *mut Backend, - buffs: *mut Buffer, - sync_state: &mut SyncState, -) -> isize { - let backend = get_backend_mut!(backend); - let buff = get_buff_mut!(buffs); - let msg = backend.generate_sync_message(&mut sync_state.handle); - if let Some(msg) = msg { - let bytes = call_automerge!(backend, msg.encode()); - write_bin_to_buff(&bytes, buff); - } else { - clear_buffs(buff); - } - 0 -} - -#[no_mangle] -pub extern "C" fn automerge_sync_state_init() -> *mut SyncState { - let state = SyncState { - handle: automerge_backend::SyncState::default(), - }; - state.into() -} - -/// # Safety -/// sync_state must be a valid pointer to a SyncState -#[no_mangle] -pub unsafe extern "C" fn automerge_sync_state_free(sync_state: *mut SyncState) { - let sync_state: SyncState = *Box::from_raw(sync_state); - drop(sync_state); -} - -/// # Safety -/// Must be called with a pointer to a valid Backend, sync_state, and buffs -#[no_mangle] -pub unsafe extern "C" fn automerge_encode_sync_state( - backend: *mut Backend, - buffs: *mut Buffer, - sync_state: &mut SyncState, -) -> isize { - let backend = get_backend_mut!(backend); - let buffs = get_buff_mut!(buffs); - let encoded = call_automerge!(backend, sync_state.handle.encode()); - write_bin_to_buff(&encoded, buffs); - 0 -} - -/// # Safety -/// `encoded_state_[ptr|len]` must be the address & length of a byte array -#[no_mangle] -pub unsafe extern "C" fn automerge_decode_sync_state( - backend: *mut Backend, - encoded_state_ptr: *const u8, - encoded_state_len: usize, - sync_state: *mut *mut SyncState, -) -> isize { - let backend = get_backend_mut!(backend); - let slice = std::slice::from_raw_parts(encoded_state_ptr, encoded_state_len); - let decoded_state = call_automerge!(backend, automerge_backend::SyncState::decode(slice)); - let state = SyncState { - handle: decoded_state, - }; - (*sync_state) = state.into(); - 0 -} - -/// # Safety -/// This must be called with a valid C-string -#[no_mangle] -pub unsafe extern "C" fn debug_json_change_to_msgpack( - change: *const c_char, - out_msgpack: *mut *mut u8, - out_len: *mut usize, -) -> isize { - let s = from_cstr(change); - // `unwrap` here is ok b/c this is a debug function - let uncomp: amp::Change = serde_json::from_str(&s).unwrap(); - - // `unwrap` here is ok b/c this is a debug function - let mut bytes = ManuallyDrop::new(rmp_serde::to_vec_named(&uncomp).unwrap()); - *out_msgpack = bytes.as_mut_ptr(); - *out_len = bytes.len(); - 0 -} - -/// # Safety -/// `prefix` & `buff` must be valid pointers -#[no_mangle] -pub unsafe extern "C" fn debug_print_msgpack_patch( - prefix: *const c_char, - buff: *const u8, - len: usize, -) { - if prefix.is_null() { - panic!("null ptr: prefix"); - } - if buff.is_null() { - panic!("null ptr: buff"); - } - if len == 0 { - panic!("invalid len: 0"); - } - let prefix = from_cstr(prefix); - let slice = std::slice::from_raw_parts(buff, len); - let patch: Patch = rmp_serde::from_read_ref(slice).unwrap(); - let as_json = serde_json::to_string(&patch).unwrap(); - println!("{}: {}", prefix, as_json); -} - -/// # Safety -/// This must be called with a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn debug_msgpack_change_to_json( - msgpack: *const u8, - len: usize, - out_json: *mut u8, -) -> isize { - let slice = std::slice::from_raw_parts(msgpack, len); - let uncomp: amp::Change = rmp_serde::from_slice(slice).unwrap(); - let json = serde_json::to_vec(&uncomp).unwrap(); - ptr::copy_nonoverlapping(json.as_ptr(), out_json, json.len()); - // null-terminate - *out_json.add(json.len()) = 0; - json.len() as isize -} diff --git a/automerge-c/.gitignore b/automerge-c/.gitignore deleted file mode 100644 index 0ae7bbac..00000000 --- a/automerge-c/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -automerge -automerge.o diff --git a/automerge-c/Cargo.toml b/automerge-c/Cargo.toml deleted file mode 100644 index 082f59ba..00000000 --- a/automerge-c/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "automerge-c" -version = "0.1.0" -authors = ["Orion Henry "] -edition = "2018" - -[lib] -name = "automerge" -crate-type = ["cdylib", "staticlib"] -bench = false -doc = false - -[dependencies] -automerge-backend = { path = "../automerge-backend" } -automerge-protocol = { path = "../automerge-protocol" } -libc = "^0.2" -serde = "^1.0" -serde_json = "^1.0" -errno = "^0.2" - -[build-dependencies] -cbindgen = "^0.14" diff --git a/automerge-c/Makefile b/automerge-c/Makefile deleted file mode 100644 index f71b1b8a..00000000 --- a/automerge-c/Makefile +++ /dev/null @@ -1,30 +0,0 @@ - -CC=gcc -CFLAGS=-I. -DEPS=automerge.h -LIBS=-lpthread -ldl -lm -LDIR=../target/release -LIB=../target/release/libautomerge.a -DEBUG_LIB=../target/debug/libautomerge.a - -all: automerge $(LIB) - -debug: LDIR=../target/debug -debug: automerge $(DEBUG_LIB) - -automerge: automerge.o $(LDIR)/libautomerge.a - $(CC) -o $@ automerge.o $(LDIR)/libautomerge.a $(LIBS) -L$(LDIR) - -$(DEBUG_LIB): src/lib.rs - cargo build - -$(LIB): src/lib.rs - cargo build --release - -%.o: %.c $(DEPS) - $(CC) -c -o $@ $< $(CFLAGS) - -.PHONY: clean - -clean: - rm -f *.o automerge $(LIB) $(DEBUG_LIB) diff --git a/automerge-c/automerge.c b/automerge-c/automerge.c deleted file mode 100644 index d4ceb901..00000000 --- a/automerge-c/automerge.c +++ /dev/null @@ -1,258 +0,0 @@ - -#include -#include -#include -#include "automerge.h" - -#define BUFSIZE 4096 - -void test_sync_basic() { - printf("begin sync test - basic\n"); - int len; - - // In a real application you would need to check to make sure your buffer is large enough for any given read - char buff[BUFSIZE]; - - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - - SyncState * ssA = automerge_sync_state_init(); - SyncState * ssB = automerge_sync_state_init(); - - len = automerge_generate_sync_message(dbA, ssA); - // In a real application, we would use `len` to allocate `buff` here - int len2 = automerge_read_binary(dbA, buff); - automerge_receive_sync_message(dbB, ssB, buff, len); - len = automerge_generate_sync_message(dbB, ssB); - // No more sync messages were generated - assert(len == 0); -} - -void test_sync_encode_decode() { - printf("begin sync test - encode/decode\n"); - int len; - - char buff[BUFSIZE]; - char sync_state_buff[BUFSIZE]; - - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - - const char * requestA1 = "{\"actor\":\"111111\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"magpie\",\"pred\":[]}]}"; - const char * requestB1 = "{\"actor\":\"222222\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"crow\",\"pred\":[]}]}"; - automerge_apply_local_change(dbA, requestA1); - automerge_apply_local_change(dbB, requestB1); - - SyncState * ssA = automerge_sync_state_init(); - SyncState * ssB = automerge_sync_state_init(); - - len = automerge_generate_sync_message(dbA, ssA); - automerge_read_binary(dbA, buff); - automerge_receive_sync_message(dbB, ssB, buff, len); - - len = automerge_generate_sync_message(dbB, ssB); - automerge_read_binary(dbB, buff); - automerge_receive_sync_message(dbA, ssA, buff, len); - - len = automerge_generate_sync_message(dbA, ssA); - automerge_read_binary(dbA, buff); - automerge_receive_sync_message(dbB, ssB, buff, len); - - - len = automerge_generate_sync_message(dbB, ssB); - automerge_read_binary(dbB, buff); - automerge_receive_sync_message(dbA, ssA, buff, len); - - len = automerge_generate_sync_message(dbA, ssA); - - // Save the sync state - int encoded_len = automerge_encode_sync_state(dbB, ssB); - automerge_read_binary(dbB, sync_state_buff); - // Read it back - ssB = automerge_decode_sync_state(sync_state_buff, encoded_len); - - len = automerge_generate_sync_message(dbB, ssB); - automerge_read_binary(dbB, buff); - automerge_receive_sync_message(dbA, ssA, buff, len); - - - len = automerge_generate_sync_message(dbA, ssA); - assert(len == 0); -} - -void test_sync() { - printf("begin sync test"); - test_sync_basic(); - test_sync_encode_decode(); -} - -int main() { - int len; - - // In a real application you would need to check to make sure your buffer is large enough for any given read - char buff[BUFSIZE]; - char buff2[BUFSIZE]; - char buff3[BUFSIZE]; - - printf("begin\n"); - - Backend * dbA = automerge_init(); - Backend * dbB = automerge_init(); - - const char * requestA1 = "{\"actor\":\"111111\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"magpie\",\"pred\":[]}]}"; - const char * requestA2 = "{\"actor\":\"111111\",\"seq\":2,\"time\":0,\"deps\":[],\"startOp\":2,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"dog\",\"value\":\"mastiff\",\"pred\":[]}]}"; - const char * requestB1 = "{\"actor\":\"222222\",\"seq\":1,\"time\":0,\"deps\":[],\"startOp\":1,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"bird\",\"value\":\"crow\",\"pred\":[]}]}"; - const char * requestB2 = "{\"actor\":\"222222\",\"seq\":2,\"time\":0,\"deps\":[],\"startOp\":2,\"ops\":[{\"action\":\"set\",\"obj\":\"_root\",\"key\":\"cat\",\"value\":\"tabby\",\"pred\":[]}]}"; - - printf("*** requestA1 ***\n\n%s\n\n",requestA1); - - len = automerge_get_last_local_change(dbA); - assert(len == -1); - printf("*** last_local expected error string ** (%s)\n\n",automerge_error(dbA)); - - len = automerge_apply_local_change(dbA, requestA1); - assert(len <= BUFSIZE); - automerge_read_json(dbA, buff); - printf("*** patchA1 ***\n\n%s\n\n",buff); - - len = automerge_get_last_local_change(dbA); - assert(len > 0); - assert(len <= BUFSIZE); - len = automerge_read_binary(dbA, buff); - assert(len == 0); - - len = automerge_apply_local_change(dbA, "{}"); - assert(len == -1); - printf("*** patchA2 expected error string ** (%s)\n\n",automerge_error(dbA)); - - len = automerge_apply_local_change(dbA, requestA2); - assert(len <= BUFSIZE); - automerge_read_json(dbA, buff); - printf("*** patchA2 ***\n\n%s\n\n",buff); - - len = automerge_apply_local_change(dbB, requestB1); - assert(len <= BUFSIZE); - automerge_read_json(dbB, buff); - printf("*** patchB1 ***\n\n%s\n\n",buff); - - len = automerge_apply_local_change(dbB, requestB2); - assert(len <= BUFSIZE); - automerge_read_json(dbB, buff); - printf("*** patchB2 ***\n\n%s\n\n",buff); - - printf("*** clone dbA -> dbC ***\n\n"); - Backend * dbC = automerge_clone(dbA); - - len = automerge_get_patch(dbA); - assert(len <= BUFSIZE); - automerge_read_json(dbA, buff); - len = automerge_get_patch(dbC); - assert(len <= BUFSIZE); - automerge_read_json(dbC, buff2); - // the json can serialize in different orders so I can do a stright strcmp() - printf("*** get_patch of dbA & dbC -- equal? *** --> %s\n\n",strlen(buff) == strlen(buff2) ? "true" : "false"); - assert(strlen(buff) == strlen(buff2)); - - len = automerge_save(dbA); - assert(len <= BUFSIZE); - automerge_read_binary(dbA, buff2); - printf("*** save dbA - %d bytes ***\n\n",len); - - printf("*** load the save into dbD ***\n\n"); - Backend * dbD = automerge_load(len, buff2); - len = automerge_get_patch(dbD); - assert(len <= BUFSIZE); - automerge_read_json(dbD, buff2); - printf("*** get_patch of dbA & dbD -- equal? *** --> %s\n\n",strlen(buff) == strlen(buff2) ? "true" : "false"); - assert(strlen(buff) == strlen(buff2)); - - printf("*** copy changes from dbA to B ***\n\n"); - len = automerge_get_changes_for_actor(dbA,"111111"); - while (len > 0) { - assert(len <= BUFSIZE); - int nextlen = automerge_read_binary(dbA,buff); - automerge_write_change(dbB,len,buff); - - // decode the change for debug - // encode and decode could happen with either dbA or dbB, - // however encode needs to be done against dbB instead of dbA - // only because dbA is in the middle of iterating over some binary results - // and needs to finish before queuing another - automerge_decode_change(dbA,len,buff); - automerge_read_json(dbA, buff2); - printf("Change decoded to json -- %s\n",buff2); - automerge_encode_change(dbB,buff2); - automerge_read_binary(dbB,buff3); - assert(memcmp(buff,buff3,len) == 0); - - len = nextlen; - } - automerge_apply_changes(dbB); - - printf("*** get head from dbB ***\n\n"); - int num_heads = 0; - len = automerge_get_heads(dbB); - while (len > 0) { - assert(len == 32); - int nextlen = automerge_read_binary(dbB,buff3 + (num_heads * 32)); - num_heads++; - len = nextlen; - } - assert(num_heads == 2); - len = automerge_get_changes(dbB,num_heads,buff3); - assert(len == 0); - - printf("*** copy changes from dbB to A ***\n\n"); - len = automerge_get_changes_for_actor(dbB,"222222"); - while (len > 0) { - assert(len <= BUFSIZE); - int nextlen = automerge_read_binary(dbB,buff); - automerge_write_change(dbA,len,buff); - len = nextlen; - } - automerge_apply_changes(dbA); - - len = automerge_get_patch(dbA); - assert(len <= BUFSIZE); - automerge_read_json(dbA, buff); - len = automerge_get_patch(dbB); - assert(len <= BUFSIZE); - automerge_read_json(dbB, buff2); - printf("*** get_patch of dbA & dbB -- equal? *** --> %s\n\n",strlen(buff) == strlen(buff2) ? "true" : "false"); - assert(strlen(buff) == strlen(buff2)); - - printf("*** copy changes from dbA to E using load ***\n\n"); - Backend * dbE = automerge_init(); - len = automerge_get_changes(dbA,0,NULL); - while (len > 0) { - assert(len <= BUFSIZE); - int nextlen = automerge_read_binary(dbA,buff); - automerge_write_change(dbE,len,buff); - len = nextlen; - } - automerge_load_changes(dbE); - - len = automerge_get_patch(dbA); - assert(len <= BUFSIZE); - automerge_read_json(dbA, buff); - len = automerge_get_patch(dbE); - assert(len <= BUFSIZE); - automerge_read_json(dbE, buff2); - printf("*** get_patch of dbA & dbE -- equal? *** --> %s\n\n",strlen(buff) == strlen(buff2) ? "true" : "false"); - assert(strlen(buff) == strlen(buff2)); - - len = automerge_get_missing_deps(dbE, num_heads, buff3); - automerge_read_json(dbE, buff); // [] - nothing missing - assert(strlen(buff) == 2); - - test_sync(); - - printf("free resources\n"); - automerge_free(dbA); - automerge_free(dbB); - automerge_free(dbC); - automerge_free(dbD); - automerge_free(dbE); - - printf("end\n"); -} diff --git a/automerge-c/automerge.h b/automerge-c/automerge.h deleted file mode 100644 index 97fbc4fd..00000000 --- a/automerge-c/automerge.h +++ /dev/null @@ -1,189 +0,0 @@ -#ifndef automerge_h -#define automerge_h - -/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ - -#include -#include - -typedef struct Backend Backend; - -typedef struct SyncState SyncState; - -/** - * # Safety - * This must me called with a valid backend pointer - */ -intptr_t automerge_apply_changes(Backend *backend); - -/** - * # Safety - * This must me called with a valid backend pointer - * request must be a valid pointer pointing to a cstring - */ -intptr_t automerge_apply_local_change(Backend *backend, const char *request); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -Backend *automerge_clone(Backend *backend); - -/** - * # Safety - * This must me called with a valid pointer to a change and the correct len - */ -intptr_t automerge_decode_change(Backend *backend, uintptr_t len, const uint8_t *change); - -/** - * # Safety - * `encoded_state_[ptr|len]` must be the address & length of a byte array - * Returns an opaque pointer to a SyncState - * panics (segfault?) if the buffer was invalid - */ -SyncState *automerge_decode_sync_state(const uint8_t *encoded_state_ptr, uintptr_t encoded_state_len); - -/** - * # Safety - * This must me called with a valid pointer a json string of a change - */ -intptr_t automerge_encode_change(Backend *backend, const char *change); - -/** - * # Safety - * Must be called with a valid backend pointer - * sync_state must be a valid pointer to a SyncState - * Returns an `isize` indicating the length of the binary message - * (-1 if there was an error) - */ -intptr_t automerge_encode_sync_state(Backend *backend, SyncState *sync_state); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -const char *automerge_error(Backend *backend); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -void automerge_free(Backend *backend); - -/** - * # Safety - * Must be called with a valid backend pointer - * sync_state must be a valid pointer to a SyncState - * Returns an `isize` indicating the length of the binary message - * (-1 if there was an error, 0 if there is no message) - */ -intptr_t automerge_generate_sync_message(Backend *backend, SyncState *sync_state); - -/** - * # Safety - * This must me called with a valid backend pointer - * binary must be a valid pointer to len bytes - */ -intptr_t automerge_get_changes(Backend *backend, uintptr_t len, const uint8_t *binary); - -/** - * # Safety - * `backend` and `other` must be valid pointers to Backends - */ -intptr_t automerge_get_changes_added(Backend *backend, Backend *other); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -intptr_t automerge_get_changes_for_actor(Backend *backend, const char *actor); - -/** - * # Safety - * This must me called with a valid pointer a json string of a change - */ -intptr_t automerge_get_heads(Backend *backend); - -/** - * # Safety - * This must me called with a valid pointer to a backend - * the automerge api changed to return a change and a patch - * this C api was not designed to returned mixed values so i borrowed the - * get_last_local_change call from the javascript api to solve the same problem - */ -intptr_t automerge_get_last_local_change(Backend *backend); - -/** - * # Safety - * This must me called with a valid backend pointer - * binary must be a valid pointer to len bytes - */ -intptr_t automerge_get_missing_deps(Backend *backend, uintptr_t len, const uint8_t *binary); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -intptr_t automerge_get_patch(Backend *backend); - -Backend *automerge_init(void); - -/** - * # Safety - * data pointer must be a valid pointer to len bytes - */ -Backend *automerge_load(uintptr_t len, const uint8_t *data); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -intptr_t automerge_load_changes(Backend *backend); - -/** - * # Safety - * - * This must me called with a valid backend pointer - * the buffer must be a valid pointer pointing to at least as much space as was - * required by the previous binary result call - */ -intptr_t automerge_read_binary(Backend *backend, uint8_t *buffer); - -/** - * # Safety - * This must me called with a valid backend pointer - * and buffer must be a valid pointer of at least the number of bytes returned by the previous - * call that generated a json result - */ -intptr_t automerge_read_json(Backend *backend, char *buffer); - -/** - * # Safety - * Must be called with a valid backend pointer - * sync_state must be a valid pointer to a SyncState - * `encoded_msg_[ptr|len]` must be the address & length of a byte array - */ -intptr_t automerge_receive_sync_message(Backend *backend, SyncState *sync_state, const uint8_t *encoded_msg_ptr, uintptr_t encoded_msg_len); - -/** - * # Safety - * This must me called with a valid backend pointer - */ -intptr_t automerge_save(Backend *backend); - -/** - * # Safety - * sync_state must be a valid pointer to a SyncState - */ -void automerge_sync_state_free(SyncState *sync_state); - -SyncState *automerge_sync_state_init(void); - -/** - * # Safety - * This must me called with a valid backend pointer - * change must point to a valid memory location with at least len bytes - */ -void automerge_write_change(Backend *backend, uintptr_t len, const uint8_t *change); - -#endif /* automerge_h */ diff --git a/automerge-c/build.rs b/automerge-c/build.rs deleted file mode 100644 index 4a0d0155..00000000 --- a/automerge-c/build.rs +++ /dev/null @@ -1,16 +0,0 @@ -extern crate cbindgen; - -use std::{env, path::PathBuf}; - -fn main() { - let crate_dir = PathBuf::from( - env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR env var is not defined"), - ); - - let config = cbindgen::Config::from_file("cbindgen.toml") - .expect("Unable to find cbindgen.toml configuration file"); - - if let Ok(writer) = cbindgen::generate_with_config(&crate_dir, config) { - writer.write_to_file(crate_dir.join("automerge.h")); - } -} diff --git a/automerge-c/cbindgen.toml b/automerge-c/cbindgen.toml deleted file mode 100644 index a0ea9e1e..00000000 --- a/automerge-c/cbindgen.toml +++ /dev/null @@ -1,8 +0,0 @@ -include_guard = "automerge_h" -autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */" -language = "C" -includes = [] -sys_includes = ["stdint.h", "stdbool.h"] -no_includes = true -line_length = 140 - diff --git a/automerge-c/src/lib.rs b/automerge-c/src/lib.rs deleted file mode 100644 index 3f5b1c89..00000000 --- a/automerge-c/src/lib.rs +++ /dev/null @@ -1,573 +0,0 @@ -extern crate automerge_backend; -extern crate errno; -extern crate libc; -extern crate serde; - -use core::fmt::Debug; -use std::{ - convert::TryInto, - ffi::{CStr, CString}, - ops::{Deref, DerefMut}, - os::raw::c_char, - ptr, -}; - -use automerge_backend::{AutomergeError, Change}; -use automerge_protocol as amp; -use automerge_protocol::ChangeHash; -use errno::{set_errno, Errno}; -use serde::ser::Serialize; - -#[derive(Clone)] -pub struct Backend { - handle: automerge_backend::Backend, - text: Option, - last_local_change: Option, - binary: Vec>, - queue: Option>>, - error: Option, -} - -struct BinaryResults(Result>, AutomergeError>); - -impl Deref for Backend { - type Target = automerge_backend::Backend; - - fn deref(&self) -> &Self::Target { - &self.handle - } -} - -unsafe fn from_buf_raw(ptr: *const T, elts: usize) -> Vec { - let mut dst = Vec::with_capacity(elts); - dst.set_len(elts); - ptr::copy(ptr, dst.as_mut_ptr(), elts); - dst -} - -fn err(result: Result) -> Result { - match result { - Ok(val) => Ok(val), - Err(err) => Err(format!("{:?}", err)), - } -} - -impl Backend { - fn init(handle: automerge_backend::Backend) -> Backend { - Backend { - handle, - text: None, - last_local_change: None, - binary: Vec::new(), - queue: None, - error: None, - } - } - - fn handle_result(&mut self, result: Result) -> isize { - match result { - Ok(len) => { - self.error = None; - len - } - Err(err) => self.handle_error(err), - } - } - - fn generate_json(&mut self, val: Result) -> isize { - let result = err(val) - .and_then(|val| err(serde_json::to_string(&val))) - .map(|text| { - let len = (text.len() + 1) as isize; - self.text = Some(text); - len - }); - self.handle_result(result) - } - - fn handle_binary(&mut self, b: Result, AutomergeError>) -> isize { - let result = err(b).map(|bin| { - let len = bin.len(); - self.binary = vec![bin]; - len as isize - }); - self.handle_result(result) - } - - fn handle_ok(&mut self) -> isize { - self.error = None; - 0 - } - - fn handle_error(&mut self, err: E) -> isize { - // in theory - if an error string had embedded nulls - // we could get a error = None and -1 - self.error = CString::new(format!("{:?}", err)).ok(); - -1 - } - - fn handle_binaries(&mut self, b: BinaryResults) -> isize { - let result = err(b.0).map(|bin| { - self.error = None; - if !bin.is_empty() { - let len = bin[0].len(); - self.binary = bin; - self.binary.reverse(); - len as isize - } else { - 0 - } - }); - self.handle_result(result) - } -} - -impl DerefMut for Backend { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.handle - } -} - -impl From for *mut Backend { - fn from(b: Backend) -> Self { - Box::into_raw(Box::new(b)) - } -} - -impl From> for BinaryResults { - fn from(changes: Vec<&Change>) -> Self { - BinaryResults(Ok(changes.iter().map(|b| b.raw_bytes().into()).collect())) - } -} - -impl From, AutomergeError>> for BinaryResults { - fn from(result: Result, AutomergeError>) -> Self { - BinaryResults(result.map(|changes| changes.iter().map(|b| b.raw_bytes().into()).collect())) - } -} - -impl From> for BinaryResults { - fn from(heads: Vec) -> Self { - BinaryResults(Ok(heads.iter().map(|head| head.0.to_vec()).collect())) - } -} - -/* - init => automerge_init - clone => automerge_clone - free => automerge_free - save => automerge_save - load => automerge_load - applyLocalChange => automerge_apply_local_change - getPatch => automerge_get_patch - applyChanges => automerge_apply_changes - loadChanges => automerge_load_changes - getChangesForActor => automerge_get_changes_for_actor - getChanges => automerge_get_changes - getMissingDeps => automerge_get_missing_deps -*/ - -#[no_mangle] -pub extern "C" fn automerge_init() -> *mut Backend { - Backend::init(automerge_backend::Backend::new()).into() -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_free(backend: *mut Backend) { - let backend: Backend = *Box::from_raw(backend); - drop(backend) -} - -/// # Safety -/// This must me called with a valid backend pointer -/// request must be a valid pointer pointing to a cstring -#[no_mangle] -pub unsafe extern "C" fn automerge_apply_local_change( - backend: *mut Backend, - request: *const c_char, -) -> isize { - let request: &CStr = CStr::from_ptr(request); - let request = request.to_string_lossy(); - let request: Result = serde_json::from_str(&request); - match request { - Ok(request) => { - let result = (*backend).apply_local_change(request); - match result { - Ok((patch, change)) => { - (*backend).last_local_change = Some(change); - (*backend).generate_json(Ok(patch)) - } - Err(err) => (*backend).handle_error(err), - } - } - Err(err) => (*backend).handle_error(err), - } -} - -/// # Safety -/// This must me called with a valid backend pointer -/// change must point to a valid memory location with at least len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_write_change( - backend: *mut Backend, - len: usize, - change: *const u8, -) { - let bytes = from_buf_raw(change, len); - if let Some(ref mut queue) = (*backend).queue { - queue.push(bytes) - } else { - (*backend).queue = Some(vec![bytes]) - } -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_apply_changes(backend: *mut Backend) -> isize { - match (*backend).queue.take() { - Some(changes) => { - let changes = changes - .iter() - .map(|c| Change::from_bytes(c.to_vec()).unwrap()) - .collect(); - let patch = (*backend).apply_changes(changes); - (*backend).generate_json(patch) - } - None => (*backend).handle_error("no changes queued"), - } -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_get_patch(backend: *mut Backend) -> isize { - let patch = (*backend).get_patch(); - (*backend).generate_json(patch) -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_load_changes(backend: *mut Backend) -> isize { - if let Some(changes) = (*backend).queue.take() { - let changes = changes - .iter() - .map(|c| Change::from_bytes(c.to_vec()).unwrap()) - .collect(); - if (*backend).load_changes(changes).is_ok() { - return (*backend).handle_ok(); - } - } - (*backend).handle_error("no changes queued") -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_clone(backend: *mut Backend) -> *mut Backend { - (*backend).clone().into() -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_save(backend: *mut Backend) -> isize { - let data = (*backend).save(); - (*backend).handle_binary(data) -} - -/// # Safety -/// data pointer must be a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_load(len: usize, data: *const u8) -> *mut Backend { - let bytes = from_buf_raw(data, len); - let result = automerge_backend::Backend::load(bytes); - if let Ok(backend) = result { - Backend::init(backend).into() - } else { - set_errno(Errno(1)); - ptr::null_mut() - } -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_get_changes_for_actor( - backend: *mut Backend, - actor: *const c_char, -) -> isize { - let actor: &CStr = CStr::from_ptr(actor); - let actor = actor.to_string_lossy(); - match actor.as_ref().try_into() { - Ok(actor) => { - let changes = (*backend).get_changes_for_actor_id(&actor); - (*backend).handle_binaries(changes.into()) - } - Err(err) => (*backend).handle_error(err), - } -} - -/// # Safety -/// This must me called with a valid pointer to a change and the correct len -#[no_mangle] -pub unsafe extern "C" fn automerge_decode_change( - backend: *mut Backend, - len: usize, - change: *const u8, -) -> isize { - let bytes = from_buf_raw(change, len); - let change = Change::from_bytes(bytes).unwrap(); - (*backend).generate_json(Ok(change.decode())) -} - -/// # Safety -/// This must me called with a valid pointer a json string of a change -#[no_mangle] -pub unsafe extern "C" fn automerge_encode_change( - backend: *mut Backend, - change: *const c_char, -) -> isize { - let change: &CStr = CStr::from_ptr(change); - let change = change.to_string_lossy(); - let uncomp_change: amp::Change = serde_json::from_str(&change).unwrap(); - let change: Change = uncomp_change.try_into().unwrap(); - (*backend).handle_binary(Ok(change.raw_bytes().into())) -} - -/// # Safety -/// This must me called with a valid pointer to a backend -/// the automerge api changed to return a change and a patch -/// this C api was not designed to returned mixed values so i borrowed the -/// get_last_local_change call from the javascript api to solve the same problem -#[no_mangle] -pub unsafe extern "C" fn automerge_get_last_local_change(backend: *mut Backend) -> isize { - match (*backend).last_local_change.as_ref() { - Some(change) => (*backend).handle_binary(Ok(change.raw_bytes().into())), - None => (*backend).handle_error("no last change"), - } -} - -/// # Safety -/// This must me called with a valid pointer a json string of a change -#[no_mangle] -pub unsafe extern "C" fn automerge_get_heads(backend: *mut Backend) -> isize { - let heads = (*backend).get_heads(); - (*backend).handle_binaries(heads.into()) -} - -/// # Safety -/// This must me called with a valid backend pointer -/// binary must be a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_get_changes( - backend: *mut Backend, - len: usize, - binary: *const u8, -) -> isize { - let mut have_deps = Vec::new(); - for i in 0..len { - have_deps.push( - from_buf_raw(binary.offset(i as isize * 32), 32) - .as_slice() - .try_into() - .unwrap(), - ) - } - let changes = (*backend).get_changes(&have_deps); - (*backend).handle_binaries(Ok(changes).into()) -} - -/// # Safety -/// `backend` and `other` must be valid pointers to Backends -#[no_mangle] -pub unsafe extern "C" fn automerge_get_changes_added( - backend: *mut Backend, - other: *mut Backend, -) -> isize { - let changes = (*backend).get_changes_added(&*other); - (*backend).handle_binaries(Ok(changes).into()) -} - -/// # Safety -/// This must me called with a valid backend pointer -/// binary must be a valid pointer to len bytes -#[no_mangle] -pub unsafe extern "C" fn automerge_get_missing_deps( - backend: *mut Backend, - len: usize, - binary: *const u8, -) -> isize { - let mut heads = Vec::new(); - for i in 0..len { - heads.push( - from_buf_raw(binary.offset(i as isize * 32), 32) - .as_slice() - .try_into() - .unwrap(), - ) - } - let missing = (*backend).get_missing_deps(&heads); - (*backend).generate_json(Ok(missing)) -} - -/// # Safety -/// This must me called with a valid backend pointer -#[no_mangle] -pub unsafe extern "C" fn automerge_error(backend: *mut Backend) -> *const c_char { - (*backend) - .error - .as_ref() - .map(|e| e.as_ptr()) - .unwrap_or_else(|| ptr::null_mut()) -} - -/// # Safety -/// This must me called with a valid backend pointer -/// and buffer must be a valid pointer of at least the number of bytes returned by the previous -/// call that generated a json result -#[no_mangle] -pub unsafe extern "C" fn automerge_read_json(backend: *mut Backend, buffer: *mut c_char) -> isize { - if let Some(text) = &(*backend).text { - let len = text.len(); - buffer.copy_from(text.as_ptr().cast(), len); - (*buffer.add(len)) = 0; // null terminate - (*backend).text = None; - 0 - } else { - (*buffer) = 0; - (*backend).handle_error("no json to be read") - } -} - -/// # Safety -/// -/// This must me called with a valid backend pointer -/// the buffer must be a valid pointer pointing to at least as much space as was -/// required by the previous binary result call -#[no_mangle] -pub unsafe extern "C" fn automerge_read_binary(backend: *mut Backend, buffer: *mut u8) -> isize { - if let Some(bin) = (*backend).binary.pop() { - let len = bin.len(); - buffer.copy_from(bin.as_ptr(), len); - if let Some(next) = (*backend).binary.last() { - next.len() as isize - } else { - 0 - } - } else { - (*backend).handle_error("no binary to be read") - } -} - -#[derive(Debug)] -pub struct SyncState { - handle: automerge_backend::SyncState, -} - -impl From for *mut SyncState { - fn from(s: SyncState) -> Self { - Box::into_raw(Box::new(s)) - } -} - -/// # Safety -/// Must be called with a valid backend pointer -/// sync_state must be a valid pointer to a SyncState -/// `encoded_msg_[ptr|len]` must be the address & length of a byte array -// Returns an `isize` indicating the length of the patch as a JSON string -// (-1 if there was an error, 0 if there is no patch) -#[no_mangle] -pub unsafe extern "C" fn automerge_receive_sync_message( - backend: *mut Backend, - sync_state: &mut SyncState, - encoded_msg_ptr: *const u8, - encoded_msg_len: usize, -) -> isize { - let slice = std::slice::from_raw_parts(encoded_msg_ptr, encoded_msg_len); - let decoded = automerge_backend::SyncMessage::decode(slice); - let msg = match decoded { - Ok(msg) => msg, - Err(e) => { - return (*backend).handle_error(e); - } - }; - let patch = (*backend).receive_sync_message(&mut sync_state.handle, msg); - if let Ok(None) = patch { - 0 - } else { - (*backend).generate_json(patch) - } -} - -/// # Safety -/// Must be called with a valid backend pointer -/// sync_state must be a valid pointer to a SyncState -/// Returns an `isize` indicating the length of the binary message -/// (-1 if there was an error, 0 if there is no message) -#[no_mangle] -pub unsafe extern "C" fn automerge_generate_sync_message( - backend: *mut Backend, - sync_state: &mut SyncState, -) -> isize { - let msg = (*backend).generate_sync_message(&mut sync_state.handle); - if let Some(msg) = msg { - (*backend).handle_binary(msg.encode().or(Err(AutomergeError::EncodeFailed))) - } else { - 0 - } -} - -#[no_mangle] -pub extern "C" fn automerge_sync_state_init() -> *mut SyncState { - let state = SyncState { - handle: automerge_backend::SyncState::default(), - }; - state.into() -} - -/// # Safety -/// Must be called with a valid backend pointer -/// sync_state must be a valid pointer to a SyncState -/// Returns an `isize` indicating the length of the binary message -/// (-1 if there was an error) -#[no_mangle] -pub unsafe extern "C" fn automerge_encode_sync_state( - backend: *mut Backend, - sync_state: &mut SyncState, -) -> isize { - (*backend).handle_binary( - sync_state - .handle - .encode() - .or(Err(AutomergeError::EncodeFailed)), - ) -} - -/// # Safety -/// `encoded_state_[ptr|len]` must be the address & length of a byte array -/// Returns an opaque pointer to a SyncState -/// panics (segfault?) if the buffer was invalid -#[no_mangle] -pub unsafe extern "C" fn automerge_decode_sync_state( - encoded_state_ptr: *const u8, - encoded_state_len: usize, -) -> *mut SyncState { - let slice = std::slice::from_raw_parts(encoded_state_ptr, encoded_state_len); - let decoded_state = automerge_backend::SyncState::decode(slice); - // TODO: Is there a way to avoid `unwrap` here? - let state = decoded_state.unwrap(); - let state = SyncState { handle: state }; - state.into() -} - -/// # Safety -/// sync_state must be a valid pointer to a SyncState -#[no_mangle] -pub unsafe extern "C" fn automerge_sync_state_free(sync_state: *mut SyncState) { - let sync_state: SyncState = *Box::from_raw(sync_state); - drop(sync_state); -} diff --git a/automerge-cli/Cargo.toml b/automerge-cli/Cargo.toml deleted file mode 100644 index ba9d5b18..00000000 --- a/automerge-cli/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "automerge-cli" -version = "0.1.0" -authors = ["Alex Good "] -edition = "2018" - -[[bin]] -name = "automerge" -path = "src/main.rs" -bench = false -doc = false - -[dependencies] -clap = "3.0.0-beta.2" -serde_json = "^1.0" -anyhow = "1.0" -atty = "0.2" -thiserror = "1.0.16" -combine = "4.5.2" -maplit = "1.0.2" -colored_json = "2.1.0" - -automerge-backend = { path = "../automerge-backend" } -automerge-frontend = { path = "../automerge-frontend" } -automerge-protocol = { path = "../automerge-protocol" } - -[dev-dependencies] -duct = "0.13" diff --git a/automerge-cli/src/export.rs b/automerge-cli/src/export.rs deleted file mode 100644 index 07e25378..00000000 --- a/automerge-cli/src/export.rs +++ /dev/null @@ -1,93 +0,0 @@ -use anyhow::Result; - -fn get_state_json(input_data: Vec) -> Result { - let mut backend = automerge_backend::Backend::new(); - let changes = automerge_backend::Change::load_document(&input_data)?; - let patch = backend.apply_changes(changes)?; - - let mut frontend = automerge_frontend::Frontend::new(); - frontend.apply_patch(patch)?; - - Ok(frontend.state().to_json()) -} - -pub fn export_json( - mut changes_reader: impl std::io::Read, - mut writer: impl std::io::Write, - is_tty: bool, -) -> Result<()> { - let mut input_data = vec![]; - changes_reader.read_to_end(&mut input_data)?; - - let state_json = get_state_json(input_data)?; - if is_tty { - colored_json::write_colored_json(&state_json, &mut writer).unwrap() - } else { - writeln!( - writer, - "{}", - serde_json::to_string_pretty(&state_json).unwrap() - )?; - } - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn cli_export_with_empty_input() { - assert_eq!(get_state_json(vec![]).unwrap(), serde_json::json!({})) - } - - #[test] - fn cli_export_with_flat_map() { - let initial_state_json: serde_json::Value = - serde_json::from_str(r#"{"sparrows": 15.0}"#).unwrap(); - let value: automerge_frontend::Value = - automerge_frontend::Value::from_json(&initial_state_json); - - let (_, initial_change) = - automerge_frontend::Frontend::new_with_initial_state(value).unwrap(); - let mut backend = automerge_backend::Backend::new(); - backend.apply_local_change(initial_change).unwrap(); - - let change_bytes = backend.save().unwrap(); - assert_eq!( - get_state_json(change_bytes).unwrap(), - serde_json::json!({"sparrows": 15.0}) - ) - } - - #[test] - fn cli_export_with_nested_map() { - let initial_state_json: serde_json::Value = serde_json::from_str( - r#"{ - "birds": { - "wrens": 3.0, - "sparrows": 15.0 - } -}"#, - ) - .unwrap(); - let value: automerge_frontend::Value = - automerge_frontend::Value::from_json(&initial_state_json); - - let (_, initial_change) = - automerge_frontend::Frontend::new_with_initial_state(value).unwrap(); - let mut backend = automerge_backend::Backend::new(); - backend.apply_local_change(initial_change).unwrap(); - - let change_bytes = backend.save().unwrap(); - assert_eq!( - get_state_json(change_bytes).unwrap(), - serde_json::json!({ - "birds": { - "wrens": 3.0, - "sparrows": 15.0 - } - }) - ) - } -} diff --git a/automerge-cli/src/import.rs b/automerge-cli/src/import.rs deleted file mode 100644 index 4f4f6e02..00000000 --- a/automerge-cli/src/import.rs +++ /dev/null @@ -1,23 +0,0 @@ -use anyhow::Result; -use automerge_backend::Backend; -use automerge_frontend::{Frontend, Value}; - -fn initialize_from_json(json_value: &serde_json::Value) -> Result> { - let value: Value = Value::from_json(&json_value); - - let (_, initial_change) = Frontend::new_with_initial_state(value)?; - let mut backend = Backend::new(); - backend.apply_local_change(initial_change)?; - - Ok(backend.save()?) -} - -pub fn import_json(mut reader: impl std::io::Read, mut writer: impl std::io::Write) -> Result<()> { - let mut buffer = String::new(); - reader.read_to_string(&mut buffer)?; - - let json_value: serde_json::Value = serde_json::from_str(&buffer)?; - let changes_bytes = initialize_from_json(&json_value)?; - writer.write_all(&changes_bytes)?; - Ok(()) -} diff --git a/automerge-cli/src/main.rs b/automerge-cli/src/main.rs deleted file mode 100644 index db1fb590..00000000 --- a/automerge-cli/src/main.rs +++ /dev/null @@ -1,182 +0,0 @@ -use std::{fs::File, path::PathBuf, str::FromStr}; - -use anyhow::{anyhow, Result}; -use clap::Clap; - -mod change; -mod examine; -mod export; -mod import; - -#[derive(Debug, Clap)] -#[clap(about = "Automerge CLI")] -struct Opts { - #[clap(subcommand)] - cmd: Command, -} - -#[derive(Debug)] -enum ExportFormat { - Json, - Toml, -} - -impl FromStr for ExportFormat { - type Err = anyhow::Error; - - fn from_str(input: &str) -> Result { - match input { - "json" => Ok(ExportFormat::Json), - "toml" => Ok(ExportFormat::Toml), - _ => Err(anyhow!("Invalid export format: {}", input)), - } - } -} - -#[derive(Debug, Clap)] -enum Command { - /// Output current state of an Automerge document in a specified format - Export { - /// Format for output: json, toml - #[clap(long, short, default_value = "json")] - format: ExportFormat, - - /// Path that contains Automerge changes - #[clap(parse(from_os_str))] - changes_file: Option, - }, - - Import { - /// Format for input: json, toml - #[clap(long, short, default_value = "json")] - format: ExportFormat, - - #[clap(parse(from_os_str))] - input_file: Option, - - /// Path to write Automerge changes to - #[clap(parse(from_os_str), long("out"), short('o'))] - changes_file: Option, - }, - - /// Read an automerge document from a file or stdin, perform a change on it and write a new - /// document to stdout or the specified output file. - Change { - /// The change script to perform. Change scripts have the form []. - /// The possible commands are 'set', 'insert', 'delete', and 'increment'. - /// - /// Paths look like this: $["mapkey"][0]. They always lways start with a '$', then each - /// subsequent segment of the path is either a string in double quotes to index a key in a - /// map, or an integer index to address an array element. - /// - /// Examples - /// - /// ## set - /// - /// > automerge change 'set $["someobject"] {"items": []}' somefile - /// - /// ## insert - /// - /// > automerge change 'insert $["someobject"]["items"][0] "item1"' somefile - /// - /// ## increment - /// - /// > automerge change 'increment $["mycounter"]' - /// - /// ## delete - /// - /// > automerge change 'delete $["someobject"]["items"]' somefile - script: String, - - /// The file to change, if omitted will assume stdin - #[clap(parse(from_os_str))] - input_file: Option, - - /// Path to write Automerge changes to, if omitted will write to stdout - #[clap(parse(from_os_str), long("out"), short('o'))] - output_file: Option, - }, - - /// Read an automerge document and print a JSON representation of the changes in it to stdout - Examine { input_file: Option }, -} - -fn open_file_or_stdin(maybe_path: Option) -> Result> { - if atty::is(atty::Stream::Stdin) { - if let Some(path) = maybe_path { - Ok(Box::new(File::open(&path).unwrap())) - } else { - Err(anyhow!( - "Must provide file path if not providing input via stdin" - )) - } - } else { - Ok(Box::new(std::io::stdin())) - } -} - -fn create_file_or_stdout(maybe_path: Option) -> Result> { - if atty::is(atty::Stream::Stdout) { - if let Some(path) = maybe_path { - Ok(Box::new(File::create(&path).unwrap())) - } else { - Err(anyhow!("Must provide file path if not piping to stdout")) - } - } else { - Ok(Box::new(std::io::stdout())) - } -} - -fn main() -> Result<()> { - let opts = Opts::parse(); - match opts.cmd { - Command::Export { - changes_file, - format, - } => match format { - ExportFormat::Json => { - let mut in_buffer = open_file_or_stdin(changes_file)?; - export::export_json( - &mut in_buffer, - &mut std::io::stdout(), - atty::is(atty::Stream::Stdout), - ) - } - ExportFormat::Toml => unimplemented!(), - }, - - Command::Import { - format, - input_file, - changes_file, - } => match format { - ExportFormat::Json => { - let mut out_buffer = create_file_or_stdout(changes_file)?; - let mut in_buffer = open_file_or_stdin(input_file)?; - import::import_json(&mut in_buffer, &mut out_buffer) - } - ExportFormat::Toml => unimplemented!(), - }, - Command::Change { - input_file, - output_file, - script, - } => { - let in_buffer = open_file_or_stdin(input_file)?; - let mut out_buffer = create_file_or_stdout(output_file)?; - change::change(in_buffer, &mut out_buffer, script.as_str()) - .map_err(|e| anyhow::format_err!("Unable to make changes: {:?}", e)) - } - Command::Examine { input_file } => { - let in_buffer = open_file_or_stdin(input_file)?; - let out_buffer = std::io::stdout(); - match examine::examine(in_buffer, out_buffer, atty::is(atty::Stream::Stdout)) { - Ok(()) => {} - Err(e) => { - eprintln!("Error: {:?}", e); - } - } - Ok(()) - } - } -} diff --git a/automerge-frontend/.gitignore b/automerge-frontend/.gitignore deleted file mode 100644 index e420ee4b..00000000 --- a/automerge-frontend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target/* diff --git a/automerge-frontend/Cargo.toml b/automerge-frontend/Cargo.toml deleted file mode 100644 index 289fd289..00000000 --- a/automerge-frontend/Cargo.toml +++ /dev/null @@ -1,47 +0,0 @@ -[package] -name = "automerge-frontend" -version = "0.1.0" -authors = ["Alex Good "] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -bench = false - -[dependencies] -automerge-protocol = { path = "../automerge-protocol" } -futures = "0.3.4" -serde = { version = "^1.0", features=["derive"] } -serde_json = "^1.0" -uuid = { version = "^0.8.2", features=["v4"] } -maplit = "1.0.2" -thiserror = "1.0.16" -im-rc = "15.0.0" -unicode-segmentation = "1.7.1" -arbitrary = { version = "1", features = ["derive"], optional = true } - -[target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies] -getrandom = { version = "0.2.2", features=["js"] } -uuid = { version = "0.8.1", features = ["wasm-bindgen", "v4", "serde"] } - -[dev-dependencies] -automerge-backend = { path = "../automerge-backend" } -criterion = "0.3.3" -rand = "0.8.2" -env_logger = "0.8.3" -log = "0.4.14" -wasm-bindgen-test = "0.3.22" -pretty_assertions = "0.7.1" - -[[bench]] -name = "statetree_apply_diff" -harness = false - -[[bench]] -name = "change" -harness = false - -[features] -default = ["std"] -derive-arbitrary = ["arbitrary"] -std = [] diff --git a/automerge-frontend/README.md b/automerge-frontend/README.md deleted file mode 100644 index 6e167d8c..00000000 --- a/automerge-frontend/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Automerge Frontend - -This is an implementation of the "frontend" of the automerge data structure. It -is designed to be used on the UI thread of a user facing application. diff --git a/automerge-frontend/benches/change.rs b/automerge-frontend/benches/change.rs deleted file mode 100644 index a3810455..00000000 --- a/automerge-frontend/benches/change.rs +++ /dev/null @@ -1,40 +0,0 @@ -use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Value}; -use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; -use rand::{thread_rng, Rng}; -use unicode_segmentation::UnicodeSegmentation; - -pub fn insert_long_string(c: &mut Criterion) { - c.bench_function("Frontend::change insert long string", move |b| { - b.iter_batched( - || { - let doc = Frontend::new(); - let random_string: String = thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .take(6000) - .map(char::from) - .collect(); - (doc, random_string) - }, - |(mut doc, string)| { - #[allow(clippy::unit_arg)] - black_box({ - doc.change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(string.graphemes(true).map(|s| s.to_owned()).collect()), - )) - }) - .unwrap() - }) - }, - BatchSize::SmallInput, - ) - }); -} - -criterion_group! { - name = frontend_benches; - config = Criterion::default().sample_size(10); - targets = insert_long_string, -} -criterion_main!(frontend_benches); diff --git a/automerge-frontend/benches/statetree_apply_diff.rs b/automerge-frontend/benches/statetree_apply_diff.rs deleted file mode 100644 index ccb171c9..00000000 --- a/automerge-frontend/benches/statetree_apply_diff.rs +++ /dev/null @@ -1,133 +0,0 @@ -use amp::RootDiff; -use automerge_frontend::Frontend; -use automerge_protocol as amp; -use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; -use maplit::hashmap; - -pub fn sequential_inserts_in_multiple_patches(c: &mut Criterion) { - let actor_id = amp::ActorId::random(); - let make_list_opid = actor_id.op_id_at(1); - let mut patches: Vec = vec![amp::Patch { - actor: None, - seq: None, - clock: hashmap! {actor_id.clone() => 1}, - deps: Vec::new(), - max_op: 1, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "text".to_string() => hashmap!{ - make_list_opid.clone() => amp::Diff::Text(amp::TextDiff{ - object_id: make_list_opid.clone().into(), - edits: Vec::new(), - }), - } - }, - }, - }]; - for index in 0..6000 { - let op_num = index + 2; - let this_op_id = actor_id.op_id_at(op_num as u64); - patches.push(amp::Patch { - actor: None, - seq: None, - clock: hashmap! {actor_id.clone() => op_num as u64}, - deps: Vec::new(), - max_op: op_num as u64, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "text".to_string() => hashmap!{ - make_list_opid.clone() => amp::Diff::Text(amp::TextDiff{ - object_id: make_list_opid.clone().into(), - edits: vec![amp::DiffEdit::SingleElementInsert{ - index, - elem_id: this_op_id.clone().into(), - op_id: this_op_id.clone(), - value: amp::Diff::Value(amp::ScalarValue::Str("c".to_string())), - }], - }) - } - }, - }, - }); - } - c.bench_function( - "StateTreeValue::apply_diff sequential text inserts across multiple patches", - move |b| { - b.iter_batched( - || { - let doc = Frontend::new(); - (doc, patches.clone()) - }, - |(mut doc, patches)| { - #[allow(clippy::unit_arg)] - black_box({ - for patch in patches.into_iter() { - doc.apply_patch(patch).unwrap(); - } - doc - }) - }, - BatchSize::SmallInput, - ) - }, - ); -} - -pub fn sequential_inserts_in_single_patch(c: &mut Criterion) { - let actor_id = amp::ActorId::random(); - let make_list_opid = actor_id.op_id_at(1); - let mut edits: Vec = Vec::new(); - for index in 0..6000 { - let op_num = index + 2; - let this_op_id = actor_id.op_id_at(op_num as u64); - edits.push(amp::DiffEdit::SingleElementInsert { - index, - elem_id: this_op_id.clone().into(), - op_id: this_op_id.clone(), - value: amp::Diff::Value(amp::ScalarValue::Str("c".to_string())), - }); - } - let patch: amp::Patch = amp::Patch { - actor: None, - seq: None, - clock: hashmap! {actor_id => 1}, - deps: Vec::new(), - max_op: 1, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "text".to_string() => hashmap!{ - make_list_opid.clone() => amp::Diff::Text(amp::TextDiff{ - object_id: make_list_opid.into(), - edits, - }), - } - }, - }, - }; - c.bench_function( - "StateTreeValue::apply_diff sequential text inserts in a single patch", - move |b| { - b.iter_batched( - || patch.clone(), - |patch| { - #[allow(clippy::unit_arg)] - black_box({ - let mut doc = Frontend::new(); - doc.apply_patch(patch).unwrap() - }) - }, - BatchSize::SmallInput, - ) - }, - ); -} - -criterion_group! { - name = benches; - config = Criterion::default().sample_size(10); - targets = sequential_inserts_in_multiple_patches, sequential_inserts_in_single_patch, -} -criterion_main!(benches); diff --git a/automerge-frontend/src/error.rs b/automerge-frontend/src/error.rs deleted file mode 100644 index 9cea5e84..00000000 --- a/automerge-frontend/src/error.rs +++ /dev/null @@ -1,117 +0,0 @@ -use std::{error::Error, fmt}; - -use automerge_protocol as amp; -use automerge_protocol::ObjectId; -use thiserror::Error; - -use crate::{value::Value, Path}; - -#[derive(Debug, PartialEq)] -pub enum AutomergeFrontendError { - InvalidChangeRequest, - MissingObjectError(ObjectId), - NoSuchPathError(Path), - PathIsNotCounter, - CannotOverwriteCounter, - MismatchedSequenceNumber, - InvalidActorIdString(String), -} - -impl fmt::Display for AutomergeFrontendError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl From for AutomergeFrontendError { - fn from(e: automerge_protocol::error::InvalidActorId) -> AutomergeFrontendError { - AutomergeFrontendError::InvalidActorIdString(e.0) - } -} - -impl Error for AutomergeFrontendError {} - -#[derive(Debug, PartialEq)] -pub enum InvalidInitialStateError { - InitialStateMustBeMap, -} - -impl fmt::Display for InvalidInitialStateError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Error for InvalidInitialStateError {} - -//TODO Most of these errors should have paths associated with them to make it -//easier to understand where things are going wrong -#[derive(Error, Debug, PartialEq)] -pub enum InvalidPatch { - #[error("Mismatched sequence number, expected: {expected} but got {actual}")] - MismatchedSequenceNumber { expected: u64, actual: u64 }, - #[error("Received a diff inserting a non text object in a text object. Target object id was {object_id}, diff was {diff:?}")] - InsertNonTextInTextObject { - object_id: ObjectId, - diff: amp::Diff, - }, - #[error( - "Received a diff for a character in a text object which created more than one character" - )] - InsertMultipleCharsInTextChar, - #[error("Received a diff which had multiple values for a key in a table. Table id was {table_id}, diff was {diff:?}")] - ConflictsReceivedForTableKey { table_id: ObjectId, diff: amp::Diff }, - #[error("Patch contained a diff which expected object with ID {object_id:?} to be {patch_expected_type:?} but we think it is {actual_type:?}")] - MismatchingObjectType { - object_id: ObjectId, - patch_expected_type: Option, - actual_type: Option, - }, - #[error("Patch referenced an object id {patch_expected_id:?} at a path where we ecpected {actual_id:?}")] - MismatchingObjectIDs { - patch_expected_id: Option, - actual_id: ObjectId, - }, - #[error("Patch attempted to reference an index which did not exist for object {object_id}")] - InvalidIndex { object_id: ObjectId, index: usize }, - #[error("The patch tried to create an object but specified no value for the new object")] - DiffCreatedObjectWithNoValue, - #[error("The patch contained a diff with a list edit which referenced the '_head' of a list, rather than a specific element ID")] - DiffEditWithHeadElemId, - #[error("Value diff containing cursor")] - ValueDiffContainedCursor, -} - -#[derive(Error, Debug, PartialEq)] -pub enum InvalidChangeRequest { - #[error("attempted to set the value of {path:?}, which is not allowed because that value is a counter")] - CannotOverwriteCounter { path: Path }, - #[error("attempted an operation on a path that does not exist: {path:?}")] - NoSuchPathError { path: Path }, - #[error("attempted to set a non map object {value:?} as the root")] - CannotSetNonMapObjectAsRoot { value: Value }, - #[error("attempted to increment an object which is not a counter at {path:?}")] - IncrementForNonCounterObject { path: Path }, - #[error("attempted to insert using a path which does not end in an index: {path:?}")] - InsertWithNonSequencePath { path: Path }, - #[error("attempted to insert into an object which is not a sequence at {path:?}")] - InsertForNonSequenceObject { path: Path }, - #[error("attempted to insert past the end of a sequence, path was {path:?}, max length of sequence is {sequence_length}")] - InsertPastEndOfSequence { path: Path, sequence_length: u64 }, - #[error("attempted to insert something into a text object which is not a character, object: {object:?}")] - InsertNonTextInTextObject { path: Path, object: Value }, - #[error("attmpted to delete root object")] - CannotDeleteRootObject, - #[error("Attempted to access a missing index")] - MissingIndexError { - #[from] - source: MissingIndexError, - }, -} - -#[derive(Error, Debug, PartialEq)] -#[error("Attempted to access index {missing_index} in a collection with max index: {size_of_collection}")] -pub struct MissingIndexError { - pub missing_index: usize, - pub size_of_collection: usize, -} diff --git a/automerge-frontend/src/lib.rs b/automerge-frontend/src/lib.rs deleted file mode 100644 index 01a1e6b0..00000000 --- a/automerge-frontend/src/lib.rs +++ /dev/null @@ -1,523 +0,0 @@ -use automerge_protocol as amp; -use automerge_protocol::{ActorId, ChangeHash, ObjectId, Op, OpId, Patch}; - -mod error; -mod mutation; -mod path; -mod state_tree; -mod value; - -use std::{collections::HashMap, convert::TryFrom, error::Error, fmt::Debug}; - -pub use error::{ - AutomergeFrontendError, InvalidChangeRequest, InvalidInitialStateError, InvalidPatch, -}; -pub use mutation::{LocalChange, MutableDocument}; -pub use path::Path; -use path::PathElement; -use state_tree::ResolvedPath; -pub use value::{Conflicts, Cursor, Primitive, Value}; - -/// Tracks the possible states of the frontend -/// -/// What does this mean and why do we need it? The reason the frontend/backend -/// split exists in the first place is that we want to quickly apply local -/// changes (local in this sense means something like "on the UI thread") on a -/// low latency local cache whilst also shipping those same changes off to a -/// backend, which can reconcile them with historical changes and new changes -/// received over the network - work which may be more compute intensive and -/// so have to high a latency to be acceptable on the UI thread. -/// -/// This frontend/backend split implies that we need to optimistically apply -/// local changes somehow. In order to do this we immediately apply changes to -/// a copy of the local state (state being an instance of [StateTree]) and -/// add the sequence number of the new change to a list of in flight requests. -/// In detail the logic looks like this: -/// -/// When we receive a patch from the backend: -/// 1. Check that if the patch is for our actor ID then the sequence number of -/// the patch is the same as the sequence number of the oldest in flight -/// request. -/// 2. Apply the patch to the `reconciled_state` of the current state -/// 3. If there are no in flight requests remaining then transition from -/// the `WaitingForInFlightRequests` state to the `Reconciled` state, -/// moving the `reconciled_state` into the `Reconciled` enum branch -#[derive(Clone, Debug)] -enum FrontendState { - /// The backend is processing some requests so we need to keep an optimistic version of the - /// state. - WaitingForInFlightRequests { - /// The sequence numbers of in flight changes. - in_flight_requests: Vec, - /// The root state that the backend tracks. - reconciled_root_state: state_tree::StateTree, - /// The optimistic version of the root state that the user manipulates. - optimistically_updated_root_state: state_tree::StateTree, - /// A flag to track whether this state has seen a patch from the backend that represented - /// changes from another actor. - /// - /// If this is true then our optimistic state will not equal the reconciled state so we may - /// need to do extra work when moving to the reconciled state. - seen_non_local_patch: bool, - /// The maximum operation observed. - max_op: u64, - }, - /// The backend has processed all changes and we no longer wait for anything. - Reconciled { - /// The root state that the backend tracks. - reconciled_root_state: state_tree::StateTree, - /// A copy of the reconciled root state that we keep to be able to undo changes a user - /// makes when changing the state. - reconciled_root_state_copy_for_rollback: state_tree::StateTree, - /// The maximum operation observed. - max_op: u64, - /// The dependencies of the last received patch. - deps_of_last_received_patch: Vec, - }, -} - -impl FrontendState { - /// Apply a patch received from the backend to this frontend state, - /// returns the updated cached value (if it has changed) and a new - /// `FrontendState` which replaces this one - fn apply_remote_patch( - &mut self, - self_actor: &ActorId, - patch: Patch, - ) -> Result<(), InvalidPatch> { - match self { - FrontendState::WaitingForInFlightRequests { - in_flight_requests, - reconciled_root_state, - optimistically_updated_root_state, - seen_non_local_patch, - max_op: _, - } => { - let mut new_in_flight_requests = in_flight_requests.clone(); - // If the actor ID and seq exist then this patch corresponds - // to a local change (i.e it came from Backend::apply_local_change - // so we don't need to apply it, we just need to remove it from - // the in_flight_requests vector - let mut is_local = false; - if let (Some(patch_actor), Some(patch_seq)) = (&patch.actor, patch.seq) { - // If this is a local change corresponding to our actor then we - // need to match it against in flight requests - if self_actor == patch_actor { - // Check that if the patch is for our actor ID then it is not - // out of order - if new_in_flight_requests[0] != patch_seq { - return Err(InvalidPatch::MismatchedSequenceNumber { - expected: new_in_flight_requests[0], - actual: patch_seq, - }); - } - is_local = true; - // unwrap should be fine here as `in_flight_requests` should never have zero length - // because we transition to reconciled state when that happens - let (_, remaining_requests) = new_in_flight_requests.split_first().unwrap(); - new_in_flight_requests = remaining_requests.iter().copied().collect(); - } - } - let checked_diff = reconciled_root_state.check_diff(patch.diffs)?; - - reconciled_root_state.apply_diff(checked_diff); - if new_in_flight_requests.is_empty() { - if *seen_non_local_patch { - *optimistically_updated_root_state = reconciled_root_state.clone(); - } - *self = FrontendState::Reconciled { - reconciled_root_state: std::mem::take(reconciled_root_state), - reconciled_root_state_copy_for_rollback: std::mem::take( - optimistically_updated_root_state, - ), - max_op: patch.max_op, - deps_of_last_received_patch: patch.deps, - } - } else { - *in_flight_requests = new_in_flight_requests; - *seen_non_local_patch = *seen_non_local_patch || !is_local; - // don't update max_op as we have progressed since then - } - Ok(()) - } - FrontendState::Reconciled { - reconciled_root_state, - reconciled_root_state_copy_for_rollback, - max_op, - deps_of_last_received_patch, - } => { - let checked_diff = reconciled_root_state.check_diff(patch.diffs)?; - - reconciled_root_state.apply_diff(checked_diff.clone()); - // quicker and cheaper to apply the diff again than to clone the large root state - reconciled_root_state_copy_for_rollback.apply_diff(checked_diff); - *max_op = patch.max_op; - *deps_of_last_received_patch = patch.deps; - Ok(()) - } - } - } - - fn get_object_id(&self, path: &Path) -> Option { - self.resolve_path(path).and_then(|r| r.object_id()) - } - - fn get_value(&self, path: &Path) -> Option { - self.resolve_path(path).map(|r| r.default_value()) - } - - fn resolve_path(&self, path: &Path) -> Option { - let root = match self { - FrontendState::WaitingForInFlightRequests { - optimistically_updated_root_state, - .. - } => optimistically_updated_root_state, - FrontendState::Reconciled { - reconciled_root_state, - .. - } => reconciled_root_state, - }; - root.resolve_path(path) - } - - /// Apply a patch. The change closure will be passed a `MutableDocument` - /// which it can use to query the document state and make changes. It - /// can also throw an error of type `E`. If an error is thrown in the - /// closure no chnages are made and the error is returned. - pub fn optimistically_apply_change( - &mut self, - actor: &ActorId, - change_closure: F, - seq: u64, - ) -> Result, E> - where - E: Error, - F: FnOnce(&mut dyn MutableDocument) -> Result, - { - match self { - FrontendState::WaitingForInFlightRequests { - in_flight_requests, - reconciled_root_state: _, - optimistically_updated_root_state, - seen_non_local_patch: _, - max_op, - } => { - let mut mutation_tracker = mutation::MutationTracker::new( - optimistically_updated_root_state, - *max_op, - actor.clone(), - ); - // TODO: somehow handle rolling back the optimistic state if the closure gives an - // error - let result = match change_closure(&mut mutation_tracker) { - Ok(result) => result, - Err(e) => { - // reset the original state - mutation_tracker.rollback(); - return Err(e); - } - }; - *max_op = mutation_tracker.max_op; - let ops = mutation_tracker.ops(); - if !ops.is_empty() { - // we actually have made a change so expect it to be sent to the backend - in_flight_requests.push(seq); - } - - Ok(OptimisticChangeResult { - ops, - deps: Vec::new(), - closure_result: result, - }) - } - FrontendState::Reconciled { - reconciled_root_state, - reconciled_root_state_copy_for_rollback, - max_op, - deps_of_last_received_patch, - } => { - let mut mutation_tracker = mutation::MutationTracker::new( - reconciled_root_state_copy_for_rollback, - *max_op, - actor.clone(), - ); - let result = match change_closure(&mut mutation_tracker) { - Ok(result) => result, - Err(e) => { - // reset the original state - mutation_tracker.rollback(); - return Err(e); - } - }; - *max_op = mutation_tracker.max_op; - let ops = mutation_tracker.ops(); - let in_flight_requests = vec![seq]; - let deps = deps_of_last_received_patch.clone(); - if !ops.is_empty() { - *self = FrontendState::WaitingForInFlightRequests { - in_flight_requests, - optimistically_updated_root_state: std::mem::take( - reconciled_root_state_copy_for_rollback, - ), - seen_non_local_patch: false, - reconciled_root_state: std::mem::take(reconciled_root_state), - max_op: *max_op, - } - } else { - // the old and new states should be equal since we have no operations - debug_assert_eq!( - *reconciled_root_state_copy_for_rollback, - *reconciled_root_state - ); - // we can remain in the reconciled frontend state since we didn't make a change - }; - Ok(OptimisticChangeResult { - ops, - deps, - closure_result: result, - }) - } - } - } - - fn in_flight_requests(&self) -> Vec { - match self { - FrontendState::WaitingForInFlightRequests { - in_flight_requests, .. - } => in_flight_requests.clone(), - _ => Vec::new(), - } - } - - fn max_op(&self) -> u64 { - match self { - FrontendState::WaitingForInFlightRequests { max_op, .. } => *max_op, - FrontendState::Reconciled { max_op, .. } => *max_op, - } - } - - fn value(&self) -> Value { - match self { - FrontendState::WaitingForInFlightRequests { - optimistically_updated_root_state, - .. - } => optimistically_updated_root_state.value(), - FrontendState::Reconciled { - reconciled_root_state, - .. - } => reconciled_root_state.value(), - } - } -} - -pub struct Frontend { - pub actor_id: ActorId, - pub seq: u64, - /// The current state of the frontend, see the description of - /// `FrontendState` for details. It's an `Option` to allow consuming it - /// using Option::take whilst behind a mutable reference. - state: FrontendState, - /// A cache of the value of this frontend - cached_value: Option, - /// A function for generating timestamps - timestamper: Box Option>, -} - -impl Debug for Frontend { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { - let Frontend { - actor_id, - seq, - state, - cached_value, - timestamper: _, - } = self; - { - let mut builder = f.debug_struct("Frontend"); - let _ = builder.field("actor_id", &actor_id); - let _ = builder.field("seq", &seq); - let _ = builder.field("state", &state); - let _ = builder.field("cached_value", &cached_value); - builder.finish() - } - } -} - -#[cfg(feature = "std")] -impl Default for Frontend { - fn default() -> Self { - Self::new() - } -} - -impl Frontend { - #[cfg(feature = "std")] - pub fn new() -> Self { - let system_time = || { - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .ok() - .and_then(|d| i64::try_from(d.as_millis()).ok()) - }; - Self::new_with_timestamper(Box::new(system_time)) - } - - #[cfg(feature = "std")] - pub fn new_with_actor_id(actor_id: uuid::Uuid) -> Self { - let system_time = || { - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .ok() - .and_then(|d| i64::try_from(d.as_millis()).ok()) - }; - Self::new_with_timestamper_and_actor_id(Box::new(system_time), actor_id) - } - - pub fn new_with_timestamper(t: Box Option>) -> Self { - Self::new_with_timestamper_and_actor_id(t, uuid::Uuid::new_v4()) - } - - pub fn new_with_timestamper_and_actor_id( - t: Box Option>, - actor_id: uuid::Uuid, - ) -> Self { - let root_state = state_tree::StateTree::new(); - Frontend { - actor_id: ActorId::from_bytes(actor_id.as_bytes()), - seq: 0, - state: FrontendState::Reconciled { - reconciled_root_state: root_state.clone(), - reconciled_root_state_copy_for_rollback: root_state, - max_op: 0, - deps_of_last_received_patch: Vec::new(), - }, - cached_value: None, - timestamper: t, - } - } - - #[cfg(feature = "std")] - pub fn new_with_initial_state( - initial_state: Value, - ) -> Result<(Self, amp::Change), InvalidInitialStateError> { - match &initial_state { - Value::Map(kvs) => { - let mut front = Frontend::new(); - let (init_ops, _) = - kvs.iter() - .fold((Vec::new(), 1), |(mut ops, max_op), (k, v)| { - let (more_ops, max_op) = value::value_to_op_requests( - &front.actor_id, - max_op, - ObjectId::Root, - &k.into(), - v, - false, - ); - ops.extend(more_ops); - (ops, max_op) - }); - - let init_change_request = amp::Change { - actor_id: front.actor_id.clone(), - start_op: 1, - time: (front.timestamper)().unwrap_or(0), - seq: 1, - message: Some("Initialization".to_string()), - hash: None, - deps: Vec::new(), - operations: init_ops, - extra_bytes: Vec::new(), - }; - // Unwrap here is fine because it should be impossible to - // cause an error applying a local change from a `Value`. If - // that happens we've made an error, not the user. - front.change(Some("initialization".into()), |doc| { - doc.add_change(LocalChange::set(Path::root(), initial_state)) - .map_err(|_| InvalidInitialStateError::InitialStateMustBeMap) - })?; - Ok((front, init_change_request)) - } - _ => Err(InvalidInitialStateError::InitialStateMustBeMap), - } - } - - pub fn state(&mut self) -> &Value { - if let Some(ref v) = self.cached_value { - v - } else { - let value = self.state.value(); - self.cached_value = Some(value); - self.cached_value.as_ref().unwrap() - } - } - - pub fn change( - &mut self, - message: Option, - change_closure: F, - ) -> Result<(O, Option), E> - where - E: Error, - F: FnOnce(&mut dyn MutableDocument) -> Result, - { - let start_op = self.state.max_op() + 1; - let change_result = - self.state - .optimistically_apply_change(&self.actor_id, change_closure, self.seq + 1)?; - self.cached_value = None; - if !change_result.ops.is_empty() { - self.seq += 1; - let change = amp::Change { - start_op, - actor_id: self.actor_id.clone(), - seq: self.seq, - time: (self.timestamper)().unwrap_or(0), - message, - hash: None, - deps: change_result.deps, - operations: change_result.ops, - extra_bytes: Vec::new(), - }; - Ok((change_result.closure_result, Some(change))) - } else { - Ok((change_result.closure_result, None)) - } - } - - pub fn apply_patch(&mut self, patch: Patch) -> Result<(), InvalidPatch> { - self.cached_value = None; - if let Some(seq) = patch.clock.get(&self.actor_id) { - if *seq > self.seq { - self.seq = *seq; - } - } - self.state.apply_remote_patch(&self.actor_id, patch)?; - Ok(()) - } - - pub fn get_object_id(&self, path: &Path) -> Option { - self.state.get_object_id(path) - } - - pub fn in_flight_requests(&self) -> Vec { - self.state.in_flight_requests() - } - - /// Gets the set of values for `path`, returns None if the path does not - /// exist - pub fn get_conflicts(&self, path: &Path) -> Option> { - self.state.resolve_path(path).map(|o| o.values()) - } - - /// Returns the value given by path, if it exists - pub fn get_value(&self, path: &Path) -> Option { - self.state.get_value(path) - } -} - -struct OptimisticChangeResult { - ops: Vec, - deps: Vec, - closure_result: O, -} diff --git a/automerge-frontend/src/mutation.rs b/automerge-frontend/src/mutation.rs deleted file mode 100644 index ae7b9296..00000000 --- a/automerge-frontend/src/mutation.rs +++ /dev/null @@ -1,685 +0,0 @@ -use automerge_protocol as amp; -use unicode_segmentation::UnicodeSegmentation; - -use crate::{ - error::InvalidChangeRequest, - state_tree::{ - LocalOperationResult, MultiGrapheme, MultiValue, ResolvedPath, ResolvedPathMut, - SetOrInsertPayload, StateTree, - }, - value::{Cursor, Primitive, Value}, - Path, PathElement, -}; - -pub trait MutableDocument { - fn value_at_path(&self, path: &Path) -> Option; - fn cursor_to_path(&self, path: &Path) -> Option; - fn add_change(&mut self, change: LocalChange) -> Result<(), InvalidChangeRequest>; -} - -#[derive(Debug, PartialEq, Clone)] -pub enum LocalOperation { - Set(Value), - Delete, - Increment(i64), - Insert(Value), - InsertMany(Vec), -} - -#[derive(Debug, PartialEq, Clone)] -pub struct LocalChange { - path: Path, - operation: LocalOperation, -} - -impl LocalChange { - /// Set the value at `path` to `value` - pub fn set(path: Path, value: TV) -> LocalChange - where - TV: Into, - { - LocalChange { - path, - operation: LocalOperation::Set(value.into()), - } - } - - /// Delete the entry at `path` - pub fn delete(path: Path) -> LocalChange { - LocalChange { - path, - operation: LocalOperation::Delete, - } - } - - /// Increment the counter at `path` by 1 - pub fn increment(path: Path) -> LocalChange { - LocalChange { - path, - operation: LocalOperation::Increment(1), - } - } - - /// Increment the counter at path by a (possibly negative) amount `by` - pub fn increment_by(path: Path, by: i64) -> LocalChange { - LocalChange { - path, - operation: LocalOperation::Increment(by), - } - } - - pub fn insert(path: Path, value: Value) -> LocalChange { - LocalChange { - path, - operation: LocalOperation::Insert(value), - } - } - - pub fn insert_many(path: Path, values: Vec) -> LocalChange { - LocalChange { - path, - operation: LocalOperation::InsertMany(values), - } - } -} - -enum LocalOperationForRollback { - Set { old: Option }, - SetList { old: MultiValue }, - SetText { old: MultiGrapheme }, - Delete { old: MultiValue }, - DeleteText { old: MultiGrapheme }, - Insert, - InsertMany { count: usize }, - Increment { by: i64 }, -} - -/// `MutationTracker` is used as the context in which a mutation closure is -/// applied. The mutation tracker implements `MutableDocument`, which is how it -/// captures the changes that the mutation closure is making. -/// -/// For each operation in the mutation closure the `MutationTracker` generates -/// a diff and immediately applies it to the `StateTree` it is constructed -/// with. It also adds the change to a set of operations. This set of operations -/// is used to generate a `ChangeRequest` once the closure is completed. -pub struct MutationTracker<'a> { - state: &'a mut StateTree, - ops: Vec, - copies_for_rollback: Vec<(Path, LocalOperationForRollback)>, - pub max_op: u64, - actor_id: amp::ActorId, -} - -impl<'a> MutationTracker<'a> { - pub(crate) fn new(state_tree: &'a mut StateTree, max_op: u64, actor_id: amp::ActorId) -> Self { - Self { - state: state_tree, - ops: Vec::new(), - copies_for_rollback: Vec::new(), - max_op, - actor_id, - } - } - - pub fn ops(self) -> Vec { - self.ops - } - - /// If the `value` is a map, individually assign each k,v in it to a key in - /// the root object - fn wrap_root_assignment(&mut self, value: Value) -> Result<(), InvalidChangeRequest> { - match value { - Value::Map(kvs) => { - for (k, v) in kvs.iter() { - self.add_change(LocalChange::set(Path::root().key(k), v.clone()))?; - } - Ok(()) - } - _ => Err(InvalidChangeRequest::CannotSetNonMapObjectAsRoot { - value: value.clone(), - }), - } - } - - fn apply_state_change(&mut self, change: LocalOperationResult) { - self.max_op += change.new_ops.len() as u64; - self.ops.extend(change.new_ops); - } - - fn insert_helper(&mut self, path: &Path, values: I) -> Result<(), InvalidChangeRequest> - where - I: ExactSizeIterator, - { - if let Some(name) = path.name() { - let index = match name { - PathElement::Index(i) => i, - _ => { - return Err(InvalidChangeRequest::InsertWithNonSequencePath { - path: path.clone(), - }) - } - }; - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match parent { - ResolvedPathMut::List(mut list_target) => { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value: values, - }; - let res = list_target.insert_many(*index, payload)?; - self.apply_state_change(res); - } - ResolvedPathMut::Text(mut text_target) => { - let mut chars = Vec::with_capacity(values.len()); - for value in values { - match value { - Value::Primitive(Primitive::Str(s)) => { - if s.graphemes(true).count() == 1 { - chars.push(s.clone()) - } else { - return Err( - InvalidChangeRequest::InsertNonTextInTextObject { - path: path.clone(), - object: Value::Primitive(Primitive::Str(s)), - }, - ); - } - } - _ => { - return Err(InvalidChangeRequest::InsertNonTextInTextObject { - path: path.clone(), - object: value.clone(), - }) - } - } - } - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value: chars.into_iter(), - }; - let res = text_target.insert_many(*index, payload)?; - self.apply_state_change(res); - } - _ => return Err(InvalidChangeRequest::NoSuchPathError { path: path.clone() }), - }; - Ok(()) - } else { - Err(InvalidChangeRequest::InsertForNonSequenceObject { path: path.clone() }) - } - } else { - Err(InvalidChangeRequest::NoSuchPathError { path: path.clone() }) - } - } - - /// Undo the operations applied to this document. - /// - /// This is used in the case of an error to undo the already applied changes. - pub fn rollback(self) { - for (path, op) in self.copies_for_rollback.into_iter().rev() { - match op { - LocalOperationForRollback::Set { old } => { - if let Some(key) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match (key, parent) { - (PathElement::Key(key), ResolvedPathMut::Root(mut map)) => { - map.rollback_set(key.clone(), old) - } - (PathElement::Key(key), ResolvedPathMut::Map(mut map)) => { - map.rollback_set(key.clone(), old) - } - (PathElement::Key(key), ResolvedPathMut::Table(mut table)) => { - table.rollback_set(key.clone(), old) - } - (PathElement::Key(_), ResolvedPathMut::List(_)) - | (PathElement::Key(_), ResolvedPathMut::Text(_)) - | (PathElement::Key(_), ResolvedPathMut::Character(_)) - | (PathElement::Key(_), ResolvedPathMut::Counter(_)) - | (PathElement::Key(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non object with key") - } - (PathElement::Index(_), ResolvedPathMut::List(_)) - | (PathElement::Index(_), ResolvedPathMut::Text(_)) - | (PathElement::Index(_), ResolvedPathMut::Root(_)) - | (PathElement::Index(_), ResolvedPathMut::Map(_)) - | (PathElement::Index(_), ResolvedPathMut::Table(_)) - | (PathElement::Index(_), ResolvedPathMut::Character(_)) - | (PathElement::Index(_), ResolvedPathMut::Counter(_)) - | (PathElement::Index(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found index element while rolling back a set") - } - } - } - } - } - LocalOperationForRollback::SetList { old } => { - if let Some(key) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match (key, parent) { - (PathElement::Key(_), _) => { - unreachable!("found key element while rolling back a setlist") - } - (PathElement::Index(i), ResolvedPathMut::List(mut list)) => { - list.rollback_set(*i as usize, old) - } - (PathElement::Index(_), ResolvedPathMut::Text(_)) - | (PathElement::Index(_), ResolvedPathMut::Root(_)) - | (PathElement::Index(_), ResolvedPathMut::Map(_)) - | (PathElement::Index(_), ResolvedPathMut::Table(_)) - | (PathElement::Index(_), ResolvedPathMut::Character(_)) - | (PathElement::Index(_), ResolvedPathMut::Counter(_)) - | (PathElement::Index(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non list with index") - } - } - } - } - } - LocalOperationForRollback::SetText { old } => { - if let Some(key) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match (key, parent) { - (PathElement::Key(_), _) => { - unreachable!("found key element while rolling back a settext") - } - (PathElement::Index(i), ResolvedPathMut::Text(mut text)) => { - text.rollback_set(*i as usize, old) - } - (PathElement::Index(_), ResolvedPathMut::List(_)) - | (PathElement::Index(_), ResolvedPathMut::Root(_)) - | (PathElement::Index(_), ResolvedPathMut::Map(_)) - | (PathElement::Index(_), ResolvedPathMut::Table(_)) - | (PathElement::Index(_), ResolvedPathMut::Character(_)) - | (PathElement::Index(_), ResolvedPathMut::Counter(_)) - | (PathElement::Index(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non text with index") - } - } - } - } - } - LocalOperationForRollback::Delete { old } => { - if let Some(key) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match (key, parent) { - (PathElement::Key(key), ResolvedPathMut::Root(mut map)) => { - map.rollback_delete(key.clone(), old) - } - (PathElement::Key(key), ResolvedPathMut::Map(mut map)) => { - map.rollback_delete(key.clone(), old) - } - (PathElement::Key(key), ResolvedPathMut::Table(mut table)) => { - table.rollback_delete(key.clone(), old) - } - (PathElement::Key(_), ResolvedPathMut::List(_)) - | (PathElement::Key(_), ResolvedPathMut::Text(_)) - | (PathElement::Key(_), ResolvedPathMut::Character(_)) - | (PathElement::Key(_), ResolvedPathMut::Counter(_)) - | (PathElement::Key(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non object with key") - } - (PathElement::Index(i), ResolvedPathMut::List(mut list)) => { - list.rollback_delete(*i as usize, old) - } - (PathElement::Index(_), ResolvedPathMut::Text(_)) - | (PathElement::Index(_), ResolvedPathMut::Root(_)) - | (PathElement::Index(_), ResolvedPathMut::Map(_)) - | (PathElement::Index(_), ResolvedPathMut::Table(_)) - | (PathElement::Index(_), ResolvedPathMut::Character(_)) - | (PathElement::Index(_), ResolvedPathMut::Counter(_)) - | (PathElement::Index(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non list with index") - } - } - } - } - } - LocalOperationForRollback::DeleteText { old } => { - if let Some(key) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match (key, parent) { - (PathElement::Key(_), ResolvedPathMut::Root(_)) - | (PathElement::Key(_), ResolvedPathMut::Map(_)) - | (PathElement::Key(_), ResolvedPathMut::Table(_)) - | (PathElement::Key(_), ResolvedPathMut::List(_)) - | (PathElement::Key(_), ResolvedPathMut::Text(_)) - | (PathElement::Key(_), ResolvedPathMut::Character(_)) - | (PathElement::Key(_), ResolvedPathMut::Counter(_)) - | (PathElement::Key(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found key for SetText") - } - (PathElement::Index(i), ResolvedPathMut::Text(mut text)) => { - text.rollback_delete(*i as usize, old) - } - (PathElement::Index(_), ResolvedPathMut::List(_)) - | (PathElement::Index(_), ResolvedPathMut::Root(_)) - | (PathElement::Index(_), ResolvedPathMut::Map(_)) - | (PathElement::Index(_), ResolvedPathMut::Table(_)) - | (PathElement::Index(_), ResolvedPathMut::Character(_)) - | (PathElement::Index(_), ResolvedPathMut::Counter(_)) - | (PathElement::Index(_), ResolvedPathMut::Primitive(_)) => { - unreachable!("found non text with index") - } - } - } - } - } - LocalOperationForRollback::Insert => { - if let Some(PathElement::Index(index)) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match parent { - ResolvedPathMut::List(mut list) => { - list.rollback_insert(*index as usize) - } - ResolvedPathMut::Text(mut text) => { - text.rollback_insert(*index as usize) - } - ResolvedPathMut::Root(_) - | ResolvedPathMut::Map(_) - | ResolvedPathMut::Table(_) - | ResolvedPathMut::Character(_) - | ResolvedPathMut::Counter(_) - | ResolvedPathMut::Primitive(_) => { - unreachable!("Found non list object in rollback insert") - } - } - } - } - } - LocalOperationForRollback::InsertMany { count } => { - if let Some(PathElement::Index(index)) = path.name() { - if let Some(parent) = self.state.resolve_path_mut(&path.parent()) { - match parent { - ResolvedPathMut::List(mut list) => { - for _ in 0..count { - list.rollback_insert(*index as usize) - } - } - ResolvedPathMut::Text(mut text) => { - for _ in 0..count { - text.rollback_insert(*index as usize) - } - } - ResolvedPathMut::Root(_) - | ResolvedPathMut::Map(_) - | ResolvedPathMut::Table(_) - | ResolvedPathMut::Character(_) - | ResolvedPathMut::Counter(_) - | ResolvedPathMut::Primitive(_) => { - unreachable!("Found non list object in rollback insert") - } - } - } - } - } - LocalOperationForRollback::Increment { by } => { - if path.name().is_some() { - if let Some(ResolvedPathMut::Counter(mut counter)) = - self.state.resolve_path_mut(&path) - { - counter.rollback_increment(by) - } - } - } - } - } - } -} - -impl<'a> MutableDocument for MutationTracker<'a> { - fn value_at_path(&self, path: &Path) -> Option { - self.state.resolve_path(path).map(|r| r.default_value()) - } - - fn cursor_to_path(&self, path: &Path) -> Option { - if let Some(PathElement::Index(i)) = path.name() { - if let Some(parent) = self.state.resolve_path(&path.parent()) { - match parent { - ResolvedPath::List(list_target) => list_target.get_cursor(*i).ok(), - ResolvedPath::Text(text_target) => text_target.get_cursor(*i).ok(), - _ => None, - } - } else { - None - } - } else { - None - } - } - - fn add_change(&mut self, change: LocalChange) -> Result<(), InvalidChangeRequest> { - match change.operation { - LocalOperation::Set(value) => { - //TODO double resolving is ugly here - if let Some(ResolvedPath::Counter(_)) = self.state.resolve_path(&change.path) { - return Err(InvalidChangeRequest::CannotOverwriteCounter { path: change.path }); - }; - if let Some(name) = change.path.name() { - if let Some(parent) = self.state.resolve_path_mut(&change.path.parent()) { - let (rollback_op, res) = match (name, parent) { - ( - PathElement::Key(ref k), - ResolvedPathMut::Root(ref mut root_target), - ) => { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value, - }; - let (old, res) = root_target.set_key(k, payload); - Ok((LocalOperationForRollback::Set { old }, res)) - } - (PathElement::Key(ref k), ResolvedPathMut::Map(ref mut maptarget)) => { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value, - }; - let (old, res) = maptarget.set_key(k, payload); - Ok((LocalOperationForRollback::Set { old }, res)) - } - ( - PathElement::Key(ref k), - ResolvedPathMut::Table(ref mut tabletarget), - ) => { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value, - }; - let (old, res) = tabletarget.set_key(k, payload); - Ok((LocalOperationForRollback::Set { old }, res)) - } - // In this case we are trying to modify a key in something which is not - // an object or a table, so the path does not exist - (PathElement::Key(_), _) => { - Err(InvalidChangeRequest::NoSuchPathError { - path: change.path.clone(), - }) - } - (PathElement::Index(i), ResolvedPathMut::List(ref mut list_target)) => { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value, - }; - let (old, res) = list_target.set(*i, payload)?; - Ok((LocalOperationForRollback::SetList { old }, res)) - } - (PathElement::Index(i), ResolvedPathMut::Text(ref mut text)) => { - match value { - Value::Primitive(Primitive::Str(s)) => { - if s.graphemes(true).count() == 1 { - let payload = SetOrInsertPayload { - start_op: self.max_op + 1, - actor: &self.actor_id.clone(), - value: s, - }; - let (old, res) = text.set(*i, payload)?; - Ok((LocalOperationForRollback::SetText { old }, res)) - } else { - Err(InvalidChangeRequest::InsertNonTextInTextObject { - path: change.path.clone(), - object: Value::Primitive(Primitive::Str(s)), - }) - } - } - _ => Err(InvalidChangeRequest::InsertNonTextInTextObject { - path: change.path.clone(), - object: value.clone(), - }), - } - } - (PathElement::Index(_), _) => { - Err(InvalidChangeRequest::InsertWithNonSequencePath { - path: change.path.clone(), - }) - } - }?; - - self.copies_for_rollback.push((change.path, rollback_op)); - self.apply_state_change(res); - Ok(()) - } else { - Err(InvalidChangeRequest::NoSuchPathError { path: change.path }) - } - } else { - self.wrap_root_assignment(value) - } - } - LocalOperation::Delete => { - if let Some(name) = change.path.name() { - if let Some(pr) = self.state.resolve_path_mut(&change.path.parent()) { - let (rollback_op, state_change) = match pr { - ResolvedPathMut::Counter(_) => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - ResolvedPathMut::List(mut l) => match name { - PathElement::Index(i) => { - let (old, res) = l.remove(*i)?; - (LocalOperationForRollback::Delete { old }, res) - } - _ => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - }, - ResolvedPathMut::Text(mut t) => match name { - PathElement::Index(i) => { - let (old, res) = t.remove(*i)?; - (LocalOperationForRollback::DeleteText { old }, res) - } - _ => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - }, - ResolvedPathMut::Primitive(_) => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - ResolvedPathMut::Map(mut m) => match name { - PathElement::Key(k) => { - let (old, res) = m.delete_key(k); - (LocalOperationForRollback::Delete { old }, res) - } - _ => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - }, - ResolvedPathMut::Table(mut t) => match name { - PathElement::Key(k) => { - let (old, res) = t.delete_key(k); - (LocalOperationForRollback::Delete { old }, res) - } - _ => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - }, - ResolvedPathMut::Character(_) => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - ResolvedPathMut::Root(mut r) => match name { - PathElement::Key(k) => { - let (old, res) = r.delete_key(k); - (LocalOperationForRollback::Delete { old }, res) - } - _ => { - return Err(InvalidChangeRequest::NoSuchPathError { - path: change.path, - }) - } - }, - }; - self.copies_for_rollback.push((change.path, rollback_op)); - self.apply_state_change(state_change); - Ok(()) - } else { - Err(InvalidChangeRequest::NoSuchPathError { path: change.path }) - } - } else { - Err(InvalidChangeRequest::CannotDeleteRootObject) - } - } - LocalOperation::Increment(by) => { - if change.path.name().is_some() { - if let Some(pr) = self.state.resolve_path_mut(&change.path) { - match pr { - ResolvedPathMut::Counter(mut counter_target) => { - let res = counter_target.increment(by); - self.copies_for_rollback.push(( - change.path, - LocalOperationForRollback::Increment { by }, - )); - self.apply_state_change(res); - Ok(()) - } - _ => Err(InvalidChangeRequest::IncrementForNonCounterObject { - path: change.path.clone(), - }), - } - } else { - Err(InvalidChangeRequest::NoSuchPathError { path: change.path }) - } - } else { - Err(InvalidChangeRequest::IncrementForNonCounterObject { - path: change.path.clone(), - }) - } - } - LocalOperation::Insert(value) => { - match self.insert_helper(&change.path, std::iter::once(value)) { - Ok(()) => { - self.copies_for_rollback - .push((change.path, LocalOperationForRollback::Insert)); - Ok(()) - } - Err(e) => Err(e), - } - } - LocalOperation::InsertMany(values) => { - let count = values.len(); - match self.insert_helper(&change.path, values.into_iter()) { - Ok(()) => { - self.copies_for_rollback - .push((change.path, LocalOperationForRollback::InsertMany { count })); - Ok(()) - } - Err(e) => Err(e), - } - } - } - } -} diff --git a/automerge-frontend/src/path.rs b/automerge-frontend/src/path.rs deleted file mode 100644 index c006921e..00000000 --- a/automerge-frontend/src/path.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::fmt; - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub(crate) enum PathElement { - Key(String), - Index(u32), -} - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Path(Vec); - -impl Path { - pub fn root() -> Path { - Path(Vec::new()) - } - - pub fn index(mut self, index: u32) -> Self { - self.0.push(PathElement::Index(index)); - self - } - - pub fn key>(mut self, key: S) -> Path { - self.0.push(PathElement::Key(key.into())); - self - } - - pub fn parent(&self) -> Self { - if self.0.is_empty() { - Path(Vec::new()) - } else { - let mut new_path = self.0.clone(); - new_path.pop(); - Path(new_path) - } - } - - /// Get the final component of the path, if any - pub(crate) fn name(&self) -> Option<&PathElement> { - self.0.last() - } - - pub(crate) fn elements(self) -> Vec { - self.0 - } - - pub(crate) fn is_root(&self) -> bool { - self.0.is_empty() - } -} - -impl fmt::Display for PathElement { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - PathElement::Key(k) => write!(f, "{}", k), - PathElement::Index(i) => write!(f, "{}", i), - } - } -} diff --git a/automerge-frontend/src/state_tree/diffable_sequence.rs b/automerge-frontend/src/state_tree/diffable_sequence.rs deleted file mode 100644 index 4812571b..00000000 --- a/automerge-frontend/src/state_tree/diffable_sequence.rs +++ /dev/null @@ -1,558 +0,0 @@ -use std::collections::HashSet; - -use amp::OpId; -use automerge_protocol as amp; - -use super::{MultiGrapheme, MultiValue}; -use crate::error::InvalidPatch; - -pub(super) trait DiffableValue: Sized + Default { - fn check_construct( - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch>; - - fn construct(opid: amp::OpId, diff: amp::Diff) -> Self; - - fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch>; - - fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff); - - fn apply_diff_iter(&mut self, diff: &mut I) - where - I: Iterator; - - fn default_opid(&self) -> amp::OpId; - - fn only_for_opid(&self, opid: amp::OpId) -> Option; - - fn add_values_from(&mut self, other: Self); -} - -impl DiffableValue for MultiGrapheme { - fn check_construct( - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch> { - MultiGrapheme::check_new_from_diff(opid, diff, parent_object_id) - } - - fn construct(opid: amp::OpId, diff: amp::Diff) -> Self { - MultiGrapheme::new_from_diff(opid, diff) - } - - fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch> { - MultiGrapheme::check_diff(self, opid, diff, parent_object_id) - } - - fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff) { - MultiGrapheme::apply_diff(self, opid, diff) - } - - fn apply_diff_iter(&mut self, diff: &mut I) - where - I: Iterator, - { - self.apply_diff_iter(diff) - //MultiGrapheme::apply_diff_iter(self, diff) - } - - fn default_opid(&self) -> amp::OpId { - self.default_opid().clone() - } - - fn only_for_opid(&self, opid: amp::OpId) -> Option { - self.only_for_opid(opid) - } - - fn add_values_from(&mut self, other: MultiGrapheme) { - self.add_values_from(other) - } -} - -impl DiffableValue for MultiValue { - fn check_construct( - opid: &::OpId, - diff: &::Diff, - _parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch> { - MultiValue::check_new_from_diff(opid, diff) - } - - fn construct(opid: amp::OpId, diff: amp::Diff) -> Self { - MultiValue::new_from_diff(opid, diff) - } - - fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - _parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch> { - self.check_diff(opid, diff) - } - - fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff) { - self.apply_diff(opid, diff) - } - - fn apply_diff_iter(&mut self, diff: &mut I) - where - I: Iterator, - { - self.apply_diff_iter(diff) - } - - fn default_opid(&self) -> amp::OpId { - self.default_opid() - } - - fn only_for_opid(&self, opid: amp::OpId) -> Option { - self.only_for_opid(opid) - } - - fn add_values_from(&mut self, other: MultiValue) { - self.add_values_from(other) - } -} - -#[derive(Clone, Debug, PartialEq)] -struct SequenceElement -where - T: DiffableValue, - T: Clone, - T: PartialEq, -{ - opid: OpId, - value: SequenceValue, -} - -impl SequenceElement -where - T: Clone, - T: DiffableValue, - T: PartialEq, -{ - fn original(value: T) -> Self { - Self { - opid: value.default_opid(), - value: SequenceValue::Original(value), - } - } - - fn new(value: T) -> Self { - Self { - opid: value.default_opid(), - value: SequenceValue::New(value), - } - } -} - -#[derive(Clone, Debug, PartialEq)] -pub(super) struct DiffableSequence -where - T: DiffableValue, - T: Clone, - T: PartialEq, -{ - // stores the opid that created the element and the diffable value - underlying: Box>>, -} - -impl DiffableSequence -where - T: Clone, - T: DiffableValue, - T: PartialEq, -{ - pub fn new() -> DiffableSequence { - DiffableSequence { - underlying: Box::new(im_rc::Vector::new()), - } - } - - pub(super) fn new_from(i: I) -> DiffableSequence - where - I: IntoIterator, - { - DiffableSequence { - underlying: Box::new(i.into_iter().map(SequenceElement::original).collect()), - } - } - - pub fn check_diff( - &self, - object_id: &::ObjectId, - edits: &[amp::DiffEdit], - ) -> Result<(), InvalidPatch> { - let mut size = self.underlying.len(); - for edit in edits { - match edit { - amp::DiffEdit::Remove { index, count } => { - let index = *index as usize; - let count = *count as usize; - if index >= size { - return Err(InvalidPatch::InvalidIndex { - object_id: object_id.clone(), - index, - }); - } - if index + count > size { - return Err(InvalidPatch::InvalidIndex { - object_id: object_id.clone(), - index: size, - }); - } - size -= count; - } - amp::DiffEdit::SingleElementInsert { - index, - elem_id: _, - op_id, - value, - } => { - T::check_construct(op_id, value, object_id)?; - if *index as usize > size { - return Err(InvalidPatch::InvalidIndex { - object_id: object_id.clone(), - index: *index as usize, - }); - } - size += 1; - } - amp::DiffEdit::MultiElementInsert(amp::MultiElementInsert { - elem_id, - values, - index, - }) => { - let index = *index as usize; - if index > size { - return Err(InvalidPatch::InvalidIndex { - index, - object_id: object_id.clone(), - }); - } - for (i, value) in values.iter().enumerate() { - let opid = elem_id.as_opid().unwrap().increment_by(i as u64); - T::check_construct(&opid, &::Diff::Value(value.clone()), object_id)?; - } - size += values.len(); - } - amp::DiffEdit::Update { - index, - value: _, - op_id: _, - } => { - // TODO: handle updates after things like inserts shifting them - if *index as usize >= size { - return Err(InvalidPatch::InvalidIndex { - index: *index as usize, - object_id: object_id.clone(), - }); - } - - // if let Some((_id, elem)) = self.underlying.get(*index as usize) { - // elem.check_diff(op_id, value)?; - // } else { - // } - } - }; - } - - Ok(()) - } - - pub fn apply_diff(&mut self, _object_id: &::ObjectId, edits: Vec) { - let mut changed_indices = HashSet::new(); - for edit in edits { - match edit { - amp::DiffEdit::Remove { index, count } => { - let index = index as usize; - let count = count as usize; - self.underlying.slice(index..(index + count)); - - for i in changed_indices.clone().iter() { - // if the index is to the right of that being removed we need to shift it - if *i >= index as u64 { - // we don't need to keep the old value - changed_indices.remove(i); - // but if the value is not in the removed range then we need to add the - // updated value in again - if *i >= (index + count) as u64 { - changed_indices.insert(*i - count as u64); - } - } - } - } - amp::DiffEdit::SingleElementInsert { - index, - elem_id: _, - op_id, - value, - } => { - let node = T::construct(op_id, value); - if (index as usize) == self.underlying.len() { - self.underlying.push_back(SequenceElement::new(node)); - } else { - self.underlying - .insert(index as usize, SequenceElement::new(node)); - }; - changed_indices.insert(index); - } - amp::DiffEdit::MultiElementInsert(amp::MultiElementInsert { - elem_id, - values, - index, - }) => { - let index = index as usize; - // building an intermediate vector can be better than just inserting - // TODO: only do this if there are a certain (to be worked out) number of - // values - // TODO: if all inserts are at the end then use push_back - let mut intermediate = im_rc::Vector::new(); - for (i, value) in values.iter().enumerate() { - let opid = elem_id.as_opid().unwrap().increment_by(i as u64); - let mv = T::construct(opid, amp::Diff::Value(value.clone())); - intermediate.push_back(SequenceElement::new(mv)); - } - let right = self.underlying.split_off(index); - self.underlying.append(intermediate); - self.underlying.append(right); - for i in index..(index + values.len()) { - changed_indices.insert(i as u64); - } - } - amp::DiffEdit::Update { - index, - value, - op_id, - } => { - if let Some(v) = self.underlying.get_mut(index as usize) { - v.value.apply_diff(op_id, value); - } - changed_indices.insert(index); - } - }; - } - - for i in changed_indices { - if let Some(u) = self.underlying.get_mut(i as usize) { - u.value.finish() - } - } - - debug_assert!( - self.underlying - .iter() - .all(|u| matches!(u.value, SequenceValue::Original(_))), - "diffable sequence apply_diff_iter didn't call finish on all values" - ); - } - - pub(super) fn remove(&mut self, index: usize) -> T { - match self.underlying.remove(index).value { - SequenceValue::Original(t) => t, - _ => unreachable!(), - } - } - - pub(super) fn len(&self) -> usize { - self.underlying.len() - } - - pub(super) fn set(&mut self, index: usize, value: T) -> T { - let elem_id = self - .underlying - .get(index) - .map(|existing| existing.opid.clone()) - .expect("Failed to get existing index in set"); - self.underlying - .set( - index, - SequenceElement { - opid: elem_id, - value: SequenceValue::Original(value), - }, - ) - .value - .get() - .clone() - } - - pub(super) fn get(&self, index: usize) -> Option<(&OpId, &T)> { - self.underlying.get(index).map(|e| (&e.opid, e.value.get())) - } - - pub(super) fn get_mut(&mut self, index: usize) -> Option<(&mut OpId, &mut T)> { - self.underlying - .get_mut(index) - .map(|e| (&mut e.opid, e.value.get_mut())) - } - - pub(super) fn insert(&mut self, index: usize, value: T) { - self.underlying - .insert(index, SequenceElement::original(value)) - } - - pub(super) fn mutate(&mut self, index: usize, f: F) - where - F: FnOnce(&T) -> T, - { - if let Some(entry) = self.underlying.get_mut(index) { - *entry = SequenceElement { - opid: entry.opid.clone(), - value: SequenceValue::Original(f(entry.value.get())), - }; - } - } - - pub(super) fn iter(&self) -> impl std::iter::Iterator { - // Making this unwrap safe is the entire point of this data structure - self.underlying.iter().map(|i| i.value.get()) - } -} - -#[derive(Clone, Debug, PartialEq)] -enum SequenceValue -where - T: DiffableValue, -{ - Original(T), - New(T), - Updated { original: T, updates: Vec }, -} - -impl SequenceValue -where - T: DiffableValue, - T: Clone, -{ - fn finish(&mut self) { - match self { - SequenceValue::Original(_) => { // do nothing, this is the finished state - } - SequenceValue::New(v) => *self = SequenceValue::Original(std::mem::take(v)), - SequenceValue::Updated { updates, .. } => { - let initial_update = updates.remove(0); - let t = - std::mem::take(updates) - .into_iter() - .fold(initial_update, |mut acc, elem| { - acc.add_values_from(elem); - acc - }); - *self = SequenceValue::Original(t) - } - } - } - - fn get(&self) -> &T { - match self { - SequenceValue::Original(v) => v, - _ => unreachable!(), - } - } - - fn get_mut(&mut self) -> &mut T { - match self { - SequenceValue::Original(v) => v, - _ => unreachable!(), - } - } - - fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), InvalidPatch> { - match self { - SequenceValue::Original(v) | SequenceValue::New(v) => { - if let Some(existing) = v.only_for_opid(opid.clone()) { - existing.check_diff(opid, diff, parent_object_id)?; - } else { - T::check_construct(opid, diff, parent_object_id)? - }; - Ok(()) - } - SequenceValue::Updated { original, updates } => { - if let Some(update) = updates - .get(1..) - .and_then(|i| i.iter().find_map(|v| v.only_for_opid(opid.clone()))) - { - update.check_diff(opid, diff, parent_object_id)?; - } else if let Some(initial) = - updates.get(0).and_then(|u| u.only_for_opid(opid.clone())) - { - initial.check_diff(opid, diff, parent_object_id)?; - } else if let Some(original) = original.only_for_opid(opid.clone()) { - original.check_diff(opid, diff, parent_object_id)?; - } else { - T::check_construct(opid, diff, parent_object_id)? - }; - Ok(()) - } - } - } - - fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff) { - match self { - SequenceValue::Original(v) => { - let updated = if let Some(mut existing) = v.only_for_opid(opid.clone()) { - existing.apply_diff(opid, diff); - existing - } else { - T::construct(opid, diff) - }; - *self = SequenceValue::Updated { - original: std::mem::take(v), - updates: vec![updated], - }; - } - SequenceValue::New(v) => { - let updated = if let Some(mut existing) = v.only_for_opid(opid.clone()) { - existing.apply_diff(opid, diff); - existing - } else { - T::construct(opid, diff) - }; - *self = SequenceValue::Updated { - original: v.clone(), - updates: vec![std::mem::take(v), updated], - }; - } - SequenceValue::Updated { original, updates } => { - let updated = if let Some(mut update) = updates - .get(1..) - .and_then(|i| i.iter().find_map(|v| v.only_for_opid(opid.clone()))) - { - update.apply_diff(opid, diff); - update - } else if let Some(mut initial) = - updates.get(0).and_then(|u| u.only_for_opid(opid.clone())) - { - initial.apply_diff(opid, diff); - initial - } else if let Some(mut original) = original.only_for_opid(opid.clone()) { - original.apply_diff(opid, diff); - original - } else { - T::construct(opid, diff) - }; - updates.push(updated); - } - } - } -} diff --git a/automerge-frontend/src/state_tree/mod.rs b/automerge-frontend/src/state_tree/mod.rs deleted file mode 100644 index 830ba952..00000000 --- a/automerge-frontend/src/state_tree/mod.rs +++ /dev/null @@ -1,970 +0,0 @@ -use std::{collections::HashMap, convert::TryInto}; - -use amp::ElementId; -use automerge_protocol as amp; -use automerge_protocol::RootDiff; -use diffable_sequence::DiffableSequence; -use multivalue::NewValueRequest; - -use crate::{error, Cursor, Path, PathElement, Primitive, Value}; - -mod diffable_sequence; -mod multivalue; -mod resolved_path; - -pub use multivalue::{MultiGrapheme, MultiValue}; -pub(crate) use resolved_path::SetOrInsertPayload; -pub use resolved_path::{ResolvedPath, ResolvedPathMut}; - -#[derive(Debug, PartialEq, Clone, Default)] -pub struct CheckedRootDiff(RootDiff); - -/// Represents the result of running a local operation (i.e one that happens within the frontend -/// before any interaction with a backend). -pub(crate) struct LocalOperationResult { - /// Any operations which need to be sent to the backend to reconcile this change - pub new_ops: Vec, -} - -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct StateTree { - root_props: HashMap, - cursors: Cursors, -} - -impl Default for StateTree { - fn default() -> Self { - Self { - root_props: HashMap::new(), - cursors: Cursors::new(), - } - } -} - -impl StateTree { - pub fn new() -> StateTree { - StateTree { - root_props: HashMap::new(), - cursors: Cursors::new(), - } - } - - pub fn check_diff(&self, diff: amp::RootDiff) -> Result { - for (prop, prop_diff) in &diff.props { - let mut diff_iter = prop_diff.iter(); - match diff_iter.next() { - None => { - // all ok here - } - Some((opid, diff)) => { - match self.root_props.get(prop) { - Some(n) => n.check_diff(opid, diff)?, - None => { - MultiValue::check_new_from_diff(opid, diff)?; - } - }; - // TODO: somehow get this working - // self.root_props - // .get(prop) - // .unwrap() - // .check_diff_iter(&mut diff_iter)?; - } - } - } - Ok(CheckedRootDiff(diff)) - } - - pub fn apply_diff(&mut self, diff: CheckedRootDiff) { - for (prop, prop_diff) in diff.0.props { - let mut diff_iter = prop_diff.into_iter(); - match diff_iter.next() { - None => { - self.root_props.remove(&prop); - } - Some((opid, diff)) => { - match self.root_props.get_mut(&prop) { - Some(n) => n.apply_diff(opid, diff), - None => { - let value = MultiValue::new_from_diff(opid.clone(), diff); - self.root_props.insert(prop.clone(), value); - } - }; - self.root_props - .get_mut(&prop) - .unwrap() - .apply_diff_iter(&mut diff_iter); - } - } - } - } - - fn update_cursors(&mut self) { - // TODO: get cursors working again - // for cursor in self.cursors.iter_mut() { - // if let Some(referred_object) = self.objects.get(&cursor.referred_object_id) { - // match referred_object { - // StateTreeComposite::List(l) => { - // if let Some(index) = l.index_of(&cursor.referred_opid) { - // cursor.index = index; - // } - // } - // StateTreeComposite::Text(t) => { - // if let Some(index) = t.index_of(&cursor.referred_opid) { - // cursor.index = index; - // } - // } - // _ => {} - // } - // } - // if let Some(referring_object) = self.objects.get_mut(&cursor.referring_object_id) { - // referring_object.mutably_update_cursor(cursor); - // } - // } - } - - fn remove(&mut self, k: &str) -> Option { - self.root_props.remove(k) - } - - fn get(&self, k: &str) -> Option<&MultiValue> { - self.root_props.get(k) - } - - pub(crate) fn resolve_path<'a>( - &'a self, - path: &Path, - ) -> Option> { - if path.is_root() { - return Some(ResolvedPath::new_root(self)); - } - let mut stack = path.clone().elements(); - stack.reverse(); - - if let Some(PathElement::Key(k)) = stack.pop() { - let o = self.root_props.get(&k)?; - - o.resolve_path(stack, amp::ObjectId::Root, amp::Key::Map(k)) - } else { - None - } - } - - pub(crate) fn resolve_path_mut<'a>( - &'a mut self, - path: &Path, - ) -> Option> { - if path.is_root() { - return Some(ResolvedPathMut::new_root(self)); - } - let mut stack = path.clone().elements(); - stack.reverse(); - - if let Some(PathElement::Key(k)) = stack.pop() { - let o = self.root_props.get_mut(&k)?; - - o.resolve_path_mut(stack, amp::ObjectId::Root, amp::Key::Map(k)) - } else { - None - } - } - - pub fn value(&self) -> Value { - let mut m = HashMap::new(); - for (k, v) in &self.root_props { - m.insert(k.clone(), v.default_value()); - } - Value::Map(m) - } -} - -/// A node in the state tree is either a leaf node containing a scalarvalue, -/// or an internal composite type (e.g a Map or a List) -#[derive(Debug, Clone, PartialEq)] -enum StateTreeValue { - Leaf(Primitive), - Composite(StateTreeComposite), -} - -impl Default for StateTreeValue { - fn default() -> Self { - Self::Leaf(Primitive::Null) - } -} - -#[derive(Debug, Clone, PartialEq)] -enum StateTreeComposite { - Map(StateTreeMap), - Table(StateTreeTable), - Text(StateTreeText), - List(StateTreeList), -} - -impl StateTreeComposite { - fn check_diff(&self, diff: &::Diff) -> Result<(), error::InvalidPatch> { - if diff.object_id() != Some(self.object_id()) { - return Err(error::InvalidPatch::MismatchingObjectIDs { - patch_expected_id: diff.object_id(), - actual_id: self.object_id(), - }); - }; - match (diff, self) { - ( - amp::Diff::Map(amp::MapDiff { - props: prop_diffs, - object_id: _, - }), - StateTreeComposite::Map(map), - ) => map.check_diff(prop_diffs), - ( - amp::Diff::Table(amp::TableDiff { - props: prop_diffs, - object_id: _, - }), - StateTreeComposite::Table(table), - ) => table.check_diff(prop_diffs), - ( - amp::Diff::List(amp::ListDiff { - edits, - object_id: _, - }), - StateTreeComposite::List(list), - ) => list.check_diff(edits), - ( - amp::Diff::Text(amp::TextDiff { - edits, - object_id: _, - }), - StateTreeComposite::Text(text), - ) => text.check_diff(edits), - // TODO throw an error - (amp::Diff::Value(..), _) => unreachable!(), - // TODO throw an error - (amp::Diff::Cursor(..), _) => unreachable!(), - ( - amp::Diff::Map(_) | amp::Diff::Table(_) | amp::Diff::List(_) | amp::Diff::Text(_), - _, - ) => Err(error::InvalidPatch::MismatchingObjectType { - object_id: self.object_id(), - patch_expected_type: diff.object_type(), - actual_type: Some(self.obj_type()), - }), - } - } - - fn apply_diff(&mut self, diff: amp::Diff) { - match (diff, self) { - ( - amp::Diff::Map(amp::MapDiff { - props: prop_diffs, - object_id: _, - }), - StateTreeComposite::Map(map), - ) => map.apply_diff(prop_diffs), - ( - amp::Diff::Table(amp::TableDiff { - props: prop_diffs, - object_id: _, - }), - StateTreeComposite::Table(table), - ) => table.apply_diff(prop_diffs), - ( - amp::Diff::List(amp::ListDiff { - edits, - object_id: _, - }), - StateTreeComposite::List(list), - ) => list.apply_diff(edits), - ( - amp::Diff::Text(amp::TextDiff { - edits, - object_id: _, - }), - StateTreeComposite::Text(text), - ) => text.apply_diff(edits), - // TODO throw an error - (amp::Diff::Value(..), _) => unreachable!(), - // TODO throw an error - (amp::Diff::Cursor(..), _) => unreachable!(), - ( - amp::Diff::Map(_) | amp::Diff::Table(_) | amp::Diff::List(_) | amp::Diff::Text(_), - _, - ) => unreachable!(), - } - } - - fn obj_type(&self) -> amp::ObjType { - match self { - Self::Map(..) => amp::ObjType::Map, - Self::Table(..) => amp::ObjType::Table, - Self::Text(..) => amp::ObjType::Text, - Self::List(..) => amp::ObjType::List, - } - } - - fn object_id(&self) -> amp::ObjectId { - match self { - Self::Map(StateTreeMap { object_id, .. }) => object_id.clone(), - Self::Table(StateTreeTable { object_id, .. }) => object_id.clone(), - Self::Text(StateTreeText { object_id, .. }) => object_id.clone(), - Self::List(StateTreeList { object_id, .. }) => object_id.clone(), - } - } - - fn realise_value(&self) -> Value { - match self { - Self::Map(StateTreeMap { props, .. }) => Value::Map( - props - .iter() - .map(|(k, v)| (k.clone(), v.default_value())) - .collect(), - ), - Self::Table(StateTreeTable { props, .. }) => Value::Table( - props - .iter() - .map(|(k, v)| (k.clone(), v.default_value())) - .collect(), - ), - Self::List(StateTreeList { - elements: elems, .. - }) => Value::Sequence(elems.iter().map(|e| e.default_value()).collect()), - Self::Text(StateTreeText { graphemes, .. }) => { - Value::Text(graphemes.iter().map(|c| c.default_grapheme()).collect()) - } - } - } - - fn mutably_update_cursor(&mut self, cursor: &CursorState) { - let cursor_value = Primitive::Cursor(Cursor::new( - cursor.index as u32, - cursor.referred_object_id.clone(), - cursor.referred_opid.clone(), - )); - match (self, &cursor.referring_key) { - (StateTreeComposite::Map(m), amp::Key::Map(k)) => { - m.mutably_update_cursor(&k, cursor_value); - } - (StateTreeComposite::Table(t), amp::Key::Map(k)) => { - t.mutably_update_cursor(&k, cursor_value); - } - (StateTreeComposite::List(l), amp::Key::Seq(elem_id)) => { - l.mutably_update_cursor(&elem_id, cursor_value); - } - _ => {} - } - } - - fn resolve_path(&self, path: Vec) -> Option { - match self { - Self::Map(map) => map.resolve_path(path), - Self::Table(table) => table.resolve_path(path), - Self::List(list) => list.resolve_path(path), - Self::Text(text) => text.resolve_path(path), - } - } - - fn resolve_path_mut(&mut self, path: Vec) -> Option { - match self { - Self::Map(map) => map.resolve_path_mut(path), - Self::Table(table) => table.resolve_path_mut(path), - Self::List(list) => list.resolve_path_mut(path), - Self::Text(text) => text.resolve_path_mut(path), - } - } -} - -impl StateTreeValue { - fn check_new_from_diff(diff: &::Diff) -> Result<(), error::InvalidPatch> { - match diff { - amp::Diff::Value(v) => match v { - amp::ScalarValue::Bytes(_) - | amp::ScalarValue::Str(_) - | amp::ScalarValue::Int(_) - | amp::ScalarValue::Uint(_) - | amp::ScalarValue::F64(_) - | amp::ScalarValue::Counter(_) - | amp::ScalarValue::Timestamp(_) - | amp::ScalarValue::Boolean(_) - | amp::ScalarValue::Null => Ok(()), - amp::ScalarValue::Cursor(..) => Err(error::InvalidPatch::ValueDiffContainedCursor), - }, - amp::Diff::Map(_) - | amp::Diff::Table(_) - | amp::Diff::List(_) - | amp::Diff::Text(_) - | amp::Diff::Cursor(_) => Ok(()), - } - } - - fn new_from_diff(diff: amp::Diff) -> StateTreeValue { - match diff { - amp::Diff::Value(v) => { - let value = match v { - amp::ScalarValue::Bytes(b) => Primitive::Bytes(b), - amp::ScalarValue::Str(s) => Primitive::Str(s), - amp::ScalarValue::Int(i) => Primitive::Int(i), - amp::ScalarValue::Uint(u) => Primitive::Uint(u), - amp::ScalarValue::F64(f) => Primitive::F64(f), - amp::ScalarValue::Counter(i) => Primitive::Counter(i), - amp::ScalarValue::Timestamp(i) => Primitive::Timestamp(i), - amp::ScalarValue::Boolean(b) => Primitive::Boolean(b), - amp::ScalarValue::Null => Primitive::Null, - amp::ScalarValue::Cursor(..) => { - unreachable!("value diff contained a cursor") - } - }; - StateTreeValue::Leaf(value) - } - amp::Diff::Map(amp::MapDiff { object_id, props }) => { - let mut map = StateTreeMap { - object_id, - props: HashMap::new(), - }; - map.apply_diff(props); - StateTreeValue::Composite(StateTreeComposite::Map(map)) - } - amp::Diff::Table(amp::TableDiff { object_id, props }) => { - let mut table = StateTreeTable { - object_id, - props: HashMap::new(), - }; - table.apply_diff(props); - StateTreeValue::Composite(StateTreeComposite::Table(table)) - } - amp::Diff::List(amp::ListDiff { object_id, edits }) => { - let mut list = StateTreeList { - object_id, - elements: DiffableSequence::new(), - }; - list.apply_diff(edits); - StateTreeValue::Composite(StateTreeComposite::List(list)) - } - amp::Diff::Text(amp::TextDiff { object_id, edits }) => { - let mut text = StateTreeText { - object_id, - graphemes: DiffableSequence::new(), - }; - text.apply_diff(edits); - StateTreeValue::Composite(StateTreeComposite::Text(text)) - } - - amp::Diff::Cursor(ref c) => StateTreeValue::Leaf(c.into()), - } - } - - fn realise_value(&self) -> Value { - match self { - StateTreeValue::Leaf(p) => p.clone().into(), - StateTreeValue::Composite(composite) => composite.realise_value(), - } - } -} - -#[derive(Debug, Clone, PartialEq)] -struct StateTreeMap { - object_id: amp::ObjectId, - props: HashMap, -} - -impl StateTreeMap { - fn check_diff( - &self, - prop_diffs: &HashMap>, - ) -> Result<(), error::InvalidPatch> { - for (prop, prop_diff) in prop_diffs { - let mut diff_iter = prop_diff.iter(); - match diff_iter.next() { - None => {} - Some((opid, diff)) => { - match self.props.get(prop) { - Some(n) => n.check_diff(opid, diff)?, - None => { - MultiValue::check_new_from_diff(opid, diff)?; - } - }; - // TODO: get this working - // self.props - // .get(prop) - // .unwrap() - // .check_diff_iter(&mut diff_iter)?; - } - } - } - Ok(()) - } - - fn apply_diff(&mut self, prop_diffs: HashMap>) { - for (prop, prop_diff) in prop_diffs { - let mut diff_iter = prop_diff.into_iter(); - match diff_iter.next() { - None => { - self.props.remove(&prop); - } - Some((opid, diff)) => { - match self.props.get_mut(&prop) { - Some(n) => n.apply_diff(opid, diff), - None => { - let value = MultiValue::new_from_diff(opid.clone(), diff); - self.props.insert(prop.clone(), value); - } - }; - self.props - .get_mut(&prop) - .unwrap() - .apply_diff_iter(&mut diff_iter); - } - } - } - } - - pub fn pred_for_key(&self, key: &str) -> Vec { - self.props - .get(key) - .map(|v| vec![v.default_opid()]) - .unwrap_or_else(Vec::new) - } - - pub fn mutably_update_cursor(&mut self, key: &str, cursor: Primitive) { - let new_mv = self - .props - .get(key) - .map(|mv| mv.update_default(StateTreeValue::Leaf(cursor))); - if let Some(new_mv) = new_mv { - self.props.insert(key.to_string(), new_mv); - } - } - - pub(crate) fn resolve_path(&self, mut path: Vec) -> Option { - if let Some(PathElement::Key(key)) = path.pop() { - self.props - .get(&key)? - .resolve_path(path, self.object_id.clone(), amp::Key::Map(key)) - } else { - None - } - } - - pub(crate) fn resolve_path_mut( - &mut self, - mut path: Vec, - ) -> Option { - if let Some(PathElement::Key(key)) = path.pop() { - self.props.get_mut(&key)?.resolve_path_mut( - path, - self.object_id.clone(), - amp::Key::Map(key), - ) - } else { - None - } - } -} - -#[derive(Debug, Clone, PartialEq)] -struct StateTreeTable { - object_id: amp::ObjectId, - props: HashMap, -} - -impl StateTreeTable { - fn check_diff( - &self, - prop_diffs: &HashMap>, - ) -> Result<(), error::InvalidPatch> { - for (prop, prop_diff) in prop_diffs { - let mut diff_iter = prop_diff.iter(); - match diff_iter.next() { - None => {} - Some((opid, diff)) => { - match self.props.get(prop) { - Some(n) => n.check_diff(opid, diff)?, - None => { - MultiValue::check_new_from_diff(opid, diff)?; - } - }; - // TODO: get this working - // self.props - // .get(prop) - // .unwrap() - // .check_diff_iter(&mut diff_iter)?; - } - } - } - Ok(()) - } - - fn apply_diff(&mut self, prop_diffs: HashMap>) { - for (prop, prop_diff) in prop_diffs { - let mut diff_iter = prop_diff.into_iter(); - match diff_iter.next() { - None => { - self.props.remove(&prop); - } - Some((opid, diff)) => { - match self.props.get_mut(&prop) { - Some(n) => n.apply_diff(opid, diff), - None => { - let value = MultiValue::new_from_diff(opid.clone(), diff); - self.props.insert(prop.clone(), value); - } - }; - self.props - .get_mut(&prop) - .unwrap() - .apply_diff_iter(&mut diff_iter); - } - } - } - } - - pub fn pred_for_key(&self, key: &str) -> Vec { - self.props - .get(key) - .map(|v| vec![v.default_opid()]) - .unwrap_or_else(Vec::new) - } - - pub fn mutably_update_cursor(&mut self, key: &str, cursor: Primitive) { - let new_mv = self - .props - .get(key) - .map(|mv| mv.update_default(StateTreeValue::Leaf(cursor))); - if let Some(new_mv) = new_mv { - self.props.insert(key.to_string(), new_mv); - } - } - - pub(crate) fn resolve_path(&self, mut path: Vec) -> Option { - if let Some(PathElement::Key(key)) = path.pop() { - self.props - .get(&key)? - .resolve_path(path, self.object_id.clone(), amp::Key::Map(key)) - } else { - None - } - } - - pub(crate) fn resolve_path_mut( - &mut self, - mut path: Vec, - ) -> Option { - if let Some(PathElement::Key(key)) = path.pop() { - self.props.get_mut(&key)?.resolve_path_mut( - path, - self.object_id.clone(), - amp::Key::Map(key), - ) - } else { - None - } - } -} - -#[derive(Debug, Clone, PartialEq)] -struct StateTreeText { - object_id: amp::ObjectId, - graphemes: DiffableSequence, -} - -impl StateTreeText { - fn remove(&mut self, index: usize) -> Result { - if index >= self.graphemes.len() { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.graphemes.len(), - }) - } else { - let old = self.graphemes.remove(index); - Ok(old) - } - } - - fn set( - &mut self, - index: usize, - value: MultiGrapheme, - ) -> Result { - if self.graphemes.len() > index { - let old = self.graphemes.set(index, value); - Ok(old) - } else { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.graphemes.len(), - }) - } - } - - pub(crate) fn elem_at( - &self, - index: usize, - ) -> Result<(&::OpId, String), error::MissingIndexError> { - self.graphemes - .get(index) - .map(|mc| (mc.0, mc.1.default_grapheme())) - .ok_or_else(|| error::MissingIndexError { - missing_index: index, - size_of_collection: self.graphemes.len(), - }) - } - - fn insert( - &mut self, - index: usize, - value: MultiGrapheme, - ) -> Result<(), error::MissingIndexError> { - self.insert_many(index, std::iter::once(value)) - } - - fn insert_many(&mut self, index: usize, values: I) -> Result<(), error::MissingIndexError> - where - I: IntoIterator, - { - if index > self.graphemes.len() { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.graphemes.len(), - }) - } else { - for (i, grapheme) in values.into_iter().enumerate() { - self.graphemes.insert(index + i, grapheme); - } - Ok(()) - } - } - - fn check_diff(&self, edits: &[amp::DiffEdit]) -> Result<(), error::InvalidPatch> { - self.graphemes.check_diff(&self.object_id, edits)?; - Ok(()) - } - - fn apply_diff(&mut self, edits: Vec) { - self.graphemes.apply_diff(&self.object_id, edits) - } - - pub fn pred_for_index(&self, index: u32) -> Vec { - self.graphemes - .get(index.try_into().unwrap()) - .map(|v| vec![v.1.default_opid().clone()]) - .unwrap_or_else(Vec::new) - } - - pub(crate) fn index_of(&self, opid: &::OpId) -> Option { - self.graphemes.iter().position(|e| e.has_opid(opid)) - } - - pub(crate) fn resolve_path(&self, mut path: Vec) -> Option { - if let Some(PathElement::Index(i)) = path.pop() { - if path.is_empty() { - self.graphemes.get(i as usize)?.1.resolve_path(path) - } else { - None - } - } else { - None - } - } - - pub(crate) fn resolve_path_mut( - &mut self, - mut path: Vec, - ) -> Option { - if let Some(PathElement::Index(i)) = path.pop() { - if path.is_empty() { - self.graphemes.get_mut(i as usize)?.1.resolve_path_mut(path) - } else { - None - } - } else { - None - } - } -} - -#[derive(Debug, Clone, PartialEq)] -struct StateTreeList { - object_id: amp::ObjectId, - elements: DiffableSequence, -} - -impl StateTreeList { - fn remove(&mut self, index: usize) -> Result { - if index >= self.elements.len() { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.elements.len(), - }) - } else { - let old = self.elements.remove(index); - Ok(old) - } - } - - fn set( - &mut self, - index: usize, - value: MultiValue, - ) -> Result { - if self.elements.len() > index { - let old = self.elements.set(index, value); - Ok(old) - } else { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.elements.len(), - }) - } - } - - fn insert(&mut self, index: usize, value: MultiValue) -> Result<(), error::MissingIndexError> { - self.insert_many(index, std::iter::once(value)) - } - - fn insert_many(&mut self, index: usize, values: I) -> Result<(), error::MissingIndexError> - where - I: IntoIterator, - { - if index > self.elements.len() { - Err(error::MissingIndexError { - missing_index: index, - size_of_collection: self.elements.len(), - }) - } else { - for (i, value) in values.into_iter().enumerate() { - self.elements.insert(index + i, value); - } - Ok(()) - } - } - - fn check_diff(&self, edits: &[amp::DiffEdit]) -> Result<(), error::InvalidPatch> { - self.elements.check_diff(&self.object_id, edits) - } - - fn apply_diff(&mut self, edits: Vec) { - self.elements.apply_diff(&self.object_id, edits); - } - - pub fn pred_for_index(&self, index: u32) -> Vec { - self.elements - .get(index.try_into().unwrap()) - .map(|v| vec![v.1.default_opid()]) - .unwrap_or_else(Vec::new) - } - - pub(crate) fn elem_at( - &self, - index: usize, - ) -> Result<(&::OpId, &MultiValue), error::MissingIndexError> { - self.elements - .get(index) - .ok_or_else(|| error::MissingIndexError { - missing_index: index, - size_of_collection: self.elements.len(), - }) - } - - pub(crate) fn elem_at_mut( - &mut self, - index: usize, - ) -> Result<(&mut amp::OpId, &mut MultiValue), error::MissingIndexError> { - let len = self.elements.len(); - self.elements - .get_mut(index) - .ok_or(error::MissingIndexError { - missing_index: index, - size_of_collection: len, - }) - } - - pub(crate) fn index_of(&self, opid: &::OpId) -> Option { - self.elements.iter().position(|e| e.has_opid(opid)) - } - - fn mutably_update_cursor(&mut self, key: &::ElementId, cursor: Primitive) { - if let amp::ElementId::Id(oid) = key { - if let Some(index) = self.index_of(oid) { - self.elements - .mutate(index, |m| m.update_default(StateTreeValue::Leaf(cursor))) - } - } - } - - pub(crate) fn resolve_path(&self, mut path: Vec) -> Option { - if let Some(PathElement::Index(i)) = path.pop() { - let elem_id = self - .elem_at(i as usize) - .ok() - .map(|(e, _)| e.into()) - .unwrap_or(ElementId::Head); - self.elements.get(i as usize)?.1.resolve_path( - path, - self.object_id.clone(), - amp::Key::Seq(elem_id), - ) - } else { - None - } - } - - pub(crate) fn resolve_path_mut( - &mut self, - mut path: Vec, - ) -> Option { - if let Some(PathElement::Index(i)) = path.pop() { - let elem_id = self - .elem_at(i as usize) - .ok() - .map(|(e, _)| e.into()) - .unwrap_or(ElementId::Head); - self.elements.get_mut(i as usize)?.1.resolve_path_mut( - path, - self.object_id.clone(), - amp::Key::Seq(elem_id), - ) - } else { - None - } - } -} - -pub fn random_op_id() -> amp::OpId { - amp::OpId::new(1, &::ActorId::random()) -} - -#[derive(Clone, Debug, PartialEq)] -struct CursorState { - referring_object_id: amp::ObjectId, - referring_key: amp::Key, - referred_object_id: amp::ObjectId, - referred_opid: amp::OpId, - index: usize, -} - -#[derive(Debug, PartialEq, Clone)] -struct Cursors(HashMap>); - -impl Cursors { - fn new() -> Cursors { - Cursors(HashMap::new()) - } - - fn new_from(cursor: CursorState) -> Cursors { - Cursors(maplit::hashmap! { - cursor.referred_object_id.clone() => vec![cursor], - }) - } - - fn extend(&mut self, other: Cursors) { - for (k, v) in other.0 { - if let Some(c1) = self.0.get_mut(&k) { - c1.extend(v) - } else { - self.0.insert(k, v); - } - } - } - - fn iter_mut(&mut self) -> impl Iterator { - self.0.iter_mut().flat_map(|e| e.1) - } -} diff --git a/automerge-frontend/src/state_tree/multivalue.rs b/automerge-frontend/src/state_tree/multivalue.rs deleted file mode 100644 index a631d29d..00000000 --- a/automerge-frontend/src/state_tree/multivalue.rs +++ /dev/null @@ -1,757 +0,0 @@ -use std::{cmp::Ordering, collections::HashMap, iter::Iterator}; - -use automerge_protocol as amp; -use unicode_segmentation::UnicodeSegmentation; - -use super::{ - CursorState, Cursors, DiffableSequence, ResolvedPath, ResolvedPathMut, StateTreeComposite, - StateTreeList, StateTreeMap, StateTreeTable, StateTreeText, StateTreeValue, -}; -use crate::{ - error, - path::PathElement, - value::{Primitive, Value}, -}; - -pub(crate) struct NewValueRequest<'a, 'c> { - pub(crate) actor: &'a amp::ActorId, - pub(crate) start_op: u64, - pub(crate) key: amp::Key, - pub(crate) value: Value, - pub(crate) parent_obj: &'c amp::ObjectId, - pub(crate) insert: bool, - pub(crate) pred: Vec, -} - -/// A set of conflicting values for the same key, indexed by OpID -#[derive(Debug, Clone, PartialEq, Default)] -pub struct MultiValue { - winning_value: (amp::OpId, StateTreeValue), - conflicts: HashMap, -} - -impl MultiValue { - pub fn check_new_from_diff( - _opid: &::OpId, - diff: &::Diff, - ) -> Result<(), error::InvalidPatch> { - StateTreeValue::check_new_from_diff(diff) - } - - pub fn new_from_diff(opid: amp::OpId, diff: amp::Diff) -> MultiValue { - let value = StateTreeValue::new_from_diff(diff); - MultiValue { - winning_value: (opid, value), - conflicts: HashMap::new(), - } - } - - pub(super) fn from_statetree_value( - statetree_val: StateTreeValue, - opid: amp::OpId, - ) -> MultiValue { - MultiValue { - winning_value: (opid, statetree_val), - conflicts: HashMap::new(), - } - } - - pub(super) fn new_from_value_2(req: NewValueRequest) -> NewValue { - Self::new_from_value( - req.actor, - req.start_op, - req.parent_obj.clone(), - req.key, - req.value, - req.insert, - req.pred, - ) - } - - pub(super) fn new_from_value( - actor: &::ActorId, - start_op: u64, - parent_id: amp::ObjectId, - key: amp::Key, - value: Value, - insert: bool, - pred: Vec, - ) -> NewValue { - NewValueContext { - start_op, - actor, - key, - insert, - pred, - parent_obj: &parent_id, - } - .create(value) - } - - pub(super) fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - ) -> Result<(), error::InvalidPatch> { - self.check_diff_iter(&mut std::iter::once((opid, diff))) - } - - pub(super) fn check_diff_iter<'a, 'b, I>(&self, diff: &mut I) -> Result<(), error::InvalidPatch> - where - I: Iterator, - { - for (opid, subdiff) in diff { - if let Some(existing_value) = self.get(opid) { - match existing_value { - StateTreeValue::Leaf(_) => { - StateTreeValue::check_new_from_diff(subdiff)?; - } - StateTreeValue::Composite(composite) => { - composite.check_diff(subdiff)?; - } - } - } else { - StateTreeValue::check_new_from_diff(subdiff)?; - }; - } - Ok(()) - } - - pub(super) fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff) { - self.apply_diff_iter(&mut std::iter::once((opid, diff))) - } - - pub(super) fn apply_diff_iter(&mut self, diff: &mut I) - where - I: Iterator, - { - for (opid, subdiff) in diff { - if let Some(existing_value) = self.get_mut(&opid) { - match existing_value { - StateTreeValue::Leaf(_) => { - let value = StateTreeValue::new_from_diff(subdiff); - self.update(&opid, value) - } - StateTreeValue::Composite(composite) => { - composite.apply_diff(subdiff); - } - } - } else { - let value = StateTreeValue::new_from_diff(subdiff); - self.update(&opid, value) - }; - } - } - - fn get(&self, opid: &::OpId) -> Option<&StateTreeValue> { - if opid == &self.winning_value.0 { - Some(&self.winning_value.1) - } else { - self.conflicts.get(opid) - } - } - - fn get_mut(&mut self, opid: &::OpId) -> Option<&mut StateTreeValue> { - if opid == &self.winning_value.0 { - Some(&mut self.winning_value.1) - } else { - self.conflicts.get_mut(opid) - } - } - - fn update(&mut self, opid: &::OpId, value: StateTreeValue) { - if *opid >= self.winning_value.0 { - self.conflicts - .insert(self.winning_value.0.clone(), self.winning_value.1.clone()); - self.winning_value.0 = opid.clone(); - self.winning_value.1 = value; - } else { - self.conflicts.insert(opid.clone(), value); - } - } - - pub(super) fn default_statetree_value(&self) -> &StateTreeValue { - &self.winning_value.1 - } - - pub(super) fn default_statetree_value_mut(&mut self) -> &mut StateTreeValue { - &mut self.winning_value.1 - } - - pub(super) fn default_value(&self) -> Value { - self.winning_value.1.realise_value() - } - - pub(super) fn default_opid(&self) -> amp::OpId { - self.winning_value.0.clone() - } - - pub(super) fn update_default(&self, val: StateTreeValue) -> MultiValue { - MultiValue { - winning_value: (self.winning_value.0.clone(), val), - conflicts: self.conflicts.clone(), - } - } - - fn iter(&self) -> impl std::iter::Iterator { - std::iter::once((&(self.winning_value).0, &(self.winning_value.1))) - .chain(self.conflicts.iter()) - } - - pub(super) fn realise_values(&self) -> std::collections::HashMap { - self.iter() - .map(|(opid, v)| (opid.clone(), v.realise_value())) - .collect() - } - - pub(crate) fn resolve_path( - &self, - path: Vec, - parent_object_id: amp::ObjectId, - key: amp::Key, - ) -> Option { - if path.is_empty() { - if let StateTreeValue::Leaf(Primitive::Counter(_)) = self.winning_value.1 { - return Some(ResolvedPath::new_counter(parent_object_id, key, self)); - } else if let StateTreeValue::Leaf(_) = self.winning_value.1 { - return Some(ResolvedPath::new_primitive(self)); - } - - if let StateTreeValue::Composite(composite) = &self.winning_value.1 { - match composite { - StateTreeComposite::Map(map) => { - return Some(ResolvedPath::new_map(self, map.object_id.clone())) - } - StateTreeComposite::Table(table) => { - return Some(ResolvedPath::new_table(self, table.object_id.clone())) - } - StateTreeComposite::Text(text) => { - return Some(ResolvedPath::new_text(self, text.object_id.clone())) - } - StateTreeComposite::List(list) => { - return Some(ResolvedPath::new_list(self, list.object_id.clone())) - } - } - } - } else if let StateTreeValue::Composite(ref composite) = self.winning_value.1 { - return composite.resolve_path(path); - } - None - } - - pub(crate) fn resolve_path_mut( - &mut self, - path: Vec, - parent_object_id: amp::ObjectId, - key: amp::Key, - ) -> Option { - if path.is_empty() { - if let StateTreeValue::Leaf(Primitive::Counter(_)) = self.winning_value.1 { - return Some(ResolvedPathMut::new_counter(parent_object_id, key, self)); - } else if let StateTreeValue::Leaf(_) = self.winning_value.1 { - return Some(ResolvedPathMut::new_primitive(self)); - } - - if let StateTreeValue::Composite(composite) = &self.winning_value.1 { - match composite { - StateTreeComposite::Map(map) => { - let oid = map.object_id.clone(); - return Some(ResolvedPathMut::new_map(self, oid)); - } - StateTreeComposite::Table(table) => { - let oid = table.object_id.clone(); - return Some(ResolvedPathMut::new_table(self, oid)); - } - StateTreeComposite::Text(text) => { - let oid = text.object_id.clone(); - return Some(ResolvedPathMut::new_text(self, oid)); - } - StateTreeComposite::List(list) => { - let oid = list.object_id.clone(); - return Some(ResolvedPathMut::new_list(self, oid)); - } - } - } - } else if let StateTreeValue::Composite(ref mut composite) = self.winning_value.1 { - return composite.resolve_path_mut(path); - } - None - } - - pub(super) fn opids(&self) -> impl Iterator { - std::iter::once(&self.winning_value.0).chain(self.conflicts.keys()) - } - - pub(super) fn has_opid(&self, opid: &::OpId) -> bool { - self.opids().any(|o| o == opid) - } - - pub(super) fn only_for_opid(&self, opid: amp::OpId) -> Option { - if opid == self.winning_value.0 { - Some(MultiValue { - winning_value: self.winning_value.clone(), - conflicts: HashMap::new(), - }) - } else { - self.conflicts.get(&opid).map(|value| MultiValue { - winning_value: (opid.clone(), value.clone()), - conflicts: HashMap::new(), - }) - } - } - - pub(super) fn add_values_from(&mut self, other: MultiValue) { - for (opid, value) in other.iter() { - match opid.cmp(&self.winning_value.0) { - Ordering::Greater => { - let mut temp = (opid.clone(), value.clone()); - std::mem::swap(&mut temp, &mut self.winning_value); - self.conflicts.insert(temp.0, temp.1); - } - Ordering::Less => { - self.conflicts.insert(opid.clone(), value.clone()); - } - Ordering::Equal => {} - } - } - } -} - -#[derive(Debug)] -pub(super) struct NewValue { - value: StateTreeValue, - opid: amp::OpId, - ops: Vec, - new_cursors: Cursors, - max_op: u64, -} - -impl NewValue { - pub(super) fn max_op(&self) -> u64 { - self.max_op - } - - pub(super) fn finish(self) -> (MultiValue, Vec, Cursors) { - ( - MultiValue::from_statetree_value(self.value, self.opid), - self.ops, - self.new_cursors, - ) - } -} - -/// This struct exists to constrain the values of a text type to just containing -/// sequences of grapheme clusters -#[derive(Debug, Clone, PartialEq, Default)] -pub struct MultiGrapheme { - winning_value: (amp::OpId, String), - conflicts: HashMap, -} - -impl MultiGrapheme { - pub(super) fn new_from_grapheme_cluster(opid: amp::OpId, s: String) -> MultiGrapheme { - debug_assert_eq!(s.graphemes(true).count(), 1); - MultiGrapheme { - winning_value: (opid, s), - conflicts: HashMap::new(), - } - } - - pub(super) fn check_new_from_diff( - _opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), error::InvalidPatch> { - match diff { - amp::Diff::Value(amp::ScalarValue::Str(s)) => { - if s.graphemes(true).count() != 1 { - return Err(error::InvalidPatch::InsertNonTextInTextObject { - object_id: parent_object_id.clone(), - diff: diff.clone(), - }); - } else { - s - } - } - _ => { - return Err(error::InvalidPatch::InsertNonTextInTextObject { - object_id: parent_object_id.clone(), - diff: diff.clone(), - }); - } - }; - Ok(()) - } - - pub(super) fn new_from_diff(opid: amp::OpId, diff: amp::Diff) -> MultiGrapheme { - let winning_value = match diff { - amp::Diff::Value(amp::ScalarValue::Str(s)) => s, - _ => unreachable!("insert non text in text object"), - }; - MultiGrapheme { - winning_value: (opid, winning_value), - conflicts: HashMap::new(), - } - } - - pub(super) fn check_diff( - &self, - opid: &::OpId, - diff: &::Diff, - parent_object_id: &::ObjectId, - ) -> Result<(), error::InvalidPatch> { - self.check_diff_iter(&mut std::iter::once((opid, diff)), parent_object_id) - } - - pub(super) fn check_diff_iter<'a, 'b, I>( - &self, - diff: &mut I, - parent_object_id: &::ObjectId, - ) -> Result<(), error::InvalidPatch> - where - I: Iterator, - { - for (_opid, subdiff) in diff { - match subdiff { - amp::Diff::Value(amp::ScalarValue::Str(s)) => { - if s.graphemes(true).count() != 1 { - return Err(error::InvalidPatch::InsertNonTextInTextObject { - object_id: parent_object_id.clone(), - diff: subdiff.clone(), - }); - } - } - _ => { - return Err(error::InvalidPatch::InsertNonTextInTextObject { - object_id: parent_object_id.clone(), - diff: subdiff.clone(), - }); - } - } - } - Ok(()) - } - - pub(super) fn apply_diff(&mut self, opid: amp::OpId, diff: amp::Diff) { - self.apply_diff_iter(&mut std::iter::once((opid, diff))) - } - - pub(super) fn apply_diff_iter(&mut self, diff: &mut I) - where - I: Iterator, - { - for (opid, subdiff) in diff { - match subdiff { - amp::Diff::Value(amp::ScalarValue::Str(s)) => { - self.update(&opid, s); - } - _ => unreachable!("insert non text in text object"), - } - } - } - - fn update(&mut self, key: &::OpId, value: String) { - match key.cmp(&self.winning_value.0) { - Ordering::Equal => { - self.winning_value.1 = value; - } - Ordering::Greater => { - self.conflicts - .insert(self.winning_value.0.clone(), self.winning_value.1.clone()); - self.winning_value.0 = key.clone(); - self.winning_value.1 = value; - } - Ordering::Less => { - self.conflicts.insert(key.clone(), value); - } - } - } - - pub(super) fn default_grapheme(&self) -> String { - self.winning_value.1.clone() - } - - pub fn default_opid(&self) -> &::OpId { - &self.winning_value.0 - } - - fn iter(&self) -> impl std::iter::Iterator { - std::iter::once((&(self.winning_value).0, &(self.winning_value.1))) - .chain(self.conflicts.iter()) - } - - pub(super) fn realise_values(&self) -> std::collections::HashMap { - self.iter() - .map(|(opid, v)| (opid.clone(), Value::Primitive(Primitive::Str(v.to_owned())))) - .collect() - } - - pub(super) fn has_opid(&self, opid: &::OpId) -> bool { - self.winning_value.0 == *opid || self.conflicts.keys().any(|o| o == opid) - } - - pub(super) fn only_for_opid(&self, opid: amp::OpId) -> Option { - if opid == self.winning_value.0 { - Some(MultiGrapheme { - winning_value: self.winning_value.clone(), - conflicts: HashMap::new(), - }) - } else { - self.conflicts.get(&opid).map(|value| MultiGrapheme { - winning_value: (opid, value.clone()), - conflicts: HashMap::new(), - }) - } - } - - pub(super) fn add_values_from(&mut self, other: MultiGrapheme) { - for (opid, value) in other.iter() { - match opid.cmp(&self.winning_value.0) { - Ordering::Greater => { - let mut temp = (opid.clone(), value.to_owned()); - std::mem::swap(&mut temp, &mut self.winning_value); - self.conflicts.insert(temp.0, temp.1); - } - Ordering::Less => { - self.conflicts.insert(opid.clone(), value.to_owned()); - } - Ordering::Equal => {} - } - } - } - - pub(crate) fn resolve_path(&self, path: Vec) -> Option { - if path.is_empty() { - Some(ResolvedPath::new_character(self)) - } else { - None - } - } - - pub(crate) fn resolve_path_mut(&mut self, path: Vec) -> Option { - if path.is_empty() { - Some(ResolvedPathMut::new_character(self)) - } else { - None - } - } -} - -#[derive(Clone)] -pub(crate) struct NewValueContext<'a, O> -where - O: Into, - O: Clone, -{ - pub(crate) actor: &'a amp::ActorId, - pub(crate) start_op: u64, - pub(crate) key: amp::Key, - pub(crate) parent_obj: O, - pub(crate) insert: bool, - pub(crate) pred: Vec, -} - -impl<'a, O> NewValueContext<'a, O> -where - O: Into, - O: Clone, -{ - fn create(self, value: Value) -> NewValue { - match value { - Value::Map(props) => self.new_map_or_table(props, amp::MapType::Map), - Value::Table(props) => self.new_map_or_table(props, amp::MapType::Table), - Value::Sequence(values) => self.new_list(values), - Value::Text(graphemes) => self.new_text(graphemes), - Value::Primitive(p) => self.new_primitive(p), - } - } - - fn new_map_or_table( - self, - props: std::collections::HashMap, - map_type: amp::MapType, - ) -> NewValue { - let make_op_id = amp::OpId(self.start_op, self.actor.clone()); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::from(map_type)), - obj: self.parent_obj.clone().into(), - key: self.key.clone(), - insert: self.insert, - pred: self.pred, - }; - // for each prop we add at least one op - let mut ops = Vec::with_capacity(props.len() + 1); - ops.push(make_op); - let mut current_max_op = self.start_op; - let mut cursors = Cursors::new(); - let mut result_props: HashMap = HashMap::with_capacity(props.len()); - for (prop, value) in props { - let context = NewValueContext { - actor: self.actor, - parent_obj: &make_op_id, - start_op: current_max_op + 1, - key: amp::Key::Map(prop.clone()), - pred: Vec::new(), - insert: false, - }; - let next_value = context.create(value); - current_max_op = next_value.max_op; - let (multivalue, new_ops, new_cursors) = next_value.finish(); - cursors.extend(new_cursors); - ops.extend(new_ops); - result_props.insert(prop, multivalue); - } - let map = match map_type { - amp::MapType::Map => StateTreeComposite::Map(StateTreeMap { - object_id: make_op_id.clone().into(), - props: result_props, - }), - amp::MapType::Table => StateTreeComposite::Table(StateTreeTable { - object_id: make_op_id.clone().into(), - props: result_props, - }), - }; - let value = StateTreeValue::Composite(map); - NewValue { - value, - opid: make_op_id, - max_op: current_max_op, - new_cursors: cursors, - ops, - } - } - - fn new_list(self, values: Vec) -> NewValue { - let make_list_opid = amp::OpId::new(self.start_op, self.actor); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: self.parent_obj.into(), - key: self.key.clone(), - insert: self.insert, - pred: self.pred, - }; - // for each value we add at least one op - let mut ops = Vec::with_capacity(values.len() + 1); - ops.push(make_op); - let mut current_max_op = self.start_op; - let mut cursors = Cursors::new(); - let mut result_elems: Vec = Vec::with_capacity(values.len()); - let mut last_elemid = amp::ElementId::Head; - for value in values { - let elem_opid = self.actor.op_id_at(current_max_op + 1); - let context = NewValueContext { - start_op: current_max_op + 1, - pred: Vec::new(), - insert: true, - key: amp::Key::Seq(last_elemid), - actor: self.actor, - parent_obj: make_list_opid.clone(), - }; - last_elemid = elem_opid.clone().into(); - let next_value = context.create(value); - current_max_op = next_value.max_op; - let (multivalue, new_ops, new_cursors) = next_value.finish(); - cursors.extend(new_cursors); - ops.extend(new_ops); - result_elems.push(multivalue); - } - let list = StateTreeComposite::List(StateTreeList { - object_id: make_list_opid.clone().into(), - elements: DiffableSequence::new_from(result_elems), - }); - let value = StateTreeValue::Composite(list); - NewValue { - value, - opid: make_list_opid, - max_op: current_max_op, - new_cursors: cursors, - ops, - } - } - - fn new_text(self, graphemes: Vec) -> NewValue { - let make_text_opid = self.actor.op_id_at(self.start_op); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::Text), - obj: self.parent_obj.into(), - key: self.key.clone(), - insert: self.insert, - pred: self.pred, - }; - // for each value we add at least one op - let mut ops = Vec::with_capacity(graphemes.len() + 1); - ops.push(make_op); - let mut current_max_op = self.start_op; - let mut last_elemid = amp::ElementId::Head; - let mut multigraphemes: Vec = Vec::with_capacity(graphemes.len()); - for grapheme in graphemes.iter() { - current_max_op += 1; - let opid = self.actor.op_id_at(current_max_op); - let op = amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str(grapheme.clone())), - obj: make_text_opid.clone().into(), - key: amp::Key::Seq(last_elemid), - insert: true, - pred: Vec::new(), - }; - multigraphemes.push(MultiGrapheme::new_from_grapheme_cluster( - opid.clone(), - grapheme.clone(), - )); - ops.push(op); - last_elemid = opid.clone().into(); - } - let seq = DiffableSequence::new_from(multigraphemes); - let text = StateTreeComposite::Text(StateTreeText { - object_id: make_text_opid.clone().into(), - graphemes: seq, - }); - let value = StateTreeValue::Composite(text); - NewValue { - value, - opid: make_text_opid, - ops, - new_cursors: Cursors::new(), - max_op: current_max_op, - } - } - - fn new_primitive(self, primitive: Primitive) -> NewValue { - let new_cursors = match primitive { - Primitive::Cursor(ref c) => Cursors::new_from(CursorState { - index: c.index as usize, - referring_object_id: self.parent_obj.clone().into(), - referring_key: self.key.clone(), - referred_opid: c.elem_opid.clone(), - referred_object_id: c.object.clone(), - }), - _ => Cursors::new(), - }; - let value = match &primitive { - Primitive::Bytes(b) => amp::ScalarValue::Bytes(b.clone()), - Primitive::Str(s) => amp::ScalarValue::Str(s.clone()), - Primitive::Int(i) => amp::ScalarValue::Int(*i), - Primitive::Uint(u) => amp::ScalarValue::Uint(*u), - Primitive::F64(f) => amp::ScalarValue::F64(*f), - Primitive::Counter(i) => amp::ScalarValue::Counter(*i), - Primitive::Timestamp(t) => amp::ScalarValue::Timestamp(*t), - Primitive::Boolean(b) => amp::ScalarValue::Boolean(*b), - Primitive::Cursor(c) => amp::ScalarValue::Cursor(c.elem_opid.clone()), - Primitive::Null => amp::ScalarValue::Null, - }; - let opid = self.actor.op_id_at(self.start_op); - NewValue { - value: StateTreeValue::Leaf(primitive), - opid, - ops: vec![amp::Op { - action: amp::OpType::Set(value), - obj: self.parent_obj.into(), - key: self.key, - insert: self.insert, - pred: self.pred.clone(), - }], - max_op: self.start_op, - new_cursors, - } - } -} diff --git a/automerge-frontend/src/state_tree/resolved_path.rs b/automerge-frontend/src/state_tree/resolved_path.rs deleted file mode 100644 index 9466900b..00000000 --- a/automerge-frontend/src/state_tree/resolved_path.rs +++ /dev/null @@ -1,1067 +0,0 @@ -use std::{ - convert::TryInto, - mem::{discriminant, Discriminant}, - num::NonZeroU32, -}; - -use automerge_protocol as amp; - -use super::{ - random_op_id, LocalOperationResult, MultiGrapheme, MultiValue, NewValueRequest, StateTree, - StateTreeComposite, StateTreeValue, -}; -use crate::{error, Cursor, Primitive, Value}; - -pub enum ResolvedPath<'a> { - Root(ResolvedRoot<'a>), - Map(ResolvedMap<'a>), - Table(ResolvedTable<'a>), - List(ResolvedList<'a>), - Text(ResolvedText<'a>), - Character(ResolvedChar<'a>), - Counter(ResolvedCounter<'a>), - Primitive(ResolvedPrimitive<'a>), -} - -impl<'a> std::fmt::Debug for ResolvedPath<'a> { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - ResolvedPath::Root(_) => write!(f, "Root"), - ResolvedPath::Map(maptarget) => { - write!(f, "Map {:?}", maptarget.object_id) - } - ResolvedPath::Table(tabletarget) => { - write!(f, "Table {:?}", tabletarget.object_id) - } - ResolvedPath::List(listtarget) => { - write!(f, "list {:?}", listtarget.object_id) - } - ResolvedPath::Text(texttarget) => { - write!(f, "text {:?}", texttarget.object_id) - } - ResolvedPath::Counter(countertarget) => write!( - f, - "counter {0}:{1:?}", - countertarget.containing_object_id, countertarget.key_in_container - ), - ResolvedPath::Primitive(p) => write!(f, "primitive: {:?}", p.multivalue), - ResolvedPath::Character(ctarget) => write!(f, "character {:?}", ctarget.multivalue), - } - } -} - -impl<'a> ResolvedPath<'a> { - pub(super) fn new_root(root: &StateTree) -> ResolvedPath { - ResolvedPath::Root(ResolvedRoot { root }) - } - - pub(super) fn new_map(value: &'a MultiValue, object_id: amp::ObjectId) -> ResolvedPath<'a> { - ResolvedPath::Map(ResolvedMap { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_list(value: &'a MultiValue, object_id: amp::ObjectId) -> ResolvedPath<'a> { - ResolvedPath::List(ResolvedList { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_text(mv: &'a MultiValue, object_id: amp::ObjectId) -> ResolvedPath<'a> { - ResolvedPath::Text(ResolvedText { - multivalue: mv, - object_id, - }) - } - - pub(super) fn new_table(value: &'a MultiValue, object_id: amp::ObjectId) -> ResolvedPath<'a> { - ResolvedPath::Table(ResolvedTable { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_counter( - object_id: amp::ObjectId, - key: amp::Key, - mv: &'a MultiValue, - ) -> ResolvedPath<'a> { - ResolvedPath::Counter(ResolvedCounter { - multivalue: mv, - key_in_container: key, - containing_object_id: object_id, - }) - } - - pub(super) fn new_primitive(value: &'a MultiValue) -> ResolvedPath<'a> { - ResolvedPath::Primitive(ResolvedPrimitive { multivalue: value }) - } - - pub(super) fn new_character(c: &'a MultiGrapheme) -> ResolvedPath<'a> { - ResolvedPath::Character(ResolvedChar { multivalue: c }) - } - - pub fn default_value(&self) -> Value { - match &self { - ResolvedPath::Map(maptarget) => maptarget.multivalue.default_value(), - ResolvedPath::Root(root) => root.root.value(), - ResolvedPath::Table(tabletarget) => tabletarget.multivalue.default_value(), - ResolvedPath::List(listtarget) => listtarget.multivalue.default_value(), - ResolvedPath::Text(texttarget) => texttarget.multivalue.default_value(), - ResolvedPath::Counter(countertarget) => countertarget.multivalue.default_value(), - ResolvedPath::Primitive(p) => p.multivalue.default_value(), - ResolvedPath::Character(ctarget) => { - Value::Primitive(Primitive::Str(ctarget.multivalue.default_grapheme())) - } - } - } - - pub fn values(&self) -> std::collections::HashMap { - match &self { - ResolvedPath::Map(maptarget) => maptarget.multivalue.realise_values(), - ResolvedPath::Root(root) => { - let mut result = std::collections::HashMap::new(); - result.insert(random_op_id(), root.root.value()); - result - } - ResolvedPath::Table(tabletarget) => tabletarget.multivalue.realise_values(), - ResolvedPath::List(listtarget) => listtarget.multivalue.realise_values(), - ResolvedPath::Text(texttarget) => texttarget.multivalue.realise_values(), - ResolvedPath::Counter(countertarget) => countertarget.multivalue.realise_values(), - ResolvedPath::Primitive(p) => p.multivalue.realise_values(), - ResolvedPath::Character(ctarget) => ctarget.multivalue.realise_values(), - } - } - - pub fn object_id(&self) -> Option { - match &self { - ResolvedPath::Map(maptarget) => Some(maptarget.object_id.clone()), - ResolvedPath::Root(_) => Some(amp::ObjectId::Root), - ResolvedPath::Table(tabletarget) => Some(tabletarget.object_id.clone()), - ResolvedPath::List(listtarget) => Some(listtarget.object_id.clone()), - ResolvedPath::Text(texttarget) => Some(texttarget.object_id.clone()), - ResolvedPath::Counter(_) | ResolvedPath::Primitive(_) | ResolvedPath::Character(_) => { - None - } - } - } -} - -pub enum ResolvedPathMut<'a> { - Root(ResolvedRootMut<'a>), - Map(ResolvedMapMut<'a>), - Table(ResolvedTableMut<'a>), - List(ResolvedListMut<'a>), - Text(ResolvedTextMut<'a>), - Character(ResolvedCharMut<'a>), - Counter(ResolvedCounterMut<'a>), - Primitive(ResolvedPrimitiveMut<'a>), -} - -impl<'a> std::fmt::Debug for ResolvedPathMut<'a> { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - ResolvedPathMut::Root(_) => write!(f, "Root"), - ResolvedPathMut::Map(maptarget) => { - write!(f, "Map {:?}", maptarget.object_id) - } - ResolvedPathMut::Table(tabletarget) => { - write!(f, "Table {:?}", tabletarget.object_id) - } - ResolvedPathMut::List(listtarget) => { - write!(f, "list {:?}", listtarget.object_id) - } - ResolvedPathMut::Text(texttarget) => { - write!(f, "text {:?}", texttarget.object_id) - } - ResolvedPathMut::Counter(countertarget) => write!( - f, - "counter {0}:{1:?}", - countertarget.containing_object_id, countertarget.key_in_container - ), - ResolvedPathMut::Primitive(p) => write!(f, "primitive: {:?}", p.multivalue), - ResolvedPathMut::Character(ctarget) => write!(f, "character {:?}", ctarget.multivalue), - } - } -} - -impl<'a> ResolvedPathMut<'a> { - pub(super) fn new_root(root: &mut StateTree) -> ResolvedPathMut { - ResolvedPathMut::Root(ResolvedRootMut { root }) - } - - pub(super) fn new_map( - value: &'a mut MultiValue, - object_id: amp::ObjectId, - ) -> ResolvedPathMut<'a> { - ResolvedPathMut::Map(ResolvedMapMut { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_list( - value: &'a mut MultiValue, - object_id: amp::ObjectId, - ) -> ResolvedPathMut<'a> { - ResolvedPathMut::List(ResolvedListMut { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_text( - mv: &'a mut MultiValue, - object_id: amp::ObjectId, - ) -> ResolvedPathMut<'a> { - ResolvedPathMut::Text(ResolvedTextMut { - multivalue: mv, - object_id, - }) - } - - pub(super) fn new_table( - value: &'a mut MultiValue, - object_id: amp::ObjectId, - ) -> ResolvedPathMut<'a> { - ResolvedPathMut::Table(ResolvedTableMut { - multivalue: value, - object_id, - }) - } - - pub(super) fn new_counter( - object_id: amp::ObjectId, - key: amp::Key, - mv: &'a mut MultiValue, - ) -> ResolvedPathMut<'a> { - ResolvedPathMut::Counter(ResolvedCounterMut { - multivalue: mv, - key_in_container: key, - containing_object_id: object_id, - }) - } - - pub(super) fn new_primitive(value: &'a mut MultiValue) -> ResolvedPathMut<'a> { - ResolvedPathMut::Primitive(ResolvedPrimitiveMut { multivalue: value }) - } - - pub(super) fn new_character(c: &'a mut MultiGrapheme) -> ResolvedPathMut<'a> { - ResolvedPathMut::Character(ResolvedCharMut { multivalue: c }) - } - - pub fn default_value(&self) -> Value { - match &self { - ResolvedPathMut::Map(maptarget) => maptarget.multivalue.default_value(), - ResolvedPathMut::Root(root) => root.root.value(), - ResolvedPathMut::Table(tabletarget) => tabletarget.multivalue.default_value(), - ResolvedPathMut::List(listtarget) => listtarget.multivalue.default_value(), - ResolvedPathMut::Text(texttarget) => texttarget.multivalue.default_value(), - ResolvedPathMut::Counter(countertarget) => countertarget.multivalue.default_value(), - ResolvedPathMut::Primitive(p) => p.multivalue.default_value(), - ResolvedPathMut::Character(ctarget) => { - Value::Primitive(Primitive::Str(ctarget.multivalue.default_grapheme())) - } - } - } -} - -pub(crate) struct SetOrInsertPayload<'a, T> { - pub start_op: u64, - pub actor: &'a amp::ActorId, - pub value: T, -} - -pub struct ResolvedRoot<'a> { - pub(super) root: &'a StateTree, -} - -pub struct ResolvedRootMut<'a> { - pub(super) root: &'a mut StateTree, -} - -impl<'a> ResolvedRootMut<'a> { - pub(crate) fn set_key( - &mut self, - key: &str, - payload: SetOrInsertPayload, - ) -> (Option, LocalOperationResult) { - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: payload.start_op, - key: key.into(), - parent_obj: &::ObjectId::Root, - value: payload.value, - insert: false, - pred: self - .root - .get(key) - .map(|mv| vec![mv.default_opid()]) - .unwrap_or_else(Vec::new), - }); - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - let old = self.root.root_props.insert(key.to_string(), multivalue); - (old, LocalOperationResult { new_ops }) - } - - pub(crate) fn delete_key(&mut self, key: &str) -> (MultiValue, LocalOperationResult) { - let existing_value = self.root.get(key); - let pred = existing_value - .map(|v| vec![v.default_opid()]) - .unwrap_or_else(Vec::new); - let old = self - .root - .remove(key) - .expect("Removing non existent key from map"); - ( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: amp::ObjectId::Root, - key: key.into(), - insert: false, - pred, - }], - }, - ) - } - - pub(crate) fn rollback_set(&mut self, key: String, value: Option) { - match value { - Some(old) => { - self.root.root_props.insert(key, old); - } - None => { - self.root.root_props.remove(&key); - } - } - } - - pub(crate) fn rollback_delete(&mut self, key: String, value: MultiValue) { - self.root.root_props.insert(key, value); - } -} - -pub struct ResolvedCounter<'a> { - pub(super) multivalue: &'a MultiValue, - pub(super) containing_object_id: amp::ObjectId, - pub(super) key_in_container: amp::Key, -} - -pub struct ResolvedCounterMut<'a> { - pub(super) multivalue: &'a mut MultiValue, - pub(super) containing_object_id: amp::ObjectId, - pub(super) key_in_container: amp::Key, -} - -impl<'a> ResolvedCounterMut<'a> { - pub(crate) fn increment(&mut self, by: i64) -> LocalOperationResult { - let counter = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Leaf(Primitive::Counter(c)) => c, - _ => unreachable!(), - }; - *counter += by; - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Inc(by), - obj: self.containing_object_id.clone(), - key: self.key_in_container.clone(), - insert: false, - pred: vec![self.multivalue.default_opid()], - }], - } - } - - pub(crate) fn rollback_increment(&mut self, by: i64) { - let counter = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Leaf(Primitive::Counter(c)) => c, - _ => unreachable!(), - }; - *counter -= by; - } -} - -pub struct ResolvedMap<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a MultiValue, -} - -pub struct ResolvedMapMut<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a mut MultiValue, -} - -impl<'a> ResolvedMapMut<'a> { - pub(crate) fn set_key( - &mut self, - key: &str, - payload: SetOrInsertPayload, - ) -> (Option, LocalOperationResult) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Map(map)) => map, - _ => unreachable!(), - }; - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: payload.start_op, - parent_obj: &state_tree_map.object_id, - key: key.into(), - value: payload.value, - insert: false, - pred: state_tree_map.pred_for_key(key), - }); - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - let old = state_tree_map.props.insert(key.to_string(), multivalue); - (old, LocalOperationResult { new_ops }) - } - - pub(crate) fn delete_key(&mut self, key: &str) -> (MultiValue, LocalOperationResult) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Map(map)) => map, - _ => unreachable!(), - }; - let old = state_tree_map - .props - .remove(key) - .expect("Removing non existent key from map"); - ( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: state_tree_map.object_id.clone(), - key: key.into(), - insert: false, - pred: state_tree_map.pred_for_key(key), - }], - }, - ) - } - - pub(crate) fn rollback_set(&mut self, key: String, value: Option) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Map(map)) => map, - _ => unreachable!(), - }; - match value { - Some(old) => { - state_tree_map.props.insert(key, old); - } - None => { - state_tree_map.props.remove(&key); - } - } - } - - pub(crate) fn rollback_delete(&mut self, key: String, value: MultiValue) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Map(map)) => map, - _ => unreachable!(), - }; - state_tree_map.props.insert(key, value); - } -} - -pub struct ResolvedTable<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a MultiValue, -} - -pub struct ResolvedTableMut<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a mut MultiValue, -} - -impl<'a> ResolvedTableMut<'a> { - pub(crate) fn set_key( - &mut self, - key: &str, - payload: SetOrInsertPayload, - ) -> (Option, LocalOperationResult) { - let state_tree_table = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Table(map)) => map, - _ => unreachable!(), - }; - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: payload.start_op, - parent_obj: &state_tree_table.object_id, - key: key.into(), - value: payload.value, - insert: false, - pred: state_tree_table.pred_for_key(key), - }); - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - let old = state_tree_table.props.insert(key.to_owned(), multivalue); - (old, LocalOperationResult { new_ops }) - } - - pub(crate) fn delete_key(&mut self, key: &str) -> (MultiValue, LocalOperationResult) { - let state_tree_table = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Table(map)) => map, - _ => unreachable!(), - }; - let old = state_tree_table - .props - .remove(key) - .expect("Removing non existent key from table"); - ( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: state_tree_table.object_id.clone(), - key: key.into(), - insert: false, - pred: state_tree_table.pred_for_key(key), - }], - }, - ) - } - - pub(crate) fn rollback_set(&mut self, key: String, value: Option) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Table(map)) => map, - _ => unreachable!(), - }; - match value { - Some(old) => { - state_tree_map.props.insert(key, old); - } - None => { - state_tree_map.props.remove(&key); - } - } - } - - pub(crate) fn rollback_delete(&mut self, key: String, value: MultiValue) { - let state_tree_map = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Table(map)) => map, - _ => unreachable!(), - }; - state_tree_map.props.insert(key, value); - } -} - -pub struct ResolvedText<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a MultiValue, -} - -pub struct ResolvedTextMut<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a mut MultiValue, -} - -impl<'a> ResolvedTextMut<'a> { - #[allow(dead_code)] - pub(crate) fn insert( - &mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - let current_elemid = match index { - 0 => amp::ElementId::Head, - i => state_tree_text - .elem_at((i - 1).try_into().unwrap())? - .0 - .into(), - }; - let insert_op = amp::OpId::new(payload.start_op, payload.actor); - let c = MultiGrapheme::new_from_grapheme_cluster(insert_op, payload.value.clone()); - state_tree_text.insert(index.try_into().unwrap(), c)?; - Ok(LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str(payload.value)), - obj: state_tree_text.object_id.clone(), - key: current_elemid.into(), - insert: true, - pred: Vec::new(), - }], - }) - } - - pub(crate) fn insert_many( - &mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result - where - I: ExactSizeIterator, - { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - let current_elemid = match index { - 0 => amp::ElementId::Head, - i => state_tree_text - .elem_at((i - 1).try_into().unwrap())? - .0 - .into(), - }; - let mut values = Vec::with_capacity(payload.value.len()); - let mut chars: Vec = Vec::with_capacity(payload.value.len()); - for (i, c) in payload.value.enumerate() { - let insert_op = amp::OpId::new(payload.start_op + i as u64, payload.actor); - chars.push(amp::ScalarValue::Str(c.to_string())); - let c = MultiGrapheme::new_from_grapheme_cluster(insert_op, c); - values.push(c) - } - state_tree_text.insert_many(index.try_into().unwrap(), values)?; - let action = match chars.len() { - 1 => amp::OpType::Set(chars[0].clone()), - // unwrap is safe here b/c we know all the `ScalarValue`s are of type `Str` - _ => amp::OpType::MultiSet(chars.try_into().unwrap()), - }; - Ok(LocalOperationResult { - new_ops: vec![amp::Op { - action, - obj: state_tree_text.object_id.clone(), - key: current_elemid.into(), - insert: true, - pred: Vec::new(), - }], - }) - } - - pub(crate) fn set( - &mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result<(MultiGrapheme, LocalOperationResult), error::MissingIndexError> { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - let index: usize = index.try_into().unwrap(); - let (current_elemid, _) = state_tree_text.elem_at(index)?; - let current_elemid = current_elemid.clone(); - let update_op = amp::OpId::new(payload.start_op, payload.actor); - let c = MultiGrapheme::new_from_grapheme_cluster(update_op, payload.value.clone()); - let pred = state_tree_text.pred_for_index(index as u32); - let old = state_tree_text.set(index, c)?; - Ok(( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str(payload.value)), - obj: state_tree_text.object_id.clone(), - key: current_elemid.into(), - pred, - insert: false, - }], - }, - )) - } - - pub(crate) fn remove( - &mut self, - index: u32, - ) -> Result<(MultiGrapheme, LocalOperationResult), error::MissingIndexError> { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - let (current_elemid, _) = state_tree_text.elem_at(index.try_into().unwrap())?; - let current_elemid = current_elemid.clone(); - let pred = state_tree_text.pred_for_index(index as u32); - let old = state_tree_text.remove(index.try_into().unwrap())?; - Ok(( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: state_tree_text.object_id.clone(), - key: current_elemid.into(), - insert: false, - pred, - }], - }, - )) - } - - pub(crate) fn rollback_set(&mut self, index: usize, value: MultiGrapheme) { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - state_tree_text - .set(index, value) - .expect("Failed to rollback set"); - } - - pub(crate) fn rollback_delete(&mut self, index: usize, value: MultiGrapheme) { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - state_tree_text - .insert(index, value) - .expect("Failed to rollback delete"); - } - - pub(crate) fn rollback_insert(&mut self, index: usize) { - let state_tree_text = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - state_tree_text - .remove(index) - .expect("Failed to rollback insert"); - } -} - -impl<'a> ResolvedText<'a> { - pub(crate) fn get_cursor(&self, index: u32) -> Result { - let state_tree_text = match self.multivalue.default_statetree_value() { - StateTreeValue::Composite(StateTreeComposite::Text(text)) => text, - _ => unreachable!(), - }; - let (current_elemid, _) = state_tree_text.elem_at(index.try_into().unwrap())?; - Ok(Cursor::new( - index, - state_tree_text.object_id.clone(), - current_elemid.clone(), - )) - } -} - -pub struct ResolvedList<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a MultiValue, -} - -pub struct ResolvedListMut<'a> { - object_id: amp::ObjectId, - pub(super) multivalue: &'a mut MultiValue, -} - -impl<'a> ResolvedListMut<'a> { - pub(crate) fn set( - &mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result<(MultiValue, LocalOperationResult), error::MissingIndexError> { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - let (current_elemid, _) = state_tree_list.elem_at(index.try_into().unwrap())?; - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: payload.start_op, - value: payload.value, - pred: state_tree_list.pred_for_index(index), - parent_obj: &state_tree_list.object_id.clone(), - key: current_elemid.into(), - insert: false, - }); - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - let old = state_tree_list.set(index as usize, multivalue)?; - Ok((old, LocalOperationResult { new_ops })) - } - - #[allow(dead_code)] - pub(crate) fn insert( - &mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - let current_elemid = match index { - 0 => amp::ElementId::Head, - i => state_tree_list - .elem_at((i - 1).try_into().unwrap())? - .0 - .clone() - .into(), - }; - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: payload.start_op, - value: payload.value, - parent_obj: &state_tree_list.object_id, - key: current_elemid.into(), - insert: true, - pred: Vec::new(), - }); - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - state_tree_list.insert(index as usize, multivalue)?; - Ok(LocalOperationResult { new_ops }) - } - - pub(crate) fn insert_many( - &'a mut self, - index: u32, - payload: SetOrInsertPayload, - ) -> Result - where - I: ExactSizeIterator, - { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - let mut last_elemid = match index { - 0 => amp::ElementId::Head, - i => state_tree_list - .elem_at((i - 1).try_into().unwrap())? - .0 - .clone() - .into(), - }; - let mut newvalues = Vec::with_capacity(payload.value.len()); - let mut op_num = payload.start_op; - let mut ops = Vec::new(); - for value in payload.value { - let newvalue = MultiValue::new_from_value_2(NewValueRequest { - actor: payload.actor, - start_op: op_num, - value, - parent_obj: &state_tree_list.object_id, - key: last_elemid.clone().into(), - insert: true, - pred: Vec::new(), - }); - last_elemid = amp::OpId::new(op_num, payload.actor).into(); - op_num = newvalue.max_op() + 1; - let (multivalue, new_ops, _new_cursors) = newvalue.finish(); - newvalues.push(multivalue); - ops.extend(new_ops); - } - state_tree_list.insert_many(index as usize, newvalues)?; - Ok(LocalOperationResult { - new_ops: condense_insert_ops(ops), - }) - } - - pub(crate) fn remove( - &mut self, - index: u32, - ) -> Result<(MultiValue, LocalOperationResult), error::MissingIndexError> { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - let (current_elemid, _) = state_tree_list.elem_at(index.try_into().unwrap())?; - let current_elemid = current_elemid.clone(); - let pred = state_tree_list.pred_for_index(index); - let old = state_tree_list.remove(index as usize)?; - Ok(( - old, - LocalOperationResult { - new_ops: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: state_tree_list.object_id.clone(), - key: current_elemid.into(), - insert: false, - pred, - }], - }, - )) - } - - pub(crate) fn rollback_set(&mut self, index: usize, value: MultiValue) { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - state_tree_list - .set(index, value) - .expect("Failed to rollback set"); - } - - pub(crate) fn rollback_delete(&mut self, index: usize, value: MultiValue) { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - state_tree_list - .insert(index, value) - .expect("Failed to rollback delete"); - } - - pub(crate) fn rollback_insert(&mut self, index: usize) { - let state_tree_list = match self.multivalue.default_statetree_value_mut() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - state_tree_list - .remove(index) - .expect("Failed to rollback insert"); - } -} - -impl<'a> ResolvedList<'a> { - pub(crate) fn get_cursor(&self, index: u32) -> Result { - let state_tree_list = match self.multivalue.default_statetree_value() { - StateTreeValue::Composite(StateTreeComposite::List(list)) => list, - _ => unreachable!(), - }; - let (current_elemid, _) = state_tree_list.elem_at(index.try_into().unwrap())?; - Ok(Cursor::new( - index, - state_tree_list.object_id.clone(), - current_elemid.clone(), - )) - } -} - -pub struct ResolvedChar<'a> { - pub(super) multivalue: &'a MultiGrapheme, -} - -pub struct ResolvedCharMut<'a> { - pub(super) multivalue: &'a mut MultiGrapheme, -} - -pub struct ResolvedPrimitive<'a> { - pub(super) multivalue: &'a MultiValue, -} - -pub struct ResolvedPrimitiveMut<'a> { - pub(super) multivalue: &'a mut MultiValue, -} - -fn condense_insert_ops(ops: Vec) -> Vec { - // nothing to condense - if ops.len() == 1 { - return ops; - } - let mut op_iter = ops.into_iter(); - if let Some(v) = op_iter.next() { - let mut new_ops = vec![]; - let mut key = v.key.clone(); - let mut obj = v.obj.clone(); - let mut insert_if_not_condensed = false; - let op_iter = std::iter::once(v).chain(op_iter); - let mut cur_multiset_start: Option> = None; - let mut cur_prim_vals = vec![]; - let mut preds = vec![]; - - let finish_multiset = |not_condensed_insert: bool, - key: &::Key, - obj: &::ObjectId, - new_ops: &mut Vec, - preds: Vec, - mut vals: Vec| { - if vals.len() > 1 { - new_ops.push(amp::Op { - // safety: `unwrap` is safe b/c we ensure `cur_prim_vals` - // only contains `ScalarValue`s of a single type - action: amp::OpType::MultiSet(vals.try_into().unwrap()), - obj: obj.clone(), - key: key.clone(), - pred: preds, - insert: true, - }) - } else if let Some(scalar) = vals.pop() { - new_ops.push(amp::Op { - action: amp::OpType::Set(scalar), - obj: obj.clone(), - key: key.clone(), - pred: preds, - insert: not_condensed_insert, - }) - } - }; - - for v in op_iter { - match (cur_multiset_start, prim_from_op_action(&v.action)) { - (None, None) => { - // there is no multiset in progress & the current op - // could not be part of a multiset - new_ops.push(v); - } - (None, Some(scalar)) => { - // there is no multiset in progress, but the current op - // could start a multiset - cur_multiset_start = Some(discriminant(&scalar)); - cur_prim_vals.push(scalar); - preds.extend(v.pred); - key = v.key.clone(); - obj = v.obj.clone(); - insert_if_not_condensed = v.insert; - } - (Some(_), None) => { - // there is a multiset in progress but the current op - // could not be part of it - finish_multiset( - insert_if_not_condensed, - &key, - &obj, - &mut new_ops, - std::mem::take(&mut preds), - std::mem::take(&mut cur_prim_vals), - ); - cur_multiset_start = None; - new_ops.push(v); - } - (Some(typ), Some(scalar)) => match typ == discriminant(&scalar) { - // there is a multiset in progress & the current op could be part of it - true => cur_prim_vals.push(scalar), - false => { - cur_multiset_start = Some(discriminant(&scalar)); - // there is a multiset in progress and the current op cannot be part of it - // but it could be part of a new multiset - // finish the current multiset & start a new one with the current op - finish_multiset( - insert_if_not_condensed, - &key, - &obj, - &mut new_ops, - std::mem::take(&mut preds), - std::mem::replace(&mut cur_prim_vals, vec![scalar]), - ); - preds.extend(v.pred); - key = v.key.clone(); - obj = v.obj.clone(); - insert_if_not_condensed = v.insert; - } - }, - } - } - finish_multiset( - insert_if_not_condensed, - &key, - &obj, - &mut new_ops, - preds, - cur_prim_vals, - ); - new_ops - } else { - // this is the case where `ops` is empty - // using if/else avoids an `unwrap` - vec![] - } -} - -fn prim_from_op_action(action: &::OpType) -> Option { - match action { - amp::OpType::Set(v) => match v { - amp::ScalarValue::Bytes(_) => Some(v.clone()), - amp::ScalarValue::Str(_) => Some(v.clone()), - amp::ScalarValue::Int(_) => Some(v.clone()), - amp::ScalarValue::Uint(_) => Some(v.clone()), - amp::ScalarValue::F64(_) => Some(v.clone()), - amp::ScalarValue::Counter(_) => None, - amp::ScalarValue::Timestamp(_) => None, - amp::ScalarValue::Cursor(_) => None, - amp::ScalarValue::Boolean(_) => Some(v.clone()), - amp::ScalarValue::Null => Some(v.clone()), - }, - _ => None, - } -} diff --git a/automerge-frontend/src/value.rs b/automerge-frontend/src/value.rs deleted file mode 100644 index 223c3b64..00000000 --- a/automerge-frontend/src/value.rs +++ /dev/null @@ -1,421 +0,0 @@ -use std::{ - borrow::{Borrow, Cow}, - collections::HashMap, -}; - -use automerge_protocol as amp; -use serde::Serialize; - -use crate::path::PathElement; - -#[derive(Serialize, Clone, Debug, PartialEq)] -pub struct Conflicts(HashMap); - -impl From> for Conflicts { - fn from(hmap: HashMap) -> Self { - Conflicts(hmap) - } -} - -#[derive(Serialize, Clone, Debug, PartialEq)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -#[serde(untagged)] -pub enum Value { - Map(HashMap), - Table(HashMap), - Sequence(Vec), - /// Sequence of grapheme clusters - Text(Vec), - Primitive(Primitive), -} - -#[derive(Serialize, Clone, Debug, PartialEq)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -pub enum Primitive { - Bytes(Vec), - Str(String), - Int(i64), - Uint(u64), - F64(f64), - Counter(i64), - Timestamp(i64), - Boolean(bool), - Cursor(Cursor), - Null, -} - -#[derive(Serialize, Clone, Debug, PartialEq)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -pub struct Cursor { - pub index: u32, - pub(crate) object: amp::ObjectId, - pub(crate) elem_opid: amp::OpId, -} - -impl Cursor { - pub fn new(index: u32, obj: amp::ObjectId, op: amp::OpId) -> Cursor { - Cursor { - index, - object: obj, - elem_opid: op, - } - } -} - -impl From for Value { - fn from(c: Cursor) -> Self { - Value::Primitive(Primitive::Cursor(c)) - } -} - -impl From<&Primitive> for amp::ScalarValue { - fn from(p: &Primitive) -> Self { - match p { - Primitive::Bytes(b) => amp::ScalarValue::Bytes(b.clone()), - Primitive::Str(s) => amp::ScalarValue::Str(s.clone()), - Primitive::Int(i) => amp::ScalarValue::Int(*i), - Primitive::Uint(u) => amp::ScalarValue::Uint(*u), - Primitive::F64(f) => amp::ScalarValue::F64(*f), - Primitive::Counter(i) => amp::ScalarValue::Counter(*i), - Primitive::Timestamp(i) => amp::ScalarValue::Timestamp(*i), - Primitive::Boolean(b) => amp::ScalarValue::Boolean(*b), - Primitive::Null => amp::ScalarValue::Null, - Primitive::Cursor(c) => amp::ScalarValue::Cursor(c.elem_opid.clone()), - } - } -} - -impl From for Value { - fn from(p: Primitive) -> Self { - Value::Primitive(p) - } -} - -impl From<&str> for Value { - fn from(s: &str) -> Self { - Value::Primitive(Primitive::Str(s.to_string())) - } -} - -impl From<&::CursorDiff> for Primitive { - fn from(diff: &::CursorDiff) -> Self { - Primitive::Cursor(Cursor { - index: diff.index, - object: diff.object_id.clone(), - elem_opid: diff.elem_id.clone(), - }) - } -} - -impl From for Value { - fn from(c: char) -> Value { - Value::Primitive(Primitive::Str(c.to_string())) - } -} - -impl From> for Value -where - T: Into, -{ - fn from(v: Vec) -> Self { - Value::Sequence(v.into_iter().map(|t| t.into()).collect()) - } -} - -impl From for Value { - fn from(v: i64) -> Self { - Value::Primitive(Primitive::Int(v)) - } -} - -impl From> for Value -where - T: Into, - K: Borrow, -{ - fn from(h: HashMap) -> Self { - Value::Map( - h.into_iter() - .map(|(k, v)| (k.borrow().to_string(), v.into())) - .collect(), - ) - } -} - -impl AsRef for Value { - fn as_ref(&self) -> &Value { - self - } -} - -impl Value { - pub fn from_json(json: &serde_json::Value) -> Value { - match json { - serde_json::Value::Object(kvs) => { - let result: HashMap = kvs - .iter() - .map(|(k, v)| (k.clone(), Value::from_json(v))) - .collect(); - Value::Map(result) - } - serde_json::Value::Array(vs) => { - Value::Sequence(vs.iter().map(Value::from_json).collect()) - } - serde_json::Value::String(s) => Value::Primitive(Primitive::Str(s.clone())), - serde_json::Value::Number(n) => { - Value::Primitive(Primitive::F64(n.as_f64().unwrap_or(0.0))) - } - serde_json::Value::Bool(b) => Value::Primitive(Primitive::Boolean(*b)), - serde_json::Value::Null => Value::Primitive(Primitive::Null), - } - } - - pub fn to_json(&self) -> serde_json::Value { - match self { - Value::Map(map) => { - let result: serde_json::map::Map = - map.iter().map(|(k, v)| (k.clone(), v.to_json())).collect(); - serde_json::Value::Object(result) - } - Value::Table(map) => { - let result: serde_json::map::Map = - map.iter().map(|(k, v)| (k.clone(), v.to_json())).collect(); - serde_json::Value::Object(result) - } - Value::Sequence(elements) => { - serde_json::Value::Array(elements.iter().map(|v| v.to_json()).collect()) - } - Value::Text(graphemes) => serde_json::Value::String(graphemes.join("")), - Value::Primitive(v) => match v { - Primitive::F64(n) => serde_json::Value::Number( - serde_json::Number::from_f64(*n).unwrap_or_else(|| serde_json::Number::from(0)), - ), - Primitive::Uint(n) => serde_json::Value::Number(serde_json::Number::from(*n)), - Primitive::Int(n) => serde_json::Value::Number(serde_json::Number::from(*n)), - Primitive::Bytes(b) => serde_json::Value::Array( - b.iter() - .map(|byte| serde_json::Value::Number(serde_json::Number::from(*byte))) - .collect(), - ), - Primitive::Str(s) => serde_json::Value::String(s.to_string()), - Primitive::Boolean(b) => serde_json::Value::Bool(*b), - Primitive::Counter(c) => serde_json::Value::Number(serde_json::Number::from(*c)), - Primitive::Timestamp(t) => serde_json::Value::Number(serde_json::Number::from(*t)), - Primitive::Null => serde_json::Value::Null, - Primitive::Cursor(c) => { - serde_json::Value::Number(serde_json::Number::from(c.index)) - } - }, - } - } - - pub fn get_value(&self, path: crate::Path) -> Option> { - let mut path_elements = path.elements(); - path_elements.reverse(); - self.get_value_rev_path(path_elements) - } - - fn get_value_rev_path(&self, mut rev_path: Vec) -> Option> { - if let Some(element) = rev_path.pop() { - match (self, element) { - (Value::Map(m), PathElement::Key(k)) => { - m.get(&k).and_then(|v| v.get_value_rev_path(rev_path)) - } - (Value::Table(m), PathElement::Key(k)) => { - m.get(&k).and_then(|v| v.get_value_rev_path(rev_path)) - } - (Value::Sequence(s), PathElement::Index(i)) => s - .get(i as usize) - .and_then(|v| v.get_value_rev_path(rev_path)), - (Value::Text(t), PathElement::Index(i)) => t - .get(i as usize) - .map(|v| Cow::Owned(Value::Primitive(Primitive::Str(v.clone())))), - (Value::Map(_), PathElement::Index(_)) - | (Value::Table(_), PathElement::Index(_)) - | (Value::Sequence(_), PathElement::Key(_)) - | (Value::Text(_), PathElement::Key(_)) - | (Value::Primitive(_), PathElement::Key(_)) - | (Value::Primitive(_), PathElement::Index(_)) => None, - } - } else { - Some(Cow::Borrowed(self)) - } - } -} - -/// Convert a value to a vector of op requests that will create said value. -/// -/// #Arguments -/// -/// * actor - The actor who is creating this value -/// * start_op - The start op which will be used to generate element IDs -/// * parent_object - The ID of the "parent" object, i.e the object that will -/// contain the newly created object -/// * key - The property that the newly created object will populate -/// within the parent object. -/// * insert - Whether the op that creates this value should be insert -/// -/// -/// Returns a vector of the op requests which will create this value -pub(crate) fn value_to_op_requests( - actor: &::ActorId, - start_op: u64, - parent_object: amp::ObjectId, - key: &::Key, - v: &Value, - insert: bool, -) -> (Vec, u64) { - match v { - Value::Sequence(vs) => { - let list_op = amp::OpId(start_op, actor.clone()); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: parent_object, - key: key.clone(), - insert, - pred: Vec::new(), - }; - let mut op_num = start_op + 1; - let mut result = vec![make_op]; - let mut last_elemid = amp::ElementId::Head; - for v in vs.iter() { - let (child_requests, new_op_num) = value_to_op_requests( - actor, - op_num, - amp::ObjectId::from(list_op.clone()), - &last_elemid.clone().into(), - v, - true, - ); - last_elemid = amp::OpId::new(op_num, actor).into(); - op_num = new_op_num; - result.extend(child_requests); - } - (result, op_num) - } - Value::Text(chars) => { - let make_text_op = amp::OpId(start_op, actor.clone()); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::Text), - obj: parent_object, - key: key.clone(), - insert, - pred: Vec::new(), - }; - let mut insert_ops: Vec = Vec::new(); - let mut last_elemid = amp::ElementId::Head; - let mut op_num = start_op + 1; - for c in chars.iter() { - insert_ops.push(amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str(c.to_string())), - obj: amp::ObjectId::from(make_text_op.clone()), - key: last_elemid.clone().into(), - insert: true, - pred: Vec::new(), - }); - last_elemid = amp::OpId::new(op_num, actor).into(); - op_num += 1; - } - let mut ops = vec![make_op]; - ops.extend(insert_ops.into_iter()); - (ops, op_num) - } - Value::Map(kvs) => { - let make_op_id = amp::OpId::new(start_op, actor); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: parent_object, - key: key.clone(), - insert, - pred: Vec::new(), - }; - let mut op_num = start_op + 1; - let mut result = vec![make_op]; - for (key, v) in kvs.iter() { - let (child_requests, new_op_num) = value_to_op_requests( - actor, - op_num, - amp::ObjectId::from(make_op_id.clone()), - &::Key::from(key.as_str()), - v, - false, - ); - op_num = new_op_num; - result.extend(child_requests); - } - (result, op_num) - } - Value::Table(kvs) => { - let make_op_id = amp::OpId::new(start_op, actor); - let make_op = amp::Op { - action: amp::OpType::Make(amp::ObjType::Table), - obj: parent_object, - key: key.clone(), - insert, - pred: Vec::new(), - }; - let mut op_num = start_op + 1; - let mut result = vec![make_op]; - for (key, v) in kvs.iter() { - let (child_requests, new_op_num) = value_to_op_requests( - actor, - op_num, - amp::ObjectId::from(make_op_id.clone()), - &::Key::from(key.as_str()), - v, - false, - ); - op_num = new_op_num; - result.extend(child_requests); - } - (result, op_num) - } - Value::Primitive(prim_value) => { - let ops = vec![amp::Op { - action: amp::OpType::Set(prim_value.into()), - obj: parent_object, - key: key.clone(), - insert, - pred: Vec::new(), - }]; - (ops, start_op + 1) - } - } -} - -#[cfg(test)] -mod tests { - use maplit::hashmap; - use pretty_assertions::assert_eq; - - use super::*; - use crate::Path; - - #[test] - fn get_value() { - let v = Value::Map(hashmap! { - "hello".to_owned() => Value::Primitive(Primitive::Str("world".to_owned())), - "again".to_owned() => Value::Sequence(vec![Value::Primitive(Primitive::Int(2))]) - }); - - assert_eq!(v.get_value(Path::root()), Some(Cow::Borrowed(&v))); - assert_eq!( - v.get_value(Path::root().key("hello")), - Some(Cow::Borrowed(&Value::Primitive(Primitive::Str( - "world".to_owned() - )))) - ); - assert_eq!(v.get_value(Path::root().index(0)), None); - assert_eq!( - v.get_value(Path::root().key("again")), - Some(Cow::Borrowed(&Value::Sequence(vec![Value::Primitive( - Primitive::Int(2) - )]))) - ); - assert_eq!( - v.get_value(Path::root().key("again").index(0)), - Some(Cow::Borrowed(&Value::Primitive(Primitive::Int(2)))) - ); - assert_eq!(v.get_value(Path::root().key("again").index(1)), None); - } -} diff --git a/automerge-frontend/tests/test_apply_patch.rs b/automerge-frontend/tests/test_apply_patch.rs deleted file mode 100644 index c474268d..00000000 --- a/automerge-frontend/tests/test_apply_patch.rs +++ /dev/null @@ -1,1047 +0,0 @@ -use std::{collections::HashMap, convert::TryInto}; - -use amp::RootDiff; -use automerge_frontend::{Frontend, Path, Primitive, Value}; -use automerge_protocol as amp; -use maplit::hashmap; -use unicode_segmentation::UnicodeSegmentation; - -#[test] -fn set_object_root_properties() { - let actor = amp::ActorId::random(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 1, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor.op_id_at(1) => "magpie".into() - } - }, - }, - }; - let mut frontend = Frontend::new(); - frontend.apply_patch(patch).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"bird" => "magpie"}) - ); -} - -#[test] -fn set_bytes_value() { - let actor = amp::ActorId::random(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 1, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: amp::RootDiff { - props: hashmap! { - "bird".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Value(amp::ScalarValue::Bytes(vec![1, 2, 3])), - } - }, - }, - }; - let mut frontend = Frontend::new(); - frontend.apply_patch(patch).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"bird" => Primitive::Bytes(vec![1, 2, 3])}) - ); -} - -#[test] -fn reveal_conflicts_on_root_properties() { - // We don't just use random actor IDs because we need to have a specific - // ordering (actor1 > actor2) - let actor1 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("02ef21f3-c9eb-4087-880e-bedd7c4bbe43") - .unwrap() - .as_bytes(), - ); - let actor2 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("2a1d376b-24f7-4400-8d4a-f58252d644dd") - .unwrap() - .as_bytes(), - ); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - clock: hashmap! { - actor1.clone() => 1, - actor2.clone() => 2, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "favouriteBird".into() => hashmap!{ - actor1.op_id_at(1) => amp::Diff::Value("robin".into()), - actor2.op_id_at(1) => amp::Diff::Value("wagtail".into()), - } - }, - }, - }; - let mut doc = Frontend::new(); - doc.apply_patch(patch).unwrap(); - - assert_eq!( - doc.state(), - &Into::::into(hashmap! {"favouriteBird" => "wagtail"}) - ); - - let conflicts = doc.get_conflicts(&Path::root().key("favouriteBird")); - - assert_eq!( - conflicts, - Some(hashmap! { - actor1.op_id_at(1) => "robin".into(), - actor2.op_id_at(1) => "wagtail".into(), - }) - ) -} - -#[test] -fn create_nested_maps() { - let actor = amp::ActorId::random(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(2).into(), - props: hashmap!{ - "wrens".into() => hashmap!{ - actor.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(3)) - } - } - }) - } - }, - }, - }; - let mut frontend = Frontend::new(); - frontend.apply_patch(patch).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => hashmap!{"wrens" => Primitive::Int(3)}}) - ); -} - -#[test] -fn apply_updates_inside_nested_maps() { - let actor = amp::ActorId::random(); - let patch1 = amp::Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(2).into(), - props: hashmap!{ - "wrens".into() => hashmap!{ - actor.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(3)) - } - } - }) - } - }, - }, - }; - let mut frontend = Frontend::new(); - frontend.apply_patch(patch1).unwrap(); - - let birds_id = frontend.get_object_id(&Path::root().key("birds")).unwrap(); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 2, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: birds_id, - props: hashmap!{ - "sparrows".into() => hashmap!{ - actor.op_id_at(3) => amp::Diff::Value(amp::ScalarValue::Int(15)) - } - } - }) - } - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"birds" => hashmap!{"wrens" => Primitive::Int(3), "sparrows" => Primitive::Int(15)}} - ) - ); -} - -#[test] -fn apply_updates_inside_map_conflicts() { - // We don't just use random actor IDs because we need to have a specific - // ordering (actor1 < actor2) - let actor1 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("02ef21f3-c9eb-4087-880e-bedd7c4bbe43") - .unwrap() - .as_bytes(), - ); - let actor2 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("2a1d376b-24f7-4400-8d4a-f58252d644dd") - .unwrap() - .as_bytes(), - ); - let patch1 = amp::Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor1.clone() => 1, - actor2.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "favouriteBirds".into() => hashmap!{ - actor1.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor1.op_id_at(1).into(), - props: hashmap!{ - "blackbirds".into() => hashmap!{ - actor1.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(1)), - } - }, - }), - actor2.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor2.op_id_at(1).into(), - props: hashmap!{ - "wrens".into() => hashmap!{ - actor2.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(3)), - } - }, - }) - } - }, - }, - }; - let mut frontend = Frontend::new(); - frontend.apply_patch(patch1).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"favouriteBirds" => hashmap!{"wrens" => Primitive::Int(3)}}) - ); - - assert_eq!( - frontend - .get_conflicts(&Path::root().key("favouriteBirds")) - .unwrap(), - hashmap! { - actor1.op_id_at(1) => hashmap!{"blackbirds" => Primitive::Int(1)}.into(), - actor2.op_id_at(1) => hashmap!{"wrens" => Primitive::Int(3)}.into(), - } - ); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 1, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor1.clone() => 2, - actor2.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "favouriteBirds".into() => hashmap!{ - actor1.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor1.op_id_at(1).into(), - props: hashmap!{ - "blackbirds".into() => hashmap!{ - actor1.op_id_at(3) => amp::Diff::Value(amp::ScalarValue::Int(2)), - } - }, - }), - actor2.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor2.op_id_at(1).into(), - props: HashMap::new(), - }) - } - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"favouriteBirds" => hashmap!{"wrens" => Primitive::Int(3)}}) - ); - - assert_eq!( - frontend - .get_conflicts(&Path::root().key("favouriteBirds")) - .unwrap(), - hashmap! { - actor1.op_id_at(1) => hashmap!{"blackbirds" => Primitive::Int(2)}.into(), - actor2.op_id_at(1) => hashmap!{"wrens" => Primitive::Int(3)}.into(), - } - ); -} - -#[test] -fn delete_keys_in_maps() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch1 = amp::Patch { - actor: None, - max_op: 2, - pending_changes: 0, - seq: None, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "magpies".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Value(amp::ScalarValue::Int(2)) - }, - "sparrows".into() => hashmap!{ - actor.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(15)) - } - }, - }, - }; - frontend.apply_patch(patch1).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"magpies" => Primitive::Int(2), "sparrows" => Primitive::Int(15)} - ) - ); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor => 2, - }, - diffs: RootDiff { - props: hashmap! { - "magpies".into() => hashmap!{} - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"sparrows" => Primitive::Int(15)}) - ); -} - -#[test] -fn create_lists() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 2, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![amp::DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("chaffinch".into()), - }], - }) - } - }, - }, - }; - frontend.apply_patch(patch).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => vec!["chaffinch"]}) - ) -} - -#[test] -fn apply_updates_inside_lists() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 1, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![amp::DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("chaffinch".into()), - }], - }) - } - }, - }, - }; - frontend.apply_patch(patch).unwrap(); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 2, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![amp::DiffEdit::Update{ - index: 0, - op_id: actor.op_id_at(3), - value: amp::Diff::Value("greenfinch".into()), - }], - }) - } - }, - }, - }; - frontend.apply_patch(patch2).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => vec!["greenfinch"]}) - ) -} - -#[test] -fn apply_multi_insert_updates_inside_lists() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 1, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff { - object_id: actor.op_id_at(1).into(), - edits: vec![amp::DiffEdit::MultiElementInsert(amp::MultiElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - values: vec![ - amp::ScalarValue::Str("greenfinch".into()), - amp::ScalarValue::Str("bullfinch".into()), - ].try_into().unwrap() - })], - }) - } - }, - }, - pending_changes: 0, - }; - frontend.apply_patch(patch).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => vec!["greenfinch", "bullfinch"]}) - ) -} - -#[test] -fn apply_updates_inside_list_conflicts() { - // We don't just use random actor IDs because we need to have a specific - // ordering (actor1 < actor2) - let actor1 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("02ef21f3-c9eb-4087-880e-bedd7c4bbe43") - .unwrap() - .as_bytes(), - ); - let actor2 = amp::ActorId::from_bytes( - uuid::Uuid::parse_str("2a1d376b-24f7-4400-8d4a-f58252d644dd") - .unwrap() - .as_bytes(), - ); - - let other_actor = amp::ActorId::random(); - - // A patch to create conflicting value at index 0 - let patch1 = amp::Patch { - actor: None, - seq: None, - max_op: 2, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - other_actor.clone() => 1, - actor1.clone() => 1, - actor2.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - other_actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: other_actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor1.op_id_at(2).into(), - op_id: actor1.op_id_at(2), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor1.op_id_at(2).into(), - props: hashmap!{ - "species".into() => hashmap!{ - actor1.op_id_at(3) => amp::Diff::Value("woodpecker".into()), - }, - "numSeen".into() => hashmap!{ - actor1.op_id_at(4) => amp::Diff::Value(amp::ScalarValue::Int(1)), - }, - } - }), - }, - amp::DiffEdit::Update{ - index: 0, - op_id: actor2.op_id_at(2), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor2.op_id_at(2).into(), - props: hashmap!{ - "species".into() => hashmap!{ - actor2.op_id_at(3) => amp::Diff::Value("lapwing".into()), - }, - "numSeen".into() => hashmap!{ - actor2.op_id_at(4) => amp::Diff::Value(amp::ScalarValue::Int(2)), - }, - } - }), - }, - ], - }) - } - }, - }, - }; - - let mut frontend = Frontend::new(); - frontend.apply_patch(patch1).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"birds" => vec![hashmap!{"species" => Primitive::Str("lapwing".to_string()), "numSeen" => Primitive::Int(2)}]} - ) - ); - - assert_eq!( - frontend - .get_conflicts(&Path::root().key("birds").index(0)) - .unwrap(), - hashmap! { - actor1.op_id_at(2) => hashmap!{ - "species" => Primitive::Str("woodpecker".into()), - "numSeen" => Primitive::Int(1), - }.into(), - actor2.op_id_at(2) => hashmap!{ - "species" => Primitive::Str("lapwing".into()), - "numSeen" => Primitive::Int(2), - }.into(), - } - ); - - // Update the conflicting values - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 5, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor1.clone() => 2, - actor2.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - other_actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: other_actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::Update{ - index: 0, - op_id: actor1.op_id_at(2), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor1.op_id_at(2).into(), - props: hashmap!{ - "numSeen".into() => hashmap!{ - actor1.op_id_at(5) => amp::Diff::Value(amp::ScalarValue::Int(2)), - }, - } - }) - }, - amp::DiffEdit::Update{ - index: 0, - op_id: actor2.op_id_at(2), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor2.op_id_at(2).into(), - props: HashMap::new(), - }) - } - ], - }) - } - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"birds" => vec![hashmap!{"species" => Primitive::Str("lapwing".to_string()), "numSeen" => Primitive::Int(2)}]} - ) - ); - - assert_eq!( - frontend - .get_conflicts(&Path::root().key("birds").index(0)) - .unwrap(), - hashmap! { - actor1.op_id_at(2) => hashmap!{ - "species" => Primitive::Str("woodpecker".into()), - "numSeen" => Primitive::Int(2), - }.into(), - actor2.op_id_at(2) => hashmap!{ - "species" => Primitive::Str("lapwing".into()), - "numSeen" => Primitive::Int(2), - }.into(), - } - ); - - // Remove one of the conflicting values - let patch3 = amp::Patch { - actor: None, - seq: None, - max_op: 5, - deps: Vec::new(), - clock: hashmap! { - actor1 => 2, - actor2.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - other_actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: other_actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::Update{ - index: 0, - op_id: actor2.op_id_at(2), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor2.op_id_at(2).into(), - props: HashMap::new(), - }) - } - ], - }) - } - }, - }, - pending_changes: 0, - }; - - frontend.apply_patch(patch3).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"birds" => vec![hashmap!{"species" => Primitive::Str("lapwing".to_string()), "numSeen" => Primitive::Int(2)}]} - ) - ); - - assert_eq!( - frontend - .get_conflicts(&Path::root().key("birds").index(0)) - .unwrap(), - hashmap! { - actor2.op_id_at(2) => hashmap!{ - "species" => Primitive::Str("lapwing".into()), - "numSeen" => Primitive::Int(2), - }.into(), - } - ); -} - -#[test] -fn delete_list_elements() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 3, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 1, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("chaffinch".into()) - }, - amp::DiffEdit::SingleElementInsert { - index: 1, - elem_id: actor.op_id_at(3).into(), - op_id: actor.op_id_at(3), - value: amp::Diff::Value("goldfinch".into()), - }, - ], - }) - } - }, - }, - }; - frontend.apply_patch(patch).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => vec!["chaffinch", "goldfinch"]}) - ); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 4, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 2, - }, - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![amp::DiffEdit::Remove{ index: 0, count: 1 }], - }) - } - }, - }, - }; - frontend.apply_patch(patch2).unwrap(); - assert_eq!( - frontend.state(), - &Into::::into(hashmap! {"birds" => vec!["goldfinch"]}) - ); -} - -#[test] -fn apply_updates_at_different_levels_of_object_tree() { - let actor = amp::ActorId::random(); - let patch1 = amp::Patch { - clock: hashmap! {actor.clone() => 1}, - seq: None, - max_op: 6, - pending_changes: 0, - actor: None, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "counts".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(1).into(), - props: hashmap!{ - "magpie".into() => hashmap!{ - actor.op_id_at(2) => amp::Diff::Value(amp::ScalarValue::Int(2)) - } - } - }) - }, - "details".into() => hashmap!{ - actor.op_id_at(3) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(3).into(), - edits: vec![amp::DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(4).into(), - op_id: actor.op_id_at(4), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(4).into(), - props: hashmap!{ - "species".into() => hashmap!{ - actor.op_id_at(5) => amp::Diff::Value("magpie".into()) - }, - "family".into() => hashmap!{ - actor.op_id_at(6) => amp::Diff::Value("Corvidae".into()) - } - } - }) - }], - }) - }, - }, - }, - }; - - let mut frontend = Frontend::new(); - frontend.apply_patch(patch1).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! { - "counts" => Into::::into(hashmap!{"magpie".to_string() => Primitive::Int(2)}), - "details" => vec![Into::::into(hashmap!{ - "species" => "magpie", - "family" => "Corvidae", - })].into() - }) - ); - - let patch2 = amp::Patch { - clock: hashmap! {actor.clone() => 2}, - seq: None, - max_op: 7, - pending_changes: 0, - actor: None, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "counts".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(1).into(), - props: hashmap!{ - "magpie".into() => hashmap!{ - actor.op_id_at(7) => amp::Diff::Value(amp::ScalarValue::Int(3)) - } - } - }) - }, - "details".into() => hashmap!{ - actor.op_id_at(3) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(3).into(), - edits: vec![amp::DiffEdit::Update{ - index: 0, - op_id: actor.op_id_at(4), - value: amp::Diff::Map(amp::MapDiff{ - object_id: actor.op_id_at(4).into(), - props: hashmap!{ - "species".into() => hashmap!{ - actor.op_id_at(8) => amp::Diff::Value("Eurasian magpie".into()) - }, - } - }), - }], - }) - }, - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into(hashmap! { - "counts" => Into::::into(hashmap!{"magpie".to_string() => Primitive::Int(3)}), - "details" => vec![Into::::into(hashmap!{ - "species" => "Eurasian magpie", - "family" => "Corvidae", - })].into() - }) - ); -} - -#[test] -fn test_text_objects() { - let actor = amp::ActorId::random(); - let mut frontend = Frontend::new(); - let patch = amp::Patch { - actor: None, - seq: None, - max_op: 4, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 2, - }, - diffs: RootDiff { - props: hashmap! { - "name".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Text(amp::TextDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::SingleElementInsert { - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("b".into()), - }, - amp::DiffEdit::SingleElementInsert { - index: 1, - elem_id: actor.op_id_at(3).into(), - op_id: actor.op_id_at(3), - value: amp::Diff::Value("e".into()), - }, - amp::DiffEdit::SingleElementInsert { - index: 2, - elem_id: actor.op_id_at(4).into(), - op_id: actor.op_id_at(4), - value: amp::Diff::Value("n".into()), - }, - ], - }) - } - }, - }, - }; - frontend.apply_patch(patch).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"name" => Value::Text("ben".graphemes(true).map(|s|s.to_owned()).collect())} - ) - ); - - let patch2 = amp::Patch { - actor: None, - seq: None, - max_op: 5, - pending_changes: 0, - deps: Vec::new(), - clock: hashmap! { - actor.clone() => 3, - }, - diffs: RootDiff { - props: hashmap! { - "name".into() => hashmap!{ - actor.op_id_at(1) => amp::Diff::Text(amp::TextDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::Remove { index: 1, count: 1 }, - amp::DiffEdit::Update{ - index: 1, - op_id: actor.op_id_at(5), - value: amp::Diff::Value(amp::ScalarValue::Str("i".to_string())), - } - ], - }) - } - }, - }, - }; - - frontend.apply_patch(patch2).unwrap(); - - assert_eq!( - frontend.state(), - &Into::::into( - hashmap! {"name" => Value::Text("bi".graphemes(true).map(|s|s.to_owned()).collect())} - ) - ); -} - -#[test] -fn test_unchanged_diff_creates_empty_objects() { - let mut doc = Frontend::new(); - let patch = amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(1), - clock: hashmap! {doc.actor_id.clone() => 1}, - deps: Vec::new(), - max_op: 1, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "text".to_string() => hashmap!{ - "1@cfe5fefb771f4c15a716d488012cbf40".try_into().unwrap() => amp::Diff::Text(amp::TextDiff{ - object_id: "1@cfe5fefb771f4c15a716d488012cbf40".try_into().unwrap(), - edits: Vec::new(), - }) - } - }, - }, - }; - doc.apply_patch(patch).unwrap(); - assert_eq!( - doc.state(), - &Value::Map(hashmap! {"text".to_string() => Value::Text(Vec::new())},), - ); -} diff --git a/automerge-frontend/tests/test_backend_concurrency.rs b/automerge-frontend/tests/test_backend_concurrency.rs deleted file mode 100644 index 4a4c319a..00000000 --- a/automerge-frontend/tests/test_backend_concurrency.rs +++ /dev/null @@ -1,732 +0,0 @@ -use amp::RootDiff; -use automerge_backend::Backend; -use automerge_frontend::{ - Frontend, InvalidChangeRequest, InvalidPatch, LocalChange, Path, Primitive, Value, -}; -use automerge_protocol as amp; -use maplit::hashmap; -use pretty_assertions::assert_eq; - -fn random_op_id() -> amp::OpId { - amp::OpId::new(1, &::ActorId::random()) -} - -#[test] -fn use_version_and_sequence_number_from_backend() { - let mut doc = Frontend::new(); - let remote_actor1 = amp::ActorId::random(); - let remote_actor2 = amp::ActorId::random(); - - // This is a remote patch - let patch = amp::Patch { - actor: None, - seq: None, - clock: hashmap! { - doc.actor_id.clone() => 4, - remote_actor1 => 11, - remote_actor2 => 41, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "blackbirds".into() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::F64(24.0)) - } - }, - }, - max_op: 4, - pending_changes: 0, - }; - - // There were no in flight requests so the doc state should be reconciled - // and should reflect the above patch - doc.apply_patch(patch).unwrap(); - - // Now apply a local patch, this will move the doc into the "waiting for - // in flight requests" state, which should reflect the change just made. - let req = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("partridges"), - Value::Primitive(Primitive::Int(1)), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id, - seq: 5, - start_op: 5, - time: req.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Int(1)), - obj: amp::ObjectId::Root, - key: "partridges".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - assert_eq!(req, expected_change_request); -} - -#[test] -fn remove_pending_requests_once_handled() { - let mut doc = Frontend::new(); - - // First we add two local changes - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("blackbirds"), - Primitive::Int(24), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let _req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("partridges"), - Primitive::Int(1), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - // The doc is waiting for those changes to be applied - assert_eq!(doc.in_flight_requests(), vec![1, 2]); - - // Apply a patch corresponding (via actor ID and seq) to the first change - doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(1), - clock: hashmap! { - doc.actor_id.clone() => 1, - }, - max_op: 4, - pending_changes: 0, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "blackbirds".into() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::Int(24)) - } - }, - }, - }) - .unwrap(); - - // The doc state should still reflect both local changes as we're still - // waiting for the last in flight request to be fulfilled - assert_eq!( - doc.state(), - &Into::::into(hashmap! { - "blackbirds".to_string() => Primitive::Int(24), - "partridges".to_string() => Primitive::Int(1), - }) - ); - assert_eq!(doc.in_flight_requests(), vec![2]); - - // Apply a patch corresponding (via actor ID and seq) to the second change - doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(2), - clock: hashmap! { - doc.actor_id.clone() => 2, - }, - max_op: 5, - pending_changes: 0, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "partridges".into() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::Int(1)) - } - }, - }, - }) - .unwrap(); - - // The doc state should have switched to reconciled - assert!(doc.in_flight_requests().is_empty()); - - // The doc state should still reflect the local changes as they have now - // been reconciled - assert_eq!( - doc.state(), - &Into::::into(hashmap! { - "blackbirds".to_string() => Primitive::Int(24), - "partridges".to_string() => Primitive::Int(1), - }) - ); - - assert_eq!(doc.seq, 2); -} - -#[test] -fn leave_request_queue_unchanged_on_remote_changes() { - let remote = amp::ActorId::random(); - let mut doc = Frontend::new(); - // Enqueue a local change, moving the document into the "waiting for in - // flight requests" state - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("blackbirds"), - Primitive::Int(24), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - // The document is now waiting for the above request - assert_eq!(doc.in_flight_requests(), vec![1]); - - // Apply a remote patch (due to actor ID and seq missing) - doc.apply_patch(amp::Patch { - actor: None, - seq: None, - max_op: 10, - pending_changes: 0, - clock: hashmap! { - remote.clone() => 1, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "pheasants".into() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::Int(2)) - } - }, - }, - }) - .unwrap(); - - // The doc state should reflect outstanding in flight request and not the - // remote patch (because we're still waiting for in flight requests) - assert_eq!( - doc.state(), - &Into::::into(hashmap! { - "blackbirds".to_string() => Primitive::Int(24), - }) - ); - assert_eq!(doc.in_flight_requests(), vec![1]); - - // Now apply a patch corresponding to the outstanding in flight request - doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(1), - clock: hashmap! { - doc.actor_id.clone() => 2, - remote => 1, - }, - max_op: 11, - pending_changes: 0, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "blackbirds".into() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::Int(24)) - } - }, - }, - }) - .unwrap(); - - // The doc state should now reflect both the local and remote changes - // as the doc is now reconciled (all in flight requests have received a - // patch) - assert_eq!( - doc.state(), - &Into::::into(hashmap! { - "blackbirds".to_string() => Primitive::Int(24), - "pheasants".to_string() => Primitive::Int(2), - }) - ); - - assert!(doc.in_flight_requests().is_empty()); - assert_eq!(doc.seq, 2); -} - -#[test] -fn dont_allow_out_of_order_request_patches() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("blackbirds"), - Primitive::Int(24), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let result = doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(2), - max_op: 8, - pending_changes: 0, - clock: hashmap! { - doc.actor_id.clone() => 2, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "partridges".to_string() => hashmap!{ - random_op_id() => amp::Diff::Value(amp::ScalarValue::Int(1)) - } - }, - }, - }); - - assert_eq!( - result, - Err(InvalidPatch::MismatchedSequenceNumber { - expected: 1, - actual: 2 - }) - ); -} - -#[test] -fn handle_concurrent_insertions_into_lists() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - vec!["goldfinch"], - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - // Apply the corresponding backend patch for the above state, document - // shoudl be reconciled after this - doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(1), - max_op: 1, - pending_changes: 0, - clock: hashmap! { - doc.actor_id.clone() => 1, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "birds".to_string() => hashmap!{ - doc.actor_id.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: birds_id.clone(), - edits: vec![amp::DiffEdit::SingleElementInsert{ - index: 0, - elem_id: doc.actor_id.op_id_at(1).into(), - op_id: doc.actor_id.op_id_at(1), - value: amp::Diff::Value("goldfinch".into()), - }], - }) - } - }, - }, - }) - .unwrap(); - - assert_eq!( - doc.state(), - &Into::::into(hashmap! {"birds".to_string() => vec!["goldfinch"]}) - ); - assert!(doc.in_flight_requests().is_empty()); - - // Now add another change which updates the same list, this results in an - // in flight reuest - let _req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("birds").index(0), - "chaffinch".into(), - ))?; - doc.add_change(LocalChange::insert( - Path::root().key("birds").index(2), - "greenfinch".into(), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - doc.state(), - &Into::::into( - hashmap! {"birds".to_string() => vec!["chaffinch", "goldfinch", "greenfinch"]} - ) - ); - - let remote = amp::ActorId::random(); - - // Apply a patch which does not take effect because we're still waiting - // for the in flight requests to be responded to - doc.apply_patch(amp::Patch { - clock: hashmap! { - doc.actor_id.clone() => 1, - remote.clone() => 1, - }, - max_op: 3, - pending_changes: 0, - actor: None, - seq: None, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "birds".into() => hashmap!{ - doc.actor_id.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: birds_id.clone(), - edits: vec![amp::DiffEdit::SingleElementInsert{ - index: 1, - elem_id: remote.op_id_at(1).into(), - op_id: doc.actor_id.op_id_at(1), - value: amp::Diff::Value("bullfinch".into()), - }], - }) - } - }, - }, - }) - .unwrap(); - - // Check that the doc state hasn't been updated yet - assert_eq!( - doc.state(), - &Into::::into( - hashmap! {"birds".to_string() => vec!["chaffinch", "goldfinch", "greenfinch"]} - ) - ); - - // Now apply a patch acknowledging the in flight request - doc.apply_patch(amp::Patch { - actor: Some(doc.actor_id.clone()), - seq: Some(2), - max_op: 3, - pending_changes: 0, - clock: hashmap! { - doc.actor_id.clone() => 2, - remote => 1, - }, - deps: Vec::new(), - diffs: RootDiff { - props: hashmap! { - "birds".to_string() => hashmap!{ - doc.actor_id.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: birds_id, - edits: vec![ - amp::DiffEdit::SingleElementInsert { - index: 0, - elem_id: doc.actor_id.op_id_at(2).into(), - op_id: doc.actor_id.op_id_at(2), - value: amp::Diff::Value("chaffinch".into()), - }, - amp::DiffEdit::SingleElementInsert{ - index: 2, - elem_id: doc.actor_id.op_id_at(3).into(), - op_id: doc.actor_id.op_id_at(3), - value: amp::Diff::Value("greenfinch".into()), - }, - ], - }) - } - }, - }, - }) - .unwrap(); - - assert!(doc.in_flight_requests().is_empty()); - assert_eq!( - doc.state(), - &Into::::into( - hashmap! {"birds".to_string() => vec!["chaffinch", "goldfinch", "greenfinch", "bullfinch"]} - ) - ) -} - -#[test] -fn allow_interleaving_of_patches_and_changes() { - let mut doc = Frontend::new(); - let req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(1), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(2), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - req1, - amp::Change { - actor_id: doc.actor_id.clone(), - seq: 1, - start_op: 1, - message: None, - hash: None, - time: req1.time, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Int(1)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - } - ); - - assert_eq!( - req2, - amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 2, - message: None, - hash: None, - time: req2.time, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Int(2)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(1)], - }], - extra_bytes: Vec::new(), - } - ); - - let mut backend = Backend::new(); - let (patch1, _) = backend.apply_local_change(req1).unwrap(); - doc.apply_patch(patch1).unwrap(); - - let req3 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(3), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - req3, - amp::Change { - actor_id: doc.actor_id.clone(), - seq: 3, - start_op: 3, - message: None, - hash: None, - time: req3.time, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Int(3)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(2)], - }], - extra_bytes: Vec::new(), - } - ); -} - -//it('deps are filled in if the frontend does not have the latest patch', () => { -//const actor1 = uuid(), actor2 = uuid() -//const [doc1, change1] = Frontend.change(Frontend.init(actor1), doc => doc.number = 1) -//const [state1, patch1, binChange1] = Backend.applyLocalChange(Backend.init(), change1) - -//const [state1a, patch1a] = Backend.applyChanges(Backend.init(), [binChange1]) -//const doc1a = Frontend.applyPatch(Frontend.init(actor2), patch1a) -//const [doc2, change2] = Frontend.change(doc1a, doc => doc.number = 2) -//const [doc3, change3] = Frontend.change(doc2, doc => doc.number = 3) -//assert.deepStrictEqual(change2, { -//actor: actor2, seq: 1, startOp: 2, deps: [decodeChange(binChange1).hash], time: change2.time, message: '', ops: [ -//{obj: '_root', action: 'set', key: 'number', insert: false, value: 2, pred: [`1@${actor1}`]} -//] -//}) -//assert.deepStrictEqual(change3, { -//actor: actor2, seq: 2, startOp: 3, deps: [], time: change3.time, message: '', ops: [ -//{obj: '_root', action: 'set', key: 'number', insert: false, value: 3, pred: [`2@${actor2}`]} -//] -//}) - -//const [state2, patch2, binChange2] = Backend.applyLocalChange(state1a, change2) -//const [state3, patch3, binChange3] = Backend.applyLocalChange(state2, change3) -//assert.deepStrictEqual(decodeChange(binChange2).deps, [decodeChange(binChange1).hash]) -//assert.deepStrictEqual(decodeChange(binChange3).deps, [decodeChange(binChange2).hash]) -//assert.deepStrictEqual(patch1a.deps, [decodeChange(binChange1).hash]) -//assert.deepStrictEqual(patch2.deps, []) - -//const doc2a = Frontend.applyPatch(doc3, patch2) -//const doc3a = Frontend.applyPatch(doc2a, patch3) -//const [doc4, change4] = Frontend.change(doc3a, doc => doc.number = 4) -//assert.deepStrictEqual(change4, { -//actor: actor2, seq: 3, startOp: 4, time: change4.time, message: '', deps: [], ops: [ -//{obj: '_root', action: 'set', key: 'number', insert: false, value: 4, pred: [`3@${actor2}`]} -//] -//}) -//const [state4, patch4, binChange4] = Backend.applyLocalChange(state3, change4) -//assert.deepStrictEqual(decodeChange(binChange4).deps, [decodeChange(binChange3).hash]) -//}) -#[test] -fn test_deps_are_filled_in_if_frontend_does_not_have_latest_patch() { - let (doc, change1) = - Frontend::new_with_initial_state(hashmap! {"number" => Primitive::Int(1)}.into()).unwrap(); - - let mut backend1 = Backend::new(); - let (_, binchange1) = backend1.apply_local_change(change1).unwrap(); - - let mut doc2 = Frontend::new(); - let mut backend2 = Backend::new(); - let patch1 = backend2.apply_changes(vec![binchange1.clone()]).unwrap(); - doc2.apply_patch(patch1.clone()).unwrap(); - - let change2 = doc2 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(2), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let change3 = doc2 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(3), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let expected_change2 = amp::Change { - actor_id: doc2.actor_id.clone(), - start_op: 2, - seq: 1, - time: change2.time, - message: None, - hash: None, - deps: vec![binchange1.hash], - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::from(2)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(1)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(change2, expected_change2); - - let expected_change3 = amp::Change { - actor_id: doc2.actor_id.clone(), - start_op: 3, - seq: 2, - time: change3.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::from(3)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: vec![doc2.actor_id.op_id_at(2)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(change3, expected_change3); - - let (patch2, binchange2) = backend2.apply_local_change(change2).unwrap(); - let (patch3, binchange3) = backend2.apply_local_change(change3).unwrap(); - - assert_eq!(binchange2.deps, vec![binchange1.hash]); - assert_eq!(binchange3.deps, vec![binchange2.hash]); - assert_eq!(patch1.deps, vec![binchange1.hash]); - assert_eq!(patch2.deps, Vec::new()); - - doc2.apply_patch(patch2).unwrap(); - doc2.apply_patch(patch3).unwrap(); - - let change4 = doc2 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("number"), - Primitive::Int(4), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let expected_change4 = amp::Change { - actor_id: doc2.actor_id.clone(), - start_op: 4, - seq: 3, - time: change4.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::from(4)), - obj: amp::ObjectId::Root, - key: "number".into(), - insert: false, - pred: vec![doc2.actor_id.op_id_at(3)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(change4, expected_change4); -} diff --git a/automerge-frontend/tests/test_cursor.rs b/automerge-frontend/tests/test_cursor.rs deleted file mode 100644 index 6c98b16d..00000000 --- a/automerge-frontend/tests/test_cursor.rs +++ /dev/null @@ -1,291 +0,0 @@ -use std::convert::TryInto; - -use amp::RootDiff; -use automerge_backend::Backend; -use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use automerge_protocol as amp; -use maplit::hashmap; -use unicode_segmentation::UnicodeSegmentation; - -#[test] -fn test_allow_cursor_on_list_element() { - let _ = env_logger::builder().is_test(true).try_init().unwrap(); - let mut frontend = Frontend::new(); - let change = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set(Path::root().key("list"), vec![1, 2, 3]))?; - let cursor = d - .cursor_to_path(&Path::root().key("list").index(1)) - .unwrap(); - d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let mut backend = Backend::new(); - backend - .apply_changes(vec![change.try_into().unwrap()]) - .unwrap(); - - let mut backend2 = Backend::new(); - backend2 - .apply_changes(backend.get_changes(&[]).into_iter().cloned().collect()) - .unwrap(); - let mut frontend2 = Frontend::new(); - frontend2 - .apply_patch(backend2.get_patch().unwrap()) - .unwrap(); - let index_value = frontend2.get_value(&Path::root().key("cursor")).unwrap(); - if let Value::Primitive(Primitive::Cursor(c)) = index_value { - assert_eq!(c.index, 1) - } else { - panic!("value was not a cursor"); - } -} - -#[test] -fn test_allow_cursor_on_text_element() { - let mut frontend = Frontend::new(); - let change = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("list"), - Value::Text("123".graphemes(true).map(|s| s.to_owned()).collect()), - ))?; - let cursor = d - .cursor_to_path(&Path::root().key("list").index(1)) - .unwrap(); - d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let mut backend = Backend::new(); - backend - .apply_changes(vec![change.try_into().unwrap()]) - .unwrap(); - - let mut backend2 = Backend::new(); - backend2 - .apply_changes(backend.get_changes(&[]).into_iter().cloned().collect()) - .unwrap(); - let mut frontend2 = Frontend::new(); - frontend2 - .apply_patch(backend2.get_patch().unwrap()) - .unwrap(); - let index_value = frontend2.get_value(&Path::root().key("cursor")).unwrap(); - if let Value::Primitive(Primitive::Cursor(c)) = index_value { - assert_eq!(c.index, 1) - } else { - panic!("value was not a cursor"); - } -} - -#[test] -fn test_do_not_allow_index_past_end_of_list() { - let mut frontend = Frontend::new(); - frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("list"), - Value::Text("123".graphemes(true).map(|s| s.to_owned()).collect()), - ))?; - let cursor = d.cursor_to_path(&Path::root().key("list").index(10)); - assert_eq!(cursor, None); - Ok(()) - }) - .unwrap(); -} - -// #[test] -// fn test_updates_cursor_during_change_function() { -// let mut frontend = Frontend::new(); -// frontend -// .change::<_, _, InvalidChangeRequest>(None, |d| { -// d.add_change(LocalChange::set( -// Path::root().key("list"), -// Value::Text("123".graphemes(true).map(|s| s.to_owned()).collect()), -// ))?; -// let cursor = d -// .cursor_to_path(&Path::root().key("list").index(1)) -// .unwrap(); -// d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; -// let cursor_the_second = d.value_at_path(&Path::root().key("cursor")); -// if let Some(Value::Primitive(Primitive::Cursor(c))) = cursor_the_second { -// assert_eq!(c.index, 1); -// } else { -// panic!("Cursor the second not found"); -// } - -// d.add_change(LocalChange::insert( -// Path::root().key("list").index(0), -// Value::Primitive(Primitive::Str("0".to_string())), -// ))?; -// let cursor_the_third = d.value_at_path(&Path::root().key("cursor")); -// if let Some(Value::Primitive(Primitive::Cursor(c))) = cursor_the_third { -// assert_eq!(c.index, 2); -// } else { -// panic!("Cursor the third not found"); -// } -// Ok(()) -// }) -// .unwrap(); -// } - -#[test] -fn test_set_cursor_to_new_element_in_diff() { - let mut frontend = Frontend::new(); - let actor = frontend.actor_id.clone(); - let patch1 = amp::Patch { - actor: Some(actor.clone()), - deps: Vec::new(), - seq: Some(1), - clock: hashmap! {actor.clone() => 1}, - max_op: 3, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "list".to_string() => hashmap!{ - actor.op_id_at(1) => amp::Diff::List(amp::ListDiff{ - object_id: actor.op_id_at(1).into(), - edits: vec![ - amp::DiffEdit::SingleElementInsert{ - index: 0, - elem_id: actor.op_id_at(2).into(), - op_id: actor.op_id_at(2), - value: amp::Diff::Value("one".into()), - }, - amp::DiffEdit::SingleElementInsert{ - index: 1, - elem_id: actor.op_id_at(3).into(), - op_id: actor.op_id_at(3), - value: amp::Diff::Value("two".into()), - }, - ], - }), - }, - "cursor".to_string() => hashmap!{ - actor.op_id_at(4) => amp::Diff::Cursor(amp::CursorDiff{ - elem_id: actor.op_id_at(3), - index: 1, - object_id: actor.op_id_at(1).into(), - }) - }, - }, - }, - }; - - frontend.apply_patch(patch1).unwrap(); - let patch2 = amp::Patch { - actor: Some(actor.clone()), - deps: Vec::new(), - seq: Some(2), - clock: hashmap! {actor.clone() => 2}, - max_op: 5, - pending_changes: 0, - diffs: RootDiff { - props: hashmap! { - "cursor".to_string() => hashmap!{ - actor.op_id_at(4) => amp::Diff::Cursor(amp::CursorDiff{ - elem_id: actor.op_id_at(2), - index: 0, - object_id: actor.op_id_at(1).into(), - }) - } - }, - }, - }; - frontend.apply_patch(patch2).unwrap(); - - frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("list").index(1), - "three".into(), - ))?; - let cursor = doc.value_at_path(&Path::root().key("cursor")).unwrap(); - match cursor { - Value::Primitive(Primitive::Cursor(c)) => assert_eq!(c.index, 0), - _ => panic!("Cursor value was not a cursor"), - } - Ok(()) - }) - .unwrap(); -} - -// #[test] -// fn test_set_cursor_to_new_element_in_local_change() { -// let mut frontend = Frontend::new(); -// frontend -// .change::<_, _, InvalidChangeRequest>(None, |d| { -// d.add_change(LocalChange::set( -// Path::root().key("list"), -// Value::Text("123".graphemes(true).map(|s| s.to_owned()).collect()), -// ))?; -// let cursor = d -// .cursor_to_path(&Path::root().key("list").index(1)) -// .unwrap(); -// d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; -// let cursor_the_second = d.value_at_path(&Path::root().key("cursor")); -// if let Some(Value::Primitive(Primitive::Cursor(c))) = cursor_the_second { -// assert_eq!(c.index, 1); -// } else { -// panic!("Cursor the second not found"); -// } - -// d.add_change(LocalChange::insert( -// Path::root().key("list").index(0), -// Value::Primitive(Primitive::Str("0".to_string())), -// ))?; -// d.add_change(LocalChange::insert( -// Path::root().key("list").index(0), -// Value::Primitive(Primitive::Str("1".to_string())), -// ))?; -// let cursor = d -// .cursor_to_path(&Path::root().key("list").index(2)) -// .unwrap(); -// d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; -// d.add_change(LocalChange::insert( -// Path::root().key("list").index(4), -// "2".into(), -// ))?; -// let cursor_the_third = d.value_at_path(&Path::root().key("cursor")); -// if let Some(Value::Primitive(Primitive::Cursor(c))) = cursor_the_third { -// assert_eq!(c.index, 3); -// } else { -// panic!("Cursor the third not found"); -// } -// Ok(()) -// }) -// .unwrap(); -// } -#[test] -fn test_delete_cursor_and_adding_again() { - let mut frontend = Frontend::new(); - frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("list"), - Value::Text("123".graphemes(true).map(|s| s.to_owned()).collect()), - ))?; - let cursor = d - .cursor_to_path(&Path::root().key("list").index(1)) - .unwrap(); - d.add_change(LocalChange::set(Path::root().key("cursor"), cursor.clone()))?; - d.add_change(LocalChange::delete(Path::root().key("cursor")))?; - d.add_change(LocalChange::set(Path::root().key("cursor"), cursor))?; - - let cursor_value = d.value_at_path(&Path::root().key("cursor")); - if let Some(Value::Primitive(Primitive::Cursor(c))) = cursor_value { - assert_eq!(c.index, 1); - } else { - panic!("Cursor the third not found"); - } - Ok(()) - }) - .unwrap(); -} - -//TODO test removing a cursors diff --git a/automerge-frontend/tests/test_frontend.rs b/automerge-frontend/tests/test_frontend.rs deleted file mode 100644 index 3f275bcb..00000000 --- a/automerge-frontend/tests/test_frontend.rs +++ /dev/null @@ -1,908 +0,0 @@ -use std::{convert::TryInto, num::NonZeroU32}; - -use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use automerge_protocol as amp; -use maplit::hashmap; -use pretty_assertions::assert_eq; -use unicode_segmentation::UnicodeSegmentation; - -#[test] -fn test_should_be_empty_after_init() { - let mut frontend = Frontend::new(); - let result_state = frontend.state().to_json(); - let expected_state: serde_json::Value = serde_json::from_str("{}").unwrap(); - assert_eq!(result_state, expected_state); -} - -#[test] -fn test_init_with_state() { - let initial_state_json: serde_json::Value = serde_json::from_str( - r#" - { - "birds": { - "wrens": 3.0, - "magpies": 4.0 - }, - "alist": ["one", 2.0] - } - "#, - ) - .unwrap(); - let value = Value::from_json(&initial_state_json); - let (mut frontend, _) = Frontend::new_with_initial_state(value).unwrap(); - let result_state = frontend.state().to_json(); - assert_eq!(initial_state_json, result_state); -} - -#[test] -fn test_init_with_empty_state() { - let initial_state_json: serde_json::Value = serde_json::from_str("{}").unwrap(); - let value = Value::from_json(&initial_state_json); - let (mut frontend, _) = Frontend::new_with_initial_state(value).unwrap(); - let result_state = frontend.state().to_json(); - assert_eq!(initial_state_json, result_state); -} - -#[test] -fn test_set_root_object_properties() { - let mut doc = Frontend::new(); - let change_request = doc - .change::<_, _, InvalidChangeRequest>(Some("set root object".into()), |doc| { - doc.add_change(LocalChange::set( - Path::root().key("bird"), - Value::Primitive(Primitive::Str("magpie".to_string())), - ))?; - Ok(()) - }) - .unwrap() - .1 - // Remove timestamp which is irrelevant to test - .map(|mut cr| { - cr.time = 0; - cr - }); - let expected_change = amp::Change { - actor_id: doc.actor_id, - start_op: 1, - seq: 1, - time: 0, - message: Some("set root object".into()), - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("magpie".to_string())), - obj: "_root".try_into().unwrap(), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - assert_eq!(change_request, Some(expected_change)); -} - -#[test] -fn test_set_bytes() { - let mut doc = Frontend::new(); - let change_request = doc - .change::<_, _, InvalidChangeRequest>(Some("set root object".into()), |doc| { - doc.add_change(LocalChange::set( - Path::root().key("bird"), - Value::Primitive(Primitive::Bytes(vec![1, 2, 3])), - ))?; - Ok(()) - }) - .unwrap() - .1 - // Remove timestamp which is irrelevant to test - .map(|mut cr| { - cr.time = 0; - cr - }); - let expected_change = amp::Change { - actor_id: doc.actor_id, - start_op: 1, - seq: 1, - time: 0, - message: Some("set root object".into()), - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Bytes(vec![1, 2, 3])), - obj: "_root".try_into().unwrap(), - key: "bird".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - assert_eq!(change_request, Some(expected_change)); -} - -#[test] -fn it_should_return_no_changes_if_nothing_was_changed() { - let mut doc = Frontend::new(); - let change_request = doc - .change::<_, _, InvalidChangeRequest>(Some("do nothing".into()), |_| Ok(())) - .unwrap() - .1; - assert!(change_request.is_none()) -} - -#[test] -fn it_should_create_nested_maps() { - let mut doc = Frontend::new(); - let change_request = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - Value::from_json(&serde_json::json!({ - "wrens": 3 - })), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - let expected_change = amp::Change { - actor_id: doc.actor_id, - start_op: 1, - seq: 1, - time: change_request.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - amp::Op { - action: amp::OpType::Make(amp::ObjType::Map), - obj: amp::ObjectId::Root, - key: "birds".into(), - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::F64(3.0)), - obj: birds_id, - key: "wrens".into(), - insert: false, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - assert_eq!(change_request, expected_change); -} - -#[test] -fn apply_updates_inside_nested_maps() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - Value::from_json(&serde_json::json!({ - "wrens": 3, - })), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_first_change = doc.state().clone(); - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds").key("sparrows"), - Value::Primitive(Primitive::F64(15.0)), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_second_change = doc.state().clone(); - - assert_eq!( - state_after_first_change, - Value::from_json(&serde_json::json!({ - "birds": { "wrens": 3.0} - })) - ); - assert_eq!( - state_after_second_change, - Value::from_json(&serde_json::json!({ - "birds": { - "wrens": 3.0, - "sparrows": 15.0 - } - })) - ); - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id, - seq: 2, - start_op: 3, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::F64(15.0)), - obj: birds_id, - key: "sparrows".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - - assert_eq!(req2, expected_change_request); -} - -#[test] -fn delete_keys_in_a_map() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root(), - Value::from_json(&serde_json::json!({ - "magpies": 2, - })), - ))?; - doc.add_change(LocalChange::set( - Path::root(), - Value::from_json(&serde_json::json!({ - "sparrows": 15, - })), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::delete(Path::root().key("magpies")))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - doc.state(), - &Value::from_json(&serde_json::json!({ - "sparrows": 15.0 - })) - ); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 3, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: amp::ObjectId::Root, - key: "magpies".into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(1)], - }], - extra_bytes: Vec::new(), - }; - - assert_eq!(req2, expected_change_request); -} - -#[test] -fn create_lists() { - let mut doc = Frontend::new(); - let req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - Value::Sequence(vec!["chaffinch".into()]), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let _req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds").index(0), - "chaffinch", - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - doc.state(), - &Value::from_json(&serde_json::json!({ - "birds": ["chaffinch"], - })) - ); - - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id, - seq: 1, - start_op: 1, - time: req1.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - key: "birds".into(), - obj: amp::ObjectId::Root, - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set("chaffinch".into()), - obj: birds_id, - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - - assert_eq!(req1, expected_change_request); -} - -#[test] -fn apply_updates_inside_lists() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - Value::Sequence(vec!["chaffinch".into()]), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds").index(0), - "greenfinch", - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - doc.state(), - &Value::from_json(&serde_json::json!({ - "birds": ["greenfinch"], - })) - ); - - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 3, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set("greenfinch".into()), - obj: birds_id, - key: doc.actor_id.op_id_at(2).into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(2)], - }], - extra_bytes: Vec::new(), - }; - - assert_eq!(req2, expected_change_request); -} - -#[test] -fn delete_list_elements() { - let mut doc = Frontend::new(); - let _req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - vec!["chaffinch", "goldfinch"], - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::delete(Path::root().key("birds").index(0)))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - doc.state(), - &Value::from_json(&serde_json::json!({ - "birds": ["goldfinch"], - })) - ); - - let birds_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 4, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), - obj: birds_id, - key: doc.actor_id.op_id_at(2).into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(2)], - }], - extra_bytes: Vec::new(), - }; - - assert_eq!(req2, expected_change_request); -} - -#[test] -fn handle_counters_inside_maps() { - let mut doc = Frontend::new(); - let req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("wrens"), - Value::Primitive(Primitive::Counter(0)), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_first_change = doc.state().clone(); - - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::increment(Path::root().key("wrens")))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_second_change = doc.state().clone(); - - assert_eq!( - state_after_first_change, - Value::Map(hashmap! { - "wrens".into() => Value::Primitive(Primitive::Counter(0)) - },) - ); - - assert_eq!( - state_after_second_change, - Value::Map(hashmap! { - "wrens".into() => Value::Primitive(Primitive::Counter(1)) - },) - ); - - let expected_change_request_1 = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 1, - start_op: 1, - time: req1.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Counter(0)), - obj: amp::ObjectId::Root, - key: "wrens".into(), - insert: false, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - assert_eq!(req1, expected_change_request_1); - - let expected_change_request_2 = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 2, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Inc(1), - obj: amp::ObjectId::Root, - key: "wrens".into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(1)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(req2, expected_change_request_2); -} - -#[test] -fn handle_counters_inside_lists() { - let mut doc = Frontend::new(); - let req1 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("counts"), - vec![Value::Primitive(Primitive::Counter(1))], - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_first_change = doc.state().clone(); - - let req2 = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::increment_by( - Path::root().key("counts").index(0), - 2, - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let state_after_second_change = doc.state().clone(); - - assert_eq!( - state_after_first_change, - Value::Map(hashmap! { - "counts".into() => vec![Value::Primitive(Primitive::Counter(1))].into() - },) - ); - - assert_eq!( - state_after_second_change, - Value::Map(hashmap! { - "counts".into() => vec![Value::Primitive(Primitive::Counter(3))].into() - },) - ); - - let counts_id = doc.get_object_id(&Path::root().key("counts")).unwrap(); - - let expected_change_request_1 = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 1, - time: req1.time, - message: None, - hash: None, - deps: Vec::new(), - start_op: 1, - operations: vec![ - amp::Op { - action: amp::OpType::Make(amp::ObjType::List), - obj: amp::ObjectId::Root, - key: "counts".into(), - insert: false, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Counter(1)), - obj: counts_id.clone(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - assert_eq!(req1, expected_change_request_1); - - let expected_change_request_2 = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 3, - time: req2.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Inc(2), - obj: counts_id, - key: doc.actor_id.op_id_at(2).into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(2)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(req2, expected_change_request_2); -} - -#[test] -fn refuse_to_overwrite_counter_value() { - let mut doc = Frontend::new(); - doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("counts"), - Value::Primitive(Primitive::Counter(1)), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let result = doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("counts"), - "somethingelse", - ))?; - Ok(()) - }); - - assert_eq!( - result, - Err(InvalidChangeRequest::CannotOverwriteCounter { - path: Path::root().key("counts") - }) - ); -} - -#[test] -fn test_sets_characters_in_text() { - let mut doc = Frontend::new(); - doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text("some".graphemes(true).map(|s| s.to_owned()).collect()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let request = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set(Path::root().key("text").index(1), "a"))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let text_id = doc.get_object_id(&Path::root().key("text")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 6, - time: request.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("a".into())), - obj: text_id, - key: doc.actor_id.op_id_at(3).into(), - insert: false, - pred: vec![doc.actor_id.op_id_at(3)], - }], - extra_bytes: Vec::new(), - }; - assert_eq!(request, expected_change_request); - - let value = doc.get_value(&Path::root()).unwrap(); - let expected_value: Value = Value::Map(hashmap! { - "text".into() => Value::Text(vec!["s".to_owned(), "a".to_owned(), "m".to_owned(), "e".to_owned()]), - }); - assert_eq!(value, expected_value); -} - -#[test] -fn test_inserts_characters_in_text() { - let mut doc = Frontend::new(); - doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text("same".graphemes(true).map(|s| s.to_owned()).collect()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let request = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("text").index(1), - "h".into(), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let text_id = doc.get_object_id(&Path::root().key("text")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 6, - time: request.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("h".into())), - obj: text_id, - key: doc.actor_id.op_id_at(2).into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - assert_eq!(request, expected_change_request); - - let value = doc.get_value(&Path::root()).unwrap(); - let expected_value: Value = Value::Map(hashmap! { - "text".into() => Value::Text(vec!["s".to_owned(), "h".to_owned(), "a".to_owned(), "m".to_owned(), "e".to_owned()]), - }); - assert_eq!(value, expected_value); -} - -#[test] -fn test_inserts_characters_at_start_of_text() { - let mut doc = Frontend::new(); - doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(Vec::new()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let request = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("text").index(0), - "i".into(), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let text_id = doc.get_object_id(&Path::root().key("text")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 2, - time: request.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("i".into())), - obj: text_id, - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }], - extra_bytes: Vec::new(), - }; - assert_eq!(request, expected_change_request); - - let value = doc.get_value(&Path::root()).unwrap(); - let expected_value: Value = Value::Map(hashmap! { - "text".into() => Value::Text(vec!["i".to_owned()]), - }); - assert_eq!(value, expected_value); -} - -#[test] -fn test_inserts_at_end_of_lists() { - let mut doc = Frontend::new(); - doc.change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("birds"), - Value::Sequence(Vec::new()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let request = doc - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("birds").index(0), - "greenfinch".into(), - ))?; - doc.add_change(LocalChange::insert( - Path::root().key("birds").index(1), - "bullfinch".into(), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let list_id = doc.get_object_id(&Path::root().key("birds")).unwrap(); - - let expected_change_request = amp::Change { - actor_id: doc.actor_id.clone(), - seq: 2, - start_op: 2, - time: request.time, - message: None, - hash: None, - deps: Vec::new(), - operations: vec![ - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("greenfinch".into())), - obj: list_id.clone(), - key: amp::ElementId::Head.into(), - insert: true, - pred: Vec::new(), - }, - amp::Op { - action: amp::OpType::Set(amp::ScalarValue::Str("bullfinch".into())), - obj: list_id, - key: doc.actor_id.op_id_at(2).into(), - insert: true, - pred: Vec::new(), - }, - ], - extra_bytes: Vec::new(), - }; - assert_eq!(request, expected_change_request); - - let value = doc.get_value(&Path::root()).unwrap(); - let expected_value: Value = Value::Map(hashmap! { - "birds".into() => Value::Sequence(vec!["greenfinch".into(), "bullfinch".into()]), - }); - assert_eq!(value, expected_value); -} diff --git a/automerge-frontend/tests/test_mutation.rs b/automerge-frontend/tests/test_mutation.rs deleted file mode 100644 index aafe23cc..00000000 --- a/automerge-frontend/tests/test_mutation.rs +++ /dev/null @@ -1,178 +0,0 @@ -use std::convert::TryInto; - -use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Value}; -use automerge_protocol as amp; -use maplit::hashmap; - -#[test] -fn test_delete_index_in_mutation() { - let mut frontend = Frontend::new(); - let _cr = frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("vals"), - Value::Sequence(Vec::new()), - ))?; - Ok(()) - }) - .unwrap(); - - frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("vals").index(0), - "0".into(), - ))?; - Ok(()) - }) - .unwrap(); - - frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::insert( - Path::root().key("vals").index(1), - "1".into(), - ))?; - Ok(()) - }) - .unwrap(); - - frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::delete(Path::root().key("vals").index(1)))?; - Ok(()) - }) - .unwrap(); -} - -#[test] -fn test_multiple_primitive_inserts() { - let mut frontend = Frontend::new(); - let cr = frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("vals"), - Value::Sequence(Vec::new()), - ))?; - doc.add_change(LocalChange::insert_many( - Path::root().key("vals").index(0), - vec!["one".into(), "two".into()], - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - cr, - amp::Change { - message: None, - seq: 1, - actor_id: frontend.actor_id.clone(), - hash: None, - start_op: 1, - deps: Vec::new(), - time: cr.time, - extra_bytes: Vec::new(), - operations: vec![ - amp::Op { - key: "vals".into(), - insert: false, - pred: Vec::new(), - obj: amp::ObjectId::Root, - action: amp::OpType::Make(amp::ObjType::List), - }, - amp::Op { - key: amp::ElementId::Head.into(), - action: amp::OpType::MultiSet( - vec![ - amp::ScalarValue::Str("one".into()), - amp::ScalarValue::Str("two".into()) - ] - .try_into() - .unwrap() - ), - obj: frontend.actor_id.op_id_at(1).into(), - pred: Vec::new(), - insert: true, - } - ] - } - ); -} - -#[test] -fn test_multiple_non_primitive_inserts() { - let mut frontend = Frontend::new(); - let actor = frontend.actor_id.clone(); - let cr = frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("vals"), - Value::Sequence(Vec::new()), - ))?; - doc.add_change(LocalChange::insert_many( - Path::root().key("vals").index(0), - vec![ - hashmap! {"test" => "test1"}.into(), - hashmap! {"test" => "test2"}.into(), - ], - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - assert_eq!( - cr, - amp::Change { - message: None, - seq: 1, - actor_id: actor.clone(), - hash: None, - start_op: 1, - deps: Vec::new(), - time: cr.time, - extra_bytes: Vec::new(), - operations: vec![ - amp::Op { - key: "vals".into(), - insert: false, - pred: Vec::new(), - obj: amp::ObjectId::Root, - action: amp::OpType::Make(amp::ObjType::List), - }, - amp::Op { - key: amp::ElementId::Head.into(), - obj: actor.op_id_at(1).into(), - pred: Vec::new(), - insert: true, - action: amp::OpType::Make(amp::ObjType::Map), - }, - amp::Op { - key: "test".into(), - obj: actor.op_id_at(2).into(), - pred: Vec::new(), - insert: false, - action: amp::OpType::Set("test1".into()), - }, - amp::Op { - key: actor.op_id_at(2).into(), - obj: actor.op_id_at(1).into(), - pred: Vec::new(), - insert: true, - action: amp::OpType::Make(amp::ObjType::Map), - }, - amp::Op { - key: "test".into(), - obj: actor.op_id_at(4).into(), - pred: Vec::new(), - insert: false, - action: amp::OpType::Set("test2".into()), - } - ] - } - ); -} diff --git a/automerge-frontend/tests/test_wasm.rs b/automerge-frontend/tests/test_wasm.rs deleted file mode 100644 index 73bc6f73..00000000 --- a/automerge-frontend/tests/test_wasm.rs +++ /dev/null @@ -1,15 +0,0 @@ -use wasm_bindgen_test::*; - -#[wasm_bindgen_test] -fn test_simple_frontend_change_with_set_sequence() { - let mut f = automerge_frontend::Frontend::new_with_timestamper(Box::new(|| None)); - f.change::<_, _, automerge_frontend::InvalidChangeRequest>(None, |doc| { - doc.add_change(automerge_frontend::LocalChange::set( - automerge_frontend::Path::root().key(""), - automerge_frontend::Value::Sequence(vec![]), - )) - .unwrap(); - Ok(()) - }) - .unwrap(); -} diff --git a/automerge-protocol/Cargo.toml b/automerge-protocol/Cargo.toml deleted file mode 100644 index 07741096..00000000 --- a/automerge-protocol/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "automerge-protocol" -version = "0.1.0" -authors = ["Alex Good "] -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -bench = false - -[dependencies] -hex = "^0.4.2" -uuid = { version = "^0.8.2", features=["v4"] } -thiserror = "1.0.16" -serde = { version = "^1.0", features=["derive"] } -strum = { version = "0.21.0", features=["derive"]} -arbitrary = { version = "1", features = ["derive"], optional = true } - -[dev-dependencies] -maplit = "^1.0.2" -serde_json = { version = "^1.0.61", features=["float_roundtrip"], default-features=true } -proptest = "0.10.1" -rmp = "0.8.10" -rmp-serde = "0.15.4" - -[features] -derive-arbitrary = ["arbitrary"] diff --git a/automerge-protocol/src/error.rs b/automerge-protocol/src/error.rs deleted file mode 100644 index 0d207f02..00000000 --- a/automerge-protocol/src/error.rs +++ /dev/null @@ -1,40 +0,0 @@ -use thiserror::Error; - -use crate::{DataType, ScalarValue, ScalarValueKind}; - -#[derive(Error, Debug)] -#[error("Invalid OpID: {0}")] -pub struct InvalidOpId(pub String); - -#[derive(Error, Debug, PartialEq)] -#[error("Invalid object ID: {0}")] -pub struct InvalidObjectId(pub String); - -#[derive(Error, Debug)] -#[error("Invalid element ID: {0}")] -pub struct InvalidElementId(pub String); - -#[derive(Error, Debug)] -#[error("Invalid actor ID: {0}")] -pub struct InvalidActorId(pub String); - -#[derive(Error, Debug, PartialEq)] -#[error("Invalid change hash slice: {0:?}")] -pub struct InvalidChangeHashSlice(pub Vec); - -#[derive(Error, Debug, PartialEq)] -#[error("Invalid scalar value, expected {expected} but received {unexpected}")] -pub struct InvalidScalarValue { - pub raw_value: ScalarValue, - pub datatype: DataType, - pub unexpected: String, - pub expected: String, -} - -#[derive(Error, Debug, PartialEq)] -pub enum InvalidScalarValues { - #[error("No scalar values")] - Empty, - #[error("Expected kind: `{0}` but got kind: `{1}`")] - UnexpectedKind(ScalarValueKind, ScalarValueKind), -} diff --git a/automerge-protocol/src/lib.rs b/automerge-protocol/src/lib.rs deleted file mode 100644 index 1c99ab25..00000000 --- a/automerge-protocol/src/lib.rs +++ /dev/null @@ -1,793 +0,0 @@ -pub mod error; -mod serde_impls; -mod utility_impls; -use std::{ - collections::HashMap, - convert::{TryFrom, TryInto}, - fmt, - num::NonZeroU32, - slice::Iter, -}; - -use error::InvalidScalarValues; -use serde::{ - de::{Error, MapAccess, Unexpected}, - Deserialize, Serialize, -}; -use strum::EnumDiscriminants; - -#[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord, Default)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -pub struct ActorId(Vec); - -impl fmt::Debug for ActorId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("ActorID") - .field(&hex::encode(&self.0)) - .finish() - } -} - -impl ActorId { - pub fn random() -> ActorId { - ActorId(uuid::Uuid::new_v4().as_bytes().to_vec()) - } - - pub fn to_bytes(&self) -> Vec { - self.0.clone() - } - - pub fn into_bytes(self) -> Vec { - self.0 - } - - pub fn from_bytes(bytes: &[u8]) -> ActorId { - ActorId(bytes.to_vec()) - } - - pub fn to_hex_string(&self) -> String { - hex::encode(&self.0) - } - - pub fn op_id_at(&self, seq: u64) -> OpId { - OpId(seq, self.clone()) - } -} - -#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Copy, Hash)] -#[serde(rename_all = "camelCase", untagged)] -pub enum ObjType { - Map, - Table, - List, - Text, -} - -impl ObjType { - pub fn is_sequence(&self) -> bool { - matches!(self, Self::List | Self::Text) - } -} - -impl From for ObjType { - fn from(other: MapType) -> Self { - match other { - MapType::Map => Self::Map, - MapType::Table => Self::Table, - } - } -} - -impl From for ObjType { - fn from(other: SequenceType) -> Self { - match other { - SequenceType::List => Self::List, - SequenceType::Text => Self::Text, - } - } -} - -impl fmt::Display for ObjType { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ObjType::Map => write!(f, "map"), - ObjType::Table => write!(f, "table"), - ObjType::List => write!(f, "list"), - ObjType::Text => write!(f, "text"), - } - } -} - -#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Copy, Hash)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -#[serde(rename_all = "camelCase")] -pub enum MapType { - Map, - Table, -} - -#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Copy, Hash)] -#[serde(rename_all = "camelCase")] -pub enum SequenceType { - List, - Text, -} - -#[derive(Eq, PartialEq, Hash, Clone, Default)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -pub struct OpId(pub u64, pub ActorId); - -impl OpId { - pub fn new(seq: u64, actor: &ActorId) -> OpId { - OpId(seq, actor.clone()) - } - - pub fn counter(&self) -> u64 { - self.0 - } - - pub fn increment_by(&self, by: u64) -> OpId { - OpId(self.0 + by, self.1.clone()) - } - - /// Returns true if `other` has the same actor ID, and their counter is `delta` greater than - /// ours. - pub fn delta(&self, other: &Self, delta: u64) -> bool { - self.1 == other.1 && self.0 + delta == other.0 - } -} - -#[derive(Eq, PartialEq, Debug, Hash, Clone)] -#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] -pub enum ObjectId { - Id(OpId), - Root, -} - -#[derive(PartialEq, Eq, Debug, Hash, Clone)] -pub enum ElementId { - Head, - Id(OpId), -} - -impl ElementId { - pub fn as_opid(&self) -> Option<&OpId> { - match self { - ElementId::Head => None, - ElementId::Id(opid) => Some(opid), - } - } - - pub fn into_key(self) -> Key { - Key::Seq(self) - } - - pub fn not_head(&self) -> bool { - match self { - ElementId::Head => false, - ElementId::Id(_) => true, - } - } - - pub fn increment_by(&self, by: u64) -> Option { - match self { - ElementId::Head => None, - ElementId::Id(id) => Some(ElementId::Id(id.increment_by(by))), - } - } -} - -#[derive(Serialize, PartialEq, Eq, Debug, Hash, Clone)] -#[serde(untagged)] -pub enum Key { - Map(String), - Seq(ElementId), -} - -impl Key { - pub fn head() -> Key { - Key::Seq(ElementId::Head) - } - - pub fn is_map_key(&self) -> bool { - match self { - Key::Map(_) => true, - Key::Seq(_) => false, - } - } - - pub fn as_element_id(&self) -> Option { - match self { - Key::Map(_) => None, - Key::Seq(eid) => Some(eid.clone()), - } - } - - pub fn to_opid(&self) -> Option { - match self.as_element_id()? { - ElementId::Id(id) => Some(id), - ElementId::Head => None, - } - } - pub fn increment_by(&self, by: u64) -> Option { - match self { - Key::Map(_) => None, - Key::Seq(eid) => eid.increment_by(by).map(Key::Seq), - } - } -} - -#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)] -pub enum DataType { - #[serde(rename = "counter")] - Counter, - #[serde(rename = "timestamp")] - Timestamp, - #[serde(rename = "bytes")] - Bytes, - #[serde(rename = "cursor")] - Cursor, - #[serde(rename = "uint")] - Uint, - #[serde(rename = "int")] - Int, - #[serde(rename = "float64")] - F64, - #[serde(rename = "undefined")] - Undefined, -} - -impl DataType { - #[allow(clippy::trivially_copy_pass_by_ref)] - pub fn is_undefined(d: &DataType) -> bool { - matches!(d, DataType::Undefined) - } -} - -/// We don't implement Serialize/Deserialize b/c -/// this struct will always be serialized as 2 fields -/// that are *part of* a larger struct. (It will never -/// be serialized as its own struct/map) -#[derive(PartialEq, Clone, Debug)] -pub struct ScalarValues { - // For implementing Serialization in DiffEdit - pub(crate) vec: Vec, - // Can't use `std::mem::Discriminant` b/c we - // need to be able to `match` on the kind for `as_numerical_datatype`... - pub(crate) kind: ScalarValueKind, -} - -impl ScalarValues { - pub fn from_values_and_datatype<'de, V: MapAccess<'de>>( - mut old_values: Vec, - datatype: Option, - ) -> Result { - // ensure the values can be cast to the correct datatype - if let Some(datatype) = datatype { - old_values = old_values - .iter() - .map(|v| { - v.as_datatype(datatype).map_err(|e| { - Error::invalid_value( - Unexpected::Other(e.unexpected.as_str()), - &e.expected.as_str(), - ) - }) - }) - .collect::, _>>()?; - } - old_values.try_into().map_err(|e| match e { - InvalidScalarValues::Empty => Error::invalid_length(0, &"more than 0"), - InvalidScalarValues::UnexpectedKind(exp, unexp) => { - let unexp = format!("{:?}", unexp); - let exp = format!("{:?}", exp); - Error::invalid_value(Unexpected::Other(&unexp), &exp.as_str()) - } - }) - } - - /// Try to append a `ScalarValue` to a `ScalarValues`. If we can't - // returh the `ScalarValueKind` of the value we tried to add (for error reporting) - pub fn append(&mut self, v: ScalarValue) -> Option { - let new_kind = ScalarValueKind::from(&v); - if self.kind == new_kind { - self.vec.push(v); - None - } else { - Some(new_kind) - } - } - - pub fn get(&self, idx: usize) -> Option<&ScalarValue> { - self.vec.get(idx) - } - - pub fn len(&self) -> usize { - self.vec.len() - } - - pub fn is_empty(&self) -> bool { - self.vec.is_empty() - } - - pub fn iter(&self) -> Iter { - self.vec.iter() - } - - /// Returns an Option containing a `DataType` if - /// `self` represents a numerical scalar value - /// This is necessary b/c numerical values are not self-describing - /// (unlike strings / bytes / etc. ) - pub fn as_numerical_datatype(&self) -> Option { - match self.kind { - ScalarValueKind::Counter => Some(DataType::Counter), - ScalarValueKind::Timestamp => Some(DataType::Timestamp), - ScalarValueKind::Int => Some(DataType::Int), - ScalarValueKind::Uint => Some(DataType::Uint), - ScalarValueKind::F64 => Some(DataType::F64), - _ => None, - } - } -} - -impl TryFrom> for ScalarValues { - type Error = InvalidScalarValues; - fn try_from(old_values: Vec) -> Result { - let mut values: Option = None; - for value in old_values.into_iter() { - if let Some(ref mut xs) = values { - if let Some(new_kind) = xs.append(value) { - return Err(InvalidScalarValues::UnexpectedKind(xs.kind, new_kind)); - } - } else { - values = Some(value.into()); - } - } - values.ok_or(InvalidScalarValues::Empty) - } -} - -impl From for ScalarValues { - fn from(value: ScalarValue) -> Self { - let kind = ScalarValueKind::from(&value); - Self { - vec: vec![value], - kind, - } - } -} - -impl fmt::Display for ScalarValueKind { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -#[derive(Serialize, PartialEq, Debug, Clone, EnumDiscriminants)] -#[strum_discriminants(name(ScalarValueKind))] -#[serde(untagged)] -pub enum ScalarValue { - Bytes(Vec), - Str(String), - Int(i64), - Uint(u64), - F64(f64), - Counter(i64), - Timestamp(i64), - Cursor(OpId), - Boolean(bool), - Null, -} - -impl ScalarValue { - pub fn as_datatype( - &self, - datatype: DataType, - ) -> Result { - match (datatype, self) { - (DataType::Counter, ScalarValue::Int(i)) => Ok(ScalarValue::Counter(*i)), - (DataType::Counter, ScalarValue::Uint(u)) => match i64::try_from(*u) { - Ok(i) => Ok(ScalarValue::Counter(i)), - Err(_) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an integer".to_string(), - unexpected: "an integer larger than i64::max_value".to_string(), - datatype, - }), - }, - (DataType::Bytes, ScalarValue::Bytes(bytes)) => Ok(ScalarValue::Bytes(bytes.clone())), - (DataType::Bytes, v) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "a vector of bytes".to_string(), - unexpected: v.to_string(), - datatype, - }), - (DataType::Counter, v) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an integer".to_string(), - unexpected: v.to_string(), - datatype, - }), - (DataType::Timestamp, ScalarValue::Int(i)) => Ok(ScalarValue::Timestamp(*i)), - (DataType::Timestamp, ScalarValue::Uint(u)) => match i64::try_from(*u) { - Ok(i) => Ok(ScalarValue::Timestamp(i)), - Err(_) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an integer".to_string(), - unexpected: "an integer larger than i64::max_value".to_string(), - datatype, - }), - }, - (DataType::Timestamp, v) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an integer".to_string(), - unexpected: v.to_string(), - datatype, - }), - (DataType::Cursor, v) => Err(error::InvalidScalarValue { - raw_value: self.clone(), - expected: "a cursor".to_string(), - unexpected: v.to_string(), - datatype, - }), - (DataType::Int, v) => Ok(ScalarValue::Int(v.to_i64().ok_or( - error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an int".to_string(), - unexpected: v.to_string(), - datatype, - }, - )?)), - (DataType::Uint, v) => Ok(ScalarValue::Uint(v.to_u64().ok_or( - error::InvalidScalarValue { - raw_value: self.clone(), - expected: "a uint".to_string(), - unexpected: v.to_string(), - datatype, - }, - )?)), - (DataType::F64, v) => Ok(ScalarValue::F64(v.to_f64().ok_or( - error::InvalidScalarValue { - raw_value: self.clone(), - expected: "an f64".to_string(), - unexpected: v.to_string(), - datatype, - }, - )?)), - (DataType::Undefined, _) => Ok(self.clone()), - } - } - - /// Returns an Option containing a `DataType` if - /// `self` represents a numerical scalar value - /// This is necessary b/c numerical values are not self-describing - /// (unlike strings / bytes / etc. ) - pub fn as_numerical_datatype(&self) -> Option { - match self { - ScalarValue::Counter(..) => Some(DataType::Counter), - ScalarValue::Timestamp(..) => Some(DataType::Timestamp), - ScalarValue::Int(..) => Some(DataType::Int), - ScalarValue::Uint(..) => Some(DataType::Uint), - ScalarValue::F64(..) => Some(DataType::F64), - _ => None, - } - } - - // TODO: Should this method be combined with as_numerical_datatype?? - pub fn datatype(&self) -> Option { - match self { - ScalarValue::Counter(..) => Some(DataType::Counter), - ScalarValue::Timestamp(..) => Some(DataType::Timestamp), - ScalarValue::Int(..) => Some(DataType::Int), - ScalarValue::Uint(..) => Some(DataType::Uint), - ScalarValue::F64(..) => Some(DataType::F64), - ScalarValue::Cursor(..) => Some(DataType::Cursor), - _ => None, - } - } - - /// If this value can be coerced to an i64, return the i64 value - pub fn to_i64(&self) -> Option { - match self { - ScalarValue::Int(n) => Some(*n), - ScalarValue::Uint(n) => Some(*n as i64), - ScalarValue::F64(n) => Some(*n as i64), - ScalarValue::Counter(n) => Some(*n), - ScalarValue::Timestamp(n) => Some(*n), - _ => None, - } - } - - pub fn to_u64(&self) -> Option { - match self { - ScalarValue::Int(n) => Some(*n as u64), - ScalarValue::Uint(n) => Some(*n), - ScalarValue::F64(n) => Some(*n as u64), - ScalarValue::Counter(n) => Some(*n as u64), - ScalarValue::Timestamp(n) => Some(*n as u64), - _ => None, - } - } - - pub fn to_f64(&self) -> Option { - match self { - ScalarValue::Int(n) => Some(*n as f64), - ScalarValue::Uint(n) => Some(*n as f64), - ScalarValue::F64(n) => Some(*n), - ScalarValue::Counter(n) => Some(*n as f64), - ScalarValue::Timestamp(n) => Some(*n as f64), - _ => None, - } - } -} - -#[derive(PartialEq, Debug, Clone)] -pub enum OpType { - Make(ObjType), - /// Perform a deletion, expanding the operation to cover `n` deletions (multiOp). - Del(NonZeroU32), - Inc(i64), - Set(ScalarValue), - MultiSet(ScalarValues), -} - -#[derive(PartialEq, Debug, Clone)] -pub struct Op { - pub action: OpType, - pub obj: ObjectId, - pub key: Key, - pub pred: Vec, - pub insert: bool, -} - -impl Op { - pub fn primitive_value(&self) -> Option { - match &self.action { - OpType::Set(v) => Some(v.clone()), - OpType::Inc(i) => Some(ScalarValue::Int(*i)), - _ => None, - } - } - - pub fn obj_type(&self) -> Option { - match self.action { - OpType::Make(o) => Some(o), - _ => None, - } - } - - pub fn to_i64(&self) -> Option { - self.primitive_value().as_ref().and_then(|v| v.to_i64()) - } -} - -#[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord, Copy)] -pub struct ChangeHash(pub [u8; 32]); - -impl fmt::Debug for ChangeHash { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("ChangeHash") - .field(&hex::encode(&self.0)) - .finish() - } -} - -// The Diff Structure Maps on to the Patch Diffs the Frontend is expecting -// Diff { -// object_id: 123, -// obj_type: map, -// props: { -// "key1": { -// "10@abc123": -// DiffLink::Diff(Diff { -// object_id: 444, -// obj_type: list, -// edits: [ DiffEdit { ... } ], -// props: { ... }, -// }) -// } -// "key2": { -// "11@abc123": -// DiffLink::Value(DiffValue { -// value: 10, -// datatype: "counter" -// } -// } -// } -// } - -#[derive(Debug, PartialEq, Clone)] -pub enum Diff { - Map(MapDiff), - Table(TableDiff), - List(ListDiff), - Text(TextDiff), - Value(ScalarValue), - Cursor(CursorDiff), -} - -impl Diff { - pub fn object_type(&self) -> Option { - match self { - Diff::Map(_) => Some(ObjType::Map), - Diff::Table(_) => Some(ObjType::Table), - Diff::List(_) => Some(ObjType::List), - Diff::Text(_) => Some(ObjType::Text), - Diff::Value(_) => None, - Diff::Cursor(_) => None, - } - } - - pub fn object_id(&self) -> Option { - match self { - Diff::Map(mapdiff) => Some(mapdiff.object_id.clone()), - Diff::Table(tablediff) => Some(tablediff.object_id.clone()), - Diff::List(listdiff) => Some(listdiff.object_id.clone()), - Diff::Text(textdiff) => Some(textdiff.object_id.clone()), - Diff::Value(..) => None, - Diff::Cursor(CursorDiff { object_id, .. }) => Some(object_id.clone()), - } - } -} - -#[derive(Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct MapDiff { - pub object_id: ObjectId, - pub props: HashMap>, -} - -#[derive(Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct TableDiff { - pub object_id: ObjectId, - pub props: HashMap>, -} - -#[derive(Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ListDiff { - pub object_id: ObjectId, - pub edits: Vec, -} - -#[derive(Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct TextDiff { - pub object_id: ObjectId, - pub edits: Vec, -} - -#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ObjDiff { - pub object_id: ObjectId, - #[serde(rename = "type")] - pub obj_type: ObjType, -} - -#[derive(Debug, PartialEq, Clone)] -pub struct CursorDiff { - pub object_id: ObjectId, - pub elem_id: OpId, - pub index: u32, -} - -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase", tag = "action")] -pub enum DiffEdit { - /// Describes the insertion of a single element into a list or text object. - /// The element can be a nested object. - #[serde(rename = "insert", rename_all = "camelCase")] - SingleElementInsert { - /// the list index at which to insert the new element - index: u64, - /// the unique element ID of the new list element - elem_id: ElementId, - /// ID of the operation that assigned this value - op_id: OpId, - value: Diff, - }, - /// Describes the insertion of a consecutive sequence of primitive values into - /// a list or text object. In the case of text, the values are strings (each - /// character as a separate string value). Each inserted value is given a - /// consecutive element ID: starting with `elemId` for the first value, the - /// subsequent values are given elemIds with the same actor ID and incrementing - /// counters. To insert non-primitive values, use SingleInsertEdit. - - /// We need to use a separate struct here to implement custom - /// serialization and deserialization logic (due to the presence - /// of the datatype field) - #[serde(rename = "multi-insert")] - MultiElementInsert(MultiElementInsert), - - /// Describes the update of the value or nested object at a particular index - /// of a list or text object. In the case where there are multiple conflicted - /// values at the same list index, multiple UpdateEdits with the same index - /// (but different opIds) appear in the edits array of ListDiff. - #[serde(rename_all = "camelCase")] - Update { - /// the list index to update - index: u64, - /// ID of the operation that assigned this value - op_id: OpId, - value: Diff, - }, - #[serde(rename_all = "camelCase")] - Remove { index: u64, count: u64 }, -} - -#[derive(Debug, PartialEq, Clone)] -pub struct MultiElementInsert { - /// the list index at which to insert the first value - pub index: u64, - /// the unique ID of the first inserted element - pub elem_id: ElementId, - pub values: ScalarValues, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct Patch { - #[serde(skip_serializing_if = "Option::is_none", default)] - pub actor: Option, - #[serde(skip_serializing_if = "Option::is_none", default)] - pub seq: Option, - pub clock: HashMap, - pub deps: Vec, - pub max_op: u64, - pub pending_changes: usize, - // pub can_undo: bool, - // pub can_redo: bool, - // pub version: u64, - pub diffs: RootDiff, -} - -/// A custom MapDiff that implicitly has the object_id Root and is a map object. -#[derive(Debug, PartialEq, Clone, Default)] -pub struct RootDiff { - pub props: HashMap>, -} - -#[derive(Deserialize, Serialize, Debug, Clone)] -pub struct Change { - #[serde(rename = "ops")] - pub operations: Vec, - #[serde(rename = "actor")] - pub actor_id: ActorId, - #[serde(skip_serializing_if = "Option::is_none", default)] - pub hash: Option, - pub seq: u64, - #[serde(rename = "startOp")] - pub start_op: u64, - pub time: i64, - pub message: Option, - pub deps: Vec, - #[serde(skip_serializing_if = "Vec::is_empty", default = "Default::default")] - pub extra_bytes: Vec, -} - -impl PartialEq for Change { - // everything but hash (its computed and not always present) - fn eq(&self, other: &Self) -> bool { - self.operations == other.operations - && self.actor_id == other.actor_id - && self.seq == other.seq - && self.start_op == other.start_op - && self.time == other.time - && self.message == other.message - && self.deps == other.deps - && self.extra_bytes == other.extra_bytes - } -} - -impl Change { - pub fn op_id_of(&self, index: u64) -> Option { - if let Ok(index_usize) = usize::try_from(index) { - if index_usize < self.operations.len() { - return Some(self.actor_id.op_id_at(self.start_op + index)); - } - } - None - } -} diff --git a/automerge-protocol/src/serde_impls/cursor_diff.rs b/automerge-protocol/src/serde_impls/cursor_diff.rs deleted file mode 100644 index d0154d4f..00000000 --- a/automerge-protocol/src/serde_impls/cursor_diff.rs +++ /dev/null @@ -1,17 +0,0 @@ -use serde::{ser::SerializeStruct, Serialize, Serializer}; - -use crate::CursorDiff; - -impl Serialize for CursorDiff { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut map = serializer.serialize_struct("CursorDiff", 4)?; - map.serialize_field("refObjectId", &self.object_id)?; - map.serialize_field("elemId", &self.elem_id)?; - map.serialize_field("index", &self.index)?; - map.serialize_field("datatype", "cursor")?; - map.end() - } -} diff --git a/automerge-protocol/src/serde_impls/diff.rs b/automerge-protocol/src/serde_impls/diff.rs deleted file mode 100644 index aa283a1e..00000000 --- a/automerge-protocol/src/serde_impls/diff.rs +++ /dev/null @@ -1,416 +0,0 @@ -use std::{collections::HashMap, fmt}; - -use serde::{ - de, - de::{Error, MapAccess}, - ser::SerializeStruct, - Deserialize, Deserializer, Serialize, Serializer, -}; - -use super::read_field; -use crate::{ - CursorDiff, DataType, Diff, DiffEdit, ListDiff, MapDiff, MapType, ObjType, ObjectId, OpId, - ScalarValue, SequenceType, TableDiff, TextDiff, -}; - -impl Serialize for Diff { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match self { - Diff::Map(diff) => { - let mut op = serializer.serialize_struct("MapDiff", 3)?; - op.serialize_field("objectId", &diff.object_id)?; - op.serialize_field("type", &MapType::Map)?; - op.serialize_field("props", &diff.props)?; - op.end() - } - Diff::Table(diff) => { - let mut op = serializer.serialize_struct("TableDiff", 3)?; - op.serialize_field("objectId", &diff.object_id)?; - op.serialize_field("type", &MapType::Table)?; - op.serialize_field("props", &diff.props)?; - op.end() - } - Diff::List(diff) => { - let mut op = serializer.serialize_struct("ListDiff", 3)?; - op.serialize_field("objectId", &diff.object_id)?; - op.serialize_field("type", &SequenceType::List)?; - op.serialize_field("edits", &diff.edits)?; - op.end() - } - Diff::Text(diff) => { - let mut op = serializer.serialize_struct("TextDiff", 3)?; - op.serialize_field("objectId", &diff.object_id)?; - op.serialize_field("type", &SequenceType::Text)?; - op.serialize_field("edits", &diff.edits)?; - op.end() - } - Diff::Value(val) => match val { - ScalarValue::Counter(_) => { - let mut op = serializer.serialize_struct("Value", 3)?; - op.serialize_field("value", &val)?; - op.serialize_field("datatype", "counter")?; - op.serialize_field("type", "value")?; - op.end() - } - ScalarValue::Timestamp(_) => { - let mut op = serializer.serialize_struct("Value", 3)?; - op.serialize_field("value", &val)?; - op.serialize_field("datatype", "timestamp")?; - op.serialize_field("type", "value")?; - op.end() - } - ScalarValue::Int(_) => { - let mut op = serializer.serialize_struct("Value", 3)?; - op.serialize_field("value", &val)?; - op.serialize_field("type", "value")?; - op.serialize_field("datatype", "int")?; - op.end() - } - ScalarValue::Uint(_) => { - let mut op = serializer.serialize_struct("Value", 3)?; - op.serialize_field("value", &val)?; - op.serialize_field("type", "value")?; - op.serialize_field("datatype", "uint")?; - op.end() - } - ScalarValue::F64(_) => { - let mut op = serializer.serialize_struct("Value", 3)?; - op.serialize_field("value", &val)?; - op.serialize_field("type", "value")?; - op.serialize_field("datatype", "float64")?; - op.end() - } - _ => { - let mut op = serializer.serialize_struct("Value", 2)?; - op.serialize_field("value", &val)?; - op.serialize_field("type", "value")?; - op.end() - } - }, - Diff::Cursor(diff) => diff.serialize(serializer), - } - } -} - -enum RawDiffType { - Value, - Map, - Text, - List, - Table, -} - -// Same idea as RawOpType -impl<'de> Deserialize<'de> for RawDiffType { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - const VARIANTS: &[&str] = &["value", "map", "text", "list", "table"]; - // TODO: Probably more efficient to deserialize to a `&str` - let raw_type = String::deserialize(deserializer)?; - match raw_type.as_str() { - "value" => Ok(RawDiffType::Value), - "map" => Ok(RawDiffType::Map), - "text" => Ok(RawDiffType::Text), - "list" => Ok(RawDiffType::List), - "table" => Ok(RawDiffType::Table), - other => Err(Error::unknown_variant(other, VARIANTS)), - } - } -} - -impl RawDiffType { - fn obj_type(&self) -> Option { - match self { - RawDiffType::Map => Some(ObjType::Map), - RawDiffType::Table => Some(ObjType::Table), - RawDiffType::List => Some(ObjType::List), - RawDiffType::Text => Some(ObjType::Text), - RawDiffType::Value => None, - } - } -} - -impl<'de> Deserialize<'de> for Diff { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct DiffVisitor; - const FIELDS: &[&str] = &[ - "edits", - "objType", - "objectId", - "props", - "value", - "datatype", - "refObjectId", - "elemId", - "index", - ]; - - impl<'de> de::Visitor<'de> for DiffVisitor { - type Value = Diff; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("A diff") - } - - fn visit_map(self, mut map: V) -> Result - where - V: MapAccess<'de>, - { - let mut edits: Option> = None; - let mut object_id: Option = None; - let mut diff_type: Option = None; - //let mut obj_type: Option = None; - let mut props: Option>> = None; - let mut value: Option = None; - let mut datatype: Option = None; - let mut elem_id: Option = None; - let mut index: Option = None; - let mut ref_object_id: Option = None; - - while let Some(field) = map.next_key::()? { - match field.as_ref() { - "edits" => read_field("edits", &mut edits, &mut map)?, - "objectId" => read_field("objectId", &mut object_id, &mut map)?, - "type" => read_field("type", &mut diff_type, &mut map)?, - "props" => read_field("props", &mut props, &mut map)?, - "value" => read_field("value", &mut value, &mut map)?, - "datatype" => read_field("datatype", &mut datatype, &mut map)?, - "refObjectId" => read_field("refObjectId", &mut ref_object_id, &mut map)?, - "elemId" => read_field("elemId", &mut elem_id, &mut map)?, - "index" => read_field("index", &mut index, &mut map)?, - _ => return Err(Error::unknown_field(&field, FIELDS)), - } - } - if value.is_some() || datatype.is_some() { - let datatype = datatype.unwrap_or(DataType::Undefined); - match datatype { - DataType::Cursor => { - let ref_object_id = - ref_object_id.ok_or_else(|| Error::missing_field("refObjectId"))?; - let elem_id = elem_id.ok_or_else(|| Error::missing_field("elemId"))?; - let index = index.ok_or_else(|| Error::missing_field("index"))?; - Ok(Diff::Cursor(CursorDiff { - object_id: ref_object_id, - elem_id, - index, - })) - } - _ => { - let value = value.ok_or_else(|| Error::missing_field("value"))?; - let value_with_datatype = maybe_add_datatype_to_value(value, datatype); - Ok(Diff::Value(value_with_datatype)) - } - } - } else { - let object_id = object_id.ok_or_else(|| Error::missing_field("objectId"))?; - let diff_type = diff_type.ok_or_else(|| Error::missing_field("type"))?; - match diff_type.obj_type() { - Some(obj_type) => match obj_type { - ObjType::List => { - let edits = edits.ok_or_else(|| Error::missing_field("edits"))?; - Ok(Diff::List(ListDiff { - object_id, - edits, - })) - }, - ObjType::Text => { - let edits = edits.ok_or_else(|| Error::missing_field("edits"))?; - Ok(Diff::Text(TextDiff { - object_id, - edits, - })) - }, - ObjType::Map => { - let props = props.ok_or_else(|| Error::missing_field("props"))?; - Ok(Diff::Map(MapDiff{ - object_id, - props, - })) - }, - ObjType::Table => { - let props = props.ok_or_else(|| Error::missing_field("props"))?; - Ok(Diff::Table(TableDiff{ - object_id, - props, - })) - }, - } - None => Err(Error::custom("'type' field must be one of ['list', 'text', 'table', 'map'] for an object diff")) - } - - //if let Some(props) = props { - //match obj_type { - //ObjType::Map(map_type) => Ok(Diff::Map(MapDiff { - //object_id, - //obj_type: map_type, - //props, - //})), - //_ => Err(Error::invalid_value(Unexpected::Str(&obj_type.to_string()), &"'map' or 'table'")) - //} - //} else if let Some(edits) = edits { - //match obj_type { - //ObjType::Sequence(seq_type) => { - //let edits = edits.ok_or_else(|| Error::missing_field("edits"))?; - //Ok(Diff::Seq(SeqDiff { - //object_id, - //obj_type: seq_type, - //edits, - //})) - //} - //_ => Err(Error::invalid_value(Unexpected::Str(&obj_type.to_string()), &"'list' or 'text'")) - //} - //} else { - //Ok(Diff::Unchanged(ObjDiff { - //object_id, - //obj_type, - //})) - //} - } - } - } - deserializer.deserialize_struct("Diff", &FIELDS, DiffVisitor) - } -} - -fn maybe_add_datatype_to_value(value: ScalarValue, datatype: DataType) -> ScalarValue { - match datatype { - DataType::Counter => { - if let Some(n) = value.to_i64() { - ScalarValue::Counter(n) - } else { - value - } - } - DataType::Timestamp => { - if let Some(n) = value.to_i64() { - ScalarValue::Timestamp(n) - } else { - value - } - } - _ => value, - } -} - -#[cfg(test)] -mod tests { - use std::{convert::TryInto, str::FromStr}; - - use maplit::hashmap; - - use crate::{CursorDiff, Diff, ListDiff, MapDiff, ObjectId, OpId}; - - #[test] - fn map_diff_serialization_round_trip() { - let json = serde_json::json!({ - "objectId": "1@6121f8757d5d46609b665218b2b3a141", - "type": "map", - "props": { - "key": { - "1@4a093244de2b4fd0a4203724e15dfc16": { - "type": "value", - "value": "value", - } - } - } - }); - let diff = Diff::Map(MapDiff { - object_id: ObjectId::from_str("1@6121f8757d5d46609b665218b2b3a141").unwrap(), - props: hashmap! { - "key".to_string() => hashmap!{ - OpId::from_str("1@4a093244de2b4fd0a4203724e15dfc16").unwrap() => "value".into() - } - }, - }); - - assert_eq!(json, serde_json::to_value(diff.clone()).unwrap()); - assert_eq!(serde_json::from_value::(json).unwrap(), diff); - } - - #[test] - fn seq_diff_serialization_round_trip() { - let json = serde_json::json!({ - "objectId": "1@6121f8757d5d46609b665218b2b3a141", - "type": "list", - "edits": [] - //{ - //"action": "insert", - //"index": 1, - //"elemId": "1@6121f8757d5d46609b665218b2b3a141", - //"value": {"type": "value", "value": 1}, - //}, - //{ - //"action": "multi-insert", - //"index": 1, - //"opId": "1@6121f8757d5d46609b665218b2b3a141", - //"values": [1, 2], - //}, - //{ - //"action": "update", - //"index": 1, - //"opId": "1@6121f8757d5d46609b665218b2b3a141", - //"value": {"type": "value", "value": 1}, - //}, - //{ - //"action": "remove", - //"index": 1, - //"count": 2, - //} - //], - }); - let diff = Diff::List(ListDiff { - object_id: ObjectId::from_str("1@6121f8757d5d46609b665218b2b3a141").unwrap(), - edits: vec![], //DiffEdit::SingleElementInsert{ - //index: 1, - //elem_id: ElementId::from_str("1@6121f8757d5d46609b665218b2b3a141").unwrap(), - //value: Diff::Value(1.into()), - //}, - //DiffEdit::MultiElementInsert{ - //index: 1, - //first_opid: OpId::from_str("1@6121f8757d5d46609b665218b2b3a141").unwrap(), - //values: vec![ - //1.into(), - //2.into(), - //], - //}, - //DiffEdit::Update{ - //index: 1, - //value: Diff::Value(1.into()), - //opid: OpId::from_str("1@6121f8757d5d46609b665218b2b3a141").unwrap(), - //}, - //DiffEdit::Remove { - //index: 1, - //count: 2, - //} - //] - }); - - assert_eq!(json, serde_json::to_value(diff.clone()).unwrap()); - assert_eq!(serde_json::from_value::(json).unwrap(), diff); - } - - #[test] - fn cursor_diff_serialization_round_trip() { - let json = serde_json::json!({ - "datatype": "cursor", - "refObjectId": "1@4a093244de2b4fd0a4203724e15dfc16", - "elemId": "2@4a093244de2b4fd0a4203724e15dfc16", - "index": 0, - }); - let diff = Diff::Cursor(CursorDiff { - object_id: "1@4a093244de2b4fd0a4203724e15dfc16".try_into().unwrap(), - elem_id: "2@4a093244de2b4fd0a4203724e15dfc16".try_into().unwrap(), - index: 0, - }); - assert_eq!(json, serde_json::to_value(diff.clone()).unwrap()); - assert_eq!(serde_json::from_value::(json).unwrap(), diff); - } -} diff --git a/automerge-protocol/src/serde_impls/key.rs b/automerge-protocol/src/serde_impls/key.rs deleted file mode 100644 index 95efa371..00000000 --- a/automerge-protocol/src/serde_impls/key.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::str::FromStr; - -use serde::{Deserialize, Deserializer}; - -use crate::{ElementId, Key}; - -impl<'de> Deserialize<'de> for Key { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - if let Ok(eid) = ElementId::from_str(&s) { - Ok(Key::Seq(eid)) - } else { - Ok(Key::Map(s)) - } - } -} diff --git a/automerge-protocol/src/serde_impls/multi_element_insert.rs b/automerge-protocol/src/serde_impls/multi_element_insert.rs deleted file mode 100644 index ce2148ee..00000000 --- a/automerge-protocol/src/serde_impls/multi_element_insert.rs +++ /dev/null @@ -1,84 +0,0 @@ -use std::convert::TryInto; - -use serde::{ - de::{Error, MapAccess, Visitor}, - ser::{SerializeStruct, Serializer}, - Deserialize, Serialize, -}; - -use crate::{ - serde_impls::read_field, DataType, ElementId, MultiElementInsert, ScalarValue, ScalarValues, -}; - -impl Serialize for MultiElementInsert { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - //serializer.serialize_newtype_variant("foo", 0, "bar", value) - let datatype = self.values.as_numerical_datatype(); - let mut ss = - serializer.serialize_struct("MultiElementInsert", datatype.map_or(4, |_| 5))?; - ss.serialize_field("index", &self.index)?; - ss.serialize_field("elemId", &self.elem_id)?; - if let Some(datatype) = datatype { - ss.serialize_field("datatype", &datatype)?; - } - ss.serialize_field("values", &self.values.vec)?; - ss.end() - } -} - -impl<'de> Deserialize<'de> for MultiElementInsert { - fn deserialize(_: D) -> Result - where - D: serde::Deserializer<'de>, - { - const FIELDS: &[&str] = &["index", "elem_id", "datatype", "values"]; - struct MultiElementInsertVisitor; - impl<'de> Visitor<'de> for MultiElementInsertVisitor { - type Value = MultiElementInsert; - - fn visit_map(self, mut map: V) -> Result - where - V: MapAccess<'de>, - { - let mut index: Option = None; - let mut elem_id: Option = None; - let mut datatype: Option = None; - let mut values: Option> = None; - - while let Some(field) = map.next_key::()? { - match field.as_ref() { - "index" => read_field("index", &mut index, &mut map)?, - "elemId" => read_field("elemId", &mut elem_id, &mut map)?, - "datatype" => read_field("datatype", &mut datatype, &mut map)?, - "values" => read_field("values", &mut values, &mut map)?, - _ => return Err(Error::unknown_field(&field, FIELDS)), - } - } - - let index = index.ok_or_else(|| Error::missing_field("index"))?; - let elem_id = elem_id.ok_or_else(|| Error::missing_field("elemId"))?; - let values = values.ok_or_else(|| Error::missing_field("values"))?; - let values = ScalarValues::from_values_and_datatype::(values, datatype)?; - - Ok(MultiElementInsert { - index, - elem_id, - values, - }) - } - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("A MultiElementInsert") - } - } - - Ok(MultiElementInsert { - index: 0, - elem_id: crate::ElementId::Head, - values: vec![ScalarValue::Str("one".into())].try_into().unwrap(), - }) - } -} diff --git a/automerge-protocol/src/serde_impls/root_diff.rs b/automerge-protocol/src/serde_impls/root_diff.rs deleted file mode 100644 index 77a9c611..00000000 --- a/automerge-protocol/src/serde_impls/root_diff.rs +++ /dev/null @@ -1,103 +0,0 @@ -use std::fmt; - -use serde::{ - de, - de::{MapAccess, Unexpected, Visitor}, - ser::SerializeMap, - Deserialize, Deserializer, Serialize, Serializer, -}; - -use crate::{MapType, ObjectId, RootDiff}; - -impl Serialize for RootDiff { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut map = serializer.serialize_map(Some(3))?; - map.serialize_entry("objectId", &ObjectId::Root)?; - map.serialize_entry("type", &MapType::Map)?; - map.serialize_entry("props", &self.props)?; - map.end() - } -} - -impl<'de> Deserialize<'de> for RootDiff { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - #[serde(field_identifier, rename_all = "camelCase")] - enum Field { - ObjectId, - #[serde(rename = "type")] - ObjectType, - Props, - } - - struct RootDiffVisitor; - - const FIELDS: &[&str] = &["objectId", "type", "props"]; - impl<'de> Visitor<'de> for RootDiffVisitor { - type Value = RootDiff; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("struct RootDiff") - } - - fn visit_map(self, mut map: V) -> Result - where - V: MapAccess<'de>, - { - let mut object_id = None; - let mut object_type = None; - let mut props = None; - - while let Some(key) = map.next_key()? { - match key { - Field::ObjectId => { - if object_id.is_some() { - return Err(de::Error::duplicate_field("objectId")); - } - object_id = Some(map.next_value()?); - } - Field::ObjectType => { - if object_type.is_some() { - return Err(de::Error::duplicate_field("type")); - } - object_type = Some(map.next_value()?) - } - Field::Props => { - if props.is_some() { - return Err(de::Error::duplicate_field("props")); - } - props = Some(map.next_value()?) - } - } - } - - let object_id: ObjectId = - object_id.ok_or_else(|| de::Error::missing_field("objectId"))?; - let object_type: MapType = - object_type.ok_or_else(|| de::Error::missing_field("type"))?; - let props = props.ok_or_else(|| de::Error::missing_field("props"))?; - - if let ObjectId::Id(opid) = object_id { - return Err(de::Error::invalid_value( - Unexpected::Str(&opid.to_string()), - &"_root", - )); - } - if object_type != MapType::Map { - // currently only two types of map so must be a table - return Err(de::Error::invalid_value(Unexpected::Str("table"), &"map")); - } - - Ok(RootDiff { props }) - } - } - - deserializer.deserialize_struct("RootDiff", &FIELDS, RootDiffVisitor) - } -} diff --git a/automerge-protocol/src/utility_impls/actor_id.rs b/automerge-protocol/src/utility_impls/actor_id.rs deleted file mode 100644 index cafb5544..00000000 --- a/automerge-protocol/src/utility_impls/actor_id.rs +++ /dev/null @@ -1,39 +0,0 @@ -use std::{convert::TryFrom, fmt, str::FromStr}; - -use crate::{error::InvalidActorId, ActorId}; - -impl TryFrom<&str> for ActorId { - type Error = InvalidActorId; - - fn try_from(s: &str) -> Result { - hex::decode(s) - .map(ActorId) - .map_err(|_| InvalidActorId(s.into())) - } -} - -impl From<&[u8]> for ActorId { - fn from(b: &[u8]) -> Self { - ActorId(b.to_vec()) - } -} - -impl From> for ActorId { - fn from(b: Vec) -> Self { - ActorId(b) - } -} - -impl FromStr for ActorId { - type Err = InvalidActorId; - - fn from_str(s: &str) -> Result { - ActorId::try_from(s) - } -} - -impl fmt::Display for ActorId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.to_hex_string()) - } -} diff --git a/automerge-protocol/src/utility_impls/change_hash.rs b/automerge-protocol/src/utility_impls/change_hash.rs deleted file mode 100644 index 8cae3bd9..00000000 --- a/automerge-protocol/src/utility_impls/change_hash.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::convert::TryFrom; - -use crate::{error::InvalidChangeHashSlice, ChangeHash}; - -impl TryFrom<&[u8]> for ChangeHash { - type Error = InvalidChangeHashSlice; - - fn try_from(bytes: &[u8]) -> Result { - if bytes.len() != 32 { - Err(InvalidChangeHashSlice(Vec::from(bytes))) - } else { - let mut array = [0; 32]; - array.copy_from_slice(bytes); - Ok(ChangeHash(array)) - } - } -} diff --git a/automerge-protocol/src/utility_impls/diff.rs b/automerge-protocol/src/utility_impls/diff.rs deleted file mode 100644 index 7c6ba6b9..00000000 --- a/automerge-protocol/src/utility_impls/diff.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::{Diff, ScalarValue}; - -impl From<&ScalarValue> for Diff { - fn from(v: &ScalarValue) -> Self { - Diff::Value(v.clone()) - } -} - -impl From for Diff { - fn from(v: ScalarValue) -> Self { - Diff::Value(v) - } -} - -impl From<&str> for Diff { - fn from(s: &str) -> Self { - Diff::Value(s.into()) - } -} diff --git a/automerge-protocol/src/utility_impls/mod.rs b/automerge-protocol/src/utility_impls/mod.rs deleted file mode 100644 index 6ed4731c..00000000 --- a/automerge-protocol/src/utility_impls/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -mod actor_id; -mod change_hash; -mod diff; -mod element_id; -mod key; -mod object_id; -mod opid; -mod scalar_value; diff --git a/automerge-protocol/src/utility_impls/scalar_value.rs b/automerge-protocol/src/utility_impls/scalar_value.rs deleted file mode 100644 index 8c7a541a..00000000 --- a/automerge-protocol/src/utility_impls/scalar_value.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::fmt; - -use crate::ScalarValue; - -impl From<&str> for ScalarValue { - fn from(s: &str) -> Self { - ScalarValue::Str(s.into()) - } -} - -impl From for ScalarValue { - fn from(n: i64) -> Self { - ScalarValue::Int(n) - } -} - -impl From for ScalarValue { - fn from(n: u64) -> Self { - ScalarValue::Uint(n) - } -} - -impl From for ScalarValue { - fn from(n: i32) -> Self { - ScalarValue::Int(n as i64) - } -} - -impl From for ScalarValue { - fn from(b: bool) -> Self { - ScalarValue::Boolean(b) - } -} - -impl From for ScalarValue { - fn from(c: char) -> Self { - ScalarValue::Str(c.to_string()) - } -} - -impl fmt::Display for ScalarValue { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ScalarValue::Bytes(b) => write!(f, "\"{:?}\"", b), - ScalarValue::Str(s) => write!(f, "\"{}\"", s), - ScalarValue::Int(i) => write!(f, "{}", i), - ScalarValue::Uint(i) => write!(f, "{}", i), - ScalarValue::F64(n) => write!(f, "{:.324}", n), - ScalarValue::Counter(c) => write!(f, "Counter: {}", c), - ScalarValue::Timestamp(i) => write!(f, "Timestamp: {}", i), - ScalarValue::Boolean(b) => write!(f, "{}", b), - ScalarValue::Null => write!(f, "null"), - ScalarValue::Cursor(elemid) => write!(f, "Cursor: {}", elemid), - } - } -} diff --git a/automerge-protocol/tests/serde_round_trip.rs b/automerge-protocol/tests/serde_round_trip.rs deleted file mode 100644 index 154a1337..00000000 --- a/automerge-protocol/tests/serde_round_trip.rs +++ /dev/null @@ -1,61 +0,0 @@ -extern crate automerge_protocol as amp; -use maplit::hashmap; - -// This was not caught in the proptests -#[test] -fn test_msgpack_roundtrip_diff() { - let actor = amp::ActorId::from_bytes("bd1850df21004038a8141a98473ff142".as_bytes()); - let diff = amp::RootDiff { - props: hashmap! { - "bird".into() => hashmap! { - actor.op_id_at(1) => "magpie".into() - } - }, - }; - let serialized = rmp_serde::to_vec_named(&diff).unwrap(); - let deserialized: amp::RootDiff = rmp_serde::from_slice(&serialized).unwrap(); - assert_eq!(diff, deserialized); -} - -#[test] -fn patch_roundtrip() { - let patch_json = r#"{ - "clock": { - "7b7723afd9e6480397a4d467b7693156": 1 - }, - "deps": [ - "822845b4bac583c5fc67fb60937cfb814cd79d85e8dfdbdafc75424ec573d898" - ], - "maxOp": 4, - "pendingChanges": 0, - "diffs": { - "objectId": "_root", - "type": "map", - "props": { - "todos": { - "1@7b7723afd9e6480397a4d467b7693156": { - "objectId": "1@7b7723afd9e6480397a4d467b7693156", - "type": "list", - "edits": [ - { - "action": "multi-insert", - "index": 0, - "elemId": "2@7b7723afd9e6480397a4d467b7693156", - "datatype": "int", - "values": [ - 1, - 2, - 3 - ] - } - ] - } - } - } - } -}"#; - let patch: amp::Patch = serde_json::from_str(patch_json).unwrap(); - let new_patch_json = serde_json::to_string_pretty(&patch).unwrap(); - let new_patch: amp::Patch = serde_json::from_str(&new_patch_json).unwrap(); - assert_eq!(patch, new_patch); -} diff --git a/automerge-protocol/tests/serde_round_trip_proptest.proptest-regressions b/automerge-protocol/tests/serde_round_trip_proptest.proptest-regressions deleted file mode 100644 index 0a784da0..00000000 --- a/automerge-protocol/tests/serde_round_trip_proptest.proptest-regressions +++ /dev/null @@ -1,8 +0,0 @@ -# Seeds for failure cases proptest has generated in the past. It is -# automatically read and these particular cases re-run before any -# novel cases are generated. -# -# It is recommended to check this file in to source control so that -# everyone who runs the test benefits from these saved cases. -cc 02e8e182d4b700f74561c0138ed7b768a2039296c69f06abb81457cca6f46466 # shrinks to change = UncompressedChange { operations: [Op { action: Set(F64(70479975446914830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0)), obj: Root, key: Seq(ID(4852513845@ad999170f0589bb21da7bdd579bf2b1c9b2e21f10ec5f4b5820706747decdfc1)), pred: [14606136356063527063@a4eeade829979d5725f346030ccb664fb773e2ef771deb542fa20bfc0aeee693, 10134556369421082380@2541103e1ec34f51a34c0f4080ccd24535ff133b6c0cde0598bbe9246ab7c2c2, 11547931935572099531@8f3c2ff498e7e081371444ca4cffc1fae9f3525350e03dfd7f30b26aff197465, 1472714774316515586@a949a7d84df845fdabf586737d091b004ca5c0a3885aa64d50893e604bea6f94], insert: false }], actor_id: ActorID([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), seq: 0, start_op: 0, time: 0, message: None, deps: [], extra_bytes: [] } -cc c7fec71a881691e444691f7c01beee60578ec3837726f603b6dee49c55949a88 # shrinks to change = UncompressedChange { operations: [Op { action: Set(F32(-14.15412)), obj: Root, key: Map(""), pred: [10937470399287725475@1f265df37b46fe1f35746076b0ac578a99cbd53ada995cbb662c19a2f37f1886, 10507544589692728831@a3edc519034aa28a74e56c983282a3585548525bc49038f9517e69b7bc7d4644], insert: false }], actor_id: ActorID("0000000000000000000000000000000000000000000000000000000000000000"), hash: None, seq: 0, start_op: 0, time: 0, message: None, deps: [], extra_bytes: [] } diff --git a/automerge-protocol/tests/serde_round_trip_proptest.rs b/automerge-protocol/tests/serde_round_trip_proptest.rs deleted file mode 100644 index f0e9c5ce..00000000 --- a/automerge-protocol/tests/serde_round_trip_proptest.rs +++ /dev/null @@ -1,127 +0,0 @@ -extern crate automerge_protocol as amp; -use std::num::NonZeroU32; - -use proptest::prelude::*; - -fn arb_objtype() -> impl Strategy { - prop_oneof![ - Just(amp::ObjType::Map), - Just(amp::ObjType::Table), - Just(amp::ObjType::List), - Just(amp::ObjType::Text), - ] -} - -fn arb_scalar_value() -> impl Strategy { - prop_oneof![ - any::().prop_map(amp::ScalarValue::Str), - any::().prop_map(amp::ScalarValue::Int), - //This is necessary because we don't support integers larger than i64 in the JSON protocol - //any::().prop_map(|i| amp::ScalarValue::Uint(i as u64)), - any::().prop_map(amp::ScalarValue::Uint), - any::().prop_map(amp::ScalarValue::F64), - any::().prop_map(amp::ScalarValue::Counter), - any::().prop_map(amp::ScalarValue::Timestamp), - any::().prop_map(amp::ScalarValue::Boolean), - Just(amp::ScalarValue::Null), - ] -} - -fn arb_optype() -> impl Strategy { - prop_oneof![ - arb_objtype().prop_map(amp::OpType::Make), - any::().prop_map(|u| amp::OpType::Del(NonZeroU32::new(u + 1).unwrap())), - any::().prop_map(amp::OpType::Inc), - arb_scalar_value().prop_map(amp::OpType::Set), - ] -} - -fn arb_actorid() -> impl Strategy { - proptest::collection::vec(any::(), 32).prop_map(|bytes| amp::ActorId::from_bytes(&bytes)) -} - -fn arb_opid() -> impl Strategy { - (any::(), arb_actorid()).prop_map(|(seq, actor)| amp::OpId::new(seq, &actor)) -} - -fn arb_objid() -> impl Strategy { - prop_oneof![ - Just(amp::ObjectId::Root), - arb_opid().prop_map(amp::ObjectId::Id), - ] -} - -fn arb_elemid() -> impl Strategy { - prop_oneof![ - Just(amp::ElementId::Head), - arb_opid().prop_map(amp::ElementId::Id), - ] -} - -fn arb_key() -> impl Strategy { - prop_oneof![ - any::().prop_map(amp::Key::Map), - arb_elemid().prop_map(amp::Key::Seq), - ] -} - -fn arb_changehash() -> impl Strategy { - any::<[u8; 32]>().prop_map(amp::ChangeHash) -} - -prop_compose! { - fn arb_op() - (insert in any::(), - action in arb_optype(), - obj in arb_objid(), - key in arb_key(), - pred in proptest::collection::vec(arb_opid(), 0..10)) -> amp::Op { - amp::Op{ - action, - obj, - key, - pred, - insert, - } - } -} - -prop_compose! { - fn arb_change() - (seq in any::(), - actor_id in arb_actorid(), - start_op in any::(), - time in any::(), - message in proptest::option::of(any::()), - deps in proptest::collection::vec(arb_changehash(), 0..10), - extra_bytes in proptest::collection::vec(any::(), 0..10), - operations in proptest::collection::vec(arb_op(), 0..10)) -> amp::Change { - amp::Change{ - seq, - actor_id, - start_op, - time, - hash: None, - message, - deps, - operations, - extra_bytes - } - } -} - -proptest! { - #[test] - fn test_round_trip_serialization_json(change in arb_change()) { - let serialized = serde_json::to_string(&change)?; - let deserialized: amp::Change = serde_json::from_str(&serialized)?; - prop_assert_eq!(change, deserialized); - } - - #[test] - fn test_round_trip_serialization_msgpack(change in arb_change()) { - let serialized = rmp_serde::to_vec_named(&change).unwrap(); - let deserialized: amp::Change = rmp_serde::from_slice(&serialized)?; - prop_assert_eq!(change, deserialized); - } -} diff --git a/automerge/.gitignore b/automerge/.gitignore deleted file mode 100644 index 2f7896d1..00000000 --- a/automerge/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target/ diff --git a/automerge/Cargo.toml b/automerge/Cargo.toml deleted file mode 100644 index 5909e7c6..00000000 --- a/automerge/Cargo.toml +++ /dev/null @@ -1,47 +0,0 @@ -[package] -name = "automerge" -version = "0.0.2" -authors = ["Alex Good "] -edition = "2018" -license = "MIT" -homepage = "https://github.com/alexjg/automerge-rs" -repository = "https://github.com/alexjg/automerge-rs" -categories = ["data-structures"] -description = "Rust implementation of the Automerge replicated JSON datatype" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -name = "automerge" -bench = false - -[dependencies] -serde = { version = "^1.0", features=["derive"] } -serde_json = "^1.0" -uuid = { version = "^0.8.2", features=["v4"] } -automerge-backend = { path = "../automerge-backend" } -automerge-frontend = { path = "../automerge-frontend" } -automerge-protocol = { path = "../automerge-protocol" } - -[dev-dependencies] -criterion = "0.3.3" -hex = "0.4.3" -pretty_assertions = "0.7.1" -rand = "0.8.2" -test-env-log = { version = "0.2.6", features = ["trace"], default-features = false } -env_logger = "*" -tracing = "0.1.25" -tracing-subscriber = {version = "0.2", features = ["chrono", "env-filter", "fmt"]} -unicode-segmentation = "1.7.1" -maplit = "^1.0.2" - -[[bench]] -name = "crdt_benchmarks" -harness = false - -[[bench]] -name = "sync" -harness = false - -[[bench]] -name = "save_load" -harness = false diff --git a/automerge/benches/crdt_benchmarks.rs b/automerge/benches/crdt_benchmarks.rs deleted file mode 100644 index b8c72cd2..00000000 --- a/automerge/benches/crdt_benchmarks.rs +++ /dev/null @@ -1,197 +0,0 @@ -use std::{collections::HashMap, convert::TryInto, default::Default}; - -use automerge::{Backend, Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use rand::{thread_rng, Rng}; -use unicode_segmentation::UnicodeSegmentation; - -pub fn b1_1(c: &mut Criterion) { - c.bench_function("B1.1 Append N characters", move |b| { - b.iter_batched( - || { - let mut doc1 = Frontend::new(); - let changedoc1 = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(Vec::new()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let mut backend1 = Backend::new(); - let (patch1, _) = backend1.apply_local_change(changedoc1).unwrap(); - doc1.apply_patch(patch1).unwrap(); - - let mut doc2 = Frontend::new(); - let changedoc2 = backend1.get_changes(&[]); - let mut backend2 = Backend::new(); - let patch2 = backend2 - .apply_changes(changedoc2.into_iter().cloned().collect()) - .unwrap(); - doc2.apply_patch(patch2).unwrap(); - - let random_string: String = thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .take(6000) - .map(char::from) - .collect(); - (doc1, backend1, doc2, backend2, random_string) - }, - |(mut doc1, mut backend1, mut doc2, mut backend2, random_string)| { - #[allow(clippy::unit_arg)] - black_box({ - for (index, c) in random_string.chars().enumerate() { - let index: u32 = index.try_into().unwrap(); - let doc1_insert_change = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::insert( - Path::root().key("text").index(index), - c.into(), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let (patch, change_to_send) = - backend1.apply_local_change(doc1_insert_change).unwrap(); - doc1.apply_patch(patch).unwrap(); - - let patch2 = backend2 - .apply_changes(vec![(change_to_send).clone()]) - .unwrap(); - doc2.apply_patch(patch2).unwrap() - } - }) - }, - criterion::BatchSize::SmallInput, - ) - }); -} - -pub fn b1_2(c: &mut Criterion) { - c.bench_function("B1.2 Append string of length N", move |b| { - b.iter_batched( - || { - let mut doc1 = Frontend::new(); - let changedoc1 = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(Vec::new()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let mut backend1 = Backend::new(); - let (patch1, _) = backend1.apply_local_change(changedoc1).unwrap(); - doc1.apply_patch(patch1).unwrap(); - - let mut doc2 = Frontend::new(); - let changedoc2 = backend1.get_changes(&[]); - let mut backend2 = Backend::new(); - let patch2 = backend2 - .apply_changes(changedoc2.into_iter().cloned().collect()) - .unwrap(); - doc2.apply_patch(patch2).unwrap(); - - let random_string: String = thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .take(6000) - .map(char::from) - .collect(); - let chars: Vec<_> = random_string - .graphemes(true) - .map(|s| s.to_owned()) - .collect(); - let text = Value::Text(chars); - (doc1, backend1, doc2, backend2, text) - }, - |(mut doc1, mut backend1, mut doc2, mut backend2, text)| { - #[allow(clippy::unit_arg)] - black_box({ - let doc1_insert_change = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set(Path::root().key("text"), text)) - }) - .unwrap() - .1 - .unwrap(); - let (patch, change_to_send) = - backend1.apply_local_change(doc1_insert_change).unwrap(); - doc1.apply_patch(patch).unwrap(); - - let patch2 = backend2.apply_changes(vec![change_to_send]).unwrap(); - doc2.apply_patch(patch2).unwrap(); - (doc1, backend1, doc2, backend2) - }) - }, - criterion::BatchSize::SmallInput, - ) - }); -} - -pub fn b3_1(c: &mut Criterion) { - c.bench_function("B1.3 20√N clients concurrently set number in Map", |b| { - b.iter_batched( - || { - let n: f64 = 6000.0; - let root_n: i64 = n.sqrt().floor() as i64; - let mut local_doc = Frontend::new(); - let mut local_backend = Backend::new(); - let init_change = local_doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("map"), - Value::Map(HashMap::new()), - )) - }) - .unwrap() - .1 - .unwrap(); - let (patch, init_binchange) = - local_backend.apply_local_change(init_change).unwrap(); - local_doc.apply_patch(patch).unwrap(); - - let other_docs = (1..root_n).map(|_| Frontend::new()); - let updates: Vec = other_docs - .enumerate() - .map(|(index, mut doc)| { - let mut backend = Backend::new(); - let patch = backend.apply_changes(vec![init_binchange.clone()]).unwrap(); - doc.apply_patch(patch).unwrap(); - let change = doc - .change(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("map").key("v"), - Value::Primitive(Primitive::Int(index as i64 + 1)), - )) - }) - .unwrap() - .1 - .unwrap(); - backend.apply_local_change(change).unwrap().1 - }) - .collect(); - (local_doc, local_backend, updates) - }, - |(mut local_doc, mut local_backend, updates)| { - let patch = local_backend.apply_changes(updates).unwrap(); - local_doc.apply_patch(patch) - }, - criterion::BatchSize::SmallInput, - ); - }); -} - -criterion_group! { - name = benches; - config = Criterion::default().sample_size(10); - targets = b1_1, b1_2, b3_1 -} -criterion_main!(benches); diff --git a/automerge/benches/save_load.rs b/automerge/benches/save_load.rs deleted file mode 100644 index 6a815ed4..00000000 --- a/automerge/benches/save_load.rs +++ /dev/null @@ -1,240 +0,0 @@ -use automerge::{Backend, Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; - -fn small_change_backend() -> Backend { - let mut frontend = Frontend::new(); - let mut backend = Backend::new(); - let (_, change) = frontend - .change::<_, _, InvalidChangeRequest>(None, |doc| { - doc.add_change(LocalChange::set( - Path::root().key("a"), - Value::Primitive(Primitive::Str("hello world".to_owned())), - ))?; - Ok(()) - }) - .unwrap(); - backend.apply_local_change(change.unwrap()).unwrap(); - backend -} - -fn medium_change_backend() -> Backend { - let mut change1s = Vec::new(); - let mut change2s = Vec::new(); - - let actor_id = uuid::Uuid::new_v4(); - - let changes1 = vec![LocalChange::set( - Path::root(), - Value::Map( - vec![ - ( - "\u{0}\u{0}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::F64(0.0)), - ]), - ), - ( - "\u{2}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - ]), - ), - ( - "\u{0}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - ]), - ), - ( - "".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Boolean(false)), - ]), - ), - ( - "\u{1}".to_owned(), - Value::Table( - vec![("".to_owned(), Value::Primitive(Primitive::F64(0.0)))] - .into_iter() - .collect(), - ), - ), - ] - .into_iter() - .collect(), - ), - )]; - let changes2 = vec![ - LocalChange::delete(Path::root().key("\u{0}\u{0}")), - LocalChange::delete(Path::root().key("\u{2}")), - LocalChange::delete(Path::root().key("\u{0}")), - LocalChange::delete(Path::root().key("")), - LocalChange::delete(Path::root().key("\u{1}")), - ]; - - let mut backend = Backend::new(); - let mut frontend = Frontend::new_with_timestamper_and_actor_id(Box::new(|| None), actor_id); - let patch = backend.get_patch().unwrap(); - frontend.apply_patch(patch).unwrap(); - - let c = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - for change in &changes1 { - d.add_change(change.clone())? - } - Ok(()) - }) - .unwrap(); - if let (_, Some(change)) = c { - change1s.push(change.clone()); - backend.apply_local_change(change).unwrap(); - } - - let mut frontend = Frontend::new_with_timestamper_and_actor_id(Box::new(|| None), actor_id); - let patch = backend.get_patch().unwrap(); - frontend.apply_patch(patch).unwrap(); - - let c = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - for change in &changes2 { - d.add_change(change.clone())? - } - Ok(()) - }) - .unwrap(); - if let (_, Some(change)) = c { - change2s.push(change.clone()); - backend.apply_local_change(change).unwrap(); - } - backend -} - -fn save_empty(c: &mut Criterion) { - c.bench_function("save an empty backend", |b| { - b.iter_batched( - Backend::new, - |b| black_box(b.save().unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -fn save_small(c: &mut Criterion) { - c.bench_function("save a small history backend", |b| { - b.iter_batched( - small_change_backend, - |b| black_box(b.save().unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -fn save_medium(c: &mut Criterion) { - c.bench_function("save a medium history backend", |b| { - b.iter_batched( - medium_change_backend, - |b| black_box(b.save().unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -fn load_empty(c: &mut Criterion) { - c.bench_function("load an empty backend", |b| { - b.iter_batched( - || Backend::new().save().unwrap(), - |v| black_box(Backend::load(v).unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -fn load_small(c: &mut Criterion) { - c.bench_function("load a small history backend", |b| { - b.iter_batched( - || { - let backend = small_change_backend(); - backend.save().unwrap() - }, - |v| black_box(Backend::load(v).unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -fn load_medium(c: &mut Criterion) { - c.bench_function("load a medium history backend", |b| { - b.iter_batched( - || { - let backend = medium_change_backend(); - backend.save().unwrap() - }, - |v| black_box(Backend::load(v).unwrap()), - criterion::BatchSize::SmallInput, - ) - }); -} - -criterion_group! { - name = benches; - config = Criterion::default(); - targets = save_empty, save_small, save_medium, load_empty, load_small, load_medium -} -criterion_main!(benches); diff --git a/automerge/benches/sync.rs b/automerge/benches/sync.rs deleted file mode 100644 index 4eb36697..00000000 --- a/automerge/benches/sync.rs +++ /dev/null @@ -1,120 +0,0 @@ -use std::time::Duration; - -use automerge::{Backend, Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use automerge_backend::SyncState; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; - -fn sync( - a: &mut Backend, - b: &mut Backend, - a_sync_state: &mut SyncState, - b_sync_state: &mut SyncState, -) { - const MAX_ITER: u32 = 10; - #[allow(unused_assignments)] - let mut a_to_b_msg = None; - #[allow(unused_assignments)] - let mut b_to_a_msg = None; - let mut i = 0; - loop { - a_to_b_msg = a.generate_sync_message(a_sync_state); - - if let Some(message) = a_to_b_msg.clone() { - let _patch = b.receive_sync_message(b_sync_state, message).unwrap(); - } - - b_to_a_msg = b.generate_sync_message(b_sync_state); - - if let Some(message) = b_to_a_msg.clone() { - let _patch = a.receive_sync_message(a_sync_state, message).unwrap(); - } - - i += 1; - if i > MAX_ITER { - panic!( - "Did not synchronize within {} iterations. Do you have a bug causing an infinite loop?",MAX_ITER - ) - } - if a_to_b_msg.is_none() && b_to_a_msg.is_none() { - break; - } - } -} - -fn sync_per_change(count: u32, sync_interval: u32) { - let mut n1 = Backend::new(); - let mut n2 = Backend::new(); - let mut s1 = SyncState::default(); - let mut s2 = SyncState::default(); - - let mut f1 = Frontend::new_with_timestamper(Box::new(|| None)); - - let change = f1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("n"), - Value::Sequence(vec![]), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let (patch, _) = n1.apply_local_change(change).unwrap(); - f1.apply_patch(patch).unwrap(); - - for i in 0..count { - let change = f1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::insert( - Path::root().key("n").index(i), - Value::Primitive(Primitive::Uint(i as u64)), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let (patch, _) = n1.apply_local_change(change).unwrap(); - f1.apply_patch(patch).unwrap(); - - if i % sync_interval == sync_interval - 1 { - sync(&mut n1, &mut n2, &mut s1, &mut s2); - } - } -} - -pub fn sync_with_changes_matrix(c: &mut Criterion) { - let mut group = c.benchmark_group("Sync with changes"); - - for count in [1000, 2000, 5000, 10_000].iter() { - for interval in [1, 10, 100, 1000, 10_000].iter().rev() { - if interval <= count { - group.throughput(criterion::Throughput::Elements((count / interval) as u64)); - group.bench_function( - format!( - "{} changes, syncing every {}, {} syncs total", - count, - interval, - count / interval - ), - |b| { - b.iter(|| { - #[allow(clippy::unit_arg)] - black_box(sync_per_change(*count, *interval)) - }) - }, - ); - } - } - } - - group.finish(); -} - -criterion_group! { - name = benches; - config = Criterion::default().sample_size(10).measurement_time(Duration::from_secs(30)); - targets = sync_with_changes_matrix -} -criterion_main!(benches); diff --git a/automerge/src/lib.rs b/automerge/src/lib.rs deleted file mode 100644 index 1702468f..00000000 --- a/automerge/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub use automerge_backend::{Backend, Change}; -pub use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -pub use automerge_protocol::{MapType, ObjType, ScalarValue, SequenceType}; diff --git a/automerge/tests/frontend_backend_roundtrip.rs b/automerge/tests/frontend_backend_roundtrip.rs deleted file mode 100644 index dbbe0ba1..00000000 --- a/automerge/tests/frontend_backend_roundtrip.rs +++ /dev/null @@ -1,216 +0,0 @@ -use std::collections::HashMap; - -use automerge::{ - Backend, InvalidChangeRequest, LocalChange, ObjType, Path, Primitive, ScalarValue, Value, -}; -use automerge_protocol as amp; -use automerge_protocol::{ActorId, ElementId, Key, ObjectId, Op, OpType}; -use maplit::hashmap; -use pretty_assertions::assert_eq; -use test_env_log::test; - -#[test] -fn test_frontend_uses_correct_elem_ids() { - let mut hm = HashMap::new(); - hm.insert( - "a".to_owned(), - automerge::Value::Sequence(vec![automerge::Value::Primitive(Primitive::Null)]), - ); - let mut backend = automerge::Backend::new(); - - let (mut frontend, change) = - automerge::Frontend::new_with_initial_state(Value::Map(hm)).unwrap(); - - println!("change1 {:?}", change); - - let (patch, _) = backend.apply_local_change(change).unwrap(); - frontend.apply_patch(patch).unwrap(); - - let ((), c) = frontend - .change::<_, _, automerge::InvalidChangeRequest>(None, |d| { - d.add_change(automerge::LocalChange::set( - automerge::Path::root().key("a").index(0), - automerge::Value::Primitive(automerge::Primitive::Int(0)), - )) - .unwrap(); - d.add_change(automerge::LocalChange::insert( - automerge::Path::root().key("a").index(1), - automerge::Value::Primitive(automerge::Primitive::Boolean(false)), - )) - .unwrap(); - Ok(()) - }) - .unwrap(); - - let mut ehm = HashMap::new(); - ehm.insert( - "a".to_owned(), - automerge::Value::Sequence(vec![ - automerge::Value::Primitive(automerge::Primitive::Int(0)), - automerge::Value::Primitive(automerge::Primitive::Boolean(false)), - ]), - ); - let expected = automerge::Value::Map(ehm.clone()); - - assert_eq!(expected, frontend.get_value(&Path::root()).unwrap()); - - if let Some(c) = c { - println!("change2 {:?}", c); - let (p, _) = backend.apply_local_change(c).unwrap(); - frontend.apply_patch(p).unwrap(); - } - let v = frontend.get_value(&Path::root()).unwrap(); - - let expected = automerge::Value::Map(ehm); - assert_eq!(expected, v); -} - -#[test] -fn test_multi_insert_expands_to_correct_indices() { - let uuid = uuid::Uuid::new_v4(); - let actor = ActorId::from_bytes(uuid.as_bytes()); - - let change = amp::Change { - operations: vec![ - Op { - action: OpType::Make(ObjType::List), - obj: ObjectId::Root, - key: Key::Map("a".to_owned()), - pred: vec![], - insert: false, - }, - Op { - action: OpType::Make(ObjType::List), - obj: actor.op_id_at(1).into(), - key: Key::Seq(ElementId::Head), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: actor.op_id_at(1).into(), - key: Key::Seq(actor.op_id_at(2).into()), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Uint(0)), - obj: actor.op_id_at(1).into(), - key: Key::Seq(actor.op_id_at(3).into()), - pred: vec![], - insert: true, - }, - ], - actor_id: actor, - hash: None, - seq: 1, - start_op: 1, - time: 0, - message: None, - deps: vec![], - extra_bytes: vec![], - }; - - let val = Value::Map(hashmap! { - "a".to_owned() => Value::Sequence( - vec![ - Value::Sequence( - vec![], - ), - Value::Primitive( - Primitive::Null, - ), - Value::Primitive( - Primitive::Uint( - 0 - ), - ), - ], - ), - }); - - let mut doc = automerge::Frontend::new_with_actor_id(uuid); - - let ((), c) = doc - .change::<_, _, InvalidChangeRequest>(None, |old| { - old.add_change(LocalChange::set( - Path::root().key("a"), - Value::Sequence(vec![ - Value::Sequence(vec![]), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - ]), - )) - .unwrap(); - Ok(()) - }) - .unwrap(); - let mut c = c.unwrap(); - - assert_eq!(doc.get_value(&Path::root()).unwrap(), val); - c.time = 0; - assert_eq!(c, change); - - let mut b = automerge::Backend::new(); - let (patch, _) = b.apply_local_change(c).unwrap(); - doc.apply_patch(patch).unwrap(); - assert_eq!(doc.get_value(&Path::root()).unwrap(), val); -} - -#[test] -fn test_frontend_doesnt_wait_for_empty_changes() { - let vals = vec![ - Value::Map(hashmap! {}), - Value::Map(hashmap! { - "0".to_owned() => Value::Map( - hashmap! {}, - ), - "a".to_owned() => Value::Map( - hashmap!{ - "b".to_owned() => Value::Map( - hashmap!{}, - ), - }, - ), - }), - Value::Map(hashmap! {}), - ]; - - let changes = vec![ - vec![], - vec![ - LocalChange::set(Path::root().key("0"), Value::Map(HashMap::new())), - LocalChange::set( - Path::root().key("a"), - Value::Map(hashmap! {"b".to_owned() => Value::Map(HashMap::new() )}), - ), - ], - vec![ - LocalChange::delete(Path::root().key("a")), - LocalChange::delete(Path::root().key("0")), - ], - ]; - - let mut doc = automerge::Frontend::new(); - - let mut backend = Backend::new(); - - for (val, changes) in vals.iter().zip(changes.into_iter()) { - let ((), c) = doc - .change::<_, _, InvalidChangeRequest>(None, |old| { - for change in changes { - old.add_change(change).unwrap() - } - Ok(()) - }) - .unwrap(); - if let Some(c) = c { - assert_eq!(doc.get_value(&Path::root()).unwrap(), *val); - - let (patch, _) = backend.apply_local_change(c).unwrap(); - doc.apply_patch(patch).unwrap(); - - assert_eq!(doc.get_value(&Path::root()).unwrap(), *val); - } - } -} diff --git a/automerge/tests/save_load.rs b/automerge/tests/save_load.rs deleted file mode 100644 index b47ff8ac..00000000 --- a/automerge/tests/save_load.rs +++ /dev/null @@ -1,693 +0,0 @@ -use automerge::{Backend, Frontend, InvalidChangeRequest, LocalChange, Path, Primitive, Value}; -use automerge_protocol as amp; -use automerge_protocol::{ - ActorId, ElementId, Key, ObjType, ObjectId, Op, OpId, OpType, ScalarValue, -}; -use test_env_log::test; - -#[test] -fn missing_object_error_flaky_null_rle_decoding() { - let mut change1s = Vec::new(); - let mut change2s = Vec::new(); - - let actor_id = uuid::Uuid::new_v4(); - - let changes1 = vec![LocalChange::set( - Path::root(), - Value::Map( - vec![ - ( - "\u{0}\u{0}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::F64(0.0)), - ]), - ), - ( - "\u{2}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - ]), - ), - ( - "\u{0}".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Str("".to_owned())), - ]), - ), - ( - "".to_owned(), - Value::Sequence(vec![ - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Uint(0)), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Timestamp(0)), - Value::Primitive(Primitive::Str("".to_owned())), - Value::Primitive(Primitive::Boolean(false)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Int(0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Null), - Value::Primitive(Primitive::F64(0.0)), - Value::Primitive(Primitive::Counter(0)), - Value::Primitive(Primitive::Boolean(false)), - ]), - ), - ( - "\u{1}".to_owned(), - Value::Table( - vec![("".to_owned(), Value::Primitive(Primitive::F64(0.0)))] - .into_iter() - .collect(), - ), - ), - ] - .into_iter() - .collect(), - ), - )]; - let changes2 = vec![ - LocalChange::delete(Path::root().key("\u{0}\u{0}")), - LocalChange::delete(Path::root().key("\u{2}")), - LocalChange::delete(Path::root().key("\u{0}")), - LocalChange::delete(Path::root().key("")), - LocalChange::delete(Path::root().key("\u{1}")), - ]; - - let mut backend = Backend::new(); - let mut frontend = Frontend::new_with_timestamper_and_actor_id(Box::new(|| None), actor_id); - let patch = backend.get_patch().unwrap(); - frontend.apply_patch(patch).unwrap(); - - let c = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - for change in &changes1 { - d.add_change(change.clone())? - } - Ok(()) - }) - .unwrap() - .1; - if let Some(change) = c { - change1s.push(change.clone()); - backend.apply_local_change(change).unwrap(); - } - if change1s.len() >= 2 { - println!( - "{}", - pretty_assertions::Comparison::new( - &change1s[change1s.len() - 2], - &change1s[change1s.len() - 1], - ) - ) - } - - let backend_bytes = backend.save().unwrap(); - println!("{:?}", backend_bytes); - - let backend = Backend::load(backend_bytes); - match backend { - Err(e) => { - panic!("failed loading backend: {:?}", e) - } - Ok(mut backend) => { - let mut frontend = - Frontend::new_with_timestamper_and_actor_id(Box::new(|| None), actor_id); - let patch = backend.get_patch().unwrap(); - frontend.apply_patch(patch).unwrap(); - - let c = frontend - .change::<_, _, InvalidChangeRequest>(None, |d| { - for change in &changes2 { - d.add_change(change.clone())? - } - Ok(()) - }) - .unwrap() - .1; - if let Some(change) = c { - change2s.push(change.clone()); - if change2s.len() >= 2 { - println!( - "{}", - pretty_assertions::Comparison::new( - &change2s[change2s.len() - 2], - &change2s[change2s.len() - 1] - ) - ) - } - backend.apply_local_change(change).unwrap(); - } - } - } -} - -#[test] -fn missing_object_error_null_rle_decoding() { - let actor_uuid = uuid::Uuid::new_v4(); - let actor_id = ActorId::from_bytes(actor_uuid.as_bytes()); - - let raw_change = amp::Change { - operations: vec![ - Op { - action: OpType::Make(ObjType::List), - obj: ObjectId::Root, - key: Key::Map("b".to_owned()), - pred: vec![], - insert: false, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Head), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(2, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(3, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(4, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(5, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(6, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(7, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(8, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(9, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(10, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(11, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(12, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(13, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(14, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(1, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(15, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Make(ObjType::List), - obj: ObjectId::Root, - key: Key::Map("\u{0}".to_owned()), - pred: vec![], - insert: false, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Head), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(18, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(19, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(20, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(21, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(22, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(23, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(24, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(25, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(26, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(27, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(28, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(29, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(30, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(31, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(32, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(33, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(34, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(35, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(36, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(37, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(38, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(39, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(40, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(41, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(42, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(43, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(44, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(45, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(46, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(47, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(48, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(49, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(50, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(51, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(52, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(53, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(54, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(55, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(56, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(57, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(58, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(59, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(60, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(61, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(62, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(63, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(64, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(17, actor_id.clone())), - key: Key::Seq(ElementId::Id(OpId(65, actor_id.clone()))), - pred: vec![], - insert: true, - }, - Op { - action: OpType::Make(ObjType::Map), - obj: ObjectId::Root, - key: Key::Map("\u{1}".to_owned()), - pred: vec![], - insert: false, - }, - Op { - action: OpType::Set(ScalarValue::Null), - obj: ObjectId::Id(OpId(67, actor_id.clone())), - key: Key::Map("a".to_owned()), - pred: vec![], - insert: false, - }, - ], - actor_id, - hash: None, - seq: 1, - start_op: 1, - time: 0, - message: Some("".to_owned()), - deps: vec![], - extra_bytes: vec![], - }; - - let mut backend = Backend::new(); - backend.apply_local_change(raw_change).unwrap(); - - let backend_bytes = backend.save().unwrap(); - println!("{:?}", backend_bytes); - - let backend = Backend::load(backend_bytes); - if let Err(e) = backend { - panic!("failed loading backend: {:?}", e) - } -} diff --git a/automerge/tests/text_grapheme_clusters.rs b/automerge/tests/text_grapheme_clusters.rs deleted file mode 100644 index 1062e5a3..00000000 --- a/automerge/tests/text_grapheme_clusters.rs +++ /dev/null @@ -1,15 +0,0 @@ -use unicode_segmentation::UnicodeSegmentation; - -#[test] -fn create_frontend_with_grapheme_clusters() { - let mut hm = std::collections::HashMap::new(); - hm.insert( - String::new(), - automerge::Value::Text("\u{80}".graphemes(true).map(|s| s.to_owned()).collect()), - ); - let (mut f, c) = - automerge::Frontend::new_with_initial_state(automerge::Value::Map(hm)).unwrap(); - let mut b = automerge::Backend::new(); - let (p, _) = b.apply_local_change(c).unwrap(); - f.apply_patch(p).unwrap(); -} diff --git a/flake.lock b/flake.lock index 401f1fd6..a052776b 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "flake-utils": { "locked": { - "lastModified": 1619345332, - "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -17,11 +17,11 @@ }, "flake-utils_2": { "locked": { - "lastModified": 1614513358, - "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", "owner": "numtide", "repo": "flake-utils", - "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "github" }, "original": { @@ -32,11 +32,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1620340338, - "narHash": "sha256-Op/4K0+Z9Sp5jtFH0s/zMM4H7VFZxrekcAmjQ6JpQ4w=", + "lastModified": 1669542132, + "narHash": "sha256-DRlg++NJAwPh8io3ExBJdNW7Djs3plVI5jgYQ+iXAZQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "63586475587d7e0e078291ad4b49b6f6a6885100", + "rev": "a115bb9bd56831941be3776c8a94005867f316a7", "type": "github" }, "original": { @@ -48,15 +48,16 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1617325113, - "narHash": "sha256-GksR0nvGxfZ79T91UUtWjjccxazv6Yh/MvEJ82v1Xmw=", - "owner": "nixos", + "lastModified": 1665296151, + "narHash": "sha256-uOB0oxqxN9K7XGF1hcnY+PQnlQJ+3bP2vCn/+Ru/bbc=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "54c1e44240d8a527a8f4892608c4bce5440c3ecb", + "rev": "14ccaaedd95a488dd7ae142757884d8e125b3363", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -74,11 +75,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1620355527, - "narHash": "sha256-mUTnUODiAtxH83gbv7uuvCbqZ/BNkYYk/wa3MkwrskE=", + "lastModified": 1669775522, + "narHash": "sha256-6xxGArBqssX38DdHpDoPcPvB/e79uXyQBwpBcaO/BwY=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "d8efe70dc561c4bea0b7bf440d36ce98c497e054", + "rev": "3158e47f6b85a288d12948aeb9a048e0ed4434d6", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 418f4b14..37835738 100644 --- a/flake.nix +++ b/flake.nix @@ -3,103 +3,67 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - flake-utils = { - url = "github:numtide/flake-utils"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; }; - outputs = { self, nixpkgs, flake-utils, rust-overlay }: + outputs = { + self, + nixpkgs, + flake-utils, + rust-overlay, + }: flake-utils.lib.eachDefaultSystem - (system: - let - pkgs = import nixpkgs { - overlays = [ rust-overlay.overlay ]; - inherit system; - }; - rust = pkgs.rust-bin.nightly.latest.rust; - cargoNix = pkgs.callPackage ./Cargo.nix { }; - in - { - packages = { - automerge = cargoNix.workspaceMembers.automerge.build; - automerge-protocol = cargoNix.workspaceMembers.automerge-protocol.build; - automerge-backend = cargoNix.workspaceMembers.automerge-backend.build; - automerge-backend-wasm = cargoNix.workspaceMembers.automerge-backend-wasm.build; - automerge-frontend = cargoNix.workspaceMembers.automerge-frontend.build; - automerge-c = cargoNix.workspaceMembers.automerge-c.build; - automerge-cli = cargoNix.workspaceMembers.automerge-cli.build; - }; + (system: let + pkgs = import nixpkgs { + overlays = [rust-overlay.overlays.default]; + inherit system; + }; + rust = pkgs.rust-bin.stable.latest.default; + in { + formatter = pkgs.alejandra; - defaultPackage = self.packages.${system}.automerge; + packages = { + deadnix = pkgs.runCommand "deadnix" {} '' + ${pkgs.deadnix}/bin/deadnix --fail ${./.} + mkdir $out + ''; + }; - apps = { - automerge-cli = flake-utils.lib.mkApp { - name = "automerge"; - drv = self.packages.${system}.automerge-cli; - }; - }; + checks = { + inherit (self.packages.${system}) deadnix; + }; - checks = { - automerge = cargoNix.workspaceMembers.automerge.build.override { - runTests = true; - }; - automerge-protocol = cargoNix.workspaceMembers.automerge-protocol.build.override { - runTests = true; - }; - automerge-backend = cargoNix.workspaceMembers.automerge-backend.build.override { - runTests = true; - }; - automerge-backend-wasm = cargoNix.workspaceMembers.automerge-backend-wasm.build.override { - runTests = true; - }; - automerge-frontend = cargoNix.workspaceMembers.automerge-frontend.build.override { - runTests = true; - }; - automerge-c = cargoNix.workspaceMembers.automerge-c.build.override { - runTests = true; - }; - automerge-cli = cargoNix.workspaceMembers.automerge-cli.build.override { - # FIXME(jeffas): issues with 'environment variable `CARGO_BIN_EXE_automerge` not defined' - runTests = false; - }; + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + (rust.override { + extensions = ["rust-src"]; + targets = ["wasm32-unknown-unknown"]; + }) + cargo-edit + cargo-watch + cargo-criterion + cargo-fuzz + cargo-flamegraph + cargo-deny + crate2nix + wasm-pack + pkgconfig + openssl + gnuplot - format = pkgs.runCommand "format" - { - src = ./.; - buildInputs = [ rust ]; - } '' - mkdir $out - cd $src - cargo fmt -- --check - ''; - }; + nodejs + yarn + deno - devShell = pkgs.mkShell { - buildInputs = with pkgs; - [ - (rust.override { - extensions = [ "rust-src" ]; - targets = [ "wasm32-unknown-unknown" ]; - }) - cargo-edit - cargo-watch - cargo-criterion - cargo-fuzz - cargo-flamegraph - crate2nix - wasm-pack - pkgconfig - openssl - valgrind + # c deps + cmake + cmocka + doxygen - nodejs - yarn - - rnix-lsp - nixpkgs-fmt - ]; - }; - }); + rnix-lsp + nixpkgs-fmt + ]; + }; + }); } diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml deleted file mode 100644 index 3955ae21..00000000 --- a/fuzz/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ - -[package] -name = "automerge-fuzz" -version = "0.0.0" -authors = ["Automatically generated"] -publish = false -edition = "2018" - -[package.metadata] -cargo-fuzz = true - -[dependencies] -libfuzzer-sys = "0.4" -automerge-backend = { path = "../automerge-backend" } - -[[bin]] -name = "backend_load" -path = "src/backend_load.rs" -test = false -doc = false diff --git a/fuzz/src/backend_load.rs b/fuzz/src/backend_load.rs deleted file mode 100644 index d0f436f9..00000000 --- a/fuzz/src/backend_load.rs +++ /dev/null @@ -1,6 +0,0 @@ -#![no_main] -use libfuzzer_sys::fuzz_target; - -fuzz_target!(|data: Vec| { - let _ = automerge_backend::Backend::load(data); -}); diff --git a/img/brandmark.png b/img/brandmark.png new file mode 100644 index 00000000..56e1c82d Binary files /dev/null and b/img/brandmark.png differ diff --git a/img/brandmark.svg b/img/brandmark.svg new file mode 100644 index 00000000..1347dfac --- /dev/null +++ b/img/brandmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 00000000..90486824 Binary files /dev/null and b/img/favicon.ico differ diff --git a/img/lockup.png b/img/lockup.png new file mode 100644 index 00000000..94e63a48 Binary files /dev/null and b/img/lockup.png differ diff --git a/img/lockup.svg b/img/lockup.svg new file mode 100644 index 00000000..34297ecf --- /dev/null +++ b/img/lockup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/sign.png b/img/sign.png new file mode 100644 index 00000000..772396cb Binary files /dev/null and b/img/sign.png differ diff --git a/img/sign.svg b/img/sign.svg new file mode 100644 index 00000000..df31316e --- /dev/null +++ b/img/sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/javascript/.denoifyrc.json b/javascript/.denoifyrc.json new file mode 100644 index 00000000..9453a31f --- /dev/null +++ b/javascript/.denoifyrc.json @@ -0,0 +1,3 @@ +{ + "replacer": "scripts/denoify-replacer.mjs" +} diff --git a/javascript/.eslintignore b/javascript/.eslintignore new file mode 100644 index 00000000..4d6880d3 --- /dev/null +++ b/javascript/.eslintignore @@ -0,0 +1,2 @@ +dist +examples diff --git a/javascript/.eslintrc.cjs b/javascript/.eslintrc.cjs new file mode 100644 index 00000000..88776271 --- /dev/null +++ b/javascript/.eslintrc.cjs @@ -0,0 +1,15 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint"], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + }, +} diff --git a/javascript/.gitignore b/javascript/.gitignore new file mode 100644 index 00000000..f98d9db2 --- /dev/null +++ b/javascript/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/yarn.lock +dist +docs/ +.vim +deno_dist/ diff --git a/javascript/.prettierignore b/javascript/.prettierignore new file mode 100644 index 00000000..6ab2f796 --- /dev/null +++ b/javascript/.prettierignore @@ -0,0 +1,4 @@ +e2e/verdacciodb +dist +docs +deno_dist diff --git a/javascript/.prettierrc b/javascript/.prettierrc new file mode 100644 index 00000000..18b9c97f --- /dev/null +++ b/javascript/.prettierrc @@ -0,0 +1,4 @@ +{ + "semi": false, + "arrowParens": "avoid" +} diff --git a/javascript/HACKING.md b/javascript/HACKING.md new file mode 100644 index 00000000..b7e92eef --- /dev/null +++ b/javascript/HACKING.md @@ -0,0 +1,39 @@ +## Architecture + +The `@automerge/automerge` package is a set of +[`Proxy`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) +objects which provide an idiomatic javascript interface built on top of the +lower level `@automerge/automerge-wasm` package (which is in turn built from the +Rust codebase and can be found in `~/automerge-wasm`). I.e. the responsibility +of this codebase is + +- To map from the javascript data model to the underlying `set`, `make`, + `insert`, and `delete` operations of Automerge. +- To expose a more convenient interface to functions in `automerge-wasm` which + generate messages to send over the network or compressed file formats to store + on disk + +## Building and testing + +Much of the functionality of this package depends on the +`@automerge/automerge-wasm` package and frequently you will be working on both +of them at the same time. It would be frustrating to have to push +`automerge-wasm` to NPM every time you want to test a change but I (Alex) also +don't trust `yarn link` to do the right thing here. Therefore, the `./e2e` +folder contains a little yarn package which spins up a local NPM registry. See +`./e2e/README` for details. In brief though: + +To build `automerge-wasm` and install it in the local `node_modules` + +```bash +cd e2e && yarn install && yarn run e2e buildjs +``` + +NOw that you've done this you can run the tests + +```bash +yarn test +``` + +If you make changes to the `automerge-wasm` package you will need to re-run +`yarn e2e buildjs` diff --git a/javascript/LICENSE b/javascript/LICENSE new file mode 100644 index 00000000..63b21502 --- /dev/null +++ b/javascript/LICENSE @@ -0,0 +1,10 @@ +MIT License + +Copyright 2022, Ink & Switch LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/javascript/README.md b/javascript/README.md new file mode 100644 index 00000000..af8306ac --- /dev/null +++ b/javascript/README.md @@ -0,0 +1,109 @@ +## Automerge + +Automerge is a library of data structures for building collaborative +applications, this package is the javascript implementation. + +Detailed documentation is available at [automerge.org](http://automerge.org/) +but see the following for a short getting started guid. + +## Quickstart + +First, install the library. + +``` +yarn add @automerge/automerge +``` + +If you're writing a `node` application, you can skip straight to [Make some +data](#make-some-data). If you're in a browser you need a bundler + +### Bundler setup + +`@automerge/automerge` is a wrapper around a core library which is written in +rust, compiled to WebAssembly and distributed as a separate package called +`@automerge/automerge-wasm`. Browsers don't currently support WebAssembly +modules taking part in ESM module imports, so you must use a bundler to import +`@automerge/automerge` in the browser. There are a lot of bundlers out there, we +have examples for common bundlers in the `examples` folder. Here is a short +example using Webpack 5. + +Assuming a standard setup of a new webpack project, you'll need to enable the +`asyncWebAssembly` experiment. In a typical webpack project that means adding +something like this to `webpack.config.js` + +```javascript +module.exports = { + ... + experiments: { asyncWebAssembly: true }, + performance: { // we dont want the wasm blob to generate warnings + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000 + } +}; +``` + +### Make some data + +Automerge allows to separate threads of execution to make changes to some data +and always be able to merge their changes later. + +```javascript +import * as automerge from "@automerge/automerge" +import * as assert from "assert" + +let doc1 = automerge.from({ + tasks: [ + { description: "feed fish", done: false }, + { description: "water plants", done: false }, + ], +}) + +// Create a new thread of execution +let doc2 = automerge.clone(doc1) + +// Now we concurrently make changes to doc1 and doc2 + +// Complete a task in doc2 +doc2 = automerge.change(doc2, d => { + d.tasks[0].done = true +}) + +// Add a task in doc1 +doc1 = automerge.change(doc1, d => { + d.tasks.push({ + description: "water fish", + done: false, + }) +}) + +// Merge changes from both docs +doc1 = automerge.merge(doc1, doc2) +doc2 = automerge.merge(doc2, doc1) + +// Both docs are merged and identical +assert.deepEqual(doc1, { + tasks: [ + { description: "feed fish", done: true }, + { description: "water plants", done: false }, + { description: "water fish", done: false }, + ], +}) + +assert.deepEqual(doc2, { + tasks: [ + { description: "feed fish", done: true }, + { description: "water plants", done: false }, + { description: "water fish", done: false }, + ], +}) +``` + +## Development + +See [HACKING.md](./HACKING.md) + +## Meta + +Copyright 2017–present, the Automerge contributors. Released under the terms of the +MIT license (see `LICENSE`). diff --git a/javascript/config/cjs.json b/javascript/config/cjs.json new file mode 100644 index 00000000..0b135067 --- /dev/null +++ b/javascript/config/cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "exclude": [ + "../dist/**/*", + "../node_modules", + "../test/**/*", + "../src/**/*.deno.ts" + ], + "compilerOptions": { + "outDir": "../dist/cjs" + } +} diff --git a/javascript/config/declonly.json b/javascript/config/declonly.json new file mode 100644 index 00000000..7c1df687 --- /dev/null +++ b/javascript/config/declonly.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "exclude": [ + "../dist/**/*", + "../node_modules", + "../test/**/*", + "../src/**/*.deno.ts" + ], + "emitDeclarationOnly": true, + "compilerOptions": { + "outDir": "../dist" + } +} diff --git a/javascript/config/mjs.json b/javascript/config/mjs.json new file mode 100644 index 00000000..ecf3ce36 --- /dev/null +++ b/javascript/config/mjs.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "exclude": [ + "../dist/**/*", + "../node_modules", + "../test/**/*", + "../src/**/*.deno.ts" + ], + "compilerOptions": { + "target": "es6", + "module": "es6", + "outDir": "../dist/mjs" + } +} diff --git a/javascript/deno-tests/deno.ts b/javascript/deno-tests/deno.ts new file mode 100644 index 00000000..fc0a4dad --- /dev/null +++ b/javascript/deno-tests/deno.ts @@ -0,0 +1,10 @@ +import * as Automerge from "../deno_dist/index.ts" + +Deno.test("It should create, clone and free", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.clone(doc1) + + // this is only needed if weakrefs are not supported + Automerge.free(doc1) + Automerge.free(doc2) +}) diff --git a/javascript/e2e/.gitignore b/javascript/e2e/.gitignore new file mode 100644 index 00000000..3021843a --- /dev/null +++ b/javascript/e2e/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +verdacciodb/ +htpasswd diff --git a/javascript/e2e/README.md b/javascript/e2e/README.md new file mode 100644 index 00000000..9dcee471 --- /dev/null +++ b/javascript/e2e/README.md @@ -0,0 +1,70 @@ +#End to end testing for javascript packaging + +The network of packages and bundlers we rely on to get the `automerge` package +working is a little complex. We have the `automerge-wasm` package, which the +`automerge` package depends upon, which means that anyone who depends on +`automerge` needs to either a) be using node or b) use a bundler in order to +load the underlying WASM module which is packaged in `automerge-wasm`. + +The various bundlers involved are complicated and capricious and so we need an +easy way of testing that everything is in fact working as expected. To do this +we run a custom NPM registry (namely [Verdaccio](https://verdaccio.org/)) and +build the `automerge-wasm` and `automerge` packages and publish them to this +registry. Once we have this registry running we are able to build the example +projects which depend on these packages and check that everything works as +expected. + +## Usage + +First, install everything: + +``` +yarn install +``` + +### Build `automerge-js` + +This builds the `automerge-wasm` package and then runs `yarn build` in the +`automerge-js` project with the `--registry` set to the verdaccio registry. The +end result is that you can run `yarn test` in the resulting `automerge-js` +directory in order to run tests against the current `automerge-wasm`. + +``` +yarn e2e buildjs +``` + +### Build examples + +This either builds or the examples in `automerge-js/examples` or just a subset +of them. Once this is complete you can run the relevant scripts (e.g. `vite dev` +for the Vite example) to check everything works. + +``` +yarn e2e buildexamples +``` + +Or, to just build the webpack example + +``` +yarn e2e buildexamples -e webpack +``` + +### Run Registry + +If you're experimenting with a project which is not in the `examples` folder +you'll need a running registry. `run-registry` builds and publishes +`automerge-js` and `automerge-wasm` and then runs the registry at +`localhost:4873`. + +``` +yarn e2e run-registry +``` + +You can now run `yarn install --registry http://localhost:4873` to experiment +with the built packages. + +## Using the `dev` build of `automerge-wasm` + +All the commands above take a `-p` flag which can be either `release` or +`debug`. The `debug` builds with additional debug symbols which makes errors +less cryptic. diff --git a/javascript/e2e/index.ts b/javascript/e2e/index.ts new file mode 100644 index 00000000..fb0b1599 --- /dev/null +++ b/javascript/e2e/index.ts @@ -0,0 +1,534 @@ +import { once } from "events" +import { setTimeout } from "timers/promises" +import { spawn, ChildProcess } from "child_process" +import * as child_process from "child_process" +import { + command, + subcommands, + run, + array, + multioption, + option, + Type, +} from "cmd-ts" +import * as path from "path" +import * as fsPromises from "fs/promises" +import fetch from "node-fetch" + +const VERDACCIO_DB_PATH = path.normalize(`${__dirname}/verdacciodb`) +const VERDACCIO_CONFIG_PATH = path.normalize(`${__dirname}/verdaccio.yaml`) +const AUTOMERGE_WASM_PATH = path.normalize( + `${__dirname}/../../rust/automerge-wasm` +) +const AUTOMERGE_JS_PATH = path.normalize(`${__dirname}/..`) +const EXAMPLES_DIR = path.normalize(path.join(__dirname, "../", "examples")) + +// The different example projects in "../examples" +type Example = "webpack" | "vite" | "create-react-app" + +// Type to parse strings to `Example` so the types line up for the `buildExamples` commmand +const ReadExample: Type = { + async from(str) { + if (str === "webpack") { + return "webpack" + } else if (str === "vite") { + return "vite" + } else if (str === "create-react-app") { + return "create-react-app" + } else { + throw new Error(`Unknown example type ${str}`) + } + }, +} + +type Profile = "dev" | "release" + +const ReadProfile: Type = { + async from(str) { + if (str === "dev") { + return "dev" + } else if (str === "release") { + return "release" + } else { + throw new Error(`Unknown profile ${str}`) + } + }, +} + +const buildjs = command({ + name: "buildjs", + args: { + profile: option({ + type: ReadProfile, + long: "profile", + short: "p", + defaultValue: () => "dev" as Profile, + }), + }, + handler: ({ profile }) => { + console.log("building js") + withPublishedWasm(profile, async (registryUrl: string) => { + await buildAndPublishAutomergeJs(registryUrl) + }) + }, +}) + +const buildWasm = command({ + name: "buildwasm", + args: { + profile: option({ + type: ReadProfile, + long: "profile", + short: "p", + defaultValue: () => "dev" as Profile, + }), + }, + handler: ({ profile }) => { + console.log("building automerge-wasm") + withRegistry(buildAutomergeWasm(profile)) + }, +}) + +const buildexamples = command({ + name: "buildexamples", + args: { + examples: multioption({ + long: "example", + short: "e", + type: array(ReadExample), + }), + profile: option({ + type: ReadProfile, + long: "profile", + short: "p", + defaultValue: () => "dev" as Profile, + }), + }, + handler: ({ examples, profile }) => { + if (examples.length === 0) { + examples = ["webpack", "vite", "create-react-app"] + } + buildExamples(examples, profile) + }, +}) + +const runRegistry = command({ + name: "run-registry", + args: { + profile: option({ + type: ReadProfile, + long: "profile", + short: "p", + defaultValue: () => "dev" as Profile, + }), + }, + handler: ({ profile }) => { + withPublishedWasm(profile, async (registryUrl: string) => { + await buildAndPublishAutomergeJs(registryUrl) + console.log("\n************************") + console.log(` Verdaccio NPM registry is running at ${registryUrl}`) + console.log(" press CTRL-C to exit ") + console.log("************************") + await once(process, "SIGINT") + }).catch(e => { + console.error(`Failed: ${e}`) + }) + }, +}) + +const app = subcommands({ + name: "e2e", + cmds: { + buildjs, + buildexamples, + buildwasm: buildWasm, + "run-registry": runRegistry, + }, +}) + +run(app, process.argv.slice(2)) + +async function buildExamples(examples: Array, profile: Profile) { + await withPublishedWasm(profile, async registryUrl => { + printHeader("building and publishing automerge") + await buildAndPublishAutomergeJs(registryUrl) + for (const example of examples) { + printHeader(`building ${example} example`) + if (example === "webpack") { + const projectPath = path.join(EXAMPLES_DIR, example) + await removeExistingAutomerge(projectPath) + await fsPromises.rm(path.join(projectPath, "yarn.lock"), { + force: true, + }) + await spawnAndWait( + "yarn", + [ + "--cwd", + projectPath, + "install", + "--registry", + registryUrl, + "--check-files", + ], + { stdio: "inherit" } + ) + await spawnAndWait("yarn", ["--cwd", projectPath, "build"], { + stdio: "inherit", + }) + } else if (example === "vite") { + const projectPath = path.join(EXAMPLES_DIR, example) + await removeExistingAutomerge(projectPath) + await fsPromises.rm(path.join(projectPath, "yarn.lock"), { + force: true, + }) + await spawnAndWait( + "yarn", + [ + "--cwd", + projectPath, + "install", + "--registry", + registryUrl, + "--check-files", + ], + { stdio: "inherit" } + ) + await spawnAndWait("yarn", ["--cwd", projectPath, "build"], { + stdio: "inherit", + }) + } else if (example === "create-react-app") { + const projectPath = path.join(EXAMPLES_DIR, example) + await removeExistingAutomerge(projectPath) + await fsPromises.rm(path.join(projectPath, "yarn.lock"), { + force: true, + }) + await spawnAndWait( + "yarn", + [ + "--cwd", + projectPath, + "install", + "--registry", + registryUrl, + "--check-files", + ], + { stdio: "inherit" } + ) + await spawnAndWait("yarn", ["--cwd", projectPath, "build"], { + stdio: "inherit", + }) + } + } + }) +} + +type WithRegistryAction = (registryUrl: string) => Promise + +async function withRegistry( + action: WithRegistryAction, + ...actions: Array +) { + // First, start verdaccio + printHeader("Starting verdaccio NPM server") + const verd = await VerdaccioProcess.start() + actions.unshift(action) + + for (const action of actions) { + try { + type Step = "verd-died" | "action-completed" + const verdDied: () => Promise = async () => { + await verd.died() + return "verd-died" + } + const actionComplete: () => Promise = async () => { + await action("http://localhost:4873") + return "action-completed" + } + const result = await Promise.race([verdDied(), actionComplete()]) + if (result === "verd-died") { + throw new Error("verdaccio unexpectedly exited") + } + } catch (e) { + await verd.kill() + throw e + } + } + await verd.kill() +} + +async function withPublishedWasm(profile: Profile, action: WithRegistryAction) { + await withRegistry(buildAutomergeWasm(profile), publishAutomergeWasm, action) +} + +function buildAutomergeWasm(profile: Profile): WithRegistryAction { + return async (registryUrl: string) => { + printHeader("building automerge-wasm") + await spawnAndWait( + "yarn", + ["--cwd", AUTOMERGE_WASM_PATH, "--registry", registryUrl, "install"], + { stdio: "inherit" } + ) + const cmd = profile === "release" ? "release" : "debug" + await spawnAndWait("yarn", ["--cwd", AUTOMERGE_WASM_PATH, cmd], { + stdio: "inherit", + }) + } +} + +async function publishAutomergeWasm(registryUrl: string) { + printHeader("Publishing automerge-wasm to verdaccio") + await fsPromises.rm( + path.join(VERDACCIO_DB_PATH, "@automerge/automerge-wasm"), + { recursive: true, force: true } + ) + await yarnPublish(registryUrl, AUTOMERGE_WASM_PATH) +} + +async function buildAndPublishAutomergeJs(registryUrl: string) { + // Build the js package + printHeader("Building automerge") + await removeExistingAutomerge(AUTOMERGE_JS_PATH) + await removeFromVerdaccio("@automerge/automerge") + await fsPromises.rm(path.join(AUTOMERGE_JS_PATH, "yarn.lock"), { + force: true, + }) + await spawnAndWait( + "yarn", + [ + "--cwd", + AUTOMERGE_JS_PATH, + "install", + "--registry", + registryUrl, + "--check-files", + ], + { stdio: "inherit" } + ) + await spawnAndWait("yarn", ["--cwd", AUTOMERGE_JS_PATH, "build"], { + stdio: "inherit", + }) + await yarnPublish(registryUrl, AUTOMERGE_JS_PATH) +} + +/** + * A running verdaccio process + * + */ +class VerdaccioProcess { + child: ChildProcess + stdout: Array + stderr: Array + + constructor(child: ChildProcess) { + this.child = child + + // Collect stdout/stderr otherwise the subprocess gets blocked writing + this.stdout = [] + this.stderr = [] + this.child.stdout && + this.child.stdout.on("data", data => this.stdout.push(data)) + this.child.stderr && + this.child.stderr.on("data", data => this.stderr.push(data)) + + const errCallback = (e: any) => { + console.error("!!!!!!!!!ERROR IN VERDACCIO PROCESS!!!!!!!!!") + console.error(" ", e) + if (this.stdout.length > 0) { + console.log("\n**Verdaccio stdout**") + const stdout = Buffer.concat(this.stdout) + process.stdout.write(stdout) + } + + if (this.stderr.length > 0) { + console.log("\n**Verdaccio stderr**") + const stdout = Buffer.concat(this.stderr) + process.stdout.write(stdout) + } + process.exit(-1) + } + this.child.on("error", errCallback) + } + + /** + * Spawn a verdaccio process and wait for it to respond succesfully to http requests + * + * The returned `VerdaccioProcess` can be used to control the subprocess + */ + static async start() { + const child = spawn( + "yarn", + ["verdaccio", "--config", VERDACCIO_CONFIG_PATH], + { env: { ...process.env, FORCE_COLOR: "true" } } + ) + + // Forward stdout and stderr whilst waiting for startup to complete + const stdoutCallback = (data: Buffer) => process.stdout.write(data) + const stderrCallback = (data: Buffer) => process.stderr.write(data) + child.stdout && child.stdout.on("data", stdoutCallback) + child.stderr && child.stderr.on("data", stderrCallback) + + const healthCheck = async () => { + while (true) { + try { + const resp = await fetch("http://localhost:4873") + if (resp.status === 200) { + return + } else { + console.log(`Healthcheck failed: bad status ${resp.status}`) + } + } catch (e) { + console.error(`Healthcheck failed: ${e}`) + } + await setTimeout(500) + } + } + await withTimeout(healthCheck(), 10000) + + // Stop forwarding stdout/stderr + child.stdout && child.stdout.off("data", stdoutCallback) + child.stderr && child.stderr.off("data", stderrCallback) + return new VerdaccioProcess(child) + } + + /** + * Send a SIGKILL to the process and wait for it to stop + */ + async kill() { + this.child.stdout && this.child.stdout.destroy() + this.child.stderr && this.child.stderr.destroy() + this.child.kill() + try { + await withTimeout(once(this.child, "close"), 500) + } catch (e) { + console.error("unable to kill verdaccio subprocess, trying -9") + this.child.kill(9) + await withTimeout(once(this.child, "close"), 500) + } + } + + /** + * A promise which resolves if the subprocess exits for some reason + */ + async died(): Promise { + const [exit, _signal] = await once(this.child, "exit") + return exit + } +} + +function printHeader(header: string) { + console.log("\n===============================") + console.log(` ${header}`) + console.log("===============================") +} + +/** + * Removes the automerge, @automerge/automerge-wasm, and @automerge/automerge packages from + * `$packageDir/node_modules` + * + * This is useful to force refreshing a package by use in combination with + * `yarn install --check-files`, which checks if a package is present in + * `node_modules` and if it is not forces a reinstall. + * + * @param packageDir - The directory containing the package.json of the target project + */ +async function removeExistingAutomerge(packageDir: string) { + await fsPromises.rm(path.join(packageDir, "node_modules", "@automerge"), { + recursive: true, + force: true, + }) + await fsPromises.rm(path.join(packageDir, "node_modules", "automerge"), { + recursive: true, + force: true, + }) +} + +type SpawnResult = { + stdout?: Buffer + stderr?: Buffer +} + +async function spawnAndWait( + cmd: string, + args: Array, + options: child_process.SpawnOptions +): Promise { + const child = spawn(cmd, args, options) + let stdout = null + let stderr = null + if (child.stdout) { + stdout = [] + child.stdout.on("data", data => stdout.push(data)) + } + if (child.stderr) { + stderr = [] + child.stderr.on("data", data => stderr.push(data)) + } + + const [exit, _signal] = await once(child, "exit") + if (exit && exit !== 0) { + throw new Error("nonzero exit code") + } + return { + stderr: stderr ? Buffer.concat(stderr) : null, + stdout: stdout ? Buffer.concat(stdout) : null, + } +} + +/** + * Remove a package from the verdaccio registry. This is necessary because we + * often want to _replace_ a version rather than update the version number. + * Obviously this is very bad and verboten in normal circumastances, but the + * whole point here is to be able to test the entire packaging story so it's + * okay I Promise. + */ +async function removeFromVerdaccio(packageName: string) { + await fsPromises.rm(path.join(VERDACCIO_DB_PATH, packageName), { + force: true, + recursive: true, + }) +} + +async function yarnPublish(registryUrl: string, cwd: string) { + await spawnAndWait( + "yarn", + ["--registry", registryUrl, "--cwd", cwd, "publish", "--non-interactive"], + { + stdio: "inherit", + env: { + ...process.env, + FORCE_COLOR: "true", + // This is a fake token, it just has to be the right format + npm_config__auth: + "//localhost:4873/:_authToken=Gp2Mgxm4faa/7wp0dMSuRA==", + }, + } + ) +} + +/** + * Wait for a given delay to resolve a promise, throwing an error if the + * promise doesn't resolve with the timeout + * + * @param promise - the promise to wait for @param timeout - the delay in + * milliseconds to wait before throwing + */ +async function withTimeout( + promise: Promise, + timeout: number +): Promise { + type Step = "timed-out" | { result: T } + const timedOut: () => Promise = async () => { + await setTimeout(timeout) + return "timed-out" + } + const succeeded: () => Promise = async () => { + const result = await promise + return { result } + } + const result = await Promise.race([timedOut(), succeeded()]) + if (result === "timed-out") { + throw new Error("timed out") + } else { + return result.result + } +} diff --git a/javascript/e2e/package.json b/javascript/e2e/package.json new file mode 100644 index 00000000..7bb80852 --- /dev/null +++ b/javascript/e2e/package.json @@ -0,0 +1,23 @@ +{ + "name": "e2e", + "version": "0.0.1", + "description": "", + "main": "index.js", + "scripts": { + "e2e": "ts-node index.ts" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@types/node": "^18.7.18", + "cmd-ts": "^0.11.0", + "node-fetch": "^2", + "ts-node": "^10.9.1", + "typed-emitter": "^2.1.0", + "typescript": "^4.8.3", + "verdaccio": "5" + }, + "devDependencies": { + "@types/node-fetch": "2.x" + } +} diff --git a/javascript/e2e/tsconfig.json b/javascript/e2e/tsconfig.json new file mode 100644 index 00000000..a2109873 --- /dev/null +++ b/javascript/e2e/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "types": ["node"] + }, + "module": "nodenext" +} diff --git a/javascript/e2e/verdaccio.yaml b/javascript/e2e/verdaccio.yaml new file mode 100644 index 00000000..865f5f05 --- /dev/null +++ b/javascript/e2e/verdaccio.yaml @@ -0,0 +1,25 @@ +storage: "./verdacciodb" +auth: + htpasswd: + file: ./htpasswd +publish: + allow_offline: true +logs: { type: stdout, format: pretty, level: info } +packages: + "@automerge/automerge-wasm": + access: "$all" + publish: "$all" + "@automerge/automerge": + access: "$all" + publish: "$all" + "*": + access: "$all" + publish: "$all" + proxy: npmjs + "@*/*": + access: "$all" + publish: "$all" + proxy: npmjs +uplinks: + npmjs: + url: https://registry.npmjs.org/ diff --git a/javascript/e2e/yarn.lock b/javascript/e2e/yarn.lock new file mode 100644 index 00000000..46e2abf2 --- /dev/null +++ b/javascript/e2e/yarn.lock @@ -0,0 +1,2130 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/node-fetch@2.x": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*", "@types/node@^18.7.18": + version "18.7.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.23.tgz#75c580983846181ebe5f4abc40fe9dfb2d65665f" + integrity sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg== + +"@verdaccio/commons-api@10.2.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@verdaccio/commons-api/-/commons-api-10.2.0.tgz#3b684c31749837b0574375bb2e10644ecea9fcca" + integrity sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ== + dependencies: + http-errors "2.0.0" + http-status-codes "2.2.0" + +"@verdaccio/file-locking@10.3.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@verdaccio/file-locking/-/file-locking-10.3.0.tgz#a4342665c549163817c267bfa451e32ed3009767" + integrity sha512-FE5D5H4wy/nhgR/d2J5e1Na9kScj2wMjlLPBHz7XF4XZAVSRdm45+kL3ZmrfA6b2HTADP/uH7H05/cnAYW8bhw== + dependencies: + lockfile "1.0.4" + +"@verdaccio/local-storage@10.3.1": + version "10.3.1" + resolved "https://registry.yarnpkg.com/@verdaccio/local-storage/-/local-storage-10.3.1.tgz#8cbdc6390a0eb532577ae217729cb0a4e062f299" + integrity sha512-f3oArjXPOAwUAA2dsBhfL/rSouqJ2sfml8k97RtnBPKOzisb28bgyAQW0mqwQvN4MTK5S/2xudmobFpvJAIatg== + dependencies: + "@verdaccio/commons-api" "10.2.0" + "@verdaccio/file-locking" "10.3.0" + "@verdaccio/streams" "10.2.0" + async "3.2.4" + debug "4.3.4" + lodash "4.17.21" + lowdb "1.0.0" + mkdirp "1.0.4" + +"@verdaccio/readme@10.4.1": + version "10.4.1" + resolved "https://registry.yarnpkg.com/@verdaccio/readme/-/readme-10.4.1.tgz#c568d158c36ca7dd742b1abef890383918f621b2" + integrity sha512-OZ6R+HF2bIU3WFFdPxgUgyglaIfZzGSqyUfM2m1TFNfDCK84qJvRIgQJ1HG/82KVOpGuz/nxVyw2ZyEZDkP1vA== + dependencies: + dompurify "2.3.9" + jsdom "16.7.0" + marked "4.0.18" + +"@verdaccio/streams@10.2.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@verdaccio/streams/-/streams-10.2.0.tgz#e01d2bfdcfe8aa2389f31bc6b72a602628bd025b" + integrity sha512-FaIzCnDg0x0Js5kSQn1Le3YzDHl7XxrJ0QdIw5LrDUmLsH3VXNi4/NMlSHnw5RiTTMs4UbEf98V3RJRB8exqJA== + +"@verdaccio/ui-theme@6.0.0-6-next.28": + version "6.0.0-6-next.28" + resolved "https://registry.yarnpkg.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.28.tgz#bf8ff0e90f3d292741440c7e6ab6744b97d96a98" + integrity sha512-1sJ28aVGMiRJrSz0e8f4t+IUgt/cyYmuDLhogXHOEjEIIEcfMNyQ5bVYqq03wLVoKWEh5D6gHo1hQnVKQl1L5g== + +JSONStream@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.4.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +apache-md5@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.7.tgz#dcef1802700cc231d60c5e08fd088f2f9b36375a" + integrity sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +async@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bcryptjs@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +clipanion@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.1.0.tgz#3e217dd6476bb9236638b07eb4673f7309839819" + integrity sha512-v025Hz+IDQ15FpOyK8p02h5bFznMu6rLFsJSyOPR+7WrbSnZ1Ek6pblPukV7K5tC/dsWfncQPIrJ4iUy2PXkbw== + dependencies: + typanion "^3.3.1" + +cmd-ts@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/cmd-ts/-/cmd-ts-0.11.0.tgz#80926180f39665e35e321b72439f792a2b63b745" + integrity sha512-6RvjD+f9oGPeWoMS53oavafmQ9qC839PjP3CyvPkAIfqMEXTbrclni7t3fnyVJFNWxuBexnLshcotY0RuNrI8Q== + dependencies: + chalk "^4.0.0" + debug "^4.3.4" + didyoumean "^1.2.2" + strip-ansi "^6.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookies@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cors@2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +dayjs@1.11.5: + version "1.11.5" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" + integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.4, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decimal.js@^10.2.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" + integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +dompurify@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.9.tgz#a4be5e7278338d6db09922dffcf6182cd099d70a" + integrity sha512-3zOnuTwup4lPV/GfGS6UzG4ub9nhSYagR/5tB3AvDEwqyy5dtyCM2dVjwGDCnrPerXifBKTYh/UWCGKK7ydhhw== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +envinfo@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-import-resolver-node@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +express-rate-limit@5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" + integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== + +express@4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" + integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== + +fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.8: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +flatstr@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" + integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.3: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +handlebars@4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-status-codes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" + integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== + +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-promise@^2.1.0, is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsonwebtoken@8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + +kleur@4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lockfile@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@4, lodash@4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lowdb@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" + integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== + dependencies: + graceful-fs "^4.1.3" + is-promise "^2.1.0" + lodash "4" + pify "^3.0.0" + steno "^0.4.1" + +lru-cache@7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.0.tgz#21be64954a4680e303a09e9468f880b98a0b3c7f" + integrity sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== + dependencies: + es5-ext "~0.10.2" + +lunr-mutable-indexes@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/lunr-mutable-indexes/-/lunr-mutable-indexes-2.3.2.tgz#864253489735d598c5140f3fb75c0a5c8be2e98c" + integrity sha512-Han6cdWAPPFM7C2AigS2Ofl3XjAT0yVMrUixodJEpyg71zCtZ2yzXc3s+suc/OaNt4ca6WJBEzVnEIjxCTwFMw== + dependencies: + lunr ">= 2.3.0 < 2.4.0" + +"lunr@>= 2.3.0 < 2.4.0": + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +marked@4.0.18: + version "4.0.18" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569" + integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw== + +marked@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.0.tgz#3fc6e7485f21c1ca5d6ec4a39de820e146954796" + integrity sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memoizee@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== + dependencies: + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +"minimatch@2 || 3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mv@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@1, next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-fetch@2.6.7, node-fetch@^2: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +nwsapi@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +parse-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" + integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pino-std-serializers@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" + integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== + +pino@6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78" + integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg== + dependencies: + fast-redact "^3.0.0" + fast-safe-stringify "^2.0.8" + flatstr "^1.0.12" + pino-std-serializers "^3.1.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + sonic-boom "^1.0.2" + +pkginfo@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-bytes@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.4.tgz#994b02aa46f699c50b6257b5faaa7fe2557e62d6" + integrity sha512-dLbWOa4xBn+qeWeIF60qRoB6Pk2jX5P3DIVgOQyMyvBpu931Q+8dXz8X0snJiFkQdohDDLnZQECjzsAj75hgZQ== + +pretty-ms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== + dependencies: + parse-ms "^2.1.0" + +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.24, psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +request@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== + dependencies: + glob "^6.0.1" + +rxjs@^7.5.2: + version "7.5.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" + integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +semver@7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sonic-boom@^1.0.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" + integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== + dependencies: + atomic-sleep "^1.0.0" + flatstr "^1.0.12" + +source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +steno@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" + integrity sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w== + dependencies: + graceful-fs "^4.1.3" + +strip-ansi@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timers-ext@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +typanion@^3.3.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.12.0.tgz#8352830e5cf26ebfc5832da265886c9fb3ebb323" + integrity sha512-o59ZobUBsG+2dHnGVI2shscqqzHdzCOixCU0t8YXLxM2Su42J2ha7hY9V5+6SIBjVsw6aLqrlYznCgQGJN4Kag== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/typed-emitter/-/typed-emitter-2.1.0.tgz#ca78e3d8ef1476f228f548d62e04e3d4d3fd77fb" + integrity sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA== + optionalDependencies: + rxjs "^7.5.2" + +typescript@^4.8.3: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +uglify-js@^3.1.4: + version "3.17.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.2.tgz#f55f668b9a64b213977ae688703b6bbb7ca861c6" + integrity sha512-bbxglRjsGQMchfvXZNusUcYgiB9Hx2K4AHYXQy2DITZ9Rd+JzhX7+hoocE5Winr7z2oHvPsekkBwXtigvxevXg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unix-crypt-td-js@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" + integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validator@13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verdaccio-audit@10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/verdaccio-audit/-/verdaccio-audit-10.2.2.tgz#254380e57932fda64b45cb739e9c42cc9fb2dfdf" + integrity sha512-f2uZlKD7vi0yEB0wN8WOf+eA/3SCyKD9cvK17Hh7Wm8f/bl7k1B3hHOTtUCn/yu85DGsj2pcNzrAfp2wMVgz9Q== + dependencies: + body-parser "1.20.0" + express "4.18.1" + https-proxy-agent "5.0.1" + node-fetch "2.6.7" + +verdaccio-htpasswd@10.5.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/verdaccio-htpasswd/-/verdaccio-htpasswd-10.5.0.tgz#de9ea2967856af765178b08485dc8e83f544a12c" + integrity sha512-olBsT3uy1TT2ZqmMCJUsMHrztJzoEpa8pxxvYrDZdWnEksl6mHV10lTeLbH9BUwbEheOeKkkdsERqUOs+if0jg== + dependencies: + "@verdaccio/file-locking" "10.3.0" + apache-md5 "1.1.7" + bcryptjs "2.4.3" + http-errors "2.0.0" + unix-crypt-td-js "1.1.4" + +verdaccio@5: + version "5.15.3" + resolved "https://registry.yarnpkg.com/verdaccio/-/verdaccio-5.15.3.tgz#4953471c0130c8e88b3d5562b5c63b38b575ed3d" + integrity sha512-8oEtepXF1oksGVYahi2HS1Yx9u6HD/4ukBDNDfwISmlNp7HVKJL2+kjzmDJWam88BpDNxOBU/LFXWSsEAFKFCQ== + dependencies: + "@verdaccio/commons-api" "10.2.0" + "@verdaccio/local-storage" "10.3.1" + "@verdaccio/readme" "10.4.1" + "@verdaccio/streams" "10.2.0" + "@verdaccio/ui-theme" "6.0.0-6-next.28" + JSONStream "1.3.5" + async "3.2.4" + body-parser "1.20.0" + clipanion "3.1.0" + compression "1.7.4" + cookies "0.8.0" + cors "2.8.5" + dayjs "1.11.5" + debug "^4.3.3" + envinfo "7.8.1" + eslint-import-resolver-node "0.3.6" + express "4.18.1" + express-rate-limit "5.5.1" + fast-safe-stringify "2.1.1" + handlebars "4.7.7" + http-errors "2.0.0" + js-yaml "4.1.0" + jsonwebtoken "8.5.1" + kleur "4.1.5" + lodash "4.17.21" + lru-cache "7.14.0" + lunr-mutable-indexes "2.3.2" + marked "4.1.0" + memoizee "0.4.15" + mime "3.0.0" + minimatch "5.1.0" + mkdirp "1.0.4" + mv "2.1.1" + pino "6.14.0" + pkginfo "0.4.1" + prettier-bytes "^1.0.4" + pretty-ms "^7.0.1" + request "2.88.0" + semver "7.3.7" + validator "13.7.0" + verdaccio-audit "10.2.2" + verdaccio-htpasswd "10.5.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/javascript/examples/create-react-app/.gitignore b/javascript/examples/create-react-app/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/javascript/examples/create-react-app/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/javascript/examples/create-react-app/README.md b/javascript/examples/create-react-app/README.md new file mode 100644 index 00000000..baa135ac --- /dev/null +++ b/javascript/examples/create-react-app/README.md @@ -0,0 +1,59 @@ +# Automerge + `create-react-app` + +This is a little fiddly to get working. The problem is that `create-react-app` +hard codes a webpack configuration which does not support WASM modules, which we +require in order to bundle the WASM implementation of automerge. To get around +this we use [`craco`](https://github.com/dilanx/craco) which does some monkey +patching to allow us to modify the webpack config that `create-react-app` +bundles. Then we use a craco plugin called +[`craco-wasm`](https://www.npmjs.com/package/craco-wasm) to perform the +necessary modifications to the webpack config. It should be noted that this is +all quite fragile and ideally you probably don't want to use `create-react-app` +to do this in production. + +## Setup + +Assuming you have already run `create-react-app` and your working directory is +the project. + +### Install craco and craco-wasm + +```bash +yarn add craco craco-wasm +``` + +### Modify `package.json` to use `craco` for scripts + +In `package.json` the `scripts` section will look like this: + +```json + "scripts": { + "start": "craco start", + "build": "craco build", + "test": "craco test", + "eject": "craco eject" + }, +``` + +Replace that section with: + +```json + "scripts": { + "start": "craco start", + "build": "craco build", + "test": "craco test", + "eject": "craco eject" + }, +``` + +### Create `craco.config.js` + +In the root of the project add the following contents to `craco.config.js` + +```javascript +const cracoWasm = require("craco-wasm") + +module.exports = { + plugins: [cracoWasm()], +} +``` diff --git a/javascript/examples/create-react-app/craco.config.js b/javascript/examples/create-react-app/craco.config.js new file mode 100644 index 00000000..489dad8f --- /dev/null +++ b/javascript/examples/create-react-app/craco.config.js @@ -0,0 +1,5 @@ +const cracoWasm = require("craco-wasm") + +module.exports = { + plugins: [cracoWasm()], +} diff --git a/javascript/examples/create-react-app/package.json b/javascript/examples/create-react-app/package.json new file mode 100644 index 00000000..273d277b --- /dev/null +++ b/javascript/examples/create-react-app/package.json @@ -0,0 +1,41 @@ +{ + "name": "automerge-create-react-app", + "version": "0.1.0", + "private": true, + "dependencies": { + "@craco/craco": "^7.0.0-alpha.8", + "craco-wasm": "0.0.1", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@automerge/automerge": "2.0.0-alpha.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "craco start", + "build": "craco build", + "test": "craco test", + "eject": "craco eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/javascript/examples/create-react-app/public/favicon.ico b/javascript/examples/create-react-app/public/favicon.ico new file mode 100644 index 00000000..a11777cc Binary files /dev/null and b/javascript/examples/create-react-app/public/favicon.ico differ diff --git a/javascript/examples/create-react-app/public/index.html b/javascript/examples/create-react-app/public/index.html new file mode 100644 index 00000000..aa069f27 --- /dev/null +++ b/javascript/examples/create-react-app/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/javascript/examples/create-react-app/public/logo192.png b/javascript/examples/create-react-app/public/logo192.png new file mode 100644 index 00000000..fc44b0a3 Binary files /dev/null and b/javascript/examples/create-react-app/public/logo192.png differ diff --git a/javascript/examples/create-react-app/public/logo512.png b/javascript/examples/create-react-app/public/logo512.png new file mode 100644 index 00000000..a4e47a65 Binary files /dev/null and b/javascript/examples/create-react-app/public/logo512.png differ diff --git a/javascript/examples/create-react-app/public/manifest.json b/javascript/examples/create-react-app/public/manifest.json new file mode 100644 index 00000000..080d6c77 --- /dev/null +++ b/javascript/examples/create-react-app/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/javascript/examples/create-react-app/public/robots.txt b/javascript/examples/create-react-app/public/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/javascript/examples/create-react-app/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/javascript/examples/create-react-app/src/App.css b/javascript/examples/create-react-app/src/App.css new file mode 100644 index 00000000..74b5e053 --- /dev/null +++ b/javascript/examples/create-react-app/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/javascript/examples/create-react-app/src/App.js b/javascript/examples/create-react-app/src/App.js new file mode 100644 index 00000000..7cfe997b --- /dev/null +++ b/javascript/examples/create-react-app/src/App.js @@ -0,0 +1,20 @@ +import * as Automerge from "@automerge/automerge" +import logo from "./logo.svg" +import "./App.css" + +let doc = Automerge.init() +doc = Automerge.change(doc, d => (d.hello = "from automerge")) +const result = JSON.stringify(doc) + +function App() { + return ( +
+
+ logo +

{result}

+
+
+ ) +} + +export default App diff --git a/javascript/examples/create-react-app/src/App.test.js b/javascript/examples/create-react-app/src/App.test.js new file mode 100644 index 00000000..ea796120 --- /dev/null +++ b/javascript/examples/create-react-app/src/App.test.js @@ -0,0 +1,8 @@ +import { render, screen } from "@testing-library/react" +import App from "./App" + +test("renders learn react link", () => { + render() + const linkElement = screen.getByText(/learn react/i) + expect(linkElement).toBeInTheDocument() +}) diff --git a/javascript/examples/create-react-app/src/index.css b/javascript/examples/create-react-app/src/index.css new file mode 100644 index 00000000..4a1df4db --- /dev/null +++ b/javascript/examples/create-react-app/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", + monospace; +} diff --git a/javascript/examples/create-react-app/src/index.js b/javascript/examples/create-react-app/src/index.js new file mode 100644 index 00000000..58c21edc --- /dev/null +++ b/javascript/examples/create-react-app/src/index.js @@ -0,0 +1,17 @@ +import React from "react" +import ReactDOM from "react-dom/client" +import "./index.css" +import App from "./App" +import reportWebVitals from "./reportWebVitals" + +const root = ReactDOM.createRoot(document.getElementById("root")) +root.render( + + + +) + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals() diff --git a/javascript/examples/create-react-app/src/logo.svg b/javascript/examples/create-react-app/src/logo.svg new file mode 100644 index 00000000..9dfc1c05 --- /dev/null +++ b/javascript/examples/create-react-app/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/javascript/examples/create-react-app/src/reportWebVitals.js b/javascript/examples/create-react-app/src/reportWebVitals.js new file mode 100644 index 00000000..eee308db --- /dev/null +++ b/javascript/examples/create-react-app/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry) + getFID(onPerfEntry) + getFCP(onPerfEntry) + getLCP(onPerfEntry) + getTTFB(onPerfEntry) + }) + } +} + +export default reportWebVitals diff --git a/javascript/examples/create-react-app/src/setupTests.js b/javascript/examples/create-react-app/src/setupTests.js new file mode 100644 index 00000000..6a0fd123 --- /dev/null +++ b/javascript/examples/create-react-app/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import "@testing-library/jest-dom" diff --git a/javascript/examples/create-react-app/yarn.lock b/javascript/examples/create-react-app/yarn.lock new file mode 100644 index 00000000..ec83af3b --- /dev/null +++ b/javascript/examples/create-react-app/yarn.lock @@ -0,0 +1,9120 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@^4.0.1": + version "4.0.1" + resolved "http://localhost:4873/@adobe%2fcss-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" + integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "http://localhost:4873/@ampproject%2fremapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "http://localhost:4873/@apideck%2fbetter-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@automerge/automerge-wasm@0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@automerge/automerge-wasm/-/automerge-wasm-0.1.12.tgz#8ce25255d95d4ed6fb387de6858f7b7b7e2ed4a9" + integrity sha512-/xjX1217QYJ+QaoT6iHQw4hGNUIoc3xc65c9eCnfX5v9J9BkTOl05p2Cnr51O2rPc/M6TqZLmlvpvNVdcH9JpA== + +"@automerge/automerge@2.0.0-alpha.7": + version "2.0.0-alpha.7" + resolved "https://registry.yarnpkg.com/@automerge/automerge/-/automerge-2.0.0-alpha.7.tgz#2ee220d51bcd796074a18af74eeabb5f177e1f36" + integrity sha512-Wd2/GNeqtBybUtXclEE7bWBmmEkhv3q2ITQmLh18V0VvMPbqMBpcOKYzQFnKCyiPyRe5XcYeQAyGyunhE5V0ug== + dependencies: + "@automerge/automerge-wasm" "0.1.12" + uuid "^8.3" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fcode-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fcompat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" + integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== + +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fcore/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.3": + version "7.19.1" + resolved "http://localhost:4873/@babel%2feslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" + integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.19.3", "@babel/generator@^7.7.2": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fgenerator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" + integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== + dependencies: + "@babel/types" "^7.19.3" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fhelper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== + dependencies: + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" + integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" + integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "http://localhost:4873/@babel%2fhelper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fhelper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "http://localhost:4873/@babel%2fhelper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" + integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helpers@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fhelpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" + integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhighlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fparser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" + integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + +"@babel/plugin-proposal-async-generator-functions@^7.19.1": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fplugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7" + integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fplugin-proposal-decorators/-/plugin-proposal-decorators-7.19.3.tgz#c1977e4902a18cdf9051bf7bf08d97db2fd8b110" + integrity sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.19.0" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.18.8" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "http://localhost:4873/@babel%2fplugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "http://localhost:4873/@babel%2fplugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" + integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "http://localhost:4873/@babel%2fplugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "http://localhost:4873/@babel%2fplugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.18.6", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-classes@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" + integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-destructuring@^7.18.13": + version "7.18.13" + resolved "http://localhost:4873/@babel%2fplugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz#9e03bc4a94475d62b7f4114938e6c5c33372cbf5" + integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "http://localhost:4873/@babel%2fplugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f" + integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-identifier" "^7.18.6" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fplugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" + integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "http://localhost:4873/@babel%2fplugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.18.12" + resolved "http://localhost:4873/@babel%2fplugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz#edf3bec47eb98f14e84fa0af137fcc6aad8e0443" + integrity sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" + +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + regenerator-transform "^0.15.0" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fplugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz#a3df2d7312eea624c7889a2dcd37fd1dfd25b2c6" + integrity sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fplugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fplugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fplugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz#4f1db1e0fe278b42ddbc19ec2f6cd2f8262e35d6" + integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-typescript" "^7.18.6" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "http://localhost:4873/@babel%2fplugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.19.3" + resolved "http://localhost:4873/@babel%2fpreset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754" + integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w== + dependencies: + "@babel/compat-data" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.19.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.18.9" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.18.9" + "@babel/plugin-transform-classes" "^7.19.0" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.13" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.19.3" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "http://localhost:4873/@babel%2fpreset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fpreset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.16.0": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fpreset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime-corejs3@^7.10.2": + version "7.19.1" + resolved "http://localhost:4873/@babel%2fruntime-corejs3/-/runtime-corejs3-7.19.1.tgz#f0cbbe7edda7c4109cd253bb1dee99aba4594ad9" + integrity sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.19.0" + resolved "http://localhost:4873/@babel%2fruntime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10", "@babel/template@^7.3.3": + version "7.18.10" + resolved "http://localhost:4873/@babel%2ftemplate/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3", "@babel/traverse@^7.7.2": + version "7.19.3" + resolved "http://localhost:4873/@babel%2ftraverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" + integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.3" + "@babel/types" "^7.19.3" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.19.3" + resolved "http://localhost:4873/@babel%2ftypes/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" + integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "http://localhost:4873/@bcoe%2fv8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@craco/craco@^7.0.0-alpha.8": + version "7.0.0-alpha.8" + resolved "http://localhost:4873/@craco%2fcraco/-/craco-7.0.0-alpha.8.tgz#40f19f44198ff2341b40654c8c6b4f54c2217972" + integrity sha512-IN3/ldPaktGflPu342cg7n8LYa2c3x9H2XzngUkDzTjro25ig1GyVcUdnG1U0X6wrRTF9K1AxZ5su9jLbdyFUw== + dependencies: + autoprefixer "^10.4.12" + cosmiconfig "^7.0.1" + cosmiconfig-typescript-loader "^4.1.1" + cross-spawn "^7.0.3" + lodash "^4.17.21" + semver "^7.3.7" + webpack-merge "^5.8.0" + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "http://localhost:4873/@csstools%2fnormalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.1.0": + version "1.1.1" + resolved "http://localhost:4873/@csstools%2fpostcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "http://localhost:4873/@csstools%2fpostcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "http://localhost:4873/@csstools%2fpostcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "http://localhost:4873/@csstools%2fpostcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "http://localhost:4873/@csstools%2fpostcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "http://localhost:4873/@csstools%2fpostcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "http://localhost:4873/@csstools%2fpostcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "http://localhost:4873/@csstools%2fpostcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "http://localhost:4873/@csstools%2fpostcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "http://localhost:4873/@csstools%2fpostcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "http://localhost:4873/@csstools%2fpostcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "http://localhost:4873/@csstools%2fpostcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "http://localhost:4873/@csstools%2fpostcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "http://localhost:4873/@csstools%2fpostcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.0.2" + resolved "http://localhost:4873/@csstools%2fselector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" + integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== + +"@eslint/eslintrc@^1.3.2": + version "1.3.2" + resolved "http://localhost:4873/@eslint%2feslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.10.5": + version "0.10.7" + resolved "http://localhost:4873/@humanwhocodes%2fconfig-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" + integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "http://localhost:4873/@humanwhocodes%2fgitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "http://localhost:4873/@humanwhocodes%2fmodule-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "http://localhost:4873/@humanwhocodes%2fobject-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "http://localhost:4873/@istanbuljs%2fload-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "http://localhost:4873/@istanbuljs%2fschema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2fconsole/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fconsole/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2fcore/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2fenvironment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/expect-utils@^29.1.2": + version "29.1.2" + resolved "http://localhost:4873/@jest%2fexpect-utils/-/expect-utils-29.1.2.tgz#66dbb514d38f7d21456bc774419c9ae5cca3f88d" + integrity sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg== + dependencies: + jest-get-type "^29.0.0" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2ffake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2fglobals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2freporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fschemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "http://localhost:4873/@jest%2fschemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2fsource-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2ftest-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftest-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2ftest-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2ftransform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "http://localhost:4873/@jest%2ftypes/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftypes/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.1.2": + version "29.1.2" + resolved "http://localhost:4873/@jest%2ftypes/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" + integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "http://localhost:4873/@jridgewell%2fgen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "http://localhost:4873/@jridgewell%2fgen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "http://localhost:4873/@jridgewell%2fresolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "http://localhost:4873/@jridgewell%2fset-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "http://localhost:4873/@jridgewell%2fsource-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "http://localhost:4873/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "http://localhost:4873/@jridgewell%2ftrace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "http://localhost:4873/@leichtgewicht%2fip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "http://localhost:4873/@nicolo-ribaudo%2feslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "http://localhost:4873/@nodelib%2ffs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "http://localhost:4873/@nodelib%2ffs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "http://localhost:4873/@nodelib%2ffs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.7" + resolved "http://localhost:4873/@pmmmwh%2freact-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz#58f8217ba70069cc6a73f5d7e05e85b458c150e2" + integrity sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.8.1" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "http://localhost:4873/@rollup%2fplugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "http://localhost:4873/@rollup%2fplugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "http://localhost:4873/@rollup%2fplugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "http://localhost:4873/@rollup%2fpluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.2.0" + resolved "http://localhost:4873/@rushstack%2feslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@sinclair/typebox@^0.24.1": + version "0.24.44" + resolved "http://localhost:4873/@sinclair%2ftypebox/-/typebox-0.24.44.tgz#0a0aa3bf4a155a678418527342a3ee84bd8caa5c" + integrity sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "http://localhost:4873/@sinonjs%2fcommons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "http://localhost:4873/@sinonjs%2ffake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "http://localhost:4873/@surma%2frollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fbabel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fbabel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fcore/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fhast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fplugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fplugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "http://localhost:4873/@svgr%2fwebpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@testing-library/dom@^8.5.0": + version "8.18.1" + resolved "http://localhost:4873/@testing-library%2fdom/-/dom-8.18.1.tgz#80f91be02bc171fe5a3a7003f88207be31ac2cf3" + integrity sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.5": + version "5.16.5" + resolved "http://localhost:4873/@testing-library%2fjest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "http://localhost:4873/@testing-library%2freact/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^13.5.0": + version "13.5.0" + resolved "http://localhost:4873/@testing-library%2fuser-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295" + integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@tootallnate/once@1": + version "1.1.2" + resolved "http://localhost:4873/@tootallnate%2fonce/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "http://localhost:4873/@trysound%2fsax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "http://localhost:4873/@types%2faria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.19" + resolved "http://localhost:4873/@types%2fbabel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "http://localhost:4873/@types%2fbabel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "http://localhost:4873/@types%2fbabel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.18.2" + resolved "http://localhost:4873/@types%2fbabel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" + integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "http://localhost:4873/@types%2fbody-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "http://localhost:4873/@types%2fbonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "http://localhost:4873/@types%2fconnect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "http://localhost:4873/@types%2fconnect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "http://localhost:4873/@types%2feslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.4.6" + resolved "http://localhost:4873/@types%2feslint/-/eslint-8.4.6.tgz#7976f054c1bccfcf514bff0564c0c41df5c08207" + integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "http://localhost:4873/@types%2festree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "http://localhost:4873/@types%2festree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "http://localhost:4873/@types%2festree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.31" + resolved "http://localhost:4873/@types%2fexpress-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" + integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.14" + resolved "http://localhost:4873/@types%2fexpress/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" + integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "http://localhost:4873/@types%2fgraceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "http://localhost:4873/@types%2fhtml-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "http://localhost:4873/@types%2fhttp-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "http://localhost:4873/@types%2fistanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "http://localhost:4873/@types%2fistanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "http://localhost:4873/@types%2fistanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "29.1.2" + resolved "http://localhost:4873/@types%2fjest/-/jest-29.1.2.tgz#7ad8077043ab5f6c108c8111bcc1d224e5600a87" + integrity sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "http://localhost:4873/@types%2fjson-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "http://localhost:4873/@types%2fjson5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mime@*": + version "3.0.1" + resolved "http://localhost:4873/@types%2fmime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*": + version "18.8.3" + resolved "http://localhost:4873/@types%2fnode/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c" + integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "http://localhost:4873/@types%2fparse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.1.5": + version "2.7.1" + resolved "http://localhost:4873/@types%2fprettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + +"@types/prop-types@*": + version "15.7.5" + resolved "http://localhost:4873/@types%2fprop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "http://localhost:4873/@types%2fq/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "http://localhost:4873/@types%2fqs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "http://localhost:4873/@types%2frange-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.0": + version "18.0.6" + resolved "http://localhost:4873/@types%2freact-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.0.21" + resolved "http://localhost:4873/@types%2freact/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67" + integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "http://localhost:4873/@types%2fresolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "http://localhost:4873/@types%2fretry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.2" + resolved "http://localhost:4873/@types%2fscheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "http://localhost:4873/@types%2fserve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.0" + resolved "http://localhost:4873/@types%2fserve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "http://localhost:4873/@types%2fsockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "http://localhost:4873/@types%2fstack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.5" + resolved "http://localhost:4873/@types%2ftesting-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" + integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + dependencies: + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "http://localhost:4873/@types%2ftrusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "http://localhost:4873/@types%2fws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "http://localhost:4873/@types%2fyargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "http://localhost:4873/@types%2fyargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "http://localhost:4873/@types%2fyargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2feslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511" + integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A== + dependencies: + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/type-utils" "5.39.0" + "@typescript-eslint/utils" "5.39.0" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2fexperimental-utils/-/experimental-utils-5.39.0.tgz#9263bb72b57449cc2f07ffb7fd4e12d0160b7f5e" + integrity sha512-n5N9kG/oGu2xXhHzsWzn94s6CWoiUj59FPU2dF2IQZxPftw+q6Jm5sV2vj5qTgAElRooHhrgtl2gxBQDCPt6WA== + dependencies: + "@typescript-eslint/utils" "5.39.0" + +"@typescript-eslint/parser@^5.5.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2fparser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b" + integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA== + dependencies: + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.39.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2fscope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0" + integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw== + dependencies: + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" + +"@typescript-eslint/type-utils@5.39.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2ftype-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" + integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA== + dependencies: + "@typescript-eslint/typescript-estree" "5.39.0" + "@typescript-eslint/utils" "5.39.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.39.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2ftypes/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" + integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== + +"@typescript-eslint/typescript-estree@5.39.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2ftypescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" + integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA== + dependencies: + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/visitor-keys" "5.39.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.39.0", "@typescript-eslint/utils@^5.13.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2futils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" + integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.39.0" + "@typescript-eslint/types" "5.39.0" + "@typescript-eslint/typescript-estree" "5.39.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.39.0": + version "5.39.0" + resolved "http://localhost:4873/@typescript-eslint%2fvisitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2" + integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg== + dependencies: + "@typescript-eslint/types" "5.39.0" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2ffloating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fhelper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fhelper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fhelper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fhelper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fhelper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fleb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2futf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fwasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fwasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fwasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fwasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "http://localhost:4873/@webassemblyjs%2fwast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "http://localhost:4873/@xtuc%2fieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "http://localhost:4873/@xtuc%2flong/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "http://localhost:4873/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "http://localhost:4873/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "http://localhost:4873/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "http://localhost:4873/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.8.2: + version "1.8.2" + resolved "http://localhost:4873/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: + version "7.2.0" + resolved "http://localhost:4873/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0, acorn@^7.1.1: + version "7.4.1" + resolved "http://localhost:4873/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.0" + resolved "http://localhost:4873/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +address@^1.0.1, address@^1.1.2: + version "1.2.1" + resolved "http://localhost:4873/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" + integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6: + version "6.0.2" + resolved "http://localhost:4873/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "http://localhost:4873/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "http://localhost:4873/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "http://localhost:4873/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: + version "8.11.0" + resolved "http://localhost:4873/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "http://localhost:4873/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "http://localhost:4873/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "http://localhost:4873/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "http://localhost:4873/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "http://localhost:4873/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^4.2.2: + version "4.2.2" + resolved "http://localhost:4873/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +aria-query@^5.0.0: + version "5.0.2" + resolved "http://localhost:4873/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" + integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "http://localhost:4873/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "http://localhost:4873/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.4, array-includes@^3.1.5: + version "3.1.5" + resolved "http://localhost:4873/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "http://localhost:4873/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "http://localhost:4873/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.4: + version "1.0.4" + resolved "http://localhost:4873/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" + integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +asap@~2.0.6: + version "2.0.6" + resolved "http://localhost:4873/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "http://localhost:4873/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +async@^3.2.3: + version "3.2.4" + resolved "http://localhost:4873/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "http://localhost:4873/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.11, autoprefixer@^10.4.12: + version "10.4.12" + resolved "http://localhost:4873/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" + integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001407" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axe-core@^4.4.3: + version "4.4.3" + resolved "http://localhost:4873/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "http://localhost:4873/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.2.5" + resolved "http://localhost:4873/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "http://localhost:4873/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "http://localhost:4873/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "http://localhost:4873/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "http://localhost:4873/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "http://localhost:4873/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "http://localhost:4873/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "http://localhost:4873/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "http://localhost:4873/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "http://localhost:4873/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "http://localhost:4873/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bfj@^7.0.2: + version "7.0.2" + resolved "http://localhost:4873/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.5.5: + version "3.7.2" + resolved "http://localhost:4873/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.0: + version "1.20.0" + resolved "http://localhost:4873/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.0.14" + resolved "http://localhost:4873/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" + integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "http://localhost:4873/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://localhost:4873/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "http://localhost:4873/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.3, browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "http://localhost:4873/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +bser@2.1.1: + version "2.1.1" + resolved "http://localhost:4873/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "http://localhost:4873/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "http://localhost:4873/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "http://localhost:4873/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "http://localhost:4873/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "http://localhost:4873/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.3.1: + version "5.3.1" + resolved "http://localhost:4873/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0, camelcase@^6.2.1: + version "6.3.0" + resolved "http://localhost:4873/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001407: + version "1.0.30001416" + resolved "http://localhost:4873/caniuse-lite/-/caniuse-lite-1.0.30001416.tgz#29692af8a6a11412f2d3cf9a59d588fcdd21ce4c" + integrity sha512-06wzzdAkCPZO+Qm4e/eNghZBDfVNDsCgw33T27OwBH9unE9S478OYw//Q2L7Npf/zBzs7rjZOszIFQkwQKAEqA== + +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "http://localhost:4873/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "http://localhost:4873/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "http://localhost:4873/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +char-regex@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +check-types@^11.1.1: + version "11.1.2" + resolved "http://localhost:4873/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" + integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "http://localhost:4873/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "http://localhost:4873/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.4.0" + resolved "http://localhost:4873/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" + integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "http://localhost:4873/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +clean-css@^5.2.2: + version "5.3.1" + resolved "http://localhost:4873/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== + dependencies: + source-map "~0.6.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "http://localhost:4873/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "http://localhost:4873/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "http://localhost:4873/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "http://localhost:4873/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "http://localhost:4873/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.3" + resolved "http://localhost:4873/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.19" + resolved "http://localhost:4873/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "http://localhost:4873/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "http://localhost:4873/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.2.0: + version "7.2.0" + resolved "http://localhost:4873/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "http://localhost:4873/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "http://localhost:4873/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "http://localhost:4873/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "http://localhost:4873/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "http://localhost:4873/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "http://localhost:4873/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "http://localhost:4873/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "http://localhost:4873/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "http://localhost:4873/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "http://localhost:4873/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "http://localhost:4873/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.25.1: + version "3.25.5" + resolved "http://localhost:4873/core-js-compat/-/core-js-compat-3.25.5.tgz#0016e8158c904f7b059486639e6e82116eafa7d9" + integrity sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA== + dependencies: + browserslist "^4.21.4" + +core-js-pure@^3.25.1, core-js-pure@^3.8.1: + version "3.25.5" + resolved "http://localhost:4873/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" + integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + +core-js@^3.19.2: + version "3.25.5" + resolved "http://localhost:4873/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" + integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "http://localhost:4873/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig-typescript-loader@^4.1.1: + version "4.1.1" + resolved "http://localhost:4873/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.1.1.tgz#38dd3578344038dae40fdf09792bc2e9df529f78" + integrity sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +craco-wasm@0.0.1: + version "0.0.1" + resolved "http://localhost:4873/craco-wasm/-/craco-wasm-0.0.1.tgz#a7edbf7ff64e7569909b15684c00de13209985c6" + integrity sha512-0vwZLtkQocS7UlPg9IF4TsG/6gKXcd9O0ISomjRoBMvR2XvtZN4yxvU8/WlY0Vf42PtOcWvhSx9i4oVNxLVE6w== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "http://localhost:4873/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "http://localhost:4873/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-declaration-sorter@^6.3.0: + version "6.3.1" + resolved "http://localhost:4873/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.7.1" + resolved "http://localhost:4873/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "http://localhost:4873/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "http://localhost:4873/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "http://localhost:4873/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "http://localhost:4873/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "http://localhost:4873/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "http://localhost:4873/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "http://localhost:4873/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "http://localhost:4873/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "http://localhost:4873/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssdb@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/cssdb/-/cssdb-7.0.1.tgz#3810a0c67ae06362982dfe965dbedf57a0f26617" + integrity sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.12: + version "5.2.12" + resolved "http://localhost:4873/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97" + integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew== + dependencies: + css-declaration-sorter "^6.3.0" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.2" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.6" + postcss-merge-rules "^5.1.2" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.13" + resolved "http://localhost:4873/cssnano/-/cssnano-5.1.13.tgz#83d0926e72955332dc4802a7070296e6258efc0a" + integrity sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ== + dependencies: + cssnano-preset-default "^5.2.12" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "http://localhost:4873/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "http://localhost:4873/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "http://localhost:4873/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2: + version "3.1.1" + resolved "http://localhost:4873/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "http://localhost:4873/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@2.6.9, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "http://localhost:4873/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "http://localhost:4873/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "http://localhost:4873/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decimal.js@^10.2.1: + version "10.4.1" + resolved "http://localhost:4873/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" + integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + +dedent@^0.7.0: + version "0.7.0" + resolved "http://localhost:4873/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "http://localhost:4873/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "http://localhost:4873/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "http://localhost:4873/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "http://localhost:4873/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "http://localhost:4873/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "http://localhost:4873/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "http://localhost:4873/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "http://localhost:4873/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "http://localhost:4873/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "http://localhost:4873/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detective@^5.2.1: + version "5.2.1" + resolved "http://localhost:4873/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "http://localhost:4873/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.0.0: + version "29.0.0" + resolved "http://localhost:4873/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" + integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "http://localhost:4873/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "http://localhost:4873/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "http://localhost:4873/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.14" + resolved "http://localhost:4873/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "http://localhost:4873/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "http://localhost:4873/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "http://localhost:4873/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "http://localhost:4873/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "http://localhost:4873/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "http://localhost:4873/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "http://localhost:4873/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "http://localhost:4873/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^10.0.0: + version "10.0.0" + resolved "http://localhost:4873/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.2: + version "0.1.2" + resolved "http://localhost:4873/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "http://localhost:4873/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.8" + resolved "http://localhost:4873/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.251: + version "1.4.274" + resolved "http://localhost:4873/electron-to-chromium/-/electron-to-chromium-1.4.274.tgz#74369ac6f020c3cea7c77ec040ddf159fe226233" + integrity sha512-Fgn7JZQzq85I81FpKUNxVLAzoghy8JZJ4NIue+YfUYBbu1AkpgzFvNwzF/ZNZH9ElkmJD0TSWu1F2gTpw/zZlg== + +emittery@^0.10.2: + version "0.10.2" + resolved "http://localhost:4873/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.8.1: + version "0.8.1" + resolved "http://localhost:4873/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "http://localhost:4873/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "http://localhost:4873/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "http://localhost:4873/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "http://localhost:4873/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "http://localhost:4873/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "http://localhost:4873/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: + version "1.20.4" + resolved "http://localhost:4873/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "http://localhost:4873/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "http://localhost:4873/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "http://localhost:4873/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "http://localhost:4873/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "http://localhost:4873/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "http://localhost:4873/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3: + version "2.26.0" + resolved "http://localhost:4873/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "http://localhost:4873/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.6.1" + resolved "http://localhost:4873/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + dependencies: + "@babel/runtime" "^7.18.9" + aria-query "^4.2.2" + array-includes "^3.1.5" + ast-types-flow "^0.0.7" + axe-core "^4.4.3" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.2" + language-tags "^1.0.5" + minimatch "^3.1.2" + semver "^6.3.0" + +eslint-plugin-react-hooks@^4.3.0: + version "4.6.0" + resolved "http://localhost:4873/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.27.1: + version "7.31.8" + resolved "http://localhost:4873/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" + integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-plugin-testing-library@^5.0.1: + version "5.7.2" + resolved "http://localhost:4873/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.7.2.tgz#c1b2112a40aab61f93e10859e8b2d81e54f0ce84" + integrity sha512-0ZmHeR/DUUgEzW8rwUBRWxuqntipDtpvxK0hymdHnLlABryJkzd+CAHr+XnISaVsTisZ5MLHp6nQF+8COHLLTA== + dependencies: + "@typescript-eslint/utils" "^5.13.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "http://localhost:4873/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "http://localhost:4873/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "http://localhost:4873/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + +eslint@^8.3.0: + version "8.24.0" + resolved "http://localhost:4873/eslint/-/eslint-8.24.0.tgz#489516c927a5da11b3979dbfb2679394523383c8" + integrity sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ== + dependencies: + "@eslint/eslintrc" "^1.3.2" + "@humanwhocodes/config-array" "^0.10.5" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.0" + resolved "http://localhost:4873/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "http://localhost:4873/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "http://localhost:4873/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "http://localhost:4873/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "http://localhost:4873/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "http://localhost:4873/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "http://localhost:4873/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "http://localhost:4873/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "http://localhost:4873/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "http://localhost:4873/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "http://localhost:4873/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0: + version "29.1.2" + resolved "http://localhost:4873/expect/-/expect-29.1.2.tgz#82f8f28d7d408c7c68da3a386a490ee683e1eced" + integrity sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw== + dependencies: + "@jest/expect-utils" "^29.1.2" + jest-get-type "^29.0.0" + jest-matcher-utils "^29.1.2" + jest-message-util "^29.1.2" + jest-util "^29.1.2" + +express@^4.17.3: + version "4.18.1" + resolved "http://localhost:4873/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "http://localhost:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.12" + resolved "http://localhost:4873/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "http://localhost:4873/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.13.0" + resolved "http://localhost:4873/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "http://localhost:4873/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "http://localhost:4873/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.1: + version "1.0.4" + resolved "http://localhost:4873/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "http://localhost:4873/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "http://localhost:4873/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "http://localhost:4873/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "http://localhost:4873/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "http://localhost:4873/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "http://localhost:4873/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "http://localhost:4873/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fresh@0.5.2: + version "0.5.2" + resolved "http://localhost:4873/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + version "10.1.0" + resolved "http://localhost:4873/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "http://localhost:4873/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "http://localhost:4873/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "http://localhost:4873/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "http://localhost:4873/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "http://localhost:4873/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "http://localhost:4873/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "http://localhost:4873/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "http://localhost:4873/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "http://localhost:4873/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "http://localhost:4873/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "http://localhost:4873/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "http://localhost:4873/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "http://localhost:4873/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "http://localhost:4873/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "http://localhost:4873/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "http://localhost:4873/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "http://localhost:4873/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "http://localhost:4873/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "http://localhost:4873/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "http://localhost:4873/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hoopy@^0.1.4: + version "0.1.4" + resolved "http://localhost:4873/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "http://localhost:4873/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "http://localhost:4873/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "http://localhost:4873/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "http://localhost:4873/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "http://localhost:4873/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "http://localhost:4873/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "http://localhost:4873/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "http://localhost:4873/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "http://localhost:4873/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "http://localhost:4873/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "http://localhost:4873/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "http://localhost:4873/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "http://localhost:4873/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "http://localhost:4873/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.0" + resolved "http://localhost:4873/idb/-/idb-7.1.0.tgz#2cc886be57738419e57f9aab58f647e5e2160270" + integrity sha512-Wsk07aAxDsntgYJY4h0knZJuTxM73eQ4reRAO+Z1liOh8eMCJ/MoDS8fCui1vGT9mnjtl1sOu3I2i/W1swPYZg== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + +ignore@^5.2.0: + version "5.2.0" + resolved "http://localhost:4873/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immer@^9.0.7: + version "9.0.15" + resolved "http://localhost:4873/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" + integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "http://localhost:4873/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "http://localhost:4873/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://localhost:4873/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "http://localhost:4873/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "http://localhost:4873/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "http://localhost:4873/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.5: + version "1.3.8" + resolved "http://localhost:4873/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "http://localhost:4873/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://localhost:4873/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "http://localhost:4873/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "http://localhost:4873/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "http://localhost:4873/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "http://localhost:4873/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "http://localhost:4873/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "http://localhost:4873/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "http://localhost:4873/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "http://localhost:4873/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "http://localhost:4873/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "http://localhost:4873/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "http://localhost:4873/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "http://localhost:4873/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "http://localhost:4873/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "http://localhost:4873/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "http://localhost:4873/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "http://localhost:4873/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "http://localhost:4873/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "http://localhost:4873/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "http://localhost:4873/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.8.5" + resolved "http://localhost:4873/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.1.2: + version "29.1.2" + resolved "http://localhost:4873/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" + integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.0.0" + jest-get-type "^29.0.0" + pretty-format "^29.1.2" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.0.0: + version "29.0.0" + resolved "http://localhost:4873/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" + integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.1.2: + version "29.1.2" + resolved "http://localhost:4873/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" + integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.1.2" + jest-get-type "^29.0.0" + pretty-format "^29.1.2" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.1.2: + version "29.1.2" + resolved "http://localhost:4873/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" + integrity sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.1.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.1.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "http://localhost:4873/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "http://localhost:4873/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.1.2: + version "29.1.2" + resolved "http://localhost:4873/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" + integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== + dependencies: + "@jest/types" "^29.1.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "http://localhost:4873/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^28.0.0: + version "28.1.3" + resolved "http://localhost:4873/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "http://localhost:4873/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.0.2: + version "28.1.3" + resolved "http://localhost:4873/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.4.3: + version "27.5.1" + resolved "http://localhost:4873/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +js-sdsl@^4.1.4: + version "4.1.5" + resolved "http://localhost:4873/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" + integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "http://localhost:4873/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "http://localhost:4873/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "http://localhost:4873/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "http://localhost:4873/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "http://localhost:4873/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "http://localhost:4873/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "http://localhost:4873/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: + version "2.2.1" + resolved "http://localhost:4873/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "http://localhost:4873/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "http://localhost:4873/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "http://localhost:4873/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kind-of@^6.0.2: + version "6.0.3" + resolved "http://localhost:4873/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "http://localhost:4873/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.5" + resolved "http://localhost:4873/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "http://localhost:4873/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +leven@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "http://localhost:4873/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "http://localhost:4873/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "http://localhost:4873/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "http://localhost:4873/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "http://localhost:4873/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.0" + resolved "http://localhost:4873/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + +locate-path@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "http://localhost:4873/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "http://localhost:4873/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "http://localhost:4873/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "http://localhost:4873/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "http://localhost:4873/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "http://localhost:4873/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "http://localhost:4873/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.4.4: + version "1.4.4" + resolved "http://localhost:4873/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "http://localhost:4873/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "http://localhost:4873/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +mdn-data@2.0.14: + version "2.0.14" + resolved "http://localhost:4873/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "http://localhost:4873/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "http://localhost:4873/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.7" + resolved "http://localhost:4873/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" + integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "http://localhost:4873/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "http://localhost:4873/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "http://localhost:4873/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "http://localhost:4873/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "http://localhost:4873/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "http://localhost:4873/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "http://localhost:4873/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.6.1" + resolved "http://localhost:4873/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" + integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4: + version "3.0.4" + resolved "http://localhost:4873/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "http://localhost:4873/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.0" + resolved "http://localhost:4873/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "http://localhost:4873/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "http://localhost:4873/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "http://localhost:4873/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "http://localhost:4873/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "http://localhost:4873/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.4: + version "3.3.4" + resolved "http://localhost:4873/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "http://localhost:4873/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "http://localhost:4873/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "http://localhost:4873/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^1: + version "1.3.1" + resolved "http://localhost:4873/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "http://localhost:4873/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.6: + version "2.0.6" + resolved "http://localhost:4873/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "http://localhost:4873/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "http://localhost:4873/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "http://localhost:4873/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "http://localhost:4873/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.2" + resolved "http://localhost:4873/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +object-assign@^4.1.1: + version "4.1.1" + resolved "http://localhost:4873/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "http://localhost:4873/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "http://localhost:4873/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "http://localhost:4873/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "http://localhost:4873/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "http://localhost:4873/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.4" + resolved "http://localhost:4873/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" + integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + dependencies: + array.prototype.reduce "^1.0.4" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "http://localhost:4873/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.0, object.values@^1.1.5: + version "1.1.5" + resolved "http://localhost:4873/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "http://localhost:4873/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "http://localhost:4873/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "http://localhost:4873/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "http://localhost:4873/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "http://localhost:4873/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "http://localhost:4873/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "http://localhost:4873/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "http://localhost:4873/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "http://localhost:4873/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "http://localhost:4873/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "http://localhost:4873/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "http://localhost:4873/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "http://localhost:4873/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "http://localhost:4873/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "http://localhost:4873/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "http://localhost:4873/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "http://localhost:4873/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "http://localhost:4873/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "http://localhost:4873/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "http://localhost:4873/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.4: + version "4.0.5" + resolved "http://localhost:4873/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "http://localhost:4873/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "http://localhost:4873/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "http://localhost:4873/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "http://localhost:4873/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "http://localhost:4873/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "http://localhost:4873/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "http://localhost:4873/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" + integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== + dependencies: + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "http://localhost:4873/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.9: + version "12.1.9" + resolved "http://localhost:4873/postcss-custom-properties/-/postcss-custom-properties-12.1.9.tgz#0883429a7ef99f1ba239d1fea29ce84906daa8bd" + integrity sha512-/E7PRvK8DAVljBbeWrcEQJPG72jaImxF3vvCNFwv9cC8CzigVoNIpeyfnJzphnN3Fd8/auBf5wvkw6W9MfmTyg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "http://localhost:4873/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "http://localhost:4873/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "http://localhost:4873/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "http://localhost:4873/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "http://localhost:4873/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "http://localhost:4873/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "http://localhost:4873/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "http://localhost:4873/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "http://localhost:4873/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^14.1.0: + version "14.1.0" + resolved "http://localhost:4873/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "http://localhost:4873/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "http://localhost:4873/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "http://localhost:4873/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "http://localhost:4873/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.6: + version "5.1.6" + resolved "http://localhost:4873/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce" + integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" + +postcss-merge-rules@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" + integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "http://localhost:4873/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== + dependencies: + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "http://localhost:4873/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "http://localhost:4873/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "http://localhost:4873/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== + dependencies: + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "http://localhost:4873/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.2" + resolved "http://localhost:4873/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" + integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "http://localhost:4873/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "http://localhost:4873/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "http://localhost:4873/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.2" + resolved "http://localhost:4873/postcss-preset-env/-/postcss-preset-env-7.8.2.tgz#4c834d5cbd2e29df2abf59118947c456922b79ba" + integrity sha512-rSMUEaOCnovKnwc5LvBDHUDzpGP+nrUeWZGWt9M72fBvckCi45JmnJigUr4QG4zZeOHmOCNCZnd2LKDvP++ZuQ== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.0" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.11" + browserslist "^4.21.3" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.0.1" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.9" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "http://localhost:4873/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "http://localhost:4873/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^7.0.35: + version "7.0.39" + resolved "http://localhost:4873/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.4, postcss@^8.4.7: + version "8.4.17" + resolved "http://localhost:4873/postcss/-/postcss-8.4.17.tgz#f87863ec7cd353f81f7ab2dec5d67d861bbb1be5" + integrity sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "http://localhost:4873/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "http://localhost:4873/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "http://localhost:4873/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.2, pretty-format@^27.5.1: + version "27.5.1" + resolved "http://localhost:4873/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.1.2: + version "29.1.2" + resolved "http://localhost:4873/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" + integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "http://localhost:4873/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.1.0: + version "8.2.0" + resolved "http://localhost:4873/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" + integrity sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "http://localhost:4873/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "http://localhost:4873/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "http://localhost:4873/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.33: + version "1.9.0" + resolved "http://localhost:4873/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "http://localhost:4873/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.10.3: + version "6.10.3" + resolved "http://localhost:4873/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "http://localhost:4873/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "http://localhost:4873/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +raf@^3.4.1: + version "3.4.1" + resolved "http://localhost:4873/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "http://localhost:4873/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "http://localhost:4873/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "http://localhost:4873/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^18.2.0: + version "18.2.0" + resolved "http://localhost:4873/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "http://localhost:4873/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-is@^16.13.1: + version "16.13.1" + resolved "http://localhost:4873/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "http://localhost:4873/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "http://localhost:4873/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-refresh@^0.11.0: + version "0.11.0" + resolved "http://localhost:4873/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-scripts@5.0.1: + version "5.0.1" + resolved "http://localhost:4873/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react@^18.2.0: + version "18.2.0" + resolved "http://localhost:4873/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "http://localhost:4873/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "http://localhost:4873/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "http://localhost:4873/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "http://localhost:4873/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "http://localhost:4873/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "http://localhost:4873/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: + version "0.13.9" + resolved "http://localhost:4873/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "http://localhost:4873/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "http://localhost:4873/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "http://localhost:4873/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "http://localhost:4873/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.1.0: + version "5.2.1" + resolved "http://localhost:4873/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" + integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "http://localhost:4873/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "http://localhost:4873/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "http://localhost:4873/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "http://localhost:4873/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "http://localhost:4873/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "http://localhost:4873/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "http://localhost:4873/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "http://localhost:4873/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "http://localhost:4873/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "http://localhost:4873/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +rollup@^2.43.1: + version "2.79.1" + resolved "http://localhost:4873/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "http://localhost:4873/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "http://localhost:4873/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "http://localhost:4873/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "http://localhost:4873/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize.css@*: + version "13.0.0" + resolved "http://localhost:4873/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "http://localhost:4873/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@~1.2.4: + version "1.2.4" + resolved "http://localhost:4873/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "http://localhost:4873/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "http://localhost:4873/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "http://localhost:4873/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "http://localhost:4873/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: + version "7.3.8" + resolved "http://localhost:4873/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "http://localhost:4873/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "http://localhost:4873/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "http://localhost:4873/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "http://localhost:4873/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "http://localhost:4873/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.7.3" + resolved "http://localhost:4873/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "http://localhost:4873/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "http://localhost:4873/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "http://localhost:4873/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@^0.5.6, source-map-support@~0.5.20: + version "0.5.21" + resolved "http://localhost:4873/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "http://localhost:4873/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "http://localhost:4873/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "http://localhost:4873/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "http://localhost:4873/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "http://localhost:4873/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "http://localhost:4873/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "http://localhost:4873/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.5" + resolved "http://localhost:4873/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "http://localhost:4873/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +statuses@2.0.1: + version "2.0.1" + resolved "http://localhost:4873/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "http://localhost:4873/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string-length@^4.0.1: + version "4.0.2" + resolved "http://localhost:4873/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-length@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "http://localhost:4873/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "http://localhost:4873/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "http://localhost:4873/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "http://localhost:4873/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "http://localhost:4873/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "http://localhost:4873/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.3.1: + version "3.3.1" + resolved "http://localhost:4873/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +stylehacks@^5.1.0: + version "5.1.0" + resolved "http://localhost:4873/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== + dependencies: + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://localhost:4873/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "http://localhost:4873/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "http://localhost:4873/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "http://localhost:4873/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "http://localhost:4873/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "http://localhost:4873/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "http://localhost:4873/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "http://localhost:4873/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tailwindcss@^3.0.2: + version "3.1.8" + resolved "http://localhost:4873/tailwindcss/-/tailwindcss-3.1.8.tgz#4f8520550d67a835d32f2f4021580f9fddb7b741" + integrity sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.14" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +tapable@^1.0.0: + version "1.1.3" + resolved "http://localhost:4873/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "http://localhost:4873/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "http://localhost:4873/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "http://localhost:4873/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: + version "5.3.6" + resolved "http://localhost:4873/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: + version "5.15.1" + resolved "http://localhost:4873/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" + integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "http://localhost:4873/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throat@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +thunky@^1.0.2: + version "1.1.0" + resolved "http://localhost:4873/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmpl@1.0.5: + version "1.0.5" + resolved "http://localhost:4873/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "http://localhost:4873/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.2" + resolved "http://localhost:4873/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "http://localhost:4873/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "http://localhost:4873/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3: + version "2.4.0" + resolved "http://localhost:4873/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "http://localhost:4873/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "http://localhost:4873/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "http://localhost:4873/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "http://localhost:4873/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "http://localhost:4873/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "http://localhost:4873/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "http://localhost:4873/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.18: + version "1.6.18" + resolved "http://localhost:4873/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "http://localhost:4873/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-string@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "http://localhost:4873/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "http://localhost:4873/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "http://localhost:4873/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +upath@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "http://localhost:4873/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "http://localhost:4873/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "http://localhost:4873/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "http://localhost:4873/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "http://localhost:4873/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "http://localhost:4873/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "http://localhost:4873/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3, uuid@^8.3.2: + version "8.3.2" + resolved "http://localhost:4873/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "http://localhost:4873/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +vary@~1.1.2: + version "1.1.2" + resolved "http://localhost:4873/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "http://localhost:4873/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.4.0: + version "2.4.0" + resolved "http://localhost:4873/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "http://localhost:4873/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^2.1.4: + version "2.1.4" + resolved "http://localhost:4873/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" + integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "http://localhost:4873/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "http://localhost:4873/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "http://localhost:4873/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.11.1" + resolved "http://localhost:4873/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "http://localhost:4873/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "http://localhost:4873/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "http://localhost:4873/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "http://localhost:4873/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "http://localhost:4873/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.74.0" + resolved "http://localhost:4873/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "http://localhost:4873/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "http://localhost:4873/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "http://localhost:4873/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "http://localhost:4873/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "http://localhost:4873/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "http://localhost:4873/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.3.1: + version "1.3.1" + resolved "http://localhost:4873/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "http://localhost:4873/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "http://localhost:4873/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" + integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-broadcast-update@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" + integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== + dependencies: + workbox-core "6.5.4" + +workbox-build@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" + integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.5.4" + workbox-broadcast-update "6.5.4" + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-google-analytics "6.5.4" + workbox-navigation-preload "6.5.4" + workbox-precaching "6.5.4" + workbox-range-requests "6.5.4" + workbox-recipes "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + workbox-streams "6.5.4" + workbox-sw "6.5.4" + workbox-window "6.5.4" + +workbox-cacheable-response@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" + integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== + dependencies: + workbox-core "6.5.4" + +workbox-core@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" + integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== + +workbox-expiration@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" + integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + dependencies: + idb "^7.0.1" + workbox-core "6.5.4" + +workbox-google-analytics@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" + integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== + dependencies: + workbox-background-sync "6.5.4" + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-navigation-preload@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" + integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== + dependencies: + workbox-core "6.5.4" + +workbox-precaching@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" + integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-range-requests@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" + integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== + dependencies: + workbox-core "6.5.4" + +workbox-recipes@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" + integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== + dependencies: + workbox-cacheable-response "6.5.4" + workbox-core "6.5.4" + workbox-expiration "6.5.4" + workbox-precaching "6.5.4" + workbox-routing "6.5.4" + workbox-strategies "6.5.4" + +workbox-routing@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" + integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== + dependencies: + workbox-core "6.5.4" + +workbox-strategies@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" + integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== + dependencies: + workbox-core "6.5.4" + +workbox-streams@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" + integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== + dependencies: + workbox-core "6.5.4" + workbox-routing "6.5.4" + +workbox-sw@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" + integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== + +workbox-webpack-plugin@^6.4.1: + version "6.5.4" + resolved "http://localhost:4873/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" + integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.5.4" + +workbox-window@6.5.4: + version "6.5.4" + resolved "http://localhost:4873/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" + integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.5.4" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "http://localhost:4873/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "http://localhost:4873/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.9" + resolved "http://localhost:4873/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.4.2: + version "8.9.0" + resolved "http://localhost:4873/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "http://localhost:4873/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.2: + version "4.0.2" + resolved "http://localhost:4873/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "http://localhost:4873/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "http://localhost:4873/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "http://localhost:4873/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "http://localhost:4873/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/javascript/examples/vite/.gitignore b/javascript/examples/vite/.gitignore new file mode 100644 index 00000000..23d67fc1 --- /dev/null +++ b/javascript/examples/vite/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +yarn.lock diff --git a/javascript/examples/vite/README.md b/javascript/examples/vite/README.md new file mode 100644 index 00000000..c84594f5 --- /dev/null +++ b/javascript/examples/vite/README.md @@ -0,0 +1,54 @@ +# Vite + Automerge + +There are three things you need to do to get WASM packaging working with vite: + +1. Install the top level await plugin +2. Install the `vite-plugin-wasm` plugin +3. Exclude `automerge-wasm` from the optimizer + +First, install the packages we need: + +```bash +yarn add vite-plugin-top-level-await +yarn add vite-plugin-wasm +``` + +In `vite.config.js` + +```javascript +import { defineConfig } from "vite" +import wasm from "vite-plugin-wasm" +import topLevelAwait from "vite-plugin-top-level-await" + +export default defineConfig({ + plugins: [topLevelAwait(), wasm()], + + // This is only necessary if you are using `SharedWorker` or `WebWorker`, as + // documented in https://vitejs.dev/guide/features.html#import-with-constructors + worker: { + format: "es", + plugins: [topLevelAwait(), wasm()], + }, + + optimizeDeps: { + // This is necessary because otherwise `vite dev` includes two separate + // versions of the JS wrapper. This causes problems because the JS + // wrapper has a module level variable to track JS side heap + // allocations, initializing this twice causes horrible breakage + exclude: ["@automerge/automerge-wasm"], + }, +}) +``` + +Now start the dev server: + +```bash +yarn vite +``` + +## Running the example + +```bash +yarn install +yarn dev +``` diff --git a/javascript/examples/vite/index.html b/javascript/examples/vite/index.html new file mode 100644 index 00000000..f86e483c --- /dev/null +++ b/javascript/examples/vite/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + +
+ + + diff --git a/javascript/examples/vite/main.ts b/javascript/examples/vite/main.ts new file mode 100644 index 00000000..0ba18f48 --- /dev/null +++ b/javascript/examples/vite/main.ts @@ -0,0 +1,15 @@ +import * as Automerge from "/node_modules/.vite/deps/automerge-js.js?v=6e973f28" +console.log(Automerge) +let doc = Automerge.init() +doc = Automerge.change(doc, d => (d.hello = "from automerge-js")) +console.log(doc) +const result = JSON.stringify(doc) +if (typeof document !== "undefined") { + const element = document.createElement("div") + element.innerHTML = JSON.stringify(result) + document.body.appendChild(element) +} else { + console.log("node:", result) +} + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2FsZXgvUHJvamVjdHMvYXV0b21lcmdlL2F1dG9tZXJnZS1ycy9hdXRvbWVyZ2UtanMvZXhhbXBsZXMvdml0ZS9zcmMvbWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBdXRvbWVyZ2UgZnJvbSBcImF1dG9tZXJnZS1qc1wiXG5cbi8vIGhlbGxvIHdvcmxkIGNvZGUgdGhhdCB3aWxsIHJ1biBjb3JyZWN0bHkgb24gd2ViIG9yIG5vZGVcblxuY29uc29sZS5sb2coQXV0b21lcmdlKVxubGV0IGRvYyA9IEF1dG9tZXJnZS5pbml0KClcbmRvYyA9IEF1dG9tZXJnZS5jaGFuZ2UoZG9jLCAoZDogYW55KSA9PiBkLmhlbGxvID0gXCJmcm9tIGF1dG9tZXJnZS1qc1wiKVxuY29uc29sZS5sb2coZG9jKVxuY29uc3QgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkoZG9jKVxuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGJyb3dzZXJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSBKU09OLnN0cmluZ2lmeShyZXN1bHQpXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbn0gZWxzZSB7XG4gICAgLy8gc2VydmVyXG4gICAgY29uc29sZS5sb2coXCJub2RlOlwiLCByZXN1bHQpXG59XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxlQUFlO0FBSTNCLFFBQVEsSUFBSSxTQUFTO0FBQ3JCLElBQUksTUFBTSxVQUFVLEtBQUs7QUFDekIsTUFBTSxVQUFVLE9BQU8sS0FBSyxDQUFDLE1BQVcsRUFBRSxRQUFRLG1CQUFtQjtBQUNyRSxRQUFRLElBQUksR0FBRztBQUNmLE1BQU0sU0FBUyxLQUFLLFVBQVUsR0FBRztBQUVqQyxJQUFJLE9BQU8sYUFBYSxhQUFhO0FBRWpDLFFBQU0sVUFBVSxTQUFTLGNBQWMsS0FBSztBQUM1QyxVQUFRLFlBQVksS0FBSyxVQUFVLE1BQU07QUFDekMsV0FBUyxLQUFLLFlBQVksT0FBTztBQUNyQyxPQUFPO0FBRUgsVUFBUSxJQUFJLFNBQVMsTUFBTTtBQUMvQjsiLCJuYW1lcyI6W119 diff --git a/javascript/examples/vite/package.json b/javascript/examples/vite/package.json new file mode 100644 index 00000000..d9a13681 --- /dev/null +++ b/javascript/examples/vite/package.json @@ -0,0 +1,20 @@ +{ + "name": "autovite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@automerge/automerge": "2.0.0-alpha.7" + }, + "devDependencies": { + "typescript": "^4.6.4", + "vite": "^3.1.0", + "vite-plugin-top-level-await": "^1.1.1", + "vite-plugin-wasm": "^2.1.0" + } +} diff --git a/javascript/examples/vite/public/vite.svg b/javascript/examples/vite/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/javascript/examples/vite/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/javascript/examples/vite/src/counter.ts b/javascript/examples/vite/src/counter.ts new file mode 100644 index 00000000..3e516b6d --- /dev/null +++ b/javascript/examples/vite/src/counter.ts @@ -0,0 +1,9 @@ +export function setupCounter(element: HTMLButtonElement) { + let counter = 0 + const setCounter = (count: number) => { + counter = count + element.innerHTML = `count is ${counter}` + } + element.addEventListener("click", () => setCounter(++counter)) + setCounter(0) +} diff --git a/javascript/examples/vite/src/main.ts b/javascript/examples/vite/src/main.ts new file mode 100644 index 00000000..8dc8f92c --- /dev/null +++ b/javascript/examples/vite/src/main.ts @@ -0,0 +1,17 @@ +import * as Automerge from "@automerge/automerge" + +// hello world code that will run correctly on web or node + +let doc = Automerge.init() +doc = Automerge.change(doc, (d: any) => (d.hello = "from automerge")) +const result = JSON.stringify(doc) + +if (typeof document !== "undefined") { + // browser + const element = document.createElement("div") + element.innerHTML = JSON.stringify(result) + document.body.appendChild(element) +} else { + // server + console.log("node:", result) +} diff --git a/javascript/examples/vite/src/style.css b/javascript/examples/vite/src/style.css new file mode 100644 index 00000000..ac37d84b --- /dev/null +++ b/javascript/examples/vite/src/style.css @@ -0,0 +1,97 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.vanilla:hover { + filter: drop-shadow(0 0 2em #3178c6aa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/javascript/examples/vite/src/typescript.svg b/javascript/examples/vite/src/typescript.svg new file mode 100644 index 00000000..d91c910c --- /dev/null +++ b/javascript/examples/vite/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/javascript/examples/vite/src/vite-env.d.ts b/javascript/examples/vite/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/javascript/examples/vite/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/javascript/examples/vite/tsconfig.json b/javascript/examples/vite/tsconfig.json new file mode 100644 index 00000000..fbd02253 --- /dev/null +++ b/javascript/examples/vite/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/javascript/examples/vite/vite.config.js b/javascript/examples/vite/vite.config.js new file mode 100644 index 00000000..d80981bf --- /dev/null +++ b/javascript/examples/vite/vite.config.js @@ -0,0 +1,22 @@ +import { defineConfig } from "vite" +import wasm from "vite-plugin-wasm" +import topLevelAwait from "vite-plugin-top-level-await" + +export default defineConfig({ + plugins: [topLevelAwait(), wasm()], + + // This is only necessary if you are using `SharedWorker` or `WebWorker`, as + // documented in https://vitejs.dev/guide/features.html#import-with-constructors + worker: { + format: "es", + plugins: [topLevelAwait(), wasm()], + }, + + optimizeDeps: { + // This is necessary because otherwise `vite dev` includes two separate + // versions of the JS wrapper. This causes problems because the JS + // wrapper has a module level variable to track JS side heap + // allocations, initializing this twice causes horrible breakage + exclude: ["@automerge/automerge-wasm"], + }, +}) diff --git a/javascript/examples/webpack/.gitignore b/javascript/examples/webpack/.gitignore new file mode 100644 index 00000000..da9d3ff5 --- /dev/null +++ b/javascript/examples/webpack/.gitignore @@ -0,0 +1,5 @@ +yarn.lock +node_modules +public/*.wasm +public/main.js +dist diff --git a/javascript/examples/webpack/README.md b/javascript/examples/webpack/README.md new file mode 100644 index 00000000..7563f27d --- /dev/null +++ b/javascript/examples/webpack/README.md @@ -0,0 +1,35 @@ +# Webpack + Automerge + +Getting WASM working in webpack 5 is very easy. You just need to enable the +`asyncWebAssembly` +[experiment](https://webpack.js.org/configuration/experiments/). For example: + +```javascript +const path = require("path") + +const clientConfig = { + experiments: { asyncWebAssembly: true }, + target: "web", + entry: "./src/index.js", + output: { + filename: "main.js", + path: path.resolve(__dirname, "public"), + }, + mode: "development", // or production + performance: { + // we dont want the wasm blob to generate warnings + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000, + }, +} + +module.exports = clientConfig +``` + +## Running the example + +```bash +yarn install +yarn start +``` diff --git a/javascript/examples/webpack/package.json b/javascript/examples/webpack/package.json new file mode 100644 index 00000000..2b63e7cc --- /dev/null +++ b/javascript/examples/webpack/package.json @@ -0,0 +1,22 @@ +{ + "name": "webpack-automerge-example", + "version": "0.1.0", + "description": "", + "private": true, + "scripts": { + "build": "webpack", + "start": "serve public", + "test": "node dist/node.js" + }, + "author": "", + "dependencies": { + "@automerge/automerge": "2.0.0-alpha.7" + }, + "devDependencies": { + "serve": "^13.0.2", + "webpack": "^5.72.1", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.11.1", + "webpack-node-externals": "^3.0.0" + } +} diff --git a/javascript/examples/webpack/public/index.html b/javascript/examples/webpack/public/index.html new file mode 100644 index 00000000..5003393a --- /dev/null +++ b/javascript/examples/webpack/public/index.html @@ -0,0 +1,10 @@ + + + + + Simple Webpack for automerge-wasm + + + + + diff --git a/javascript/examples/webpack/src/index.js b/javascript/examples/webpack/src/index.js new file mode 100644 index 00000000..3a9086e4 --- /dev/null +++ b/javascript/examples/webpack/src/index.js @@ -0,0 +1,17 @@ +import * as Automerge from "@automerge/automerge" + +// hello world code that will run correctly on web or node + +let doc = Automerge.init() +doc = Automerge.change(doc, d => (d.hello = "from automerge")) +const result = JSON.stringify(doc) + +if (typeof document !== "undefined") { + // browser + const element = document.createElement("div") + element.innerHTML = JSON.stringify(result) + document.body.appendChild(element) +} else { + // server + console.log("node:", result) +} diff --git a/javascript/examples/webpack/webpack.config.js b/javascript/examples/webpack/webpack.config.js new file mode 100644 index 00000000..51fd5127 --- /dev/null +++ b/javascript/examples/webpack/webpack.config.js @@ -0,0 +1,37 @@ +const path = require("path") +const nodeExternals = require("webpack-node-externals") + +// the most basic webpack config for node or web targets for automerge-wasm + +const serverConfig = { + // basic setup for bundling a node package + target: "node", + externals: [nodeExternals()], + externalsPresets: { node: true }, + + entry: "./src/index.js", + output: { + filename: "node.js", + path: path.resolve(__dirname, "dist"), + }, + mode: "development", // or production +} + +const clientConfig = { + experiments: { asyncWebAssembly: true }, + target: "web", + entry: "./src/index.js", + output: { + filename: "main.js", + path: path.resolve(__dirname, "public"), + }, + mode: "development", // or production + performance: { + // we dont want the wasm blob to generate warnings + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000, + }, +} + +module.exports = [serverConfig, clientConfig] diff --git a/javascript/package.json b/javascript/package.json new file mode 100644 index 00000000..79309907 --- /dev/null +++ b/javascript/package.json @@ -0,0 +1,53 @@ +{ + "name": "@automerge/automerge", + "collaborators": [ + "Orion Henry ", + "Martin Kleppmann" + ], + "version": "2.0.2", + "description": "Javascript implementation of automerge, backed by @automerge/automerge-wasm", + "homepage": "https://github.com/automerge/automerge-rs/tree/main/wrappers/javascript", + "repository": "github:automerge/automerge-rs", + "files": [ + "README.md", + "LICENSE", + "package.json", + "dist/index.d.ts", + "dist/cjs/**/*.js", + "dist/mjs/**/*.js", + "dist/*.d.ts" + ], + "types": "./dist/index.d.ts", + "module": "./dist/mjs/index.js", + "main": "./dist/cjs/index.js", + "license": "MIT", + "scripts": { + "lint": "eslint src", + "build": "tsc -p config/mjs.json && tsc -p config/cjs.json && tsc -p config/declonly.json --emitDeclarationOnly", + "test": "ts-mocha test/*.ts", + "deno:build": "denoify && node ./scripts/deno-prefixer.mjs", + "deno:test": "deno test ./deno-tests/deno.ts --allow-read --allow-net", + "watch-docs": "typedoc src/index.ts --watch --readme none" + }, + "devDependencies": { + "@types/expect": "^24.3.0", + "@types/mocha": "^10.0.1", + "@types/uuid": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", + "denoify": "^1.4.5", + "eslint": "^8.29.0", + "fast-sha256": "^1.3.0", + "mocha": "^10.2.0", + "pako": "^2.1.0", + "prettier": "^2.8.1", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "typedoc": "^0.23.22", + "typescript": "^4.9.4" + }, + "dependencies": { + "@automerge/automerge-wasm": "0.1.25", + "uuid": "^9.0.0" + } +} diff --git a/javascript/scripts/deno-prefixer.mjs b/javascript/scripts/deno-prefixer.mjs new file mode 100644 index 00000000..28544102 --- /dev/null +++ b/javascript/scripts/deno-prefixer.mjs @@ -0,0 +1,9 @@ +import * as fs from "fs" + +const files = ["./deno_dist/proxies.ts"] +for (const filepath of files) { + const data = fs.readFileSync(filepath) + fs.writeFileSync(filepath, "// @ts-nocheck \n" + data) + + console.log('Prepended "// @ts-nocheck" to ' + filepath) +} diff --git a/javascript/scripts/denoify-replacer.mjs b/javascript/scripts/denoify-replacer.mjs new file mode 100644 index 00000000..e183ba0d --- /dev/null +++ b/javascript/scripts/denoify-replacer.mjs @@ -0,0 +1,42 @@ +// @denoify-ignore + +import { makeThisModuleAnExecutableReplacer } from "denoify" +// import { assert } from "tsafe"; +// import * as path from "path"; + +makeThisModuleAnExecutableReplacer( + async ({ parsedImportExportStatement, destDirPath, version }) => { + version = process.env.VERSION || version + + switch (parsedImportExportStatement.parsedArgument.nodeModuleName) { + case "@automerge/automerge-wasm": + { + const moduleRoot = + process.env.ROOT_MODULE || + `https://deno.land/x/automerge_wasm@${version}` + /* + *We expect not to run against statements like + *import(..).then(...) + *or + *export * from "..." + *in our code. + */ + if ( + !parsedImportExportStatement.isAsyncImport && + (parsedImportExportStatement.statementType === "import" || + parsedImportExportStatement.statementType === "export") + ) { + if (parsedImportExportStatement.isTypeOnly) { + return `${parsedImportExportStatement.statementType} type ${parsedImportExportStatement.target} from "${moduleRoot}/index.d.ts";` + } else { + return `${parsedImportExportStatement.statementType} ${parsedImportExportStatement.target} from "${moduleRoot}/automerge_wasm.js";` + } + } + } + break + } + + //The replacer should return undefined when we want to let denoify replace the statement + return undefined + } +) diff --git a/javascript/src/conflicts.ts b/javascript/src/conflicts.ts new file mode 100644 index 00000000..52af23e1 --- /dev/null +++ b/javascript/src/conflicts.ts @@ -0,0 +1,100 @@ +import { Counter, type AutomergeValue } from "./types" +import { Text } from "./text" +import { type AutomergeValue as UnstableAutomergeValue } from "./unstable_types" +import { type Target, Text1Target, Text2Target } from "./proxies" +import { mapProxy, listProxy, ValueType } from "./proxies" +import type { Prop, ObjID } from "@automerge/automerge-wasm" +import { Automerge } from "@automerge/automerge-wasm" + +export type ConflictsF = { [key: string]: ValueType } +export type Conflicts = ConflictsF +export type UnstableConflicts = ConflictsF + +export function stableConflictAt( + context: Automerge, + objectId: ObjID, + prop: Prop +): Conflicts | undefined { + return conflictAt( + context, + objectId, + prop, + true, + (context: Automerge, conflictId: ObjID): AutomergeValue => { + return new Text(context.text(conflictId)) + } + ) +} + +export function unstableConflictAt( + context: Automerge, + objectId: ObjID, + prop: Prop +): UnstableConflicts | undefined { + return conflictAt( + context, + objectId, + prop, + true, + (context: Automerge, conflictId: ObjID): UnstableAutomergeValue => { + return context.text(conflictId) + } + ) +} + +function conflictAt( + context: Automerge, + objectId: ObjID, + prop: Prop, + textV2: boolean, + handleText: (a: Automerge, conflictId: ObjID) => ValueType +): ConflictsF | undefined { + const values = context.getAll(objectId, prop) + if (values.length <= 1) { + return + } + const result: ConflictsF = {} + for (const fullVal of values) { + switch (fullVal[0]) { + case "map": + result[fullVal[1]] = mapProxy( + context, + fullVal[1], + textV2, + [prop], + true + ) + break + case "list": + result[fullVal[1]] = listProxy( + context, + fullVal[1], + textV2, + [prop], + true + ) + break + case "text": + result[fullVal[1]] = handleText(context, fullVal[1] as ObjID) + break + case "str": + case "uint": + case "int": + case "f64": + case "boolean": + case "bytes": + case "null": + result[fullVal[2]] = fullVal[1] as ValueType + break + case "counter": + result[fullVal[2]] = new Counter(fullVal[1]) as ValueType + break + case "timestamp": + result[fullVal[2]] = new Date(fullVal[1]) as ValueType + break + default: + throw RangeError(`datatype ${fullVal[0]} unimplemented`) + } + } + return result +} diff --git a/javascript/src/constants.ts b/javascript/src/constants.ts new file mode 100644 index 00000000..7b714772 --- /dev/null +++ b/javascript/src/constants.ts @@ -0,0 +1,12 @@ +// Properties of the document root object + +export const STATE = Symbol.for("_am_meta") // symbol used to hide application metadata on automerge objects +export const TRACE = Symbol.for("_am_trace") // used for debugging +export const OBJECT_ID = Symbol.for("_am_objectId") // symbol used to hide the object id on automerge objects +export const IS_PROXY = Symbol.for("_am_isProxy") // symbol used to test if the document is a proxy object + +export const UINT = Symbol.for("_am_uint") +export const INT = Symbol.for("_am_int") +export const F64 = Symbol.for("_am_f64") +export const COUNTER = Symbol.for("_am_counter") +export const TEXT = Symbol.for("_am_text") diff --git a/javascript/src/counter.ts b/javascript/src/counter.ts new file mode 100644 index 00000000..88adb840 --- /dev/null +++ b/javascript/src/counter.ts @@ -0,0 +1,107 @@ +import { Automerge, type ObjID, type Prop } from "@automerge/automerge-wasm" +import { COUNTER } from "./constants" +/** + * The most basic CRDT: an integer value that can be changed only by + * incrementing and decrementing. Since addition of integers is commutative, + * the value trivially converges. + */ +export class Counter { + value: number + + constructor(value?: number) { + this.value = value || 0 + Reflect.defineProperty(this, COUNTER, { value: true }) + } + + /** + * A peculiar JavaScript language feature from its early days: if the object + * `x` has a `valueOf()` method that returns a number, you can use numerical + * operators on the object `x` directly, such as `x + 1` or `x < 4`. + * This method is also called when coercing a value to a string by + * concatenating it with another string, as in `x + ''`. + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf + */ + valueOf(): number { + return this.value + } + + /** + * Returns the counter value as a decimal string. If `x` is a counter object, + * this method is called e.g. when you do `['value: ', x].join('')` or when + * you use string interpolation: `value: ${x}`. + */ + toString(): string { + return this.valueOf().toString() + } + + /** + * Returns the counter value, so that a JSON serialization of an Automerge + * document represents the counter simply as an integer. + */ + toJSON(): number { + return this.value + } +} + +/** + * An instance of this class is used when a counter is accessed within a change + * callback. + */ +class WriteableCounter extends Counter { + context: Automerge + path: Prop[] + objectId: ObjID + key: Prop + + constructor( + value: number, + context: Automerge, + path: Prop[], + objectId: ObjID, + key: Prop + ) { + super(value) + this.context = context + this.path = path + this.objectId = objectId + this.key = key + } + + /** + * Increases the value of the counter by `delta`. If `delta` is not given, + * increases the value of the counter by 1. + */ + increment(delta: number): number { + delta = typeof delta === "number" ? delta : 1 + this.context.increment(this.objectId, this.key, delta) + this.value += delta + return this.value + } + + /** + * Decreases the value of the counter by `delta`. If `delta` is not given, + * decreases the value of the counter by 1. + */ + decrement(delta: number): number { + return this.increment(typeof delta === "number" ? -delta : -1) + } +} + +/** + * Returns an instance of `WriteableCounter` for use in a change callback. + * `context` is the proxy context that keeps track of the mutations. + * `objectId` is the ID of the object containing the counter, and `key` is + * the property name (key in map, or index in list) where the counter is + * located. + */ +export function getWriteableCounter( + value: number, + context: Automerge, + path: Prop[], + objectId: ObjID, + key: Prop +): WriteableCounter { + return new WriteableCounter(value, context, path, objectId, key) +} + +//module.exports = { Counter, getWriteableCounter } diff --git a/javascript/src/index.ts b/javascript/src/index.ts new file mode 100644 index 00000000..bf84c68d --- /dev/null +++ b/javascript/src/index.ts @@ -0,0 +1,242 @@ +/** + * # Automerge + * + * This library provides the core automerge data structure and sync algorithms. + * Other libraries can be built on top of this one which provide IO and + * persistence. + * + * An automerge document can be though of an immutable POJO (plain old javascript + * object) which `automerge` tracks the history of, allowing it to be merged with + * any other automerge document. + * + * ## Creating and modifying a document + * + * You can create a document with {@link init} or {@link from} and then make + * changes to it with {@link change}, you can merge two documents with {@link + * merge}. + * + * ```ts + * import * as automerge from "@automerge/automerge" + * + * type DocType = {ideas: Array} + * + * let doc1 = automerge.init() + * doc1 = automerge.change(doc1, d => { + * d.ideas = [new automerge.Text("an immutable document")] + * }) + * + * let doc2 = automerge.init() + * doc2 = automerge.merge(doc2, automerge.clone(doc1)) + * doc2 = automerge.change(doc2, d => { + * d.ideas.push(new automerge.Text("which records it's history")) + * }) + * + * // Note the `automerge.clone` call, see the "cloning" section of this readme for + * // more detail + * doc1 = automerge.merge(doc1, automerge.clone(doc2)) + * doc1 = automerge.change(doc1, d => { + * d.ideas[0].deleteAt(13, 8) + * d.ideas[0].insertAt(13, "object") + * }) + * + * let doc3 = automerge.merge(doc1, doc2) + * // doc3 is now {ideas: ["an immutable object", "which records it's history"]} + * ``` + * + * ## Applying changes from another document + * + * You can get a representation of the result of the last {@link change} you made + * to a document with {@link getLastLocalChange} and you can apply that change to + * another document using {@link applyChanges}. + * + * If you need to get just the changes which are in one document but not in another + * you can use {@link getHeads} to get the heads of the document without the + * changes and then {@link getMissingDeps}, passing the result of {@link getHeads} + * on the document with the changes. + * + * ## Saving and loading documents + * + * You can {@link save} a document to generate a compresed binary representation of + * the document which can be loaded with {@link load}. If you have a document which + * you have recently made changes to you can generate recent changes with {@link + * saveIncremental}, this will generate all the changes since you last called + * `saveIncremental`, the changes generated can be applied to another document with + * {@link loadIncremental}. + * + * ## Viewing different versions of a document + * + * Occasionally you may wish to explicitly step to a different point in a document + * history. One common reason to do this is if you need to obtain a set of changes + * which take the document from one state to another in order to send those changes + * to another peer (or to save them somewhere). You can use {@link view} to do this. + * + * ```ts + * import * as automerge from "@automerge/automerge" + * import * as assert from "assert" + * + * let doc = automerge.from({ + * key1: "value1", + * }) + * + * // Make a clone of the document at this point, maybe this is actually on another + * // peer. + * let doc2 = automerge.clone < any > doc + * + * let heads = automerge.getHeads(doc) + * + * doc = + * automerge.change < + * any > + * (doc, + * d => { + * d.key2 = "value2" + * }) + * + * doc = + * automerge.change < + * any > + * (doc, + * d => { + * d.key3 = "value3" + * }) + * + * // At this point we've generated two separate changes, now we want to send + * // just those changes to someone else + * + * // view is a cheap reference based copy of a document at a given set of heads + * let before = automerge.view(doc, heads) + * + * // This view doesn't show the last two changes in the document state + * assert.deepEqual(before, { + * key1: "value1", + * }) + * + * // Get the changes to send to doc2 + * let changes = automerge.getChanges(before, doc) + * + * // Apply the changes at doc2 + * doc2 = automerge.applyChanges < any > (doc2, changes)[0] + * assert.deepEqual(doc2, { + * key1: "value1", + * key2: "value2", + * key3: "value3", + * }) + * ``` + * + * If you have a {@link view} of a document which you want to make changes to you + * can {@link clone} the viewed document. + * + * ## Syncing + * + * The sync protocol is stateful. This means that we start by creating a {@link + * SyncState} for each peer we are communicating with using {@link initSyncState}. + * Then we generate a message to send to the peer by calling {@link + * generateSyncMessage}. When we receive a message from the peer we call {@link + * receiveSyncMessage}. Here's a simple example of a loop which just keeps two + * peers in sync. + * + * ```ts + * let sync1 = automerge.initSyncState() + * let msg: Uint8Array | null + * ;[sync1, msg] = automerge.generateSyncMessage(doc1, sync1) + * + * while (true) { + * if (msg != null) { + * network.send(msg) + * } + * let resp: Uint8Array = + * (network.receive()[(doc1, sync1, _ignore)] = + * automerge.receiveSyncMessage(doc1, sync1, resp)[(sync1, msg)] = + * automerge.generateSyncMessage(doc1, sync1)) + * } + * ``` + * + * ## Conflicts + * + * The only time conflicts occur in automerge documents is in concurrent + * assignments to the same key in an object. In this case automerge + * deterministically chooses an arbitrary value to present to the application but + * you can examine the conflicts using {@link getConflicts}. + * + * ``` + * import * as automerge from "@automerge/automerge" + * + * type Profile = { + * pets: Array<{name: string, type: string}> + * } + * + * let doc1 = automerge.init("aaaa") + * doc1 = automerge.change(doc1, d => { + * d.pets = [{name: "Lassie", type: "dog"}] + * }) + * let doc2 = automerge.init("bbbb") + * doc2 = automerge.merge(doc2, automerge.clone(doc1)) + * + * doc2 = automerge.change(doc2, d => { + * d.pets[0].name = "Beethoven" + * }) + * + * doc1 = automerge.change(doc1, d => { + * d.pets[0].name = "Babe" + * }) + * + * const doc3 = automerge.merge(doc1, doc2) + * + * // Note that here we pass `doc3.pets`, not `doc3` + * let conflicts = automerge.getConflicts(doc3.pets[0], "name") + * + * // The two conflicting values are the keys of the conflicts object + * assert.deepEqual(Object.values(conflicts), ["Babe", Beethoven"]) + * ``` + * + * ## Actor IDs + * + * By default automerge will generate a random actor ID for you, but most methods + * for creating a document allow you to set the actor ID. You can get the actor ID + * associated with the document by calling {@link getActorId}. Actor IDs must not + * be used in concurrent threads of executiong - all changes by a given actor ID + * are expected to be sequential. + * + * ## Listening to patches + * + * Sometimes you want to respond to changes made to an automerge document. In this + * case you can use the {@link PatchCallback} type to receive notifications when + * changes have been made. + * + * ## Cloning + * + * Currently you cannot make mutating changes (i.e. call {@link change}) to a + * document which you have two pointers to. For example, in this code: + * + * ```javascript + * let doc1 = automerge.init() + * let doc2 = automerge.change(doc1, d => (d.key = "value")) + * ``` + * + * `doc1` and `doc2` are both pointers to the same state. Any attempt to call + * mutating methods on `doc1` will now result in an error like + * + * Attempting to change an out of date document + * + * If you encounter this you need to clone the original document, the above sample + * would work as: + * + * ```javascript + * let doc1 = automerge.init() + * let doc2 = automerge.change(automerge.clone(doc1), d => (d.key = "value")) + * ``` + * @packageDocumentation + * + * ## The {@link unstable} module + * + * We are working on some changes to automerge which are not yet complete and + * will result in backwards incompatible API changes. Once these changes are + * ready for production use we will release a new major version of automerge. + * However, until that point you can use the {@link unstable} module to try out + * the new features, documents from the {@link unstable} module are + * interoperable with documents from the main module. Please see the docs for + * the {@link unstable} module for more details. + */ +export * from "./stable" +import * as unstable from "./unstable" +export { unstable } diff --git a/javascript/src/internal_state.ts b/javascript/src/internal_state.ts new file mode 100644 index 00000000..f3da49b1 --- /dev/null +++ b/javascript/src/internal_state.ts @@ -0,0 +1,43 @@ +import { type ObjID, type Heads, Automerge } from "@automerge/automerge-wasm" + +import { STATE, OBJECT_ID, TRACE, IS_PROXY } from "./constants" + +import type { Doc, PatchCallback } from "./types" + +export interface InternalState { + handle: Automerge + heads: Heads | undefined + freeze: boolean + patchCallback?: PatchCallback + textV2: boolean +} + +export function _state(doc: Doc, checkroot = true): InternalState { + if (typeof doc !== "object") { + throw new RangeError("must be the document root") + } + const state = Reflect.get(doc, STATE) as InternalState + if ( + state === undefined || + state == null || + (checkroot && _obj(doc) !== "_root") + ) { + throw new RangeError("must be the document root") + } + return state +} + +export function _trace(doc: Doc): string | undefined { + return Reflect.get(doc, TRACE) as string +} + +export function _obj(doc: Doc): ObjID | null { + if (!(typeof doc === "object") || doc === null) { + return null + } + return Reflect.get(doc, OBJECT_ID) as ObjID +} + +export function _is_proxy(doc: Doc): boolean { + return !!Reflect.get(doc, IS_PROXY) +} diff --git a/javascript/src/low_level.ts b/javascript/src/low_level.ts new file mode 100644 index 00000000..f44f3a32 --- /dev/null +++ b/javascript/src/low_level.ts @@ -0,0 +1,58 @@ +import { + type API, + Automerge, + type Change, + type DecodedChange, + type Actor, + SyncState, + type SyncMessage, + type JsSyncState, + type DecodedSyncMessage, + type ChangeToEncode, +} from "@automerge/automerge-wasm" +export type { ChangeToEncode } from "@automerge/automerge-wasm" + +export function UseApi(api: API) { + for (const k in api) { + // eslint-disable-next-line @typescript-eslint/no-extra-semi,@typescript-eslint/no-explicit-any + ;(ApiHandler as any)[k] = (api as any)[k] + } +} + +/* eslint-disable */ +export const ApiHandler: API = { + create(textV2: boolean, actor?: Actor): Automerge { + throw new RangeError("Automerge.use() not called") + }, + load(data: Uint8Array, textV2: boolean, actor?: Actor): Automerge { + throw new RangeError("Automerge.use() not called (load)") + }, + encodeChange(change: ChangeToEncode): Change { + throw new RangeError("Automerge.use() not called (encodeChange)") + }, + decodeChange(change: Change): DecodedChange { + throw new RangeError("Automerge.use() not called (decodeChange)") + }, + initSyncState(): SyncState { + throw new RangeError("Automerge.use() not called (initSyncState)") + }, + encodeSyncMessage(message: DecodedSyncMessage): SyncMessage { + throw new RangeError("Automerge.use() not called (encodeSyncMessage)") + }, + decodeSyncMessage(msg: SyncMessage): DecodedSyncMessage { + throw new RangeError("Automerge.use() not called (decodeSyncMessage)") + }, + encodeSyncState(state: SyncState): Uint8Array { + throw new RangeError("Automerge.use() not called (encodeSyncState)") + }, + decodeSyncState(data: Uint8Array): SyncState { + throw new RangeError("Automerge.use() not called (decodeSyncState)") + }, + exportSyncState(state: SyncState): JsSyncState { + throw new RangeError("Automerge.use() not called (exportSyncState)") + }, + importSyncState(state: JsSyncState): SyncState { + throw new RangeError("Automerge.use() not called (importSyncState)") + }, +} +/* eslint-enable */ diff --git a/javascript/src/numbers.ts b/javascript/src/numbers.ts new file mode 100644 index 00000000..7ad95998 --- /dev/null +++ b/javascript/src/numbers.ts @@ -0,0 +1,54 @@ +// Convenience classes to allow users to strictly specify the number type they want + +import { INT, UINT, F64 } from "./constants" + +export class Int { + value: number + + constructor(value: number) { + if ( + !( + Number.isInteger(value) && + value <= Number.MAX_SAFE_INTEGER && + value >= Number.MIN_SAFE_INTEGER + ) + ) { + throw new RangeError(`Value ${value} cannot be a uint`) + } + this.value = value + Reflect.defineProperty(this, INT, { value: true }) + Object.freeze(this) + } +} + +export class Uint { + value: number + + constructor(value: number) { + if ( + !( + Number.isInteger(value) && + value <= Number.MAX_SAFE_INTEGER && + value >= 0 + ) + ) { + throw new RangeError(`Value ${value} cannot be a uint`) + } + this.value = value + Reflect.defineProperty(this, UINT, { value: true }) + Object.freeze(this) + } +} + +export class Float64 { + value: number + + constructor(value: number) { + if (typeof value !== "number") { + throw new RangeError(`Value ${value} cannot be a float64`) + } + this.value = value || 0.0 + Reflect.defineProperty(this, F64, { value: true }) + Object.freeze(this) + } +} diff --git a/javascript/src/proxies.ts b/javascript/src/proxies.ts new file mode 100644 index 00000000..54a8dd71 --- /dev/null +++ b/javascript/src/proxies.ts @@ -0,0 +1,1005 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { Text } from "./text" +import { + Automerge, + type Heads, + type ObjID, + type Prop, +} from "@automerge/automerge-wasm" + +import type { AutomergeValue, ScalarValue, MapValue, ListValue } from "./types" +import { + type AutomergeValue as UnstableAutomergeValue, + MapValue as UnstableMapValue, + ListValue as UnstableListValue, +} from "./unstable_types" +import { Counter, getWriteableCounter } from "./counter" +import { + STATE, + TRACE, + IS_PROXY, + OBJECT_ID, + COUNTER, + INT, + UINT, + F64, +} from "./constants" +import { RawString } from "./raw_string" + +type TargetCommon = { + context: Automerge + objectId: ObjID + path: Array + readonly: boolean + heads?: Array + cache: object + trace?: any + frozen: boolean +} + +export type Text2Target = TargetCommon & { textV2: true } +export type Text1Target = TargetCommon & { textV2: false } +export type Target = Text1Target | Text2Target + +export type ValueType = T extends Text2Target + ? UnstableAutomergeValue + : T extends Text1Target + ? AutomergeValue + : never +type MapValueType = T extends Text2Target + ? UnstableMapValue + : T extends Text1Target + ? MapValue + : never +type ListValueType = T extends Text2Target + ? UnstableListValue + : T extends Text1Target + ? ListValue + : never + +function parseListIndex(key: any) { + if (typeof key === "string" && /^[0-9]+$/.test(key)) key = parseInt(key, 10) + if (typeof key !== "number") { + return key + } + if (key < 0 || isNaN(key) || key === Infinity || key === -Infinity) { + throw new RangeError("A list index must be positive, but you passed " + key) + } + return key +} + +function valueAt( + target: T, + prop: Prop +): ValueType | undefined { + const { context, objectId, path, readonly, heads, textV2 } = target + const value = context.getWithType(objectId, prop, heads) + if (value === null) { + return + } + const datatype = value[0] + const val = value[1] + switch (datatype) { + case undefined: + return + case "map": + return mapProxy( + context, + val as ObjID, + textV2, + [...path, prop], + readonly, + heads + ) + case "list": + return listProxy( + context, + val as ObjID, + textV2, + [...path, prop], + readonly, + heads + ) + case "text": + if (textV2) { + return context.text(val as ObjID, heads) as ValueType + } else { + return textProxy( + context, + val as ObjID, + [...path, prop], + readonly, + heads + ) as unknown as ValueType + } + case "str": + return val as ValueType + case "uint": + return val as ValueType + case "int": + return val as ValueType + case "f64": + return val as ValueType + case "boolean": + return val as ValueType + case "null": + return null as ValueType + case "bytes": + return val as ValueType + case "timestamp": + return val as ValueType + case "counter": { + if (readonly) { + return new Counter(val as number) as ValueType + } else { + const counter: Counter = getWriteableCounter( + val as number, + context, + path, + objectId, + prop + ) + return counter as ValueType + } + } + default: + throw RangeError(`datatype ${datatype} unimplemented`) + } +} + +type ImportedValue = + | [null, "null"] + | [number, "uint"] + | [number, "int"] + | [number, "f64"] + | [number, "counter"] + | [number, "timestamp"] + | [string, "str"] + | [Text | string, "text"] + | [Uint8Array, "bytes"] + | [Array, "list"] + | [Record, "map"] + | [boolean, "boolean"] + +function import_value(value: any, textV2: boolean): ImportedValue { + switch (typeof value) { + case "object": + if (value == null) { + return [null, "null"] + } else if (value[UINT]) { + return [value.value, "uint"] + } else if (value[INT]) { + return [value.value, "int"] + } else if (value[F64]) { + return [value.value, "f64"] + } else if (value[COUNTER]) { + return [value.value, "counter"] + } else if (value instanceof Date) { + return [value.getTime(), "timestamp"] + } else if (value instanceof RawString) { + return [value.val, "str"] + } else if (value instanceof Text) { + return [value, "text"] + } else if (value instanceof Uint8Array) { + return [value, "bytes"] + } else if (value instanceof Array) { + return [value, "list"] + } else if (Object.getPrototypeOf(value) === Object.getPrototypeOf({})) { + return [value, "map"] + } else if (value[OBJECT_ID]) { + throw new RangeError( + "Cannot create a reference to an existing document object" + ) + } else { + throw new RangeError(`Cannot assign unknown object: ${value}`) + } + case "boolean": + return [value, "boolean"] + case "number": + if (Number.isInteger(value)) { + return [value, "int"] + } else { + return [value, "f64"] + } + case "string": + if (textV2) { + return [value, "text"] + } else { + return [value, "str"] + } + default: + throw new RangeError(`Unsupported type of value: ${typeof value}`) + } +} + +const MapHandler = { + get( + target: T, + key: any + ): ValueType | ObjID | boolean | { handle: Automerge } { + const { context, objectId, cache } = target + if (key === Symbol.toStringTag) { + return target[Symbol.toStringTag] + } + if (key === OBJECT_ID) return objectId + if (key === IS_PROXY) return true + if (key === TRACE) return target.trace + if (key === STATE) return { handle: context } + if (!cache[key]) { + cache[key] = valueAt(target, key) + } + return cache[key] + }, + + set(target: Target, key: any, val: any) { + const { context, objectId, path, readonly, frozen, textV2 } = target + target.cache = {} // reset cache on set + if (val && val[OBJECT_ID]) { + throw new RangeError( + "Cannot create a reference to an existing document object" + ) + } + if (key === TRACE) { + target.trace = val + return true + } + const [value, datatype] = import_value(val, textV2) + if (frozen) { + throw new RangeError("Attempting to use an outdated Automerge document") + } + if (readonly) { + throw new RangeError(`Object property "${key}" cannot be modified`) + } + switch (datatype) { + case "list": { + const list = context.putObject(objectId, key, []) + const proxyList = listProxy( + context, + list, + textV2, + [...path, key], + readonly + ) + for (let i = 0; i < value.length; i++) { + proxyList[i] = value[i] + } + break + } + case "text": { + if (textV2) { + assertString(value) + context.putObject(objectId, key, value) + } else { + assertText(value) + const text = context.putObject(objectId, key, "") + const proxyText = textProxy(context, text, [...path, key], readonly) + for (let i = 0; i < value.length; i++) { + proxyText[i] = value.get(i) + } + } + break + } + case "map": { + const map = context.putObject(objectId, key, {}) + const proxyMap = mapProxy( + context, + map, + textV2, + [...path, key], + readonly + ) + for (const key in value) { + proxyMap[key] = value[key] + } + break + } + default: + context.put(objectId, key, value, datatype) + } + return true + }, + + deleteProperty(target: Target, key: any) { + const { context, objectId, readonly } = target + target.cache = {} // reset cache on delete + if (readonly) { + throw new RangeError(`Object property "${key}" cannot be modified`) + } + context.delete(objectId, key) + return true + }, + + has(target: Target, key: any) { + const value = this.get(target, key) + return value !== undefined + }, + + getOwnPropertyDescriptor(target: Target, key: any) { + // const { context, objectId } = target + const value = this.get(target, key) + if (typeof value !== "undefined") { + return { + configurable: true, + enumerable: true, + value, + } + } + }, + + ownKeys(target: Target) { + const { context, objectId, heads } = target + // FIXME - this is a tmp workaround until fix the dupe key bug in keys() + const keys = context.keys(objectId, heads) + return [...new Set(keys)] + }, +} + +const ListHandler = { + get( + target: T, + index: any + ): + | ValueType + | boolean + | ObjID + | { handle: Automerge } + | number + | ((_: any) => boolean) { + const { context, objectId, heads } = target + index = parseListIndex(index) + if (index === Symbol.hasInstance) { + return (instance: any) => { + return Array.isArray(instance) + } + } + if (index === Symbol.toStringTag) { + return target[Symbol.toStringTag] + } + if (index === OBJECT_ID) return objectId + if (index === IS_PROXY) return true + if (index === TRACE) return target.trace + if (index === STATE) return { handle: context } + if (index === "length") return context.length(objectId, heads) + if (typeof index === "number") { + return valueAt(target, index) as ValueType + } else { + return listMethods(target)[index] + } + }, + + set(target: Target, index: any, val: any) { + const { context, objectId, path, readonly, frozen, textV2 } = target + index = parseListIndex(index) + if (val && val[OBJECT_ID]) { + throw new RangeError( + "Cannot create a reference to an existing document object" + ) + } + if (index === TRACE) { + target.trace = val + return true + } + if (typeof index == "string") { + throw new RangeError("list index must be a number") + } + const [value, datatype] = import_value(val, textV2) + if (frozen) { + throw new RangeError("Attempting to use an outdated Automerge document") + } + if (readonly) { + throw new RangeError(`Object property "${index}" cannot be modified`) + } + switch (datatype) { + case "list": { + let list: ObjID + if (index >= context.length(objectId)) { + list = context.insertObject(objectId, index, []) + } else { + list = context.putObject(objectId, index, []) + } + const proxyList = listProxy( + context, + list, + textV2, + [...path, index], + readonly + ) + proxyList.splice(0, 0, ...value) + break + } + case "text": { + if (textV2) { + assertString(value) + if (index >= context.length(objectId)) { + context.insertObject(objectId, index, value) + } else { + context.putObject(objectId, index, value) + } + } else { + let text: ObjID + assertText(value) + if (index >= context.length(objectId)) { + text = context.insertObject(objectId, index, "") + } else { + text = context.putObject(objectId, index, "") + } + const proxyText = textProxy(context, text, [...path, index], readonly) + proxyText.splice(0, 0, ...value) + } + break + } + case "map": { + let map: ObjID + if (index >= context.length(objectId)) { + map = context.insertObject(objectId, index, {}) + } else { + map = context.putObject(objectId, index, {}) + } + const proxyMap = mapProxy( + context, + map, + textV2, + [...path, index], + readonly + ) + for (const key in value) { + proxyMap[key] = value[key] + } + break + } + default: + if (index >= context.length(objectId)) { + context.insert(objectId, index, value, datatype) + } else { + context.put(objectId, index, value, datatype) + } + } + return true + }, + + deleteProperty(target: Target, index: any) { + const { context, objectId } = target + index = parseListIndex(index) + const elem = context.get(objectId, index) + if (elem != null && elem[0] == "counter") { + throw new TypeError( + "Unsupported operation: deleting a counter from a list" + ) + } + context.delete(objectId, index) + return true + }, + + has(target: Target, index: any) { + const { context, objectId, heads } = target + index = parseListIndex(index) + if (typeof index === "number") { + return index < context.length(objectId, heads) + } + return index === "length" + }, + + getOwnPropertyDescriptor(target: Target, index: any) { + const { context, objectId, heads } = target + + if (index === "length") + return { writable: true, value: context.length(objectId, heads) } + if (index === OBJECT_ID) + return { configurable: false, enumerable: false, value: objectId } + + index = parseListIndex(index) + + const value = valueAt(target, index) + return { configurable: true, enumerable: true, value } + }, + + getPrototypeOf(target: Target) { + return Object.getPrototypeOf(target) + }, + ownKeys(/*target*/): string[] { + const keys: string[] = [] + // uncommenting this causes assert.deepEqual() to fail when comparing to a pojo array + // but not uncommenting it causes for (i in list) {} to not enumerate values properly + //const {context, objectId, heads } = target + //for (let i = 0; i < target.context.length(objectId, heads); i++) { keys.push(i.toString()) } + keys.push("length") + return keys + }, +} + +const TextHandler = Object.assign({}, ListHandler, { + get(target: Target, index: any) { + const { context, objectId, heads } = target + index = parseListIndex(index) + if (index === Symbol.hasInstance) { + return (instance: any) => { + return Array.isArray(instance) + } + } + if (index === Symbol.toStringTag) { + return target[Symbol.toStringTag] + } + if (index === OBJECT_ID) return objectId + if (index === IS_PROXY) return true + if (index === TRACE) return target.trace + if (index === STATE) return { handle: context } + if (index === "length") return context.length(objectId, heads) + if (typeof index === "number") { + return valueAt(target, index) + } else { + return textMethods(target)[index] || listMethods(target)[index] + } + }, + getPrototypeOf(/*target*/) { + return Object.getPrototypeOf(new Text()) + }, +}) + +export function mapProxy( + context: Automerge, + objectId: ObjID, + textV2: boolean, + path?: Prop[], + readonly?: boolean, + heads?: Heads +): MapValueType { + const target: Target = { + context, + objectId, + path: path || [], + readonly: !!readonly, + frozen: false, + heads, + cache: {}, + textV2, + } + const proxied = {} + Object.assign(proxied, target) + const result = new Proxy(proxied, MapHandler) + // conversion through unknown is necessary because the types are so different + return result as unknown as MapValueType +} + +export function listProxy( + context: Automerge, + objectId: ObjID, + textV2: boolean, + path?: Prop[], + readonly?: boolean, + heads?: Heads +): ListValueType { + const target: Target = { + context, + objectId, + path: path || [], + readonly: !!readonly, + frozen: false, + heads, + cache: {}, + textV2, + } + const proxied = [] + Object.assign(proxied, target) + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return new Proxy(proxied, ListHandler) as unknown as ListValue +} + +interface TextProxy extends Text { + splice: (index: any, del: any, ...vals: any[]) => void +} + +export function textProxy( + context: Automerge, + objectId: ObjID, + path?: Prop[], + readonly?: boolean, + heads?: Heads +): TextProxy { + const target: Target = { + context, + objectId, + path: path || [], + readonly: !!readonly, + frozen: false, + heads, + cache: {}, + textV2: false, + } + const proxied = {} + Object.assign(proxied, target) + return new Proxy(proxied, TextHandler) as unknown as TextProxy +} + +export function rootProxy( + context: Automerge, + textV2: boolean, + readonly?: boolean +): T { + /* eslint-disable-next-line */ + return mapProxy(context, "_root", textV2, [], !!readonly) +} + +function listMethods(target: T) { + const { context, objectId, path, readonly, frozen, heads, textV2 } = target + const methods = { + deleteAt(index: number, numDelete: number) { + if (typeof numDelete === "number") { + context.splice(objectId, index, numDelete) + } else { + context.delete(objectId, index) + } + return this + }, + + fill(val: ScalarValue, start: number, end: number) { + const [value, datatype] = import_value(val, textV2) + const length = context.length(objectId) + start = parseListIndex(start || 0) + end = parseListIndex(end || length) + for (let i = start; i < Math.min(end, length); i++) { + if (datatype === "list" || datatype === "map") { + context.putObject(objectId, i, value) + } else if (datatype === "text") { + if (textV2) { + assertString(value) + context.putObject(objectId, i, value) + } else { + assertText(value) + const text = context.putObject(objectId, i, "") + const proxyText = textProxy(context, text, [...path, i], readonly) + for (let i = 0; i < value.length; i++) { + proxyText[i] = value.get(i) + } + } + } else { + context.put(objectId, i, value, datatype) + } + } + return this + }, + + indexOf(o: any, start = 0) { + const length = context.length(objectId) + for (let i = start; i < length; i++) { + const value = context.getWithType(objectId, i, heads) + if (value && (value[1] === o[OBJECT_ID] || value[1] === o)) { + return i + } + } + return -1 + }, + + insertAt(index: number, ...values: any[]) { + this.splice(index, 0, ...values) + return this + }, + + pop() { + const length = context.length(objectId) + if (length == 0) { + return undefined + } + const last = valueAt(target, length - 1) + context.delete(objectId, length - 1) + return last + }, + + push(...values: any[]) { + const len = context.length(objectId) + this.splice(len, 0, ...values) + return context.length(objectId) + }, + + shift() { + if (context.length(objectId) == 0) return + const first = valueAt(target, 0) + context.delete(objectId, 0) + return first + }, + + splice(index: any, del: any, ...vals: any[]) { + index = parseListIndex(index) + del = parseListIndex(del) + for (const val of vals) { + if (val && val[OBJECT_ID]) { + throw new RangeError( + "Cannot create a reference to an existing document object" + ) + } + } + if (frozen) { + throw new RangeError("Attempting to use an outdated Automerge document") + } + if (readonly) { + throw new RangeError( + "Sequence object cannot be modified outside of a change block" + ) + } + const result: ValueType[] = [] + for (let i = 0; i < del; i++) { + const value = valueAt(target, index) + if (value !== undefined) { + result.push(value) + } + context.delete(objectId, index) + } + const values = vals.map(val => import_value(val, textV2)) + for (const [value, datatype] of values) { + switch (datatype) { + case "list": { + const list = context.insertObject(objectId, index, []) + const proxyList = listProxy( + context, + list, + textV2, + [...path, index], + readonly + ) + proxyList.splice(0, 0, ...value) + break + } + case "text": { + if (textV2) { + assertString(value) + context.insertObject(objectId, index, value) + } else { + const text = context.insertObject(objectId, index, "") + const proxyText = textProxy( + context, + text, + [...path, index], + readonly + ) + proxyText.splice(0, 0, ...value) + } + break + } + case "map": { + const map = context.insertObject(objectId, index, {}) + const proxyMap = mapProxy( + context, + map, + textV2, + [...path, index], + readonly + ) + for (const key in value) { + proxyMap[key] = value[key] + } + break + } + default: + context.insert(objectId, index, value, datatype) + } + index += 1 + } + return result + }, + + unshift(...values: any) { + this.splice(0, 0, ...values) + return context.length(objectId) + }, + + entries() { + const i = 0 + const iterator = { + next: () => { + const value = valueAt(target, i) + if (value === undefined) { + return { value: undefined, done: true } + } else { + return { value: [i, value], done: false } + } + }, + } + return iterator + }, + + keys() { + let i = 0 + const len = context.length(objectId, heads) + const iterator = { + next: () => { + let value: undefined | number = undefined + if (i < len) { + value = i + i++ + } + return { value, done: true } + }, + } + return iterator + }, + + values() { + const i = 0 + const iterator = { + next: () => { + const value = valueAt(target, i) + if (value === undefined) { + return { value: undefined, done: true } + } else { + return { value, done: false } + } + }, + } + return iterator + }, + + toArray(): ValueType[] { + const list: Array> = [] + let value: ValueType | undefined + do { + value = valueAt(target, list.length) + if (value !== undefined) { + list.push(value) + } + } while (value !== undefined) + + return list + }, + + map(f: (_a: ValueType, _n: number) => U): U[] { + return this.toArray().map(f) + }, + + toString(): string { + return this.toArray().toString() + }, + + toLocaleString(): string { + return this.toArray().toLocaleString() + }, + + forEach(f: (_a: ValueType, _n: number) => undefined) { + return this.toArray().forEach(f) + }, + + // todo: real concat function is different + concat(other: ValueType[]): ValueType[] { + return this.toArray().concat(other) + }, + + every(f: (_a: ValueType, _n: number) => boolean): boolean { + return this.toArray().every(f) + }, + + filter(f: (_a: ValueType, _n: number) => boolean): ValueType[] { + return this.toArray().filter(f) + }, + + find( + f: (_a: ValueType, _n: number) => boolean + ): ValueType | undefined { + let index = 0 + for (const v of this) { + if (f(v, index)) { + return v + } + index += 1 + } + }, + + findIndex(f: (_a: ValueType, _n: number) => boolean): number { + let index = 0 + for (const v of this) { + if (f(v, index)) { + return index + } + index += 1 + } + return -1 + }, + + includes(elem: ValueType): boolean { + return this.find(e => e === elem) !== undefined + }, + + join(sep?: string): string { + return this.toArray().join(sep) + }, + + reduce( + f: (acc: U, currentValue: ValueType) => U, + initialValue: U + ): U | undefined { + return this.toArray().reduce(f, initialValue) + }, + + reduceRight( + f: (acc: U, item: ValueType) => U, + initialValue: U + ): U | undefined { + return this.toArray().reduceRight(f, initialValue) + }, + + lastIndexOf(search: ValueType, fromIndex = +Infinity): number { + // this can be faster + return this.toArray().lastIndexOf(search, fromIndex) + }, + + slice(index?: number, num?: number): ValueType[] { + return this.toArray().slice(index, num) + }, + + some(f: (v: ValueType, i: number) => boolean): boolean { + let index = 0 + for (const v of this) { + if (f(v, index)) { + return true + } + index += 1 + } + return false + }, + + [Symbol.iterator]: function* () { + let i = 0 + let value = valueAt(target, i) + while (value !== undefined) { + yield value + i += 1 + value = valueAt(target, i) + } + }, + } + return methods +} + +function textMethods(target: Target) { + const { context, objectId, heads } = target + const methods = { + set(index: number, value: any) { + return (this[index] = value) + }, + get(index: number): AutomergeValue { + return this[index] + }, + toString(): string { + return context.text(objectId, heads).replace(//g, "") + }, + toSpans(): AutomergeValue[] { + const spans: AutomergeValue[] = [] + let chars = "" + const length = context.length(objectId) + for (let i = 0; i < length; i++) { + const value = this[i] + if (typeof value === "string") { + chars += value + } else { + if (chars.length > 0) { + spans.push(chars) + chars = "" + } + spans.push(value) + } + } + if (chars.length > 0) { + spans.push(chars) + } + return spans + }, + toJSON(): string { + return this.toString() + }, + indexOf(o: any, start = 0) { + const text = context.text(objectId) + return text.indexOf(o, start) + }, + } + return methods +} + +function assertText(value: Text | string): asserts value is Text { + if (!(value instanceof Text)) { + throw new Error("value was not a Text instance") + } +} + +function assertString(value: Text | string): asserts value is string { + if (typeof value !== "string") { + throw new Error("value was not a string") + } +} diff --git a/javascript/src/raw_string.ts b/javascript/src/raw_string.ts new file mode 100644 index 00000000..7fc02084 --- /dev/null +++ b/javascript/src/raw_string.ts @@ -0,0 +1,6 @@ +export class RawString { + val: string + constructor(val: string) { + this.val = val + } +} diff --git a/javascript/src/stable.ts b/javascript/src/stable.ts new file mode 100644 index 00000000..e83b127f --- /dev/null +++ b/javascript/src/stable.ts @@ -0,0 +1,944 @@ +/** @hidden **/ +export { /** @hidden */ uuid } from "./uuid" + +import { rootProxy } from "./proxies" +import { STATE } from "./constants" + +import { + type AutomergeValue, + Counter, + type Doc, + type PatchCallback, +} from "./types" +export { + type AutomergeValue, + Counter, + type Doc, + Int, + Uint, + Float64, + type Patch, + type PatchCallback, + type ScalarValue, +} from "./types" + +import { Text } from "./text" +export { Text } from "./text" + +import type { + API as WasmAPI, + Actor as ActorId, + Prop, + ObjID, + Change, + DecodedChange, + Heads, + MaterializeValue, + JsSyncState, + SyncMessage, + DecodedSyncMessage, +} from "@automerge/automerge-wasm" +export type { + PutPatch, + DelPatch, + SpliceTextPatch, + InsertPatch, + IncPatch, + SyncMessage, +} from "@automerge/automerge-wasm" + +/** @hidden **/ +type API = WasmAPI + +const SyncStateSymbol = Symbol("_syncstate") + +/** + * An opaque type tracking the state of sync with a remote peer + */ +type SyncState = JsSyncState & { _opaque: typeof SyncStateSymbol } + +import { ApiHandler, type ChangeToEncode, UseApi } from "./low_level" + +import { Automerge } from "@automerge/automerge-wasm" + +import { RawString } from "./raw_string" + +import { _state, _is_proxy, _trace, _obj } from "./internal_state" + +import { stableConflictAt } from "./conflicts" + +/** Options passed to {@link change}, and {@link emptyChange} + * @typeParam T - The type of value contained in the document + */ +export type ChangeOptions = { + /** A message which describes the changes */ + message?: string + /** The unix timestamp of the change (purely advisory, not used in conflict resolution) */ + time?: number + /** A callback which will be called to notify the caller of any changes to the document */ + patchCallback?: PatchCallback +} + +/** Options passed to {@link loadIncremental}, {@link applyChanges}, and {@link receiveSyncMessage} + * @typeParam T - The type of value contained in the document + */ +export type ApplyOptions = { patchCallback?: PatchCallback } + +/** + * A List is an extended Array that adds the two helper methods `deleteAt` and `insertAt`. + */ +export interface List extends Array { + insertAt(index: number, ...args: T[]): List + deleteAt(index: number, numDelete?: number): List +} + +/** + * To extend an arbitrary type, we have to turn any arrays that are part of the type's definition into Lists. + * So we recurse through the properties of T, turning any Arrays we find into Lists. + */ +export type Extend = + // is it an array? make it a list (we recursively extend the type of the array's elements as well) + T extends Array + ? List> + : // is it an object? recursively extend all of its properties + // eslint-disable-next-line @typescript-eslint/ban-types + T extends Object + ? { [P in keyof T]: Extend } + : // otherwise leave the type alone + T + +/** + * Function which is called by {@link change} when making changes to a `Doc` + * @typeParam T - The type of value contained in the document + * + * This function may mutate `doc` + */ +export type ChangeFn = (doc: Extend) => void + +/** @hidden **/ +export interface State { + change: DecodedChange + snapshot: T +} + +/** @hidden **/ +export function use(api: API) { + UseApi(api) +} + +import * as wasm from "@automerge/automerge-wasm" +use(wasm) + +/** + * Options to be passed to {@link init} or {@link load} + * @typeParam T - The type of the value the document contains + */ +export type InitOptions = { + /** The actor ID to use for this document, a random one will be generated if `null` is passed */ + actor?: ActorId + freeze?: boolean + /** A callback which will be called with the initial patch once the document has finished loading */ + patchCallback?: PatchCallback + /** @hidden */ + enableTextV2?: boolean +} + +/** @hidden */ +export function getBackend(doc: Doc): Automerge { + return _state(doc).handle +} + +function importOpts(_actor?: ActorId | InitOptions): InitOptions { + if (typeof _actor === "object") { + return _actor + } else { + return { actor: _actor } + } +} + +/** + * Create a new automerge document + * + * @typeParam T - The type of value contained in the document. This will be the + * type that is passed to the change closure in {@link change} + * @param _opts - Either an actorId or an {@link InitOptions} (which may + * contain an actorId). If this is null the document will be initialised with a + * random actor ID + */ +export function init(_opts?: ActorId | InitOptions): Doc { + const opts = importOpts(_opts) + const freeze = !!opts.freeze + const patchCallback = opts.patchCallback + const handle = ApiHandler.create(opts.enableTextV2 || false, opts.actor) + handle.enablePatches(true) + handle.enableFreeze(!!opts.freeze) + handle.registerDatatype("counter", (n: number) => new Counter(n)) + const textV2 = opts.enableTextV2 || false + if (textV2) { + handle.registerDatatype("str", (n: string) => new RawString(n)) + } else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + handle.registerDatatype("text", (n: any) => new Text(n)) + } + const doc = handle.materialize("/", undefined, { + handle, + heads: undefined, + freeze, + patchCallback, + textV2, + }) as Doc + return doc +} + +/** + * Make an immutable view of an automerge document as at `heads` + * + * @remarks + * The document returned from this function cannot be passed to {@link change}. + * This is because it shares the same underlying memory as `doc`, but it is + * consequently a very cheap copy. + * + * Note that this function will throw an error if any of the hashes in `heads` + * are not in the document. + * + * @typeParam T - The type of the value contained in the document + * @param doc - The document to create a view of + * @param heads - The hashes of the heads to create a view at + */ +export function view(doc: Doc, heads: Heads): Doc { + const state = _state(doc) + const handle = state.handle + return state.handle.materialize("/", heads, { + ...state, + handle, + heads, + }) as Doc +} + +/** + * Make a full writable copy of an automerge document + * + * @remarks + * Unlike {@link view} this function makes a full copy of the memory backing + * the document and can thus be passed to {@link change}. It also generates a + * new actor ID so that changes made in the new document do not create duplicate + * sequence numbers with respect to the old document. If you need control over + * the actor ID which is generated you can pass the actor ID as the second + * argument + * + * @typeParam T - The type of the value contained in the document + * @param doc - The document to clone + * @param _opts - Either an actor ID to use for the new doc or an {@link InitOptions} + */ +export function clone( + doc: Doc, + _opts?: ActorId | InitOptions +): Doc { + const state = _state(doc) + const heads = state.heads + const opts = importOpts(_opts) + const handle = state.handle.fork(opts.actor, heads) + + // `change` uses the presence of state.heads to determine if we are in a view + // set it to undefined to indicate that this is a full fat document + const { heads: _oldHeads, ...stateSansHeads } = state + return handle.applyPatches(doc, { ...stateSansHeads, handle }) +} + +/** Explicity free the memory backing a document. Note that this is note + * necessary in environments which support + * [`FinalizationRegistry`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry) + */ +export function free(doc: Doc) { + return _state(doc).handle.free() +} + +/** + * Create an automerge document from a POJO + * + * @param initialState - The initial state which will be copied into the document + * @typeParam T - The type of the value passed to `from` _and_ the type the resulting document will contain + * @typeParam actor - The actor ID of the resulting document, if this is null a random actor ID will be used + * + * @example + * ``` + * const doc = automerge.from({ + * tasks: [ + * {description: "feed dogs", done: false} + * ] + * }) + * ``` + */ +export function from>( + initialState: T | Doc, + _opts?: ActorId | InitOptions +): Doc { + return change(init(_opts), d => Object.assign(d, initialState)) +} + +/** + * Update the contents of an automerge document + * @typeParam T - The type of the value contained in the document + * @param doc - The document to update + * @param options - Either a message, an {@link ChangeOptions}, or a {@link ChangeFn} + * @param callback - A `ChangeFn` to be used if `options` was a `string` + * + * Note that if the second argument is a function it will be used as the `ChangeFn` regardless of what the third argument is. + * + * @example A simple change + * ``` + * let doc1 = automerge.init() + * doc1 = automerge.change(doc1, d => { + * d.key = "value" + * }) + * assert.equal(doc1.key, "value") + * ``` + * + * @example A change with a message + * + * ``` + * doc1 = automerge.change(doc1, "add another value", d => { + * d.key2 = "value2" + * }) + * ``` + * + * @example A change with a message and a timestamp + * + * ``` + * doc1 = automerge.change(doc1, {message: "add another value", time: 1640995200}, d => { + * d.key2 = "value2" + * }) + * ``` + * + * @example responding to a patch callback + * ``` + * let patchedPath + * let patchCallback = patch => { + * patchedPath = patch.path + * } + * doc1 = automerge.change(doc1, {message, "add another value", time: 1640995200, patchCallback}, d => { + * d.key2 = "value2" + * }) + * assert.equal(patchedPath, ["key2"]) + * ``` + */ +export function change( + doc: Doc, + options: string | ChangeOptions | ChangeFn, + callback?: ChangeFn +): Doc { + if (typeof options === "function") { + return _change(doc, {}, options) + } else if (typeof callback === "function") { + if (typeof options === "string") { + options = { message: options } + } + return _change(doc, options, callback) + } else { + throw RangeError("Invalid args for change") + } +} + +function progressDocument( + doc: Doc, + heads: Heads | null, + callback?: PatchCallback +): Doc { + if (heads == null) { + return doc + } + const state = _state(doc) + const nextState = { ...state, heads: undefined } + const nextDoc = state.handle.applyPatches(doc, nextState, callback) + state.heads = heads + return nextDoc +} + +function _change( + doc: Doc, + options: ChangeOptions, + callback: ChangeFn +): Doc { + if (typeof callback !== "function") { + throw new RangeError("invalid change function") + } + + const state = _state(doc) + + if (doc === undefined || state === undefined) { + throw new RangeError("must be the document root") + } + if (state.heads) { + throw new RangeError( + "Attempting to change an outdated document. Use Automerge.clone() if you wish to make a writable copy." + ) + } + if (_is_proxy(doc)) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + const heads = state.handle.getHeads() + try { + state.heads = heads + const root: T = rootProxy(state.handle, state.textV2) + callback(root as Extend) + if (state.handle.pendingOps() === 0) { + state.heads = undefined + return doc + } else { + state.handle.commit(options.message, options.time) + return progressDocument( + doc, + heads, + options.patchCallback || state.patchCallback + ) + } + } catch (e) { + state.heads = undefined + state.handle.rollback() + throw e + } +} + +/** + * Make a change to a document which does not modify the document + * + * @param doc - The doc to add the empty change to + * @param options - Either a message or a {@link ChangeOptions} for the new change + * + * Why would you want to do this? One reason might be that you have merged + * changes from some other peers and you want to generate a change which + * depends on those merged changes so that you can sign the new change with all + * of the merged changes as part of the new change. + */ +export function emptyChange( + doc: Doc, + options: string | ChangeOptions | void +) { + if (options === undefined) { + options = {} + } + if (typeof options === "string") { + options = { message: options } + } + + const state = _state(doc) + + if (state.heads) { + throw new RangeError( + "Attempting to change an outdated document. Use Automerge.clone() if you wish to make a writable copy." + ) + } + if (_is_proxy(doc)) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + + const heads = state.handle.getHeads() + state.handle.emptyChange(options.message, options.time) + return progressDocument(doc, heads) +} + +/** + * Load an automerge document from a compressed document produce by {@link save} + * + * @typeParam T - The type of the value which is contained in the document. + * Note that no validation is done to make sure this type is in + * fact the type of the contained value so be a bit careful + * @param data - The compressed document + * @param _opts - Either an actor ID or some {@link InitOptions}, if the actor + * ID is null a random actor ID will be created + * + * Note that `load` will throw an error if passed incomplete content (for + * example if you are receiving content over the network and don't know if you + * have the complete document yet). If you need to handle incomplete content use + * {@link init} followed by {@link loadIncremental}. + */ +export function load( + data: Uint8Array, + _opts?: ActorId | InitOptions +): Doc { + const opts = importOpts(_opts) + const actor = opts.actor + const patchCallback = opts.patchCallback + const handle = ApiHandler.load(data, opts.enableTextV2 || false, actor) + handle.enablePatches(true) + handle.enableFreeze(!!opts.freeze) + handle.registerDatatype("counter", (n: number) => new Counter(n)) + const textV2 = opts.enableTextV2 || false + if (textV2) { + handle.registerDatatype("str", (n: string) => new RawString(n)) + } else { + handle.registerDatatype("text", (n: string) => new Text(n)) + } + const doc = handle.materialize("/", undefined, { + handle, + heads: undefined, + patchCallback, + textV2, + }) as Doc + return doc +} + +/** + * Load changes produced by {@link saveIncremental}, or partial changes + * + * @typeParam T - The type of the value which is contained in the document. + * Note that no validation is done to make sure this type is in + * fact the type of the contained value so be a bit careful + * @param data - The compressedchanges + * @param opts - an {@link ApplyOptions} + * + * This function is useful when staying up to date with a connected peer. + * Perhaps the other end sent you a full compresed document which you loaded + * with {@link load} and they're sending you the result of + * {@link getLastLocalChange} every time they make a change. + * + * Note that this function will succesfully load the results of {@link save} as + * well as {@link getLastLocalChange} or any other incremental change. + */ +export function loadIncremental( + doc: Doc, + data: Uint8Array, + opts?: ApplyOptions +): Doc { + if (!opts) { + opts = {} + } + const state = _state(doc) + if (state.heads) { + throw new RangeError( + "Attempting to change an out of date document - set at: " + _trace(doc) + ) + } + if (_is_proxy(doc)) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + const heads = state.handle.getHeads() + state.handle.loadIncremental(data) + return progressDocument(doc, heads, opts.patchCallback || state.patchCallback) +} + +/** + * Export the contents of a document to a compressed format + * + * @param doc - The doc to save + * + * The returned bytes can be passed to {@link load} or {@link loadIncremental} + */ +export function save(doc: Doc): Uint8Array { + return _state(doc).handle.save() +} + +/** + * Merge `local` into `remote` + * @typeParam T - The type of values contained in each document + * @param local - The document to merge changes into + * @param remote - The document to merge changes from + * + * @returns - The merged document + * + * Often when you are merging documents you will also need to clone them. Both + * arguments to `merge` are frozen after the call so you can no longer call + * mutating methods (such as {@link change}) on them. The symtom of this will be + * an error which says "Attempting to change an out of date document". To + * overcome this call {@link clone} on the argument before passing it to {@link + * merge}. + */ +export function merge(local: Doc, remote: Doc): Doc { + const localState = _state(local) + + if (localState.heads) { + throw new RangeError( + "Attempting to change an out of date document - set at: " + _trace(local) + ) + } + const heads = localState.handle.getHeads() + const remoteState = _state(remote) + const changes = localState.handle.getChangesAdded(remoteState.handle) + localState.handle.applyChanges(changes) + return progressDocument(local, heads, localState.patchCallback) +} + +/** + * Get the actor ID associated with the document + */ +export function getActorId(doc: Doc): ActorId { + const state = _state(doc) + return state.handle.getActorId() +} + +/** + * The type of conflicts for particular key or index + * + * Maps and sequences in automerge can contain conflicting values for a + * particular key or index. In this case {@link getConflicts} can be used to + * obtain a `Conflicts` representing the multiple values present for the property + * + * A `Conflicts` is a map from a unique (per property or index) key to one of + * the possible conflicting values for the given property. + */ +type Conflicts = { [key: string]: AutomergeValue } + +/** + * Get the conflicts associated with a property + * + * The values of properties in a map in automerge can be conflicted if there + * are concurrent "put" operations to the same key. Automerge chooses one value + * arbitrarily (but deterministically, any two nodes who have the same set of + * changes will choose the same value) from the set of conflicting values to + * present as the value of the key. + * + * Sometimes you may want to examine these conflicts, in this case you can use + * {@link getConflicts} to get the conflicts for the key. + * + * @example + * ``` + * import * as automerge from "@automerge/automerge" + * + * type Profile = { + * pets: Array<{name: string, type: string}> + * } + * + * let doc1 = automerge.init("aaaa") + * doc1 = automerge.change(doc1, d => { + * d.pets = [{name: "Lassie", type: "dog"}] + * }) + * let doc2 = automerge.init("bbbb") + * doc2 = automerge.merge(doc2, automerge.clone(doc1)) + * + * doc2 = automerge.change(doc2, d => { + * d.pets[0].name = "Beethoven" + * }) + * + * doc1 = automerge.change(doc1, d => { + * d.pets[0].name = "Babe" + * }) + * + * const doc3 = automerge.merge(doc1, doc2) + * + * // Note that here we pass `doc3.pets`, not `doc3` + * let conflicts = automerge.getConflicts(doc3.pets[0], "name") + * + * // The two conflicting values are the keys of the conflicts object + * assert.deepEqual(Object.values(conflicts), ["Babe", Beethoven"]) + * ``` + */ +export function getConflicts( + doc: Doc, + prop: Prop +): Conflicts | undefined { + const state = _state(doc, false) + if (state.textV2) { + throw new Error("use unstable.getConflicts for an unstable document") + } + const objectId = _obj(doc) + if (objectId != null) { + return stableConflictAt(state.handle, objectId, prop) + } else { + return undefined + } +} + +/** + * Get the binary representation of the last change which was made to this doc + * + * This is most useful when staying in sync with other peers, every time you + * make a change locally via {@link change} you immediately call {@link + * getLastLocalChange} and send the result over the network to other peers. + */ +export function getLastLocalChange(doc: Doc): Change | undefined { + const state = _state(doc) + return state.handle.getLastLocalChange() || undefined +} + +/** + * Return the object ID of an arbitrary javascript value + * + * This is useful to determine if something is actually an automerge document, + * if `doc` is not an automerge document this will return null. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function getObjectId(doc: any, prop?: Prop): ObjID | null { + if (prop) { + const state = _state(doc, false) + const objectId = _obj(doc) + if (!state || !objectId) { + return null + } + return state.handle.get(objectId, prop) as ObjID + } else { + return _obj(doc) + } +} + +/** + * Get the changes which are in `newState` but not in `oldState`. The returned + * changes can be loaded in `oldState` via {@link applyChanges}. + * + * Note that this will crash if there are changes in `oldState` which are not in `newState`. + */ +export function getChanges(oldState: Doc, newState: Doc): Change[] { + const n = _state(newState) + return n.handle.getChanges(getHeads(oldState)) +} + +/** + * Get all the changes in a document + * + * This is different to {@link save} because the output is an array of changes + * which can be individually applied via {@link applyChanges}` + * + */ +export function getAllChanges(doc: Doc): Change[] { + const state = _state(doc) + return state.handle.getChanges([]) +} + +/** + * Apply changes received from another document + * + * `doc` will be updated to reflect the `changes`. If there are changes which + * we do not have dependencies for yet those will be stored in the document and + * applied when the depended on changes arrive. + * + * You can use the {@link ApplyOptions} to pass a patchcallback which will be + * informed of any changes which occur as a result of applying the changes + * + */ +export function applyChanges( + doc: Doc, + changes: Change[], + opts?: ApplyOptions +): [Doc] { + const state = _state(doc) + if (!opts) { + opts = {} + } + if (state.heads) { + throw new RangeError( + "Attempting to change an outdated document. Use Automerge.clone() if you wish to make a writable copy." + ) + } + if (_is_proxy(doc)) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + const heads = state.handle.getHeads() + state.handle.applyChanges(changes) + state.heads = heads + return [ + progressDocument(doc, heads, opts.patchCallback || state.patchCallback), + ] +} + +/** @hidden */ +export function getHistory(doc: Doc): State[] { + const textV2 = _state(doc).textV2 + const history = getAllChanges(doc) + return history.map((change, index) => ({ + get change() { + return decodeChange(change) + }, + get snapshot() { + const [state] = applyChanges( + init({ enableTextV2: textV2 }), + history.slice(0, index + 1) + ) + return state + }, + })) +} + +/** @hidden */ +// FIXME : no tests +// FIXME can we just use deep equals now? +export function equals(val1: unknown, val2: unknown): boolean { + if (!isObject(val1) || !isObject(val2)) return val1 === val2 + const keys1 = Object.keys(val1).sort(), + keys2 = Object.keys(val2).sort() + if (keys1.length !== keys2.length) return false + for (let i = 0; i < keys1.length; i++) { + if (keys1[i] !== keys2[i]) return false + if (!equals(val1[keys1[i]], val2[keys2[i]])) return false + } + return true +} + +/** + * encode a {@link SyncState} into binary to send over the network + * + * @group sync + * */ +export function encodeSyncState(state: SyncState): Uint8Array { + const sync = ApiHandler.importSyncState(state) + const result = ApiHandler.encodeSyncState(sync) + sync.free() + return result +} + +/** + * Decode some binary data into a {@link SyncState} + * + * @group sync + */ +export function decodeSyncState(state: Uint8Array): SyncState { + const sync = ApiHandler.decodeSyncState(state) + const result = ApiHandler.exportSyncState(sync) + sync.free() + return result as SyncState +} + +/** + * Generate a sync message to send to the peer represented by `inState` + * @param doc - The doc to generate messages about + * @param inState - The {@link SyncState} representing the peer we are talking to + * + * @group sync + * + * @returns An array of `[newSyncState, syncMessage | null]` where + * `newSyncState` should replace `inState` and `syncMessage` should be sent to + * the peer if it is not null. If `syncMessage` is null then we are up to date. + */ +export function generateSyncMessage( + doc: Doc, + inState: SyncState +): [SyncState, SyncMessage | null] { + const state = _state(doc) + const syncState = ApiHandler.importSyncState(inState) + const message = state.handle.generateSyncMessage(syncState) + const outState = ApiHandler.exportSyncState(syncState) as SyncState + return [outState, message] +} + +/** + * Update a document and our sync state on receiving a sync message + * + * @group sync + * + * @param doc - The doc the sync message is about + * @param inState - The {@link SyncState} for the peer we are communicating with + * @param message - The message which was received + * @param opts - Any {@link ApplyOption}s, used for passing a + * {@link PatchCallback} which will be informed of any changes + * in `doc` which occur because of the received sync message. + * + * @returns An array of `[newDoc, newSyncState, syncMessage | null]` where + * `newDoc` is the updated state of `doc`, `newSyncState` should replace + * `inState` and `syncMessage` should be sent to the peer if it is not null. If + * `syncMessage` is null then we are up to date. + */ +export function receiveSyncMessage( + doc: Doc, + inState: SyncState, + message: SyncMessage, + opts?: ApplyOptions +): [Doc, SyncState, null] { + const syncState = ApiHandler.importSyncState(inState) + if (!opts) { + opts = {} + } + const state = _state(doc) + if (state.heads) { + throw new RangeError( + "Attempting to change an outdated document. Use Automerge.clone() if you wish to make a writable copy." + ) + } + if (_is_proxy(doc)) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + const heads = state.handle.getHeads() + state.handle.receiveSyncMessage(syncState, message) + const outSyncState = ApiHandler.exportSyncState(syncState) as SyncState + return [ + progressDocument(doc, heads, opts.patchCallback || state.patchCallback), + outSyncState, + null, + ] +} + +/** + * Create a new, blank {@link SyncState} + * + * When communicating with a peer for the first time use this to generate a new + * {@link SyncState} for them + * + * @group sync + */ +export function initSyncState(): SyncState { + return ApiHandler.exportSyncState(ApiHandler.initSyncState()) as SyncState +} + +/** @hidden */ +export function encodeChange(change: ChangeToEncode): Change { + return ApiHandler.encodeChange(change) +} + +/** @hidden */ +export function decodeChange(data: Change): DecodedChange { + return ApiHandler.decodeChange(data) +} + +/** @hidden */ +export function encodeSyncMessage(message: DecodedSyncMessage): SyncMessage { + return ApiHandler.encodeSyncMessage(message) +} + +/** @hidden */ +export function decodeSyncMessage(message: SyncMessage): DecodedSyncMessage { + return ApiHandler.decodeSyncMessage(message) +} + +/** + * Get any changes in `doc` which are not dependencies of `heads` + */ +export function getMissingDeps(doc: Doc, heads: Heads): Heads { + const state = _state(doc) + return state.handle.getMissingDeps(heads) +} + +/** + * Get the hashes of the heads of this document + */ +export function getHeads(doc: Doc): Heads { + const state = _state(doc) + return state.heads || state.handle.getHeads() +} + +/** @hidden */ +export function dump(doc: Doc) { + const state = _state(doc) + state.handle.dump() +} + +/** @hidden */ +export function toJS(doc: Doc): T { + const state = _state(doc) + const enabled = state.handle.enableFreeze(false) + const result = state.handle.materialize() + state.handle.enableFreeze(enabled) + return result as T +} + +export function isAutomerge(doc: unknown): boolean { + if (typeof doc == "object" && doc !== null) { + return getObjectId(doc) === "_root" && !!Reflect.get(doc, STATE) + } else { + return false + } +} + +function isObject(obj: unknown): obj is Record { + return typeof obj === "object" && obj !== null +} + +export type { + API, + SyncState, + ActorId, + Conflicts, + Prop, + Change, + ObjID, + DecodedChange, + DecodedSyncMessage, + Heads, + MaterializeValue, +} diff --git a/javascript/src/text.ts b/javascript/src/text.ts new file mode 100644 index 00000000..b01bd7db --- /dev/null +++ b/javascript/src/text.ts @@ -0,0 +1,224 @@ +import type { Value } from "@automerge/automerge-wasm" +import { TEXT, STATE } from "./constants" +import type { InternalState } from "./internal_state" + +export class Text { + //eslint-disable-next-line @typescript-eslint/no-explicit-any + elems: Array + str: string | undefined + //eslint-disable-next-line @typescript-eslint/no-explicit-any + spans: Array | undefined; + //eslint-disable-next-line @typescript-eslint/no-explicit-any + [STATE]?: InternalState + + constructor(text?: string | string[] | Value[]) { + if (typeof text === "string") { + this.elems = [...text] + } else if (Array.isArray(text)) { + this.elems = text + } else if (text === undefined) { + this.elems = [] + } else { + throw new TypeError(`Unsupported initial value for Text: ${text}`) + } + Reflect.defineProperty(this, TEXT, { value: true }) + } + + get length(): number { + return this.elems.length + } + + //eslint-disable-next-line @typescript-eslint/no-explicit-any + get(index: number): any { + return this.elems[index] + } + + /** + * Iterates over the text elements character by character, including any + * inline objects. + */ + [Symbol.iterator]() { + const elems = this.elems + let index = -1 + return { + next() { + index += 1 + if (index < elems.length) { + return { done: false, value: elems[index] } + } else { + return { done: true } + } + }, + } + } + + /** + * Returns the content of the Text object as a simple string, ignoring any + * non-character elements. + */ + toString(): string { + if (!this.str) { + // Concatting to a string is faster than creating an array and then + // .join()ing for small (<100KB) arrays. + // https://jsperf.com/join-vs-loop-w-type-test + this.str = "" + for (const elem of this.elems) { + if (typeof elem === "string") this.str += elem + else this.str += "\uFFFC" + } + } + return this.str + } + + /** + * Returns the content of the Text object as a sequence of strings, + * interleaved with non-character elements. + * + * For example, the value `['a', 'b', {x: 3}, 'c', 'd']` has spans: + * `=> ['ab', {x: 3}, 'cd']` + */ + toSpans(): Array { + if (!this.spans) { + this.spans = [] + let chars = "" + for (const elem of this.elems) { + if (typeof elem === "string") { + chars += elem + } else { + if (chars.length > 0) { + this.spans.push(chars) + chars = "" + } + this.spans.push(elem) + } + } + if (chars.length > 0) { + this.spans.push(chars) + } + } + return this.spans + } + + /** + * Returns the content of the Text object as a simple string, so that the + * JSON serialization of an Automerge document represents text nicely. + */ + toJSON(): string { + return this.toString() + } + + /** + * Updates the list item at position `index` to a new value `value`. + */ + set(index: number, value: Value) { + if (this[STATE]) { + throw new RangeError( + "object cannot be modified outside of a change block" + ) + } + this.elems[index] = value + } + + /** + * Inserts new list items `values` starting at position `index`. + */ + insertAt(index: number, ...values: Array) { + if (this[STATE]) { + throw new RangeError( + "object cannot be modified outside of a change block" + ) + } + this.elems.splice(index, 0, ...values) + } + + /** + * Deletes `numDelete` list items starting at position `index`. + * if `numDelete` is not given, one item is deleted. + */ + deleteAt(index: number, numDelete = 1) { + if (this[STATE]) { + throw new RangeError( + "object cannot be modified outside of a change block" + ) + } + this.elems.splice(index, numDelete) + } + + map(callback: (e: Value | object) => T) { + this.elems.map(callback) + } + + lastIndexOf(searchElement: Value, fromIndex?: number) { + this.elems.lastIndexOf(searchElement, fromIndex) + } + + concat(other: Text): Text { + return new Text(this.elems.concat(other.elems)) + } + + every(test: (v: Value) => boolean): boolean { + return this.elems.every(test) + } + + filter(test: (v: Value) => boolean): Text { + return new Text(this.elems.filter(test)) + } + + find(test: (v: Value) => boolean): Value | undefined { + return this.elems.find(test) + } + + findIndex(test: (v: Value) => boolean): number | undefined { + return this.elems.findIndex(test) + } + + forEach(f: (v: Value) => undefined) { + this.elems.forEach(f) + } + + includes(elem: Value): boolean { + return this.elems.includes(elem) + } + + indexOf(elem: Value) { + return this.elems.indexOf(elem) + } + + join(sep?: string): string { + return this.elems.join(sep) + } + + reduce( + f: ( + previousValue: Value, + currentValue: Value, + currentIndex: number, + array: Value[] + ) => Value + ) { + this.elems.reduce(f) + } + + reduceRight( + f: ( + previousValue: Value, + currentValue: Value, + currentIndex: number, + array: Value[] + ) => Value + ) { + this.elems.reduceRight(f) + } + + slice(start?: number, end?: number) { + new Text(this.elems.slice(start, end)) + } + + some(test: (arg: Value) => boolean): boolean { + return this.elems.some(test) + } + + toLocaleString() { + this.toString() + } +} diff --git a/javascript/src/types.ts b/javascript/src/types.ts new file mode 100644 index 00000000..beb5cf70 --- /dev/null +++ b/javascript/src/types.ts @@ -0,0 +1,46 @@ +export { Text } from "./text" +import { Text } from "./text" +export { Counter } from "./counter" +export { Int, Uint, Float64 } from "./numbers" + +import { Counter } from "./counter" +import type { Patch } from "@automerge/automerge-wasm" +export type { Patch } from "@automerge/automerge-wasm" + +export type AutomergeValue = + | ScalarValue + | { [key: string]: AutomergeValue } + | Array + | Text +export type MapValue = { [key: string]: AutomergeValue } +export type ListValue = Array +export type ScalarValue = + | string + | number + | null + | boolean + | Date + | Counter + | Uint8Array + +/** + * An automerge document. + * @typeParam T - The type of the value contained in this document + * + * Note that this provides read only access to the fields of the value. To + * modify the value use {@link change} + */ +export type Doc = { readonly [P in keyof T]: T[P] } + +/** + * Callback which is called by various methods in this library to notify the + * user of what changes have been made. + * @param patch - A description of the changes made + * @param before - The document before the change was made + * @param after - The document after the change was made + */ +export type PatchCallback = ( + patches: Array, + before: Doc, + after: Doc +) => void diff --git a/javascript/src/unstable.ts b/javascript/src/unstable.ts new file mode 100644 index 00000000..7c73afb9 --- /dev/null +++ b/javascript/src/unstable.ts @@ -0,0 +1,294 @@ +/** + * # The unstable API + * + * This module contains new features we are working on which are either not yet + * ready for a stable release and/or which will result in backwards incompatible + * API changes. The API of this module may change in arbitrary ways between + * point releases - we will always document what these changes are in the + * [CHANGELOG](#changelog) below, but only depend on this module if you are prepared to deal + * with frequent changes. + * + * ## Differences from stable + * + * In the stable API text objects are represented using the {@link Text} class. + * This means you must decide up front whether your string data might need + * concurrent merges in the future and if you change your mind you have to + * figure out how to migrate your data. In the unstable API the `Text` class is + * gone and all `string`s are represented using the text CRDT, allowing for + * concurrent changes. Modifying a string is done using the {@link splice} + * function. You can still access the old behaviour of strings which do not + * support merging behaviour via the {@link RawString} class. + * + * This leads to the following differences from `stable`: + * + * * There is no `unstable.Text` class, all strings are text objects + * * Reading strings in an `unstable` document is the same as reading any other + * javascript string + * * To modify strings in an `unstable` document use {@link splice} + * * The {@link AutomergeValue} type does not include the {@link Text} + * class but the {@link RawString} class is included in the {@link ScalarValue} + * type + * + * ## CHANGELOG + * * Introduce this module to expose the new API which has no `Text` class + * + * + * @module + */ + +export { + Counter, + type Doc, + Int, + Uint, + Float64, + type Patch, + type PatchCallback, + type AutomergeValue, + type ScalarValue, +} from "./unstable_types" + +import type { PatchCallback } from "./stable" + +import { type UnstableConflicts as Conflicts } from "./conflicts" +import { unstableConflictAt } from "./conflicts" + +export type { + PutPatch, + DelPatch, + SpliceTextPatch, + InsertPatch, + IncPatch, + SyncMessage, +} from "@automerge/automerge-wasm" + +export type { ChangeOptions, ApplyOptions, ChangeFn } from "./stable" +export { + view, + free, + getHeads, + change, + emptyChange, + loadIncremental, + save, + merge, + getActorId, + getLastLocalChange, + getChanges, + getAllChanges, + applyChanges, + getHistory, + equals, + encodeSyncState, + decodeSyncState, + generateSyncMessage, + receiveSyncMessage, + initSyncState, + encodeChange, + decodeChange, + encodeSyncMessage, + decodeSyncMessage, + getMissingDeps, + dump, + toJS, + isAutomerge, + getObjectId, +} from "./stable" + +export type InitOptions = { + /** The actor ID to use for this document, a random one will be generated if `null` is passed */ + actor?: ActorId + freeze?: boolean + /** A callback which will be called with the initial patch once the document has finished loading */ + patchCallback?: PatchCallback +} + +import { ActorId, Doc } from "./stable" +import * as stable from "./stable" +export { RawString } from "./raw_string" + +/** @hidden */ +export const getBackend = stable.getBackend + +import { _is_proxy, _state, _obj } from "./internal_state" + +/** + * Create a new automerge document + * + * @typeParam T - The type of value contained in the document. This will be the + * type that is passed to the change closure in {@link change} + * @param _opts - Either an actorId or an {@link InitOptions} (which may + * contain an actorId). If this is null the document will be initialised with a + * random actor ID + */ +export function init(_opts?: ActorId | InitOptions): Doc { + const opts = importOpts(_opts) + opts.enableTextV2 = true + return stable.init(opts) +} + +/** + * Make a full writable copy of an automerge document + * + * @remarks + * Unlike {@link view} this function makes a full copy of the memory backing + * the document and can thus be passed to {@link change}. It also generates a + * new actor ID so that changes made in the new document do not create duplicate + * sequence numbers with respect to the old document. If you need control over + * the actor ID which is generated you can pass the actor ID as the second + * argument + * + * @typeParam T - The type of the value contained in the document + * @param doc - The document to clone + * @param _opts - Either an actor ID to use for the new doc or an {@link InitOptions} + */ +export function clone( + doc: Doc, + _opts?: ActorId | InitOptions +): Doc { + const opts = importOpts(_opts) + opts.enableTextV2 = true + return stable.clone(doc, opts) +} + +/** + * Create an automerge document from a POJO + * + * @param initialState - The initial state which will be copied into the document + * @typeParam T - The type of the value passed to `from` _and_ the type the resulting document will contain + * @typeParam actor - The actor ID of the resulting document, if this is null a random actor ID will be used + * + * @example + * ``` + * const doc = automerge.from({ + * tasks: [ + * {description: "feed dogs", done: false} + * ] + * }) + * ``` + */ +export function from>( + initialState: T | Doc, + _opts?: ActorId | InitOptions +): Doc { + const opts = importOpts(_opts) + opts.enableTextV2 = true + return stable.from(initialState, opts) +} + +/** + * Load an automerge document from a compressed document produce by {@link save} + * + * @typeParam T - The type of the value which is contained in the document. + * Note that no validation is done to make sure this type is in + * fact the type of the contained value so be a bit careful + * @param data - The compressed document + * @param _opts - Either an actor ID or some {@link InitOptions}, if the actor + * ID is null a random actor ID will be created + * + * Note that `load` will throw an error if passed incomplete content (for + * example if you are receiving content over the network and don't know if you + * have the complete document yet). If you need to handle incomplete content use + * {@link init} followed by {@link loadIncremental}. + */ +export function load( + data: Uint8Array, + _opts?: ActorId | InitOptions +): Doc { + const opts = importOpts(_opts) + opts.enableTextV2 = true + return stable.load(data, opts) +} + +function importOpts( + _actor?: ActorId | InitOptions +): stable.InitOptions { + if (typeof _actor === "object") { + return _actor + } else { + return { actor: _actor } + } +} + +export function splice( + doc: Doc, + prop: stable.Prop, + index: number, + del: number, + newText?: string +) { + if (!_is_proxy(doc)) { + throw new RangeError("object cannot be modified outside of a change block") + } + const state = _state(doc, false) + const objectId = _obj(doc) + if (!objectId) { + throw new RangeError("invalid object for splice") + } + const value = `${objectId}/${prop}` + try { + return state.handle.splice(value, index, del, newText) + } catch (e) { + throw new RangeError(`Cannot splice: ${e}`) + } +} + +/** + * Get the conflicts associated with a property + * + * The values of properties in a map in automerge can be conflicted if there + * are concurrent "put" operations to the same key. Automerge chooses one value + * arbitrarily (but deterministically, any two nodes who have the same set of + * changes will choose the same value) from the set of conflicting values to + * present as the value of the key. + * + * Sometimes you may want to examine these conflicts, in this case you can use + * {@link getConflicts} to get the conflicts for the key. + * + * @example + * ``` + * import * as automerge from "@automerge/automerge" + * + * type Profile = { + * pets: Array<{name: string, type: string}> + * } + * + * let doc1 = automerge.init("aaaa") + * doc1 = automerge.change(doc1, d => { + * d.pets = [{name: "Lassie", type: "dog"}] + * }) + * let doc2 = automerge.init("bbbb") + * doc2 = automerge.merge(doc2, automerge.clone(doc1)) + * + * doc2 = automerge.change(doc2, d => { + * d.pets[0].name = "Beethoven" + * }) + * + * doc1 = automerge.change(doc1, d => { + * d.pets[0].name = "Babe" + * }) + * + * const doc3 = automerge.merge(doc1, doc2) + * + * // Note that here we pass `doc3.pets`, not `doc3` + * let conflicts = automerge.getConflicts(doc3.pets[0], "name") + * + * // The two conflicting values are the keys of the conflicts object + * assert.deepEqual(Object.values(conflicts), ["Babe", Beethoven"]) + * ``` + */ +export function getConflicts( + doc: Doc, + prop: stable.Prop +): Conflicts | undefined { + const state = _state(doc, false) + if (!state.textV2) { + throw new Error("use getConflicts for a stable document") + } + const objectId = _obj(doc) + if (objectId != null) { + return unstableConflictAt(state.handle, objectId, prop) + } else { + return undefined + } +} diff --git a/javascript/src/unstable_types.ts b/javascript/src/unstable_types.ts new file mode 100644 index 00000000..071e2cc4 --- /dev/null +++ b/javascript/src/unstable_types.ts @@ -0,0 +1,30 @@ +import { Counter } from "./types" + +export { + Counter, + type Doc, + Int, + Uint, + Float64, + type Patch, + type PatchCallback, +} from "./types" + +import { RawString } from "./raw_string" +export { RawString } from "./raw_string" + +export type AutomergeValue = + | ScalarValue + | { [key: string]: AutomergeValue } + | Array +export type MapValue = { [key: string]: AutomergeValue } +export type ListValue = Array +export type ScalarValue = + | string + | number + | null + | boolean + | Date + | Counter + | Uint8Array + | RawString diff --git a/javascript/src/uuid.deno.ts b/javascript/src/uuid.deno.ts new file mode 100644 index 00000000..04c9b93d --- /dev/null +++ b/javascript/src/uuid.deno.ts @@ -0,0 +1,26 @@ +import * as v4 from "https://deno.land/x/uuid@v0.1.2/mod.ts" + +// this file is a deno only port of the uuid module + +function defaultFactory() { + return v4.uuid().replace(/-/g, "") +} + +let factory = defaultFactory + +interface UUIDFactory extends Function { + setFactory(f: typeof factory): void + reset(): void +} + +export const uuid: UUIDFactory = () => { + return factory() +} + +uuid.setFactory = newFactory => { + factory = newFactory +} + +uuid.reset = () => { + factory = defaultFactory +} diff --git a/javascript/src/uuid.ts b/javascript/src/uuid.ts new file mode 100644 index 00000000..421ddf9d --- /dev/null +++ b/javascript/src/uuid.ts @@ -0,0 +1,24 @@ +import { v4 } from "uuid" + +function defaultFactory() { + return v4().replace(/-/g, "") +} + +let factory = defaultFactory + +interface UUIDFactory extends Function { + setFactory(f: typeof factory): void + reset(): void +} + +export const uuid: UUIDFactory = () => { + return factory() +} + +uuid.setFactory = newFactory => { + factory = newFactory +} + +uuid.reset = () => { + factory = defaultFactory +} diff --git a/javascript/test/basic_test.ts b/javascript/test/basic_test.ts new file mode 100644 index 00000000..e34484c4 --- /dev/null +++ b/javascript/test/basic_test.ts @@ -0,0 +1,488 @@ +import * as assert from "assert" +import { unstable as Automerge } from "../src" +import * as WASM from "@automerge/automerge-wasm" + +describe("Automerge", () => { + describe("basics", () => { + it("should init clone and free", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.clone(doc1) + + // this is only needed if weakrefs are not supported + Automerge.free(doc1) + Automerge.free(doc2) + }) + + it("should be able to make a view with specifc heads", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => (d.value = 1)) + let heads2 = Automerge.getHeads(doc2) + let doc3 = Automerge.change(doc2, d => (d.value = 2)) + let doc2_v2 = Automerge.view(doc3, heads2) + assert.deepEqual(doc2, doc2_v2) + let doc2_v2_clone = Automerge.clone(doc2, "aabbcc") + assert.deepEqual(doc2, doc2_v2_clone) + assert.equal(Automerge.getActorId(doc2_v2_clone), "aabbcc") + }) + + it("should allow you to change a clone of a view", () => { + let doc1 = Automerge.init() + doc1 = Automerge.change(doc1, d => (d.key = "value")) + let heads = Automerge.getHeads(doc1) + doc1 = Automerge.change(doc1, d => (d.key = "value2")) + let fork = Automerge.clone(Automerge.view(doc1, heads)) + assert.deepEqual(fork, { key: "value" }) + fork = Automerge.change(fork, d => (d.key = "value3")) + assert.deepEqual(fork, { key: "value3" }) + }) + + it("handle basic set and read on root object", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.hello = "world" + d.big = "little" + d.zip = "zop" + d.app = "dap" + assert.deepEqual(d, { + hello: "world", + big: "little", + zip: "zop", + app: "dap", + }) + }) + assert.deepEqual(doc2, { + hello: "world", + big: "little", + zip: "zop", + app: "dap", + }) + }) + + it("should be able to insert and delete a large number of properties", () => { + let doc = Automerge.init() + + doc = Automerge.change(doc, doc => { + doc["k1"] = true + }) + + for (let idx = 1; idx <= 200; idx++) { + doc = Automerge.change(doc, doc => { + delete doc["k" + idx] + doc["k" + (idx + 1)] = true + assert(Object.keys(doc).length == 1) + }) + } + }) + + it("can detect an automerge doc with isAutomerge()", () => { + const doc1 = Automerge.from({ sub: { object: true } }) + assert(Automerge.isAutomerge(doc1)) + assert(!Automerge.isAutomerge(doc1.sub)) + assert(!Automerge.isAutomerge("String")) + assert(!Automerge.isAutomerge({ sub: { object: true } })) + assert(!Automerge.isAutomerge(undefined)) + const jsObj = Automerge.toJS(doc1) + assert(!Automerge.isAutomerge(jsObj)) + assert.deepEqual(jsObj, doc1) + }) + + it("it should recursively freeze the document if requested", () => { + let doc1 = Automerge.init({ freeze: true }) + let doc2 = Automerge.init() + + assert(Object.isFrozen(doc1)) + assert(!Object.isFrozen(doc2)) + + // will also freeze sub objects + doc1 = Automerge.change( + doc1, + doc => (doc.book = { title: "how to win friends" }) + ) + doc2 = Automerge.merge(doc2, doc1) + assert(Object.isFrozen(doc1)) + assert(Object.isFrozen(doc1.book)) + assert(!Object.isFrozen(doc2)) + assert(!Object.isFrozen(doc2.book)) + + // works on from + let doc3 = Automerge.from({ sub: { obj: "inner" } }, { freeze: true }) + assert(Object.isFrozen(doc3)) + assert(Object.isFrozen(doc3.sub)) + + // works on load + let doc4 = Automerge.load(Automerge.save(doc3), { freeze: true }) + assert(Object.isFrozen(doc4)) + assert(Object.isFrozen(doc4.sub)) + + // follows clone + let doc5 = Automerge.clone(doc4) + assert(Object.isFrozen(doc5)) + assert(Object.isFrozen(doc5.sub)) + + // toJS does not freeze + let exported = Automerge.toJS(doc5) + assert(!Object.isFrozen(exported)) + }) + + it("handle basic sets over many changes", () => { + let doc1 = Automerge.init() + let timestamp = new Date() + let counter = new Automerge.Counter(100) + let bytes = new Uint8Array([10, 11, 12]) + let doc2 = Automerge.change(doc1, d => { + d.hello = "world" + }) + let doc3 = Automerge.change(doc2, d => { + d.counter1 = counter + }) + let doc4 = Automerge.change(doc3, d => { + d.timestamp1 = timestamp + }) + let doc5 = Automerge.change(doc4, d => { + d.app = null + }) + let doc6 = Automerge.change(doc5, d => { + d.bytes1 = bytes + }) + let doc7 = Automerge.change(doc6, d => { + d.uint = new Automerge.Uint(1) + d.int = new Automerge.Int(-1) + d.float64 = new Automerge.Float64(5.5) + d.number1 = 100 + d.number2 = -45.67 + d.true = true + d.false = false + }) + + assert.deepEqual(doc7, { + hello: "world", + true: true, + false: false, + int: -1, + uint: 1, + float64: 5.5, + number1: 100, + number2: -45.67, + counter1: counter, + timestamp1: timestamp, + bytes1: bytes, + app: null, + }) + + let changes = Automerge.getAllChanges(doc7) + let t1 = Automerge.init() + let [t2] = Automerge.applyChanges(t1, changes) + assert.deepEqual(doc7, t2) + }) + + it("handle overwrites to values", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.hello = "world1" + }) + let doc3 = Automerge.change(doc2, d => { + d.hello = "world2" + }) + let doc4 = Automerge.change(doc3, d => { + d.hello = "world3" + }) + let doc5 = Automerge.change(doc4, d => { + d.hello = "world4" + }) + assert.deepEqual(doc5, { hello: "world4" }) + }) + + it("handle set with object value", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.subobj = { hello: "world", subsubobj: { zip: "zop" } } + }) + assert.deepEqual(doc2, { + subobj: { hello: "world", subsubobj: { zip: "zop" } }, + }) + }) + + it("handle simple list creation", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => (d.list = [])) + assert.deepEqual(doc2, { list: [] }) + }) + + it("handle simple lists", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.list = [1, 2, 3] + }) + assert.deepEqual(doc2.list.length, 3) + assert.deepEqual(doc2.list[0], 1) + assert.deepEqual(doc2.list[1], 2) + assert.deepEqual(doc2.list[2], 3) + assert.deepEqual(doc2, { list: [1, 2, 3] }) + // assert.deepStrictEqual(Automerge.toJS(doc2), { list: [1,2,3] }) + + let doc3 = Automerge.change(doc2, d => { + d.list[1] = "a" + }) + + assert.deepEqual(doc3.list.length, 3) + assert.deepEqual(doc3.list[0], 1) + assert.deepEqual(doc3.list[1], "a") + assert.deepEqual(doc3.list[2], 3) + assert.deepEqual(doc3, { list: [1, "a", 3] }) + }) + it("handle simple lists", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.list = [1, 2, 3] + }) + let changes = Automerge.getChanges(doc1, doc2) + let docB1 = Automerge.init() + let [docB2] = Automerge.applyChanges(docB1, changes) + assert.deepEqual(docB2, doc2) + }) + it("handle text", () => { + let doc1 = Automerge.init() + let doc2 = Automerge.change(doc1, d => { + d.list = "hello" + Automerge.splice(d, "list", 2, 0, "Z") + }) + let changes = Automerge.getChanges(doc1, doc2) + let docB1 = Automerge.init() + let [docB2] = Automerge.applyChanges(docB1, changes) + assert.deepEqual(docB2, doc2) + }) + + it("handle non-text strings", () => { + let doc1 = WASM.create(true) + doc1.put("_root", "text", "hello world") + let doc2 = Automerge.load(doc1.save()) + assert.throws(() => { + Automerge.change(doc2, d => { + Automerge.splice(d, "text", 1, 0, "Z") + }) + }, /Cannot splice/) + }) + + it("have many list methods", () => { + let doc1 = Automerge.from({ list: [1, 2, 3] }) + assert.deepEqual(doc1, { list: [1, 2, 3] }) + let doc2 = Automerge.change(doc1, d => { + d.list.splice(1, 1, 9, 10) + }) + assert.deepEqual(doc2, { list: [1, 9, 10, 3] }) + let doc3 = Automerge.change(doc2, d => { + d.list.push(11, 12) + }) + assert.deepEqual(doc3, { list: [1, 9, 10, 3, 11, 12] }) + let doc4 = Automerge.change(doc3, d => { + d.list.unshift(2, 2) + }) + assert.deepEqual(doc4, { list: [2, 2, 1, 9, 10, 3, 11, 12] }) + let doc5 = Automerge.change(doc4, d => { + d.list.shift() + }) + assert.deepEqual(doc5, { list: [2, 1, 9, 10, 3, 11, 12] }) + let doc6 = Automerge.change(doc5, d => { + d.list.insertAt(3, 100, 101) + }) + assert.deepEqual(doc6, { list: [2, 1, 9, 100, 101, 10, 3, 11, 12] }) + }) + + it("allows access to the backend", () => { + let doc = Automerge.init() + assert.deepEqual(Object.keys(Automerge.getBackend(doc)), ["ptr"]) + }) + + it("lists and text have indexof", () => { + let doc = Automerge.from({ + list: [0, 1, 2, 3, 4, 5, 6], + text: "hello world", + }) + assert.deepEqual(doc.list.indexOf(5), 5) + assert.deepEqual(doc.text.indexOf("world"), 6) + }) + }) + + describe("emptyChange", () => { + it("should generate a hash", () => { + let doc = Automerge.init() + doc = Automerge.change(doc, d => { + d.key = "value" + }) + Automerge.save(doc) + let headsBefore = Automerge.getHeads(doc) + headsBefore.sort() + doc = Automerge.emptyChange(doc, "empty change") + let headsAfter = Automerge.getHeads(doc) + headsAfter.sort() + assert.notDeepEqual(headsBefore, headsAfter) + }) + }) + + describe("proxy lists", () => { + it("behave like arrays", () => { + let doc = Automerge.from({ + chars: ["a", "b", "c"], + numbers: [20, 3, 100], + repeats: [20, 20, 3, 3, 3, 3, 100, 100], + }) + let r1: Array = [] + doc = Automerge.change(doc, d => { + assert.deepEqual((d.chars as any[]).concat([1, 2]), [ + "a", + "b", + "c", + 1, + 2, + ]) + assert.deepEqual( + d.chars.map(n => n + "!"), + ["a!", "b!", "c!"] + ) + assert.deepEqual( + d.numbers.map(n => n + 10), + [30, 13, 110] + ) + assert.deepEqual(d.numbers.toString(), "20,3,100") + assert.deepEqual(d.numbers.toLocaleString(), "20,3,100") + assert.deepEqual( + d.numbers.forEach((n: number) => r1.push(n)), + undefined + ) + assert.deepEqual( + d.numbers.every(n => n > 1), + true + ) + assert.deepEqual( + d.numbers.every(n => n > 10), + false + ) + assert.deepEqual( + d.numbers.filter(n => n > 10), + [20, 100] + ) + assert.deepEqual( + d.repeats.find(n => n < 10), + 3 + ) + assert.deepEqual( + d.repeats.find(n => n < 10), + 3 + ) + assert.deepEqual( + d.repeats.find(n => n < 0), + undefined + ) + assert.deepEqual( + d.repeats.findIndex(n => n < 10), + 2 + ) + assert.deepEqual( + d.repeats.findIndex(n => n < 0), + -1 + ) + assert.deepEqual( + d.repeats.findIndex(n => n < 10), + 2 + ) + assert.deepEqual( + d.repeats.findIndex(n => n < 0), + -1 + ) + assert.deepEqual(d.numbers.includes(3), true) + assert.deepEqual(d.numbers.includes(-3), false) + assert.deepEqual(d.numbers.join("|"), "20|3|100") + assert.deepEqual(d.numbers.join(), "20,3,100") + assert.deepEqual( + d.numbers.some(f => f === 3), + true + ) + assert.deepEqual( + d.numbers.some(f => f < 0), + false + ) + assert.deepEqual( + d.numbers.reduce((sum, n) => sum + n, 100), + 223 + ) + assert.deepEqual( + d.repeats.reduce((sum, n) => sum + n, 100), + 352 + ) + assert.deepEqual( + d.chars.reduce((sum, n) => sum + n, "="), + "=abc" + ) + assert.deepEqual( + d.chars.reduceRight((sum, n) => sum + n, "="), + "=cba" + ) + assert.deepEqual( + d.numbers.reduceRight((sum, n) => sum + n, 100), + 223 + ) + assert.deepEqual(d.repeats.lastIndexOf(3), 5) + assert.deepEqual(d.repeats.lastIndexOf(3, 3), 3) + }) + doc = Automerge.change(doc, d => { + assert.deepEqual(d.numbers.fill(-1, 1, 2), [20, -1, 100]) + assert.deepEqual(d.chars.fill("z", 1, 100), ["a", "z", "z"]) + }) + assert.deepEqual(r1, [20, 3, 100]) + assert.deepEqual(doc.numbers, [20, -1, 100]) + assert.deepEqual(doc.chars, ["a", "z", "z"]) + }) + }) + + it("should obtain the same conflicts, regardless of merge order", () => { + let s1 = Automerge.init() + let s2 = Automerge.init() + s1 = Automerge.change(s1, doc => { + doc.x = 1 + doc.y = 2 + }) + s2 = Automerge.change(s2, doc => { + doc.x = 3 + doc.y = 4 + }) + const m1 = Automerge.merge(Automerge.clone(s1), Automerge.clone(s2)) + const m2 = Automerge.merge(Automerge.clone(s2), Automerge.clone(s1)) + assert.deepStrictEqual( + Automerge.getConflicts(m1, "x"), + Automerge.getConflicts(m2, "x") + ) + }) + + describe("getObjectId", () => { + let s1 = Automerge.from({ + string: "string", + number: 1, + null: null, + date: new Date(), + counter: new Automerge.Counter(), + bytes: new Uint8Array(10), + text: "", + list: [], + map: {}, + }) + + it("should return null for scalar values", () => { + assert.equal(Automerge.getObjectId(s1.string), null) + assert.equal(Automerge.getObjectId(s1.number), null) + assert.equal(Automerge.getObjectId(s1.null!), null) + assert.equal(Automerge.getObjectId(s1.date), null) + assert.equal(Automerge.getObjectId(s1.counter), null) + assert.equal(Automerge.getObjectId(s1.bytes), null) + }) + + it("should return _root for the root object", () => { + assert.equal(Automerge.getObjectId(s1), "_root") + }) + + it("should return non-null for map, list, text, and objects", () => { + assert.equal(Automerge.getObjectId(s1.text), null) + assert.notEqual(Automerge.getObjectId(s1.list), null) + assert.notEqual(Automerge.getObjectId(s1.map), null) + }) + }) +}) diff --git a/javascript/test/extra_api_tests.ts b/javascript/test/extra_api_tests.ts new file mode 100644 index 00000000..84fa4c39 --- /dev/null +++ b/javascript/test/extra_api_tests.ts @@ -0,0 +1,28 @@ +import * as assert from "assert" +import { unstable as Automerge } from "../src" + +describe("Automerge", () => { + describe("basics", () => { + it("should allow you to load incrementally", () => { + let doc1 = Automerge.from({ foo: "bar" }) + let doc2 = Automerge.init() + doc2 = Automerge.loadIncremental(doc2, Automerge.save(doc1)) + doc1 = Automerge.change(doc1, d => (d.foo2 = "bar2")) + doc2 = Automerge.loadIncremental( + doc2, + Automerge.getBackend(doc1).saveIncremental() + ) + doc1 = Automerge.change(doc1, d => (d.foo = "bar2")) + doc2 = Automerge.loadIncremental( + doc2, + Automerge.getBackend(doc1).saveIncremental() + ) + doc1 = Automerge.change(doc1, d => (d.x = "y")) + doc2 = Automerge.loadIncremental( + doc2, + Automerge.getBackend(doc1).saveIncremental() + ) + assert.deepEqual(doc1, doc2) + }) + }) +}) diff --git a/javascript/test/helpers.ts b/javascript/test/helpers.ts new file mode 100644 index 00000000..df76e558 --- /dev/null +++ b/javascript/test/helpers.ts @@ -0,0 +1,36 @@ +import * as assert from "assert" +import { Encoder } from "./legacy/encoding" + +// Assertion that succeeds if the first argument deepStrictEquals at least one of the +// subsequent arguments (but we don't care which one) +export function assertEqualsOneOf(actual, ...expected) { + assert(expected.length > 0) + for (let i = 0; i < expected.length; i++) { + try { + assert.deepStrictEqual(actual, expected[i]) + return // if we get here without an exception, that means success + } catch (e) { + if (e instanceof assert.AssertionError) { + if (!e.name.match(/^AssertionError/) || i === expected.length - 1) + throw e + } else { + throw e + } + } + } +} + +/** + * Asserts that the byte array maintained by `encoder` contains the same byte + * sequence as the array `bytes`. + */ +export function checkEncoded(encoder, bytes, detail?) { + const encoded = encoder instanceof Encoder ? encoder.buffer : encoder + const expected = new Uint8Array(bytes) + const message = + (detail ? `${detail}: ` : "") + `${encoded} expected to equal ${expected}` + assert(encoded.byteLength === expected.byteLength, message) + for (let i = 0; i < encoded.byteLength; i++) { + assert(encoded[i] === expected[i], message) + } +} diff --git a/javascript/test/legacy/columnar.js b/javascript/test/legacy/columnar.js new file mode 100644 index 00000000..6a9b5874 --- /dev/null +++ b/javascript/test/legacy/columnar.js @@ -0,0 +1,1315 @@ +const pako = require("pako") +const { copyObject, parseOpId, equalBytes } = require("./common") +const { + utf8ToString, + hexStringToBytes, + bytesToHexString, + Encoder, + Decoder, + RLEEncoder, + RLEDecoder, + DeltaEncoder, + DeltaDecoder, + BooleanEncoder, + BooleanDecoder, +} = require("./encoding") + +// Maybe we should be using the platform's built-in hash implementation? +// Node has the crypto module: https://nodejs.org/api/crypto.html and browsers have +// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest +// However, the WebCrypto API is asynchronous (returns promises), which would +// force all our APIs to become asynchronous as well, which would be annoying. +// +// I think on balance, it's safe enough to use a random library off npm: +// - We only need one hash function (not a full suite of crypto algorithms); +// - SHA256 is quite simple and has fairly few opportunities for subtle bugs +// (compared to asymmetric cryptography anyway); +// - It does not need a secure source of random bits and does not need to be +// constant-time; +// - I have reviewed the source code and it seems pretty reasonable. +const { Hash } = require("fast-sha256") + +// These bytes don't mean anything, they were generated randomly +const MAGIC_BYTES = new Uint8Array([0x85, 0x6f, 0x4a, 0x83]) + +const CHUNK_TYPE_DOCUMENT = 0 +const CHUNK_TYPE_CHANGE = 1 +const CHUNK_TYPE_DEFLATE = 2 // like CHUNK_TYPE_CHANGE but with DEFLATE compression + +// Minimum number of bytes in a value before we enable DEFLATE compression (there is no point +// compressing very short values since compression may actually make them bigger) +const DEFLATE_MIN_SIZE = 256 + +// The least-significant 3 bits of a columnId indicate its datatype +const COLUMN_TYPE = { + GROUP_CARD: 0, + ACTOR_ID: 1, + INT_RLE: 2, + INT_DELTA: 3, + BOOLEAN: 4, + STRING_RLE: 5, + VALUE_LEN: 6, + VALUE_RAW: 7, +} + +// The 4th-least-significant bit of a columnId is set if the column is DEFLATE-compressed +const COLUMN_TYPE_DEFLATE = 8 + +// In the values in a column of type VALUE_LEN, the bottom four bits indicate the type of the value, +// one of the following types in VALUE_TYPE. The higher bits indicate the length of the value in the +// associated VALUE_RAW column (in bytes). +const VALUE_TYPE = { + NULL: 0, + FALSE: 1, + TRUE: 2, + LEB128_UINT: 3, + LEB128_INT: 4, + IEEE754: 5, + UTF8: 6, + BYTES: 7, + COUNTER: 8, + TIMESTAMP: 9, + MIN_UNKNOWN: 10, + MAX_UNKNOWN: 15, +} + +// make* actions must be at even-numbered indexes in this list +const ACTIONS = [ + "makeMap", + "set", + "makeList", + "del", + "makeText", + "inc", + "makeTable", + "link", +] + +const OBJECT_TYPE = { + makeMap: "map", + makeList: "list", + makeText: "text", + makeTable: "table", +} + +const COMMON_COLUMNS = [ + { columnName: "objActor", columnId: (0 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "objCtr", columnId: (0 << 4) | COLUMN_TYPE.INT_RLE }, + { columnName: "keyActor", columnId: (1 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "keyCtr", columnId: (1 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "keyStr", columnId: (1 << 4) | COLUMN_TYPE.STRING_RLE }, + { columnName: "idActor", columnId: (2 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "idCtr", columnId: (2 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "insert", columnId: (3 << 4) | COLUMN_TYPE.BOOLEAN }, + { columnName: "action", columnId: (4 << 4) | COLUMN_TYPE.INT_RLE }, + { columnName: "valLen", columnId: (5 << 4) | COLUMN_TYPE.VALUE_LEN }, + { columnName: "valRaw", columnId: (5 << 4) | COLUMN_TYPE.VALUE_RAW }, + { columnName: "chldActor", columnId: (6 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "chldCtr", columnId: (6 << 4) | COLUMN_TYPE.INT_DELTA }, +] + +const CHANGE_COLUMNS = COMMON_COLUMNS.concat([ + { columnName: "predNum", columnId: (7 << 4) | COLUMN_TYPE.GROUP_CARD }, + { columnName: "predActor", columnId: (7 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "predCtr", columnId: (7 << 4) | COLUMN_TYPE.INT_DELTA }, +]) + +const DOC_OPS_COLUMNS = COMMON_COLUMNS.concat([ + { columnName: "succNum", columnId: (8 << 4) | COLUMN_TYPE.GROUP_CARD }, + { columnName: "succActor", columnId: (8 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "succCtr", columnId: (8 << 4) | COLUMN_TYPE.INT_DELTA }, +]) + +const DOCUMENT_COLUMNS = [ + { columnName: "actor", columnId: (0 << 4) | COLUMN_TYPE.ACTOR_ID }, + { columnName: "seq", columnId: (0 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "maxOp", columnId: (1 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "time", columnId: (2 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "message", columnId: (3 << 4) | COLUMN_TYPE.STRING_RLE }, + { columnName: "depsNum", columnId: (4 << 4) | COLUMN_TYPE.GROUP_CARD }, + { columnName: "depsIndex", columnId: (4 << 4) | COLUMN_TYPE.INT_DELTA }, + { columnName: "extraLen", columnId: (5 << 4) | COLUMN_TYPE.VALUE_LEN }, + { columnName: "extraRaw", columnId: (5 << 4) | COLUMN_TYPE.VALUE_RAW }, +] + +/** + * Maps an opId of the form {counter: 12345, actorId: 'someActorId'} to the form + * {counter: 12345, actorNum: 123, actorId: 'someActorId'}, where the actorNum + * is the index into the `actorIds` array. + */ +function actorIdToActorNum(opId, actorIds) { + if (!opId || !opId.actorId) return opId + const counter = opId.counter + const actorNum = actorIds.indexOf(opId.actorId) + if (actorNum < 0) throw new RangeError("missing actorId") // should not happen + return { counter, actorNum, actorId: opId.actorId } +} + +/** + * Comparison function to pass to Array.sort(), which compares two opIds in the + * form produced by `actorIdToActorNum` so that they are sorted in increasing + * Lamport timestamp order (sorted first by counter, then by actorId). + */ +function compareParsedOpIds(id1, id2) { + if (id1.counter < id2.counter) return -1 + if (id1.counter > id2.counter) return +1 + if (id1.actorId < id2.actorId) return -1 + if (id1.actorId > id2.actorId) return +1 + return 0 +} + +/** + * Takes `changes`, an array of changes (represented as JS objects). Returns an + * object `{changes, actorIds}`, where `changes` is a copy of the argument in + * which all string opIds have been replaced with `{counter, actorNum}` objects, + * and where `actorIds` is a lexicographically sorted array of actor IDs occurring + * in any of the operations. `actorNum` is an index into that array of actorIds. + * If `single` is true, the actorId of the author of the change is moved to the + * beginning of the array of actorIds, so that `actorNum` is zero when referencing + * the author of the change itself. This special-casing is omitted if `single` is + * false. + */ +function parseAllOpIds(changes, single) { + const actors = {}, + newChanges = [] + for (let change of changes) { + change = copyObject(change) + actors[change.actor] = true + change.ops = expandMultiOps(change.ops, change.startOp, change.actor) + change.ops = change.ops.map(op => { + op = copyObject(op) + if (op.obj !== "_root") op.obj = parseOpId(op.obj) + if (op.elemId && op.elemId !== "_head") op.elemId = parseOpId(op.elemId) + if (op.child) op.child = parseOpId(op.child) + if (op.pred) op.pred = op.pred.map(parseOpId) + if (op.obj.actorId) actors[op.obj.actorId] = true + if (op.elemId && op.elemId.actorId) actors[op.elemId.actorId] = true + if (op.child && op.child.actorId) actors[op.child.actorId] = true + for (let pred of op.pred) actors[pred.actorId] = true + return op + }) + newChanges.push(change) + } + + let actorIds = Object.keys(actors).sort() + if (single) { + actorIds = [changes[0].actor].concat( + actorIds.filter(actor => actor !== changes[0].actor) + ) + } + for (let change of newChanges) { + change.actorNum = actorIds.indexOf(change.actor) + for (let i = 0; i < change.ops.length; i++) { + let op = change.ops[i] + op.id = { + counter: change.startOp + i, + actorNum: change.actorNum, + actorId: change.actor, + } + op.obj = actorIdToActorNum(op.obj, actorIds) + op.elemId = actorIdToActorNum(op.elemId, actorIds) + op.child = actorIdToActorNum(op.child, actorIds) + op.pred = op.pred.map(pred => actorIdToActorNum(pred, actorIds)) + } + } + return { changes: newChanges, actorIds } +} + +/** + * Encodes the `obj` property of operation `op` into the two columns + * `objActor` and `objCtr`. + */ +function encodeObjectId(op, columns) { + if (op.obj === "_root") { + columns.objActor.appendValue(null) + columns.objCtr.appendValue(null) + } else if (op.obj.actorNum >= 0 && op.obj.counter > 0) { + columns.objActor.appendValue(op.obj.actorNum) + columns.objCtr.appendValue(op.obj.counter) + } else { + throw new RangeError( + `Unexpected objectId reference: ${JSON.stringify(op.obj)}` + ) + } +} + +/** + * Encodes the `key` and `elemId` properties of operation `op` into the three + * columns `keyActor`, `keyCtr`, and `keyStr`. + */ +function encodeOperationKey(op, columns) { + if (op.key) { + columns.keyActor.appendValue(null) + columns.keyCtr.appendValue(null) + columns.keyStr.appendValue(op.key) + } else if (op.elemId === "_head" && op.insert) { + columns.keyActor.appendValue(null) + columns.keyCtr.appendValue(0) + columns.keyStr.appendValue(null) + } else if (op.elemId && op.elemId.actorNum >= 0 && op.elemId.counter > 0) { + columns.keyActor.appendValue(op.elemId.actorNum) + columns.keyCtr.appendValue(op.elemId.counter) + columns.keyStr.appendValue(null) + } else { + throw new RangeError(`Unexpected operation key: ${JSON.stringify(op)}`) + } +} + +/** + * Encodes the `action` property of operation `op` into the `action` column. + */ +function encodeOperationAction(op, columns) { + const actionCode = ACTIONS.indexOf(op.action) + if (actionCode >= 0) { + columns.action.appendValue(actionCode) + } else if (typeof op.action === "number") { + columns.action.appendValue(op.action) + } else { + throw new RangeError(`Unexpected operation action: ${op.action}`) + } +} + +/** + * Given the datatype for a number, determine the typeTag and the value to encode + * otherwise guess + */ +function getNumberTypeAndValue(op) { + switch (op.datatype) { + case "counter": + return [VALUE_TYPE.COUNTER, op.value] + case "timestamp": + return [VALUE_TYPE.TIMESTAMP, op.value] + case "uint": + return [VALUE_TYPE.LEB128_UINT, op.value] + case "int": + return [VALUE_TYPE.LEB128_INT, op.value] + case "float64": { + const buf64 = new ArrayBuffer(8), + view64 = new DataView(buf64) + view64.setFloat64(0, op.value, true) + return [VALUE_TYPE.IEEE754, new Uint8Array(buf64)] + } + default: + // increment operators get resolved here ... + if ( + Number.isInteger(op.value) && + op.value <= Number.MAX_SAFE_INTEGER && + op.value >= Number.MIN_SAFE_INTEGER + ) { + return [VALUE_TYPE.LEB128_INT, op.value] + } else { + const buf64 = new ArrayBuffer(8), + view64 = new DataView(buf64) + view64.setFloat64(0, op.value, true) + return [VALUE_TYPE.IEEE754, new Uint8Array(buf64)] + } + } +} + +/** + * Encodes the `value` property of operation `op` into the two columns + * `valLen` and `valRaw`. + */ +function encodeValue(op, columns) { + if ((op.action !== "set" && op.action !== "inc") || op.value === null) { + columns.valLen.appendValue(VALUE_TYPE.NULL) + } else if (op.value === false) { + columns.valLen.appendValue(VALUE_TYPE.FALSE) + } else if (op.value === true) { + columns.valLen.appendValue(VALUE_TYPE.TRUE) + } else if (typeof op.value === "string") { + const numBytes = columns.valRaw.appendRawString(op.value) + columns.valLen.appendValue((numBytes << 4) | VALUE_TYPE.UTF8) + } else if (ArrayBuffer.isView(op.value)) { + const numBytes = columns.valRaw.appendRawBytes( + new Uint8Array(op.value.buffer) + ) + columns.valLen.appendValue((numBytes << 4) | VALUE_TYPE.BYTES) + } else if (typeof op.value === "number") { + let [typeTag, value] = getNumberTypeAndValue(op) + let numBytes + if (typeTag === VALUE_TYPE.LEB128_UINT) { + numBytes = columns.valRaw.appendUint53(value) + } else if (typeTag === VALUE_TYPE.IEEE754) { + numBytes = columns.valRaw.appendRawBytes(value) + } else { + numBytes = columns.valRaw.appendInt53(value) + } + columns.valLen.appendValue((numBytes << 4) | typeTag) + } else if ( + typeof op.datatype === "number" && + op.datatype >= VALUE_TYPE.MIN_UNKNOWN && + op.datatype <= VALUE_TYPE.MAX_UNKNOWN && + op.value instanceof Uint8Array + ) { + const numBytes = columns.valRaw.appendRawBytes(op.value) + columns.valLen.appendValue((numBytes << 4) | op.datatype) + } else if (op.datatype) { + throw new RangeError( + `Unknown datatype ${op.datatype} for value ${op.value}` + ) + } else { + throw new RangeError(`Unsupported value in operation: ${op.value}`) + } +} + +/** + * Given `sizeTag` (an unsigned integer read from a VALUE_LEN column) and `bytes` (a Uint8Array + * read from a VALUE_RAW column, with length `sizeTag >> 4`), this function returns an object of the + * form `{value: value, datatype: datatypeTag}` where `value` is a JavaScript primitive datatype + * corresponding to the value, and `datatypeTag` is a datatype annotation such as 'counter'. + */ +function decodeValue(sizeTag, bytes) { + if (sizeTag === VALUE_TYPE.NULL) { + return { value: null } + } else if (sizeTag === VALUE_TYPE.FALSE) { + return { value: false } + } else if (sizeTag === VALUE_TYPE.TRUE) { + return { value: true } + } else if (sizeTag % 16 === VALUE_TYPE.UTF8) { + return { value: utf8ToString(bytes) } + } else { + if (sizeTag % 16 === VALUE_TYPE.LEB128_UINT) { + return { value: new Decoder(bytes).readUint53(), datatype: "uint" } + } else if (sizeTag % 16 === VALUE_TYPE.LEB128_INT) { + return { value: new Decoder(bytes).readInt53(), datatype: "int" } + } else if (sizeTag % 16 === VALUE_TYPE.IEEE754) { + const view = new DataView( + bytes.buffer, + bytes.byteOffset, + bytes.byteLength + ) + if (bytes.byteLength === 8) { + return { value: view.getFloat64(0, true), datatype: "float64" } + } else { + throw new RangeError( + `Invalid length for floating point number: ${bytes.byteLength}` + ) + } + } else if (sizeTag % 16 === VALUE_TYPE.COUNTER) { + return { value: new Decoder(bytes).readInt53(), datatype: "counter" } + } else if (sizeTag % 16 === VALUE_TYPE.TIMESTAMP) { + return { value: new Decoder(bytes).readInt53(), datatype: "timestamp" } + } else { + return { value: bytes, datatype: sizeTag % 16 } + } + } +} + +/** + * Reads one value from the column `columns[colIndex]` and interprets it based + * on the column type. `actorIds` is a list of actors that appear in the change; + * `actorIds[0]` is the actorId of the change's author. Mutates the `result` + * object with the value, and returns the number of columns processed (this is 2 + * in the case of a pair of VALUE_LEN and VALUE_RAW columns, which are processed + * in one go). + */ +function decodeValueColumns(columns, colIndex, actorIds, result) { + const { columnId, columnName, decoder } = columns[colIndex] + if ( + columnId % 8 === COLUMN_TYPE.VALUE_LEN && + colIndex + 1 < columns.length && + columns[colIndex + 1].columnId === columnId + 1 + ) { + const sizeTag = decoder.readValue() + const rawValue = columns[colIndex + 1].decoder.readRawBytes(sizeTag >> 4) + const { value, datatype } = decodeValue(sizeTag, rawValue) + result[columnName] = value + if (datatype) result[columnName + "_datatype"] = datatype + return 2 + } else if (columnId % 8 === COLUMN_TYPE.ACTOR_ID) { + const actorNum = decoder.readValue() + if (actorNum === null) { + result[columnName] = null + } else { + if (!actorIds[actorNum]) + throw new RangeError(`No actor index ${actorNum}`) + result[columnName] = actorIds[actorNum] + } + } else { + result[columnName] = decoder.readValue() + } + return 1 +} + +/** + * Encodes an array of operations in a set of columns. The operations need to + * be parsed with `parseAllOpIds()` beforehand. If `forDocument` is true, we use + * the column structure of a whole document, otherwise we use the column + * structure for an individual change. Returns an array of + * `{columnId, columnName, encoder}` objects. + */ +function encodeOps(ops, forDocument) { + const columns = { + objActor: new RLEEncoder("uint"), + objCtr: new RLEEncoder("uint"), + keyActor: new RLEEncoder("uint"), + keyCtr: new DeltaEncoder(), + keyStr: new RLEEncoder("utf8"), + insert: new BooleanEncoder(), + action: new RLEEncoder("uint"), + valLen: new RLEEncoder("uint"), + valRaw: new Encoder(), + chldActor: new RLEEncoder("uint"), + chldCtr: new DeltaEncoder(), + } + + if (forDocument) { + columns.idActor = new RLEEncoder("uint") + columns.idCtr = new DeltaEncoder() + columns.succNum = new RLEEncoder("uint") + columns.succActor = new RLEEncoder("uint") + columns.succCtr = new DeltaEncoder() + } else { + columns.predNum = new RLEEncoder("uint") + columns.predCtr = new DeltaEncoder() + columns.predActor = new RLEEncoder("uint") + } + + for (let op of ops) { + encodeObjectId(op, columns) + encodeOperationKey(op, columns) + columns.insert.appendValue(!!op.insert) + encodeOperationAction(op, columns) + encodeValue(op, columns) + + if (op.child && op.child.counter) { + columns.chldActor.appendValue(op.child.actorNum) + columns.chldCtr.appendValue(op.child.counter) + } else { + columns.chldActor.appendValue(null) + columns.chldCtr.appendValue(null) + } + + if (forDocument) { + columns.idActor.appendValue(op.id.actorNum) + columns.idCtr.appendValue(op.id.counter) + columns.succNum.appendValue(op.succ.length) + op.succ.sort(compareParsedOpIds) + for (let i = 0; i < op.succ.length; i++) { + columns.succActor.appendValue(op.succ[i].actorNum) + columns.succCtr.appendValue(op.succ[i].counter) + } + } else { + columns.predNum.appendValue(op.pred.length) + op.pred.sort(compareParsedOpIds) + for (let i = 0; i < op.pred.length; i++) { + columns.predActor.appendValue(op.pred[i].actorNum) + columns.predCtr.appendValue(op.pred[i].counter) + } + } + } + + let columnList = [] + for (let { columnName, columnId } of forDocument + ? DOC_OPS_COLUMNS + : CHANGE_COLUMNS) { + if (columns[columnName]) + columnList.push({ columnId, columnName, encoder: columns[columnName] }) + } + return columnList.sort((a, b) => a.columnId - b.columnId) +} + +function validDatatype(value, datatype) { + if (datatype === undefined) { + return ( + typeof value === "string" || typeof value === "boolean" || value === null + ) + } else { + return typeof value === "number" + } +} + +function expandMultiOps(ops, startOp, actor) { + let opNum = startOp + let expandedOps = [] + for (const op of ops) { + if (op.action === "set" && op.values && op.insert) { + if (op.pred.length !== 0) + throw new RangeError("multi-insert pred must be empty") + let lastElemId = op.elemId + const datatype = op.datatype + for (const value of op.values) { + if (!validDatatype(value, datatype)) + throw new RangeError( + `Decode failed: bad value/datatype association (${value},${datatype})` + ) + expandedOps.push({ + action: "set", + obj: op.obj, + elemId: lastElemId, + datatype, + value, + pred: [], + insert: true, + }) + lastElemId = `${opNum}@${actor}` + opNum += 1 + } + } else if (op.action === "del" && op.multiOp > 1) { + if (op.pred.length !== 1) + throw new RangeError("multiOp deletion must have exactly one pred") + const startElemId = parseOpId(op.elemId), + startPred = parseOpId(op.pred[0]) + for (let i = 0; i < op.multiOp; i++) { + const elemId = `${startElemId.counter + i}@${startElemId.actorId}` + const pred = [`${startPred.counter + i}@${startPred.actorId}`] + expandedOps.push({ action: "del", obj: op.obj, elemId, pred }) + opNum += 1 + } + } else { + expandedOps.push(op) + opNum += 1 + } + } + return expandedOps +} + +/** + * Takes a change as decoded by `decodeColumns`, and changes it into the form + * expected by the rest of the backend. If `forDocument` is true, we use the op + * structure of a whole document, otherwise we use the op structure for an + * individual change. + */ +function decodeOps(ops, forDocument) { + const newOps = [] + for (let op of ops) { + const obj = op.objCtr === null ? "_root" : `${op.objCtr}@${op.objActor}` + const elemId = op.keyStr + ? undefined + : op.keyCtr === 0 + ? "_head" + : `${op.keyCtr}@${op.keyActor}` + const action = ACTIONS[op.action] || op.action + const newOp = elemId + ? { obj, elemId, action } + : { obj, key: op.keyStr, action } + newOp.insert = !!op.insert + if (ACTIONS[op.action] === "set" || ACTIONS[op.action] === "inc") { + newOp.value = op.valLen + if (op.valLen_datatype) newOp.datatype = op.valLen_datatype + } + if (!!op.chldCtr !== !!op.chldActor) { + throw new RangeError( + `Mismatched child columns: ${op.chldCtr} and ${op.chldActor}` + ) + } + if (op.chldCtr !== null) newOp.child = `${op.chldCtr}@${op.chldActor}` + if (forDocument) { + newOp.id = `${op.idCtr}@${op.idActor}` + newOp.succ = op.succNum.map(succ => `${succ.succCtr}@${succ.succActor}`) + checkSortedOpIds( + op.succNum.map(succ => ({ + counter: succ.succCtr, + actorId: succ.succActor, + })) + ) + } else { + newOp.pred = op.predNum.map(pred => `${pred.predCtr}@${pred.predActor}`) + checkSortedOpIds( + op.predNum.map(pred => ({ + counter: pred.predCtr, + actorId: pred.predActor, + })) + ) + } + newOps.push(newOp) + } + return newOps +} + +/** + * Throws an exception if the opIds in the given array are not in sorted order. + */ +function checkSortedOpIds(opIds) { + let last = null + for (let opId of opIds) { + if (last && compareParsedOpIds(last, opId) !== -1) { + throw new RangeError("operation IDs are not in ascending order") + } + last = opId + } +} + +function encoderByColumnId(columnId) { + if ((columnId & 7) === COLUMN_TYPE.INT_DELTA) { + return new DeltaEncoder() + } else if ((columnId & 7) === COLUMN_TYPE.BOOLEAN) { + return new BooleanEncoder() + } else if ((columnId & 7) === COLUMN_TYPE.STRING_RLE) { + return new RLEEncoder("utf8") + } else if ((columnId & 7) === COLUMN_TYPE.VALUE_RAW) { + return new Encoder() + } else { + return new RLEEncoder("uint") + } +} + +function decoderByColumnId(columnId, buffer) { + if ((columnId & 7) === COLUMN_TYPE.INT_DELTA) { + return new DeltaDecoder(buffer) + } else if ((columnId & 7) === COLUMN_TYPE.BOOLEAN) { + return new BooleanDecoder(buffer) + } else if ((columnId & 7) === COLUMN_TYPE.STRING_RLE) { + return new RLEDecoder("utf8", buffer) + } else if ((columnId & 7) === COLUMN_TYPE.VALUE_RAW) { + return new Decoder(buffer) + } else { + return new RLEDecoder("uint", buffer) + } +} + +function makeDecoders(columns, columnSpec) { + const emptyBuf = new Uint8Array(0) + let decoders = [], + columnIndex = 0, + specIndex = 0 + + while (columnIndex < columns.length || specIndex < columnSpec.length) { + if ( + columnIndex === columns.length || + (specIndex < columnSpec.length && + columnSpec[specIndex].columnId < columns[columnIndex].columnId) + ) { + const { columnId, columnName } = columnSpec[specIndex] + decoders.push({ + columnId, + columnName, + decoder: decoderByColumnId(columnId, emptyBuf), + }) + specIndex++ + } else if ( + specIndex === columnSpec.length || + columns[columnIndex].columnId < columnSpec[specIndex].columnId + ) { + const { columnId, buffer } = columns[columnIndex] + decoders.push({ columnId, decoder: decoderByColumnId(columnId, buffer) }) + columnIndex++ + } else { + // columns[columnIndex].columnId === columnSpec[specIndex].columnId + const { columnId, buffer } = columns[columnIndex], + { columnName } = columnSpec[specIndex] + decoders.push({ + columnId, + columnName, + decoder: decoderByColumnId(columnId, buffer), + }) + columnIndex++ + specIndex++ + } + } + return decoders +} + +function decodeColumns(columns, actorIds, columnSpec) { + columns = makeDecoders(columns, columnSpec) + let parsedRows = [] + while (columns.some(col => !col.decoder.done)) { + let row = {}, + col = 0 + while (col < columns.length) { + const columnId = columns[col].columnId + let groupId = columnId >> 4, + groupCols = 1 + while ( + col + groupCols < columns.length && + columns[col + groupCols].columnId >> 4 === groupId + ) { + groupCols++ + } + + if (columnId % 8 === COLUMN_TYPE.GROUP_CARD) { + const values = [], + count = columns[col].decoder.readValue() + for (let i = 0; i < count; i++) { + let value = {} + for (let colOffset = 1; colOffset < groupCols; colOffset++) { + decodeValueColumns(columns, col + colOffset, actorIds, value) + } + values.push(value) + } + row[columns[col].columnName] = values + col += groupCols + } else { + col += decodeValueColumns(columns, col, actorIds, row) + } + } + parsedRows.push(row) + } + return parsedRows +} + +function decodeColumnInfo(decoder) { + // A number that is all 1 bits except for the bit that indicates whether a column is + // deflate-compressed. We ignore this bit when checking whether columns are sorted by ID. + const COLUMN_ID_MASK = (-1 ^ COLUMN_TYPE_DEFLATE) >>> 0 + + let lastColumnId = -1, + columns = [], + numColumns = decoder.readUint53() + for (let i = 0; i < numColumns; i++) { + const columnId = decoder.readUint53(), + bufferLen = decoder.readUint53() + if ((columnId & COLUMN_ID_MASK) <= (lastColumnId & COLUMN_ID_MASK)) { + throw new RangeError("Columns must be in ascending order") + } + lastColumnId = columnId + columns.push({ columnId, bufferLen }) + } + return columns +} + +function encodeColumnInfo(encoder, columns) { + const nonEmptyColumns = columns.filter( + column => column.encoder.buffer.byteLength > 0 + ) + encoder.appendUint53(nonEmptyColumns.length) + for (let column of nonEmptyColumns) { + encoder.appendUint53(column.columnId) + encoder.appendUint53(column.encoder.buffer.byteLength) + } +} + +function decodeChangeHeader(decoder) { + const numDeps = decoder.readUint53(), + deps = [] + for (let i = 0; i < numDeps; i++) { + deps.push(bytesToHexString(decoder.readRawBytes(32))) + } + let change = { + actor: decoder.readHexString(), + seq: decoder.readUint53(), + startOp: decoder.readUint53(), + time: decoder.readInt53(), + message: decoder.readPrefixedString(), + deps, + } + const actorIds = [change.actor], + numActorIds = decoder.readUint53() + for (let i = 0; i < numActorIds; i++) actorIds.push(decoder.readHexString()) + change.actorIds = actorIds + return change +} + +/** + * Assembles a chunk of encoded data containing a checksum, headers, and a + * series of encoded columns. Calls `encodeHeaderCallback` with an encoder that + * should be used to add the headers. The columns should be given as `columns`. + */ +function encodeContainer(chunkType, encodeContentsCallback) { + const CHECKSUM_SIZE = 4 // checksum is first 4 bytes of SHA-256 hash of the rest of the data + const HEADER_SPACE = MAGIC_BYTES.byteLength + CHECKSUM_SIZE + 1 + 5 // 1 byte type + 5 bytes length + const body = new Encoder() + // Make space for the header at the beginning of the body buffer. We will + // copy the header in here later. This is cheaper than copying the body since + // the body is likely to be much larger than the header. + body.appendRawBytes(new Uint8Array(HEADER_SPACE)) + encodeContentsCallback(body) + + const bodyBuf = body.buffer + const header = new Encoder() + header.appendByte(chunkType) + header.appendUint53(bodyBuf.byteLength - HEADER_SPACE) + + // Compute the hash over chunkType, length, and body + const headerBuf = header.buffer + const sha256 = new Hash() + sha256.update(headerBuf) + sha256.update(bodyBuf.subarray(HEADER_SPACE)) + const hash = sha256.digest(), + checksum = hash.subarray(0, CHECKSUM_SIZE) + + // Copy header into the body buffer so that they are contiguous + bodyBuf.set( + MAGIC_BYTES, + HEADER_SPACE - headerBuf.byteLength - CHECKSUM_SIZE - MAGIC_BYTES.byteLength + ) + bodyBuf.set(checksum, HEADER_SPACE - headerBuf.byteLength - CHECKSUM_SIZE) + bodyBuf.set(headerBuf, HEADER_SPACE - headerBuf.byteLength) + return { + hash, + bytes: bodyBuf.subarray( + HEADER_SPACE - + headerBuf.byteLength - + CHECKSUM_SIZE - + MAGIC_BYTES.byteLength + ), + } +} + +function decodeContainerHeader(decoder, computeHash) { + if (!equalBytes(decoder.readRawBytes(MAGIC_BYTES.byteLength), MAGIC_BYTES)) { + throw new RangeError("Data does not begin with magic bytes 85 6f 4a 83") + } + const expectedHash = decoder.readRawBytes(4) + const hashStartOffset = decoder.offset + const chunkType = decoder.readByte() + const chunkLength = decoder.readUint53() + const header = { + chunkType, + chunkLength, + chunkData: decoder.readRawBytes(chunkLength), + } + + if (computeHash) { + const sha256 = new Hash() + sha256.update(decoder.buf.subarray(hashStartOffset, decoder.offset)) + const binaryHash = sha256.digest() + if (!equalBytes(binaryHash.subarray(0, 4), expectedHash)) { + throw new RangeError("checksum does not match data") + } + header.hash = bytesToHexString(binaryHash) + } + return header +} + +function encodeChange(changeObj) { + const { changes, actorIds } = parseAllOpIds([changeObj], true) + const change = changes[0] + + const { hash, bytes } = encodeContainer(CHUNK_TYPE_CHANGE, encoder => { + if (!Array.isArray(change.deps)) throw new TypeError("deps is not an array") + encoder.appendUint53(change.deps.length) + for (let hash of change.deps.slice().sort()) { + encoder.appendRawBytes(hexStringToBytes(hash)) + } + encoder.appendHexString(change.actor) + encoder.appendUint53(change.seq) + encoder.appendUint53(change.startOp) + encoder.appendInt53(change.time) + encoder.appendPrefixedString(change.message || "") + encoder.appendUint53(actorIds.length - 1) + for (let actor of actorIds.slice(1)) encoder.appendHexString(actor) + + const columns = encodeOps(change.ops, false) + encodeColumnInfo(encoder, columns) + for (let column of columns) encoder.appendRawBytes(column.encoder.buffer) + if (change.extraBytes) encoder.appendRawBytes(change.extraBytes) + }) + + const hexHash = bytesToHexString(hash) + if (changeObj.hash && changeObj.hash !== hexHash) { + throw new RangeError( + `Change hash does not match encoding: ${changeObj.hash} != ${hexHash}` + ) + } + return bytes.byteLength >= DEFLATE_MIN_SIZE ? deflateChange(bytes) : bytes +} + +function decodeChangeColumns(buffer) { + if (buffer[8] === CHUNK_TYPE_DEFLATE) buffer = inflateChange(buffer) + const decoder = new Decoder(buffer) + const header = decodeContainerHeader(decoder, true) + const chunkDecoder = new Decoder(header.chunkData) + if (!decoder.done) throw new RangeError("Encoded change has trailing data") + if (header.chunkType !== CHUNK_TYPE_CHANGE) + throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + + const change = decodeChangeHeader(chunkDecoder) + const columns = decodeColumnInfo(chunkDecoder) + for (let i = 0; i < columns.length; i++) { + if ((columns[i].columnId & COLUMN_TYPE_DEFLATE) !== 0) { + throw new RangeError("change must not contain deflated columns") + } + columns[i].buffer = chunkDecoder.readRawBytes(columns[i].bufferLen) + } + if (!chunkDecoder.done) { + const restLen = chunkDecoder.buf.byteLength - chunkDecoder.offset + change.extraBytes = chunkDecoder.readRawBytes(restLen) + } + + change.columns = columns + change.hash = header.hash + return change +} + +/** + * Decodes one change in binary format into its JS object representation. + */ +function decodeChange(buffer) { + const change = decodeChangeColumns(buffer) + change.ops = decodeOps( + decodeColumns(change.columns, change.actorIds, CHANGE_COLUMNS), + false + ) + delete change.actorIds + delete change.columns + return change +} + +/** + * Decodes the header fields of a change in binary format, but does not decode + * the operations. Saves work when we only need to inspect the headers. Only + * computes the hash of the change if `computeHash` is true. + */ +function decodeChangeMeta(buffer, computeHash) { + if (buffer[8] === CHUNK_TYPE_DEFLATE) buffer = inflateChange(buffer) + const header = decodeContainerHeader(new Decoder(buffer), computeHash) + if (header.chunkType !== CHUNK_TYPE_CHANGE) { + throw new RangeError("Buffer chunk type is not a change") + } + const meta = decodeChangeHeader(new Decoder(header.chunkData)) + meta.change = buffer + if (computeHash) meta.hash = header.hash + return meta +} + +/** + * Compresses a binary change using DEFLATE. + */ +function deflateChange(buffer) { + const header = decodeContainerHeader(new Decoder(buffer), false) + if (header.chunkType !== CHUNK_TYPE_CHANGE) + throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + const compressed = pako.deflateRaw(header.chunkData) + const encoder = new Encoder() + encoder.appendRawBytes(buffer.subarray(0, 8)) // copy MAGIC_BYTES and checksum + encoder.appendByte(CHUNK_TYPE_DEFLATE) + encoder.appendUint53(compressed.byteLength) + encoder.appendRawBytes(compressed) + return encoder.buffer +} + +/** + * Decompresses a binary change that has been compressed with DEFLATE. + */ +function inflateChange(buffer) { + const header = decodeContainerHeader(new Decoder(buffer), false) + if (header.chunkType !== CHUNK_TYPE_DEFLATE) + throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + const decompressed = pako.inflateRaw(header.chunkData) + const encoder = new Encoder() + encoder.appendRawBytes(buffer.subarray(0, 8)) // copy MAGIC_BYTES and checksum + encoder.appendByte(CHUNK_TYPE_CHANGE) + encoder.appendUint53(decompressed.byteLength) + encoder.appendRawBytes(decompressed) + return encoder.buffer +} + +/** + * Takes an Uint8Array that may contain multiple concatenated changes, and + * returns an array of subarrays, each subarray containing one change. + */ +function splitContainers(buffer) { + let decoder = new Decoder(buffer), + chunks = [], + startOffset = 0 + while (!decoder.done) { + decodeContainerHeader(decoder, false) + chunks.push(buffer.subarray(startOffset, decoder.offset)) + startOffset = decoder.offset + } + return chunks +} + +/** + * Decodes a list of changes from the binary format into JS objects. + * `binaryChanges` is an array of `Uint8Array` objects. + */ +function decodeChanges(binaryChanges) { + let decoded = [] + for (let binaryChange of binaryChanges) { + for (let chunk of splitContainers(binaryChange)) { + if (chunk[8] === CHUNK_TYPE_DOCUMENT) { + decoded = decoded.concat(decodeDocument(chunk)) + } else if ( + chunk[8] === CHUNK_TYPE_CHANGE || + chunk[8] === CHUNK_TYPE_DEFLATE + ) { + decoded.push(decodeChange(chunk)) + } else { + // ignoring chunk of unknown type + } + } + } + return decoded +} + +function sortOpIds(a, b) { + if (a === b) return 0 + if (a === "_root") return -1 + if (b === "_root") return +1 + const a_ = parseOpId(a), + b_ = parseOpId(b) + if (a_.counter < b_.counter) return -1 + if (a_.counter > b_.counter) return +1 + if (a_.actorId < b_.actorId) return -1 + if (a_.actorId > b_.actorId) return +1 + return 0 +} + +/** + * Takes a set of operations `ops` loaded from an encoded document, and + * reconstructs the changes that they originally came from. + * Does not return anything, only mutates `changes`. + */ +function groupChangeOps(changes, ops) { + let changesByActor = {} // map from actorId to array of changes by that actor + for (let change of changes) { + change.ops = [] + if (!changesByActor[change.actor]) changesByActor[change.actor] = [] + if (change.seq !== changesByActor[change.actor].length + 1) { + throw new RangeError( + `Expected seq = ${changesByActor[change.actor].length + 1}, got ${ + change.seq + }` + ) + } + if ( + change.seq > 1 && + changesByActor[change.actor][change.seq - 2].maxOp > change.maxOp + ) { + throw new RangeError("maxOp must increase monotonically per actor") + } + changesByActor[change.actor].push(change) + } + + let opsById = {} + for (let op of ops) { + if (op.action === "del") + throw new RangeError("document should not contain del operations") + op.pred = opsById[op.id] ? opsById[op.id].pred : [] + opsById[op.id] = op + for (let succ of op.succ) { + if (!opsById[succ]) { + if (op.elemId) { + const elemId = op.insert ? op.id : op.elemId + opsById[succ] = { + id: succ, + action: "del", + obj: op.obj, + elemId, + pred: [], + } + } else { + opsById[succ] = { + id: succ, + action: "del", + obj: op.obj, + key: op.key, + pred: [], + } + } + } + opsById[succ].pred.push(op.id) + } + delete op.succ + } + for (let op of Object.values(opsById)) { + if (op.action === "del") ops.push(op) + } + + for (let op of ops) { + const { counter, actorId } = parseOpId(op.id) + const actorChanges = changesByActor[actorId] + // Binary search to find the change that should contain this operation + let left = 0, + right = actorChanges.length + while (left < right) { + const index = Math.floor((left + right) / 2) + if (actorChanges[index].maxOp < counter) { + left = index + 1 + } else { + right = index + } + } + if (left >= actorChanges.length) { + throw new RangeError(`Operation ID ${op.id} outside of allowed range`) + } + actorChanges[left].ops.push(op) + } + + for (let change of changes) { + change.ops.sort((op1, op2) => sortOpIds(op1.id, op2.id)) + change.startOp = change.maxOp - change.ops.length + 1 + delete change.maxOp + for (let i = 0; i < change.ops.length; i++) { + const op = change.ops[i], + expectedId = `${change.startOp + i}@${change.actor}` + if (op.id !== expectedId) { + throw new RangeError(`Expected opId ${expectedId}, got ${op.id}`) + } + delete op.id + } + } +} + +function decodeDocumentChanges(changes, expectedHeads) { + let heads = {} // change hashes that are not a dependency of any other change + for (let i = 0; i < changes.length; i++) { + let change = changes[i] + change.deps = [] + for (let index of change.depsNum.map(d => d.depsIndex)) { + if (!changes[index] || !changes[index].hash) { + throw new RangeError( + `No hash for index ${index} while processing index ${i}` + ) + } + const hash = changes[index].hash + change.deps.push(hash) + if (heads[hash]) delete heads[hash] + } + change.deps.sort() + delete change.depsNum + + if (change.extraLen_datatype !== VALUE_TYPE.BYTES) { + throw new RangeError(`Bad datatype for extra bytes: ${VALUE_TYPE.BYTES}`) + } + change.extraBytes = change.extraLen + delete change.extraLen_datatype + + // Encoding and decoding again to compute the hash of the change + changes[i] = decodeChange(encodeChange(change)) + heads[changes[i].hash] = true + } + + const actualHeads = Object.keys(heads).sort() + let headsEqual = actualHeads.length === expectedHeads.length, + i = 0 + while (headsEqual && i < actualHeads.length) { + headsEqual = actualHeads[i] === expectedHeads[i] + i++ + } + if (!headsEqual) { + throw new RangeError( + `Mismatched heads hashes: expected ${expectedHeads.join( + ", " + )}, got ${actualHeads.join(", ")}` + ) + } +} + +function encodeDocumentHeader(doc) { + const { + changesColumns, + opsColumns, + actorIds, + heads, + headsIndexes, + extraBytes, + } = doc + for (let column of changesColumns) deflateColumn(column) + for (let column of opsColumns) deflateColumn(column) + + return encodeContainer(CHUNK_TYPE_DOCUMENT, encoder => { + encoder.appendUint53(actorIds.length) + for (let actor of actorIds) { + encoder.appendHexString(actor) + } + encoder.appendUint53(heads.length) + for (let head of heads.sort()) { + encoder.appendRawBytes(hexStringToBytes(head)) + } + encodeColumnInfo(encoder, changesColumns) + encodeColumnInfo(encoder, opsColumns) + for (let column of changesColumns) + encoder.appendRawBytes(column.encoder.buffer) + for (let column of opsColumns) encoder.appendRawBytes(column.encoder.buffer) + for (let index of headsIndexes) encoder.appendUint53(index) + if (extraBytes) encoder.appendRawBytes(extraBytes) + }).bytes +} + +function decodeDocumentHeader(buffer) { + const documentDecoder = new Decoder(buffer) + const header = decodeContainerHeader(documentDecoder, true) + const decoder = new Decoder(header.chunkData) + if (!documentDecoder.done) + throw new RangeError("Encoded document has trailing data") + if (header.chunkType !== CHUNK_TYPE_DOCUMENT) + throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + + const actorIds = [], + numActors = decoder.readUint53() + for (let i = 0; i < numActors; i++) { + actorIds.push(decoder.readHexString()) + } + const heads = [], + headsIndexes = [], + numHeads = decoder.readUint53() + for (let i = 0; i < numHeads; i++) { + heads.push(bytesToHexString(decoder.readRawBytes(32))) + } + + const changesColumns = decodeColumnInfo(decoder) + const opsColumns = decodeColumnInfo(decoder) + for (let i = 0; i < changesColumns.length; i++) { + changesColumns[i].buffer = decoder.readRawBytes(changesColumns[i].bufferLen) + inflateColumn(changesColumns[i]) + } + for (let i = 0; i < opsColumns.length; i++) { + opsColumns[i].buffer = decoder.readRawBytes(opsColumns[i].bufferLen) + inflateColumn(opsColumns[i]) + } + if (!decoder.done) { + for (let i = 0; i < numHeads; i++) headsIndexes.push(decoder.readUint53()) + } + + const extraBytes = decoder.readRawBytes( + decoder.buf.byteLength - decoder.offset + ) + return { + changesColumns, + opsColumns, + actorIds, + heads, + headsIndexes, + extraBytes, + } +} + +function decodeDocument(buffer) { + const { changesColumns, opsColumns, actorIds, heads } = + decodeDocumentHeader(buffer) + const changes = decodeColumns(changesColumns, actorIds, DOCUMENT_COLUMNS) + const ops = decodeOps( + decodeColumns(opsColumns, actorIds, DOC_OPS_COLUMNS), + true + ) + groupChangeOps(changes, ops) + decodeDocumentChanges(changes, heads) + return changes +} + +/** + * DEFLATE-compresses the given column if it is large enough to make the compression worthwhile. + */ +function deflateColumn(column) { + if (column.encoder.buffer.byteLength >= DEFLATE_MIN_SIZE) { + column.encoder = { buffer: pako.deflateRaw(column.encoder.buffer) } + column.columnId |= COLUMN_TYPE_DEFLATE + } +} + +/** + * Decompresses the given column if it is DEFLATE-compressed. + */ +function inflateColumn(column) { + if ((column.columnId & COLUMN_TYPE_DEFLATE) !== 0) { + column.buffer = pako.inflateRaw(column.buffer) + column.columnId ^= COLUMN_TYPE_DEFLATE + } +} + +module.exports = { + COLUMN_TYPE, + VALUE_TYPE, + ACTIONS, + OBJECT_TYPE, + DOC_OPS_COLUMNS, + CHANGE_COLUMNS, + DOCUMENT_COLUMNS, + encoderByColumnId, + decoderByColumnId, + makeDecoders, + decodeValue, + splitContainers, + encodeChange, + decodeChangeColumns, + decodeChange, + decodeChangeMeta, + decodeChanges, + encodeDocumentHeader, + decodeDocumentHeader, + decodeDocument, +} diff --git a/javascript/test/legacy/common.js b/javascript/test/legacy/common.js new file mode 100644 index 00000000..7668e982 --- /dev/null +++ b/javascript/test/legacy/common.js @@ -0,0 +1,59 @@ +function isObject(obj) { + return typeof obj === "object" && obj !== null +} + +/** + * Returns a shallow copy of the object `obj`. Faster than `Object.assign({}, obj)`. + * https://jsperf.com/cloning-large-objects/1 + */ +function copyObject(obj) { + if (!isObject(obj)) return {} + let copy = {} + for (let key of Object.keys(obj)) { + copy[key] = obj[key] + } + return copy +} + +/** + * Takes a string in the form that is used to identify operations (a counter concatenated + * with an actor ID, separated by an `@` sign) and returns an object `{counter, actorId}`. + */ +function parseOpId(opId) { + const match = /^(\d+)@(.*)$/.exec(opId || "") + if (!match) { + throw new RangeError(`Not a valid opId: ${opId}`) + } + return { counter: parseInt(match[1], 10), actorId: match[2] } +} + +/** + * Returns true if the two byte arrays contain the same data, false if not. + */ +function equalBytes(array1, array2) { + if (!(array1 instanceof Uint8Array) || !(array2 instanceof Uint8Array)) { + throw new TypeError("equalBytes can only compare Uint8Arrays") + } + if (array1.byteLength !== array2.byteLength) return false + for (let i = 0; i < array1.byteLength; i++) { + if (array1[i] !== array2[i]) return false + } + return true +} + +/** + * Creates an array containing the value `null` repeated `length` times. + */ +function createArrayOfNulls(length) { + const array = new Array(length) + for (let i = 0; i < length; i++) array[i] = null + return array +} + +module.exports = { + isObject, + copyObject, + parseOpId, + equalBytes, + createArrayOfNulls, +} diff --git a/javascript/test/legacy/encoding.js b/javascript/test/legacy/encoding.js new file mode 100644 index 00000000..f7650faf --- /dev/null +++ b/javascript/test/legacy/encoding.js @@ -0,0 +1,1321 @@ +/** + * UTF-8 decoding and encoding using API that is supported in Node >= 12 and modern browsers: + * https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/encode + * https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder/decode + * If you're running in an environment where it's not available, please use a polyfill, such as: + * https://github.com/anonyco/FastestSmallestTextEncoderDecoder + */ +const utf8encoder = new TextEncoder() +const utf8decoder = new TextDecoder("utf-8") + +function stringToUtf8(string) { + return utf8encoder.encode(string) +} + +function utf8ToString(buffer) { + return utf8decoder.decode(buffer) +} + +/** + * Converts a string consisting of hexadecimal digits into an Uint8Array. + */ +function hexStringToBytes(value) { + if (typeof value !== "string") { + throw new TypeError("value is not a string") + } + if (!/^([0-9a-f][0-9a-f])*$/.test(value)) { + throw new RangeError("value is not hexadecimal") + } + if (value === "") { + return new Uint8Array(0) + } else { + return new Uint8Array(value.match(/../g).map(b => parseInt(b, 16))) + } +} + +const NIBBLE_TO_HEX = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f", +] +const BYTE_TO_HEX = new Array(256) +for (let i = 0; i < 256; i++) { + BYTE_TO_HEX[i] = `${NIBBLE_TO_HEX[(i >>> 4) & 0xf]}${NIBBLE_TO_HEX[i & 0xf]}` +} + +/** + * Converts a Uint8Array into the equivalent hexadecimal string. + */ +function bytesToHexString(bytes) { + let hex = "", + len = bytes.byteLength + for (let i = 0; i < len; i++) { + hex += BYTE_TO_HEX[bytes[i]] + } + return hex +} + +/** + * Wrapper around an Uint8Array that allows values to be appended to the buffer, + * and that automatically grows the buffer when space runs out. + */ +class Encoder { + constructor() { + this.buf = new Uint8Array(16) + this.offset = 0 + } + + /** + * Returns the byte array containing the encoded data. + */ + get buffer() { + this.finish() + return this.buf.subarray(0, this.offset) + } + + /** + * Reallocates the encoder's buffer to be bigger. + */ + grow(minSize = 0) { + let newSize = this.buf.byteLength * 4 + while (newSize < minSize) newSize *= 2 + const newBuf = new Uint8Array(newSize) + newBuf.set(this.buf, 0) + this.buf = newBuf + return this + } + + /** + * Appends one byte (0 to 255) to the buffer. + */ + appendByte(value) { + if (this.offset >= this.buf.byteLength) this.grow() + this.buf[this.offset] = value + this.offset += 1 + } + + /** + * Encodes a 32-bit nonnegative integer in a variable number of bytes using + * the LEB128 encoding scheme (https://en.wikipedia.org/wiki/LEB128) and + * appends it to the buffer. Returns the number of bytes written. + */ + appendUint32(value) { + if (!Number.isInteger(value)) + throw new RangeError("value is not an integer") + if (value < 0 || value > 0xffffffff) + throw new RangeError("number out of range") + + const numBytes = Math.max(1, Math.ceil((32 - Math.clz32(value)) / 7)) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + + for (let i = 0; i < numBytes; i++) { + this.buf[this.offset + i] = + (value & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + value >>>= 7 // zero-filling right shift + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a 32-bit signed integer in a variable number of bytes using the + * LEB128 encoding scheme (https://en.wikipedia.org/wiki/LEB128) and appends + * it to the buffer. Returns the number of bytes written. + */ + appendInt32(value) { + if (!Number.isInteger(value)) + throw new RangeError("value is not an integer") + if (value < -0x80000000 || value > 0x7fffffff) + throw new RangeError("number out of range") + + const numBytes = Math.ceil( + (33 - Math.clz32(value >= 0 ? value : -value - 1)) / 7 + ) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + + for (let i = 0; i < numBytes; i++) { + this.buf[this.offset + i] = + (value & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + value >>= 7 // sign-propagating right shift + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a nonnegative integer in a variable number of bytes using the LEB128 + * encoding scheme, up to the maximum size of integers supported by JavaScript + * (53 bits). + */ + appendUint53(value) { + if (!Number.isInteger(value)) + throw new RangeError("value is not an integer") + if (value < 0 || value > Number.MAX_SAFE_INTEGER) { + throw new RangeError("number out of range") + } + const high32 = Math.floor(value / 0x100000000) + const low32 = (value & 0xffffffff) >>> 0 // right shift to interpret as unsigned + return this.appendUint64(high32, low32) + } + + /** + * Encodes a signed integer in a variable number of bytes using the LEB128 + * encoding scheme, up to the maximum size of integers supported by JavaScript + * (53 bits). + */ + appendInt53(value) { + if (!Number.isInteger(value)) + throw new RangeError("value is not an integer") + if (value < Number.MIN_SAFE_INTEGER || value > Number.MAX_SAFE_INTEGER) { + throw new RangeError("number out of range") + } + const high32 = Math.floor(value / 0x100000000) + const low32 = (value & 0xffffffff) >>> 0 // right shift to interpret as unsigned + return this.appendInt64(high32, low32) + } + + /** + * Encodes a 64-bit nonnegative integer in a variable number of bytes using + * the LEB128 encoding scheme, and appends it to the buffer. The number is + * given as two 32-bit halves since JavaScript cannot accurately represent + * integers with more than 53 bits in a single variable. + */ + appendUint64(high32, low32) { + if (!Number.isInteger(high32) || !Number.isInteger(low32)) { + throw new RangeError("value is not an integer") + } + if (high32 < 0 || high32 > 0xffffffff || low32 < 0 || low32 > 0xffffffff) { + throw new RangeError("number out of range") + } + if (high32 === 0) return this.appendUint32(low32) + + const numBytes = Math.ceil((64 - Math.clz32(high32)) / 7) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + for (let i = 0; i < 4; i++) { + this.buf[this.offset + i] = (low32 & 0x7f) | 0x80 + low32 >>>= 7 // zero-filling right shift + } + this.buf[this.offset + 4] = + (low32 & 0x0f) | ((high32 & 0x07) << 4) | (numBytes === 5 ? 0x00 : 0x80) + high32 >>>= 3 + for (let i = 5; i < numBytes; i++) { + this.buf[this.offset + i] = + (high32 & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + high32 >>>= 7 + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a 64-bit signed integer in a variable number of bytes using the + * LEB128 encoding scheme, and appends it to the buffer. The number is given + * as two 32-bit halves since JavaScript cannot accurately represent integers + * with more than 53 bits in a single variable. The sign of the 64-bit + * number is determined by the sign of the `high32` half; the sign of the + * `low32` half is ignored. + */ + appendInt64(high32, low32) { + if (!Number.isInteger(high32) || !Number.isInteger(low32)) { + throw new RangeError("value is not an integer") + } + if ( + high32 < -0x80000000 || + high32 > 0x7fffffff || + low32 < -0x80000000 || + low32 > 0xffffffff + ) { + throw new RangeError("number out of range") + } + low32 >>>= 0 // interpret as unsigned + if (high32 === 0 && low32 <= 0x7fffffff) return this.appendInt32(low32) + if (high32 === -1 && low32 >= 0x80000000) + return this.appendInt32(low32 - 0x100000000) + + const numBytes = Math.ceil( + (65 - Math.clz32(high32 >= 0 ? high32 : -high32 - 1)) / 7 + ) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + for (let i = 0; i < 4; i++) { + this.buf[this.offset + i] = (low32 & 0x7f) | 0x80 + low32 >>>= 7 // zero-filling right shift + } + this.buf[this.offset + 4] = + (low32 & 0x0f) | ((high32 & 0x07) << 4) | (numBytes === 5 ? 0x00 : 0x80) + high32 >>= 3 // sign-propagating right shift + for (let i = 5; i < numBytes; i++) { + this.buf[this.offset + i] = + (high32 & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + high32 >>= 7 + } + this.offset += numBytes + return numBytes + } + + /** + * Appends the contents of byte buffer `data` to the buffer. Returns the + * number of bytes appended. + */ + appendRawBytes(data) { + if (this.offset + data.byteLength > this.buf.byteLength) { + this.grow(this.offset + data.byteLength) + } + this.buf.set(data, this.offset) + this.offset += data.byteLength + return data.byteLength + } + + /** + * Appends a UTF-8 string to the buffer, without any metadata. Returns the + * number of bytes appended. + */ + appendRawString(value) { + if (typeof value !== "string") throw new TypeError("value is not a string") + return this.appendRawBytes(stringToUtf8(value)) + } + + /** + * Appends the contents of byte buffer `data` to the buffer, prefixed with the + * number of bytes in the buffer (as a LEB128-encoded unsigned integer). + */ + appendPrefixedBytes(data) { + this.appendUint53(data.byteLength) + this.appendRawBytes(data) + return this + } + + /** + * Appends a UTF-8 string to the buffer, prefixed with its length in bytes + * (where the length is encoded as an unsigned LEB128 integer). + */ + appendPrefixedString(value) { + if (typeof value !== "string") throw new TypeError("value is not a string") + this.appendPrefixedBytes(stringToUtf8(value)) + return this + } + + /** + * Takes a value, which must be a string consisting only of hexadecimal + * digits, maps it to a byte array, and appends it to the buffer, prefixed + * with its length in bytes. + */ + appendHexString(value) { + this.appendPrefixedBytes(hexStringToBytes(value)) + return this + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() {} +} + +/** + * Counterpart to Encoder. Wraps a Uint8Array buffer with a cursor indicating + * the current decoding position, and allows values to be incrementally read by + * decoding the bytes at the current position. + */ +class Decoder { + constructor(buffer) { + if (!(buffer instanceof Uint8Array)) { + throw new TypeError(`Not a byte array: ${buffer}`) + } + this.buf = buffer + this.offset = 0 + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return this.offset === this.buf.byteLength + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + } + + /** + * Moves the current decoding position forward by the specified number of + * bytes, without decoding anything. + */ + skip(bytes) { + if (this.offset + bytes > this.buf.byteLength) { + throw new RangeError("cannot skip beyond end of buffer") + } + this.offset += bytes + } + + /** + * Reads one byte (0 to 255) from the buffer. + */ + readByte() { + this.offset += 1 + return this.buf[this.offset - 1] + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the buffer. + * Throws an exception if the value doesn't fit in a 32-bit unsigned int. + */ + readUint32() { + let result = 0, + shift = 0 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if (shift === 28 && (nextByte & 0xf0) !== 0) { + // more than 5 bytes, or value > 0xffffffff + throw new RangeError("number out of range") + } + result = (result | ((nextByte & 0x7f) << shift)) >>> 0 // right shift to interpret value as unsigned + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return result + } + throw new RangeError("buffer ended with incomplete number") + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the buffer. + * Throws an exception if the value doesn't fit in a 32-bit signed int. + */ + readInt32() { + let result = 0, + shift = 0 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if ( + (shift === 28 && (nextByte & 0x80) !== 0) || // more than 5 bytes + (shift === 28 && (nextByte & 0x40) === 0 && (nextByte & 0x38) !== 0) || // positive int > 0x7fffffff + (shift === 28 && (nextByte & 0x40) !== 0 && (nextByte & 0x38) !== 0x38) + ) { + // negative int < -0x80000000 + throw new RangeError("number out of range") + } + result |= (nextByte & 0x7f) << shift + shift += 7 + this.offset++ + + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) === 0 || shift > 28) { + return result // positive, or negative value that doesn't need sign-extending + } else { + return result | (-1 << shift) // sign-extend negative integer + } + } + } + throw new RangeError("buffer ended with incomplete number") + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the + * buffer. Allows any integer that can be safely represented by JavaScript + * (up to 2^53 - 1), and throws an exception outside of that range. + */ + readUint53() { + const { low32, high32 } = this.readUint64() + if (high32 < 0 || high32 > 0x1fffff) { + throw new RangeError("number out of range") + } + return high32 * 0x100000000 + low32 + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the + * buffer. Allows any integer that can be safely represented by JavaScript + * (between -(2^53 - 1) and 2^53 - 1), throws an exception outside of that range. + */ + readInt53() { + const { low32, high32 } = this.readInt64() + if ( + high32 < -0x200000 || + (high32 === -0x200000 && low32 === 0) || + high32 > 0x1fffff + ) { + throw new RangeError("number out of range") + } + return high32 * 0x100000000 + low32 + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the + * buffer. Throws an exception if the value doesn't fit in a 64-bit unsigned + * int. Returns the number in two 32-bit halves, as an object of the form + * `{high32, low32}`. + */ + readUint64() { + let low32 = 0, + high32 = 0, + shift = 0 + while (this.offset < this.buf.byteLength && shift <= 28) { + const nextByte = this.buf[this.offset] + low32 = (low32 | ((nextByte & 0x7f) << shift)) >>> 0 // right shift to interpret value as unsigned + if (shift === 28) { + high32 = (nextByte & 0x70) >>> 4 + } + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return { high32, low32 } + } + + shift = 3 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if (shift === 31 && (nextByte & 0xfe) !== 0) { + // more than 10 bytes, or value > 2^64 - 1 + throw new RangeError("number out of range") + } + high32 = (high32 | ((nextByte & 0x7f) << shift)) >>> 0 + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return { high32, low32 } + } + throw new RangeError("buffer ended with incomplete number") + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the + * buffer. Throws an exception if the value doesn't fit in a 64-bit signed + * int. Returns the number in two 32-bit halves, as an object of the form + * `{high32, low32}`. The `low32` half is always non-negative, and the + * sign of the `high32` half indicates the sign of the 64-bit number. + */ + readInt64() { + let low32 = 0, + high32 = 0, + shift = 0 + while (this.offset < this.buf.byteLength && shift <= 28) { + const nextByte = this.buf[this.offset] + low32 = (low32 | ((nextByte & 0x7f) << shift)) >>> 0 // right shift to interpret value as unsigned + if (shift === 28) { + high32 = (nextByte & 0x70) >>> 4 + } + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) !== 0) { + // sign-extend negative integer + if (shift < 32) low32 = (low32 | (-1 << shift)) >>> 0 + high32 |= -1 << Math.max(shift - 32, 0) + } + return { high32, low32 } + } + } + + shift = 3 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + // On the 10th byte there are only two valid values: all 7 value bits zero + // (if the value is positive) or all 7 bits one (if the value is negative) + if (shift === 31 && nextByte !== 0 && nextByte !== 0x7f) { + throw new RangeError("number out of range") + } + high32 |= (nextByte & 0x7f) << shift + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) !== 0 && shift < 32) { + // sign-extend negative integer + high32 |= -1 << shift + } + return { high32, low32 } + } + } + throw new RangeError("buffer ended with incomplete number") + } + + /** + * Extracts a subarray `length` bytes in size, starting from the current + * position in the buffer, and moves the position forward. + */ + readRawBytes(length) { + const start = this.offset + if (start + length > this.buf.byteLength) { + throw new RangeError("subarray exceeds buffer size") + } + this.offset += length + return this.buf.subarray(start, this.offset) + } + + /** + * Extracts `length` bytes from the buffer, starting from the current position, + * and returns the UTF-8 string decoding of those bytes. + */ + readRawString(length) { + return utf8ToString(this.readRawBytes(length)) + } + + /** + * Extracts a subarray from the current position in the buffer, prefixed with + * its length in bytes (encoded as an unsigned LEB128 integer). + */ + readPrefixedBytes() { + return this.readRawBytes(this.readUint53()) + } + + /** + * Reads a UTF-8 string from the current position in the buffer, prefixed with its + * length in bytes (where the length is encoded as an unsigned LEB128 integer). + */ + readPrefixedString() { + return utf8ToString(this.readPrefixedBytes()) + } + + /** + * Reads a byte array from the current position in the buffer, prefixed with its + * length in bytes. Returns that byte array converted to a hexadecimal string. + */ + readHexString() { + return bytesToHexString(this.readPrefixedBytes()) + } +} + +/** + * An encoder that uses run-length encoding to compress sequences of repeated + * values. The constructor argument specifies the type of values, which may be + * either 'int', 'uint', or 'utf8'. Besides valid values of the selected + * datatype, values may also be null. + * + * The encoded buffer starts with a LEB128-encoded signed integer, the + * repetition count. The interpretation of the following values depends on this + * repetition count: + * - If this number is a positive value n, the next value in the buffer + * (encoded as the specified datatype) is repeated n times in the sequence. + * - If the repetition count is a negative value -n, then the next n values + * (encoded as the specified datatype) in the buffer are treated as a + * literal, i.e. they appear in the sequence without any further + * interpretation or repetition. + * - If the repetition count is zero, then the next value in the buffer is a + * LEB128-encoded unsigned integer indicating the number of null values + * that appear at the current position in the sequence. + * + * After one of these three has completed, the process repeats, starting again + * with a repetition count, until we reach the end of the buffer. + */ +class RLEEncoder extends Encoder { + constructor(type) { + super() + this.type = type + this.state = "empty" + this.lastValue = undefined + this.count = 0 + this.literal = [] + } + + /** + * Appends a new value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + this._appendValue(value, repetitions) + } + + /** + * Like `appendValue()`, but this method is not overridden by `DeltaEncoder`. + */ + _appendValue(value, repetitions = 1) { + if (repetitions <= 0) return + if (this.state === "empty") { + this.state = + value === null + ? "nulls" + : repetitions === 1 + ? "loneValue" + : "repetition" + this.lastValue = value + this.count = repetitions + } else if (this.state === "loneValue") { + if (value === null) { + this.flush() + this.state = "nulls" + this.count = repetitions + } else if (value === this.lastValue) { + this.state = "repetition" + this.count = 1 + repetitions + } else if (repetitions > 1) { + this.flush() + this.state = "repetition" + this.count = repetitions + this.lastValue = value + } else { + this.state = "literal" + this.literal = [this.lastValue] + this.lastValue = value + } + } else if (this.state === "repetition") { + if (value === null) { + this.flush() + this.state = "nulls" + this.count = repetitions + } else if (value === this.lastValue) { + this.count += repetitions + } else if (repetitions > 1) { + this.flush() + this.state = "repetition" + this.count = repetitions + this.lastValue = value + } else { + this.flush() + this.state = "loneValue" + this.lastValue = value + } + } else if (this.state === "literal") { + if (value === null) { + this.literal.push(this.lastValue) + this.flush() + this.state = "nulls" + this.count = repetitions + } else if (value === this.lastValue) { + this.flush() + this.state = "repetition" + this.count = 1 + repetitions + } else if (repetitions > 1) { + this.literal.push(this.lastValue) + this.flush() + this.state = "repetition" + this.count = repetitions + this.lastValue = value + } else { + this.literal.push(this.lastValue) + this.lastValue = value + } + } else if (this.state === "nulls") { + if (value === null) { + this.count += repetitions + } else if (repetitions > 1) { + this.flush() + this.state = "repetition" + this.count = repetitions + this.lastValue = value + } else { + this.flush() + this.state = "loneValue" + this.lastValue = value + } + } + } + + /** + * Copies values from the RLEDecoder `decoder` into this encoder. The `options` object may + * contain the following keys: + * - `count`: The number of values to copy. If not specified, copies all remaining values. + * - `sumValues`: If true, the function computes the sum of all numeric values as they are + * copied (null values are counted as zero), and returns that number. + * - `sumShift`: If set, values are shifted right by `sumShift` bits before adding to the sum. + * + * Returns an object of the form `{nonNullValues, sum}` where `nonNullValues` is the number of + * non-null values copied, and `sum` is the sum (only if the `sumValues` option is set). + */ + copyFrom(decoder, options = {}) { + const { count, sumValues, sumShift } = options + if (!(decoder instanceof RLEDecoder) || decoder.type !== this.type) { + throw new TypeError("incompatible type of decoder") + } + let remaining = typeof count === "number" ? count : Number.MAX_SAFE_INTEGER + let nonNullValues = 0, + sum = 0 + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) + return sumValues ? { nonNullValues, sum } : { nonNullValues } + + // Copy a value so that we have a well-defined starting state. NB: when super.copyFrom() is + // called by the DeltaEncoder subclass, the following calls to readValue() and appendValue() + // refer to the overridden methods, while later readRecord(), readRawValue() and _appendValue() + // calls refer to the non-overridden RLEDecoder/RLEEncoder methods. + let firstValue = decoder.readValue() + if (firstValue === null) { + const numNulls = Math.min(decoder.count + 1, remaining) + remaining -= numNulls + decoder.count -= numNulls - 1 + this.appendValue(null, numNulls) + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) + return sumValues ? { nonNullValues, sum } : { nonNullValues } + firstValue = decoder.readValue() + if (firstValue === null) + throw new RangeError("null run must be followed by non-null value") + } + this.appendValue(firstValue) + remaining-- + nonNullValues++ + if (sumValues) sum += sumShift ? firstValue >>> sumShift : firstValue + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) + return sumValues ? { nonNullValues, sum } : { nonNullValues } + + // Copy data at the record level without expanding repetitions + let firstRun = decoder.count > 0 + while (remaining > 0 && !decoder.done) { + if (!firstRun) decoder.readRecord() + const numValues = Math.min(decoder.count, remaining) + decoder.count -= numValues + + if (decoder.state === "literal") { + nonNullValues += numValues + for (let i = 0; i < numValues; i++) { + if (decoder.done) throw new RangeError("incomplete literal") + const value = decoder.readRawValue() + if (value === decoder.lastValue) + throw new RangeError( + "Repetition of values is not allowed in literal" + ) + decoder.lastValue = value + this._appendValue(value) + if (sumValues) sum += sumShift ? value >>> sumShift : value + } + } else if (decoder.state === "repetition") { + nonNullValues += numValues + if (sumValues) + sum += + numValues * + (sumShift ? decoder.lastValue >>> sumShift : decoder.lastValue) + const value = decoder.lastValue + this._appendValue(value) + if (numValues > 1) { + this._appendValue(value) + if (this.state !== "repetition") + throw new RangeError(`Unexpected state ${this.state}`) + this.count += numValues - 2 + } + } else if (decoder.state === "nulls") { + this._appendValue(null) + if (this.state !== "nulls") + throw new RangeError(`Unexpected state ${this.state}`) + this.count += numValues - 1 + } + + firstRun = false + remaining -= numValues + } + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + return sumValues ? { nonNullValues, sum } : { nonNullValues } + } + + /** + * Private method, do not call from outside the class. + */ + flush() { + if (this.state === "loneValue") { + this.appendInt32(-1) + this.appendRawValue(this.lastValue) + } else if (this.state === "repetition") { + this.appendInt53(this.count) + this.appendRawValue(this.lastValue) + } else if (this.state === "literal") { + this.appendInt53(-this.literal.length) + for (let v of this.literal) this.appendRawValue(v) + } else if (this.state === "nulls") { + this.appendInt32(0) + this.appendUint53(this.count) + } + this.state = "empty" + } + + /** + * Private method, do not call from outside the class. + */ + appendRawValue(value) { + if (this.type === "int") { + this.appendInt53(value) + } else if (this.type === "uint") { + this.appendUint53(value) + } else if (this.type === "utf8") { + this.appendPrefixedString(value) + } else { + throw new RangeError(`Unknown RLEEncoder datatype: ${this.type}`) + } + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() { + if (this.state === "literal") this.literal.push(this.lastValue) + // Don't write anything if the only values we have seen are nulls + if (this.state !== "nulls" || this.offset > 0) this.flush() + } +} + +/** + * Counterpart to RLEEncoder: reads values from an RLE-compressed sequence, + * returning nulls and repeated values as required. + */ +class RLEDecoder extends Decoder { + constructor(type, buffer) { + super(buffer) + this.type = type + this.lastValue = undefined + this.count = 0 + this.state = undefined + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return this.count === 0 && this.offset === this.buf.byteLength + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = undefined + this.count = 0 + this.state = undefined + } + + /** + * Returns the next value (or null) in the sequence. + */ + readValue() { + if (this.done) return null + if (this.count === 0) this.readRecord() + this.count -= 1 + if (this.state === "literal") { + const value = this.readRawValue() + if (value === this.lastValue) + throw new RangeError("Repetition of values is not allowed in literal") + this.lastValue = value + return value + } else { + return this.lastValue + } + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) { + this.count = this.readInt53() + if (this.count > 0) { + this.lastValue = + this.count <= numSkip ? this.skipRawValues(1) : this.readRawValue() + this.state = "repetition" + } else if (this.count < 0) { + this.count = -this.count + this.state = "literal" + } else { + // this.count == 0 + this.count = this.readUint53() + this.lastValue = null + this.state = "nulls" + } + } + + const consume = Math.min(numSkip, this.count) + if (this.state === "literal") this.skipRawValues(consume) + numSkip -= consume + this.count -= consume + } + } + + /** + * Private method, do not call from outside the class. + * Reads a repetition count from the buffer and sets up the state appropriately. + */ + readRecord() { + this.count = this.readInt53() + if (this.count > 1) { + const value = this.readRawValue() + if ( + (this.state === "repetition" || this.state === "literal") && + this.lastValue === value + ) { + throw new RangeError( + "Successive repetitions with the same value are not allowed" + ) + } + this.state = "repetition" + this.lastValue = value + } else if (this.count === 1) { + throw new RangeError( + "Repetition count of 1 is not allowed, use a literal instead" + ) + } else if (this.count < 0) { + this.count = -this.count + if (this.state === "literal") + throw new RangeError("Successive literals are not allowed") + this.state = "literal" + } else { + // this.count == 0 + if (this.state === "nulls") + throw new RangeError("Successive null runs are not allowed") + this.count = this.readUint53() + if (this.count === 0) + throw new RangeError("Zero-length null runs are not allowed") + this.lastValue = null + this.state = "nulls" + } + } + + /** + * Private method, do not call from outside the class. + * Reads one value of the datatype configured on construction. + */ + readRawValue() { + if (this.type === "int") { + return this.readInt53() + } else if (this.type === "uint") { + return this.readUint53() + } else if (this.type === "utf8") { + return this.readPrefixedString() + } else { + throw new RangeError(`Unknown RLEDecoder datatype: ${this.type}`) + } + } + + /** + * Private method, do not call from outside the class. + * Skips over `num` values of the datatype configured on construction. + */ + skipRawValues(num) { + if (this.type === "utf8") { + for (let i = 0; i < num; i++) this.skip(this.readUint53()) + } else { + while (num > 0 && this.offset < this.buf.byteLength) { + if ((this.buf[this.offset] & 0x80) === 0) num-- + this.offset++ + } + if (num > 0) throw new RangeError("cannot skip beyond end of buffer") + } + } +} + +/** + * A variant of RLEEncoder: rather than storing the actual values passed to + * appendValue(), this version stores only the first value, and for all + * subsequent values it stores the difference to the previous value. This + * encoding is good when values tend to come in sequentially incrementing runs, + * because the delta between successive values is 1, and repeated values of 1 + * are easily compressed with run-length encoding. + * + * Null values are also allowed, as with RLEEncoder. + */ +class DeltaEncoder extends RLEEncoder { + constructor() { + super("int") + this.absoluteValue = 0 + } + + /** + * Appends a new integer value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + if (repetitions <= 0) return + if (typeof value === "number") { + super.appendValue(value - this.absoluteValue, 1) + this.absoluteValue = value + if (repetitions > 1) super.appendValue(0, repetitions - 1) + } else { + super.appendValue(value, repetitions) + } + } + + /** + * Copies values from the DeltaDecoder `decoder` into this encoder. The `options` object may + * contain the key `count`, indicating the number of values to copy. If not specified, copies + * all remaining values in the decoder. + */ + copyFrom(decoder, options = {}) { + if (options.sumValues) { + throw new RangeError("unsupported options for DeltaEncoder.copyFrom()") + } + if (!(decoder instanceof DeltaDecoder)) { + throw new TypeError("incompatible type of decoder") + } + + let remaining = options.count + if (remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${remaining} values`) + if (remaining === 0 || decoder.done) return + + // Copy any null values, and the first non-null value, so that appendValue() computes the + // difference between the encoder's last value and the decoder's first (absolute) value. + let value = decoder.readValue(), + nulls = 0 + this.appendValue(value) + if (value === null) { + nulls = decoder.count + 1 + if (remaining !== undefined && remaining < nulls) nulls = remaining + decoder.count -= nulls - 1 + this.count += nulls - 1 + if (remaining > nulls && decoder.done) + throw new RangeError(`cannot copy ${remaining} values`) + if (remaining === nulls || decoder.done) return + + // The next value read is certain to be non-null because we're not at the end of the decoder, + // and a run of nulls must be followed by a run of non-nulls. + if (decoder.count === 0) this.appendValue(decoder.readValue()) + } + + // Once we have the first value, the subsequent relative values can be copied verbatim without + // any further processing. Note that the first value copied by super.copyFrom() is an absolute + // value, while subsequent values are relative. Thus, the sum of all of the (non-null) copied + // values must equal the absolute value of the final element copied. + if (remaining !== undefined) remaining -= nulls + 1 + const { nonNullValues, sum } = super.copyFrom(decoder, { + count: remaining, + sumValues: true, + }) + if (nonNullValues > 0) { + this.absoluteValue = sum + decoder.absoluteValue = sum + } + } +} + +/** + * Counterpart to DeltaEncoder: reads values from a delta-compressed sequence of + * numbers (may include null values). + */ +class DeltaDecoder extends RLEDecoder { + constructor(buffer) { + super("int", buffer) + this.absoluteValue = 0 + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = undefined + this.count = 0 + this.state = undefined + this.absoluteValue = 0 + } + + /** + * Returns the next integer (or null) value in the sequence. + */ + readValue() { + const value = super.readValue() + if (value === null) return null + this.absoluteValue += value + return this.absoluteValue + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) this.readRecord() + const consume = Math.min(numSkip, this.count) + if (this.state === "literal") { + for (let i = 0; i < consume; i++) { + this.lastValue = this.readRawValue() + this.absoluteValue += this.lastValue + } + } else if (this.state === "repetition") { + this.absoluteValue += consume * this.lastValue + } + numSkip -= consume + this.count -= consume + } + } +} + +/** + * Encodes a sequence of boolean values by mapping it to a sequence of integers: + * the number of false values, followed by the number of true values, followed + * by the number of false values, and so on. Each number is encoded as a LEB128 + * unsigned integer. This encoding is a bit like RLEEncoder, except that we + * only encode the repetition count but not the actual value, since the values + * just alternate between false and true (starting with false). + */ +class BooleanEncoder extends Encoder { + constructor() { + super() + this.lastValue = false + this.count = 0 + } + + /** + * Appends a new value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + if (value !== false && value !== true) { + throw new RangeError(`Unsupported value for BooleanEncoder: ${value}`) + } + if (repetitions <= 0) return + if (this.lastValue === value) { + this.count += repetitions + } else { + this.appendUint53(this.count) + this.lastValue = value + this.count = repetitions + } + } + + /** + * Copies values from the BooleanDecoder `decoder` into this encoder. The `options` object may + * contain the key `count`, indicating the number of values to copy. If not specified, copies + * all remaining values in the decoder. + */ + copyFrom(decoder, options = {}) { + if (!(decoder instanceof BooleanDecoder)) { + throw new TypeError("incompatible type of decoder") + } + + const { count } = options + let remaining = typeof count === "number" ? count : Number.MAX_SAFE_INTEGER + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) return + + // Copy one value to bring decoder and encoder state into sync, then finish that value's repetitions + this.appendValue(decoder.readValue()) + remaining-- + const firstCopy = Math.min(decoder.count, remaining) + this.count += firstCopy + decoder.count -= firstCopy + remaining -= firstCopy + + while (remaining > 0 && !decoder.done) { + decoder.count = decoder.readUint53() + if (decoder.count === 0) + throw new RangeError("Zero-length runs are not allowed") + decoder.lastValue = !decoder.lastValue + this.appendUint53(this.count) + + const numCopied = Math.min(decoder.count, remaining) + this.count = numCopied + this.lastValue = decoder.lastValue + decoder.count -= numCopied + remaining -= numCopied + } + + if (count && remaining > 0 && decoder.done) + throw new RangeError(`cannot copy ${count} values`) + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() { + if (this.count > 0) { + this.appendUint53(this.count) + this.count = 0 + } + } +} + +/** + * Counterpart to BooleanEncoder: reads boolean values from a runlength-encoded + * sequence. + */ +class BooleanDecoder extends Decoder { + constructor(buffer) { + super(buffer) + this.lastValue = true // is negated the first time we read a count + this.firstRun = true + this.count = 0 + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return this.count === 0 && this.offset === this.buf.byteLength + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = true + this.firstRun = true + this.count = 0 + } + + /** + * Returns the next value in the sequence. + */ + readValue() { + if (this.done) return false + while (this.count === 0) { + this.count = this.readUint53() + this.lastValue = !this.lastValue + if (this.count === 0 && !this.firstRun) { + throw new RangeError("Zero-length runs are not allowed") + } + this.firstRun = false + } + this.count -= 1 + return this.lastValue + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) { + this.count = this.readUint53() + this.lastValue = !this.lastValue + if (this.count === 0) + throw new RangeError("Zero-length runs are not allowed") + } + if (this.count < numSkip) { + numSkip -= this.count + this.count = 0 + } else { + this.count -= numSkip + numSkip = 0 + } + } + } +} + +module.exports = { + stringToUtf8, + utf8ToString, + hexStringToBytes, + bytesToHexString, + Encoder, + Decoder, + RLEEncoder, + RLEDecoder, + DeltaEncoder, + DeltaDecoder, + BooleanEncoder, + BooleanDecoder, +} diff --git a/javascript/test/legacy/sync.js b/javascript/test/legacy/sync.js new file mode 100644 index 00000000..233c4292 --- /dev/null +++ b/javascript/test/legacy/sync.js @@ -0,0 +1,566 @@ +/** + * Implementation of the data synchronisation protocol that brings a local and a remote document + * into the same state. This is typically used when two nodes have been disconnected for some time, + * and need to exchange any changes that happened while they were disconnected. The two nodes that + * are syncing could be client and server, or server and client, or two peers with symmetric roles. + * + * The protocol is based on this paper: Martin Kleppmann and Heidi Howard. Byzantine Eventual + * Consistency and the Fundamental Limits of Peer-to-Peer Databases. https://arxiv.org/abs/2012.00472 + * + * The protocol assumes that every time a node successfully syncs with another node, it remembers + * the current heads (as returned by `Backend.getHeads()`) after the last sync with that node. The + * next time we try to sync with the same node, we start from the assumption that the other node's + * document version is no older than the outcome of the last sync, so we only need to exchange any + * changes that are more recent than the last sync. This assumption may not be true if the other + * node did not correctly persist its state (perhaps it crashed before writing the result of the + * last sync to disk), and we fall back to sending the entire document in this case. + */ + +const Backend = null //require('./backend') +const { + hexStringToBytes, + bytesToHexString, + Encoder, + Decoder, +} = require("./encoding") +const { decodeChangeMeta } = require("./columnar") +const { copyObject } = require("./common") + +const HASH_SIZE = 32 // 256 bits = 32 bytes +const MESSAGE_TYPE_SYNC = 0x42 // first byte of a sync message, for identification +const PEER_STATE_TYPE = 0x43 // first byte of an encoded peer state, for identification + +// These constants correspond to a 1% false positive rate. The values can be changed without +// breaking compatibility of the network protocol, since the parameters used for a particular +// Bloom filter are encoded in the wire format. +const BITS_PER_ENTRY = 10, + NUM_PROBES = 7 + +/** + * A Bloom filter implementation that can be serialised to a byte array for transmission + * over a network. The entries that are added are assumed to already be SHA-256 hashes, + * so this implementation does not perform its own hashing. + */ +class BloomFilter { + constructor(arg) { + if (Array.isArray(arg)) { + // arg is an array of SHA256 hashes in hexadecimal encoding + this.numEntries = arg.length + this.numBitsPerEntry = BITS_PER_ENTRY + this.numProbes = NUM_PROBES + this.bits = new Uint8Array( + Math.ceil((this.numEntries * this.numBitsPerEntry) / 8) + ) + for (let hash of arg) this.addHash(hash) + } else if (arg instanceof Uint8Array) { + if (arg.byteLength === 0) { + this.numEntries = 0 + this.numBitsPerEntry = 0 + this.numProbes = 0 + this.bits = arg + } else { + const decoder = new Decoder(arg) + this.numEntries = decoder.readUint32() + this.numBitsPerEntry = decoder.readUint32() + this.numProbes = decoder.readUint32() + this.bits = decoder.readRawBytes( + Math.ceil((this.numEntries * this.numBitsPerEntry) / 8) + ) + } + } else { + throw new TypeError("invalid argument") + } + } + + /** + * Returns the Bloom filter state, encoded as a byte array. + */ + get bytes() { + if (this.numEntries === 0) return new Uint8Array(0) + const encoder = new Encoder() + encoder.appendUint32(this.numEntries) + encoder.appendUint32(this.numBitsPerEntry) + encoder.appendUint32(this.numProbes) + encoder.appendRawBytes(this.bits) + return encoder.buffer + } + + /** + * Given a SHA-256 hash (as hex string), returns an array of probe indexes indicating which bits + * in the Bloom filter need to be tested or set for this particular entry. We do this by + * interpreting the first 12 bytes of the hash as three little-endian 32-bit unsigned integers, + * and then using triple hashing to compute the probe indexes. The algorithm comes from: + * + * Peter C. Dillinger and Panagiotis Manolios. Bloom Filters in Probabilistic Verification. + * 5th International Conference on Formal Methods in Computer-Aided Design (FMCAD), November 2004. + * http://www.ccis.northeastern.edu/home/pete/pub/bloom-filters-verification.pdf + */ + getProbes(hash) { + const hashBytes = hexStringToBytes(hash), + modulo = 8 * this.bits.byteLength + if (hashBytes.byteLength !== 32) + throw new RangeError(`Not a 256-bit hash: ${hash}`) + // on the next three lines, the right shift means interpret value as unsigned + let x = + ((hashBytes[0] | + (hashBytes[1] << 8) | + (hashBytes[2] << 16) | + (hashBytes[3] << 24)) >>> + 0) % + modulo + let y = + ((hashBytes[4] | + (hashBytes[5] << 8) | + (hashBytes[6] << 16) | + (hashBytes[7] << 24)) >>> + 0) % + modulo + let z = + ((hashBytes[8] | + (hashBytes[9] << 8) | + (hashBytes[10] << 16) | + (hashBytes[11] << 24)) >>> + 0) % + modulo + const probes = [x] + for (let i = 1; i < this.numProbes; i++) { + x = (x + y) % modulo + y = (y + z) % modulo + probes.push(x) + } + return probes + } + + /** + * Sets the Bloom filter bits corresponding to a given SHA-256 hash (given as hex string). + */ + addHash(hash) { + for (let probe of this.getProbes(hash)) { + this.bits[probe >>> 3] |= 1 << (probe & 7) + } + } + + /** + * Tests whether a given SHA-256 hash (given as hex string) is contained in the Bloom filter. + */ + containsHash(hash) { + if (this.numEntries === 0) return false + for (let probe of this.getProbes(hash)) { + if ((this.bits[probe >>> 3] & (1 << (probe & 7))) === 0) { + return false + } + } + return true + } +} + +/** + * Encodes a sorted array of SHA-256 hashes (as hexadecimal strings) into a byte array. + */ +function encodeHashes(encoder, hashes) { + if (!Array.isArray(hashes)) throw new TypeError("hashes must be an array") + encoder.appendUint32(hashes.length) + for (let i = 0; i < hashes.length; i++) { + if (i > 0 && hashes[i - 1] >= hashes[i]) + throw new RangeError("hashes must be sorted") + const bytes = hexStringToBytes(hashes[i]) + if (bytes.byteLength !== HASH_SIZE) + throw new TypeError("heads hashes must be 256 bits") + encoder.appendRawBytes(bytes) + } +} + +/** + * Decodes a byte array in the format returned by encodeHashes(), and returns its content as an + * array of hex strings. + */ +function decodeHashes(decoder) { + let length = decoder.readUint32(), + hashes = [] + for (let i = 0; i < length; i++) { + hashes.push(bytesToHexString(decoder.readRawBytes(HASH_SIZE))) + } + return hashes +} + +/** + * Takes a sync message of the form `{heads, need, have, changes}` and encodes it as a byte array for + * transmission. + */ +function encodeSyncMessage(message) { + const encoder = new Encoder() + encoder.appendByte(MESSAGE_TYPE_SYNC) + encodeHashes(encoder, message.heads) + encodeHashes(encoder, message.need) + encoder.appendUint32(message.have.length) + for (let have of message.have) { + encodeHashes(encoder, have.lastSync) + encoder.appendPrefixedBytes(have.bloom) + } + encoder.appendUint32(message.changes.length) + for (let change of message.changes) { + encoder.appendPrefixedBytes(change) + } + return encoder.buffer +} + +/** + * Takes a binary-encoded sync message and decodes it into the form `{heads, need, have, changes}`. + */ +function decodeSyncMessage(bytes) { + const decoder = new Decoder(bytes) + const messageType = decoder.readByte() + if (messageType !== MESSAGE_TYPE_SYNC) { + throw new RangeError(`Unexpected message type: ${messageType}`) + } + const heads = decodeHashes(decoder) + const need = decodeHashes(decoder) + const haveCount = decoder.readUint32() + let message = { heads, need, have: [], changes: [] } + for (let i = 0; i < haveCount; i++) { + const lastSync = decodeHashes(decoder) + const bloom = decoder.readPrefixedBytes(decoder) + message.have.push({ lastSync, bloom }) + } + const changeCount = decoder.readUint32() + for (let i = 0; i < changeCount; i++) { + const change = decoder.readPrefixedBytes() + message.changes.push(change) + } + // Ignore any trailing bytes -- they can be used for extensions by future versions of the protocol + return message +} + +/** + * Takes a SyncState and encodes as a byte array those parts of the state that should persist across + * an application restart or disconnect and reconnect. The ephemeral parts of the state that should + * be cleared on reconnect are not encoded. + */ +function encodeSyncState(syncState) { + const encoder = new Encoder() + encoder.appendByte(PEER_STATE_TYPE) + encodeHashes(encoder, syncState.sharedHeads) + return encoder.buffer +} + +/** + * Takes a persisted peer state as encoded by `encodeSyncState` and decodes it into a SyncState + * object. The parts of the peer state that were not encoded are initialised with default values. + */ +function decodeSyncState(bytes) { + const decoder = new Decoder(bytes) + const recordType = decoder.readByte() + if (recordType !== PEER_STATE_TYPE) { + throw new RangeError(`Unexpected record type: ${recordType}`) + } + const sharedHeads = decodeHashes(decoder) + return Object.assign(initSyncState(), { sharedHeads }) +} + +/** + * Constructs a Bloom filter containing all changes that are not one of the hashes in + * `lastSync` or its transitive dependencies. In other words, the filter contains those + * changes that have been applied since the version identified by `lastSync`. Returns + * an object of the form `{lastSync, bloom}` as required for the `have` field of a sync + * message. + */ +function makeBloomFilter(backend, lastSync) { + const newChanges = Backend.getChanges(backend, lastSync) + const hashes = newChanges.map(change => decodeChangeMeta(change, true).hash) + return { lastSync, bloom: new BloomFilter(hashes).bytes } +} + +/** + * Call this function when a sync message is received from another node. The `message` argument + * needs to already have been decoded using `decodeSyncMessage()`. This function determines the + * changes that we need to send to the other node in response. Returns an array of changes (as + * byte arrays). + */ +function getChangesToSend(backend, have, need) { + if (have.length === 0) { + return need + .map(hash => Backend.getChangeByHash(backend, hash)) + .filter(change => change !== undefined) + } + + let lastSyncHashes = {}, + bloomFilters = [] + for (let h of have) { + for (let hash of h.lastSync) lastSyncHashes[hash] = true + bloomFilters.push(new BloomFilter(h.bloom)) + } + + // Get all changes that were added since the last sync + const changes = Backend.getChanges(backend, Object.keys(lastSyncHashes)).map( + change => decodeChangeMeta(change, true) + ) + + let changeHashes = {}, + dependents = {}, + hashesToSend = {} + for (let change of changes) { + changeHashes[change.hash] = true + + // For each change, make a list of changes that depend on it + for (let dep of change.deps) { + if (!dependents[dep]) dependents[dep] = [] + dependents[dep].push(change.hash) + } + + // Exclude any change hashes contained in one or more Bloom filters + if (bloomFilters.every(bloom => !bloom.containsHash(change.hash))) { + hashesToSend[change.hash] = true + } + } + + // Include any changes that depend on a Bloom-negative change + let stack = Object.keys(hashesToSend) + while (stack.length > 0) { + const hash = stack.pop() + if (dependents[hash]) { + for (let dep of dependents[hash]) { + if (!hashesToSend[dep]) { + hashesToSend[dep] = true + stack.push(dep) + } + } + } + } + + // Include any explicitly requested changes + let changesToSend = [] + for (let hash of need) { + hashesToSend[hash] = true + if (!changeHashes[hash]) { + // Change is not among those returned by getMissingChanges()? + const change = Backend.getChangeByHash(backend, hash) + if (change) changesToSend.push(change) + } + } + + // Return changes in the order they were returned by getMissingChanges() + for (let change of changes) { + if (hashesToSend[change.hash]) changesToSend.push(change.change) + } + return changesToSend +} + +function initSyncState() { + return { + sharedHeads: [], + lastSentHeads: [], + theirHeads: null, + theirNeed: null, + theirHave: null, + sentHashes: {}, + } +} + +function compareArrays(a, b) { + return a.length === b.length && a.every((v, i) => v === b[i]) +} + +/** + * Given a backend and what we believe to be the state of our peer, generate a message which tells + * them about we have and includes any changes we believe they need + */ +function generateSyncMessage(backend, syncState) { + if (!backend) { + throw new Error("generateSyncMessage called with no Automerge document") + } + if (!syncState) { + throw new Error( + "generateSyncMessage requires a syncState, which can be created with initSyncState()" + ) + } + + let { + sharedHeads, + lastSentHeads, + theirHeads, + theirNeed, + theirHave, + sentHashes, + } = syncState + const ourHeads = Backend.getHeads(backend) + + // Hashes to explicitly request from the remote peer: any missing dependencies of unapplied + // changes, and any of the remote peer's heads that we don't know about + const ourNeed = Backend.getMissingDeps(backend, theirHeads || []) + + // There are two reasons why ourNeed may be nonempty: 1. we might be missing dependencies due to + // Bloom filter false positives; 2. we might be missing heads that the other peer mentioned + // because they (intentionally) only sent us a subset of changes. In case 1, we leave the `have` + // field of the message empty because we just want to fill in the missing dependencies for now. + // In case 2, or if ourNeed is empty, we send a Bloom filter to request any unsent changes. + let ourHave = [] + if (!theirHeads || ourNeed.every(hash => theirHeads.includes(hash))) { + ourHave = [makeBloomFilter(backend, sharedHeads)] + } + + // Fall back to a full re-sync if the sender's last sync state includes hashes + // that we don't know. This could happen if we crashed after the last sync and + // failed to persist changes that the other node already sent us. + if (theirHave && theirHave.length > 0) { + const lastSync = theirHave[0].lastSync + if (!lastSync.every(hash => Backend.getChangeByHash(backend, hash))) { + // we need to queue them to send us a fresh sync message, the one they sent is uninteligible so we don't know what they need + const resetMsg = { + heads: ourHeads, + need: [], + have: [{ lastSync: [], bloom: new Uint8Array(0) }], + changes: [], + } + return [syncState, encodeSyncMessage(resetMsg)] + } + } + + // XXX: we should limit ourselves to only sending a subset of all the messages, probably limited by a total message size + // these changes should ideally be RLE encoded but we haven't implemented that yet. + let changesToSend = + Array.isArray(theirHave) && Array.isArray(theirNeed) + ? getChangesToSend(backend, theirHave, theirNeed) + : [] + + // If the heads are equal, we're in sync and don't need to do anything further + const headsUnchanged = + Array.isArray(lastSentHeads) && compareArrays(ourHeads, lastSentHeads) + const headsEqual = + Array.isArray(theirHeads) && compareArrays(ourHeads, theirHeads) + if (headsUnchanged && headsEqual && changesToSend.length === 0) { + // no need to send a sync message if we know we're synced! + return [syncState, null] + } + + // TODO: this recomputes the SHA-256 hash of each change; we should restructure this to avoid the + // unnecessary recomputation + changesToSend = changesToSend.filter( + change => !sentHashes[decodeChangeMeta(change, true).hash] + ) + + // Regular response to a sync message: send any changes that the other node + // doesn't have. We leave the "have" field empty because the previous message + // generated by `syncStart` already indicated what changes we have. + const syncMessage = { + heads: ourHeads, + have: ourHave, + need: ourNeed, + changes: changesToSend, + } + if (changesToSend.length > 0) { + sentHashes = copyObject(sentHashes) + for (const change of changesToSend) { + sentHashes[decodeChangeMeta(change, true).hash] = true + } + } + + syncState = Object.assign({}, syncState, { + lastSentHeads: ourHeads, + sentHashes, + }) + return [syncState, encodeSyncMessage(syncMessage)] +} + +/** + * Computes the heads that we share with a peer after we have just received some changes from that + * peer and applied them. This may not be sufficient to bring our heads in sync with the other + * peer's heads, since they may have only sent us a subset of their outstanding changes. + * + * `myOldHeads` are the local heads before the most recent changes were applied, `myNewHeads` are + * the local heads after those changes were applied, and `ourOldSharedHeads` is the previous set of + * shared heads. Applying the changes will have replaced some heads with others, but some heads may + * have remained unchanged (because they are for branches on which no changes have been added). Any + * such unchanged heads remain in the sharedHeads. Any sharedHeads that were replaced by applying + * changes are also replaced as sharedHeads. This is safe because if we received some changes from + * another peer, that means that peer had those changes, and therefore we now both know about them. + */ +function advanceHeads(myOldHeads, myNewHeads, ourOldSharedHeads) { + const newHeads = myNewHeads.filter(head => !myOldHeads.includes(head)) + const commonHeads = ourOldSharedHeads.filter(head => + myNewHeads.includes(head) + ) + const advancedHeads = [...new Set([...newHeads, ...commonHeads])].sort() + return advancedHeads +} + +/** + * Given a backend, a message message and the state of our peer, apply any changes, update what + * we believe about the peer, and (if there were applied changes) produce a patch for the frontend + */ +function receiveSyncMessage(backend, oldSyncState, binaryMessage) { + if (!backend) { + throw new Error("generateSyncMessage called with no Automerge document") + } + if (!oldSyncState) { + throw new Error( + "generateSyncMessage requires a syncState, which can be created with initSyncState()" + ) + } + + let { sharedHeads, lastSentHeads, sentHashes } = oldSyncState, + patch = null + const message = decodeSyncMessage(binaryMessage) + const beforeHeads = Backend.getHeads(backend) + + // If we received changes, we try to apply them to the document. There may still be missing + // dependencies due to Bloom filter false positives, in which case the backend will enqueue the + // changes without applying them. The set of changes may also be incomplete if the sender decided + // to break a large set of changes into chunks. + if (message.changes.length > 0) { + ;[backend, patch] = Backend.applyChanges(backend, message.changes) + sharedHeads = advanceHeads( + beforeHeads, + Backend.getHeads(backend), + sharedHeads + ) + } + + // If heads are equal, indicate we don't need to send a response message + if ( + message.changes.length === 0 && + compareArrays(message.heads, beforeHeads) + ) { + lastSentHeads = message.heads + } + + // If all of the remote heads are known to us, that means either our heads are equal, or we are + // ahead of the remote peer. In this case, take the remote heads to be our shared heads. + const knownHeads = message.heads.filter(head => + Backend.getChangeByHash(backend, head) + ) + if (knownHeads.length === message.heads.length) { + sharedHeads = message.heads + // If the remote peer has lost all its data, reset our state to perform a full resync + if (message.heads.length === 0) { + lastSentHeads = [] + sentHashes = [] + } + } else { + // If some remote heads are unknown to us, we add all the remote heads we know to + // sharedHeads, but don't remove anything from sharedHeads. This might cause sharedHeads to + // contain some redundant hashes (where one hash is actually a transitive dependency of + // another), but this will be cleared up as soon as we know all the remote heads. + sharedHeads = [...new Set(knownHeads.concat(sharedHeads))].sort() + } + + const syncState = { + sharedHeads, // what we have in common to generate an efficient bloom filter + lastSentHeads, + theirHave: message.have, // the information we need to calculate the changes they need + theirHeads: message.heads, + theirNeed: message.need, + sentHashes, + } + return [backend, syncState, patch] +} + +module.exports = { + receiveSyncMessage, + generateSyncMessage, + encodeSyncMessage, + decodeSyncMessage, + initSyncState, + encodeSyncState, + decodeSyncState, + BloomFilter, // BloomFilter is a private API, exported only for testing purposes +} diff --git a/javascript/test/legacy_tests.ts b/javascript/test/legacy_tests.ts new file mode 100644 index 00000000..8c2e552e --- /dev/null +++ b/javascript/test/legacy_tests.ts @@ -0,0 +1,1874 @@ +import * as assert from "assert" +import { unstable as Automerge } from "../src" +import { assertEqualsOneOf } from "./helpers" +import { decodeChange } from "./legacy/columnar" + +const UUID_PATTERN = /^[0-9a-f]{32}$/ +const OPID_PATTERN = /^[0-9]+@([0-9a-f][0-9a-f])*$/ + +// CORE FEATURES +// +// TODO - Cursors +// TODO - Tables +// TODO - on-pass load() & reconstruct change from opset +// TODO - micro-patches (needed for fully hydrated object in js) +// TODO - valueAt(heads) / GC +// +// AUTOMERGE UNSUPPORTED +// +// TODO - patchCallback + +describe("Automerge", () => { + describe("initialization ", () => { + it("should initially be an empty map", () => { + const doc = Automerge.init() + assert.deepStrictEqual(doc, {}) + }) + + it("should allow instantiating from an existing object", () => { + const initialState = { birds: { wrens: 3, magpies: 4 } } + const doc = Automerge.from(initialState) + assert.deepStrictEqual(doc, initialState) + }) + + it("should allow merging of an object initialized with `from`", () => { + let doc1 = Automerge.from({ cards: [] }) + let doc2 = Automerge.merge(Automerge.init(), doc1) + assert.deepStrictEqual(doc2, { cards: [] }) + }) + + it("should allow passing an actorId when instantiating from an existing object", () => { + const actorId = "1234" + let doc = Automerge.from({ foo: 1 }, actorId) + assert.strictEqual(Automerge.getActorId(doc), "1234") + }) + + it("accepts an empty object as initial state", () => { + const doc = Automerge.from({}) + assert.deepStrictEqual(doc, {}) + }) + + it("accepts an array as initial state, but converts it to an object", () => { + // @ts-ignore + const doc = Automerge.from(["a", "b", "c"]) + assert.deepStrictEqual(doc, { "0": "a", "1": "b", "2": "c" }) + }) + + it("accepts strings as initial values, but treats them as an array of characters", () => { + // @ts-ignore + const doc = Automerge.from("abc") + assert.deepStrictEqual(doc, { "0": "a", "1": "b", "2": "c" }) + }) + + it("ignores numbers provided as initial values", () => { + // @ts-ignore + const doc = Automerge.from(123) + assert.deepStrictEqual(doc, {}) + }) + + it("ignores booleans provided as initial values", () => { + // @ts-ignore + const doc1 = Automerge.from(false) + assert.deepStrictEqual(doc1, {}) + // @ts-ignore + const doc2 = Automerge.from(true) + assert.deepStrictEqual(doc2, {}) + }) + }) + + describe("sequential use", () => { + let s1: Automerge.Doc, s2: Automerge.Doc + beforeEach(() => { + s1 = Automerge.init("aabbcc") + }) + + it("should not mutate objects", () => { + s2 = Automerge.change(s1, doc => (doc.foo = "bar")) + assert.strictEqual(s1.foo, undefined) + assert.strictEqual(s2.foo, "bar") + }) + + it("changes should be retrievable", () => { + const change1 = Automerge.getLastLocalChange(s1) + s2 = Automerge.change(s1, doc => (doc.foo = "bar")) + const change2 = Automerge.getLastLocalChange(s2) + assert.strictEqual(change1, undefined) + const change = Automerge.decodeChange(change2!) + assert.deepStrictEqual(change, { + actor: change.actor, + deps: [], + seq: 1, + startOp: 1, + hash: change.hash, + message: null, + time: change.time, + ops: [ + { obj: "_root", key: "foo", action: "makeText", pred: [] }, + { + action: "set", + elemId: "_head", + insert: true, + obj: "1@aabbcc", + pred: [], + value: "b", + }, + { + action: "set", + elemId: "2@aabbcc", + insert: true, + obj: "1@aabbcc", + pred: [], + value: "a", + }, + { + action: "set", + elemId: "3@aabbcc", + insert: true, + obj: "1@aabbcc", + pred: [], + value: "r", + }, + ], + }) + }) + + it("should not register any conflicts on repeated assignment", () => { + assert.strictEqual(Automerge.getConflicts(s1, "foo"), undefined) + s1 = Automerge.change(s1, "change", doc => (doc.foo = "one")) + assert.strictEqual(Automerge.getConflicts(s1, "foo"), undefined) + s1 = Automerge.change(s1, "change", doc => (doc.foo = "two")) + assert.strictEqual(Automerge.getConflicts(s1, "foo"), undefined) + }) + + describe("changes", () => { + it("should group several changes", () => { + s2 = Automerge.change(s1, "change message", doc => { + doc.first = "one" + assert.strictEqual(doc.first, "one") + doc.second = "two" + assert.deepStrictEqual(doc, { + first: "one", + second: "two", + }) + }) + assert.deepStrictEqual(s1, {}) + assert.deepStrictEqual(s2, { first: "one", second: "two" }) + }) + + it("should freeze objects if desired", () => { + s1 = Automerge.init({ freeze: true }) + s2 = Automerge.change(s1, doc => (doc.foo = "bar")) + try { + // @ts-ignore + s2.foo = "lemon" + } catch (e) {} + assert.strictEqual(s2.foo, "bar") + + let deleted = false + try { + // @ts-ignore + deleted = delete s2.foo + } catch (e) {} + assert.strictEqual(s2.foo, "bar") + assert.strictEqual(deleted, false) + + Automerge.change(s2, () => { + try { + // @ts-ignore + s2.foo = "lemon" + } catch (e) {} + assert.strictEqual(s2.foo, "bar") + }) + + assert.throws(() => { + Object.assign(s2, { x: 4 }) + }) + assert.strictEqual(s2.x, undefined) + }) + + it("should allow repeated reading and writing of values", () => { + s2 = Automerge.change(s1, "change message", doc => { + doc.value = "a" + assert.strictEqual(doc.value, "a") + doc.value = "b" + doc.value = "c" + assert.strictEqual(doc.value, "c") + }) + assert.deepStrictEqual(s1, {}) + assert.deepStrictEqual(s2, { value: "c" }) + }) + + it("should not record conflicts when writing the same field several times within one change", () => { + s1 = Automerge.change(s1, "change message", doc => { + doc.value = "a" + doc.value = "b" + doc.value = "c" + }) + assert.strictEqual(s1.value, "c") + assert.strictEqual(Automerge.getConflicts(s1, "value"), undefined) + }) + + it("should return the unchanged state object if nothing changed", () => { + s2 = Automerge.change(s1, () => {}) + assert.strictEqual(s2, s1) + }) + + it("should ignore field updates that write the existing value", () => { + s1 = Automerge.change(s1, doc => (doc.field = 123)) + s2 = Automerge.change(s1, doc => (doc.field = 123)) + assert.strictEqual(s2, s1) + }) + + it("should not ignore field updates that resolve a conflict", () => { + s2 = Automerge.merge(Automerge.init(), s1) + s1 = Automerge.change(s1, doc => (doc.field = 123)) + s2 = Automerge.change(s2, doc => (doc.field = 321)) + s1 = Automerge.merge(s1, s2) + assert.strictEqual( + Object.keys(Automerge.getConflicts(s1, "field")!).length, + 2 + ) + const resolved = Automerge.change(s1, doc => (doc.field = s1.field)) + assert.notStrictEqual(resolved, s1) + assert.deepStrictEqual(resolved, { field: s1.field }) + assert.strictEqual(Automerge.getConflicts(resolved, "field"), undefined) + }) + + it("should ignore list element updates that write the existing value", () => { + s1 = Automerge.change(s1, doc => (doc.list = [123])) + s2 = Automerge.change(s1, doc => (doc.list[0] = 123)) + assert.strictEqual(s2, s1) + }) + + it("should not ignore list element updates that resolve a conflict", () => { + s1 = Automerge.change(s1, doc => (doc.list = [1])) + s2 = Automerge.merge(Automerge.init(), s1) + s1 = Automerge.change(s1, doc => (doc.list[0] = 123)) + s2 = Automerge.change(s2, doc => (doc.list[0] = 321)) + s1 = Automerge.merge(s1, s2) + assert.deepStrictEqual(Automerge.getConflicts(s1.list, 0), { + [`3@${Automerge.getActorId(s1)}`]: 123, + [`3@${Automerge.getActorId(s2)}`]: 321, + }) + const resolved = Automerge.change(s1, doc => (doc.list[0] = s1.list[0])) + assert.deepStrictEqual(resolved, s1) + assert.notStrictEqual(resolved, s1) + assert.strictEqual(Automerge.getConflicts(resolved.list, 0), undefined) + }) + + it("should sanity-check arguments", () => { + s1 = Automerge.change(s1, doc => (doc.nested = {})) + assert.throws(() => { + // @ts-ignore + Automerge.change({}, doc => (doc.foo = "bar")) + }, /must be the document root/) + assert.throws(() => { + // @ts-ignore + Automerge.change(s1.nested, doc => (doc.foo = "bar")) + }, /must be the document root/) + }) + + it("should not allow nested change blocks", () => { + assert.throws(() => { + Automerge.change(s1, doc1 => { + Automerge.change(doc1, doc2 => { + // @ts-ignore + doc2.foo = "bar" + }) + }) + }, /Calls to Automerge.change cannot be nested/) + assert.throws(() => { + s1 = Automerge.change(s1, doc1 => { + s2 = Automerge.change(s1, doc2 => (doc2.two = 2)) + doc1.one = 1 + }) + }, /Attempting to change an outdated document/) + }) + + it("should not allow the same base document to be used for multiple changes", () => { + assert.throws(() => { + Automerge.change(s1, doc => (doc.one = 1)) + Automerge.change(s1, doc => (doc.two = 2)) + }, /Attempting to change an outdated document/) + }) + + it("should allow a document to be cloned", () => { + s1 = Automerge.change(s1, doc => (doc.zero = 0)) + s2 = Automerge.clone(s1) + s1 = Automerge.change(s1, doc => (doc.one = 1)) + s2 = Automerge.change(s2, doc => (doc.two = 2)) + assert.deepStrictEqual(s1, { zero: 0, one: 1 }) + assert.deepStrictEqual(s2, { zero: 0, two: 2 }) + Automerge.free(s1) + Automerge.free(s2) + }) + + it("should work with Object.assign merges", () => { + s1 = Automerge.change(s1, doc1 => { + doc1.stuff = { foo: "bar", baz: "blur" } + }) + s1 = Automerge.change(s1, doc1 => { + doc1.stuff = Object.assign({}, doc1.stuff, { baz: "updated!" }) + }) + assert.deepStrictEqual(s1, { stuff: { foo: "bar", baz: "updated!" } }) + }) + + it("should support Date objects in maps", () => { + const now = new Date() + s1 = Automerge.change(s1, doc => (doc.now = now)) + let changes = Automerge.getAllChanges(s1) + ;[s2] = Automerge.applyChanges(Automerge.init(), changes) + assert.strictEqual(s2.now instanceof Date, true) + assert.strictEqual(s2.now.getTime(), now.getTime()) + }) + + it("should support Date objects in lists", () => { + const now = new Date() + s1 = Automerge.change(s1, doc => (doc.list = [now])) + let changes = Automerge.getAllChanges(s1) + ;[s2] = Automerge.applyChanges(Automerge.init(), changes) + assert.strictEqual(s2.list[0] instanceof Date, true) + assert.strictEqual(s2.list[0].getTime(), now.getTime()) + }) + + it("should call patchCallback if supplied", () => { + const callbacks: Array<{ + patches: Array + before: Automerge.Doc + after: Automerge.Doc + }> = [] + const s2 = Automerge.change( + s1, + { + patchCallback: (patches, before, after) => + callbacks.push({ patches, before, after }), + }, + doc => { + doc.birds = ["Goldfinch"] + } + ) + assert.strictEqual(callbacks.length, 1) + assert.deepStrictEqual(callbacks[0].patches[0], { + action: "put", + path: ["birds"], + value: [], + }) + assert.deepStrictEqual(callbacks[0].patches[1], { + action: "insert", + path: ["birds", 0], + values: [""], + }) + assert.deepStrictEqual(callbacks[0].patches[2], { + action: "splice", + path: ["birds", 0, 0], + value: "Goldfinch", + }) + assert.strictEqual(callbacks[0].before, s1) + assert.strictEqual(callbacks[0].after, s2) + }) + + it("should call a patchCallback set up on document initialisation", () => { + const callbacks: Array<{ + patches: Array + before: Automerge.Doc + after: Automerge.Doc + }> = [] + s1 = Automerge.init({ + patchCallback: (patches, before, after) => + callbacks.push({ patches, before, after }), + }) + const s2 = Automerge.change(s1, doc => (doc.bird = "Goldfinch")) + assert.strictEqual(callbacks.length, 1) + assert.deepStrictEqual(callbacks[0].patches[0], { + action: "put", + path: ["bird"], + value: "", + }) + assert.deepStrictEqual(callbacks[0].patches[1], { + action: "splice", + path: ["bird", 0], + value: "Goldfinch", + }) + assert.strictEqual(callbacks[0].before, s1) + assert.strictEqual(callbacks[0].after, s2) + }) + }) + + describe("emptyChange()", () => { + it("should append an empty change to the history", () => { + s1 = Automerge.change(s1, "first change", doc => (doc.field = 123)) + s2 = Automerge.emptyChange(s1, "empty change") + assert.notStrictEqual(s2, s1) + assert.deepStrictEqual(s2, s1) + assert.deepStrictEqual( + Automerge.getHistory(s2).map(state => state.change.message), + ["first change", "empty change"] + ) + }) + + it("should reference dependencies", () => { + s1 = Automerge.change(s1, doc => (doc.field = 123)) + s2 = Automerge.merge(Automerge.init(), s1) + s2 = Automerge.change(s2, doc => (doc.other = "hello")) + s1 = Automerge.emptyChange(Automerge.merge(s1, s2)) + const history = Automerge.getHistory(s1) + const emptyChange = history[2].change + assert.deepStrictEqual( + emptyChange.deps, + [history[0].change.hash, history[1].change.hash].sort() + ) + assert.deepStrictEqual(emptyChange.ops, []) + }) + }) + + describe("root object", () => { + it("should handle single-property assignment", () => { + s1 = Automerge.change(s1, "set bar", doc => (doc.foo = "bar")) + s1 = Automerge.change(s1, "set zap", doc => (doc.zip = "zap")) + assert.strictEqual(s1.foo, "bar") + assert.strictEqual(s1.zip, "zap") + assert.deepStrictEqual(s1, { foo: "bar", zip: "zap" }) + }) + + it("should allow floating-point values", () => { + s1 = Automerge.change(s1, doc => (doc.number = 1589032171.1)) + assert.strictEqual(s1.number, 1589032171.1) + }) + + it("should handle multi-property assignment", () => { + s1 = Automerge.change(s1, "multi-assign", doc => { + Object.assign(doc, { foo: "bar", answer: 42 }) + }) + assert.strictEqual(s1.foo, "bar") + assert.strictEqual(s1.answer, 42) + assert.deepStrictEqual(s1, { foo: "bar", answer: 42 }) + }) + + it("should handle root property deletion", () => { + s1 = Automerge.change(s1, "set foo", doc => { + doc.foo = "bar" + doc.something = null + }) + s1 = Automerge.change(s1, "del foo", doc => { + delete doc.foo + }) + assert.strictEqual(s1.foo, undefined) + assert.strictEqual(s1.something, null) + assert.deepStrictEqual(s1, { something: null }) + }) + + it("should follow JS delete behavior", () => { + s1 = Automerge.change(s1, "set foo", doc => { + doc.foo = "bar" + }) + let deleted: any + s1 = Automerge.change(s1, "del foo", doc => { + deleted = delete doc.foo + }) + assert.strictEqual(deleted, true) + let deleted2: any + assert.doesNotThrow(() => { + s1 = Automerge.change(s1, "del baz", doc => { + deleted2 = delete doc.baz + }) + }) + assert.strictEqual(deleted2, true) + }) + + it("should allow the type of a property to be changed", () => { + s1 = Automerge.change(s1, "set number", doc => (doc.prop = 123)) + assert.strictEqual(s1.prop, 123) + s1 = Automerge.change(s1, "set string", doc => (doc.prop = "123")) + assert.strictEqual(s1.prop, "123") + s1 = Automerge.change(s1, "set null", doc => (doc.prop = null)) + assert.strictEqual(s1.prop, null) + s1 = Automerge.change(s1, "set bool", doc => (doc.prop = true)) + assert.strictEqual(s1.prop, true) + }) + + it("should require property names to be valid", () => { + assert.throws(() => { + Automerge.change(s1, "foo", doc => (doc[""] = "x")) + }, /must not be an empty string/) + }) + + it("should not allow assignment of unsupported datatypes", () => { + Automerge.change(s1, doc => { + assert.throws(() => { + doc.foo = undefined + }, /Unsupported type of value: undefined/) + assert.throws(() => { + doc.foo = { prop: undefined } + }, /Unsupported type of value: undefined/) + assert.throws(() => { + doc.foo = () => {} + }, /Unsupported type of value: function/) + assert.throws(() => { + doc.foo = Symbol("foo") + }, /Unsupported type of value: symbol/) + }) + }) + }) + + describe("nested maps", () => { + it("should assign an objectId to nested maps", () => { + s1 = Automerge.change(s1, doc => { + doc.nested = {} + }) + Automerge.getObjectId(s1.nested) + assert.strictEqual( + OPID_PATTERN.test(Automerge.getObjectId(s1.nested)!), + true + ) + assert.notEqual(Automerge.getObjectId(s1.nested), "_root") + }) + + it("should handle assignment of a nested property", () => { + s1 = Automerge.change(s1, "first change", doc => { + doc.nested = {} + doc.nested.foo = "bar" + }) + s1 = Automerge.change(s1, "second change", doc => { + doc.nested.one = 1 + }) + assert.deepStrictEqual(s1, { nested: { foo: "bar", one: 1 } }) + assert.deepStrictEqual(s1.nested, { foo: "bar", one: 1 }) + assert.strictEqual(s1.nested.foo, "bar") + assert.strictEqual(s1.nested.one, 1) + }) + + it("should handle assignment of an object literal", () => { + s1 = Automerge.change(s1, doc => { + doc.textStyle = { bold: false, fontSize: 12 } + }) + assert.deepStrictEqual(s1, { + textStyle: { bold: false, fontSize: 12 }, + }) + assert.deepStrictEqual(s1.textStyle, { bold: false, fontSize: 12 }) + assert.strictEqual(s1.textStyle.bold, false) + assert.strictEqual(s1.textStyle.fontSize, 12) + }) + + it("should handle assignment of multiple nested properties", () => { + s1 = Automerge.change(s1, doc => { + doc.textStyle = { bold: false, fontSize: 12 } + Object.assign(doc.textStyle, { typeface: "Optima", fontSize: 14 }) + }) + assert.strictEqual(s1.textStyle.typeface, "Optima") + assert.strictEqual(s1.textStyle.bold, false) + assert.strictEqual(s1.textStyle.fontSize, 14) + assert.deepStrictEqual(s1.textStyle, { + typeface: "Optima", + bold: false, + fontSize: 14, + }) + }) + + it("should handle arbitrary-depth nesting", () => { + s1 = Automerge.change(s1, doc => { + doc.a = { b: { c: { d: { e: { f: { g: "h" } } } } } } + }) + s1 = Automerge.change(s1, doc => { + doc.a.b.c.d.e.f.i = "j" + }) + assert.deepStrictEqual(s1, { + a: { b: { c: { d: { e: { f: { g: "h", i: "j" } } } } } }, + }) + assert.strictEqual(s1.a.b.c.d.e.f.g, "h") + assert.strictEqual(s1.a.b.c.d.e.f.i, "j") + }) + + it("should allow an old object to be replaced with a new one", () => { + s1 = Automerge.change(s1, "change 1", doc => { + doc.myPet = { species: "dog", legs: 4, breed: "dachshund" } + }) + let s2 = Automerge.change(s1, "change 2", doc => { + doc.myPet = { + species: "koi", + variety: "紅白", + colors: { red: true, white: true, black: false }, + } + }) + assert.deepStrictEqual(s1.myPet, { + species: "dog", + legs: 4, + breed: "dachshund", + }) + assert.strictEqual(s1.myPet.breed, "dachshund") + assert.deepStrictEqual(s2.myPet, { + species: "koi", + variety: "紅白", + colors: { red: true, white: true, black: false }, + }) + // @ts-ignore + assert.strictEqual(s2.myPet.breed, undefined) + assert.strictEqual(s2.myPet.variety, "紅白") + }) + + it("should allow fields to be changed between primitive and nested map", () => { + s1 = Automerge.change(s1, doc => (doc.color = "#ff7f00")) + assert.strictEqual(s1.color, "#ff7f00") + s1 = Automerge.change( + s1, + doc => (doc.color = { red: 255, green: 127, blue: 0 }) + ) + assert.deepStrictEqual(s1.color, { red: 255, green: 127, blue: 0 }) + s1 = Automerge.change(s1, doc => (doc.color = "#ff7f00")) + assert.strictEqual(s1.color, "#ff7f00") + }) + + it("should not allow several references to the same map object", () => { + s1 = Automerge.change(s1, doc => (doc.object = {})) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = doc.object + }) + }, /Cannot create a reference to an existing document object/) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = s1.object + }) + }, /Cannot create a reference to an existing document object/) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = {} + doc.y = doc.x + }) + }, /Cannot create a reference to an existing document object/) + }) + + it("should not allow object-copying idioms", () => { + s1 = Automerge.change(s1, doc => { + doc.items = [ + { id: "id1", name: "one" }, + { id: "id2", name: "two" }, + ] + }) + // People who have previously worked with immutable state in JavaScript may be tempted + // to use idioms like this, which don't work well with Automerge -- see e.g. + // https://github.com/automerge/automerge/issues/260 + assert.throws(() => { + Automerge.change(s1, doc => { + doc.items = [...doc.items, { id: "id3", name: "three" }] + }) + }, /Cannot create a reference to an existing document object/) + }) + + it("should handle deletion of properties within a map", () => { + s1 = Automerge.change(s1, "set style", doc => { + doc.textStyle = { typeface: "Optima", bold: false, fontSize: 12 } + }) + s1 = Automerge.change(s1, "non-bold", doc => delete doc.textStyle.bold) + assert.strictEqual(s1.textStyle.bold, undefined) + assert.deepStrictEqual(s1.textStyle, { + typeface: "Optima", + fontSize: 12, + }) + }) + + it("should handle deletion of references to a map", () => { + s1 = Automerge.change(s1, "make rich text doc", doc => { + Object.assign(doc, { + title: "Hello", + textStyle: { typeface: "Optima", fontSize: 12 }, + }) + }) + s1 = Automerge.change(s1, doc => delete doc.textStyle) + assert.strictEqual(s1.textStyle, undefined) + assert.deepStrictEqual(s1, { title: "Hello" }) + }) + + it("should validate field names", () => { + s1 = Automerge.change(s1, doc => (doc.nested = {})) + assert.throws(() => { + Automerge.change(s1, doc => (doc.nested[""] = "x")) + }, /must not be an empty string/) + assert.throws(() => { + Automerge.change(s1, doc => (doc.nested = { "": "x" })) + }, /must not be an empty string/) + }) + }) + + describe("lists", () => { + it("should allow elements to be inserted", () => { + s1 = Automerge.change(s1, doc => (doc.noodles = [])) + s1 = Automerge.change(s1, doc => + doc.noodles.insertAt(0, "udon", "soba") + ) + s1 = Automerge.change(s1, doc => doc.noodles.insertAt(1, "ramen")) + assert.deepStrictEqual(s1, { noodles: ["udon", "ramen", "soba"] }) + assert.deepStrictEqual(s1.noodles, ["udon", "ramen", "soba"]) + assert.strictEqual(s1.noodles[0], "udon") + assert.strictEqual(s1.noodles[1], "ramen") + assert.strictEqual(s1.noodles[2], "soba") + assert.strictEqual(s1.noodles.length, 3) + }) + + it("should handle assignment of a list literal", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "ramen", "soba"]) + ) + assert.deepStrictEqual(s1, { noodles: ["udon", "ramen", "soba"] }) + assert.deepStrictEqual(s1.noodles, ["udon", "ramen", "soba"]) + assert.strictEqual(s1.noodles[0], "udon") + assert.strictEqual(s1.noodles[1], "ramen") + assert.strictEqual(s1.noodles[2], "soba") + assert.strictEqual(s1.noodles[3], undefined) + assert.strictEqual(s1.noodles.length, 3) + }) + + it("should only allow numeric indexes", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "ramen", "soba"]) + ) + s1 = Automerge.change(s1, doc => (doc.noodles[1] = "Ramen!")) + assert.strictEqual(s1.noodles[1], "Ramen!") + s1 = Automerge.change(s1, doc => (doc.noodles["1"] = "RAMEN!!!")) + assert.strictEqual(s1.noodles[1], "RAMEN!!!") + assert.throws(() => { + Automerge.change(s1, doc => (doc.noodles.favourite = "udon")) + }, /list index must be a number/) + assert.throws(() => { + Automerge.change(s1, doc => (doc.noodles[""] = "udon")) + }, /list index must be a number/) + assert.throws(() => { + Automerge.change(s1, doc => (doc.noodles["1e6"] = "udon")) + }, /list index must be a number/) + }) + + it("should handle deletion of list elements", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "ramen", "soba"]) + ) + s1 = Automerge.change(s1, doc => delete doc.noodles[1]) + assert.deepStrictEqual(s1.noodles, ["udon", "soba"]) + s1 = Automerge.change(s1, doc => doc.noodles.deleteAt(1)) + assert.deepStrictEqual(s1.noodles, ["udon"]) + assert.strictEqual(s1.noodles[0], "udon") + assert.strictEqual(s1.noodles[1], undefined) + assert.strictEqual(s1.noodles[2], undefined) + assert.strictEqual(s1.noodles.length, 1) + }) + + it("should handle assignment of individual list indexes", () => { + s1 = Automerge.change( + s1, + doc => (doc.japaneseFood = ["udon", "ramen", "soba"]) + ) + s1 = Automerge.change(s1, doc => (doc.japaneseFood[1] = "sushi")) + assert.deepStrictEqual(s1.japaneseFood, ["udon", "sushi", "soba"]) + assert.strictEqual(s1.japaneseFood[0], "udon") + assert.strictEqual(s1.japaneseFood[1], "sushi") + assert.strictEqual(s1.japaneseFood[2], "soba") + assert.strictEqual(s1.japaneseFood[3], undefined) + assert.strictEqual(s1.japaneseFood.length, 3) + }) + + it("concurrent edits insert in reverse actorid order if counters equal", () => { + s1 = Automerge.init("aaaa") + s2 = Automerge.init("bbbb") + s1 = Automerge.change(s1, doc => (doc.list = [])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.list.splice(0, 0, "2@aaaa")) + s2 = Automerge.change(s2, doc => doc.list.splice(0, 0, "2@bbbb")) + s2 = Automerge.merge(s2, s1) + assert.deepStrictEqual(Automerge.toJS(s2).list, ["2@bbbb", "2@aaaa"]) + }) + + it("concurrent edits insert in reverse counter order if different", () => { + s1 = Automerge.init("aaaa") + s2 = Automerge.init("bbbb") + s1 = Automerge.change(s1, doc => (doc.list = [])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.list.splice(0, 0, "2@aaaa")) + s2 = Automerge.change(s2, doc => (doc.foo = "2@bbbb")) + s2 = Automerge.change(s2, doc => doc.list.splice(0, 0, "3@bbbb")) + s2 = Automerge.merge(s2, s1) + assert.deepStrictEqual(s2.list, ["3@bbbb", "2@aaaa"]) + }) + + it("should treat out-by-one assignment as insertion", () => { + s1 = Automerge.change(s1, doc => (doc.japaneseFood = ["udon"])) + s1 = Automerge.change(s1, doc => (doc.japaneseFood[1] = "sushi")) + assert.deepStrictEqual(s1.japaneseFood, ["udon", "sushi"]) + assert.strictEqual(s1.japaneseFood[0], "udon") + assert.strictEqual(s1.japaneseFood[1], "sushi") + assert.strictEqual(s1.japaneseFood[2], undefined) + assert.strictEqual(s1.japaneseFood.length, 2) + }) + + it("should not allow out-of-range assignment", () => { + s1 = Automerge.change(s1, doc => (doc.japaneseFood = ["udon"])) + assert.throws(() => { + Automerge.change(s1, doc => (doc.japaneseFood[4] = "ramen")) + }, /is out of bounds/) + }) + + it("should allow bulk assignment of multiple list indexes", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "ramen", "soba"]) + ) + s1 = Automerge.change(s1, doc => + Object.assign(doc.noodles, { 0: "うどん", 2: "そば" }) + ) + assert.deepStrictEqual(s1.noodles, ["うどん", "ramen", "そば"]) + assert.strictEqual(s1.noodles[0], "うどん") + assert.strictEqual(s1.noodles[1], "ramen") + assert.strictEqual(s1.noodles[2], "そば") + assert.strictEqual(s1.noodles.length, 3) + }) + + it("should handle nested objects", () => { + s1 = Automerge.change( + s1, + doc => + (doc.noodles = [{ type: "ramen", dishes: ["tonkotsu", "shoyu"] }]) + ) + s1 = Automerge.change(s1, doc => + doc.noodles.push({ type: "udon", dishes: ["tempura udon"] }) + ) + s1 = Automerge.change(s1, doc => doc.noodles[0].dishes.push("miso")) + assert.deepStrictEqual(s1, { + noodles: [ + { type: "ramen", dishes: ["tonkotsu", "shoyu", "miso"] }, + { type: "udon", dishes: ["tempura udon"] }, + ], + }) + assert.deepStrictEqual(s1.noodles[0], { + type: "ramen", + dishes: ["tonkotsu", "shoyu", "miso"], + }) + assert.deepStrictEqual(s1.noodles[1], { + type: "udon", + dishes: ["tempura udon"], + }) + }) + + it("should handle nested lists", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodleMatrix = [["ramen", "tonkotsu", "shoyu"]]) + ) + s1 = Automerge.change(s1, doc => + doc.noodleMatrix.push(["udon", "tempura udon"]) + ) + s1 = Automerge.change(s1, doc => doc.noodleMatrix[0].push("miso")) + assert.deepStrictEqual(s1.noodleMatrix, [ + ["ramen", "tonkotsu", "shoyu", "miso"], + ["udon", "tempura udon"], + ]) + assert.deepStrictEqual(s1.noodleMatrix[0], [ + "ramen", + "tonkotsu", + "shoyu", + "miso", + ]) + assert.deepStrictEqual(s1.noodleMatrix[1], ["udon", "tempura udon"]) + }) + + it("should handle deep nesting", () => { + s1 = Automerge.change( + s1, + doc => + (doc.nesting = { + maps: { m1: { m2: { foo: "bar", baz: {} }, m2a: {} } }, + lists: [ + [1, 2, 3], + [[3, 4, 5, [6]], 7], + ], + mapsinlists: [{ foo: "bar" }, [{ bar: "baz" }]], + listsinmaps: { foo: [1, 2, 3], bar: [[{ baz: "123" }]] }, + }) + ) + s1 = Automerge.change(s1, doc => { + doc.nesting.maps.m1a = "123" + doc.nesting.maps.m1.m2.baz.xxx = "123" + delete doc.nesting.maps.m1.m2a + doc.nesting.lists.shift() + doc.nesting.lists[0][0].pop() + doc.nesting.lists[0][0].push(100) + doc.nesting.mapsinlists[0].foo = "baz" + doc.nesting.mapsinlists[1][0].foo = "bar" + delete doc.nesting.mapsinlists[1] + doc.nesting.listsinmaps.foo.push(4) + doc.nesting.listsinmaps.bar[0][0].baz = "456" + delete doc.nesting.listsinmaps.bar + }) + assert.deepStrictEqual(s1, { + nesting: { + maps: { + m1: { m2: { foo: "bar", baz: { xxx: "123" } } }, + m1a: "123", + }, + lists: [[[3, 4, 5, 100], 7]], + mapsinlists: [{ foo: "baz" }], + listsinmaps: { foo: [1, 2, 3, 4] }, + }, + }) + }) + + it("should handle replacement of the entire list", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "soba", "ramen"]) + ) + s1 = Automerge.change( + s1, + doc => (doc.japaneseNoodles = doc.noodles.slice()) + ) + s1 = Automerge.change(s1, doc => (doc.noodles = ["wonton", "pho"])) + assert.deepStrictEqual(s1, { + noodles: ["wonton", "pho"], + japaneseNoodles: ["udon", "soba", "ramen"], + }) + assert.deepStrictEqual(s1.noodles, ["wonton", "pho"]) + assert.strictEqual(s1.noodles[0], "wonton") + assert.strictEqual(s1.noodles[1], "pho") + assert.strictEqual(s1.noodles[2], undefined) + assert.strictEqual(s1.noodles.length, 2) + }) + + it("should allow assignment to change the type of a list element", () => { + s1 = Automerge.change( + s1, + doc => (doc.noodles = ["udon", "soba", "ramen"]) + ) + assert.deepStrictEqual(s1.noodles, ["udon", "soba", "ramen"]) + s1 = Automerge.change( + s1, + doc => (doc.noodles[1] = { type: "soba", options: ["hot", "cold"] }) + ) + assert.deepStrictEqual(s1.noodles, [ + "udon", + { type: "soba", options: ["hot", "cold"] }, + "ramen", + ]) + s1 = Automerge.change( + s1, + doc => (doc.noodles[1] = ["hot soba", "cold soba"]) + ) + assert.deepStrictEqual(s1.noodles, [ + "udon", + ["hot soba", "cold soba"], + "ramen", + ]) + s1 = Automerge.change(s1, doc => (doc.noodles[1] = "soba is the best")) + assert.deepStrictEqual(s1.noodles, [ + "udon", + "soba is the best", + "ramen", + ]) + }) + + it("should allow list creation and assignment in the same change callback", () => { + s1 = Automerge.change(Automerge.init(), doc => { + doc.letters = ["a", "b", "c"] + doc.letters[1] = "d" + }) + assert.strictEqual(s1.letters[1], "d") + }) + + it("should allow adding and removing list elements in the same change callback", () => { + let s1 = Automerge.change( + Automerge.init<{ noodles: Array }>(), + // @ts-ignore + doc => (doc.noodles = []) + ) + s1 = Automerge.change(s1, doc => { + doc.noodles.push("udon") + // @ts-ignore + doc.noodles.deleteAt(0) + }) + assert.deepStrictEqual(s1, { noodles: [] }) + // do the add-remove cycle twice, test for #151 (https://github.com/automerge/automerge/issues/151) + s1 = Automerge.change(s1, doc => { + // @ts-ignore + doc.noodles.push("soba") + // @ts-ignore + doc.noodles.deleteAt(0) + }) + assert.deepStrictEqual(s1, { noodles: [] }) + }) + + it("should handle arbitrary-depth nesting", () => { + s1 = Automerge.change( + s1, + doc => (doc.maze = [[[[[[[["noodles", ["here"]]]]]]]]]) + ) + s1 = Automerge.change(s1, doc => + doc.maze[0][0][0][0][0][0][0][1].unshift("found") + ) + assert.deepStrictEqual(s1.maze, [ + [[[[[[["noodles", ["found", "here"]]]]]]]], + ]) + assert.deepStrictEqual(s1.maze[0][0][0][0][0][0][0][1][1], "here") + s2 = Automerge.load(Automerge.save(s1)) + assert.deepStrictEqual(s1, s2) + }) + + it("should not allow several references to the same list object", () => { + s1 = Automerge.change(s1, doc => (doc.list = [])) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = doc.list + }) + }, /Cannot create a reference to an existing document object/) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = s1.list + }) + }, /Cannot create a reference to an existing document object/) + assert.throws(() => { + Automerge.change(s1, doc => { + doc.x = [] + doc.y = doc.x + }) + }, /Cannot create a reference to an existing document object/) + }) + }) + + describe("counters", () => { + // counter + it("should allow deleting counters from maps", () => { + const s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = { wrens: new Automerge.Counter(1) }) + ) + const s2 = Automerge.change(s1, doc => doc.birds.wrens.increment(2)) + const s3 = Automerge.change(s2, doc => delete doc.birds.wrens) + assert.deepStrictEqual(s2, { + birds: { wrens: new Automerge.Counter(3) }, + }) + assert.deepStrictEqual(s3, { birds: {} }) + }) + + // counter + /* + it('should not allow deleting counters from lists', () => { + const s1 = Automerge.change(Automerge.init(), doc => doc.recordings = [new Automerge.Counter(1)]) + const s2 = Automerge.change(s1, doc => doc.recordings[0].increment(2)) + assert.deepStrictEqual(s2, {recordings: [new Automerge.Counter(3)]}) + assert.throws(() => { Automerge.change(s2, doc => doc.recordings.deleteAt(0)) }, /Unsupported operation/) + }) + */ + }) + }) + + describe("concurrent use", () => { + let s1: Automerge.Doc, + s2: Automerge.Doc, + s3: Automerge.Doc, + s4: Automerge.Doc + beforeEach(() => { + s1 = Automerge.init() + s2 = Automerge.init() + s3 = Automerge.init() + s4 = Automerge.init() + }) + + it("should merge concurrent updates of different properties", () => { + s1 = Automerge.change(s1, doc => (doc.foo = "bar")) + s2 = Automerge.change(s2, doc => (doc.hello = "world")) + s3 = Automerge.merge(s1, s2) + assert.strictEqual(s3.foo, "bar") + assert.strictEqual(s3.hello, "world") + assert.deepStrictEqual(s3, { foo: "bar", hello: "world" }) + assert.strictEqual(Automerge.getConflicts(s3, "foo"), undefined) + assert.strictEqual(Automerge.getConflicts(s3, "hello"), undefined) + s4 = Automerge.load(Automerge.save(s3)) + assert.deepEqual(s3, s4) + }) + + it("should add concurrent increments of the same property", () => { + s1 = Automerge.change(s1, doc => (doc.counter = new Automerge.Counter())) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.counter.increment()) + s2 = Automerge.change(s2, doc => doc.counter.increment(2)) + s3 = Automerge.merge(s1, s2) + assert.strictEqual(s1.counter.value, 1) + assert.strictEqual(s2.counter.value, 2) + assert.strictEqual(s3.counter.value, 3) + assert.strictEqual(Automerge.getConflicts(s3, "counter"), undefined) + s4 = Automerge.load(Automerge.save(s3)) + assert.deepEqual(s3, s4) + }) + + it("should add increments only to the values they precede", () => { + s1 = Automerge.change(s1, doc => (doc.counter = new Automerge.Counter(0))) + s1 = Automerge.change(s1, doc => doc.counter.increment()) + s2 = Automerge.change( + s2, + doc => (doc.counter = new Automerge.Counter(100)) + ) + s2 = Automerge.change(s2, doc => doc.counter.increment(3)) + s3 = Automerge.merge(s1, s2) + if (Automerge.getActorId(s1) > Automerge.getActorId(s2)) { + assert.deepStrictEqual(s3, { counter: new Automerge.Counter(1) }) + } else { + assert.deepStrictEqual(s3, { counter: new Automerge.Counter(103) }) + } + assert.deepStrictEqual(Automerge.getConflicts(s3, "counter"), { + [`1@${Automerge.getActorId(s1)}`]: new Automerge.Counter(1), + [`1@${Automerge.getActorId(s2)}`]: new Automerge.Counter(103), + }) + s4 = Automerge.load(Automerge.save(s3)) + assert.deepEqual(s3, s4) + }) + + it("should detect concurrent updates of the same field", () => { + s1 = Automerge.change(s1, doc => (doc.field = "one")) + s2 = Automerge.change(s2, doc => (doc.field = "two")) + s3 = Automerge.merge(s1, s2) + if (Automerge.getActorId(s1) > Automerge.getActorId(s2)) { + assert.deepStrictEqual(s3, { field: "one" }) + } else { + assert.deepStrictEqual(s3, { field: "two" }) + } + assert.deepStrictEqual(Automerge.getConflicts(s3, "field"), { + [`1@${Automerge.getActorId(s1)}`]: "one", + [`1@${Automerge.getActorId(s2)}`]: "two", + }) + }) + + it("should detect concurrent updates of the same list element", () => { + s1 = Automerge.change(s1, doc => (doc.birds = ["finch"])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => (doc.birds[0] = "greenfinch")) + s2 = Automerge.change(s2, doc => (doc.birds[0] = "goldfinch_")) + s3 = Automerge.merge(s1, s2) + if (Automerge.getActorId(s1) > Automerge.getActorId(s2)) { + assert.deepStrictEqual(s3.birds, ["greenfinch"]) + } else { + assert.deepStrictEqual(s3.birds, ["goldfinch_"]) + } + assert.deepStrictEqual(Automerge.getConflicts(s3.birds, 0), { + [`8@${Automerge.getActorId(s1)}`]: "greenfinch", + [`8@${Automerge.getActorId(s2)}`]: "goldfinch_", + }) + }) + + it("should handle assignment conflicts of different types", () => { + s1 = Automerge.change(s1, doc => (doc.field = "string")) + s2 = Automerge.change(s2, doc => (doc.field = ["list"])) + s3 = Automerge.change(s3, doc => (doc.field = { thing: "map" })) + s1 = Automerge.merge(Automerge.merge(s1, s2), s3) + assertEqualsOneOf(s1.field, "string", ["list"], { thing: "map" }) + assert.deepStrictEqual(Automerge.getConflicts(s1, "field"), { + [`1@${Automerge.getActorId(s1)}`]: "string", + [`1@${Automerge.getActorId(s2)}`]: ["list"], + [`1@${Automerge.getActorId(s3)}`]: { thing: "map" }, + }) + }) + + it("should handle changes within a conflicting map field", () => { + s1 = Automerge.change(s1, doc => (doc.field = "string")) + s2 = Automerge.change(s2, doc => (doc.field = {})) + s2 = Automerge.change(s2, doc => (doc.field.innerKey = 42)) + s3 = Automerge.merge(s1, s2) + assertEqualsOneOf(s3.field, "string", { innerKey: 42 }) + assert.deepStrictEqual(Automerge.getConflicts(s3, "field"), { + [`1@${Automerge.getActorId(s1)}`]: "string", + [`1@${Automerge.getActorId(s2)}`]: { innerKey: 42 }, + }) + }) + + it("should handle changes within a conflicting list element", () => { + s1 = Automerge.change(s1, doc => (doc.list = ["hello"])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => (doc.list[0] = { map1: true })) + s1 = Automerge.change(s1, doc => (doc.list[0].key = 1)) + s2 = Automerge.change(s2, doc => (doc.list[0] = { map2: true })) + s2 = Automerge.change(s2, doc => (doc.list[0].key = 2)) + s3 = Automerge.merge(s1, s2) + if (Automerge.getActorId(s1) > Automerge.getActorId(s2)) { + assert.deepStrictEqual(s3.list, [{ map1: true, key: 1 }]) + } else { + assert.deepStrictEqual(s3.list, [{ map2: true, key: 2 }]) + } + assert.deepStrictEqual(Automerge.getConflicts(s3.list, 0), { + [`8@${Automerge.getActorId(s1)}`]: { map1: true, key: 1 }, + [`8@${Automerge.getActorId(s2)}`]: { map2: true, key: 2 }, + }) + }) + + it("should not merge concurrently assigned nested maps", () => { + s1 = Automerge.change(s1, doc => (doc.config = { background: "blue" })) + s2 = Automerge.change(s2, doc => (doc.config = { logo_url: "logo.png" })) + s3 = Automerge.merge(s1, s2) + assertEqualsOneOf( + s3.config, + { background: "blue" }, + { logo_url: "logo.png" } + ) + assert.deepStrictEqual(Automerge.getConflicts(s3, "config"), { + [`1@${Automerge.getActorId(s1)}`]: { background: "blue" }, + [`1@${Automerge.getActorId(s2)}`]: { logo_url: "logo.png" }, + }) + }) + + it("should clear conflicts after assigning a new value", () => { + s1 = Automerge.change(s1, doc => (doc.field = "one")) + s2 = Automerge.change(s2, doc => (doc.field = "two")) + s3 = Automerge.merge(s1, s2) + s3 = Automerge.change(s3, doc => (doc.field = "three")) + assert.deepStrictEqual(s3, { field: "three" }) + assert.strictEqual(Automerge.getConflicts(s3, "field"), undefined) + s2 = Automerge.merge(s2, s3) + assert.deepStrictEqual(s2, { field: "three" }) + assert.strictEqual(Automerge.getConflicts(s2, "field"), undefined) + }) + + it("should handle concurrent insertions at different list positions", () => { + s1 = Automerge.change(s1, doc => (doc.list = ["one", "three"])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.list.splice(1, 0, "two")) + s2 = Automerge.change(s2, doc => doc.list.push("four")) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s3, { list: ["one", "two", "three", "four"] }) + assert.strictEqual(Automerge.getConflicts(s3, "list"), undefined) + }) + + it("should handle concurrent insertions at the same list position", () => { + s1 = Automerge.change(s1, doc => (doc.birds = ["parakeet"])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.birds.push("starling")) + s2 = Automerge.change(s2, doc => doc.birds.push("chaffinch")) + s3 = Automerge.merge(s1, s2) + assertEqualsOneOf( + s3.birds, + ["parakeet", "starling", "chaffinch"], + ["parakeet", "chaffinch", "starling"] + ) + s2 = Automerge.merge(s2, s3) + assert.deepStrictEqual(s2, s3) + }) + + it("should handle concurrent assignment and deletion of a map entry", () => { + // Add-wins semantics + s1 = Automerge.change(s1, doc => (doc.bestBird = "robin")) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => delete doc.bestBird) + s2 = Automerge.change(s2, doc => (doc.bestBird = "magpie")) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s1, {}) + assert.deepStrictEqual(s2, { bestBird: "magpie" }) + assert.deepStrictEqual(s3, { bestBird: "magpie" }) + assert.strictEqual(Automerge.getConflicts(s3, "bestBird"), undefined) + }) + + it("should handle concurrent assignment and deletion of a list element", () => { + // Concurrent assignment ressurects a deleted list element. Perhaps a little + // surprising, but consistent with add-wins semantics of maps (see test above) + s1 = Automerge.change( + s1, + doc => (doc.birds = ["blackbird", "thrush", "goldfinch"]) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => (doc.birds[1] = "starling")) + s2 = Automerge.change(s2, doc => doc.birds.splice(1, 1)) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s1.birds, ["blackbird", "starling", "goldfinch"]) + assert.deepStrictEqual(s2.birds, ["blackbird", "goldfinch"]) + assert.deepStrictEqual(s3.birds, ["blackbird", "starling", "goldfinch"]) + s4 = Automerge.load(Automerge.save(s3)) + assert.deepStrictEqual(s3, s4) + }) + + it("should handle insertion after a deleted list element", () => { + s1 = Automerge.change( + s1, + doc => (doc.birds = ["blackbird", "thrush", "goldfinch"]) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.birds.splice(1, 2)) + s2 = Automerge.change(s2, doc => doc.birds.splice(2, 0, "starling")) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s3, { birds: ["blackbird", "starling"] }) + assert.deepStrictEqual(Automerge.merge(s2, s3), { + birds: ["blackbird", "starling"], + }) + }) + + it("should handle concurrent deletion of the same element", () => { + s1 = Automerge.change( + s1, + doc => (doc.birds = ["albatross", "buzzard", "cormorant"]) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.birds.deleteAt(1)) // buzzard + s2 = Automerge.change(s2, doc => doc.birds.deleteAt(1)) // buzzard + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s3.birds, ["albatross", "cormorant"]) + }) + + it("should handle concurrent deletion of different elements", () => { + s1 = Automerge.change( + s1, + doc => (doc.birds = ["albatross", "buzzard", "cormorant"]) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => doc.birds.deleteAt(0)) // albatross + s2 = Automerge.change(s2, doc => doc.birds.deleteAt(1)) // buzzard + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s3.birds, ["cormorant"]) + }) + + it("should handle concurrent updates at different levels of the tree", () => { + // A delete higher up in the tree overrides an update in a subtree + s1 = Automerge.change( + s1, + doc => + (doc.animals = { + birds: { pink: "flamingo", black: "starling" }, + mammals: ["badger"], + }) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => (doc.animals.birds.brown = "sparrow")) + s2 = Automerge.change(s2, doc => delete doc.animals.birds) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s1.animals, { + birds: { + pink: "flamingo", + brown: "sparrow", + black: "starling", + }, + mammals: ["badger"], + }) + assert.deepStrictEqual(s2.animals, { mammals: ["badger"] }) + assert.deepStrictEqual(s3.animals, { mammals: ["badger"] }) + }) + + it("should handle updates of concurrently deleted objects", () => { + s1 = Automerge.change( + s1, + doc => (doc.birds = { blackbird: { feathers: "black" } }) + ) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => delete doc.birds.blackbird) + s2 = Automerge.change(s2, doc => (doc.birds.blackbird.beak = "orange")) + s3 = Automerge.merge(s1, s2) + assert.deepStrictEqual(s1, { birds: {} }) + }) + + it("should not interleave sequence insertions at the same position", () => { + s1 = Automerge.change(s1, doc => (doc.wisdom = [])) + s2 = Automerge.merge(s2, s1) + s1 = Automerge.change(s1, doc => + doc.wisdom.push("to", "be", "is", "to", "do") + ) + s2 = Automerge.change(s2, doc => + doc.wisdom.push("to", "do", "is", "to", "be") + ) + s3 = Automerge.merge(s1, s2) + assertEqualsOneOf( + s3.wisdom, + ["to", "be", "is", "to", "do", "to", "do", "is", "to", "be"], + ["to", "do", "is", "to", "be", "to", "be", "is", "to", "do"] + ) + // In case you're wondering: http://quoteinvestigator.com/2013/09/16/do-be-do/ + }) + + describe("multiple insertions at the same list position", () => { + it("should handle insertion by greater actor ID", () => { + s1 = Automerge.init("aaaa") + s2 = Automerge.init("bbbb") + s1 = Automerge.change(s1, doc => (doc.list = ["two"])) + s2 = Automerge.merge(s2, s1) + s2 = Automerge.change(s2, doc => doc.list.splice(0, 0, "one")) + assert.deepStrictEqual(s2.list, ["one", "two"]) + }) + + it("should handle insertion by lesser actor ID", () => { + s1 = Automerge.init("bbbb") + s2 = Automerge.init("aaaa") + s1 = Automerge.change(s1, doc => (doc.list = ["two"])) + s2 = Automerge.merge(s2, s1) + s2 = Automerge.change(s2, doc => doc.list.splice(0, 0, "one")) + assert.deepStrictEqual(s2.list, ["one", "two"]) + }) + + it("should handle insertion regardless of actor ID", () => { + s1 = Automerge.change(s1, doc => (doc.list = ["two"])) + s2 = Automerge.merge(s2, s1) + s2 = Automerge.change(s2, doc => doc.list.splice(0, 0, "one")) + assert.deepStrictEqual(s2.list, ["one", "two"]) + }) + + it("should make insertion order consistent with causality", () => { + s1 = Automerge.change(s1, doc => (doc.list = ["four"])) + s2 = Automerge.merge(s2, s1) + s2 = Automerge.change(s2, doc => doc.list.unshift("three")) + s1 = Automerge.merge(s1, s2) + s1 = Automerge.change(s1, doc => doc.list.unshift("two")) + s2 = Automerge.merge(s2, s1) + s2 = Automerge.change(s2, doc => doc.list.unshift("one")) + assert.deepStrictEqual(s2.list, ["one", "two", "three", "four"]) + }) + }) + }) + + describe("saving and loading", () => { + it("should save and restore an empty document", () => { + let s = Automerge.load(Automerge.save(Automerge.init())) + assert.deepStrictEqual(s, {}) + }) + + it("should generate a new random actor ID", () => { + let s1 = Automerge.init() + let s2 = Automerge.load(Automerge.save(s1)) + assert.strictEqual( + UUID_PATTERN.test(Automerge.getActorId(s1).toString()), + true + ) + assert.strictEqual( + UUID_PATTERN.test(Automerge.getActorId(s2).toString()), + true + ) + assert.notEqual(Automerge.getActorId(s1), Automerge.getActorId(s2)) + }) + + it("should allow a custom actor ID to be set", () => { + let s = Automerge.load(Automerge.save(Automerge.init()), "333333") + assert.strictEqual(Automerge.getActorId(s), "333333") + }) + + it("should reconstitute complex datatypes", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.todos = [{ title: "water plants", done: false }]) + ) + let s2 = Automerge.load(Automerge.save(s1)) + assert.deepStrictEqual(s2, { + todos: [{ title: "water plants", done: false }], + }) + }) + + it("should save and load maps with @ symbols in the keys", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc["123@4567"] = "hello") + ) + let s2 = Automerge.load(Automerge.save(s1)) + assert.deepStrictEqual(s2, { "123@4567": "hello" }) + }) + + it("should reconstitute conflicts", () => { + let s1 = Automerge.change( + Automerge.init("111111"), + doc => (doc.x = 3) + ) + let s2 = Automerge.change( + Automerge.init("222222"), + doc => (doc.x = 5) + ) + s1 = Automerge.merge(s1, s2) + let s3 = Automerge.load(Automerge.save(s1)) + assert.strictEqual(s1.x, 5) + assert.strictEqual(s3.x, 5) + assert.deepStrictEqual(Automerge.getConflicts(s1, "x"), { + "1@111111": 3, + "1@222222": 5, + }) + assert.deepStrictEqual(Automerge.getConflicts(s3, "x"), { + "1@111111": 3, + "1@222222": 5, + }) + }) + + it("should reconstitute element ID counters", () => { + const s1 = Automerge.init("01234567") + const s2 = Automerge.change(s1, doc => (doc.list = ["a"])) + const listId = Automerge.getObjectId(s2.list) + const changes12 = Automerge.getAllChanges(s2).map(Automerge.decodeChange) + assert.deepStrictEqual(changes12, [ + { + hash: changes12[0].hash, + actor: "01234567", + seq: 1, + startOp: 1, + time: changes12[0].time, + message: null, + deps: [], + ops: [ + { obj: "_root", action: "makeList", key: "list", pred: [] }, + { + obj: listId, + action: "makeText", + elemId: "_head", + insert: true, + pred: [], + }, + { + obj: "2@01234567", + action: "set", + elemId: "_head", + insert: true, + value: "a", + pred: [], + }, + ], + }, + ]) + const s3 = Automerge.change(s2, doc => doc.list.deleteAt(0)) + const s4 = Automerge.load(Automerge.save(s3), "01234567") + const s5 = Automerge.change(s4, doc => doc.list.push("b")) + const changes45 = Automerge.getAllChanges(s5).map(Automerge.decodeChange) + assert.deepStrictEqual(s5, { list: ["b"] }) + assert.deepStrictEqual(changes45[2], { + hash: changes45[2].hash, + actor: "01234567", + seq: 3, + startOp: 5, + time: changes45[2].time, + message: null, + deps: [changes45[1].hash], + ops: [ + { + obj: listId, + action: "makeText", + elemId: "_head", + insert: true, + pred: [], + }, + { + obj: "5@01234567", + action: "set", + elemId: "_head", + insert: true, + value: "b", + pred: [], + }, + ], + }) + }) + + it("should allow a reloaded list to be mutated", () => { + let doc = Automerge.change(Automerge.init(), doc => (doc.foo = [])) + doc = Automerge.load(Automerge.save(doc)) + doc = Automerge.change(doc, "add", doc => doc.foo.push(1)) + doc = Automerge.load(Automerge.save(doc)) + assert.deepStrictEqual(doc.foo, [1]) + }) + + it("should reload a document containing deflated columns", () => { + // In this test, the keyCtr column is long enough for deflate compression to kick in, but the + // keyStr column is short. Thus, the deflate bit gets set for keyCtr but not for keyStr. + // When checking whether the columns appear in ascending order, we must ignore the deflate bit. + let doc = Automerge.change(Automerge.init(), doc => { + doc.list = [] + for (let i = 0; i < 200; i++) + doc.list.insertAt(Math.floor(Math.random() * i), "a") + }) + Automerge.load(Automerge.save(doc)) + let expected: Array = [] + for (let i = 0; i < 200; i++) expected.push("a") + assert.deepStrictEqual(doc, { list: expected }) + }) + + it.skip("should call patchCallback if supplied to load", () => { + const s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Goldfinch"]) + ) + const s2 = Automerge.change(s1, doc => doc.birds.push("Chaffinch")) + const callbacks: Array = [], + actor = Automerge.getActorId(s1) + const reloaded = Automerge.load(Automerge.save(s2), { + patchCallback(patch, before, after) { + callbacks.push({ patch, before, after }) + }, + }) + assert.strictEqual(callbacks.length, 1) + assert.deepStrictEqual(callbacks[0].patch, { + maxOp: 3, + deps: [decodeChange(Automerge.getAllChanges(s2)[1]).hash], + clock: { [actor]: 2 }, + pendingChanges: 0, + diffs: { + objectId: "_root", + type: "map", + props: { + birds: { + [`1@${actor}`]: { + objectId: `1@${actor}`, + type: "list", + edits: [ + { + action: "multi-insert", + index: 0, + elemId: `2@${actor}`, + values: ["Goldfinch", "Chaffinch"], + }, + ], + }, + }, + }, + }, + }) + assert.deepStrictEqual(callbacks[0].before, {}) + assert.strictEqual(callbacks[0].after, reloaded) + assert.strictEqual(callbacks[0].local, false) + }) + }) + + describe("history API", () => { + it("should return an empty history for an empty document", () => { + assert.deepStrictEqual(Automerge.getHistory(Automerge.init()), []) + }) + + it("should make past document states accessible", () => { + let s = Automerge.init() + s = Automerge.change(s, doc => (doc.config = { background: "blue" })) + s = Automerge.change(s, doc => (doc.birds = ["mallard"])) + s = Automerge.change(s, doc => doc.birds.unshift("oystercatcher")) + assert.deepStrictEqual( + Automerge.getHistory(s).map(state => state.snapshot), + [ + { config: { background: "blue" } }, + { config: { background: "blue" }, birds: ["mallard"] }, + { + config: { background: "blue" }, + birds: ["oystercatcher", "mallard"], + }, + ] + ) + }) + + it("should make change messages accessible", () => { + let s = Automerge.init() + s = Automerge.change(s, "Empty Bookshelf", doc => (doc.books = [])) + s = Automerge.change(s, "Add Orwell", doc => + doc.books.push("Nineteen Eighty-Four") + ) + s = Automerge.change(s, "Add Huxley", doc => + doc.books.push("Brave New World") + ) + assert.deepStrictEqual(s.books, [ + "Nineteen Eighty-Four", + "Brave New World", + ]) + assert.deepStrictEqual( + Automerge.getHistory(s).map(state => state.change.message), + ["Empty Bookshelf", "Add Orwell", "Add Huxley"] + ) + }) + }) + + describe("changes API", () => { + it("should return an empty list on an empty document", () => { + let changes = Automerge.getAllChanges(Automerge.init()) + assert.deepStrictEqual(changes, []) + }) + + it("should return an empty list when nothing changed", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Chaffinch"]) + ) + assert.deepStrictEqual(Automerge.getChanges(s1, s1), []) + }) + + it("should do nothing when applying an empty list of changes", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Chaffinch"]) + ) + assert.deepStrictEqual(Automerge.applyChanges(s1, [])[0], s1) + }) + + it("should return all changes when compared to an empty document", () => { + let s1 = Automerge.change( + Automerge.init(), + "Add Chaffinch", + doc => (doc.birds = ["Chaffinch"]) + ) + let s2 = Automerge.change(s1, "Add Bullfinch", doc => + doc.birds.push("Bullfinch") + ) + let changes = Automerge.getChanges(Automerge.init(), s2) + assert.strictEqual(changes.length, 2) + }) + + it("should allow a document copy to be reconstructed from scratch", () => { + let s1 = Automerge.change( + Automerge.init(), + "Add Chaffinch", + doc => (doc.birds = ["Chaffinch"]) + ) + let s2 = Automerge.change(s1, "Add Bullfinch", doc => + doc.birds.push("Bullfinch") + ) + let changes = Automerge.getAllChanges(s2) + let [s3] = Automerge.applyChanges(Automerge.init(), changes) + assert.deepStrictEqual(s3.birds, ["Chaffinch", "Bullfinch"]) + }) + + it("should return changes since the last given version", () => { + let s1 = Automerge.change( + Automerge.init(), + "Add Chaffinch", + doc => (doc.birds = ["Chaffinch"]) + ) + let changes1 = Automerge.getAllChanges(s1) + let s2 = Automerge.change(s1, "Add Bullfinch", doc => + doc.birds.push("Bullfinch") + ) + let changes2 = Automerge.getChanges(s1, s2) + assert.strictEqual(changes1.length, 1) // Add Chaffinch + assert.strictEqual(changes2.length, 1) // Add Bullfinch + }) + + it("should incrementally apply changes since the last given version", () => { + let s1 = Automerge.change( + Automerge.init(), + "Add Chaffinch", + doc => (doc.birds = ["Chaffinch"]) + ) + let changes1 = Automerge.getAllChanges(s1) + let s2 = Automerge.change(s1, "Add Bullfinch", doc => + doc.birds.push("Bullfinch") + ) + let changes2 = Automerge.getChanges(s1, s2) + let [s3] = Automerge.applyChanges(Automerge.init(), changes1) + let [s4] = Automerge.applyChanges(s3, changes2) + assert.deepStrictEqual(s3.birds, ["Chaffinch"]) + assert.deepStrictEqual(s4.birds, ["Chaffinch", "Bullfinch"]) + }) + + it("should handle updates to a list element", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Chaffinch", "Bullfinch"]) + ) + let s2 = Automerge.change(s1, doc => (doc.birds[0] = "Goldfinch")) + let [s3] = Automerge.applyChanges( + Automerge.init(), + Automerge.getAllChanges(s2) + ) + assert.deepStrictEqual(s3.birds, ["Goldfinch", "Bullfinch"]) + assert.strictEqual(Automerge.getConflicts(s3.birds, 0), undefined) + }) + + // TEXT + it("should handle updates to a text object", () => { + let s1 = Automerge.change(Automerge.init(), doc => (doc.text = "ab")) + let s2 = Automerge.change(s1, doc => + Automerge.splice(doc, "text", 0, 1, "A") + ) + let [s3] = Automerge.applyChanges( + Automerge.init(), + Automerge.getAllChanges(s2) + ) + assert.deepStrictEqual([...s3.text], ["A", "b"]) + }) + + /* + it.skip('should report missing dependencies', () => { + let s1 = Automerge.change(Automerge.init(), doc => doc.birds = ['Chaffinch']) + let s2 = Automerge.merge(Automerge.init(), s1) + s2 = Automerge.change(s2, doc => doc.birds.push('Bullfinch')) + let changes = Automerge.getAllChanges(s2) + let [s3, patch] = Automerge.applyChanges(Automerge.init(), [changes[1]]) + assert.deepStrictEqual(s3, {}) + assert.deepStrictEqual(Automerge.Backend.getMissingDeps(Automerge.Frontend.getBackendState(s3)), + decodeChange(changes[1]).deps) + assert.strictEqual(patch.pendingChanges, 1) + ;[s3, patch] = Automerge.applyChanges(s3, [changes[0]]) + assert.deepStrictEqual(s3.birds, ['Chaffinch', 'Bullfinch']) + assert.deepStrictEqual(Automerge.Backend.getMissingDeps(Automerge.Frontend.getBackendState(s3)), []) + assert.strictEqual(patch.pendingChanges, 0) + }) + */ + + it("should report missing dependencies with out-of-order applyChanges", () => { + let s0 = Automerge.init() + let s1 = Automerge.change(s0, doc => (doc.test = ["a"])) + let changes01 = Automerge.getAllChanges(s1) + let s2 = Automerge.change(s1, doc => (doc.test = ["b"])) + let changes12 = Automerge.getChanges(s1, s2) + let s3 = Automerge.change(s2, doc => (doc.test = ["c"])) + let changes23 = Automerge.getChanges(s2, s3) + let s4 = Automerge.init() + let [s5] = Automerge.applyChanges(s4, changes23) + let [s6] = Automerge.applyChanges(s5, changes12) + assert.deepStrictEqual(Automerge.getMissingDeps(s6, []), [ + decodeChange(changes01[0]).hash, + ]) + }) + + it("should call patchCallback if supplied when applying changes", () => { + const s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Goldfinch"]) + ) + const callbacks: Array = [] + const before = Automerge.init() + const [after] = Automerge.applyChanges( + before, + Automerge.getAllChanges(s1), + { + patchCallback(patch, before, after) { + callbacks.push({ patch, before, after }) + }, + } + ) + assert.strictEqual(callbacks.length, 1) + assert.deepStrictEqual(callbacks[0].patch[0], { + action: "put", + path: ["birds"], + value: [], + }) + assert.deepStrictEqual(callbacks[0].patch[1], { + action: "insert", + path: ["birds", 0], + values: [""], + }) + assert.deepStrictEqual(callbacks[0].patch[2], { + action: "splice", + path: ["birds", 0, 0], + value: "Goldfinch", + }) + assert.strictEqual(callbacks[0].before, before) + assert.strictEqual(callbacks[0].after, after) + }) + + it("should merge multiple applied changes into one patch", () => { + const s1 = Automerge.change( + Automerge.init(), + doc => (doc.birds = ["Goldfinch"]) + ) + const s2 = Automerge.change(s1, doc => doc.birds.push("Chaffinch")) + const patches: Array = [] + Automerge.applyChanges(Automerge.init(), Automerge.getAllChanges(s2), { + patchCallback: p => patches.push(...p), + }) + assert.deepStrictEqual(patches, [ + { action: "put", path: ["birds"], value: [] }, + { action: "insert", path: ["birds", 0], values: ["", ""] }, + { action: "splice", path: ["birds", 0, 0], value: "Goldfinch" }, + { action: "splice", path: ["birds", 1, 0], value: "Chaffinch" }, + ]) + }) + + it("should call a patchCallback registered on doc initialisation", () => { + const s1 = Automerge.change( + Automerge.init(), + doc => (doc.bird = "Goldfinch") + ) + const patches: Array = [] + const before = Automerge.init({ + patchCallback: p => patches.push(...p), + }) + Automerge.applyChanges(before, Automerge.getAllChanges(s1)) + assert.deepStrictEqual(patches, [ + { action: "put", path: ["bird"], value: "" }, + { action: "splice", path: ["bird", 0], value: "Goldfinch" }, + ]) + }) + }) +}) diff --git a/javascript/test/stable_unstable_interop.ts b/javascript/test/stable_unstable_interop.ts new file mode 100644 index 00000000..dc57f338 --- /dev/null +++ b/javascript/test/stable_unstable_interop.ts @@ -0,0 +1,99 @@ +import * as assert from "assert" +import * as stable from "../src" +import { unstable } from "../src" + +describe("stable/unstable interop", () => { + it("should allow reading Text from stable as strings in unstable", () => { + let stableDoc = stable.from({ + text: new stable.Text("abc"), + }) + let unstableDoc = unstable.init() + unstableDoc = unstable.merge(unstableDoc, stableDoc) + assert.deepStrictEqual(unstableDoc.text, "abc") + }) + + it("should allow string from stable as Text in unstable", () => { + let unstableDoc = unstable.from({ + text: "abc", + }) + let stableDoc = stable.init() + stableDoc = unstable.merge(stableDoc, unstableDoc) + assert.deepStrictEqual(stableDoc.text, new stable.Text("abc")) + }) + + it("should allow reading strings from stable as RawString in unstable", () => { + let stableDoc = stable.from({ + text: "abc", + }) + let unstableDoc = unstable.init() + unstableDoc = unstable.merge(unstableDoc, stableDoc) + assert.deepStrictEqual(unstableDoc.text, new unstable.RawString("abc")) + }) + + it("should allow reading RawString from unstable as string in stable", () => { + let unstableDoc = unstable.from({ + text: new unstable.RawString("abc"), + }) + let stableDoc = stable.init() + stableDoc = unstable.merge(stableDoc, unstableDoc) + assert.deepStrictEqual(stableDoc.text, "abc") + }) + + it("should show conflicts on text objects", () => { + let doc1 = stable.from({ text: new stable.Text("abc") }, "bb") + let doc2 = stable.from({ text: new stable.Text("def") }, "aa") + doc1 = stable.merge(doc1, doc2) + let conflicts = stable.getConflicts(doc1, "text")! + assert.equal(conflicts["1@bb"]!.toString(), "abc") + assert.equal(conflicts["1@aa"]!.toString(), "def") + + let unstableDoc = unstable.init() + unstableDoc = unstable.merge(unstableDoc, doc1) + let conflicts2 = unstable.getConflicts(unstableDoc, "text")! + assert.equal(conflicts2["1@bb"]!.toString(), "abc") + assert.equal(conflicts2["1@aa"]!.toString(), "def") + }) + + it("should allow filling a list with text in stable", () => { + let doc = stable.from<{ list: Array }>({ + list: [null, null, null], + }) + doc = stable.change(doc, doc => { + doc.list.fill(new stable.Text("abc"), 0, 3) + }) + assert.deepStrictEqual(doc.list, [ + new stable.Text("abc"), + new stable.Text("abc"), + new stable.Text("abc"), + ]) + }) + + it("should allow filling a list with text in unstable", () => { + let doc = unstable.from<{ list: Array }>({ + list: [null, null, null], + }) + doc = stable.change(doc, doc => { + doc.list.fill("abc", 0, 3) + }) + assert.deepStrictEqual(doc.list, ["abc", "abc", "abc"]) + }) + + it("should allow splicing text into a list on stable", () => { + let doc = stable.from<{ list: Array }>({ list: [] }) + doc = stable.change(doc, doc => { + doc.list.splice(0, 0, new stable.Text("abc"), new stable.Text("def")) + }) + assert.deepStrictEqual(doc.list, [ + new stable.Text("abc"), + new stable.Text("def"), + ]) + }) + + it("should allow splicing text into a list on unstable", () => { + let doc = unstable.from<{ list: Array }>({ list: [] }) + doc = unstable.change(doc, doc => { + doc.list.splice(0, 0, "abc", "def") + }) + assert.deepStrictEqual(doc.list, ["abc", "def"]) + }) +}) diff --git a/javascript/test/sync_test.ts b/javascript/test/sync_test.ts new file mode 100644 index 00000000..5724985c --- /dev/null +++ b/javascript/test/sync_test.ts @@ -0,0 +1,1064 @@ +import * as assert from "assert" +import * as Automerge from "../src" +import { BloomFilter } from "./legacy/sync" +import { + decodeSyncMessage, + encodeSyncMessage, + decodeSyncState, + encodeSyncState, + initSyncState, +} from "../src" + +function getHeads(doc) { + return Automerge.getHeads(doc) +} + +function getMissingDeps(doc) { + return Automerge.getMissingDeps(doc, []) +} + +function sync( + a, + b, + aSyncState = initSyncState(), + bSyncState = initSyncState() +) { + const MAX_ITER = 10 + let aToBmsg: Automerge.SyncMessage | null = null, + bToAmsg: Automerge.SyncMessage | null = null, + i = 0 + do { + ;[aSyncState, aToBmsg] = Automerge.generateSyncMessage(a, aSyncState) + ;[bSyncState, bToAmsg] = Automerge.generateSyncMessage(b, bSyncState) + + if (aToBmsg) { + ;[b, bSyncState] = Automerge.receiveSyncMessage(b, bSyncState, aToBmsg) + } + if (bToAmsg) { + ;[a, aSyncState] = Automerge.receiveSyncMessage(a, aSyncState, bToAmsg) + } + + if (i++ > MAX_ITER) { + throw new Error( + `Did not synchronize within ${MAX_ITER} iterations. Do you have a bug causing an infinite loop?` + ) + } + } while (aToBmsg || bToAmsg) + + return [a, b, aSyncState, bSyncState] +} + +describe("Data sync protocol", () => { + describe("with docs already in sync", () => { + describe("an empty local doc", () => { + it("should send a sync message implying no local data", () => { + let n1 = Automerge.init() + let s1 = initSyncState() + let m1 + ;[s1, m1] = Automerge.generateSyncMessage(n1, s1) + const message = decodeSyncMessage(m1) + assert.deepStrictEqual(message.heads, []) + assert.deepStrictEqual(message.need, []) + assert.deepStrictEqual(message.have.length, 1) + assert.deepStrictEqual(message.have[0].lastSync, []) + assert.deepStrictEqual(message.have[0].bloom.byteLength, 0) + assert.deepStrictEqual(message.changes, []) + }) + + it("should not reply if we have no data as well", () => { + let n1 = Automerge.init(), + n2 = Automerge.init() + let s1 = initSyncState(), + s2 = initSyncState() + let m1: Automerge.SyncMessage | null = null, + m2: Automerge.SyncMessage | null = null + ;[s1, m1] = Automerge.generateSyncMessage(n1, s1) + if (m1 != null) { + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, m1) + } + ;[s2, m2] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(m2, null) + }) + }) + + describe("documents with data", () => { + it("repos with equal heads do not need a reply message", () => { + let n1 = Automerge.init(), + n2 = Automerge.init() + let s1 = initSyncState(), + s2 = initSyncState() + let m1: Automerge.SyncMessage | null = null, + m2: Automerge.SyncMessage | null = null + + // make two nodes with the same changes + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.n = [])) + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => doc.n.push(i)) + ;[n2] = Automerge.applyChanges(n2, Automerge.getAllChanges(n1)) + assert.deepStrictEqual(n1, n2) + + // generate a naive sync message + ;[s1, m1] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(s1.lastSentHeads, getHeads(n1)) + + // heads are equal so this message should be null + if (m1 != null) { + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, m1) + } + ;[s2, m2] = Automerge.generateSyncMessage(n2, s2) + assert.strictEqual(m2, null) + }) + + it("n1 should offer all changes to n2 when starting from nothing", () => { + let n1 = Automerge.init(), + n2 = Automerge.init() + + // make changes for n1 that n2 should request + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.n = [])) + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => doc.n.push(i)) + + assert.notDeepStrictEqual(n1, n2) + const [after1, after2] = sync(n1, n2) + assert.deepStrictEqual(after1, after2) + }) + + it("should sync peers where one has commits the other does not", () => { + let n1 = Automerge.init(), + n2 = Automerge.init() + + // make changes for n1 that n2 should request + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.n = [])) + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => doc.n.push(i)) + + assert.notDeepStrictEqual(n1, n2) + ;[n1, n2] = sync(n1, n2) + assert.deepStrictEqual(n1, n2) + }) + + it("should work with prior sync state", () => { + // create & synchronize two nodes + let n1 = Automerge.init(), + n2 = Automerge.init() + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + + // modify the first node further + for (let i = 5; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + + assert.notDeepStrictEqual(n1, n2) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1, n2) + }) + + it("should not generate messages once synced", () => { + // create & synchronize two nodes + let n1 = Automerge.init("abc123"), + n2 = Automerge.init("def456") + let s1 = initSyncState(), + s2 = initSyncState() + + let message + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + for (let i = 0; i < 5; i++) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.y = i)) + + // n1 reports what it has + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + + // n2 receives that message and sends changes along with what it has + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, message) + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 5) + //assert.deepStrictEqual(patch, null) // no changes arrived + + // n1 receives the changes and replies with the changes it now knows n2 needs + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, message) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 5) + //assert.deepStrictEqual(patch.diffs.props, {y: {'5@def456': {type: 'value', value: 4, datatype: 'int'}}}) // changes arrived + + // n2 applies the changes and sends confirmation ending the exchange + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, message) + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + //assert.deepStrictEqual(patch.diffs.props, {x: {'5@abc123': {type: 'value', value: 4, datatype: 'int'}}}) // changes arrived + + // n1 receives the message and has nothing more to say + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, message) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(message, null) + //assert.deepStrictEqual(patch, null) // no changes arrived + + // n2 also has nothing left to say + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(message, null) + }) + + it("should allow simultaneous messages during synchronization", () => { + // create & synchronize two nodes + let n1 = Automerge.init("abc123"), + n2 = Automerge.init("def456") + let s1 = initSyncState(), + s2 = initSyncState() + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + for (let i = 0; i < 5; i++) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.y = i)) + const head1 = getHeads(n1)[0], + head2 = getHeads(n2)[0] + + // both sides report what they have but have no shared peer state + let msg1to2, msg2to1 + ;[s1, msg1to2] = Automerge.generateSyncMessage(n1, s1) + ;[s2, msg2to1] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) + assert.deepStrictEqual( + decodeSyncMessage(msg1to2).have[0].lastSync.length, + 0 + ) + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) + assert.deepStrictEqual( + decodeSyncMessage(msg2to1).have[0].lastSync.length, + 0 + ) + + // n1 and n2 receives that message and update sync state but make no patch + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, msg2to1) + //assert.deepStrictEqual(patch1, null) // no changes arrived, so no patch + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, msg1to2) + //assert.deepStrictEqual(patch2, null) // no changes arrived, so no patch + + // now both reply with their local changes the other lacks + // (standard warning that 1% of the time this will result in a "need" message) + ;[s1, msg1to2] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 5) + ;[s2, msg2to1] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 5) + + // both should now apply the changes and update the frontend + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, msg2to1) + assert.deepStrictEqual(getMissingDeps(n1), []) + //assert.notDeepStrictEqual(patch1, null) + assert.deepStrictEqual(n1, { x: 4, y: 4 }) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, msg1to2) + assert.deepStrictEqual(getMissingDeps(n2), []) + //assert.notDeepStrictEqual(patch2, null) + assert.deepStrictEqual(n2, { x: 4, y: 4 }) + + // The response acknowledges the changes received, and sends no further changes + ;[s1, msg1to2] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) + ;[s2, msg2to1] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) + + // After receiving acknowledgements, their shared heads should be equal + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, msg2to1) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, msg1to2) + assert.deepStrictEqual(s1.sharedHeads, [head1, head2].sort()) + assert.deepStrictEqual(s2.sharedHeads, [head1, head2].sort()) + //assert.deepStrictEqual(patch1, null) + //assert.deepStrictEqual(patch2, null) + + // We're in sync, no more messages required + ;[s1, msg1to2] = Automerge.generateSyncMessage(n1, s1) + ;[s2, msg2to1] = Automerge.generateSyncMessage(n2, s2) + assert.deepStrictEqual(msg1to2, null) + assert.deepStrictEqual(msg2to1, null) + + // If we make one more change, and start another sync, its lastSync should be updated + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 5)) + ;[s1, msg1to2] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual( + decodeSyncMessage(msg1to2).have[0].lastSync, + [head1, head2].sort() + ) + }) + + it("should assume sent changes were recieved until we hear otherwise", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + message: Automerge.SyncMessage | null = null + + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.items = [])) + ;[n1, n2, s1] = sync(n1, n2) + + n1 = Automerge.change(n1, { time: 0 }, doc => doc.items.push("x")) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + if (message != null) { + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + } + + n1 = Automerge.change(n1, { time: 0 }, doc => doc.items.push("y")) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + if (message != null) { + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + } + + n1 = Automerge.change(n1, { time: 0 }, doc => doc.items.push("z")) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + if (message != null) { + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + } + }) + + it("should work regardless of who initiates the exchange", () => { + // create & synchronize two nodes + let n1 = Automerge.init(), + n2 = Automerge.init() + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + // modify the first node further + for (let i = 5; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + + assert.notDeepStrictEqual(n1, n2) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1, n2) + }) + }) + }) + + describe("with diverged documents", () => { + it("should work without prior sync state", () => { + // Scenario: ,-- c10 <-- c11 <-- c12 <-- c13 <-- c14 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- c15 <-- c16 <-- c17 + // lastSync is undefined. + + // create two peers both with divergent commits + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2] = sync(n1, n2) + + for (let i = 10; i < 15; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + for (let i = 15; i < 18; i++) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = i)) + + assert.notDeepStrictEqual(n1, n2) + ;[n1, n2] = sync(n1, n2) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + }) + + it("should work with prior sync state", () => { + // Scenario: ,-- c10 <-- c11 <-- c12 <-- c13 <-- c14 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- c15 <-- c16 <-- c17 + // lastSync is c9. + + // create two peers both with divergent commits + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + for (let i = 10; i < 15; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + for (let i = 15; i < 18; i++) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = i)) + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + assert.notDeepStrictEqual(n1, n2) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + }) + + it("should ensure non-empty state after sync", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + assert.deepStrictEqual(s1.sharedHeads, getHeads(n1)) + assert.deepStrictEqual(s2.sharedHeads, getHeads(n1)) + }) + + it("should re-sync after one node crashed with data loss", () => { + // Scenario: (r) (n2) (n1) + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 + // n2 has changes {c0, c1, c2}, n1's lastSync is c5, and n2's lastSync is c2. + // we want to successfully sync (n1) with (r), even though (n1) believes it's talking to (n2) + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + // n1 makes three changes, which we sync to n2 + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + // save a copy of n2 as "r" to simulate recovering from crash + let r, rSyncState + ;[r, rSyncState] = [Automerge.clone(n2), s2] + + // sync another few commits + for (let i = 3; i < 6; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + // everyone should be on the same page here + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + + // now make a few more changes, then attempt to sync the fully-up-to-date n1 with the confused r + for (let i = 6; i < 9; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + s1 = decodeSyncState(encodeSyncState(s1)) + rSyncState = decodeSyncState(encodeSyncState(rSyncState)) + + assert.notDeepStrictEqual(getHeads(n1), getHeads(r)) + assert.notDeepStrictEqual(n1, r) + assert.deepStrictEqual(n1, { x: 8 }) + assert.deepStrictEqual(r, { x: 2 }) + ;[n1, r, s1, rSyncState] = sync(n1, r, s1, rSyncState) + assert.deepStrictEqual(getHeads(n1), getHeads(r)) + assert.deepStrictEqual(n1, r) + }) + + it("should resync after one node experiences data loss without disconnecting", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + // n1 makes three changes, which we sync to n2 + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + + let n2AfterDataLoss = Automerge.init("89abcdef") + + // "n2" now has no data, but n1 still thinks it does. Note we don't do + // decodeSyncState(encodeSyncState(s1)) in order to simulate data loss without disconnecting + ;[n1, n2, s1, s2] = sync(n1, n2AfterDataLoss, s1, initSyncState()) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + }) + + it("should handle changes concurrent to the last sync heads", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef"), + n3 = Automerge.init("fedcba98") + let s12 = initSyncState(), + s21 = initSyncState(), + s23 = initSyncState(), + s32 = initSyncState() + + // Change 1 is known to all three nodes + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 1)) + ;[n1, n2, s12, s21] = sync(n1, n2, s12, s21) + ;[n2, n3, s23, s32] = sync(n2, n3, s23, s32) + + // Change 2 is known to n1 and n2 + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 2)) + ;[n1, n2, s12, s21] = sync(n1, n2, s12, s21) + + // Each of the three nodes makes one change (changes 3, 4, 5) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 3)) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = 4)) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = 5)) + + // Apply n3's latest change to n2. If running in Node, turn the Uint8Array into a Buffer, to + // simulate transmission over a network (see https://github.com/automerge/automerge/pull/362) + let change = Automerge.getLastLocalChange(n3) + if (typeof Buffer === "function" && change != null) + change = Buffer.from(change) + ;[n2] = (change && Automerge.applyChanges(n2, [change])) || [n2] + + // Now sync n1 and n2. n3's change is concurrent to n1 and n2's last sync heads + ;[n1, n2, s12, s21] = sync(n1, n2, s12, s21) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + }) + + it("should handle histories with lots of branching and merging", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef"), + n3 = Automerge.init("fedcba98") + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 0)) + ;[n2] = Automerge.applyChanges(n2, [Automerge.getLastLocalChange(n1)!]) + ;[n3] = Automerge.applyChanges(n3, [Automerge.getLastLocalChange(n1)!]) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = 1)) + + // - n1c1 <------ n1c2 <------ n1c3 <-- etc. <-- n1c20 <------ n1c21 + // / \/ \/ \/ + // / /\ /\ /\ + // c0 <---- n2c1 <------ n2c2 <------ n2c3 <-- etc. <-- n2c20 <------ n2c21 + // \ / + // ---------------------------------------------- n3c1 <----- + for (let i = 1; i < 20; i++) { + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.n1 = i)) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.n2 = i)) + const change1 = Automerge.getLastLocalChange(n1) + const change2 = Automerge.getLastLocalChange(n2) + ;[n1] = Automerge.applyChanges(n1, [change2!]) + ;[n2] = Automerge.applyChanges(n2, [change1!]) + } + + let s1 = initSyncState(), + s2 = initSyncState() + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + + // Having n3's last change concurrent to the last sync heads forces us into the slower code path + ;[n2] = Automerge.applyChanges(n2, [Automerge.getLastLocalChange(n3)!]) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.n1 = "final")) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.n2 = "final")) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + assert.deepStrictEqual(n1, n2) + }) + }) + + describe("with false positives", () => { + // NOTE: the following tests use brute force to search for Bloom filter false positives. The + // tests make change hashes deterministic by fixing the actorId and change timestamp to be + // constants. The loop that searches for false positives is then initialised such that it finds + // a false positive on its first iteration. However, if anything changes about the encoding of + // changes (causing their hashes to change) or if the Bloom filter configuration is changed, + // then the false positive will no longer be the first loop iteration. The tests should still + // pass because the loop will run until a false positive is found, but they will be slower. + + it("should handle a false-positive head", () => { + // Scenario: ,-- n1 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2 + // where n2 is a false positive in the Bloom filter containing {n1}. + // lastSync is c9. + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + for (let i = 1; ; i++) { + // search for false positive; see comment above + const n1up = Automerge.change( + Automerge.clone(n1, { actor: "01234567" }), + { time: 0 }, + doc => (doc.x = `${i} @ n1`) + ) + const n2up = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + doc => (doc.x = `${i} @ n2`) + ) + if (new BloomFilter(getHeads(n1up)).containsHash(getHeads(n2up)[0])) { + n1 = n1up + n2 = n2up + break + } + } + const allHeads = [...getHeads(n1), ...getHeads(n2)].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), allHeads) + assert.deepStrictEqual(getHeads(n2), allHeads) + }) + + describe("with a false-positive dependency", () => { + let n1, n2, s1, s2, n1hash2, n2hash2 + + beforeEach(() => { + // Scenario: ,-- n1c1 <-- n1c2 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2c1 <-- n2c2 + // where n2c1 is a false positive in the Bloom filter containing {n1c1, n1c2}. + // lastSync is c9. + n1 = Automerge.init("01234567") + n2 = Automerge.init("89abcdef") + s1 = initSyncState() + s2 = initSyncState() + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, (doc: any) => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + + let n1hash1, n2hash1 + for (let i = 29; ; i++) { + // search for false positive; see comment above + const n1us1 = Automerge.change( + Automerge.clone(n1, { actor: "01234567" }), + { time: 0 }, + (doc: any) => (doc.x = `${i} @ n1`) + ) + const n2us1 = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + (doc: any) => (doc.x = `${i} @ n2`) + ) + n1hash1 = getHeads(n1us1)[0] + n2hash1 = getHeads(n2us1)[0] + const n1us2 = Automerge.change( + n1us1, + { time: 0 }, + (doc: any) => (doc.x = "final @ n1") + ) + const n2us2 = Automerge.change( + n2us1, + { time: 0 }, + (doc: any) => (doc.x = "final @ n2") + ) + n1hash2 = getHeads(n1us2)[0] + n2hash2 = getHeads(n2us2)[0] + if (new BloomFilter([n1hash1, n1hash2]).containsHash(n2hash1)) { + n1 = n1us2 + n2 = n2us2 + break + } + } + }) + + it("should sync two nodes without connection reset", () => { + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), [n1hash2, n2hash2].sort()) + assert.deepStrictEqual(getHeads(n2), [n1hash2, n2hash2].sort()) + }) + + // FIXME - this has a periodic failure + it("should sync two nodes with connection reset", () => { + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), [n1hash2, n2hash2].sort()) + assert.deepStrictEqual(getHeads(n2), [n1hash2, n2hash2].sort()) + }) + + it.skip("should sync three nodes", () => { + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + // First n1 and n2 exchange Bloom filters + let m1, m2 + ;[s1, m1] = Automerge.generateSyncMessage(n1, s1) + ;[s2, m2] = Automerge.generateSyncMessage(n2, s2) + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, m2) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, m1) + + // Then n1 and n2 send each other their changes, except for the false positive + ;[s1, m1] = Automerge.generateSyncMessage(n1, s1) + ;[s2, m2] = Automerge.generateSyncMessage(n2, s2) + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, m2) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, m1) + assert.strictEqual(decodeSyncMessage(m1).changes.length, 2) // n1c1 and n1c2 + assert.strictEqual(decodeSyncMessage(m2).changes.length, 1) // only n2c2; change n2c1 is not sent + + // n3 is a node that doesn't have the missing change. Nevertheless n1 is going to ask n3 for it + let n3 = Automerge.init("fedcba98"), + s13 = initSyncState(), + s31 = initSyncState() + ;[n1, n3, s13, s31] = sync(n1, n3, s13, s31) + assert.deepStrictEqual(getHeads(n1), [n1hash2]) + assert.deepStrictEqual(getHeads(n3), [n1hash2]) + }) + }) + + it("should not require an additional request when a false-positive depends on a true-negative", () => { + // Scenario: ,-- n1c1 <-- n1c2 <-- n1c3 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-+ + // `-- n2c1 <-- n2c2 <-- n2c3 + // where n2c2 is a false positive in the Bloom filter containing {n1c1, n1c2, n1c3}. + // lastSync is c4. + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + let n1hash3, n2hash3 + + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + for (let i = 86; ; i++) { + // search for false positive; see comment above + const n1us1 = Automerge.change( + Automerge.clone(n1, { actor: "01234567" }), + { time: 0 }, + doc => (doc.x = `${i} @ n1`) + ) + const n2us1 = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + doc => (doc.x = `${i} @ n2`) + ) + const n1hash1 = getHeads(n1us1)[0] + const n1us2 = Automerge.change( + n1us1, + { time: 0 }, + doc => (doc.x = `${i + 1} @ n1`) + ) + const n2us2 = Automerge.change( + n2us1, + { time: 0 }, + doc => (doc.x = `${i + 1} @ n2`) + ) + const n1hash2 = getHeads(n1us2)[0], + n2hash2 = getHeads(n2us2)[0] + const n1up3 = Automerge.change( + n1us2, + { time: 0 }, + doc => (doc.x = "final @ n1") + ) + const n2up3 = Automerge.change( + n2us2, + { time: 0 }, + doc => (doc.x = "final @ n2") + ) + n1hash3 = getHeads(n1up3)[0] + n2hash3 = getHeads(n2up3)[0] + if ( + new BloomFilter([n1hash1, n1hash2, n1hash3]).containsHash(n2hash2) + ) { + n1 = n1up3 + n2 = n2up3 + break + } + } + const bothHeads = [n1hash3, n2hash3].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), bothHeads) + assert.deepStrictEqual(getHeads(n2), bothHeads) + }) + + it("should handle chains of false-positives", () => { + // Scenario: ,-- c5 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-+ + // `-- n2c1 <-- n2c2 <-- n2c3 + // where n2c1 and n2c2 are both false positives in the Bloom filter containing {c5}. + // lastSync is c4. + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + + for (let i = 0; i < 5; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 5)) + for (let i = 2; ; i++) { + // search for false positive; see comment above + const n2us1 = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + doc => (doc.x = `${i} @ n2`) + ) + if (new BloomFilter(getHeads(n1)).containsHash(getHeads(n2us1)[0])) { + n2 = n2us1 + break + } + } + for (let i = 141; ; i++) { + // search for false positive; see comment above + const n2us2 = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + doc => (doc.x = `${i} again`) + ) + if (new BloomFilter(getHeads(n1)).containsHash(getHeads(n2us2)[0])) { + n2 = n2us2 + break + } + } + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = "final @ n2")) + + const allHeads = [...getHeads(n1), ...getHeads(n2)].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + ;[n1, n2, s1, s2] = sync(n1, n2, s1, s2) + assert.deepStrictEqual(getHeads(n1), allHeads) + assert.deepStrictEqual(getHeads(n2), allHeads) + }) + + it("should allow the false-positive hash to be explicitly requested", () => { + // Scenario: ,-- n1 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2 + // where n2 causes a false positive in the Bloom filter containing {n1}. + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + let message + + for (let i = 0; i < 10; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + for (let i = 1; ; i++) { + // brute-force search for false positive; see comment above + const n1up = Automerge.change( + Automerge.clone(n1, { actor: "01234567" }), + { time: 0 }, + doc => (doc.x = `${i} @ n1`) + ) + const n2up = Automerge.change( + Automerge.clone(n2, { actor: "89abcdef" }), + { time: 0 }, + doc => (doc.x = `${i} @ n2`) + ) + // check if the bloom filter on n2 will believe n1 already has a particular hash + // this will mean n2 won't offer that data to n2 by receiving a sync message from n1 + if (new BloomFilter(getHeads(n1up)).containsHash(getHeads(n2up)[0])) { + n1 = n1up + n2 = n2up + break + } + } + + // n1 creates a sync message for n2 with an ill-fated bloom + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + assert.strictEqual(decodeSyncMessage(message).changes.length, 0) + + // n2 receives it and DOESN'T send a change back + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, message) + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + assert.strictEqual(decodeSyncMessage(message).changes.length, 0) + + // n1 should now realize it's missing that change and request it explicitly + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, message) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + assert.deepStrictEqual(decodeSyncMessage(message).need, getHeads(n2)) + + // n2 should fulfill that request + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, message) + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + assert.strictEqual(decodeSyncMessage(message).changes.length, 1) + + // n1 should apply the change and the two should now be in sync + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, message) + assert.deepStrictEqual(getHeads(n1), getHeads(n2)) + }) + }) + + describe("protocol features", () => { + it("should allow multiple Bloom filters", () => { + // Scenario: ,-- n1c1 <-- n1c2 <-- n1c3 + // c0 <-- c1 <-- c2 <-+--- n2c1 <-- n2c2 <-- n2c3 + // `-- n3c1 <-- n3c2 <-- n3c3 + // n1 has {c0, c1, c2, n1c1, n1c2, n1c3, n2c1, n2c2}; + // n2 has {c0, c1, c2, n1c1, n1c2, n2c1, n2c2, n2c3}; + // n3 has {c0, c1, c2, n3c1, n3c2, n3c3}. + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef"), + n3 = Automerge.init("76543210") + let s13 = initSyncState() + let s32 = initSyncState(), + s31 = initSyncState(), + s23 = initSyncState() + let message1, message2, message3 + + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + // sync all 3 nodes + ;[n1, n2, ,] = sync(n1, n2) // eslint-disable-line no-unused-vars -- kept for consistency + ;[n1, n3, s13, s31] = sync(n1, n3) + ;[n3, n2, s32, s23] = sync(n3, n2) + for (let i = 0; i < 2; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = `${i} @ n1`)) + for (let i = 0; i < 2; i++) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = `${i} @ n2`)) + ;[n1] = Automerge.applyChanges(n1, Automerge.getAllChanges(n2)) + ;[n2] = Automerge.applyChanges(n2, Automerge.getAllChanges(n1)) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = `3 @ n1`)) + n2 = Automerge.change(n2, { time: 0 }, doc => (doc.x = `3 @ n2`)) + for (let i = 0; i < 3; i++) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = `${i} @ n3`)) + const n1c3 = getHeads(n1)[0], + n2c3 = getHeads(n2)[0], + n3c3 = getHeads(n3)[0] + s13 = decodeSyncState(encodeSyncState(s13)) + s31 = decodeSyncState(encodeSyncState(s31)) + s23 = decodeSyncState(encodeSyncState(s23)) + s32 = decodeSyncState(encodeSyncState(s32)) + + // Now n3 concurrently syncs with n1 and n2. Doing this naively would result in n3 receiving + // changes {n1c1, n1c2, n2c1, n2c2} twice (those are the changes that both n1 and n2 have, but + // that n3 does not have). We want to prevent this duplication. + ;[s13, message1] = Automerge.generateSyncMessage(n1, s13) // message from n1 to n3 + assert.strictEqual(decodeSyncMessage(message1).changes.length, 0) + ;[n3, s31] = Automerge.receiveSyncMessage(n3, s31, message1) + ;[s31, message3] = Automerge.generateSyncMessage(n3, s31) // message from n3 to n1 + assert.strictEqual(decodeSyncMessage(message3).changes.length, 3) // {n3c1, n3c2, n3c3} + ;[n1, s13] = Automerge.receiveSyncMessage(n1, s13, message3) + + // Copy the Bloom filter received from n1 into the message sent from n3 to n2. This Bloom + // filter indicates what changes n3 is going to receive from n1. + ;[s32, message3] = Automerge.generateSyncMessage(n3, s32) // message from n3 to n2 + const modifiedMessage = decodeSyncMessage(message3) + modifiedMessage.have.push(decodeSyncMessage(message1).have[0]) + assert.strictEqual(modifiedMessage.changes.length, 0) + ;[n2, s23] = Automerge.receiveSyncMessage( + n2, + s23, + encodeSyncMessage(modifiedMessage) + ) + + // n2 replies to n3, sending only n2c3 (the one change that n2 has but n1 doesn't) + ;[s23, message2] = Automerge.generateSyncMessage(n2, s23) + assert.strictEqual(decodeSyncMessage(message2).changes.length, 1) // {n2c3} + ;[n3, s32] = Automerge.receiveSyncMessage(n3, s32, message2) + + // n1 replies to n3 + ;[s13, message1] = Automerge.generateSyncMessage(n1, s13) + assert.strictEqual(decodeSyncMessage(message1).changes.length, 5) // {n1c1, n1c2, n1c3, n2c1, n2c2} + ;[n3, s31] = Automerge.receiveSyncMessage(n3, s31, message1) + assert.deepStrictEqual(getHeads(n3), [n1c3, n2c3, n3c3].sort()) + }) + + it("should allow any change to be requested", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + let message: Automerge.SyncMessage | null = null + + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + const lastSync = getHeads(n1) + for (let i = 3; i < 6; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n1, n2, s1, s2] = sync(n1, n2) + s1.lastSentHeads = [] // force generateSyncMessage to return a message even though nothing changed + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + const modMsg = decodeSyncMessage(message!) + modMsg.need = lastSync // re-request change 2 + ;[n2, s2] = Automerge.receiveSyncMessage( + n2, + s2, + encodeSyncMessage(modMsg) + ) + ;[s1, message] = Automerge.generateSyncMessage(n2, s2) + assert.strictEqual(decodeSyncMessage(message!).changes.length, 1) + assert.strictEqual( + Automerge.decodeChange(decodeSyncMessage(message!).changes[0]).hash, + lastSync[0] + ) + }) + + it("should ignore requests for a nonexistent change", () => { + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef") + let s1 = initSyncState(), + s2 = initSyncState() + let message: Automerge.SyncMessage | null = null + + for (let i = 0; i < 3; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) + ;[n2] = Automerge.applyChanges(n2, Automerge.getAllChanges(n1)) + ;[s1, message] = Automerge.generateSyncMessage(n1, s1) + const decoded = Automerge.decodeSyncMessage(message!) + decoded.need = [ + "0000000000000000000000000000000000000000000000000000000000000000", + ] + message = Automerge.encodeSyncMessage(decoded) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, message!) + ;[s2, message] = Automerge.generateSyncMessage(n2, s2) + assert.strictEqual(message, null) + }) + + it("should allow a subset of changes to be sent", () => { + // ,-- c1 <-- c2 + // c0 <-+ + // `-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 + let n1 = Automerge.init("01234567"), + n2 = Automerge.init("89abcdef"), + n3 = Automerge.init("76543210") + let s1 = initSyncState(), + s2 = initSyncState() + let msg, decodedMsg + + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = 0)) + n3 = Automerge.merge(n3, n1) + for (let i = 1; i <= 2; i++) + n1 = Automerge.change(n1, { time: 0 }, doc => (doc.x = i)) // n1 has {c0, c1, c2} + for (let i = 3; i <= 4; i++) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = i)) // n3 has {c0, c3, c4} + const c2 = getHeads(n1)[0], + c4 = getHeads(n3)[0] + n2 = Automerge.merge(n2, n3) // n2 has {c0, c3, c4} + + // Sync n1 and n2, so their shared heads are {c2, c4} + ;[n1, n2, s1, s2] = sync(n1, n2) + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + assert.deepStrictEqual(s1.sharedHeads, [c2, c4].sort()) + assert.deepStrictEqual(s2.sharedHeads, [c2, c4].sort()) + + // n2 and n3 apply {c5, c6, c7, c8} + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = 5)) + const change5 = Automerge.getLastLocalChange(n3) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = 6)) + const change6 = Automerge.getLastLocalChange(n3), + c6 = getHeads(n3)[0] + for (let i = 7; i <= 8; i++) + n3 = Automerge.change(n3, { time: 0 }, doc => (doc.x = i)) + const c8 = getHeads(n3)[0] + n2 = Automerge.merge(n2, n3) + + // Now n1 initiates a sync with n2, and n2 replies with {c5, c6}. n2 does not send {c7, c8} + ;[s1, msg] = Automerge.generateSyncMessage(n1, s1) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, msg) + ;[s2, msg] = Automerge.generateSyncMessage(n2, s2) + decodedMsg = decodeSyncMessage(msg) + decodedMsg.changes = [change5, change6] + msg = encodeSyncMessage(decodedMsg) + const sentHashes = [ + Automerge.decodeChange(change5!).hash, + Automerge.decodeChange(change6!).hash, + ] + s2.sentHashes = sentHashes + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, msg) + assert.deepStrictEqual(s1.sharedHeads, [c2, c6].sort()) + + // n1 replies, confirming the receipt of {c5, c6} and requesting the remaining changes + ;[s1, msg] = Automerge.generateSyncMessage(n1, s1) + ;[n2, s2] = Automerge.receiveSyncMessage(n2, s2, msg) + assert.deepStrictEqual(decodeSyncMessage(msg).need, [c8]) + assert.deepStrictEqual( + decodeSyncMessage(msg).have[0].lastSync, + [c2, c6].sort() + ) + assert.deepStrictEqual(s1.sharedHeads, [c2, c6].sort()) + assert.deepStrictEqual(s2.sharedHeads, [c2, c6].sort()) + + // n2 sends the remaining changes {c7, c8} + ;[s2, msg] = Automerge.generateSyncMessage(n2, s2) + ;[n1, s1] = Automerge.receiveSyncMessage(n1, s1, msg) + assert.strictEqual(decodeSyncMessage(msg).changes.length, 2) + assert.deepStrictEqual(s1.sharedHeads, [c2, c8].sort()) + }) + }) +}) diff --git a/javascript/test/text_test.ts b/javascript/test/text_test.ts new file mode 100644 index 00000000..518c7d2b --- /dev/null +++ b/javascript/test/text_test.ts @@ -0,0 +1,111 @@ +import * as assert from "assert" +import { unstable as Automerge } from "../src" +import { assertEqualsOneOf } from "./helpers" + +type DocType = { + text: string + [key: string]: any +} + +describe("Automerge.Text", () => { + let s1: Automerge.Doc, s2: Automerge.Doc + beforeEach(() => { + s1 = Automerge.change(Automerge.init(), doc => (doc.text = "")) + s2 = Automerge.merge(Automerge.init(), s1) + }) + + it("should support insertion", () => { + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 0, 0, "a")) + assert.strictEqual(s1.text.length, 1) + assert.strictEqual(s1.text[0], "a") + assert.strictEqual(s1.text, "a") + //assert.strictEqual(s1.text.getElemId(0), `2@${Automerge.getActorId(s1)}`) + }) + + it("should support deletion", () => { + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 0, 0, "abc")) + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 1, 1)) + assert.strictEqual(s1.text.length, 2) + assert.strictEqual(s1.text[0], "a") + assert.strictEqual(s1.text[1], "c") + assert.strictEqual(s1.text, "ac") + }) + + it("should support implicit and explicit deletion", () => { + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 0, 0, "abc")) + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 1, 1)) + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 1, 0)) + assert.strictEqual(s1.text.length, 2) + assert.strictEqual(s1.text[0], "a") + assert.strictEqual(s1.text[1], "c") + assert.strictEqual(s1.text, "ac") + }) + + it("should handle concurrent insertion", () => { + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 0, 0, "abc")) + s2 = Automerge.change(s2, doc => Automerge.splice(doc, "text", 0, 0, "xyz")) + s1 = Automerge.merge(s1, s2) + assert.strictEqual(s1.text.length, 6) + assertEqualsOneOf(s1.text, "abcxyz", "xyzabc") + }) + + it("should handle text and other ops in the same change", () => { + s1 = Automerge.change(s1, doc => { + doc.foo = "bar" + Automerge.splice(doc, "text", 0, 0, "a") + }) + assert.strictEqual(s1.foo, "bar") + assert.strictEqual(s1.text, "a") + assert.strictEqual(s1.text, "a") + }) + + it("should serialize to JSON as a simple string", () => { + s1 = Automerge.change(s1, doc => Automerge.splice(doc, "text", 0, 0, 'a"b')) + assert.strictEqual(JSON.stringify(s1), '{"text":"a\\"b"}') + }) + + it("should allow modification after an object is assigned to a document", () => { + s1 = Automerge.change(Automerge.init(), doc => { + doc.text = "" + Automerge.splice(doc, "text", 0, 0, "abcd") + Automerge.splice(doc, "text", 2, 1) + assert.strictEqual(doc.text, "abd") + }) + assert.strictEqual(s1.text, "abd") + }) + + it("should not allow modification outside of a change callback", () => { + assert.throws( + () => Automerge.splice(s1, "text", 0, 0, "a"), + /object cannot be modified outside of a change block/ + ) + }) + + describe("with initial value", () => { + it("should initialize text in Automerge.from()", () => { + let s1 = Automerge.from({ text: "init" }) + assert.strictEqual(s1.text.length, 4) + assert.strictEqual(s1.text[0], "i") + assert.strictEqual(s1.text[1], "n") + assert.strictEqual(s1.text[2], "i") + assert.strictEqual(s1.text[3], "t") + assert.strictEqual(s1.text, "init") + }) + + it("should encode the initial value as a change", () => { + const s1 = Automerge.from({ text: "init" }) + const changes = Automerge.getAllChanges(s1) + assert.strictEqual(changes.length, 1) + const [s2] = Automerge.applyChanges(Automerge.init(), changes) + assert.strictEqual(s2.text, "init") + assert.strictEqual(s2.text, "init") + }) + }) + + it("should support unicode when creating text", () => { + s1 = Automerge.from({ + text: "🐦", + }) + assert.strictEqual(s1.text, "🐦") + }) +}) diff --git a/javascript/test/text_v1.ts b/javascript/test/text_v1.ts new file mode 100644 index 00000000..b111530f --- /dev/null +++ b/javascript/test/text_v1.ts @@ -0,0 +1,281 @@ +import * as assert from "assert" +import * as Automerge from "../src" +import { assertEqualsOneOf } from "./helpers" + +type DocType = { text: Automerge.Text; [key: string]: any } + +describe("Automerge.Text", () => { + let s1: Automerge.Doc, s2: Automerge.Doc + beforeEach(() => { + s1 = Automerge.change( + Automerge.init(), + doc => (doc.text = new Automerge.Text()) + ) + s2 = Automerge.merge(Automerge.init(), s1) + }) + + it("should support insertion", () => { + s1 = Automerge.change(s1, doc => doc.text.insertAt(0, "a")) + assert.strictEqual(s1.text.length, 1) + assert.strictEqual(s1.text.get(0), "a") + assert.strictEqual(s1.text.toString(), "a") + //assert.strictEqual(s1.text.getElemId(0), `2@${Automerge.getActorId(s1)}`) + }) + + it("should support deletion", () => { + s1 = Automerge.change(s1, doc => doc.text.insertAt(0, "a", "b", "c")) + s1 = Automerge.change(s1, doc => doc.text.deleteAt(1, 1)) + assert.strictEqual(s1.text.length, 2) + assert.strictEqual(s1.text.get(0), "a") + assert.strictEqual(s1.text.get(1), "c") + assert.strictEqual(s1.text.toString(), "ac") + }) + + it("should support implicit and explicit deletion", () => { + s1 = Automerge.change(s1, doc => doc.text.insertAt(0, "a", "b", "c")) + s1 = Automerge.change(s1, doc => doc.text.deleteAt(1)) + s1 = Automerge.change(s1, doc => doc.text.deleteAt(1, 0)) + assert.strictEqual(s1.text.length, 2) + assert.strictEqual(s1.text.get(0), "a") + assert.strictEqual(s1.text.get(1), "c") + assert.strictEqual(s1.text.toString(), "ac") + }) + + it("should handle concurrent insertion", () => { + s1 = Automerge.change(s1, doc => doc.text.insertAt(0, "a", "b", "c")) + s2 = Automerge.change(s2, doc => doc.text.insertAt(0, "x", "y", "z")) + s1 = Automerge.merge(s1, s2) + assert.strictEqual(s1.text.length, 6) + assertEqualsOneOf(s1.text.toString(), "abcxyz", "xyzabc") + assertEqualsOneOf(s1.text.join(""), "abcxyz", "xyzabc") + }) + + it("should handle text and other ops in the same change", () => { + s1 = Automerge.change(s1, doc => { + doc.foo = "bar" + doc.text.insertAt(0, "a") + }) + assert.strictEqual(s1.foo, "bar") + assert.strictEqual(s1.text.toString(), "a") + assert.strictEqual(s1.text.join(""), "a") + }) + + it("should serialize to JSON as a simple string", () => { + s1 = Automerge.change(s1, doc => doc.text.insertAt(0, "a", '"', "b")) + assert.strictEqual(JSON.stringify(s1), '{"text":"a\\"b"}') + }) + + it("should allow modification before an object is assigned to a document", () => { + s1 = Automerge.change(Automerge.init(), doc => { + const text = new Automerge.Text() + text.insertAt(0, "a", "b", "c", "d") + text.deleteAt(2) + doc.text = text + assert.strictEqual(doc.text.toString(), "abd") + assert.strictEqual(doc.text.join(""), "abd") + }) + assert.strictEqual(s1.text.toString(), "abd") + assert.strictEqual(s1.text.join(""), "abd") + }) + + it("should allow modification after an object is assigned to a document", () => { + s1 = Automerge.change(Automerge.init(), doc => { + const text = new Automerge.Text() + doc.text = text + doc.text.insertAt(0, "a", "b", "c", "d") + doc.text.deleteAt(2) + assert.strictEqual(doc.text.toString(), "abd") + assert.strictEqual(doc.text.join(""), "abd") + }) + assert.strictEqual(s1.text.join(""), "abd") + }) + + it("should not allow modification outside of a change callback", () => { + assert.throws( + () => s1.text.insertAt(0, "a"), + /object cannot be modified outside of a change block/ + ) + }) + + describe("with initial value", () => { + it("should accept a string as initial value", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.text = new Automerge.Text("init")) + ) + assert.strictEqual(s1.text.length, 4) + assert.strictEqual(s1.text.get(0), "i") + assert.strictEqual(s1.text.get(1), "n") + assert.strictEqual(s1.text.get(2), "i") + assert.strictEqual(s1.text.get(3), "t") + assert.strictEqual(s1.text.toString(), "init") + }) + + it("should accept an array as initial value", () => { + let s1 = Automerge.change( + Automerge.init(), + doc => (doc.text = new Automerge.Text(["i", "n", "i", "t"])) + ) + assert.strictEqual(s1.text.length, 4) + assert.strictEqual(s1.text.get(0), "i") + assert.strictEqual(s1.text.get(1), "n") + assert.strictEqual(s1.text.get(2), "i") + assert.strictEqual(s1.text.get(3), "t") + assert.strictEqual(s1.text.toString(), "init") + }) + + it("should initialize text in Automerge.from()", () => { + let s1 = Automerge.from({ text: new Automerge.Text("init") }) + assert.strictEqual(s1.text.length, 4) + assert.strictEqual(s1.text.get(0), "i") + assert.strictEqual(s1.text.get(1), "n") + assert.strictEqual(s1.text.get(2), "i") + assert.strictEqual(s1.text.get(3), "t") + assert.strictEqual(s1.text.toString(), "init") + }) + + it("should encode the initial value as a change", () => { + const s1 = Automerge.from({ text: new Automerge.Text("init") }) + const changes = Automerge.getAllChanges(s1) + assert.strictEqual(changes.length, 1) + const [s2] = Automerge.applyChanges(Automerge.init(), changes) + assert.strictEqual(s2.text instanceof Automerge.Text, true) + assert.strictEqual(s2.text.toString(), "init") + assert.strictEqual(s2.text.join(""), "init") + }) + + it("should allow immediate access to the value", () => { + Automerge.change(Automerge.init(), doc => { + const text = new Automerge.Text("init") + assert.strictEqual(text.length, 4) + assert.strictEqual(text.get(0), "i") + assert.strictEqual(text.toString(), "init") + doc.text = text + assert.strictEqual(doc.text.length, 4) + assert.strictEqual(doc.text.get(0), "i") + assert.strictEqual(doc.text.toString(), "init") + }) + }) + + it("should allow pre-assignment modification of the initial value", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + const text = new Automerge.Text("init") + text.deleteAt(3) + assert.strictEqual(text.join(""), "ini") + doc.text = text + assert.strictEqual(doc.text.join(""), "ini") + assert.strictEqual(doc.text.toString(), "ini") + }) + assert.strictEqual(s1.text.toString(), "ini") + assert.strictEqual(s1.text.join(""), "ini") + }) + + it("should allow post-assignment modification of the initial value", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + const text = new Automerge.Text("init") + doc.text = text + doc.text.deleteAt(0) + doc.text.insertAt(0, "I") + assert.strictEqual(doc.text.join(""), "Init") + assert.strictEqual(doc.text.toString(), "Init") + }) + assert.strictEqual(s1.text.join(""), "Init") + assert.strictEqual(s1.text.toString(), "Init") + }) + }) + + describe("non-textual control characters", () => { + let s1: Automerge.Doc + beforeEach(() => { + s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text() + doc.text.insertAt(0, "a") + doc.text.insertAt(1, { attribute: "bold" }) + }) + }) + + it("should allow fetching non-textual characters", () => { + assert.deepEqual(s1.text.get(1), { attribute: "bold" }) + //assert.strictEqual(s1.text.getElemId(1), `3@${Automerge.getActorId(s1)}`) + }) + + it("should include control characters in string length", () => { + assert.strictEqual(s1.text.length, 2) + assert.strictEqual(s1.text.get(0), "a") + }) + + it("should replace control characters from toString()", () => { + assert.strictEqual(s1.text.toString(), "a\uFFFC") + }) + + it("should allow control characters to be updated", () => { + const s2 = Automerge.change( + s1, + doc => (doc.text.get(1)!.attribute = "italic") + ) + const s3 = Automerge.load(Automerge.save(s2)) + assert.strictEqual(s1.text.get(1).attribute, "bold") + assert.strictEqual(s2.text.get(1).attribute, "italic") + assert.strictEqual(s3.text.get(1).attribute, "italic") + }) + + describe("spans interface to Text", () => { + it("should return a simple string as a single span", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text("hello world") + }) + assert.deepEqual(s1.text.toSpans(), ["hello world"]) + }) + it("should return an empty string as an empty array", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text() + }) + assert.deepEqual(s1.text.toSpans(), []) + }) + it("should split a span at a control character", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text("hello world") + doc.text.insertAt(5, { attributes: { bold: true } }) + }) + assert.deepEqual(s1.text.toSpans(), [ + "hello", + { attributes: { bold: true } }, + " world", + ]) + }) + it("should allow consecutive control characters", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text("hello world") + doc.text.insertAt(5, { attributes: { bold: true } }) + doc.text.insertAt(6, { attributes: { italic: true } }) + }) + assert.deepEqual(s1.text.toSpans(), [ + "hello", + { attributes: { bold: true } }, + { attributes: { italic: true } }, + " world", + ]) + }) + it("should allow non-consecutive control characters", () => { + let s1 = Automerge.change(Automerge.init(), doc => { + doc.text = new Automerge.Text("hello world") + doc.text.insertAt(5, { attributes: { bold: true } }) + doc.text.insertAt(12, { attributes: { italic: true } }) + }) + assert.deepEqual(s1.text.toSpans(), [ + "hello", + { attributes: { bold: true } }, + " world", + { attributes: { italic: true } }, + ]) + }) + }) + }) + + it("should support unicode when creating text", () => { + s1 = Automerge.from({ + text: new Automerge.Text("🐦"), + }) + assert.strictEqual(s1.text.get(0), "🐦") + }) +}) diff --git a/javascript/test/uuid_test.ts b/javascript/test/uuid_test.ts new file mode 100644 index 00000000..f6a0bde4 --- /dev/null +++ b/javascript/test/uuid_test.ts @@ -0,0 +1,32 @@ +import * as assert from "assert" +import * as Automerge from "../src" + +const uuid = Automerge.uuid + +describe("uuid", () => { + afterEach(() => { + uuid.reset() + }) + + describe("default implementation", () => { + it("generates unique values", () => { + assert.notEqual(uuid(), uuid()) + }) + }) + + describe("custom implementation", () => { + let counter + + function customUuid() { + return `custom-uuid-${counter++}` + } + + before(() => uuid.setFactory(customUuid)) + beforeEach(() => (counter = 0)) + + it("invokes the custom factory", () => { + assert.equal(uuid(), "custom-uuid-0") + assert.equal(uuid(), "custom-uuid-1") + }) + }) +}) diff --git a/javascript/tsconfig.json b/javascript/tsconfig.json new file mode 100644 index 00000000..628aea8e --- /dev/null +++ b/javascript/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es2016", + "sourceMap": false, + "declaration": true, + "resolveJsonModule": true, + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "outDir": "./dist" + }, + "include": ["src/**/*", "test/**/*"], + "exclude": ["./dist/**/*", "./node_modules", "./src/**/*.deno.ts"] +} diff --git a/javascript/tslint.json b/javascript/tslint.json new file mode 100644 index 00000000..f7bb7a71 --- /dev/null +++ b/javascript/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "tslint:recommended" +} diff --git a/perf/Cargo.toml b/perf/Cargo.toml deleted file mode 100644 index 37777bcf..00000000 --- a/perf/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "perf" -version = "0.1.0" -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -automerge = { path = "../automerge" } -automerge-frontend = { path = "../automerge-frontend" } -automerge-protocol = { path = "../automerge-protocol" } -rand = "0.8.2" -maplit = "^1.0.2" -unicode-segmentation = "1.7.1" -serde = "1.0.126" -serde_json = "1.0.64" diff --git a/perf/final.json b/perf/final.json deleted file mode 100644 index 5748ef19..00000000 --- a/perf/final.json +++ /dev/null @@ -1 +0,0 @@ -"\\documentclass[10pt,journal,compsoc]{IEEEtran}\n\\PassOptionsToPackage{hyphens}{url}\n\\usepackage[utf8]{inputenc}\n\\usepackage{amsmath} % align environment\n\\usepackage{amssymb} % mathbb\n\\usepackage{bussproofs} % notation for inference rules\n\\usepackage{rotating} % sidewaysfigure\n\\usepackage{hyperref}\n\\usepackage[hyphenbreaks]{breakurl} % Fix URL line breaking when using dvips (e.g. arxiv.org)\n\\usepackage[nocompress]{cite}\n\n% Theorem environments\n\\usepackage{amsthm}\n\\newtheorem{definition}{Definition}\n\\newtheorem{theorem}{Theorem}\n\\newtheorem{lemma}[theorem]{Lemma}\n\\newtheorem*{convergence-thm}{Theorem}\n\n% Diagrams\n\\usepackage{tikz}\n\\usetikzlibrary{arrows}\n\n\\hyphenation{da-ta-cen-ter da-ta-cen-ters net-works time-stamp}\n\n\\newif\\ifincludeappendix\n\\includeappendixtrue\n\n\\newcommand{\\evalto}{\\;\\Longrightarrow\\;}\n\n% Placeholder character like \\textvisiblespace, but works in math mode\n\\newcommand{\\placeholder}{%\n \\makebox[0.7em]{%\n \\kern.07em\n \\vrule height.3ex\n \\hrulefill\n \\vrule height.3ex\n \\kern.07em\n }%\n}\n\n% Span multiple columns within an alignat math environment\n\\newcommand{\\multialign}[2]{%\n \\multispan{#1}\\mbox{$\\displaystyle{}#2$}%\n}\n\n\\begin{document}\n\\sloppy\n\\title{A Conflict-Free Replicated JSON Datatype}\n\\author{Martin Kleppmann and Alastair R. Beresford\n\\thanks{M. Kleppmann and A.R. Beresford are with the University of Cambridge Computer Laboratory, Cambridge, UK.\\protect\\\\Email: \\url{mk428@cl.cam.ac.uk}, \\url{arb33@cl.cam.ac.uk}.}}\n\n\\IEEEtitleabstractindextext{%\n\\begin{abstract}\n% abstract word limit: 100-200 words\nMany applications model their data in a general-purpose storage format such as JSON. This data structure is modified by the application as a result of user input. Such modifications are well understood if performed sequentially on a single copy of the data, but if the data is replicated and modified concurrently on multiple devices, it is unclear what the semantics should be. In this paper we present an algorithm and formal semantics for a JSON data structure that automatically resolves concurrent modifications such that no updates are lost, and such that all replicas converge towards the same state (a conflict-free replicated datatype or CRDT). It supports arbitrarily nested list and map types, which can be modified by insertion, deletion and assignment. The algorithm performs all merging client-side and does not depend on ordering guarantees from the network, making it suitable for deployment on mobile devices with poor network connectivity, in peer-to-peer networks, and in messaging systems with end-to-end encryption.\n\\end{abstract}\n\n\\begin{IEEEkeywords}\nCRDTs, Collaborative Editing, P2P, JSON, Optimistic Replication, Operational Semantics, Eventual Consistency.\n\\end{IEEEkeywords}}\n\\maketitle\n\n\\IEEEraisesectionheading{\\section{Introduction}\\label{sec:introduction}}\n\n\\IEEEPARstart{U}{sers} of mobile devices, such as smartphones, expect applications to continue working while the device is offline or has poor network connectivity, and to synchronize its state with the user's other devices when the network is available. Examples of such applications include calendars, address books, note-taking tools, to-do lists, and password managers. Similarly, collaborative work often requires several people to simultaneously edit the same text document, spreadsheet, presentation, graphic, and other kinds of document, with each person's edits reflected on the other collaborators' copies of the document with minimal delay.\n\nWhat these applications have in common is that the application state needs to be replicated to several devices, each of which may modify the state locally. The traditional approach to concurrency control, serializability, would cause the application to become unusable at times of poor network connectivity~\\cite{Davidson:1985hv}. If we require that applications work regardless of network availability, we must assume that users can make arbitrary modifications concurrently on different devices, and that any resulting conflicts must be resolved.\n\nThe simplest way to resolve conflicts is to discard some modifications when a conflict occurs, for example using a ``last writer wins'' policy. However, this approach is undesirable as it incurs data loss. An alternative is to let the user manually resolve the conflict, which is tedious and error-prone, and therefore should be avoided whenever possible.\n\nCurrent applications solve this problem with a range of ad-hoc and application-specific mechanisms. In this paper we present a general-purpose datatype that provides the full expressiveness of the JSON data model, and supports concurrent modifications without loss of information. As we shall see later, our approach typically supports the automatic merging of concurrent modifications into a JSON data structure. We introduce a single, general mechanism (a multi-value register) into our model to record conflicting updates to leaf nodes in the JSON data structure. This mechanism then provides a consistent basis on which applications can resolve any remaining conflicts through programmatic means, or via further user input. We expect that implementations of this datatype will drastically simplify the development of collaborative and state-synchronizing applications for mobile devices.\n\n\\subsection{JSON Data Model}\n\nJSON is a popular general-purpose data encoding format, used in many databases and web services. It has similarities to XML, and we compare them in Section~\\ref{sec:json-xml}. The structure of a JSON document can optionally be constrained by a schema; however, for simplicity, this paper discusses only untyped JSON without an explicit schema.\n\nA JSON document is a tree containing two types of branch node:\n\n\\begin{description}\n\\item[Map:] A node whose children have no defined order, and where each child is labelled with a string \\emph{key}. A key uniquely identifies one of the children. We treat keys as immutable, but values as mutable, and key-value mappings can be added and removed from the map. A JSON map is also known as an \\emph{object}.\n\\item[List:] A node whose children have an order defined by the application. The list can be mutated by inserting or deleting list elements. A JSON list is also known as an \\emph{array}.\n\\end{description}\n\nA child of a branch node can be either another branch node, or a leaf node. A leaf of the tree contains a primitive value (string, number, boolean, or null). We treat primitive values as immutable, but allow the value of a leaf node to be modified by treating it as a \\emph{register} that can be assigned a new value.\n\nThis model is sufficient to express the state of a wide range of applications. For example, a text document can be represented by a list of single-character strings; character-by-character edits are then expressed as insertions and deletions of list elements. In Section~\\ref{sec:examples} we describe four more complex examples of using JSON to model application data.\n\n\\subsection{Replication and Conflict Resolution}\\label{sec:intro-replication}\n\nWe consider systems in which a full copy of the JSON document is replicated on several devices. Those devices could be servers in datacenters, but we focus on mobile devices such as smartphones and laptops, which have intermittent network connectivity. We do not distinguish between devices owned by the same user and different users. Our model allows each device to optimistically modify its local replica of the document, and to asynchronously propagate those edits to other replicas.\n\nOur only requirement of the network is that messages sent by one replica are eventually delivered to all other replicas, by retrying if delivery fails. We assume the network may arbitrarily delay, reorder and duplicate messages.\n\nOur algorithm works client-side and does not depend on any server to transform or process messages. This approach allows messages to be delivered via a peer-to-peer network as well as a secure messaging protocol with end-to-end encryption~\\cite{Unger:2015kg}. The details of the network implementation and cryptographic protocols are outside of the scope of this paper.\n\nIn Section~\\ref{sec:semantics} we define formal semantics describing how conflicts are resolved when a JSON document is concurrently modified on different devices. Our design is based on three simple principles:\n\\begin{enumerate}\n\\item All replicas of the data structure should automatically converge towards the same state (a requirement known as \\emph{strong eventual consistency}~\\cite{Shapiro:2011un}).\n\\item No user input should be lost due to concurrent modifications.\n\\item If all sequential permutations of a set of updates lead to the same state, then concurrent execution of those updates also leads to the same state~\\cite{Bieniusa:2012gt}.\n\\end{enumerate}\n\n\\subsection{Our Contributions}\n\nOur main contribution in this work is to define an algorithm and formal semantics for collaborative, concurrent editing of JSON data structures with automatic conflict resolution. Although similar algorithms have previously been defined for lists, maps and registers individually (see Section~\\ref{sec:related}), to our knowledge this paper is the first to integrate all of these structures into an arbitrarily composable datatype that can be deployed on any network topology.\n\nA key requirement of conflict resolution is that after any sequence of concurrent modifications, all replicas eventually converge towards the same state. In Section~\\ref{sec:convergence} and the appendix we prove a theorem to show that our algorithm satisfies this requirement.\n\nComposing maps and lists into arbitrarily nested structures opens up subtle challenges that do not arise in flat structures, due to the possibility of concurrent edits at different levels of the tree. We illustrate some of those challenges by example in Section~\\ref{sec:examples}. Nested structures are an important requirement for many applications. Consequently, the long-term goal of our work is to simplify the development of applications that use optimistic replication by providing a general algorithm for conflict resolution whose details can largely be hidden inside an easy-to-use software library.\n\n\\section{Related Work}\\label{sec:related}\n\nIn this section we discuss existing approaches to optimistic replication, collaborative editing and conflict resolution.\n\n\\subsection{Operational Transformation}\\label{sec:related-ot}\n\nAlgorithms based on \\emph{operational transformation} (OT) have long been used for collaborative editing applications~\\cite{Ellis:1989ue,Ressel:1996wx,Sun:1998vf,Nichols:1995fd}. Most of them treat a document as a single ordered list (of characters, for example) and do not support nested tree structures that are required by many applications. Some algorithms generalize OT to editing XML documents~\\cite{Davis:2002iv,Ignat:2003jy,Wang:2015vo}, which provides nesting of ordered lists, but these algorithms do not support key-value maps as defined in this paper (see Section~\\ref{sec:json-xml}). The performance of OT algorithms degrades rapidly as the number of concurrent operations increases~\\cite{Li:2006kd,Mehdi:2011ke}.\n\nMost deployed OT collaboration systems, including Google Docs~\\cite{DayRichter:2010tt}, Etherpad~\\cite{Etherpad:2011um}, Novell Vibe~\\cite{Spiewak:2010vw} and Apache Wave (formerly Google Wave~\\cite{Wang:2015vo}), rely on a single server to decide on a total ordering of operations~\\cite{Lemonik:2016wh}, a design decision inherited from the Jupiter system~\\cite{Nichols:1995fd}. This approach has the advantage of making the transformation functions simpler and less error-prone~\\cite{Imine:2003ks}, but it does not meet our requirements, since we want to support peer-to-peer collaboration without requiring a single server.\n\nMany secure messaging protocols, which we plan to use for encrypted collaboration, do not guarantee that different recipients will see messages in the same order~\\cite{Unger:2015kg}. Although it is possible to decide on a total ordering of operations without using a single server by using an atomic broadcast protocol~\\cite{Defago:2004ji}, such protocols are equivalent to consensus~\\cite{Chandra:1996cp}, so they can only safely make progress if a quorum of participants are reachable. We expect that in peer-to-peer systems of mobile devices participants will frequently be offline, and so any algorithm requiring atomic broadcast would struggle to reach a quorum and become unavailable. Without quorums, the strongest guarantee a system can give is causal ordering~\\cite{Attiya:2015dm}.\n\nThe Google Realtime API~\\cite{Google:2015vk} is to our knowledge the only implementation of OT that supports arbitrary nesting of lists and maps. Like Google Docs, it relies on a single server~\\cite{Lemonik:2016wh}. As a proprietary product, details of its algorithms have not been published.\n\n\\subsection{CRDTs}\\label{sec:related-crdts}\n\nConflict-free replicated datatypes (CRDTs) are a family of data structures that support concurrent modification and guarantee convergence of concurrent updates. They work by attaching additional metadata to the data structure, making modification operations commutative by construction. The JSON datatype described in this paper is a CRDT.\n\nCRDTs for registers, counters, maps, and sets are well-known~\\cite{Shapiro:2011un,Shapiro:2011wy}, and have been implemented in various deployed systems such as Riak~\\cite{Brown:2014hs,Brown:2013wy}. For ordered lists, various algorithms have been proposed, including WOOT~\\cite{Oster:2006wj}, RGA~\\cite{Roh:2011dw}, Treedoc~\\cite{Preguica:2009fz}, Logoot~\\cite{Weiss:2010hx}, and LSEQ~\\cite{Nedelec:2013ky}. Attiya et al.~\\cite{Attiya:2016kh} analyze the metadata overhead of collaboratively edited lists, and provide a correctness proof of the RGA algorithm. However, none of them support nesting: all of the aforementioned algorithms assume that each of their elements is a primitive value, not another CRDT.\n\nThe problem of nesting one CRDT inside another (also known as \\emph{composition} or \\emph{embedding}) has only been studied more recently. Riak allows nesting of counters and registers inside maps, and of maps within other maps~\\cite{Brown:2014hs,Brown:2013wy}. Embedding counters inside maps raises questions of semantics, which have been studied by Baquero, Almeida and Lerche~\\cite{Baquero:2016iv}. Almeida et al.~\\cite{Almeida:2016tk} also define delta mutations for nested maps, and Baquero et al.~\\cite{Baquero:2015tm} define a theoretical framework for composition of state-based CRDTs, based on lattices. None of this work integrates CRDTs for ordered lists, but the treatment of causality in these datatypes forms a basis for the semantics developed in this paper.\n\nBurckhardt et al.~\\cite{Burckhardt:2012jy} define \\emph{cloud types}, which are similar to CRDTs and can be composed. They define \\emph{cloud arrays}, which behave similarly to our map datatype, and \\emph{entities}, which are like unordered sets or relations; ordered lists are not defined in this framework.\n\nOn the other hand, Martin et al.~\\cite{Martin:2010ih} generalize Logoot~\\cite{Weiss:2010hx} to support collaborative editing of XML documents~-- that is, a tree of nested ordered lists without nested maps. As discussed in Section~\\ref{sec:json-xml}, such a structure does not capture the expressiveness of JSON.\n\nAlthough CRDTs for registers, maps and ordered lists have existed for years in isolation, we are not aware of any prior work that allows them all to be composed into an arbitrarily nested CRDT with a JSON-like structure.\n\n\\subsection{Other Approaches}\\label{sec:related-other}\n\nMany replicated data systems need to deal with the problem of concurrent, conflicting modifications, but the solutions are often ad-hoc. For example, in Dynamo~\\cite{DeCandia:2007ui} and CouchDB, if several values are concurrently written to the same key, the database preserves all of these values, and leaves conflict resolution to application code -- in other words, the only datatype it supports is a multi-value register. Naively chosen merge functions often exhibit anomalies such as deleted items reappearing~\\cite{DeCandia:2007ui}. We believe that conflict resolution is not a simple matter that can reasonably be left to application programmers.\n\nAnother frequently-used approach to conflict resolution is \\emph{last writer wins} (LWW), which arbitrarily chooses one among several concurrent writes as ``winner'' and discards the others. LWW is used in Apache Cassandra, for example. It does not meet our requirements, since we want no user input to be lost due to concurrent modifications.\n\nResolving concurrent updates on tree structures has been studied in the context of file synchronization~\\cite{Balasubramaniam:1998jh,Ramsey:2001ce}.\n\nFinally, systems such as Bayou~\\cite{Terry:1995dn} allow offline nodes to execute transactions tentatively, and confirm them when they are next online. This approach relies on all servers executing transactions in the same serial order, and deciding whether a transaction was successful depending on its preconditions. Bayou has the advantage of being able to express global invariants such as uniqueness constraints, which require serialization and cannot be expressed using CRDTs~\\cite{Bailis:2014th}. Bayou's downside is that tentative transactions may be rolled back, requiring explicit handling by the application, whereas CRDTs are defined such that operations cannot fail after they have been performed on one replica.\n\n\n\\section{Composing Data Structures}\\label{sec:composing}\n\nIn this section we informally introduce our approach to collaborative editing of JSON data structures, and illustrate some peculiarities of concurrent nested data structures. A formal presentation of the algorithm follows in Section~\\ref{sec:semantics}.\n\n\\subsection{Concurrent Editing Examples}\\label{sec:examples}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,6.5);\n\\node (leftR) at (0,6) {Replica $p$:};\n\\node (rightR) at (8,6) {Replica $q$:};\n\\node (left0) at (0,5) [rectangle,draw] {\\{``key'': ``A''\\}};\n\\node (right0) at (8,5) [rectangle,draw] {\\{``key'': ``A''\\}};\n\\node (left1) at (0,3) [rectangle,draw] {\\{``key'': ``B''\\}};\n\\node (right1) at (8,3) [rectangle,draw] {\\{``key'': ``C''\\}};\n\\node (left2) at (0,0) [rectangle,draw] {\\{``key'': \\{``B'', ``C''\\}\\}};\n\\node (right2) at (8,0) [rectangle,draw] {\\{``key'': \\{``B'', ``C''\\}\\}};\n\\node (comms) at (4,1.6) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left,inner sep=8pt] {doc.get(``key'') := ``B'';} (left1);\n\\draw [thick,->] (right0) to node [right,inner sep=8pt] {doc.get(``key'') := ``C'';} (right1);\n\\draw [thick,->] (left1) -- (left2);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right2.north west);\n\\draw [thick,dashed,blue,->] (right1.south) to [out=270,in=45] (left2.north east);\n\\draw [thick,->] (right1) -- (right2);\n\\end{tikzpicture}\n\\caption{Concurrent assignment to the register at doc.get(``key'') by replicas $p$ and $q$.}\\label{fig:register-assign}\n\\end{figure*}\n\nThe sequential semantics of editing a JSON data structure are well-known, and the semantics of concurrently editing a flat map or list data structure have been thoroughly explored in the literature (see Section~\\ref{sec:related}). However, when defining a CRDT for JSON data, difficulties arise due to the interactions between concurrency and nested data structures.\n\nIn the following examples we show some situations that might occur when JSON documents are concurrently modified, demonstrate how they are handled by our algorithm, and explain the rationale for our design decisions. In all examples we assume two replicas, labelled $p$ (drawn on the left-hand side) and $q$ (right-hand side). Local state for a replica is drawn in boxes, and modifications to local state are shown with labelled solid arrows; time runs down the page. Since replicas only mutate local state, we make communication of state changes between replicas explicit in our model. Network communication is depicted with dashed arrows.\n\nOur first example is shown in Figure~\\ref{fig:register-assign}. In a document that maps ``key'' to a register with value ``A'', replica $p$ sets the value of the register to ``B'', while replica $q$ concurrently sets it to ``C''. As the replicas subsequently exchange edits via network communication, they detect the conflict. Since we do not want to simply discard one of the edits, and the strings ``B'' and ``C'' cannot be meaningfully merged, the system must preserve both concurrent updates. This datatype is known as a \\emph{multi-value register}: although a replica can only assign a single value to the register, reading the register may return a set of multiple values that were concurrently written.\n\nA multi-value register is hardly an impressive CRDT, since it does not actually perform any conflict resolution. We use it only for primitive values for which no automatic merge function is defined. Other CRDTs could be substituted in its place: for example, a counter CRDT for a number that can only be incremented and decremented, or an ordered list of characters for a collaboratively editable string (see also Figure~\\ref{fig:text-edit}).\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-1) -- (4,8);\n\\node (left0) at (0,7.5) [rectangle,draw] {\\{``colors'': \\{``blue'': ``\\#0000ff''\\}\\}};\n\\node (right0) at (8,7.5) [rectangle,draw] {\\{``colors'': \\{``blue'': ``\\#0000ff''\\}\\}};\n\\node [matrix] (left1) at (0,4) [rectangle,draw] {\n \\node {\\{``colors'': \\{``blue'': ``\\#0000ff'',}; \\\\\n \\node {``red'': ``\\#ff0000''\\}\\}}; \\\\\n};\n\\node (right1) at (8,5.5) [rectangle,draw] {\\{``colors'': \\{\\}\\}};\n\\node (right2) at (8,3) [rectangle,draw] {\\{``colors'': \\{``green'': ``\\#00ff00''\\}\\}};\n\\node [matrix] (left2) at (0,0) [rectangle,draw] {\n \\node {\\{``colors'': \\{``red'': ``\\#ff0000'',}; \\\\\n \\node {``green'': ``\\#00ff00''\\}\\}}; \\\\\n};\n\\node [matrix] (right3) at (8,0) [rectangle,draw] {\n \\node {\\{``colors'': \\{``red'': ``\\#ff0000'',}; \\\\\n \\node {``green'': ``\\#00ff00''\\}\\}}; \\\\\n};\n\\node (comms) at (4,2.1) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) -- (left1)\n node [left,text width=4.2cm,text centered,midway] {doc.get(``colors'').get(``red'') := ``\\#ff0000'';};\n\\draw [thick,->] (right0) to node [right] {doc.get(``colors'') := \\{\\};} (right1);\n\\draw [thick,->] (right1) -- (right2)\n node [right,text width=4.2cm,text centered,midway] {doc.get(``colors'').get(``green'') := ``\\#00ff00'';};\n\\draw [thick,->] (left1) to (left2);\n\\draw [thick,->] (right2) to (right3);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right3.north west);\n\\draw [thick,dashed,blue,->] (right2.south) to [out=270,in=45] (left2.north east);\n\\end{tikzpicture}\n\\caption{Modifying the contents of a nested map while concurrently the entire map is overwritten.}\\label{fig:map-remove}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (5,-0.5) -- (5,10);\n\\node (left0) at (0,9.5) [rectangle,draw] {\\{\\}};\n\\node (right0) at (10,9.5) [rectangle,draw] {\\{\\}};\n\\node (left1) at (0,7.5) [rectangle,draw] {\\{``grocery'': []\\}};\n\\node (right1) at (10,7.5) [rectangle,draw] {\\{``grocery'': []\\}};\n\\node (left2) at (0,5.0) [rectangle,draw] {\\{``grocery'': [``eggs'']\\}};\n\\node (left3) at (0,2.5) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'']\\}};\n\\node (right2) at (10,5.0) [rectangle,draw] {\\{``grocery'': [``milk'']\\}};\n\\node (right3) at (10,2.5) [rectangle,draw] {\\{``grocery'': [``milk'', ``flour'']\\}};\n\\node (left4) at (0,0.0) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'', ``milk'', ``flour'']\\}};\n\\node (right4) at (10,0.0) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'', ``milk'', ``flour'']\\}};\n\\node (comms) at (5,1.4) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left] {doc.get(``grocery'') := [];} (left1);\n\\draw [thick,->] (right0) to node [right] {doc.get(``grocery'') := [];} (right1);\n\\draw [thick,->] (left1) -- (left2)\n node [left,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(0) .insertAfter(``eggs'');};\n\\draw [thick,->] (right1) -- (right2)\n node [right,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(0) .insertAfter(``milk'');};\n\\draw [thick,->] (left2) -- (left3)\n node [left,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(1) .insertAfter(``ham'');};\n\\draw [thick,->] (right2) -- (right3)\n node [right,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(1) .insertAfter(``flour'');};\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Two replicas concurrently create ordered lists under the same map key.}\\label{fig:two-lists}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,8.5);\n\\node (leftR) at (0,8) {Replica $p$:};\n\\node (rightR) at (8,8) {Replica $q$:};\n\\node (left1) at (0,7) [rectangle,draw] {[``a'', ``b'', ``c'']};\n\\node (left2) at (0,5) [rectangle,draw] {[``a'', ``c'']};\n\\node (left3) at (0,3) [rectangle,draw] {[``a'', ``x'', ``c'']};\n\\node (left4) at (0,0) [rectangle,draw] {[``y'', ``a'', ``x'', ``z'', ``c'']};\n\\node (right1) at (8,7) [rectangle,draw] {[``a'', ``b'', ``c'']};\n\\node (right2) at (8,5) [rectangle,draw] {[``y'', ``a'', ``b'', ``c'']};\n\\node (right3) at (8,3) [rectangle,draw] {[``y'', ``a'', ``z'', ``b'', ``c'']};\n\\node (right4) at (8,0) [rectangle,draw] {[``y'', ``a'', ``x'', ``z'', ``c'']};\n\\node (comms) at (4, 1.5) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left1) to node [left] {doc.idx(2).delete;} (left2);\n\\draw [thick,->] (left2) to node [left] {doc.idx(1).insertAfter(``x'');} (left3);\n\\draw [thick,->] (right1) to node [right] {doc.idx(0).insertAfter(``y'');} (right2);\n\\draw [thick,->] (right2) to node [right] {doc.idx(2).insertAfter(``z'');} (right3);\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Concurrent editing of an ordered list of characters (i.e., a text document).}\\label{fig:text-edit}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-1) -- (4,7.5);\n\\node (left1) at (0,7) [rectangle,draw] {\\{\\}};\n\\node (left2) at (0,5) [rectangle,draw] {\\{``a'': \\{\\}\\}};\n\\node (left3) at (0,3) [rectangle,draw] {\\{``a'': \\{``x'': ``y''\\}\\}};\n\\node [matrix] (left4) at (0,0) [rectangle,draw] {\n \\node {\\{mapT(``a''): \\{``x'': ``y''\\},}; \\\\\n \\node {listT(``a''): [``z'']\\}}; \\\\\n};\n\\node (right1) at (8,7) [rectangle,draw] {\\{\\}};\n\\node (right2) at (8,5) [rectangle,draw] {\\{``a'': []\\}};\n\\node (right3) at (8,3) [rectangle,draw] {\\{``a'': [``z'']\\}};\n\\node [matrix] (right4) at (8,0) [rectangle,draw] {\n \\node {\\{mapT(``a''): \\{``x'': ``y''\\},}; \\\\\n \\node {listT(``a''): [``z'']\\}}; \\\\\n};\n\\node (comms) at (4,2.0) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left1) to node [left] {doc.get(``a'') := \\{\\};} (left2);\n\\draw [thick,->] (left2) to node [left] {doc.get(``a'').get(``x'') := ``y'';} (left3);\n\\draw [thick,->] (right1) to node [right] {doc.get(``a'') := [];} (right2);\n\\draw [thick,->] (right2) to node [right] {doc.get(``a'').idx(0).insertAfter(``z'');} (right3);\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Concurrently assigning values of different types to the same map key.}\\label{fig:type-clash}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,7.0);\n\\node [matrix] (left0) at (0,6) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': false\\}]\\}}; \\\\\n};\n\\node [matrix] (right0) at (8,6) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': false\\}]\\}}; \\\\\n};\n\\node (left1) at (0,3) [rectangle,draw] {\\{``todo'': []\\}};\n\\node [matrix] (right1) at (8,3) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': true\\}]\\}}; \\\\\n};\n\\node (left2) at (0,0) [rectangle,draw] {\\{``todo'': [\\{``done'': true\\}]\\}};\n\\node (right2) at (8,0) [rectangle,draw] {\\{``todo'': [\\{``done'': true\\}]\\}};\n\\node (comms) at (4,1.6) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left] {doc.get(``todo'').idx(1).delete;} (left1);\n\\draw [thick,->] (right0) to node [right] {doc.get(``todo'').idx(1).get(``done'') := true;} (right1);\n\\draw [thick,->] (left1) to (left2);\n\\draw [thick,->] (right1) to (right2);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right2.north west);\n\\draw [thick,dashed,blue,->] (right1.south) to [out=270,in=45] (left2.north east);\n\\end{tikzpicture}\n\\caption{One replica removes a list element, while another concurrently updates its contents.}\\label{fig:todo-item}\n\\end{figure*}\n\nFigure~\\ref{fig:map-remove} gives an example of concurrent edits at different levels of the JSON tree. Here, replica $p$ adds ``red'' to a map of colors, while replica $q$ concurrently blanks out the entire map of colors and then adds ``green''. Instead of assigning an empty map, $q$ could equivalently remove the entire key ``colors'' from the outer map, and then assign a new empty map to that key. The difficulty in this example is that the addition of ``red'' occurs at a lower level of the tree, while concurrently the removal of the map of colors occurs at a higher level of the tree.\n\nOne possible way of handling such a conflict would be to let edits at higher levels of the tree always override concurrent edits within that subtree. In this case, that would mean the addition of ``red'' would be discarded, since it would be overridden by the blanking-out of the entire map of colors. However, that behavior would violate our requirement that no user input should be lost due to concurrent modifications. Instead, we define merge semantics that preserve all changes, as shown in Figure~\\ref{fig:map-remove}: ``blue'' must be absent from the final map, since it was removed by blanking out the map, while ``red'' and ``green'' must be present, since they were explicitly added. This behavior matches that of CRDT maps in Riak~\\cite{Brown:2014hs,Brown:2013wy}.\n\nFigure~\\ref{fig:two-lists} illustrates another problem with maps: two replicas can concurrently insert the same map key. Here, $p$ and $q$ each independently create a new shopping list under the same map key ``grocery'', and add items to the list. In the case of Figure~\\ref{fig:register-assign}, concurrent assignments to the same map key were left to be resolved by the application, but in Figure~\\ref{fig:two-lists}, both values are lists and so they can be merged automatically. We preserve the ordering and adjacency of items inserted at each replica, so ``ham'' appears after ``eggs'', and ``flour'' appears after ``milk'' in the merged result. There is no information on which replica's items should appear first in the merged result, so the algorithm can make an arbitrary choice between ``eggs, ham, milk, flour'' and ``milk, flour, eggs, ham'', provided that all replicas end up with the items in the same order.\n\nFigure~\\ref{fig:text-edit} shows how a collaborative text editor can be implemented, by treating the document as a list of characters. All changes are preserved in the merged result: ``y'' is inserted before ``a''; ``x'' and ``z'' are inserted between ``a'' and ``c''; and ``b'' is deleted.\n\nFigure~\\ref{fig:type-clash} demonstrates a variant of the situation in Figure~\\ref{fig:two-lists}, where two replicas concurrently insert the same map key, but they do so with different datatypes as values: $p$ inserts a nested map, whereas $q$ inserts a list. These datatypes cannot be meaningfully merged, so we preserve both values separately. We do this by tagging each map key with a type annotation (\\textsf{mapT}, \\textsf{listT}, or \\textsf{regT} for a map, list, or register value respectively), so each type inhabits a separate namespace.\n\nFinally, Figure~\\ref{fig:todo-item} shows a limitation of the principle of preserving all user input. In a to-do list application, one replica removes a to-do item from the list, while another replica concurrently marks the same item as done. As the changes are merged, the update of the map key ``done'' effectively causes the list item to be resurrected on replica $p$, leaving a to-do item without a title (since the title was deleted as part of deleting the list item). This behavior is consistent with the example in Figure~\\ref{fig:map-remove}, but it is perhaps surprising. In this case it may be more desirable to discard one of the concurrent updates, and thus preserve the implicit schema that a to-do item has both a ``title'' and a ``done'' field. We leave the analysis of developer expectations and the development of a schema language for future work.\n\n\\subsection{JSON Versus XML}\\label{sec:json-xml}\n\nThe most common alternative to JSON is XML, and collaborative editing of XML documents has been previously studied~\\cite{Davis:2002iv,Ignat:2003jy,Wang:2015vo}. Besides the superficial syntactical differences, the tree structure of XML and JSON appears quite similar. However, there is an important difference that we should highlight.\n\nJSON has two collection constructs that can be arbitrarily nested: maps for unordered key-value pairs, and lists for ordered sequences. In XML, the children of an element form an ordered sequence, while the attributes of an element are unordered key-value pairs. However, XML does not allow nested elements inside attributes -- the value of an attribute can only be a primitive datatype. Thus, XML supports maps within lists, but not lists within maps. In this regard, XML is less expressive than JSON: the scenarios in Figures~\\ref{fig:two-lists} and~\\ref{fig:type-clash} cannot occur in XML.\n\nSome applications may attach map-like semantics to the children of an XML document, for example by interpreting the child element name as key. However, this key-value structure is not part of XML itself, and would not be enforced by existing collaborative editing algorithms for XML. If multiple children with the same key are concurrently created, existing algorithms would create duplicate children with the same key rather than merging them like in Figure~\\ref{fig:two-lists}.\n\n\\subsection{Document Editing API}\\label{sec:editing-api}\n\n\\begin{figure}\n\\centering\n\\begin{tabular}{rcll}\nCMD & ::= & \\texttt{let} $x$ \\texttt{=} EXPR & $x \\in \\mathrm{VAR}$ \\\\\n& $|$ & $\\mathrm{EXPR}$ \\texttt{:=} $v$ & $v \\in \\mathrm{VAL}$ \\\\\n& $|$ & $\\mathrm{EXPR}$\\texttt{.insertAfter(}$v$\\texttt{)} & $v \\in \\mathrm{VAL}$ \\\\\n& $|$ & $\\mathrm{EXPR}$\\texttt{.delete} \\\\\n& $|$ & \\texttt{yield} \\\\\n& $|$ & CMD\\texttt{;} CMD \\vspace{0.5em}\\\\\nEXPR & ::= & \\texttt{doc} \\\\\n& $|$ & $x$ & $x \\in \\mathrm{VAR}$ \\\\\n& $|$ & EXPR\\texttt{.get(}$\\mathit{key}$\\texttt{)} & $\\mathit{key} \\in \\mathrm{String}$ \\\\\n& $|$ & EXPR\\texttt{.idx(}$i$\\texttt{)} & $i \\ge 0$ \\\\\n& $|$ & EXPR\\texttt{.keys} \\\\\n& $|$ & EXPR\\texttt{.values} \\vspace{0.5em}\\\\\nVAR & ::= & $x$ & $x \\in \\mathrm{VarString}$\\\\\nVAL & ::= & $n$ & $n \\in \\mathrm{Number}$ \\\\\n& $|$ & $\\mathit{str}$ & $\\mathit{str} \\in \\mathrm{String}$ \\\\\n& $|$ & \\texttt{true} $|$ \\texttt{false} $|$ \\texttt{null} \\\\\n& $|$ & \\verb|{}| $|$ \\verb|[]|\n\\end{tabular}\n\\caption{Syntax of command language for querying and modifying a document.}\\label{fig:local-syntax}\n\\end{figure}\n\n\\begin{figure}\n\\centering\n\\begin{verbatim}\ndoc := {};\ndoc.get(\"shopping\") := [];\nlet head = doc.get(\"shopping\").idx(0);\nhead.insertAfter(\"eggs\");\nlet eggs = doc.get(\"shopping\").idx(1);\nhead.insertAfter(\"cheese\");\neggs.insertAfter(\"milk\");\n\n// Final state:\n{\"shopping\": [\"cheese\", \"eggs\", \"milk\"]}\n\\end{verbatim}\n\\caption{Example of programmatically constructing a JSON document.}\\label{fig:make-doc}\n\\end{figure}\n\nTo define the semantics for collaboratively editable data structures, we first define a simple command language that is executed locally at any of the replicas, and which allows that replica's local copy of the document to be queried and modified. Performing read-only queries has no side-effects, but modifying the document has the effect of producing \\emph{operations} describing the mutation. Those operations are immediately applied to the local copy of the document, and also enqueued for asynchronous broadcasting to other replicas.\n\nThe syntax of the command language is given in Figure~\\ref{fig:local-syntax}. It is not a full programming language, but rather an API through which the document state is queried and modified. We assume that the program accepts user input and issues a (possibly infinite) sequence of commands to the API. We model only the semantics of those commands, and do not assume anything about the program in which the command language is embedded. The API differs slightly from the JSON libraries found in many programming languages, in order to allow us to define consistent merge semantics.\n\nWe first explain the language informally, before giving its formal semantics. The expression construct EXPR is used to construct a \\emph{cursor} which identifies a position in the document. An expression starts with either the special token \\texttt{doc}, identifying the root of the JSON document tree, or a variable $x$ that was previously defined in a \\texttt{let} command. The expression defines, left to right, the path the cursor takes as it navigates through the tree towards the leaves: the operator \\texttt{.get(}$\\mathit{key}$\\texttt{)} selects a key within a map, and \\texttt{.idx(}$n$\\texttt{)} selects the $n$th element of an ordered list. Lists are indexed starting from 1, and \\texttt{.idx(0)} is a special cursor indicating the head of a list (a virtual position before the first list element).\n\nThe expression construct EXPR can also query the state of the document: \\texttt{keys} returns the set of keys in the map at the current cursor, and \\texttt{values} returns the contents of the multi-value register at the current cursor. (\\texttt{values} is not defined if the cursor refers to a map or list.)\n\nA command CMD either sets the value of a local variable (\\texttt{let}), performs network communication (\\texttt{yield}), or modifies the document. A document can be modified by writing to a register (the operator \\texttt{:=} assigns the value of the register identified by the cursor), by inserting an element into a list (\\texttt{insertAfter} places a new element after the existing list element identified by the cursor, and \\texttt{.idx(0).insertAfter} inserts at the head of a list), or by deleting an element from a list or a map (\\texttt{delete} removes the element identified by the cursor).\n\nFigure~\\ref{fig:make-doc} shows an example sequence of commands that constructs a new document representing a shopping list. First \\texttt{doc} is set to \\verb|{}|, the empty map literal, and then the key \\verb|\"shopping\"| within that map is set to the empty list \\verb|[]|. The third line navigates to the key \\verb|\"shopping\"| and selects the head of the list, placing the cursor in a variable called \\texttt{head}. The list element ``eggs'' is inserted at the head of the list. In line 5, the variable \\texttt{eggs} is set to a cursor pointing at the list element ``eggs''. Then two more list elements are inserted: ``cheese'' at the head, and ``milk'' after ``eggs''.\n\nNote that the cursor \\texttt{eggs} identifies the list element by identity, not by its index: after the insertion of ``cheese'', the element ``eggs'' moves from index 1 to 2, but ``milk'' is nevertheless inserted after ``eggs''. As we shall see later, this feature is helpful for achieving desirable semantics in the presence of concurrent modifications.\n\n\n\\begin{figure*}\n\\begin{center}\n\\AxiomC{$\\mathit{cmd}_1 \\mathbin{:} \\mathrm{CMD}$}\n\\AxiomC{$A_p,\\, \\mathit{cmd}_1 \\evalto A_p'$}\n\\LeftLabel{\\textsc{Exec}}\n\\BinaryInfC{$A_p,\\, \\langle \\mathit{cmd}_1 \\mathbin{;} \\mathit{cmd}_2 \\mathbin{;} \\dots \\rangle\n \\evalto A_p',\\, \\langle \\mathit{cmd}_2 \\mathbin{;} \\dots \\rangle$}\n\\DisplayProof\\hspace{4em}\n%\n\\AxiomC{}\n\\LeftLabel{\\textsc{Doc}}\n\\UnaryInfC{$A_p,\\, \\mathsf{doc} \\evalto \\mathsf{cursor}(\\langle\\rangle,\\, \\mathsf{doc})$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\n\n\\begin{center}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\LeftLabel{\\textsc{Let}}\n\\UnaryInfC{$A_p,\\, \\mathsf{let}\\; x = \\mathit{expr} \\evalto A_p[\\,x \\,\\mapsto\\, \\mathit{cur}\\,]$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$x \\in \\mathrm{dom}(A_p)$}\n\\LeftLabel{\\textsc{Var}}\n\\UnaryInfC{$A_p,\\, x \\evalto A_p(x)$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$}\n\\AxiomC{$k_n \\not= \\mathsf{head}$}\n\\LeftLabel{\\textsc{Get}}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{get}(\\mathit{key}) \\evalto\n \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1}, \\mathsf{mapT}(k_n) \\rangle,\\, \\mathit{key})$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$}\n\\AxiomC{$A_p,\\, \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1}, \\mathsf{listT}(k_n) \\rangle,\\,\n \\mathsf{head}).\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\LeftLabel{$\\textsc{Idx}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{idx}(i)\n \\evalto \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n')$}\n\\LeftLabel{$\\textsc{Idx}_2$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{idx}(i)\n \\evalto \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n')$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i>0 \\,\\wedge\\, \\mathit{ctx}(\\mathsf{next}(k)) = k' \\,\\wedge\\, k' \\not= \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{pres}(k')) \\not= \\{\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k').\\mathsf{idx}(i-1) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Idx}_3$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i>0 \\,\\wedge\\, \\mathit{ctx}(\\mathsf{next}(k)) = k' \\,\\wedge\\, k' \\not= \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{pres}(k')) = \\{\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k').\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\LeftLabel{$\\textsc{Idx}_4$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i=0$}\n\\LeftLabel{$\\textsc{Idx}_5$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto\n \\mathsf{cursor}(\\langle\\rangle,\\, k)$}\n\\end{prooftree}\n\n\\[ \\mathrm{keys}(\\mathit{ctx}) = \\{\\; k \\mid\n \\mathsf{mapT}(k) \\in \\mathrm{dom}(\\mathit{ctx}) \\,\\vee\\,\n \\mathsf{listT}(k) \\in \\mathrm{dom}(\\mathit{ctx}) \\,\\vee\\,\n \\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})\n\\;\\} \\]\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathit{cur}.\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\LeftLabel{$\\textsc{Keys}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{map} = \\mathit{ctx}(\\mathsf{mapT}(k))$}\n\\AxiomC{$\\mathit{keys} = \\{\\; k \\mid k \\in \\mathrm{keys}(\\mathit{map}) \\,\\wedge\\,\n \\mathit{map}(\\mathsf{pres}(k)) \\not= \\{\\} \\;\\}$}\n\\LeftLabel{$\\textsc{Keys}_2$}\n\\BinaryInfC{$A_p,\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{keys}\n \\evalto \\mathit{keys}$}\n\\LeftLabel{$\\textsc{Keys}_3$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{keys}\n \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathit{cur}.\\mathsf{values} \\evalto \\mathit{val}$}\n\\LeftLabel{$\\textsc{Val}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{values} \\evalto \\mathit{val}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{val} = \\mathrm{range}(\\mathit{ctx}(\\mathsf{regT}(k)))$}\n\\LeftLabel{$\\textsc{Val}_2$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{values} \\evalto \\mathit{val}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{values}\n \\evalto \\mathit{val}$}\n\\LeftLabel{$\\textsc{Val}_3$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{values}\n \\evalto \\mathit{val}$}\n\\end{prooftree}\n\\caption{Rules for evaluating expressions.}\\label{fig:expr-rules}\n\\end{figure*}\n\n\\section{Formal Semantics}\\label{sec:semantics}\n\nWe now explain formally how to achieve the concurrent semantics outlined in Section~\\ref{sec:composing}. The state of replica $p$ is described by $A_p$, a finite partial function. The evaluation rules of the command language inspect and modify this local state $A_p$, and they do not depend on $A_q$ (the state of any other replica $q \\neq p$). The only communication between replicas occurs in the evaluation of the \\textsf{yield} command, which we discuss later. For now, we concentrate on the execution of commands at a single replica $p$.\n\n\\subsection{Expression Evaluation}\n\nFigure~\\ref{fig:expr-rules} gives the rules for evaluating EXPR expressions in the command language, which are evaluated in the context of the local replica state $A_p$. The \\textsc{Exec} rule formalizes the assumption that commands are executed sequentially. The \\textsc{Let} rule allows the program to define a local variable, which is added to the local state (the notation $A_p[\\,x \\,\\mapsto\\, \\mathit{cur}\\,]$ denotes a partial function that is the same as $A_p$, except that $A_p(x) = \\mathit{cur}$). The corresponding \\textsc{Var} rule allows the program to retrieve the value of a previously defined variable.\n\nThe following rules in Figure~\\ref{fig:expr-rules} show how an expression is evaluated to a cursor, which unambiguously identifies a particular position in a JSON document by describing a path from the root of the document tree to some branch or leaf node. A cursor consists only of immutable keys and identifiers, so it can be sent over the network to another replica, where it can be used to locate the same position in the document.\n\nFor example,\n\\[ \\mathsf{cursor}(\\langle \\mathsf{mapT}(\\mathsf{doc}), \\mathsf{listT}(\\text{``shopping''}) \\rangle,\\, \\mathit{id}_1) \\]\nis a cursor representing the list element \\verb|\"eggs\"| in Figure~\\ref{fig:make-doc}, assuming that $\\mathit{id}_1$ is the unique identifier of the operation that inserted this list element (we will discuss these identifiers in Section~\\ref{sec:lamport-ts}). The cursor can be interpreted as a path through the local replica state structure $A_p$, read from left to right: starting from the \\textsf{doc} map at the root, it traverses through the map entry ``shopping'' of type \\textsf{listT}, and finishes with the list element that has identifier $\\mathit{id}_1$.\n\nIn general, $\\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$ consists of a (possibly empty) vector of keys $\\langle k_1, \\dots, k_{n-1} \\rangle$, and a final key $k_n$ which is always present. $k_n$ can be thought of as the final element of the vector, with the distinction that it is not tagged with a datatype, whereas the elements of the vector are tagged with the datatype of the branch node being traversed, either \\textsf{mapT} or \\textsf{listT}.\n\nThe \\textsc{Doc} rule in Figure~\\ref{fig:expr-rules} defines the simplest cursor $\\mathsf{cursor}(\\langle\\rangle,\\, \\mathsf{doc})$, referencing the root of the document using the special atom \\textsf{doc}. The \\textsc{Get} rule navigates a cursor to a particular key within a map. For example, the expression \\verb|doc.get(\"shopping\")| evaluates to $\\mathsf{cursor}(\\langle \\mathsf{mapT}(\\mathsf{doc}) \\rangle,\\, \\text{``shopping''})$ by applying the \\textsc{Doc} and \\textsc{Get} rules. Note that the expression \\verb|doc.get(...)| implicitly asserts that \\textsf{doc} is of type \\textsf{mapT}, and this assertion is encoded in the cursor.\n\nThe rules $\\textsc{Idx}_{1 \\dots 5}$ define how to evaluate the expression \\verb|.idx(|$n$\\verb|)|, moving the cursor to a particular element of a list. $\\textsc{Idx}_1$ constructs a cursor representing the head of the list, and delegates to the subsequent rules to scan over the list. $\\textsc{Idx}_2$ recursively descends the local state according to the vector of keys in the cursor. When the vector of keys is empty, the context $\\mathit{ctx}$ is the subtree of $A_p$ that stores the list in question, and the rules $\\textsc{Idx}_{3,4,5}$ iterate over that list until the desired element is found.\n\n$\\textsc{Idx}_5$ terminates the iteration when the index reaches zero, while $\\textsc{Idx}_3$ moves to the next element and decrements the index, and $\\textsc{Idx}_4$ skips over list elements that are marked as deleted. The structure resembles a linked list: each list element has a unique identifier $k$, and the partial function representing local state maps $\\mathsf{next}(k)$ to the ID of the list element that follows $k$.\n\nDeleted elements are never removed from the linked list structure, but only marked as deleted (they become so-called \\emph{tombstones}). To this end, the local state maintains a \\emph{presence set} $\\mathsf{pres}(k)$ for the list element with ID $k$, which is the set of all operations that have asserted the existence of this list element. When a list element is deleted, the presence set is set to the empty set, which marks it as deleted; however, a concurrent operation that references the list element can cause the presence set to be come non-empty again (leading to the situations in Figures~\\ref{fig:map-remove} and~\\ref{fig:todo-item}). Rule $\\textsc{Idx}_4$ handles list elements with an empty presence set by moving to the next list element without decrementing the index (i.e., not counting them as list elements).\n\nThe $\\textsc{Keys}_{1,2,3}$ rules allow the application to inspect the set of keys in a map. This set is determined by examining the local state, and excluding any keys for which the presence set is empty (indicating that the key has been deleted).\n\nFinally, the $\\textsc{Val}_{1,2,3}$ rules allow the application to read the contents of a register at a particular cursor position, using a similar recursive rule structure as the \\textsc{Idx} rules. A register is expressed using the \\textsf{regT} type annotation in the local state. Although a replica can only assign a single value to a register, a register can nevertheless contain multiple values if multiple replicas concurrently assign values to it.\n\n\\subsection{Generating Operations}\n\nWhen commands mutate the state of the document, they generate \\emph{operations} that describe the mutation. In our semantics, a command never directly modifies the local replica state $A_p$, but only generates an operation. That operation is then immediately applied to $A_p$ so that it takes effect locally, and the same operation is also asynchronously broadcast to the other replicas.\n\n\\subsubsection{Lamport Timestamps}\\label{sec:lamport-ts}\n\nEvery operation in our model is given a unique identifier, which is used in the local state and in cursors. Whenever an element is inserted into a list, or a value is assigned to a register, the new list element or register value is identified by the identifier of the operation that created it.\n\nIn order to generate globally unique operation identifiers without requiring synchronous coordination between replicas we use Lamport timestamps~\\cite{Lamport:1978jq}. A Lamport timestamp is a pair $(c, p)$ where $p \\in \\mathrm{ReplicaID}$ is the unique identifier of the replica on which the edit is made (for example, a hash of its public key), and $c \\in \\mathbb{N}$ is a counter that is stored at each replica and incremented for every operation. Since each replica generates a strictly monotonically increasing sequence of counter values $c$, the pair $(c, p)$ is unique.\n\nIf a replica receives an operation with a counter value $c$ that is greater than the locally stored counter value, the local counter is increased to the value of the incoming counter. This ensures that if operation $o_1$ causally happened before $o_2$ (that is, the replica that generated $o_2$ had received and processed $o_1$ before $o_2$ was generated), then $o_2$ must have a greater counter value than $o_1$. Only concurrent operations can have equal counter values.\n\nWe can thus define a total ordering $<$ for Lamport timestamps:\n\\[ (c_1, p_1) < (c_2, p_2) \\;\\text{ iff }\\; (c_1 < c_2) \\vee (c_1 = c_2 \\wedge p_1 < p_2). \\]\nIf one operation happened before another, this ordering is consistent with causality (the earlier operation has a lower timestamp). If two operations are concurrent, their order according to $<$ is arbitrary but deterministic. This ordering property is important for our definition of the semantics of ordered lists.\n\n\\subsubsection{Operation Structure}\n\nAn operation is a tuple of the form\n\\begin{alignat*}{3}\n& \\mathsf{op}( \\\\\n&& \\mathit{id} &: \\mathbb{N} \\times \\mathrm{ReplicaID}, \\\\\n&& \\mathit{deps} &: \\mathcal{P}(\\mathbb{N} \\times \\mathrm{ReplicaID}), \\\\\n&& \\mathit{cur} &: \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n), \\\\\n&& \\mathit{mut} &: \\mathsf{insert}(v) \\mid \\mathsf{delete} \\mid \\mathsf{assign}(v) && \\quad v: \\mathrm{VAL} \\\\\n& )\n\\end{alignat*}\nwhere $\\mathit{id}$ is the Lamport timestamp that uniquely identifies the operation, $\\mathit{cur}$ is the cursor describing the position in the document being modified, and $\\mathit{mut}$ is the mutation that was requested at the specified position.\n\n$\\mathit{deps}$ is the set of \\emph{causal dependencies} of the operation. It is defined as follows: if operation $o_2$ was generated by replica $p$, then a causal dependency of $o_2$ is any operation $o_1$ that had already been applied on $p$ at the time when $o_2$ was generated. In this paper, we define $\\mathit{deps}$ as the set of Lamport timestamps of all causal dependencies. In a real implementation, this set would become impracticably large, so a compact representation of causal history would be used instead -- for example, version vectors~\\cite{ParkerJr:1983jb}, state vectors~\\cite{Ellis:1989ue}, or dotted version vectors~\\cite{Preguica:2012fx}. However, to avoid ambiguity in our semantics we give the dependencies as a simple set of operation IDs.\n\nThe purpose of the causal dependencies $\\mathit{deps}$ is to impose a partial ordering on operations: an operation can only be applied after all operations that ``happened before'' it have been applied. In particular, this means that the sequence of operations generated at one particular replica will be applied in the same order at every other replica. Operations that are concurrent (i.e., where there is no causal dependency in either direction) can be applied in any order.\n\n\\subsubsection{Semantics of Generating Operations}\n\n\\begin{figure*}\n\\centering\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$\\mathit{val}: \\mathrm{VAL}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{assign}(\\mathit{val})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Assign}}\n\\TrinaryInfC{$A_p,\\, \\mathit{expr} \\,\\text{ := }\\, \\mathit{val} \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$\\mathit{val}: \\mathrm{VAL}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{insert}(\\mathit{val})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Insert}}\n\\TrinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{insertAfter}(\\mathit{val}) \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{delete}) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Delete}}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{delete} \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctr} = \\mathrm{max}(\\{0\\} \\,\\cup\\, \\{ c_i \\mid (c_i, p_i) \\in A_p(\\mathsf{ops}) \\}$}\n\\AxiomC{$A_p,\\, \\mathsf{apply}(\\mathsf{op}((\\mathit{ctr} + 1, p), A_p(\\mathsf{ops}),\n \\mathit{cur}, \\mathit{mut})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Op}}\n\\BinaryInfC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathit{mut}) \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{op} \\evalto A_p'$}\n\\LeftLabel{\\textsc{Apply-Local}}\n\\UnaryInfC{$A_p,\\, \\mathsf{apply}(\\mathit{op}) \\evalto A_p'[\\,\n \\mathsf{queue} \\,\\mapsto\\, A_p'(\\mathsf{queue}) \\,\\cup\\, \\{\\mathit{op}\\},\\;\n \\mathsf{ops} \\,\\mapsto\\, A_p'(\\mathsf{ops}) \\,\\cup\\, \\{\\mathit{op.id}\\}\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{op} \\in A_p(\\mathsf{recv})$}\n\\AxiomC{$\\mathit{op.id} \\notin A_p(\\mathsf{ops})$}\n\\AxiomC{$\\mathit{op.deps} \\subseteq A_p(\\mathsf{ops})$}\n\\AxiomC{$A_p,\\, \\mathit{op} \\evalto A_p'$}\n\\LeftLabel{\\textsc{Apply-Remote}}\n\\QuaternaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p'[\\,\\mathsf{ops} \\,\\mapsto\\, A_p'(\\mathsf{ops}) \\,\\cup\\, \\{\\mathit{op.id}\\}\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{}\n\\LeftLabel{\\textsc{Send}}\n\\UnaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p[\\,\\mathsf{send} \\,\\mapsto\\, A_p(\\mathsf{send}) \\,\\cup\\, A_p(\\mathsf{queue})\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$q: \\mathrm{ReplicaID}$}\n\\LeftLabel{\\textsc{Recv}}\n\\UnaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p[\\,\\mathsf{recv} \\,\\mapsto\\, A_p(\\mathsf{recv}) \\,\\cup\\, A_q(\\mathsf{send})\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathsf{yield} \\evalto A_p'$}\n\\AxiomC{$A_p',\\, \\mathsf{yield} \\evalto A_p''$}\n\\LeftLabel{\\textsc{Yield}}\n\\BinaryInfC{$A_p,\\, \\mathsf{yield} \\evalto A_p''$}\n\\end{prooftree}\n\\caption{Rules for generating, sending, and receiving operations.}\n\\label{fig:send-recv}\n\\end{figure*}\n\nThe evaluation rules for commands are given in Figure~\\ref{fig:send-recv}. The \\textsc{Make-Assign}, \\textsc{Make-Insert} and \\textsc{Make-Delete} rules define how these respective commands mutate the document: all three delegate to the \\textsc{Make-Op} rule to generate and apply the operation. \\textsc{Make-Op} generates a new Lamport timestamp by choosing a counter value that is 1 greater than any existing counter in $A_p(\\mathsf{ops})$, the set of all operation IDs that have been applied to replica $p$.\n\n\\textsc{Make-Op} constructs an \\textsf{op()} tuple of the form described above, and delegates to the \\textsc{Apply-Local} rule to process the operation. \\textsc{Apply-Local} does three things: it evaluates the operation to produce a modified local state $A_p'$, it adds the operation to the queue of generated operations $A_p(\\mathsf{queue})$, and it adds the ID to the set of processed operations $A_p(\\mathsf{ops})$.\n\nThe \\textsf{yield} command, inspired by Burckhardt et al.~\\cite{Burckhardt:2012jy}, performs network communication: sending and receiving operations to and from other replicas, and applying operations from remote replicas. The rules \\textsc{Apply-Remote}, \\textsc{Send}, \\textsc{Recv} and \\textsc{Yield} define the semantics of \\textsf{yield}. Since any of these rules can be used to evaluate \\textsf{yield}, their effect is nondeterministic, which models the asynchronicity of the network: a message sent by one replica arrives at another replica at some arbitrarily later point in time, and there is no message ordering guarantee in the network.\n\nThe \\textsc{Send} rule takes any operations that were placed in $A_p(\\mathsf{queue})$ by \\textsc{Apply-Local} and adds them to a send buffer $A_p(\\mathsf{send})$. Correspondingly, the \\textsc{Recv} rule takes operations in the send buffer of replica $q$ and adds them to the receive buffer $A_p(\\mathsf{recv})$ of replica $p$. This is the only rule that involves more than one replica, and it models all network communication.\n\nOnce an operation appears in the receive buffer $A_p(\\mathsf{recv})$, the rule \\textsc{Apply-Remote} may apply. Under the preconditions that the operation has not already been processed and that its causal dependencies are satisfied, \\textsc{Apply-Remote} applies the operation in the same way as \\textsc{Apply-Local}, and adds its ID to the set of processed operations $A_p(\\mathsf{ops})$.\n\nThe actual document modifications are performed by applying the operations, which we discuss next.\n\n\\subsection{Applying Operations}\n\n\\begin{sidewaysfigure*}\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, k_1 \\evalto \\mathit{child}$}\n\\AxiomC{$\\mathit{child},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n), \\mathit{mut}) \\evalto \\mathit{child}'$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{addId}(k_1, \\mathit{id}, \\mathit{mut}) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{\\textsc{Descend}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n), \\mathit{mut}) \\evalto\n \\mathit{ctx}' [\\, k_1 \\,\\mapsto\\, \\mathit{child}' \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$k \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Get}}\n\\UnaryInfC{$\\mathit{ctx},\\, k \\evalto \\mathit{ctx}(k)$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{mapT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Map}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{mapT}(k) \\evalto \\{\\}$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{listT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-List}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{listT}(k) \\evalto\n \\{\\,\\mathsf{next}(\\mathsf{head}) \\,\\mapsto\\, \\mathsf{tail} \\,\\}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$\\mathsf{regT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Reg}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{regT}(k) \\evalto \\{\\}$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{pres}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Presence}_1$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\mathit{ctx}(\\mathsf{pres}(k))$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{pres}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Presence}_2$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\{\\}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$\\mathit{mut} \\not= \\mathsf{delete}$}\n\\AxiomC{$k_\\mathit{tag} \\in \\{\\mathsf{mapT}(k), \\mathsf{listT}(k), \\mathsf{regT}(k)\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Add-ID}_1$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{addId}(k_\\mathit{tag}, \\mathit{id}, \\mathit{mut}) \\evalto\n \\mathit{ctx}[\\, \\mathsf{pres}(k) \\,\\mapsto\\, \\mathit{pres} \\,\\cup\\, \\{\\mathit{id}\\} \\,]$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathit{mut} = \\mathsf{delete}$}\n\\LeftLabel{$\\textsc{Add-ID}_2$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{addId}(k_\\mathit{tag}, \\mathit{id}, \\mathit{mut}) \\evalto \\mathit{ctx}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} \\not= \\texttt{[]} \\,\\wedge\\, \\mathit{val} \\not= \\texttt{\\string{\\string}}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{regT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{regT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Assign}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{regT}(k) \\,\\mapsto\\,\n \\mathit{child}[\\, \\mathit{id} \\,\\mapsto\\, \\mathit{val} \\,]\\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} = \\texttt{\\string{\\string}}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{mapT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{mapT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Empty-Map}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{mapT}(k) \\,\\mapsto\\, \\mathit{child} \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} = \\texttt{[]}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{listT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{listT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Empty-List}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{listT}(k) \\,\\mapsto\\, \\mathit{child} \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{next}(\\mathit{prev})) = \\mathit{next}$}\n\\AxiomC{$\\mathit{next} < \\mathit{id} \\,\\vee\\, \\mathit{next} = \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{id}), \\mathsf{assign}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Insert}_1$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{prev}), \\mathsf{insert}(\\mathit{val})) \\evalto\n \\mathit{ctx}'[\\,\\mathsf{next}(\\mathit{prev}) \\,\\mapsto\\, \\mathit{id},\\;\n \\mathsf{next}(\\mathit{id}) \\,\\mapsto\\, \\mathit{next}\\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{next}(\\mathit{prev})) = \\mathit{next}$}\n\\AxiomC{$\\mathit{id} < \\mathit{next}$}\n\\AxiomC{$ctx,\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{next}), \\mathsf{insert}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Insert}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{prev}), \\mathsf{insert}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\\caption{Rules for applying insertion and assignment operations to update the state of a replica.}\\label{fig:operation-rules}\n\\end{sidewaysfigure*}\n\nFigure~\\ref{fig:operation-rules} gives the rules that apply an operation $\\mathsf{op}$ to a context $\\mathit{ctx}$, producing an updated context $\\mathit{ctx}'$. The context is initially the replica state $A_p$, but may refer to subtrees of the state as rules are recursively applied. These rules are used by \\textsc{Apply-Local} and \\textsc{Apply-Remote} to perform the state updates on a document.\n\nWhen the operation cursor's vector of keys is non-empty, the \\textsc{Descend} rule first applies. It recursively descends the document tree by following the path described by the keys. If the tree node already exists in the local replica state, \\textsc{Child-Get} finds it, otherwise \\textsc{Child-Map} and \\textsc{Child-List} create an empty map or list respectively.\n\nThe \\textsc{Descend} rule also invokes $\\textsc{Add-ID}_{1,2}$ at each tree node along the path described by the cursor, adding the operation ID to the presence set $\\mathsf{pres}(k)$ to indicate that the subtree includes a mutation made by this operation.\n\nThe remaining rules in Figure~\\ref{fig:operation-rules} apply when the vector of keys in the cursor is empty, which is the case when descended to the context of the tree node to which the mutation applies. The \\textsc{Assign} rule handles assignment of a primitive value to a register, \\textsc{Empty-Map} handles assignment where the value is the empty map literal \\verb|{}|, and \\textsc{Empty-List} handles assignment of the empty list \\verb|[]|. These three rules for \\textsf{assign} have a similar structure: first clearing the prior value at the cursor (as discussed in the next section), then adding the operation ID to the presence set, and finally incorporating the new value into the tree of local state.\n\nThe $\\textsc{Insert}_{1,2}$ rules handle insertion of a new element into an ordered list. In this case, the cursor refers to the list element $\\mathit{prev}$, and the new element is inserted after that position in the list. $\\textsc{Insert}_1$ performs the insertion by manipulating the linked list structure. $\\textsc{Insert}_2$ handles the case of multiple replicas concurrently inserting list elements at the same position, and uses the ordering relation $<$ on Lamport timestamps to consistently determine the insertion point. Our approach for handling insertions is based on the RGA algorithm~\\cite{Roh:2011dw}. We show later that these rules ensure all replicas converge towards the same state.\n\n\\subsubsection{Clearing Prior State}\n\n\\begin{figure*}\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\LeftLabel{\\textsc{Delete}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{delete}) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearAny}(\\mathit{deps}, k) \\evalto \\mathit{ctx}', \\mathit{pres}_1$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{pres}(k) \\evalto \\mathit{pres}_2$}\n\\AxiomC{$\\mathit{pres}_3 = \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2 \\setminus \\mathit{deps}$}\n\\LeftLabel{\\textsc{Clear-Elem}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}' [\\, \\mathsf{pres}(k) \\,\\mapsto\\, \\mathit{pres}_3 \\,],\\, \\mathit{pres}_3$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{mapT}(k)) \\\\\n \\evalto \\mathit{ctx}_1,\\, \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}_1,\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{listT}(k)) \\\\\n \\evalto \\mathit{ctx}_2,\\, \\mathit{pres}_2 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}_2,\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\\\\n \\evalto \\mathit{ctx}_3,\\, \\mathit{pres}_3 \\end{matrix}$}\n\\LeftLabel{\\textsc{Clear-Any}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearAny}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}_3,\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2 \\,\\cup\\, \\mathit{pres}_3$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Clear-None}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, k) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{concurrent} = \\{ \\mathit{id} \\mapsto v \\mid\n (\\mathit{id} \\mapsto v) \\in \\mathit{ctx}(\\mathsf{regT}(k))\n \\,\\wedge\\, \\mathit{id} \\notin \\mathit{deps} \\}$}\n\\LeftLabel{\\textsc{Clear-Reg}}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\evalto\n \\mathit{ctx}[\\, \\mathsf{regT}(k) \\,\\mapsto\\, \\mathit{concurrent} \\,],\\, \\mathrm{dom}(\\mathit{concurrent})$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{mapT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{mapT}(k)),\\, \\mathsf{clearMap}(\\mathit{deps}, \\{\\}) \\evalto\n \\mathit{cleared},\\, \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Clear-Map}_1$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{mapT}(k)) \\evalto\n \\mathit{ctx} [\\, \\mathsf{mapT}(k) \\,\\mapsto\\, \\mathit{cleared} \\,],\\, \\mathit{pres}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n k \\in \\mathrm{keys}(\\mathit{ctx}) \\\\\n \\wedge\\, k \\notin \\mathit{done} \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\\\\n \\evalto \\mathit{ctx}', \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}',\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done} \\cup \\{k\\}) \\\\\n \\evalto \\mathit{ctx}'',\\, \\mathit{pres}_2 \\end{matrix}$}\n\\LeftLabel{$\\textsc{Clear-Map}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done})\n \\evalto \\mathit{ctx}'',\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{done} = \\mathrm{keys}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Clear-Map}_3$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done}) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{listT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{listT}(k)),\\, \\mathsf{clearList}(\\mathit{deps}, \\mathsf{head})\n \\evalto \\mathit{cleared},\\, \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Clear-List}_1$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{listT}(k)) \\evalto\n \\mathit{ctx}[\\, \\mathsf{listT}(k) \\,\\mapsto\\, \\mathit{cleared} \\,],\\, \\mathit{pres}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n k \\not= \\mathsf{tail} \\,\\wedge\\\\\n \\mathit{ctx}(\\mathsf{next}(k)) = \\mathit{next} \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\\\\n \\evalto \\mathit{ctx}', \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}',\\, \\mathsf{clearList}(\\mathit{deps}, \\mathit{next}) \\\\\n \\evalto \\mathit{ctx}'', \\mathit{pres}_2 \\end{matrix}$}\n\\LeftLabel{$\\textsc{Clear-List}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearList}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}'',\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k = \\mathsf{tail}$}\n\\LeftLabel{$\\textsc{Clear-List}_3$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clearList}(\\mathit{deps}, k) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\\caption{Rules for applying deletion operations to update the state of a replica.}\\label{fig:clear-rules}\n\\end{figure*}\n\nAssignment and deletion operations require that prior state (the value being overwritten or deleted) is cleared, while also ensuring that concurrent modifications are not lost, as illustrated in Figure~\\ref{fig:map-remove}. The rules to handle this clearing process are given in Figure~\\ref{fig:clear-rules}. Intuitively, the effect of clearing something is to reset it to its empty state by undoing any operations that causally precede the current operation, while leaving the effect of any concurrent operations untouched.\n\nA \\textsf{delete} operation can be used to delete either an element from an ordered list or a key from a map, depending on what the cursor refers to. The \\textsc{Delete} rule shows how this operation is evaluated by delegating to \\textsc{Clear-Elem}. In turn, \\textsc{Clear-Elem} uses \\textsc{Clear-Any} to clear out any data with a given key, regardless of whether it is of type \\textsf{mapT}, \\textsf{listT} or \\textsf{regT}, and also updates the presence set to include any nested operation IDs, but exclude any operations in $\\mathit{deps}$.\n\nThe premises of \\textsc{Clear-Any} are satisfied by $\\textsc{Clear-Map}_1$, $\\textsc{Clear-List}_1$ and \\textsc{Clear-Reg} if the respective key appears in $\\mathit{ctx}$, or by \\textsc{Clear-None} (which does nothing) if the key is absent.\n\nAs defined by the \\textsc{Assign} rule, a register maintains a mapping from operation IDs to values. \\textsc{Clear-Reg} updates a register by removing all operation IDs that appear in $\\mathit{deps}$ (i.e., which causally precede the clearing operation), but retaining all operation IDs that do not appear in $\\mathit{deps}$ (from assignment operations that are concurrent with the clearing operation).\n\nClearing maps and lists takes a similar approach: each element of the map or list is recursively cleared using \\textsf{clearElem}, and presence sets are updated to exclude $\\mathit{deps}$. Thus, any list elements or map entries whose modifications causally precede the clearing operation will end up with empty presence sets, and thus be considered deleted. Any map or list elements containing operations that are concurrent with the clearing operation are preserved.\n\n\\subsection{Convergence}\\label{sec:convergence}\n\nAs outlined in Section~\\ref{sec:intro-replication}, we require that all replicas automatically converge towards the same state -- a key requirement of a CRDT. We now formalize this notion, and show that the rules in Figures~\\ref{fig:expr-rules} to~\\ref{fig:clear-rules} satisfy this requirement.\n\n\\begin{definition}[valid execution]\\label{def:valid-exec}\nA \\emph{valid execution} is a set of operations generated by a set of replicas $\\{p_1, \\dots, p_k\\}$, each reducing a sequence of commands $\\langle \\mathit{cmd}_1 \\mathbin{;} \\dots \\mathbin{;} \\mathit{cmd}_n \\rangle$ without getting stuck.\n\\end{definition}\n\nA reduction gets stuck if there is no application of rules in which all premises are satisfied. For example, the $\\textsc{Idx}_{3,4}$ rules in Figure~\\ref{fig:expr-rules} get stuck if $\\mathsf{idx}(n)$ tries to iterate past the end of a list, which would happen if $n$ is greater than the number of non-deleted elements in the list; in a real implementation this would be a runtime error. By constraining valid executions to those that do not get stuck, we ensure that operations only refer to list elements that actually exist.\n\nNote that it is valid for an execution to never perform any network communication, either because it never invokes the \\textsf{yield} command, or because the nondeterministic execution of \\textsf{yield} never applies the \\textsc{Recv} rule. We need only a replica's local state to determine whether reduction gets stuck.\n\n\\begin{definition}[history]\\label{def:history}\nA \\emph{history} is a sequence of operations in the order it was applied at one particular replica $p$ by application of the rules \\textsc{Apply-Local} and \\textsc{Apply-Remote}.\n\\end{definition}\n\nSince the evaluation rules sequentially apply one operation at a time at a given replica, the order is well-defined. Even if two replicas $p$ and $q$ applied the same set of operations, i.e. if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, they may have applied any concurrent operations in a different order. Due to the premise $\\mathit{op.deps} \\subseteq A_p(\\mathsf{ops})$ in \\textsc{Apply-Remote}, histories are consistent with causality: if an operation has causal dependencies, it appears at some point after those dependencies in the history.\n\n\\begin{definition}[document state]\\label{def:doc-state}\nThe \\emph{document state} of a replica $p$ is the subtree of $A_p$ containing the document: that is, $A_p(\\mathsf{mapT}(\\mathsf{doc}))$ or $A_p(\\mathsf{listT}(\\mathsf{doc}))$ or $A_p(\\mathsf{regT}(\\mathsf{doc}))$, whichever is defined.\n\\end{definition}\n\n$A_p$ contains variables defined with \\textsf{let}, which are local to one replica, and not part of the replicated state. The definition of document state excludes these variables.\n\n\\begin{convergence-thm}\nFor any two replicas $p$ and $q$ that participated in a valid execution, if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, then $p$ and $q$ have the same document state.\n\\end{convergence-thm}\n\nThis theorem is proved in the appendix. It formalizes the safety property of convergence: if two replicas have processed the same set of operations, possibly in a different order, then they are in the same state. In combination with a liveness property, namely that every replica eventually processes all operations, we obtain the desired notion of convergence: all replicas eventually end up in the same state.\n\nThe liveness property depends on assumptions of replicas invoking \\textsf{yield} sufficiently often, and all nondeterministic rules for \\textsf{yield} being chosen fairly. We will not formalize the liveness property in this paper, but assert that it can usually be provided in practice, as network interruptions are usually of finite duration.\n\n\\section{Conclusions and Further Work}\n\nIn this paper we demonstrated how to compose CRDTs for ordered lists, maps and registers into a compound CRDT with a JSON data model. It supports arbitrarily nested lists and maps, and it allows replicas to make arbitrary changes to the data without waiting for network communication. Replicas asynchronously send mutations to other replicas in the form of operations. Concurrent operations are commutative, which ensures that replicas converge towards the same state without requiring application-specific conflict resolution logic.\n\nThis work focused on the formal semantics of the JSON CRDT, represented as a mathematical model. We are also working on a practical implementation of the algorithm, and will report on its performance characteristics in follow-on work.\n\nOur principle of not losing input due to concurrent modifications appears at first glance to be reasonable, but as illustrated in Figure~\\ref{fig:todo-item}, it leads to merged document states that may be surprising to application programmers who are more familiar with sequential programs. Further work will be needed to understand the expectations of application programmers, and to design data structures that are minimally surprising under concurrent modification. It may turn out that a schema language will be required to support more complex applications. A schema language could also support semantic annotations, such as indicating that a number should be treated as a counter rather than a register.\n\nThe CRDT defined in this paper supports insertion, deletion and assignment operations. In addition to these, it would be useful to support a \\emph{move} operation (to change the order of elements in an ordered list, or to move a subtree from one position in a document to another) and an \\emph{undo} operation. Moreover, garbage collection (tombstone removal) is required in order to prevent unbounded growth of the data structure. We plan to address these missing features in future work.\n\n\\section*{Acknowledgements}\n\nThis research was supported by a grant from The Boeing Company. Thank you to Dominic Orchard, Diana Vasile, and the anonymous reviewers for comments that improved this paper.\n\n\\bibliographystyle{IEEEtran}\n\\bibliography{references}{}\n\\vfill\n\n\\begin{IEEEbiography}[{\\includegraphics[width=1in]{mk428.jpg}}]{Martin Kleppmann}\nis a Research Associate in the Computer Laboratory at the University of Cambridge. His current research project, TRVE Data, is working towards better security and privacy in cloud applications by applying end-to-end encryption to collaboratively editable application data. His book \\emph{Designing Data-Intensive Applications} was published by O'Reilly Media in 2017. Previously, he worked as a software engineer and entrepreneur at several internet companies, including Rapportive and LinkedIn.\n\\end{IEEEbiography}\n\n\\begin{IEEEbiography}[{\\includegraphics[width=1in]{arb33.jpg}}]{Alastair R. Beresford}\nis a Senior Lecturer in the Computer Laboratory at the University of Cambridge. His research work explores the security and privacy of large-scale distributed systems, with a particular focus on networked mobile devices such as smartphones, tablets and laptops. He looks at the security and privacy of the devices themselves, as well as the security and privacy problems induced by the interaction between mobile devices and cloud-based Internet services.\n\\end{IEEEbiography}\n\n\\ifincludeappendix\n\\clearpage\n\\appendix[Proof of Convergence]\\label{sec:proof}\n\n\\begin{theorem}\\label{thm:convergence}\nFor any two replicas $p$ and $q$ that participated in a valid execution, if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, then $p$ and $q$ have the same document state.\n\\end{theorem}\n\n\\begin{proof}\nConsider the histories $H_p$ and $H_q$ at $p$ and $q$ respectively (see Definition~\\ref{def:history}). The rules \\textsc{Apply-Local} and \\textsc{Apply-Remote} maintain the invariant that an operation is added to $A_p(\\mathsf{ops})$ or $A_q(\\mathsf{ops})$ if and only if it was applied to the document state at $p$ or $q$. Thus, $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$ iff $H_p$ and $H_q$ contain the same set of operations (potentially ordered differently).\n\nThe history $H_p$ at replica $p$ is a sequence of $n$ operations: $H_p = \\langle o_1, \\dots, o_n \\rangle$, and the document state at $p$ is derived from $H_p$ by starting in the empty state and applying the operations in order. Likewise, the document state at $q$ is derived from $H_q$, which is a permutation of $H_p$. Both histories must be consistent with causality, i.e. for all $i$ with $1 \\le i \\le n$, we require $o_i.\\mathit{deps} \\subseteq \\{o_j.\\mathit{id} \\mid 1 \\le j < i\\}$. The causality invariant is maintained by the \\textsc{Apply-*} rules.\n\nWe can prove the theorem by induction over the length of history $n$.\n\n\\emph{Base case:} An empty history with $n=0$ describes the empty document state. The empty document is always the same, and so any two replicas that have not executed any operations are by definition in the same state.\n\n\\emph{Induction step:} Given histories $H_p$ and $H_q$ of length $n$, such that $H_p = \\langle o_1, \\dots, o_n \\rangle$ and $H_q$ is a permutation of $H_p$, and such that applying $H_p$ results in the same document state as applying $H_q$, we can construct new histories $H_p'$ and $H_q'$ of length $n+1$ by inserting a new operation $o_{n+1}$ at any causally ready position in $H_p$ or $H_q$ respectively. We must then show that for all the histories $H_p'$ and $H_q'$ constructed this way, applying the sequence of operations in order results in the same document state.\n\nIn order to prove the induction step, we examine the insertion of $o_{n+1}$ into $H_p$ and $H_q$. Each history can be split into a prefix, which is the minimal subsequence $\\langle o_1, \\dots, o_j \\rangle$ such that $o_{n+1}.\\mathit{deps} \\subseteq \\{o_1.\\mathit{id}, \\dots, o_j.\\mathit{id}\\}$, and a suffix, which is the remaining subsequence $\\langle o_{j+1}, \\dots, o_n \\rangle$. The prefix contains all operations that causally precede $o_{n+1}$, and possibly some operations that are concurrent with $o_{n+1}$; the suffix contains only operations that are concurrent with $o_{n+1}$. The earliest position where $o_{n+1}$ can be inserted into the history is between the prefix and the suffix; the latest position is at the end of the suffix; or it could be inserted at any point within the suffix.\n\nWe need to show that the effect on the document state is the same, regardless of the position at which $o_{n+1}$ is inserted, and regardless of whether it is inserted into $H_p$ or $H_q$. We do this in Lemma~\\ref{lem:op-commute} by showing that $o_{n+1}$ is commutative with respect to all operations in the suffix, i.e. with respect to any operations that are concurrent to $o_{n+1}$.\n\\end{proof}\n\nBefore we can prove the commutativity of operations, we must first define some more terms and prove some preliminary lemmas.\n\n\\begin{definition}[appearing after]\nIn the ordered list $\\mathit{ctx}$, list element $k_j$ \\emph{appears after} list element $k_1$ if there exists a (possibly empty) sequence of list elements $k_2, \\dots, k_{j-1}$ such that for all $i$ with $1 \\le i < j$, $\\mathit{ctx}(\\mathsf{next}(k_i)) = k_{i+1}$. Moreover, we say $k_j$ appears \\emph{immediately after} $k_1$ if that sequence is empty, i.e. if $\\mathit{ctx}(\\mathsf{next}(k_1)) = k_j$.\n\\end{definition}\n\nThe definition of \\emph{appearing after} corresponds to the order in which the \\textsc{Idx} rules iterate over the list.\n\n\\begin{lemma}\\label{lem:list-after}\nIf $k_2$ appears after $k_1$ in an ordered list, and the list is mutated according to the evaluation rules, $k_2$ also appears after $k_1$ in all later document states.\n\\end{lemma}\n\n\\begin{proof}\nThe only rule that modifies the \\textsf{next} pointers in the context is $\\textsc{Insert}_1$, and it inserts a new list element between two existing list elements (possibly \\textsf{head} and/or \\textsf{tail}). This modification preserves the appears-after relationship between any two existing list elements. Since no other rule affects the list order, appears-after is always preserved.\n\\end{proof}\n\nNote that deletion of an element from a list does not remove it from the sequence of \\textsf{next} pointers, but only clears its presence set $\\mathsf{pres}(k)$.\n\n\\begin{lemma}\\label{lem:insert-between}\nIf one replica inserts a list element $k_\\mathit{new}$ between $k_1$ and $k_2$, i.e. if $k_\\mathit{new}$ appears after $k_1$ in the list and $k_2$ appears after $k_\\mathit{new}$ in the list on the source replica after applying \\textsc{Apply-Local}, then $k_\\mathit{new}$ appears after $k_1$ and $k_2$ appears after $k_\\mathit{new}$ on every other replica where that operation is applied.\n\\end{lemma}\n\n\\begin{proof}\nThe rules for generating list operations ensure that $k_1$ is either \\textsf{head} or an operation identifier, and $k_2$ is either \\textsf{tail} or an operation identifier.\n\nWhen the insertion operation is generated using the \\textsc{Make-Op} rule, its operation identifier is given a counter value $\\mathit{ctr}$ that is greater than the counter of any existing operation ID in $A_p(\\mathsf{ops})$. If $k_2$ is an operation identifier, we must have $k_2 \\in A_p(\\mathsf{ops})$, since both \\textsc{Apply-Local} and \\textsc{Apply-Remote} add operation IDs to $A_p(\\mathsf{ops})$ when applying an insertion. Thus, either $k_2 < k_\\mathit{new}$ under the ordering relation $<$ for Lamport timestamps, or $k_2 = \\mathsf{tail}$.\n\nWhen the insertion operation is applied on another replica using \\textsc{Apply-Remote} and $\\textsc{Insert}_{1,2}$, $k_2$ appears after $k_1$ on that replica (by Lemma~\\ref{lem:list-after} and causality). The cursor of the operation is $\\mathsf{cursor}(\\langle\\dots\\rangle, k_1)$, so the rules start iterating the list at $k_1$, and therefore $k_\\mathit{new}$ is inserted at some position after $k_1$.\n\nIf other concurrent insertions occurred between $k_1$ and $k_2$, their operation ID may be greater than or less than $k_\\mathit{new}$, and thus either $\\textsc{Insert}_1$ or $\\textsc{Insert}_2$ may apply. In particular, $\\textsc{Insert}_2$ skips over any list elements whose Lamport timestamp is greater than $k_\\mathit{new}$. However, we know that $k_2 < k_\\mathit{new} \\vee k_2 = \\mathsf{tail}$, and so $\\textsc{Insert}_1$ will apply with $\\mathit{next}=k_2$ at the latest. The $\\textsc{Insert}_{1,2}$ rules thus never iterate past $k_2$, and thus $k_\\mathit{new}$ is never inserted at a list position that appears after $k_2$.\n\\end{proof}\n\n\\begin{definition}[common ancestor]\\label{def:common-ancestor}\nIn a history $H$, the \\emph{common ancestor} of two concurrent operations $o_r$ and $o_s$ is the latest document state that causally precedes both $o_r$ and $o_s$.\n\\end{definition}\n\nThe common ancestor of $o_r$ and $o_s$ can be defined more formally as the document state resulting from applying a sequence of operations $\\langle o_1, \\dots, o_j \\rangle$ that is the shortest prefix of $H$ that satisfies $(o_r.\\mathit{deps} \\cap o_s.\\mathit{deps}) \\subseteq \\{o_1.\\mathit{id}, \\dots, o_j.\\mathit{id}\\}$.\n\n\\begin{definition}[insertion interval]\\label{def:insert-interval}\nGiven two concurrent operations $o_r$ and $o_s$ that insert into the same list, the \\emph{insertion interval} of $o_r$ is the pair of keys $(k_r^\\mathrm{before}, k_r^\\mathrm{after})$ such that $o_r.\\mathit{id}$ appears after $k_r^\\mathrm{before}$ when $o_r$ has been applied, $k_r^\\mathrm{after}$ appears after $o_r.\\mathit{id}$ when $o_r$ has been applied, and $k_r^\\mathrm{after}$ appears immediately after $k_r^\\mathrm{before}$ in the common ancestor of $o_r$ and $o_s$. The insertion interval of $o_s$ is the pair of keys $(k_s^\\mathrm{before}, k_s^\\mathrm{after})$ defined similarly.\n\\end{definition}\n\nIt may be the case that $k_r^\\mathrm{before}$ or $k_s^\\mathrm{before}$ is \\textsf{head}, and that $k_r^\\mathrm{after}$ or $k_s^\\mathrm{after}$ is \\textsf{tail}.\n\n\\begin{lemma}\\label{lem:insert-conflict}\nFor any two concurrent insertion operations $o_r, o_s$ in a history $H$, if $o_r.\\mathit{cur} = o_s.\\mathit{cur}$, then the order at which the inserted elements appear in the list after applying $H$ is deterministic and independent of the order of $o_r$ and $o_s$ in $H$.\n\\end{lemma}\n\n\\begin{proof}\nWithout loss of generality, assume that $o_r.\\mathit{id} < o_s.\\mathit{id}$ according to the ordering relation on Lamport timestamps. (If the operation ID of $o_r$ is greater than that of $o_s$, the two operations can be swapped in this proof.) We now distinguish the two possible orders of applying the operations:\n\n\\begin{enumerate}\n\\item $o_r$ is applied before $o_s$ in $H$. Thus, at the time when $o_s$ is applied, $o_r$ has already been applied. When applying $o_s$, since $o_r$ has a lesser operation ID, the rule $\\textsc{Insert}_1$ applies with $\\mathit{next} = o_r.\\mathit{id}$ at the latest, so the insertion position of $o_s$ must appear before $o_r$. It is not possible for $\\textsc{Insert}_2$ to skip past $o_r$.\n\n\\item $o_s$ is applied before $o_r$ in $H$. Thus, at the time when $o_r$ is applied, $o_s$ has already been applied. When applying $o_r$, the rule $\\textsc{Insert}_2$ applies with $\\mathit{next} = o_s.\\mathit{id}$, so the rule skips past $o_s$ and inserts $o_r$ at a position after $o_s$. Moreover, any list elements that appear between $o_s.\\mathit{cur}$ and $o_s$ at the time of inserting $o_r$ must have a Lamport timestamp greater than $o_s.\\mathit{id}$, so $\\textsc{Insert}_2$ also skips over those list elements when inserting $o_r$. Thus, the insertion position of $o_r$ must be after $o_s$.\n\\end{enumerate}\n\nThus, the insertion position of $o_r$ appears after the insertion position of $o_s$, regardless of the order in which the two operations are applied. The ordering depends only on the operation IDs, and since these IDs are fixed at the time the operations are generated, the list order is determined by the IDs.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:insert-reorder}\nIn an operation history $H$, an insertion operation is commutative with respect to concurrent insertion operations to the same list.\n\\end{lemma}\n\n\\begin{proof}\nGiven any two concurrent insertion operations $o_r, o_s$ in $H$, we must show that the document state does not depend on the order in which $o_r$ and $o_s$ are applied.\n\nEither $o_r$ and $o_s$ have the same insertion interval as defined in Definition~\\ref{def:insert-interval}, or they have different insertion intervals. If the insertion intervals are different, then by Lemma~\\ref{lem:insert-between} the operations cannot affect each other, and so they have the same effect regardless of their order. So we need only analyze the case in which they have the same insertion interval $(k^\\mathrm{before}, k^\\mathrm{after})$.\n\nIf $o_r.\\mathit{cur} = o_s.\\mathit{cur}$, then by Lemma~\\ref{lem:insert-conflict}, the operation with the greater operation ID appears first in the list, regardless of the order in which the operations are applied. If $o_r.\\mathit{cur} \\not= o_s.\\mathit{cur}$, then one or both of the cursors must refer to a list element that appears between $k^\\mathrm{before}$ and $k^\\mathrm{after}$, and that did not yet exist in the common ancestor (Definition~\\ref{def:common-ancestor}).\n\nTake a cursor that differs from $k^\\mathrm{before}$: the list element it refers to was inserted by a prior operation, whose cursor in turn refers to another prior operation, and so on. Following this chain of cursors for a finite number of steps leads to an operation $o_\\mathrm{first}$ whose cursor refers to $k^\\mathrm{before}$ (since an insertion operation always inserts at a position after the cursor).\n\nNote that all of the operations in this chain are causally dependent on $o_\\mathrm{first}$, and so they must have a Lamport timestamp greater than $o_\\mathrm{first}$. Thus, we can apply the same argument as in Lemma~\\ref{lem:insert-conflict}: if $\\textsc{Insert}_2$ skips over the list element inserted by $o_\\mathrm{first}$, it will also skip over all of the list elements that are causally dependent on it; if $\\textsc{Insert}_1$ inserts a new element before $o_\\mathrm{first}$, it is also inserted before the chain of operations that is based on it.\n\nTherefore, the order of $o_r$ and $o_s$ in the final list is determined by the Lamport timestamps of the first insertions into the insertion interval after their common ancestor, in the chains of cursor references of the two operations. Since the argument above applies to all pairs of concurrent operations $o_r, o_s$ in $H$, we deduce that the final order of elements in the list depends only on the operation IDs but not the order of application, which shows that concurrent insertions to the same list are commutative.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:delete-commute}\nIn a history $H$, a deletion operation is commutative with respect to concurrent operations.\n\\end{lemma}\n\n\\begin{proof}\nGiven a deletion operation $o_d$ and any other concurrent operation $o_c$, we must show that the document state after applying both operations does not depend on the order in which $o_d$ and $o_c$ were applied.\n\nThe rules in Figure~\\ref{fig:clear-rules} define how a deletion operation $o_d$ is applied: starting at the cursor in the operation, they recursively descend the subtree, removing $o_d.\\mathit{deps}$ from the presence set $\\mathsf{pres}(k)$ at all branch nodes in the subtree, and updating all registers to remove any values written by operations in $o_d.\\mathit{deps}$.\n\nIf $o_c$ is an assignment or insertion operation, the \\textsc{Assign} rule adds $o_c.\\mathit{id}$ to the mapping from operation ID to value for a register, and the \\textsc{Descend}, \\textsc{Assign}, \\textsc{Empty-Map} and \\textsc{Empty-List} rules add $o_c.\\mathit{id}$ to the presence sets $\\mathsf{pres}(k)$ along the path through the document tree described by the cursor.\n\nIf $o_d.\\mathit{cur}$ is not a prefix of $o_c.\\mathit{cur}$, the operations affect disjoint subtrees of the document, and so they are trivially commutative. Any state changes by \\textsc{Descend} and $\\textsc{Add-ID}_1$ along the shared part of the cursor path are applied using the set union operator $\\cup$, which is commutative.\n\nNow consider the case where $o_d.\\mathit{cur}$ is a prefix of $o_c.\\mathit{cur}$. Since $o_c$ is concurrent with $o_d$, we know that $o_c.\\mathit{id} \\notin o_d.\\mathit{deps}$. Therefore, if $o_c$ is applied before $o_d$ in the history, the \\textsc{Clear-*} rules evaluating $o_d$ will leave any occurrences of $o_c.\\mathit{id}$ in the document state undisturbed, while removing any occurrences of operations in $o_d.\\mathit{deps}$.\n\nIf $o_d$ is applied before $o_c$, the effect on presence sets and registers is the same as if they had been applied in the reverse order. Moreover, $o_c$ applies in the same way as if $o_d$ had not been applied previously, because applying a deletion only modifies presence sets and registers, without actually removing map keys or list elements, and because the rules for applying an operation are not conditional on the previous content of presence sets and registers.\n\nThus, the effect of applying $o_c$ before $o_d$ is the same as applying $o_d$ before $o_c$, so the operations commute.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:assign-commute}\nIn a history $H$, an assignment operation is commutative with respect to concurrent operations.\n\\end{lemma}\n\n\\begin{proof}\nGiven an assignment $o_a$ and any other concurrent operation $o_c$, we must show that the document state after applying both operations does not depend on the order in which $o_a$ and $o_c$ were applied.\n\nThe rules \\textsc{Assign}, \\textsc{Empty-Map} and \\textsc{Empty-List} define how an assignment operation $o_a$ is applied, depending on the value being assigned. All three rules first clear any causally prior state from the cursor at which the assignment is occurring; by Lemma~\\ref{lem:delete-commute}, this clearing operation is commutative with concurrent operations, and leaves updates by concurrent operations untouched.\n\nThe rules also add $o_a.\\mathit{id}$ to the presence set identified by the cursor, and \\textsc{Descend} adds $o_a.\\mathit{id}$ to the presence sets on the path from the root of the document tree described by the cursor. These state changes are applied using the set union operator $\\cup$, which is commutative.\n\nFinally, in the case where value assigned by $o_a$ is a primitive and the \\textsc{Assign} rule applies, the mapping from operation ID to value is added to the register by the expression $\\mathit{child}[\\,\\mathit{id} \\mapsto \\mathit{val}\\,]$. If $o_c$ is not an assignment operation or if $o_a.\\mathit{cursor} \\not= o_c.\\mathit{cursor}$, the operations are independent and thus trivially commutative.\n\nIf $o_a$ and $o_c$ are assignments to the same cursor, we use the commutativity of updates to a partial function: $\\mathit{child}[\\,\\mathit{id}_1 \\mapsto \\mathit{val}_1\\,]\\,[\\,\\mathit{id}_2 \\mapsto \\mathit{val}_2\\,] = \\mathit{child}[\\,\\mathit{id}_2 \\mapsto \\mathit{val}_2\\,]\\,[\\,\\mathit{id}_1 \\mapsto \\mathit{val}_1\\,]$ provided that $\\mathit{id}_1 \\not= \\mathit{id}_2$. Since operation IDs (Lamport timestamps) are unique, two concurrent assignments add two different keys to the mapping, and their order is immaterial.\n\nThus, all parts of the process of applying $o_a$ have the same effect on the document state, regardless of whether $o_c$ is applied before or after $o_a$, so the operations commute.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:op-commute}\nGiven an operation history $H=\\langle o_1, \\dots, o_n \\rangle$ from a valid execution, a new operation $o_{n+1}$ from that execution can be inserted at any point in $H$ after $o_{n+1}.\\mathit{deps}$ have been applied. For all histories $H'$ that can be constructed this way, the document state resulting from applying the operations in $H'$ in order is the same, and independent of the ordering of any concurrent operations in $H$.\n\\end{lemma}\n\n\\begin{proof}\n$H$ can be split into a prefix and a suffix, as described in the proof of Theorem~\\ref{thm:convergence}. The suffix contains only operations that are concurrent with $o_{n+1}$, and we allow $o_{n+1}$ to be inserted at any point after the prefix. We then prove the lemma case-by-case, depending on the type of mutation in $o_{n+1}$. \n\nIf $o_{n+1}$ is a deletion, by Lemma~\\ref{lem:delete-commute} it is commutative with all operations in the suffix, and so $o_{n+1}$ can be inserted at any point within, before, or after the suffix without changing its effect on the final document state. Similarly, if $o_{n+1}$ is an assignment, by Lemma~\\ref{lem:assign-commute} it is commutative with all operations in the suffix.\n\nIf $o_{n+1}$ is an insertion, let $o_c$ be any operation in the suffix, and consider the cases of $o_{n+1}$ being inserted before and after $o_c$ in the history. If $o_c$ is a deletion or assignment, it is commutative with $o_{n+1}$ by Lemma~\\ref{lem:delete-commute} or Lemma~\\ref{lem:assign-commute} respectively. If $o_c$ is an insertion into the same list as $o_{n+1}$, then by Lemma~\\ref{lem:insert-reorder} the operations are commutative. If $o_c$ is an insertion into a different list in the document, its effect is independent from $o_{n+1}$ and so the two operations can be applied in any order.\n\nThus, $o_{n+1}$ is commutative with respect to any concurrent operation in $H$. Therefore, $o_{n+1}$ can be inserted into $H$ at any point after its causal dependencies, and the effect on the final document state is independent of the position at which the operation is inserted.\n\\end{proof}\n\nThis completes the induction step in the proof of Theorem~\\ref{thm:convergence}, and thus proves convergence of our datatype.\n\n\\fi % includeappendix\n\\end{document}\n" diff --git a/perf/src/main.rs b/perf/src/main.rs deleted file mode 100644 index 67d149b1..00000000 --- a/perf/src/main.rs +++ /dev/null @@ -1,361 +0,0 @@ -use std::{ - fs::File, - io::Read, - time::{Duration, Instant}, -}; - -use automerge::{Backend, Frontend, InvalidChangeRequest, LocalChange, Path, Primitive}; -use automerge_frontend::Value; -use maplit::hashmap; -use rand::Rng; - -fn f() { - let mut doc = Frontend::new(); - let mut backend = Backend::new(); - - let start = Instant::now(); - - let m = hashmap! { - "a".to_owned() => - Value::Map(hashmap!{ - "b".to_owned()=> - Value::Map( - hashmap! { - "abc".to_owned() => Value::Primitive(Primitive::Str("hello world".to_owned())) - }, - ), - "d".to_owned() => Value::Primitive(Primitive::Uint(20)), - },) - }; - - let mut changes = Vec::new(); - let mut applys = Vec::new(); - - let iterations = 10_000; - for _ in 0..iterations { - let random_string: String = rand::thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .take(10) - .map(char::from) - .collect(); - let a = Instant::now(); - let change = doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key(random_string), - Value::Map(m.clone()), - )) - }) - .unwrap() - .1 - .unwrap(); - changes.push(a.elapsed()); - let (patch, _) = backend.apply_local_change(change).unwrap(); - let a = Instant::now(); - doc.apply_patch(patch).unwrap(); - applys.push(a.elapsed()); - } - - let save = Instant::now(); - let bytes = backend.save().unwrap(); - let save = save.elapsed(); - let load = Instant::now(); - Backend::load(bytes).unwrap(); - let load = load.elapsed(); - - println!( - "maps x{} total:{:?} change:{:?} apply:{:?} save:{:?} load:{:?}", - iterations, - start.elapsed(), - changes.iter().sum::(), - applys.iter().sum::(), - save, - load, - ); -} - -fn g() { - let mut doc = Frontend::new(); - let mut backend = Backend::new(); - - let start = Instant::now(); - - let change = doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set(Path::root().key("a"), Value::Text(vec![]))) - }) - .unwrap() - .1 - .unwrap(); - let (patch, _) = backend.apply_local_change(change).unwrap(); - doc.apply_patch(patch).unwrap(); - - let iterations = 10_000; - for i in 0..iterations { - let random_string: String = rand::thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .take(1) - .map(char::from) - .collect(); - let change = doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::insert( - Path::root().key("a").index(i), - Value::Primitive(Primitive::Str(random_string)), - )) - }) - .unwrap() - .1 - .unwrap(); - let (patch, _) = backend.apply_local_change(change).unwrap(); - doc.apply_patch(patch).unwrap(); - } - - let patch = backend.get_patch().unwrap(); - - let mut f = Frontend::new(); - - f.apply_patch(patch).unwrap(); - - let save = Instant::now(); - let bytes = backend.save().unwrap(); - let save = save.elapsed(); - let load = Instant::now(); - Backend::load(bytes).unwrap(); - let load = load.elapsed(); - - println!( - "seqs x{} {:?} save:{:?} load:{:?}", - iterations, - start.elapsed(), - save, - load - ); -} - -fn h() { - let start = Instant::now(); - - let mut doc1 = Frontend::new(); - let changedoc1 = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(Vec::new()), - ))?; - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - let mut backend1 = Backend::new(); - let (patch1, _) = backend1.apply_local_change(changedoc1).unwrap(); - doc1.apply_patch(patch1).unwrap(); - - let mut doc2 = Frontend::new(); - let changedoc2 = backend1.get_changes(&[]); - let mut backend2 = Backend::new(); - let patch2 = backend2 - .apply_changes(changedoc2.into_iter().cloned().collect()) - .unwrap(); - doc2.apply_patch(patch2).unwrap(); - - let mut changes = Vec::new(); - let mut applys = Vec::new(); - - let mut len = 0; - let iterations = 10_000; - for _ in 0..iterations { - let random_string: char = rand::thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) - .next() - .map(char::from) - .unwrap(); - - let a = Instant::now(); - let doc1_insert_change = doc1 - .change::<_, _, InvalidChangeRequest>(None, |d| { - let weight = if len > 100 { - if len > 1000 { - 0.45 - } else { - 0.55 - } - } else { - 1. - }; - if rand::thread_rng().gen_bool(weight) { - d.add_change(LocalChange::insert( - Path::root() - .key("text") - .index(rand::thread_rng().gen_range(0..=len)), - random_string.into(), - ))?; - len += 1; - } else { - d.add_change(LocalChange::delete( - Path::root() - .key("text") - .index(rand::thread_rng().gen_range(0..len)), - ))?; - len -= 1; - } - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - changes.push(a.elapsed()); - - let (patch, change_to_send) = backend1.apply_local_change(doc1_insert_change).unwrap(); - - let a = Instant::now(); - doc1.apply_patch(patch).unwrap(); - applys.push(a.elapsed()); - - let patch2 = backend2 - .apply_changes(vec![(change_to_send).clone()]) - .unwrap(); - let a = Instant::now(); - doc2.apply_patch(patch2).unwrap(); - applys.push(a.elapsed()); - } - - let save = Instant::now(); - let bytes = backend1.save().unwrap(); - let save = save.elapsed(); - let load = Instant::now(); - Backend::load(bytes).unwrap(); - let load = load.elapsed(); - - println!( - "rand x{} {:?} change:{:?} apply:{:?} save:{:?} load:{:?}", - iterations, - start.elapsed(), - changes.iter().sum::(), - applys.iter().sum::(), - save, - load, - ); -} - -fn trace(edits: Vec<(u32, u32, Option)>) { - let mut doc = Frontend::new(); - let mut backend = Backend::new(); - - let start = Instant::now(); - - let change = doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - d.add_change(LocalChange::set( - Path::root().key("text"), - Value::Text(vec![]), - )) - }) - .unwrap() - .1 - .unwrap(); - let (patch, _) = backend.apply_local_change(change).unwrap(); - doc.apply_patch(patch).unwrap(); - - let loop_start = Instant::now(); - let num_chunks = 10; - for (i, edits) in edits.chunks(num_chunks).enumerate() { - if (i * num_chunks) % 10000 == 0 { - println!( - "processed {} changes in {:?}", - i * num_chunks, - loop_start.elapsed() - ); - } - let change = doc - .change::<_, _, InvalidChangeRequest>(None, |d| { - for edit in edits { - // if (edits[i][1] > 0) doc.text.deleteAt(edits[i][0], edits[i][1]) - if edit.1 > 0 { - for j in 0..edit.1 { - d.add_change(LocalChange::delete( - Path::root().key("text").index(edit.0 + (j as u32)), - ))?; - } - } - - // if (edits[i].length > 2) doc.text.insertAt(edits[i][0], ...edits[i].slice(2)) - if let Some(c) = edit.2.clone() { - d.add_change(LocalChange::insert( - Path::root().key("text").index(edit.0), - Value::Primitive(Primitive::Str(c)), - ))?; - } - } - - Ok(()) - }) - .unwrap() - .1 - .unwrap(); - - let (patch, _) = backend.apply_local_change(change).unwrap(); - doc.apply_patch(patch).unwrap(); - } - - let save = Instant::now(); - let bytes = backend.save().unwrap(); - let save = save.elapsed(); - let load = Instant::now(); - Backend::load(bytes).unwrap(); - let load = load.elapsed(); - - println!( - "trace {:?} save:{:?} load:{:?}", - start.elapsed(), - save, - load - ); -} - -fn main() { - let mut edits_file = File::open("perf/edits.json").unwrap(); - let mut buf = String::new(); - edits_file.read_to_string(&mut buf).unwrap(); - let edits: Vec = serde_json::from_str(&buf).unwrap(); - let edits = edits - .into_iter() - .map(|e| { - ( - if let serde_json::Value::Number(n) = &e[0] { - n.as_u64().unwrap() as u32 - } else { - panic!("not a number") - }, - if let serde_json::Value::Number(n) = &e[1] { - n.as_u64().unwrap() as u32 - } else { - panic!("not a number") - }, - e.get(2).map(|v| { - if let serde_json::Value::String(s) = v { - s.clone() - } else { - panic!("not a string") - } - }), - ) - }) - .collect::>(); - - println!("starting"); - - let repeats = 1; - - for _ in 0..repeats { - f() - } - for _ in 0..repeats { - g() - } - for _ in 0..repeats { - h() - } - trace(edits) -} diff --git a/rust/.gitignore b/rust/.gitignore new file mode 100644 index 00000000..f859e0a3 --- /dev/null +++ b/rust/.gitignore @@ -0,0 +1,6 @@ +/target +/.direnv +perf.* +/Cargo.lock +build/ +.vim/* diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 00000000..5d29fc9f --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +members = [ + "automerge", + "automerge-c", + "automerge-cli", + "automerge-test", + "automerge-wasm", + "edit-trace", +] +resolver = "2" + +[profile.release] +lto = true +codegen-units = 1 + +[profile.bench] +debug = true \ No newline at end of file diff --git a/rust/automerge-c/.clang-format b/rust/automerge-c/.clang-format new file mode 100644 index 00000000..dbf16c21 --- /dev/null +++ b/rust/automerge-c/.clang-format @@ -0,0 +1,250 @@ +--- +Language: Cpp +# BasedOnStyle: Chromium +AccessModifierOffset: -1 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignEscapedNewlines: Left +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortEnumsOnASingleLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: false +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +QualifierAlignment: Leave +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: NextLine +BasedOnStyle: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +AllowAllConstructorInitializersOnNextLine: true +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*\.h>' + Priority: 1 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 3 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '([-_](test|unittest))?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: true +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Never +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Left +PPIndentWidth: -1 +RawStringFormats: + - Language: Cpp + Delimiters: + - cc + - CC + - cpp + - Cpp + - CPP + - 'c++' + - 'C++' + CanonicalDelimiter: '' + BasedOnStyle: google + - Language: TextProto + Delimiters: + - pb + - PB + - proto + - PROTO + EnclosingFunctions: + - EqualsProto + - EquivToProto + - PARSE_PARTIAL_TEXT_PROTO + - PARSE_TEST_PROTO + - PARSE_TEXT_PROTO + - ParseTextOrDie + - ParseTextProtoOrDie + - ParseTestProto + - ParsePartialTestProto + CanonicalDelimiter: pb + BasedOnStyle: google +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RequiresClausePosition: OwnLine +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: Auto +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +... + diff --git a/rust/automerge-c/.gitignore b/rust/automerge-c/.gitignore new file mode 100644 index 00000000..14d74973 --- /dev/null +++ b/rust/automerge-c/.gitignore @@ -0,0 +1,10 @@ +automerge +automerge.h +automerge.o +build/ +CMakeCache.txt +CMakeFiles +CMakePresets.json +Makefile +DartConfiguration.tcl +out/ diff --git a/rust/automerge-c/CMakeLists.txt b/rust/automerge-c/CMakeLists.txt new file mode 100644 index 00000000..0c35eebd --- /dev/null +++ b/rust/automerge-c/CMakeLists.txt @@ -0,0 +1,305 @@ +cmake_minimum_required(VERSION 3.23 FATAL_ERROR) + +project(automerge-c VERSION 0.1.0 + LANGUAGES C + DESCRIPTION "C bindings for the Automerge Rust library.") + +set(LIBRARY_NAME "automerge") + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) + +option(BUILD_SHARED_LIBS "Enable the choice of a shared or static library.") + +include(CTest) + +include(CMakePackageConfigHelpers) + +include(GNUInstallDirs) + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +string(MAKE_C_IDENTIFIER ${PROJECT_NAME} SYMBOL_PREFIX) + +string(TOUPPER ${SYMBOL_PREFIX} SYMBOL_PREFIX) + +set(CARGO_TARGET_DIR "${CMAKE_BINARY_DIR}/Cargo/target") + +set(CBINDGEN_INCLUDEDIR "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}") + +set(CBINDGEN_TARGET_DIR "${CBINDGEN_INCLUDEDIR}/${PROJECT_NAME}") + +find_program ( + CARGO_CMD + "cargo" + PATHS "$ENV{CARGO_HOME}/bin" + DOC "The Cargo command" +) + +if(NOT CARGO_CMD) + message(FATAL_ERROR "Cargo (Rust package manager) not found! " + "Please install it and/or set the CARGO_HOME " + "environment variable to its path.") +endif() + +string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER) + +# In order to build with -Z build-std, we need to pass target explicitly. +# https://doc.rust-lang.org/cargo/reference/unstable.html#build-std +execute_process ( + COMMAND rustc -vV + OUTPUT_VARIABLE RUSTC_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE +) +string(REGEX REPLACE ".*host: ([^ \n]*).*" "\\1" + CARGO_TARGET + ${RUSTC_VERSION} +) + +if(BUILD_TYPE_LOWER STREQUAL debug) + set(CARGO_BUILD_TYPE "debug") + + set(CARGO_FLAG --target=${CARGO_TARGET}) +else() + set(CARGO_BUILD_TYPE "release") + + if (NOT RUSTC_VERSION MATCHES "nightly") + set(RUSTUP_TOOLCHAIN nightly) + endif() + + set(RUSTFLAGS -C\ panic=abort) + + set(CARGO_FLAG -Z build-std=std,panic_abort --release --target=${CARGO_TARGET}) +endif() + +set(CARGO_FEATURES "") + +set(CARGO_BINARY_DIR "${CARGO_TARGET_DIR}/${CARGO_TARGET}/${CARGO_BUILD_TYPE}") + +set(BINDINGS_NAME "${LIBRARY_NAME}_core") + +configure_file( + ${CMAKE_MODULE_PATH}/Cargo.toml.in + ${CMAKE_SOURCE_DIR}/Cargo.toml + @ONLY + NEWLINE_STYLE LF +) + +set(INCLUDE_GUARD_PREFIX "${SYMBOL_PREFIX}") + +configure_file( + ${CMAKE_MODULE_PATH}/cbindgen.toml.in + ${CMAKE_SOURCE_DIR}/cbindgen.toml + @ONLY + NEWLINE_STYLE LF +) + +set(CARGO_OUTPUT + ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h + ${CARGO_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${BINDINGS_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} +) + +# \note cbindgen's naming behavior isn't fully configurable and it ignores +# `const fn` calls (https://github.com/eqrion/cbindgen/issues/252). +add_custom_command( + OUTPUT + ${CARGO_OUTPUT} + COMMAND + # \note cbindgen won't regenerate its output header file after it's been removed but it will after its + # configuration file has been updated. + ${CMAKE_COMMAND} -DCONDITION=NOT_EXISTS -P ${CMAKE_SOURCE_DIR}/cmake/file-touch.cmake -- ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h ${CMAKE_SOURCE_DIR}/cbindgen.toml + COMMAND + ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${CARGO_TARGET_DIR} CBINDGEN_TARGET_DIR=${CBINDGEN_TARGET_DIR} RUSTUP_TOOLCHAIN=${RUSTUP_TOOLCHAIN} RUSTFLAGS=${RUSTFLAGS} ${CARGO_CMD} build ${CARGO_FLAG} ${CARGO_FEATURES} + COMMAND + # Compensate for cbindgen's translation of consecutive uppercase letters to "ScreamingSnakeCase". + ${CMAKE_COMMAND} -DMATCH_REGEX=A_M\([^_]+\)_ -DREPLACE_EXPR=AM_\\1_ -P ${CMAKE_SOURCE_DIR}/cmake/file-regex-replace.cmake -- ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h + COMMAND + # Compensate for cbindgen ignoring `std:mem::size_of()` calls. + ${CMAKE_COMMAND} -DMATCH_REGEX=USIZE_ -DREPLACE_EXPR=\+${CMAKE_SIZEOF_VOID_P} -P ${CMAKE_SOURCE_DIR}/cmake/file-regex-replace.cmake -- ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h + MAIN_DEPENDENCY + src/lib.rs + DEPENDS + src/actor_id.rs + src/byte_span.rs + src/change.rs + src/doc.rs + src/doc/list.rs + src/doc/map.rs + src/doc/utils.rs + src/index.rs + src/item.rs + src/items.rs + src/obj.rs + src/result.rs + src/sync.rs + src/sync/have.rs + src/sync/message.rs + src/sync/state.rs + ${CMAKE_SOURCE_DIR}/build.rs + ${CMAKE_MODULE_PATH}/Cargo.toml.in + ${CMAKE_MODULE_PATH}/cbindgen.toml.in + WORKING_DIRECTORY + ${CMAKE_SOURCE_DIR} + COMMENT + "Producing the bindings' artifacts with Cargo..." + VERBATIM +) + +add_custom_target(${BINDINGS_NAME}_artifacts ALL + DEPENDS ${CARGO_OUTPUT} +) + +add_library(${BINDINGS_NAME} STATIC IMPORTED GLOBAL) + +target_include_directories(${BINDINGS_NAME} INTERFACE "${CBINDGEN_INCLUDEDIR}") + +set_target_properties( + ${BINDINGS_NAME} + PROPERTIES + # \note Cargo writes a debug build into a nested directory instead of + # decorating its name. + DEBUG_POSTFIX "" + DEFINE_SYMBOL "" + IMPORTED_IMPLIB "" + IMPORTED_LOCATION "${CARGO_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${BINDINGS_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" + IMPORTED_NO_SONAME "TRUE" + IMPORTED_SONAME "" + LINKER_LANGUAGE C + PUBLIC_HEADER "${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h" + SOVERSION "${PROJECT_VERSION_MAJOR}" + VERSION "${PROJECT_VERSION}" + # \note Cargo exports all of the symbols automatically. + WINDOWS_EXPORT_ALL_SYMBOLS "TRUE" +) + +target_compile_definitions(${BINDINGS_NAME} INTERFACE $) + +set(UTILS_SUBDIR "utils") + +add_custom_command( + OUTPUT + ${CBINDGEN_TARGET_DIR}/${UTILS_SUBDIR}/enum_string.h + ${CMAKE_BINARY_DIR}/src/${UTILS_SUBDIR}/enum_string.c + COMMAND + ${CMAKE_COMMAND} -DPROJECT_NAME=${PROJECT_NAME} -DLIBRARY_NAME=${LIBRARY_NAME} -DSUBDIR=${UTILS_SUBDIR} -P ${CMAKE_SOURCE_DIR}/cmake/enum-string-functions-gen.cmake -- ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h ${CBINDGEN_TARGET_DIR}/${UTILS_SUBDIR}/enum_string.h ${CMAKE_BINARY_DIR}/src/${UTILS_SUBDIR}/enum_string.c + MAIN_DEPENDENCY + ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h + DEPENDS + ${CMAKE_SOURCE_DIR}/cmake/enum-string-functions-gen.cmake + WORKING_DIRECTORY + ${CMAKE_SOURCE_DIR} + COMMENT + "Generating the enum string functions with CMake..." + VERBATIM +) + +add_custom_target(${LIBRARY_NAME}_utilities + DEPENDS ${CBINDGEN_TARGET_DIR}/${UTILS_SUBDIR}/enum_string.h + ${CMAKE_BINARY_DIR}/src/${UTILS_SUBDIR}/enum_string.c +) + +add_library(${LIBRARY_NAME}) + +target_compile_features(${LIBRARY_NAME} PRIVATE c_std_99) + +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) + +set(THREADS_PREFER_PTHREAD_FLAG TRUE) + +find_package(Threads REQUIRED) + +set(LIBRARY_DEPENDENCIES Threads::Threads ${CMAKE_DL_LIBS}) + +if(WIN32) + list(APPEND LIBRARY_DEPENDENCIES Bcrypt userenv ws2_32) +else() + list(APPEND LIBRARY_DEPENDENCIES m) +endif() + +target_link_libraries(${LIBRARY_NAME} + PUBLIC ${BINDINGS_NAME} + ${LIBRARY_DEPENDENCIES} +) + +# \note An imported library's INTERFACE_INCLUDE_DIRECTORIES property can't +# contain a non-existent path so its build-time include directory +# must be specified for all of its dependent targets instead. +target_include_directories(${LIBRARY_NAME} + PUBLIC "$" + "$" +) + +add_dependencies(${LIBRARY_NAME} ${BINDINGS_NAME}_artifacts) + +# Generate the configuration header. +math(EXPR INTEGER_PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR} * 100000") + +math(EXPR INTEGER_PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR} * 100") + +math(EXPR INTEGER_PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}") + +math(EXPR INTEGER_PROJECT_VERSION "${INTEGER_PROJECT_VERSION_MAJOR} + \ + ${INTEGER_PROJECT_VERSION_MINOR} + \ + ${INTEGER_PROJECT_VERSION_PATCH}") + +configure_file( + ${CMAKE_MODULE_PATH}/config.h.in + ${CBINDGEN_TARGET_DIR}/config.h + @ONLY + NEWLINE_STYLE LF +) + +target_sources(${LIBRARY_NAME} + PRIVATE + src/${UTILS_SUBDIR}/result.c + src/${UTILS_SUBDIR}/stack_callback_data.c + src/${UTILS_SUBDIR}/stack.c + src/${UTILS_SUBDIR}/string.c + ${CMAKE_BINARY_DIR}/src/${UTILS_SUBDIR}/enum_string.c + PUBLIC + FILE_SET api TYPE HEADERS + BASE_DIRS + ${CBINDGEN_INCLUDEDIR} + ${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR} + FILES + ${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h + ${CBINDGEN_TARGET_DIR}/${UTILS_SUBDIR}/enum_string.h + ${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/result.h + ${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/stack_callback_data.h + ${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/stack.h + ${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/string.h + INTERFACE + FILE_SET config TYPE HEADERS + BASE_DIRS + ${CBINDGEN_INCLUDEDIR} + FILES + ${CBINDGEN_TARGET_DIR}/config.h +) + +install( + TARGETS ${LIBRARY_NAME} + EXPORT ${PROJECT_NAME}-config + FILE_SET api + FILE_SET config +) + +# \note Install the Cargo-built core bindings to enable direct linkage. +install( + FILES $ + DESTINATION ${CMAKE_INSTALL_LIBDIR} +) + +install(EXPORT ${PROJECT_NAME}-config + FILE ${PROJECT_NAME}-config.cmake + NAMESPACE "${PROJECT_NAME}::" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LIB} +) + +if(BUILD_TESTING) + add_subdirectory(test EXCLUDE_FROM_ALL) + + enable_testing() +endif() + +add_subdirectory(docs) + +add_subdirectory(examples EXCLUDE_FROM_ALL) diff --git a/rust/automerge-c/Cargo.toml b/rust/automerge-c/Cargo.toml new file mode 100644 index 00000000..95a3a29c --- /dev/null +++ b/rust/automerge-c/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "automerge-c" +version = "0.1.0" +authors = ["Orion Henry ", "Jason Kankiewicz "] +edition = "2021" +license = "MIT" +rust-version = "1.57.0" + +[lib] +name = "automerge_core" +crate-type = ["staticlib"] +bench = false +doc = false + +[dependencies] +automerge = { path = "../automerge" } +hex = "^0.4.3" +libc = "^0.2" +smol_str = "^0.1.21" + +[build-dependencies] +cbindgen = "^0.24" diff --git a/rust/automerge-c/README.md b/rust/automerge-c/README.md new file mode 100644 index 00000000..1fbca3df --- /dev/null +++ b/rust/automerge-c/README.md @@ -0,0 +1,207 @@ +# Overview + +automerge-c exposes a C API that can either be used directly or as the basis +for other language bindings that have good support for calling C functions. + +# Installing + +See the main README for instructions on getting your environment set up and then +you can build the automerge-c library and install its constituent files within +a root directory of your choosing (e.g. "/usr/local") like so: +```shell +cmake -E make_directory automerge-c/build +cmake -S automerge-c -B automerge-c/build +cmake --build automerge-c/build +cmake --install automerge-c/build --prefix "/usr/local" +``` +Installation is important because the name, location and structure of CMake's +out-of-source build subdirectory is subject to change based on the platform and +the release version; generated headers like `automerge-c/config.h` and +`automerge-c/utils/enum_string.h` are only sure to be found within their +installed locations. + +It's not obvious because they are versioned but the `Cargo.toml` and +`cbindgen.toml` configuration files are also generated in order to ensure that +the project name, project version and library name that they contain match those +specified within the top-level `CMakeLists.txt` file. + +If you'd like to cross compile the library for different platforms you can do so +using [cross](https://github.com/cross-rs/cross). For example: + +- `cross build --manifest-path rust/automerge-c/Cargo.toml -r --target aarch64-unknown-linux-gnu` + +This will output a shared library in the directory `rust/target/aarch64-unknown-linux-gnu/release/`. + +You can replace `aarch64-unknown-linux-gnu` with any +[cross supported targets](https://github.com/cross-rs/cross#supported-targets). +The targets below are known to work, though other targets are expected to work +too: + +- `x86_64-apple-darwin` +- `aarch64-apple-darwin` +- `x86_64-unknown-linux-gnu` +- `aarch64-unknown-linux-gnu` + +As a caveat, CMake generates the `automerge.h` header file in terms of the +processor architecture of the computer on which it was built so, for example, +don't use a header generated for a 64-bit processor if your target is a 32-bit +processor. + +# Usage + +You can build and view the C API's HTML reference documentation like so: +```shell +cmake -E make_directory automerge-c/build +cmake -S automerge-c -B automerge-c/build +cmake --build automerge-c/build --target automerge_docs +firefox automerge-c/build/src/html/index.html +``` + +To get started quickly, look at the +[examples](https://github.com/automerge/automerge-rs/tree/main/rust/automerge-c/examples). + +Almost all operations in automerge-c act on an Automerge document +(`AMdoc` struct) which is structurally similar to a JSON document. + +You can get a document by calling either `AMcreate()` or `AMload()`. Operations +on a given document are not thread-safe so you must use a mutex or similar to +avoid calling more than one function on the same one concurrently. + +A C API function that could succeed or fail returns a result (`AMresult` struct) +containing a status code (`AMstatus` enum) and either a sequence of at least one +item (`AMitem` struct) or a read-only view onto a UTF-8 error message string +(`AMbyteSpan` struct). +An item contains up to three components: an index within its parent object +(`AMbyteSpan` struct or `size_t`), a unique identifier (`AMobjId` struct) and a +value. +The result of a successful function call that doesn't produce any values will +contain a single item that is void (`AM_VAL_TYPE_VOID`). +A returned result **must** be passed to `AMresultFree()` once the item(s) or +error message it contains is no longer needed in order to avoid a memory leak. +``` +#include +#include +#include +#include + +int main(int argc, char** argv) { + AMresult *docResult = AMcreate(NULL); + + if (AMresultStatus(docResult) != AM_STATUS_OK) { + char* const err_msg = AMstrdup(AMresultError(docResult), NULL); + printf("failed to create doc: %s", err_msg); + free(err_msg); + goto cleanup; + } + + AMdoc *doc; + AMitemToDoc(AMresultItem(docResult), &doc); + + // useful code goes here! + +cleanup: + AMresultFree(docResult); +} +``` + +If you are writing an application in C, the `AMstackItem()`, `AMstackItems()` +and `AMstackResult()` functions enable the lifetimes of anonymous results to be +centrally managed and allow the same validation logic to be reused without +relying upon the `goto` statement (see examples/quickstart.c). + +If you are wrapping automerge-c in another language, particularly one that has a +garbage collector, you can call the `AMresultFree()` function within a finalizer +to ensure that memory is reclaimed when it is no longer needed. + +Automerge documents consist of a mutable root which is always a map from string +keys to values. A value can be one of the following types: + +- A number of type double / int64_t / uint64_t +- An explicit true / false / null +- An immutable UTF-8 string (`AMbyteSpan`). +- An immutable array of arbitrary bytes (`AMbyteSpan`). +- A mutable map from string keys to values. +- A mutable list of values. +- A mutable UTF-8 string. + +If you read from a location in the document with no value, an item with type +`AM_VAL_TYPE_VOID` will be returned, but you cannot write such a value +explicitly. + +Under the hood, automerge references a mutable object by its object identifier +where `AM_ROOT` signifies a document's root map object. + +There are functions to put each type of value into either a map or a list, and +functions to read the current or a historical value from a map or a list. As (in general) collaborators +may edit the document at any time, you cannot guarantee that the type of the +value at a given part of the document will stay the same. As a result, reading +from the document will return an `AMitem` struct that you can inspect to +determine the type of value that it contains. + +Strings in automerge-c are represented using an `AMbyteSpan` which contains a +pointer and a length. Strings must be valid UTF-8 and may contain NUL (`0`) +characters. +For your convenience, you can call `AMstr()` to get the `AMbyteSpan` struct +equivalent of a null-terminated byte string or `AMstrdup()` to get the +representation of an `AMbyteSpan` struct as a null-terminated byte string +wherein its NUL characters have been removed/replaced as you choose. + +Putting all of that together, to read and write from the root of the document +you can do this: + +``` +#include +#include +#include +#include + +int main(int argc, char** argv) { + // ...previous example... + AMdoc *doc; + AMitemToDoc(AMresultItem(docResult), &doc); + + AMresult *putResult = AMmapPutStr(doc, AM_ROOT, AMstr("key"), AMstr("value")); + if (AMresultStatus(putResult) != AM_STATUS_OK) { + char* const err_msg = AMstrdup(AMresultError(putResult), NULL); + printf("failed to put: %s", err_msg); + free(err_msg); + goto cleanup; + } + + AMresult *getResult = AMmapGet(doc, AM_ROOT, AMstr("key"), NULL); + if (AMresultStatus(getResult) != AM_STATUS_OK) { + char* const err_msg = AMstrdup(AMresultError(putResult), NULL); + printf("failed to get: %s", err_msg); + free(err_msg); + goto cleanup; + } + + AMbyteSpan got; + if (AMitemToStr(AMresultItem(getResult), &got)) { + char* const c_str = AMstrdup(got, NULL); + printf("Got %zu-character string \"%s\"", got.count, c_str); + free(c_str); + } else { + printf("expected to read a string!"); + goto cleanup; + } + + +cleanup: + AMresultFree(getResult); + AMresultFree(putResult); + AMresultFree(docResult); +} +``` + +Functions that do not return an `AMresult` (for example `AMitemKey()`) do +not allocate memory but rather reference memory that was previously +allocated. It's therefore important to keep the original `AMresult` alive (in +this case the one returned by `AMmapRange()`) until after you are finished with +the items that it contains. However, the memory for an individual `AMitem` can +be shared with a new `AMresult` by calling `AMitemResult()` on it. In other +words, a select group of items can be filtered out of a collection and only each +one's corresponding `AMresult` must be kept alive from that point forward; the +originating collection's `AMresult` can be safely freed. + +Beyond that, good luck! diff --git a/rust/automerge-c/build.rs b/rust/automerge-c/build.rs new file mode 100644 index 00000000..bf12a105 --- /dev/null +++ b/rust/automerge-c/build.rs @@ -0,0 +1,21 @@ +extern crate cbindgen; + +use std::{env, path::PathBuf}; + +fn main() { + let crate_dir = PathBuf::from( + env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR env var is not defined"), + ); + + let config = cbindgen::Config::from_file("cbindgen.toml") + .expect("Unable to find cbindgen.toml configuration file"); + + if let Ok(writer) = cbindgen::generate_with_config(crate_dir, config) { + // \note CMake sets this environment variable before invoking Cargo so + // that it can direct the generated header file into its + // out-of-source build directory for post-processing. + if let Ok(target_dir) = env::var("CBINDGEN_TARGET_DIR") { + writer.write_to_file(PathBuf::from(target_dir).join("automerge.h")); + } + } +} diff --git a/rust/automerge-c/cbindgen.toml b/rust/automerge-c/cbindgen.toml new file mode 100644 index 00000000..21eaaadd --- /dev/null +++ b/rust/automerge-c/cbindgen.toml @@ -0,0 +1,48 @@ +after_includes = """\n +/** + * \\defgroup enumerations Public Enumerations + * Symbolic names for integer constants. + */ + +/** + * \\memberof AMdoc + * \\def AM_ROOT + * \\brief The root object of a document. + */ +#define AM_ROOT NULL + +/** + * \\memberof AMdoc + * \\def AM_CHANGE_HASH_SIZE + * \\brief The count of bytes in a change hash. + */ +#define AM_CHANGE_HASH_SIZE 32 +""" +autogen_warning = """ +/** + * \\file + * \\brief All constants, functions and types in the core Automerge C API. + * + * \\warning This file is auto-generated by cbindgen. + */ +""" +documentation = true +documentation_style = "doxy" +include_guard = "AUTOMERGE_C_H" +includes = [] +language = "C" +line_length = 140 +no_includes = true +style = "both" +sys_includes = ["stdbool.h", "stddef.h", "stdint.h", "time.h"] +usize_is_size_t = true + +[enum] +derive_const_casts = true +enum_class = true +must_use = "MUST_USE_ENUM" +prefix_with_name = true +rename_variants = "ScreamingSnakeCase" + +[export] +item_types = ["constants", "enums", "functions", "opaque", "structs", "typedefs"] diff --git a/rust/automerge-c/cmake/Cargo.toml.in b/rust/automerge-c/cmake/Cargo.toml.in new file mode 100644 index 00000000..781e2fef --- /dev/null +++ b/rust/automerge-c/cmake/Cargo.toml.in @@ -0,0 +1,22 @@ +[package] +name = "@PROJECT_NAME@" +version = "@PROJECT_VERSION@" +authors = ["Orion Henry ", "Jason Kankiewicz "] +edition = "2021" +license = "MIT" +rust-version = "1.57.0" + +[lib] +name = "@BINDINGS_NAME@" +crate-type = ["staticlib"] +bench = false +doc = false + +[dependencies] +@LIBRARY_NAME@ = { path = "../@LIBRARY_NAME@" } +hex = "^0.4.3" +libc = "^0.2" +smol_str = "^0.1.21" + +[build-dependencies] +cbindgen = "^0.24" diff --git a/rust/automerge-c/cmake/automerge-c-config.cmake.in b/rust/automerge-c/cmake/automerge-c-config.cmake.in new file mode 100644 index 00000000..fd39aee6 --- /dev/null +++ b/rust/automerge-c/cmake/automerge-c-config.cmake.in @@ -0,0 +1,99 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) + +set(THREADS_PREFER_PTHREAD_FLAG TRUE) + +find_dependency(Threads) + +find_library(@SYMBOL_PREFIX@_IMPLIB_DEBUG @LIBRARY_NAME@${CMAKE_DEBUG_POSTFIX} PATHS "${PACKAGE_PREFIX_DIR}/debug/${CMAKE_INSTALL_LIBDIR}" "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_LIBDIR}" NO_DEFAULT_PATH) + +find_library(@SYMBOL_PREFIX@_IMPLIB_RELEASE @LIBRARY_NAME@${CMAKE_RELEASE_POSTFIX} PATHS "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_LIBDIR}" NO_DEFAULT_PATH) + +find_file(@SYMBOL_PREFIX@_LOCATION_DEBUG "${CMAKE_SHARED_LIBRARY_PREFIX}@LIBRARY_NAME@${CMAKE_DEBUG_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}" PATHS "${PACKAGE_PREFIX_DIR}/debug/${CMAKE_INSTALL_BINDIR}" "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_LIBDIR}" NO_DEFAULT_PATH) + +find_file(@SYMBOL_PREFIX@_LOCATION_RELEASE "${CMAKE_SHARED_LIBRARY_PREFIX}@LIBRARY_NAME@${CMAKE_RELEASE_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}" PATHS "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_BINDIR}" NO_DEFAULT_PATH) + +if(@BUILD_SHARED_LIBS@) + set(@SYMBOL_PREFIX@_DEFINE_SYMBOL "@SYMBOL_PREFIX@_EXPORTS") + + if(WIN32) + set(@SYMBOL_PREFIX@_NO_SONAME_DEBUG "TRUE") + + set(@SYMBOL_PREFIX@_NO_SONAME_RELEASE "TRUE") + + set(@SYMBOL_PREFIX@_SONAME_DEBUG "") + + set(@SYMBOL_PREFIX@_SONAME_RELEASE "") + else() + set(@SYMBOL_PREFIX@_NO_SONAME_DEBUG "FALSE") + + set(@SYMBOL_PREFIX@_NO_SONAME_RELEASE "FALSE") + + get_filename_component(@SYMBOL_PREFIX@_SONAME_DEBUG "${@SYMBOL_PREFIX@_LOCATION_DEBUG}" NAME) + + get_filename_component(@SYMBOL_PREFIX@_SONAME_RELEASE "${@SYMBOL_PREFIX@_LOCATION_RELEASE}" NAME) + endif() + + set(@SYMBOL_PREFIX@_TYPE "SHARED") +else() + set(@SYMBOL_PREFIX@_DEFINE_SYMBOL "") + + set(@SYMBOL_PREFIX@_LOCATION_DEBUG "${@SYMBOL_PREFIX@_IMPLIB_DEBUG}") + + set(@SYMBOL_PREFIX@_IMPLIB_DEBUG "") + + set(@SYMBOL_PREFIX@_LOCATION_RELEASE "${@SYMBOL_PREFIX@_IMPLIB_RELEASE}") + + set(@SYMBOL_PREFIX@_IMPLIB_RELEASE "") + + set(@SYMBOL_PREFIX@_NO_SONAME_DEBUG "TRUE") + + set(@SYMBOL_PREFIX@_NO_SONAME_RELEASE "TRUE") + + set(@SYMBOL_PREFIX@_SONAME_DEBUG "") + + set(@SYMBOL_PREFIX@_SONAME_RELEASE "") + + set(@SYMBOL_PREFIX@_TYPE "STATIC") +endif() + +add_library(@NAMESPACE@@PROJECT_NAME@ ${@SYMBOL_PREFIX@_TYPE} IMPORTED) + +set_target_properties( + @NAMESPACE@@PROJECT_NAME@ + PROPERTIES + # \note Cargo writes a debug build into a nested directory instead of + # decorating its name. + DEBUG_POSTFIX "" + DEFINE_SYMBOL "${@SYMBOL_PREFIX@_DEFINE_SYMBOL}" + IMPORTED_CONFIGURATIONS "RELEASE;DEBUG" + IMPORTED_IMPLIB_DEBUG "${@SYMBOL_PREFIX@_IMPLIB_DEBUG}" + IMPORTED_IMPLIB_RELEASE "${@SYMBOL_PREFIX@_IMPLIB_RELEASE}" + IMPORTED_LOCATION_DEBUG "${@SYMBOL_PREFIX@_LOCATION_DEBUG}" + IMPORTED_LOCATION_RELEASE "${@SYMBOL_PREFIX@_LOCATION_RELEASE}" + IMPORTED_NO_SONAME_DEBUG "${@SYMBOL_PREFIX@_NO_SONAME_DEBUG}" + IMPORTED_NO_SONAME_RELEASE "${@SYMBOL_PREFIX@_NO_SONAME_RELEASE}" + IMPORTED_SONAME_DEBUG "${@SYMBOL_PREFIX@_SONAME_DEBUG}" + IMPORTED_SONAME_RELEASE "${@SYMBOL_PREFIX@_SONAME_RELEASE}" + INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_INCLUDEDIR}" + LINKER_LANGUAGE C + PUBLIC_HEADER "${PACKAGE_PREFIX_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/@PROJECT_NAME@/@LIBRARY_NAME@.h" + SOVERSION "@PROJECT_VERSION_MAJOR@" + VERSION "@PROJECT_VERSION@" + # \note Cargo exports all of the symbols automatically. + WINDOWS_EXPORT_ALL_SYMBOLS "TRUE" +) + +# Remove the variables that the find_* command calls cached. +unset(@SYMBOL_PREFIX@_IMPLIB_DEBUG CACHE) + +unset(@SYMBOL_PREFIX@_IMPLIB_RELEASE CACHE) + +unset(@SYMBOL_PREFIX@_LOCATION_DEBUG CACHE) + +unset(@SYMBOL_PREFIX@_LOCATION_RELEASE CACHE) + +check_required_components(@PROJECT_NAME@) diff --git a/rust/automerge-c/cmake/cbindgen.toml.in b/rust/automerge-c/cmake/cbindgen.toml.in new file mode 100644 index 00000000..5122b75c --- /dev/null +++ b/rust/automerge-c/cmake/cbindgen.toml.in @@ -0,0 +1,48 @@ +after_includes = """\n +/** + * \\defgroup enumerations Public Enumerations + * Symbolic names for integer constants. + */ + +/** + * \\memberof AMdoc + * \\def AM_ROOT + * \\brief The root object of a document. + */ +#define AM_ROOT NULL + +/** + * \\memberof AMdoc + * \\def AM_CHANGE_HASH_SIZE + * \\brief The count of bytes in a change hash. + */ +#define AM_CHANGE_HASH_SIZE 32 +""" +autogen_warning = """ +/** + * \\file + * \\brief All constants, functions and types in the core Automerge C API. + * + * \\warning This file is auto-generated by cbindgen. + */ +""" +documentation = true +documentation_style = "doxy" +include_guard = "@INCLUDE_GUARD_PREFIX@_H" +includes = [] +language = "C" +line_length = 140 +no_includes = true +style = "both" +sys_includes = ["stdbool.h", "stddef.h", "stdint.h", "time.h"] +usize_is_size_t = true + +[enum] +derive_const_casts = true +enum_class = true +must_use = "MUST_USE_ENUM" +prefix_with_name = true +rename_variants = "ScreamingSnakeCase" + +[export] +item_types = ["constants", "enums", "functions", "opaque", "structs", "typedefs"] diff --git a/rust/automerge-c/cmake/config.h.in b/rust/automerge-c/cmake/config.h.in new file mode 100644 index 00000000..40482cb9 --- /dev/null +++ b/rust/automerge-c/cmake/config.h.in @@ -0,0 +1,35 @@ +#ifndef @INCLUDE_GUARD_PREFIX@_CONFIG_H +#define @INCLUDE_GUARD_PREFIX@_CONFIG_H +/** + * \file + * \brief Configuration pararameters defined by the build system. + * + * \warning This file is auto-generated by CMake. + */ + +/** + * \def @SYMBOL_PREFIX@_VERSION + * \brief Denotes a semantic version of the form {MAJOR}{MINOR}{PATCH} as three, + * two-digit decimal numbers without leading zeros (e.g. 100 is 0.1.0). + */ +#define @SYMBOL_PREFIX@_VERSION @INTEGER_PROJECT_VERSION@ + +/** + * \def @SYMBOL_PREFIX@_MAJOR_VERSION + * \brief Denotes a semantic major version as a decimal number. + */ +#define @SYMBOL_PREFIX@_MAJOR_VERSION (@SYMBOL_PREFIX@_VERSION / 100000) + +/** + * \def @SYMBOL_PREFIX@_MINOR_VERSION + * \brief Denotes a semantic minor version as a decimal number. + */ +#define @SYMBOL_PREFIX@_MINOR_VERSION ((@SYMBOL_PREFIX@_VERSION / 100) % 1000) + +/** + * \def @SYMBOL_PREFIX@_PATCH_VERSION + * \brief Denotes a semantic patch version as a decimal number. + */ +#define @SYMBOL_PREFIX@_PATCH_VERSION (@SYMBOL_PREFIX@_VERSION % 100) + +#endif /* @INCLUDE_GUARD_PREFIX@_CONFIG_H */ diff --git a/rust/automerge-c/cmake/enum-string-functions-gen.cmake b/rust/automerge-c/cmake/enum-string-functions-gen.cmake new file mode 100644 index 00000000..77080e8d --- /dev/null +++ b/rust/automerge-c/cmake/enum-string-functions-gen.cmake @@ -0,0 +1,183 @@ +# This CMake script is used to generate a header and a source file for utility +# functions that convert the tags of generated enum types into strings and +# strings into the tags of generated enum types. +cmake_minimum_required(VERSION 3.23 FATAL_ERROR) + +# Seeks the starting line of the source enum's declaration. +macro(seek_enum_mode) + if (line MATCHES "^(typedef[ \t]+)?enum ") + string(REGEX REPLACE "^enum ([0-9a-zA-Z_]+).*$" "\\1" enum_name "${line}") + set(mode "read_tags") + endif() +endmacro() + +# Scans the input for the current enum's tags. +macro(read_tags_mode) + if(line MATCHES "^}") + set(mode "generate") + elseif(line MATCHES "^[A-Z0-9_]+.*$") + string(REGEX REPLACE "^([A-Za-z0-9_]+).*$" "\\1" tmp "${line}") + list(APPEND enum_tags "${tmp}") + endif() +endmacro() + +macro(write_header_file) + # Generate a to-string function declaration. + list(APPEND header_body + "/**\n" + " * \\ingroup enumerations\n" + " * \\brief Gets the string representation of an `${enum_name}` enum tag.\n" + " *\n" + " * \\param[in] tag An `${enum_name}` enum tag.\n" + " * \\return A null-terminated byte string.\n" + " */\n" + "char const* ${enum_name}ToString(${enum_name} const tag)\;\n" + "\n") + # Generate a from-string function declaration. + list(APPEND header_body + "/**\n" + " * \\ingroup enumerations\n" + " * \\brief Gets an `${enum_name}` enum tag from its string representation.\n" + " *\n" + " * \\param[out] dest An `${enum_name}` enum tag pointer.\n" + " * \\param[in] src A null-terminated byte string.\n" + " * \\return `true` if \\p src matches the string representation of an\n" + " * `${enum_name}` enum tag, `false` otherwise.\n" + " */\n" + "bool ${enum_name}FromString(${enum_name}* dest, char const* const src)\;\n" + "\n") +endmacro() + +macro(write_source_file) + # Generate a to-string function implementation. + list(APPEND source_body + "char const* ${enum_name}ToString(${enum_name} const tag) {\n" + " switch (tag) {\n" + " default:\n" + " return \"???\"\;\n") + foreach(label IN LISTS enum_tags) + list(APPEND source_body + " case ${label}:\n" + " return \"${label}\"\;\n") + endforeach() + list(APPEND source_body + " }\n" + "}\n" + "\n") + # Generate a from-string function implementation. + list(APPEND source_body + "bool ${enum_name}FromString(${enum_name}* dest, char const* const src) {\n") + foreach(label IN LISTS enum_tags) + list(APPEND source_body + " if (!strcmp(src, \"${label}\")) {\n" + " *dest = ${label}\;\n" + " return true\;\n" + " }\n") + endforeach() + list(APPEND source_body + " return false\;\n" + "}\n" + "\n") +endmacro() + +function(main) + set(header_body "") + # File header and includes. + list(APPEND header_body + "#ifndef ${include_guard}\n" + "#define ${include_guard}\n" + "/**\n" + " * \\file\n" + " * \\brief Utility functions for converting enum tags into null-terminated\n" + " * byte strings and vice versa.\n" + " *\n" + " * \\warning This file is auto-generated by CMake.\n" + " */\n" + "\n" + "#include \n" + "\n" + "#include <${library_include}>\n" + "\n") + set(source_body "") + # File includes. + list(APPEND source_body + "/** \\warning This file is auto-generated by CMake. */\n" + "\n" + "#include \"stdio.h\"\n" + "#include \"string.h\"\n" + "\n" + "#include <${header_include}>\n" + "\n") + set(enum_name "") + set(enum_tags "") + set(mode "seek_enum") + file(STRINGS "${input_path}" lines) + foreach(line IN LISTS lines) + string(REGEX REPLACE "^(.+)(//.*)?" "\\1" line "${line}") + string(STRIP "${line}" line) + if(mode STREQUAL "seek_enum") + seek_enum_mode() + elseif(mode STREQUAL "read_tags") + read_tags_mode() + else() + # The end of the enum declaration was reached. + if(NOT enum_name) + # The end of the file was reached. + return() + endif() + if(NOT enum_tags) + message(FATAL_ERROR "No tags found for `${enum_name}`.") + endif() + string(TOLOWER "${enum_name}" output_stem_prefix) + string(CONCAT output_stem "${output_stem_prefix}" "_string") + cmake_path(REPLACE_EXTENSION output_stem "h" OUTPUT_VARIABLE output_header_basename) + write_header_file() + write_source_file() + set(enum_name "") + set(enum_tags "") + set(mode "seek_enum") + endif() + endforeach() + # File footer. + list(APPEND header_body + "#endif /* ${include_guard} */\n") + message(STATUS "Generating header file \"${output_header_path}\"...") + file(WRITE "${output_header_path}" ${header_body}) + message(STATUS "Generating source file \"${output_source_path}\"...") + file(WRITE "${output_source_path}" ${source_body}) +endfunction() + +if(NOT DEFINED PROJECT_NAME) + message(FATAL_ERROR "Variable PROJECT_NAME is not defined.") +elseif(NOT DEFINED LIBRARY_NAME) + message(FATAL_ERROR "Variable LIBRARY_NAME is not defined.") +elseif(NOT DEFINED SUBDIR) + message(FATAL_ERROR "Variable SUBDIR is not defined.") +elseif(${CMAKE_ARGC} LESS 9) + message(FATAL_ERROR "Too few arguments.") +elseif(${CMAKE_ARGC} GREATER 10) + message(FATAL_ERROR "Too many arguments.") +elseif(NOT EXISTS ${CMAKE_ARGV5}) + message(FATAL_ERROR "Input header \"${CMAKE_ARGV7}\" not found.") +endif() +cmake_path(CONVERT "${CMAKE_ARGV7}" TO_CMAKE_PATH_LIST input_path NORMALIZE) +cmake_path(CONVERT "${CMAKE_ARGV8}" TO_CMAKE_PATH_LIST output_header_path NORMALIZE) +cmake_path(CONVERT "${CMAKE_ARGV9}" TO_CMAKE_PATH_LIST output_source_path NORMALIZE) +string(TOLOWER "${PROJECT_NAME}" project_root) +cmake_path(CONVERT "${SUBDIR}" TO_CMAKE_PATH_LIST project_subdir NORMALIZE) +string(TOLOWER "${project_subdir}" project_subdir) +string(TOLOWER "${LIBRARY_NAME}" library_stem) +cmake_path(REPLACE_EXTENSION library_stem "h" OUTPUT_VARIABLE library_basename) +string(JOIN "/" library_include "${project_root}" "${library_basename}") +string(TOUPPER "${PROJECT_NAME}" project_name_upper) +string(TOUPPER "${project_subdir}" include_guard_infix) +string(REGEX REPLACE "/" "_" include_guard_infix "${include_guard_infix}") +string(REGEX REPLACE "-" "_" include_guard_prefix "${project_name_upper}") +string(JOIN "_" include_guard_prefix "${include_guard_prefix}" "${include_guard_infix}") +string(JOIN "/" output_header_prefix "${project_root}" "${project_subdir}") +cmake_path(GET output_header_path STEM output_header_stem) +string(TOUPPER "${output_header_stem}" include_guard_stem) +string(JOIN "_" include_guard "${include_guard_prefix}" "${include_guard_stem}" "H") +cmake_path(GET output_header_path FILENAME output_header_basename) +string(JOIN "/" header_include "${output_header_prefix}" "${output_header_basename}") +main() diff --git a/rust/automerge-c/cmake/file-regex-replace.cmake b/rust/automerge-c/cmake/file-regex-replace.cmake new file mode 100644 index 00000000..09005bc2 --- /dev/null +++ b/rust/automerge-c/cmake/file-regex-replace.cmake @@ -0,0 +1,33 @@ +# This CMake script is used to perform string substitutions within a generated +# file. +cmake_minimum_required(VERSION 3.23 FATAL_ERROR) + +if(NOT DEFINED MATCH_REGEX) + message(FATAL_ERROR "Variable \"MATCH_REGEX\" is not defined.") +elseif(NOT DEFINED REPLACE_EXPR) + message(FATAL_ERROR "Variable \"REPLACE_EXPR\" is not defined.") +elseif(${CMAKE_ARGC} LESS 7) + message(FATAL_ERROR "Too few arguments.") +elseif(${CMAKE_ARGC} GREATER 8) + message(FATAL_ERROR "Too many arguments.") +elseif(NOT EXISTS ${CMAKE_ARGV6}) + message(FATAL_ERROR "Input file \"${CMAKE_ARGV6}\" not found.") +endif() + +message(STATUS "Replacing \"${MATCH_REGEX}\" with \"${REPLACE_EXPR}\" in \"${CMAKE_ARGV6}\"...") + +file(READ ${CMAKE_ARGV6} INPUT_STRING) + +string(REGEX REPLACE "${MATCH_REGEX}" "${REPLACE_EXPR}" OUTPUT_STRING "${INPUT_STRING}") + +if(DEFINED CMAKE_ARGV7) + set(OUTPUT_FILE "${CMAKE_ARGV7}") +else() + set(OUTPUT_FILE "${CMAKE_ARGV6}") +endif() + +if(NOT "${OUTPUT_STRING}" STREQUAL "${INPUT_STRING}") + file(WRITE ${OUTPUT_FILE} "${OUTPUT_STRING}") + + message(STATUS "Created/updated \"${OUTPUT_FILE}\".") +endif() diff --git a/rust/automerge-c/cmake/file-touch.cmake b/rust/automerge-c/cmake/file-touch.cmake new file mode 100644 index 00000000..2c196755 --- /dev/null +++ b/rust/automerge-c/cmake/file-touch.cmake @@ -0,0 +1,35 @@ +# This CMake script is used to force Cargo to regenerate the header file for the +# core bindings after the out-of-source build directory has been cleaned. +cmake_minimum_required(VERSION 3.23 FATAL_ERROR) + +if(NOT DEFINED CONDITION) + message(FATAL_ERROR "Variable \"CONDITION\" is not defined.") +elseif(${CMAKE_ARGC} LESS 7) + message(FATAL_ERROR "Too few arguments.") +elseif(${CMAKE_ARGC} GREATER 7) + message(FATAL_ERROR "Too many arguments.") +elseif(NOT EXISTS ${CMAKE_ARGV6}) + message(FATAL_ERROR "File \"${CMAKE_ARGV6}\" not found.") +elseif(IS_DIRECTORY "${CMAKE_ARG6}") + message(FATAL_ERROR "Directory \"${CMAKE_ARG6}\" can't be touched.") +endif() + +message(STATUS "Touching \"${CMAKE_ARGV6}\" if ${CONDITION} \"${CMAKE_ARGV5}\"...") + +if(CONDITION STREQUAL "EXISTS") + if(EXISTS "${CMAKE_ARGV5}") + set(DO_IT TRUE) + endif() +elseif((CONDITION STREQUAL "NOT_EXISTS") OR (CONDITION STREQUAL "!EXISTS")) + if(NOT EXISTS "${CMAKE_ARGV5}") + set(DO_IT TRUE) + endif() +else() + message(FATAL_ERROR "Unexpected condition \"${CONDITION}\".") +endif() + +if(DO_IT) + file(TOUCH_NOCREATE "${CMAKE_ARGV6}") + + message(STATUS "Touched \"${CMAKE_ARGV6}\".") +endif() diff --git a/rust/automerge-c/docs/CMakeLists.txt b/rust/automerge-c/docs/CMakeLists.txt new file mode 100644 index 00000000..1d94c872 --- /dev/null +++ b/rust/automerge-c/docs/CMakeLists.txt @@ -0,0 +1,35 @@ +find_package(Doxygen OPTIONAL_COMPONENTS dot) + +if(DOXYGEN_FOUND) + set(DOXYGEN_ALIASES "installed_headerfile=\\headerfile ${LIBRARY_NAME}.h <${PROJECT_NAME}/${LIBRARY_NAME}.h>") + + set(DOXYGEN_GENERATE_LATEX YES) + + set(DOXYGEN_PDF_HYPERLINKS YES) + + set(DOXYGEN_PROJECT_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/img/brandmark.png") + + set(DOXYGEN_SORT_BRIEF_DOCS YES) + + set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md") + + doxygen_add_docs( + ${LIBRARY_NAME}_docs + "${CBINDGEN_TARGET_DIR}/${LIBRARY_NAME}.h" + "${CBINDGEN_TARGET_DIR}/config.h" + "${CBINDGEN_TARGET_DIR}/${UTILS_SUBDIR}/enum_string.h" + "${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/result.h" + "${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/stack_callback_data.h" + "${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/stack.h" + "${CMAKE_SOURCE_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${UTILS_SUBDIR}/string.h" + "${CMAKE_SOURCE_DIR}/README.md" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Producing documentation with Doxygen..." + ) + + # \note A Doxygen input file isn't a file-level dependency so the Doxygen + # command must instead depend upon a target that either outputs the + # file or depends upon it also or it will just output an error message + # when it can't be found. + add_dependencies(${LIBRARY_NAME}_docs ${BINDINGS_NAME}_artifacts ${LIBRARY_NAME}_utilities) +endif() diff --git a/rust/automerge-c/docs/img/brandmark.png b/rust/automerge-c/docs/img/brandmark.png new file mode 100644 index 00000000..56e1c82d Binary files /dev/null and b/rust/automerge-c/docs/img/brandmark.png differ diff --git a/rust/automerge-c/examples/CMakeLists.txt b/rust/automerge-c/examples/CMakeLists.txt new file mode 100644 index 00000000..f080237b --- /dev/null +++ b/rust/automerge-c/examples/CMakeLists.txt @@ -0,0 +1,40 @@ +add_executable( + ${LIBRARY_NAME}_quickstart + quickstart.c +) + +set_target_properties(${LIBRARY_NAME}_quickstart PROPERTIES LINKER_LANGUAGE C) + +# \note An imported library's INTERFACE_INCLUDE_DIRECTORIES property can't +# contain a non-existent path so its build-time include directory +# must be specified for all of its dependent targets instead. +target_include_directories( + ${LIBRARY_NAME}_quickstart + PRIVATE "$" +) + +target_link_libraries(${LIBRARY_NAME}_quickstart PRIVATE ${LIBRARY_NAME}) + +add_dependencies(${LIBRARY_NAME}_quickstart ${BINDINGS_NAME}_artifacts) + +if(BUILD_SHARED_LIBS AND WIN32) + add_custom_command( + TARGET ${LIBRARY_NAME}_quickstart + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CARGO_CURRENT_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${LIBRARY_NAME}${CMAKE_${CMAKE_BUILD_TYPE}_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX} + ${CMAKE_BINARY_DIR} + COMMENT "Copying the DLL built by Cargo into the examples directory..." + VERBATIM + ) +endif() + +add_custom_command( + TARGET ${LIBRARY_NAME}_quickstart + POST_BUILD + COMMAND + ${LIBRARY_NAME}_quickstart + COMMENT + "Running the example quickstart..." + VERBATIM +) diff --git a/rust/automerge-c/examples/README.md b/rust/automerge-c/examples/README.md new file mode 100644 index 00000000..17e69412 --- /dev/null +++ b/rust/automerge-c/examples/README.md @@ -0,0 +1,9 @@ +# Automerge C examples + +## Quickstart + +```shell +cmake -E make_directory automerge-c/build +cmake -S automerge-c -B automerge-c/build +cmake --build automerge-c/build --target automerge_quickstart +``` diff --git a/rust/automerge-c/examples/quickstart.c b/rust/automerge-c/examples/quickstart.c new file mode 100644 index 00000000..ab6769ef --- /dev/null +++ b/rust/automerge-c/examples/quickstart.c @@ -0,0 +1,129 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +static bool abort_cb(AMstack**, void*); + +/** + * \brief Based on https://automerge.github.io/docs/quickstart + */ +int main(int argc, char** argv) { + AMstack* stack = NULL; + AMdoc* doc1; + AMitemToDoc(AMstackItem(&stack, AMcreate(NULL), abort_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1); + AMobjId const* const cards = + AMitemObjId(AMstackItem(&stack, AMmapPutObject(doc1, AM_ROOT, AMstr("cards"), AM_OBJ_TYPE_LIST), abort_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMobjId const* const card1 = + AMitemObjId(AMstackItem(&stack, AMlistPutObject(doc1, cards, SIZE_MAX, true, AM_OBJ_TYPE_MAP), abort_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMmapPutStr(doc1, card1, AMstr("title"), AMstr("Rewrite everything in Clojure")), abort_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutBool(doc1, card1, AMstr("done"), false), abort_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMobjId const* const card2 = + AMitemObjId(AMstackItem(&stack, AMlistPutObject(doc1, cards, SIZE_MAX, true, AM_OBJ_TYPE_MAP), abort_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMmapPutStr(doc1, card2, AMstr("title"), AMstr("Rewrite everything in Haskell")), abort_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutBool(doc1, card2, AMstr("done"), false), abort_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr("Add card"), NULL), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMdoc* doc2; + AMitemToDoc(AMstackItem(&stack, AMcreate(NULL), abort_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2); + AMstackItem(NULL, AMmerge(doc2, doc1), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMbyteSpan binary; + AMitemToBytes(AMstackItem(&stack, AMsave(doc1), abort_cb, AMexpect(AM_VAL_TYPE_BYTES)), &binary); + AMitemToDoc(AMstackItem(&stack, AMload(binary.src, binary.count), abort_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2); + + AMstackItem(NULL, AMmapPutBool(doc1, card1, AMstr("done"), true), abort_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr("Mark card as done"), NULL), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMlistDelete(doc2, cards, 0), abort_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc2, AMstr("Delete card"), NULL), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMmerge(doc1, doc2), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMitems changes = AMstackItems(&stack, AMgetChanges(doc1, NULL), abort_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMitem* item = NULL; + while ((item = AMitemsNext(&changes, 1)) != NULL) { + AMchange const* change; + AMitemToChange(item, &change); + AMitems const heads = AMstackItems(&stack, AMitemFromChangeHash(AMchangeHash(change)), abort_cb, + AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + char* const c_msg = AMstrdup(AMchangeMessage(change), NULL); + printf("%s %zu\n", c_msg, AMobjSize(doc1, cards, &heads)); + free(c_msg); + } + AMstackFree(&stack); +} + +/** + * \brief Examines the result at the top of the given stack and, if it's + * invalid, prints an error message to `stderr`, deallocates all results + * in the stack and exits. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] data A pointer to an owned `AMstackCallbackData` struct or `NULL`. + * \return `true` if the top `AMresult` in \p stack is valid, `false` otherwise. + * \pre \p stack `!= NULL`. + */ +static bool abort_cb(AMstack** stack, void* data) { + static char buffer[512] = {0}; + + char const* suffix = NULL; + if (!stack) { + suffix = "Stack*"; + } else if (!*stack) { + suffix = "Stack"; + } else if (!(*stack)->result) { + suffix = ""; + } + if (suffix) { + fprintf(stderr, "Null `AMresult%s*`.\n", suffix); + AMstackFree(stack); + exit(EXIT_FAILURE); + return false; + } + AMstatus const status = AMresultStatus((*stack)->result); + switch (status) { + case AM_STATUS_ERROR: + strcpy(buffer, "Error"); + break; + case AM_STATUS_INVALID_RESULT: + strcpy(buffer, "Invalid result"); + break; + case AM_STATUS_OK: + break; + default: + sprintf(buffer, "Unknown `AMstatus` tag %d", status); + } + if (buffer[0]) { + char* const c_msg = AMstrdup(AMresultError((*stack)->result), NULL); + fprintf(stderr, "%s; %s.\n", buffer, c_msg); + free(c_msg); + AMstackFree(stack); + exit(EXIT_FAILURE); + return false; + } + if (data) { + AMstackCallbackData* sc_data = (AMstackCallbackData*)data; + AMvalType const tag = AMitemValType(AMresultItem((*stack)->result)); + if (tag != sc_data->bitmask) { + fprintf(stderr, "Unexpected tag `%s` (%d) instead of `%s` at %s:%d.\n", AMvalTypeToString(tag), tag, + AMvalTypeToString(sc_data->bitmask), sc_data->file, sc_data->line); + free(sc_data); + AMstackFree(stack); + exit(EXIT_FAILURE); + return false; + } + } + free(data); + return true; +} diff --git a/rust/automerge-c/include/automerge-c/utils/result.h b/rust/automerge-c/include/automerge-c/utils/result.h new file mode 100644 index 00000000..ab8a2f93 --- /dev/null +++ b/rust/automerge-c/include/automerge-c/utils/result.h @@ -0,0 +1,30 @@ +#ifndef AUTOMERGE_C_UTILS_RESULT_H +#define AUTOMERGE_C_UTILS_RESULT_H +/** + * \file + * \brief Utility functions for use with `AMresult` structs. + */ + +#include + +#include + +/** + * \brief Transfers the items within an arbitrary list of results into a + * new result in their order of specification. + * \param[in] count The count of subsequent arguments. + * \param[in] ... A \p count list of arguments, each of which is a pointer to + * an `AMresult` struct whose items will be transferred out of it + * and which is subsequently freed. + * \return A pointer to an `AMresult` struct or `NULL`. + * \pre `∀𝑥 ∈` \p ... `, AMresultStatus(𝑥) == AM_STATUS_OK` + * \post `(∃𝑥 ∈` \p ... `, AMresultStatus(𝑥) != AM_STATUS_OK) -> NULL` + * \attention All `AMresult` struct pointer arguments are passed to + * `AMresultFree()` regardless of success; use `AMresultCat()` + * instead if you wish to pass them to `AMresultFree()` yourself. + * \warning The returned `AMresult` struct pointer must be passed to + * `AMresultFree()` in order to avoid a memory leak. + */ +AMresult* AMresultFrom(int count, ...); + +#endif /* AUTOMERGE_C_UTILS_RESULT_H */ diff --git a/rust/automerge-c/include/automerge-c/utils/stack.h b/rust/automerge-c/include/automerge-c/utils/stack.h new file mode 100644 index 00000000..a8e9fd08 --- /dev/null +++ b/rust/automerge-c/include/automerge-c/utils/stack.h @@ -0,0 +1,130 @@ +#ifndef AUTOMERGE_C_UTILS_STACK_H +#define AUTOMERGE_C_UTILS_STACK_H +/** + * \file + * \brief Utility data structures and functions for hiding `AMresult` structs, + * managing their lifetimes, and automatically applying custom + * validation logic to the `AMitem` structs that they contain. + * + * \note The `AMstack` struct and its related functions drastically reduce the + * need for boilerplate code and/or `goto` statement usage within a C + * application but a higher-level programming language offers even better + * ways to do the same things. + */ + +#include + +/** + * \struct AMstack + * \brief A node in a singly-linked list of result pointers. + */ +typedef struct AMstack { + /** A result to be deallocated. */ + AMresult* result; + /** The previous node in the singly-linked list or `NULL`. */ + struct AMstack* prev; +} AMstack; + +/** + * \memberof AMstack + * \brief The prototype of a function that examines the result at the top of + * the given stack in terms of some arbitrary data. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] data A pointer to arbitrary data or `NULL`. + * \return `true` if the top `AMresult` struct in \p stack is valid, `false` + * otherwise. + * \pre \p stack `!= NULL`. + */ +typedef bool (*AMstackCallback)(AMstack** stack, void* data); + +/** + * \memberof AMstack + * \brief Deallocates the storage for a stack of results. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \pre \p stack `!= NULL` + * \post `*stack == NULL` + */ +void AMstackFree(AMstack** stack); + +/** + * \memberof AMstack + * \brief Gets a result from the stack after removing it. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] result A pointer to the `AMresult` to be popped or `NULL` to + * select the top result in \p stack. + * \return A pointer to an `AMresult` struct or `NULL`. + * \pre \p stack `!= NULL` + * \warning The returned `AMresult` struct pointer must be passed to + * `AMresultFree()` in order to avoid a memory leak. + */ +AMresult* AMstackPop(AMstack** stack, AMresult const* result); + +/** + * \memberof AMstack + * \brief Pushes the given result onto the given stack, calls the given + * callback with the given data to validate it and then either gets the + * result if it's valid or gets `NULL` instead. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] result A pointer to an `AMresult` struct. + * \param[in] callback A pointer to a function with the same signature as + * `AMstackCallback()` or `NULL`. + * \param[in] data A pointer to arbitrary data or `NULL` which is passed to + * \p callback. + * \return \p result or `NULL`. + * \warning If \p stack `== NULL` then \p result is deallocated in order to + * avoid a memory leak. + */ +AMresult* AMstackResult(AMstack** stack, AMresult* result, AMstackCallback callback, void* data); + +/** + * \memberof AMstack + * \brief Pushes the given result onto the given stack, calls the given + * callback with the given data to validate it and then either gets the + * first item in the sequence of items within that result if it's valid + * or gets `NULL` instead. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] result A pointer to an `AMresult` struct. + * \param[in] callback A pointer to a function with the same signature as + * `AMstackCallback()` or `NULL`. + * \param[in] data A pointer to arbitrary data or `NULL` which is passed to + * \p callback. + * \return A pointer to an `AMitem` struct or `NULL`. + * \warning If \p stack `== NULL` then \p result is deallocated in order to + * avoid a memory leak. + */ +AMitem* AMstackItem(AMstack** stack, AMresult* result, AMstackCallback callback, void* data); + +/** + * \memberof AMstack + * \brief Pushes the given result onto the given stack, calls the given + * callback with the given data to validate it and then either gets an + * `AMitems` struct over the sequence of items within that result if it's + * valid or gets an empty `AMitems` instead. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] result A pointer to an `AMresult` struct. + * \param[in] callback A pointer to a function with the same signature as + * `AMstackCallback()` or `NULL`. + * \param[in] data A pointer to arbitrary data or `NULL` which is passed to + * \p callback. + * \return An `AMitems` struct. + * \warning If \p stack `== NULL` then \p result is deallocated immediately + * in order to avoid a memory leak. + */ +AMitems AMstackItems(AMstack** stack, AMresult* result, AMstackCallback callback, void* data); + +/** + * \memberof AMstack + * \brief Gets the count of results that have been pushed onto the stack. + * + * \param[in,out] stack A pointer to an `AMstack` struct. + * \return A 64-bit unsigned integer. + */ +size_t AMstackSize(AMstack const* const stack); + +#endif /* AUTOMERGE_C_UTILS_STACK_H */ diff --git a/rust/automerge-c/include/automerge-c/utils/stack_callback_data.h b/rust/automerge-c/include/automerge-c/utils/stack_callback_data.h new file mode 100644 index 00000000..6f9f1edb --- /dev/null +++ b/rust/automerge-c/include/automerge-c/utils/stack_callback_data.h @@ -0,0 +1,53 @@ +#ifndef AUTOMERGE_C_UTILS_PUSH_CALLBACK_DATA_H +#define AUTOMERGE_C_UTILS_PUSH_CALLBACK_DATA_H +/** + * \file + * \brief Utility data structures, functions and macros for supplying + * parameters to the custom validation logic applied to `AMitem` + * structs. + */ + +#include + +/** + * \struct AMstackCallbackData + * \brief A data structure for passing the parameters of an item value test + * to an implementation of the `AMstackCallback` function prototype. + */ +typedef struct { + /** A bitmask of `AMvalType` tags. */ + AMvalType bitmask; + /** A null-terminated file path string. */ + char const* file; + /** The ordinal number of a line within a file. */ + int line; +} AMstackCallbackData; + +/** + * \memberof AMstackCallbackData + * \brief Allocates a new `AMstackCallbackData` struct and initializes its + * members from their corresponding arguments. + * + * \param[in] bitmask A bitmask of `AMvalType` tags. + * \param[in] file A null-terminated file path string. + * \param[in] line The ordinal number of a line within a file. + * \return A pointer to a disowned `AMstackCallbackData` struct. + * \warning The returned pointer must be passed to `free()` to avoid a memory + * leak. + */ +AMstackCallbackData* AMstackCallbackDataInit(AMvalType const bitmask, char const* const file, int const line); + +/** + * \memberof AMstackCallbackData + * \def AMexpect + * \brief Allocates a new `AMstackCallbackData` struct and initializes it from + * an `AMvalueType` bitmask. + * + * \param[in] bitmask A bitmask of `AMvalType` tags. + * \return A pointer to a disowned `AMstackCallbackData` struct. + * \warning The returned pointer must be passed to `free()` to avoid a memory + * leak. + */ +#define AMexpect(bitmask) AMstackCallbackDataInit(bitmask, __FILE__, __LINE__) + +#endif /* AUTOMERGE_C_UTILS_PUSH_CALLBACK_DATA_H */ diff --git a/rust/automerge-c/include/automerge-c/utils/string.h b/rust/automerge-c/include/automerge-c/utils/string.h new file mode 100644 index 00000000..4d61c2e9 --- /dev/null +++ b/rust/automerge-c/include/automerge-c/utils/string.h @@ -0,0 +1,29 @@ +#ifndef AUTOMERGE_C_UTILS_STRING_H +#define AUTOMERGE_C_UTILS_STRING_H +/** + * \file + * \brief Utility functions for use with `AMbyteSpan` structs that provide + * UTF-8 string views. + */ + +#include + +/** + * \memberof AMbyteSpan + * \brief Returns a pointer to a null-terminated byte string which is a + * duplicate of the given UTF-8 string view except for the substitution + * of its NUL (0) characters with the specified null-terminated byte + * string. + * + * \param[in] str A UTF-8 string view as an `AMbyteSpan` struct. + * \param[in] nul A null-terminated byte string to substitute for NUL characters + * or `NULL` to substitute `"\\0"` for NUL characters. + * \return A disowned null-terminated byte string. + * \pre \p str.src `!= NULL` + * \pre \p str.count `<= sizeof(`\p str.src `)` + * \warning The returned pointer must be passed to `free()` to avoid a memory + * leak. + */ +char* AMstrdup(AMbyteSpan const str, char const* nul); + +#endif /* AUTOMERGE_C_UTILS_STRING_H */ diff --git a/rust/automerge-c/src/actor_id.rs b/rust/automerge-c/src/actor_id.rs new file mode 100644 index 00000000..5a28959e --- /dev/null +++ b/rust/automerge-c/src/actor_id.rs @@ -0,0 +1,193 @@ +use automerge as am; +use libc::c_int; +use std::cell::RefCell; +use std::cmp::Ordering; +use std::str::FromStr; + +use crate::byte_span::AMbyteSpan; +use crate::result::{to_result, AMresult}; + +macro_rules! to_actor_id { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMactorId*`").into(), + } + }}; +} + +pub(crate) use to_actor_id; + +/// \struct AMactorId +/// \installed_headerfile +/// \brief An actor's unique identifier. +#[derive(Eq, PartialEq)] +pub struct AMactorId { + body: *const am::ActorId, + hex_str: RefCell>>, +} + +impl AMactorId { + pub fn new(actor_id: &am::ActorId) -> Self { + Self { + body: actor_id, + hex_str: Default::default(), + } + } + + pub fn as_hex_str(&self) -> AMbyteSpan { + let mut hex_str = self.hex_str.borrow_mut(); + match hex_str.as_mut() { + None => { + let hex_string = unsafe { (*self.body).to_hex_string() }; + hex_str + .insert(hex_string.into_boxed_str()) + .as_bytes() + .into() + } + Some(hex_str) => hex_str.as_bytes().into(), + } + } +} + +impl AsRef for AMactorId { + fn as_ref(&self) -> &am::ActorId { + unsafe { &*self.body } + } +} + +/// \memberof AMactorId +/// \brief Gets the value of an actor identifier as an array of bytes. +/// +/// \param[in] actor_id A pointer to an `AMactorId` struct. +/// \return An `AMbyteSpan` struct for an array of bytes. +/// \pre \p actor_id `!= NULL` +/// \internal +/// +/// # Safety +/// actor_id must be a valid pointer to an AMactorId +#[no_mangle] +pub unsafe extern "C" fn AMactorIdBytes(actor_id: *const AMactorId) -> AMbyteSpan { + match actor_id.as_ref() { + Some(actor_id) => actor_id.as_ref().into(), + None => Default::default(), + } +} + +/// \memberof AMactorId +/// \brief Compares two actor identifiers. +/// +/// \param[in] actor_id1 A pointer to an `AMactorId` struct. +/// \param[in] actor_id2 A pointer to an `AMactorId` struct. +/// \return `-1` if \p actor_id1 `<` \p actor_id2, `0` if +/// \p actor_id1 `==` \p actor_id2 and `1` if +/// \p actor_id1 `>` \p actor_id2. +/// \pre \p actor_id1 `!= NULL` +/// \pre \p actor_id2 `!= NULL` +/// \internal +/// +/// #Safety +/// actor_id1 must be a valid pointer to an AMactorId +/// actor_id2 must be a valid pointer to an AMactorId +#[no_mangle] +pub unsafe extern "C" fn AMactorIdCmp( + actor_id1: *const AMactorId, + actor_id2: *const AMactorId, +) -> c_int { + match (actor_id1.as_ref(), actor_id2.as_ref()) { + (Some(actor_id1), Some(actor_id2)) => match actor_id1.as_ref().cmp(actor_id2.as_ref()) { + Ordering::Less => -1, + Ordering::Equal => 0, + Ordering::Greater => 1, + }, + (None, Some(_)) => -1, + (None, None) => 0, + (Some(_), None) => 1, + } +} + +/// \memberof AMactorId +/// \brief Allocates a new actor identifier and initializes it from a random +/// UUID value. +/// +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMactorIdInit() -> *mut AMresult { + to_result(Ok::(am::ActorId::random())) +} + +/// \memberof AMactorId +/// \brief Allocates a new actor identifier and initializes it from an array of +/// bytes value. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to copy from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMactorIdFromBytes(src: *const u8, count: usize) -> *mut AMresult { + if !src.is_null() { + let value = std::slice::from_raw_parts(src, count); + to_result(Ok::(am::ActorId::from( + value, + ))) + } else { + AMresult::error("Invalid uint8_t*").into() + } +} + +/// \memberof AMactorId +/// \brief Allocates a new actor identifier and initializes it from a +/// hexadecimal UTF-8 string view value. +/// +/// \param[in] value A UTF-8 string view as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// hex_str must be a valid pointer to an AMbyteSpan +#[no_mangle] +pub unsafe extern "C" fn AMactorIdFromStr(value: AMbyteSpan) -> *mut AMresult { + use am::AutomergeError::InvalidActorId; + + to_result(match (&value).try_into() { + Ok(s) => match am::ActorId::from_str(s) { + Ok(actor_id) => Ok(actor_id), + Err(_) => Err(InvalidActorId(String::from(s))), + }, + Err(e) => Err(e), + }) +} + +/// \memberof AMactorId +/// \brief Gets the value of an actor identifier as a UTF-8 hexadecimal string +/// view. +/// +/// \param[in] actor_id A pointer to an `AMactorId` struct. +/// \return A UTF-8 string view as an `AMbyteSpan` struct. +/// \pre \p actor_id `!= NULL` +/// \internal +/// +/// # Safety +/// actor_id must be a valid pointer to an AMactorId +#[no_mangle] +pub unsafe extern "C" fn AMactorIdStr(actor_id: *const AMactorId) -> AMbyteSpan { + match actor_id.as_ref() { + Some(actor_id) => actor_id.as_hex_str(), + None => Default::default(), + } +} diff --git a/rust/automerge-c/src/byte_span.rs b/rust/automerge-c/src/byte_span.rs new file mode 100644 index 00000000..5855cfc7 --- /dev/null +++ b/rust/automerge-c/src/byte_span.rs @@ -0,0 +1,223 @@ +use automerge as am; +use std::cmp::Ordering; +use std::convert::TryFrom; +use std::os::raw::c_char; + +use libc::{c_int, strlen}; +use smol_str::SmolStr; + +macro_rules! to_str { + ($byte_span:expr) => {{ + let result: Result<&str, am::AutomergeError> = (&$byte_span).try_into(); + match result { + Ok(s) => s, + Err(e) => return AMresult::error(&e.to_string()).into(), + } + }}; +} + +pub(crate) use to_str; + +/// \struct AMbyteSpan +/// \installed_headerfile +/// \brief A view onto an array of bytes. +#[repr(C)] +pub struct AMbyteSpan { + /// A pointer to the first byte of an array of bytes. + /// \warning \p src is only valid until the array of bytes to which it + /// points is freed. + /// \note If the `AMbyteSpan` came from within an `AMitem` struct then + /// \p src will be freed when the pointer to the `AMresult` struct + /// containing the `AMitem` struct is passed to `AMresultFree()`. + pub src: *const u8, + /// The count of bytes in the array. + pub count: usize, +} + +impl AMbyteSpan { + pub fn is_null(&self) -> bool { + self.src.is_null() + } +} + +impl Default for AMbyteSpan { + fn default() -> Self { + Self { + src: std::ptr::null(), + count: 0, + } + } +} + +impl PartialEq for AMbyteSpan { + fn eq(&self, other: &Self) -> bool { + if self.count != other.count { + return false; + } else if self.src == other.src { + return true; + } + <&[u8]>::from(self) == <&[u8]>::from(other) + } +} + +impl Eq for AMbyteSpan {} + +impl From<&am::ActorId> for AMbyteSpan { + fn from(actor: &am::ActorId) -> Self { + let slice = actor.to_bytes(); + Self { + src: slice.as_ptr(), + count: slice.len(), + } + } +} + +impl From<&mut am::ActorId> for AMbyteSpan { + fn from(actor: &mut am::ActorId) -> Self { + actor.as_ref().into() + } +} + +impl From<&am::ChangeHash> for AMbyteSpan { + fn from(change_hash: &am::ChangeHash) -> Self { + Self { + src: change_hash.0.as_ptr(), + count: change_hash.0.len(), + } + } +} + +impl From<*const c_char> for AMbyteSpan { + fn from(cs: *const c_char) -> Self { + if !cs.is_null() { + Self { + src: cs as *const u8, + count: unsafe { strlen(cs) }, + } + } else { + Self::default() + } + } +} + +impl From<&SmolStr> for AMbyteSpan { + fn from(smol_str: &SmolStr) -> Self { + smol_str.as_bytes().into() + } +} + +impl From<&[u8]> for AMbyteSpan { + fn from(slice: &[u8]) -> Self { + Self { + src: slice.as_ptr(), + count: slice.len(), + } + } +} + +impl From<&AMbyteSpan> for &[u8] { + fn from(byte_span: &AMbyteSpan) -> Self { + unsafe { std::slice::from_raw_parts(byte_span.src, byte_span.count) } + } +} + +impl From<&AMbyteSpan> for Vec { + fn from(byte_span: &AMbyteSpan) -> Self { + <&[u8]>::from(byte_span).to_vec() + } +} + +impl TryFrom<&AMbyteSpan> for am::ChangeHash { + type Error = am::AutomergeError; + + fn try_from(byte_span: &AMbyteSpan) -> Result { + use am::AutomergeError::InvalidChangeHashBytes; + + let slice: &[u8] = byte_span.into(); + match slice.try_into() { + Ok(change_hash) => Ok(change_hash), + Err(e) => Err(InvalidChangeHashBytes(e)), + } + } +} + +impl TryFrom<&AMbyteSpan> for &str { + type Error = am::AutomergeError; + + fn try_from(byte_span: &AMbyteSpan) -> Result { + use am::AutomergeError::InvalidCharacter; + + let slice = byte_span.into(); + match std::str::from_utf8(slice) { + Ok(str_) => Ok(str_), + Err(e) => Err(InvalidCharacter(e.valid_up_to())), + } + } +} + +/// \memberof AMbyteSpan +/// \brief Creates a view onto an array of bytes. +/// +/// \param[in] src A pointer to an array of bytes or `NULL`. +/// \param[in] count The count of bytes to view from the array pointed to by +/// \p src. +/// \return An `AMbyteSpan` struct. +/// \pre \p count `<= sizeof(`\p src `)` +/// \post `(`\p src `== NULL) -> (AMbyteSpan){NULL, 0}` +/// \internal +/// +/// #Safety +/// src must be a byte array of length `>= count` or `std::ptr::null()` +#[no_mangle] +pub unsafe extern "C" fn AMbytes(src: *const u8, count: usize) -> AMbyteSpan { + AMbyteSpan { + src, + count: if src.is_null() { 0 } else { count }, + } +} + +/// \memberof AMbyteSpan +/// \brief Creates a view onto a C string. +/// +/// \param[in] c_str A null-terminated byte string or `NULL`. +/// \return An `AMbyteSpan` struct. +/// \pre Each byte in \p c_str encodes one UTF-8 character. +/// \internal +/// +/// #Safety +/// c_str must be a null-terminated array of `std::os::raw::c_char` or `std::ptr::null()`. +#[no_mangle] +pub unsafe extern "C" fn AMstr(c_str: *const c_char) -> AMbyteSpan { + c_str.into() +} + +/// \memberof AMbyteSpan +/// \brief Compares two UTF-8 string views lexicographically. +/// +/// \param[in] lhs A UTF-8 string view as an `AMbyteSpan` struct. +/// \param[in] rhs A UTF-8 string view as an `AMbyteSpan` struct. +/// \return Negative value if \p lhs appears before \p rhs in lexicographical order. +/// Zero if \p lhs and \p rhs compare equal. +/// Positive value if \p lhs appears after \p rhs in lexicographical order. +/// \pre \p lhs.src `!= NULL` +/// \pre \p lhs.count `<= sizeof(`\p lhs.src `)` +/// \pre \p rhs.src `!= NULL` +/// \pre \p rhs.count `<= sizeof(`\p rhs.src `)` +/// \internal +/// +/// #Safety +/// lhs.src must be a byte array of length >= lhs.count +/// rhs.src must be a a byte array of length >= rhs.count +#[no_mangle] +pub unsafe extern "C" fn AMstrCmp(lhs: AMbyteSpan, rhs: AMbyteSpan) -> c_int { + match (<&str>::try_from(&lhs), <&str>::try_from(&rhs)) { + (Ok(lhs), Ok(rhs)) => match lhs.cmp(rhs) { + Ordering::Less => -1, + Ordering::Equal => 0, + Ordering::Greater => 1, + }, + (Err(_), Ok(_)) => -1, + (Err(_), Err(_)) => 0, + (Ok(_), Err(_)) => 1, + } +} diff --git a/rust/automerge-c/src/change.rs b/rust/automerge-c/src/change.rs new file mode 100644 index 00000000..8529ed94 --- /dev/null +++ b/rust/automerge-c/src/change.rs @@ -0,0 +1,356 @@ +use automerge as am; +use std::cell::RefCell; + +use crate::byte_span::AMbyteSpan; +use crate::result::{to_result, AMresult}; + +macro_rules! to_change { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMchange*`").into(), + } + }}; +} + +/// \struct AMchange +/// \installed_headerfile +/// \brief A group of operations performed by an actor. +#[derive(Eq, PartialEq)] +pub struct AMchange { + body: *mut am::Change, + change_hash: RefCell>, +} + +impl AMchange { + pub fn new(change: &mut am::Change) -> Self { + Self { + body: change, + change_hash: Default::default(), + } + } + + pub fn message(&self) -> AMbyteSpan { + if let Some(message) = unsafe { (*self.body).message() } { + return message.as_str().as_bytes().into(); + } + Default::default() + } + + pub fn hash(&self) -> AMbyteSpan { + let mut change_hash = self.change_hash.borrow_mut(); + if let Some(change_hash) = change_hash.as_ref() { + change_hash.into() + } else { + let hash = unsafe { (*self.body).hash() }; + let ptr = change_hash.insert(hash); + AMbyteSpan { + src: ptr.0.as_ptr(), + count: hash.as_ref().len(), + } + } + } +} + +impl AsMut for AMchange { + fn as_mut(&mut self) -> &mut am::Change { + unsafe { &mut *self.body } + } +} + +impl AsRef for AMchange { + fn as_ref(&self) -> &am::Change { + unsafe { &*self.body } + } +} + +/// \memberof AMchange +/// \brief Gets the first referenced actor identifier in a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item. +/// \pre \p change `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeActorId(change: *const AMchange) -> *mut AMresult { + let change = to_change!(change); + to_result(Ok::( + change.as_ref().actor_id().clone(), + )) +} + +/// \memberof AMchange +/// \brief Compresses the raw bytes of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeCompress(change: *mut AMchange) { + if let Some(change) = change.as_mut() { + let _ = change.as_mut().bytes(); + }; +} + +/// \memberof AMchange +/// \brief Gets the dependencies of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p change `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeDeps(change: *const AMchange) -> *mut AMresult { + to_result(match change.as_ref() { + Some(change) => change.as_ref().deps(), + None => Default::default(), + }) +} + +/// \memberof AMchange +/// \brief Gets the extra bytes of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return An `AMbyteSpan` struct. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeExtraBytes(change: *const AMchange) -> AMbyteSpan { + if let Some(change) = change.as_ref() { + change.as_ref().extra_bytes().into() + } else { + Default::default() + } +} + +/// \memberof AMchange +/// \brief Allocates a new change and initializes it from an array of bytes value. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to load from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_CHANGE` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMchangeFromBytes(src: *const u8, count: usize) -> *mut AMresult { + let data = std::slice::from_raw_parts(src, count); + to_result(am::Change::from_bytes(data.to_vec())) +} + +/// \memberof AMchange +/// \brief Gets the hash of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return An `AMbyteSpan` struct for a change hash. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeHash(change: *const AMchange) -> AMbyteSpan { + match change.as_ref() { + Some(change) => change.hash(), + None => Default::default(), + } +} + +/// \memberof AMchange +/// \brief Tests the emptiness of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return `true` if \p change is empty, `false` otherwise. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeIsEmpty(change: *const AMchange) -> bool { + if let Some(change) = change.as_ref() { + change.as_ref().is_empty() + } else { + true + } +} + +/// \memberof AMchange +/// \brief Loads a document into a sequence of changes. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to load from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMchangeLoadDocument(src: *const u8, count: usize) -> *mut AMresult { + let data = std::slice::from_raw_parts(src, count); + to_result::, _>>( + am::Automerge::load(data) + .and_then(|d| d.get_changes(&[]).map(|c| c.into_iter().cloned().collect())), + ) +} + +/// \memberof AMchange +/// \brief Gets the maximum operation index of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeMaxOp(change: *const AMchange) -> u64 { + if let Some(change) = change.as_ref() { + change.as_ref().max_op() + } else { + u64::MAX + } +} + +/// \memberof AMchange +/// \brief Gets the message of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return An `AMbyteSpan` struct for a UTF-8 string. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeMessage(change: *const AMchange) -> AMbyteSpan { + if let Some(change) = change.as_ref() { + return change.message(); + }; + Default::default() +} + +/// \memberof AMchange +/// \brief Gets the index of a change in the changes from an actor. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeSeq(change: *const AMchange) -> u64 { + if let Some(change) = change.as_ref() { + change.as_ref().seq() + } else { + u64::MAX + } +} + +/// \memberof AMchange +/// \brief Gets the size of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeSize(change: *const AMchange) -> usize { + if let Some(change) = change.as_ref() { + return change.as_ref().len(); + } + 0 +} + +/// \memberof AMchange +/// \brief Gets the start operation index of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeStartOp(change: *const AMchange) -> u64 { + if let Some(change) = change.as_ref() { + u64::from(change.as_ref().start_op()) + } else { + u64::MAX + } +} + +/// \memberof AMchange +/// \brief Gets the commit time of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return A 64-bit signed integer. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeTime(change: *const AMchange) -> i64 { + if let Some(change) = change.as_ref() { + change.as_ref().timestamp() + } else { + i64::MAX + } +} + +/// \memberof AMchange +/// \brief Gets the raw bytes of a change. +/// +/// \param[in] change A pointer to an `AMchange` struct. +/// \return An `AMbyteSpan` struct for an array of bytes. +/// \pre \p change `!= NULL` +/// \internal +/// +/// # Safety +/// change must be a valid pointer to an AMchange +#[no_mangle] +pub unsafe extern "C" fn AMchangeRawBytes(change: *const AMchange) -> AMbyteSpan { + if let Some(change) = change.as_ref() { + change.as_ref().raw_bytes().into() + } else { + Default::default() + } +} diff --git a/rust/automerge-c/src/doc.rs b/rust/automerge-c/src/doc.rs new file mode 100644 index 00000000..82f52bf7 --- /dev/null +++ b/rust/automerge-c/src/doc.rs @@ -0,0 +1,915 @@ +use automerge as am; +use automerge::sync::SyncDoc; +use automerge::transaction::{CommitOptions, Transactable}; +use automerge::ReadDoc; +use std::ops::{Deref, DerefMut}; + +use crate::actor_id::{to_actor_id, AMactorId}; +use crate::byte_span::{to_str, AMbyteSpan}; +use crate::items::AMitems; +use crate::obj::{to_obj_id, AMobjId, AMobjType}; +use crate::result::{to_result, AMresult}; +use crate::sync::{to_sync_message, AMsyncMessage, AMsyncState}; + +pub mod list; +pub mod map; +pub mod utils; + +use crate::doc::utils::{clamp, to_doc, to_doc_mut, to_items}; + +macro_rules! to_sync_state_mut { + ($handle:expr) => {{ + let handle = $handle.as_mut(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMsyncState*`").into(), + } + }}; +} + +/// \struct AMdoc +/// \installed_headerfile +/// \brief A JSON-like CRDT. +#[derive(Clone)] +pub struct AMdoc(am::AutoCommit); + +impl AMdoc { + pub fn new(auto_commit: am::AutoCommit) -> Self { + Self(auto_commit) + } + + pub fn is_equal_to(&mut self, other: &mut Self) -> bool { + self.document().get_heads() == other.document().get_heads() + } +} + +impl AsRef for AMdoc { + fn as_ref(&self) -> &am::AutoCommit { + &self.0 + } +} + +impl Deref for AMdoc { + type Target = am::AutoCommit; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for AMdoc { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +/// \memberof AMdoc +/// \brief Applies a sequence of changes to a document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] items A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE` +/// items. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p items `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// items must be a valid pointer to an AMitems. +#[no_mangle] +pub unsafe extern "C" fn AMapplyChanges(doc: *mut AMdoc, items: *const AMitems) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let items = to_items!(items); + match Vec::::try_from(items) { + Ok(changes) => to_result(doc.apply_changes(changes)), + Err(e) => AMresult::error(&e.to_string()).into(), + } +} + +/// \memberof AMdoc +/// \brief Allocates storage for a document and initializes it by duplicating +/// the given document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMclone(doc: *const AMdoc) -> *mut AMresult { + let doc = to_doc!(doc); + to_result(doc.as_ref().clone()) +} + +/// \memberof AMdoc +/// \brief Allocates a new document and initializes it with defaults. +/// +/// \param[in] actor_id A pointer to an `AMactorId` struct or `NULL` for a +/// random one. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// actor_id must be a valid pointer to an AMactorId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMcreate(actor_id: *const AMactorId) -> *mut AMresult { + to_result(match actor_id.as_ref() { + Some(actor_id) => am::AutoCommit::new().with_actor(actor_id.as_ref().clone()), + None => am::AutoCommit::new(), + }) +} + +/// \memberof AMdoc +/// \brief Commits the current operations on a document with an optional +/// message and/or *nix timestamp (milliseconds). +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] message A UTF-8 string view as an `AMbyteSpan` struct. +/// \param[in] timestamp A pointer to a 64-bit integer or `NULL`. +/// \return A pointer to an `AMresult` struct with one `AM_VAL_TYPE_CHANGE_HASH` +/// item if there were operations to commit or an `AM_VAL_TYPE_VOID` item +/// if there were no operations to commit. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMcommit( + doc: *mut AMdoc, + message: AMbyteSpan, + timestamp: *const i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let mut options = CommitOptions::default(); + if !message.is_null() { + options.set_message(to_str!(message)); + } + if let Some(timestamp) = timestamp.as_ref() { + options.set_time(*timestamp); + } + to_result(doc.commit_with(options)) +} + +/// \memberof AMdoc +/// \brief Creates an empty change with an optional message and/or *nix +/// timestamp (milliseconds). +/// +/// \details This is useful if you wish to create a "merge commit" which has as +/// its dependents the current heads of the document but you don't have +/// any operations to add to the document. +/// +/// \note If there are outstanding uncommitted changes to the document +/// then two changes will be created: one for creating the outstanding +/// changes and one for the empty change. The empty change will always be +/// the latest change in the document after this call and the returned +/// hash will be the hash of that empty change. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] message A UTF-8 string view as an `AMbyteSpan` struct. +/// \param[in] timestamp A pointer to a 64-bit integer or `NULL`. +/// \return A pointer to an `AMresult` struct with one `AM_VAL_TYPE_CHANGE_HASH` +/// item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMemptyChange( + doc: *mut AMdoc, + message: AMbyteSpan, + timestamp: *const i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let mut options = CommitOptions::default(); + if !message.is_null() { + options.set_message(to_str!(message)); + } + if let Some(timestamp) = timestamp.as_ref() { + options.set_time(*timestamp); + } + to_result(doc.empty_change(options)) +} + +/// \memberof AMdoc +/// \brief Tests the equality of two documents after closing their respective +/// transactions. +/// +/// \param[in] doc1 A pointer to an `AMdoc` struct. +/// \param[in] doc2 A pointer to an `AMdoc` struct. +/// \return `true` if \p doc1 `==` \p doc2 and `false` otherwise. +/// \pre \p doc1 `!= NULL` +/// \pre \p doc2 `!= NULL` +/// \internal +/// +/// #Safety +/// doc1 must be a valid pointer to an AMdoc +/// doc2 must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMequal(doc1: *mut AMdoc, doc2: *mut AMdoc) -> bool { + match (doc1.as_mut(), doc2.as_mut()) { + (Some(doc1), Some(doc2)) => doc1.is_equal_to(doc2), + (None, None) | (None, Some(_)) | (Some(_), None) => false, + } +} + +/// \memberof AMdoc +/// \brief Forks this document at its current or a historical point for use by +/// a different actor. +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical point or `NULL` to select its +/// current point. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMfork(doc: *mut AMdoc, heads: *const AMitems) -> *mut AMresult { + let doc = to_doc_mut!(doc); + match heads.as_ref() { + None => to_result(doc.fork()), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.fork_at(&heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Generates a synchronization message for a peer based upon the given +/// synchronization state. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \return A pointer to an `AMresult` struct with either an +/// `AM_VAL_TYPE_SYNC_MESSAGE` or `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p sync_state `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// sync_state must be a valid pointer to an AMsyncState +#[no_mangle] +pub unsafe extern "C" fn AMgenerateSyncMessage( + doc: *mut AMdoc, + sync_state: *mut AMsyncState, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let sync_state = to_sync_state_mut!(sync_state); + to_result(doc.sync().generate_sync_message(sync_state.as_mut())) +} + +/// \memberof AMdoc +/// \brief Gets a document's actor identifier. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_ACTOR_ID` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMgetActorId(doc: *const AMdoc) -> *mut AMresult { + let doc = to_doc!(doc); + to_result(Ok::( + doc.get_actor().clone(), + )) +} + +/// \memberof AMdoc +/// \brief Gets the change added to a document by its respective hash. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to copy from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_CHANGE` item. +/// \pre \p doc `!= NULL` +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src') >= AM_CHANGE_HASH_SIZE` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// src must be a byte array of length `>= automerge::types::HASH_SIZE` +#[no_mangle] +pub unsafe extern "C" fn AMgetChangeByHash( + doc: *mut AMdoc, + src: *const u8, + count: usize, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let slice = std::slice::from_raw_parts(src, count); + match slice.try_into() { + Ok(change_hash) => to_result(doc.get_change_by_hash(&change_hash)), + Err(e) => AMresult::error(&e.to_string()).into(), + } +} + +/// \memberof AMdoc +/// \brief Gets the changes added to a document by their respective hashes. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] have_deps A pointer to an `AMitems` struct with +/// `AM_VAL_TYPE_CHANGE_HASH` items or `NULL`. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMgetChanges(doc: *mut AMdoc, have_deps: *const AMitems) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let have_deps = match have_deps.as_ref() { + Some(have_deps) => match Vec::::try_from(have_deps) { + Ok(change_hashes) => change_hashes, + Err(e) => return AMresult::error(&e.to_string()).into(), + }, + None => Vec::::new(), + }; + to_result(doc.get_changes(&have_deps)) +} + +/// \memberof AMdoc +/// \brief Gets the changes added to a second document that weren't added to +/// a first document. +/// +/// \param[in] doc1 A pointer to an `AMdoc` struct. +/// \param[in] doc2 A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items. +/// \pre \p doc1 `!= NULL` +/// \pre \p doc2 `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc1 must be a valid pointer to an AMdoc +/// doc2 must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMgetChangesAdded(doc1: *mut AMdoc, doc2: *mut AMdoc) -> *mut AMresult { + let doc1 = to_doc_mut!(doc1); + let doc2 = to_doc_mut!(doc2); + to_result(doc1.get_changes_added(doc2)) +} + +/// \memberof AMdoc +/// \brief Gets the current heads of a document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMgetHeads(doc: *mut AMdoc) -> *mut AMresult { + let doc = to_doc_mut!(doc); + to_result(Ok::, am::AutomergeError>( + doc.get_heads(), + )) +} + +/// \memberof AMdoc +/// \brief Gets the hashes of the changes in a document that aren't transitive +/// dependencies of the given hashes of changes. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items or `NULL`. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMgetMissingDeps(doc: *mut AMdoc, heads: *const AMitems) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let heads = match heads.as_ref() { + None => Vec::::new(), + Some(heads) => match >::try_from(heads) { + Ok(heads) => heads, + Err(e) => { + return AMresult::error(&e.to_string()).into(); + } + }, + }; + to_result(doc.get_missing_deps(heads.as_slice())) +} + +/// \memberof AMdoc +/// \brief Gets the last change made to a document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct containing either an +/// `AM_VAL_TYPE_CHANGE` or `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMgetLastLocalChange(doc: *mut AMdoc) -> *mut AMresult { + let doc = to_doc_mut!(doc); + to_result(doc.get_last_local_change()) +} + +/// \memberof AMdoc +/// \brief Gets the current or historical keys of a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select historical keys or `NULL` to select current +/// keys. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_STR` items. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMkeys( + doc: *const AMdoc, + obj_id: *const AMobjId, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + match heads.as_ref() { + None => to_result(doc.keys(obj_id)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.keys_at(obj_id, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Allocates storage for a document and initializes it with the compact +/// form of an incremental save. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to load from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_DOC` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMload(src: *const u8, count: usize) -> *mut AMresult { + let data = std::slice::from_raw_parts(src, count); + to_result(am::AutoCommit::load(data)) +} + +/// \memberof AMdoc +/// \brief Loads the compact form of an incremental save into a document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to load from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_UINT` item. +/// \pre \p doc `!= NULL` +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMloadIncremental( + doc: *mut AMdoc, + src: *const u8, + count: usize, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let data = std::slice::from_raw_parts(src, count); + to_result(doc.load_incremental(data)) +} + +/// \memberof AMdoc +/// \brief Applies all of the changes in \p src which are not in \p dest to +/// \p dest. +/// +/// \param[in] dest A pointer to an `AMdoc` struct. +/// \param[in] src A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p dest `!= NULL` +/// \pre \p src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// dest must be a valid pointer to an AMdoc +/// src must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMmerge(dest: *mut AMdoc, src: *mut AMdoc) -> *mut AMresult { + let dest = to_doc_mut!(dest); + to_result(dest.merge(to_doc_mut!(src))) +} + +/// \memberof AMdoc +/// \brief Gets the current or historical size of an object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical size or `NULL` to select its +/// current size. +/// \return The count of items in the object identified by \p obj_id. +/// \pre \p doc `!= NULL` +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMobjSize( + doc: *const AMdoc, + obj_id: *const AMobjId, + heads: *const AMitems, +) -> usize { + if let Some(doc) = doc.as_ref() { + let obj_id = to_obj_id!(obj_id); + match heads.as_ref() { + None => { + return doc.length(obj_id); + } + Some(heads) => { + if let Ok(heads) = >::try_from(heads) { + return doc.length_at(obj_id, &heads); + } + } + } + } + 0 +} + +/// \memberof AMdoc +/// \brief Gets the type of an object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \return An `AMobjType` tag or `0`. +/// \pre \p doc `!= NULL` +/// \pre \p obj_id `!= NULL` +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMobjObjType(doc: *const AMdoc, obj_id: *const AMobjId) -> AMobjType { + if let Some(doc) = doc.as_ref() { + let obj_id = to_obj_id!(obj_id); + if let Ok(obj_type) = doc.object_type(obj_id) { + return (&obj_type).into(); + } + } + Default::default() +} + +/// \memberof AMdoc +/// \brief Gets the current or historical items of an entire object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select its historical items or `NULL` to select +/// its current items. +/// \return A pointer to an `AMresult` struct with an `AMitems` struct. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMobjItems( + doc: *const AMdoc, + obj_id: *const AMobjId, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + match heads.as_ref() { + None => to_result(doc.values(obj_id)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.values_at(obj_id, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Gets the number of pending operations added during a document's +/// current transaction. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return The count of pending operations for \p doc. +/// \pre \p doc `!= NULL` +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMpendingOps(doc: *const AMdoc) -> usize { + if let Some(doc) = doc.as_ref() { + return doc.pending_ops(); + } + 0 +} + +/// \memberof AMdoc +/// \brief Receives a synchronization message from a peer based upon a given +/// synchronization state. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p sync_state `!= NULL` +/// \pre \p sync_message `!= NULL` +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// sync_state must be a valid pointer to an AMsyncState +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMreceiveSyncMessage( + doc: *mut AMdoc, + sync_state: *mut AMsyncState, + sync_message: *const AMsyncMessage, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let sync_state = to_sync_state_mut!(sync_state); + let sync_message = to_sync_message!(sync_message); + to_result( + doc.sync() + .receive_sync_message(sync_state.as_mut(), sync_message.as_ref().clone()), + ) +} + +/// \memberof AMdoc +/// \brief Cancels the pending operations added during a document's current +/// transaction and gets the number of cancellations. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return The count of pending operations for \p doc that were cancelled. +/// \pre \p doc `!= NULL` +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMrollback(doc: *mut AMdoc) -> usize { + if let Some(doc) = doc.as_mut() { + return doc.rollback(); + } + 0 +} + +/// \memberof AMdoc +/// \brief Saves the entirety of a document into a compact form. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMsave(doc: *mut AMdoc) -> *mut AMresult { + let doc = to_doc_mut!(doc); + to_result(Ok(doc.save())) +} + +/// \memberof AMdoc +/// \brief Saves the changes to a document since its last save into a compact +/// form. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +#[no_mangle] +pub unsafe extern "C" fn AMsaveIncremental(doc: *mut AMdoc) -> *mut AMresult { + let doc = to_doc_mut!(doc); + to_result(Ok(doc.save_incremental())) +} + +/// \memberof AMdoc +/// \brief Puts the actor identifier of a document. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] actor_id A pointer to an `AMactorId` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p actor_id `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// actor_id must be a valid pointer to an AMactorId +#[no_mangle] +pub unsafe extern "C" fn AMsetActorId( + doc: *mut AMdoc, + actor_id: *const AMactorId, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let actor_id = to_actor_id!(actor_id); + doc.set_actor(actor_id.as_ref().clone()); + to_result(Ok(())) +} + +/// \memberof AMdoc +/// \brief Splices values into and/or removes values from the identified object +/// at a given position within it. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos A position in the object identified by \p obj_id or +/// `SIZE_MAX` to indicate one past its end. +/// \param[in] del The number of values to delete or `SIZE_MAX` to indicate +/// all of them. +/// \param[in] values A copy of an `AMitems` struct from which values will be +/// spliced starting at its current position; call +/// `AMitemsRewound()` on a used `AMitems` first to ensure +/// that all of its values are spliced in. Pass `(AMitems){0}` +/// when zero values should be spliced in. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \pre `0 <=` \p del `<= AMobjSize(`\p obj_id `)` or \p del `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// values must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMsplice( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + del: usize, + values: AMitems, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let len = doc.length(obj_id); + let pos = clamp!(pos, len, "pos"); + let del = clamp!(del, len, "del"); + match Vec::::try_from(&values) { + Ok(vals) => to_result(doc.splice(obj_id, pos, del, vals)), + Err(e) => AMresult::error(&e.to_string()).into(), + } +} + +/// \memberof AMdoc +/// \brief Splices characters into and/or removes characters from the +/// identified object at a given position within it. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos A position in the text object identified by \p obj_id or +/// `SIZE_MAX` to indicate one past its end. +/// \param[in] del The number of characters to delete or `SIZE_MAX` to indicate +/// all of them. +/// \param[in] text A UTF-8 string view as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \pre `0 <=` \p del `<= AMobjSize(`\p obj_id `)` or \p del `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMspliceText( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + del: usize, + text: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let len = doc.length(obj_id); + let pos = clamp!(pos, len, "pos"); + let del = clamp!(del, len, "del"); + to_result(doc.splice_text(obj_id, pos, del, to_str!(text))) +} + +/// \memberof AMdoc +/// \brief Gets the current or historical string represented by a text object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] heads A pointer to an `AMitems` struct containing +/// `AM_VAL_TYPE_CHANGE_HASH` items to select a historical string +/// or `NULL` to select the current string. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_STR` item. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMtext( + doc: *const AMdoc, + obj_id: *const AMobjId, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + match heads.as_ref() { + None => to_result(doc.text(obj_id)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.text_at(obj_id, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} diff --git a/rust/automerge-c/src/doc/list.rs b/rust/automerge-c/src/doc/list.rs new file mode 100644 index 00000000..c4503322 --- /dev/null +++ b/rust/automerge-c/src/doc/list.rs @@ -0,0 +1,636 @@ +use automerge as am; +use automerge::transaction::Transactable; +use automerge::ReadDoc; + +use crate::byte_span::{to_str, AMbyteSpan}; +use crate::doc::{to_doc, to_doc_mut, AMdoc}; +use crate::items::AMitems; +use crate::obj::{to_obj_id, to_obj_type, AMobjId, AMobjType}; +use crate::result::{to_result, AMresult}; + +macro_rules! adjust { + ($pos:expr, $insert:expr, $len:expr) => {{ + // An empty object can only be inserted into. + let insert = $insert || $len == 0; + let end = if insert { $len } else { $len - 1 }; + if $pos > end && $pos != usize::MAX { + return AMresult::error(&format!("Invalid pos {}", $pos)).into(); + } + (std::cmp::min($pos, end), insert) + }}; +} + +macro_rules! to_range { + ($begin:expr, $end:expr) => {{ + if $begin > $end { + return AMresult::error(&format!("Invalid range [{}-{})", $begin, $end)).into(); + }; + ($begin..$end) + }}; +} + +/// \memberof AMdoc +/// \brief Deletes an item from a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistDelete( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, _) = adjust!(pos, false, doc.length(obj_id)); + to_result(doc.delete(obj_id, pos)) +} + +/// \memberof AMdoc +/// \brief Gets a current or historical item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical item at \p pos or `NULL` +/// to select the current item at \p pos. +/// \return A pointer to an `AMresult` struct with an `AMitem` struct. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistGet( + doc: *const AMdoc, + obj_id: *const AMobjId, + pos: usize, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, _) = adjust!(pos, false, doc.length(obj_id)); + match heads.as_ref() { + None => to_result(doc.get(obj_id, pos)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.get_at(obj_id, pos, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Gets all of the historical items at a position within a list object +/// until its current one or a specific one. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical last item or `NULL` to select +/// the current last item. +/// \return A pointer to an `AMresult` struct with an `AMitems` struct. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistGetAll( + doc: *const AMdoc, + obj_id: *const AMobjId, + pos: usize, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, _) = adjust!(pos, false, doc.length(obj_id)); + match heads.as_ref() { + None => to_result(doc.get_all(obj_id, pos)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.get_all_at(obj_id, pos, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Increments a counter value in an item within a list object by the +/// given value. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistIncrement( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, _) = adjust!(pos, false, doc.length(obj_id)); + to_result(doc.increment(obj_id, pos, value)) +} + +/// \memberof AMdoc +/// \brief Puts a boolean value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A boolean. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutBool( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: bool, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let value = am::ScalarValue::Boolean(value); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts an array of bytes value at a position within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A view onto the array of bytes to copy from as an +/// `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \pre \p value.src `!= NULL` +/// \pre `0 <` \p value.count `<= sizeof(`\p value.src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMlistPutBytes( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let value: Vec = (&value).into(); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts a CRDT counter value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutCounter( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let value = am::ScalarValue::Counter(value.into()); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts a float value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A 64-bit float. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutF64( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: f64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts a signed integer value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutInt( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts a null value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutNull( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + to_result(if insert { + doc.insert(obj_id, pos, ()) + } else { + doc.put(obj_id, pos, ()) + }) +} + +/// \memberof AMdoc +/// \brief Puts an empty object value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] obj_type An `AMobjIdType` enum tag. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_OBJ_TYPE` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutObject( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + obj_type: AMobjType, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let obj_type = to_obj_type!(obj_type); + to_result(if insert { + (doc.insert_object(obj_id, pos, obj_type), obj_type) + } else { + (doc.put_object(obj_id, pos, obj_type), obj_type) + }) +} + +/// \memberof AMdoc +/// \brief Puts a UTF-8 string value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A UTF-8 string view as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \pre \p value.src `!= NULL` +/// \pre `0 <` \p value.count `<= sizeof(`\p value.src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMlistPutStr( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let value = to_str!(value); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts a *nix timestamp (milliseconds) value into an item within a +/// list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutTimestamp( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + let value = am::ScalarValue::Timestamp(value); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Puts an unsigned integer value into an item within a list object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] pos The position of an item within the list object identified by +/// \p obj_id or `SIZE_MAX` to indicate its last item if +/// \p insert `== false` or one past its last item if +/// \p insert `== true`. +/// \param[in] insert A flag for inserting a new item for \p value before +/// \p pos instead of putting \p value into the item at +/// \p pos. +/// \param[in] value A 64-bit unsigned integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre `0 <=` \p pos `<= AMobjSize(`\p obj_id `)` or \p pos `== SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistPutUint( + doc: *mut AMdoc, + obj_id: *const AMobjId, + pos: usize, + insert: bool, + value: u64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let obj_id = to_obj_id!(obj_id); + let (pos, insert) = adjust!(pos, insert, doc.length(obj_id)); + to_result(if insert { + doc.insert(obj_id, pos, value) + } else { + doc.put(obj_id, pos, value) + }) +} + +/// \memberof AMdoc +/// \brief Gets the current or historical items in the list object within the +/// given range. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] begin The first pos in a range of indices. +/// \param[in] end At least one past the last pos in a range of indices. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select historical items or `NULL` to select +/// current items. +/// \return A pointer to an `AMresult` struct with an `AMitems` struct. +/// \pre \p doc `!= NULL` +/// \pre \p begin `<=` \p end `<= SIZE_MAX` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMlistRange( + doc: *const AMdoc, + obj_id: *const AMobjId, + begin: usize, + end: usize, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let range = to_range!(begin, end); + match heads.as_ref() { + None => to_result(doc.list_range(obj_id, range)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.list_range_at(obj_id, range, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} diff --git a/rust/automerge-c/src/doc/map.rs b/rust/automerge-c/src/doc/map.rs new file mode 100644 index 00000000..b2f7db02 --- /dev/null +++ b/rust/automerge-c/src/doc/map.rs @@ -0,0 +1,552 @@ +use automerge as am; +use automerge::transaction::Transactable; +use automerge::ReadDoc; + +use crate::byte_span::{to_str, AMbyteSpan}; +use crate::doc::{to_doc, to_doc_mut, AMdoc}; +use crate::items::AMitems; +use crate::obj::{to_obj_id, to_obj_type, AMobjId, AMobjType}; +use crate::result::{to_result, AMresult}; + +/// \memberof AMdoc +/// \brief Deletes an item from a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapDelete( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.delete(to_obj_id!(obj_id), key)) +} + +/// \memberof AMdoc +/// \brief Gets a current or historical item within a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical item at \p key or `NULL` +/// to select the current item at \p key. +/// \return A pointer to an `AMresult` struct with an `AMitem` struct. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMmapGet( + doc: *const AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let key = to_str!(key); + match heads.as_ref() { + None => to_result(doc.get(obj_id, key)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.get_at(obj_id, key, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Gets all of the historical items at a key within a map object until +/// its current one or a specific one. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select a historical last item or `NULL` to +/// select the current last item. +/// \return A pointer to an `AMresult` struct with an `AMItems` struct. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMmapGetAll( + doc: *const AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let key = to_str!(key); + match heads.as_ref() { + None => to_result(doc.get_all(obj_id, key)), + Some(heads) => match >::try_from(heads) { + Ok(heads) => to_result(doc.get_all_at(obj_id, key, &heads)), + Err(e) => AMresult::error(&e.to_string()).into(), + }, + } +} + +/// \memberof AMdoc +/// \brief Increments a counter at a key in a map object by the given value. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapIncrement( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.increment(to_obj_id!(obj_id), key, value)) +} + +/// \memberof AMdoc +/// \brief Puts a boolean as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A boolean. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutBool( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: bool, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, value)) +} + +/// \memberof AMdoc +/// \brief Puts an array of bytes value at a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key The UTF-8 string view key of an item within the map object +/// identified by \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A view onto an array of bytes as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \pre \p value.src `!= NULL` +/// \pre `0 <` \p value.count `<= sizeof(`\p value.src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutBytes( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, Vec::::from(&value))) +} + +/// \memberof AMdoc +/// \brief Puts a CRDT counter as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutCounter( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put( + to_obj_id!(obj_id), + key, + am::ScalarValue::Counter(value.into()), + )) +} + +/// \memberof AMdoc +/// \brief Puts null as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutNull( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, ())) +} + +/// \memberof AMdoc +/// \brief Puts an empty object as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] obj_type An `AMobjIdType` enum tag. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_OBJ_TYPE` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutObject( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + obj_type: AMobjType, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + let obj_type = to_obj_type!(obj_type); + to_result((doc.put_object(to_obj_id!(obj_id), key, obj_type), obj_type)) +} + +/// \memberof AMdoc +/// \brief Puts a float as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit float. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutF64( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: f64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, value)) +} + +/// \memberof AMdoc +/// \brief Puts a signed integer as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutInt( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, value)) +} + +/// \memberof AMdoc +/// \brief Puts a UTF-8 string as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A UTF-8 string view as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutStr( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: AMbyteSpan, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + to_result(doc.put(to_obj_id!(obj_id), to_str!(key), to_str!(value))) +} + +/// \memberof AMdoc +/// \brief Puts a *nix timestamp (milliseconds) as the value of a key in a map +/// object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutTimestamp( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: i64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, am::ScalarValue::Timestamp(value))) +} + +/// \memberof AMdoc +/// \brief Puts an unsigned integer as the value of a key in a map object. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] key A UTF-8 string view key for the map object identified by +/// \p obj_id as an `AMbyteSpan` struct. +/// \param[in] value A 64-bit unsigned integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_VOID` item. +/// \pre \p doc `!= NULL` +/// \pre \p key.src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// key.src must be a byte array of length >= key.count +#[no_mangle] +pub unsafe extern "C" fn AMmapPutUint( + doc: *mut AMdoc, + obj_id: *const AMobjId, + key: AMbyteSpan, + value: u64, +) -> *mut AMresult { + let doc = to_doc_mut!(doc); + let key = to_str!(key); + to_result(doc.put(to_obj_id!(obj_id), key, value)) +} + +/// \memberof AMdoc +/// \brief Gets the current or historical items of the map object within the +/// given range. +/// +/// \param[in] doc A pointer to an `AMdoc` struct. +/// \param[in] obj_id A pointer to an `AMobjId` struct or `AM_ROOT`. +/// \param[in] begin The first key in a subrange or `AMstr(NULL)` to indicate the +/// absolute first key. +/// \param[in] end The key one past the last key in a subrange or `AMstr(NULL)` +/// to indicate one past the absolute last key. +/// \param[in] heads A pointer to an `AMitems` struct with `AM_VAL_TYPE_CHANGE_HASH` +/// items to select historical items or `NULL` to select +/// current items. +/// \return A pointer to an `AMresult` struct with an `AMitems` struct. +/// \pre \p doc `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// doc must be a valid pointer to an AMdoc +/// obj_id must be a valid pointer to an AMobjId or std::ptr::null() +/// begin.src must be a byte array of length >= begin.count or std::ptr::null() +/// end.src must be a byte array of length >= end.count or std::ptr::null() +/// heads must be a valid pointer to an AMitems or std::ptr::null() +#[no_mangle] +pub unsafe extern "C" fn AMmapRange( + doc: *const AMdoc, + obj_id: *const AMobjId, + begin: AMbyteSpan, + end: AMbyteSpan, + heads: *const AMitems, +) -> *mut AMresult { + let doc = to_doc!(doc); + let obj_id = to_obj_id!(obj_id); + let heads = match heads.as_ref() { + None => None, + Some(heads) => match >::try_from(heads) { + Ok(heads) => Some(heads), + Err(e) => { + return AMresult::error(&e.to_string()).into(); + } + }, + }; + match (begin.is_null(), end.is_null()) { + (false, false) => { + let (begin, end) = (to_str!(begin).to_string(), to_str!(end).to_string()); + if begin > end { + return AMresult::error(&format!("Invalid range [{}-{})", begin, end)).into(); + }; + let bounds = begin..end; + if let Some(heads) = heads { + to_result(doc.map_range_at(obj_id, bounds, &heads)) + } else { + to_result(doc.map_range(obj_id, bounds)) + } + } + (false, true) => { + let bounds = to_str!(begin).to_string()..; + if let Some(heads) = heads { + to_result(doc.map_range_at(obj_id, bounds, &heads)) + } else { + to_result(doc.map_range(obj_id, bounds)) + } + } + (true, false) => { + let bounds = ..to_str!(end).to_string(); + if let Some(heads) = heads { + to_result(doc.map_range_at(obj_id, bounds, &heads)) + } else { + to_result(doc.map_range(obj_id, bounds)) + } + } + (true, true) => { + let bounds = ..; + if let Some(heads) = heads { + to_result(doc.map_range_at(obj_id, bounds, &heads)) + } else { + to_result(doc.map_range(obj_id, bounds)) + } + } + } +} diff --git a/rust/automerge-c/src/doc/utils.rs b/rust/automerge-c/src/doc/utils.rs new file mode 100644 index 00000000..ce465b84 --- /dev/null +++ b/rust/automerge-c/src/doc/utils.rs @@ -0,0 +1,46 @@ +macro_rules! clamp { + ($index:expr, $len:expr, $param_name:expr) => {{ + if $index > $len && $index != usize::MAX { + return AMresult::error(&format!("Invalid {} {}", $param_name, $index)).into(); + } + std::cmp::min($index, $len) + }}; +} + +pub(crate) use clamp; + +macro_rules! to_doc { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMdoc*`").into(), + } + }}; +} + +pub(crate) use to_doc; + +macro_rules! to_doc_mut { + ($handle:expr) => {{ + let handle = $handle.as_mut(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMdoc*`").into(), + } + }}; +} + +pub(crate) use to_doc_mut; + +macro_rules! to_items { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMitems*`").into(), + } + }}; +} + +pub(crate) use to_items; diff --git a/rust/automerge-c/src/index.rs b/rust/automerge-c/src/index.rs new file mode 100644 index 00000000..f1ea153b --- /dev/null +++ b/rust/automerge-c/src/index.rs @@ -0,0 +1,84 @@ +use automerge as am; + +use std::any::type_name; + +use smol_str::SmolStr; + +use crate::byte_span::AMbyteSpan; + +/// \struct AMindex +/// \installed_headerfile +/// \brief An item index. +#[derive(PartialEq)] +pub enum AMindex { + /// A UTF-8 string key variant. + Key(SmolStr), + /// A 64-bit unsigned integer position variant. + Pos(usize), +} + +impl TryFrom<&AMindex> for AMbyteSpan { + type Error = am::AutomergeError; + + fn try_from(item: &AMindex) -> Result { + use am::AutomergeError::InvalidValueType; + use AMindex::*; + + if let Key(key) = item { + return Ok(key.into()); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl TryFrom<&AMindex> for usize { + type Error = am::AutomergeError; + + fn try_from(item: &AMindex) -> Result { + use am::AutomergeError::InvalidValueType; + use AMindex::*; + + if let Pos(pos) = item { + return Ok(*pos); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +/// \ingroup enumerations +/// \enum AMidxType +/// \installed_headerfile +/// \brief The type of an item's index. +#[derive(PartialEq, Eq)] +#[repr(u8)] +pub enum AMidxType { + /// The default tag, not a type signifier. + Default = 0, + /// A UTF-8 string view key. + Key, + /// A 64-bit unsigned integer position. + Pos, +} + +impl Default for AMidxType { + fn default() -> Self { + Self::Default + } +} + +impl From<&AMindex> for AMidxType { + fn from(index: &AMindex) -> Self { + use AMindex::*; + + match index { + Key(_) => Self::Key, + Pos(_) => Self::Pos, + } + } +} diff --git a/rust/automerge-c/src/item.rs b/rust/automerge-c/src/item.rs new file mode 100644 index 00000000..94735464 --- /dev/null +++ b/rust/automerge-c/src/item.rs @@ -0,0 +1,1963 @@ +use automerge as am; + +use std::any::type_name; +use std::borrow::Cow; +use std::cell::{RefCell, UnsafeCell}; +use std::rc::Rc; + +use crate::actor_id::AMactorId; +use crate::byte_span::{to_str, AMbyteSpan}; +use crate::change::AMchange; +use crate::doc::AMdoc; +use crate::index::{AMidxType, AMindex}; +use crate::obj::AMobjId; +use crate::result::{to_result, AMresult}; +use crate::sync::{AMsyncHave, AMsyncMessage, AMsyncState}; + +/// \struct AMunknownValue +/// \installed_headerfile +/// \brief A value (typically for a `set` operation) whose type is unknown. +#[derive(Default, Eq, PartialEq)] +#[repr(C)] +pub struct AMunknownValue { + /// The value's raw bytes. + bytes: AMbyteSpan, + /// The value's encoded type identifier. + type_code: u8, +} + +pub enum Value { + ActorId(am::ActorId, UnsafeCell>), + Change(Box, UnsafeCell>), + ChangeHash(am::ChangeHash), + Doc(RefCell), + SyncHave(AMsyncHave), + SyncMessage(AMsyncMessage), + SyncState(RefCell), + Value(am::Value<'static>), +} + +impl Value { + pub fn try_into_bytes(&self) -> Result { + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Self::Value(Scalar(scalar)) = &self { + if let Bytes(vector) = scalar.as_ref() { + return Ok(vector.as_slice().into()); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } + + pub fn try_into_change_hash(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Self::ChangeHash(change_hash) = &self { + return Ok(change_hash.into()); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } + + pub fn try_into_counter(&self) -> Result { + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Self::Value(Scalar(scalar)) = &self { + if let Counter(counter) = scalar.as_ref() { + return Ok(counter.into()); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } + + pub fn try_into_int(&self) -> Result { + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Self::Value(Scalar(scalar)) = &self { + if let Int(int) = scalar.as_ref() { + return Ok(*int); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } + + pub fn try_into_str(&self) -> Result { + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Self::Value(Scalar(scalar)) = &self { + if let Str(smol_str) = scalar.as_ref() { + return Ok(smol_str.into()); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } + + pub fn try_into_timestamp(&self) -> Result { + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Self::Value(Scalar(scalar)) = &self { + if let Timestamp(timestamp) = scalar.as_ref() { + return Ok(*timestamp); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl From for Value { + fn from(actor_id: am::ActorId) -> Self { + Self::ActorId(actor_id, Default::default()) + } +} + +impl From for Value { + fn from(auto_commit: am::AutoCommit) -> Self { + Self::Doc(RefCell::new(AMdoc::new(auto_commit))) + } +} + +impl From for Value { + fn from(change: am::Change) -> Self { + Self::Change(Box::new(change), Default::default()) + } +} + +impl From for Value { + fn from(change_hash: am::ChangeHash) -> Self { + Self::ChangeHash(change_hash) + } +} + +impl From for Value { + fn from(have: am::sync::Have) -> Self { + Self::SyncHave(AMsyncHave::new(have)) + } +} + +impl From for Value { + fn from(message: am::sync::Message) -> Self { + Self::SyncMessage(AMsyncMessage::new(message)) + } +} + +impl From for Value { + fn from(state: am::sync::State) -> Self { + Self::SyncState(RefCell::new(AMsyncState::new(state))) + } +} + +impl From> for Value { + fn from(value: am::Value<'static>) -> Self { + Self::Value(value) + } +} + +impl From for Value { + fn from(string: String) -> Self { + Self::Value(am::Value::Scalar(Cow::Owned(am::ScalarValue::Str( + string.into(), + )))) + } +} + +impl<'a> TryFrom<&'a Value> for &'a am::Change { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + Change(change, _) => Ok(change), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a Value> for &'a am::ChangeHash { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + ChangeHash(change_hash) => Ok(change_hash), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a Value> for &'a am::ScalarValue { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + use am::Value::*; + + if let Value(Scalar(scalar)) = value { + return Ok(scalar.as_ref()); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl<'a> TryFrom<&'a Value> for &'a AMactorId { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + ActorId(actor_id, c_actor_id) => unsafe { + Ok((*c_actor_id.get()).get_or_insert(AMactorId::new(actor_id))) + }, + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a mut Value> for &'a mut AMchange { + type Error = am::AutomergeError; + + fn try_from(value: &'a mut Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + Change(change, c_change) => unsafe { + Ok((*c_change.get()).get_or_insert(AMchange::new(change))) + }, + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a mut Value> for &'a mut AMdoc { + type Error = am::AutomergeError; + + fn try_from(value: &'a mut Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + Doc(doc) => Ok(doc.get_mut()), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a Value> for &'a AMsyncHave { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + SyncHave(sync_have) => Ok(sync_have), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a Value> for &'a AMsyncMessage { + type Error = am::AutomergeError; + + fn try_from(value: &'a Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + SyncMessage(sync_message) => Ok(sync_message), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl<'a> TryFrom<&'a mut Value> for &'a mut AMsyncState { + type Error = am::AutomergeError; + + fn try_from(value: &'a mut Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + + match value { + SyncState(sync_state) => Ok(sync_state.get_mut()), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} + +impl TryFrom<&Value> for bool { + type Error = am::AutomergeError; + + fn try_from(value: &Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Value(Scalar(scalar)) = value { + if let Boolean(boolean) = scalar.as_ref() { + return Ok(*boolean); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl TryFrom<&Value> for f64 { + type Error = am::AutomergeError; + + fn try_from(value: &Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Value(Scalar(scalar)) = value { + if let F64(float) = scalar.as_ref() { + return Ok(*float); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl TryFrom<&Value> for u64 { + type Error = am::AutomergeError; + + fn try_from(value: &Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Value(Scalar(scalar)) = value { + if let Uint(uint) = scalar.as_ref() { + return Ok(*uint); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl TryFrom<&Value> for AMunknownValue { + type Error = am::AutomergeError; + + fn try_from(value: &Value) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidValueType; + use am::ScalarValue::*; + use am::Value::*; + + if let Value(Scalar(scalar)) = value { + if let Unknown { bytes, type_code } = scalar.as_ref() { + return Ok(Self { + bytes: bytes.as_slice().into(), + type_code: *type_code, + }); + } + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }) + } +} + +impl PartialEq for Value { + fn eq(&self, other: &Self) -> bool { + use self::Value::*; + + match (self, other) { + (ActorId(lhs, _), ActorId(rhs, _)) => *lhs == *rhs, + (Change(lhs, _), Change(rhs, _)) => lhs == rhs, + (ChangeHash(lhs), ChangeHash(rhs)) => lhs == rhs, + (Doc(lhs), Doc(rhs)) => lhs.as_ptr() == rhs.as_ptr(), + (SyncMessage(lhs), SyncMessage(rhs)) => *lhs == *rhs, + (SyncState(lhs), SyncState(rhs)) => *lhs == *rhs, + (Value(lhs), Value(rhs)) => lhs == rhs, + _ => false, + } + } +} + +#[derive(Default)] +pub struct Item { + /// The item's index. + index: Option, + /// The item's identifier. + obj_id: Option, + /// The item's value. + value: Option, +} + +impl Item { + pub fn try_into_bytes(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_bytes(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + + pub fn try_into_change_hash(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_change_hash(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + + pub fn try_into_counter(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_counter(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + + pub fn try_into_int(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_int(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + + pub fn try_into_str(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_str(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + + pub fn try_into_timestamp(&self) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &self.value { + return value.try_into_timestamp(); + } + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } +} + +impl From for Item { + fn from(actor_id: am::ActorId) -> Self { + Value::from(actor_id).into() + } +} + +impl From for Item { + fn from(auto_commit: am::AutoCommit) -> Self { + Value::from(auto_commit).into() + } +} + +impl From for Item { + fn from(change: am::Change) -> Self { + Value::from(change).into() + } +} + +impl From for Item { + fn from(change_hash: am::ChangeHash) -> Self { + Value::from(change_hash).into() + } +} + +impl From<(am::ObjId, am::ObjType)> for Item { + fn from((obj_id, obj_type): (am::ObjId, am::ObjType)) -> Self { + Self { + index: None, + obj_id: Some(AMobjId::new(obj_id)), + value: Some(am::Value::Object(obj_type).into()), + } + } +} + +impl From for Item { + fn from(have: am::sync::Have) -> Self { + Value::from(have).into() + } +} + +impl From for Item { + fn from(message: am::sync::Message) -> Self { + Value::from(message).into() + } +} + +impl From for Item { + fn from(state: am::sync::State) -> Self { + Value::from(state).into() + } +} + +impl From> for Item { + fn from(value: am::Value<'static>) -> Self { + Value::from(value).into() + } +} + +impl From for Item { + fn from(string: String) -> Self { + Value::from(string).into() + } +} + +impl From for Item { + fn from(value: Value) -> Self { + Self { + index: None, + obj_id: None, + value: Some(value), + } + } +} + +impl PartialEq for Item { + fn eq(&self, other: &Self) -> bool { + self.index == other.index && self.obj_id == other.obj_id && self.value == other.value + } +} + +impl<'a> TryFrom<&'a Item> for &'a am::Change { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a Item> for &'a am::ChangeHash { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a Item> for &'a am::ScalarValue { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a Item> for &'a AMactorId { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a mut Item> for &'a mut AMchange { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &mut item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a mut Item> for &'a mut AMdoc { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &mut item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl From<&Item> for AMidxType { + fn from(item: &Item) -> Self { + if let Some(index) = &item.index { + return index.into(); + } + Default::default() + } +} + +impl<'a> TryFrom<&'a Item> for &'a AMsyncHave { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a Item> for &'a AMsyncMessage { + type Error = am::AutomergeError; + + fn try_from(item: &'a Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl<'a> TryFrom<&'a mut Item> for &'a mut AMsyncState { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &mut item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl TryFrom<&Item> for bool { + type Error = am::AutomergeError; + + fn try_from(item: &Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl TryFrom<&Item> for f64 { + type Error = am::AutomergeError; + + fn try_from(item: &Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl TryFrom<&Item> for u64 { + type Error = am::AutomergeError; + + fn try_from(item: &Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl TryFrom<&Item> for AMunknownValue { + type Error = am::AutomergeError; + + fn try_from(item: &Item) -> Result { + use am::AutomergeError::InvalidValueType; + + if let Some(value) = &item.value { + value.try_into() + } else { + Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::>().to_string(), + }) + } + } +} + +impl TryFrom<&Item> for (am::Value<'static>, am::ObjId) { + type Error = am::AutomergeError; + + fn try_from(item: &Item) -> Result { + use self::Value::*; + use am::AutomergeError::InvalidObjId; + use am::AutomergeError::InvalidValueType; + + let expected = type_name::().to_string(); + match (&item.obj_id, &item.value) { + (None, None) | (None, Some(_)) => Err(InvalidObjId("".to_string())), + (Some(_), None) => Err(InvalidValueType { + expected, + unexpected: type_name::>().to_string(), + }), + (Some(obj_id), Some(value)) => match value { + ActorId(_, _) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + ChangeHash(_) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + Change(_, _) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + Doc(_) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + SyncHave(_) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + SyncMessage(_) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + SyncState(_) => Err(InvalidValueType { + expected, + unexpected: type_name::().to_string(), + }), + Value(v) => Ok((v.clone(), obj_id.as_ref().clone())), + }, + } + } +} + +/// \struct AMitem +/// \installed_headerfile +/// \brief An item within a result. +#[derive(Clone)] +pub struct AMitem(Rc); + +impl AMitem { + pub fn exact(obj_id: am::ObjId, value: Value) -> Self { + Self(Rc::new(Item { + index: None, + obj_id: Some(AMobjId::new(obj_id)), + value: Some(value), + })) + } + + pub fn indexed(index: AMindex, obj_id: am::ObjId, value: Value) -> Self { + Self(Rc::new(Item { + index: Some(index), + obj_id: Some(AMobjId::new(obj_id)), + value: Some(value), + })) + } +} + +impl AsRef for AMitem { + fn as_ref(&self) -> &Item { + self.0.as_ref() + } +} + +impl Default for AMitem { + fn default() -> Self { + Self(Rc::new(Item { + index: None, + obj_id: None, + value: None, + })) + } +} + +impl From for AMitem { + fn from(actor_id: am::ActorId) -> Self { + Value::from(actor_id).into() + } +} + +impl From for AMitem { + fn from(auto_commit: am::AutoCommit) -> Self { + Value::from(auto_commit).into() + } +} + +impl From for AMitem { + fn from(change: am::Change) -> Self { + Value::from(change).into() + } +} + +impl From for AMitem { + fn from(change_hash: am::ChangeHash) -> Self { + Value::from(change_hash).into() + } +} + +impl From<(am::ObjId, am::ObjType)> for AMitem { + fn from((obj_id, obj_type): (am::ObjId, am::ObjType)) -> Self { + Self(Rc::new(Item::from((obj_id, obj_type)))) + } +} + +impl From for AMitem { + fn from(have: am::sync::Have) -> Self { + Value::from(have).into() + } +} + +impl From for AMitem { + fn from(message: am::sync::Message) -> Self { + Value::from(message).into() + } +} + +impl From for AMitem { + fn from(state: am::sync::State) -> Self { + Value::from(state).into() + } +} + +impl From> for AMitem { + fn from(value: am::Value<'static>) -> Self { + Value::from(value).into() + } +} + +impl From for AMitem { + fn from(string: String) -> Self { + Value::from(string).into() + } +} + +impl From for AMitem { + fn from(value: Value) -> Self { + Self(Rc::new(Item::from(value))) + } +} + +impl PartialEq for AMitem { + fn eq(&self, other: &Self) -> bool { + self.as_ref() == other.as_ref() + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a am::Change { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a am::ChangeHash { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a am::ScalarValue { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a AMactorId { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a mut AMitem> for &'a mut AMchange { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut AMitem) -> Result { + if let Some(item) = Rc::get_mut(&mut item.0) { + item.try_into() + } else { + Err(Self::Error::Fail) + } + } +} + +impl<'a> TryFrom<&'a mut AMitem> for &'a mut AMdoc { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut AMitem) -> Result { + if let Some(item) = Rc::get_mut(&mut item.0) { + item.try_into() + } else { + Err(Self::Error::Fail) + } + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a AMsyncHave { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a AMitem> for &'a AMsyncMessage { + type Error = am::AutomergeError; + + fn try_from(item: &'a AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl<'a> TryFrom<&'a mut AMitem> for &'a mut AMsyncState { + type Error = am::AutomergeError; + + fn try_from(item: &'a mut AMitem) -> Result { + if let Some(item) = Rc::get_mut(&mut item.0) { + item.try_into() + } else { + Err(Self::Error::Fail) + } + } +} + +impl TryFrom<&AMitem> for bool { + type Error = am::AutomergeError; + + fn try_from(item: &AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl TryFrom<&AMitem> for f64 { + type Error = am::AutomergeError; + + fn try_from(item: &AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl TryFrom<&AMitem> for u64 { + type Error = am::AutomergeError; + + fn try_from(item: &AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl TryFrom<&AMitem> for AMunknownValue { + type Error = am::AutomergeError; + + fn try_from(item: &AMitem) -> Result { + item.as_ref().try_into() + } +} + +impl TryFrom<&AMitem> for (am::Value<'static>, am::ObjId) { + type Error = am::AutomergeError; + + fn try_from(item: &AMitem) -> Result { + item.as_ref().try_into() + } +} + +/// \ingroup enumerations +/// \enum AMvalType +/// \installed_headerfile +/// \brief The type of an item's value. +#[derive(PartialEq, Eq)] +#[repr(u32)] +pub enum AMvalType { + /// An actor identifier value. + ActorId = 1 << 1, + /// A boolean value. + Bool = 1 << 2, + /// A view onto an array of bytes value. + Bytes = 1 << 3, + /// A change value. + Change = 1 << 4, + /// A change hash value. + ChangeHash = 1 << 5, + /// A CRDT counter value. + Counter = 1 << 6, + /// The default tag, not a type signifier. + Default = 0, + /// A document value. + Doc = 1 << 7, + /// A 64-bit float value. + F64 = 1 << 8, + /// A 64-bit signed integer value. + Int = 1 << 9, + /// A null value. + Null = 1 << 10, + /// An object type value. + ObjType = 1 << 11, + /// A UTF-8 string view value. + Str = 1 << 12, + /// A synchronization have value. + SyncHave = 1 << 13, + /// A synchronization message value. + SyncMessage = 1 << 14, + /// A synchronization state value. + SyncState = 1 << 15, + /// A *nix timestamp (milliseconds) value. + Timestamp = 1 << 16, + /// A 64-bit unsigned integer value. + Uint = 1 << 17, + /// An unknown type of value. + Unknown = 1 << 18, + /// A void. + Void = 1 << 0, +} + +impl Default for AMvalType { + fn default() -> Self { + Self::Default + } +} + +impl From<&am::Value<'static>> for AMvalType { + fn from(value: &am::Value<'static>) -> Self { + use am::ScalarValue::*; + use am::Value::*; + + match value { + Object(_) => Self::ObjType, + Scalar(scalar) => match scalar.as_ref() { + Boolean(_) => Self::Bool, + Bytes(_) => Self::Bytes, + Counter(_) => Self::Counter, + F64(_) => Self::F64, + Int(_) => Self::Int, + Null => Self::Null, + Str(_) => Self::Str, + Timestamp(_) => Self::Timestamp, + Uint(_) => Self::Uint, + Unknown { .. } => Self::Unknown, + }, + } + } +} + +impl From<&Value> for AMvalType { + fn from(value: &Value) -> Self { + use self::Value::*; + + match value { + ActorId(_, _) => Self::ActorId, + Change(_, _) => Self::Change, + ChangeHash(_) => Self::ChangeHash, + Doc(_) => Self::Doc, + SyncHave(_) => Self::SyncHave, + SyncMessage(_) => Self::SyncMessage, + SyncState(_) => Self::SyncState, + Value(v) => v.into(), + } + } +} + +impl From<&Item> for AMvalType { + fn from(item: &Item) -> Self { + if let Some(value) = &item.value { + return value.into(); + } + Self::Void + } +} + +/// \memberof AMitem +/// \brief Tests the equality of two items. +/// +/// \param[in] item1 A pointer to an `AMitem` struct. +/// \param[in] item2 A pointer to an `AMitem` struct. +/// \return `true` if \p item1 `==` \p item2 and `false` otherwise. +/// \pre \p item1 `!= NULL` +/// \pre \p item2 `!= NULL` +/// \post `!(`\p item1 `&&` \p item2 `) -> false` +/// \internal +/// +/// #Safety +/// item1 must be a valid AMitem pointer +/// item2 must be a valid AMitem pointer +#[no_mangle] +pub unsafe extern "C" fn AMitemEqual(item1: *const AMitem, item2: *const AMitem) -> bool { + match (item1.as_ref(), item2.as_ref()) { + (Some(item1), Some(item2)) => *item1 == *item2, + (None, None) | (None, Some(_)) | (Some(_), None) => false, + } +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a boolean value. +/// +/// \param[in] value A boolean. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BOOL` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromBool(value: bool) -> *mut AMresult { + AMresult::item(am::Value::from(value).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from an array of bytes value. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to copy from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMitemFromBytes(src: *const u8, count: usize) -> *mut AMresult { + let value = std::slice::from_raw_parts(src, count); + AMresult::item(am::Value::bytes(value.to_vec()).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a change hash value. +/// +/// \param[in] value A change hash as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_CHANGE_HASH` item. +/// \pre \p value.src `!= NULL` +/// \pre `0 <` \p value.count `<= sizeof(`\p value.src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMitemFromChangeHash(value: AMbyteSpan) -> *mut AMresult { + to_result(am::ChangeHash::try_from(&value)) +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a CRDT counter value. +/// +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_COUNTER` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromCounter(value: i64) -> *mut AMresult { + AMresult::item(am::Value::counter(value).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a float value. +/// +/// \param[in] value A 64-bit float. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_F64` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromF64(value: f64) -> *mut AMresult { + AMresult::item(am::Value::f64(value).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a signed integer value. +/// +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_INT` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromInt(value: i64) -> *mut AMresult { + AMresult::item(am::Value::int(value).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a null value. +/// +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_NULL` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromNull() -> *mut AMresult { + AMresult::item(am::Value::from(()).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a UTF-8 string value. +/// +/// \param[in] value A UTF-8 string view as an `AMbyteSpan` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_STR` item. +/// \pre \p value.src `!= NULL` +/// \pre `0 <` \p value.count `<= sizeof(`\p value.src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// value.src must be a byte array of length >= value.count +#[no_mangle] +pub unsafe extern "C" fn AMitemFromStr(value: AMbyteSpan) -> *mut AMresult { + AMresult::item(am::Value::str(to_str!(value)).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from a *nix timestamp +/// (milliseconds) value. +/// +/// \param[in] value A 64-bit signed integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_TIMESTAMP` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromTimestamp(value: i64) -> *mut AMresult { + AMresult::item(am::Value::timestamp(value).into()).into() +} + +/// \memberof AMitem +/// \brief Allocates a new item and initializes it from an unsigned integer value. +/// +/// \param[in] value A 64-bit unsigned integer. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_UINT` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub unsafe extern "C" fn AMitemFromUint(value: u64) -> *mut AMresult { + AMresult::item(am::Value::uint(value).into()).into() +} + +/// \memberof AMitem +/// \brief Gets the type of an item's index. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \return An `AMidxType` enum tag. +/// \pre \p item `!= NULL` +/// \post `(`\p item `== NULL) -> 0` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemIdxType(item: *const AMitem) -> AMidxType { + if let Some(item) = item.as_ref() { + return item.0.as_ref().into(); + } + Default::default() +} + +/// \memberof AMitem +/// \brief Gets the object identifier of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \return A pointer to an `AMobjId` struct. +/// \pre \p item `!= NULL` +/// \post `(`\p item `== NULL) -> NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemObjId(item: *const AMitem) -> *const AMobjId { + if let Some(item) = item.as_ref() { + if let Some(obj_id) = &item.as_ref().obj_id { + return obj_id; + } + } + std::ptr::null() +} + +/// \memberof AMitem +/// \brief Gets the UTF-8 string view key index of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a UTF-8 string view as an `AMbyteSpan` struct. +/// \return `true` if `AMitemIdxType(`\p item `) == AM_IDX_TYPE_KEY` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemKey(item: *const AMitem, value: *mut AMbyteSpan) -> bool { + if let Some(item) = item.as_ref() { + if let Some(index) = &item.as_ref().index { + if let Ok(key) = index.try_into() { + if !value.is_null() { + *value = key; + return true; + } + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the unsigned integer position index of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a `size_t`. +/// \return `true` if `AMitemIdxType(`\p item `) == AM_IDX_TYPE_POS` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemPos(item: *const AMitem, value: *mut usize) -> bool { + if let Some(item) = item.as_ref() { + if let Some(index) = &item.as_ref().index { + if let Ok(pos) = index.try_into() { + if !value.is_null() { + *value = pos; + return true; + } + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the reference count of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p item `!= NULL` +/// \post `(`\p item `== NULL) -> 0` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemRefCount(item: *const AMitem) -> usize { + if let Some(item) = item.as_ref() { + return Rc::strong_count(&item.0); + } + 0 +} + +/// \memberof AMitem +/// \brief Gets a new result for an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \return A pointer to an `AMresult` struct. +/// \pre \p item `!= NULL` +/// \post `(`\p item `== NULL) -> NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemResult(item: *const AMitem) -> *mut AMresult { + if let Some(item) = item.as_ref() { + return AMresult::item(item.clone()).into(); + } + std::ptr::null_mut() +} + +/// \memberof AMitem +/// \brief Gets the actor identifier value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMactorId` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_ACTOR_ID` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToActorId( + item: *const AMitem, + value: *mut *const AMactorId, +) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(actor_id) = <&AMactorId>::try_from(item) { + if !value.is_null() { + *value = actor_id; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the boolean value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a boolean. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_BOOL` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToBool(item: *const AMitem, value: *mut bool) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(boolean) = item.try_into() { + if !value.is_null() { + *value = boolean; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the array of bytes value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMbyteSpan` struct. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_BYTES` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToBytes(item: *const AMitem, value: *mut AMbyteSpan) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(bytes) = item.as_ref().try_into_bytes() { + if !value.is_null() { + *value = bytes; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the change value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMchange` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_CHANGE` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToChange(item: *mut AMitem, value: *mut *mut AMchange) -> bool { + if let Some(item) = item.as_mut() { + if let Ok(change) = <&mut AMchange>::try_from(item) { + if !value.is_null() { + *value = change; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the change hash value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMbyteSpan` struct. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_CHANGE_HASH` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToChangeHash(item: *const AMitem, value: *mut AMbyteSpan) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(change_hash) = item.as_ref().try_into_change_hash() { + if !value.is_null() { + *value = change_hash; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the CRDT counter value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a signed 64-bit integer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_COUNTER` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToCounter(item: *const AMitem, value: *mut i64) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(counter) = item.as_ref().try_into_counter() { + if !value.is_null() { + *value = counter; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the document value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMdoc` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_DOC` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToDoc(item: *mut AMitem, value: *mut *const AMdoc) -> bool { + if let Some(item) = item.as_mut() { + if let Ok(doc) = <&mut AMdoc>::try_from(item) { + if !value.is_null() { + *value = doc; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the float value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a 64-bit float. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_F64` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToF64(item: *const AMitem, value: *mut f64) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(float) = item.try_into() { + if !value.is_null() { + *value = float; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the integer value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a signed 64-bit integer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_INT` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToInt(item: *const AMitem, value: *mut i64) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(int) = item.as_ref().try_into_int() { + if !value.is_null() { + *value = int; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the UTF-8 string view value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a UTF-8 string view as an `AMbyteSpan` struct. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_STR` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToStr(item: *const AMitem, value: *mut AMbyteSpan) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(str) = item.as_ref().try_into_str() { + if !value.is_null() { + *value = str; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the synchronization have value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMsyncHave` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_SYNC_HAVE` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToSyncHave( + item: *const AMitem, + value: *mut *const AMsyncHave, +) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(sync_have) = <&AMsyncHave>::try_from(item) { + if !value.is_null() { + *value = sync_have; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the synchronization message value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMsyncMessage` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_SYNC_MESSAGE` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToSyncMessage( + item: *const AMitem, + value: *mut *const AMsyncMessage, +) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(sync_message) = <&AMsyncMessage>::try_from(item) { + if !value.is_null() { + *value = sync_message; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the synchronization state value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMsyncState` struct pointer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_SYNC_STATE` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToSyncState( + item: *mut AMitem, + value: *mut *mut AMsyncState, +) -> bool { + if let Some(item) = item.as_mut() { + if let Ok(sync_state) = <&mut AMsyncState>::try_from(item) { + if !value.is_null() { + *value = sync_state; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the *nix timestamp (milliseconds) value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a signed 64-bit integer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_TIMESTAMP` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToTimestamp(item: *const AMitem, value: *mut i64) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(timestamp) = item.as_ref().try_into_timestamp() { + if !value.is_null() { + *value = timestamp; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the unsigned integer value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to a unsigned 64-bit integer. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_UINT` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToUint(item: *const AMitem, value: *mut u64) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(uint) = item.try_into() { + if !value.is_null() { + *value = uint; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the unknown type of value of an item. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \param[out] value A pointer to an `AMunknownValue` struct. +/// \return `true` if `AMitemValType(`\p item `) == AM_VAL_TYPE_UNKNOWN` and +/// \p *value has been reassigned, `false` otherwise. +/// \pre \p item `!= NULL` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemToUnknown(item: *const AMitem, value: *mut AMunknownValue) -> bool { + if let Some(item) = item.as_ref() { + if let Ok(unknown) = item.try_into() { + if !value.is_null() { + *value = unknown; + return true; + } + } + } + false +} + +/// \memberof AMitem +/// \brief Gets the type of an item's value. +/// +/// \param[in] item A pointer to an `AMitem` struct. +/// \return An `AMvalType` enum tag. +/// \pre \p item `!= NULL` +/// \post `(`\p item `== NULL) -> 0` +/// \internal +/// +/// # Safety +/// item must be a valid pointer to an AMitem +#[no_mangle] +pub unsafe extern "C" fn AMitemValType(item: *const AMitem) -> AMvalType { + if let Some(item) = item.as_ref() { + return item.0.as_ref().into(); + } + Default::default() +} diff --git a/rust/automerge-c/src/items.rs b/rust/automerge-c/src/items.rs new file mode 100644 index 00000000..361078b3 --- /dev/null +++ b/rust/automerge-c/src/items.rs @@ -0,0 +1,401 @@ +use automerge as am; + +use std::ffi::c_void; +use std::marker::PhantomData; +use std::mem::size_of; + +use crate::item::AMitem; +use crate::result::AMresult; + +#[repr(C)] +struct Detail { + len: usize, + offset: isize, + ptr: *const c_void, +} + +/// \note cbindgen won't propagate the value of a `std::mem::size_of()` call +/// (https://github.com/eqrion/cbindgen/issues/252) but it will +/// propagate the name of a constant initialized from it so if the +/// constant's name is a symbolic representation of the value it can be +/// converted into a number by post-processing the header it generated. +pub const USIZE_USIZE_USIZE_: usize = size_of::(); + +impl Detail { + fn new(items: &[AMitem], offset: isize) -> Self { + Self { + len: items.len(), + offset, + ptr: items.as_ptr() as *mut c_void, + } + } + + pub fn advance(&mut self, n: isize) { + if n == 0 { + return; + } + let len = self.len as isize; + self.offset = if self.offset < 0 { + // It's reversed. + let unclipped = self.offset.checked_sub(n).unwrap_or(isize::MIN); + if unclipped >= 0 { + // Clip it to the forward stop. + len + } else { + std::cmp::min(std::cmp::max(-(len + 1), unclipped), -1) + } + } else { + let unclipped = self.offset.checked_add(n).unwrap_or(isize::MAX); + if unclipped < 0 { + // Clip it to the reverse stop. + -(len + 1) + } else { + std::cmp::max(0, std::cmp::min(unclipped, len)) + } + } + } + + pub fn get_index(&self) -> usize { + (self.offset + + if self.offset < 0 { + self.len as isize + } else { + 0 + }) as usize + } + + pub fn next(&mut self, n: isize) -> Option<&mut AMitem> { + if self.is_stopped() { + return None; + } + let slice: &mut [AMitem] = + unsafe { std::slice::from_raw_parts_mut(self.ptr as *mut AMitem, self.len) }; + let value = &mut slice[self.get_index()]; + self.advance(n); + Some(value) + } + + pub fn is_stopped(&self) -> bool { + let len = self.len as isize; + self.offset < -len || self.offset == len + } + + pub fn prev(&mut self, n: isize) -> Option<&mut AMitem> { + self.advance(-n); + if self.is_stopped() { + return None; + } + let slice: &mut [AMitem] = + unsafe { std::slice::from_raw_parts_mut(self.ptr as *mut AMitem, self.len) }; + Some(&mut slice[self.get_index()]) + } + + pub fn reversed(&self) -> Self { + Self { + len: self.len, + offset: -(self.offset + 1), + ptr: self.ptr, + } + } + + pub fn rewound(&self) -> Self { + Self { + len: self.len, + offset: if self.offset < 0 { -1 } else { 0 }, + ptr: self.ptr, + } + } +} + +impl From for [u8; USIZE_USIZE_USIZE_] { + fn from(detail: Detail) -> Self { + unsafe { + std::slice::from_raw_parts((&detail as *const Detail) as *const u8, USIZE_USIZE_USIZE_) + .try_into() + .unwrap() + } + } +} + +/// \struct AMitems +/// \installed_headerfile +/// \brief A random-access iterator over a sequence of `AMitem` structs. +#[repr(C)] +#[derive(Eq, PartialEq)] +pub struct AMitems<'a> { + /// An implementation detail that is intentionally opaque. + /// \warning Modifying \p detail will cause undefined behavior. + /// \note The actual size of \p detail will vary by platform, this is just + /// the one for the platform this documentation was built on. + detail: [u8; USIZE_USIZE_USIZE_], + phantom: PhantomData<&'a mut AMresult>, +} + +impl<'a> AMitems<'a> { + pub fn new(items: &[AMitem]) -> Self { + Self { + detail: Detail::new(items, 0).into(), + phantom: PhantomData, + } + } + + pub fn advance(&mut self, n: isize) { + let detail = unsafe { &mut *(self.detail.as_mut_ptr() as *mut Detail) }; + detail.advance(n); + } + + pub fn len(&self) -> usize { + let detail = unsafe { &*(self.detail.as_ptr() as *const Detail) }; + detail.len + } + + pub fn next(&mut self, n: isize) -> Option<&mut AMitem> { + let detail = unsafe { &mut *(self.detail.as_mut_ptr() as *mut Detail) }; + detail.next(n) + } + + pub fn prev(&mut self, n: isize) -> Option<&mut AMitem> { + let detail = unsafe { &mut *(self.detail.as_mut_ptr() as *mut Detail) }; + detail.prev(n) + } + + pub fn reversed(&self) -> Self { + let detail = unsafe { &*(self.detail.as_ptr() as *const Detail) }; + Self { + detail: detail.reversed().into(), + phantom: PhantomData, + } + } + + pub fn rewound(&self) -> Self { + let detail = unsafe { &*(self.detail.as_ptr() as *const Detail) }; + Self { + detail: detail.rewound().into(), + phantom: PhantomData, + } + } +} + +impl<'a> AsRef<[AMitem]> for AMitems<'a> { + fn as_ref(&self) -> &[AMitem] { + let detail = unsafe { &*(self.detail.as_ptr() as *const Detail) }; + unsafe { std::slice::from_raw_parts(detail.ptr as *const AMitem, detail.len) } + } +} + +impl<'a> Default for AMitems<'a> { + fn default() -> Self { + Self { + detail: [0; USIZE_USIZE_USIZE_], + phantom: PhantomData, + } + } +} + +impl TryFrom<&AMitems<'_>> for Vec { + type Error = am::AutomergeError; + + fn try_from(items: &AMitems<'_>) -> Result { + let mut changes = Vec::::with_capacity(items.len()); + for item in items.as_ref().iter() { + match <&am::Change>::try_from(item.as_ref()) { + Ok(change) => { + changes.push(change.clone()); + } + Err(e) => { + return Err(e); + } + } + } + Ok(changes) + } +} + +impl TryFrom<&AMitems<'_>> for Vec { + type Error = am::AutomergeError; + + fn try_from(items: &AMitems<'_>) -> Result { + let mut change_hashes = Vec::::with_capacity(items.len()); + for item in items.as_ref().iter() { + match <&am::ChangeHash>::try_from(item.as_ref()) { + Ok(change_hash) => { + change_hashes.push(*change_hash); + } + Err(e) => { + return Err(e); + } + } + } + Ok(change_hashes) + } +} + +impl TryFrom<&AMitems<'_>> for Vec { + type Error = am::AutomergeError; + + fn try_from(items: &AMitems<'_>) -> Result { + let mut scalars = Vec::::with_capacity(items.len()); + for item in items.as_ref().iter() { + match <&am::ScalarValue>::try_from(item.as_ref()) { + Ok(scalar) => { + scalars.push(scalar.clone()); + } + Err(e) => { + return Err(e); + } + } + } + Ok(scalars) + } +} + +/// \memberof AMitems +/// \brief Advances an iterator over a sequence of object items by at most +/// \p |n| positions where the sign of \p n is relative to the +/// iterator's direction. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \param[in] n The direction (\p -n -> opposite, \p n -> same) and maximum +/// number of positions to advance. +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsAdvance(items: *mut AMitems, n: isize) { + if let Some(items) = items.as_mut() { + items.advance(n); + }; +} + +/// \memberof AMitems +/// \brief Tests the equality of two sequences of object items underlying a +/// pair of iterators. +/// +/// \param[in] items1 A pointer to an `AMitems` struct. +/// \param[in] items2 A pointer to an `AMitems` struct. +/// \return `true` if \p items1 `==` \p items2 and `false` otherwise. +/// \pre \p items1 `!= NULL` +/// \pre \p items1 `!= NULL` +/// \post `!(`\p items1 `&&` \p items2 `) -> false` +/// \internal +/// +/// #Safety +/// items1 must be a valid pointer to an AMitems +/// items2 must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsEqual(items1: *const AMitems, items2: *const AMitems) -> bool { + match (items1.as_ref(), items2.as_ref()) { + (Some(items1), Some(items2)) => items1.as_ref() == items2.as_ref(), + (None, None) | (None, Some(_)) | (Some(_), None) => false, + } +} + +/// \memberof AMitems +/// \brief Gets the object item at the current position of an iterator over a +/// sequence of object items and then advances it by at most \p |n| +/// positions where the sign of \p n is relative to the iterator's +/// direction. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \param[in] n The direction (\p -n -> opposite, \p n -> same) and maximum +/// number of positions to advance. +/// \return A pointer to an `AMitem` struct that's `NULL` when \p items +/// was previously advanced past its forward/reverse limit. +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsNext(items: *mut AMitems, n: isize) -> *mut AMitem { + if let Some(items) = items.as_mut() { + if let Some(item) = items.next(n) { + return item; + } + } + std::ptr::null_mut() +} + +/// \memberof AMitems +/// \brief Advances an iterator over a sequence of object items by at most +/// \p |n| positions where the sign of \p n is relative to the +/// iterator's direction and then gets the object item at its new +/// position. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \param[in] n The direction (\p -n -> opposite, \p n -> same) and maximum +/// number of positions to advance. +/// \return A pointer to an `AMitem` struct that's `NULL` when \p items +/// is presently advanced past its forward/reverse limit. +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsPrev(items: *mut AMitems, n: isize) -> *mut AMitem { + if let Some(items) = items.as_mut() { + if let Some(obj_item) = items.prev(n) { + return obj_item; + } + } + std::ptr::null_mut() +} + +/// \memberof AMitems +/// \brief Gets the size of the sequence underlying an iterator. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \return The count of items in \p items. +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsSize(items: *const AMitems) -> usize { + if let Some(items) = items.as_ref() { + return items.len(); + } + 0 +} + +/// \memberof AMitems +/// \brief Creates an iterator over the same sequence of items as the +/// given one but with the opposite position and direction. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \return An `AMitems` struct +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsReversed(items: *const AMitems) -> AMitems { + if let Some(items) = items.as_ref() { + return items.reversed(); + } + Default::default() +} + +/// \memberof AMitems +/// \brief Creates an iterator at the starting position over the same sequence +/// of items as the given one. +/// +/// \param[in] items A pointer to an `AMitems` struct. +/// \return An `AMitems` struct +/// \pre \p items `!= NULL` +/// \internal +/// +/// #Safety +/// items must be a valid pointer to an AMitems +#[no_mangle] +pub unsafe extern "C" fn AMitemsRewound(items: *const AMitems) -> AMitems { + if let Some(items) = items.as_ref() { + return items.rewound(); + } + Default::default() +} diff --git a/rust/automerge-c/src/lib.rs b/rust/automerge-c/src/lib.rs new file mode 100644 index 00000000..1ee1a85d --- /dev/null +++ b/rust/automerge-c/src/lib.rs @@ -0,0 +1,12 @@ +mod actor_id; +mod byte_span; +mod change; +mod doc; +mod index; +mod item; +mod items; +mod obj; +mod result; +mod sync; + +// include!(concat!(env!("OUT_DIR"), "/enum_string_functions.rs")); diff --git a/rust/automerge-c/src/obj.rs b/rust/automerge-c/src/obj.rs new file mode 100644 index 00000000..3d52286c --- /dev/null +++ b/rust/automerge-c/src/obj.rs @@ -0,0 +1,216 @@ +use automerge as am; +use std::any::type_name; +use std::cell::RefCell; +use std::ops::Deref; + +use crate::actor_id::AMactorId; + +macro_rules! to_obj_id { + ($handle:expr) => {{ + match $handle.as_ref() { + Some(obj_id) => obj_id, + None => &automerge::ROOT, + } + }}; +} + +pub(crate) use to_obj_id; + +macro_rules! to_obj_type { + ($c_obj_type:expr) => {{ + let result: Result = (&$c_obj_type).try_into(); + match result { + Ok(obj_type) => obj_type, + Err(e) => return AMresult::error(&e.to_string()).into(), + } + }}; +} + +pub(crate) use to_obj_type; + +/// \struct AMobjId +/// \installed_headerfile +/// \brief An object's unique identifier. +#[derive(Eq, PartialEq)] +pub struct AMobjId { + body: am::ObjId, + c_actor_id: RefCell>, +} + +impl AMobjId { + pub fn new(obj_id: am::ObjId) -> Self { + Self { + body: obj_id, + c_actor_id: Default::default(), + } + } + + pub fn actor_id(&self) -> *const AMactorId { + let mut c_actor_id = self.c_actor_id.borrow_mut(); + match c_actor_id.as_mut() { + None => { + if let am::ObjId::Id(_, actor_id, _) = &self.body { + return c_actor_id.insert(AMactorId::new(actor_id)); + } + } + Some(value) => { + return value; + } + } + std::ptr::null() + } +} + +impl AsRef for AMobjId { + fn as_ref(&self) -> &am::ObjId { + &self.body + } +} + +impl Deref for AMobjId { + type Target = am::ObjId; + + fn deref(&self) -> &Self::Target { + &self.body + } +} + +/// \memberof AMobjId +/// \brief Gets the actor identifier component of an object identifier. +/// +/// \param[in] obj_id A pointer to an `AMobjId` struct. +/// \return A pointer to an `AMactorId` struct or `NULL`. +/// \pre \p obj_id `!= NULL` +/// \internal +/// +/// # Safety +/// obj_id must be a valid pointer to an AMobjId +#[no_mangle] +pub unsafe extern "C" fn AMobjIdActorId(obj_id: *const AMobjId) -> *const AMactorId { + if let Some(obj_id) = obj_id.as_ref() { + return obj_id.actor_id(); + }; + std::ptr::null() +} + +/// \memberof AMobjId +/// \brief Gets the counter component of an object identifier. +/// +/// \param[in] obj_id A pointer to an `AMobjId` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p obj_id `!= NULL` +/// \internal +/// +/// # Safety +/// obj_id must be a valid pointer to an AMobjId +#[no_mangle] +pub unsafe extern "C" fn AMobjIdCounter(obj_id: *const AMobjId) -> u64 { + if let Some(obj_id) = obj_id.as_ref() { + match obj_id.as_ref() { + am::ObjId::Id(counter, _, _) => *counter, + am::ObjId::Root => 0, + } + } else { + u64::MAX + } +} + +/// \memberof AMobjId +/// \brief Tests the equality of two object identifiers. +/// +/// \param[in] obj_id1 A pointer to an `AMobjId` struct. +/// \param[in] obj_id2 A pointer to an `AMobjId` struct. +/// \return `true` if \p obj_id1 `==` \p obj_id2 and `false` otherwise. +/// \pre \p obj_id1 `!= NULL` +/// \pre \p obj_id1 `!= NULL` +/// \post `!(`\p obj_id1 `&&` \p obj_id2 `) -> false` +/// \internal +/// +/// #Safety +/// obj_id1 must be a valid AMobjId pointer +/// obj_id2 must be a valid AMobjId pointer +#[no_mangle] +pub unsafe extern "C" fn AMobjIdEqual(obj_id1: *const AMobjId, obj_id2: *const AMobjId) -> bool { + match (obj_id1.as_ref(), obj_id2.as_ref()) { + (Some(obj_id1), Some(obj_id2)) => obj_id1 == obj_id2, + (None, None) | (None, Some(_)) | (Some(_), None) => false, + } +} + +/// \memberof AMobjId +/// \brief Gets the index component of an object identifier. +/// +/// \param[in] obj_id A pointer to an `AMobjId` struct. +/// \return A 64-bit unsigned integer. +/// \pre \p obj_id `!= NULL` +/// \internal +/// +/// # Safety +/// obj_id must be a valid pointer to an AMobjId +#[no_mangle] +pub unsafe extern "C" fn AMobjIdIndex(obj_id: *const AMobjId) -> usize { + use am::ObjId::*; + + if let Some(obj_id) = obj_id.as_ref() { + match obj_id.as_ref() { + Id(_, _, index) => *index, + Root => 0, + } + } else { + usize::MAX + } +} + +/// \ingroup enumerations +/// \enum AMobjType +/// \installed_headerfile +/// \brief The type of an object value. +#[derive(PartialEq, Eq)] +#[repr(u8)] +pub enum AMobjType { + /// The default tag, not a type signifier. + Default = 0, + /// A list. + List = 1, + /// A key-value map. + Map, + /// A list of Unicode graphemes. + Text, +} + +impl Default for AMobjType { + fn default() -> Self { + Self::Default + } +} + +impl From<&am::ObjType> for AMobjType { + fn from(o: &am::ObjType) -> Self { + use am::ObjType::*; + + match o { + List => Self::List, + Map | Table => Self::Map, + Text => Self::Text, + } + } +} + +impl TryFrom<&AMobjType> for am::ObjType { + type Error = am::AutomergeError; + + fn try_from(c_obj_type: &AMobjType) -> Result { + use am::AutomergeError::InvalidValueType; + use AMobjType::*; + + match c_obj_type { + List => Ok(Self::List), + Map => Ok(Self::Map), + Text => Ok(Self::Text), + _ => Err(InvalidValueType { + expected: type_name::().to_string(), + unexpected: type_name::().to_string(), + }), + } + } +} diff --git a/rust/automerge-c/src/result.rs b/rust/automerge-c/src/result.rs new file mode 100644 index 00000000..2975f38b --- /dev/null +++ b/rust/automerge-c/src/result.rs @@ -0,0 +1,660 @@ +use automerge as am; + +use std::ops::{Range, RangeFrom, RangeFull, RangeTo}; + +use crate::byte_span::AMbyteSpan; +use crate::index::AMindex; +use crate::item::AMitem; +use crate::items::AMitems; + +/// \struct AMresult +/// \installed_headerfile +/// \brief A discriminated union of result variants. +pub enum AMresult { + Items(Vec), + Error(String), +} + +impl AMresult { + pub(crate) fn error(s: &str) -> Self { + Self::Error(s.to_string()) + } + + pub(crate) fn item(item: AMitem) -> Self { + Self::Items(vec![item]) + } + + pub(crate) fn items(items: Vec) -> Self { + Self::Items(items) + } +} + +impl Default for AMresult { + fn default() -> Self { + Self::Items(vec![]) + } +} + +impl From for AMresult { + fn from(auto_commit: am::AutoCommit) -> Self { + Self::item(AMitem::exact(am::ROOT, auto_commit.into())) + } +} + +impl From for AMresult { + fn from(change: am::Change) -> Self { + Self::item(change.into()) + } +} + +impl From for AMresult { + fn from(change_hash: am::ChangeHash) -> Self { + Self::item(change_hash.into()) + } +} + +impl From> for AMresult { + fn from(maybe: Option) -> Self { + match maybe { + Some(change_hash) => change_hash.into(), + None => Self::item(Default::default()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(change_hash) => change_hash.into(), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From for AMresult { + fn from(state: am::sync::State) -> Self { + Self::item(state.into()) + } +} + +impl From> for AMresult { + fn from(pairs: am::Values<'static>) -> Self { + Self::items(pairs.map(|(v, o)| AMitem::exact(o, v.into())).collect()) + } +} + +impl From for *mut AMresult { + fn from(b: AMresult) -> Self { + Box::into_raw(Box::new(b)) + } +} + +impl From> for AMresult { + fn from(keys: am::Keys<'_, '_>) -> Self { + Self::items(keys.map(|s| s.into()).collect()) + } +} + +impl From> for AMresult { + fn from(keys: am::KeysAt<'_, '_>) -> Self { + Self::items(keys.map(|s| s.into()).collect()) + } +} + +impl From>> for AMresult { + fn from(list_range: am::ListRange<'static, Range>) -> Self { + Self::items( + list_range + .map(|(i, v, o)| AMitem::indexed(AMindex::Pos(i), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(list_range: am::ListRangeAt<'static, Range>) -> Self { + Self::items( + list_range + .map(|(i, v, o)| AMitem::indexed(AMindex::Pos(i), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRange<'static, Range>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRangeAt<'static, Range>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRange<'static, RangeFrom>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRangeAt<'static, RangeFrom>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From> for AMresult { + fn from(map_range: am::MapRange<'static, RangeFull>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From> for AMresult { + fn from(map_range: am::MapRangeAt<'static, RangeFull>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRange<'static, RangeTo>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From>> for AMresult { + fn from(map_range: am::MapRangeAt<'static, RangeTo>) -> Self { + Self::items( + map_range + .map(|(k, v, o)| AMitem::indexed(AMindex::Key(k.into()), o, v.into())) + .collect(), + ) + } +} + +impl From> for AMresult { + fn from(maybe: Option<&am::Change>) -> Self { + Self::item(match maybe { + Some(change) => change.clone().into(), + None => Default::default(), + }) + } +} + +impl From> for AMresult { + fn from(maybe: Option) -> Self { + Self::item(match maybe { + Some(message) => message.into(), + None => Default::default(), + }) + } +} + +impl From> for AMresult { + fn from(maybe: Result<(), am::AutomergeError>) -> Self { + match maybe { + Ok(()) => Self::item(Default::default()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(actor_id) => Self::item(actor_id.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(actor_id) => Self::item(actor_id.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(auto_commit) => Self::item(auto_commit.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(change) => Self::item(change.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From<(Result, am::ObjType)> for AMresult { + fn from(tuple: (Result, am::ObjType)) -> Self { + match tuple { + (Ok(obj_id), obj_type) => Self::item((obj_id, obj_type).into()), + (Err(e), _) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(message) => Self::item(message.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(state) => Self::item(state.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::AutomergeError>) -> Self { + match maybe { + Ok(value) => Self::item(value.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::ObjId)>, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::ObjId)>, am::AutomergeError>) -> Self { + match maybe { + Ok(Some((value, obj_id))) => Self::item(AMitem::exact(obj_id, value.into())), + Ok(None) => Self::item(Default::default()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(string) => Self::item(string.into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From> for AMresult { + fn from(maybe: Result) -> Self { + match maybe { + Ok(size) => Self::item(am::Value::uint(size as u64).into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::AutomergeError>) -> Self { + match maybe { + Ok(changes) => Self::items(changes.into_iter().map(|change| change.into()).collect()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::AutomergeError>) -> Self { + match maybe { + Ok(changes) => Self::items( + changes + .into_iter() + .map(|change| change.clone().into()) + .collect(), + ), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::LoadChangeError>> for AMresult { + fn from(maybe: Result, am::LoadChangeError>) -> Self { + match maybe { + Ok(changes) => Self::items(changes.into_iter().map(|change| change.into()).collect()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::AutomergeError>) -> Self { + match maybe { + Ok(change_hashes) => Self::items( + change_hashes + .into_iter() + .map(|change_hash| change_hash.into()) + .collect(), + ), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::InvalidChangeHashSlice>> for AMresult { + fn from(maybe: Result, am::InvalidChangeHashSlice>) -> Self { + match maybe { + Ok(change_hashes) => Self::items( + change_hashes + .into_iter() + .map(|change_hash| change_hash.into()) + .collect(), + ), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::ObjId)>, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::ObjId)>, am::AutomergeError>) -> Self { + match maybe { + Ok(pairs) => Self::items( + pairs + .into_iter() + .map(|(v, o)| AMitem::exact(o, v.into())) + .collect(), + ), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From, am::AutomergeError>> for AMresult { + fn from(maybe: Result, am::AutomergeError>) -> Self { + match maybe { + Ok(bytes) => Self::item(am::Value::bytes(bytes).into()), + Err(e) => Self::error(&e.to_string()), + } + } +} + +impl From<&[am::Change]> for AMresult { + fn from(changes: &[am::Change]) -> Self { + Self::items(changes.iter().map(|change| change.clone().into()).collect()) + } +} + +impl From> for AMresult { + fn from(changes: Vec<&am::Change>) -> Self { + Self::items( + changes + .into_iter() + .map(|change| change.clone().into()) + .collect(), + ) + } +} + +impl From<&[am::ChangeHash]> for AMresult { + fn from(change_hashes: &[am::ChangeHash]) -> Self { + Self::items( + change_hashes + .iter() + .map(|change_hash| (*change_hash).into()) + .collect(), + ) + } +} + +impl From<&[am::sync::Have]> for AMresult { + fn from(haves: &[am::sync::Have]) -> Self { + Self::items(haves.iter().map(|have| have.clone().into()).collect()) + } +} + +impl From> for AMresult { + fn from(change_hashes: Vec) -> Self { + Self::items( + change_hashes + .into_iter() + .map(|change_hash| change_hash.into()) + .collect(), + ) + } +} + +impl From> for AMresult { + fn from(haves: Vec) -> Self { + Self::items(haves.into_iter().map(|have| have.into()).collect()) + } +} + +impl From> for AMresult { + fn from(bytes: Vec) -> Self { + Self::item(am::Value::bytes(bytes).into()) + } +} + +pub fn to_result>(r: R) -> *mut AMresult { + (r.into()).into() +} + +/// \ingroup enumerations +/// \enum AMstatus +/// \installed_headerfile +/// \brief The status of an API call. +#[derive(PartialEq, Eq)] +#[repr(u8)] +pub enum AMstatus { + /// Success. + /// \note This tag is unalphabetized so that `0` indicates success. + Ok, + /// Failure due to an error. + Error, + /// Failure due to an invalid result. + InvalidResult, +} + +/// \memberof AMresult +/// \brief Concatenates the items from two results. +/// +/// \param[in] dest A pointer to an `AMresult` struct. +/// \param[in] src A pointer to an `AMresult` struct. +/// \return A pointer to an `AMresult` struct with the items from \p dest in +/// their original order followed by the items from \p src in their +/// original order. +/// \pre \p dest `!= NULL` +/// \pre \p src `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// dest must be a valid pointer to an AMresult +/// src must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultCat(dest: *const AMresult, src: *const AMresult) -> *mut AMresult { + use AMresult::*; + + match (dest.as_ref(), src.as_ref()) { + (Some(dest), Some(src)) => match (dest, src) { + (Items(dest_items), Items(src_items)) => { + return AMresult::items( + dest_items + .iter() + .cloned() + .chain(src_items.iter().cloned()) + .collect(), + ) + .into(); + } + (Error(_), Error(_)) | (Error(_), Items(_)) | (Items(_), Error(_)) => { + AMresult::error("Invalid `AMresult`").into() + } + }, + (None, None) | (None, Some(_)) | (Some(_), None) => { + AMresult::error("Invalid `AMresult*`").into() + } + } +} + +/// \memberof AMresult +/// \brief Gets a result's error message string. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \return A UTF-8 string view as an `AMbyteSpan` struct. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultError(result: *const AMresult) -> AMbyteSpan { + use AMresult::*; + + if let Some(Error(message)) = result.as_ref() { + return message.as_bytes().into(); + } + Default::default() +} + +/// \memberof AMresult +/// \brief Deallocates the storage for a result. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultFree(result: *mut AMresult) { + if !result.is_null() { + let result: AMresult = *Box::from_raw(result); + drop(result) + } +} + +/// \memberof AMresult +/// \brief Gets a result's first item. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \return A pointer to an `AMitem` struct. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultItem(result: *mut AMresult) -> *mut AMitem { + use AMresult::*; + + if let Some(Items(items)) = result.as_mut() { + if !items.is_empty() { + return &mut items[0]; + } + } + std::ptr::null_mut() +} + +/// \memberof AMresult +/// \brief Gets a result's items. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \return An `AMitems` struct. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultItems<'a>(result: *mut AMresult) -> AMitems<'a> { + use AMresult::*; + + if let Some(Items(items)) = result.as_mut() { + if !items.is_empty() { + return AMitems::new(items); + } + } + Default::default() +} + +/// \memberof AMresult +/// \brief Gets the size of a result. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \return The count of items within \p result. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultSize(result: *const AMresult) -> usize { + use self::AMresult::*; + + if let Some(Items(items)) = result.as_ref() { + return items.len(); + } + 0 +} + +/// \memberof AMresult +/// \brief Gets the status code of a result. +/// +/// \param[in] result A pointer to an `AMresult` struct. +/// \return An `AMstatus` enum tag. +/// \pre \p result `!= NULL` +/// \internal +/// +/// # Safety +/// result must be a valid pointer to an AMresult +#[no_mangle] +pub unsafe extern "C" fn AMresultStatus(result: *const AMresult) -> AMstatus { + use AMresult::*; + + if let Some(result) = result.as_ref() { + match result { + Error(_) => { + return AMstatus::Error; + } + _ => { + return AMstatus::Ok; + } + } + } + AMstatus::InvalidResult +} diff --git a/rust/automerge-c/src/sync.rs b/rust/automerge-c/src/sync.rs new file mode 100644 index 00000000..fe0332a1 --- /dev/null +++ b/rust/automerge-c/src/sync.rs @@ -0,0 +1,7 @@ +mod have; +mod message; +mod state; + +pub(crate) use have::AMsyncHave; +pub(crate) use message::{to_sync_message, AMsyncMessage}; +pub(crate) use state::AMsyncState; diff --git a/rust/automerge-c/src/sync/have.rs b/rust/automerge-c/src/sync/have.rs new file mode 100644 index 00000000..37d2031f --- /dev/null +++ b/rust/automerge-c/src/sync/have.rs @@ -0,0 +1,42 @@ +use automerge as am; + +use crate::result::{to_result, AMresult}; + +/// \struct AMsyncHave +/// \installed_headerfile +/// \brief A summary of the changes that the sender of a synchronization +/// message already has. +#[derive(Clone, Eq, PartialEq)] +pub struct AMsyncHave(am::sync::Have); + +impl AMsyncHave { + pub fn new(have: am::sync::Have) -> Self { + Self(have) + } +} + +impl AsRef for AMsyncHave { + fn as_ref(&self) -> &am::sync::Have { + &self.0 + } +} + +/// \memberof AMsyncHave +/// \brief Gets the heads of the sender. +/// +/// \param[in] sync_have A pointer to an `AMsyncHave` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_have `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_have must be a valid pointer to an AMsyncHave +#[no_mangle] +pub unsafe extern "C" fn AMsyncHaveLastSync(sync_have: *const AMsyncHave) -> *mut AMresult { + to_result(match sync_have.as_ref() { + Some(sync_have) => sync_have.as_ref().last_sync.as_slice(), + None => Default::default(), + }) +} diff --git a/rust/automerge-c/src/sync/message.rs b/rust/automerge-c/src/sync/message.rs new file mode 100644 index 00000000..bdb1db34 --- /dev/null +++ b/rust/automerge-c/src/sync/message.rs @@ -0,0 +1,166 @@ +use automerge as am; +use std::cell::RefCell; +use std::collections::BTreeMap; + +use crate::change::AMchange; +use crate::result::{to_result, AMresult}; +use crate::sync::have::AMsyncHave; + +macro_rules! to_sync_message { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMsyncMessage*`").into(), + } + }}; +} + +pub(crate) use to_sync_message; + +/// \struct AMsyncMessage +/// \installed_headerfile +/// \brief A synchronization message for a peer. +#[derive(PartialEq)] +pub struct AMsyncMessage { + body: am::sync::Message, + changes_storage: RefCell>, + haves_storage: RefCell>, +} + +impl AMsyncMessage { + pub fn new(message: am::sync::Message) -> Self { + Self { + body: message, + changes_storage: RefCell::new(BTreeMap::new()), + haves_storage: RefCell::new(BTreeMap::new()), + } + } +} + +impl AsRef for AMsyncMessage { + fn as_ref(&self) -> &am::sync::Message { + &self.body + } +} + +/// \memberof AMsyncMessage +/// \brief Gets the changes for the recipient to apply. +/// +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE` items. +/// \pre \p sync_message `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageChanges(sync_message: *const AMsyncMessage) -> *mut AMresult { + to_result(match sync_message.as_ref() { + Some(sync_message) => sync_message.body.changes.as_slice(), + None => Default::default(), + }) +} + +/// \memberof AMsyncMessage +/// \brief Decodes an array of bytes into a synchronization message. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to decode from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_SYNC_MESSAGE` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageDecode(src: *const u8, count: usize) -> *mut AMresult { + let data = std::slice::from_raw_parts(src, count); + to_result(am::sync::Message::decode(data)) +} + +/// \memberof AMsyncMessage +/// \brief Encodes a synchronization message as an array of bytes. +/// +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTES` item. +/// \pre \p sync_message `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageEncode(sync_message: *const AMsyncMessage) -> *mut AMresult { + let sync_message = to_sync_message!(sync_message); + to_result(sync_message.as_ref().clone().encode()) +} + +/// \memberof AMsyncMessage +/// \brief Gets a summary of the changes that the sender already has. +/// +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with `AM_SYNC_HAVE` items. +/// \pre \p sync_message `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageHaves(sync_message: *const AMsyncMessage) -> *mut AMresult { + to_result(match sync_message.as_ref() { + Some(sync_message) => sync_message.as_ref().have.as_slice(), + None => Default::default(), + }) +} + +/// \memberof AMsyncMessage +/// \brief Gets the heads of the sender. +/// +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_message `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageHeads(sync_message: *const AMsyncMessage) -> *mut AMresult { + to_result(match sync_message.as_ref() { + Some(sync_message) => sync_message.as_ref().heads.as_slice(), + None => Default::default(), + }) +} + +/// \memberof AMsyncMessage +/// \brief Gets the hashes of any changes that are being explicitly requested +/// by the recipient. +/// +/// \param[in] sync_message A pointer to an `AMsyncMessage` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_message `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_message must be a valid pointer to an AMsyncMessage +#[no_mangle] +pub unsafe extern "C" fn AMsyncMessageNeeds(sync_message: *const AMsyncMessage) -> *mut AMresult { + to_result(match sync_message.as_ref() { + Some(sync_message) => sync_message.as_ref().need.as_slice(), + None => Default::default(), + }) +} diff --git a/rust/automerge-c/src/sync/state.rs b/rust/automerge-c/src/sync/state.rs new file mode 100644 index 00000000..1d85ed98 --- /dev/null +++ b/rust/automerge-c/src/sync/state.rs @@ -0,0 +1,262 @@ +use automerge as am; +use std::cell::RefCell; +use std::collections::BTreeMap; + +use crate::result::{to_result, AMresult}; +use crate::sync::have::AMsyncHave; + +macro_rules! to_sync_state { + ($handle:expr) => {{ + let handle = $handle.as_ref(); + match handle { + Some(b) => b, + None => return AMresult::error("Invalid `AMsyncState*`").into(), + } + }}; +} + +pub(crate) use to_sync_state; + +/// \struct AMsyncState +/// \installed_headerfile +/// \brief The state of synchronization with a peer. +#[derive(Eq, PartialEq)] +pub struct AMsyncState { + body: am::sync::State, + their_haves_storage: RefCell>, +} + +impl AMsyncState { + pub fn new(state: am::sync::State) -> Self { + Self { + body: state, + their_haves_storage: RefCell::new(BTreeMap::new()), + } + } +} + +impl AsMut for AMsyncState { + fn as_mut(&mut self) -> &mut am::sync::State { + &mut self.body + } +} + +impl AsRef for AMsyncState { + fn as_ref(&self) -> &am::sync::State { + &self.body + } +} + +impl From for *mut AMsyncState { + fn from(b: AMsyncState) -> Self { + Box::into_raw(Box::new(b)) + } +} + +/// \memberof AMsyncState +/// \brief Decodes an array of bytes into a synchronization state. +/// +/// \param[in] src A pointer to an array of bytes. +/// \param[in] count The count of bytes to decode from the array pointed to by +/// \p src. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_SYNC_STATE` item. +/// \pre \p src `!= NULL` +/// \pre `sizeof(`\p src `) > 0` +/// \pre \p count `<= sizeof(`\p src `)` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// src must be a byte array of length `>= count` +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateDecode(src: *const u8, count: usize) -> *mut AMresult { + let data = std::slice::from_raw_parts(src, count); + to_result(am::sync::State::decode(data)) +} + +/// \memberof AMsyncState +/// \brief Encodes a synchronization state as an array of bytes. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_BYTE_SPAN` item. +/// \pre \p sync_state `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateEncode(sync_state: *const AMsyncState) -> *mut AMresult { + let sync_state = to_sync_state!(sync_state); + to_result(sync_state.as_ref().encode()) +} + +/// \memberof AMsyncState +/// \brief Tests the equality of two synchronization states. +/// +/// \param[in] sync_state1 A pointer to an `AMsyncState` struct. +/// \param[in] sync_state2 A pointer to an `AMsyncState` struct. +/// \return `true` if \p sync_state1 `==` \p sync_state2 and `false` otherwise. +/// \pre \p sync_state1 `!= NULL` +/// \pre \p sync_state2 `!= NULL` +/// \post `!(`\p sync_state1 `&&` \p sync_state2 `) -> false` +/// \internal +/// +/// #Safety +/// sync_state1 must be a valid pointer to an AMsyncState +/// sync_state2 must be a valid pointer to an AMsyncState +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateEqual( + sync_state1: *const AMsyncState, + sync_state2: *const AMsyncState, +) -> bool { + match (sync_state1.as_ref(), sync_state2.as_ref()) { + (Some(sync_state1), Some(sync_state2)) => sync_state1.as_ref() == sync_state2.as_ref(), + (None, None) | (None, Some(_)) | (Some(_), None) => false, + } +} + +/// \memberof AMsyncState +/// \brief Allocates a new synchronization state and initializes it from +/// default values. +/// +/// \return A pointer to an `AMresult` struct with an `AM_VAL_TYPE_SYNC_STATE` item. +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +#[no_mangle] +pub extern "C" fn AMsyncStateInit() -> *mut AMresult { + to_result(am::sync::State::new()) +} + +/// \memberof AMsyncState +/// \brief Gets the heads that are shared by both peers. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_state `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateSharedHeads(sync_state: *const AMsyncState) -> *mut AMresult { + let sync_state = to_sync_state!(sync_state); + to_result(sync_state.as_ref().shared_heads.as_slice()) +} + +/// \memberof AMsyncState +/// \brief Gets the heads that were last sent by this peer. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_state `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateLastSentHeads(sync_state: *const AMsyncState) -> *mut AMresult { + let sync_state = to_sync_state!(sync_state); + to_result(sync_state.as_ref().last_sent_heads.as_slice()) +} + +/// \memberof AMsyncState +/// \brief Gets a summary of the changes that the other peer already has. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \param[out] has_value A pointer to a boolean flag that is set to `true` if +/// the returned `AMitems` struct is relevant, `false` otherwise. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_SYNC_HAVE` items. +/// \pre \p sync_state `!= NULL` +/// \pre \p has_value `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +//// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +/// has_value must be a valid pointer to a bool. +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateTheirHaves( + sync_state: *const AMsyncState, + has_value: *mut bool, +) -> *mut AMresult { + if let Some(sync_state) = sync_state.as_ref() { + if let Some(haves) = &sync_state.as_ref().their_have { + *has_value = true; + return to_result(haves.as_slice()); + } + }; + *has_value = false; + to_result(Vec::::new()) +} + +/// \memberof AMsyncState +/// \brief Gets the heads that were sent by the other peer. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \param[out] has_value A pointer to a boolean flag that is set to `true` if +/// the returned `AMitems` struct is relevant, `false` +/// otherwise. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_state `!= NULL` +/// \pre \p has_value `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +/// has_value must be a valid pointer to a bool +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateTheirHeads( + sync_state: *const AMsyncState, + has_value: *mut bool, +) -> *mut AMresult { + if let Some(sync_state) = sync_state.as_ref() { + if let Some(change_hashes) = &sync_state.as_ref().their_heads { + *has_value = true; + return to_result(change_hashes.as_slice()); + } + }; + *has_value = false; + to_result(Vec::::new()) +} + +/// \memberof AMsyncState +/// \brief Gets the needs that were sent by the other peer. +/// +/// \param[in] sync_state A pointer to an `AMsyncState` struct. +/// \param[out] has_value A pointer to a boolean flag that is set to `true` if +/// the returned `AMitems` struct is relevant, `false` +/// otherwise. +/// \return A pointer to an `AMresult` struct with `AM_VAL_TYPE_CHANGE_HASH` items. +/// \pre \p sync_state `!= NULL` +/// \pre \p has_value `!= NULL` +/// \warning The returned `AMresult` struct pointer must be passed to +/// `AMresultFree()` in order to avoid a memory leak. +/// \internal +/// +/// # Safety +/// sync_state must be a valid pointer to an AMsyncState +/// has_value must be a valid pointer to a bool +#[no_mangle] +pub unsafe extern "C" fn AMsyncStateTheirNeeds( + sync_state: *const AMsyncState, + has_value: *mut bool, +) -> *mut AMresult { + if let Some(sync_state) = sync_state.as_ref() { + if let Some(change_hashes) = &sync_state.as_ref().their_need { + *has_value = true; + return to_result(change_hashes.as_slice()); + } + }; + *has_value = false; + to_result(Vec::::new()) +} diff --git a/rust/automerge-c/src/utils/result.c b/rust/automerge-c/src/utils/result.c new file mode 100644 index 00000000..f922ca31 --- /dev/null +++ b/rust/automerge-c/src/utils/result.c @@ -0,0 +1,33 @@ +#include + +#include + +AMresult* AMresultFrom(int count, ...) { + AMresult* result = NULL; + bool is_ok = true; + va_list args; + va_start(args, count); + for (int i = 0; i != count; ++i) { + AMresult* src = va_arg(args, AMresult*); + AMresult* dest = result; + is_ok = (AMresultStatus(src) == AM_STATUS_OK); + if (is_ok) { + if (dest) { + result = AMresultCat(dest, src); + is_ok = (AMresultStatus(result) == AM_STATUS_OK); + AMresultFree(dest); + AMresultFree(src); + } else { + result = src; + } + } else { + AMresultFree(src); + } + } + va_end(args); + if (!is_ok) { + AMresultFree(result); + result = NULL; + } + return result; +} diff --git a/rust/automerge-c/src/utils/stack.c b/rust/automerge-c/src/utils/stack.c new file mode 100644 index 00000000..2cad7c5c --- /dev/null +++ b/rust/automerge-c/src/utils/stack.c @@ -0,0 +1,106 @@ +#include +#include + +#include +#include + +void AMstackFree(AMstack** stack) { + if (stack) { + while (*stack) { + AMresultFree(AMstackPop(stack, NULL)); + } + } +} + +AMresult* AMstackPop(AMstack** stack, const AMresult* result) { + if (!stack) { + return NULL; + } + AMstack** prev = stack; + if (result) { + while (*prev && ((*prev)->result != result)) { + *prev = (*prev)->prev; + } + } + if (!*prev) { + return NULL; + } + AMstack* target = *prev; + *prev = target->prev; + AMresult* popped = target->result; + free(target); + return popped; +} + +AMresult* AMstackResult(AMstack** stack, AMresult* result, AMstackCallback callback, void* data) { + if (!stack) { + if (callback) { + /* Create a local stack so that the callback can still examine the + * result. */ + AMstack node = {.result = result, .prev = NULL}; + AMstack* stack = &node; + callback(&stack, data); + } else { + /* \note There is no reason to call this function when both the + * stack and the callback are null. */ + fprintf(stderr, "ERROR: NULL AMstackCallback!\n"); + } + /* \note Nothing can be returned without a stack regardless of + * whether or not the callback validated the result. */ + AMresultFree(result); + return NULL; + } + /* Always push the result onto the stack, even if it's null, so that the + * callback can examine it. */ + AMstack* next = calloc(1, sizeof(AMstack)); + *next = (AMstack){.result = result, .prev = *stack}; + AMstack* top = next; + *stack = top; + if (callback) { + if (!callback(stack, data)) { + /* The result didn't pass the callback's examination. */ + return NULL; + } + } else { + /* Report an obvious error. */ + if (result) { + AMbyteSpan const err_msg = AMresultError(result); + if (err_msg.src && err_msg.count) { + /* \note The callback may be null because the result is supposed + * to be examined externally so return it despite an + * error. */ + char* const cstr = AMstrdup(err_msg, NULL); + fprintf(stderr, "WARNING: %s.\n", cstr); + free(cstr); + } + } else { + /* \note There's no reason to call this function when both the + * result and the callback are null. */ + fprintf(stderr, "ERROR: NULL AMresult*!\n"); + return NULL; + } + } + return result; +} + +AMitem* AMstackItem(AMstack** stack, AMresult* result, AMstackCallback callback, void* data) { + AMitems items = AMstackItems(stack, result, callback, data); + return AMitemsNext(&items, 1); +} + +AMitems AMstackItems(AMstack** stack, AMresult* result, AMstackCallback callback, void* data) { + return (AMstackResult(stack, result, callback, data)) ? AMresultItems(result) : (AMitems){0}; +} + +size_t AMstackSize(AMstack const* const stack) { + if (!stack) { + return 0; + } + size_t count = 0; + AMstack const* prev = stack; + while (prev) { + ++count; + prev = prev->prev; + } + return count; +} \ No newline at end of file diff --git a/rust/automerge-c/src/utils/stack_callback_data.c b/rust/automerge-c/src/utils/stack_callback_data.c new file mode 100644 index 00000000..f1e988d8 --- /dev/null +++ b/rust/automerge-c/src/utils/stack_callback_data.c @@ -0,0 +1,9 @@ +#include + +#include + +AMstackCallbackData* AMstackCallbackDataInit(AMvalType const bitmask, char const* const file, int const line) { + AMstackCallbackData* data = malloc(sizeof(AMstackCallbackData)); + *data = (AMstackCallbackData){.bitmask = bitmask, .file = file, .line = line}; + return data; +} diff --git a/rust/automerge-c/src/utils/string.c b/rust/automerge-c/src/utils/string.c new file mode 100644 index 00000000..a0d1ebe3 --- /dev/null +++ b/rust/automerge-c/src/utils/string.c @@ -0,0 +1,46 @@ +#include +#include + +#include + +char* AMstrdup(AMbyteSpan const str, char const* nul) { + if (!str.src) { + return NULL; + } else if (!str.count) { + return strdup(""); + } + nul = (nul) ? nul : "\\0"; + size_t const nul_len = strlen(nul); + char* dup = NULL; + size_t dup_len = 0; + char const* begin = str.src; + char const* end = begin; + for (size_t i = 0; i != str.count; ++i, ++end) { + if (!*end) { + size_t const len = end - begin; + size_t const alloc_len = dup_len + len + nul_len; + if (dup) { + dup = realloc(dup, alloc_len + 1); + } else { + dup = malloc(alloc_len + 1); + } + memcpy(dup + dup_len, begin, len); + memcpy(dup + dup_len + len, nul, nul_len); + dup[alloc_len] = '\0'; + begin = end + 1; + dup_len = alloc_len; + } + } + if (begin != end) { + size_t const len = end - begin; + size_t const alloc_len = dup_len + len; + if (dup) { + dup = realloc(dup, alloc_len + 1); + } else { + dup = malloc(alloc_len + 1); + } + memcpy(dup + dup_len, begin, len); + dup[alloc_len] = '\0'; + } + return dup; +} diff --git a/rust/automerge-c/test/CMakeLists.txt b/rust/automerge-c/test/CMakeLists.txt new file mode 100644 index 00000000..1759f140 --- /dev/null +++ b/rust/automerge-c/test/CMakeLists.txt @@ -0,0 +1,55 @@ +find_package(cmocka CONFIG REQUIRED) + +add_executable( + ${LIBRARY_NAME}_test + actor_id_tests.c + base_state.c + byte_span_tests.c + cmocka_utils.c + enum_string_tests.c + doc_state.c + doc_tests.c + item_tests.c + list_tests.c + macro_utils.c + main.c + map_tests.c + str_utils.c + ported_wasm/basic_tests.c + ported_wasm/suite.c + ported_wasm/sync_tests.c +) + +set_target_properties(${LIBRARY_NAME}_test PROPERTIES LINKER_LANGUAGE C) + +if(WIN32) + set(CMOCKA "cmocka::cmocka") +else() + set(CMOCKA "cmocka") +endif() + +target_link_libraries(${LIBRARY_NAME}_test PRIVATE ${CMOCKA} ${LIBRARY_NAME}) + +add_dependencies(${LIBRARY_NAME}_test ${BINDINGS_NAME}_artifacts) + +if(BUILD_SHARED_LIBS AND WIN32) + add_custom_command( + TARGET ${LIBRARY_NAME}_test + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ + COMMENT "Copying the DLL into the tests directory..." + VERBATIM + ) +endif() + +add_test(NAME ${LIBRARY_NAME}_test COMMAND ${LIBRARY_NAME}_test) + +add_custom_command( + TARGET ${LIBRARY_NAME}_test + POST_BUILD + COMMAND + ${CMAKE_CTEST_COMMAND} --config $ --output-on-failure + COMMENT + "Running the test(s)..." + VERBATIM +) diff --git a/rust/automerge-c/test/actor_id_tests.c b/rust/automerge-c/test/actor_id_tests.c new file mode 100644 index 00000000..918d6213 --- /dev/null +++ b/rust/automerge-c/test/actor_id_tests.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include "cmocka_utils.h" +#include "str_utils.h" + +/** + * \brief State for a group of cmocka test cases. + */ +typedef struct { + /** An actor ID as an array of bytes. */ + uint8_t* src; + /** The count of bytes in \p src. */ + size_t count; + /** A stack of results. */ + AMstack* stack; + /** An actor ID as a hexadecimal string. */ + AMbyteSpan str; +} DocState; + +static int group_setup(void** state) { + DocState* doc_state = test_calloc(1, sizeof(DocState)); + doc_state->str = AMstr("000102030405060708090a0b0c0d0e0f"); + doc_state->count = doc_state->str.count / 2; + doc_state->src = test_calloc(doc_state->count, sizeof(uint8_t)); + hex_to_bytes(doc_state->str.src, doc_state->src, doc_state->count); + *state = doc_state; + return 0; +} + +static int group_teardown(void** state) { + DocState* doc_state = *state; + test_free(doc_state->src); + AMstackFree(&doc_state->stack); + test_free(doc_state); + return 0; +} + +static void test_AMactorIdFromBytes(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->stack; + /* Non-empty string. */ + AMresult* result = AMstackResult(stack_ptr, AMactorIdFromBytes(doc_state->src, doc_state->count), NULL, NULL); + if (AMresultStatus(result) != AM_STATUS_OK) { + fail_msg_view("%s", AMresultError(result)); + } + assert_int_equal(AMresultSize(result), 1); + AMitem* const item = AMresultItem(result); + assert_int_equal(AMitemValType(item), AM_VAL_TYPE_ACTOR_ID); + AMactorId const* actor_id; + assert_true(AMitemToActorId(item, &actor_id)); + AMbyteSpan const bytes = AMactorIdBytes(actor_id); + assert_int_equal(bytes.count, doc_state->count); + assert_memory_equal(bytes.src, doc_state->src, bytes.count); + /* Empty array. */ + /** \todo Find out if this is intentionally allowed. */ + result = AMstackResult(stack_ptr, AMactorIdFromBytes(doc_state->src, 0), NULL, NULL); + if (AMresultStatus(result) != AM_STATUS_OK) { + fail_msg_view("%s", AMresultError(result)); + } + /* NULL array. */ + result = AMstackResult(stack_ptr, AMactorIdFromBytes(NULL, doc_state->count), NULL, NULL); + if (AMresultStatus(result) == AM_STATUS_OK) { + fail_msg("AMactorId from NULL."); + } +} + +static void test_AMactorIdFromStr(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->stack; + AMresult* result = AMstackResult(stack_ptr, AMactorIdFromStr(doc_state->str), NULL, NULL); + if (AMresultStatus(result) != AM_STATUS_OK) { + fail_msg_view("%s", AMresultError(result)); + } + assert_int_equal(AMresultSize(result), 1); + AMitem* const item = AMresultItem(result); + assert_int_equal(AMitemValType(item), AM_VAL_TYPE_ACTOR_ID); + /* The hexadecimal string should've been decoded as identical bytes. */ + AMactorId const* actor_id; + assert_true(AMitemToActorId(item, &actor_id)); + AMbyteSpan const bytes = AMactorIdBytes(actor_id); + assert_int_equal(bytes.count, doc_state->count); + assert_memory_equal(bytes.src, doc_state->src, bytes.count); + /* The bytes should've been encoded as an identical hexadecimal string. */ + assert_true(AMitemToActorId(item, &actor_id)); + AMbyteSpan const str = AMactorIdStr(actor_id); + assert_int_equal(str.count, doc_state->str.count); + assert_memory_equal(str.src, doc_state->str.src, str.count); +} + +static void test_AMactorIdInit(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->stack; + AMresult* prior_result = NULL; + AMbyteSpan prior_bytes = {NULL, 0}; + AMbyteSpan prior_str = {NULL, 0}; + for (size_t i = 0; i != 11; ++i) { + AMresult* result = AMstackResult(stack_ptr, AMactorIdInit(), NULL, NULL); + if (AMresultStatus(result) != AM_STATUS_OK) { + fail_msg_view("%s", AMresultError(result)); + } + assert_int_equal(AMresultSize(result), 1); + AMitem* const item = AMresultItem(result); + assert_int_equal(AMitemValType(item), AM_VAL_TYPE_ACTOR_ID); + AMactorId const* actor_id; + assert_true(AMitemToActorId(item, &actor_id)); + AMbyteSpan const bytes = AMactorIdBytes(actor_id); + assert_true(AMitemToActorId(item, &actor_id)); + AMbyteSpan const str = AMactorIdStr(actor_id); + if (prior_result) { + size_t const max_byte_count = fmax(bytes.count, prior_bytes.count); + assert_memory_not_equal(bytes.src, prior_bytes.src, max_byte_count); + size_t const max_char_count = fmax(str.count, prior_str.count); + assert_memory_not_equal(str.src, prior_str.src, max_char_count); + } + prior_result = result; + prior_bytes = bytes; + prior_str = str; + } +} + +int run_actor_id_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMactorIdFromBytes), + cmocka_unit_test(test_AMactorIdFromStr), + cmocka_unit_test(test_AMactorIdInit), + }; + + return cmocka_run_group_tests(tests, group_setup, group_teardown); +} diff --git a/rust/automerge-c/test/base_state.c b/rust/automerge-c/test/base_state.c new file mode 100644 index 00000000..53325a99 --- /dev/null +++ b/rust/automerge-c/test/base_state.c @@ -0,0 +1,17 @@ +#include + +/* local */ +#include "base_state.h" + +int setup_base(void** state) { + BaseState* base_state = calloc(1, sizeof(BaseState)); + *state = base_state; + return 0; +} + +int teardown_base(void** state) { + BaseState* base_state = *state; + AMstackFree(&base_state->stack); + free(base_state); + return 0; +} diff --git a/rust/automerge-c/test/base_state.h b/rust/automerge-c/test/base_state.h new file mode 100644 index 00000000..3c4ff01b --- /dev/null +++ b/rust/automerge-c/test/base_state.h @@ -0,0 +1,39 @@ +#ifndef TESTS_BASE_STATE_H +#define TESTS_BASE_STATE_H + +#include + +/* local */ +#include +#include + +/** + * \struct BaseState + * \brief The shared state for one or more cmocka test cases. + */ +typedef struct { + /** A stack of results. */ + AMstack* stack; +} BaseState; + +/** + * \memberof BaseState + * \brief Sets up the shared state for one or more cmocka test cases. + * + * \param[in,out] state A pointer to a pointer to a `BaseState` struct. + * \pre \p state `!= NULL`. + * \warning The `BaseState` struct returned through \p state must be + * passed to `teardown_base()` in order to avoid a memory leak. + */ +int setup_base(void** state); + +/** + * \memberof BaseState + * \brief Tears down the shared state for one or more cmocka test cases. + * + * \param[in] state A pointer to a pointer to a `BaseState` struct. + * \pre \p state `!= NULL`. + */ +int teardown_base(void** state); + +#endif /* TESTS_BASE_STATE_H */ diff --git a/rust/automerge-c/test/byte_span_tests.c b/rust/automerge-c/test/byte_span_tests.c new file mode 100644 index 00000000..0b1c86a1 --- /dev/null +++ b/rust/automerge-c/test/byte_span_tests.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include + +static void test_AMbytes(void** state) { + static char const DATA[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}; + + AMbyteSpan bytes = AMbytes(DATA, sizeof(DATA)); + assert_int_equal(bytes.count, sizeof(DATA)); + assert_memory_equal(bytes.src, DATA, bytes.count); + assert_ptr_equal(bytes.src, DATA); + /* Empty view */ + bytes = AMbytes(DATA, 0); + assert_int_equal(bytes.count, 0); + assert_ptr_equal(bytes.src, DATA); + /* Invalid array */ + bytes = AMbytes(NULL, SIZE_MAX); + assert_int_not_equal(bytes.count, SIZE_MAX); + assert_int_equal(bytes.count, 0); + assert_ptr_equal(bytes.src, NULL); +} + +static void test_AMstr(void** state) { + AMbyteSpan str = AMstr("abcdefghijkl"); + assert_int_equal(str.count, strlen("abcdefghijkl")); + assert_memory_equal(str.src, "abcdefghijkl", str.count); + /* Empty string */ + static char const* const EMPTY = ""; + + str = AMstr(EMPTY); + assert_int_equal(str.count, 0); + assert_ptr_equal(str.src, EMPTY); + /* Invalid string */ + str = AMstr(NULL); + assert_int_equal(str.count, 0); + assert_ptr_equal(str.src, NULL); +} + +static void test_AMstrCmp(void** state) { + /* Length ordering */ + assert_int_equal(AMstrCmp(AMstr("abcdef"), AMstr("abcdefghijkl")), -1); + assert_int_equal(AMstrCmp(AMstr("abcdefghijkl"), AMstr("abcdefghijkl")), 0); + assert_int_equal(AMstrCmp(AMstr("abcdefghijkl"), AMstr("abcdef")), 1); + /* Lexicographical ordering */ + assert_int_equal(AMstrCmp(AMstr("abcdef"), AMstr("ghijkl")), -1); + assert_int_equal(AMstrCmp(AMstr("ghijkl"), AMstr("abcdef")), 1); + /* Case ordering */ + assert_int_equal(AMstrCmp(AMstr("ABCDEFGHIJKL"), AMstr("abcdefghijkl")), -1); + assert_int_equal(AMstrCmp(AMstr("ABCDEFGHIJKL"), AMstr("ABCDEFGHIJKL")), 0); + assert_int_equal(AMstrCmp(AMstr("abcdefghijkl"), AMstr("ABCDEFGHIJKL")), 1); + assert_int_equal(AMstrCmp(AMstr("ABCDEFGHIJKL"), AMstr("abcdef")), -1); + assert_int_equal(AMstrCmp(AMstr("abcdef"), AMstr("ABCDEFGHIJKL")), 1); + assert_int_equal(AMstrCmp(AMstr("GHIJKL"), AMstr("abcdef")), -1); + assert_int_equal(AMstrCmp(AMstr("abcdef"), AMstr("GHIJKL")), 1); + /* NUL character inclusion */ + static char const SRC[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0', 'g', 'h', 'i', 'j', 'k', 'l'}; + static AMbyteSpan const NUL_STR = {.src = SRC, .count = 13}; + + assert_int_equal(AMstrCmp(AMstr("abcdef"), NUL_STR), -1); + assert_int_equal(AMstrCmp(NUL_STR, NUL_STR), 0); + assert_int_equal(AMstrCmp(NUL_STR, AMstr("abcdef")), 1); + /* Empty string */ + assert_int_equal(AMstrCmp(AMstr(""), AMstr("abcdefghijkl")), -1); + assert_int_equal(AMstrCmp(AMstr(""), AMstr("")), 0); + assert_int_equal(AMstrCmp(AMstr("abcdefghijkl"), AMstr("")), 1); + /* Invalid string */ + assert_int_equal(AMstrCmp(AMstr(NULL), AMstr("abcdefghijkl")), -1); + assert_int_equal(AMstrCmp(AMstr(NULL), AMstr(NULL)), 0); + assert_int_equal(AMstrCmp(AMstr("abcdefghijkl"), AMstr(NULL)), 1); +} + +static void test_AMstrdup(void** state) { + static char const SRC[] = {'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0', 'g', 'h', 'i', '\0', 'j', 'k', 'l'}; + static AMbyteSpan const NUL_STR = {.src = SRC, .count = 15}; + + /* Default substitution ("\\0") for NUL */ + char* dup = AMstrdup(NUL_STR, NULL); + assert_int_equal(strlen(dup), 18); + assert_string_equal(dup, "abc\\0def\\0ghi\\0jkl"); + free(dup); + /* Arbitrary substitution for NUL */ + dup = AMstrdup(NUL_STR, ":-O"); + assert_int_equal(strlen(dup), 21); + assert_string_equal(dup, "abc:-Odef:-Oghi:-Ojkl"); + free(dup); + /* Empty substitution for NUL */ + dup = AMstrdup(NUL_STR, ""); + assert_int_equal(strlen(dup), 12); + assert_string_equal(dup, "abcdefghijkl"); + free(dup); + /* Empty string */ + dup = AMstrdup(AMstr(""), NULL); + assert_int_equal(strlen(dup), 0); + assert_string_equal(dup, ""); + free(dup); + /* Invalid string */ + assert_null(AMstrdup(AMstr(NULL), NULL)); +} + +int run_byte_span_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMbytes), + cmocka_unit_test(test_AMstr), + cmocka_unit_test(test_AMstrCmp), + cmocka_unit_test(test_AMstrdup), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/rust/automerge-c/test/cmocka_utils.c b/rust/automerge-c/test/cmocka_utils.c new file mode 100644 index 00000000..37c57fb1 --- /dev/null +++ b/rust/automerge-c/test/cmocka_utils.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include + +/* third-party */ +#include +#include +#include +#include + +/* local */ +#include "cmocka_utils.h" + +/** + * \brief Assert that the given expression is true and report failure in terms + * of a line number within a file. + * + * \param[in] c An expression. + * \param[in] file A file's full path string. + * \param[in] line A line number. + */ +#define assert_true_where(c, file, line) _assert_true(cast_ptr_to_largest_integral_type(c), #c, file, line) + +/** + * \brief Assert that the given pointer is non-NULL and report failure in terms + * of a line number within a file. + * + * \param[in] c An expression. + * \param[in] file A file's full path string. + * \param[in] line A line number. + */ +#define assert_non_null_where(c, file, line) assert_true_where(c, file, line) + +/** + * \brief Forces the test to fail immediately and quit, printing the reason in + * terms of a line number within a file. + * + * \param[in] msg A message string into which \p str is interpolated. + * \param[in] str An owned string. + * \param[in] file A file's full path string. + * \param[in] line A line number. + */ +#define fail_msg_where(msg, str, file, line) \ + do { \ + print_error("ERROR: " msg "\n", str); \ + _fail(file, line); \ + } while (0) + +/** + * \brief Forces the test to fail immediately and quit, printing the reason in + * terms of a line number within a file. + * + * \param[in] msg A message string into which \p view.src is interpolated. + * \param[in] view A UTF-8 string view as an `AMbyteSpan` struct. + * \param[in] file A file's full path string. + * \param[in] line A line number. + */ +#define fail_msg_view_where(msg, view, file, line) \ + do { \ + char* const str = AMstrdup(view, NULL); \ + print_error("ERROR: " msg "\n", str); \ + free(str); \ + _fail(file, line); \ + } while (0) + +bool cmocka_cb(AMstack** stack, void* data) { + assert_non_null(data); + AMstackCallbackData* const sc_data = (AMstackCallbackData*)data; + assert_non_null_where(stack, sc_data->file, sc_data->line); + assert_non_null_where(*stack, sc_data->file, sc_data->line); + assert_non_null_where((*stack)->result, sc_data->file, sc_data->line); + if (AMresultStatus((*stack)->result) != AM_STATUS_OK) { + fail_msg_view_where("%s", AMresultError((*stack)->result), sc_data->file, sc_data->line); + return false; + } + /* Test that the types of all item values are members of the mask. */ + AMitems items = AMresultItems((*stack)->result); + AMitem* item = NULL; + while ((item = AMitemsNext(&items, 1)) != NULL) { + AMvalType const tag = AMitemValType(item); + if (!(tag & sc_data->bitmask)) { + fail_msg_where("Unexpected value type `%s`.", AMvalTypeToString(tag), sc_data->file, sc_data->line); + return false; + } + } + return true; +} diff --git a/rust/automerge-c/test/cmocka_utils.h b/rust/automerge-c/test/cmocka_utils.h new file mode 100644 index 00000000..b6611bcc --- /dev/null +++ b/rust/automerge-c/test/cmocka_utils.h @@ -0,0 +1,42 @@ +#ifndef TESTS_CMOCKA_UTILS_H +#define TESTS_CMOCKA_UTILS_H + +#include +#include + +/* third-party */ +#include +#include + +/* local */ +#include "base_state.h" + +/** + * \brief Forces the test to fail immediately and quit, printing the reason. + * + * \param[in] msg A message string into which \p view.src is interpolated. + * \param[in] view A UTF-8 string view as an `AMbyteSpan` struct. + */ +#define fail_msg_view(msg, view) \ + do { \ + char* const c_str = AMstrdup(view, NULL); \ + print_error("ERROR: " msg "\n", c_str); \ + free(c_str); \ + fail(); \ + } while (0) + +/** + * \brief Validates the top result in a stack based upon the parameters + * specified within the given data structure and reports violations + * using cmocka assertions. + * + * \param[in,out] stack A pointer to a pointer to an `AMstack` struct. + * \param[in] data A pointer to an owned `AMpushData` struct. + * \return `true` if the top `AMresult` struct in \p stack is valid, `false` + * otherwise. + * \pre \p stack `!= NULL`. + * \pre \p data `!= NULL`. + */ +bool cmocka_cb(AMstack** stack, void* data); + +#endif /* TESTS_CMOCKA_UTILS_H */ diff --git a/rust/automerge-c/test/doc_state.c b/rust/automerge-c/test/doc_state.c new file mode 100644 index 00000000..3cbece50 --- /dev/null +++ b/rust/automerge-c/test/doc_state.c @@ -0,0 +1,27 @@ +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include "cmocka_utils.h" +#include "doc_state.h" + +int setup_doc(void** state) { + DocState* doc_state = test_calloc(1, sizeof(DocState)); + setup_base((void**)&doc_state->base_state); + AMitemToDoc(AMstackItem(&doc_state->base_state->stack, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), + &doc_state->doc); + *state = doc_state; + return 0; +} + +int teardown_doc(void** state) { + DocState* doc_state = *state; + teardown_base((void**)&doc_state->base_state); + test_free(doc_state); + return 0; +} diff --git a/rust/automerge-c/test/doc_state.h b/rust/automerge-c/test/doc_state.h new file mode 100644 index 00000000..525a49fa --- /dev/null +++ b/rust/automerge-c/test/doc_state.h @@ -0,0 +1,17 @@ +#ifndef TESTS_DOC_STATE_H +#define TESTS_DOC_STATE_H + +/* local */ +#include +#include "base_state.h" + +typedef struct { + BaseState* base_state; + AMdoc* doc; +} DocState; + +int setup_doc(void** state); + +int teardown_doc(void** state); + +#endif /* TESTS_DOC_STATE_H */ diff --git a/rust/automerge-c/test/doc_tests.c b/rust/automerge-c/test/doc_tests.c new file mode 100644 index 00000000..c1d21928 --- /dev/null +++ b/rust/automerge-c/test/doc_tests.c @@ -0,0 +1,231 @@ +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include "base_state.h" +#include "cmocka_utils.h" +#include "doc_state.h" +#include "str_utils.h" + +typedef struct { + DocState* doc_state; + AMbyteSpan actor_id_str; + uint8_t* actor_id_bytes; + size_t actor_id_size; +} TestState; + +static int setup(void** state) { + TestState* test_state = test_calloc(1, sizeof(TestState)); + setup_doc((void**)&test_state->doc_state); + test_state->actor_id_str.src = "000102030405060708090a0b0c0d0e0f"; + test_state->actor_id_str.count = strlen(test_state->actor_id_str.src); + test_state->actor_id_size = test_state->actor_id_str.count / 2; + test_state->actor_id_bytes = test_malloc(test_state->actor_id_size); + hex_to_bytes(test_state->actor_id_str.src, test_state->actor_id_bytes, test_state->actor_id_size); + *state = test_state; + return 0; +} + +static int teardown(void** state) { + TestState* test_state = *state; + teardown_doc((void**)&test_state->doc_state); + test_free(test_state->actor_id_bytes); + test_free(test_state); + return 0; +} + +static void test_AMkeys_empty(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMitems forward = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_int_equal(AMitemsSize(&forward), 0); + AMitems reverse = AMitemsReversed(&forward); + assert_int_equal(AMitemsSize(&reverse), 0); + assert_null(AMitemsNext(&forward, 1)); + assert_null(AMitemsPrev(&forward, 1)); + assert_null(AMitemsNext(&reverse, 1)); + assert_null(AMitemsPrev(&reverse, 1)); +} + +static void test_AMkeys_list(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMlistPutInt(doc, list, 0, true, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutInt(doc, list, 1, true, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutInt(doc, list, 2, true, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMitems forward = AMstackItems(stack_ptr, AMkeys(doc, list, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&forward), 3); + AMitems reverse = AMitemsReversed(&forward); + assert_int_equal(AMitemsSize(&reverse), 3); + /* Forward iterator forward. */ + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "2@"), str.src); + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "3@"), str.src); + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "4@"), str.src); + assert_null(AMitemsNext(&forward, 1)); + // /* Forward iterator reverse. */ + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "4@"), str.src); + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "3@"), str.src); + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_ptr_equal(strstr(str.src, "2@"), str.src); + assert_null(AMitemsPrev(&forward, 1)); + /* Reverse iterator forward. */ + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "4@"), str.src); + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "3@"), str.src); + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "2@"), str.src); + assert_null(AMitemsNext(&reverse, 1)); + /* Reverse iterator reverse. */ + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "2@"), str.src); + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "3@"), str.src); + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_ptr_equal(strstr(str.src, "4@"), str.src); + assert_null(AMitemsPrev(&reverse, 1)); +} + +static void test_AMkeys_map(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("one"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("two"), 2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("three"), 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMitems forward = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&forward), 3); + AMitems reverse = AMitemsReversed(&forward); + assert_int_equal(AMitemsSize(&reverse), 3); + /* Forward iterator forward. */ + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "one", str.count); + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_int_equal(str.count, 5); + assert_memory_equal(str.src, "three", str.count); + assert_true(AMitemToStr(AMitemsNext(&forward, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "two", str.count); + assert_null(AMitemsNext(&forward, 1)); + /* Forward iterator reverse. */ + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "two", str.count); + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_int_equal(str.count, 5); + assert_memory_equal(str.src, "three", str.count); + assert_true(AMitemToStr(AMitemsPrev(&forward, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "one", str.count); + assert_null(AMitemsPrev(&forward, 1)); + /* Reverse iterator forward. */ + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "two", str.count); + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_int_equal(str.count, 5); + assert_memory_equal(str.src, "three", str.count); + assert_true(AMitemToStr(AMitemsNext(&reverse, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "one", str.count); + assert_null(AMitemsNext(&reverse, 1)); + /* Reverse iterator reverse. */ + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "one", str.count); + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_int_equal(str.count, 5); + assert_memory_equal(str.src, "three", str.count); + assert_true(AMitemToStr(AMitemsPrev(&reverse, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "two", str.count); + assert_null(AMitemsPrev(&reverse, 1)); +} + +static void test_AMputActor_bytes(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromBytes(test_state->actor_id_bytes, test_state->actor_id_size), cmocka_cb, + AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->doc_state->doc, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMgetActorId(test_state->doc_state->doc), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMbyteSpan const bytes = AMactorIdBytes(actor_id); + assert_int_equal(bytes.count, test_state->actor_id_size); + assert_memory_equal(bytes.src, test_state->actor_id_bytes, bytes.count); +} + +static void test_AMputActor_str(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(test_state->actor_id_str), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->doc_state->doc, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMgetActorId(test_state->doc_state->doc), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMbyteSpan const str = AMactorIdStr(actor_id); + assert_int_equal(str.count, test_state->actor_id_str.count); + assert_memory_equal(str.src, test_state->actor_id_str.src, str.count); +} + +static void test_AMspliceText(void** state) { + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->doc_state->base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMobjId const* const text = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMspliceText(doc, text, 0, 0, AMstr("one + ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMspliceText(doc, text, 4, 2, AMstr("two = ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMspliceText(doc, text, 8, 2, AMstr("three")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMbyteSpan str; + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("one two three")); + assert_memory_equal(str.src, "one two three", str.count); +} + +int run_doc_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_AMkeys_empty, setup, teardown), + cmocka_unit_test_setup_teardown(test_AMkeys_list, setup, teardown), + cmocka_unit_test_setup_teardown(test_AMkeys_map, setup, teardown), + cmocka_unit_test_setup_teardown(test_AMputActor_bytes, setup, teardown), + cmocka_unit_test_setup_teardown(test_AMputActor_str, setup, teardown), + cmocka_unit_test_setup_teardown(test_AMspliceText, setup, teardown), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/rust/automerge-c/test/enum_string_tests.c b/rust/automerge-c/test/enum_string_tests.c new file mode 100644 index 00000000..11131e43 --- /dev/null +++ b/rust/automerge-c/test/enum_string_tests.c @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include + +#define assert_to_string(function, tag) assert_string_equal(function(tag), #tag) + +#define assert_from_string(function, type, tag) \ + do { \ + type out; \ + assert_true(function(&out, #tag)); \ + assert_int_equal(out, tag); \ + } while (0) + +static void test_AMidxTypeToString(void** state) { + assert_to_string(AMidxTypeToString, AM_IDX_TYPE_DEFAULT); + assert_to_string(AMidxTypeToString, AM_IDX_TYPE_KEY); + assert_to_string(AMidxTypeToString, AM_IDX_TYPE_POS); + /* Zero tag */ + assert_string_equal(AMidxTypeToString(0), "AM_IDX_TYPE_DEFAULT"); + /* Invalid tag */ + assert_string_equal(AMidxTypeToString(-1), "???"); +} + +static void test_AMidxTypeFromString(void** state) { + assert_from_string(AMidxTypeFromString, AMidxType, AM_IDX_TYPE_DEFAULT); + assert_from_string(AMidxTypeFromString, AMidxType, AM_IDX_TYPE_KEY); + assert_from_string(AMidxTypeFromString, AMidxType, AM_IDX_TYPE_POS); + /* Invalid tag */ + AMidxType out = -1; + assert_false(AMidxTypeFromString(&out, "???")); + assert_int_equal(out, (AMidxType)-1); +} + +static void test_AMobjTypeToString(void** state) { + assert_to_string(AMobjTypeToString, AM_OBJ_TYPE_DEFAULT); + assert_to_string(AMobjTypeToString, AM_OBJ_TYPE_LIST); + assert_to_string(AMobjTypeToString, AM_OBJ_TYPE_MAP); + assert_to_string(AMobjTypeToString, AM_OBJ_TYPE_TEXT); + /* Zero tag */ + assert_string_equal(AMobjTypeToString(0), "AM_OBJ_TYPE_DEFAULT"); + /* Invalid tag */ + assert_string_equal(AMobjTypeToString(-1), "???"); +} + +static void test_AMobjTypeFromString(void** state) { + assert_from_string(AMobjTypeFromString, AMobjType, AM_OBJ_TYPE_DEFAULT); + assert_from_string(AMobjTypeFromString, AMobjType, AM_OBJ_TYPE_LIST); + assert_from_string(AMobjTypeFromString, AMobjType, AM_OBJ_TYPE_MAP); + assert_from_string(AMobjTypeFromString, AMobjType, AM_OBJ_TYPE_TEXT); + /* Invalid tag */ + AMobjType out = -1; + assert_false(AMobjTypeFromString(&out, "???")); + assert_int_equal(out, (AMobjType)-1); +} + +static void test_AMstatusToString(void** state) { + assert_to_string(AMstatusToString, AM_STATUS_ERROR); + assert_to_string(AMstatusToString, AM_STATUS_INVALID_RESULT); + assert_to_string(AMstatusToString, AM_STATUS_OK); + /* Zero tag */ + assert_string_equal(AMstatusToString(0), "AM_STATUS_OK"); + /* Invalid tag */ + assert_string_equal(AMstatusToString(-1), "???"); +} + +static void test_AMstatusFromString(void** state) { + assert_from_string(AMstatusFromString, AMstatus, AM_STATUS_ERROR); + assert_from_string(AMstatusFromString, AMstatus, AM_STATUS_INVALID_RESULT); + assert_from_string(AMstatusFromString, AMstatus, AM_STATUS_OK); + /* Invalid tag */ + AMstatus out = -1; + assert_false(AMstatusFromString(&out, "???")); + assert_int_equal(out, (AMstatus)-1); +} + +static void test_AMvalTypeToString(void** state) { + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_ACTOR_ID); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_BOOL); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_BYTES); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_CHANGE); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_CHANGE_HASH); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_COUNTER); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_DEFAULT); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_DOC); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_F64); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_INT); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_NULL); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_OBJ_TYPE); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_STR); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_SYNC_HAVE); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_SYNC_MESSAGE); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_SYNC_STATE); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_TIMESTAMP); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_UINT); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_UNKNOWN); + assert_to_string(AMvalTypeToString, AM_VAL_TYPE_VOID); + /* Zero tag */ + assert_string_equal(AMvalTypeToString(0), "AM_VAL_TYPE_DEFAULT"); + /* Invalid tag */ + assert_string_equal(AMvalTypeToString(-1), "???"); +} + +static void test_AMvalTypeFromString(void** state) { + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_ACTOR_ID); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_BOOL); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_BYTES); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_CHANGE); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_CHANGE_HASH); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_COUNTER); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_DEFAULT); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_DOC); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_F64); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_INT); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_NULL); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_OBJ_TYPE); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_STR); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_SYNC_HAVE); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_SYNC_MESSAGE); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_SYNC_STATE); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_TIMESTAMP); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_UINT); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_UNKNOWN); + assert_from_string(AMvalTypeFromString, AMvalType, AM_VAL_TYPE_VOID); + /* Invalid tag */ + AMvalType out = -1; + assert_false(AMvalTypeFromString(&out, "???")); + assert_int_equal(out, (AMvalType)-1); +} + +int run_enum_string_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMidxTypeToString), cmocka_unit_test(test_AMidxTypeFromString), + cmocka_unit_test(test_AMobjTypeToString), cmocka_unit_test(test_AMobjTypeFromString), + cmocka_unit_test(test_AMstatusToString), cmocka_unit_test(test_AMstatusFromString), + cmocka_unit_test(test_AMvalTypeToString), cmocka_unit_test(test_AMvalTypeFromString), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/rust/automerge-c/test/item_tests.c b/rust/automerge-c/test/item_tests.c new file mode 100644 index 00000000..a30b0556 --- /dev/null +++ b/rust/automerge-c/test/item_tests.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include "cmocka_utils.h" +#include "doc_state.h" + +static void test_AMitemResult(void** state) { + enum { ITEM_COUNT = 1000 }; + + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + /* Append the strings to a list so that they'll be in numerical order. */ + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + for (size_t pos = 0; pos != ITEM_COUNT; ++pos) { + size_t const count = snprintf(NULL, 0, "%zu", pos); + char* const src = test_calloc(count + 1, sizeof(char)); + assert_int_equal(sprintf(src, "%zu", pos), count); + AMstackItem(NULL, AMlistPutStr(doc_state->doc, list, pos, true, AMbytes(src, count)), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + test_free(src); + } + /* Get an item iterator. */ + AMitems items = AMstackItems(stack_ptr, AMlistRange(doc_state->doc, list, 0, SIZE_MAX, NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + /* Get the item iterator's result so that it can be freed later. */ + AMresult const* const items_result = (*stack_ptr)->result; + /* Iterate over all of the items and copy their pointers into an array. */ + AMitem* item_ptrs[ITEM_COUNT] = {NULL}; + AMitem* item = NULL; + for (size_t pos = 0; (item = AMitemsNext(&items, 1)) != NULL; ++pos) { + /* The item's reference count should be 1. */ + assert_int_equal(AMitemRefCount(item), 1); + if (pos & 1) { + /* Create a redundant result for an odd item. */ + AMitem* const new_item = AMstackItem(stack_ptr, AMitemResult(item), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + /* The item's old and new pointers will never match. */ + assert_ptr_not_equal(new_item, item); + /* The item's reference count will have been incremented. */ + assert_int_equal(AMitemRefCount(item), 2); + assert_int_equal(AMitemRefCount(new_item), 2); + /* The item's old and new indices should match. */ + assert_int_equal(AMitemIdxType(item), AMitemIdxType(new_item)); + assert_int_equal(AMitemIdxType(item), AM_IDX_TYPE_POS); + size_t pos, new_pos; + assert_true(AMitemPos(item, &pos)); + assert_true(AMitemPos(new_item, &new_pos)); + assert_int_equal(pos, new_pos); + /* The item's old and new object IDs should match. */ + AMobjId const* const obj_id = AMitemObjId(item); + AMobjId const* const new_obj_id = AMitemObjId(new_item); + assert_true(AMobjIdEqual(obj_id, new_obj_id)); + /* The item's old and new value types should match. */ + assert_int_equal(AMitemValType(item), AMitemValType(new_item)); + /* The item's old and new string values should match. */ + AMbyteSpan str; + assert_true(AMitemToStr(item, &str)); + AMbyteSpan new_str; + assert_true(AMitemToStr(new_item, &new_str)); + assert_int_equal(str.count, new_str.count); + assert_memory_equal(str.src, new_str.src, new_str.count); + /* The item's old and new object IDs are one and the same. */ + assert_ptr_equal(obj_id, new_obj_id); + /* The item's old and new string values are one and the same. */ + assert_ptr_equal(str.src, new_str.src); + /* Save the item's new pointer. */ + item_ptrs[pos] = new_item; + } + } + /* Free the item iterator's result. */ + AMresultFree(AMstackPop(stack_ptr, items_result)); + /* An odd item's reference count should be 1 again. */ + for (size_t pos = 1; pos < ITEM_COUNT; pos += 2) { + assert_int_equal(AMitemRefCount(item_ptrs[pos]), 1); + } +} + +int run_item_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMitemResult), + }; + + return cmocka_run_group_tests(tests, setup_doc, teardown_doc); +} diff --git a/rust/automerge-c/test/list_tests.c b/rust/automerge-c/test/list_tests.c new file mode 100644 index 00000000..723dd038 --- /dev/null +++ b/rust/automerge-c/test/list_tests.c @@ -0,0 +1,515 @@ +#include +#include +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include "base_state.h" +#include "cmocka_utils.h" +#include "doc_state.h" +#include "macro_utils.h" + +static void test_AMlistIncrement(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMlistPutCounter(doc_state->doc, list, 0, true, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + int64_t counter; + assert_true(AMitemToCounter( + AMstackItem(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 0); + AMresultFree(AMstackPop(stack_ptr, NULL)); + AMstackItem(NULL, AMlistIncrement(doc_state->doc, list, 0, 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToCounter( + AMstackItem(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 3); + AMresultFree(AMstackPop(stack_ptr, NULL)); +} + +#define test_AMlistPut(suffix, mode) test_AMlistPut##suffix##_##mode + +#define static_void_test_AMlistPut(suffix, mode, type, scalar_value) \ + static void test_AMlistPut##suffix##_##mode(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjId const* const list = AMitemObjId( \ + AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + AMstackItem(NULL, AMlistPut##suffix(doc_state->doc, list, 0, !strcmp(#mode, "insert"), scalar_value), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); \ + type value; \ + assert_true(AMitemTo##suffix(AMstackItem(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), cmocka_cb, \ + AMexpect(suffix_to_val_type(#suffix))), \ + &value)); \ + assert_true(value == scalar_value); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +#define test_AMlistPutBytes(mode) test_AMlistPutBytes##_##mode + +#define static_void_test_AMlistPutBytes(mode, bytes_value) \ + static void test_AMlistPutBytes_##mode(void** state) { \ + static size_t const BYTES_SIZE = sizeof(bytes_value) / sizeof(uint8_t); \ + \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjId const* const list = AMitemObjId( \ + AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + AMstackItem( \ + NULL, AMlistPutBytes(doc_state->doc, list, 0, !strcmp(#mode, "insert"), AMbytes(bytes_value, BYTES_SIZE)), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); \ + AMbyteSpan bytes; \ + assert_true(AMitemToBytes( \ + AMstackItem(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), \ + &bytes)); \ + assert_int_equal(bytes.count, BYTES_SIZE); \ + assert_memory_equal(bytes.src, bytes_value, BYTES_SIZE); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +#define test_AMlistPutNull(mode) test_AMlistPutNull_##mode + +#define static_void_test_AMlistPutNull(mode) \ + static void test_AMlistPutNull_##mode(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjId const* const list = AMitemObjId( \ + AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + AMstackItem(NULL, AMlistPutNull(doc_state->doc, list, 0, !strcmp(#mode, "insert")), cmocka_cb, \ + AMexpect(AM_VAL_TYPE_VOID)); \ + AMresult* result = AMstackResult(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), NULL, NULL); \ + if (AMresultStatus(result) != AM_STATUS_OK) { \ + fail_msg_view("%s", AMresultError(result)); \ + } \ + assert_int_equal(AMresultSize(result), 1); \ + assert_int_equal(AMitemValType(AMresultItem(result)), AM_VAL_TYPE_NULL); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +#define test_AMlistPutObject(label, mode) test_AMlistPutObject_##label##_##mode + +#define static_void_test_AMlistPutObject(label, mode) \ + static void test_AMlistPutObject_##label##_##mode(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjId const* const list = AMitemObjId( \ + AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + AMobjType const obj_type = suffix_to_obj_type(#label); \ + AMobjId const* const obj_id = AMitemObjId( \ + AMstackItem(stack_ptr, AMlistPutObject(doc_state->doc, list, 0, !strcmp(#mode, "insert"), obj_type), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + assert_non_null(obj_id); \ + assert_int_equal(AMobjObjType(doc_state->doc, obj_id), obj_type); \ + assert_int_equal(AMobjSize(doc_state->doc, obj_id, NULL), 0); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +#define test_AMlistPutStr(mode) test_AMlistPutStr##_##mode + +#define static_void_test_AMlistPutStr(mode, str_value) \ + static void test_AMlistPutStr_##mode(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjId const* const list = AMitemObjId( \ + AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + AMstackItem(NULL, AMlistPutStr(doc_state->doc, list, 0, !strcmp(#mode, "insert"), AMstr(str_value)), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); \ + AMbyteSpan str; \ + assert_true(AMitemToStr( \ + AMstackItem(stack_ptr, AMlistGet(doc_state->doc, list, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), \ + &str)); \ + assert_int_equal(str.count, strlen(str_value)); \ + assert_memory_equal(str.src, str_value, str.count); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +static_void_test_AMlistPut(Bool, insert, bool, true); + +static_void_test_AMlistPut(Bool, update, bool, true); + +static uint8_t const BYTES_VALUE[] = {INT8_MIN, INT8_MAX / 2, INT8_MAX}; + +static_void_test_AMlistPutBytes(insert, BYTES_VALUE); + +static_void_test_AMlistPutBytes(update, BYTES_VALUE); + +static_void_test_AMlistPut(Counter, insert, int64_t, INT64_MAX); + +static_void_test_AMlistPut(Counter, update, int64_t, INT64_MAX); + +static_void_test_AMlistPut(F64, insert, double, DBL_MAX); + +static_void_test_AMlistPut(F64, update, double, DBL_MAX); + +static_void_test_AMlistPut(Int, insert, int64_t, INT64_MAX); + +static_void_test_AMlistPut(Int, update, int64_t, INT64_MAX); + +static_void_test_AMlistPutNull(insert); + +static_void_test_AMlistPutNull(update); + +static_void_test_AMlistPutObject(List, insert); + +static_void_test_AMlistPutObject(List, update); + +static_void_test_AMlistPutObject(Map, insert); + +static_void_test_AMlistPutObject(Map, update); + +static_void_test_AMlistPutObject(Text, insert); + +static_void_test_AMlistPutObject(Text, update); + +static_void_test_AMlistPutStr(insert, + "Hello, " + "world!"); + +static_void_test_AMlistPutStr(update, + "Hello," + " world" + "!"); + +static_void_test_AMlistPut(Timestamp, insert, int64_t, INT64_MAX); + +static_void_test_AMlistPut(Timestamp, update, int64_t, INT64_MAX); + +static_void_test_AMlistPut(Uint, insert, uint64_t, UINT64_MAX); + +static_void_test_AMlistPut(Uint, update, uint64_t, UINT64_MAX); + +static void test_get_range_values(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + + /* Insert elements. */ + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("First")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Second")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Third")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Fourth")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Fifth")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Sixth")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Seventh")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc1, list, 0, true, AMstr("Eighth")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMitems const v1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(doc1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + + AMstackItem(NULL, AMlistPutStr(doc1, list, 2, false, AMstr("Third V2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMlistPutStr(doc2, list, 2, false, AMstr("Third V3")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc2, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMmerge(doc1, doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + /* Forward vs. reverse: complete current list range. */ + AMitems range = + AMstackItems(stack_ptr, AMlistRange(doc1, list, 0, SIZE_MAX, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + size_t size = AMitemsSize(&range); + assert_int_equal(size, 8); + AMitems range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + size_t pos; + assert_true(AMitemPos(AMitemsNext(&range, 1), &pos)); + assert_int_equal(pos, 0); + assert_true(AMitemPos(AMitemsNext(&range_back, 1), &pos)); + assert_int_equal(pos, 7); + + AMitem *item1, *item_back1; + size_t count, middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + size_t pos1, pos_back1; + assert_true(AMitemPos(item1, &pos1)); + assert_true(AMitemPos(item_back1, &pos_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(pos1, pos_back1); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(pos1, pos_back1); + } + AMitem* item2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos1, NULL), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos_back1, NULL), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: partial current list range. */ + range = AMstackItems(stack_ptr, AMlistRange(doc1, list, 1, 6, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 5); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemPos(AMitemsNext(&range, 1), &pos)); + assert_int_equal(pos, 1); + assert_true(AMitemPos(AMitemsNext(&range_back, 1), &pos)); + assert_int_equal(pos, 5); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + size_t pos1, pos_back1; + assert_true(AMitemPos(item1, &pos1)); + assert_true(AMitemPos(item_back1, &pos_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(pos1, pos_back1); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(pos1, pos_back1); + } + AMitem* item2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos1, NULL), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos_back1, NULL), NULL, NULL); + /** \note An item returned from an `AMlistGet()` call doesn't include + the index used to retrieve it. */ + assert_int_equal(AMitemIdxType(item2), 0); + assert_int_equal(AMitemIdxType(item_back2), 0); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: complete historical map range. */ + range = AMstackItems(stack_ptr, AMlistRange(doc1, list, 0, SIZE_MAX, &v1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 8); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemPos(AMitemsNext(&range, 1), &pos)); + assert_int_equal(pos, 0); + assert_true(AMitemPos(AMitemsNext(&range_back, 1), &pos)); + assert_int_equal(pos, 7); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + size_t pos1, pos_back1; + assert_true(AMitemPos(item1, &pos1)); + assert_true(AMitemPos(item_back1, &pos_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(pos1, pos_back1); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(pos1, pos_back1); + } + AMitem* item2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos1, &v1), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos_back1, &v1), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: partial historical map range. */ + range = AMstackItems(stack_ptr, AMlistRange(doc1, list, 2, 7, &v1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 5); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemPos(AMitemsNext(&range, 1), &pos)); + assert_int_equal(pos, 2); + assert_true(AMitemPos(AMitemsNext(&range_back, 1), &pos)); + assert_int_equal(pos, 6); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + size_t pos1, pos_back1; + assert_true(AMitemPos(item1, &pos1)); + assert_true(AMitemPos(item_back1, &pos_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(pos1, pos_back1); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(pos1, pos_back1); + } + AMitem* item2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos1, &v1), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMlistGet(doc1, list, pos_back1, &v1), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* List range vs. object range: complete current. */ + range = AMstackItems(stack_ptr, AMlistRange(doc1, list, 0, SIZE_MAX, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMitems obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, list, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&range), AMitemsSize(&obj_items)); + + AMitem *item, *obj_item; + for (item = NULL, obj_item = NULL; item && obj_item; + item = AMitemsNext(&range, 1), obj_item = AMitemsNext(&obj_items, 1)) { + /** \note Object iteration doesn't yield any item indices. */ + assert_true(AMitemIdxType(item)); + assert_false(AMitemIdxType(obj_item)); + assert_true(AMitemEqual(item, obj_item)); + assert_true(AMobjIdEqual(AMitemObjId(item), AMitemObjId(obj_item))); + } + + /* List range vs. object range: complete historical. */ + range = AMstackItems(stack_ptr, AMlistRange(doc1, list, 0, SIZE_MAX, &v1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, list, &v1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&range), AMitemsSize(&obj_items)); + + for (item = NULL, obj_item = NULL; item && obj_item; + item = AMitemsNext(&range, 1), obj_item = AMitemsNext(&obj_items, 1)) { + /** \note Object iteration doesn't yield any item indices. */ + assert_true(AMitemIdxType(item)); + assert_false(AMitemIdxType(obj_item)); + assert_true(AMitemEqual(item, obj_item)); + assert_true(AMobjIdEqual(AMitemObjId(item), AMitemObjId(obj_item))); + } +} + +/** + * \brief A JavaScript application can introduce NUL (`\0`) characters into a + * list object's string value which will truncate it in a C application. + */ +static void test_get_NUL_string_value(void** state) { + /* + import * as Automerge from "@automerge/automerge"; + let doc = Automerge.init(); + doc = Automerge.change(doc, doc => { + doc[0] = 'o\0ps'; + }); + const bytes = Automerge.save(doc); + console.log("static uint8_t const SAVED_DOC[] = {" + Array.apply([], + bytes).join(", ") + "};"); + */ + static uint8_t const OOPS_VALUE[] = {'o', '\0', 'p', 's'}; + static size_t const OOPS_SIZE = sizeof(OOPS_VALUE) / sizeof(uint8_t); + + static uint8_t const SAVED_DOC[] = { + 133, 111, 74, 131, 224, 28, 197, 17, 0, 113, 1, 16, 246, 137, 63, 193, 255, 181, 76, 79, 129, + 213, 133, 29, 214, 158, 164, 15, 1, 207, 184, 14, 57, 1, 194, 79, 247, 82, 160, 134, 227, 144, + 5, 241, 136, 205, 238, 250, 251, 54, 34, 250, 210, 96, 204, 132, 153, 203, 110, 109, 6, 6, 1, + 2, 3, 2, 19, 2, 35, 2, 64, 2, 86, 2, 8, 21, 3, 33, 2, 35, 2, 52, 1, 66, + 2, 86, 2, 87, 4, 128, 1, 2, 127, 0, 127, 1, 127, 1, 127, 0, 127, 0, 127, 7, 127, + 1, 48, 127, 0, 127, 1, 1, 127, 1, 127, 70, 111, 0, 112, 115, 127, 0, 0}; + static size_t const SAVED_DOC_SIZE = sizeof(SAVED_DOC) / sizeof(uint8_t); + + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(SAVED_DOC, SAVED_DOC_SIZE), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, AM_ROOT, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_not_equal(str.count, strlen(OOPS_VALUE)); + assert_int_equal(str.count, OOPS_SIZE); + assert_memory_equal(str.src, OOPS_VALUE, str.count); +} + +static void test_insert_at_index(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* Insert both at the same index. */ + AMstackItem(NULL, AMlistPutUint(doc, list, 0, true, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutUint(doc, list, 0, true, 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + assert_int_equal(AMobjSize(doc, list, NULL), 2); + AMitems const keys = AMstackItems(stack_ptr, AMkeys(doc, list, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&keys), 2); + AMitems const range = + AMstackItems(stack_ptr, AMlistRange(doc, list, 0, SIZE_MAX, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)); + assert_int_equal(AMitemsSize(&range), 2); +} + +int run_list_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMlistIncrement), + cmocka_unit_test(test_AMlistPut(Bool, insert)), + cmocka_unit_test(test_AMlistPut(Bool, update)), + cmocka_unit_test(test_AMlistPutBytes(insert)), + cmocka_unit_test(test_AMlistPutBytes(update)), + cmocka_unit_test(test_AMlistPut(Counter, insert)), + cmocka_unit_test(test_AMlistPut(Counter, update)), + cmocka_unit_test(test_AMlistPut(F64, insert)), + cmocka_unit_test(test_AMlistPut(F64, update)), + cmocka_unit_test(test_AMlistPut(Int, insert)), + cmocka_unit_test(test_AMlistPut(Int, update)), + cmocka_unit_test(test_AMlistPutNull(insert)), + cmocka_unit_test(test_AMlistPutNull(update)), + cmocka_unit_test(test_AMlistPutObject(List, insert)), + cmocka_unit_test(test_AMlistPutObject(List, update)), + cmocka_unit_test(test_AMlistPutObject(Map, insert)), + cmocka_unit_test(test_AMlistPutObject(Map, update)), + cmocka_unit_test(test_AMlistPutObject(Text, insert)), + cmocka_unit_test(test_AMlistPutObject(Text, update)), + cmocka_unit_test(test_AMlistPutStr(insert)), + cmocka_unit_test(test_AMlistPutStr(update)), + cmocka_unit_test(test_AMlistPut(Timestamp, insert)), + cmocka_unit_test(test_AMlistPut(Timestamp, update)), + cmocka_unit_test(test_AMlistPut(Uint, insert)), + cmocka_unit_test(test_AMlistPut(Uint, update)), + cmocka_unit_test_setup_teardown(test_get_range_values, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_get_NUL_string_value, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_insert_at_index, setup_base, teardown_base), + }; + + return cmocka_run_group_tests(tests, setup_doc, teardown_doc); +} diff --git a/rust/automerge-c/test/macro_utils.c b/rust/automerge-c/test/macro_utils.c new file mode 100644 index 00000000..3a546eb5 --- /dev/null +++ b/rust/automerge-c/test/macro_utils.c @@ -0,0 +1,38 @@ +#include + +/* local */ +#include "macro_utils.h" + +AMobjType suffix_to_obj_type(char const* obj_type_label) { + if (!strcmp(obj_type_label, "List")) + return AM_OBJ_TYPE_LIST; + else if (!strcmp(obj_type_label, "Map")) + return AM_OBJ_TYPE_MAP; + else if (!strcmp(obj_type_label, "Text")) + return AM_OBJ_TYPE_TEXT; + else + return AM_OBJ_TYPE_DEFAULT; +} + +AMvalType suffix_to_val_type(char const* suffix) { + if (!strcmp(suffix, "Bool")) + return AM_VAL_TYPE_BOOL; + else if (!strcmp(suffix, "Bytes")) + return AM_VAL_TYPE_BYTES; + else if (!strcmp(suffix, "Counter")) + return AM_VAL_TYPE_COUNTER; + else if (!strcmp(suffix, "F64")) + return AM_VAL_TYPE_F64; + else if (!strcmp(suffix, "Int")) + return AM_VAL_TYPE_INT; + else if (!strcmp(suffix, "Null")) + return AM_VAL_TYPE_NULL; + else if (!strcmp(suffix, "Str")) + return AM_VAL_TYPE_STR; + else if (!strcmp(suffix, "Timestamp")) + return AM_VAL_TYPE_TIMESTAMP; + else if (!strcmp(suffix, "Uint")) + return AM_VAL_TYPE_UINT; + else + return AM_VAL_TYPE_DEFAULT; +} diff --git a/rust/automerge-c/test/macro_utils.h b/rust/automerge-c/test/macro_utils.h new file mode 100644 index 00000000..e4c2c5b9 --- /dev/null +++ b/rust/automerge-c/test/macro_utils.h @@ -0,0 +1,23 @@ +#ifndef TESTS_MACRO_UTILS_H +#define TESTS_MACRO_UTILS_H + +/* local */ +#include + +/** + * \brief Gets the object type tag corresponding to an object type suffix. + * + * \param[in] suffix An object type suffix string. + * \return An `AMobjType` enum tag. + */ +AMobjType suffix_to_obj_type(char const* suffix); + +/** + * \brief Gets the value type tag corresponding to a value type suffix. + * + * \param[in] suffix A value type suffix string. + * \return An `AMvalType` enum tag. + */ +AMvalType suffix_to_val_type(char const* suffix); + +#endif /* TESTS_MACRO_UTILS_H */ diff --git a/rust/automerge-c/test/main.c b/rust/automerge-c/test/main.c new file mode 100644 index 00000000..2996c9b3 --- /dev/null +++ b/rust/automerge-c/test/main.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +/* third-party */ +#include + +extern int run_actor_id_tests(void); + +extern int run_byte_span_tests(void); + +extern int run_doc_tests(void); + +extern int run_enum_string_tests(void); + +extern int run_item_tests(void); + +extern int run_list_tests(void); + +extern int run_map_tests(void); + +extern int run_ported_wasm_suite(void); + +int main(void) { + return (run_actor_id_tests() + run_byte_span_tests() + run_doc_tests() + run_enum_string_tests() + + run_item_tests() + run_list_tests() + run_map_tests() + run_ported_wasm_suite()); +} diff --git a/rust/automerge-c/test/map_tests.c b/rust/automerge-c/test/map_tests.c new file mode 100644 index 00000000..2ee2e69a --- /dev/null +++ b/rust/automerge-c/test/map_tests.c @@ -0,0 +1,1582 @@ +#include +#include +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include +#include "base_state.h" +#include "cmocka_utils.h" +#include "doc_state.h" +#include "macro_utils.h" + +static void test_AMmapIncrement(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + AMstackItem(NULL, AMmapPutCounter(doc_state->doc, AM_ROOT, AMstr("Counter"), 0), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + int64_t counter; + assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, AMstr("Counter"), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 0); + AMresultFree(AMstackPop(stack_ptr, NULL)); + AMstackItem(NULL, AMmapIncrement(doc_state->doc, AM_ROOT, AMstr("Counter"), 3), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, AMstr("Counter"), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 3); + AMresultFree(AMstackPop(stack_ptr, NULL)); +} + +#define test_AMmapPut(suffix) test_AMmapPut##suffix + +#define static_void_test_AMmapPut(suffix, type, scalar_value) \ + static void test_AMmapPut##suffix(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMstackItem(NULL, AMmapPut##suffix(doc_state->doc, AM_ROOT, AMstr(#suffix), scalar_value), cmocka_cb, \ + AMexpect(AM_VAL_TYPE_VOID)); \ + type value; \ + assert_true(AMitemTo##suffix(AMstackItem(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, AMstr(#suffix), NULL), \ + cmocka_cb, AMexpect(suffix_to_val_type(#suffix))), \ + &value)); \ + assert_true(value == scalar_value); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +static void test_AMmapPutBytes(void** state) { + static AMbyteSpan const KEY = {"Bytes", 5}; + static uint8_t const BYTES_VALUE[] = {INT8_MIN, INT8_MAX / 2, INT8_MAX}; + static size_t const BYTES_SIZE = sizeof(BYTES_VALUE) / sizeof(uint8_t); + + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + AMstackItem(NULL, AMmapPutBytes(doc_state->doc, AM_ROOT, KEY, AMbytes(BYTES_VALUE, BYTES_SIZE)), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMbyteSpan bytes; + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, KEY, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), + &bytes)); + assert_int_equal(bytes.count, BYTES_SIZE); + assert_memory_equal(bytes.src, BYTES_VALUE, BYTES_SIZE); + AMresultFree(AMstackPop(stack_ptr, NULL)); +} + +static void test_AMmapPutNull(void** state) { + static AMbyteSpan const KEY = {"Null", 4}; + + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + AMstackItem(NULL, AMmapPutNull(doc_state->doc, AM_ROOT, KEY), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMresult* result = AMstackResult(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, KEY, NULL), NULL, NULL); + if (AMresultStatus(result) != AM_STATUS_OK) { + fail_msg_view("%s", AMresultError(result)); + } + assert_int_equal(AMresultSize(result), 1); + AMitem* item = AMresultItem(result); + assert_int_equal(AMitemValType(item), AM_VAL_TYPE_NULL); +} + +#define test_AMmapPutObject(label) test_AMmapPutObject_##label + +#define static_void_test_AMmapPutObject(label) \ + static void test_AMmapPutObject_##label(void** state) { \ + DocState* doc_state = *state; \ + AMstack** stack_ptr = &doc_state->base_state->stack; \ + AMobjType const obj_type = suffix_to_obj_type(#label); \ + AMobjId const* const obj_id = \ + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc_state->doc, AM_ROOT, AMstr(#label), obj_type), \ + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); \ + assert_non_null(obj_id); \ + assert_int_equal(AMobjObjType(doc_state->doc, obj_id), obj_type); \ + assert_int_equal(AMobjSize(doc_state->doc, obj_id, NULL), 0); \ + AMresultFree(AMstackPop(stack_ptr, NULL)); \ + } + +static void test_AMmapPutStr(void** state) { + DocState* doc_state = *state; + AMstack** stack_ptr = &doc_state->base_state->stack; + AMstackItem(NULL, AMmapPutStr(doc_state->doc, AM_ROOT, AMstr("Str"), AMstr("Hello, world!")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMbyteSpan str; + assert_true(AMitemToStr(AMstackItem(stack_ptr, AMmapGet(doc_state->doc, AM_ROOT, AMstr("Str"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)), + &str)); + assert_int_equal(str.count, strlen("Hello, world!")); + assert_memory_equal(str.src, "Hello, world!", str.count); + AMresultFree(AMstackPop(stack_ptr, NULL)); +} + +static_void_test_AMmapPut(Bool, bool, true); + +static_void_test_AMmapPut(Counter, int64_t, INT64_MAX); + +static_void_test_AMmapPut(F64, double, DBL_MAX); + +static_void_test_AMmapPut(Int, int64_t, INT64_MAX); + +static_void_test_AMmapPutObject(List); + +static_void_test_AMmapPutObject(Map); + +static_void_test_AMmapPutObject(Text); + +static_void_test_AMmapPut(Timestamp, int64_t, INT64_MAX); + +static_void_test_AMmapPut(Uint, int64_t, UINT64_MAX); + +/** + * \brief A JavaScript application can introduce NUL (`\0`) characters into + * a map object's key which will truncate it in a C application. + */ +static void test_get_NUL_key(void** state) { + /* + import * as Automerge from "@automerge/automerge"; + let doc = Automerge.init(); + doc = Automerge.change(doc, doc => { + doc['o\0ps'] = 'oops'; + }); + const bytes = Automerge.save(doc); + console.log("static uint8_t const SAVED_DOC[] = {" + Array.apply([], + bytes).join(", ") + "};"); + */ + static uint8_t const OOPS_SRC[] = {'o', '\0', 'p', 's'}; + static AMbyteSpan const OOPS_KEY = {.src = OOPS_SRC, .count = sizeof(OOPS_SRC) / sizeof(uint8_t)}; + + static uint8_t const SAVED_DOC[] = { + 133, 111, 74, 131, 233, 150, 60, 244, 0, 116, 1, 16, 223, 253, 146, 193, 58, 122, 66, 134, 151, + 225, 210, 51, 58, 86, 247, 8, 1, 49, 118, 234, 228, 42, 116, 171, 13, 164, 99, 244, 27, 19, + 150, 44, 201, 136, 222, 219, 90, 246, 226, 123, 77, 120, 157, 155, 55, 182, 2, 178, 64, 6, 1, + 2, 3, 2, 19, 2, 35, 2, 64, 2, 86, 2, 8, 21, 6, 33, 2, 35, 2, 52, 1, 66, + 2, 86, 2, 87, 4, 128, 1, 2, 127, 0, 127, 1, 127, 1, 127, 0, 127, 0, 127, 7, 127, + 4, 111, 0, 112, 115, 127, 0, 127, 1, 1, 127, 1, 127, 70, 111, 111, 112, 115, 127, 0, 0}; + static size_t const SAVED_DOC_SIZE = sizeof(SAVED_DOC) / sizeof(uint8_t); + + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(SAVED_DOC, SAVED_DOC_SIZE), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, OOPS_KEY, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_not_equal(OOPS_KEY.count, strlen(OOPS_KEY.src)); + assert_int_equal(str.count, strlen("oops")); + assert_memory_equal(str.src, "oops", str.count); +} + +/** + * \brief A JavaScript application can introduce NUL (`\0`) characters into a + * map object's string value which will truncate it in a C application. + */ +static void test_get_NUL_string_value(void** state) { + /* + import * as Automerge from "@automerge/automerge"; + let doc = Automerge.init(); + doc = Automerge.change(doc, doc => { + doc.oops = 'o\0ps'; + }); + const bytes = Automerge.save(doc); + console.log("static uint8_t const SAVED_DOC[] = {" + Array.apply([], + bytes).join(", ") + "};"); + */ + static uint8_t const OOPS_VALUE[] = {'o', '\0', 'p', 's'}; + static size_t const OOPS_SIZE = sizeof(OOPS_VALUE) / sizeof(uint8_t); + + static uint8_t const SAVED_DOC[] = { + 133, 111, 74, 131, 63, 94, 151, 29, 0, 116, 1, 16, 156, 159, 189, 12, 125, 55, 71, 154, 136, + 104, 237, 186, 45, 224, 32, 22, 1, 36, 163, 164, 222, 81, 42, 1, 247, 231, 156, 54, 222, 76, + 6, 109, 18, 172, 75, 36, 118, 120, 68, 73, 87, 186, 230, 127, 68, 19, 81, 149, 185, 6, 1, + 2, 3, 2, 19, 2, 35, 2, 64, 2, 86, 2, 8, 21, 6, 33, 2, 35, 2, 52, 1, 66, + 2, 86, 2, 87, 4, 128, 1, 2, 127, 0, 127, 1, 127, 1, 127, 0, 127, 0, 127, 7, 127, + 4, 111, 111, 112, 115, 127, 0, 127, 1, 1, 127, 1, 127, 70, 111, 0, 112, 115, 127, 0, 0}; + static size_t const SAVED_DOC_SIZE = sizeof(SAVED_DOC) / sizeof(uint8_t); + + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(SAVED_DOC, SAVED_DOC_SIZE), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("oops"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), + &str)); + assert_int_not_equal(str.count, strlen(OOPS_VALUE)); + assert_int_equal(str.count, OOPS_SIZE); + assert_memory_equal(str.src, OOPS_VALUE, str.count); +} + +static void test_range_iter_map(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("a"), 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("b"), 4), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("c"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("d"), 6), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("a"), 7), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("a"), 8), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("d"), 9), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMactorId const* actor_id; + assert_true(AMitemToActorId(AMstackItem(stack_ptr, AMgetActorId(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMitems map_items = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)); + assert_int_equal(AMitemsSize(&map_items), 4); + + /* ["b"-"d") */ + AMitems range = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr("b"), AMstr("d"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)); + /* First */ + AMitem* next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "b", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + uint64_t uint; + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 4); + AMobjId const* next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "c", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 5); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + assert_null(AMitemsNext(&range, 1)); + + /* ["b"-) */ + range = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr("b"), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)); + /* First */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "b", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 4); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "c", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 5); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "d", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 9); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 7); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Fourth */ + assert_null(AMitemsNext(&range, 1)); + + /* [-"d") */ + range = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr("d"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)); + /* First */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "a", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 8); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 6); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "b", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 4); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "c", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 5); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Fourth */ + assert_null(AMitemsNext(&range, 1)); + + /* ["a"-) */ + range = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr("a"), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)); + /* First */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "a", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 8); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 6); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "b", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 4); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "c", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 5); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Fourth */ + next = AMitemsNext(&range, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "d", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_UINT); + assert_true(AMitemToUint(next, &uint)); + assert_int_equal(uint, 9); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 7); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Fifth */ + assert_null(AMitemsNext(&range, 1)); +} + +static void test_map_range_back_and_forth_single(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMactorId const* actor_id; + assert_true(AMitemToActorId(AMstackItem(stack_ptr, AMgetActorId(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("1"), AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("2"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("3"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + /* Forward, back, back. */ + AMitems range_all = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + /* First */ + AMitem* next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + AMbyteSpan str; + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + AMobjId const* next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + AMitems range_back_all = AMitemsReversed(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + AMitem* next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + AMbyteSpan str_back; + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + AMobjId const* next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "b", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + + /* Forward, back, forward. */ + range_all = AMitemsRewound(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + + /* Forward, forward, forward. */ + range_all = AMitemsRewound(&range_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Forward stop */ + assert_null(AMitemsNext(&range_all, 1)); + + /* Back, back, back. */ + range_back_all = AMitemsRewound(&range_back_all); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "b", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* First */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "a", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Back stop */ + assert_null(AMitemsNext(&range_back_all, 1)); +} + +static void test_map_range_back_and_forth_double(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + AMactorId const* actor_id1; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromBytes("\0", 1), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id1)); + AMstackItem(NULL, AMsetActorId(doc1, actor_id1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("1"), AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("2"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("3"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + /* The second actor should win all conflicts here. */ + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + AMactorId const* actor_id2; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromBytes("\1", 1), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id2)); + AMstackItem(NULL, AMsetActorId(doc2, actor_id2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("1"), AMstr("aa")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("2"), AMstr("bb")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("3"), AMstr("cc")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + AMstackItem(NULL, AMmerge(doc1, doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + /* Forward, back, back. */ + AMitems range_all = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + /* First */ + AMitem* next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + AMbyteSpan str; + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + AMobjId const* next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + AMitems range_back_all = AMitemsReversed(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + AMitem* next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + AMbyteSpan str_back; + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + AMobjId const* next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "bb", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + + /* Forward, back, forward. */ + range_all = AMitemsRewound(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "bb", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + + /* Forward, forward, forward. */ + range_all = AMitemsRewound(&range_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "bb", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "cc", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Forward stop */ + assert_null(AMitemsNext(&range_all, 1)); + + /* Back, back, back. */ + range_back_all = AMitemsRewound(&range_back_all); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "bb", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* First */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "aa", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Back stop */ + assert_null(AMitemsNext(&range_back_all, 1)); +} + +static void test_map_range_at_back_and_forth_single(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + AMactorId const* actor_id; + assert_true(AMitemToActorId(AMstackItem(stack_ptr, AMgetActorId(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("1"), AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("2"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("3"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + AMitems const heads = AMstackItems(stack_ptr, AMgetHeads(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + /* Forward, back, back. */ + AMitems range_all = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + /* First */ + AMitem* next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + AMbyteSpan str; + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + AMobjId const* next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + AMitems range_back_all = AMitemsReversed(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + AMitem* next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + AMbyteSpan str_back; + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + AMobjId const* next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "b", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + + /* Forward, back, forward. */ + range_all = AMitemsRewound(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + + /* Forward, forward, forward. */ + range_all = AMitemsRewound(&range_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Third */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 0); + /* Forward stop */ + assert_null(AMitemsNext(&range_all, 1)); + + /* Back, back, back. */ + range_back_all = AMitemsRewound(&range_back_all); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "c", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "b", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* First */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 1); + assert_memory_equal(str_back.src, "a", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 0); + /* Back stop */ + assert_null(AMitemsNext(&range_back_all, 1)); +} + +static void test_map_range_at_back_and_forth_double(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + AMactorId const* actor_id1; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromBytes("\0", 1), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id1)); + AMstackItem(NULL, AMsetActorId(doc1, actor_id1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("1"), AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("2"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("3"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + /* The second actor should win all conflicts here. */ + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + AMactorId const* actor_id2; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromBytes("\1", 1), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id2)); + AMstackItem(NULL, AMsetActorId(doc2, actor_id2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("1"), AMstr("aa")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("2"), AMstr("bb")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("3"), AMstr("cc")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + + AMstackItem(NULL, AMmerge(doc1, doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems const heads = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + /* Forward, back, back. */ + AMitems range_all = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + /* First */ + AMitem* next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + AMbyteSpan str; + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + AMobjId const* next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + AMitems range_back_all = AMitemsReversed(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + AMitem* next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + AMbyteSpan str_back; + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + AMobjId const* next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "bb", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + + /* Forward, back, forward. */ + range_all = AMitemsRewound(&range_all); + range_back_all = AMitemsRewound(&range_back_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "bb", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + + /* Forward, forward, forward. */ + range_all = AMitemsRewound(&range_all); + /* First */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "aa", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Second */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "bb", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Third */ + next = AMitemsNext(&range_all, 1); + assert_non_null(next); + assert_int_equal(AMitemIdxType(next), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next, &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "cc", str.count); + next_obj_id = AMitemObjId(next); + assert_int_equal(AMobjIdCounter(next_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_obj_id), 1); + /* Forward stop */ + assert_null(AMitemsNext(&range_all, 1)); + + /* Back, back, back. */ + range_back_all = AMitemsRewound(&range_back_all); + /* Third */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "3", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "cc", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 3); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Second */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "2", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "bb", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 2); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* First */ + next_back = AMitemsNext(&range_back_all, 1); + assert_non_null(next_back); + assert_int_equal(AMitemIdxType(next_back), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(next_back, &key)); + assert_int_equal(key.count, 1); + assert_memory_equal(key.src, "1", key.count); + assert_int_equal(AMitemValType(next_back), AM_VAL_TYPE_STR); + assert_true(AMitemToStr(next_back, &str_back)); + assert_int_equal(str_back.count, 2); + assert_memory_equal(str_back.src, "aa", str_back.count); + next_back_obj_id = AMitemObjId(next_back); + assert_int_equal(AMobjIdCounter(next_back_obj_id), 1); + assert_int_equal(AMactorIdCmp(AMobjIdActorId(next_back_obj_id), actor_id2), 0); + assert_int_equal(AMobjIdIndex(next_back_obj_id), 1); + /* Back stop */ + assert_null(AMitemsNext(&range_back_all, 1)); +} + +static void test_get_range_values(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("aa"), AMstr("aaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("bb"), AMstr("bbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("cc"), AMstr("ccc")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("dd"), AMstr("ddd")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMitems const v1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(doc1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("cc"), AMstr("ccc V2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc1, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("cc"), AMstr("ccc V3")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(doc2, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + AMstackItem(NULL, AMmerge(doc1, doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + + /* Forward vs. reverse: complete current map range. */ + AMitems range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + size_t size = AMitemsSize(&range); + assert_int_equal(size, 4); + AMitems range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + AMbyteSpan key; + assert_true(AMitemKey(AMitemsNext(&range, 1), &key)); + assert_memory_equal(key.src, "aa", key.count); + assert_true(AMitemKey(AMitemsNext(&range_back, 1), &key)); + assert_memory_equal(key.src, "dd", key.count); + + AMitem *item1, *item_back1; + size_t count, middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + AMbyteSpan key1, key_back1; + assert_true(AMitemKey(item1, &key1)); + assert_true(AMitemKey(item_back1, &key_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(AMstrCmp(key1, key_back1), 0); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(AMstrCmp(key1, key_back1), 0); + } + AMitem* item2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key1, NULL), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key_back1, NULL), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: partial current map range. */ + range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr("aa"), AMstr("dd"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 3); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemKey(AMitemsNext(&range, 1), &key)); + assert_memory_equal(key.src, "aa", key.count); + assert_true(AMitemKey(AMitemsNext(&range_back, 1), &key)); + assert_memory_equal(key.src, "cc", key.count); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + AMbyteSpan key1, key_back1; + assert_true(AMitemKey(item1, &key1)); + assert_true(AMitemKey(item_back1, &key_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(AMstrCmp(key1, key_back1), 0); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(AMstrCmp(key1, key_back1), 0); + } + AMitem* item2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key1, NULL), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key_back1, NULL), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: complete historical map range. */ + range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), &v1), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 4); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemKey(AMitemsNext(&range, 1), &key)); + assert_memory_equal(key.src, "aa", key.count); + assert_true(AMitemKey(AMitemsNext(&range_back, 1), &key)); + assert_memory_equal(key.src, "dd", key.count); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + AMbyteSpan key1, key_back1; + assert_true(AMitemKey(item1, &key1)); + assert_true(AMitemKey(item_back1, &key_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(AMstrCmp(key1, key_back1), 0); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(AMstrCmp(key1, key_back1), 0); + } + AMitem* item2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key1, &v1), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key_back1, &v1), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Forward vs. reverse: partial historical map range. */ + range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr("bb"), AMstr(NULL), &v1), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + size = AMitemsSize(&range); + assert_int_equal(size, 3); + range_back = AMitemsReversed(&range); + assert_int_equal(AMitemsSize(&range_back), size); + assert_true(AMitemKey(AMitemsNext(&range, 1), &key)); + assert_memory_equal(key.src, "bb", key.count); + assert_true(AMitemKey(AMitemsNext(&range_back, 1), &key)); + assert_memory_equal(key.src, "dd", key.count); + + middle = size / 2; + range = AMitemsRewound(&range); + range_back = AMitemsRewound(&range_back); + for (item1 = NULL, item_back1 = NULL, count = 0; item1 && item_back1; + item1 = AMitemsNext(&range, 1), item_back1 = AMitemsNext(&range_back, 1), ++count) { + AMbyteSpan key1, key_back1; + assert_true(AMitemKey(item1, &key1)); + assert_true(AMitemKey(item_back1, &key_back1)); + if ((count == middle) && (middle & 1)) { + /* The iterators are crossing in the middle. */ + assert_int_equal(AMstrCmp(key1, key_back1), 0); + assert_true(AMitemEqual(item1, item_back1)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item_back1))); + } else { + assert_int_not_equal(AMstrCmp(key1, key_back1), 0); + } + AMitem* item2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key1, &v1), NULL, NULL); + AMitem* item_back2 = AMstackItem(stack_ptr, AMmapGet(doc1, AM_ROOT, key_back1, &v1), NULL, NULL); + /** \note An item returned from an `AM...Get()` call doesn't include the + index used to retrieve it. */ + assert_false(AMitemIdxType(item2)); + assert_false(AMitemIdxType(item_back2)); + assert_true(AMitemEqual(item1, item2)); + assert_true(AMobjIdEqual(AMitemObjId(item1), AMitemObjId(item2))); + assert_true(AMitemEqual(item_back1, item_back2)); + assert_true(AMobjIdEqual(AMitemObjId(item_back1), AMitemObjId(item_back2))); + AMresultFree(AMstackPop(stack_ptr, NULL)); + } + + /* Map range vs. object range: complete current. */ + range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + AMitems obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&range), AMitemsSize(&obj_items)); + + AMitem *item, *obj_item; + for (item = NULL, obj_item = NULL; item && obj_item; + item = AMitemsNext(&range, 1), obj_item = AMitemsNext(&obj_items, 1)) { + /** \note Object iteration doesn't yield any item indices. */ + assert_true(AMitemIdxType(item)); + assert_false(AMitemIdxType(obj_item)); + assert_true(AMitemEqual(item, obj_item)); + assert_true(AMobjIdEqual(AMitemObjId(item), AMitemObjId(obj_item))); + } + + /* Map range vs. object range: complete historical. */ + range = AMstackItems(stack_ptr, AMmapRange(doc1, AM_ROOT, AMstr(NULL), AMstr(NULL), &v1), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, AM_ROOT, &v1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&range), AMitemsSize(&obj_items)); + + for (item = NULL, obj_item = NULL; item && obj_item; + item = AMitemsNext(&range, 1), obj_item = AMitemsNext(&obj_items, 1)) { + /** \note Object iteration doesn't yield any item indices. */ + assert_true(AMitemIdxType(item)); + assert_false(AMitemIdxType(obj_item)); + assert_true(AMitemEqual(item, obj_item)); + assert_true(AMobjIdEqual(AMitemObjId(item), AMitemObjId(obj_item))); + } +} + +int run_map_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_AMmapIncrement), + cmocka_unit_test(test_AMmapPut(Bool)), + cmocka_unit_test(test_AMmapPutBytes), + cmocka_unit_test(test_AMmapPut(Counter)), + cmocka_unit_test(test_AMmapPut(F64)), + cmocka_unit_test(test_AMmapPut(Int)), + cmocka_unit_test(test_AMmapPutNull), + cmocka_unit_test(test_AMmapPutObject(List)), + cmocka_unit_test(test_AMmapPutObject(Map)), + cmocka_unit_test(test_AMmapPutObject(Text)), + cmocka_unit_test(test_AMmapPutStr), + cmocka_unit_test(test_AMmapPut(Timestamp)), + cmocka_unit_test(test_AMmapPut(Uint)), + cmocka_unit_test_setup_teardown(test_get_NUL_key, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_get_NUL_string_value, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_range_iter_map, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_map_range_back_and_forth_single, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_map_range_back_and_forth_double, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_map_range_at_back_and_forth_single, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_map_range_at_back_and_forth_double, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_get_range_values, setup_base, teardown_base), + }; + + return cmocka_run_group_tests(tests, setup_doc, teardown_doc); +} diff --git a/rust/automerge-c/test/ported_wasm/basic_tests.c b/rust/automerge-c/test/ported_wasm/basic_tests.c new file mode 100644 index 00000000..b83ff132 --- /dev/null +++ b/rust/automerge-c/test/ported_wasm/basic_tests.c @@ -0,0 +1,1642 @@ +#include +#include +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include +#include "../base_state.h" +#include "../cmocka_utils.h" + +/** + * \brief default import init() should return a promise + */ +static void test_default_import_init_should_return_a_promise(void** state); + +/** + * \brief should create, clone and free + */ +static void test_create_clone_and_free(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc1 = create() */ + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + /* const doc2 = doc1.clone() */ + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMclone(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); +} + +/** + * \brief should be able to start and commit + */ +static void test_start_and_commit(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* doc.commit() */ + AMstackItems(stack_ptr, AMemptyChange(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); +} + +/** + * \brief getting a nonexistent prop does not throw an error + */ +static void test_getting_a_nonexistent_prop_does_not_throw_an_error(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* const result = doc.getWithType(root, "hello") */ + /* assert.deepEqual(result, undefined) */ + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("hello"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); +} + +/** + * \brief should be able to set and get a simple value + */ +static void test_should_be_able_to_set_and_get_a_simple_value(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc: Automerge = create("aabbcc") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aabbcc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* let result */ + /* */ + /* doc.put(root, "hello", "world") */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("hello"), AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "number1", 5, "uint") */ + AMstackItem(NULL, AMmapPutUint(doc, AM_ROOT, AMstr("number1"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "number2", 5) */ + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("number2"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "number3", 5.5) */ + AMstackItem(NULL, AMmapPutF64(doc, AM_ROOT, AMstr("number3"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "number4", 5.5, "f64") */ + AMstackItem(NULL, AMmapPutF64(doc, AM_ROOT, AMstr("number4"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "number5", 5.5, "int") */ + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("number5"), 5.5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "bool", true) */ + AMstackItem(NULL, AMmapPutBool(doc, AM_ROOT, AMstr("bool"), true), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "time1", 1000, "timestamp") */ + AMstackItem(NULL, AMmapPutTimestamp(doc, AM_ROOT, AMstr("time1"), 1000), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put(root, "time2", new Date(1001)) */ + AMstackItem(NULL, AMmapPutTimestamp(doc, AM_ROOT, AMstr("time2"), 1001), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.putObject(root, "list", []); */ + AMstackItem(NULL, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + /* doc.put(root, "null", null) */ + AMstackItem(NULL, AMmapPutNull(doc, AM_ROOT, AMstr("null")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* result = doc.getWithType(root, "hello") */ + /* assert.deepEqual(result, ["str", "world"]) */ + /* assert.deepEqual(doc.get("/", "hello"), "world") */ + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("hello"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), + &str)); + assert_int_equal(str.count, strlen("world")); + assert_memory_equal(str.src, "world", str.count); + /* assert.deepEqual(doc.get("/", "hello"), "world") */ + /* */ + /* result = doc.getWithType(root, "number1") */ + /* assert.deepEqual(result, ["uint", 5]) */ + uint64_t uint; + assert_true(AMitemToUint( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number1"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 5); + /* assert.deepEqual(doc.get("/", "number1"), 5) */ + /* */ + /* result = doc.getWithType(root, "number2") */ + /* assert.deepEqual(result, ["int", 5]) */ + int64_t int_; + assert_true(AMitemToInt( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number2"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_INT)), + &int_)); + assert_int_equal(int_, 5); + /* */ + /* result = doc.getWithType(root, "number3") */ + /* assert.deepEqual(result, ["f64", 5.5]) */ + double f64; + assert_true(AMitemToF64( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number3"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_F64)), + &f64)); + assert_float_equal(f64, 5.5, DBL_EPSILON); + /* */ + /* result = doc.getWithType(root, "number4") */ + /* assert.deepEqual(result, ["f64", 5.5]) */ + assert_true(AMitemToF64( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number4"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_F64)), + &f64)); + assert_float_equal(f64, 5.5, DBL_EPSILON); + /* */ + /* result = doc.getWithType(root, "number5") */ + /* assert.deepEqual(result, ["int", 5]) */ + assert_true(AMitemToInt( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("number5"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_INT)), + &int_)); + assert_int_equal(int_, 5); + /* */ + /* result = doc.getWithType(root, "bool") */ + /* assert.deepEqual(result, ["boolean", true]) */ + bool boolean; + assert_true(AMitemToBool( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("bool"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BOOL)), + &boolean)); + assert_true(boolean); + /* */ + /* doc.put(root, "bool", false, "boolean") */ + AMstackItem(NULL, AMmapPutBool(doc, AM_ROOT, AMstr("bool"), false), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* result = doc.getWithType(root, "bool") */ + /* assert.deepEqual(result, ["boolean", false]) */ + assert_true(AMitemToBool( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("bool"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BOOL)), + &boolean)); + assert_false(boolean); + /* */ + /* result = doc.getWithType(root, "time1") */ + /* assert.deepEqual(result, ["timestamp", new Date(1000)]) */ + int64_t timestamp; + assert_true(AMitemToTimestamp(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("time1"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_TIMESTAMP)), + ×tamp)); + assert_int_equal(timestamp, 1000); + /* */ + /* result = doc.getWithType(root, "time2") */ + /* assert.deepEqual(result, ["timestamp", new Date(1001)]) */ + assert_true(AMitemToTimestamp(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("time2"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_TIMESTAMP)), + ×tamp)); + assert_int_equal(timestamp, 1001); + /* */ + /* result = doc.getWithType(root, "list") */ + /* assert.deepEqual(result, ["list", "10@aabbcc"]); */ + AMobjId const* const list = AMitemObjId( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("list"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + assert_int_equal(AMobjIdCounter(list), 10); + str = AMactorIdStr(AMobjIdActorId(list)); + assert_int_equal(str.count, strlen("aabbcc")); + assert_memory_equal(str.src, "aabbcc", str.count); + /* */ + /* result = doc.getWithType(root, "null") */ + /* assert.deepEqual(result, ["null", null]); */ + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("null"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_NULL)); +} + +/** + * \brief should be able to use bytes + */ +static void test_should_be_able_to_use_bytes(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* doc.put("_root", "data1", new Uint8Array([10, 11, 12])); */ + static uint8_t const DATA1[] = {10, 11, 12}; + AMstackItem(NULL, AMmapPutBytes(doc, AM_ROOT, AMstr("data1"), AMbytes(DATA1, sizeof(DATA1))), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put("_root", "data2", new Uint8Array([13, 14, 15]), "bytes"); */ + static uint8_t const DATA2[] = {13, 14, 15}; + AMstackItem(NULL, AMmapPutBytes(doc, AM_ROOT, AMstr("data2"), AMbytes(DATA2, sizeof(DATA2))), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* const value1 = doc.getWithType("_root", "data1") */ + AMbyteSpan value1; + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("data1"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), + &value1)); + /* assert.deepEqual(value1, ["bytes", new Uint8Array([10, 11, 12])]); */ + assert_int_equal(value1.count, sizeof(DATA1)); + assert_memory_equal(value1.src, DATA1, sizeof(DATA1)); + /* const value2 = doc.getWithType("_root", "data2") */ + AMbyteSpan value2; + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("data2"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), + &value2)); + /* assert.deepEqual(value2, ["bytes", new Uint8Array([13, 14, 15])]); */ + assert_int_equal(value2.count, sizeof(DATA2)); + assert_memory_equal(value2.src, DATA2, sizeof(DATA2)); +} + +/** + * \brief should be able to make subobjects + */ +static void test_should_be_able_to_make_subobjects(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* let result */ + /* */ + /* const submap = doc.putObject(root, "submap", {}) */ + AMobjId const* const submap = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("submap"), AM_OBJ_TYPE_MAP), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc.put(submap, "number", 6, "uint") */ + AMstackItem(NULL, AMmapPutUint(doc, submap, AMstr("number"), 6), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.strictEqual(doc.pendingOps(), 2) */ + assert_int_equal(AMpendingOps(doc), 2); + /* */ + /* result = doc.getWithType(root, "submap") */ + /* assert.deepEqual(result, ["map", submap]) */ + assert_true(AMobjIdEqual(AMitemObjId(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("submap"), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))), + submap)); + /* */ + /* result = doc.getWithType(submap, "number") */ + /* assert.deepEqual(result, ["uint", 6]) */ + uint64_t uint; + assert_true(AMitemToUint( + AMstackItem(stack_ptr, AMmapGet(doc, submap, AMstr("number"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 6); +} + +/** + * \brief should be able to make lists + */ +static void test_should_be_able_to_make_lists(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* */ + /* const sublist = doc.putObject(root, "numbers", []) */ + AMobjId const* const sublist = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("numbers"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc.insert(sublist, 0, "a"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.insert(sublist, 1, "b"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 1, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.insert(sublist, 2, "c"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 2, true, AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.insert(sublist, 0, "z"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("z")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* assert.deepEqual(doc.getWithType(sublist, 0), ["str", "z"]) */ + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, sublist, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "z", str.count); + /* assert.deepEqual(doc.getWithType(sublist, 1), ["str", "a"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, sublist, 1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + /* assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, sublist, 2, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + /* assert.deepEqual(doc.getWithType(sublist, 3), ["str", "c"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, sublist, 3, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + /* assert.deepEqual(doc.length(sublist), 4) */ + assert_int_equal(AMobjSize(doc, sublist, NULL), 4); + /* */ + /* doc.put(sublist, 2, "b v2"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 2, false, AMstr("b v2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b v2"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, sublist, 2, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "b v2", str.count); + /* assert.deepEqual(doc.length(sublist), 4) */ + assert_int_equal(AMobjSize(doc, sublist, NULL), 4); +} + +/** + * \brief lists have insert, set, splice, and push ops + */ +static void test_lists_have_insert_set_splice_and_push_ops(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* */ + /* const sublist = doc.putObject(root, "letters", []) */ + AMobjId const* const sublist = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("letters"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc.insert(sublist, 0, "a"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.insert(sublist, 0, "b"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.materialize(), { letters: ["b", "a"] }) */ + AMitem* doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&list_items), 2); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_null(AMitemsNext(&list_items, 1)); + } + /* doc.push(sublist, "c"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, SIZE_MAX, true, AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const heads = doc.getHeads() */ + AMitems const heads = AMstackItems(stack_ptr, AMgetHeads(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c"] }) */ + doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&list_items), 3); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + assert_null(AMitemsNext(&list_items, 1)); + } + /* doc.push(sublist, 3, "timestamp"); */ + AMstackItem(NULL, AMlistPutTimestamp(doc, sublist, SIZE_MAX, true, 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c", new + * Date(3)] } */ + doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP)); + assert_int_equal(AMitemsSize(&list_items), 4); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + int64_t timestamp; + assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), ×tamp)); + assert_int_equal(timestamp, 3); + assert_null(AMitemsNext(&list_items, 1)); + } + /* doc.splice(sublist, 1, 1, ["d", "e", "f"]); */ + AMresult* data = AMstackResult( + stack_ptr, AMresultFrom(3, AMitemFromStr(AMstr("d")), AMitemFromStr(AMstr("e")), AMitemFromStr(AMstr("f"))), + NULL, NULL); + AMstackItem(NULL, AMsplice(doc, sublist, 1, 1, AMresultItems(data)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.materialize(), { letters: ["b", "d", "e", "f", "c", + * new Date(3)] } */ + doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "d", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "e", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "f", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + int64_t timestamp; + assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), ×tamp)); + assert_int_equal(timestamp, 3); + assert_null(AMitemsNext(&list_items, 1)); + } + /* doc.put(sublist, 0, "z"); */ + AMstackItem(NULL, AMlistPutStr(doc, sublist, 0, false, AMstr("z")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.materialize(), { letters: ["z", "d", "e", "f", "c", + * new Date(3)] } */ + doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "z", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "d", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "e", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "f", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + int64_t timestamp; + assert_true(AMitemToTimestamp(AMitemsNext(&list_items, 1), ×tamp)); + assert_int_equal(timestamp, 3); + assert_null(AMitemsNext(&list_items, 1)); + } + /* assert.deepEqual(doc.materialize(sublist), ["z", "d", "e", "f", "c", new + * Date(3)] */ + AMitems sublist_items = AMstackItems(stack_ptr, AMlistRange(doc, sublist, 0, SIZE_MAX, NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR | AM_VAL_TYPE_TIMESTAMP)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "z", str.count); + assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "d", str.count); + assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "e", str.count); + assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "f", str.count); + assert_true(AMitemToStr(AMitemsNext(&sublist_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + int64_t timestamp; + assert_true(AMitemToTimestamp(AMitemsNext(&sublist_items, 1), ×tamp)); + assert_int_equal(timestamp, 3); + assert_null(AMitemsNext(&sublist_items, 1)); + /* assert.deepEqual(doc.length(sublist), 6) */ + assert_int_equal(AMobjSize(doc, sublist, NULL), 6); + /* assert.deepEqual(doc.materialize("/", heads), { letters: ["b", "a", "c"] + * } */ + doc_item = AMstackItem(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("letters")); + assert_memory_equal(key.src, "letters", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, &heads), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "c", str.count); + assert_null(AMitemsNext(&list_items, 1)); + } +} + +/** + * \brief should be able to delete non-existent props + */ +static void test_should_be_able_to_delete_non_existent_props(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* */ + /* doc.put("_root", "foo", "bar") */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put("_root", "bip", "bap") */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("bip"), AMstr("bap")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const hash1 = doc.commit() */ + AMitems const hash1 = + AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* assert.deepEqual(doc.keys("_root"), ["bip", "foo"]) */ + AMitems keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bip", str.count); + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "foo", str.count); + /* */ + /* doc.delete("_root", "foo") */ + AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("foo")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.delete("_root", "baz") */ + AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("baz")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const hash2 = doc.commit() */ + AMitems const hash2 = + AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* assert.deepEqual(doc.keys("_root"), ["bip"]) */ + keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bip", str.count); + /* assert.deepEqual(doc.keys("_root", [hash1]), ["bip", "foo"]) */ + keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, &hash1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bip", str.count); + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "foo", str.count); + /* assert.deepEqual(doc.keys("_root", [hash2]), ["bip"]) */ + keys = AMstackItems(stack_ptr, AMkeys(doc, AM_ROOT, &hash2), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bip", str.count); +} + +/** + * \brief should be able to del + */ +static void test_should_be_able_to_del(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* */ + /* doc.put(root, "xxx", "xxx"); */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("xxx"), AMstr("xxx")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(root, "xxx"), ["str", "xxx"]) */ + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("xxx"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), + &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "xxx", str.count); + /* doc.delete(root, "xxx"); */ + AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("xxx")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(root, "xxx"), undefined) */ + AMstackItem(NULL, AMmapGet(doc, AM_ROOT, AMstr("xxx"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); +} + +/** + * \brief should be able to use counters + */ +static void test_should_be_able_to_use_counters(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root" */ + /* */ + /* doc.put(root, "counter", 10, "counter"); */ + AMstackItem(NULL, AMmapPutCounter(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 10]) */ + int64_t counter; + assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 10); + /* doc.increment(root, "counter", 10); */ + AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 20]) */ + assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 20); + /* doc.increment(root, "counter", -5); */ + AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), -5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 15]) */ + assert_true(AMitemToCounter(AMstackItem(stack_ptr, AMmapGet(doc, AM_ROOT, AMstr("counter"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER)), + &counter)); + assert_int_equal(counter, 15); +} + +/** + * \brief should be able to splice text + */ +static void test_should_be_able_to_splice_text(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const root = "_root"; */ + /* */ + /* const text = doc.putObject(root, "text", ""); */ + AMobjId const* const text = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc.splice(text, 0, 0, "hello ") */ + AMstackItem(NULL, AMspliceText(doc, text, 0, 0, AMstr("hello ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.splice(text, 6, 0, "world") */ + AMstackItem(NULL, AMspliceText(doc, text, 6, 0, AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.splice(text, 11, 0, "!?") */ + AMstackItem(NULL, AMspliceText(doc, text, 11, 0, AMstr("!?")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.getWithType(text, 0), ["str", "h"]) */ + AMbyteSpan str; + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "h", str.count); + /* assert.deepEqual(doc.getWithType(text, 1), ["str", "e"]) */ + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "e", str.count); + /* assert.deepEqual(doc.getWithType(text, 9), ["str", "l"]) */ + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMlistGet(doc, text, 9, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "l", str.count); + /* assert.deepEqual(doc.getWithType(text, 10), ["str", "d"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, text, 10, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "d", str.count); + /* assert.deepEqual(doc.getWithType(text, 11), ["str", "!"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, text, 11, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "!", str.count); + /* assert.deepEqual(doc.getWithType(text, 12), ["str", "?"]) */ + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMlistGet(doc, text, 12, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "?", str.count); +} + +/** + * \brief should be able to save all or incrementally + */ +static void test_should_be_able_to_save_all_or_incrementally(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* */ + /* doc.put("_root", "foo", 1) */ + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("foo"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* const save1 = doc.save() */ + AMbyteSpan save1; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1)); + /* */ + /* doc.put("_root", "bar", 2) */ + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("bar"), 2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* const saveMidway = doc.clone().save(); */ + AMdoc* doc_clone; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMclone(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc_clone)); + AMbyteSpan saveMidway; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc_clone), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saveMidway)); + /* */ + /* const save2 = doc.saveIncremental(); */ + AMbyteSpan save2; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsaveIncremental(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save2)); + /* */ + /* doc.put("_root", "baz", 3); */ + AMstackItem(NULL, AMmapPutInt(doc, AM_ROOT, AMstr("baz"), 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* const save3 = doc.saveIncremental(); */ + AMbyteSpan save3; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsaveIncremental(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save3)); + /* */ + /* const saveA = doc.save(); */ + AMbyteSpan saveA; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saveA)); + /* const saveB = new Uint8Array([...save1, ...save2, ...save3]); */ + size_t const saveB_count = save1.count + save2.count + save3.count; + uint8_t* const saveB_src = test_malloc(saveB_count); + memcpy(saveB_src, save1.src, save1.count); + memcpy(saveB_src + save1.count, save2.src, save2.count); + memcpy(saveB_src + save1.count + save2.count, save3.src, save3.count); + /* */ + /* assert.notDeepEqual(saveA, saveB); */ + assert_memory_not_equal(saveA.src, saveB_src, saveA.count); + /* */ + /* const docA = load(saveA); */ + AMdoc* docA; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(saveA.src, saveA.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docA)); + /* const docB = load(saveB); */ + AMdoc* docB; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(saveB_src, saveB_count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docB)); + test_free(saveB_src); + /* const docC = load(saveMidway) */ + AMdoc* docC; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(saveMidway.src, saveMidway.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &docC)); + /* docC.loadIncremental(save3) */ + AMstackItem(NULL, AMloadIncremental(docC, save3.src, save3.count), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)); + /* */ + /* assert.deepEqual(docA.keys("_root"), docB.keys("_root")); */ + AMitems const keysA = AMstackItems(stack_ptr, AMkeys(docA, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMitems const keysB = AMstackItems(stack_ptr, AMkeys(docB, AM_ROOT, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemsEqual(&keysA, &keysB)); + /* assert.deepEqual(docA.save(), docB.save()); */ + AMbyteSpan docA_save; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(docA), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docA_save)); + AMbyteSpan docB_save; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(docB), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docB_save)); + assert_int_equal(docA_save.count, docB_save.count); + assert_memory_equal(docA_save.src, docB_save.src, docA_save.count); + /* assert.deepEqual(docA.save(), docC.save()); */ + AMbyteSpan docC_save; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(docC), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &docC_save)); + assert_int_equal(docA_save.count, docC_save.count); + assert_memory_equal(docA_save.src, docC_save.src, docA_save.count); +} + +/** + * \brief should be able to splice text #2 + */ +static void test_should_be_able_to_splice_text_2(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create() */ + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const text = doc.putObject("_root", "text", ""); */ + AMobjId const* const text = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc.splice(text, 0, 0, "hello world"); */ + AMstackItem(NULL, AMspliceText(doc, text, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const hash1 = doc.commit(); */ + AMitems const hash1 = + AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* doc.splice(text, 6, 0, "big bad "); */ + AMstackItem(NULL, AMspliceText(doc, text, 6, 0, AMstr("big bad ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const hash2 = doc.commit(); */ + AMitems const hash2 = + AMstackItems(stack_ptr, AMcommit(doc, AMstr(NULL), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* assert.strictEqual(doc.text(text), "hello big bad world") */ + AMbyteSpan str; + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello big bad world")); + assert_memory_equal(str.src, "hello big bad world", str.count); + /* assert.strictEqual(doc.length(text), 19) */ + assert_int_equal(AMobjSize(doc, text, NULL), 19); + /* assert.strictEqual(doc.text(text, [hash1]), "hello world") */ + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, &hash1), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello world")); + assert_memory_equal(str.src, "hello world", str.count); + /* assert.strictEqual(doc.length(text, [hash1]), 11) */ + assert_int_equal(AMobjSize(doc, text, &hash1), 11); + /* assert.strictEqual(doc.text(text, [hash2]), "hello big bad world") */ + assert_true( + AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, text, &hash2), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello big bad world")); + assert_memory_equal(str.src, "hello big bad world", str.count); + /* assert.strictEqual(doc.length(text, [hash2]), 19) */ + assert_int_equal(AMobjSize(doc, text, &hash2), 19); +} + +/** + * \brief local inc increments all visible counters in a map + */ +static void test_local_inc_increments_all_visible_counters_in_a_map(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc1 = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + /* doc1.put("_root", "hello", "world") */ + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("hello"), AMstr("world")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* const doc2 = load(doc1.save(), "bbbb"); */ + AMbyteSpan save; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save)); + AMdoc* doc2; + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMstackItem(NULL, AMsetActorId(doc2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const doc3 = load(doc1.save(), "cccc"); */ + AMdoc* doc3; + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc3)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("cccc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMstackItem(NULL, AMsetActorId(doc3, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* let heads = doc1.getHeads() */ + AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* doc1.put("_root", "cnt", 20) */ + AMstackItem(NULL, AMmapPutInt(doc1, AM_ROOT, AMstr("cnt"), 20), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc2.put("_root", "cnt", 0, "counter") */ + AMstackItem(NULL, AMmapPutCounter(doc2, AM_ROOT, AMstr("cnt"), 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc3.put("_root", "cnt", 10, "counter") */ + AMstackItem(NULL, AMmapPutCounter(doc3, AM_ROOT, AMstr("cnt"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc1.applyChanges(doc2.getChanges(heads)) */ + AMitems const changes2 = + AMstackItems(stack_ptr, AMgetChanges(doc2, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMstackItem(NULL, AMapplyChanges(doc1, &changes2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc1.applyChanges(doc3.getChanges(heads)) */ + AMitems const changes3 = + AMstackItems(stack_ptr, AMgetChanges(doc3, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMstackItem(NULL, AMapplyChanges(doc1, &changes3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* let result = doc1.getAll("_root", "cnt") */ + AMitems result = AMstackItems(stack_ptr, AMmapGetAll(doc1, AM_ROOT, AMstr("cnt"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER | AM_VAL_TYPE_INT | AM_VAL_TYPE_STR)); + /* assert.deepEqual(result, [ + ['int', 20, '2@aaaa'], + ['counter', 0, '2@bbbb'], + ['counter', 10, '2@cccc'], + ]) */ + AMitem* result_item = AMitemsNext(&result, 1); + int64_t int_; + assert_true(AMitemToInt(result_item, &int_)); + assert_int_equal(int_, 20); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2); + AMbyteSpan str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "aaaa", str.count); + result_item = AMitemsNext(&result, 1); + int64_t counter; + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 0); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "bbbb", str.count); + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 10); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "cccc", str.count); + /* doc1.increment("_root", "cnt", 5) */ + AMstackItem(NULL, AMmapIncrement(doc1, AM_ROOT, AMstr("cnt"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* result = doc1.getAll("_root", "cnt") */ + result = AMstackItems(stack_ptr, AMmapGetAll(doc1, AM_ROOT, AMstr("cnt"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER)); + /* assert.deepEqual(result, [ + ['counter', 5, '2@bbbb'], + ['counter', 15, '2@cccc'], + ]) */ + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 5); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "bbbb", str.count); + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 15); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 2); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "cccc", str.count); + /* */ + /* const save1 = doc1.save() */ + AMbyteSpan save1; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1)); + /* const doc4 = load(save1) */ + AMdoc* doc4; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc4)); + /* assert.deepEqual(doc4.save(), save1); */ + AMbyteSpan doc4_save; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc4), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &doc4_save)); + assert_int_equal(doc4_save.count, save1.count); + assert_memory_equal(doc4_save.src, save1.src, doc4_save.count); +} + +/** + * \brief local inc increments all visible counters in a sequence + */ +static void test_local_inc_increments_all_visible_counters_in_a_sequence(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc1 = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + /* const seq = doc1.putObject("_root", "seq", []) */ + AMobjId const* const seq = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("seq"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* doc1.insert(seq, 0, "hello") */ + AMstackItem(NULL, AMlistPutStr(doc1, seq, 0, true, AMstr("hello")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const doc2 = load(doc1.save(), "bbbb"); */ + AMbyteSpan save1; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save1)); + AMdoc* doc2; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMstackItem(NULL, AMsetActorId(doc2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const doc3 = load(doc1.save(), "cccc"); */ + AMdoc* doc3; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(save1.src, save1.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc3)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("cccc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMstackItem(NULL, AMsetActorId(doc3, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* let heads = doc1.getHeads() */ + AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* doc1.put(seq, 0, 20) */ + AMstackItem(NULL, AMlistPutInt(doc1, seq, 0, false, 20), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc2.put(seq, 0, 0, "counter") */ + AMstackItem(NULL, AMlistPutCounter(doc2, seq, 0, false, 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc3.put(seq, 0, 10, "counter") */ + AMstackItem(NULL, AMlistPutCounter(doc3, seq, 0, false, 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc1.applyChanges(doc2.getChanges(heads)) */ + AMitems const changes2 = + AMstackItems(stack_ptr, AMgetChanges(doc2, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMstackItem(NULL, AMapplyChanges(doc1, &changes2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc1.applyChanges(doc3.getChanges(heads)) */ + AMitems const changes3 = + AMstackItems(stack_ptr, AMgetChanges(doc3, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMstackItem(NULL, AMapplyChanges(doc1, &changes3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* let result = doc1.getAll(seq, 0) */ + AMitems result = AMstackItems(stack_ptr, AMlistGetAll(doc1, seq, 0, NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_COUNTER | AM_VAL_TYPE_INT)); + /* assert.deepEqual(result, [ + ['int', 20, '3@aaaa'], + ['counter', 0, '3@bbbb'], + ['counter', 10, '3@cccc'], + ]) */ + AMitem* result_item = AMitemsNext(&result, 1); + int64_t int_; + assert_true(AMitemToInt(result_item, &int_)); + assert_int_equal(int_, 20); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3); + AMbyteSpan str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "aaaa", str.count); + result_item = AMitemsNext(&result, 1); + int64_t counter; + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 0); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_memory_equal(str.src, "bbbb", str.count); + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 10); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "cccc", str.count); + /* doc1.increment(seq, 0, 5) */ + AMstackItem(NULL, AMlistIncrement(doc1, seq, 0, 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* result = doc1.getAll(seq, 0) */ + result = AMstackItems(stack_ptr, AMlistGetAll(doc1, seq, 0, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_COUNTER)); + /* assert.deepEqual(result, [ + ['counter', 5, '3@bbbb'], + ['counter', 15, '3@cccc'], + ]) */ + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 5); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "bbbb", str.count); + result_item = AMitemsNext(&result, 1); + assert_true(AMitemToCounter(result_item, &counter)); + assert_int_equal(counter, 15); + assert_int_equal(AMobjIdCounter(AMitemObjId(result_item)), 3); + str = AMactorIdStr(AMobjIdActorId(AMitemObjId(result_item))); + assert_memory_equal(str.src, "cccc", str.count); + /* */ + /* const save = doc1.save() */ + AMbyteSpan save; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &save)); + /* const doc4 = load(save) */ + AMdoc* doc4; + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMload(save.src, save.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc4)); + /* assert.deepEqual(doc4.save(), save); */ + AMbyteSpan doc4_save; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc4), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &doc4_save)); + assert_int_equal(doc4_save.count, save.count); + assert_memory_equal(doc4_save.src, save.src, doc4_save.count); +} + +/** + * \brief paths can be used instead of objids + */ +static void test_paths_can_be_used_instead_of_objids(void** state); + +/** + * \brief should be able to fetch changes by hash + */ +static void test_should_be_able_to_fetch_changes_by_hash(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc1 = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + /* const doc2 = create("bbbb") */ + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc2; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + /* doc1.put("/", "a", "b") */ + AMstackItem(NULL, AMmapPutStr(doc1, AM_ROOT, AMstr("a"), AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc2.put("/", "b", "c") */ + AMstackItem(NULL, AMmapPutStr(doc2, AM_ROOT, AMstr("b"), AMstr("c")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const head1 = doc1.getHeads() */ + AMitems head1 = AMstackItems(stack_ptr, AMgetHeads(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* const head2 = doc2.getHeads() */ + AMitems head2 = AMstackItems(stack_ptr, AMgetHeads(doc2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* const change1 = doc1.getChangeByHash(head1[0]) + if (change1 === null) { throw new RangeError("change1 should not be + null") */ + AMbyteSpan change_hash1; + assert_true(AMitemToChangeHash(AMitemsNext(&head1, 1), &change_hash1)); + AMchange const* change1; + assert_true(AMitemToChange(AMstackItem(stack_ptr, AMgetChangeByHash(doc1, change_hash1.src, change_hash1.count), + cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)), + &change1)); + /* const change2 = doc1.getChangeByHash(head2[0]) + assert.deepEqual(change2, null) */ + AMbyteSpan change_hash2; + assert_true(AMitemToChangeHash(AMitemsNext(&head2, 1), &change_hash2)); + AMstackItem(NULL, AMgetChangeByHash(doc1, change_hash2.src, change_hash2.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(decodeChange(change1).hash, head1[0]) */ + assert_memory_equal(AMchangeHash(change1).src, change_hash1.src, change_hash1.count); +} + +/** + * \brief recursive sets are possible + */ +static void test_recursive_sets_are_possible(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const l1 = doc.putObject("_root", "list", [{ foo: "bar" }, [1, 2, 3]] */ + AMobjId const* const l1 = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + { + AMobjId const* const map = AMitemObjId(AMstackItem( + stack_ptr, AMlistPutObject(doc, l1, 0, true, AM_OBJ_TYPE_MAP), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMmapPutStr(doc, map, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, l1, SIZE_MAX, true, AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + for (int value = 1; value != 4; ++value) { + AMstackItem(NULL, AMlistPutInt(doc, list, SIZE_MAX, true, value), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + } + } + /* const l2 = doc.insertObject(l1, 0, { zip: ["a", "b"] }) */ + AMobjId const* const l2 = AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, l1, 0, true, AM_OBJ_TYPE_MAP), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + { + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, l2, AMstr("zip"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMlistPutStr(doc, list, SIZE_MAX, true, AMstr("a")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMlistPutStr(doc, list, SIZE_MAX, true, AMstr("b")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + } + /* const l3 = doc.putObject("_root", "info1", "hello world") // 'text' + * object */ + AMobjId const* const l3 = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("info1"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMspliceText(doc, l3, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* doc.put("_root", "info2", "hello world") // 'str' */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("info2"), AMstr("hello world")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* const l4 = doc.putObject("_root", "info3", "hello world") */ + AMobjId const* const l4 = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("info3"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + AMstackItem(NULL, AMspliceText(doc, l4, 0, 0, AMstr("hello world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(doc.materialize(), { + "list": [{ zip: ["a", "b"] }, { foo: "bar" }, [1, 2, 3]], + "info1": "hello world", + "info2": "hello world", + "info3": "hello world", + }) */ + AMitems doc_items = AMstackItems(stack_ptr, AMmapRange(doc, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR)); + AMitem* doc_item = AMitemsNext(&doc_items, 1); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("info1")); + assert_memory_equal(key.src, "info1", key.count); + AMbyteSpan str; + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMtext(doc, AMitemObjId(doc_item), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello world")); + assert_memory_equal(str.src, "hello world", str.count); + doc_item = AMitemsNext(&doc_items, 1); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("info2")); + assert_memory_equal(key.src, "info2", key.count); + assert_true(AMitemToStr(doc_item, &str)); + assert_int_equal(str.count, strlen("hello world")); + assert_memory_equal(str.src, "hello world", str.count); + doc_item = AMitemsNext(&doc_items, 1); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("info3")); + assert_memory_equal(key.src, "info3", key.count); + assert_true(AMitemToStr( + AMstackItem(stack_ptr, AMtext(doc, AMitemObjId(doc_item), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello world")); + assert_memory_equal(str.src, "hello world", str.count); + doc_item = AMitemsNext(&doc_items, 1); + assert_int_equal(AMitemIdxType(doc_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(doc_item, &key)); + assert_int_equal(key.count, strlen("list")); + assert_memory_equal(key.src, "list", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(doc_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + AMitem const* list_item = AMitemsNext(&list_items, 1); + { + AMitems map_items = + AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + AMitem const* map_item = AMitemsNext(&map_items, 1); + assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(map_item, &key)); + assert_int_equal(key.count, strlen("zip")); + assert_memory_equal(key.src, "zip", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + } + } + list_item = AMitemsNext(&list_items, 1); + { + AMitems map_items = + AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE | AM_VAL_TYPE_STR)); + AMitem* map_item = AMitemsNext(&map_items, 1); + assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(map_item, &key)); + assert_int_equal(key.count, strlen("foo")); + assert_memory_equal(key.src, "foo", key.count); + AMbyteSpan str; + assert_true(AMitemToStr(map_item, &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bar", str.count); + } + list_item = AMitemsNext(&list_items, 1); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(list_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_INT)); + int64_t int_; + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 1); + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 2); + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 3); + } + } + /* assert.deepEqual(doc.materialize(l2), { zip: ["a", "b"] }) */ + AMitems map_items = AMstackItems(stack_ptr, AMmapRange(doc, l2, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + AMitem const* map_item = AMitemsNext(&map_items, 1); + assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY); + assert_true(AMitemKey(map_item, &key)); + assert_int_equal(key.count, strlen("zip")); + assert_memory_equal(key.src, "zip", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + } + /* assert.deepEqual(doc.materialize(l1), [{ zip: ["a", "b"] }, { foo: "bar" + * }, [1, 2, 3]] */ + AMitems list_items = + AMstackItems(stack_ptr, AMlistRange(doc, l1, 0, SIZE_MAX, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + AMitem const* list_item = AMitemsNext(&list_items, 1); + { + AMitems map_items = + AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + AMitem const* map_item = AMitemsNext(&map_items, 1); + assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(map_item, &key)); + assert_int_equal(key.count, strlen("zip")); + assert_memory_equal(key.src, "zip", key.count); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(map_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "a", str.count); + assert_true(AMitemToStr(AMitemsNext(&list_items, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "b", str.count); + } + } + list_item = AMitemsNext(&list_items, 1); + { + AMitems map_items = + AMstackItems(stack_ptr, AMmapRange(doc, AMitemObjId(list_item), AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + AMitem* map_item = AMitemsNext(&map_items, 1); + assert_int_equal(AMitemIdxType(map_item), AM_IDX_TYPE_KEY); + AMbyteSpan key; + assert_true(AMitemKey(map_item, &key)); + assert_int_equal(key.count, strlen("foo")); + assert_memory_equal(key.src, "foo", key.count); + AMbyteSpan str; + assert_true(AMitemToStr(map_item, &str)); + assert_int_equal(str.count, 3); + assert_memory_equal(str.src, "bar", str.count); + } + list_item = AMitemsNext(&list_items, 1); + { + AMitems list_items = AMstackItems(stack_ptr, AMlistRange(doc, AMitemObjId(list_item), 0, SIZE_MAX, NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_INT)); + int64_t int_; + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 1); + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 2); + assert_true(AMitemToInt(AMitemsNext(&list_items, 1), &int_)); + assert_int_equal(int_, 3); + } + /* assert.deepEqual(doc.materialize(l4), "hello world") */ + assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(doc, l4, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hello world")); + assert_memory_equal(str.src, "hello world", str.count); +} + +/** + * \brief only returns an object id when objects are created + */ +static void test_only_returns_an_object_id_when_objects_are_created(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc)); + /* const r1 = doc.put("_root", "foo", "bar") + assert.deepEqual(r1, null); */ + AMstackItem(NULL, AMmapPutStr(doc, AM_ROOT, AMstr("foo"), AMstr("bar")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const r2 = doc.putObject("_root", "list", []) */ + AMobjId const* const r2 = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc, AM_ROOT, AMstr("list"), AM_OBJ_TYPE_LIST), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* const r3 = doc.put("_root", "counter", 10, "counter") + assert.deepEqual(r3, null); */ + AMstackItem(NULL, AMmapPutCounter(doc, AM_ROOT, AMstr("counter"), 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const r4 = doc.increment("_root", "counter", 1) + assert.deepEqual(r4, null); */ + AMstackItem(NULL, AMmapIncrement(doc, AM_ROOT, AMstr("counter"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const r5 = doc.delete("_root", "counter") + assert.deepEqual(r5, null); */ + AMstackItem(NULL, AMmapDelete(doc, AM_ROOT, AMstr("counter")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const r6 = doc.insert(r2, 0, 10); + assert.deepEqual(r6, null); */ + AMstackItem(NULL, AMlistPutInt(doc, r2, 0, true, 10), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const r7 = doc.insertObject(r2, 0, {}); */ + AMobjId const* const r7 = AMitemObjId(AMstackItem(stack_ptr, AMlistPutObject(doc, r2, 0, true, AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* const r8 = doc.splice(r2, 1, 0, ["a", "b", "c"]); */ + AMresult* data = AMstackResult( + stack_ptr, AMresultFrom(3, AMitemFromStr(AMstr("a")), AMitemFromStr(AMstr("b")), AMitemFromStr(AMstr("c"))), + NULL, NULL); + AMstackItem(NULL, AMsplice(doc, r2, 1, 0, AMresultItems(data)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(r2, "2@aaaa"); */ + assert_int_equal(AMobjIdCounter(r2), 2); + AMbyteSpan str = AMactorIdStr(AMobjIdActorId(r2)); + assert_int_equal(str.count, 4); + assert_memory_equal(str.src, "aaaa", str.count); + /* assert.deepEqual(r7, "7@aaaa"); */ + assert_int_equal(AMobjIdCounter(r7), 7); + str = AMactorIdStr(AMobjIdActorId(r7)); + assert_memory_equal(str.src, "aaaa", str.count); +} + +/** + * \brief objects without properties are preserved + */ +static void test_objects_without_properties_are_preserved(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const doc1 = create("aaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), &actor_id)); + AMdoc* doc1; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc1)); + /* const a = doc1.putObject("_root", "a", {}); */ + AMobjId const* const a = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("a"), AM_OBJ_TYPE_MAP), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* const b = doc1.putObject("_root", "b", {}); */ + AMobjId const* const b = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("b"), AM_OBJ_TYPE_MAP), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* const c = doc1.putObject("_root", "c", {}); */ + AMobjId const* const c = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(doc1, AM_ROOT, AMstr("c"), AM_OBJ_TYPE_MAP), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* const d = doc1.put(c, "d", "dd"); */ + AMstackItem(NULL, AMmapPutStr(doc1, c, AMstr("d"), AMstr("dd")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const saved = doc1.save(); */ + AMbyteSpan saved; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(doc1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &saved)); + /* const doc2 = load(saved); */ + AMdoc* doc2; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(saved.src, saved.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &doc2)); + /* assert.deepEqual(doc2.getWithType("_root", "a"), ["map", a]) */ + AMitems doc_items = AMstackItems(stack_ptr, AMmapRange(doc2, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE)); + assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), a)); + /* assert.deepEqual(doc2.keys(a), []) */ + AMitems keys = AMstackItems(stack_ptr, AMkeys(doc1, a, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&keys), 0); + /* assert.deepEqual(doc2.getWithType("_root", "b"), ["map", b]) */ + assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), b)); + /* assert.deepEqual(doc2.keys(b), []) */ + keys = AMstackItems(stack_ptr, AMkeys(doc1, b, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_int_equal(AMitemsSize(&keys), 0); + /* assert.deepEqual(doc2.getWithType("_root", "c"), ["map", c]) */ + assert_true(AMobjIdEqual(AMitemObjId(AMitemsNext(&doc_items, 1)), c)); + /* assert.deepEqual(doc2.keys(c), ["d"]) */ + keys = AMstackItems(stack_ptr, AMkeys(doc1, c, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMbyteSpan str; + assert_true(AMitemToStr(AMitemsNext(&keys, 1), &str)); + assert_int_equal(str.count, 1); + assert_memory_equal(str.src, "d", str.count); + /* assert.deepEqual(doc2.getWithType(c, "d"), ["str", "dd"]) */ + AMitems obj_items = AMstackItems(stack_ptr, AMobjItems(doc1, c, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemToStr(AMitemsNext(&obj_items, 1), &str)); + assert_int_equal(str.count, 2); + assert_memory_equal(str.src, "dd", str.count); +} + +/** + * \brief should allow you to forkAt a heads + */ +static void test_should_allow_you_to_forkAt_a_heads(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const A = create("aaaaaa") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aaaaaa")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* A; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A)); + /* A.put("/", "key1", "val1"); */ + AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key1"), AMstr("val1")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* A.put("/", "key2", "val2"); */ + AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key2"), AMstr("val2")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const heads1 = A.getHeads(); */ + AMitems const heads1 = AMstackItems(stack_ptr, AMgetHeads(A), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* const B = A.fork("bbbbbb") */ + AMdoc* B; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &B)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("bbbbbb")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(B, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* A.put("/", "key3", "val3"); */ + AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key3"), AMstr("val3")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* B.put("/", "key4", "val4"); */ + AMstackItem(NULL, AMmapPutStr(B, AM_ROOT, AMstr("key4"), AMstr("val4")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* A.merge(B) */ + AMstackItem(NULL, AMmerge(A, B), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* const heads2 = A.getHeads(); */ + AMitems const heads2 = AMstackItems(stack_ptr, AMgetHeads(A), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* A.put("/", "key5", "val5"); */ + AMstackItem(NULL, AMmapPutStr(A, AM_ROOT, AMstr("key5"), AMstr("val5")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepEqual(A.forkAt(heads1).materialize("/"), A.materialize("/", + * heads1) */ + AMdoc* A_forkAt1; + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, &heads1), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A_forkAt1)); + AMitems AforkAt1_items = AMstackItems(stack_ptr, AMmapRange(A_forkAt1, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMitems A1_items = AMstackItems(stack_ptr, AMmapRange(A, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads1), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemsEqual(&AforkAt1_items, &A1_items)); + /* assert.deepEqual(A.forkAt(heads2).materialize("/"), A.materialize("/", + * heads2) */ + AMdoc* A_forkAt2; + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, &heads2), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A_forkAt2)); + AMitems AforkAt2_items = AMstackItems(stack_ptr, AMmapRange(A_forkAt2, AM_ROOT, AMstr(NULL), AMstr(NULL), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)); + AMitems A2_items = AMstackItems(stack_ptr, AMmapRange(A, AM_ROOT, AMstr(NULL), AMstr(NULL), &heads2), cmocka_cb, + AMexpect(AM_VAL_TYPE_STR)); + assert_true(AMitemsEqual(&AforkAt2_items, &A2_items)); +} + +/** + * \brief should handle merging text conflicts then saving & loading + */ +static void test_should_handle_merging_text_conflicts_then_saving_and_loading(void** state) { + BaseState* base_state = *state; + AMstack** stack_ptr = &base_state->stack; + /* const A = create("aabbcc") */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("aabbcc")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* A; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &A)); + /* const At = A.putObject('_root', 'text', "") */ + AMobjId const* const At = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(A, AM_ROOT, AMstr("text"), AM_OBJ_TYPE_TEXT), cmocka_cb, + AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* A.splice(At, 0, 0, 'hello') */ + AMstackItem(NULL, AMspliceText(A, At, 0, 0, AMstr("hello")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* const B = A.fork() */ + AMdoc* B; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMfork(A, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &B)); + /* */ + /* assert.deepEqual(B.getWithType("_root", "text"), ["text", At]) */ + AMbyteSpan str; + assert_true( + AMitemToStr(AMstackItem(stack_ptr, + AMtext(B, + AMitemObjId(AMstackItem(stack_ptr, AMmapGet(B, AM_ROOT, AMstr("text"), NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))), + NULL), + cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), + &str)); + AMbyteSpan str2; + assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(A, At, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str2)); + assert_int_equal(str.count, str2.count); + assert_memory_equal(str.src, str2.src, str.count); + /* */ + /* B.splice(At, 4, 1) */ + AMstackItem(NULL, AMspliceText(B, At, 4, 1, AMstr(NULL)), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* B.splice(At, 4, 0, '!') */ + AMstackItem(NULL, AMspliceText(B, At, 4, 0, AMstr("!")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* B.splice(At, 5, 0, ' ') */ + AMstackItem(NULL, AMspliceText(B, At, 5, 0, AMstr(" ")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* B.splice(At, 6, 0, 'world') */ + AMstackItem(NULL, AMspliceText(B, At, 6, 0, AMstr("world")), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* A.merge(B) */ + AMstackItem(NULL, AMmerge(A, B), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* const binary = A.save() */ + AMbyteSpan binary; + assert_true(AMitemToBytes(AMstackItem(stack_ptr, AMsave(A), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &binary)); + /* */ + /* const C = load(binary) */ + AMdoc* C; + assert_true(AMitemToDoc( + AMstackItem(stack_ptr, AMload(binary.src, binary.count), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &C)); + /* */ + /* assert.deepEqual(C.getWithType('_root', 'text'), ['text', '1@aabbcc'] */ + AMobjId const* const C_text = AMitemObjId( + AMstackItem(stack_ptr, AMmapGet(C, AM_ROOT, AMstr("text"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + assert_int_equal(AMobjIdCounter(C_text), 1); + str = AMactorIdStr(AMobjIdActorId(C_text)); + assert_int_equal(str.count, strlen("aabbcc")); + assert_memory_equal(str.src, "aabbcc", str.count); + /* assert.deepEqual(C.text(At), 'hell! world') */ + assert_true(AMitemToStr(AMstackItem(stack_ptr, AMtext(C, At, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_STR)), &str)); + assert_int_equal(str.count, strlen("hell! world")); + assert_memory_equal(str.src, "hell! world", str.count); +} + +int run_ported_wasm_basic_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_create_clone_and_free, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_start_and_commit, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_getting_a_nonexistent_prop_does_not_throw_an_error, setup_base, + teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_set_and_get_a_simple_value, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_use_bytes, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_make_subobjects, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_make_lists, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_lists_have_insert_set_splice_and_push_ops, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_delete_non_existent_props, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_del, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_use_counters, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_splice_text, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_save_all_or_incrementally, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_splice_text_2, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_local_inc_increments_all_visible_counters_in_a_map, setup_base, + teardown_base), + cmocka_unit_test_setup_teardown(test_local_inc_increments_all_visible_counters_in_a_sequence, setup_base, + teardown_base), + cmocka_unit_test_setup_teardown(test_should_be_able_to_fetch_changes_by_hash, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_recursive_sets_are_possible, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_only_returns_an_object_id_when_objects_are_created, setup_base, + teardown_base), + cmocka_unit_test_setup_teardown(test_objects_without_properties_are_preserved, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_allow_you_to_forkAt_a_heads, setup_base, teardown_base), + cmocka_unit_test_setup_teardown(test_should_handle_merging_text_conflicts_then_saving_and_loading, setup_base, + teardown_base)}; + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/rust/automerge-c/test/ported_wasm/suite.c b/rust/automerge-c/test/ported_wasm/suite.c new file mode 100644 index 00000000..440ed899 --- /dev/null +++ b/rust/automerge-c/test/ported_wasm/suite.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +/* third-party */ +#include + +extern int run_ported_wasm_basic_tests(void); + +extern int run_ported_wasm_sync_tests(void); + +int run_ported_wasm_suite(void) { + return (run_ported_wasm_basic_tests() + run_ported_wasm_sync_tests()); +} diff --git a/rust/automerge-c/test/ported_wasm/sync_tests.c b/rust/automerge-c/test/ported_wasm/sync_tests.c new file mode 100644 index 00000000..099f8dbf --- /dev/null +++ b/rust/automerge-c/test/ported_wasm/sync_tests.c @@ -0,0 +1,1282 @@ +#include +#include +#include +#include +#include + +/* third-party */ +#include + +/* local */ +#include +#include +#include "../base_state.h" +#include "../cmocka_utils.h" + +typedef struct { + BaseState* base_state; + AMdoc* n1; + AMdoc* n2; + AMsyncState* s1; + AMsyncState* s2; +} TestState; + +static int setup(void** state) { + TestState* test_state = test_calloc(1, sizeof(TestState)); + setup_base((void**)&test_state->base_state); + AMstack** stack_ptr = &test_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("01234567")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &test_state->n1)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("89abcdef")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + assert_true( + AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &test_state->n2)); + assert_true(AMitemToSyncState( + AMstackItem(stack_ptr, AMsyncStateInit(), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_STATE)), &test_state->s1)); + assert_true(AMitemToSyncState( + AMstackItem(stack_ptr, AMsyncStateInit(), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_STATE)), &test_state->s2)); + *state = test_state; + return 0; +} + +static int teardown(void** state) { + TestState* test_state = *state; + teardown_base((void**)&test_state->base_state); + test_free(test_state); + return 0; +} + +static void sync(AMdoc* a, AMdoc* b, AMsyncState* a_sync_state, AMsyncState* b_sync_state) { + static size_t const MAX_ITER = 10; + + AMsyncMessage const* a2b_msg = NULL; + AMsyncMessage const* b2a_msg = NULL; + size_t iter = 0; + do { + AMresult* a2b_msg_result = AMgenerateSyncMessage(a, a_sync_state); + AMresult* b2a_msg_result = AMgenerateSyncMessage(b, b_sync_state); + AMitem* item = AMresultItem(a2b_msg_result); + switch (AMitemValType(item)) { + case AM_VAL_TYPE_SYNC_MESSAGE: { + AMitemToSyncMessage(item, &a2b_msg); + AMstackResult(NULL, AMreceiveSyncMessage(b, b_sync_state, a2b_msg), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + } break; + case AM_VAL_TYPE_VOID: + a2b_msg = NULL; + break; + } + item = AMresultItem(b2a_msg_result); + switch (AMitemValType(item)) { + case AM_VAL_TYPE_SYNC_MESSAGE: { + AMitemToSyncMessage(item, &b2a_msg); + AMstackResult(NULL, AMreceiveSyncMessage(a, a_sync_state, b2a_msg), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + } break; + case AM_VAL_TYPE_VOID: + b2a_msg = NULL; + break; + } + if (++iter > MAX_ITER) { + fail_msg( + "Did not synchronize within %d iterations. " + "Do you have a bug causing an infinite loop?", + MAX_ITER); + } + } while (a2b_msg || b2a_msg); +} + +static time_t const TIME_0 = 0; + +/** + * \brief should send a sync message implying no local data + */ +static void test_should_send_a_sync_message_implying_no_local_data(void** state) { + /* const doc = create() + const s1 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* const m1 = doc.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") } + const message: DecodedSyncMessage = decodeSyncMessage(m1) */ + AMsyncMessage const* m1; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &m1)); + /* assert.deepStrictEqual(message.heads, []) */ + AMitems heads = AMstackItems(stack_ptr, AMsyncMessageHeads(m1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&heads), 0); + /* assert.deepStrictEqual(message.need, []) */ + AMitems needs = AMstackItems(stack_ptr, AMsyncMessageNeeds(m1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&needs), 0); + /* assert.deepStrictEqual(message.have.length, 1) */ + AMitems haves = AMstackItems(stack_ptr, AMsyncMessageHaves(m1), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_HAVE)); + assert_int_equal(AMitemsSize(&haves), 1); + /* assert.deepStrictEqual(message.have[0].lastSync, []) */ + AMsyncHave const* have0; + assert_true(AMitemToSyncHave(AMitemsNext(&haves, 1), &have0)); + AMitems last_sync = + AMstackItems(stack_ptr, AMsyncHaveLastSync(have0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&last_sync), 0); + /* assert.deepStrictEqual(message.have[0].bloom.byteLength, 0) + assert.deepStrictEqual(message.changes, []) */ + AMitems changes = AMstackItems(stack_ptr, AMsyncMessageChanges(m1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&changes), 0); +} + +/** + * \brief should not reply if we have no data as well + */ +static void test_should_not_reply_if_we_have_no_data_as_well(void** state) { + /* const n1 = create(), n2 = create() + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* const m1 = n1.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") */ + AMsyncMessage const* m1; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &m1)); + /* n2.receiveSyncMessage(s2, m1) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, m1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const m2 = n2.generateSyncMessage(s2) + assert.deepStrictEqual(m2, null) */ + AMstackItem(NULL, AMgenerateSyncMessage(test_state->n2, test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); +} + +/** + * \brief repos with equal heads do not need a reply message + */ +static void test_repos_with_equal_heads_do_not_need_a_reply_message(void** state) { + /* const n1 = create(), n2 = create() + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* make two nodes with the same changes */ + /* const list = n1.putObject("_root", "n", []) */ + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(test_state->n1, AM_ROOT, AMstr("n"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* for (let i = 0; i < 10; i++) { */ + for (size_t i = 0; i != 10; ++i) { + /* n1.insert(list, i, i) */ + AMstackItem(NULL, AMlistPutUint(test_state->n1, list, i, true, i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* n2.applyChanges(n1.getChanges([])) */ + AMitems const items = + AMstackItems(stack_ptr, AMgetChanges(test_state->n1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + AMstackItem(NULL, AMapplyChanges(test_state->n2, &items), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); + /* */ + /* generate a naive sync message */ + /* const m1 = n1.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") */ + AMsyncMessage const* m1; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &m1)); + /* assert.deepStrictEqual(s1.lastSentHeads, n1.getHeads()) */ + AMitems const last_sent_heads = + AMstackItems(stack_ptr, AMsyncStateLastSentHeads(test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems const heads = + AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&last_sent_heads, &heads)); + /* */ + /* heads are equal so this message should be null */ + /* n2.receiveSyncMessage(s2, m1) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, m1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* const m2 = n2.generateSyncMessage(s2) + assert.strictEqual(m2, null) */ + AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); +} + +/** + * \brief n1 should offer all changes to n2 when starting from nothing + */ +static void test_n1_should_offer_all_changes_to_n2_when_starting_from_nothing(void** state) { + /* const n1 = create(), n2 = create() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* make changes for n1 that n2 should request */ + /* const list = n1.putObject("_root", "n", []) */ + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(test_state->n1, AM_ROOT, AMstr("n"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* for (let i = 0; i < 10; i++) { */ + for (size_t i = 0; i != 10; ++i) { + /* n1.insert(list, i, i) */ + AMstackItem(NULL, AMlistPutUint(test_state->n1, list, i, true, i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should sync peers where one has commits the other does not + */ +static void test_should_sync_peers_where_one_has_commits_the_other_does_not(void** state) { + /* const n1 = create(), n2 = create() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* make changes for n1 that n2 should request */ + /* const list = n1.putObject("_root", "n", []) */ + AMobjId const* const list = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(test_state->n1, AM_ROOT, AMstr("n"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* for (let i = 0; i < 10; i++) { */ + for (size_t i = 0; i != 10; ++i) { + /* n1.insert(list, i, i) */ + AMstackItem(NULL, AMlistPutUint(test_state->n1, list, i, true, i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should work with prior sync state + */ +static void test_should_work_with_prior_sync_state(void** state) { + /* create & synchronize two nodes */ + /* const n1 = create(), n2 = create() + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* modify the first node further */ + /* for (let i = 5; i < 10; i++) { */ + for (size_t i = 5; i != 10; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should not generate messages once synced + */ +static void test_should_not_generate_messages_once_synced(void** state) { + /* create & synchronize two nodes */ + /* const n1 = create('abc123'), n2 = create('def456') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("abc123")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->n1, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("def456")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->n2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* let message, patch + for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n2.put("_root", "y", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("y"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n2.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* n1 reports what it has */ + /* message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be + null") */ + AMsyncMessage const* message; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + /* */ + /* n2 receives that message and sends changes along with what it has */ + /* n2.receiveSyncMessage(s2, message) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, message), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + AMitems message_changes = + AMstackItems(stack_ptr, AMsyncMessageChanges(message), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&message_changes), 5); + /* */ + /* n1 receives the changes and replies with the changes it now knows that + * n2 needs */ + /* n1.receiveSyncMessage(s1, message) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n1, test_state->s1, message), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + message_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(message), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&message_changes), 5); + /* */ + /* n2 applies the changes and sends confirmation ending the exchange */ + /* n2.receiveSyncMessage(s2, message) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, message), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + /* */ + /* n1 receives the message and has nothing more to say */ + /* n1.receiveSyncMessage(s1, message) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n1, test_state->s1, message), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* message = n1.generateSyncMessage(s1) + assert.deepStrictEqual(message, null) */ + AMstackItem(NULL, AMgenerateSyncMessage(test_state->n1, test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* //assert.deepStrictEqual(patch, null) // no changes arrived */ + /* */ + /* n2 also has nothing left to say */ + /* message = n2.generateSyncMessage(s2) + assert.deepStrictEqual(message, null) */ + AMstackItem(NULL, AMgenerateSyncMessage(test_state->n2, test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); +} + +/** + * \brief should allow simultaneous messages during synchronization + */ +static void test_should_allow_simultaneous_messages_during_synchronization(void** state) { + /* create & synchronize two nodes */ + /* const n1 = create('abc123'), n2 = create('def456') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("abc123")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->n1, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("def456")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMstackItem(NULL, AMsetActorId(test_state->n2, actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n2.put("_root", "y", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("y"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n2.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* const head1 = n1.getHeads()[0], head2 = n2.getHeads()[0] */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMbyteSpan head1; + assert_true(AMitemToChangeHash(AMitemsNext(&heads1, 1), &head1)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMbyteSpan head2; + assert_true(AMitemToChangeHash(AMitemsNext(&heads2, 1), &head2)); + /* */ + /* both sides report what they have but have no shared peer state */ + /* let msg1to2, msg2to1 + msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be + null") */ + AMsyncMessage const* msg1to2; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg1to2)); + /* msg2to1 = n2.generateSyncMessage(s2) + if (msg2to1 === null) { throw new RangeError("message should not be + null") */ + AMsyncMessage const* msg2to1; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg2to1)); + /* assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) */ + AMitems msg1to2_changes = + AMstackItems(stack_ptr, AMsyncMessageChanges(msg1to2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg1to2_changes), 0); + /* assert.deepStrictEqual(decodeSyncMessage(msg1to2).have[0].lastSync.length, + * 0 */ + AMitems msg1to2_haves = + AMstackItems(stack_ptr, AMsyncMessageHaves(msg1to2), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_HAVE)); + AMsyncHave const* msg1to2_have; + assert_true(AMitemToSyncHave(AMitemsNext(&msg1to2_haves, 1), &msg1to2_have)); + AMitems msg1to2_last_sync = + AMstackItems(stack_ptr, AMsyncHaveLastSync(msg1to2_have), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&msg1to2_last_sync), 0); + /* assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) */ + AMitems msg2to1_changes = + AMstackItems(stack_ptr, AMsyncMessageChanges(msg2to1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg2to1_changes), 0); + /* assert.deepStrictEqual(decodeSyncMessage(msg2to1).have[0].lastSync.length, + * 0 */ + AMitems msg2to1_haves = + AMstackItems(stack_ptr, AMsyncMessageHaves(msg2to1), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_HAVE)); + AMsyncHave const* msg2to1_have; + assert_true(AMitemToSyncHave(AMitemsNext(&msg2to1_haves, 1), &msg2to1_have)); + AMitems msg2to1_last_sync = + AMstackItems(stack_ptr, AMsyncHaveLastSync(msg2to1_have), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&msg2to1_last_sync), 0); + /* */ + /* n1 and n2 receive that message and update sync state but make no patc */ + /* n1.receiveSyncMessage(s1, msg2to1) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n1, test_state->s1, msg2to1), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* n2.receiveSyncMessage(s2, msg1to2) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, msg1to2), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* now both reply with their local changes that the other lacks + * (standard warning that 1% of the time this will result in a "needs" + * message) */ + /* msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg1to2)); + /* assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 5) */ + msg1to2_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(msg1to2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg1to2_changes), 5); + /* msg2to1 = n2.generateSyncMessage(s2) + if (msg2to1 === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg2to1)); + /* assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 5) */ + msg2to1_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(msg2to1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg2to1_changes), 5); + /* */ + /* both should now apply the changes and update the frontend */ + /* n1.receiveSyncMessage(s1, msg2to1) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n1, test_state->s1, msg2to1), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepStrictEqual(n1.getMissingDeps(), []) */ + AMitems missing_deps = + AMstackItems(stack_ptr, AMgetMissingDeps(test_state->n1, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&missing_deps), 0); + /* //assert.notDeepStrictEqual(patch1, null) + assert.deepStrictEqual(n1.materialize(), { x: 4, y: 4 }) */ + uint64_t uint; + assert_true(AMitemToUint(AMstackItem(stack_ptr, AMmapGet(test_state->n1, AM_ROOT, AMstr("x"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 4); + assert_true(AMitemToUint(AMstackItem(stack_ptr, AMmapGet(test_state->n1, AM_ROOT, AMstr("y"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 4); + /* */ + /* n2.receiveSyncMessage(s2, msg1to2) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, msg1to2), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepStrictEqual(n2.getMissingDeps(), []) */ + missing_deps = + AMstackItems(stack_ptr, AMgetMissingDeps(test_state->n2, NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_int_equal(AMitemsSize(&missing_deps), 0); + /* //assert.notDeepStrictEqual(patch2, null) + assert.deepStrictEqual(n2.materialize(), { x: 4, y: 4 }) */ + assert_true(AMitemToUint(AMstackItem(stack_ptr, AMmapGet(test_state->n2, AM_ROOT, AMstr("x"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 4); + assert_true(AMitemToUint(AMstackItem(stack_ptr, AMmapGet(test_state->n2, AM_ROOT, AMstr("y"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 4); + /* */ + /* The response acknowledges the changes received and sends no further + * changes */ + /* msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg1to2)); + /* assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) */ + msg1to2_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(msg1to2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg1to2_changes), 0); + /* msg2to1 = n2.generateSyncMessage(s2) + if (msg2to1 === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n2, test_state->s2), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg2to1)); + /* assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) */ + msg2to1_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(msg2to1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&msg2to1_changes), 0); + /* */ + /* After receiving acknowledgements, their shared heads should be equal */ + /* n1.receiveSyncMessage(s1, msg2to1) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n1, test_state->s1, msg2to1), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* n2.receiveSyncMessage(s2, msg1to2) */ + AMstackItem(NULL, AMreceiveSyncMessage(test_state->n2, test_state->s2, msg1to2), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* assert.deepStrictEqual(s1.sharedHeads, [head1, head2].sort()) */ + AMitems s1_shared_heads = + AMstackItems(stack_ptr, AMsyncStateSharedHeads(test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMbyteSpan s1_shared_change_hash; + assert_true(AMitemToChangeHash(AMitemsNext(&s1_shared_heads, 1), &s1_shared_change_hash)); + assert_memory_equal(s1_shared_change_hash.src, head1.src, head1.count); + assert_true(AMitemToChangeHash(AMitemsNext(&s1_shared_heads, 1), &s1_shared_change_hash)); + assert_memory_equal(s1_shared_change_hash.src, head2.src, head2.count); + /* assert.deepStrictEqual(s2.sharedHeads, [head1, head2].sort()) */ + AMitems s2_shared_heads = + AMstackItems(stack_ptr, AMsyncStateSharedHeads(test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMbyteSpan s2_shared_change_hash; + assert_true(AMitemToChangeHash(AMitemsNext(&s2_shared_heads, 1), &s2_shared_change_hash)); + assert_memory_equal(s2_shared_change_hash.src, head1.src, head1.count); + assert_true(AMitemToChangeHash(AMitemsNext(&s2_shared_heads, 1), &s2_shared_change_hash)); + assert_memory_equal(s2_shared_change_hash.src, head2.src, head2.count); + /* //assert.deepStrictEqual(patch1, null) + //assert.deepStrictEqual(patch2, null) */ + /* */ + /* We're in sync, no more messages required */ + /* msg1to2 = n1.generateSyncMessage(s1) + assert.deepStrictEqual(msg1to2, null) */ + AMstackItem(NULL, AMgenerateSyncMessage(test_state->n1, test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* msg2to1 = n2.generateSyncMessage(s2) + assert.deepStrictEqual(msg2to1, null) */ + AMstackItem(NULL, AMgenerateSyncMessage(test_state->n2, test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* If we make one more change and start another sync then its lastSync + * should be updated */ + /* n1.put("_root", "x", 5) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &msg1to2)); + /* assert.deepStrictEqual(decodeSyncMessage(msg1to2).have[0].lastSync, + * [head1, head2].sort( */ + msg1to2_haves = AMstackItems(stack_ptr, AMsyncMessageHaves(msg1to2), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_HAVE)); + assert_true(AMitemToSyncHave(AMitemsNext(&msg1to2_haves, 1), &msg1to2_have)); + msg1to2_last_sync = + AMstackItems(stack_ptr, AMsyncHaveLastSync(msg1to2_have), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMbyteSpan msg1to2_last_sync_next; + assert_true(AMitemToChangeHash(AMitemsNext(&msg1to2_last_sync, 1), &msg1to2_last_sync_next)); + assert_int_equal(msg1to2_last_sync_next.count, head1.count); + assert_memory_equal(msg1to2_last_sync_next.src, head1.src, head1.count); + assert_true(AMitemToChangeHash(AMitemsNext(&msg1to2_last_sync, 1), &msg1to2_last_sync_next)); + assert_int_equal(msg1to2_last_sync_next.count, head2.count); + assert_memory_equal(msg1to2_last_sync_next.src, head2.src, head2.count); +} + +/** + * \brief should assume sent changes were received until we hear otherwise + */ +static void test_should_assume_sent_changes_were_received_until_we_hear_otherwise(void** state) { + /* const n1 = create('01234567'), n2 = create('89abcdef') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* let message = null */ + /* */ + /* const items = n1.putObject("_root", "items", []) */ + AMobjId const* const items = + AMitemObjId(AMstackItem(stack_ptr, AMmapPutObject(test_state->n1, AM_ROOT, AMstr("items"), AM_OBJ_TYPE_LIST), + cmocka_cb, AMexpect(AM_VAL_TYPE_OBJ_TYPE))); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* n1.push(items, "x") */ + AMstackItem(NULL, AMlistPutStr(test_state->n1, items, SIZE_MAX, true, AMstr("x")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") + */ + AMsyncMessage const* message; + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + /* assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) */ + AMitems message_changes = + AMstackItems(stack_ptr, AMsyncMessageChanges(message), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&message_changes), 1); + /* */ + /* n1.push(items, "y") */ + AMstackItem(NULL, AMlistPutStr(test_state->n1, items, SIZE_MAX, true, AMstr("y")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + /* assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) */ + message_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(message), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&message_changes), 1); + /* */ + /* n1.push(items, "z") */ + AMstackItem(NULL, AMlistPutStr(test_state->n1, items, SIZE_MAX, true, AMstr("z")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be + null") */ + assert_true(AMitemToSyncMessage(AMstackItem(stack_ptr, AMgenerateSyncMessage(test_state->n1, test_state->s1), + cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_MESSAGE)), + &message)); + /* assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) */ + message_changes = AMstackItems(stack_ptr, AMsyncMessageChanges(message), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + assert_int_equal(AMitemsSize(&message_changes), 1); +} + +/** + * \brief should work regardless of who initiates the exchange + */ +static void test_should_work_regardless_of_who_initiates_the_exchange(void** state) { + /* create & synchronize two nodes */ + /* const n1 = create(), n2 = create() + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* for (let i = 0; i < 5; i++) { */ + for (size_t i = 0; i != 5; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* modify the first node further */ + /* for (let i = 5; i < 10; i++) { */ + for (size_t i = 5; i != 10; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should work without prior sync state + */ +static void test_should_work_without_prior_sync_state(void** state) { + /* Scenario: ,-- + * c10 <-- c11 <-- c12 <-- c13 <-- c14 c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 + * <-- c6 <-- c7 <-- c8 <-- c9 <-+ + * `-- + * c15 <-- c16 <-- c17 lastSync is undefined. */ + /* */ + /* create two peers both with divergent commits */ + /* const n1 = create('01234567'), n2 = create('89abcdef') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* for (let i = 0; i < 10; i++) { */ + for (size_t i = 0; i != 10; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* for (let i = 10; i < 15; i++) { */ + for (size_t i = 10; i != 15; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* for (let i = 15; i < 18; i++) { */ + for (size_t i = 15; i != 18; ++i) { + /* n2.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n2.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should work with prior sync state + */ +static void test_should_work_with_prior_sync_state_2(void** state) { + /* Scenario: + * ,-- + * c10 <-- c11 <-- c12 <-- c13 <-- c14 c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 + * <-- c6 <-- c7 <-- c8 <-- c9 <-+ + * `-- + * c15 <-- c16 <-- c17 lastSync is c9. */ + /* */ + /* create two peers both with divergent commits */ + /* const n1 = create('01234567'), n2 = create('89abcdef') + let s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* for (let i = 0; i < 10; i++) { */ + for (size_t i = 0; i != 10; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* for (let i = 10; i < 15; i++) { */ + for (size_t i = 10; i != 15; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* for (let i = 15; i < 18; i++) { */ + for (size_t i = 15; i != 18; ++i) { + /* n2.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n2.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* s1 = decodeSyncState(encodeSyncState(s1)) */ + AMbyteSpan encoded; + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMsyncStateEncode(test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &encoded)); + AMsyncState* s1; + assert_true(AMitemToSyncState(AMstackItem(stack_ptr, AMsyncStateDecode(encoded.src, encoded.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_SYNC_STATE)), + &s1)); + /* s2 = decodeSyncState(encodeSyncState(s2)) */ + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMsyncStateEncode(test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &encoded)); + AMsyncState* s2; + assert_true(AMitemToSyncState(AMstackItem(stack_ptr, AMsyncStateDecode(encoded.src, encoded.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_SYNC_STATE)), + &s2)); + /* */ + /* assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_false(AMequal(test_state->n1, test_state->n2)); + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, s1, s2); + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should ensure non-empty state after sync + */ +static void test_should_ensure_non_empty_state_after_sync(void** state) { + /* const n1 = create('01234567'), n2 = create('89abcdef') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* for (let i = 0; i < 3; i++) { */ + for (size_t i = 0; i != 3; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* assert.deepStrictEqual(s1.sharedHeads, n1.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems shared_heads1 = + AMstackItems(stack_ptr, AMsyncStateSharedHeads(test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&shared_heads1, &heads1)); + /* assert.deepStrictEqual(s2.sharedHeads, n1.getHeads()) */ + AMitems shared_heads2 = + AMstackItems(stack_ptr, AMsyncStateSharedHeads(test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&shared_heads2, &heads1)); +} + +/** + * \brief should re-sync after one node crashed with data loss + */ +static void test_should_resync_after_one_node_crashed_with_data_loss(void** state) { + /* Scenario: (r) (n2) (n1) + * c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 + * n2 has changes {c0, c1, c2}, n1's lastSync is c5, and n2's lastSync + * is c2 + * we want to successfully sync (n1) with (r), even though (n1) believes + * it's talking to (n2) */ + /* const n1 = create('01234567'), n2 = create('89abcdef') + let s1 = initSyncState() + const s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* n1 makes three changes, which we sync to n2 */ + /* for (let i = 0; i < 3; i++) { */ + for (size_t i = 0; i != 3; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* save a copy of n2 as "r" to simulate recovering from a crash */ + /* let r + let rSyncState + ;[r, rSyncState] = [n2.clone(), s2.clone()] */ + AMdoc* r; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMclone(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &r)); + AMbyteSpan encoded_s2; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsyncStateEncode(test_state->s2), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), + &encoded_s2)); + AMsyncState* sync_state_r; + assert_true(AMitemToSyncState(AMstackItem(stack_ptr, AMsyncStateDecode(encoded_s2.src, encoded_s2.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_SYNC_STATE)), + &sync_state_r)); + /* */ + /* sync another few commits */ + /* for (let i = 3; i < 6; i++) { */ + for (size_t i = 3; i != 6; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* everyone should be on the same page here */ + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); + /* */ + /* now make a few more changes and then attempt to sync the fully + * up-to-date n1 with with the confused r */ + /* for (let i = 6; i < 9; i++) { */ + for (size_t i = 6; i != 9; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* s1 = decodeSyncState(encodeSyncState(s1)) */ + AMbyteSpan encoded_s1; + assert_true( + AMitemToBytes(AMstackItem(stack_ptr, AMsyncStateEncode(test_state->s1), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), + &encoded_s1)); + AMsyncState* s1; + assert_true(AMitemToSyncState(AMstackItem(stack_ptr, AMsyncStateDecode(encoded_s1.src, encoded_s1.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_SYNC_STATE)), + &s1)); + /* rSyncState = decodeSyncState(encodeSyncState(rSyncState)) */ + AMbyteSpan encoded_r; + assert_true(AMitemToBytes( + AMstackItem(stack_ptr, AMsyncStateEncode(sync_state_r), cmocka_cb, AMexpect(AM_VAL_TYPE_BYTES)), &encoded_r)); + assert_true(AMitemToSyncState(AMstackItem(stack_ptr, AMsyncStateDecode(encoded_r.src, encoded_r.count), cmocka_cb, + AMexpect(AM_VAL_TYPE_SYNC_STATE)), + &sync_state_r)); + /* */ + /* assert.notDeepStrictEqual(n1.getHeads(), r.getHeads()) */ + heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads_r = AMstackItems(stack_ptr, AMgetHeads(r), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_false(AMitemsEqual(&heads1, &heads_r)); + /* assert.notDeepStrictEqual(n1.materialize(), r.materialize()) */ + assert_false(AMequal(test_state->n1, r)); + /* assert.deepStrictEqual(n1.materialize(), { x: 8 }) */ + uint64_t uint; + assert_true(AMitemToUint(AMstackItem(stack_ptr, AMmapGet(test_state->n1, AM_ROOT, AMstr("x"), NULL), cmocka_cb, + AMexpect(AM_VAL_TYPE_UINT)), + &uint)); + assert_int_equal(uint, 8); + /* assert.deepStrictEqual(r.materialize(), { x: 2 }) */ + assert_true(AMitemToUint( + AMstackItem(stack_ptr, AMmapGet(r, AM_ROOT, AMstr("x"), NULL), cmocka_cb, AMexpect(AM_VAL_TYPE_UINT)), &uint)); + assert_int_equal(uint, 2); + /* sync(n1, r, s1, rSyncState) */ + sync(test_state->n1, r, test_state->s1, sync_state_r); + /* assert.deepStrictEqual(n1.getHeads(), r.getHeads()) */ + heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + heads_r = AMstackItems(stack_ptr, AMgetHeads(r), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads_r)); + /* assert.deepStrictEqual(n1.materialize(), r.materialize()) */ + assert_true(AMequal(test_state->n1, r)); +} + +/** + * \brief should re-sync after one node experiences data loss without + * disconnecting + */ +static void test_should_resync_after_one_node_experiences_data_loss_without_disconnecting(void** state) { + /* const n1 = create('01234567'), n2 = create('89abcdef') + const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + /* */ + /* n1 makes three changes which we sync to n2 */ + /* for (let i = 0; i < 3; i++) { */ + for (size_t i = 0; i != 3; ++i) { + /* n1.put("_root", "x", i) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.commit("", 0) */ + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); + /* */ + /* const n2AfterDataLoss = create('89abcdef') */ + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("89abcdef")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* n2_after_data_loss; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), + &n2_after_data_loss)); + /* */ + /* "n2" now has no data, but n1 still thinks it does. Note we don't do + * decodeSyncState(encodeSyncState(s1)) in order to simulate data loss + * without disconnecting */ + /* sync(n1, n2AfterDataLoss, s1, initSyncState()) */ + AMsyncState* s2_after_data_loss; + assert_true(AMitemToSyncState( + AMstackItem(stack_ptr, AMsyncStateInit(), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_STATE)), &s2_after_data_loss)); + sync(test_state->n1, n2_after_data_loss, test_state->s1, s2_after_data_loss); + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should handle changes concurrent to the last sync heads + */ +static void test_should_handle_changes_concurrrent_to_the_last_sync_heads(void** state) { + /* const n1 = create('01234567'), n2 = create('89abcdef'), n3 = + * create('fedcba98' */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("fedcba98")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* n3; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &n3)); + /* const s12 = initSyncState(), s21 = initSyncState(), s23 = + * initSyncState(), s32 = initSyncState( */ + AMsyncState* s12 = test_state->s1; + AMsyncState* s21 = test_state->s2; + AMsyncState* s23; + assert_true(AMitemToSyncState( + AMstackItem(stack_ptr, AMsyncStateInit(), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_STATE)), &s23)); + AMsyncState* s32; + assert_true(AMitemToSyncState( + AMstackItem(stack_ptr, AMsyncStateInit(), cmocka_cb, AMexpect(AM_VAL_TYPE_SYNC_STATE)), &s32)); + /* */ + /* Change 1 is known to all three nodes */ + /* //n1 = Automerge.change(n1, {time: 0}, doc => doc.x = 1) */ + /* n1.put("_root", "x", 1); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* sync(n1, n2, s12, s21) */ + sync(test_state->n1, test_state->n2, s12, s21); + /* sync(n2, n3, s23, s32) */ + sync(test_state->n2, n3, s23, s32); + /* */ + /* Change 2 is known to n1 and n2 */ + /* n1.put("_root", "x", 2); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), 2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* sync(n1, n2, s12, s21) */ + sync(test_state->n1, test_state->n2, s12, s21); + /* */ + /* Each of the three nodes makes one change (changes 3, 4, 5) */ + /* n1.put("_root", "x", 3); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), 3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* n2.put("_root", "x", 4); n2.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("x"), 4), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* n3.put("_root", "x", 5); n3.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(n3, AM_ROOT, AMstr("x"), 5), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(n3, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* Apply n3's latest change to n2. */ + /* let change = n3.getLastLocalChange() + if (change === null) throw new RangeError("no local change") */ + AMitems changes = AMstackItems(stack_ptr, AMgetLastLocalChange(n3), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* n2.applyChanges([change]) */ + AMstackItem(NULL, AMapplyChanges(test_state->n2, &changes), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* */ + /* Now sync n1 and n2. n3's change is concurrent to n1 and n2's last sync + * heads */ + /* sync(n1, n2, s12, s21) */ + sync(test_state->n1, test_state->n2, s12, s21); + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +/** + * \brief should handle histories with lots of branching and merging + */ +static void test_should_handle_histories_with_lots_of_branching_and_merging(void** state) { + /* const n1 = create('01234567'), n2 = create('89abcdef'), n3 = + create('fedcba98') const s1 = initSyncState(), s2 = initSyncState() */ + TestState* test_state = *state; + AMstack** stack_ptr = &test_state->base_state->stack; + AMactorId const* actor_id; + assert_true(AMitemToActorId( + AMstackItem(stack_ptr, AMactorIdFromStr(AMstr("fedcba98")), cmocka_cb, AMexpect(AM_VAL_TYPE_ACTOR_ID)), + &actor_id)); + AMdoc* n3; + assert_true(AMitemToDoc(AMstackItem(stack_ptr, AMcreate(actor_id), cmocka_cb, AMexpect(AM_VAL_TYPE_DOC)), &n3)); + /* n1.put("_root", "x", 0); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("x"), 0), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* let change1 = n1.getLastLocalChange() + if (change1 === null) throw new RangeError("no local change") */ + AMitems change1 = + AMstackItems(stack_ptr, AMgetLastLocalChange(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* n2.applyChanges([change1]) */ + AMstackItem(NULL, AMapplyChanges(test_state->n2, &change1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* let change2 = n1.getLastLocalChange() + if (change2 === null) throw new RangeError("no local change") */ + AMitems change2 = + AMstackItems(stack_ptr, AMgetLastLocalChange(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* n3.applyChanges([change2]) */ + AMstackItem(NULL, AMapplyChanges(n3, &change2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n3.put("_root", "x", 1); n3.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(n3, AM_ROOT, AMstr("x"), 1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(n3, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* - n1c1 <------ n1c2 <------ n1c3 <-- etc. <-- n1c20 <------ n1c21 + * / \/ \/ \/ + * / /\ /\ /\ + * c0 <---- n2c1 <------ n2c2 <------ n2c3 <-- etc. <-- n2c20 <------ n2c21 + * \ / + * ---------------------------------------------- n3c1 <----- + */ + /* for (let i = 1; i < 20; i++) { */ + for (size_t i = 1; i != 20; ++i) { + /* n1.put("_root", "n1", i); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n1, AM_ROOT, AMstr("n1"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* n2.put("_root", "n2", i); n2.commit("", 0) */ + AMstackItem(NULL, AMmapPutUint(test_state->n2, AM_ROOT, AMstr("n2"), i), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* const change1 = n1.getLastLocalChange() + if (change1 === null) throw new RangeError("no local change") */ + AMitems change1 = + AMstackItems(stack_ptr, AMgetLastLocalChange(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* const change2 = n2.getLastLocalChange() + if (change2 === null) throw new RangeError("no local change") */ + AMitems change2 = + AMstackItems(stack_ptr, AMgetLastLocalChange(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* n1.applyChanges([change2]) */ + AMstackItem(NULL, AMapplyChanges(test_state->n1, &change2), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n2.applyChanges([change1]) */ + AMstackItem(NULL, AMapplyChanges(test_state->n2, &change1), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* { */ + } + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* */ + /* Having n3's last change concurrent to the last sync heads forces us into + * the slower code path */ + /* const change3 = n2.getLastLocalChange() + if (change3 === null) throw new RangeError("no local change") */ + AMitems change3 = AMstackItems(stack_ptr, AMgetLastLocalChange(n3), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE)); + /* n2.applyChanges([change3]) */ + AMstackItem(NULL, AMapplyChanges(test_state->n2, &change3), cmocka_cb, AMexpect(AM_VAL_TYPE_VOID)); + /* n1.put("_root", "n1", "final"); n1.commit("", 0) */ + AMstackItem(NULL, AMmapPutStr(test_state->n1, AM_ROOT, AMstr("n1"), AMstr("final")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n1, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* n2.put("_root", "n2", "final"); n2.commit("", 0) */ + AMstackItem(NULL, AMmapPutStr(test_state->n2, AM_ROOT, AMstr("n2"), AMstr("final")), cmocka_cb, + AMexpect(AM_VAL_TYPE_VOID)); + AMstackItem(NULL, AMcommit(test_state->n2, AMstr(""), &TIME_0), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + /* */ + /* sync(n1, n2, s1, s2) */ + sync(test_state->n1, test_state->n2, test_state->s1, test_state->s2); + /* assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) */ + AMitems heads1 = AMstackItems(stack_ptr, AMgetHeads(test_state->n1), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + AMitems heads2 = AMstackItems(stack_ptr, AMgetHeads(test_state->n2), cmocka_cb, AMexpect(AM_VAL_TYPE_CHANGE_HASH)); + assert_true(AMitemsEqual(&heads1, &heads2)); + /* assert.deepStrictEqual(n1.materialize(), n2.materialize()) */ + assert_true(AMequal(test_state->n1, test_state->n2)); +} + +int run_ported_wasm_sync_tests(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_should_send_a_sync_message_implying_no_local_data, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_not_reply_if_we_have_no_data_as_well, setup, teardown), + cmocka_unit_test_setup_teardown(test_repos_with_equal_heads_do_not_need_a_reply_message, setup, teardown), + cmocka_unit_test_setup_teardown(test_n1_should_offer_all_changes_to_n2_when_starting_from_nothing, setup, + teardown), + cmocka_unit_test_setup_teardown(test_should_sync_peers_where_one_has_commits_the_other_does_not, setup, + teardown), + cmocka_unit_test_setup_teardown(test_should_work_with_prior_sync_state, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_not_generate_messages_once_synced, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_allow_simultaneous_messages_during_synchronization, setup, + teardown), + cmocka_unit_test_setup_teardown(test_should_assume_sent_changes_were_received_until_we_hear_otherwise, setup, + teardown), + cmocka_unit_test_setup_teardown(test_should_work_regardless_of_who_initiates_the_exchange, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_work_without_prior_sync_state, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_work_with_prior_sync_state_2, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_ensure_non_empty_state_after_sync, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_resync_after_one_node_crashed_with_data_loss, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_resync_after_one_node_experiences_data_loss_without_disconnecting, + setup, teardown), + cmocka_unit_test_setup_teardown(test_should_handle_changes_concurrrent_to_the_last_sync_heads, setup, teardown), + cmocka_unit_test_setup_teardown(test_should_handle_histories_with_lots_of_branching_and_merging, setup, + teardown), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/rust/automerge-c/test/str_utils.c b/rust/automerge-c/test/str_utils.c new file mode 100644 index 00000000..2937217a --- /dev/null +++ b/rust/automerge-c/test/str_utils.c @@ -0,0 +1,15 @@ +#include +#include + +/* local */ +#include "str_utils.h" + +void hex_to_bytes(char const* hex_str, uint8_t* src, size_t const count) { + unsigned int byte; + char const* next = hex_str; + for (size_t index = 0; *next && index != count; next += 2, ++index) { + if (sscanf(next, "%02x", &byte) == 1) { + src[index] = (uint8_t)byte; + } + } +} diff --git a/rust/automerge-c/test/str_utils.h b/rust/automerge-c/test/str_utils.h new file mode 100644 index 00000000..14a4af73 --- /dev/null +++ b/rust/automerge-c/test/str_utils.h @@ -0,0 +1,17 @@ +#ifndef TESTS_STR_UTILS_H +#define TESTS_STR_UTILS_H + +/** + * \brief Converts a hexadecimal string into an array of bytes. + * + * \param[in] hex_str A hexadecimal string. + * \param[in] src A pointer to an array of bytes. + * \param[in] count The count of bytes to copy into the array pointed to by + * \p src. + * \pre \p src `!= NULL` + * \pre `sizeof(`\p src `) > 0` + * \pre \p count `<= sizeof(`\p src `)` + */ +void hex_to_bytes(char const* hex_str, uint8_t* src, size_t const count); + +#endif /* TESTS_STR_UTILS_H */ diff --git a/rust/automerge-cli/.gitignore b/rust/automerge-cli/.gitignore new file mode 100644 index 00000000..eb5a316c --- /dev/null +++ b/rust/automerge-cli/.gitignore @@ -0,0 +1 @@ +target diff --git a/rust/automerge-cli/Cargo.toml b/rust/automerge-cli/Cargo.toml new file mode 100644 index 00000000..430090a6 --- /dev/null +++ b/rust/automerge-cli/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "automerge-cli" +version = "0.1.0" +authors = ["Alex Good "] +edition = "2018" +license = "MIT" +rust-version = "1.57.0" + +[[bin]] +name = "automerge" +path = "src/main.rs" +bench = false +doc = false + +[dependencies] +clap = {version = "~4", features = ["derive"]} +serde_json = "^1.0" +anyhow = "1.0" +thiserror = "^1.0" +combine = "^4.5" +maplit = "^1.0" +tracing-subscriber = "~0.3" + +automerge = { path = "../automerge" } +is-terminal = "0.4.1" +termcolor = "1.1.3" +serde = "1.0.150" + +[dev-dependencies] +duct = "^0.13" diff --git a/automerge-cli/IDEAS.md b/rust/automerge-cli/IDEAS.md similarity index 100% rename from automerge-cli/IDEAS.md rename to rust/automerge-cli/IDEAS.md diff --git a/automerge-cli/src/change.rs b/rust/automerge-cli/src/change.rs similarity index 89% rename from automerge-cli/src/change.rs rename to rust/automerge-cli/src/change.rs index 914bdfbb..eef6aade 100644 --- a/automerge-cli/src/change.rs +++ b/rust/automerge-cli/src/change.rs @@ -1,5 +1,4 @@ -use automerge_backend as amb; -use automerge_frontend as amf; +use automerge as am; use combine::{parser::char as charparser, EasyParser, ParseError, Parser}; use thiserror::Error; @@ -15,12 +14,7 @@ pub enum ChangeError { #[error("Error loading changes: {:?}", source)] ErrApplyingInitialChanges { #[source] - source: amb::AutomergeError, - }, - #[error("Some changes were invalid: {:?}", source)] - InvalidChangeRequest { - #[from] - source: amf::InvalidChangeRequest, + source: am::AutomergeError, }, #[error("Error writing changes to output file: {:?}", source)] ErrWritingChanges { @@ -140,7 +134,7 @@ where op_parser() .skip(charparser::spaces()) .skip(charparser::string("$")) - .and(path_segment_parser(amf::Path::root())), + .and(path_segment_parser(am::Path::root())), ) .skip(charparser::spaces()) .then(|(operation, path)| { @@ -175,29 +169,17 @@ pub fn change( mut writer: impl std::io::Write, script: &str, ) -> Result<(), ChangeError> { - let mut backend = amb::Backend::new(); let mut buf: Vec = Vec::new(); reader .read_to_end(&mut buf) .map_err(|e| ChangeError::ErrReadingChanges { source: e })?; - let changes = amb::Change::load_document(&buf) + let backend = am::Automerge::load(&buf) .map_err(|e| ChangeError::ErrApplyingInitialChanges { source: e })?; - let mut frontend = amf::Frontend::new(); - let patch = backend - .apply_changes(changes) - .map_err(|e| ChangeError::ErrApplyingInitialChanges { source: e })?; - // This unwrap should be fine, we've generated the patch ourselves, if it's invalid then - // there's no way for the user to recover - frontend.apply_patch(patch).unwrap(); let local_change = parse_change_script(script)?; let ((), new_changes) = frontend.change::<_, _, amf::InvalidChangeRequest>(None, |d| { d.add_change(local_change)?; Ok(()) })?; - if let Some(c) = new_changes { - // The user can't do anything to recover if this fails so we unwrap - backend.apply_local_change(c).unwrap(); - } let change_bytes = backend.save().unwrap(); writer .write_all(&change_bytes) diff --git a/rust/automerge-cli/src/color_json.rs b/rust/automerge-cli/src/color_json.rs new file mode 100644 index 00000000..9514da22 --- /dev/null +++ b/rust/automerge-cli/src/color_json.rs @@ -0,0 +1,370 @@ +use std::io::Write; + +use serde::Serialize; +use serde_json::ser::Formatter; +use termcolor::{Buffer, BufferWriter, Color, ColorSpec, WriteColor}; + +struct Style { + /// style of object brackets + object_brackets: ColorSpec, + /// style of array brackets + array_brackets: ColorSpec, + /// style of object + key: ColorSpec, + /// style of string values + string_value: ColorSpec, + /// style of integer values + integer_value: ColorSpec, + /// style of float values + float_value: ColorSpec, + /// style of bool values + bool_value: ColorSpec, + /// style of the `nil` value + nil_value: ColorSpec, + /// should the quotation get the style of the inner string/key? + string_include_quotation: bool, +} + +impl Default for Style { + fn default() -> Self { + Self { + object_brackets: ColorSpec::new().set_bold(true).clone(), + array_brackets: ColorSpec::new().set_bold(true).clone(), + key: ColorSpec::new() + .set_fg(Some(Color::Blue)) + .set_bold(true) + .clone(), + string_value: ColorSpec::new().set_fg(Some(Color::Green)).clone(), + integer_value: ColorSpec::new(), + float_value: ColorSpec::new(), + bool_value: ColorSpec::new(), + nil_value: ColorSpec::new(), + string_include_quotation: true, + } + } +} + +/// Write pretty printed, colored json to stdout +pub(crate) fn print_colored_json(value: &serde_json::Value) -> std::io::Result<()> { + let formatter = ColoredFormatter { + formatter: serde_json::ser::PrettyFormatter::new(), + style: Style::default(), + in_object_key: false, + }; + let mut ignored_writer = Vec::new(); + let mut ser = serde_json::Serializer::with_formatter(&mut ignored_writer, formatter); + value + .serialize(&mut ser) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string())) +} + +struct ColoredFormatter { + formatter: F, + style: Style, + in_object_key: bool, +} + +fn write_colored(color: ColorSpec, handler: H) -> std::io::Result<()> +where + H: FnOnce(&mut Buffer) -> std::io::Result<()>, +{ + let buf = BufferWriter::stdout(termcolor::ColorChoice::Auto); + let mut buffer = buf.buffer(); + buffer.set_color(&color)?; + handler(&mut buffer)?; + buffer.reset()?; + buf.print(&buffer)?; + Ok(()) +} + +impl Formatter for ColoredFormatter { + fn write_null(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.nil_value.clone(), |w| { + self.formatter.write_null(w) + }) + } + + fn write_bool(&mut self, _writer: &mut W, value: bool) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.bool_value.clone(), |w| { + self.formatter.write_bool(w, value) + }) + } + + fn write_i8(&mut self, _writer: &mut W, value: i8) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_i8(w, value) + }) + } + + fn write_i16(&mut self, _writer: &mut W, value: i16) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_i16(w, value) + }) + } + + fn write_i32(&mut self, _writer: &mut W, value: i32) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_i32(w, value) + }) + } + + fn write_i64(&mut self, _writer: &mut W, value: i64) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_i64(w, value) + }) + } + + fn write_i128(&mut self, _writer: &mut W, value: i128) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_i128(w, value) + }) + } + + fn write_u8(&mut self, _writer: &mut W, value: u8) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_u8(w, value) + }) + } + + fn write_u16(&mut self, _writer: &mut W, value: u16) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_u16(w, value) + }) + } + + fn write_u32(&mut self, _writer: &mut W, value: u32) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_u32(w, value) + }) + } + + fn write_u64(&mut self, _writer: &mut W, value: u64) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_u64(w, value) + }) + } + + fn write_u128(&mut self, _writer: &mut W, value: u128) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_u128(w, value) + }) + } + + fn write_f32(&mut self, _writer: &mut W, value: f32) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.float_value.clone(), |w| { + self.formatter.write_f32(w, value) + }) + } + + fn write_f64(&mut self, _writer: &mut W, value: f64) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.float_value.clone(), |w| { + self.formatter.write_f64(w, value) + }) + } + + fn write_number_str(&mut self, _writer: &mut W, value: &str) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.integer_value.clone(), |w| { + self.formatter.write_number_str(w, value) + }) + } + + fn begin_string(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + let style = if self.style.string_include_quotation { + if self.in_object_key { + self.style.key.clone() + } else { + self.style.string_value.clone() + } + } else { + ColorSpec::new() + }; + write_colored(style, |w| self.formatter.begin_string(w)) + } + + fn end_string(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + let style = if self.style.string_include_quotation { + if self.in_object_key { + self.style.key.clone() + } else { + self.style.string_value.clone() + } + } else { + ColorSpec::new() + }; + write_colored(style, |w| self.formatter.end_string(w)) + } + + fn write_string_fragment(&mut self, _writer: &mut W, fragment: &str) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + let style = if self.in_object_key { + self.style.key.clone() + } else { + self.style.string_value.clone() + }; + write_colored(style, |w| w.write_all(fragment.as_bytes())) + } + + fn write_char_escape( + &mut self, + _writer: &mut W, + char_escape: serde_json::ser::CharEscape, + ) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + let style = if self.in_object_key { + self.style.key.clone() + } else { + self.style.string_value.clone() + }; + write_colored(style, |w| self.formatter.write_char_escape(w, char_escape)) + } + + fn begin_array(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.array_brackets.clone(), |w| { + self.formatter.begin_array(w) + }) + } + + fn end_array(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.array_brackets.clone(), |w| { + self.formatter.end_array(w) + }) + } + + fn begin_array_value(&mut self, _writer: &mut W, first: bool) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(ColorSpec::new(), |w| { + self.formatter.begin_array_value(w, first) + }) + } + + fn end_array_value(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(ColorSpec::new(), |w| self.formatter.end_array_value(w)) + } + + fn begin_object(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.object_brackets.clone(), |w| { + self.formatter.begin_object(w) + }) + } + + fn end_object(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(self.style.object_brackets.clone(), |w| { + self.formatter.end_object(w) + }) + } + + fn begin_object_key(&mut self, _writer: &mut W, first: bool) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + self.in_object_key = true; + write_colored(ColorSpec::new(), |w| { + self.formatter.begin_object_key(w, first) + }) + } + + fn end_object_key(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + self.in_object_key = false; + write_colored(ColorSpec::new(), |w| self.formatter.end_object_key(w)) + } + + fn begin_object_value(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + self.in_object_key = false; + write_colored(ColorSpec::new(), |w| self.formatter.begin_object_value(w)) + } + + fn end_object_value(&mut self, _writer: &mut W) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + self.in_object_key = false; + write_colored(ColorSpec::new(), |w| self.formatter.end_object_value(w)) + } + + fn write_raw_fragment(&mut self, _writer: &mut W, fragment: &str) -> std::io::Result<()> + where + W: ?Sized + std::io::Write, + { + write_colored(ColorSpec::new(), |w| { + self.formatter.write_raw_fragment(w, fragment) + }) + } +} diff --git a/automerge-cli/src/examine.rs b/rust/automerge-cli/src/examine.rs similarity index 54% rename from automerge-cli/src/examine.rs rename to rust/automerge-cli/src/examine.rs index 96384eee..0ee102fb 100644 --- a/automerge-cli/src/examine.rs +++ b/rust/automerge-cli/src/examine.rs @@ -1,46 +1,55 @@ -use automerge_backend as amb; -use automerge_protocol as amp; +use automerge as am; use thiserror::Error; +use crate::{color_json::print_colored_json, SkipVerifyFlag}; + #[derive(Error, Debug)] pub enum ExamineError { #[error("Error reading change file: {:?}", source)] - ErrReadingChanges { + ReadingChanges { #[source] source: std::io::Error, }, #[error("Error loading changes: {:?}", source)] - ErrApplyingInitialChanges { + ApplyingInitialChanges { #[source] - source: amb::AutomergeError, + source: am::AutomergeError, }, #[error("Error writing to output: {:?}", source)] - ErrWritingToOutput { + WritingToOutput { #[source] source: std::io::Error, }, } -pub fn examine( +pub(crate) fn examine( mut input: impl std::io::Read, mut output: impl std::io::Write, + skip: SkipVerifyFlag, is_tty: bool, ) -> Result<(), ExamineError> { let mut buf: Vec = Vec::new(); input .read_to_end(&mut buf) - .map_err(|e| ExamineError::ErrReadingChanges { source: e })?; - let changes = amb::Change::load_document(&buf) - .map_err(|e| ExamineError::ErrApplyingInitialChanges { source: e })?; - let uncompressed_changes: Vec = changes.iter().map(|c| c.decode()).collect(); + .map_err(|e| ExamineError::ReadingChanges { source: e })?; + let doc = skip + .load(&buf) + .map_err(|e| ExamineError::ApplyingInitialChanges { source: e })?; + let uncompressed_changes: Vec<_> = doc + .get_changes(&[]) + .unwrap() + .iter() + .map(|c| c.decode()) + .collect(); if is_tty { let json_changes = serde_json::to_value(uncompressed_changes).unwrap(); - colored_json::write_colored_json(&json_changes, &mut output).unwrap(); + print_colored_json(&json_changes).unwrap(); + writeln!(output).unwrap(); } else { let json_changes = serde_json::to_string_pretty(&uncompressed_changes).unwrap(); output .write_all(&json_changes.into_bytes()) - .map_err(|e| ExamineError::ErrWritingToOutput { source: e })?; + .map_err(|e| ExamineError::WritingToOutput { source: e })?; } Ok(()) } diff --git a/rust/automerge-cli/src/examine_sync.rs b/rust/automerge-cli/src/examine_sync.rs new file mode 100644 index 00000000..c0d5df97 --- /dev/null +++ b/rust/automerge-cli/src/examine_sync.rs @@ -0,0 +1,38 @@ +use automerge::sync::ReadMessageError; + +use crate::color_json::print_colored_json; + +#[derive(Debug, thiserror::Error)] +pub enum ExamineSyncError { + #[error("Error reading message: {0}")] + ReadMessage(#[source] std::io::Error), + + #[error("error writing message: {0}")] + WriteMessage(#[source] std::io::Error), + + #[error("error writing json to output: {0}")] + WriteJson(#[source] serde_json::Error), + + #[error("Error parsing message: {0}")] + ParseMessage(#[from] ReadMessageError), +} + +pub(crate) fn examine_sync( + mut input: Box, + output: W, + is_tty: bool, +) -> Result<(), ExamineSyncError> { + let mut buf: Vec = Vec::new(); + input + .read_to_end(&mut buf) + .map_err(ExamineSyncError::ReadMessage)?; + + let message = automerge::sync::Message::decode(&buf)?; + let json = serde_json::to_value(message).unwrap(); + if is_tty { + print_colored_json(&json).map_err(ExamineSyncError::WriteMessage)?; + } else { + serde_json::to_writer(output, &json).map_err(ExamineSyncError::WriteJson)?; + } + Ok(()) +} diff --git a/rust/automerge-cli/src/export.rs b/rust/automerge-cli/src/export.rs new file mode 100644 index 00000000..45f39101 --- /dev/null +++ b/rust/automerge-cli/src/export.rs @@ -0,0 +1,163 @@ +use anyhow::Result; +use automerge as am; +use automerge::ReadDoc; + +use crate::{color_json::print_colored_json, SkipVerifyFlag}; + +pub(crate) fn map_to_json(doc: &am::Automerge, obj: &am::ObjId) -> serde_json::Value { + let keys = doc.keys(obj); + let mut map = serde_json::Map::new(); + for k in keys { + let val = doc.get(obj, &k); + match val { + Ok(Some((am::Value::Object(o), exid))) + if o == am::ObjType::Map || o == am::ObjType::Table => + { + map.insert(k.to_owned(), map_to_json(doc, &exid)); + } + Ok(Some((am::Value::Object(_), exid))) => { + map.insert(k.to_owned(), list_to_json(doc, &exid)); + } + Ok(Some((am::Value::Scalar(v), _))) => { + map.insert(k.to_owned(), scalar_to_json(&v)); + } + _ => (), + }; + } + serde_json::Value::Object(map) +} + +fn list_to_json(doc: &am::Automerge, obj: &am::ObjId) -> serde_json::Value { + let len = doc.length(obj); + let mut array = Vec::new(); + for i in 0..len { + let val = doc.get(obj, i); + match val { + Ok(Some((am::Value::Object(o), exid))) + if o == am::ObjType::Map || o == am::ObjType::Table => + { + array.push(map_to_json(doc, &exid)); + } + Ok(Some((am::Value::Object(_), exid))) => { + array.push(list_to_json(doc, &exid)); + } + Ok(Some((am::Value::Scalar(v), _))) => { + array.push(scalar_to_json(&v)); + } + _ => (), + }; + } + serde_json::Value::Array(array) +} + +fn scalar_to_json(val: &am::ScalarValue) -> serde_json::Value { + match val { + am::ScalarValue::Str(s) => serde_json::Value::String(s.to_string()), + am::ScalarValue::Bytes(b) | am::ScalarValue::Unknown { bytes: b, .. } => { + serde_json::Value::Array( + b.iter() + .map(|byte| serde_json::Value::Number((*byte).into())) + .collect(), + ) + } + am::ScalarValue::Int(n) => serde_json::Value::Number((*n).into()), + am::ScalarValue::Uint(n) => serde_json::Value::Number((*n).into()), + am::ScalarValue::F64(n) => serde_json::Number::from_f64(*n) + .unwrap_or_else(|| 0_i64.into()) + .into(), + am::ScalarValue::Counter(c) => serde_json::Value::Number(i64::from(c).into()), + am::ScalarValue::Timestamp(n) => serde_json::Value::Number((*n).into()), + am::ScalarValue::Boolean(b) => serde_json::Value::Bool(*b), + am::ScalarValue::Null => serde_json::Value::Null, + } +} + +fn get_state_json(input_data: Vec, skip: SkipVerifyFlag) -> Result { + let doc = skip.load(&input_data).unwrap(); // FIXME + Ok(map_to_json(&doc, &am::ObjId::Root)) +} + +pub(crate) fn export_json( + mut changes_reader: impl std::io::Read, + mut writer: impl std::io::Write, + skip: SkipVerifyFlag, + is_tty: bool, +) -> Result<()> { + let mut input_data = vec![]; + changes_reader.read_to_end(&mut input_data)?; + + let state_json = get_state_json(input_data, skip)?; + if is_tty { + print_colored_json(&state_json).unwrap(); + writeln!(writer).unwrap(); + } else { + writeln!( + writer, + "{}", + serde_json::to_string_pretty(&state_json).unwrap() + )?; + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::import::initialize_from_json; + + #[test] + fn cli_export_with_empty_input() { + assert_eq!( + get_state_json(vec![], Default::default()).unwrap(), + serde_json::json!({}) + ) + } + + #[test] + fn cli_export_with_flat_map() { + let initial_state_json: serde_json::Value = + serde_json::from_str(r#"{"sparrows": 15.0}"#).unwrap(); + //let value: am::Value = am::Value::from_json(&initial_state_json); + //let (_, initial_change) = am::Frontend::new_with_initial_state(value).unwrap(); + //let mut backend = am::Automerge::new(); + //backend.apply_local_change(initial_change).unwrap(); + let mut backend = initialize_from_json(&initial_state_json).unwrap(); + let change_bytes = backend.save(); + assert_eq!( + get_state_json(change_bytes, Default::default()).unwrap(), + serde_json::json!({"sparrows": 15.0}) + ) + } + + #[test] + fn cli_export_with_nested_map() { + let initial_state_json: serde_json::Value = serde_json::from_str( + r#"{ + "birds": { + "wrens": 3.0, + "sparrows": 15.0 + } +}"#, + ) + .unwrap(); + let mut backend = initialize_from_json(&initial_state_json).unwrap(); + /* + let value: am::Value = am::Value::from_json(&initial_state_json); + + //let (_, initial_change) = am::Frontend::new_with_initial_state(value).unwrap(); + let mut backend = am::Automerge::new(); + //backend.apply_local_change(initial_change).unwrap(); + + */ + let change_bytes = backend.save(); + assert_eq!( + get_state_json(change_bytes, Default::default()).unwrap(), + serde_json::json!({ + "birds": { + "wrens": 3.0, + "sparrows": 15.0 + } + }) + ) + } +} diff --git a/rust/automerge-cli/src/import.rs b/rust/automerge-cli/src/import.rs new file mode 100644 index 00000000..a9556071 --- /dev/null +++ b/rust/automerge-cli/src/import.rs @@ -0,0 +1,108 @@ +use automerge as am; +use automerge::transaction::Transactable; + +pub(crate) fn initialize_from_json( + json_value: &serde_json::Value, +) -> anyhow::Result { + let mut doc = am::AutoCommit::new(); + match json_value { + serde_json::Value::Object(m) => { + import_map(&mut doc, &am::ObjId::Root, m)?; + Ok(doc) + } + _ => anyhow::bail!("expected an object"), + } +} + +fn import_map( + doc: &mut am::AutoCommit, + obj: &am::ObjId, + map: &serde_json::Map, +) -> anyhow::Result<()> { + for (key, value) in map { + match value { + serde_json::Value::Null => { + doc.put(obj, key, ())?; + } + serde_json::Value::Bool(b) => { + doc.put(obj, key, *b)?; + } + serde_json::Value::String(s) => { + doc.put(obj, key, s)?; + } + serde_json::Value::Array(vec) => { + let id = doc.put_object(obj, key, am::ObjType::List)?; + import_list(doc, &id, vec)?; + } + serde_json::Value::Number(n) => { + if let Some(m) = n.as_i64() { + doc.put(obj, key, m)?; + } else if let Some(m) = n.as_u64() { + doc.put(obj, key, m)?; + } else if let Some(m) = n.as_f64() { + doc.put(obj, key, m)?; + } else { + anyhow::bail!("not a number"); + } + } + serde_json::Value::Object(map) => { + let id = doc.put_object(obj, key, am::ObjType::Map)?; + import_map(doc, &id, map)?; + } + } + } + Ok(()) +} + +fn import_list( + doc: &mut am::AutoCommit, + obj: &am::ObjId, + list: &[serde_json::Value], +) -> anyhow::Result<()> { + for (i, value) in list.iter().enumerate() { + match value { + serde_json::Value::Null => { + doc.insert(obj, i, ())?; + } + serde_json::Value::Bool(b) => { + doc.insert(obj, i, *b)?; + } + serde_json::Value::String(s) => { + doc.insert(obj, i, s)?; + } + serde_json::Value::Array(vec) => { + let id = doc.insert_object(obj, i, am::ObjType::List)?; + import_list(doc, &id, vec)?; + } + serde_json::Value::Number(n) => { + if let Some(m) = n.as_i64() { + doc.insert(obj, i, m)?; + } else if let Some(m) = n.as_u64() { + doc.insert(obj, i, m)?; + } else if let Some(m) = n.as_f64() { + doc.insert(obj, i, m)?; + } else { + anyhow::bail!("not a number"); + } + } + serde_json::Value::Object(map) => { + let id = doc.insert_object(obj, i, am::ObjType::Map)?; + import_map(doc, &id, map)?; + } + } + } + Ok(()) +} + +pub fn import_json( + mut reader: impl std::io::Read, + mut writer: impl std::io::Write, +) -> anyhow::Result<()> { + let mut buffer = String::new(); + reader.read_to_string(&mut buffer)?; + + let json_value: serde_json::Value = serde_json::from_str(&buffer)?; + let mut doc = initialize_from_json(&json_value)?; + writer.write_all(&doc.save())?; + Ok(()) +} diff --git a/rust/automerge-cli/src/main.rs b/rust/automerge-cli/src/main.rs new file mode 100644 index 00000000..8f3f816d --- /dev/null +++ b/rust/automerge-cli/src/main.rs @@ -0,0 +1,240 @@ +use std::{fs::File, path::PathBuf, str::FromStr}; + +use anyhow::{anyhow, Result}; +use clap::{ + builder::{BoolishValueParser, TypedValueParser, ValueParserFactory}, + Parser, +}; +use is_terminal::IsTerminal; + +mod color_json; +mod examine; +mod examine_sync; +mod export; +mod import; +mod merge; + +#[derive(Parser, Debug)] +#[clap(about = "Automerge CLI")] +struct Opts { + #[clap(subcommand)] + cmd: Command, +} + +#[derive(clap::ValueEnum, Clone, Debug)] +enum ExportFormat { + Json, + Toml, +} + +#[derive(Copy, Clone, Default, Debug)] +pub(crate) struct SkipVerifyFlag(bool); + +impl SkipVerifyFlag { + fn load(&self, buf: &[u8]) -> Result { + if self.0 { + automerge::Automerge::load(buf) + } else { + automerge::Automerge::load_unverified_heads(buf) + } + } +} + +#[derive(Clone)] +struct SkipVerifyFlagParser; +impl ValueParserFactory for SkipVerifyFlag { + type Parser = SkipVerifyFlagParser; + + fn value_parser() -> Self::Parser { + SkipVerifyFlagParser + } +} + +impl TypedValueParser for SkipVerifyFlagParser { + type Value = SkipVerifyFlag; + + fn parse_ref( + &self, + cmd: &clap::Command, + arg: Option<&clap::Arg>, + value: &std::ffi::OsStr, + ) -> Result { + BoolishValueParser::new() + .parse_ref(cmd, arg, value) + .map(SkipVerifyFlag) + } +} + +impl FromStr for ExportFormat { + type Err = anyhow::Error; + + fn from_str(input: &str) -> Result { + match input { + "json" => Ok(ExportFormat::Json), + "toml" => Ok(ExportFormat::Toml), + _ => Err(anyhow!("Invalid export format: {}", input)), + } + } +} + +#[derive(Debug, Parser)] +enum Command { + /// Output current state of an Automerge document in a specified format + Export { + /// Format for output: json, toml + #[clap(long, short, default_value = "json")] + format: ExportFormat, + + /// Path that contains Automerge changes + changes_file: Option, + + /// The file to write to. If omitted assumes stdout + #[clap(long("out"), short('o'))] + output_file: Option, + + /// Whether to verify the head hashes of a compressed document + #[clap(long, action = clap::ArgAction::SetFalse)] + skip_verifying_heads: SkipVerifyFlag, + }, + + Import { + /// Format for input: json, toml + #[clap(long, short, default_value = "json")] + format: ExportFormat, + + input_file: Option, + + /// Path to write Automerge changes to + #[clap(long("out"), short('o'))] + changes_file: Option, + }, + + /// Read an automerge document and print a JSON representation of the changes in it to stdout + Examine { + input_file: Option, + skip_verifying_heads: SkipVerifyFlag, + }, + + /// Read an automerge sync messaage and print a JSON representation of it + ExamineSync { input_file: Option }, + + /// Read one or more automerge documents and output a merged, compacted version of them + Merge { + /// The file to write to. If omitted assumes stdout + #[clap(long("out"), short('o'))] + output_file: Option, + + /// The file(s) to compact. If empty assumes stdin + input: Vec, + }, +} + +fn open_file_or_stdin(maybe_path: Option) -> Result> { + if std::io::stdin().is_terminal() { + if let Some(path) = maybe_path { + Ok(Box::new(File::open(path).unwrap())) + } else { + Err(anyhow!( + "Must provide file path if not providing input via stdin" + )) + } + } else { + Ok(Box::new(std::io::stdin())) + } +} + +fn create_file_or_stdout(maybe_path: Option) -> Result> { + if std::io::stdout().is_terminal() { + if let Some(path) = maybe_path { + Ok(Box::new(File::create(path).unwrap())) + } else { + Err(anyhow!("Must provide file path if not piping to stdout")) + } + } else { + Ok(Box::new(std::io::stdout())) + } +} + +fn main() -> Result<()> { + tracing_subscriber::fmt::init(); + let opts = Opts::parse(); + match opts.cmd { + Command::Export { + changes_file, + format, + output_file, + skip_verifying_heads, + } => { + let output: Box = if let Some(output_file) = output_file { + Box::new(File::create(output_file)?) + } else { + Box::new(std::io::stdout()) + }; + match format { + ExportFormat::Json => { + let mut in_buffer = open_file_or_stdin(changes_file)?; + export::export_json( + &mut in_buffer, + output, + skip_verifying_heads, + std::io::stdout().is_terminal(), + ) + } + ExportFormat::Toml => unimplemented!(), + } + } + Command::Import { + format, + input_file, + changes_file, + } => match format { + ExportFormat::Json => { + let mut out_buffer = create_file_or_stdout(changes_file)?; + let mut in_buffer = open_file_or_stdin(input_file)?; + import::import_json(&mut in_buffer, &mut out_buffer) + } + ExportFormat::Toml => unimplemented!(), + }, + Command::Examine { + input_file, + skip_verifying_heads, + } => { + let in_buffer = open_file_or_stdin(input_file)?; + let out_buffer = std::io::stdout(); + match examine::examine( + in_buffer, + out_buffer, + skip_verifying_heads, + std::io::stdout().is_terminal(), + ) { + Ok(()) => {} + Err(e) => { + eprintln!("Error: {:?}", e); + } + } + Ok(()) + } + Command::ExamineSync { input_file } => { + let in_buffer = open_file_or_stdin(input_file)?; + let out_buffer = std::io::stdout(); + match examine_sync::examine_sync(in_buffer, out_buffer, std::io::stdout().is_terminal()) + { + Ok(()) => {} + Err(e) => { + eprintln!("Error: {:?}", e); + } + } + Ok(()) + } + Command::Merge { input, output_file } => { + let out_buffer = create_file_or_stdout(output_file)?; + match merge::merge(input.into(), out_buffer) { + Ok(()) => {} + Err(e) => { + eprintln!("Failed to merge: {}", e); + } + }; + Ok(()) + } + } +} diff --git a/rust/automerge-cli/src/merge.rs b/rust/automerge-cli/src/merge.rs new file mode 100644 index 00000000..936af246 --- /dev/null +++ b/rust/automerge-cli/src/merge.rs @@ -0,0 +1,58 @@ +use automerge as am; +use std::{ + io::Read, + path::{Path, PathBuf}, +}; + +pub(super) enum Inputs { + Stdin, + Paths(Vec), +} + +impl From> for Inputs { + fn from(i: Vec) -> Self { + if i.is_empty() { + Inputs::Stdin + } else { + Inputs::Paths(i) + } + } +} + +#[derive(Debug, thiserror::Error)] +pub(super) enum MergeError { + #[error(transparent)] + Io(#[from] std::io::Error), + #[error("failed to load {path}: {error}")] + FailedToLoad { + path: PathBuf, + error: Box, + }, + #[error(transparent)] + Automerge(#[from] am::AutomergeError), +} + +pub(super) fn merge(inputs: Inputs, mut output: W) -> Result<(), MergeError> { + let mut backend = am::Automerge::new(); + match inputs { + Inputs::Stdin => { + let mut input = Vec::new(); + std::io::stdin().read_to_end(&mut input)?; + backend.load_incremental(&input)?; + } + Inputs::Paths(paths) => { + for path in paths { + load_path(&mut backend, &path) + .map_err(|error| MergeError::FailedToLoad { path, error })?; + } + } + } + output.write_all(&backend.save())?; + Ok(()) +} + +fn load_path(backend: &mut am::Automerge, path: &Path) -> Result<(), Box> { + let input = std::fs::read(path).map_err(Box::new)?; + backend.load_incremental(&input).map_err(Box::new)?; + Ok(()) +} diff --git a/automerge-cli/tests/integration.rs b/rust/automerge-cli/tests/integration.rs similarity index 54% rename from automerge-cli/tests/integration.rs rename to rust/automerge-cli/tests/integration.rs index dc391ace..87e30db7 100644 --- a/automerge-cli/tests/integration.rs +++ b/rust/automerge-cli/tests/integration.rs @@ -2,45 +2,45 @@ use std::env; use duct::cmd; -#[test] -fn import_stdin() { - let bin = env!("CARGO_BIN_EXE_automerge"); - let initial_state_json = serde_json::json!({ - "birds": { - "wrens": 3.0, - "sparrows": 15.0 - } - }); - let json_bytes = serde_json::to_string_pretty(&initial_state_json).unwrap(); +// #[test] +// fn import_stdin() { +// let bin = env!("CARGO_BIN_EXE_automerge"); +// let initial_state_json = serde_json::json!({ +// "birds": { +// "wrens": 3.0, +// "sparrows": 15.0 +// } +// }); +// let json_bytes = serde_json::to_string_pretty(&initial_state_json).unwrap(); - let no_pipe_no_file = cmd!(bin, "import").stdin_bytes(json_bytes.clone()).run(); +// let no_pipe_no_file = cmd!(bin, "import").stdin_bytes(json_bytes.clone()).run(); - assert!(no_pipe_no_file.is_err()); +// assert!(no_pipe_no_file.is_err()); - let pipe_no_file = cmd!(bin, "import") - .stdin_bytes(json_bytes.clone()) - .stdout_capture() - .run(); +// let pipe_no_file = cmd!(bin, "import") +// .stdin_bytes(json_bytes.clone()) +// .stdout_capture() +// .run(); - assert!(pipe_no_file.is_ok()); +// assert!(pipe_no_file.is_ok()); - let mut temp_file = std::env::temp_dir(); - temp_file.push("import_test.mpl"); - let no_pipe_file = cmd!(bin, "import", "--out", &temp_file) - .stdin_bytes(json_bytes) - .run(); +// let mut temp_file = std::env::temp_dir(); +// temp_file.push("import_test.mpl"); +// let no_pipe_file = cmd!(bin, "import", "--out", &temp_file) +// .stdin_bytes(json_bytes) +// .run(); - assert!(no_pipe_file.is_ok()); - std::fs::remove_file(temp_file).unwrap(); -} +// assert!(no_pipe_file.is_ok()); +// std::fs::remove_file(temp_file).unwrap(); +// } -#[test] -fn export_stdout() { - let bin = env!("CARGO_BIN_EXE_automerge"); - let no_pipe_no_file = cmd!(bin, "export").stdout_capture().run(); +// #[test] +// fn export_stdout() { +// let bin = env!("CARGO_BIN_EXE_automerge"); +// let no_pipe_no_file = cmd!(bin, "export").stdout_capture().run(); - assert!(no_pipe_no_file.is_err()); -} +// assert!(no_pipe_no_file.is_err()); +// } #[test] fn import_export_isomorphic() { @@ -61,6 +61,7 @@ fn import_export_isomorphic() { assert_eq!(stdout, json_bytes); } +/* #[test] fn import_change_export() { let bin = env!("CARGO_BIN_EXE_automerge"); @@ -89,3 +90,4 @@ fn import_change_export() { }); assert_eq!(result, expected); } +*/ diff --git a/rust/automerge-test/Cargo.toml b/rust/automerge-test/Cargo.toml new file mode 100644 index 00000000..9290d7ac --- /dev/null +++ b/rust/automerge-test/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "automerge-test" +version = "0.2.0" +edition = "2021" +license = "MIT" +repository = "https://github.com/automerge/automerge-rs" +rust-version = "1.57.0" +description = "Utilities for testing automerge libraries" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +automerge = { version = "^0.3", path = "../automerge" } +smol_str = { version = "^0.1.21", features=["serde"] } +serde = { version = "^1.0", features=["derive"] } +decorum = "0.3.1" +serde_json = { version = "^1.0.73", features=["float_roundtrip"], default-features=true } diff --git a/rust/automerge-test/README.md b/rust/automerge-test/README.md new file mode 100644 index 00000000..2cadabbb --- /dev/null +++ b/rust/automerge-test/README.md @@ -0,0 +1,3 @@ +# `automerge-test` + +Utilities for making assertions about automerge documents diff --git a/rust/automerge-test/src/lib.rs b/rust/automerge-test/src/lib.rs new file mode 100644 index 00000000..a1d4ea89 --- /dev/null +++ b/rust/automerge-test/src/lib.rs @@ -0,0 +1,496 @@ +use std::{ + collections::{BTreeMap, BTreeSet}, + convert::TryInto, + hash::Hash, +}; + +use automerge::ReadDoc; + +use serde::ser::{SerializeMap, SerializeSeq}; + +pub fn new_doc() -> automerge::AutoCommit { + let mut d = automerge::AutoCommit::new(); + d.set_actor(automerge::ActorId::random()); + d +} + +pub fn new_doc_with_actor(actor: automerge::ActorId) -> automerge::AutoCommit { + let mut d = automerge::AutoCommit::new(); + d.set_actor(actor); + d +} + +/// Returns two actor IDs, the first considered to be ordered before the second +pub fn sorted_actors() -> (automerge::ActorId, automerge::ActorId) { + let a = automerge::ActorId::random(); + let b = automerge::ActorId::random(); + if a > b { + (b, a) + } else { + (a, b) + } +} + +/// This macro makes it easy to make assertions about a document. It is called with two arguments, +/// the first is a reference to an `automerge::Automerge`, the second is an instance of +/// `RealizedObject`. +/// +/// What - I hear you ask - is a `RealizedObject`? It's a fully hydrated version of the contents of +/// an automerge document. You don't need to think about this too much though because you can +/// easily construct one with the `map!` and `list!` macros. Here's an example: +/// +/// ## Constructing documents +/// +/// ```rust +/// # use automerge::transaction::Transactable; +/// # use automerge_test::{assert_doc, map, list}; +/// let mut doc = automerge::AutoCommit::new(); +/// let todos = doc.put_object(automerge::ROOT, "todos", automerge::ObjType::List).unwrap(); +/// let todo = doc.insert_object(todos, 0, automerge::ObjType::Map).unwrap(); +/// let title = doc.put(todo, "title", "water plants").unwrap(); +/// +/// assert_doc!( +/// &doc, +/// map!{ +/// "todos" => { +/// list![ +/// { map!{ "title" => { "water plants" } } } +/// ] +/// } +/// } +/// ); +/// +/// ``` +/// +/// This might look more complicated than you were expecting. Why is the first element in the list +/// wrapped in braces? Because every property in an automerge document can have multiple +/// conflicting values we must capture all of these. +/// +/// ```rust +/// # use automerge_test::{assert_doc, map}; +/// # use automerge::transaction::Transactable; +/// # use automerge::ReadDoc; +/// +/// let mut doc1 = automerge::AutoCommit::new(); +/// let mut doc2 = automerge::AutoCommit::new(); +/// doc1.put(automerge::ROOT, "field", "one").unwrap(); +/// doc2.put(automerge::ROOT, "field", "two").unwrap(); +/// doc1.merge(&mut doc2); +/// assert_doc!( +/// doc1.document(), +/// map!{ +/// "field" => { +/// "one", +/// "two" +/// } +/// } +/// ); +/// ``` +#[macro_export] +macro_rules! assert_doc { + ($doc: expr, $expected: expr) => {{ + use $crate::realize; + let realized = realize($doc); + let expected_obj = $expected.into(); + if realized != expected_obj { + $crate::pretty_panic(expected_obj, realized) + } + }}; +} + +/// Like `assert_doc` except that you can specify an object ID and property to select subsections +/// of the document. +#[macro_export] +macro_rules! assert_obj { + ($doc: expr, $obj_id: expr, $prop: expr, $expected: expr) => {{ + use $crate::realize_prop; + let realized = realize_prop($doc, $obj_id, $prop); + let expected_obj = $expected.into(); + if realized != expected_obj { + $crate::pretty_panic(expected_obj, realized) + } + }}; +} + +/// Construct `RealizedObject::Map`. This macro takes a nested set of curl braces. The outer set is +/// the keys of the map, the inner set is the set of values for that key: +/// +/// ``` +/// # use automerge_test::map; +/// map!{ +/// "key" => { +/// "value1", +/// "value2", +/// } +/// }; +/// ``` +/// +/// The map above would represent a map with a conflict on the "key" property. The values can be +/// anything which implements `Into`. Including nested calls to `map!` or `list!`. +#[macro_export] +macro_rules! map { + (@inner { $($value:expr,)+ }) => { map!(@inner { $($value),+ }) }; + (@inner { $($value:expr),* }) => { + { + use std::collections::BTreeSet; + use $crate::RealizedObject; + let mut inner: BTreeSet = BTreeSet::new(); + $( + let _ = inner.insert($value.into()); + )* + inner + } + }; + ($($key:expr => $inner:tt,)+) => { map!($($key => $inner),+) }; + ($($key:expr => $inner:tt),*) => { + { + use std::collections::{BTreeMap, BTreeSet}; + use $crate::RealizedObject; + let mut _map: BTreeMap> = ::std::collections::BTreeMap::new(); + $( + let inner = map!(@inner $inner); + let _ = _map.insert($key.to_string(), inner); + )* + RealizedObject::Map(_map) + } + } +} + +/// Construct `RealizedObject::Sequence`. This macro represents a sequence of values +/// +/// ``` +/// # use automerge_test::{list, RealizedObject}; +/// list![ +/// { +/// "value1", +/// "value2", +/// } +/// ]; +/// ``` +/// +/// The list above would represent a list with a conflict on the 0 index. The values can be +/// anything which implements `Into` including nested calls to +/// `map!` or `list!`. +#[macro_export] +macro_rules! list { + (@single $($x:tt)*) => (()); + (@count $($rest:tt),*) => (<[()]>::len(&[$(list!(@single $rest)),*])); + + (@inner { $($value:expr,)+ }) => { list!(@inner { $($value),+ }) }; + (@inner { $($value:expr),* }) => { + { + use std::collections::BTreeSet; + use $crate::RealizedObject; + let mut inner: BTreeSet = BTreeSet::new(); + $( + let _ = inner.insert($value.into()); + )* + inner + } + }; + ($($inner:tt,)+) => { list!($($inner),+) }; + ($($inner:tt),*) => { + { + use std::collections::BTreeSet; + let _cap = list!(@count $($inner),*); + let mut _list: Vec> = Vec::new(); + $( + let inner = list!(@inner $inner); + let _ = _list.push(inner); + )* + RealizedObject::Sequence(_list) + } + } +} + +pub fn mk_counter(value: i64) -> automerge::ScalarValue { + automerge::ScalarValue::counter(value) +} + +#[derive(Eq, Hash, PartialEq, Debug)] +pub struct ExportedOpId(String); + +impl std::fmt::Display for ExportedOpId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +/// A `RealizedObject` is a representation of all the current values in a document - including +/// conflicts. +#[derive(PartialEq, PartialOrd, Ord, Eq, Hash, Debug)] +pub enum RealizedObject { + Map(BTreeMap>), + Sequence(Vec>), + Value(OrdScalarValue), +} + +// A copy of automerge::ScalarValue which uses decorum::Total for floating point values. This makes the type +// orderable, which is useful when we want to compare conflicting values of a register in an +// automerge document. +#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] +pub enum OrdScalarValue { + Bytes(Vec), + Str(smol_str::SmolStr), + Int(i64), + Uint(u64), + F64(decorum::Total), + Counter(i64), + Timestamp(i64), + Boolean(bool), + Null, + Unknown { type_code: u8, bytes: Vec }, +} + +impl From for OrdScalarValue { + fn from(v: automerge::ScalarValue) -> Self { + match v { + automerge::ScalarValue::Bytes(v) => OrdScalarValue::Bytes(v), + automerge::ScalarValue::Str(v) => OrdScalarValue::Str(v), + automerge::ScalarValue::Int(v) => OrdScalarValue::Int(v), + automerge::ScalarValue::Uint(v) => OrdScalarValue::Uint(v), + automerge::ScalarValue::F64(v) => OrdScalarValue::F64(decorum::Total::from(v)), + automerge::ScalarValue::Counter(c) => OrdScalarValue::Counter(c.into()), + automerge::ScalarValue::Timestamp(v) => OrdScalarValue::Timestamp(v), + automerge::ScalarValue::Boolean(v) => OrdScalarValue::Boolean(v), + automerge::ScalarValue::Null => OrdScalarValue::Null, + automerge::ScalarValue::Unknown { type_code, bytes } => { + OrdScalarValue::Unknown { type_code, bytes } + } + } + } +} + +impl From<&OrdScalarValue> for automerge::ScalarValue { + fn from(v: &OrdScalarValue) -> Self { + match v { + OrdScalarValue::Bytes(v) => automerge::ScalarValue::Bytes(v.clone()), + OrdScalarValue::Str(v) => automerge::ScalarValue::Str(v.clone()), + OrdScalarValue::Int(v) => automerge::ScalarValue::Int(*v), + OrdScalarValue::Uint(v) => automerge::ScalarValue::Uint(*v), + OrdScalarValue::F64(v) => automerge::ScalarValue::F64(v.into_inner()), + OrdScalarValue::Counter(v) => automerge::ScalarValue::counter(*v), + OrdScalarValue::Timestamp(v) => automerge::ScalarValue::Timestamp(*v), + OrdScalarValue::Boolean(v) => automerge::ScalarValue::Boolean(*v), + OrdScalarValue::Null => automerge::ScalarValue::Null, + OrdScalarValue::Unknown { type_code, bytes } => automerge::ScalarValue::Unknown { + type_code: *type_code, + bytes: bytes.to_vec(), + }, + } + } +} + +impl serde::Serialize for OrdScalarValue { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + OrdScalarValue::Bytes(v) => serializer.serialize_bytes(v), + OrdScalarValue::Str(v) => serializer.serialize_str(v.as_str()), + OrdScalarValue::Int(v) => serializer.serialize_i64(*v), + OrdScalarValue::Uint(v) => serializer.serialize_u64(*v), + OrdScalarValue::F64(v) => serializer.serialize_f64(v.into_inner()), + OrdScalarValue::Counter(v) => { + serializer.serialize_str(format!("Counter({})", v).as_str()) + } + OrdScalarValue::Timestamp(v) => { + serializer.serialize_str(format!("Timestamp({})", v).as_str()) + } + OrdScalarValue::Boolean(v) => serializer.serialize_bool(*v), + OrdScalarValue::Null => serializer.serialize_none(), + OrdScalarValue::Unknown { type_code, .. } => serializer + .serialize_str(format!("An unknown type with code {}", type_code).as_str()), + } + } +} + +impl serde::Serialize for RealizedObject { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + Self::Map(kvs) => { + let mut map_ser = serializer.serialize_map(Some(kvs.len()))?; + for (k, vs) in kvs { + let vs_serded = vs.iter().collect::>(); + map_ser.serialize_entry(k, &vs_serded)?; + } + map_ser.end() + } + Self::Sequence(elems) => { + let mut list_ser = serializer.serialize_seq(Some(elems.len()))?; + for elem in elems { + let vs_serded = elem.iter().collect::>(); + list_ser.serialize_element(&vs_serded)?; + } + list_ser.end() + } + Self::Value(v) => v.serialize(serializer), + } + } +} + +pub fn realize(doc: &R) -> RealizedObject { + realize_obj(doc, &automerge::ROOT, automerge::ObjType::Map) +} + +pub fn realize_prop>( + doc: &R, + obj_id: &automerge::ObjId, + prop: P, +) -> RealizedObject { + let (val, obj_id) = doc.get(obj_id, prop).unwrap().unwrap(); + match val { + automerge::Value::Object(obj_type) => realize_obj(doc, &obj_id, obj_type), + automerge::Value::Scalar(v) => RealizedObject::Value(OrdScalarValue::from(v.into_owned())), + } +} + +pub fn realize_obj( + doc: &R, + obj_id: &automerge::ObjId, + objtype: automerge::ObjType, +) -> RealizedObject { + match objtype { + automerge::ObjType::Map | automerge::ObjType::Table => { + let mut result = BTreeMap::new(); + for key in doc.keys(obj_id) { + result.insert(key.clone(), realize_values(doc, obj_id, key)); + } + RealizedObject::Map(result) + } + automerge::ObjType::List | automerge::ObjType::Text => { + let length = doc.length(obj_id); + let mut result = Vec::with_capacity(length); + for i in 0..length { + result.push(realize_values(doc, obj_id, i)); + } + RealizedObject::Sequence(result) + } + } +} + +fn realize_values>( + doc: &R, + obj_id: &automerge::ObjId, + key: K, +) -> BTreeSet { + let mut values = BTreeSet::new(); + for (value, objid) in doc.get_all(obj_id, key).unwrap() { + let realized = match value { + automerge::Value::Object(objtype) => realize_obj(doc, &objid, objtype), + automerge::Value::Scalar(v) => { + RealizedObject::Value(OrdScalarValue::from(v.into_owned())) + } + }; + values.insert(realized); + } + values +} + +impl> From>> for RealizedObject { + fn from(values: BTreeMap<&str, BTreeSet>) -> Self { + let intoed = values + .into_iter() + .map(|(k, v)| (k.to_string(), v.into_iter().map(|v| v.into()).collect())) + .collect(); + RealizedObject::Map(intoed) + } +} + +impl> From>> for RealizedObject { + fn from(values: Vec>) -> Self { + RealizedObject::Sequence( + values + .into_iter() + .map(|v| v.into_iter().map(|v| v.into()).collect()) + .collect(), + ) + } +} + +impl From for RealizedObject { + fn from(b: bool) -> Self { + RealizedObject::Value(OrdScalarValue::Boolean(b)) + } +} + +impl From for RealizedObject { + fn from(u: usize) -> Self { + let v = u.try_into().unwrap(); + RealizedObject::Value(OrdScalarValue::Int(v)) + } +} + +impl From for RealizedObject { + fn from(v: u64) -> Self { + RealizedObject::Value(OrdScalarValue::Uint(v)) + } +} + +impl From for RealizedObject { + fn from(v: u32) -> Self { + RealizedObject::Value(OrdScalarValue::Uint(v.into())) + } +} + +impl From for RealizedObject { + fn from(v: i64) -> Self { + RealizedObject::Value(OrdScalarValue::Int(v)) + } +} + +impl From for RealizedObject { + fn from(v: i32) -> Self { + RealizedObject::Value(OrdScalarValue::Int(v.into())) + } +} + +impl From for RealizedObject { + fn from(s: automerge::ScalarValue) -> Self { + RealizedObject::Value(OrdScalarValue::from(s)) + } +} + +impl From<&str> for RealizedObject { + fn from(s: &str) -> Self { + RealizedObject::Value(OrdScalarValue::Str(smol_str::SmolStr::from(s))) + } +} + +impl From for RealizedObject { + fn from(f: f64) -> Self { + RealizedObject::Value(OrdScalarValue::F64(f.into())) + } +} + +impl From> for RealizedObject { + fn from(vals: Vec) -> Self { + RealizedObject::Sequence( + vals.into_iter() + .map(|i| { + let mut set = BTreeSet::new(); + set.insert(i.into()); + set + }) + .collect(), + ) + } +} + +/// Pretty print the contents of a document +pub fn pretty_print(doc: &automerge::Automerge) { + println!("{}", serde_json::to_string_pretty(&realize(doc)).unwrap()) +} + +pub fn pretty_panic(expected_obj: RealizedObject, realized: RealizedObject) { + let serde_right = serde_json::to_string_pretty(&realized).unwrap(); + let serde_left = serde_json::to_string_pretty(&expected_obj).unwrap(); + panic!( + "documents didn't match\n expected\n{}\n got\n{}", + &serde_left, &serde_right + ); +} diff --git a/rust/automerge-wasm/.eslintignore b/rust/automerge-wasm/.eslintignore new file mode 100644 index 00000000..7cd573e3 --- /dev/null +++ b/rust/automerge-wasm/.eslintignore @@ -0,0 +1,3 @@ +web +nodejs +examples diff --git a/rust/automerge-wasm/.eslintrc.cjs b/rust/automerge-wasm/.eslintrc.cjs new file mode 100644 index 00000000..80e08d55 --- /dev/null +++ b/rust/automerge-wasm/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], +}; diff --git a/rust/automerge-wasm/.gitignore b/rust/automerge-wasm/.gitignore new file mode 100644 index 00000000..77c11e08 --- /dev/null +++ b/rust/automerge-wasm/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/bundler +/nodejs +/deno +Cargo.lock +yarn.lock diff --git a/automerge-backend-wasm/Cargo.toml b/rust/automerge-wasm/Cargo.toml similarity index 59% rename from automerge-backend-wasm/Cargo.toml rename to rust/automerge-wasm/Cargo.toml index 9b37a4b8..b6055a7d 100644 --- a/automerge-backend-wasm/Cargo.toml +++ b/rust/automerge-wasm/Cargo.toml @@ -1,14 +1,15 @@ # You must change these to your own details. [package] -name = "automerge-backend-wasm" +name = "automerge-wasm" description = "An js/wasm wrapper for the rust implementation of automerge-backend" repository = "https://github.com/automerge/automerge-rs" version = "0.1.0" authors = ["Alex Good ","Orion Henry ", "Martin Kleppmann"] categories = ["wasm"] readme = "README.md" -edition = "2018" +edition = "2021" license = "MIT" +rust-version = "1.57.0" [lib] crate-type = ["cdylib","rlib"] @@ -21,19 +22,30 @@ default = ["console_error_panic_hook"] [dependencies] console_error_panic_hook = { version = "^0.1", optional = true } # wee_alloc = { version = "^0.4", optional = true } -automerge-backend = { path = "../automerge-backend" } -automerge-protocol = { path = "../automerge-protocol" } +automerge = { path = "../automerge", features=["wasm"] } js-sys = "^0.3" serde = "^1.0" serde_json = "^1.0" -getrandom = { version = "0.2.2", features=["js"] } -uuid = { version = "^0.8.2", features=["v4", "wasm-bindgen", "serde"] } -serde-wasm-bindgen = "0.1.3" +rand = { version = "^0.8.4" } +getrandom = { version = "^0.2.2", features=["js"] } +uuid = { version = "^1.2.1", features=["v4", "js", "serde"] } +serde-wasm-bindgen = "0.4.3" serde_bytes = "0.11.5" +hex = "^0.4.3" +regex = "^1.5" +itertools = "^0.10.3" +thiserror = "^1.0.16" [dependencies.wasm-bindgen] -version = "^0.2" -features = ["serde-serialize"] +version = "^0.2.83" +#features = ["std"] +features = ["serde-serialize", "std"] + +[package.metadata.wasm-pack.profile.release] +# wasm-opt = false + +[package.metadata.wasm-pack.profile.profiling] +wasm-opt = false # The `web-sys` crate allows you to interact with the various browser APIs, # like the DOM. @@ -42,7 +54,9 @@ version = "0.3.22" features = ["console"] + [dev-dependencies] futures = "^0.1" -wasm-bindgen-futures = "^0.3" +proptest = { version = "^1.0.0", default-features = false, features = ["std"] } +wasm-bindgen-futures = "^0.4" wasm-bindgen-test = "^0.3" diff --git a/rust/automerge-wasm/LICENSE b/rust/automerge-wasm/LICENSE new file mode 100644 index 00000000..63b21502 --- /dev/null +++ b/rust/automerge-wasm/LICENSE @@ -0,0 +1,10 @@ +MIT License + +Copyright 2022, Ink & Switch LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/rust/automerge-wasm/README.md b/rust/automerge-wasm/README.md new file mode 100644 index 00000000..20256313 --- /dev/null +++ b/rust/automerge-wasm/README.md @@ -0,0 +1,469 @@ +## Automerge WASM Low Level Interface + +This package is a low level interface to the [automerge rust](https://github.com/automerge/automerge-rs/tree/experiment) CRDT. The api is intended to be as "close to the metal" as possible with only a few ease of use accommodations. This library is used as the underpinnings for the [Automerge JS wrapper](https://github.com/automerge/automerge-rs/tree/experiment/automerge-js) and can be used as is or as a basis for another higher level expression of a CRDT. + +All example code can be found in `test/readme.ts` + +### Why CRDT? + +CRDT stands for Conflict Free Replicated Data Type. It is a data structure that offers eventual consistency where multiple actors can write to the document independently and then these edits can be automatically merged together into a coherent document that, as much as possible, preserves the intent of the different writers. This allows for novel masterless application design where different components need not have a central coordinating server when altering application state. + +### Terminology + +The term Actor, Object Id and Heads are used through this documentation. Detailed explanations are in the glossary at the end of this readme. But the most basic definition would be... + +An Actor is a unique id that distinguishes a single writer to a document. It can be any hex string. + +An Object id uniquely identifies a Map, List or Text object within a document. It can be treated as an opaque string and can be used across documents. This id comes as a string in the form of `{number}@{actor}` - so `"10@aabbcc"` for example. The string `"_root"` or `"/"` can also be used to refer to the document root. These strings are durable and can be used on any descendant or copy of the document that generated them. + +Heads refers to a set of hashes that uniquely identifies a point in time in a document's history. Heads are useful for comparing documents state or retrieving past states from the document. + +### Automerge Scalar Types + +Automerge has many scalar types. Methods like `put()` and `insert()` take an optional data type parameter. Normally the type can be inferred but in some cases, such as telling the difference between int, uint and a counter, it cannot. + +These are puts without a data type + +```javascript + import { create } from "@automerge/automerge-wasm" + + let doc = create() + doc.put("/", "prop1", 100) // int + doc.put("/", "prop2", 3.14) // f64 + doc.put("/", "prop3", "hello world") + doc.put("/", "prop4", new Date()) + doc.put("/", "prop5", new Uint8Array([1,2,3])) + doc.put("/", "prop6", true) + doc.put("/", "prop7", null) +``` + +Put's with a data type and examples of all the supported data types. + +While int vs uint vs f64 matters little in javascript, Automerge is a cross platform library where these distinctions matter. + +```javascript + import { create } from "@automerge/automerge-wasm" + + let doc = create() + doc.put("/", "prop1", 100, "int") + doc.put("/", "prop2", 100, "uint") + doc.put("/", "prop3", 100.5, "f64") + doc.put("/", "prop4", 100, "counter") + doc.put("/", "prop5", 1647531707301, "timestamp") + doc.put("/", "prop6", new Date(), "timestamp") + doc.put("/", "prop7", "hello world", "str") + doc.put("/", "prop8", new Uint8Array([1,2,3]), "bytes") + doc.put("/", "prop9", true, "boolean") + doc.put("/", "prop10", null, "null") +``` + +### Automerge Object Types + +Automerge WASM supports 3 object types. Maps, lists, and text. Maps are key value stores where the values can be any scalar type or any object type. Lists are numerically indexed sets of data that can hold any scalar or any object type. + +```javascript + import { create } from "@automerge/automerge-wasm" + + let doc = create() + + // you can create an object by passing in the inital state - if blank pass in `{}` + // the return value is the Object Id + // these functions all return an object id + + let config = doc.putObject("/", "config", { align: "left", archived: false, cycles: [10, 19, 21] }) + let token = doc.putObject("/", "tokens", {}) + + // lists can be made with javascript arrays + + let birds = doc.putObject("/", "birds", ["bluejay", "penguin", "puffin"]) + let bots = doc.putObject("/", "bots", []) + + // text is initialized with a string + + let notes = doc.putObject("/", "notes", "Hello world!") +``` + +You can access objects by passing the object id as the first parameter for a call. + +```javascript + import { create } from "@automerge/automerge-wasm" + + let doc = create() + + let config = doc.putObject("/", "config", { align: "left", archived: false, cycles: [10, 19, 21] }) + + doc.put(config, "align", "right") + + // Anywhere Object Ids are being used a path can also be used. + // The following two statements are equivalent: + + // get the id then use it + + // get returns a single simple javascript value or undefined + // getWithType returns an Array of the datatype plus basic type or null + + let id = doc.getWithType("/", "config") + if (id && id[0] === 'map') { + doc.put(id[1], "align", "right") + } + + // use a path instead + + doc.put("/config", "align", "right") +``` + +Using the id directly is always faster (as it prevents the path to id conversion internally) so it is preferred for performance critical code. + +### Maps + +Maps are key/value stores. The root object is always a map. The keys are always strings. The values can be any scalar type or any object. + +```javascript + let doc = create() + let mymap = doc.putObject("_root", "mymap", { foo: "bar"}) + // make a new map with the foo key + + doc.put(mymap, "bytes", new Uint8Array([1,2,3])) + // assign a byte array to key `bytes` of the mymap object + + let submap = doc.putObject(mymap, "sub", {}) + // make a new empty object and assign it to the key `sub` of mymap + + doc.keys(mymap) // returns ["bytes","foo","sub"] + doc.materialize("_root") // returns { mymap: { bytes: new Uint8Array([1,2,3]), foo: "bar", sub: {}}} +``` + +### Lists + +Lists are index addressable sets of values. These values can be any scalar or object type. You can manipulate lists with `insert()`, `put()`, `insertObject()`, `putObject()`, `push()`, `pushObject()`, `splice()`, and `delete()`. + +```javascript + let doc = create() + let items = doc.putObject("_root", "items", [10,"box"]) + // init a new list with two elements + doc.push(items, true) // push `true` to the end of the list + doc.putObject(items, 0, { hello: "world" }) // overwrite the value 10 with an object with a key and value + doc.delete(items, 1) // delete "box" + doc.splice(items, 2, 0, ["bag", "brick"]) // splice in "bag" and "brick" at position 2 + doc.insert(items, 0, "bat") // insert "bat" to the beginning of the list + doc.insertObject(items, 1, [1,2]) // insert a list with 2 values at pos 1 + + doc.materialize(items) // returns [ "bat", [1,2], { hello : "world" }, true, "bag", "brick"] + doc.length(items) // returns 6 +``` + +### Text + +Text is a specialized list type intended for modifying a text document. The primary way to interact with a text document is via the `splice()` method. Spliced strings will be indexable by character (important to note for platforms that index by graphmeme cluster). + +```javascript + let doc = create("aaaaaa") + let notes = doc.putObject("_root", "notes", "Hello world") + doc.splice(notes, 6, 5, "everyone") + + doc.text(notes) // returns "Hello everyone" +``` + +### Tables + +Automerge's Table type is currently not implemented. + +### Querying Data + +When querying maps use the `get()` method with the object in question and the property to query. This method returns a tuple with the data type and the data. The `keys()` method will return all the keys on the object. If you are interested in conflicted values from a merge use `getAll()` instead which returns an array of values instead of just the winner. + +```javascript + let doc1 = create("aabbcc") + doc1.put("_root", "key1", "val1") + let key2 = doc1.putObject("_root", "key2", []) + + doc1.get("_root", "key1") // returns "val1" + doc1.getWithType("_root", "key2") // returns ["list", "2@aabbcc"] + doc1.keys("_root") // returns ["key1", "key2"] + + let doc2 = doc1.fork("ffaaff") + + // put a value concurrently + doc1.put("_root","key3","doc1val") + doc2.put("_root","key3","doc2val") + + doc1.merge(doc2) + + doc1.get("_root","key3") // returns "doc2val" + doc1.getAll("_root","key3") // returns [[ "str", "doc1val"], ["str", "doc2val"]] +``` + +### Counters + +Counters are 64 bit ints that support the increment operation. Frequently different actors will want to increment or decrement a number and have all these coalesse into a merged value. + +```javascript + let doc1 = create("aaaaaa") + doc1.put("_root", "number", 0) + doc1.put("_root", "total", 0, "counter") + + let doc2 = doc1.fork("bbbbbb") + doc2.put("_root", "number", 10) + doc2.increment("_root", "total", 11) + + doc1.put("_root", "number", 20) + doc1.increment("_root", "total", 22) + + doc1.merge(doc2) + + doc1.materialize("_root") // returns { number: 10, total: 33 } +``` + +### Transactions + +Generally speaking you don't need to think about transactions when using Automerge. Normal edits queue up into an in-progress transaction. You can query the number of ops in the current transaction with `pendingOps()`. The transaction will commit automatically on certains calls such as `save()`, `saveIncremental()`, `fork()`, `merge()`, `getHeads()`, `applyChanges()`, `generateSyncMessage()`, and `receiveSyncMessage()`. When the transaction commits the heads of the document change. If you want to roll back all the in progress ops you can call `doc.rollback()`. If you want to manually commit a transaction in progress you can call `doc.commit()` with an optional commit message and timestamp. + +```javascript + let doc = create() + + doc.put("_root", "key", "val1") + + doc.get("_root", "key") // returns "val1" + doc.pendingOps() // returns 1 + + doc.rollback() + + doc.get("_root", "key") // returns null + doc.pendingOps() // returns 0 + + doc.put("_root", "key", "val2") + + doc.pendingOps() // returns 1 + + doc.commit("test commit 1") + + doc.get("_root", "key") // returns "val2" + doc.pendingOps() // returns 0 +``` + +### Viewing Old Versions of the Document + +All query functions can take an optional argument of `heads` which allow you to query a prior document state. Heads are a set of change hashes that uniquely identify a point in the document history. The `getHeads()` method can retrieve these at any point. + +```javascript + let doc = create() + + doc.put("_root", "key", "val1") + let heads1 = doc.getHeads() + + doc.put("_root", "key", "val2") + let heads2 = doc.getHeads() + + doc.put("_root", "key", "val3") + + doc.get("_root","key") // returns "val3" + doc.get("_root","key",heads2) // returns "val2" + doc.get("_root","key",heads1) // returns "val1" + doc.get("_root","key",[]) // returns undefined +``` + +This works for `get()`, `getAll()`, `keys()`, `length()`, `text()`, and `materialize()` + +Queries of old document states are not indexed internally and will be slower than normal access. If you need a fast indexed version of a document at a previous point in time you can create one with `doc.forkAt(heads, actor?)` + +### Forking and Merging + +You can `fork()` a document which makes an exact copy of it. This assigns a new actor so changes made to the fork can be merged back in with the original. The `forkAt()` takes a Heads, allowing you to fork off a document from a previous point in its history. These documents allocate new memory in WASM and need to be freed. + +The `merge()` command applies all changes in the argument doc into the calling doc. Therefore if doc a has 1000 changes that doc b lacks and doc b has only 10 changes that doc a lacks, `a.merge(b)` will be much faster than `b.merge(a)`. + +```javascript + let doc1 = create() + doc1.put("_root", "key1", "val1") + + let doc2 = doc1.fork() + + doc1.put("_root", "key2", "val2") + doc2.put("_root", "key3", "val3") + + doc1.merge(doc2) + + doc1.materialize("_root") // returns { key1: "val1", key2: "val2", key3: "val3" } + doc2.materialize("_root") // returns { key1: "val1", key3: "val3" } +``` + +Note that calling `a.merge(a)` will produce an unrecoverable error from the wasm-bindgen layer which (as of this writing) there is no workaround for. + +### Saving and Loading + +Calling `save()` converts the document to a compressed `Uint8Array()` that can be saved to durable storage. This format uses a columnar storage format that compresses away most of the Automerge metadata needed to manage the CRDT state, but does include all of the change history. + +If you wish to incrementally update a saved Automerge doc you can call `saveIncremental()` to get a `Uint8Array()` of bytes that can be appended to the file with all the new changes(). Note that the `saveIncremental()` bytes are not as compressed as the whole document save as each chunk has metadata information needed to parse it. It may make sense to periodically perform a new `save()` to get the smallest possible file footprint. + +The `load()` function takes a `Uint8Array()` of bytes produced in this way and constitutes a new document. The `loadIncremental()` method is available if you wish to consume the result of a `saveIncremental()` with an already instanciated document. + +```javascript + import { create, load } from "@automerge/automerge-wasm" + + let doc1 = create() + + doc1.put("_root", "key1", "value1") + + let save1 = doc1.save() + + let doc2 = load(save1) + + doc2.materialize("_root") // returns { key1: "value1" } + + doc1.put("_root", "key2", "value2") + + let saveIncremental = doc1.saveIncremental() + + let save2 = doc1.save() + + let save3 = new Uint8Array([... save1, ... saveIncremental]) + + // save2 has fewer bytes than save3 but contains the same ops + + doc2.loadIncremental(saveIncremental) + + let doc3 = load(save2) + + let doc4 = load(save3) + + doc1.materialize("_root") // returns { key1: "value1", key2: "value2" } + doc2.materialize("_root") // returns { key1: "value1", key2: "value2" } + doc3.materialize("_root") // returns { key1: "value1", key2: "value2" } + doc4.materialize("_root") // returns { key1: "value1", key2: "value2" } +``` + +One interesting feature of automerge binary saves is that they can be concatenated together in any order and can still be loaded into a coherent merged document. + +```javascript +import { load } from "@automerge/automerge-wasm" +import * as fs from "fs" + +let file1 = fs.readFileSync("automerge_save_1"); +let file2 = fs.readFileSync("automerge_save_2"); + +let docA = load(file1).merge(load(file2)) +let docB = load(Buffer.concat([ file1, file2 ])) + +assert.deepEqual(docA.materialize("/"), docB.materialize("/")) +assert.equal(docA.save(), docB.save()) +``` + +### Syncing + +When syncing a document the `generateSyncMessage()` and `receiveSyncMessage()` methods will produce and consume sync messages. A sync state object will need to be managed for the duration of the connection (created by the function `initSyncState()` and can be serialized to a Uint8Array() to preserve sync state with the `encodeSyncState()` and `decodeSyncState()` functions. + +A very simple sync implementation might look like this. + +```javascript + import { encodeSyncState, decodeSyncState, initSyncState } from "@automerge/automerge-wasm" + + let states = {} + + function receiveMessageFromPeer(doc, peer_id, message) { + let syncState = states[peer_id] + doc.receiveMessage(syncState, message) + let reply = doc.generateSyncMessage(syncState) + if (reply) { + sendMessage(peer_id, reply) + } + } + + function notifyPeerAboutUpdates(doc, peer_id) { + let syncState = states[peer_id] + let message = doc.generateSyncMessage(syncState) + if (message) { + sendMessage(peer_id, message) + } + } + + function onDisconnect(peer_id) { + let state = states[peer_id] + if (state) { + saveSyncToStorage(peer_id, encodeSyncState(state)) + } + delete states[peer_id] + } + + function onConnect(peer_id) { + let state = loadSyncFromStorage(peer_id) + if (state) { + states[peer_id] = decodeSyncState(state) + } else { + states[peer_id] = initSyncState() + } + } +``` + +### Glossary: Actors + +Some basic concepts you will need to know to better understand the api are Actors and Object Ids. + +Actors are ids that need to be unique to each process writing to a document. This is normally one actor per device. Or for a web app one actor per tab per browser would be needed. It can be a uuid, or a public key, or a certificate, as your application demands. All that matters is that its bytes are unique. Actors are always expressed in this api as a hex string. + +Methods that create new documents will generate random actors automatically - if you wish to supply your own it is always taken as an optional argument. This is true for the following functions. + +```javascript + import { create, load } from "@automerge/automerge-wasm" + + let doc1 = create() // random actorid + let doc2 = create("aabbccdd") + let doc3 = doc1.fork() // random actorid + let doc4 = doc2.fork("ccdd0011") + let doc5 = load(doc3.save()) // random actorid + let doc6 = load(doc4.save(), "00aabb11") + + let actor = doc1.getActor() +``` + +### Glossary: Object Id's + +Object Ids uniquely identify an object within a document. They are represented as strings in the format of `{counter}@{actor}`. The root object is a special case and can be referred to as `_root`. The counter is an ever increasing integer, starting at 1, that is always one higher than the highest counter seen in the document thus far. Object Id's do not change when the object is modified but they do if it is overwritten with a new object. + +```javascript + let doc = create("aabbcc") + let o1 = doc.putObject("_root", "o1", {}) + let o2 = doc.putObject("_root", "o2", {}) + doc.put(o1, "hello", "world") + + assert.deepEqual(doc.materialize("_root"), { "o1": { hello: "world" }, "o2": {} }) + assert.equal(o1, "1@aabbcc") + assert.equal(o2, "2@aabbcc") + + let o1v2 = doc.putObject("_root", "o1", {}) + + doc.put(o1, "a", "b") // modifying an overwritten object - does nothing + doc.put(o1v2, "x", "y") // modifying the new "o1" object + + assert.deepEqual(doc.materialize("_root"), { "o1": { x: "y" }, "o2": {} }) +``` + +### Appendix: Building + + The following steps should allow you to build the package + + ``` + $ rustup target add wasm32-unknown-unknown + $ cargo install wasm-bindgen-cli + $ cargo install wasm-opt + $ yarn + $ yarn release + $ yarn pack + ``` + +### Appendix: WASM and Memory Allocation + +Allocated memory in rust will be freed automatically on platforms that support `FinalizationRegistry`. + +This is currently supported in [all major browsers and nodejs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry). + +On unsupported platforms you can free memory explicitly. + +```javascript + import { create, initSyncState } from "@automerge/automerge-wasm" + + let doc = create() + let sync = initSyncState() + + doc.free() + sync.free() +``` diff --git a/rust/automerge-wasm/deno-tests/deno.ts b/rust/automerge-wasm/deno-tests/deno.ts new file mode 100644 index 00000000..b346435a --- /dev/null +++ b/rust/automerge-wasm/deno-tests/deno.ts @@ -0,0 +1,8 @@ +// @deno-types="../index.d.ts" +import { create } from '../deno/automerge_wasm.js' + +Deno.test("It should create, clone and free", () => { + const doc1 = create(false) + const doc2 = doc1.clone() + doc2.free() +}); diff --git a/rust/automerge-wasm/examples/cra/.gitignore b/rust/automerge-wasm/examples/cra/.gitignore new file mode 100644 index 00000000..d5f19d89 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/rust/automerge-wasm/examples/cra/README.md b/rust/automerge-wasm/examples/cra/README.md new file mode 100644 index 00000000..0b1e4ca5 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/README.md @@ -0,0 +1,22 @@ +## Example CRA App using AutomergeWASM + +### Creating this example app + +```bash + $ cd automerge-wasm && yarn pkg # this builds the npm package + $ cd ../examples + $ npx create-react-app cra --template typescript + $ cd cra + $ npm install ../../automerge-wasm/automerge-wasm-v0.1.0.tgz +``` + +Then I just needed to add the import "automerge-wasm" and `{ useEffect, useState }` code to `./src/App.tsx` + +```bash + $ npm start +``` + +### Open Issues + +The example app currently doesn't do anything useful. Perhaps someone with some react experience and figure out the right way to wire everything up for an actual demo. + diff --git a/rust/automerge-wasm/examples/cra/package.json b/rust/automerge-wasm/examples/cra/package.json new file mode 100644 index 00000000..0b465b94 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/package.json @@ -0,0 +1,44 @@ +{ + "name": "cra", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.16.1", + "@testing-library/react": "^12.1.2", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.4.0", + "@types/node": "^16.11.21", + "@types/react": "^17.0.38", + "@types/react-dom": "^17.0.11", + "automerge-wasm": "file:../../automerge-wasm/automerge-wasm-0.0.24.tgz", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-scripts": "5.0.0", + "typescript": "^4.5.5", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/rust/automerge-wasm/examples/cra/public/favicon.ico b/rust/automerge-wasm/examples/cra/public/favicon.ico new file mode 100644 index 00000000..a11777cc Binary files /dev/null and b/rust/automerge-wasm/examples/cra/public/favicon.ico differ diff --git a/rust/automerge-wasm/examples/cra/public/index.html b/rust/automerge-wasm/examples/cra/public/index.html new file mode 100644 index 00000000..aa069f27 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/rust/automerge-wasm/examples/cra/public/logo192.png b/rust/automerge-wasm/examples/cra/public/logo192.png new file mode 100644 index 00000000..fc44b0a3 Binary files /dev/null and b/rust/automerge-wasm/examples/cra/public/logo192.png differ diff --git a/rust/automerge-wasm/examples/cra/public/logo512.png b/rust/automerge-wasm/examples/cra/public/logo512.png new file mode 100644 index 00000000..a4e47a65 Binary files /dev/null and b/rust/automerge-wasm/examples/cra/public/logo512.png differ diff --git a/rust/automerge-wasm/examples/cra/public/manifest.json b/rust/automerge-wasm/examples/cra/public/manifest.json new file mode 100644 index 00000000..080d6c77 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/rust/automerge-wasm/examples/cra/public/robots.txt b/rust/automerge-wasm/examples/cra/public/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/rust/automerge-wasm/examples/cra/src/App.css b/rust/automerge-wasm/examples/cra/src/App.css new file mode 100644 index 00000000..74b5e053 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/rust/automerge-wasm/examples/cra/src/App.test.tsx b/rust/automerge-wasm/examples/cra/src/App.test.tsx new file mode 100644 index 00000000..2a68616d --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/rust/automerge-wasm/examples/cra/src/App.tsx b/rust/automerge-wasm/examples/cra/src/App.tsx new file mode 100644 index 00000000..177f50bd --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/App.tsx @@ -0,0 +1,49 @@ +import React, { useEffect, useState } from 'react'; +import './App.css'; +import * as Automerge from "automerge-wasm" + + +function App() { + const [ doc, ] = useState(Automerge.create()) + const [ edits, ] = useState(doc.putObject("_root", "edits", "")) + const [ val, setVal ] = useState(""); + useEffect(() => { + doc.splice(edits, 0, 0, "the quick fox jumps over the lazy dog") + let doc2 = Automerge.load(doc.save()); + console.log("LOAD",Automerge.load) + console.log("DOC",doc.materialize("/")) + console.log("DOC2",doc2.materialize("/")) + let result = doc.text(edits) + setVal(result) + }, []) + + function updateTextarea(e: any) { + e.preventDefault() + let event: InputEvent = e.nativeEvent + console.log(edits, e.target.selectionEnd) + switch (event.inputType) { + case 'insertText': + //@ts-ignore + doc.splice(edits, e.target.selectionEnd - 1, 0, e.nativeEvent.data) + break; + case 'deleteContentBackward': + //@ts-ignore + doc.splice(edits, e.target.selectionEnd, 1) + break; + case 'insertLineBreak': + //@ts-ignore + doc.splice(edits, e.target.selectionEnd - 1, '\n') + break; + } + setVal(doc.text(edits)) + } + return ( +
+
+ +
+
+ ); +} + +export default App; diff --git a/rust/automerge-wasm/examples/cra/src/index.css b/rust/automerge-wasm/examples/cra/src/index.css new file mode 100644 index 00000000..ec2585e8 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/rust/automerge-wasm/examples/cra/src/index.tsx b/rust/automerge-wasm/examples/cra/src/index.tsx new file mode 100644 index 00000000..d84251d4 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; +import init from "automerge-wasm" + +init().then(_ => { + ReactDOM.render( + + + , + document.getElementById('root') + ); +}) + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/rust/automerge-wasm/examples/cra/src/logo.svg b/rust/automerge-wasm/examples/cra/src/logo.svg new file mode 100644 index 00000000..9dfc1c05 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rust/automerge-wasm/examples/cra/src/react-app-env.d.ts b/rust/automerge-wasm/examples/cra/src/react-app-env.d.ts new file mode 100644 index 00000000..6431bc5f --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts b/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts new file mode 100644 index 00000000..49a2a16e --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/rust/automerge-wasm/examples/cra/src/setupTests.ts b/rust/automerge-wasm/examples/cra/src/setupTests.ts new file mode 100644 index 00000000..8f2609b7 --- /dev/null +++ b/rust/automerge-wasm/examples/cra/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/rust/automerge-wasm/examples/cra/tsconfig.json b/rust/automerge-wasm/examples/cra/tsconfig.json new file mode 100644 index 00000000..a273b0cf --- /dev/null +++ b/rust/automerge-wasm/examples/cra/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src" + ] +} diff --git a/rust/automerge-wasm/examples/webpack/.gitignore b/rust/automerge-wasm/examples/webpack/.gitignore new file mode 100644 index 00000000..da9d3ff5 --- /dev/null +++ b/rust/automerge-wasm/examples/webpack/.gitignore @@ -0,0 +1,5 @@ +yarn.lock +node_modules +public/*.wasm +public/main.js +dist diff --git a/rust/automerge-wasm/examples/webpack/package.json b/rust/automerge-wasm/examples/webpack/package.json new file mode 100644 index 00000000..4abcd1c6 --- /dev/null +++ b/rust/automerge-wasm/examples/webpack/package.json @@ -0,0 +1,21 @@ +{ + "name": "webpack-automerge-example", + "version": "0.1.0", + "description": "", + "private": true, + "scripts": { + "build": "webpack", + "start": "serve public", + "test": "node dist/node.js" + }, + "author": "", + "dependencies": { + "automerge-wasm": "file:automerge-wasm-0.1.4.tgz" + }, + "devDependencies": { + "serve": "^13.0.2", + "webpack": "^5.72.1", + "webpack-cli": "^4.9.2", + "webpack-node-externals": "^3.0.0" + } +} diff --git a/rust/automerge-wasm/examples/webpack/public/index.html b/rust/automerge-wasm/examples/webpack/public/index.html new file mode 100644 index 00000000..5003393a --- /dev/null +++ b/rust/automerge-wasm/examples/webpack/public/index.html @@ -0,0 +1,10 @@ + + + + + Simple Webpack for automerge-wasm + + + + + diff --git a/rust/automerge-wasm/examples/webpack/src/index.js b/rust/automerge-wasm/examples/webpack/src/index.js new file mode 100644 index 00000000..bab417f5 --- /dev/null +++ b/rust/automerge-wasm/examples/webpack/src/index.js @@ -0,0 +1,23 @@ +import init, { create } from "automerge-wasm" + +// hello world code that will run correctly on web or node + +init().then((Automerge) => { + console.log("Automerge=", Automerge) + console.log("create=", create) + const doc = Automerge.create() + doc.put("/", "hello", "world") + const result = doc.materialize("/") + //const result = xxx + + if (typeof document !== 'undefined') { + // browser + const element = document.createElement('div'); + element.innerHTML = JSON.stringify(result) + document.body.appendChild(element); + } else { + // server + console.log("node:", result) + } +}) + diff --git a/rust/automerge-wasm/examples/webpack/webpack.config.js b/rust/automerge-wasm/examples/webpack/webpack.config.js new file mode 100644 index 00000000..3ab0e798 --- /dev/null +++ b/rust/automerge-wasm/examples/webpack/webpack.config.js @@ -0,0 +1,35 @@ +const path = require('path'); +const nodeExternals = require('webpack-node-externals'); + +// the most basic webpack config for node or web targets for automerge-wasm + +const serverConfig = { + // basic setup for bundling a node package + target: 'node', + externals: [nodeExternals()], + externalsPresets: { node: true }, + + entry: './src/index.js', + output: { + filename: 'node.js', + path: path.resolve(__dirname, 'dist'), + }, + mode: "development", // or production +}; + +const clientConfig = { + target: 'web', + entry: './src/index.js', + output: { + filename: 'main.js', + path: path.resolve(__dirname, 'public'), + }, + mode: "development", // or production + performance: { // we dont want the wasm blob to generate warnings + hints: false, + maxEntrypointSize: 512000, + maxAssetSize: 512000 + } +}; + +module.exports = [serverConfig, clientConfig]; diff --git a/rust/automerge-wasm/index.d.ts b/rust/automerge-wasm/index.d.ts new file mode 100644 index 00000000..be12e4c1 --- /dev/null +++ b/rust/automerge-wasm/index.d.ts @@ -0,0 +1,238 @@ +export type Actor = string; +export type ObjID = string; +export type Change = Uint8Array; +export type SyncMessage = Uint8Array; +export type Prop = string | number; +export type Hash = string; +export type Heads = Hash[]; +export type Value = string | number | boolean | null | Date | Uint8Array +export type MaterializeValue = { [key:string]: MaterializeValue } | Array | Value +export type ObjType = string | Array | { [key: string]: ObjType | Value } +export type FullValue = + ["str", string] | + ["int", number] | + ["uint", number] | + ["f64", number] | + ["boolean", boolean] | + ["timestamp", Date] | + ["counter", number] | + ["bytes", Uint8Array] | + ["null", null] | + ["map", ObjID] | + ["list", ObjID] | + ["text", ObjID] | + ["table", ObjID] + +export type FullValueWithId = + ["str", string, ObjID ] | + ["int", number, ObjID ] | + ["uint", number, ObjID ] | + ["f64", number, ObjID ] | + ["boolean", boolean, ObjID ] | + ["timestamp", Date, ObjID ] | + ["counter", number, ObjID ] | + ["bytes", Uint8Array, ObjID ] | + ["null", null, ObjID ] | + ["map", ObjID ] | + ["list", ObjID] | + ["text", ObjID] | + ["table", ObjID] + +export enum ObjTypeName { + list = "list", + map = "map", + table = "table", + text = "text", +} + +export type Datatype = + "boolean" | + "str" | + "int" | + "uint" | + "f64" | + "null" | + "timestamp" | + "counter" | + "bytes" | + "map" | + "text" | + "list"; + +export type SyncHave = { + lastSync: Heads, + bloom: Uint8Array, +} + +export type DecodedSyncMessage = { + heads: Heads, + need: Heads, + have: SyncHave[] + changes: Change[] +} + +export type DecodedChange = { + actor: Actor, + seq: number + startOp: number, + time: number, + message: string | null, + deps: Heads, + hash: Hash, + ops: Op[] +} + +type PartialBy = Omit & Partial> +export type ChangeToEncode = PartialBy + +export type Op = { + action: string, + obj: ObjID, + key: string, + value?: string | number | boolean, + datatype?: string, + pred: string[], +} + +export type Patch = PutPatch | DelPatch | SpliceTextPatch | IncPatch | InsertPatch; + +export type PutPatch = { + action: 'put' + path: Prop[], + value: Value + conflict: boolean +} + +export type IncPatch = { + action: 'inc' + path: Prop[], + value: number +} + +export type DelPatch = { + action: 'del' + path: Prop[], + length?: number, +} + +export type SpliceTextPatch = { + action: 'splice' + path: Prop[], + value: string, +} + +export type InsertPatch = { + action: 'insert' + path: Prop[], + values: Value[], +} + +export function encodeChange(change: ChangeToEncode): Change; +export function create(text_v2: boolean, actor?: Actor): Automerge; +export function load(data: Uint8Array, text_v2: boolean, actor?: Actor): Automerge; +export function decodeChange(change: Change): DecodedChange; +export function initSyncState(): SyncState; +export function encodeSyncMessage(message: DecodedSyncMessage): SyncMessage; +export function decodeSyncMessage(msg: SyncMessage): DecodedSyncMessage; +export function encodeSyncState(state: SyncState): Uint8Array; +export function decodeSyncState(data: Uint8Array): SyncState; +export function exportSyncState(state: SyncState): JsSyncState; +export function importSyncState(state: JsSyncState): SyncState; + +export interface API { + create(text_v2: boolean, actor?: Actor): Automerge; + load(data: Uint8Array, text_v2: boolean, actor?: Actor): Automerge; + encodeChange(change: ChangeToEncode): Change; + decodeChange(change: Change): DecodedChange; + initSyncState(): SyncState; + encodeSyncMessage(message: DecodedSyncMessage): SyncMessage; + decodeSyncMessage(msg: SyncMessage): DecodedSyncMessage; + encodeSyncState(state: SyncState): Uint8Array; + decodeSyncState(data: Uint8Array): SyncState; + exportSyncState(state: SyncState): JsSyncState; + importSyncState(state: JsSyncState): SyncState; +} + +export class Automerge { + // change state + put(obj: ObjID, prop: Prop, value: Value, datatype?: Datatype): void; + putObject(obj: ObjID, prop: Prop, value: ObjType): ObjID; + insert(obj: ObjID, index: number, value: Value, datatype?: Datatype): void; + insertObject(obj: ObjID, index: number, value: ObjType): ObjID; + push(obj: ObjID, value: Value, datatype?: Datatype): void; + pushObject(obj: ObjID, value: ObjType): ObjID; + splice(obj: ObjID, start: number, delete_count: number, text?: string | Array): ObjID[] | undefined; + increment(obj: ObjID, prop: Prop, value: number): void; + delete(obj: ObjID, prop: Prop): void; + + // returns a single value - if there is a conflict return the winner + get(obj: ObjID, prop: Prop, heads?: Heads): Value | undefined; + getWithType(obj: ObjID, prop: Prop, heads?: Heads): FullValue | null; + // return all values in case of a conflict + getAll(obj: ObjID, arg: Prop, heads?: Heads): FullValueWithId[]; + keys(obj: ObjID, heads?: Heads): string[]; + text(obj: ObjID, heads?: Heads): string; + length(obj: ObjID, heads?: Heads): number; + materialize(obj?: ObjID, heads?: Heads, metadata?: unknown): MaterializeValue; + toJS(): MaterializeValue; + + // transactions + commit(message?: string, time?: number): Hash | null; + emptyChange(message?: string, time?: number): Hash; + merge(other: Automerge): Heads; + getActorId(): Actor; + pendingOps(): number; + rollback(): number; + + // patches + enablePatches(enable: boolean): boolean; + enableFreeze(enable: boolean): boolean; + registerDatatype(datatype: string, callback: Function): void; + popPatches(): Patch[]; + + // save and load to local store + save(): Uint8Array; + saveIncremental(): Uint8Array; + loadIncremental(data: Uint8Array): number; + + // sync over network + receiveSyncMessage(state: SyncState, message: SyncMessage): void; + generateSyncMessage(state: SyncState): SyncMessage | null; + + // low level change functions + applyChanges(changes: Change[]): void; + getChanges(have_deps: Heads): Change[]; + getChangeByHash(hash: Hash): Change | null; + getChangesAdded(other: Automerge): Change[]; + getHeads(): Heads; + getLastLocalChange(): Change | null; + getMissingDeps(heads?: Heads): Heads; + + // memory management + free(): void; // only needed if weak-refs are unsupported + clone(actor?: string): Automerge; // TODO - remove, this is dangerous + fork(actor?: string, heads?: Heads): Automerge; + + // dump internal state to console.log - for debugging + dump(): void; + + // experimental api can go here + applyPatches(obj: Doc, meta?: unknown, callback?: (patch: Array, before: Doc, after: Doc) => void): Doc; +} + +export interface JsSyncState { + sharedHeads: Heads; + lastSentHeads: Heads; + theirHeads: Heads | undefined; + theirHeed: Heads | undefined; + theirHave: SyncHave[] | undefined; + sentHashes: Heads; +} + +export class SyncState { + free(): void; + clone(): SyncState; + lastSentHeads: Heads; + sentHashes: Heads; + readonly sharedHeads: Heads; +} diff --git a/rust/automerge-wasm/package.json b/rust/automerge-wasm/package.json new file mode 100644 index 00000000..80b39fd4 --- /dev/null +++ b/rust/automerge-wasm/package.json @@ -0,0 +1,60 @@ +{ + "collaborators": [ + "Orion Henry ", + "Alex Good ", + "Martin Kleppmann" + ], + "name": "@automerge/automerge-wasm", + "description": "wasm-bindgen bindings to the automerge rust implementation", + "homepage": "https://github.com/automerge/automerge-rs/tree/main/automerge-wasm", + "repository": "github:automerge/automerge-rs", + "version": "0.1.25", + "license": "MIT", + "files": [ + "README.md", + "LICENSE", + "package.json", + "index.d.ts", + "nodejs/automerge_wasm.js", + "nodejs/automerge_wasm_bg.wasm", + "deno/automerge_wasm.js", + "deno/automerge_wasm_bg.wasm", + "bundler/automerge_wasm.js", + "bundler/automerge_wasm_bg.js", + "bundler/automerge_wasm_bg.wasm" + ], + "private": false, + "types": "index.d.ts", + "module": "./bundler/automerge_wasm.js", + "main": "./nodejs/automerge_wasm.js", + "scripts": { + "lint": "eslint test/*.ts index.d.ts", + "debug": "cross-env PROFILE=dev TARGET_DIR=debug yarn buildall", + "build": "cross-env PROFILE=dev TARGET_DIR=debug FEATURES='' yarn buildall", + "release": "cross-env PROFILE=release TARGET_DIR=release yarn buildall", + "buildall": "cross-env TARGET=nodejs yarn target && cross-env TARGET=bundler yarn target && cross-env TARGET=deno yarn target", + "target": "rimraf ./$TARGET && yarn compile && yarn bindgen && yarn opt", + "compile": "cargo build --target wasm32-unknown-unknown --profile $PROFILE", + "bindgen": "wasm-bindgen --no-typescript --weak-refs --target $TARGET --out-dir $TARGET ../target/wasm32-unknown-unknown/$TARGET_DIR/automerge_wasm.wasm", + "opt": "wasm-opt -O4 $TARGET/automerge_wasm_bg.wasm -o $TARGET/automerge_wasm_bg.wasm", + "test": "ts-mocha -p tsconfig.json --type-check --bail --full-trace test/*.ts" + }, + "devDependencies": { + "@types/mocha": "^10.0.1", + "@types/node": "^18.11.13", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", + "cross-env": "^7.0.3", + "eslint": "^8.29.0", + "fast-sha256": "^1.3.0", + "mocha": "^10.2.0", + "pako": "^2.1.0", + "rimraf": "^3.0.2", + "ts-mocha": "^10.0.0", + "typescript": "^4.9.4" + }, + "exports": { + "browser": "./bundler/automerge_wasm.js", + "require": "./nodejs/automerge_wasm.js" + } +} diff --git a/rust/automerge-wasm/src/interop.rs b/rust/automerge-wasm/src/interop.rs new file mode 100644 index 00000000..1546ff10 --- /dev/null +++ b/rust/automerge-wasm/src/interop.rs @@ -0,0 +1,1478 @@ +use crate::error::InsertObject; +use crate::value::Datatype; +use crate::{Automerge, TextRepresentation}; +use automerge as am; +use automerge::ReadDoc; +use automerge::ROOT; +use automerge::{Change, ChangeHash, ObjType, Prop}; +use js_sys::{Array, Function, JsString, Object, Reflect, Symbol, Uint8Array}; +use std::borrow::Cow; +use std::collections::{BTreeSet, HashSet}; +use std::fmt::Display; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; + +use crate::{observer::Patch, ObjId, Value}; + +const RAW_DATA_SYMBOL: &str = "_am_raw_value_"; +const DATATYPE_SYMBOL: &str = "_am_datatype_"; +const RAW_OBJECT_SYMBOL: &str = "_am_objectId"; +const META_SYMBOL: &str = "_am_meta"; + +pub(crate) struct JS(pub(crate) JsValue); +pub(crate) struct AR(pub(crate) Array); + +impl From for JsValue { + fn from(ar: AR) -> Self { + ar.0.into() + } +} + +impl From for JsValue { + fn from(js: JS) -> Self { + js.0 + } +} + +impl From for JS { + fn from(state: am::sync::State) -> Self { + let shared_heads: JS = state.shared_heads.into(); + let last_sent_heads: JS = state.last_sent_heads.into(); + let their_heads: JS = state.their_heads.into(); + let their_need: JS = state.their_need.into(); + let sent_hashes: JS = state.sent_hashes.into(); + let their_have = if let Some(have) = &state.their_have { + JsValue::from(AR::from(have.as_slice()).0) + } else { + JsValue::null() + }; + let result: JsValue = Object::new().into(); + // we can unwrap here b/c we made the object and know its not frozen + Reflect::set(&result, &"sharedHeads".into(), &shared_heads.0).unwrap(); + Reflect::set(&result, &"lastSentHeads".into(), &last_sent_heads.0).unwrap(); + Reflect::set(&result, &"theirHeads".into(), &their_heads.0).unwrap(); + Reflect::set(&result, &"theirNeed".into(), &their_need.0).unwrap(); + Reflect::set(&result, &"theirHave".into(), &their_have).unwrap(); + Reflect::set(&result, &"sentHashes".into(), &sent_hashes.0).unwrap(); + Reflect::set(&result, &"inFlight".into(), &state.in_flight.into()).unwrap(); + JS(result) + } +} + +impl From> for JS { + fn from(heads: Vec) -> Self { + JS(heads + .iter() + .map(|h| JsValue::from_str(&h.to_string())) + .collect::() + .into()) + } +} + +impl From> for JS { + fn from(heads: HashSet) -> Self { + let result: JsValue = Object::new().into(); + for key in &heads { + Reflect::set(&result, &key.to_string().into(), &true.into()).unwrap(); + } + JS(result) + } +} + +impl From> for JS { + fn from(heads: BTreeSet) -> Self { + let result: JsValue = Object::new().into(); + for key in &heads { + Reflect::set(&result, &key.to_string().into(), &true.into()).unwrap(); + } + JS(result) + } +} + +impl From>> for JS { + fn from(heads: Option>) -> Self { + if let Some(v) = heads { + let v: Array = v + .iter() + .map(|h| JsValue::from_str(&h.to_string())) + .collect(); + JS(v.into()) + } else { + JS(JsValue::null()) + } + } +} + +impl TryFrom for HashSet { + type Error = error::BadChangeHashSet; + + fn try_from(value: JS) -> Result { + let result = HashSet::new(); + fold_hash_set(result, &value.0, |mut set, hash| { + set.insert(hash); + set + }) + } +} + +impl TryFrom for BTreeSet { + type Error = error::BadChangeHashSet; + + fn try_from(value: JS) -> Result { + let result = BTreeSet::new(); + fold_hash_set(result, &value.0, |mut set, hash| { + set.insert(hash); + set + }) + } +} + +fn fold_hash_set(init: O, val: &JsValue, f: F) -> Result +where + F: Fn(O, ChangeHash) -> O, +{ + let mut result = init; + for key in Reflect::own_keys(val) + .map_err(|_| error::BadChangeHashSet::ListProp)? + .iter() + { + if let Some(true) = js_get(val, &key)?.0.as_bool() { + let hash = ChangeHash::try_from(JS(key.clone())) + .map_err(|e| error::BadChangeHashSet::BadHash(key, e))?; + result = f(result, hash); + } + } + Ok(result) +} + +impl TryFrom for ChangeHash { + type Error = error::BadChangeHash; + + fn try_from(value: JS) -> Result { + if let Some(s) = value.0.as_string() { + Ok(s.parse()?) + } else { + Err(error::BadChangeHash::NotString) + } + } +} + +impl TryFrom for Option> { + type Error = error::BadChangeHashes; + + fn try_from(value: JS) -> Result { + if value.0.is_null() { + Ok(None) + } else { + Vec::::try_from(value).map(Some) + } + } +} + +impl TryFrom for Vec { + type Error = error::BadChangeHashes; + + fn try_from(value: JS) -> Result { + let value = value + .0 + .dyn_into::() + .map_err(|_| error::BadChangeHashes::NotArray)?; + let value = value + .iter() + .enumerate() + .map(|(i, v)| { + ChangeHash::try_from(JS(v)).map_err(|e| error::BadChangeHashes::BadElem(i, e)) + }) + .collect::, _>>()?; + Ok(value) + } +} + +impl TryFrom for Vec { + type Error = error::BadJSChanges; + + fn try_from(value: JS) -> Result { + let value = value + .0 + .dyn_into::() + .map_err(|_| error::BadJSChanges::ChangesNotArray)?; + let changes = value + .iter() + .enumerate() + .map(|(i, j)| { + j.dyn_into().map_err::(|_| { + error::BadJSChanges::ElemNotUint8Array(i) + }) + }) + .collect::, _>>()?; + let changes = changes + .iter() + .enumerate() + .map(|(i, arr)| { + automerge::Change::try_from(arr.to_vec().as_slice()) + .map_err(|e| error::BadJSChanges::BadChange(i, e)) + }) + .collect::, _>>()?; + Ok(changes) + } +} + +impl TryFrom for am::sync::State { + type Error = error::BadSyncState; + + fn try_from(value: JS) -> Result { + let value = value.0; + let shared_heads = js_get(&value, "sharedHeads")? + .try_into() + .map_err(error::BadSyncState::BadSharedHeads)?; + let last_sent_heads = js_get(&value, "lastSentHeads")? + .try_into() + .map_err(error::BadSyncState::BadLastSentHeads)?; + let their_heads = js_get(&value, "theirHeads")? + .try_into() + .map_err(error::BadSyncState::BadTheirHeads)?; + let their_need = js_get(&value, "theirNeed")? + .try_into() + .map_err(error::BadSyncState::BadTheirNeed)?; + let their_have = js_get(&value, "theirHave")? + .try_into() + .map_err(error::BadSyncState::BadTheirHave)?; + let sent_hashes = js_get(&value, "sentHashes")? + .try_into() + .map_err(error::BadSyncState::BadSentHashes)?; + let in_flight = js_get(&value, "inFlight")? + .0 + .as_bool() + .ok_or(error::BadSyncState::InFlightNotBoolean)?; + Ok(am::sync::State { + shared_heads, + last_sent_heads, + their_heads, + their_need, + their_have, + sent_hashes, + in_flight, + }) + } +} + +impl TryFrom for am::sync::Have { + type Error = error::BadHave; + + fn try_from(value: JS) -> Result { + let last_sync = js_get(&value.0, "lastSync")? + .try_into() + .map_err(error::BadHave::BadLastSync)?; + let bloom = js_get(&value.0, "bloom")? + .try_into() + .map_err(error::BadHave::BadBloom)?; + Ok(am::sync::Have { last_sync, bloom }) + } +} + +impl TryFrom for Option> { + type Error = error::BadHaves; + + fn try_from(value: JS) -> Result { + if value.0.is_null() { + Ok(None) + } else { + Ok(Some(value.try_into()?)) + } + } +} + +impl TryFrom for Vec { + type Error = error::BadHaves; + + fn try_from(value: JS) -> Result { + let value = value + .0 + .dyn_into::() + .map_err(|_| error::BadHaves::NotArray)?; + let have = value + .iter() + .enumerate() + .map(|(i, s)| JS(s).try_into().map_err(|e| error::BadHaves::BadElem(i, e))) + .collect::, _>>()?; + Ok(have) + } +} + +impl TryFrom for am::sync::BloomFilter { + type Error = error::BadBloom; + + fn try_from(value: JS) -> Result { + let value: Uint8Array = value + .0 + .dyn_into() + .map_err(|_| error::BadBloom::NotU8Array)?; + let value = value.to_vec(); + let value = value.as_slice().try_into()?; + Ok(value) + } +} + +impl TryFrom for am::sync::Message { + type Error = error::BadSyncMessage; + + fn try_from(value: JS) -> Result { + let heads = js_get(&value.0, "heads")? + .try_into() + .map_err(error::BadSyncMessage::BadHeads)?; + let need = js_get(&value.0, "need")? + .try_into() + .map_err(error::BadSyncMessage::BadNeed)?; + let changes = js_get(&value.0, "changes")?.try_into()?; + let have = js_get(&value.0, "have")?.try_into()?; + Ok(am::sync::Message { + heads, + need, + have, + changes, + }) + } +} + +impl From<&[ChangeHash]> for AR { + fn from(value: &[ChangeHash]) -> Self { + AR(value + .iter() + .map(|h| JsValue::from_str(&hex::encode(h.0))) + .collect()) + } +} + +impl From<&[Change]> for AR { + fn from(value: &[Change]) -> Self { + let changes: Array = value + .iter() + .map(|c| Uint8Array::from(c.raw_bytes())) + .collect(); + AR(changes) + } +} + +impl From<&[am::sync::Have]> for AR { + fn from(value: &[am::sync::Have]) -> Self { + AR(value + .iter() + .map(|have| { + let last_sync: Array = have + .last_sync + .iter() + .map(|h| JsValue::from_str(&hex::encode(h.0))) + .collect(); + // FIXME - the clone and the unwrap here shouldnt be needed - look at into_bytes() + let bloom = Uint8Array::from(have.bloom.to_bytes().as_slice()); + let obj: JsValue = Object::new().into(); + // we can unwrap here b/c we created the object and know its not frozen + Reflect::set(&obj, &"lastSync".into(), &last_sync.into()).unwrap(); + Reflect::set(&obj, &"bloom".into(), &bloom.into()).unwrap(); + obj + }) + .collect()) + } +} + +pub(crate) fn to_js_err(err: T) -> JsValue { + js_sys::Error::new(&std::format!("{}", err)).into() +} + +pub(crate) fn js_get, S: std::fmt::Debug + Into>( + obj: J, + prop: S, +) -> Result { + let prop = prop.into(); + Ok(JS(Reflect::get(&obj.into(), &prop).map_err(|e| { + error::GetProp { + property: format!("{:?}", prop), + error: e, + } + })?)) +} + +pub(crate) fn js_set, S: std::fmt::Debug + Into>( + obj: &JsValue, + prop: S, + val: V, +) -> Result { + let prop = prop.into(); + Reflect::set(obj, &prop, &val.into()).map_err(|e| error::SetProp { + property: prop, + error: e, + }) +} + +pub(crate) fn js_get_symbol>(obj: J, prop: &Symbol) -> Result { + Ok(JS(Reflect::get(&obj.into(), &prop.into()).map_err( + |e| error::GetProp { + property: format!("{}", prop.to_string()), + error: e, + }, + )?)) +} + +pub(crate) fn to_prop(p: JsValue) -> Result { + if let Some(s) = p.as_string() { + Ok(Prop::Map(s)) + } else if let Some(n) = p.as_f64() { + Ok(Prop::Seq(n as usize)) + } else { + Err(error::InvalidProp) + } +} + +pub(crate) enum JsObjType { + Text(String), + Map(Vec<(Prop, JsValue)>), + List(Vec<(Prop, JsValue)>), +} + +impl JsObjType { + pub(crate) fn objtype(&self) -> ObjType { + match self { + Self::Text(_) => ObjType::Text, + Self::Map(_) => ObjType::Map, + Self::List(_) => ObjType::List, + } + } + + pub(crate) fn text(&self) -> Option<&str> { + match self { + Self::Text(s) => Some(s.as_ref()), + Self::Map(_) => None, + Self::List(_) => None, + } + } + + pub(crate) fn subvals(&self) -> impl Iterator, JsValue)> + '_ + Clone { + match self { + Self::Text(s) => SubValIter::Str(s.chars().enumerate()), + Self::Map(sub) => SubValIter::Slice(sub.as_slice().iter()), + Self::List(sub) => SubValIter::Slice(sub.as_slice().iter()), + } + } +} + +#[derive(Debug, Clone)] +pub(crate) enum SubValIter<'a> { + Slice(std::slice::Iter<'a, (Prop, JsValue)>), + Str(std::iter::Enumerate>), +} + +impl<'a> Iterator for SubValIter<'a> { + type Item = (std::borrow::Cow<'a, Prop>, JsValue); + + fn next(&mut self) -> Option { + match self { + Self::Slice(i) => i + .next() + .map(|(p, v)| (std::borrow::Cow::Borrowed(p), v.clone())), + Self::Str(i) => i + .next() + .map(|(n, c)| (std::borrow::Cow::Owned(Prop::Seq(n)), c.to_string().into())), + } + } +} + +pub(crate) fn import_obj( + value: &JsValue, + datatype: &Option, +) -> Result { + match datatype.as_deref() { + Some("map") => { + let map = value + .clone() + .dyn_into::() + .map_err(|_| InsertObject::ValueNotObject)?; + let map = js_sys::Object::keys(&map) + .iter() + .zip(js_sys::Object::values(&map).iter()) + .map(|(key, val)| (key.as_string().unwrap().into(), val)) + .collect(); + Ok(JsObjType::Map(map)) + } + Some("list") => { + let list = value + .clone() + .dyn_into::() + .map_err(|_| InsertObject::ValueNotObject)?; + let list = list + .iter() + .enumerate() + .map(|(i, e)| (i.into(), e)) + .collect(); + Ok(JsObjType::List(list)) + } + Some("text") => { + let text = value.as_string().ok_or(InsertObject::ValueNotObject)?; + Ok(JsObjType::Text(text)) + } + Some(_) => Err(InsertObject::ValueNotObject), + None => { + if let Ok(list) = value.clone().dyn_into::() { + let list = list + .iter() + .enumerate() + .map(|(i, e)| (i.into(), e)) + .collect(); + Ok(JsObjType::List(list)) + } else if let Ok(map) = value.clone().dyn_into::() { + let map = js_sys::Object::keys(&map) + .iter() + .zip(js_sys::Object::values(&map).iter()) + .map(|(key, val)| (key.as_string().unwrap().into(), val)) + .collect(); + Ok(JsObjType::Map(map)) + } else if let Some(s) = value.as_string() { + Ok(JsObjType::Text(s)) + } else { + Err(InsertObject::ValueNotObject) + } + } + } +} + +pub(crate) fn get_heads( + heads: Option, +) -> Result>, error::BadChangeHashes> { + heads + .map(|h| { + h.iter() + .enumerate() + .map(|(i, v)| { + ChangeHash::try_from(JS(v)).map_err(|e| error::BadChangeHashes::BadElem(i, e)) + }) + .collect() + }) + .transpose() +} + +impl Automerge { + pub(crate) fn export_object( + &self, + obj: &ObjId, + datatype: Datatype, + heads: Option<&Vec>, + meta: &JsValue, + ) -> Result { + let result = match datatype { + Datatype::Text => match self.text_rep { + TextRepresentation::String => { + if let Some(heads) = heads { + self.doc.text_at(obj, heads)?.into() + } else { + self.doc.text(obj)?.into() + } + } + TextRepresentation::Array => self + .wrap_object(self.export_list(obj, heads, meta)?, datatype, obj, meta)? + .into(), + }, + Datatype::List => self + .wrap_object(self.export_list(obj, heads, meta)?, datatype, obj, meta)? + .into(), + _ => self + .wrap_object(self.export_map(obj, heads, meta)?, datatype, obj, meta)? + .into(), + }; + Ok(result) + } + + pub(crate) fn export_map( + &self, + obj: &ObjId, + heads: Option<&Vec>, + meta: &JsValue, + ) -> Result { + let keys = self.doc.keys(obj); + let map = Object::new(); + for k in keys { + let val_and_id = if let Some(heads) = heads { + self.doc.get_at(obj, &k, heads) + } else { + self.doc.get(obj, &k) + }; + if let Ok(Some((val, id))) = val_and_id { + let subval = match val { + Value::Object(o) => self.export_object(&id, o.into(), heads, meta)?, + Value::Scalar(_) => self.export_value(alloc(&val, self.text_rep))?, + }; + js_set(&map, &k, &subval)?; + }; + } + + Ok(map) + } + + pub(crate) fn export_list( + &self, + obj: &ObjId, + heads: Option<&Vec>, + meta: &JsValue, + ) -> Result { + let len = self.doc.length(obj); + let array = Array::new(); + for i in 0..len { + let val_and_id = if let Some(heads) = heads { + self.doc.get_at(obj, i, heads) + } else { + self.doc.get(obj, i) + }; + if let Ok(Some((val, id))) = val_and_id { + let subval = match val { + Value::Object(o) => self.export_object(&id, o.into(), heads, meta)?, + Value::Scalar(_) => self.export_value(alloc(&val, self.text_rep))?, + }; + array.push(&subval); + }; + } + + Ok(array.into()) + } + + pub(crate) fn export_value( + &self, + (datatype, raw_value): (Datatype, JsValue), + ) -> Result { + if let Some(function) = self.external_types.get(&datatype) { + let wrapped_value = function + .call1(&JsValue::undefined(), &raw_value) + .map_err(|e| error::Export::CallDataHandler(datatype.to_string(), e))?; + if let Ok(o) = wrapped_value.dyn_into::() { + let key = Symbol::for_(RAW_DATA_SYMBOL); + set_hidden_value(&o, &key, &raw_value)?; + let key = Symbol::for_(DATATYPE_SYMBOL); + set_hidden_value(&o, &key, datatype)?; + Ok(o.into()) + } else { + Err(error::Export::InvalidDataHandler(datatype.to_string())) + } + } else { + Ok(raw_value) + } + } + + pub(crate) fn unwrap_object( + &self, + ext_val: &Object, + ) -> Result<(Object, Datatype, ObjId), error::Export> { + let inner = js_get_symbol(ext_val, &Symbol::for_(RAW_DATA_SYMBOL))?.0; + + let datatype = js_get_symbol(ext_val, &Symbol::for_(DATATYPE_SYMBOL))? + .0 + .try_into(); + + let id_val = js_get_symbol(ext_val, &Symbol::for_(RAW_OBJECT_SYMBOL))?.0; + let id = if id_val.is_undefined() { + am::ROOT + } else { + self.doc.import(&id_val.as_string().unwrap_or_default())?.0 + }; + + let inner = inner + .dyn_into::() + .unwrap_or_else(|_| ext_val.clone()); + let datatype = datatype.unwrap_or_else(|_| { + if Array::is_array(&inner) { + Datatype::List + } else { + Datatype::Map + } + }); + Ok((inner, datatype, id)) + } + + pub(crate) fn unwrap_scalar(&self, ext_val: JsValue) -> Result { + let inner = js_get_symbol(&ext_val, &Symbol::for_(RAW_DATA_SYMBOL))?.0; + if !inner.is_undefined() { + Ok(inner) + } else { + Ok(ext_val) + } + } + + fn maybe_wrap_object( + &self, + (datatype, raw_value): (Datatype, JsValue), + id: &ObjId, + meta: &JsValue, + ) -> Result { + if let Ok(obj) = raw_value.clone().dyn_into::() { + let result = self.wrap_object(obj, datatype, id, meta)?; + Ok(result.into()) + } else { + self.export_value((datatype, raw_value)) + } + } + + pub(crate) fn wrap_object( + &self, + value: Object, + datatype: Datatype, + id: &ObjId, + meta: &JsValue, + ) -> Result { + let value = if let Some(function) = self.external_types.get(&datatype) { + let wrapped_value = function + .call1(&JsValue::undefined(), &value) + .map_err(|e| error::Export::CallDataHandler(datatype.to_string(), e))?; + let wrapped_object = wrapped_value + .dyn_into::() + .map_err(|_| error::Export::InvalidDataHandler(datatype.to_string()))?; + set_hidden_value(&wrapped_object, &Symbol::for_(RAW_DATA_SYMBOL), value)?; + wrapped_object + } else { + value + }; + if matches!(datatype, Datatype::Map | Datatype::List) + || (datatype == Datatype::Text && self.text_rep == TextRepresentation::Array) + { + set_hidden_value( + &value, + &Symbol::for_(RAW_OBJECT_SYMBOL), + &JsValue::from(&id.to_string()), + )?; + } + set_hidden_value(&value, &Symbol::for_(DATATYPE_SYMBOL), datatype)?; + set_hidden_value(&value, &Symbol::for_(META_SYMBOL), meta)?; + if self.freeze { + Object::freeze(&value); + } + Ok(value) + } + + pub(crate) fn apply_patch_to_array( + &self, + array: &Object, + patch: &Patch, + meta: &JsValue, + exposed: &mut HashSet, + ) -> Result { + let result = Array::from(array); // shallow copy + match patch { + Patch::PutSeq { + index, + value, + expose, + .. + } => { + if *expose && value.0.is_object() { + exposed.insert(value.1.clone()); + js_set(&result, *index as f64, &JsValue::null())?; + } else { + let sub_val = + self.maybe_wrap_object(alloc(&value.0, self.text_rep), &value.1, meta)?; + js_set(&result, *index as f64, &sub_val)?; + } + Ok(result.into()) + } + Patch::DeleteSeq { index, length, .. } => { + Ok(self.sub_splice(result, *index, *length, vec![], meta)?) + } + Patch::Insert { index, values, .. } => { + Ok(self.sub_splice(result, *index, 0, values, meta)?) + } + Patch::Increment { prop, value, .. } => { + if let Prop::Seq(index) = prop { + let index = *index as f64; + let old_val = js_get(&result, index)?.0; + let old_val = self.unwrap_scalar(old_val)?; + if let Some(old) = old_val.as_f64() { + let new_value: Value<'_> = + am::ScalarValue::counter(old as i64 + *value).into(); + js_set( + &result, + index, + &self.export_value(alloc(&new_value, self.text_rep))?, + )?; + Ok(result.into()) + } else { + Err(error::ApplyPatch::IncrementNonNumeric) + } + } else { + Err(error::ApplyPatch::IncrementKeyInSeq) + } + } + Patch::DeleteMap { .. } => Err(error::ApplyPatch::DeleteKeyFromSeq), + Patch::PutMap { .. } => Err(error::ApplyPatch::PutKeyInSeq), + Patch::SpliceText { index, value, .. } => { + match self.text_rep { + TextRepresentation::String => Err(error::ApplyPatch::SpliceTextInSeq), + TextRepresentation::Array => { + let bytes: Vec = value.iter().cloned().collect(); + let val = String::from_utf16_lossy(bytes.as_slice()); + let elems = val + .chars() + .map(|c| { + ( + Value::Scalar(std::borrow::Cow::Owned(am::ScalarValue::Str( + c.to_string().into(), + ))), + ObjId::Root, // Using ROOT is okay because this ID is never used as + // we're producing ScalarValue::Str + ) + }) + .collect::>(); + Ok(self.sub_splice(result, *index, 0, &elems, meta)?) + } + } + } + } + } + + pub(crate) fn apply_patch_to_map( + &self, + map: &Object, + patch: &Patch, + meta: &JsValue, + exposed: &mut HashSet, + ) -> Result { + let result = Object::assign(&Object::new(), map); // shallow copy + match patch { + Patch::PutMap { + key, value, expose, .. + } => { + if *expose && value.0.is_object() { + exposed.insert(value.1.clone()); + js_set(&result, key, &JsValue::null())?; + } else { + let sub_val = + self.maybe_wrap_object(alloc(&value.0, self.text_rep), &value.1, meta)?; + js_set(&result, key, &sub_val)?; + } + Ok(result) + } + Patch::DeleteMap { key, .. } => { + Reflect::delete_property(&result, &key.into()).map_err(|e| { + error::Export::Delete { + prop: key.to_string(), + err: e, + } + })?; + Ok(result) + } + Patch::Increment { prop, value, .. } => { + if let Prop::Map(key) = prop { + let old_val = js_get(&result, key)?.0; + let old_val = self.unwrap_scalar(old_val)?; + if let Some(old) = old_val.as_f64() { + let new_value: Value<'_> = + am::ScalarValue::counter(old as i64 + *value).into(); + js_set( + &result, + key, + &self.export_value(alloc(&new_value, self.text_rep))?, + )?; + Ok(result) + } else { + Err(error::ApplyPatch::IncrementNonNumeric) + } + } else { + Err(error::ApplyPatch::IncrementIndexInMap) + } + } + Patch::Insert { .. } => Err(error::ApplyPatch::InsertInMap), + Patch::DeleteSeq { .. } => Err(error::ApplyPatch::SpliceInMap), + //Patch::SpliceText { .. } => Err(to_js_err("cannot Splice into map")), + Patch::SpliceText { .. } => Err(error::ApplyPatch::SpliceTextInMap), + Patch::PutSeq { .. } => Err(error::ApplyPatch::PutIdxInMap), + } + } + + pub(crate) fn apply_patch( + &self, + obj: Object, + patch: &Patch, + depth: usize, + meta: &JsValue, + exposed: &mut HashSet, + ) -> Result { + let (inner, datatype, id) = self.unwrap_object(&obj)?; + let prop = patch.path().get(depth).map(|p| prop_to_js(&p.1)); + let result = if let Some(prop) = prop { + let subval = js_get(&inner, &prop)?.0; + if subval.is_string() && patch.path().len() - 1 == depth { + if let Ok(s) = subval.dyn_into::() { + let new_value = self.apply_patch_to_text(&s, patch)?; + let result = shallow_copy(&inner); + js_set(&result, &prop, &new_value)?; + Ok(result) + } else { + // bad patch - short circuit + Ok(obj) + } + } else if let Ok(sub_obj) = js_get(&inner, &prop)?.0.dyn_into::() { + let new_value = self.apply_patch(sub_obj, patch, depth + 1, meta, exposed)?; + let result = shallow_copy(&inner); + js_set(&result, &prop, &new_value)?; + Ok(result) + } else { + // if a patch is trying to access a deleted object make no change + // short circuit the wrap process + return Ok(obj); + } + } else if Array::is_array(&inner) { + if &id == patch.obj() { + self.apply_patch_to_array(&inner, patch, meta, exposed) + } else { + Ok(Array::from(&inner).into()) + } + } else if &id == patch.obj() { + self.apply_patch_to_map(&inner, patch, meta, exposed) + } else { + Ok(Object::assign(&Object::new(), &inner)) + }?; + + self.wrap_object(result, datatype, &id, meta) + .map_err(|e| e.into()) + } + + fn apply_patch_to_text( + &self, + string: &JsString, + patch: &Patch, + ) -> Result { + match patch { + Patch::DeleteSeq { index, length, .. } => { + let index = *index as u32; + let before = string.slice(0, index); + let after = string.slice(index + *length as u32, string.length()); + let result = before.concat(&after); + Ok(result.into()) + } + Patch::SpliceText { index, value, .. } => { + let index = *index as u32; + let length = string.length(); + let before = string.slice(0, index); + let after = string.slice(index, length); + let bytes: Vec = value.iter().cloned().collect(); + let result = before + .concat(&String::from_utf16_lossy(bytes.as_slice()).into()) + .concat(&after); + Ok(result.into()) + } + _ => Ok(string.into()), + } + } + + fn sub_splice<'a, I: IntoIterator, ObjId)>>( + &self, + o: Array, + index: usize, + num_del: usize, + values: I, + meta: &JsValue, + ) -> Result { + let args: Array = values + .into_iter() + .map(|v| self.maybe_wrap_object(alloc(&v.0, self.text_rep), &v.1, meta)) + .collect::>()?; + args.unshift(&(num_del as u32).into()); + args.unshift(&(index as u32).into()); + let method = js_get(&o, "splice")? + .0 + .dyn_into::() + .map_err(error::Export::GetSplice)?; + Reflect::apply(&method, &o, &args).map_err(error::Export::CallSplice)?; + Ok(o.into()) + } + + pub(crate) fn import(&self, id: JsValue) -> Result<(ObjId, am::ObjType), error::ImportObj> { + if let Some(s) = id.as_string() { + // valid formats are + // 123@aabbcc + // 123@aabccc/prop1/prop2/prop3 + // /prop1/prop2/prop3 + let mut components = s.split('/'); + let obj = components.next(); + let (id, obj_type) = if obj == Some("") { + (ROOT, am::ObjType::Map) + } else { + self.doc + .import(obj.unwrap_or_default()) + .map_err(error::ImportObj::BadImport)? + }; + self.import_path(id, obj_type, components) + .map_err(|e| error::ImportObj::InvalidPath(s.to_string(), e)) + } else { + Err(error::ImportObj::NotString) + } + } + + fn import_path<'a, I: Iterator>( + &self, + mut obj: ObjId, + mut obj_type: am::ObjType, + components: I, + ) -> Result<(ObjId, am::ObjType), error::ImportPath> { + for (i, prop) in components.enumerate() { + if prop.is_empty() { + break; + } + let is_map = matches!(obj_type, am::ObjType::Map | am::ObjType::Table); + let val = if is_map { + self.doc.get(obj, prop)? + } else { + let idx = prop + .parse() + .map_err(|_| error::ImportPath::IndexNotInteger(i, prop.to_string()))?; + self.doc.get(obj, am::Prop::Seq(idx))? + }; + match val { + Some((am::Value::Object(am::ObjType::Map), id)) => { + obj_type = am::ObjType::Map; + obj = id; + } + Some((am::Value::Object(am::ObjType::Table), id)) => { + obj_type = am::ObjType::Table; + obj = id; + } + Some((am::Value::Object(am::ObjType::List), id)) => { + obj_type = am::ObjType::List; + obj = id; + } + Some((am::Value::Object(am::ObjType::Text), id)) => { + obj_type = am::ObjType::Text; + obj = id; + } + None => return Err(error::ImportPath::NonExistentObject(i, prop.to_string())), + _ => return Err(error::ImportPath::NotAnObject), + }; + } + Ok((obj, obj_type)) + } + + pub(crate) fn import_prop(&self, prop: JsValue) -> Result { + if let Some(s) = prop.as_string() { + Ok(s.into()) + } else if let Some(n) = prop.as_f64() { + Ok((n as usize).into()) + } else { + Err(error::InvalidProp) + } + } + + pub(crate) fn import_scalar( + &self, + value: &JsValue, + datatype: &Option, + ) -> Option { + match datatype.as_deref() { + Some("boolean") => value.as_bool().map(am::ScalarValue::Boolean), + Some("int") => value.as_f64().map(|v| am::ScalarValue::Int(v as i64)), + Some("uint") => value.as_f64().map(|v| am::ScalarValue::Uint(v as u64)), + Some("str") => value.as_string().map(|v| am::ScalarValue::Str(v.into())), + Some("f64") => value.as_f64().map(am::ScalarValue::F64), + Some("bytes") => Some(am::ScalarValue::Bytes( + value.clone().dyn_into::().unwrap().to_vec(), + )), + Some("counter") => value.as_f64().map(|v| am::ScalarValue::counter(v as i64)), + Some("timestamp") => { + if let Some(v) = value.as_f64() { + Some(am::ScalarValue::Timestamp(v as i64)) + } else if let Ok(d) = value.clone().dyn_into::() { + Some(am::ScalarValue::Timestamp(d.get_time() as i64)) + } else { + None + } + } + Some("null") => Some(am::ScalarValue::Null), + Some(_) => None, + None => { + if value.is_null() { + Some(am::ScalarValue::Null) + } else if let Some(b) = value.as_bool() { + Some(am::ScalarValue::Boolean(b)) + } else if let Some(s) = value.as_string() { + Some(am::ScalarValue::Str(s.into())) + } else if let Some(n) = value.as_f64() { + if (n.round() - n).abs() < f64::EPSILON { + Some(am::ScalarValue::Int(n as i64)) + } else { + Some(am::ScalarValue::F64(n)) + } + } else if let Ok(d) = value.clone().dyn_into::() { + Some(am::ScalarValue::Timestamp(d.get_time() as i64)) + } else if let Ok(o) = &value.clone().dyn_into::() { + Some(am::ScalarValue::Bytes(o.to_vec())) + } else { + None + } + } + } + } + + pub(crate) fn import_value( + &self, + value: &JsValue, + datatype: Option, + ) -> Result<(Value<'static>, Vec<(Prop, JsValue)>), error::InvalidValue> { + match self.import_scalar(value, &datatype) { + Some(val) => Ok((val.into(), vec![])), + None => { + if let Ok(js_obj) = import_obj(value, &datatype) { + Ok(( + js_obj.objtype().into(), + js_obj + .subvals() + .map(|(p, v)| (p.into_owned(), v)) + .collect::>(), + )) + } else { + web_sys::console::log_2(&"Invalid value".into(), value); + Err(error::InvalidValue) + } + } + } + } + + pub(crate) fn finalize_exposed( + &self, + object: &JsValue, + exposed: HashSet, + meta: &JsValue, + ) -> Result<(), error::ApplyPatch> { + for obj in exposed { + let mut pointer = object.clone(); + if let Ok(obj_type) = self.doc.object_type(&obj) { + // only valid obj's should make it to this point ... + let path: Vec<_> = self + .doc + .path_to_object(&obj)? + .iter() + .map(|p| prop_to_js(&p.1)) + .collect(); + let value = self.export_object(&obj, obj_type.into(), None, meta)?; + for (i, prop) in path.iter().enumerate() { + if i + 1 < path.len() { + pointer = js_get(&pointer, prop)?.0; + } else { + js_set(&pointer, prop, &value)?; + } + } + } + } + Ok(()) + } +} + +pub(crate) fn alloc(value: &Value<'_>, text_rep: TextRepresentation) -> (Datatype, JsValue) { + match value { + am::Value::Object(o) => match o { + ObjType::Map => (Datatype::Map, Object::new().into()), + ObjType::Table => (Datatype::Table, Object::new().into()), + ObjType::List => (Datatype::List, Array::new().into()), + ObjType::Text => match text_rep { + TextRepresentation::String => (Datatype::Text, "".into()), + TextRepresentation::Array => (Datatype::Text, Array::new().into()), + }, + }, + am::Value::Scalar(s) => match s.as_ref() { + am::ScalarValue::Bytes(v) => (Datatype::Bytes, Uint8Array::from(v.as_slice()).into()), + am::ScalarValue::Str(v) => (Datatype::Str, v.to_string().into()), + am::ScalarValue::Int(v) => (Datatype::Int, (*v as f64).into()), + am::ScalarValue::Uint(v) => (Datatype::Uint, (*v as f64).into()), + am::ScalarValue::F64(v) => (Datatype::F64, (*v).into()), + am::ScalarValue::Counter(v) => (Datatype::Counter, (f64::from(v)).into()), + am::ScalarValue::Timestamp(v) => ( + Datatype::Timestamp, + js_sys::Date::new(&(*v as f64).into()).into(), + ), + am::ScalarValue::Boolean(v) => (Datatype::Boolean, (*v).into()), + am::ScalarValue::Null => (Datatype::Null, JsValue::null()), + am::ScalarValue::Unknown { bytes, type_code } => ( + Datatype::Unknown(*type_code), + Uint8Array::from(bytes.as_slice()).into(), + ), + }, + } +} + +fn set_hidden_value>( + o: &Object, + key: &Symbol, + value: V, +) -> Result<(), error::Export> { + let definition = Object::new(); + js_set(&definition, "value", &value.into()).map_err(|_| error::Export::SetHidden("value"))?; + js_set(&definition, "writable", false).map_err(|_| error::Export::SetHidden("writable"))?; + js_set(&definition, "enumerable", false).map_err(|_| error::Export::SetHidden("enumerable"))?; + js_set(&definition, "configurable", false) + .map_err(|_| error::Export::SetHidden("configurable"))?; + Object::define_property(o, &key.into(), &definition); + Ok(()) +} + +fn shallow_copy(obj: &Object) -> Object { + if Array::is_array(obj) { + Array::from(obj).into() + } else { + Object::assign(&Object::new(), obj) + } +} + +fn prop_to_js(prop: &Prop) -> JsValue { + match prop { + Prop::Map(key) => key.into(), + Prop::Seq(index) => (*index as f64).into(), + } +} + +pub(crate) mod error { + use automerge::{AutomergeError, LoadChangeError}; + use wasm_bindgen::JsValue; + + #[derive(Debug, thiserror::Error)] + pub enum BadJSChanges { + #[error("the changes were not an array of Uint8Array")] + ChangesNotArray, + #[error("change {0} was not a Uint8Array")] + ElemNotUint8Array(usize), + #[error("error loading change {0}: {1}")] + BadChange(usize, LoadChangeError), + } + + #[derive(Debug, thiserror::Error)] + pub enum BadChangeHashes { + #[error("the change hashes were not an array of strings")] + NotArray, + #[error("could not decode hash {0}: {1}")] + BadElem(usize, BadChangeHash), + } + + impl From for JsValue { + fn from(e: BadChangeHashes) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum BadChangeHashSet { + #[error("not an object")] + NotObject, + #[error(transparent)] + GetProp(#[from] GetProp), + #[error("unable to getOwnProperties")] + ListProp, + #[error("unable to parse hash from {0:?}: {1}")] + BadHash(wasm_bindgen::JsValue, BadChangeHash), + } + + #[derive(Debug, thiserror::Error)] + pub enum BadChangeHash { + #[error("change hash was not a string")] + NotString, + #[error(transparent)] + Parse(#[from] automerge::ParseChangeHashError), + } + + impl From for JsValue { + fn from(e: BadChangeHash) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum BadSyncState { + #[error(transparent)] + GetProp(#[from] GetProp), + #[error("bad sharedHeads: {0}")] + BadSharedHeads(BadChangeHashes), + #[error("bad lastSentHeads: {0}")] + BadLastSentHeads(BadChangeHashes), + #[error("bad theirHeads: {0}")] + BadTheirHeads(BadChangeHashes), + #[error("bad theirNeed: {0}")] + BadTheirNeed(BadChangeHashes), + #[error("bad theirHave: {0}")] + BadTheirHave(BadHaves), + #[error("bad sentHashes: {0}")] + BadSentHashes(BadChangeHashSet), + #[error("inFlight not a boolean")] + InFlightNotBoolean, + } + + impl From for JsValue { + fn from(e: BadSyncState) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + #[error("unable to get property {property}: {error:?}")] + pub struct GetProp { + pub(super) property: String, + pub(super) error: wasm_bindgen::JsValue, + } + + impl From for JsValue { + fn from(e: GetProp) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + #[error("error setting property {property:?} on JS value: {error:?}")] + pub struct SetProp { + pub(super) property: JsValue, + pub(super) error: JsValue, + } + + impl From for JsValue { + fn from(e: SetProp) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum BadHave { + #[error("bad lastSync: {0}")] + BadLastSync(BadChangeHashes), + #[error("bad bloom: {0}")] + BadBloom(BadBloom), + #[error(transparent)] + GetHaveProp(#[from] GetProp), + } + + #[derive(Debug, thiserror::Error)] + pub enum BadHaves { + #[error("value was not an array")] + NotArray, + #[error("error loading have at index {0}: {1}")] + BadElem(usize, BadHave), + } + + #[derive(Debug, thiserror::Error)] + pub enum BadBloom { + #[error("the value was not a Uint8Array")] + NotU8Array, + #[error("unable to decode: {0}")] + Decode(#[from] automerge::sync::DecodeBloomError), + } + + #[derive(Debug, thiserror::Error)] + pub enum Export { + #[error(transparent)] + Set(#[from] SetProp), + #[error("unable to delete prop {prop}: {err:?}")] + Delete { prop: String, err: JsValue }, + #[error("unable to set hidden property {0}")] + SetHidden(&'static str), + #[error("data handler for type {0} did not return a valid object")] + InvalidDataHandler(String), + #[error("error calling data handler for type {0}: {1:?}")] + CallDataHandler(String, JsValue), + #[error(transparent)] + GetProp(#[from] GetProp), + #[error(transparent)] + InvalidDatatype(#[from] crate::value::InvalidDatatype), + #[error("unable to get the splice function: {0:?}")] + GetSplice(JsValue), + #[error("error calling splice: {0:?}")] + CallSplice(JsValue), + #[error(transparent)] + Automerge(#[from] AutomergeError), + } + + impl From for JsValue { + fn from(e: Export) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ApplyPatch { + #[error(transparent)] + Export(#[from] Export), + #[error("cannot delete from a seq")] + DeleteKeyFromSeq, + #[error("cannot put key in seq")] + PutKeyInSeq, + #[error("cannot increment a non-numeric value")] + IncrementNonNumeric, + #[error("cannot increment a key in a seq")] + IncrementKeyInSeq, + #[error("cannot increment index in a map")] + IncrementIndexInMap, + #[error("cannot insert into a map")] + InsertInMap, + #[error("cannot splice into a map")] + SpliceInMap, + #[error("cannot splice text into a seq")] + SpliceTextInSeq, + #[error("cannot splice text into a map")] + SpliceTextInMap, + #[error("cannot put a seq index in a map")] + PutIdxInMap, + #[error(transparent)] + GetProp(#[from] GetProp), + #[error(transparent)] + SetProp(#[from] SetProp), + #[error(transparent)] + Automerge(#[from] AutomergeError), + } + + impl From for JsValue { + fn from(e: ApplyPatch) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum BadSyncMessage { + #[error(transparent)] + GetProp(#[from] GetProp), + #[error("unable to read haves: {0}")] + BadHaves(#[from] BadHaves), + #[error("could not read changes: {0}")] + BadJSChanges(#[from] BadJSChanges), + #[error("could not read heads: {0}")] + BadHeads(BadChangeHashes), + #[error("could not read need: {0}")] + BadNeed(BadChangeHashes), + } + + impl From for JsValue { + fn from(e: BadSyncMessage) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ImportObj { + #[error("obj id was not a string")] + NotString, + #[error("invalid path {0}: {1}")] + InvalidPath(String, ImportPath), + #[error("unable to import object id: {0}")] + BadImport(AutomergeError), + } + + impl From for JsValue { + fn from(e: ImportObj) -> Self { + JsValue::from(format!("invalid object ID: {}", e)) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ImportPath { + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error("path component {0} ({1}) should be an integer to index a sequence")] + IndexNotInteger(usize, String), + #[error("path component {0} ({1}) referenced a nonexistent object")] + NonExistentObject(usize, String), + #[error("path did not refer to an object")] + NotAnObject, + } + + #[derive(Debug, thiserror::Error)] + #[error("given property was not a string or integer")] + pub struct InvalidProp; + + #[derive(Debug, thiserror::Error)] + #[error("given property was not a string or integer")] + pub struct InvalidValue; +} diff --git a/rust/automerge-wasm/src/lib.rs b/rust/automerge-wasm/src/lib.rs new file mode 100644 index 00000000..09072ca7 --- /dev/null +++ b/rust/automerge-wasm/src/lib.rs @@ -0,0 +1,1155 @@ +#![doc( + html_logo_url = "https://raw.githubusercontent.com/automerge/automerge-rs/main/img/brandmark.svg", + html_favicon_url = "https:///raw.githubusercontent.com/automerge/automerge-rs/main/img/favicon.ico" +)] +#![warn( + missing_debug_implementations, + // missing_docs, // TODO: add documentation! + rust_2021_compatibility, + rust_2018_idioms, + unreachable_pub, + bad_style, + dead_code, + improper_ctypes, + non_shorthand_field_patterns, + no_mangle_generic_items, + overflowing_literals, + path_statements, + patterns_in_fns_without_body, + private_in_public, + unconditional_recursion, + unused, + unused_allocation, + unused_comparisons, + unused_parens, + while_true +)] +#![allow(clippy::unused_unit)] +use am::transaction::CommitOptions; +use am::transaction::{Observed, Transactable, UnObserved}; +use am::ScalarValue; +use automerge as am; +use automerge::{sync::SyncDoc, Change, ObjId, Prop, ReadDoc, TextEncoding, Value, ROOT}; +use js_sys::{Array, Function, Object, Uint8Array}; +use serde::ser::Serialize; +use std::borrow::Cow; +use std::collections::HashMap; +use std::collections::HashSet; +use std::convert::TryInto; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; + +mod interop; +mod observer; +mod sequence_tree; +mod sync; +mod value; + +use observer::Observer; + +use interop::{alloc, get_heads, import_obj, js_set, to_js_err, to_prop, AR, JS}; +use sync::SyncState; +use value::Datatype; + +use crate::interop::SubValIter; + +#[allow(unused_macros)] +macro_rules! log { + ( $( $t:tt )* ) => { + web_sys::console::log_1(&format!( $( $t )* ).into()); + }; +} + +type AutoCommit = am::AutoCommitWithObs>; + +#[cfg(feature = "wee_alloc")] +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +/// How text is represented in materialized objects on the JS side +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +#[wasm_bindgen] +pub enum TextRepresentation { + /// As an array of characters and objects + Array, + /// As a single JS string + String, +} + +impl std::default::Default for TextRepresentation { + fn default() -> Self { + TextRepresentation::Array + } +} + +#[wasm_bindgen] +#[derive(Debug)] +pub struct Automerge { + doc: AutoCommit, + freeze: bool, + external_types: HashMap, + text_rep: TextRepresentation, +} + +#[wasm_bindgen] +impl Automerge { + pub fn new( + actor: Option, + text_rep: TextRepresentation, + ) -> Result { + let mut doc = AutoCommit::default().with_encoding(TextEncoding::Utf16); + if let Some(a) = actor { + let a = automerge::ActorId::from(hex::decode(a)?.to_vec()); + doc.set_actor(a); + } + Ok(Automerge { + doc, + freeze: false, + external_types: HashMap::default(), + text_rep, + }) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&mut self, actor: Option) -> Result { + let mut automerge = Automerge { + doc: self.doc.clone(), + freeze: self.freeze, + external_types: self.external_types.clone(), + text_rep: self.text_rep, + }; + if let Some(s) = actor { + let actor = automerge::ActorId::from(hex::decode(s)?.to_vec()); + automerge.doc.set_actor(actor); + } + Ok(automerge) + } + + pub fn fork( + &mut self, + actor: Option, + heads: JsValue, + ) -> Result { + let heads: Result, _> = JS(heads).try_into(); + let doc = if let Ok(heads) = heads { + self.doc.fork_at(&heads)? + } else { + self.doc.fork() + }; + let mut automerge = Automerge { + doc, + freeze: self.freeze, + external_types: self.external_types.clone(), + text_rep: self.text_rep, + }; + if let Some(s) = actor { + let actor = + automerge::ActorId::from(hex::decode(s).map_err(error::BadActorId::from)?.to_vec()); + automerge.doc.set_actor(actor); + } + Ok(automerge) + } + + #[wasm_bindgen(js_name = pendingOps)] + pub fn pending_ops(&self) -> JsValue { + (self.doc.pending_ops() as u32).into() + } + + pub fn commit(&mut self, message: Option, time: Option) -> JsValue { + let mut commit_opts = CommitOptions::default(); + if let Some(message) = message { + commit_opts.set_message(message); + } + if let Some(time) = time { + commit_opts.set_time(time as i64); + } + let hash = self.doc.commit_with(commit_opts); + match hash { + Some(h) => JsValue::from_str(&hex::encode(h.0)), + None => JsValue::NULL, + } + } + + pub fn merge(&mut self, other: &mut Automerge) -> Result { + let heads = self.doc.merge(&mut other.doc)?; + let heads: Array = heads + .iter() + .map(|h| JsValue::from_str(&hex::encode(h.0))) + .collect(); + Ok(heads) + } + + pub fn rollback(&mut self) -> f64 { + self.doc.rollback() as f64 + } + + pub fn keys(&self, obj: JsValue, heads: Option) -> Result { + let (obj, _) = self.import(obj)?; + let result = if let Some(heads) = get_heads(heads)? { + self.doc + .keys_at(&obj, &heads) + .map(|s| JsValue::from_str(&s)) + .collect() + } else { + self.doc.keys(&obj).map(|s| JsValue::from_str(&s)).collect() + }; + Ok(result) + } + + pub fn text(&self, obj: JsValue, heads: Option) -> Result { + let (obj, _) = self.import(obj)?; + if let Some(heads) = get_heads(heads)? { + Ok(self.doc.text_at(&obj, &heads)?) + } else { + Ok(self.doc.text(&obj)?) + } + } + + pub fn splice( + &mut self, + obj: JsValue, + start: f64, + delete_count: f64, + text: JsValue, + ) -> Result<(), error::Splice> { + let (obj, obj_type) = self.import(obj)?; + let start = start as usize; + let delete_count = delete_count as usize; + let vals = if let Some(t) = text.as_string() { + if obj_type == am::ObjType::Text && self.text_rep == TextRepresentation::String { + self.doc.splice_text(&obj, start, delete_count, &t)?; + return Ok(()); + } else { + t.chars() + .map(|c| ScalarValue::Str(c.to_string().into())) + .collect::>() + } + } else { + let mut vals = vec![]; + if let Ok(array) = text.dyn_into::() { + for (index, i) in array.iter().enumerate() { + let value = self + .import_scalar(&i, &None) + .ok_or(error::Splice::ValueNotPrimitive(index))?; + vals.push(value); + } + } + vals + }; + if !vals.is_empty() { + self.doc.splice(&obj, start, delete_count, vals)?; + } else { + // no vals given but we still need to call the text vs splice + // bc utf16 + match obj_type { + am::ObjType::List => { + self.doc.splice(&obj, start, delete_count, vals)?; + } + am::ObjType::Text => match self.text_rep { + TextRepresentation::String => { + self.doc.splice_text(&obj, start, delete_count, "")?; + } + TextRepresentation::Array => { + self.doc.splice(&obj, start, delete_count, vals)?; + } + }, + _ => {} + } + } + Ok(()) + } + + pub fn push( + &mut self, + obj: JsValue, + value: JsValue, + datatype: JsValue, + ) -> Result<(), error::Insert> { + let (obj, _) = self.import(obj)?; + let value = self + .import_scalar(&value, &datatype.as_string()) + .ok_or(error::Insert::ValueNotPrimitive)?; + let index = self.doc.length(&obj); + self.doc.insert(&obj, index, value)?; + Ok(()) + } + + #[wasm_bindgen(js_name = pushObject)] + pub fn push_object( + &mut self, + obj: JsValue, + value: JsValue, + ) -> Result, error::InsertObject> { + let (obj, _) = self.import(obj)?; + let imported_obj = import_obj(&value, &None)?; + let index = self.doc.length(&obj); + let opid = self + .doc + .insert_object(&obj, index, imported_obj.objtype())?; + if let Some(s) = imported_obj.text() { + match self.text_rep { + TextRepresentation::String => { + self.doc.splice_text(&opid, 0, 0, s)?; + } + TextRepresentation::Array => { + self.subset::(&opid, imported_obj.subvals())?; + } + } + } else { + self.subset::(&opid, imported_obj.subvals())?; + } + Ok(opid.to_string().into()) + } + + pub fn insert( + &mut self, + obj: JsValue, + index: f64, + value: JsValue, + datatype: JsValue, + ) -> Result<(), error::Insert> { + let (obj, _) = self.import(obj)?; + let value = self + .import_scalar(&value, &datatype.as_string()) + .ok_or(error::Insert::ValueNotPrimitive)?; + self.doc.insert(&obj, index as usize, value)?; + Ok(()) + } + + #[wasm_bindgen(js_name = insertObject)] + pub fn insert_object( + &mut self, + obj: JsValue, + index: f64, + value: JsValue, + ) -> Result, error::InsertObject> { + let (obj, _) = self.import(obj)?; + let imported_obj = import_obj(&value, &None)?; + let opid = self + .doc + .insert_object(&obj, index as usize, imported_obj.objtype())?; + if let Some(s) = imported_obj.text() { + match self.text_rep { + TextRepresentation::String => { + self.doc.splice_text(&opid, 0, 0, s)?; + } + TextRepresentation::Array => { + self.subset::(&opid, imported_obj.subvals())?; + } + } + } else { + self.subset::(&opid, imported_obj.subvals())?; + } + Ok(opid.to_string().into()) + } + + pub fn put( + &mut self, + obj: JsValue, + prop: JsValue, + value: JsValue, + datatype: JsValue, + ) -> Result<(), error::Insert> { + let (obj, _) = self.import(obj)?; + let prop = self.import_prop(prop)?; + let value = self + .import_scalar(&value, &datatype.as_string()) + .ok_or(error::Insert::ValueNotPrimitive)?; + self.doc.put(&obj, prop, value)?; + Ok(()) + } + + #[wasm_bindgen(js_name = putObject)] + pub fn put_object( + &mut self, + obj: JsValue, + prop: JsValue, + value: JsValue, + ) -> Result { + let (obj, _) = self.import(obj)?; + let prop = self.import_prop(prop)?; + let imported_obj = import_obj(&value, &None)?; + let opid = self.doc.put_object(&obj, prop, imported_obj.objtype())?; + if let Some(s) = imported_obj.text() { + match self.text_rep { + TextRepresentation::String => { + self.doc.splice_text(&opid, 0, 0, s)?; + } + TextRepresentation::Array => { + self.subset::(&opid, imported_obj.subvals())?; + } + } + } else { + self.subset::(&opid, imported_obj.subvals())?; + } + Ok(opid.to_string().into()) + } + + fn subset<'a, E, I>(&mut self, obj: &am::ObjId, vals: I) -> Result<(), E> + where + I: IntoIterator, JsValue)>, + E: From + + From + + From, + { + for (p, v) in vals { + let (value, subvals) = self.import_value(v.as_ref(), None)?; + //let opid = self.0.set(id, p, value)?; + let opid = match (p.as_ref(), value) { + (Prop::Map(s), Value::Object(objtype)) => { + Some(self.doc.put_object(obj, s, objtype)?) + } + (Prop::Map(s), Value::Scalar(scalar)) => { + self.doc.put(obj, s, scalar.into_owned())?; + None + } + (Prop::Seq(i), Value::Object(objtype)) => { + Some(self.doc.insert_object(obj, *i, objtype)?) + } + (Prop::Seq(i), Value::Scalar(scalar)) => { + self.doc.insert(obj, *i, scalar.into_owned())?; + None + } + }; + if let Some(opid) = opid { + self.subset::(&opid, SubValIter::Slice(subvals.as_slice().iter()))?; + } + } + Ok(()) + } + + pub fn increment( + &mut self, + obj: JsValue, + prop: JsValue, + value: JsValue, + ) -> Result<(), error::Increment> { + let (obj, _) = self.import(obj)?; + let prop = self.import_prop(prop)?; + let value: f64 = value.as_f64().ok_or(error::Increment::ValueNotNumeric)?; + self.doc.increment(&obj, prop, value as i64)?; + Ok(()) + } + + #[wasm_bindgen(js_name = get)] + pub fn get( + &self, + obj: JsValue, + prop: JsValue, + heads: Option, + ) -> Result { + let (obj, _) = self.import(obj)?; + let prop = to_prop(prop); + let heads = get_heads(heads)?; + if let Ok(prop) = prop { + let value = if let Some(h) = heads { + self.doc.get_at(&obj, prop, &h)? + } else { + self.doc.get(&obj, prop)? + }; + if let Some((value, id)) = value { + match alloc(&value, self.text_rep) { + (datatype, js_value) if datatype.is_scalar() => Ok(js_value), + _ => Ok(id.to_string().into()), + } + } else { + Ok(JsValue::undefined()) + } + } else { + Ok(JsValue::undefined()) + } + } + + #[wasm_bindgen(js_name = getWithType)] + pub fn get_with_type( + &self, + obj: JsValue, + prop: JsValue, + heads: Option, + ) -> Result { + let (obj, _) = self.import(obj)?; + let prop = to_prop(prop); + let heads = get_heads(heads)?; + if let Ok(prop) = prop { + let value = if let Some(h) = heads { + self.doc.get_at(&obj, prop, &h)? + } else { + self.doc.get(&obj, prop)? + }; + if let Some(value) = value { + match &value { + (Value::Object(obj_type), obj_id) => { + let result = Array::new(); + result.push(&obj_type.to_string().into()); + result.push(&obj_id.to_string().into()); + Ok(result.into()) + } + (Value::Scalar(_), _) => { + let result = Array::new(); + let (datatype, value) = alloc(&value.0, self.text_rep); + result.push(&datatype.into()); + result.push(&value); + Ok(result.into()) + } + } + } else { + Ok(JsValue::null()) + } + } else { + Ok(JsValue::null()) + } + } + + #[wasm_bindgen(js_name = getAll)] + pub fn get_all( + &self, + obj: JsValue, + arg: JsValue, + heads: Option, + ) -> Result { + let (obj, _) = self.import(obj)?; + let result = Array::new(); + let prop = to_prop(arg); + if let Ok(prop) = prop { + let values = if let Some(heads) = get_heads(heads)? { + self.doc.get_all_at(&obj, prop, &heads) + } else { + self.doc.get_all(&obj, prop) + }?; + for (value, id) in values { + let sub = Array::new(); + let (datatype, js_value) = alloc(&value, self.text_rep); + sub.push(&datatype.into()); + if value.is_scalar() { + sub.push(&js_value); + } + sub.push(&id.to_string().into()); + result.push(&JsValue::from(&sub)); + } + } + Ok(result) + } + + #[wasm_bindgen(js_name = enableFreeze)] + pub fn enable_freeze(&mut self, enable: JsValue) -> Result { + let enable = enable + .as_bool() + .ok_or_else(|| to_js_err("must pass a bool to enableFreeze"))?; + let old_freeze = self.freeze; + self.freeze = enable; + Ok(old_freeze.into()) + } + + #[wasm_bindgen(js_name = enablePatches)] + pub fn enable_patches(&mut self, enable: JsValue) -> Result { + let enable = enable + .as_bool() + .ok_or_else(|| to_js_err("must pass a bool to enablePatches"))?; + let old_enabled = self.doc.observer().enable(enable); + self.doc.observer().set_text_rep(self.text_rep); + Ok(old_enabled.into()) + } + + #[wasm_bindgen(js_name = registerDatatype)] + pub fn register_datatype( + &mut self, + datatype: JsValue, + function: JsValue, + ) -> Result<(), value::InvalidDatatype> { + let datatype = Datatype::try_from(datatype)?; + if let Ok(function) = function.dyn_into::() { + self.external_types.insert(datatype, function); + } else { + self.external_types.remove(&datatype); + } + Ok(()) + } + + #[wasm_bindgen(js_name = applyPatches)] + pub fn apply_patches( + &mut self, + object: JsValue, + meta: JsValue, + callback: JsValue, + ) -> Result { + let mut object = object + .dyn_into::() + .map_err(|_| error::ApplyPatch::NotObjectd)?; + let patches = self.doc.observer().take_patches(); + let callback = callback.dyn_into::().ok(); + + // even if there are no patches we may need to update the meta object + // which requires that we update the object too + if patches.is_empty() && !meta.is_undefined() { + let (obj, datatype, id) = self.unwrap_object(&object)?; + object = Object::assign(&Object::new(), &obj); + object = self.wrap_object(object, datatype, &id, &meta)?; + } + + let mut exposed = HashSet::default(); + + let before = object.clone(); + + for p in &patches { + object = self.apply_patch(object, p, 0, &meta, &mut exposed)?; + } + + if let Some(c) = &callback { + if !patches.is_empty() { + let patches: Array = patches + .into_iter() + .map(JsValue::try_from) + .collect::>()?; + c.call3(&JsValue::undefined(), &patches.into(), &before, &object) + .map_err(error::ApplyPatch::PatchCallback)?; + } + } + + self.finalize_exposed(&object, exposed, &meta)?; + + Ok(object.into()) + } + + #[wasm_bindgen(js_name = popPatches)] + pub fn pop_patches(&mut self) -> Result { + // transactions send out observer updates as they occur, not waiting for them to be + // committed. + // If we pop the patches then we won't be able to revert them. + + let patches = self.doc.observer().take_patches(); + let result = Array::new(); + for p in patches { + result.push(&p.try_into()?); + } + Ok(result) + } + + pub fn length(&self, obj: JsValue, heads: Option) -> Result { + let (obj, _) = self.import(obj)?; + if let Some(heads) = get_heads(heads)? { + Ok(self.doc.length_at(&obj, &heads) as f64) + } else { + Ok(self.doc.length(&obj) as f64) + } + } + + pub fn delete(&mut self, obj: JsValue, prop: JsValue) -> Result<(), error::Get> { + let (obj, _) = self.import(obj)?; + let prop = to_prop(prop)?; + self.doc.delete(&obj, prop)?; + Ok(()) + } + + pub fn save(&mut self) -> Uint8Array { + Uint8Array::from(self.doc.save().as_slice()) + } + + #[wasm_bindgen(js_name = saveIncremental)] + pub fn save_incremental(&mut self) -> Uint8Array { + let bytes = self.doc.save_incremental(); + Uint8Array::from(bytes.as_slice()) + } + + #[wasm_bindgen(js_name = loadIncremental)] + pub fn load_incremental(&mut self, data: Uint8Array) -> Result { + let data = data.to_vec(); + let len = self.doc.load_incremental(&data)?; + Ok(len as f64) + } + + #[wasm_bindgen(js_name = applyChanges)] + pub fn apply_changes(&mut self, changes: JsValue) -> Result<(), error::ApplyChangesError> { + let changes: Vec<_> = JS(changes).try_into()?; + self.doc.apply_changes(changes)?; + Ok(()) + } + + #[wasm_bindgen(js_name = getChanges)] + pub fn get_changes(&mut self, have_deps: JsValue) -> Result { + let deps: Vec<_> = JS(have_deps).try_into()?; + let changes = self.doc.get_changes(&deps)?; + let changes: Array = changes + .iter() + .map(|c| Uint8Array::from(c.raw_bytes())) + .collect(); + Ok(changes) + } + + #[wasm_bindgen(js_name = getChangeByHash)] + pub fn get_change_by_hash( + &mut self, + hash: JsValue, + ) -> Result { + let hash = JS(hash).try_into()?; + let change = self.doc.get_change_by_hash(&hash); + if let Some(c) = change { + Ok(Uint8Array::from(c.raw_bytes()).into()) + } else { + Ok(JsValue::null()) + } + } + + #[wasm_bindgen(js_name = getChangesAdded)] + pub fn get_changes_added(&mut self, other: &mut Automerge) -> Array { + let changes = self.doc.get_changes_added(&mut other.doc); + let changes: Array = changes + .iter() + .map(|c| Uint8Array::from(c.raw_bytes())) + .collect(); + changes + } + + #[wasm_bindgen(js_name = getHeads)] + pub fn get_heads(&mut self) -> Array { + let heads = self.doc.get_heads(); + let heads: Array = heads + .iter() + .map(|h| JsValue::from_str(&hex::encode(h.0))) + .collect(); + heads + } + + #[wasm_bindgen(js_name = getActorId)] + pub fn get_actor_id(&self) -> String { + let actor = self.doc.get_actor(); + actor.to_string() + } + + #[wasm_bindgen(js_name = getLastLocalChange)] + pub fn get_last_local_change(&mut self) -> JsValue { + if let Some(change) = self.doc.get_last_local_change() { + Uint8Array::from(change.raw_bytes()).into() + } else { + JsValue::null() + } + } + + pub fn dump(&mut self) { + self.doc.dump() + } + + #[wasm_bindgen(js_name = getMissingDeps)] + pub fn get_missing_deps(&mut self, heads: Option) -> Result { + let heads = get_heads(heads)?.unwrap_or_default(); + let deps = self.doc.get_missing_deps(&heads); + let deps: Array = deps + .iter() + .map(|h| JsValue::from_str(&hex::encode(h.0))) + .collect(); + Ok(deps) + } + + #[wasm_bindgen(js_name = receiveSyncMessage)] + pub fn receive_sync_message( + &mut self, + state: &mut SyncState, + message: Uint8Array, + ) -> Result<(), error::ReceiveSyncMessage> { + let message = message.to_vec(); + let message = am::sync::Message::decode(message.as_slice())?; + self.doc + .sync() + .receive_sync_message(&mut state.0, message)?; + Ok(()) + } + + #[wasm_bindgen(js_name = generateSyncMessage)] + pub fn generate_sync_message(&mut self, state: &mut SyncState) -> JsValue { + if let Some(message) = self.doc.sync().generate_sync_message(&mut state.0) { + Uint8Array::from(message.encode().as_slice()).into() + } else { + JsValue::null() + } + } + + #[wasm_bindgen(js_name = toJS)] + pub fn to_js(&mut self, meta: JsValue) -> Result { + self.export_object(&ROOT, Datatype::Map, None, &meta) + } + + pub fn materialize( + &mut self, + obj: JsValue, + heads: Option, + meta: JsValue, + ) -> Result { + let (obj, obj_type) = self.import(obj).unwrap_or((ROOT, am::ObjType::Map)); + let heads = get_heads(heads)?; + let _patches = self.doc.observer().take_patches(); // throw away patches + Ok(self.export_object(&obj, obj_type.into(), heads.as_ref(), &meta)?) + } + + #[wasm_bindgen(js_name = emptyChange)] + pub fn empty_change(&mut self, message: Option, time: Option) -> JsValue { + let time = time.map(|f| f as i64); + let options = CommitOptions { message, time }; + let hash = self.doc.empty_change(options); + JsValue::from_str(&hex::encode(hash)) + } +} + +#[wasm_bindgen(js_name = create)] +pub fn init(text_v2: bool, actor: Option) -> Result { + console_error_panic_hook::set_once(); + let text_rep = if text_v2 { + TextRepresentation::String + } else { + TextRepresentation::Array + }; + Automerge::new(actor, text_rep) +} + +#[wasm_bindgen(js_name = load)] +pub fn load( + data: Uint8Array, + text_v2: bool, + actor: Option, +) -> Result { + let data = data.to_vec(); + let text_rep = if text_v2 { + TextRepresentation::String + } else { + TextRepresentation::Array + }; + let mut doc = am::AutoCommitWithObs::::load(&data)? + .with_observer(Observer::default().with_text_rep(text_rep)) + .with_encoding(TextEncoding::Utf16); + if let Some(s) = actor { + let actor = + automerge::ActorId::from(hex::decode(s).map_err(error::BadActorId::from)?.to_vec()); + doc.set_actor(actor); + } + Ok(Automerge { + doc, + freeze: false, + external_types: HashMap::default(), + text_rep, + }) +} + +#[wasm_bindgen(js_name = encodeChange)] +pub fn encode_change(change: JsValue) -> Result { + // Alex: Technically we should be using serde_wasm_bindgen::from_value instead of into_serde. + // Unfortunately serde_wasm_bindgen::from_value fails for some inscrutable reason, so instead + // we use into_serde (sorry to future me). + #[allow(deprecated)] + let change: am::ExpandedChange = change.into_serde()?; + let change: Change = change.into(); + Ok(Uint8Array::from(change.raw_bytes())) +} + +#[wasm_bindgen(js_name = decodeChange)] +pub fn decode_change(change: Uint8Array) -> Result { + let change = Change::from_bytes(change.to_vec())?; + let change: am::ExpandedChange = change.decode(); + let serializer = serde_wasm_bindgen::Serializer::json_compatible(); + Ok(change.serialize(&serializer)?) +} + +#[wasm_bindgen(js_name = initSyncState)] +pub fn init_sync_state() -> SyncState { + SyncState(am::sync::State::new()) +} + +// this is needed to be compatible with the automerge-js api +#[wasm_bindgen(js_name = importSyncState)] +pub fn import_sync_state(state: JsValue) -> Result { + Ok(SyncState(JS(state).try_into()?)) +} + +// this is needed to be compatible with the automerge-js api +#[wasm_bindgen(js_name = exportSyncState)] +pub fn export_sync_state(state: &SyncState) -> JsValue { + JS::from(state.0.clone()).into() +} + +#[wasm_bindgen(js_name = encodeSyncMessage)] +pub fn encode_sync_message(message: JsValue) -> Result { + let message: am::sync::Message = JS(message).try_into()?; + Ok(Uint8Array::from(message.encode().as_slice())) +} + +#[wasm_bindgen(js_name = decodeSyncMessage)] +pub fn decode_sync_message(msg: Uint8Array) -> Result { + let data = msg.to_vec(); + let msg = am::sync::Message::decode(&data)?; + let heads = AR::from(msg.heads.as_slice()); + let need = AR::from(msg.need.as_slice()); + let changes = AR::from(msg.changes.as_slice()); + let have = AR::from(msg.have.as_slice()); + let obj = Object::new().into(); + // SAFETY: we just created this object + js_set(&obj, "heads", heads).unwrap(); + js_set(&obj, "need", need).unwrap(); + js_set(&obj, "have", have).unwrap(); + js_set(&obj, "changes", changes).unwrap(); + Ok(obj) +} + +#[wasm_bindgen(js_name = encodeSyncState)] +pub fn encode_sync_state(state: &SyncState) -> Uint8Array { + Uint8Array::from(state.0.encode().as_slice()) +} + +#[wasm_bindgen(js_name = decodeSyncState)] +pub fn decode_sync_state(data: Uint8Array) -> Result { + SyncState::decode(data) +} + +pub mod error { + use automerge::AutomergeError; + use wasm_bindgen::JsValue; + + use crate::interop::{ + self, + error::{BadChangeHashes, BadJSChanges}, + }; + + #[derive(Debug, thiserror::Error)] + #[error("could not parse Actor ID as a hex string: {0}")] + pub struct BadActorId(#[from] hex::FromHexError); + + impl From for JsValue { + fn from(s: BadActorId) -> Self { + JsValue::from(s.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ApplyChangesError { + #[error(transparent)] + DecodeChanges(#[from] BadJSChanges), + #[error("error applying changes: {0}")] + Apply(#[from] AutomergeError), + } + + impl From for JsValue { + fn from(e: ApplyChangesError) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Fork { + #[error(transparent)] + BadActor(#[from] BadActorId), + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error(transparent)] + BadChangeHashes(#[from] BadChangeHashes), + } + + impl From for JsValue { + fn from(f: Fork) -> Self { + JsValue::from(f.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + #[error(transparent)] + pub struct Merge(#[from] AutomergeError); + + impl From for JsValue { + fn from(e: Merge) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Get { + #[error("invalid object ID: {0}")] + ImportObj(#[from] interop::error::ImportObj), + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error("bad heads: {0}")] + BadHeads(#[from] interop::error::BadChangeHashes), + #[error(transparent)] + InvalidProp(#[from] interop::error::InvalidProp), + } + + impl From for JsValue { + fn from(e: Get) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Splice { + #[error("invalid object ID: {0}")] + ImportObj(#[from] interop::error::ImportObj), + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error("value at {0} in values to insert was not a primitive")] + ValueNotPrimitive(usize), + } + + impl From for JsValue { + fn from(e: Splice) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Insert { + #[error("invalid object id: {0}")] + ImportObj(#[from] interop::error::ImportObj), + #[error("the value to insert was not a primitive")] + ValueNotPrimitive, + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error(transparent)] + InvalidProp(#[from] interop::error::InvalidProp), + #[error(transparent)] + InvalidValue(#[from] interop::error::InvalidValue), + } + + impl From for JsValue { + fn from(e: Insert) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum InsertObject { + #[error("invalid object id: {0}")] + ImportObj(#[from] interop::error::ImportObj), + #[error("the value to insert must be an object")] + ValueNotObject, + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error(transparent)] + InvalidProp(#[from] interop::error::InvalidProp), + #[error(transparent)] + InvalidValue(#[from] interop::error::InvalidValue), + } + + impl From for JsValue { + fn from(e: InsertObject) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Increment { + #[error("invalid object id: {0}")] + ImportObj(#[from] interop::error::ImportObj), + #[error(transparent)] + InvalidProp(#[from] interop::error::InvalidProp), + #[error("value was not numeric")] + ValueNotNumeric, + #[error(transparent)] + Automerge(#[from] AutomergeError), + } + + impl From for JsValue { + fn from(e: Increment) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum BadSyncMessage { + #[error("could not decode sync message: {0}")] + ReadMessage(#[from] automerge::sync::ReadMessageError), + } + + impl From for JsValue { + fn from(e: BadSyncMessage) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ApplyPatch { + #[error(transparent)] + Interop(#[from] interop::error::ApplyPatch), + #[error(transparent)] + Export(#[from] interop::error::Export), + #[error("patch was not an object")] + NotObjectd, + #[error("error calling patch callback: {0:?}")] + PatchCallback(JsValue), + } + + impl From for JsValue { + fn from(e: ApplyPatch) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + #[error("unable to build patches: {0}")] + pub struct PopPatches(#[from] interop::error::Export); + + impl From for JsValue { + fn from(e: PopPatches) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Materialize { + #[error(transparent)] + Export(#[from] interop::error::Export), + #[error("bad heads: {0}")] + Heads(#[from] interop::error::BadChangeHashes), + } + + impl From for JsValue { + fn from(e: Materialize) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum ReceiveSyncMessage { + #[error(transparent)] + Decode(#[from] automerge::sync::ReadMessageError), + #[error(transparent)] + Automerge(#[from] AutomergeError), + } + + impl From for JsValue { + fn from(e: ReceiveSyncMessage) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum Load { + #[error(transparent)] + Automerge(#[from] AutomergeError), + #[error(transparent)] + BadActor(#[from] BadActorId), + } + + impl From for JsValue { + fn from(e: Load) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + #[error("Unable to read JS change: {0}")] + pub struct EncodeChange(#[from] serde_json::Error); + + impl From for JsValue { + fn from(e: EncodeChange) -> Self { + JsValue::from(e.to_string()) + } + } + + #[derive(Debug, thiserror::Error)] + pub enum DecodeChange { + #[error(transparent)] + Load(#[from] automerge::LoadChangeError), + #[error(transparent)] + Serialize(#[from] serde_wasm_bindgen::Error), + } + + impl From for JsValue { + fn from(e: DecodeChange) -> Self { + JsValue::from(e.to_string()) + } + } +} diff --git a/rust/automerge-wasm/src/observer.rs b/rust/automerge-wasm/src/observer.rs new file mode 100644 index 00000000..2351c762 --- /dev/null +++ b/rust/automerge-wasm/src/observer.rs @@ -0,0 +1,518 @@ +#![allow(dead_code)] + +use std::borrow::Cow; + +use crate::{ + interop::{self, alloc, js_set}, + TextRepresentation, +}; +use automerge::{ObjId, OpObserver, Prop, ReadDoc, ScalarValue, Value}; +use js_sys::{Array, Object}; +use wasm_bindgen::prelude::*; + +use crate::sequence_tree::SequenceTree; + +#[derive(Debug, Clone, Default)] +pub(crate) struct Observer { + enabled: bool, + patches: Vec, + text_rep: TextRepresentation, +} + +impl Observer { + pub(crate) fn take_patches(&mut self) -> Vec { + std::mem::take(&mut self.patches) + } + pub(crate) fn enable(&mut self, enable: bool) -> bool { + if self.enabled && !enable { + self.patches.truncate(0) + } + let old_enabled = self.enabled; + self.enabled = enable; + old_enabled + } + + fn get_path(&mut self, doc: &R, obj: &ObjId) -> Option> { + match doc.parents(obj) { + Ok(parents) => parents.visible_path(), + Err(e) => { + automerge::log!("error generating patch : {:?}", e); + None + } + } + } + + pub(crate) fn with_text_rep(mut self, text_rep: TextRepresentation) -> Self { + self.text_rep = text_rep; + self + } + + pub(crate) fn set_text_rep(&mut self, text_rep: TextRepresentation) { + self.text_rep = text_rep; + } +} + +#[derive(Debug, Clone)] +pub(crate) enum Patch { + PutMap { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + key: String, + value: (Value<'static>, ObjId), + expose: bool, + }, + PutSeq { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + index: usize, + value: (Value<'static>, ObjId), + expose: bool, + }, + Insert { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + index: usize, + values: SequenceTree<(Value<'static>, ObjId)>, + }, + SpliceText { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + index: usize, + value: SequenceTree, + }, + Increment { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + prop: Prop, + value: i64, + }, + DeleteMap { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + key: String, + }, + DeleteSeq { + obj: ObjId, + path: Vec<(ObjId, Prop)>, + index: usize, + length: usize, + }, +} + +impl OpObserver for Observer { + fn insert( + &mut self, + doc: &R, + obj: ObjId, + index: usize, + tagged_value: (Value<'_>, ObjId), + ) { + if self.enabled { + let value = (tagged_value.0.to_owned(), tagged_value.1); + if let Some(Patch::Insert { + obj: tail_obj, + index: tail_index, + values, + .. + }) = self.patches.last_mut() + { + let range = *tail_index..=*tail_index + values.len(); + if tail_obj == &obj && range.contains(&index) { + values.insert(index - *tail_index, value); + return; + } + } + if let Some(path) = self.get_path(doc, &obj) { + let mut values = SequenceTree::new(); + values.push(value); + let patch = Patch::Insert { + path, + obj, + index, + values, + }; + self.patches.push(patch); + } + } + } + + fn splice_text(&mut self, doc: &R, obj: ObjId, index: usize, value: &str) { + if self.enabled { + if self.text_rep == TextRepresentation::Array { + for (i, c) in value.chars().enumerate() { + self.insert( + doc, + obj.clone(), + index + i, + ( + Value::Scalar(Cow::Owned(ScalarValue::Str(c.to_string().into()))), + ObjId::Root, // We hope this is okay + ), + ); + } + return; + } + if let Some(Patch::SpliceText { + obj: tail_obj, + index: tail_index, + value: prev_value, + .. + }) = self.patches.last_mut() + { + let range = *tail_index..=*tail_index + prev_value.len(); + if tail_obj == &obj && range.contains(&index) { + let i = index - *tail_index; + for (n, ch) in value.encode_utf16().enumerate() { + prev_value.insert(i + n, ch) + } + return; + } + } + if let Some(path) = self.get_path(doc, &obj) { + let mut v = SequenceTree::new(); + for ch in value.encode_utf16() { + v.push(ch) + } + let patch = Patch::SpliceText { + path, + obj, + index, + value: v, + }; + self.patches.push(patch); + } + } + } + + fn delete_seq(&mut self, doc: &R, obj: ObjId, index: usize, length: usize) { + if self.enabled { + match self.patches.last_mut() { + Some(Patch::SpliceText { + obj: tail_obj, + index: tail_index, + value, + .. + }) => { + let range = *tail_index..*tail_index + value.len(); + if tail_obj == &obj + && range.contains(&index) + && range.contains(&(index + length - 1)) + { + for _ in 0..length { + value.remove(index - *tail_index); + } + return; + } + } + Some(Patch::Insert { + obj: tail_obj, + index: tail_index, + values, + .. + }) => { + let range = *tail_index..*tail_index + values.len(); + if tail_obj == &obj + && range.contains(&index) + && range.contains(&(index + length - 1)) + { + for _ in 0..length { + values.remove(index - *tail_index); + } + return; + } + } + Some(Patch::DeleteSeq { + obj: tail_obj, + index: tail_index, + length: tail_length, + .. + }) => { + if tail_obj == &obj && index == *tail_index { + *tail_length += length; + return; + } + } + _ => {} + } + if let Some(path) = self.get_path(doc, &obj) { + let patch = Patch::DeleteSeq { + path, + obj, + index, + length, + }; + self.patches.push(patch) + } + } + } + + fn delete_map(&mut self, doc: &R, obj: ObjId, key: &str) { + if self.enabled { + if let Some(path) = self.get_path(doc, &obj) { + let patch = Patch::DeleteMap { + path, + obj, + key: key.to_owned(), + }; + self.patches.push(patch) + } + } + } + + fn put( + &mut self, + doc: &R, + obj: ObjId, + prop: Prop, + tagged_value: (Value<'_>, ObjId), + _conflict: bool, + ) { + if self.enabled { + let expose = false; + if let Some(path) = self.get_path(doc, &obj) { + let value = (tagged_value.0.to_owned(), tagged_value.1); + let patch = match prop { + Prop::Map(key) => Patch::PutMap { + path, + obj, + key, + value, + expose, + }, + Prop::Seq(index) => Patch::PutSeq { + path, + obj, + index, + value, + expose, + }, + }; + self.patches.push(patch); + } + } + } + + fn expose( + &mut self, + doc: &R, + obj: ObjId, + prop: Prop, + tagged_value: (Value<'_>, ObjId), + _conflict: bool, + ) { + if self.enabled { + let expose = true; + if let Some(path) = self.get_path(doc, &obj) { + let value = (tagged_value.0.to_owned(), tagged_value.1); + let patch = match prop { + Prop::Map(key) => Patch::PutMap { + path, + obj, + key, + value, + expose, + }, + Prop::Seq(index) => Patch::PutSeq { + path, + obj, + index, + value, + expose, + }, + }; + self.patches.push(patch); + } + } + } + + fn increment( + &mut self, + doc: &R, + obj: ObjId, + prop: Prop, + tagged_value: (i64, ObjId), + ) { + if self.enabled { + if let Some(path) = self.get_path(doc, &obj) { + let value = tagged_value.0; + self.patches.push(Patch::Increment { + path, + obj, + prop, + value, + }) + } + } + } + + fn text_as_seq(&self) -> bool { + self.text_rep == TextRepresentation::Array + } +} + +impl automerge::op_observer::BranchableObserver for Observer { + fn merge(&mut self, other: &Self) { + self.patches.extend_from_slice(other.patches.as_slice()) + } + + fn branch(&self) -> Self { + Observer { + patches: vec![], + enabled: self.enabled, + text_rep: self.text_rep, + } + } +} + +fn prop_to_js(p: &Prop) -> JsValue { + match p { + Prop::Map(key) => JsValue::from_str(key), + Prop::Seq(index) => JsValue::from_f64(*index as f64), + } +} + +fn export_path(path: &[(ObjId, Prop)], end: &Prop) -> Array { + let result = Array::new(); + for p in path { + result.push(&prop_to_js(&p.1)); + } + result.push(&prop_to_js(end)); + result +} + +impl Patch { + pub(crate) fn path(&self) -> &[(ObjId, Prop)] { + match &self { + Self::PutMap { path, .. } => path.as_slice(), + Self::PutSeq { path, .. } => path.as_slice(), + Self::Increment { path, .. } => path.as_slice(), + Self::Insert { path, .. } => path.as_slice(), + Self::SpliceText { path, .. } => path.as_slice(), + Self::DeleteMap { path, .. } => path.as_slice(), + Self::DeleteSeq { path, .. } => path.as_slice(), + } + } + + pub(crate) fn obj(&self) -> &ObjId { + match &self { + Self::PutMap { obj, .. } => obj, + Self::PutSeq { obj, .. } => obj, + Self::Increment { obj, .. } => obj, + Self::Insert { obj, .. } => obj, + Self::SpliceText { obj, .. } => obj, + Self::DeleteMap { obj, .. } => obj, + Self::DeleteSeq { obj, .. } => obj, + } + } +} + +impl TryFrom for JsValue { + type Error = interop::error::Export; + + fn try_from(p: Patch) -> Result { + let result = Object::new(); + match p { + Patch::PutMap { + path, key, value, .. + } => { + js_set(&result, "action", "put")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Map(key)), + )?; + js_set( + &result, + "value", + alloc(&value.0, TextRepresentation::String).1, + )?; + Ok(result.into()) + } + Patch::PutSeq { + path, index, value, .. + } => { + js_set(&result, "action", "put")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Seq(index)), + )?; + js_set( + &result, + "value", + alloc(&value.0, TextRepresentation::String).1, + )?; + Ok(result.into()) + } + Patch::Insert { + path, + index, + values, + .. + } => { + js_set(&result, "action", "insert")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Seq(index)), + )?; + js_set( + &result, + "values", + values + .iter() + .map(|v| alloc(&v.0, TextRepresentation::String).1) + .collect::(), + )?; + Ok(result.into()) + } + Patch::SpliceText { + path, index, value, .. + } => { + js_set(&result, "action", "splice")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Seq(index)), + )?; + let bytes: Vec = value.iter().cloned().collect(); + js_set(&result, "value", String::from_utf16_lossy(bytes.as_slice()))?; + Ok(result.into()) + } + Patch::Increment { + path, prop, value, .. + } => { + js_set(&result, "action", "inc")?; + js_set(&result, "path", export_path(path.as_slice(), &prop))?; + js_set(&result, "value", &JsValue::from_f64(value as f64))?; + Ok(result.into()) + } + Patch::DeleteMap { path, key, .. } => { + js_set(&result, "action", "del")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Map(key)), + )?; + Ok(result.into()) + } + Patch::DeleteSeq { + path, + index, + length, + .. + } => { + js_set(&result, "action", "del")?; + js_set( + &result, + "path", + export_path(path.as_slice(), &Prop::Seq(index)), + )?; + if length > 1 { + js_set(&result, "length", length)?; + } + Ok(result.into()) + } + } + } +} diff --git a/rust/automerge-wasm/src/sequence_tree.rs b/rust/automerge-wasm/src/sequence_tree.rs new file mode 100644 index 00000000..91b183a2 --- /dev/null +++ b/rust/automerge-wasm/src/sequence_tree.rs @@ -0,0 +1,617 @@ +use std::{ + cmp::{min, Ordering}, + fmt::Debug, + mem, +}; + +pub(crate) const B: usize = 16; +pub(crate) type SequenceTree = SequenceTreeInternal; + +#[derive(Clone, Debug)] +pub(crate) struct SequenceTreeInternal { + root_node: Option>, +} + +#[derive(Clone, Debug, PartialEq)] +struct SequenceTreeNode { + elements: Vec, + children: Vec>, + length: usize, +} + +impl SequenceTreeInternal +where + T: Clone + Debug, +{ + /// Construct a new, empty, sequence. + pub(crate) fn new() -> Self { + Self { root_node: None } + } + + /// Get the length of the sequence. + pub(crate) fn len(&self) -> usize { + self.root_node.as_ref().map_or(0, |n| n.len()) + } + + /// Create an iterator through the sequence. + pub(crate) fn iter(&self) -> Iter<'_, T> { + Iter { + inner: self, + index: 0, + } + } + + /// Insert the `element` into the sequence at `index`. + /// + /// # Panics + /// + /// Panics if `index > len`. + pub(crate) fn insert(&mut self, index: usize, element: T) { + let old_len = self.len(); + if let Some(root) = self.root_node.as_mut() { + #[cfg(debug_assertions)] + root.check(); + + if root.is_full() { + let original_len = root.len(); + let new_root = SequenceTreeNode::new(); + + // move new_root to root position + let old_root = mem::replace(root, new_root); + + root.length += old_root.len(); + root.children.push(old_root); + root.split_child(0); + + assert_eq!(original_len, root.len()); + + // after splitting the root has one element and two children, find which child the + // index is in + let first_child_len = root.children[0].len(); + let (child, insertion_index) = if first_child_len < index { + (&mut root.children[1], index - (first_child_len + 1)) + } else { + (&mut root.children[0], index) + }; + root.length += 1; + child.insert_into_non_full_node(insertion_index, element) + } else { + root.insert_into_non_full_node(index, element) + } + } else { + self.root_node = Some(SequenceTreeNode { + elements: vec![element], + children: Vec::new(), + length: 1, + }) + } + assert_eq!(self.len(), old_len + 1, "{:#?}", self); + } + + /// Push the `element` onto the back of the sequence. + pub(crate) fn push(&mut self, element: T) { + let l = self.len(); + self.insert(l, element) + } + + /// Get the `element` at `index` in the sequence. + pub(crate) fn get(&self, index: usize) -> Option<&T> { + self.root_node.as_ref().and_then(|n| n.get(index)) + } + + /// Removes the element at `index` from the sequence. + /// + /// # Panics + /// + /// Panics if `index` is out of bounds. + pub(crate) fn remove(&mut self, index: usize) -> T { + if let Some(root) = self.root_node.as_mut() { + #[cfg(debug_assertions)] + let len = root.check(); + let old = root.remove(index); + + if root.elements.is_empty() { + if root.is_leaf() { + self.root_node = None; + } else { + self.root_node = Some(root.children.remove(0)); + } + } + + #[cfg(debug_assertions)] + debug_assert_eq!(len, self.root_node.as_ref().map_or(0, |r| r.check()) + 1); + old + } else { + panic!("remove from empty tree") + } + } +} + +impl SequenceTreeNode +where + T: Clone + Debug, +{ + fn new() -> Self { + Self { + elements: Vec::new(), + children: Vec::new(), + length: 0, + } + } + + pub(crate) fn len(&self) -> usize { + self.length + } + + fn is_leaf(&self) -> bool { + self.children.is_empty() + } + + fn is_full(&self) -> bool { + self.elements.len() >= 2 * B - 1 + } + + /// Returns the child index and the given index adjusted for the cumulative index before that + /// child. + fn find_child_index(&self, index: usize) -> (usize, usize) { + let mut cumulative_len = 0; + for (child_index, child) in self.children.iter().enumerate() { + if cumulative_len + child.len() >= index { + return (child_index, index - cumulative_len); + } else { + cumulative_len += child.len() + 1; + } + } + panic!("index not found in node") + } + + fn insert_into_non_full_node(&mut self, index: usize, element: T) { + assert!(!self.is_full()); + if self.is_leaf() { + self.length += 1; + self.elements.insert(index, element); + } else { + let (child_index, sub_index) = self.find_child_index(index); + let child = &mut self.children[child_index]; + + if child.is_full() { + self.split_child(child_index); + + // child structure has changed so we need to find the index again + let (child_index, sub_index) = self.find_child_index(index); + let child = &mut self.children[child_index]; + child.insert_into_non_full_node(sub_index, element); + } else { + child.insert_into_non_full_node(sub_index, element); + } + self.length += 1; + } + } + + // A utility function to split the child `full_child_index` of this node + // Note that `full_child_index` must be full when this function is called. + fn split_child(&mut self, full_child_index: usize) { + let original_len_self = self.len(); + + // Create a new node which is going to store (B-1) keys + // of the full child. + let mut successor_sibling = SequenceTreeNode::new(); + + let full_child = &mut self.children[full_child_index]; + let original_len = full_child.len(); + assert!(full_child.is_full()); + + successor_sibling.elements = full_child.elements.split_off(B); + + if !full_child.is_leaf() { + successor_sibling.children = full_child.children.split_off(B); + } + + let middle = full_child.elements.pop().unwrap(); + + full_child.length = + full_child.elements.len() + full_child.children.iter().map(|c| c.len()).sum::(); + + successor_sibling.length = successor_sibling.elements.len() + + successor_sibling + .children + .iter() + .map(|c| c.len()) + .sum::(); + + let z_len = successor_sibling.len(); + + let full_child_len = full_child.len(); + + self.children + .insert(full_child_index + 1, successor_sibling); + + self.elements.insert(full_child_index, middle); + + assert_eq!(full_child_len + z_len + 1, original_len, "{:#?}", self); + + assert_eq!(original_len_self, self.len()); + } + + fn remove_from_leaf(&mut self, index: usize) -> T { + self.length -= 1; + self.elements.remove(index) + } + + fn remove_element_from_non_leaf(&mut self, index: usize, element_index: usize) -> T { + self.length -= 1; + if self.children[element_index].elements.len() >= B { + let total_index = self.cumulative_index(element_index); + // recursively delete index - 1 in predecessor_node + let predecessor = self.children[element_index].remove(index - 1 - total_index); + // replace element with that one + mem::replace(&mut self.elements[element_index], predecessor) + } else if self.children[element_index + 1].elements.len() >= B { + // recursively delete index + 1 in successor_node + let total_index = self.cumulative_index(element_index + 1); + let successor = self.children[element_index + 1].remove(index + 1 - total_index); + // replace element with that one + mem::replace(&mut self.elements[element_index], successor) + } else { + let middle_element = self.elements.remove(element_index); + let successor_child = self.children.remove(element_index + 1); + self.children[element_index].merge(middle_element, successor_child); + + let total_index = self.cumulative_index(element_index); + self.children[element_index].remove(index - total_index) + } + } + + fn cumulative_index(&self, child_index: usize) -> usize { + self.children[0..child_index] + .iter() + .map(|c| c.len() + 1) + .sum() + } + + fn remove_from_internal_child(&mut self, index: usize, mut child_index: usize) -> T { + if self.children[child_index].elements.len() < B + && if child_index > 0 { + self.children[child_index - 1].elements.len() < B + } else { + true + } + && if child_index + 1 < self.children.len() { + self.children[child_index + 1].elements.len() < B + } else { + true + } + { + // if the child and its immediate siblings have B-1 elements merge the child + // with one sibling, moving an element from this node into the new merged node + // to be the median + + if child_index > 0 { + let middle = self.elements.remove(child_index - 1); + + // use the predessor sibling + let successor = self.children.remove(child_index); + child_index -= 1; + + self.children[child_index].merge(middle, successor); + } else { + let middle = self.elements.remove(child_index); + + // use the sucessor sibling + let successor = self.children.remove(child_index + 1); + + self.children[child_index].merge(middle, successor); + } + } else if self.children[child_index].elements.len() < B { + if child_index > 0 + && self + .children + .get(child_index - 1) + .map_or(false, |c| c.elements.len() >= B) + { + let last_element = self.children[child_index - 1].elements.pop().unwrap(); + assert!(!self.children[child_index - 1].elements.is_empty()); + self.children[child_index - 1].length -= 1; + + let parent_element = + mem::replace(&mut self.elements[child_index - 1], last_element); + + self.children[child_index] + .elements + .insert(0, parent_element); + self.children[child_index].length += 1; + + if let Some(last_child) = self.children[child_index - 1].children.pop() { + self.children[child_index - 1].length -= last_child.len(); + self.children[child_index].length += last_child.len(); + self.children[child_index].children.insert(0, last_child); + } + } else if self + .children + .get(child_index + 1) + .map_or(false, |c| c.elements.len() >= B) + { + let first_element = self.children[child_index + 1].elements.remove(0); + self.children[child_index + 1].length -= 1; + + assert!(!self.children[child_index + 1].elements.is_empty()); + + let parent_element = mem::replace(&mut self.elements[child_index], first_element); + + self.children[child_index].length += 1; + self.children[child_index].elements.push(parent_element); + + if !self.children[child_index + 1].is_leaf() { + let first_child = self.children[child_index + 1].children.remove(0); + self.children[child_index + 1].length -= first_child.len(); + self.children[child_index].length += first_child.len(); + + self.children[child_index].children.push(first_child); + } + } + } + self.length -= 1; + let total_index = self.cumulative_index(child_index); + self.children[child_index].remove(index - total_index) + } + + fn check(&self) -> usize { + let l = self.elements.len() + self.children.iter().map(|c| c.check()).sum::(); + assert_eq!(self.len(), l, "{:#?}", self); + + l + } + + pub(crate) fn remove(&mut self, index: usize) -> T { + let original_len = self.len(); + if self.is_leaf() { + let v = self.remove_from_leaf(index); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + v + } else { + let mut total_index = 0; + for (child_index, child) in self.children.iter().enumerate() { + match (total_index + child.len()).cmp(&index) { + Ordering::Less => { + // should be later on in the loop + total_index += child.len() + 1; + continue; + } + Ordering::Equal => { + let v = self.remove_element_from_non_leaf( + index, + min(child_index, self.elements.len() - 1), + ); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + return v; + } + Ordering::Greater => { + let v = self.remove_from_internal_child(index, child_index); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + return v; + } + } + } + panic!( + "index not found to remove {} {} {} {}", + index, + total_index, + self.len(), + self.check() + ); + } + } + + fn merge(&mut self, middle: T, successor_sibling: SequenceTreeNode) { + self.elements.push(middle); + self.elements.extend(successor_sibling.elements); + self.children.extend(successor_sibling.children); + self.length += successor_sibling.length + 1; + assert!(self.is_full()); + } + + pub(crate) fn get(&self, index: usize) -> Option<&T> { + if self.is_leaf() { + return self.elements.get(index); + } else { + let mut cumulative_len = 0; + for (child_index, child) in self.children.iter().enumerate() { + match (cumulative_len + child.len()).cmp(&index) { + Ordering::Less => { + cumulative_len += child.len() + 1; + } + Ordering::Equal => return self.elements.get(child_index), + Ordering::Greater => { + return child.get(index - cumulative_len); + } + } + } + } + None + } +} + +impl Default for SequenceTreeInternal +where + T: Clone + Debug, +{ + fn default() -> Self { + Self::new() + } +} + +impl PartialEq for SequenceTreeInternal +where + T: Clone + Debug + PartialEq, +{ + fn eq(&self, other: &Self) -> bool { + self.len() == other.len() && self.iter().zip(other.iter()).all(|(a, b)| a == b) + } +} + +impl<'a, T> IntoIterator for &'a SequenceTreeInternal +where + T: Clone + Debug, +{ + type Item = &'a T; + + type IntoIter = Iter<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + Iter { + inner: self, + index: 0, + } + } +} + +#[derive(Debug)] +pub struct Iter<'a, T> { + inner: &'a SequenceTreeInternal, + index: usize, +} + +impl<'a, T> Iterator for Iter<'a, T> +where + T: Clone + Debug, +{ + type Item = &'a T; + + fn next(&mut self) -> Option { + self.index += 1; + self.inner.get(self.index - 1) + } + + fn nth(&mut self, n: usize) -> Option { + self.index += n + 1; + self.inner.get(self.index - 1) + } +} + +#[cfg(test)] +mod tests { + use proptest::prelude::*; + + use super::*; + + #[test] + fn push_back() { + let mut t = SequenceTree::new(); + + t.push(1); + t.push(2); + t.push(3); + t.push(4); + t.push(5); + t.push(6); + t.push(8); + t.push(100); + } + + #[test] + fn insert() { + let mut t = SequenceTree::new(); + + t.insert(0, 1); + t.insert(1, 1); + t.insert(0, 1); + t.insert(0, 1); + t.insert(0, 1); + t.insert(3, 1); + t.insert(4, 1); + } + + #[test] + fn insert_book() { + let mut t = SequenceTree::new(); + + for i in 0..100 { + t.insert(i % 2, ()); + } + } + + #[test] + fn insert_book_vec() { + let mut t = SequenceTree::new(); + let mut v = Vec::new(); + + for i in 0..100 { + t.insert(i % 3, ()); + v.insert(i % 3, ()); + + assert_eq!(v, t.iter().copied().collect::>()) + } + } + + fn arb_indices() -> impl Strategy> { + proptest::collection::vec(any::(), 0..1000).prop_map(|v| { + let mut len = 0; + v.into_iter() + .map(|i| { + len += 1; + i % len + }) + .collect::>() + }) + } + + proptest! { + + #[test] + fn proptest_insert(indices in arb_indices()) { + let mut t = SequenceTreeInternal::::new(); + let mut v = Vec::new(); + + for i in indices{ + if i <= v.len() { + t.insert(i % 3, i); + v.insert(i % 3, i); + } else { + return Err(proptest::test_runner::TestCaseError::reject("index out of bounds")) + } + + assert_eq!(v, t.iter().copied().collect::>()) + } + } + + } + + proptest! { + + // This is a really slow test due to all the copying of the Vecs (i.e. not due to the + // sequencetree) so we only do a few runs + #![proptest_config(ProptestConfig::with_cases(20))] + #[test] + fn proptest_remove(inserts in arb_indices(), removes in arb_indices()) { + let mut t = SequenceTreeInternal::::new(); + let mut v = Vec::new(); + + for i in inserts { + if i <= v.len() { + t.insert(i , i); + v.insert(i , i); + } else { + return Err(proptest::test_runner::TestCaseError::reject("index out of bounds")) + } + + assert_eq!(v, t.iter().copied().collect::>()) + } + + for i in removes { + if i < v.len() { + let tr = t.remove(i); + let vr = v.remove(i); + assert_eq!(tr, vr); + } else { + return Err(proptest::test_runner::TestCaseError::reject("index out of bounds")) + } + + assert_eq!(v, t.iter().copied().collect::>()) + } + } + + } +} diff --git a/rust/automerge-wasm/src/sync.rs b/rust/automerge-wasm/src/sync.rs new file mode 100644 index 00000000..c4fd4a86 --- /dev/null +++ b/rust/automerge-wasm/src/sync.rs @@ -0,0 +1,65 @@ +use automerge as am; +use automerge::ChangeHash; +use js_sys::Uint8Array; +use std::collections::{BTreeSet, HashMap}; +use std::convert::TryInto; +use wasm_bindgen::prelude::*; + +use crate::interop::{self, to_js_err, AR, JS}; + +#[wasm_bindgen] +#[derive(Debug)] +pub struct SyncState(pub(crate) am::sync::State); + +#[wasm_bindgen] +impl SyncState { + #[wasm_bindgen(getter, js_name = sharedHeads)] + pub fn shared_heads(&self) -> JsValue { + AR::from(self.0.shared_heads.as_slice()).into() + } + + #[wasm_bindgen(getter, js_name = lastSentHeads)] + pub fn last_sent_heads(&self) -> JsValue { + AR::from(self.0.last_sent_heads.as_slice()).into() + } + + #[wasm_bindgen(setter, js_name = lastSentHeads)] + pub fn set_last_sent_heads( + &mut self, + heads: JsValue, + ) -> Result<(), interop::error::BadChangeHashes> { + let heads: Vec = JS(heads).try_into()?; + self.0.last_sent_heads = heads; + Ok(()) + } + + #[wasm_bindgen(setter, js_name = sentHashes)] + pub fn set_sent_hashes(&mut self, hashes: JsValue) -> Result<(), JsValue> { + let hashes_map: HashMap = + serde_wasm_bindgen::from_value(hashes).map_err(to_js_err)?; + let hashes_set: BTreeSet = hashes_map.keys().cloned().collect(); + self.0.sent_hashes = hashes_set; + Ok(()) + } + + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> Self { + SyncState(self.0.clone()) + } + + pub(crate) fn decode(data: Uint8Array) -> Result { + let data = data.to_vec(); + let s = am::sync::State::decode(&data)?; + Ok(SyncState(s)) + } +} + +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub struct DecodeSyncStateErr(#[from] automerge::sync::DecodeStateError); + +impl From for JsValue { + fn from(e: DecodeSyncStateErr) -> Self { + JsValue::from(e.to_string()) + } +} diff --git a/rust/automerge-wasm/src/value.rs b/rust/automerge-wasm/src/value.rs new file mode 100644 index 00000000..643e2881 --- /dev/null +++ b/rust/automerge-wasm/src/value.rs @@ -0,0 +1,161 @@ +use automerge::{ObjType, ScalarValue, Value}; +use wasm_bindgen::prelude::*; + +#[derive(Debug, Clone, Hash, Eq, PartialEq)] +pub(crate) enum Datatype { + Map, + Table, + List, + Text, + Bytes, + Str, + Int, + Uint, + F64, + Counter, + Timestamp, + Boolean, + Null, + Unknown(u8), +} + +impl Datatype { + pub(crate) fn is_scalar(&self) -> bool { + !matches!(self, Self::Map | Self::Table | Self::List | Self::Text) + } +} + +impl From<&ObjType> for Datatype { + fn from(o: &ObjType) -> Self { + (*o).into() + } +} + +impl From for Datatype { + fn from(o: ObjType) -> Self { + match o { + ObjType::Map => Self::Map, + ObjType::List => Self::List, + ObjType::Table => Self::Table, + ObjType::Text => Self::Text, + } + } +} + +impl std::fmt::Display for Datatype { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + write!(f, "{}", String::from(self.clone())) + } +} + +impl From<&ScalarValue> for Datatype { + fn from(s: &ScalarValue) -> Self { + match s { + ScalarValue::Bytes(_) => Self::Bytes, + ScalarValue::Str(_) => Self::Str, + ScalarValue::Int(_) => Self::Int, + ScalarValue::Uint(_) => Self::Uint, + ScalarValue::F64(_) => Self::F64, + ScalarValue::Counter(_) => Self::Counter, + ScalarValue::Timestamp(_) => Self::Timestamp, + ScalarValue::Boolean(_) => Self::Boolean, + ScalarValue::Null => Self::Null, + ScalarValue::Unknown { type_code, .. } => Self::Unknown(*type_code), + } + } +} + +impl From<&Value<'_>> for Datatype { + fn from(v: &Value<'_>) -> Self { + match v { + Value::Object(o) => o.into(), + Value::Scalar(s) => s.as_ref().into(), + /* + ScalarValue::Bytes(_) => Self::Bytes, + ScalarValue::Str(_) => Self::Str, + ScalarValue::Int(_) => Self::Int, + ScalarValue::Uint(_) => Self::Uint, + ScalarValue::F64(_) => Self::F64, + ScalarValue::Counter(_) => Self::Counter, + ScalarValue::Timestamp(_) => Self::Timestamp, + ScalarValue::Boolean(_) => Self::Boolean, + ScalarValue::Null => Self::Null, + ScalarValue::Unknown { type_code, .. } => Self::Unknown(*type_code), + */ + } + } +} + +impl From for String { + fn from(d: Datatype) -> Self { + match d { + Datatype::Map => "map".into(), + Datatype::Table => "table".into(), + Datatype::List => "list".into(), + Datatype::Text => "text".into(), + Datatype::Bytes => "bytes".into(), + Datatype::Str => "str".into(), + Datatype::Int => "int".into(), + Datatype::Uint => "uint".into(), + Datatype::F64 => "f64".into(), + Datatype::Counter => "counter".into(), + Datatype::Timestamp => "timestamp".into(), + Datatype::Boolean => "boolean".into(), + Datatype::Null => "null".into(), + Datatype::Unknown(type_code) => format!("unknown{}", type_code), + } + } +} + +impl TryFrom for Datatype { + type Error = InvalidDatatype; + + fn try_from(datatype: JsValue) -> Result { + let datatype = datatype.as_string().ok_or(InvalidDatatype::NotString)?; + match datatype.as_str() { + "map" => Ok(Datatype::Map), + "table" => Ok(Datatype::Table), + "list" => Ok(Datatype::List), + "text" => Ok(Datatype::Text), + "bytes" => Ok(Datatype::Bytes), + "str" => Ok(Datatype::Str), + "int" => Ok(Datatype::Int), + "uint" => Ok(Datatype::Uint), + "f64" => Ok(Datatype::F64), + "counter" => Ok(Datatype::Counter), + "timestamp" => Ok(Datatype::Timestamp), + "boolean" => Ok(Datatype::Boolean), + "null" => Ok(Datatype::Null), + d => { + if d.starts_with("unknown") { + // TODO: handle "unknown{}", + Err(InvalidDatatype::UnknownNotImplemented) + } else { + Err(InvalidDatatype::Unknown(d.to_string())) + } + } + } + } +} + +impl From for JsValue { + fn from(d: Datatype) -> Self { + String::from(d).into() + } +} + +#[derive(Debug, thiserror::Error)] +pub enum InvalidDatatype { + #[error("unknown datatype")] + Unknown(String), + #[error("datatype is not a string")] + NotString, + #[error("cannot handle unknown datatype")] + UnknownNotImplemented, +} + +impl From for JsValue { + fn from(e: InvalidDatatype) -> Self { + JsValue::from(e.to_string()) + } +} diff --git a/rust/automerge-wasm/test/apply.ts b/rust/automerge-wasm/test/apply.ts new file mode 100644 index 00000000..453b4c26 --- /dev/null +++ b/rust/automerge-wasm/test/apply.ts @@ -0,0 +1,229 @@ + +import { describe, it } from 'mocha'; +import assert from 'assert' +import { create, Value } from '..' + +export const OBJECT_ID = Symbol.for('_am_objectId') // object containing metadata about current + +// @ts-ignore +function _obj(doc: any) : any { + if (typeof doc === 'object' && doc !== null) { + return doc[OBJECT_ID] + } +} + +// sample classes for testing +class Counter { + value: number; + constructor(n: number) { + this.value = n + } +} + +describe('Automerge', () => { + describe('Patch Apply', () => { + it('apply nested sets on maps', () => { + const start = { hello: { mellow: { yellow: "world", x: 1 }, y : 2 } } + const doc1 = create(true) + doc1.putObject("/", "hello", start.hello); + let mat = doc1.materialize("/") + const doc2 = create(true) + doc2.enablePatches(true) + doc2.merge(doc1) + + let base = doc2.applyPatches({}) + assert.deepEqual(mat, start) + assert.deepEqual(base, start) + + doc2.delete("/hello/mellow", "yellow"); + // @ts-ignore + delete start.hello.mellow.yellow; + base = doc2.applyPatches(base) + mat = doc2.materialize("/") + + assert.deepEqual(mat, start) + assert.deepEqual(base, start) + }) + + it('apply patches on lists', () => { + const start = { list: [1,2,3,4] } + const doc1 = create(true) + doc1.putObject("/", "list", start.list); + let mat = doc1.materialize("/") + const doc2 = create(true) + doc2.enablePatches(true) + doc2.merge(doc1) + mat = doc1.materialize("/") + let base = doc2.applyPatches({}) + assert.deepEqual(mat, start) + assert.deepEqual(base, start) + + doc2.delete("/list", 3); + start.list.splice(3,1) + base = doc2.applyPatches(base) + + assert.deepEqual(base, start) + }) + + it('apply patches on lists of lists of lists', () => { + const start = { list: + [ + [ + [ 1, 2, 3, 4, 5, 6], + [ 7, 8, 9,10,11,12], + ], + [ + [ 7, 8, 9,10,11,12], + [ 1, 2, 3, 4, 5, 6], + ] + ] + } + const doc1 = create(true) + doc1.enablePatches(true) + doc1.putObject("/", "list", start.list); + let base = doc1.applyPatches({}) + let mat = doc1.clone().materialize("/") + assert.deepEqual(mat, start) + assert.deepEqual(base, start) + + doc1.delete("/list/0/1", 3) + start.list[0][1].splice(3,1) + + doc1.delete("/list/0", 0) + start.list[0].splice(0,1) + + mat = doc1.clone().materialize("/") + base = doc1.applyPatches(base) + assert.deepEqual(mat, start) + assert.deepEqual(base, start) + }) + + it('large inserts should make one splice patch', () => { + const doc1 = create(true) + doc1.enablePatches(true) + doc1.putObject("/", "list", "abc"); + const patches = doc1.popPatches() + assert.deepEqual( patches, [ + { action: 'put', path: [ 'list' ], value: "" }, + { action: 'splice', path: [ 'list', 0 ], value: 'abc' }]) + }) + + it('it should allow registering type wrappers', () => { + const doc1 = create(true) + doc1.enablePatches(true) + doc1.registerDatatype("counter", (n: number) => new Counter(n)) + const doc2 = doc1.fork() + doc1.put("/", "n", 10, "counter") + doc1.put("/", "m", 10, "int") + + let mat = doc1.materialize("/") + assert.deepEqual( mat, { n: new Counter(10), m: 10 } ) + + doc2.merge(doc1) + let apply = doc2.applyPatches({}) + assert.deepEqual( apply, { n: new Counter(10), m: 10 } ) + + doc1.increment("/","n", 5) + mat = doc1.materialize("/") + assert.deepEqual( mat, { n: new Counter(15), m: 10 } ) + + doc2.merge(doc1) + apply = doc2.applyPatches(apply) + assert.deepEqual( apply, { n: new Counter(15), m: 10 } ) + }) + + it('text can be managed as an array or a string', () => { + const doc1 = create(true, "aaaa") + doc1.enablePatches(true) + + doc1.putObject("/", "notes", "hello world") + + let mat = doc1.materialize("/") + + assert.deepEqual( mat, { notes: "hello world" } ) + + const doc2 = create(true) + let apply : any = doc2.materialize("/") + doc2.enablePatches(true) + apply = doc2.applyPatches(apply) + + doc2.merge(doc1); + apply = doc2.applyPatches(apply) + assert.deepEqual(_obj(apply), "_root") + assert.deepEqual( apply, { notes: "hello world" } ) + + doc2.splice("/notes", 6, 5, "everyone"); + apply = doc2.applyPatches(apply) + assert.deepEqual( apply, { notes: "hello everyone" } ) + + mat = doc2.materialize("/") + assert.deepEqual(_obj(mat), "_root") + // @ts-ignore + assert.deepEqual( mat, { notes: "hello everyone" } ) + }) + + it('should set the OBJECT_ID property on lists, maps, and text objects and not on scalars', () => { + const doc1 = create(true, 'aaaa') + const mat: any = doc1.materialize("/") + doc1.enablePatches(true) + doc1.registerDatatype("counter", (n: number) => new Counter(n)) + doc1.put("/", "string", "string", "str") + doc1.put("/", "uint", 2, "uint") + doc1.put("/", "int", 2, "int") + doc1.put("/", "float", 2.3, "f64") + doc1.put("/", "bytes", new Uint8Array(), "bytes") + doc1.put("/", "counter", 1, "counter") + doc1.put("/", "date", new Date(), "timestamp") + doc1.putObject("/", "text", "text") + doc1.putObject("/", "list", []) + doc1.putObject("/", "map", {}) + const applied = doc1.applyPatches(mat) + + assert.equal(_obj(applied.string), null) + assert.equal(_obj(applied.uint), null) + assert.equal(_obj(applied.int), null) + assert.equal(_obj(applied.float), null) + assert.equal(_obj(applied.bytes), null) + assert.equal(_obj(applied.counter), null) + assert.equal(_obj(applied.date), null) + assert.equal(_obj(applied.text), null) + + assert.notEqual(_obj(applied.list), null) + assert.notEqual(_obj(applied.map), null) + }) + + it('should set the root OBJECT_ID to "_root"', () => { + const doc1 = create(true, 'aaaa') + const mat: any = doc1.materialize("/") + assert.equal(_obj(mat), "_root") + doc1.enablePatches(true) + doc1.put("/", "key", "value") + const applied = doc1.applyPatches(mat) + assert.equal(_obj(applied), "_root") + }) + + it.skip('it can patch quickly', () => { +/* + console.time("init") + let doc1 = create() + doc1.enablePatches(true) + doc1.putObject("/", "notes", ""); + let mat = doc1.materialize("/") + let doc2 = doc1.fork() + let testData = new Array( 100000 ).join("x") + console.timeEnd("init") + console.time("splice") + doc2.splice("/notes", 0, 0, testData); + console.timeEnd("splice") + console.time("merge") + doc1.merge(doc2) + console.timeEnd("merge") + console.time("patch") + mat = doc1.applyPatches(mat) + console.timeEnd("patch") +*/ + }) + }) +}) + +// TODO: squash puts & deletes diff --git a/rust/automerge-wasm/test/helpers/columnar.js b/rust/automerge-wasm/test/helpers/columnar.js new file mode 100644 index 00000000..8d266f5b --- /dev/null +++ b/rust/automerge-wasm/test/helpers/columnar.js @@ -0,0 +1,1415 @@ +const pako = require('pako') +const { copyObject, parseOpId, equalBytes } = require('./common') +const { + utf8ToString, hexStringToBytes, bytesToHexString, + Encoder, Decoder, RLEEncoder, RLEDecoder, DeltaEncoder, DeltaDecoder, BooleanEncoder, BooleanDecoder +} = require('./encoding') + +// Maybe we should be using the platform's built-in hash implementation? +// Node has the crypto module: https://nodejs.org/api/crypto.html and browsers have +// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest +// However, the WebCrypto API is asynchronous (returns promises), which would +// force all our APIs to become asynchronous as well, which would be annoying. +// +// I think on balance, it's safe enough to use a random library off npm: +// - We only need one hash function (not a full suite of crypto algorithms); +// - SHA256 is quite simple and has fairly few opportunities for subtle bugs +// (compared to asymmetric cryptography anyway); +// - It does not need a secure source of random bits and does not need to be +// constant-time; +// - I have reviewed the source code and it seems pretty reasonable. +const { Hash } = require('fast-sha256') + +// These bytes don't mean anything, they were generated randomly +const MAGIC_BYTES = new Uint8Array([0x85, 0x6f, 0x4a, 0x83]) + +const CHUNK_TYPE_DOCUMENT = 0 +const CHUNK_TYPE_CHANGE = 1 +const CHUNK_TYPE_DEFLATE = 2 // like CHUNK_TYPE_CHANGE but with DEFLATE compression + +// Minimum number of bytes in a value before we enable DEFLATE compression (there is no point +// compressing very short values since compression may actually make them bigger) +const DEFLATE_MIN_SIZE = 256 + +// The least-significant 3 bits of a columnId indicate its datatype +const COLUMN_TYPE = { + GROUP_CARD: 0, ACTOR_ID: 1, INT_RLE: 2, INT_DELTA: 3, BOOLEAN: 4, + STRING_RLE: 5, VALUE_LEN: 6, VALUE_RAW: 7 +} + +// The 4th-least-significant bit of a columnId is set if the column is DEFLATE-compressed +const COLUMN_TYPE_DEFLATE = 8 + +// In the values in a column of type VALUE_LEN, the bottom four bits indicate the type of the value, +// one of the following types in VALUE_TYPE. The higher bits indicate the length of the value in the +// associated VALUE_RAW column (in bytes). +const VALUE_TYPE = { + NULL: 0, FALSE: 1, TRUE: 2, LEB128_UINT: 3, LEB128_INT: 4, IEEE754: 5, + UTF8: 6, BYTES: 7, COUNTER: 8, TIMESTAMP: 9, MIN_UNKNOWN: 10, MAX_UNKNOWN: 15 +} + +// make* actions must be at even-numbered indexes in this list +const ACTIONS = ['makeMap', 'set', 'makeList', 'del', 'makeText', 'inc', 'makeTable', 'link'] + +const OBJECT_TYPE = {makeMap: 'map', makeList: 'list', makeText: 'text', makeTable: 'table'} + +const COMMON_COLUMNS = [ + {columnName: 'objActor', columnId: 0 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'objCtr', columnId: 0 << 4 | COLUMN_TYPE.INT_RLE}, + {columnName: 'keyActor', columnId: 1 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'keyCtr', columnId: 1 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'keyStr', columnId: 1 << 4 | COLUMN_TYPE.STRING_RLE}, + {columnName: 'idActor', columnId: 2 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'idCtr', columnId: 2 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'insert', columnId: 3 << 4 | COLUMN_TYPE.BOOLEAN}, + {columnName: 'action', columnId: 4 << 4 | COLUMN_TYPE.INT_RLE}, + {columnName: 'valLen', columnId: 5 << 4 | COLUMN_TYPE.VALUE_LEN}, + {columnName: 'valRaw', columnId: 5 << 4 | COLUMN_TYPE.VALUE_RAW}, + {columnName: 'chldActor', columnId: 6 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'chldCtr', columnId: 6 << 4 | COLUMN_TYPE.INT_DELTA} +] + +const CHANGE_COLUMNS = COMMON_COLUMNS.concat([ + {columnName: 'predNum', columnId: 7 << 4 | COLUMN_TYPE.GROUP_CARD}, + {columnName: 'predActor', columnId: 7 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'predCtr', columnId: 7 << 4 | COLUMN_TYPE.INT_DELTA} +]) + +const DOC_OPS_COLUMNS = COMMON_COLUMNS.concat([ + {columnName: 'succNum', columnId: 8 << 4 | COLUMN_TYPE.GROUP_CARD}, + {columnName: 'succActor', columnId: 8 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'succCtr', columnId: 8 << 4 | COLUMN_TYPE.INT_DELTA} +]) + +const DOCUMENT_COLUMNS = [ + {columnName: 'actor', columnId: 0 << 4 | COLUMN_TYPE.ACTOR_ID}, + {columnName: 'seq', columnId: 0 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'maxOp', columnId: 1 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'time', columnId: 2 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'message', columnId: 3 << 4 | COLUMN_TYPE.STRING_RLE}, + {columnName: 'depsNum', columnId: 4 << 4 | COLUMN_TYPE.GROUP_CARD}, + {columnName: 'depsIndex', columnId: 4 << 4 | COLUMN_TYPE.INT_DELTA}, + {columnName: 'extraLen', columnId: 5 << 4 | COLUMN_TYPE.VALUE_LEN}, + {columnName: 'extraRaw', columnId: 5 << 4 | COLUMN_TYPE.VALUE_RAW} +] + +/** + * Maps an opId of the form {counter: 12345, actorId: 'someActorId'} to the form + * {counter: 12345, actorNum: 123, actorId: 'someActorId'}, where the actorNum + * is the index into the `actorIds` array. + */ +function actorIdToActorNum(opId, actorIds) { + if (!opId || !opId.actorId) return opId + const counter = opId.counter + const actorNum = actorIds.indexOf(opId.actorId) + if (actorNum < 0) throw new RangeError('missing actorId') // should not happen + return {counter, actorNum, actorId: opId.actorId} +} + +/** + * Comparison function to pass to Array.sort(), which compares two opIds in the + * form produced by `actorIdToActorNum` so that they are sorted in increasing + * Lamport timestamp order (sorted first by counter, then by actorId). + */ +function compareParsedOpIds(id1, id2) { + if (id1.counter < id2.counter) return -1 + if (id1.counter > id2.counter) return +1 + if (id1.actorId < id2.actorId) return -1 + if (id1.actorId > id2.actorId) return +1 + return 0 +} + +/** + * Takes `changes`, an array of changes (represented as JS objects). Returns an + * object `{changes, actorIds}`, where `changes` is a copy of the argument in + * which all string opIds have been replaced with `{counter, actorNum}` objects, + * and where `actorIds` is a lexicographically sorted array of actor IDs occurring + * in any of the operations. `actorNum` is an index into that array of actorIds. + * If `single` is true, the actorId of the author of the change is moved to the + * beginning of the array of actorIds, so that `actorNum` is zero when referencing + * the author of the change itself. This special-casing is omitted if `single` is + * false. + */ +function parseAllOpIds(changes, single) { + const actors = {}, newChanges = [] + for (let change of changes) { + change = copyObject(change) + actors[change.actor] = true + change.ops = expandMultiOps(change.ops, change.startOp, change.actor) + change.ops = change.ops.map(op => { + op = copyObject(op) + if (op.obj !== '_root') op.obj = parseOpId(op.obj) + if (op.elemId && op.elemId !== '_head') op.elemId = parseOpId(op.elemId) + if (op.child) op.child = parseOpId(op.child) + if (op.pred) op.pred = op.pred.map(parseOpId) + if (op.obj.actorId) actors[op.obj.actorId] = true + if (op.elemId && op.elemId.actorId) actors[op.elemId.actorId] = true + if (op.child && op.child.actorId) actors[op.child.actorId] = true + for (let pred of op.pred) actors[pred.actorId] = true + return op + }) + newChanges.push(change) + } + + let actorIds = Object.keys(actors).sort() + if (single) { + actorIds = [changes[0].actor].concat(actorIds.filter(actor => actor !== changes[0].actor)) + } + for (let change of newChanges) { + change.actorNum = actorIds.indexOf(change.actor) + for (let i = 0; i < change.ops.length; i++) { + let op = change.ops[i] + op.id = {counter: change.startOp + i, actorNum: change.actorNum, actorId: change.actor} + op.obj = actorIdToActorNum(op.obj, actorIds) + op.elemId = actorIdToActorNum(op.elemId, actorIds) + op.child = actorIdToActorNum(op.child, actorIds) + op.pred = op.pred.map(pred => actorIdToActorNum(pred, actorIds)) + } + } + return {changes: newChanges, actorIds} +} + +/** + * Encodes the `obj` property of operation `op` into the two columns + * `objActor` and `objCtr`. + */ +function encodeObjectId(op, columns) { + if (op.obj === '_root') { + columns.objActor.appendValue(null) + columns.objCtr.appendValue(null) + } else if (op.obj.actorNum >= 0 && op.obj.counter > 0) { + columns.objActor.appendValue(op.obj.actorNum) + columns.objCtr.appendValue(op.obj.counter) + } else { + throw new RangeError(`Unexpected objectId reference: ${JSON.stringify(op.obj)}`) + } +} + +/** + * Encodes the `key` and `elemId` properties of operation `op` into the three + * columns `keyActor`, `keyCtr`, and `keyStr`. + */ +function encodeOperationKey(op, columns) { + if (op.key) { + columns.keyActor.appendValue(null) + columns.keyCtr.appendValue(null) + columns.keyStr.appendValue(op.key) + } else if (op.elemId === '_head' && op.insert) { + columns.keyActor.appendValue(null) + columns.keyCtr.appendValue(0) + columns.keyStr.appendValue(null) + } else if (op.elemId && op.elemId.actorNum >= 0 && op.elemId.counter > 0) { + columns.keyActor.appendValue(op.elemId.actorNum) + columns.keyCtr.appendValue(op.elemId.counter) + columns.keyStr.appendValue(null) + } else { + throw new RangeError(`Unexpected operation key: ${JSON.stringify(op)}`) + } +} + +/** + * Encodes the `action` property of operation `op` into the `action` column. + */ +function encodeOperationAction(op, columns) { + const actionCode = ACTIONS.indexOf(op.action) + if (actionCode >= 0) { + columns.action.appendValue(actionCode) + } else if (typeof op.action === 'number') { + columns.action.appendValue(op.action) + } else { + throw new RangeError(`Unexpected operation action: ${op.action}`) + } +} + +/** + * Encodes the integer `value` into the two columns `valLen` and `valRaw`, + * with the datatype tag set to `typeTag`. If `typeTag` is zero, it is set + * automatically to signed or unsigned depending on the sign of the value. + * Values with non-zero type tags are always encoded as signed integers. + */ +function encodeInteger(value, typeTag, columns) { + let numBytes + if (value < 0 || typeTag > 0) { + numBytes = columns.valRaw.appendInt53(value) + if (!typeTag) typeTag = VALUE_TYPE.LEB128_INT + } else { + numBytes = columns.valRaw.appendUint53(value) + typeTag = VALUE_TYPE.LEB128_UINT + } + columns.valLen.appendValue(numBytes << 4 | typeTag) +} + +/** + * Encodes the `value` property of operation `op` into the two columns + * `valLen` and `valRaw`. + */ +function encodeValue(op, columns) { + if ((op.action !== 'set' && op.action !== 'inc') || op.value === null) { + columns.valLen.appendValue(VALUE_TYPE.NULL) + } else if (op.value === false) { + columns.valLen.appendValue(VALUE_TYPE.FALSE) + } else if (op.value === true) { + columns.valLen.appendValue(VALUE_TYPE.TRUE) + } else if (typeof op.value === 'string') { + const numBytes = columns.valRaw.appendRawString(op.value) + columns.valLen.appendValue(numBytes << 4 | VALUE_TYPE.UTF8) + } else if (ArrayBuffer.isView(op.value)) { + const numBytes = columns.valRaw.appendRawBytes(new Uint8Array(op.value.buffer)) + columns.valLen.appendValue(numBytes << 4 | VALUE_TYPE.BYTES) + } else if (op.datatype === 'counter' && typeof op.value === 'number') { + encodeInteger(op.value, VALUE_TYPE.COUNTER, columns) + } else if (op.datatype === 'timestamp' && typeof op.value === 'number') { + encodeInteger(op.value, VALUE_TYPE.TIMESTAMP, columns) + } else if (typeof op.datatype === 'number' && op.datatype >= VALUE_TYPE.MIN_UNKNOWN && + op.datatype <= VALUE_TYPE.MAX_UNKNOWN && op.value instanceof Uint8Array) { + const numBytes = columns.valRaw.appendRawBytes(op.value) + columns.valLen.appendValue(numBytes << 4 | op.datatype) + } else if (op.datatype) { + throw new RangeError(`Unknown datatype ${op.datatype} for value ${op.value}`) + } else if (typeof op.value === 'number') { + if (Number.isInteger(op.value) && op.value <= Number.MAX_SAFE_INTEGER && op.value >= Number.MIN_SAFE_INTEGER) { + encodeInteger(op.value, 0, columns) + } else { + // Encode number in 32-bit float if this can be done without loss of precision + const buf32 = new ArrayBuffer(4), view32 = new DataView(buf32) + view32.setFloat32(0, op.value, true) // true means little-endian + if (view32.getFloat32(0, true) === op.value) { + columns.valRaw.appendRawBytes(new Uint8Array(buf32)) + columns.valLen.appendValue(4 << 4 | VALUE_TYPE.IEEE754) + } else { + const buf64 = new ArrayBuffer(8), view64 = new DataView(buf64) + view64.setFloat64(0, op.value, true) // true means little-endian + columns.valRaw.appendRawBytes(new Uint8Array(buf64)) + columns.valLen.appendValue(8 << 4 | VALUE_TYPE.IEEE754) + } + } + } else { + throw new RangeError(`Unsupported value in operation: ${op.value}`) + } +} + +/** + * Given `sizeTag` (an unsigned integer read from a VALUE_LEN column) and `bytes` (a Uint8Array + * read from a VALUE_RAW column, with length `sizeTag >> 4`), this function returns an object of the + * form `{value: value, datatype: datatypeTag}` where `value` is a JavaScript primitive datatype + * corresponding to the value, and `datatypeTag` is a datatype annotation such as 'counter'. + */ +function decodeValue(sizeTag, bytes) { + if (sizeTag === VALUE_TYPE.NULL) { + return {value: null} + } else if (sizeTag === VALUE_TYPE.FALSE) { + return {value: false} + } else if (sizeTag === VALUE_TYPE.TRUE) { + return {value: true} + } else if (sizeTag % 16 === VALUE_TYPE.UTF8) { + return {value: utf8ToString(bytes)} + } else { + if (sizeTag % 16 === VALUE_TYPE.LEB128_UINT) { + return {value: new Decoder(bytes).readUint53()} + } else if (sizeTag % 16 === VALUE_TYPE.LEB128_INT) { + return {value: new Decoder(bytes).readInt53()} + } else if (sizeTag % 16 === VALUE_TYPE.IEEE754) { + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength) + if (bytes.byteLength === 4) { + return {value: view.getFloat32(0, true)} // true means little-endian + } else if (bytes.byteLength === 8) { + return {value: view.getFloat64(0, true)} + } else { + throw new RangeError(`Invalid length for floating point number: ${bytes.byteLength}`) + } + } else if (sizeTag % 16 === VALUE_TYPE.COUNTER) { + return {value: new Decoder(bytes).readInt53(), datatype: 'counter'} + } else if (sizeTag % 16 === VALUE_TYPE.TIMESTAMP) { + return {value: new Decoder(bytes).readInt53(), datatype: 'timestamp'} + } else { + return {value: bytes, datatype: sizeTag % 16} + } + } +} + +/** + * Reads one value from the column `columns[colIndex]` and interprets it based + * on the column type. `actorIds` is a list of actors that appear in the change; + * `actorIds[0]` is the actorId of the change's author. Mutates the `result` + * object with the value, and returns the number of columns processed (this is 2 + * in the case of a pair of VALUE_LEN and VALUE_RAW columns, which are processed + * in one go). + */ +function decodeValueColumns(columns, colIndex, actorIds, result) { + const { columnId, columnName, decoder } = columns[colIndex] + if (columnId % 8 === COLUMN_TYPE.VALUE_LEN && colIndex + 1 < columns.length && + columns[colIndex + 1].columnId === columnId + 1) { + const sizeTag = decoder.readValue() + const rawValue = columns[colIndex + 1].decoder.readRawBytes(sizeTag >> 4) + const { value, datatype } = decodeValue(sizeTag, rawValue) + result[columnName] = value + if (datatype) result[columnName + '_datatype'] = datatype + return 2 + } else if (columnId % 8 === COLUMN_TYPE.ACTOR_ID) { + const actorNum = decoder.readValue() + if (actorNum === null) { + result[columnName] = null + } else { + if (!actorIds[actorNum]) throw new RangeError(`No actor index ${actorNum}`) + result[columnName] = actorIds[actorNum] + } + } else { + result[columnName] = decoder.readValue() + } + return 1 +} + +/** + * Encodes an array of operations in a set of columns. The operations need to + * be parsed with `parseAllOpIds()` beforehand. If `forDocument` is true, we use + * the column structure of a whole document, otherwise we use the column + * structure for an individual change. Returns an array of `{id, name, encoder}` + * objects. + */ +function encodeOps(ops, forDocument) { + const columns = { + objActor : new RLEEncoder('uint'), + objCtr : new RLEEncoder('uint'), + keyActor : new RLEEncoder('uint'), + keyCtr : new DeltaEncoder(), + keyStr : new RLEEncoder('utf8'), + insert : new BooleanEncoder(), + action : new RLEEncoder('uint'), + valLen : new RLEEncoder('uint'), + valRaw : new Encoder(), + chldActor : new RLEEncoder('uint'), + chldCtr : new DeltaEncoder() + } + + if (forDocument) { + columns.idActor = new RLEEncoder('uint') + columns.idCtr = new DeltaEncoder() + columns.succNum = new RLEEncoder('uint') + columns.succActor = new RLEEncoder('uint') + columns.succCtr = new DeltaEncoder() + } else { + columns.predNum = new RLEEncoder('uint') + columns.predCtr = new DeltaEncoder() + columns.predActor = new RLEEncoder('uint') + } + + for (let op of ops) { + encodeObjectId(op, columns) + encodeOperationKey(op, columns) + columns.insert.appendValue(!!op.insert) + encodeOperationAction(op, columns) + encodeValue(op, columns) + + if (op.child && op.child.counter) { + columns.chldActor.appendValue(op.child.actorNum) + columns.chldCtr.appendValue(op.child.counter) + } else { + columns.chldActor.appendValue(null) + columns.chldCtr.appendValue(null) + } + + if (forDocument) { + columns.idActor.appendValue(op.id.actorNum) + columns.idCtr.appendValue(op.id.counter) + columns.succNum.appendValue(op.succ.length) + op.succ.sort(compareParsedOpIds) + for (let i = 0; i < op.succ.length; i++) { + columns.succActor.appendValue(op.succ[i].actorNum) + columns.succCtr.appendValue(op.succ[i].counter) + } + } else { + columns.predNum.appendValue(op.pred.length) + op.pred.sort(compareParsedOpIds) + for (let i = 0; i < op.pred.length; i++) { + columns.predActor.appendValue(op.pred[i].actorNum) + columns.predCtr.appendValue(op.pred[i].counter) + } + } + } + + let columnList = [] + for (let {columnName, columnId} of forDocument ? DOC_OPS_COLUMNS : CHANGE_COLUMNS) { + if (columns[columnName]) columnList.push({id: columnId, name: columnName, encoder: columns[columnName]}) + } + return columnList.sort((a, b) => a.id - b.id) +} + +function expandMultiOps(ops, startOp, actor) { + let opNum = startOp + let expandedOps = [] + for (const op of ops) { + if (op.action === 'set' && op.values && op.insert) { + if (op.pred.length !== 0) throw new RangeError('multi-insert pred must be empty') + let lastElemId = op.elemId + for (const value of op.values) { + expandedOps.push({action: 'set', obj: op.obj, elemId: lastElemId, value, pred: [], insert: true}) + lastElemId = `${opNum}@${actor}` + opNum += 1 + } + } else if (op.action === 'del' && op.multiOp > 1) { + if (op.pred.length !== 1) throw new RangeError('multiOp deletion must have exactly one pred') + const startElemId = parseOpId(op.elemId), startPred = parseOpId(op.pred[0]) + for (let i = 0; i < op.multiOp; i++) { + const elemId = `${startElemId.counter + i}@${startElemId.actorId}` + const pred = [`${startPred.counter + i}@${startPred.actorId}`] + expandedOps.push({action: 'del', obj: op.obj, elemId, pred}) + opNum += 1 + } + } else { + expandedOps.push(op) + opNum += 1 + } + } + return expandedOps +} + +/** + * Takes a change as decoded by `decodeColumns`, and changes it into the form + * expected by the rest of the backend. If `forDocument` is true, we use the op + * structure of a whole document, otherwise we use the op structure for an + * individual change. + */ +function decodeOps(ops, forDocument) { + const newOps = [] + for (let op of ops) { + const obj = (op.objCtr === null) ? '_root' : `${op.objCtr}@${op.objActor}` + const elemId = op.keyStr ? undefined : (op.keyCtr === 0 ? '_head' : `${op.keyCtr}@${op.keyActor}`) + const action = ACTIONS[op.action] || op.action + const newOp = elemId ? {obj, elemId, action} : {obj, key: op.keyStr, action} + newOp.insert = !!op.insert + if (ACTIONS[op.action] === 'set' || ACTIONS[op.action] === 'inc') { + newOp.value = op.valLen + if (op.valLen_datatype) newOp.datatype = op.valLen_datatype + } + if (!!op.chldCtr !== !!op.chldActor) { + throw new RangeError(`Mismatched child columns: ${op.chldCtr} and ${op.chldActor}`) + } + if (op.chldCtr !== null) newOp.child = `${op.chldCtr}@${op.chldActor}` + if (forDocument) { + newOp.id = `${op.idCtr}@${op.idActor}` + newOp.succ = op.succNum.map(succ => `${succ.succCtr}@${succ.succActor}`) + checkSortedOpIds(op.succNum.map(succ => ({counter: succ.succCtr, actorId: succ.succActor}))) + } else { + newOp.pred = op.predNum.map(pred => `${pred.predCtr}@${pred.predActor}`) + checkSortedOpIds(op.predNum.map(pred => ({counter: pred.predCtr, actorId: pred.predActor}))) + } + newOps.push(newOp) + } + return newOps +} + +/** + * Throws an exception if the opIds in the given array are not in sorted order. + */ +function checkSortedOpIds(opIds) { + let last = null + for (let opId of opIds) { + if (last && compareParsedOpIds(last, opId) !== -1) { + throw new RangeError('operation IDs are not in ascending order') + } + last = opId + } +} + +function encoderByColumnId(columnId) { + if ((columnId & 7) === COLUMN_TYPE.INT_DELTA) { + return new DeltaEncoder() + } else if ((columnId & 7) === COLUMN_TYPE.BOOLEAN) { + return new BooleanEncoder() + } else if ((columnId & 7) === COLUMN_TYPE.STRING_RLE) { + return new RLEEncoder('utf8') + } else if ((columnId & 7) === COLUMN_TYPE.VALUE_RAW) { + return new Encoder() + } else { + return new RLEEncoder('uint') + } +} + +function decoderByColumnId(columnId, buffer) { + if ((columnId & 7) === COLUMN_TYPE.INT_DELTA) { + return new DeltaDecoder(buffer) + } else if ((columnId & 7) === COLUMN_TYPE.BOOLEAN) { + return new BooleanDecoder(buffer) + } else if ((columnId & 7) === COLUMN_TYPE.STRING_RLE) { + return new RLEDecoder('utf8', buffer) + } else if ((columnId & 7) === COLUMN_TYPE.VALUE_RAW) { + return new Decoder(buffer) + } else { + return new RLEDecoder('uint', buffer) + } +} + +function makeDecoders(columns, columnSpec) { + const emptyBuf = new Uint8Array(0) + let decoders = [], columnIndex = 0, specIndex = 0 + + while (columnIndex < columns.length || specIndex < columnSpec.length) { + if (columnIndex === columns.length || + (specIndex < columnSpec.length && columnSpec[specIndex].columnId < columns[columnIndex].columnId)) { + const {columnId, columnName} = columnSpec[specIndex] + decoders.push({columnId, columnName, decoder: decoderByColumnId(columnId, emptyBuf)}) + specIndex++ + } else if (specIndex === columnSpec.length || columns[columnIndex].columnId < columnSpec[specIndex].columnId) { + const {columnId, buffer} = columns[columnIndex] + decoders.push({columnId, decoder: decoderByColumnId(columnId, buffer)}) + columnIndex++ + } else { // columns[columnIndex].columnId === columnSpec[specIndex].columnId + const {columnId, buffer} = columns[columnIndex], {columnName} = columnSpec[specIndex] + decoders.push({columnId, columnName, decoder: decoderByColumnId(columnId, buffer)}) + columnIndex++ + specIndex++ + } + } + return decoders +} + +function decodeColumns(columns, actorIds, columnSpec) { + columns = makeDecoders(columns, columnSpec) + let parsedRows = [] + while (columns.some(col => !col.decoder.done)) { + let row = {}, col = 0 + while (col < columns.length) { + const columnId = columns[col].columnId + let groupId = columnId >> 4, groupCols = 1 + while (col + groupCols < columns.length && columns[col + groupCols].columnId >> 4 === groupId) { + groupCols++ + } + + if (columnId % 8 === COLUMN_TYPE.GROUP_CARD) { + const values = [], count = columns[col].decoder.readValue() + for (let i = 0; i < count; i++) { + let value = {} + for (let colOffset = 1; colOffset < groupCols; colOffset++) { + decodeValueColumns(columns, col + colOffset, actorIds, value) + } + values.push(value) + } + row[columns[col].columnName] = values + col += groupCols + } else { + col += decodeValueColumns(columns, col, actorIds, row) + } + } + parsedRows.push(row) + } + return parsedRows +} + +function decodeColumnInfo(decoder) { + // A number that is all 1 bits except for the bit that indicates whether a column is + // deflate-compressed. We ignore this bit when checking whether columns are sorted by ID. + const COLUMN_ID_MASK = (-1 ^ COLUMN_TYPE_DEFLATE) >>> 0 + + let lastColumnId = -1, columns = [], numColumns = decoder.readUint53() + for (let i = 0; i < numColumns; i++) { + const columnId = decoder.readUint53(), bufferLen = decoder.readUint53() + if ((columnId & COLUMN_ID_MASK) <= (lastColumnId & COLUMN_ID_MASK)) { + throw new RangeError('Columns must be in ascending order') + } + lastColumnId = columnId + columns.push({columnId, bufferLen}) + } + return columns +} + +function encodeColumnInfo(encoder, columns) { + const nonEmptyColumns = columns.filter(column => column.encoder.buffer.byteLength > 0) + encoder.appendUint53(nonEmptyColumns.length) + for (let column of nonEmptyColumns) { + encoder.appendUint53(column.id) + encoder.appendUint53(column.encoder.buffer.byteLength) + } +} + +function decodeChangeHeader(decoder) { + const numDeps = decoder.readUint53(), deps = [] + for (let i = 0; i < numDeps; i++) { + deps.push(bytesToHexString(decoder.readRawBytes(32))) + } + let change = { + actor: decoder.readHexString(), + seq: decoder.readUint53(), + startOp: decoder.readUint53(), + time: decoder.readInt53(), + message: decoder.readPrefixedString(), + deps + } + const actorIds = [change.actor], numActorIds = decoder.readUint53() + for (let i = 0; i < numActorIds; i++) actorIds.push(decoder.readHexString()) + change.actorIds = actorIds + return change +} + +/** + * Assembles a chunk of encoded data containing a checksum, headers, and a + * series of encoded columns. Calls `encodeHeaderCallback` with an encoder that + * should be used to add the headers. The columns should be given as `columns`. + */ +function encodeContainer(chunkType, encodeContentsCallback) { + const CHECKSUM_SIZE = 4 // checksum is first 4 bytes of SHA-256 hash of the rest of the data + const HEADER_SPACE = MAGIC_BYTES.byteLength + CHECKSUM_SIZE + 1 + 5 // 1 byte type + 5 bytes length + const body = new Encoder() + // Make space for the header at the beginning of the body buffer. We will + // copy the header in here later. This is cheaper than copying the body since + // the body is likely to be much larger than the header. + body.appendRawBytes(new Uint8Array(HEADER_SPACE)) + encodeContentsCallback(body) + + const bodyBuf = body.buffer + const header = new Encoder() + header.appendByte(chunkType) + header.appendUint53(bodyBuf.byteLength - HEADER_SPACE) + + // Compute the hash over chunkType, length, and body + const headerBuf = header.buffer + const sha256 = new Hash() + sha256.update(headerBuf) + sha256.update(bodyBuf.subarray(HEADER_SPACE)) + const hash = sha256.digest(), checksum = hash.subarray(0, CHECKSUM_SIZE) + + // Copy header into the body buffer so that they are contiguous + bodyBuf.set(MAGIC_BYTES, HEADER_SPACE - headerBuf.byteLength - CHECKSUM_SIZE - MAGIC_BYTES.byteLength) + bodyBuf.set(checksum, HEADER_SPACE - headerBuf.byteLength - CHECKSUM_SIZE) + bodyBuf.set(headerBuf, HEADER_SPACE - headerBuf.byteLength) + return {hash, bytes: bodyBuf.subarray(HEADER_SPACE - headerBuf.byteLength - CHECKSUM_SIZE - MAGIC_BYTES.byteLength)} +} + +function decodeContainerHeader(decoder, computeHash) { + if (!equalBytes(decoder.readRawBytes(MAGIC_BYTES.byteLength), MAGIC_BYTES)) { + throw new RangeError('Data does not begin with magic bytes 85 6f 4a 83') + } + const expectedHash = decoder.readRawBytes(4) + const hashStartOffset = decoder.offset + const chunkType = decoder.readByte() + const chunkLength = decoder.readUint53() + const header = {chunkType, chunkLength, chunkData: decoder.readRawBytes(chunkLength)} + + if (computeHash) { + const sha256 = new Hash() + sha256.update(decoder.buf.subarray(hashStartOffset, decoder.offset)) + const binaryHash = sha256.digest() + if (!equalBytes(binaryHash.subarray(0, 4), expectedHash)) { + throw new RangeError('checksum does not match data') + } + header.hash = bytesToHexString(binaryHash) + } + return header +} + +/** + * Returns the checksum of a change (bytes 4 to 7) as a 32-bit unsigned integer. + */ +function getChangeChecksum(change) { + if (change[0] !== MAGIC_BYTES[0] || change[1] !== MAGIC_BYTES[1] || + change[2] !== MAGIC_BYTES[2] || change[3] !== MAGIC_BYTES[3]) { + throw new RangeError('Data does not begin with magic bytes 85 6f 4a 83') + } + return ((change[4] << 24) | (change[5] << 16) | (change[6] << 8) | change[7]) >>> 0 +} + +function encodeChange(changeObj) { + const { changes, actorIds } = parseAllOpIds([changeObj], true) + const change = changes[0] + + const { hash, bytes } = encodeContainer(CHUNK_TYPE_CHANGE, encoder => { + if (!Array.isArray(change.deps)) throw new TypeError('deps is not an array') + encoder.appendUint53(change.deps.length) + for (let hash of change.deps.slice().sort()) { + encoder.appendRawBytes(hexStringToBytes(hash)) + } + encoder.appendHexString(change.actor) + encoder.appendUint53(change.seq) + encoder.appendUint53(change.startOp) + encoder.appendInt53(change.time) + encoder.appendPrefixedString(change.message || '') + encoder.appendUint53(actorIds.length - 1) + for (let actor of actorIds.slice(1)) encoder.appendHexString(actor) + + const columns = encodeOps(change.ops, false) + encodeColumnInfo(encoder, columns) + for (let column of columns) encoder.appendRawBytes(column.encoder.buffer) + if (change.extraBytes) encoder.appendRawBytes(change.extraBytes) + }) + + const hexHash = bytesToHexString(hash) + if (changeObj.hash && changeObj.hash !== hexHash) { + throw new RangeError(`Change hash does not match encoding: ${changeObj.hash} != ${hexHash}`) + } + return (bytes.byteLength >= DEFLATE_MIN_SIZE) ? deflateChange(bytes) : bytes +} + +function decodeChangeColumns(buffer) { + if (buffer[8] === CHUNK_TYPE_DEFLATE) buffer = inflateChange(buffer) + const decoder = new Decoder(buffer) + const header = decodeContainerHeader(decoder, true) + const chunkDecoder = new Decoder(header.chunkData) + if (!decoder.done) throw new RangeError('Encoded change has trailing data') + if (header.chunkType !== CHUNK_TYPE_CHANGE) throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + + const change = decodeChangeHeader(chunkDecoder) + const columns = decodeColumnInfo(chunkDecoder) + for (let i = 0; i < columns.length; i++) { + if ((columns[i].columnId & COLUMN_TYPE_DEFLATE) !== 0) { + throw new RangeError('change must not contain deflated columns') + } + columns[i].buffer = chunkDecoder.readRawBytes(columns[i].bufferLen) + } + if (!chunkDecoder.done) { + const restLen = chunkDecoder.buf.byteLength - chunkDecoder.offset + change.extraBytes = chunkDecoder.readRawBytes(restLen) + } + + change.columns = columns + change.hash = header.hash + return change +} + +/** + * Decodes one change in binary format into its JS object representation. + */ +function decodeChange(buffer) { + const change = decodeChangeColumns(buffer) + change.ops = decodeOps(decodeColumns(change.columns, change.actorIds, CHANGE_COLUMNS), false) + delete change.actorIds + delete change.columns + return change +} + +/** + * Decodes the header fields of a change in binary format, but does not decode + * the operations. Saves work when we only need to inspect the headers. Only + * computes the hash of the change if `computeHash` is true. + */ +function decodeChangeMeta(buffer, computeHash) { + if (buffer[8] === CHUNK_TYPE_DEFLATE) buffer = inflateChange(buffer) + const header = decodeContainerHeader(new Decoder(buffer), computeHash) + if (header.chunkType !== CHUNK_TYPE_CHANGE) { + throw new RangeError('Buffer chunk type is not a change') + } + const meta = decodeChangeHeader(new Decoder(header.chunkData)) + meta.change = buffer + if (computeHash) meta.hash = header.hash + return meta +} + +/** + * Compresses a binary change using DEFLATE. + */ +function deflateChange(buffer) { + const header = decodeContainerHeader(new Decoder(buffer), false) + if (header.chunkType !== CHUNK_TYPE_CHANGE) throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + const compressed = pako.deflateRaw(header.chunkData) + const encoder = new Encoder() + encoder.appendRawBytes(buffer.subarray(0, 8)) // copy MAGIC_BYTES and checksum + encoder.appendByte(CHUNK_TYPE_DEFLATE) + encoder.appendUint53(compressed.byteLength) + encoder.appendRawBytes(compressed) + return encoder.buffer +} + +/** + * Decompresses a binary change that has been compressed with DEFLATE. + */ +function inflateChange(buffer) { + const header = decodeContainerHeader(new Decoder(buffer), false) + if (header.chunkType !== CHUNK_TYPE_DEFLATE) throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + const decompressed = pako.inflateRaw(header.chunkData) + const encoder = new Encoder() + encoder.appendRawBytes(buffer.subarray(0, 8)) // copy MAGIC_BYTES and checksum + encoder.appendByte(CHUNK_TYPE_CHANGE) + encoder.appendUint53(decompressed.byteLength) + encoder.appendRawBytes(decompressed) + return encoder.buffer +} + +/** + * Takes an Uint8Array that may contain multiple concatenated changes, and + * returns an array of subarrays, each subarray containing one change. + */ +function splitContainers(buffer) { + let decoder = new Decoder(buffer), chunks = [], startOffset = 0 + while (!decoder.done) { + decodeContainerHeader(decoder, false) + chunks.push(buffer.subarray(startOffset, decoder.offset)) + startOffset = decoder.offset + } + return chunks +} + +/** + * Decodes a list of changes from the binary format into JS objects. + * `binaryChanges` is an array of `Uint8Array` objects. + */ +function decodeChanges(binaryChanges) { + let decoded = [] + for (let binaryChange of binaryChanges) { + for (let chunk of splitContainers(binaryChange)) { + if (chunk[8] === CHUNK_TYPE_DOCUMENT) { + decoded = decoded.concat(decodeDocument(chunk)) + } else if (chunk[8] === CHUNK_TYPE_CHANGE || chunk[8] === CHUNK_TYPE_DEFLATE) { + decoded.push(decodeChange(chunk)) + } else { + // ignoring chunk of unknown type + } + } + } + return decoded +} + +function sortOpIds(a, b) { + if (a === b) return 0 + if (a === '_root') return -1 + if (b === '_root') return +1 + const a_ = parseOpId(a), b_ = parseOpId(b) + if (a_.counter < b_.counter) return -1 + if (a_.counter > b_.counter) return +1 + if (a_.actorId < b_.actorId) return -1 + if (a_.actorId > b_.actorId) return +1 + return 0 +} + +function groupDocumentOps(changes) { + let byObjectId = {}, byReference = {}, objectType = {} + for (let change of changes) { + for (let i = 0; i < change.ops.length; i++) { + const op = change.ops[i], opId = `${op.id.counter}@${op.id.actorId}` + const objectId = (op.obj === '_root') ? '_root' : `${op.obj.counter}@${op.obj.actorId}` + if (op.action.startsWith('make')) { + objectType[opId] = op.action + if (op.action === 'makeList' || op.action === 'makeText') { + byReference[opId] = {'_head': []} + } + } + + let key + if (objectId === '_root' || objectType[objectId] === 'makeMap' || objectType[objectId] === 'makeTable') { + key = op.key + } else if (objectType[objectId] === 'makeList' || objectType[objectId] === 'makeText') { + if (op.insert) { + key = opId + const ref = (op.elemId === '_head') ? '_head' : `${op.elemId.counter}@${op.elemId.actorId}` + byReference[objectId][ref].push(opId) + byReference[objectId][opId] = [] + } else { + key = `${op.elemId.counter}@${op.elemId.actorId}` + } + } else { + throw new RangeError(`Unknown object type for object ${objectId}`) + } + + if (!byObjectId[objectId]) byObjectId[objectId] = {} + if (!byObjectId[objectId][key]) byObjectId[objectId][key] = {} + byObjectId[objectId][key][opId] = op + op.succ = [] + + for (let pred of op.pred) { + const predId = `${pred.counter}@${pred.actorId}` + if (!byObjectId[objectId][key][predId]) { + throw new RangeError(`No predecessor operation ${predId}`) + } + byObjectId[objectId][key][predId].succ.push(op.id) + } + } + } + + let ops = [] + for (let objectId of Object.keys(byObjectId).sort(sortOpIds)) { + let keys = [] + if (objectType[objectId] === 'makeList' || objectType[objectId] === 'makeText') { + let stack = ['_head'] + while (stack.length > 0) { + const key = stack.pop() + if (key !== '_head') keys.push(key) + for (let opId of byReference[objectId][key].sort(sortOpIds)) stack.push(opId) + } + } else { + // FIXME JavaScript sorts based on UTF-16 encoding. We should change this to use the UTF-8 + // encoding instead (the sort order will be different beyond the basic multilingual plane) + keys = Object.keys(byObjectId[objectId]).sort() + } + + for (let key of keys) { + for (let opId of Object.keys(byObjectId[objectId][key]).sort(sortOpIds)) { + const op = byObjectId[objectId][key][opId] + if (op.action !== 'del') ops.push(op) + } + } + } + return ops +} + +/** + * Takes a set of operations `ops` loaded from an encoded document, and + * reconstructs the changes that they originally came from. + * Does not return anything, only mutates `changes`. + */ +function groupChangeOps(changes, ops) { + let changesByActor = {} // map from actorId to array of changes by that actor + for (let change of changes) { + change.ops = [] + if (!changesByActor[change.actor]) changesByActor[change.actor] = [] + if (change.seq !== changesByActor[change.actor].length + 1) { + throw new RangeError(`Expected seq = ${changesByActor[change.actor].length + 1}, got ${change.seq}`) + } + if (change.seq > 1 && changesByActor[change.actor][change.seq - 2].maxOp > change.maxOp) { + throw new RangeError('maxOp must increase monotonically per actor') + } + changesByActor[change.actor].push(change) + } + + let opsById = {} + for (let op of ops) { + if (op.action === 'del') throw new RangeError('document should not contain del operations') + op.pred = opsById[op.id] ? opsById[op.id].pred : [] + opsById[op.id] = op + for (let succ of op.succ) { + if (!opsById[succ]) { + if (op.elemId) { + const elemId = op.insert ? op.id : op.elemId + opsById[succ] = {id: succ, action: 'del', obj: op.obj, elemId, pred: []} + } else { + opsById[succ] = {id: succ, action: 'del', obj: op.obj, key: op.key, pred: []} + } + } + opsById[succ].pred.push(op.id) + } + delete op.succ + } + for (let op of Object.values(opsById)) { + if (op.action === 'del') ops.push(op) + } + + for (let op of ops) { + const { counter, actorId } = parseOpId(op.id) + const actorChanges = changesByActor[actorId] + // Binary search to find the change that should contain this operation + let left = 0, right = actorChanges.length + while (left < right) { + const index = Math.floor((left + right) / 2) + if (actorChanges[index].maxOp < counter) { + left = index + 1 + } else { + right = index + } + } + if (left >= actorChanges.length) { + throw new RangeError(`Operation ID ${op.id} outside of allowed range`) + } + actorChanges[left].ops.push(op) + } + + for (let change of changes) { + change.ops.sort((op1, op2) => sortOpIds(op1.id, op2.id)) + change.startOp = change.maxOp - change.ops.length + 1 + delete change.maxOp + for (let i = 0; i < change.ops.length; i++) { + const op = change.ops[i], expectedId = `${change.startOp + i}@${change.actor}` + if (op.id !== expectedId) { + throw new RangeError(`Expected opId ${expectedId}, got ${op.id}`) + } + delete op.id + } + } +} + +function encodeDocumentChanges(changes) { + const columns = { // see DOCUMENT_COLUMNS + actor : new RLEEncoder('uint'), + seq : new DeltaEncoder(), + maxOp : new DeltaEncoder(), + time : new DeltaEncoder(), + message : new RLEEncoder('utf8'), + depsNum : new RLEEncoder('uint'), + depsIndex : new DeltaEncoder(), + extraLen : new RLEEncoder('uint'), + extraRaw : new Encoder() + } + let indexByHash = {} // map from change hash to its index in the changes array + let heads = {} // change hashes that are not a dependency of any other change + + for (let i = 0; i < changes.length; i++) { + const change = changes[i] + indexByHash[change.hash] = i + heads[change.hash] = true + + columns.actor.appendValue(change.actorNum) + columns.seq.appendValue(change.seq) + columns.maxOp.appendValue(change.startOp + change.ops.length - 1) + columns.time.appendValue(change.time) + columns.message.appendValue(change.message) + columns.depsNum.appendValue(change.deps.length) + + for (let dep of change.deps) { + if (typeof indexByHash[dep] !== 'number') { + throw new RangeError(`Unknown dependency hash: ${dep}`) + } + columns.depsIndex.appendValue(indexByHash[dep]) + if (heads[dep]) delete heads[dep] + } + + if (change.extraBytes) { + columns.extraLen.appendValue(change.extraBytes.byteLength << 4 | VALUE_TYPE.BYTES) + columns.extraRaw.appendRawBytes(change.extraBytes) + } else { + columns.extraLen.appendValue(VALUE_TYPE.BYTES) // zero-length byte array + } + } + + let changesColumns = [] + for (let {columnName, columnId} of DOCUMENT_COLUMNS) { + changesColumns.push({id: columnId, name: columnName, encoder: columns[columnName]}) + } + changesColumns.sort((a, b) => a.id - b.id) + return { changesColumns, heads: Object.keys(heads).sort() } +} + +function decodeDocumentChanges(changes, expectedHeads) { + let heads = {} // change hashes that are not a dependency of any other change + for (let i = 0; i < changes.length; i++) { + let change = changes[i] + change.deps = [] + for (let index of change.depsNum.map(d => d.depsIndex)) { + if (!changes[index] || !changes[index].hash) { + throw new RangeError(`No hash for index ${index} while processing index ${i}`) + } + const hash = changes[index].hash + change.deps.push(hash) + if (heads[hash]) delete heads[hash] + } + change.deps.sort() + delete change.depsNum + + if (change.extraLen_datatype !== VALUE_TYPE.BYTES) { + throw new RangeError(`Bad datatype for extra bytes: ${VALUE_TYPE.BYTES}`) + } + change.extraBytes = change.extraLen + delete change.extraLen_datatype + + // Encoding and decoding again to compute the hash of the change + changes[i] = decodeChange(encodeChange(change)) + heads[changes[i].hash] = true + } + + const actualHeads = Object.keys(heads).sort() + let headsEqual = (actualHeads.length === expectedHeads.length), i = 0 + while (headsEqual && i < actualHeads.length) { + headsEqual = (actualHeads[i] === expectedHeads[i]) + i++ + } + if (!headsEqual) { + throw new RangeError(`Mismatched heads hashes: expected ${expectedHeads.join(', ')}, got ${actualHeads.join(', ')}`) + } +} + +/** + * Transforms a list of changes into a binary representation of the document state. + */ +function encodeDocument(binaryChanges) { + const { changes, actorIds } = parseAllOpIds(decodeChanges(binaryChanges), false) + const { changesColumns, heads } = encodeDocumentChanges(changes) + const opsColumns = encodeOps(groupDocumentOps(changes), true) + for (let column of changesColumns) deflateColumn(column) + for (let column of opsColumns) deflateColumn(column) + + return encodeContainer(CHUNK_TYPE_DOCUMENT, encoder => { + encoder.appendUint53(actorIds.length) + for (let actor of actorIds) { + encoder.appendHexString(actor) + } + encoder.appendUint53(heads.length) + for (let head of heads.sort()) { + encoder.appendRawBytes(hexStringToBytes(head)) + } + encodeColumnInfo(encoder, changesColumns) + encodeColumnInfo(encoder, opsColumns) + for (let column of changesColumns) encoder.appendRawBytes(column.encoder.buffer) + for (let column of opsColumns) encoder.appendRawBytes(column.encoder.buffer) + }).bytes +} + +function decodeDocumentHeader(buffer) { + const documentDecoder = new Decoder(buffer) + const header = decodeContainerHeader(documentDecoder, true) + const decoder = new Decoder(header.chunkData) + if (!documentDecoder.done) throw new RangeError('Encoded document has trailing data') + if (header.chunkType !== CHUNK_TYPE_DOCUMENT) throw new RangeError(`Unexpected chunk type: ${header.chunkType}`) + + const actorIds = [], numActors = decoder.readUint53() + for (let i = 0; i < numActors; i++) { + actorIds.push(decoder.readHexString()) + } + const heads = [], numHeads = decoder.readUint53() + for (let i = 0; i < numHeads; i++) { + heads.push(bytesToHexString(decoder.readRawBytes(32))) + } + + const changesColumns = decodeColumnInfo(decoder) + const opsColumns = decodeColumnInfo(decoder) + for (let i = 0; i < changesColumns.length; i++) { + changesColumns[i].buffer = decoder.readRawBytes(changesColumns[i].bufferLen) + inflateColumn(changesColumns[i]) + } + for (let i = 0; i < opsColumns.length; i++) { + opsColumns[i].buffer = decoder.readRawBytes(opsColumns[i].bufferLen) + inflateColumn(opsColumns[i]) + } + + const extraBytes = decoder.readRawBytes(decoder.buf.byteLength - decoder.offset) + return { changesColumns, opsColumns, actorIds, heads, extraBytes } +} + +function decodeDocument(buffer) { + const { changesColumns, opsColumns, actorIds, heads } = decodeDocumentHeader(buffer) + const changes = decodeColumns(changesColumns, actorIds, DOCUMENT_COLUMNS) + const ops = decodeOps(decodeColumns(opsColumns, actorIds, DOC_OPS_COLUMNS), true) + groupChangeOps(changes, ops) + decodeDocumentChanges(changes, heads) + return changes +} + +/** + * DEFLATE-compresses the given column if it is large enough to make the compression worthwhile. + */ +function deflateColumn(column) { + if (column.encoder.buffer.byteLength >= DEFLATE_MIN_SIZE) { + column.encoder = {buffer: pako.deflateRaw(column.encoder.buffer)} + column.id |= COLUMN_TYPE_DEFLATE + } +} + +/** + * Decompresses the given column if it is DEFLATE-compressed. + */ +function inflateColumn(column) { + if ((column.columnId & COLUMN_TYPE_DEFLATE) !== 0) { + column.buffer = pako.inflateRaw(column.buffer) + column.columnId ^= COLUMN_TYPE_DEFLATE + } +} + +/** + * Takes all the operations for the same property (i.e. the same key in a map, or the same list + * element) and mutates the object patch to reflect the current value(s) of that property. There + * might be multiple values in the case of a conflict. `objects` is a map from objectId to the + * patch for that object. `property` contains `objId`, `key`, a list of `ops`, and `index` (the + * current list index if the object is a list). Returns true if one or more values are present, + * or false if the property has been deleted. + */ +function addPatchProperty(objects, property) { + let values = {}, counter = null + for (let op of property.ops) { + // Apply counters and their increments regardless of the number of successor operations + if (op.actionName === 'set' && op.value.datatype === 'counter') { + if (!counter) counter = {opId: op.opId, value: 0, succ: {}} + counter.value += op.value.value + for (let succId of op.succ) counter.succ[succId] = true + } else if (op.actionName === 'inc') { + if (!counter) throw new RangeError(`inc operation ${op.opId} without a counter`) + counter.value += op.value.value + delete counter.succ[op.opId] + for (let succId of op.succ) counter.succ[succId] = true + + } else if (op.succ.length === 0) { // Ignore any ops that have been overwritten + if (op.actionName.startsWith('make')) { + values[op.opId] = objects[op.opId] + } else if (op.actionName === 'set') { + values[op.opId] = {value: op.value.value, type: 'value'} + if (op.value.datatype) { + values[op.opId].datatype = op.value.datatype + } + } else if (op.actionName === 'link') { + // NB. This assumes that the ID of the child object is greater than the ID of the current + // object. This is true as long as link operations are only used to redo undone make* + // operations, but it will cease to be true once subtree moves are allowed. + if (!op.childId) throw new RangeError(`link operation ${op.opId} without a childId`) + values[op.opId] = objects[op.childId] + } else { + throw new RangeError(`Unexpected action type: ${op.actionName}`) + } + } + } + + // If the counter had any successor operation that was not an increment, that means the counter + // must have been deleted, so we omit it from the patch. + if (counter && Object.keys(counter.succ).length === 0) { + values[counter.opId] = {type: 'value', value: counter.value, datatype: 'counter'} + } + + if (Object.keys(values).length > 0) { + let obj = objects[property.objId] + if (obj.type === 'map' || obj.type === 'table') { + obj.props[property.key] = values + } else if (obj.type === 'list' || obj.type === 'text') { + makeListEdits(obj, values, property.key, property.index) + } + return true + } else { + return false + } +} + +/** + * When constructing a patch to instantiate a loaded document, this function adds the edits to + * insert one list element. Usually there is one value, but in the case of a conflict there may be + * several values. `elemId` is the ID of the list element, and `index` is the list index at which + * the value(s) should be placed. + */ +function makeListEdits(list, values, elemId, index) { + let firstValue = true + const opIds = Object.keys(values).sort((id1, id2) => compareParsedOpIds(parseOpId(id1), parseOpId(id2))) + for (const opId of opIds) { + if (firstValue) { + list.edits.push({action: 'insert', value: values[opId], elemId, opId, index}) + } else { + list.edits.push({action: 'update', value: values[opId], opId, index}) + } + firstValue = false + } +} + +/** + * Recursively walks the patch tree, calling appendEdit on every list edit in order to consense + * consecutive sequences of insertions into multi-inserts. + */ +function condenseEdits(diff) { + if (diff.type === 'list' || diff.type === 'text') { + diff.edits.forEach(e => condenseEdits(e.value)) + let newEdits = diff.edits + diff.edits = [] + for (const edit of newEdits) appendEdit(diff.edits, edit) + } else if (diff.type === 'map' || diff.type === 'table') { + for (const prop of Object.keys(diff.props)) { + for (const opId of Object.keys(diff.props[prop])) { + condenseEdits(diff.props[prop][opId]) + } + } + } +} + +/** + * Appends a list edit operation (insert, update, remove) to an array of existing operations. If the + * last existing operation can be extended (as a multi-op), we do that. + */ +function appendEdit(existingEdits, nextEdit) { + if (existingEdits.length === 0) { + existingEdits.push(nextEdit) + return + } + + let lastEdit = existingEdits[existingEdits.length - 1] + if (lastEdit.action === 'insert' && nextEdit.action === 'insert' && + lastEdit.index === nextEdit.index - 1 && + lastEdit.value.type === 'value' && nextEdit.value.type === 'value' && + lastEdit.elemId === lastEdit.opId && nextEdit.elemId === nextEdit.opId && + opIdDelta(lastEdit.elemId, nextEdit.elemId, 1)) { + lastEdit.action = 'multi-insert' + lastEdit.values = [lastEdit.value.value, nextEdit.value.value] + delete lastEdit.value + delete lastEdit.opId + + } else if (lastEdit.action === 'multi-insert' && nextEdit.action === 'insert' && + lastEdit.index + lastEdit.values.length === nextEdit.index && + nextEdit.value.type === 'value' && nextEdit.elemId === nextEdit.opId && + opIdDelta(lastEdit.elemId, nextEdit.elemId, lastEdit.values.length)) { + lastEdit.values.push(nextEdit.value.value) + + } else if (lastEdit.action === 'remove' && nextEdit.action === 'remove' && + lastEdit.index === nextEdit.index) { + lastEdit.count += nextEdit.count + + } else { + existingEdits.push(nextEdit) + } +} + +/** + * Returns true if the two given operation IDs have the same actor ID, and the counter of `id2` is + * exactly `delta` greater than the counter of `id1`. + */ +function opIdDelta(id1, id2, delta = 1) { + const parsed1 = parseOpId(id1), parsed2 = parseOpId(id2) + return parsed1.actorId === parsed2.actorId && parsed1.counter + delta === parsed2.counter +} + +/** + * Parses the document (in compressed binary format) given as `documentBuffer` + * and returns a patch that can be sent to the frontend to instantiate the + * current state of that document. + */ +function constructPatch(documentBuffer) { + const { opsColumns, actorIds } = decodeDocumentHeader(documentBuffer) + const col = makeDecoders(opsColumns, DOC_OPS_COLUMNS).reduce( + (acc, col) => Object.assign(acc, {[col.columnName]: col.decoder}), {}) + + let objects = {_root: {objectId: '_root', type: 'map', props: {}}} + let property = null + + while (!col.idActor.done) { + const opId = `${col.idCtr.readValue()}@${actorIds[col.idActor.readValue()]}` + const action = col.action.readValue(), actionName = ACTIONS[action] + if (action % 2 === 0) { // even-numbered actions are object creation + const type = OBJECT_TYPE[actionName] || 'unknown' + if (type === 'list' || type === 'text') { + objects[opId] = {objectId: opId, type, edits: []} + } else { + objects[opId] = {objectId: opId, type, props: {}} + } + } + + const objActor = col.objActor.readValue(), objCtr = col.objCtr.readValue() + const objId = objActor === null ? '_root' : `${objCtr}@${actorIds[objActor]}` + let obj = objects[objId] + if (!obj) throw new RangeError(`Operation for nonexistent object: ${objId}`) + + const keyActor = col.keyActor.readValue(), keyCtr = col.keyCtr.readValue() + const keyStr = col.keyStr.readValue(), insert = !!col.insert.readValue() + const chldActor = col.chldActor.readValue(), chldCtr = col.chldCtr.readValue() + const childId = chldActor === null ? null : `${chldCtr}@${actorIds[chldActor]}` + const sizeTag = col.valLen.readValue() + const rawValue = col.valRaw.readRawBytes(sizeTag >> 4) + const value = decodeValue(sizeTag, rawValue) + const succNum = col.succNum.readValue() + let succ = [] + for (let i = 0; i < succNum; i++) { + succ.push(`${col.succCtr.readValue()}@${actorIds[col.succActor.readValue()]}`) + } + + if (!actionName || obj.type === 'unknown') continue + + let key + if (obj.type === 'list' || obj.type === 'text') { + if (keyCtr === null || (keyCtr === 0 && !insert)) { + throw new RangeError(`Operation ${opId} on ${obj.type} object has no key`) + } + key = insert ? opId : `${keyCtr}@${actorIds[keyActor]}` + } else { + if (keyStr === null) { + throw new RangeError(`Operation ${opId} on ${obj.type} object has no key`) + } + key = keyStr + } + + if (!property || property.objId !== objId || property.key !== key) { + let index = 0 + if (property) { + index = property.index + if (addPatchProperty(objects, property)) index += 1 + if (property.objId !== objId) index = 0 + } + property = {objId, key, index, ops: []} + } + property.ops.push({opId, actionName, value, childId, succ}) + } + + if (property) addPatchProperty(objects, property) + condenseEdits(objects._root) + return objects._root +} + +module.exports = { + COLUMN_TYPE, VALUE_TYPE, ACTIONS, OBJECT_TYPE, DOC_OPS_COLUMNS, CHANGE_COLUMNS, + encoderByColumnId, decoderByColumnId, makeDecoders, decodeValue, + splitContainers, encodeChange, decodeChangeColumns, decodeChange, decodeChangeMeta, decodeChanges, + decodeDocumentHeader, encodeDocument, decodeDocument, + getChangeChecksum, appendEdit, constructPatch +} diff --git a/rust/automerge-wasm/test/helpers/common.js b/rust/automerge-wasm/test/helpers/common.js new file mode 100644 index 00000000..b41cadc8 --- /dev/null +++ b/rust/automerge-wasm/test/helpers/common.js @@ -0,0 +1,46 @@ +function isObject(obj) { + return typeof obj === 'object' && obj !== null +} + +/** + * Returns a shallow copy of the object `obj`. Faster than `Object.assign({}, obj)`. + * https://jsperf.com/cloning-large-objects/1 + */ +function copyObject(obj) { + if (!isObject(obj)) return {} + let copy = {} + for (let key of Object.keys(obj)) { + copy[key] = obj[key] + } + return copy +} + +/** + * Takes a string in the form that is used to identify operations (a counter concatenated + * with an actor ID, separated by an `@` sign) and returns an object `{counter, actorId}`. + */ +function parseOpId(opId) { + const match = /^(\d+)@(.*)$/.exec(opId || '') + if (!match) { + throw new RangeError(`Not a valid opId: ${opId}`) + } + return {counter: parseInt(match[1], 10), actorId: match[2]} +} + +/** + * Returns true if the two byte arrays contain the same data, false if not. + */ +function equalBytes(array1, array2) { + if (!(array1 instanceof Uint8Array) || !(array2 instanceof Uint8Array)) { + throw new TypeError('equalBytes can only compare Uint8Arrays') + } + if (array1.byteLength !== array2.byteLength) return false + for (let i = 0; i < array1.byteLength; i++) { + if (array1[i] !== array2[i]) return false + } + return true +} + +module.exports = { + isObject, copyObject, parseOpId, equalBytes +} diff --git a/rust/automerge-wasm/test/helpers/encoding.js b/rust/automerge-wasm/test/helpers/encoding.js new file mode 100644 index 00000000..92b62df6 --- /dev/null +++ b/rust/automerge-wasm/test/helpers/encoding.js @@ -0,0 +1,1209 @@ +/** + * UTF-8 decoding and encoding using API that is supported in Node >= 12 and modern browsers: + * https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/encode + * https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder/decode + * If you're running in an environment where it's not available, please use a polyfill, such as: + * https://github.com/anonyco/FastestSmallestTextEncoderDecoder + */ +const utf8encoder = new TextEncoder() +const utf8decoder = new TextDecoder('utf-8') + +function stringToUtf8(string) { + return utf8encoder.encode(string) +} + +function utf8ToString(buffer) { + return utf8decoder.decode(buffer) +} + +/** + * Converts a string consisting of hexadecimal digits into an Uint8Array. + */ +function hexStringToBytes(value) { + if (typeof value !== 'string') { + throw new TypeError('value is not a string') + } + if (!/^([0-9a-f][0-9a-f])*$/.test(value)) { + throw new RangeError('value is not hexadecimal') + } + if (value === '') { + return new Uint8Array(0) + } else { + return new Uint8Array(value.match(/../g).map(b => parseInt(b, 16))) + } +} + +const NIBBLE_TO_HEX = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] +const BYTE_TO_HEX = new Array(256) +for (let i = 0; i < 256; i++) { + BYTE_TO_HEX[i] = `${NIBBLE_TO_HEX[(i >>> 4) & 0xf]}${NIBBLE_TO_HEX[i & 0xf]}`; +} + +/** + * Converts a Uint8Array into the equivalent hexadecimal string. + */ +function bytesToHexString(bytes) { + let hex = '', len = bytes.byteLength + for (let i = 0; i < len; i++) { + hex += BYTE_TO_HEX[bytes[i]] + } + return hex +} + +/** + * Wrapper around an Uint8Array that allows values to be appended to the buffer, + * and that automatically grows the buffer when space runs out. + */ +class Encoder { + constructor() { + this.buf = new Uint8Array(16) + this.offset = 0 + } + + /** + * Returns the byte array containing the encoded data. + */ + get buffer() { + this.finish() + return this.buf.subarray(0, this.offset) + } + + /** + * Reallocates the encoder's buffer to be bigger. + */ + grow(minSize = 0) { + let newSize = this.buf.byteLength * 4 + while (newSize < minSize) newSize *= 2 + const newBuf = new Uint8Array(newSize) + newBuf.set(this.buf, 0) + this.buf = newBuf + return this + } + + /** + * Appends one byte (0 to 255) to the buffer. + */ + appendByte(value) { + if (this.offset >= this.buf.byteLength) this.grow() + this.buf[this.offset] = value + this.offset += 1 + } + + /** + * Encodes a 32-bit nonnegative integer in a variable number of bytes using + * the LEB128 encoding scheme (https://en.wikipedia.org/wiki/LEB128) and + * appends it to the buffer. Returns the number of bytes written. + */ + appendUint32(value) { + if (!Number.isInteger(value)) throw new RangeError('value is not an integer') + if (value < 0 || value > 0xffffffff) throw new RangeError('number out of range') + + const numBytes = Math.max(1, Math.ceil((32 - Math.clz32(value)) / 7)) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + + for (let i = 0; i < numBytes; i++) { + this.buf[this.offset + i] = (value & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + value >>>= 7 // zero-filling right shift + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a 32-bit signed integer in a variable number of bytes using the + * LEB128 encoding scheme (https://en.wikipedia.org/wiki/LEB128) and appends + * it to the buffer. Returns the number of bytes written. + */ + appendInt32(value) { + if (!Number.isInteger(value)) throw new RangeError('value is not an integer') + if (value < -0x80000000 || value > 0x7fffffff) throw new RangeError('number out of range') + + const numBytes = Math.ceil((33 - Math.clz32(value >= 0 ? value : -value - 1)) / 7) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + + for (let i = 0; i < numBytes; i++) { + this.buf[this.offset + i] = (value & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + value >>= 7 // sign-propagating right shift + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a nonnegative integer in a variable number of bytes using the LEB128 + * encoding scheme, up to the maximum size of integers supported by JavaScript + * (53 bits). + */ + appendUint53(value) { + if (!Number.isInteger(value)) throw new RangeError('value is not an integer') + if (value < 0 || value > Number.MAX_SAFE_INTEGER) { + throw new RangeError('number out of range') + } + const high32 = Math.floor(value / 0x100000000) + const low32 = (value & 0xffffffff) >>> 0 // right shift to interpret as unsigned + return this.appendUint64(high32, low32) + } + + /** + * Encodes a signed integer in a variable number of bytes using the LEB128 + * encoding scheme, up to the maximum size of integers supported by JavaScript + * (53 bits). + */ + appendInt53(value) { + if (!Number.isInteger(value)) throw new RangeError('value is not an integer') + if (value < Number.MIN_SAFE_INTEGER || value > Number.MAX_SAFE_INTEGER) { + throw new RangeError('number out of range') + } + const high32 = Math.floor(value / 0x100000000) + const low32 = (value & 0xffffffff) >>> 0 // right shift to interpret as unsigned + return this.appendInt64(high32, low32) + } + + /** + * Encodes a 64-bit nonnegative integer in a variable number of bytes using + * the LEB128 encoding scheme, and appends it to the buffer. The number is + * given as two 32-bit halves since JavaScript cannot accurately represent + * integers with more than 53 bits in a single variable. + */ + appendUint64(high32, low32) { + if (!Number.isInteger(high32) || !Number.isInteger(low32)) { + throw new RangeError('value is not an integer') + } + if (high32 < 0 || high32 > 0xffffffff || low32 < 0 || low32 > 0xffffffff) { + throw new RangeError('number out of range') + } + if (high32 === 0) return this.appendUint32(low32) + + const numBytes = Math.ceil((64 - Math.clz32(high32)) / 7) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + for (let i = 0; i < 4; i++) { + this.buf[this.offset + i] = (low32 & 0x7f) | 0x80 + low32 >>>= 7 // zero-filling right shift + } + this.buf[this.offset + 4] = (low32 & 0x0f) | ((high32 & 0x07) << 4) | (numBytes === 5 ? 0x00 : 0x80) + high32 >>>= 3 + for (let i = 5; i < numBytes; i++) { + this.buf[this.offset + i] = (high32 & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + high32 >>>= 7 + } + this.offset += numBytes + return numBytes + } + + /** + * Encodes a 64-bit signed integer in a variable number of bytes using the + * LEB128 encoding scheme, and appends it to the buffer. The number is given + * as two 32-bit halves since JavaScript cannot accurately represent integers + * with more than 53 bits in a single variable. The sign of the 64-bit + * number is determined by the sign of the `high32` half; the sign of the + * `low32` half is ignored. + */ + appendInt64(high32, low32) { + if (!Number.isInteger(high32) || !Number.isInteger(low32)) { + throw new RangeError('value is not an integer') + } + if (high32 < -0x80000000 || high32 > 0x7fffffff || low32 < -0x80000000 || low32 > 0xffffffff) { + throw new RangeError('number out of range') + } + low32 >>>= 0 // interpret as unsigned + if (high32 === 0 && low32 <= 0x7fffffff) return this.appendInt32(low32) + if (high32 === -1 && low32 >= 0x80000000) return this.appendInt32(low32 - 0x100000000) + + const numBytes = Math.ceil((65 - Math.clz32(high32 >= 0 ? high32 : -high32 - 1)) / 7) + if (this.offset + numBytes > this.buf.byteLength) this.grow() + for (let i = 0; i < 4; i++) { + this.buf[this.offset + i] = (low32 & 0x7f) | 0x80 + low32 >>>= 7 // zero-filling right shift + } + this.buf[this.offset + 4] = (low32 & 0x0f) | ((high32 & 0x07) << 4) | (numBytes === 5 ? 0x00 : 0x80) + high32 >>= 3 // sign-propagating right shift + for (let i = 5; i < numBytes; i++) { + this.buf[this.offset + i] = (high32 & 0x7f) | (i === numBytes - 1 ? 0x00 : 0x80) + high32 >>= 7 + } + this.offset += numBytes + return numBytes + } + + /** + * Appends the contents of byte buffer `data` to the buffer. Returns the + * number of bytes appended. + */ + appendRawBytes(data) { + if (this.offset + data.byteLength > this.buf.byteLength) { + this.grow(this.offset + data.byteLength) + } + this.buf.set(data, this.offset) + this.offset += data.byteLength + return data.byteLength + } + + /** + * Appends a UTF-8 string to the buffer, without any metadata. Returns the + * number of bytes appended. + */ + appendRawString(value) { + if (typeof value !== 'string') throw new TypeError('value is not a string') + return this.appendRawBytes(stringToUtf8(value)) + } + + /** + * Appends the contents of byte buffer `data` to the buffer, prefixed with the + * number of bytes in the buffer (as a LEB128-encoded unsigned integer). + */ + appendPrefixedBytes(data) { + this.appendUint53(data.byteLength) + this.appendRawBytes(data) + return this + } + + /** + * Appends a UTF-8 string to the buffer, prefixed with its length in bytes + * (where the length is encoded as an unsigned LEB128 integer). + */ + appendPrefixedString(value) { + if (typeof value !== 'string') throw new TypeError('value is not a string') + this.appendPrefixedBytes(stringToUtf8(value)) + return this + } + + /** + * Takes a value, which must be a string consisting only of hexadecimal + * digits, maps it to a byte array, and appends it to the buffer, prefixed + * with its length in bytes. + */ + appendHexString(value) { + this.appendPrefixedBytes(hexStringToBytes(value)) + return this + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() { + } +} + +/** + * Counterpart to Encoder. Wraps a Uint8Array buffer with a cursor indicating + * the current decoding position, and allows values to be incrementally read by + * decoding the bytes at the current position. + */ +class Decoder { + constructor(buffer) { + if (!(buffer instanceof Uint8Array)) { + throw new TypeError(`Not a byte array: ${buffer}`) + } + this.buf = buffer + this.offset = 0 + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return this.offset === this.buf.byteLength + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + } + + /** + * Moves the current decoding position forward by the specified number of + * bytes, without decoding anything. + */ + skip(bytes) { + if (this.offset + bytes > this.buf.byteLength) { + throw new RangeError('cannot skip beyond end of buffer') + } + this.offset += bytes + } + + /** + * Reads one byte (0 to 255) from the buffer. + */ + readByte() { + this.offset += 1 + return this.buf[this.offset - 1] + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the buffer. + * Throws an exception if the value doesn't fit in a 32-bit unsigned int. + */ + readUint32() { + let result = 0, shift = 0 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if (shift === 28 && (nextByte & 0xf0) !== 0) { // more than 5 bytes, or value > 0xffffffff + throw new RangeError('number out of range') + } + result = (result | (nextByte & 0x7f) << shift) >>> 0 // right shift to interpret value as unsigned + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return result + } + throw new RangeError('buffer ended with incomplete number') + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the buffer. + * Throws an exception if the value doesn't fit in a 32-bit signed int. + */ + readInt32() { + let result = 0, shift = 0 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if ((shift === 28 && (nextByte & 0x80) !== 0) || // more than 5 bytes + (shift === 28 && (nextByte & 0x40) === 0 && (nextByte & 0x38) !== 0) || // positive int > 0x7fffffff + (shift === 28 && (nextByte & 0x40) !== 0 && (nextByte & 0x38) !== 0x38)) { // negative int < -0x80000000 + throw new RangeError('number out of range') + } + result |= (nextByte & 0x7f) << shift + shift += 7 + this.offset++ + + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) === 0 || shift > 28) { + return result // positive, or negative value that doesn't need sign-extending + } else { + return result | (-1 << shift) // sign-extend negative integer + } + } + } + throw new RangeError('buffer ended with incomplete number') + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the + * buffer. Allows any integer that can be safely represented by JavaScript + * (up to 2^53 - 1), and throws an exception outside of that range. + */ + readUint53() { + const { low32, high32 } = this.readUint64() + if (high32 < 0 || high32 > 0x1fffff) { + throw new RangeError('number out of range') + } + return high32 * 0x100000000 + low32 + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the + * buffer. Allows any integer that can be safely represented by JavaScript + * (between -(2^53 - 1) and 2^53 - 1), throws an exception outside of that range. + */ + readInt53() { + const { low32, high32 } = this.readInt64() + if (high32 < -0x200000 || (high32 === -0x200000 && low32 === 0) || high32 > 0x1fffff) { + throw new RangeError('number out of range') + } + return high32 * 0x100000000 + low32 + } + + /** + * Reads a LEB128-encoded unsigned integer from the current position in the + * buffer. Throws an exception if the value doesn't fit in a 64-bit unsigned + * int. Returns the number in two 32-bit halves, as an object of the form + * `{high32, low32}`. + */ + readUint64() { + let low32 = 0, high32 = 0, shift = 0 + while (this.offset < this.buf.byteLength && shift <= 28) { + const nextByte = this.buf[this.offset] + low32 = (low32 | (nextByte & 0x7f) << shift) >>> 0 // right shift to interpret value as unsigned + if (shift === 28) { + high32 = (nextByte & 0x70) >>> 4 + } + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return { high32, low32 } + } + + shift = 3 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + if (shift === 31 && (nextByte & 0xfe) !== 0) { // more than 10 bytes, or value > 2^64 - 1 + throw new RangeError('number out of range') + } + high32 = (high32 | (nextByte & 0x7f) << shift) >>> 0 + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) return { high32, low32 } + } + throw new RangeError('buffer ended with incomplete number') + } + + /** + * Reads a LEB128-encoded signed integer from the current position in the + * buffer. Throws an exception if the value doesn't fit in a 64-bit signed + * int. Returns the number in two 32-bit halves, as an object of the form + * `{high32, low32}`. The `low32` half is always non-negative, and the + * sign of the `high32` half indicates the sign of the 64-bit number. + */ + readInt64() { + let low32 = 0, high32 = 0, shift = 0 + while (this.offset < this.buf.byteLength && shift <= 28) { + const nextByte = this.buf[this.offset] + low32 = (low32 | (nextByte & 0x7f) << shift) >>> 0 // right shift to interpret value as unsigned + if (shift === 28) { + high32 = (nextByte & 0x70) >>> 4 + } + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) !== 0) { // sign-extend negative integer + if (shift < 32) low32 = (low32 | (-1 << shift)) >>> 0 + high32 |= -1 << Math.max(shift - 32, 0) + } + return { high32, low32 } + } + } + + shift = 3 + while (this.offset < this.buf.byteLength) { + const nextByte = this.buf[this.offset] + // On the 10th byte there are only two valid values: all 7 value bits zero + // (if the value is positive) or all 7 bits one (if the value is negative) + if (shift === 31 && nextByte !== 0 && nextByte !== 0x7f) { + throw new RangeError('number out of range') + } + high32 |= (nextByte & 0x7f) << shift + shift += 7 + this.offset++ + if ((nextByte & 0x80) === 0) { + if ((nextByte & 0x40) !== 0 && shift < 32) { // sign-extend negative integer + high32 |= -1 << shift + } + return { high32, low32 } + } + } + throw new RangeError('buffer ended with incomplete number') + } + + /** + * Extracts a subarray `length` bytes in size, starting from the current + * position in the buffer, and moves the position forward. + */ + readRawBytes(length) { + const start = this.offset + if (start + length > this.buf.byteLength) { + throw new RangeError('subarray exceeds buffer size') + } + this.offset += length + return this.buf.subarray(start, this.offset) + } + + /** + * Extracts `length` bytes from the buffer, starting from the current position, + * and returns the UTF-8 string decoding of those bytes. + */ + readRawString(length) { + return utf8ToString(this.readRawBytes(length)) + } + + /** + * Extracts a subarray from the current position in the buffer, prefixed with + * its length in bytes (encoded as an unsigned LEB128 integer). + */ + readPrefixedBytes() { + return this.readRawBytes(this.readUint53()) + } + + /** + * Reads a UTF-8 string from the current position in the buffer, prefixed with its + * length in bytes (where the length is encoded as an unsigned LEB128 integer). + */ + readPrefixedString() { + return utf8ToString(this.readPrefixedBytes()) + } + + /** + * Reads a byte array from the current position in the buffer, prefixed with its + * length in bytes. Returns that byte array converted to a hexadecimal string. + */ + readHexString() { + return bytesToHexString(this.readPrefixedBytes()) + } +} + +/** + * An encoder that uses run-length encoding to compress sequences of repeated + * values. The constructor argument specifies the type of values, which may be + * either 'int', 'uint', or 'utf8'. Besides valid values of the selected + * datatype, values may also be null. + * + * The encoded buffer starts with a LEB128-encoded signed integer, the + * repetition count. The interpretation of the following values depends on this + * repetition count: + * - If this number is a positive value n, the next value in the buffer + * (encoded as the specified datatype) is repeated n times in the sequence. + * - If the repetition count is a negative value -n, then the next n values + * (encoded as the specified datatype) in the buffer are treated as a + * literal, i.e. they appear in the sequence without any further + * interpretation or repetition. + * - If the repetition count is zero, then the next value in the buffer is a + * LEB128-encoded unsigned integer indicating the number of null values + * that appear at the current position in the sequence. + * + * After one of these three has completed, the process repeats, starting again + * with a repetition count, until we reach the end of the buffer. + */ +class RLEEncoder extends Encoder { + constructor(type) { + super() + this.type = type + this.state = 'empty' + this.lastValue = undefined + this.count = 0 + this.literal = [] + } + + /** + * Appends a new value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + this._appendValue(value, repetitions) + } + + /** + * Like `appendValue()`, but this method is not overridden by `DeltaEncoder`. + */ + _appendValue(value, repetitions = 1) { + if (repetitions <= 0) return + if (this.state === 'empty') { + this.state = (value === null ? 'nulls' : (repetitions === 1 ? 'loneValue' : 'repetition')) + this.lastValue = value + this.count = repetitions + } else if (this.state === 'loneValue') { + if (value === null) { + this.flush() + this.state = 'nulls' + this.count = repetitions + } else if (value === this.lastValue) { + this.state = 'repetition' + this.count = 1 + repetitions + } else if (repetitions > 1) { + this.flush() + this.state = 'repetition' + this.count = repetitions + this.lastValue = value + } else { + this.state = 'literal' + this.literal = [this.lastValue] + this.lastValue = value + } + } else if (this.state === 'repetition') { + if (value === null) { + this.flush() + this.state = 'nulls' + this.count = repetitions + } else if (value === this.lastValue) { + this.count += repetitions + } else if (repetitions > 1) { + this.flush() + this.state = 'repetition' + this.count = repetitions + this.lastValue = value + } else { + this.flush() + this.state = 'loneValue' + this.lastValue = value + } + } else if (this.state === 'literal') { + if (value === null) { + this.literal.push(this.lastValue) + this.flush() + this.state = 'nulls' + this.count = repetitions + } else if (value === this.lastValue) { + this.flush() + this.state = 'repetition' + this.count = 1 + repetitions + } else if (repetitions > 1) { + this.literal.push(this.lastValue) + this.flush() + this.state = 'repetition' + this.count = repetitions + this.lastValue = value + } else { + this.literal.push(this.lastValue) + this.lastValue = value + } + } else if (this.state === 'nulls') { + if (value === null) { + this.count += repetitions + } else if (repetitions > 1) { + this.flush() + this.state = 'repetition' + this.count = repetitions + this.lastValue = value + } else { + this.flush() + this.state = 'loneValue' + this.lastValue = value + } + } + } + + /** + * Copies values from the RLEDecoder `decoder` into this encoder. The `options` object may + * contain the following keys: + * - `count`: The number of values to copy. If not specified, copies all remaining values. + * - `sumValues`: If true, the function computes the sum of all numeric values as they are + * copied (null values are counted as zero), and returns that number. + * - `sumShift`: If set, values are shifted right by `sumShift` bits before adding to the sum. + * + * Returns an object of the form `{nonNullValues, sum}` where `nonNullValues` is the number of + * non-null values copied, and `sum` is the sum (only if the `sumValues` option is set). + */ + copyFrom(decoder, options = {}) { + const { count, sumValues, sumShift } = options + if (!(decoder instanceof RLEDecoder) || (decoder.type !== this.type)) { + throw new TypeError('incompatible type of decoder') + } + let remaining = (typeof count === 'number' ? count : Number.MAX_SAFE_INTEGER) + let nonNullValues = 0, sum = 0 + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) return sumValues ? {nonNullValues, sum} : {nonNullValues} + + // Copy a value so that we have a well-defined starting state. NB: when super.copyFrom() is + // called by the DeltaEncoder subclass, the following calls to readValue() and appendValue() + // refer to the overridden methods, while later readRecord(), readRawValue() and _appendValue() + // calls refer to the non-overridden RLEDecoder/RLEEncoder methods. + let firstValue = decoder.readValue() + if (firstValue === null) { + const numNulls = Math.min(decoder.count + 1, remaining) + remaining -= numNulls + decoder.count -= numNulls - 1 + this.appendValue(null, numNulls) + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) return sumValues ? {nonNullValues, sum} : {nonNullValues} + firstValue = decoder.readValue() + if (firstValue === null) throw new RangeError('null run must be followed by non-null value') + } + this.appendValue(firstValue) + remaining-- + nonNullValues++ + if (sumValues) sum += (sumShift ? (firstValue >>> sumShift) : firstValue) + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) return sumValues ? {nonNullValues, sum} : {nonNullValues} + + // Copy data at the record level without expanding repetitions + let firstRun = (decoder.count > 0) + while (remaining > 0 && !decoder.done) { + if (!firstRun) decoder.readRecord() + const numValues = Math.min(decoder.count, remaining) + decoder.count -= numValues + + if (decoder.state === 'literal') { + nonNullValues += numValues + for (let i = 0; i < numValues; i++) { + if (decoder.done) throw new RangeError('incomplete literal') + const value = decoder.readRawValue() + if (value === decoder.lastValue) throw new RangeError('Repetition of values is not allowed in literal') + decoder.lastValue = value + this._appendValue(value) + if (sumValues) sum += (sumShift ? (value >>> sumShift) : value) + } + } else if (decoder.state === 'repetition') { + nonNullValues += numValues + if (sumValues) sum += numValues * (sumShift ? (decoder.lastValue >>> sumShift) : decoder.lastValue) + const value = decoder.lastValue + this._appendValue(value) + if (numValues > 1) { + this._appendValue(value) + if (this.state !== 'repetition') throw new RangeError(`Unexpected state ${this.state}`) + this.count += numValues - 2 + } + } else if (decoder.state === 'nulls') { + this._appendValue(null) + if (this.state !== 'nulls') throw new RangeError(`Unexpected state ${this.state}`) + this.count += numValues - 1 + } + + firstRun = false + remaining -= numValues + } + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + return sumValues ? {nonNullValues, sum} : {nonNullValues} + } + + /** + * Private method, do not call from outside the class. + */ + flush() { + if (this.state === 'loneValue') { + this.appendInt32(-1) + this.appendRawValue(this.lastValue) + } else if (this.state === 'repetition') { + this.appendInt53(this.count) + this.appendRawValue(this.lastValue) + } else if (this.state === 'literal') { + this.appendInt53(-this.literal.length) + for (let v of this.literal) this.appendRawValue(v) + } else if (this.state === 'nulls') { + this.appendInt32(0) + this.appendUint53(this.count) + } + this.state = 'empty' + } + + /** + * Private method, do not call from outside the class. + */ + appendRawValue(value) { + if (this.type === 'int') { + this.appendInt53(value) + } else if (this.type === 'uint') { + this.appendUint53(value) + } else if (this.type === 'utf8') { + this.appendPrefixedString(value) + } else { + throw new RangeError(`Unknown RLEEncoder datatype: ${this.type}`) + } + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() { + if (this.state === 'literal') this.literal.push(this.lastValue) + // Don't write anything if the only values we have seen are nulls + if (this.state !== 'nulls' || this.offset > 0) this.flush() + } +} + +/** + * Counterpart to RLEEncoder: reads values from an RLE-compressed sequence, + * returning nulls and repeated values as required. + */ +class RLEDecoder extends Decoder { + constructor(type, buffer) { + super(buffer) + this.type = type + this.lastValue = undefined + this.count = 0 + this.state = undefined + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return (this.count === 0) && (this.offset === this.buf.byteLength) + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = undefined + this.count = 0 + this.state = undefined + } + + /** + * Returns the next value (or null) in the sequence. + */ + readValue() { + if (this.done) return null + if (this.count === 0) this.readRecord() + this.count -= 1 + if (this.state === 'literal') { + const value = this.readRawValue() + if (value === this.lastValue) throw new RangeError('Repetition of values is not allowed in literal') + this.lastValue = value + return value + } else { + return this.lastValue + } + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) { + this.count = this.readInt53() + if (this.count > 0) { + this.lastValue = (this.count <= numSkip) ? this.skipRawValues(1) : this.readRawValue() + this.state = 'repetition' + } else if (this.count < 0) { + this.count = -this.count + this.state = 'literal' + } else { // this.count == 0 + this.count = this.readUint53() + this.lastValue = null + this.state = 'nulls' + } + } + + const consume = Math.min(numSkip, this.count) + if (this.state === 'literal') this.skipRawValues(consume) + numSkip -= consume + this.count -= consume + } + } + + /** + * Private method, do not call from outside the class. + * Reads a repetition count from the buffer and sets up the state appropriately. + */ + readRecord() { + this.count = this.readInt53() + if (this.count > 1) { + const value = this.readRawValue() + if ((this.state === 'repetition' || this.state === 'literal') && this.lastValue === value) { + throw new RangeError('Successive repetitions with the same value are not allowed') + } + this.state = 'repetition' + this.lastValue = value + } else if (this.count === 1) { + throw new RangeError('Repetition count of 1 is not allowed, use a literal instead') + } else if (this.count < 0) { + this.count = -this.count + if (this.state === 'literal') throw new RangeError('Successive literals are not allowed') + this.state = 'literal' + } else { // this.count == 0 + if (this.state === 'nulls') throw new RangeError('Successive null runs are not allowed') + this.count = this.readUint53() + if (this.count === 0) throw new RangeError('Zero-length null runs are not allowed') + this.lastValue = null + this.state = 'nulls' + } + } + + /** + * Private method, do not call from outside the class. + * Reads one value of the datatype configured on construction. + */ + readRawValue() { + if (this.type === 'int') { + return this.readInt53() + } else if (this.type === 'uint') { + return this.readUint53() + } else if (this.type === 'utf8') { + return this.readPrefixedString() + } else { + throw new RangeError(`Unknown RLEDecoder datatype: ${this.type}`) + } + } + + /** + * Private method, do not call from outside the class. + * Skips over `num` values of the datatype configured on construction. + */ + skipRawValues(num) { + if (this.type === 'utf8') { + for (let i = 0; i < num; i++) this.skip(this.readUint53()) + } else { + while (num > 0 && this.offset < this.buf.byteLength) { + if ((this.buf[this.offset] & 0x80) === 0) num-- + this.offset++ + } + if (num > 0) throw new RangeError('cannot skip beyond end of buffer') + } + } +} + +/** + * A variant of RLEEncoder: rather than storing the actual values passed to + * appendValue(), this version stores only the first value, and for all + * subsequent values it stores the difference to the previous value. This + * encoding is good when values tend to come in sequentially incrementing runs, + * because the delta between successive values is 1, and repeated values of 1 + * are easily compressed with run-length encoding. + * + * Null values are also allowed, as with RLEEncoder. + */ +class DeltaEncoder extends RLEEncoder { + constructor() { + super('int') + this.absoluteValue = 0 + } + + /** + * Appends a new integer value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + if (repetitions <= 0) return + if (typeof value === 'number') { + super.appendValue(value - this.absoluteValue, 1) + this.absoluteValue = value + if (repetitions > 1) super.appendValue(0, repetitions - 1) + } else { + super.appendValue(value, repetitions) + } + } + + /** + * Copies values from the DeltaDecoder `decoder` into this encoder. The `options` object may + * contain the key `count`, indicating the number of values to copy. If not specified, copies + * all remaining values in the decoder. + */ + copyFrom(decoder, options = {}) { + if (options.sumValues) { + throw new RangeError('unsupported options for DeltaEncoder.copyFrom()') + } + if (!(decoder instanceof DeltaDecoder)) { + throw new TypeError('incompatible type of decoder') + } + + let remaining = options.count + if (remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${remaining} values`) + if (remaining === 0 || decoder.done) return + + // Copy any null values, and the first non-null value, so that appendValue() computes the + // difference between the encoder's last value and the decoder's first (absolute) value. + let value = decoder.readValue(), nulls = 0 + this.appendValue(value) + if (value === null) { + nulls = decoder.count + 1 + if (remaining !== undefined && remaining < nulls) nulls = remaining + decoder.count -= nulls - 1 + this.count += nulls - 1 + if (remaining > nulls && decoder.done) throw new RangeError(`cannot copy ${remaining} values`) + if (remaining === nulls || decoder.done) return + + // The next value read is certain to be non-null because we're not at the end of the decoder, + // and a run of nulls must be followed by a run of non-nulls. + if (decoder.count === 0) this.appendValue(decoder.readValue()) + } + + // Once we have the first value, the subsequent relative values can be copied verbatim without + // any further processing. Note that the first value copied by super.copyFrom() is an absolute + // value, while subsequent values are relative. Thus, the sum of all of the (non-null) copied + // values must equal the absolute value of the final element copied. + if (remaining !== undefined) remaining -= nulls + 1 + const { nonNullValues, sum } = super.copyFrom(decoder, {count: remaining, sumValues: true}) + if (nonNullValues > 0) { + this.absoluteValue = sum + decoder.absoluteValue = sum + } + } +} + +/** + * Counterpart to DeltaEncoder: reads values from a delta-compressed sequence of + * numbers (may include null values). + */ +class DeltaDecoder extends RLEDecoder { + constructor(buffer) { + super('int', buffer) + this.absoluteValue = 0 + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = undefined + this.count = 0 + this.state = undefined + this.absoluteValue = 0 + } + + /** + * Returns the next integer (or null) value in the sequence. + */ + readValue() { + const value = super.readValue() + if (value === null) return null + this.absoluteValue += value + return this.absoluteValue + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) this.readRecord() + const consume = Math.min(numSkip, this.count) + if (this.state === 'literal') { + for (let i = 0; i < consume; i++) { + this.lastValue = this.readRawValue() + this.absoluteValue += this.lastValue + } + } else if (this.state === 'repetition') { + this.absoluteValue += consume * this.lastValue + } + numSkip -= consume + this.count -= consume + } + } +} + +/** + * Encodes a sequence of boolean values by mapping it to a sequence of integers: + * the number of false values, followed by the number of true values, followed + * by the number of false values, and so on. Each number is encoded as a LEB128 + * unsigned integer. This encoding is a bit like RLEEncoder, except that we + * only encode the repetition count but not the actual value, since the values + * just alternate between false and true (starting with false). + */ +class BooleanEncoder extends Encoder { + constructor() { + super() + this.lastValue = false + this.count = 0 + } + + /** + * Appends a new value to the sequence. If `repetitions` is given, the value is repeated + * `repetitions` times. + */ + appendValue(value, repetitions = 1) { + if (value !== false && value !== true) { + throw new RangeError(`Unsupported value for BooleanEncoder: ${value}`) + } + if (repetitions <= 0) return + if (this.lastValue === value) { + this.count += repetitions + } else { + this.appendUint53(this.count) + this.lastValue = value + this.count = repetitions + } + } + + /** + * Copies values from the BooleanDecoder `decoder` into this encoder. The `options` object may + * contain the key `count`, indicating the number of values to copy. If not specified, copies + * all remaining values in the decoder. + */ + copyFrom(decoder, options = {}) { + if (!(decoder instanceof BooleanDecoder)) { + throw new TypeError('incompatible type of decoder') + } + + const { count } = options + let remaining = (typeof count === 'number' ? count : Number.MAX_SAFE_INTEGER) + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + if (remaining === 0 || decoder.done) return + + // Copy one value to bring decoder and encoder state into sync, then finish that value's repetitions + this.appendValue(decoder.readValue()) + remaining-- + const firstCopy = Math.min(decoder.count, remaining) + this.count += firstCopy + decoder.count -= firstCopy + remaining -= firstCopy + + while (remaining > 0 && !decoder.done) { + decoder.count = decoder.readUint53() + if (decoder.count === 0) throw new RangeError('Zero-length runs are not allowed') + decoder.lastValue = !decoder.lastValue + this.appendUint53(this.count) + + const numCopied = Math.min(decoder.count, remaining) + this.count = numCopied + this.lastValue = decoder.lastValue + decoder.count -= numCopied + remaining -= numCopied + } + + if (count && remaining > 0 && decoder.done) throw new RangeError(`cannot copy ${count} values`) + } + + /** + * Flushes any unwritten data to the buffer. Call this before reading from + * the buffer constructed by this Encoder. + */ + finish() { + if (this.count > 0) { + this.appendUint53(this.count) + this.count = 0 + } + } +} + +/** + * Counterpart to BooleanEncoder: reads boolean values from a runlength-encoded + * sequence. + */ +class BooleanDecoder extends Decoder { + constructor(buffer) { + super(buffer) + this.lastValue = true // is negated the first time we read a count + this.firstRun = true + this.count = 0 + } + + /** + * Returns false if there is still data to be read at the current decoding + * position, and true if we are at the end of the buffer. + */ + get done() { + return (this.count === 0) && (this.offset === this.buf.byteLength) + } + + /** + * Resets the cursor position, so that the next read goes back to the + * beginning of the buffer. + */ + reset() { + this.offset = 0 + this.lastValue = true + this.firstRun = true + this.count = 0 + } + + /** + * Returns the next value in the sequence. + */ + readValue() { + if (this.done) return false + while (this.count === 0) { + this.count = this.readUint53() + this.lastValue = !this.lastValue + if (this.count === 0 && !this.firstRun) { + throw new RangeError('Zero-length runs are not allowed') + } + this.firstRun = false + } + this.count -= 1 + return this.lastValue + } + + /** + * Discards the next `numSkip` values in the sequence. + */ + skipValues(numSkip) { + while (numSkip > 0 && !this.done) { + if (this.count === 0) { + this.count = this.readUint53() + this.lastValue = !this.lastValue + if (this.count === 0) throw new RangeError('Zero-length runs are not allowed') + } + if (this.count < numSkip) { + numSkip -= this.count + this.count = 0 + } else { + this.count -= numSkip + numSkip = 0 + } + } + } +} + +module.exports = { + stringToUtf8, utf8ToString, hexStringToBytes, bytesToHexString, + Encoder, Decoder, RLEEncoder, RLEDecoder, DeltaEncoder, DeltaDecoder, BooleanEncoder, BooleanDecoder +} diff --git a/rust/automerge-wasm/test/helpers/sync.js b/rust/automerge-wasm/test/helpers/sync.js new file mode 100644 index 00000000..ce265ef4 --- /dev/null +++ b/rust/automerge-wasm/test/helpers/sync.js @@ -0,0 +1,481 @@ +/** + * Implementation of the data synchronisation protocol that brings a local and a remote document + * into the same state. This is typically used when two nodes have been disconnected for some time, + * and need to exchange any changes that happened while they were disconnected. The two nodes that + * are syncing could be client and server, or server and client, or two peers with symmetric roles. + * + * The protocol is based on this paper: Martin Kleppmann and Heidi Howard. Byzantine Eventual + * Consistency and the Fundamental Limits of Peer-to-Peer Databases. https://arxiv.org/abs/2012.00472 + * + * The protocol assumes that every time a node successfully syncs with another node, it remembers + * the current heads (as returned by `Backend.getHeads()`) after the last sync with that node. The + * next time we try to sync with the same node, we start from the assumption that the other node's + * document version is no older than the outcome of the last sync, so we only need to exchange any + * changes that are more recent than the last sync. This assumption may not be true if the other + * node did not correctly persist its state (perhaps it crashed before writing the result of the + * last sync to disk), and we fall back to sending the entire document in this case. + */ + +//const Backend = require('./backend') +const Backend = {} //require('./backend') +const { hexStringToBytes, bytesToHexString, Encoder, Decoder } = require('./encoding') +const { decodeChangeMeta } = require('./columnar') +const { copyObject } = require('./common') + +const HASH_SIZE = 32 // 256 bits = 32 bytes +const MESSAGE_TYPE_SYNC = 0x42 // first byte of a sync message, for identification +const PEER_STATE_TYPE = 0x43 // first byte of an encoded peer state, for identification + +// These constants correspond to a 1% false positive rate. The values can be changed without +// breaking compatibility of the network protocol, since the parameters used for a particular +// Bloom filter are encoded in the wire format. +const BITS_PER_ENTRY = 10, NUM_PROBES = 7 + +/** + * A Bloom filter implementation that can be serialised to a byte array for transmission + * over a network. The entries that are added are assumed to already be SHA-256 hashes, + * so this implementation does not perform its own hashing. + */ +class BloomFilter { + constructor (arg) { + if (Array.isArray(arg)) { + // arg is an array of SHA256 hashes in hexadecimal encoding + this.numEntries = arg.length + this.numBitsPerEntry = BITS_PER_ENTRY + this.numProbes = NUM_PROBES + this.bits = new Uint8Array(Math.ceil(this.numEntries * this.numBitsPerEntry / 8)) + for (let hash of arg) this.addHash(hash) + } else if (arg instanceof Uint8Array) { + if (arg.byteLength === 0) { + this.numEntries = 0 + this.numBitsPerEntry = 0 + this.numProbes = 0 + this.bits = arg + } else { + const decoder = new Decoder(arg) + this.numEntries = decoder.readUint32() + this.numBitsPerEntry = decoder.readUint32() + this.numProbes = decoder.readUint32() + this.bits = decoder.readRawBytes(Math.ceil(this.numEntries * this.numBitsPerEntry / 8)) + } + } else { + throw new TypeError('invalid argument') + } + } + + /** + * Returns the Bloom filter state, encoded as a byte array. + */ + get bytes() { + if (this.numEntries === 0) return new Uint8Array(0) + const encoder = new Encoder() + encoder.appendUint32(this.numEntries) + encoder.appendUint32(this.numBitsPerEntry) + encoder.appendUint32(this.numProbes) + encoder.appendRawBytes(this.bits) + return encoder.buffer + } + + /** + * Given a SHA-256 hash (as hex string), returns an array of probe indexes indicating which bits + * in the Bloom filter need to be tested or set for this particular entry. We do this by + * interpreting the first 12 bytes of the hash as three little-endian 32-bit unsigned integers, + * and then using triple hashing to compute the probe indexes. The algorithm comes from: + * + * Peter C. Dillinger and Panagiotis Manolios. Bloom Filters in Probabilistic Verification. + * 5th International Conference on Formal Methods in Computer-Aided Design (FMCAD), November 2004. + * http://www.ccis.northeastern.edu/home/pete/pub/bloom-filters-verification.pdf + */ + getProbes(hash) { + const hashBytes = hexStringToBytes(hash), modulo = 8 * this.bits.byteLength + if (hashBytes.byteLength !== 32) throw new RangeError(`Not a 256-bit hash: ${hash}`) + // on the next three lines, the right shift means interpret value as unsigned + let x = ((hashBytes[0] | hashBytes[1] << 8 | hashBytes[2] << 16 | hashBytes[3] << 24) >>> 0) % modulo + let y = ((hashBytes[4] | hashBytes[5] << 8 | hashBytes[6] << 16 | hashBytes[7] << 24) >>> 0) % modulo + let z = ((hashBytes[8] | hashBytes[9] << 8 | hashBytes[10] << 16 | hashBytes[11] << 24) >>> 0) % modulo + const probes = [x] + for (let i = 1; i < this.numProbes; i++) { + x = (x + y) % modulo + y = (y + z) % modulo + probes.push(x) + } + return probes + } + + /** + * Sets the Bloom filter bits corresponding to a given SHA-256 hash (given as hex string). + */ + addHash(hash) { + for (let probe of this.getProbes(hash)) { + this.bits[probe >>> 3] |= 1 << (probe & 7) + } + } + + /** + * Tests whether a given SHA-256 hash (given as hex string) is contained in the Bloom filter. + */ + containsHash(hash) { + if (this.numEntries === 0) return false + for (let probe of this.getProbes(hash)) { + if ((this.bits[probe >>> 3] & (1 << (probe & 7))) === 0) { + return false + } + } + return true + } +} + +/** + * Encodes a sorted array of SHA-256 hashes (as hexadecimal strings) into a byte array. + */ +function encodeHashes(encoder, hashes) { + if (!Array.isArray(hashes)) throw new TypeError('hashes must be an array') + encoder.appendUint32(hashes.length) + for (let i = 0; i < hashes.length; i++) { + if (i > 0 && hashes[i - 1] >= hashes[i]) throw new RangeError('hashes must be sorted') + const bytes = hexStringToBytes(hashes[i]) + if (bytes.byteLength !== HASH_SIZE) throw new TypeError('heads hashes must be 256 bits') + encoder.appendRawBytes(bytes) + } +} + +/** + * Decodes a byte array in the format returned by encodeHashes(), and returns its content as an + * array of hex strings. + */ +function decodeHashes(decoder) { + let length = decoder.readUint32(), hashes = [] + for (let i = 0; i < length; i++) { + hashes.push(bytesToHexString(decoder.readRawBytes(HASH_SIZE))) + } + return hashes +} + +/** + * Takes a sync message of the form `{heads, need, have, changes}` and encodes it as a byte array for + * transmission. + */ +function encodeSyncMessage(message) { + const encoder = new Encoder() + encoder.appendByte(MESSAGE_TYPE_SYNC) + encodeHashes(encoder, message.heads) + encodeHashes(encoder, message.need) + encoder.appendUint32(message.have.length) + for (let have of message.have) { + encodeHashes(encoder, have.lastSync) + encoder.appendPrefixedBytes(have.bloom) + } + encoder.appendUint32(message.changes.length) + for (let change of message.changes) { + encoder.appendPrefixedBytes(change) + } + return encoder.buffer +} + +/** + * Takes a binary-encoded sync message and decodes it into the form `{heads, need, have, changes}`. + */ +function decodeSyncMessage(bytes) { + const decoder = new Decoder(bytes) + const messageType = decoder.readByte() + if (messageType !== MESSAGE_TYPE_SYNC) { + throw new RangeError(`Unexpected message type: ${messageType}`) + } + const heads = decodeHashes(decoder) + const need = decodeHashes(decoder) + const haveCount = decoder.readUint32() + let message = {heads, need, have: [], changes: []} + for (let i = 0; i < haveCount; i++) { + const lastSync = decodeHashes(decoder) + const bloom = decoder.readPrefixedBytes(decoder) + message.have.push({lastSync, bloom}) + } + const changeCount = decoder.readUint32() + for (let i = 0; i < changeCount; i++) { + const change = decoder.readPrefixedBytes() + message.changes.push(change) + } + // Ignore any trailing bytes -- they can be used for extensions by future versions of the protocol + return message +} + +/** + * Takes a SyncState and encodes as a byte array those parts of the state that should persist across + * an application restart or disconnect and reconnect. The ephemeral parts of the state that should + * be cleared on reconnect are not encoded. + */ +function encodeSyncState(syncState) { + const encoder = new Encoder() + encoder.appendByte(PEER_STATE_TYPE) + encodeHashes(encoder, syncState.sharedHeads) + return encoder.buffer +} + +/** + * Takes a persisted peer state as encoded by `encodeSyncState` and decodes it into a SyncState + * object. The parts of the peer state that were not encoded are initialised with default values. + */ +function decodeSyncState(bytes) { + const decoder = new Decoder(bytes) + const recordType = decoder.readByte() + if (recordType !== PEER_STATE_TYPE) { + throw new RangeError(`Unexpected record type: ${recordType}`) + } + const sharedHeads = decodeHashes(decoder) + return Object.assign(initSyncState(), { sharedHeads }) +} + +/** + * Constructs a Bloom filter containing all changes that are not one of the hashes in + * `lastSync` or its transitive dependencies. In other words, the filter contains those + * changes that have been applied since the version identified by `lastSync`. Returns + * an object of the form `{lastSync, bloom}` as required for the `have` field of a sync + * message. + */ +function makeBloomFilter(backend, lastSync) { + const newChanges = Backend.getChanges(backend, lastSync) + const hashes = newChanges.map(change => decodeChangeMeta(change, true).hash) + return {lastSync, bloom: new BloomFilter(hashes).bytes} +} + +/** + * Call this function when a sync message is received from another node. The `message` argument + * needs to already have been decoded using `decodeSyncMessage()`. This function determines the + * changes that we need to send to the other node in response. Returns an array of changes (as + * byte arrays). + */ +function getChangesToSend(backend, have, need) { + if (have.length === 0) { + return need.map(hash => Backend.getChangeByHash(backend, hash)).filter(change => change !== undefined) + } + + let lastSyncHashes = {}, bloomFilters = [] + for (let h of have) { + for (let hash of h.lastSync) lastSyncHashes[hash] = true + bloomFilters.push(new BloomFilter(h.bloom)) + } + + // Get all changes that were added since the last sync + const changes = Backend.getChanges(backend, Object.keys(lastSyncHashes)) + .map(change => decodeChangeMeta(change, true)) + + let changeHashes = {}, dependents = {}, hashesToSend = {} + for (let change of changes) { + changeHashes[change.hash] = true + + // For each change, make a list of changes that depend on it + for (let dep of change.deps) { + if (!dependents[dep]) dependents[dep] = [] + dependents[dep].push(change.hash) + } + + // Exclude any change hashes contained in one or more Bloom filters + if (bloomFilters.every(bloom => !bloom.containsHash(change.hash))) { + hashesToSend[change.hash] = true + } + } + + // Include any changes that depend on a Bloom-negative change + let stack = Object.keys(hashesToSend) + while (stack.length > 0) { + const hash = stack.pop() + if (dependents[hash]) { + for (let dep of dependents[hash]) { + if (!hashesToSend[dep]) { + hashesToSend[dep] = true + stack.push(dep) + } + } + } + } + + // Include any explicitly requested changes + let changesToSend = [] + for (let hash of need) { + hashesToSend[hash] = true + if (!changeHashes[hash]) { // Change is not among those returned by getMissingChanges()? + const change = Backend.getChangeByHash(backend, hash) + if (change) changesToSend.push(change) + } + } + + // Return changes in the order they were returned by getMissingChanges() + for (let change of changes) { + if (hashesToSend[change.hash]) changesToSend.push(change.change) + } + return changesToSend +} + +function initSyncState() { + return { + sharedHeads: [], + lastSentHeads: [], + theirHeads: null, + theirNeed: null, + theirHave: null, + sentHashes: {}, + } +} + +function compareArrays(a, b) { + return (a.length === b.length) && a.every((v, i) => v === b[i]) +} + +/** + * Given a backend and what we believe to be the state of our peer, generate a message which tells + * them about we have and includes any changes we believe they need + */ +function generateSyncMessage(backend, syncState) { + if (!backend) { + throw new Error("generateSyncMessage called with no Automerge document") + } + if (!syncState) { + throw new Error("generateSyncMessage requires a syncState, which can be created with initSyncState()") + } + + let { sharedHeads, lastSentHeads, theirHeads, theirNeed, theirHave, sentHashes } = syncState + const ourHeads = Backend.getHeads(backend) + + // Hashes to explicitly request from the remote peer: any missing dependencies of unapplied + // changes, and any of the remote peer's heads that we don't know about + const ourNeed = Backend.getMissingDeps(backend, theirHeads || []) + + // There are two reasons why ourNeed may be nonempty: 1. we might be missing dependencies due to + // Bloom filter false positives; 2. we might be missing heads that the other peer mentioned + // because they (intentionally) only sent us a subset of changes. In case 1, we leave the `have` + // field of the message empty because we just want to fill in the missing dependencies for now. + // In case 2, or if ourNeed is empty, we send a Bloom filter to request any unsent changes. + let ourHave = [] + if (!theirHeads || ourNeed.every(hash => theirHeads.includes(hash))) { + ourHave = [makeBloomFilter(backend, sharedHeads)] + } + + // Fall back to a full re-sync if the sender's last sync state includes hashes + // that we don't know. This could happen if we crashed after the last sync and + // failed to persist changes that the other node already sent us. + if (theirHave && theirHave.length > 0) { + const lastSync = theirHave[0].lastSync + if (!lastSync.every(hash => Backend.getChangeByHash(backend, hash))) { + // we need to queue them to send us a fresh sync message, the one they sent is uninteligible so we don't know what they need + const resetMsg = {heads: ourHeads, need: [], have: [{ lastSync: [], bloom: new Uint8Array(0) }], changes: []} + return [syncState, encodeSyncMessage(resetMsg)] + } + } + + // XXX: we should limit ourselves to only sending a subset of all the messages, probably limited by a total message size + // these changes should ideally be RLE encoded but we haven't implemented that yet. + let changesToSend = Array.isArray(theirHave) && Array.isArray(theirNeed) ? getChangesToSend(backend, theirHave, theirNeed) : [] + + // If the heads are equal, we're in sync and don't need to do anything further + const headsUnchanged = Array.isArray(lastSentHeads) && compareArrays(ourHeads, lastSentHeads) + const headsEqual = Array.isArray(theirHeads) && compareArrays(ourHeads, theirHeads) + if (headsUnchanged && headsEqual && changesToSend.length === 0) { + // no need to send a sync message if we know we're synced! + return [syncState, null] + } + + // TODO: this recomputes the SHA-256 hash of each change; we should restructure this to avoid the + // unnecessary recomputation + changesToSend = changesToSend.filter(change => !sentHashes[decodeChangeMeta(change, true).hash]) + + // Regular response to a sync message: send any changes that the other node + // doesn't have. We leave the "have" field empty because the previous message + // generated by `syncStart` already indicated what changes we have. + const syncMessage = {heads: ourHeads, have: ourHave, need: ourNeed, changes: changesToSend} + if (changesToSend.length > 0) { + sentHashes = copyObject(sentHashes) + for (const change of changesToSend) { + sentHashes[decodeChangeMeta(change, true).hash] = true + } + } + + syncState = Object.assign({}, syncState, {lastSentHeads: ourHeads, sentHashes}) + return [syncState, encodeSyncMessage(syncMessage)] +} + +/** + * Computes the heads that we share with a peer after we have just received some changes from that + * peer and applied them. This may not be sufficient to bring our heads in sync with the other + * peer's heads, since they may have only sent us a subset of their outstanding changes. + * + * `myOldHeads` are the local heads before the most recent changes were applied, `myNewHeads` are + * the local heads after those changes were applied, and `ourOldSharedHeads` is the previous set of + * shared heads. Applying the changes will have replaced some heads with others, but some heads may + * have remained unchanged (because they are for branches on which no changes have been added). Any + * such unchanged heads remain in the sharedHeads. Any sharedHeads that were replaced by applying + * changes are also replaced as sharedHeads. This is safe because if we received some changes from + * another peer, that means that peer had those changes, and therefore we now both know about them. + */ +function advanceHeads(myOldHeads, myNewHeads, ourOldSharedHeads) { + const newHeads = myNewHeads.filter((head) => !myOldHeads.includes(head)) + const commonHeads = ourOldSharedHeads.filter((head) => myNewHeads.includes(head)) + const advancedHeads = [...new Set([...newHeads, ...commonHeads])].sort() + return advancedHeads +} + + +/** + * Given a backend, a message message and the state of our peer, apply any changes, update what + * we believe about the peer, and (if there were applied changes) produce a patch for the frontend + */ +function receiveSyncMessage(backend, oldSyncState, binaryMessage) { + if (!backend) { + throw new Error("generateSyncMessage called with no Automerge document") + } + if (!oldSyncState) { + throw new Error("generateSyncMessage requires a syncState, which can be created with initSyncState()") + } + + let { sharedHeads, lastSentHeads, sentHashes } = oldSyncState, patch = null + const message = decodeSyncMessage(binaryMessage) + const beforeHeads = Backend.getHeads(backend) + + // If we received changes, we try to apply them to the document. There may still be missing + // dependencies due to Bloom filter false positives, in which case the backend will enqueue the + // changes without applying them. The set of changes may also be incomplete if the sender decided + // to break a large set of changes into chunks. + if (message.changes.length > 0) { + [backend, patch] = Backend.applyChanges(backend, message.changes) + sharedHeads = advanceHeads(beforeHeads, Backend.getHeads(backend), sharedHeads) + } + + // If heads are equal, indicate we don't need to send a response message + if (message.changes.length === 0 && compareArrays(message.heads, beforeHeads)) { + lastSentHeads = message.heads + } + + // If all of the remote heads are known to us, that means either our heads are equal, or we are + // ahead of the remote peer. In this case, take the remote heads to be our shared heads. + const knownHeads = message.heads.filter(head => Backend.getChangeByHash(backend, head)) + if (knownHeads.length === message.heads.length) { + sharedHeads = message.heads + // If the remote peer has lost all its data, reset our state to perform a full resync + if (message.heads.length === 0) { + lastSentHeads = [] + sentHashes = [] + } + } else { + // If some remote heads are unknown to us, we add all the remote heads we know to + // sharedHeads, but don't remove anything from sharedHeads. This might cause sharedHeads to + // contain some redundant hashes (where one hash is actually a transitive dependency of + // another), but this will be cleared up as soon as we know all the remote heads. + sharedHeads = [...new Set(knownHeads.concat(sharedHeads))].sort() + } + + const syncState = { + sharedHeads, // what we have in common to generate an efficient bloom filter + lastSentHeads, + theirHave: message.have, // the information we need to calculate the changes they need + theirHeads: message.heads, + theirNeed: message.need, + sentHashes + } + return [backend, syncState, patch] +} + +module.exports = { + receiveSyncMessage, generateSyncMessage, + encodeSyncMessage, decodeSyncMessage, + initSyncState, encodeSyncState, decodeSyncState, + BloomFilter // BloomFilter is a private API, exported only for testing purposes +} diff --git a/rust/automerge-wasm/test/readme.ts b/rust/automerge-wasm/test/readme.ts new file mode 100644 index 00000000..e5823556 --- /dev/null +++ b/rust/automerge-wasm/test/readme.ts @@ -0,0 +1,244 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { describe, it } from 'mocha'; +import * as assert from 'assert' +import { create, load, initSyncState } from '..' + +describe('Automerge', () => { + describe('Readme Examples', () => { + it('Using the Library and Creating a Document', () => { + const doc = create(true) + const sync = initSyncState() + doc.free() + sync.free() + }) + it('Automerge Scalar Types (1)', () => { + const doc = create(true) + doc.put("/", "prop1", 100) // int + doc.put("/", "prop2", 3.14) // f64 + doc.put("/", "prop3", "hello world") + doc.put("/", "prop4", new Date(0)) + doc.put("/", "prop5", new Uint8Array([1,2,3])) + doc.put("/", "prop6", true) + doc.put("/", "prop7", null) + + assert.deepEqual(doc.materialize("/"), { + prop1: 100, + prop2: 3.14, + prop3: "hello world", + prop4: new Date(0), + prop5: new Uint8Array([1,2,3]), + prop6: true, + prop7: null + }) + }) + it('Automerge Scalar Types (2)', () => { + const doc = create(true) + doc.put("/", "prop1", 100, "int") + doc.put("/", "prop2", 100, "uint") + doc.put("/", "prop3", 100.5, "f64") + doc.put("/", "prop4", 100, "counter") + doc.put("/", "prop5", 1647531707301, "timestamp") + doc.put("/", "prop6", new Date(), "timestamp") + doc.put("/", "prop7", "hello world", "str") + doc.put("/", "prop8", new Uint8Array([1,2,3]), "bytes") + doc.put("/", "prop9", true, "boolean") + doc.put("/", "prop10", null, "null") + }) + it('Automerge Object Types (1)', () => { + const doc = create(true) + + // you can create an object by passing in the inital state - if blank pass in `{}` + // the return value is the Object Id + // these functions all return an object id + + const config = doc.putObject("/", "config", { align: "left", archived: false, cycles: [10, 19, 21] }) + const token = doc.putObject("/", "tokens", {}) + + // lists can be made with javascript arrays + + const birds = doc.putObject("/", "birds", ["bluejay", "penguin", "puffin"]) + const bots = doc.putObject("/", "bots", []) + + // text is initialized with a string + + const notes = doc.putObject("/", "notes", "Hello world!") + }) + it('Automerge Object Types (2)', () => { + const doc = create(true) + + const config = doc.putObject("/", "config", { align: "left", archived: false, cycles: [10, 19, 21] }) + + doc.put(config, "align", "right") + + // Anywhere Object Ids are being used a path can also be used. + // The following two statements are equivalent: + + const id = doc.getWithType("/", "config") + if (id && id[0] === 'map') { + doc.put(id[1], "align", "right") + } + + doc.put("/config", "align", "right") + + assert.deepEqual(doc.materialize("/"), { + config: { align: "right", archived: false, cycles: [ 10, 19, 21 ] } + }) + }) + it('Maps (1)', () => { + const doc = create(true) + const mymap = doc.putObject("_root", "mymap", { foo: "bar"}) + // make a new map with the foo key + + doc.put(mymap, "bytes", new Uint8Array([1,2,3])) + // assign a byte array to key `bytes` of the mymap object + + const submap = doc.putObject(mymap, "sub", {}) + // make a new empty object and assign it to the key `sub` of mymap + + assert.deepEqual(doc.keys(mymap),["bytes","foo","sub"]) + assert.deepEqual(doc.materialize("_root"), { mymap: { bytes: new Uint8Array([1,2,3]), foo: "bar", sub: {} }}) + }) + it('Lists (1)', () => { + const doc = create(true) + const items = doc.putObject("_root", "items", [10,"box"]) + // init a new list with two elements + doc.push(items, true) // push `true` to the end of the list + doc.putObject(items, 0, { hello: "world" }) // overwrite the value 10 with an object with a key and value + doc.delete(items, 1) // delete "box" + doc.splice(items, 2, 0, ["bag", "brick"]) // splice in "bag" and "brick" at position 2 + doc.insert(items, 0, "bat") // insert "bat" to the beginning of the list + doc.insertObject(items, 1, [ 1, 2 ]) // insert a list with 2 values at pos 1 + + assert.deepEqual(doc.materialize(items),[ "bat", [ 1 ,2 ], { hello : "world" }, true, "bag", "brick" ]) + assert.deepEqual(doc.length(items),6) + }) + it('Text (1)', () => { + const doc = create(true, "aaaaaa") + const notes = doc.putObject("_root", "notes", "Hello world") + doc.splice(notes, 6, 5, "everyone") + + assert.deepEqual(doc.text(notes), "Hello everyone") + }) + it('Querying Data (1)', () => { + const doc1 = create(true, "aabbcc") + doc1.put("_root", "key1", "val1") + const key2 = doc1.putObject("_root", "key2", []) + + assert.deepEqual(doc1.get("_root", "key1"), "val1") + assert.deepEqual(doc1.getWithType("_root", "key2"), ["list", "2@aabbcc"]) + assert.deepEqual(doc1.keys("_root"), ["key1", "key2"]) + + const doc2 = doc1.fork("ffaaff") + + // set a value concurrently + doc1.put("_root","key3","doc1val") + doc2.put("_root","key3","doc2val") + + doc1.merge(doc2) + + assert.deepEqual(doc1.get("_root","key3"), "doc2val") + assert.deepEqual(doc1.getAll("_root","key3"),[[ "str", "doc1val", "3@aabbcc"], ["str", "doc2val", "3@ffaaff"]]) + }) + it('Counters (1)', () => { + const doc1 = create(true, "aaaaaa") + doc1.put("_root", "number", 0) + doc1.put("_root", "total", 0, "counter") + + const doc2 = doc1.fork("bbbbbb") + doc2.put("_root", "number", 10) + doc2.increment("_root", "total", 11) + + doc1.put("_root", "number", 20) + doc1.increment("_root", "total", 22) + + doc1.merge(doc2) + + assert.deepEqual(doc1.materialize("_root"), { number: 10, total: 33 }) + }) + it('Transactions (1)', () => { + const doc = create(true) + + doc.put("_root", "key", "val1") + + assert.deepEqual(doc.get("_root", "key"),"val1") + assert.deepEqual(doc.pendingOps(),1) + + doc.rollback() + + assert.deepEqual(doc.get("_root", "key"),undefined) + assert.deepEqual(doc.pendingOps(),0) + + doc.put("_root", "key", "val2") + + assert.deepEqual(doc.pendingOps(),1) + + doc.commit("test commit 1") + + assert.deepEqual(doc.get("_root", "key"),"val2") + assert.deepEqual(doc.pendingOps(),0) + }) + it('Viewing Old Versions of the Document (1)', () => { + const doc = create(true) + + doc.put("_root", "key", "val1") + const heads1 = doc.getHeads() + + doc.put("_root", "key", "val2") + const heads2 = doc.getHeads() + + doc.put("_root", "key", "val3") + + assert.deepEqual(doc.get("_root","key"), "val3") + assert.deepEqual(doc.get("_root","key",heads2), "val2") + assert.deepEqual(doc.get("_root","key",heads1), "val1") + assert.deepEqual(doc.get("_root","key",[]), undefined) + }) + it('Forking And Merging (1)', () => { + const doc1 = create(true) + doc1.put("_root", "key1", "val1") + + const doc2 = doc1.fork() + + doc1.put("_root", "key2", "val2") + doc2.put("_root", "key3", "val3") + + doc1.merge(doc2) + + assert.deepEqual(doc1.materialize("_root"), { key1: "val1", key2: "val2", key3: "val3" }) + assert.deepEqual(doc2.materialize("_root"), { key1: "val1", key3: "val3" }) + }) + it('Saving And Loading (1)', () => { + const doc1 = create(true) + + doc1.put("_root", "key1", "value1") + + const save1 = doc1.save() + + const doc2 = load(save1, true) + + doc2.materialize("_root") // returns { key1: "value1" } + + doc1.put("_root", "key2", "value2") + + const saveIncremental = doc1.saveIncremental() + + const save2 = doc1.save() + + const save3 = new Uint8Array([... save1, ... saveIncremental]) + + // save2 has fewer bytes than save3 but contains the same ops + + doc2.loadIncremental(saveIncremental) + + const doc3 = load(save2, true) + + const doc4 = load(save3, true) + + assert.deepEqual(doc1.materialize("_root"), { key1: "value1", key2: "value2" }) + assert.deepEqual(doc2.materialize("_root"), { key1: "value1", key2: "value2" }) + assert.deepEqual(doc3.materialize("_root"), { key1: "value1", key2: "value2" }) + assert.deepEqual(doc4.materialize("_root"), { key1: "value1", key2: "value2" }) + }) + //it.skip('Syncing (1)', () => { }) + }) +}) diff --git a/rust/automerge-wasm/test/test.ts b/rust/automerge-wasm/test/test.ts new file mode 100644 index 00000000..bb4f71e3 --- /dev/null +++ b/rust/automerge-wasm/test/test.ts @@ -0,0 +1,2173 @@ +import { describe, it } from 'mocha'; +import assert from 'assert' +// @ts-ignore +import { BloomFilter } from './helpers/sync' +import { create, load, SyncState, Automerge, encodeChange, decodeChange, initSyncState, decodeSyncMessage, decodeSyncState, encodeSyncState, encodeSyncMessage } from '..' +import { Value, DecodedSyncMessage, Hash } from '..'; +import {kill} from 'process'; + +function sync(a: Automerge, b: Automerge, aSyncState = initSyncState(), bSyncState = initSyncState()) { + const MAX_ITER = 10 + let aToBmsg = null, bToAmsg = null, i = 0 + do { + aToBmsg = a.generateSyncMessage(aSyncState) + bToAmsg = b.generateSyncMessage(bSyncState) + + if (aToBmsg) { + b.receiveSyncMessage(bSyncState, aToBmsg) + } + if (bToAmsg) { + a.receiveSyncMessage(aSyncState, bToAmsg) + } + + if (i++ > MAX_ITER) { + throw new Error(`Did not synchronize within ${MAX_ITER} iterations`) + } + } while (aToBmsg || bToAmsg) +} + +describe('Automerge', () => { + describe('basics', () => { + + it('should create, clone and free', () => { + const doc1 = create(true) + const doc2 = doc1.clone() + doc2.free() + }) + + it('should be able to start and commit', () => { + const doc = create(true) + doc.commit() + }) + + it('getting a nonexistent prop does not throw an error', () => { + const doc = create(true) + const root = "_root" + const result = doc.getWithType(root, "hello") + assert.deepEqual(result, undefined) + }) + + it('should be able to set and get a simple value', () => { + const doc: Automerge = create(true, "aabbcc") + const root = "_root" + let result + + doc.put(root, "hello", "world") + doc.put(root, "number1", 5, "uint") + doc.put(root, "number2", 5) + doc.put(root, "number3", 5.5) + doc.put(root, "number4", 5.5, "f64") + doc.put(root, "number5", 5.5, "int") + doc.put(root, "bool", true) + doc.put(root, "time1", 1000, "timestamp") + doc.put(root, "time2", new Date(1001)) + doc.putObject(root, "list", []); + doc.put(root, "null", null) + + result = doc.getWithType(root, "hello") + assert.deepEqual(result, ["str", "world"]) + assert.deepEqual(doc.get("/", "hello"), "world") + + result = doc.getWithType(root, "number1") + assert.deepEqual(result, ["uint", 5]) + assert.deepEqual(doc.get("/", "number1"), 5) + + result = doc.getWithType(root, "number2") + assert.deepEqual(result, ["int", 5]) + + result = doc.getWithType(root, "number3") + assert.deepEqual(result, ["f64", 5.5]) + + result = doc.getWithType(root, "number4") + assert.deepEqual(result, ["f64", 5.5]) + + result = doc.getWithType(root, "number5") + assert.deepEqual(result, ["int", 5]) + + result = doc.getWithType(root, "bool") + assert.deepEqual(result, ["boolean", true]) + + doc.put(root, "bool", false, "boolean") + + result = doc.getWithType(root, "bool") + assert.deepEqual(result, ["boolean", false]) + + result = doc.getWithType(root, "time1") + assert.deepEqual(result, ["timestamp", new Date(1000)]) + + result = doc.getWithType(root, "time2") + assert.deepEqual(result, ["timestamp", new Date(1001)]) + + result = doc.getWithType(root, "list") + assert.deepEqual(result, ["list", "10@aabbcc"]); + + result = doc.getWithType(root, "null") + assert.deepEqual(result, ["null", null]); + }) + + it('should be able to use bytes', () => { + const doc = create(true) + doc.put("_root", "data1", new Uint8Array([10, 11, 12])); + doc.put("_root", "data2", new Uint8Array([13, 14, 15]), "bytes"); + const value1 = doc.getWithType("_root", "data1") + assert.deepEqual(value1, ["bytes", new Uint8Array([10, 11, 12])]); + const value2 = doc.getWithType("_root", "data2") + assert.deepEqual(value2, ["bytes", new Uint8Array([13, 14, 15])]); + }) + + it('should be able to make subobjects', () => { + const doc = create(true) + const root = "_root" + let result + + const submap = doc.putObject(root, "submap", {}) + doc.put(submap, "number", 6, "uint") + assert.strictEqual(doc.pendingOps(), 2) + + result = doc.getWithType(root, "submap") + assert.deepEqual(result, ["map", submap]) + + result = doc.getWithType(submap, "number") + assert.deepEqual(result, ["uint", 6]) + }) + + it('should be able to make lists', () => { + const doc = create(true) + const root = "_root" + + const sublist = doc.putObject(root, "numbers", []) + doc.insert(sublist, 0, "a"); + doc.insert(sublist, 1, "b"); + doc.insert(sublist, 2, "c"); + doc.insert(sublist, 0, "z"); + + assert.deepEqual(doc.getWithType(sublist, 0), ["str", "z"]) + assert.deepEqual(doc.getWithType(sublist, 1), ["str", "a"]) + assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b"]) + assert.deepEqual(doc.getWithType(sublist, 3), ["str", "c"]) + assert.deepEqual(doc.length(sublist), 4) + + doc.put(sublist, 2, "b v2"); + + assert.deepEqual(doc.getWithType(sublist, 2), ["str", "b v2"]) + assert.deepEqual(doc.length(sublist), 4) + }) + + it('lists have insert, set, splice, and push ops', () => { + const doc = create(true) + const root = "_root" + + const sublist = doc.putObject(root, "letters", []) + doc.insert(sublist, 0, "a"); + doc.insert(sublist, 0, "b"); + assert.deepEqual(doc.materialize(), { letters: ["b", "a"] }) + doc.push(sublist, "c"); + const heads = doc.getHeads() + assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c"] }) + doc.push(sublist, 3, "timestamp"); + assert.deepEqual(doc.materialize(), { letters: ["b", "a", "c", new Date(3)] }) + doc.splice(sublist, 1, 1, ["d", "e", "f"]); + assert.deepEqual(doc.materialize(), { letters: ["b", "d", "e", "f", "c", new Date(3)] }) + doc.put(sublist, 0, "z"); + assert.deepEqual(doc.materialize(), { letters: ["z", "d", "e", "f", "c", new Date(3)] }) + assert.deepEqual(doc.materialize(sublist), ["z", "d", "e", "f", "c", new Date(3)]) + assert.deepEqual(doc.length(sublist), 6) + assert.deepEqual(doc.materialize("/", heads), { letters: ["b", "a", "c"] }) + }) + + it('should be able delete non-existent props', () => { + const doc = create(true) + + doc.put("_root", "foo", "bar") + doc.put("_root", "bip", "bap") + const hash1 = doc.commit() + + assert.deepEqual(doc.keys("_root"), ["bip", "foo"]) + + doc.delete("_root", "foo") + doc.delete("_root", "baz") + const hash2 = doc.commit() + + assert.deepEqual(doc.keys("_root"), ["bip"]) + assert.ok(hash1) + assert.deepEqual(doc.keys("_root", [hash1]), ["bip", "foo"]) + assert.ok(hash2) + assert.deepEqual(doc.keys("_root", [hash2]), ["bip"]) + }) + + it('should be able to del', () => { + const doc = create(true) + const root = "_root" + + doc.put(root, "xxx", "xxx"); + assert.deepEqual(doc.getWithType(root, "xxx"), ["str", "xxx"]) + doc.delete(root, "xxx"); + assert.deepEqual(doc.getWithType(root, "xxx"), undefined) + }) + + it('should be able to use counters', () => { + const doc = create(true) + const root = "_root" + + doc.put(root, "counter", 10, "counter"); + assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 10]) + doc.increment(root, "counter", 10); + assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 20]) + doc.increment(root, "counter", -5); + assert.deepEqual(doc.getWithType(root, "counter"), ["counter", 15]) + }) + + it('should be able to splice text', () => { + const doc = create(true) + const root = "_root"; + + const text = doc.putObject(root, "text", ""); + doc.splice(text, 0, 0, "hello ") + doc.splice(text, 6, 0, "world") + doc.splice(text, 11, 0, "!?") + assert.deepEqual(doc.getWithType(text, 0), ["str", "h"]) + assert.deepEqual(doc.getWithType(text, 1), ["str", "e"]) + assert.deepEqual(doc.getWithType(text, 9), ["str", "l"]) + assert.deepEqual(doc.getWithType(text, 10), ["str", "d"]) + assert.deepEqual(doc.getWithType(text, 11), ["str", "!"]) + assert.deepEqual(doc.getWithType(text, 12), ["str", "?"]) + }) + + it.skip('should NOT be able to insert objects into text', () => { + const doc = create(true) + const text = doc.putObject("/", "text", "Hello world"); + assert.throws(() => { + doc.insertObject(text, 6, { hello: "world" }); + }) + }) + + it('should be able save all or incrementally', () => { + const doc = create(true) + + doc.put("_root", "foo", 1) + + const save1 = doc.save() + + doc.put("_root", "bar", 2) + + const saveMidway = doc.clone().save(); + + const save2 = doc.saveIncremental(); + + doc.put("_root", "baz", 3); + + const save3 = doc.saveIncremental(); + + const saveA = doc.save(); + const saveB = new Uint8Array([...save1, ...save2, ...save3]); + + assert.notDeepEqual(saveA, saveB); + + const docA = load(saveA, true); + const docB = load(saveB, true); + const docC = load(saveMidway, true) + docC.loadIncremental(save3) + + assert.deepEqual(docA.keys("_root"), docB.keys("_root")); + assert.deepEqual(docA.save(), docB.save()); + assert.deepEqual(docA.save(), docC.save()); + }) + + it('should be able to splice text', () => { + const doc = create(true) + const text = doc.putObject("_root", "text", ""); + doc.splice(text, 0, 0, "hello world"); + const hash1 = doc.commit(); + doc.splice(text, 6, 0, "big bad "); + const hash2 = doc.commit(); + assert.strictEqual(doc.text(text), "hello big bad world") + assert.strictEqual(doc.length(text), 19) + assert.ok(hash1) + assert.strictEqual(doc.text(text, [hash1]), "hello world") + assert.strictEqual(doc.length(text, [hash1]), 11) + assert.ok(hash2) + assert.strictEqual(doc.text(text, [hash2]), "hello big bad world") + assert.ok(hash2) + assert.strictEqual(doc.length(text, [hash2]), 19) + }) + + it('local inc increments all visible counters in a map', () => { + const doc1 = create(true, "aaaa") + doc1.put("_root", "hello", "world") + const doc2 = load(doc1.save(), true, "bbbb"); + const doc3 = load(doc1.save(), true, "cccc"); + const heads = doc1.getHeads() + doc1.put("_root", "cnt", 20) + doc2.put("_root", "cnt", 0, "counter") + doc3.put("_root", "cnt", 10, "counter") + doc1.applyChanges(doc2.getChanges(heads)) + doc1.applyChanges(doc3.getChanges(heads)) + let result = doc1.getAll("_root", "cnt") + assert.deepEqual(result, [ + ['int', 20, '2@aaaa'], + ['counter', 0, '2@bbbb'], + ['counter', 10, '2@cccc'], + ]) + doc1.increment("_root", "cnt", 5) + result = doc1.getAll("_root", "cnt") + assert.deepEqual(result, [ + ['counter', 5, '2@bbbb'], + ['counter', 15, '2@cccc'], + ]) + + const save1 = doc1.save() + const doc4 = load(save1, true) + assert.deepEqual(doc4.save(), save1); + }) + + it('local inc increments all visible counters in a sequence', () => { + const doc1 = create(true, "aaaa") + const seq = doc1.putObject("_root", "seq", []) + doc1.insert(seq, 0, "hello") + const doc2 = load(doc1.save(), true, "bbbb"); + const doc3 = load(doc1.save(), true, "cccc"); + const heads = doc1.getHeads() + doc1.put(seq, 0, 20) + doc2.put(seq, 0, 0, "counter") + doc3.put(seq, 0, 10, "counter") + doc1.applyChanges(doc2.getChanges(heads)) + doc1.applyChanges(doc3.getChanges(heads)) + let result = doc1.getAll(seq, 0) + assert.deepEqual(result, [ + ['int', 20, '3@aaaa'], + ['counter', 0, '3@bbbb'], + ['counter', 10, '3@cccc'], + ]) + doc1.increment(seq, 0, 5) + result = doc1.getAll(seq, 0) + assert.deepEqual(result, [ + ['counter', 5, '3@bbbb'], + ['counter', 15, '3@cccc'], + ]) + + const save = doc1.save() + const doc4 = load(save, true) + assert.deepEqual(doc4.save(), save); + }) + + it('paths can be used instead of objids', () => { + const doc = create(true, "aaaa") + doc.putObject("_root", "list", [{ foo: "bar" }, [1, 2, 3]]) + assert.deepEqual(doc.materialize("/"), { list: [{ foo: "bar" }, [1, 2, 3]] }) + assert.deepEqual(doc.materialize("/list"), [{ foo: "bar" }, [1, 2, 3]]) + assert.deepEqual(doc.materialize("/list/0"), { foo: "bar" }) + }) + + it('should be able to fetch changes by hash', () => { + const doc1 = create(true, "aaaa") + const doc2 = create(true, "bbbb") + doc1.put("/", "a", "b") + doc2.put("/", "b", "c") + const head1 = doc1.getHeads() + const head2 = doc2.getHeads() + const change1 = doc1.getChangeByHash(head1[0]) + const change2 = doc1.getChangeByHash(head2[0]) + assert.deepEqual(change2, null) + if (change1 === null) { throw new RangeError("change1 should not be null") } + assert.deepEqual(decodeChange(change1).hash, head1[0]) + }) + + it('recursive sets are possible', () => { + const doc = create(true, "aaaa") + const l1 = doc.putObject("_root", "list", [{ foo: "bar" }, [1, 2, 3]]) + const l2 = doc.insertObject(l1, 0, { zip: ["a", "b"] }) + doc.putObject("_root", "info1", "hello world") // 'text' object + doc.put("_root", "info2", "hello world") // 'str' + const l4 = doc.putObject("_root", "info3", "hello world") + assert.deepEqual(doc.materialize(), { + "list": [{ zip: ["a", "b"] }, { foo: "bar" }, [1, 2, 3]], + "info1": "hello world", + "info2": "hello world", + "info3": "hello world", + }) + assert.deepEqual(doc.materialize(l2), { zip: ["a", "b"] }) + assert.deepEqual(doc.materialize(l1), [{ zip: ["a", "b"] }, { foo: "bar" }, [1, 2, 3]]) + assert.deepEqual(doc.materialize(l4), "hello world") + }) + + it('only returns an object id when objects are created', () => { + const doc = create(true, "aaaa") + const r1 = doc.put("_root", "foo", "bar") + const r2 = doc.putObject("_root", "list", []) + const r3 = doc.put("_root", "counter", 10, "counter") + const r4 = doc.increment("_root", "counter", 1) + const r5 = doc.delete("_root", "counter") + const r6 = doc.insert(r2, 0, 10); + const r7 = doc.insertObject(r2, 0, {}); + const r8 = doc.splice(r2, 1, 0, ["a", "b", "c"]); + //let r9 = doc.splice(r2,1,0,["a",[],{},"d"]); + assert.deepEqual(r1, null); + assert.deepEqual(r2, "2@aaaa"); + assert.deepEqual(r3, null); + assert.deepEqual(r4, null); + assert.deepEqual(r5, null); + assert.deepEqual(r6, null); + assert.deepEqual(r7, "7@aaaa"); + assert.deepEqual(r8, null); + //assert.deepEqual(r9,["12@aaaa","13@aaaa"]); + }) + + it('objects without properties are preserved', () => { + const doc1 = create(true, "aaaa") + const a = doc1.putObject("_root", "a", {}); + const b = doc1.putObject("_root", "b", {}); + const c = doc1.putObject("_root", "c", {}); + doc1.put(c, "d", "dd"); + const saved = doc1.save(); + const doc2 = load(saved, true); + assert.deepEqual(doc2.getWithType("_root", "a"), ["map", a]) + assert.deepEqual(doc2.keys(a), []) + assert.deepEqual(doc2.getWithType("_root", "b"), ["map", b]) + assert.deepEqual(doc2.keys(b), []) + assert.deepEqual(doc2.getWithType("_root", "c"), ["map", c]) + assert.deepEqual(doc2.keys(c), ["d"]) + assert.deepEqual(doc2.getWithType(c, "d"), ["str", "dd"]) + }) + + it('should allow you to fork at a heads', () => { + const A = create(true, "aaaaaa") + A.put("/", "key1", "val1"); + A.put("/", "key2", "val2"); + const heads1 = A.getHeads(); + const B = A.fork("bbbbbb") + A.put("/", "key3", "val3"); + B.put("/", "key4", "val4"); + A.merge(B) + const heads2 = A.getHeads(); + A.put("/", "key5", "val5"); + assert.deepEqual(A.fork(undefined, heads1).materialize("/"), A.materialize("/", heads1)) + assert.deepEqual(A.fork(undefined, heads2).materialize("/"), A.materialize("/", heads2)) + }) + + it('should handle merging text conflicts then saving & loading', () => { + const A = create(true, "aabbcc") + const At = A.putObject('_root', 'text', "") + A.splice(At, 0, 0, 'hello') + + const B = A.fork() + + assert.deepEqual(B.getWithType("_root", "text"), ["text", At]) + + B.splice(At, 4, 1) + B.splice(At, 4, 0, '!') + B.splice(At, 5, 0, ' ') + B.splice(At, 6, 0, 'world') + + A.merge(B) + + const binary = A.save() + + const C = load(binary, true) + + assert.deepEqual(C.getWithType('_root', 'text'), ['text', '1@aabbcc']) + assert.deepEqual(C.text(At), 'hell! world') + }) + }) + + describe('patch generation', () => { + it('should include root object key updates', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.put('_root', 'hello', 'world') + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['hello'], value: 'world' } + ]) + }) + + it('should include nested object creation', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.putObject('_root', 'birds', { friday: { robins: 3 } }) + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: [ 'birds' ], value: {} }, + { action: 'put', path: [ 'birds', 'friday' ], value: {} }, + { action: 'put', path: [ 'birds', 'friday', 'robins' ], value: 3}, + ]) + }) + + it('should delete map keys', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.put('_root', 'favouriteBird', 'Robin') + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + doc1.delete('_root', 'favouriteBird') + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: [ 'favouriteBird' ], value: 'Robin' }, + { action: 'del', path: [ 'favouriteBird' ] } + ]) + }) + + it('should include list element insertion', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.putObject('_root', 'birds', ['Goldfinch', 'Chaffinch']) + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: [ 'birds' ], value: [] }, + { action: 'insert', path: [ 'birds', 0 ], values: ['Goldfinch', 'Chaffinch'] }, + ]) + }) + + it('should insert nested maps into a list', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.putObject('_root', 'birds', []) + doc2.loadIncremental(doc1.saveIncremental()) + doc1.insertObject('1@aaaa', 0, { species: 'Goldfinch', count: 3 }) + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.popPatches(), [ + { action: 'insert', path: [ 'birds', 0 ], values: [{}] }, + { action: 'put', path: [ 'birds', 0, 'species' ], value: 'Goldfinch' }, + { action: 'put', path: [ 'birds', 0, 'count', ], value: 3 } + ]) + }) + + it('should calculate list indexes based on visible elements', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.putObject('_root', 'birds', ['Goldfinch', 'Chaffinch']) + doc2.loadIncremental(doc1.saveIncremental()) + doc1.delete('1@aaaa', 0) + doc1.insert('1@aaaa', 1, 'Greenfinch') + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc1.getWithType('1@aaaa', 0), ['str', 'Chaffinch']) + assert.deepEqual(doc1.getWithType('1@aaaa', 1), ['str', 'Greenfinch']) + assert.deepEqual(doc2.popPatches(), [ + { action: 'del', path: ['birds', 0] }, + { action: 'insert', path: ['birds', 1], values: ['Greenfinch'] } + ]) + }) + + it('should handle concurrent insertions at the head of a list', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc'), doc4 = create(true, 'dddd') + doc1.putObject('_root', 'values', []) + const change1 = doc1.saveIncremental() + doc2.loadIncremental(change1) + doc3.loadIncremental(change1) + doc4.loadIncremental(change1) + doc1.insert('1@aaaa', 0, 'c') + doc1.insert('1@aaaa', 1, 'd') + doc2.insert('1@aaaa', 0, 'a') + doc2.insert('1@aaaa', 1, 'b') + const change2 = doc1.saveIncremental(), change3 = doc2.saveIncremental() + doc3.enablePatches(true) + doc4.enablePatches(true) + doc3.loadIncremental(change2); doc3.loadIncremental(change3) + doc4.loadIncremental(change3); doc4.loadIncremental(change2) + assert.deepEqual([0, 1, 2, 3].map(i => (doc3.getWithType('1@aaaa', i) || [])[1]), ['a', 'b', 'c', 'd']) + assert.deepEqual([0, 1, 2, 3].map(i => (doc4.getWithType('1@aaaa', i) || [])[1]), ['a', 'b', 'c', 'd']) + assert.deepEqual(doc3.popPatches(), [ + { action: 'insert', path: ['values', 0], values:['a','b','c','d'] }, + ]) + assert.deepEqual(doc4.popPatches(), [ + { action: 'insert', path: ['values',0], values:['a','b','c','d'] }, + ]) + }) + + it('should handle concurrent insertions beyond the head', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc'), doc4 = create(true, 'dddd') + doc1.putObject('_root', 'values', ['a', 'b']) + const change1 = doc1.saveIncremental() + doc2.loadIncremental(change1) + doc3.loadIncremental(change1) + doc4.loadIncremental(change1) + doc1.insert('1@aaaa', 2, 'e') + doc1.insert('1@aaaa', 3, 'f') + doc2.insert('1@aaaa', 2, 'c') + doc2.insert('1@aaaa', 3, 'd') + const change2 = doc1.saveIncremental(), change3 = doc2.saveIncremental() + doc3.enablePatches(true) + doc4.enablePatches(true) + doc3.loadIncremental(change2); doc3.loadIncremental(change3) + doc4.loadIncremental(change3); doc4.loadIncremental(change2) + assert.deepEqual([0, 1, 2, 3, 4, 5].map(i => (doc3.getWithType('1@aaaa', i) || [])[1]), ['a', 'b', 'c', 'd', 'e', 'f']) + assert.deepEqual([0, 1, 2, 3, 4, 5].map(i => (doc4.getWithType('1@aaaa', i) || [])[1]), ['a', 'b', 'c', 'd', 'e', 'f']) + assert.deepEqual(doc3.popPatches(), [ + { action: 'insert', path: ['values', 2], values: ['c','d','e','f'] }, + ]) + assert.deepEqual(doc4.popPatches(), [ + { action: 'insert', path: ['values', 2], values: ['c','d','e','f'] }, + ]) + }) + + it('should handle conflicts on root object keys', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc'), doc4 = create(true, 'dddd') + doc1.put('_root', 'bird', 'Greenfinch') + doc2.put('_root', 'bird', 'Goldfinch') + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental() + doc3.enablePatches(true) + doc4.enablePatches(true) + doc3.loadIncremental(change1); doc3.loadIncremental(change2) + doc4.loadIncremental(change2); doc4.loadIncremental(change1) + assert.deepEqual(doc3.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc3.getAll('_root', 'bird'), [['str', 'Greenfinch', '1@aaaa'], ['str', 'Goldfinch', '1@bbbb']]) + assert.deepEqual(doc4.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc4.getAll('_root', 'bird'), [['str', 'Greenfinch', '1@aaaa'], ['str', 'Goldfinch', '1@bbbb']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Greenfinch' }, + { action: 'put', path: ['bird'], value: 'Goldfinch' }, + ]) + assert.deepEqual(doc4.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Goldfinch' }, + ]) + }) + + it('should handle three-way conflicts', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc') + doc1.put('_root', 'bird', 'Greenfinch') + doc2.put('_root', 'bird', 'Chaffinch') + doc3.put('_root', 'bird', 'Goldfinch') + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental(), change3 = doc3.saveIncremental() + doc1.enablePatches(true) + doc2.enablePatches(true) + doc3.enablePatches(true) + doc1.loadIncremental(change2); doc1.loadIncremental(change3) + doc2.loadIncremental(change3); doc2.loadIncremental(change1) + doc3.loadIncremental(change1); doc3.loadIncremental(change2) + assert.deepEqual(doc1.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc1.getAll('_root', 'bird'), [ + ['str', 'Greenfinch', '1@aaaa'], ['str', 'Chaffinch', '1@bbbb'], ['str', 'Goldfinch', '1@cccc'] + ]) + assert.deepEqual(doc2.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc2.getAll('_root', 'bird'), [ + ['str', 'Greenfinch', '1@aaaa'], ['str', 'Chaffinch', '1@bbbb'], ['str', 'Goldfinch', '1@cccc'] + ]) + assert.deepEqual(doc3.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc3.getAll('_root', 'bird'), [ + ['str', 'Greenfinch', '1@aaaa'], ['str', 'Chaffinch', '1@bbbb'], ['str', 'Goldfinch', '1@cccc'] + ]) + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Chaffinch' }, + { action: 'put', path: ['bird'], value: 'Goldfinch' } + ]) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Goldfinch' }, + ]) + assert.deepEqual(doc3.popPatches(), [ ]) + }) + + it('should allow a conflict to be resolved', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc') + doc1.put('_root', 'bird', 'Greenfinch') + doc2.put('_root', 'bird', 'Chaffinch') + doc3.enablePatches(true) + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental() + doc1.loadIncremental(change2); doc3.loadIncremental(change1) + doc2.loadIncremental(change1); doc3.loadIncremental(change2) + doc1.put('_root', 'bird', 'Goldfinch') + doc3.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc3.getAll('_root', 'bird'), [['str', 'Goldfinch', '2@aaaa']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Greenfinch' }, + { action: 'put', path: ['bird'], value: 'Chaffinch' }, + { action: 'put', path: ['bird'], value: 'Goldfinch' } + ]) + }) + + it('should handle a concurrent map key overwrite and delete', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.put('_root', 'bird', 'Greenfinch') + doc2.loadIncremental(doc1.saveIncremental()) + doc1.put('_root', 'bird', 'Goldfinch') + doc2.delete('_root', 'bird') + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental() + doc1.enablePatches(true) + doc2.enablePatches(true) + doc1.loadIncremental(change2) + doc2.loadIncremental(change1) + assert.deepEqual(doc1.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc1.getAll('_root', 'bird'), [['str', 'Goldfinch', '2@aaaa']]) + assert.deepEqual(doc2.getWithType('_root', 'bird'), ['str', 'Goldfinch']) + assert.deepEqual(doc2.getAll('_root', 'bird'), [['str', 'Goldfinch', '2@aaaa']]) + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Goldfinch' } + ]) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Goldfinch' } + ]) + }) + + it('should handle a conflict on a list element', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc'), doc4 = create(true, 'dddd') + doc1.putObject('_root', 'birds', ['Thrush', 'Magpie']) + const change1 = doc1.saveIncremental() + doc2.loadIncremental(change1) + doc3.loadIncremental(change1) + doc4.loadIncremental(change1) + doc1.put('1@aaaa', 0, 'Song Thrush') + doc2.put('1@aaaa', 0, 'Redwing') + const change2 = doc1.saveIncremental(), change3 = doc2.saveIncremental() + doc3.enablePatches(true) + doc4.enablePatches(true) + doc3.loadIncremental(change2); doc3.loadIncremental(change3) + doc4.loadIncremental(change3); doc4.loadIncremental(change2) + assert.deepEqual(doc3.getWithType('1@aaaa', 0), ['str', 'Redwing']) + assert.deepEqual(doc3.getAll('1@aaaa', 0), [['str', 'Song Thrush', '4@aaaa'], ['str', 'Redwing', '4@bbbb']]) + assert.deepEqual(doc4.getWithType('1@aaaa', 0), ['str', 'Redwing']) + assert.deepEqual(doc4.getAll('1@aaaa', 0), [['str', 'Song Thrush', '4@aaaa'], ['str', 'Redwing', '4@bbbb']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'put', path: ['birds',0], value: 'Song Thrush' }, + { action: 'put', path: ['birds',0], value: 'Redwing' } + ]) + assert.deepEqual(doc4.popPatches(), [ + { action: 'put', path: ['birds',0], value: 'Redwing' }, + ]) + }) + + it('should handle a concurrent list element overwrite and delete', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc'), doc4 = create(true, 'dddd') + doc1.putObject('_root', 'birds', ['Parakeet', 'Magpie', 'Thrush']) + const change1 = doc1.saveIncremental() + doc2.loadIncremental(change1) + doc3.loadIncremental(change1) + doc4.loadIncremental(change1) + doc1.delete('1@aaaa', 0) + doc1.put('1@aaaa', 1, 'Song Thrush') + doc2.put('1@aaaa', 0, 'Ring-necked parakeet') + doc2.put('1@aaaa', 2, 'Redwing') + const change2 = doc1.saveIncremental(), change3 = doc2.saveIncremental() + doc3.enablePatches(true) + doc4.enablePatches(true) + doc3.loadIncremental(change2); doc3.loadIncremental(change3) + doc4.loadIncremental(change3); doc4.loadIncremental(change2) + assert.deepEqual(doc3.getAll('1@aaaa', 0), [['str', 'Ring-necked parakeet', '5@bbbb']]) + assert.deepEqual(doc3.getAll('1@aaaa', 2), [['str', 'Song Thrush', '6@aaaa'], ['str', 'Redwing', '6@bbbb']]) + assert.deepEqual(doc4.getAll('1@aaaa', 0), [['str', 'Ring-necked parakeet', '5@bbbb']]) + assert.deepEqual(doc4.getAll('1@aaaa', 2), [['str', 'Song Thrush', '6@aaaa'], ['str', 'Redwing', '6@bbbb']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'del', path: ['birds',0], }, + { action: 'put', path: ['birds',1], value: 'Song Thrush' }, + { action: 'insert', path: ['birds',0], values: ['Ring-necked parakeet'] }, + { action: 'put', path: ['birds',2], value: 'Redwing' } + ]) + assert.deepEqual(doc4.popPatches(), [ + { action: 'put', path: ['birds',0], value: 'Ring-necked parakeet' }, + { action: 'put', path: ['birds',2], value: 'Redwing' }, + { action: 'put', path: ['birds',0], value: 'Ring-necked parakeet' }, + ]) + }) + + it('should handle deletion of a conflict value', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), doc3 = create(true, 'cccc') + doc1.put('_root', 'bird', 'Robin') + doc2.put('_root', 'bird', 'Wren') + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental() + doc2.delete('_root', 'bird') + const change3 = doc2.saveIncremental() + doc3.enablePatches(true) + doc3.loadIncremental(change1) + doc3.loadIncremental(change2) + assert.deepEqual(doc3.getAll('_root', 'bird'), [['str', 'Robin', '1@aaaa'], ['str', 'Wren', '1@bbbb']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Robin' }, + { action: 'put', path: ['bird'], value: 'Wren' } + ]) + doc3.loadIncremental(change3) + assert.deepEqual(doc3.getWithType('_root', 'bird'), ['str', 'Robin']) + assert.deepEqual(doc3.getAll('_root', 'bird'), [['str', 'Robin', '1@aaaa']]) + assert.deepEqual(doc3.popPatches(), [ + { action: 'put', path: ['bird'], value: 'Robin' } + ]) + }) + + it('should handle conflicting nested objects', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc1.putObject('_root', 'birds', ['Parakeet']) + doc2.putObject('_root', 'birds', { 'Sparrowhawk': 1 }) + const change1 = doc1.saveIncremental(), change2 = doc2.saveIncremental() + doc1.enablePatches(true) + doc2.enablePatches(true) + doc1.loadIncremental(change2) + doc2.loadIncremental(change1) + assert.deepEqual(doc1.getAll('_root', 'birds'), [['list', '1@aaaa'], ['map', '1@bbbb']]) + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['birds'], value: {} }, + { action: 'put', path: ['birds', 'Sparrowhawk'], value: 1 } + ]) + assert.deepEqual(doc2.getAll('_root', 'birds'), [['list', '1@aaaa'], ['map', '1@bbbb']]) + assert.deepEqual(doc2.popPatches(), []) + }) + + it('should support date objects', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb'), now = new Date() + doc1.put('_root', 'createdAt', now) + doc2.enablePatches(true) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.getWithType('_root', 'createdAt'), ['timestamp', now]) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['createdAt'], value: now } + ]) + }) + + it('should capture local put ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + doc1.put('_root', 'key1', 1) + doc1.put('_root', 'key1', 2) + doc1.put('_root', 'key2', 3) + doc1.putObject('_root', 'map', {}) + doc1.putObject('_root', 'list', []) + + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['key1'], value: 1 }, + { action: 'put', path: ['key1'], value: 2 }, + { action: 'put', path: ['key2'], value: 3 }, + { action: 'put', path: ['map'], value: {} }, + { action: 'put', path: ['list'], value: [] }, + ]) + }) + + it('should capture local insert ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + const list = doc1.putObject('_root', 'list', []) + doc1.insert(list, 0, 1) + doc1.insert(list, 0, 2) + doc1.insert(list, 2, 3) + doc1.insertObject(list, 2, {}) + doc1.insertObject(list, 2, []) + + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['list'], value: [] }, + { action: 'insert', path: ['list', 0], values: [2,1,[],{},3] }, + ]) + }) + + it('should capture local push ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + const list = doc1.putObject('_root', 'list', []) + doc1.push(list, 1) + doc1.pushObject(list, {}) + doc1.pushObject(list, []) + + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['list'], value: [] }, + { action: 'insert', path: ['list',0], values: [1,{},[]] }, + ]) + }) + + it('should capture local splice ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + const list = doc1.putObject('_root', 'list', []) + doc1.splice(list, 0, 0, [1, 2, 3, 4]) + doc1.splice(list, 1, 2) + + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['list'], value: [] }, + { action: 'insert', path: ['list',0], values: [1,4] }, + ]) + }) + + it('should capture local increment ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + doc1.put('_root', 'counter', 2, 'counter') + doc1.increment('_root', 'counter', 4) + + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['counter'], value: 2 }, + { action: 'inc', path: ['counter'], value: 4 }, + ]) + }) + + + it('should capture local delete ops', () => { + const doc1 = create(true, 'aaaa') + doc1.enablePatches(true) + doc1.put('_root', 'key1', 1) + doc1.put('_root', 'key2', 2) + doc1.delete('_root', 'key1') + doc1.delete('_root', 'key2') + assert.deepEqual(doc1.popPatches(), [ + { action: 'put', path: ['key1'], value: 1 }, + { action: 'put', path: ['key2'], value: 2 }, + { action: 'del', path: ['key1'], }, + { action: 'del', path: ['key2'], }, + ]) + }) + + it('should support counters in a map', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc2.enablePatches(true) + doc1.put('_root', 'starlings', 2, 'counter') + doc2.loadIncremental(doc1.saveIncremental()) + doc1.increment('_root', 'starlings', 1) + doc2.loadIncremental(doc1.saveIncremental()) + assert.deepEqual(doc2.getWithType('_root', 'starlings'), ['counter', 3]) + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['starlings'], value: 2 }, + { action: 'inc', path: ['starlings'], value: 1 } + ]) + }) + + it('should support counters in a list', () => { + const doc1 = create(true, 'aaaa'), doc2 = create(true, 'bbbb') + doc2.enablePatches(true) + const list = doc1.putObject('_root', 'list', []) + doc2.loadIncremental(doc1.saveIncremental()) + doc1.insert(list, 0, 1, 'counter') + doc2.loadIncremental(doc1.saveIncremental()) + doc1.increment(list, 0, 2) + doc2.loadIncremental(doc1.saveIncremental()) + doc1.increment(list, 0, -5) + doc2.loadIncremental(doc1.saveIncremental()) + + assert.deepEqual(doc2.popPatches(), [ + { action: 'put', path: ['list'], value: [] }, + { action: 'insert', path: ['list',0], values: [1] }, + { action: 'inc', path: ['list',0], value: 2 }, + { action: 'inc', path: ['list',0], value: -5 }, + ]) + }) + + it('should delete a counter from a map') // TODO + }) + + describe('sync', () => { + it('should send a sync message implying no local data', () => { + const doc = create(true) + const s1 = initSyncState() + const m1 = doc.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") } + const message: DecodedSyncMessage = decodeSyncMessage(m1) + assert.deepStrictEqual(message.heads, []) + assert.deepStrictEqual(message.need, []) + assert.deepStrictEqual(message.have.length, 1) + assert.deepStrictEqual(message.have[0].lastSync, []) + assert.deepStrictEqual(message.have[0].bloom.byteLength, 0) + assert.deepStrictEqual(message.changes, []) + }) + + it('should not reply if we have no data as well', () => { + const n1 = create(true), n2 = create(true) + const s1 = initSyncState(), s2 = initSyncState() + const m1 = n1.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") } + n2.receiveSyncMessage(s2, m1) + const m2 = n2.generateSyncMessage(s2) + assert.deepStrictEqual(m2, null) + }) + + it('repos with equal heads do not need a reply message', () => { + const n1 = create(true), n2 = create(true) + const s1 = initSyncState(), s2 = initSyncState() + + // make two nodes with the same changes + const list = n1.putObject("_root", "n", []) + n1.commit("", 0) + for (let i = 0; i < 10; i++) { + n1.insert(list, i, i) + n1.commit("", 0) + } + n2.applyChanges(n1.getChanges([])) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + + // generate a naive sync message + const m1 = n1.generateSyncMessage(s1) + if (m1 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(s1.lastSentHeads, n1.getHeads()) + + // heads are equal so this message should be null + n2.receiveSyncMessage(s2, m1) + const m2 = n2.generateSyncMessage(s2) + assert.strictEqual(m2, null) + }) + + it('n1 should offer all changes to n2 when starting from nothing', () => { + const n1 = create(true), n2 = create(true) + + // make changes for n1 that n2 should request + const list = n1.putObject("_root", "n", []) + n1.commit("", 0) + for (let i = 0; i < 10; i++) { + n1.insert(list, i, i) + n1.commit("", 0) + } + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should sync peers where one has commits the other does not', () => { + const n1 = create(true), n2 = create(true) + + // make changes for n1 that n2 should request + const list = n1.putObject("_root", "n", []) + n1.commit("", 0) + for (let i = 0; i < 10; i++) { + n1.insert(list, i, i) + n1.commit("", 0) + } + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should work with prior sync state', () => { + // create & synchronize two nodes + const n1 = create(true), n2 = create(true) + const s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + // modify the first node further + for (let i = 5; i < 10; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should not generate messages once synced', () => { + // create & synchronize two nodes + const n1 = create(true, 'abc123'), n2 = create(true, 'def456') + const s1 = initSyncState(), s2 = initSyncState() + + let message + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + for (let i = 0; i < 5; i++) { + n2.put("_root", "y", i) + n2.commit("", 0) + } + + // n1 reports what it has + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + + // n2 receives that message and sends changes along with what it has + n2.receiveSyncMessage(s2, message) + message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 5) + //assert.deepStrictEqual(patch, null) // no changes arrived + + // n1 receives the changes and replies with the changes it now knows that n2 needs + n1.receiveSyncMessage(s1, message) + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 5) + + // n2 applies the changes and sends confirmation ending the exchange + n2.receiveSyncMessage(s2, message) + message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be null") } + + // n1 receives the message and has nothing more to say + n1.receiveSyncMessage(s1, message) + message = n1.generateSyncMessage(s1) + assert.deepStrictEqual(message, null) + //assert.deepStrictEqual(patch, null) // no changes arrived + + // n2 also has nothing left to say + message = n2.generateSyncMessage(s2) + assert.deepStrictEqual(message, null) + }) + + it('should allow simultaneous messages during synchronization', () => { + // create & synchronize two nodes + const n1 = create(true, 'abc123'), n2 = create(true, 'def456') + const s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + for (let i = 0; i < 5; i++) { + n2.put("_root", "y", i) + n2.commit("", 0) + } + + const head1 = n1.getHeads()[0], head2 = n2.getHeads()[0] + + // both sides report what they have but have no shared peer state + let msg1to2, msg2to1 + msg1to2 = n1.generateSyncMessage(s1) + msg2to1 = n2.generateSyncMessage(s2) + if (msg1to2 === null) { throw new RangeError("message should not be null") } + if (msg2to1 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) + assert.deepStrictEqual(decodeSyncMessage(msg1to2).have[0].lastSync.length, 0) + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) + assert.deepStrictEqual(decodeSyncMessage(msg2to1).have[0].lastSync.length, 0) + + // n1 and n2 receive that message and update sync state but make no patch + n1.receiveSyncMessage(s1, msg2to1) + n2.receiveSyncMessage(s2, msg1to2) + + // now both reply with their local changes the other lacks + // (standard warning that 1% of the time this will result in a "need" message) + msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 5) + msg2to1 = n2.generateSyncMessage(s2) + if (msg2to1 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 5) + + // both should now apply the changes and update the frontend + n1.receiveSyncMessage(s1, msg2to1) + assert.deepStrictEqual(n1.getMissingDeps(), []) + //assert.notDeepStrictEqual(patch1, null) + assert.deepStrictEqual(n1.materialize(), { x: 4, y: 4 }) + + n2.receiveSyncMessage(s2, msg1to2) + assert.deepStrictEqual(n2.getMissingDeps(), []) + //assert.notDeepStrictEqual(patch2, null) + assert.deepStrictEqual(n2.materialize(), { x: 4, y: 4 }) + + // The response acknowledges the changes received and sends no further changes + msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg1to2).changes.length, 0) + msg2to1 = n2.generateSyncMessage(s2) + if (msg2to1 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg2to1).changes.length, 0) + + // After receiving acknowledgements, their shared heads should be equal + n1.receiveSyncMessage(s1, msg2to1) + n2.receiveSyncMessage(s2, msg1to2) + assert.deepStrictEqual(s1.sharedHeads, [head1, head2].sort()) + assert.deepStrictEqual(s2.sharedHeads, [head1, head2].sort()) + //assert.deepStrictEqual(patch1, null) + //assert.deepStrictEqual(patch2, null) + + // We're in sync, no more messages required + msg1to2 = n1.generateSyncMessage(s1) + msg2to1 = n2.generateSyncMessage(s2) + assert.deepStrictEqual(msg1to2, null) + assert.deepStrictEqual(msg2to1, null) + + // If we make one more change and start another sync then its lastSync should be updated + n1.put("_root", "x", 5) + msg1to2 = n1.generateSyncMessage(s1) + if (msg1to2 === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(msg1to2).have[0].lastSync, [head1, head2].sort()) + }) + + it('should assume sent changes were received until we hear otherwise', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + const s1 = initSyncState(), s2 = initSyncState() + let message = null + + const items = n1.putObject("_root", "items", []) + n1.commit("", 0) + + sync(n1, n2, s1, s2) + + n1.push(items, "x") + n1.commit("", 0) + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + + n1.push(items, "y") + n1.commit("", 0) + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + + n1.push(items, "z") + n1.commit("", 0) + + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).changes.length, 1) + }) + + it('should work regardless of who initiates the exchange', () => { + // create & synchronize two nodes + const n1 = create(true), n2 = create(true) + const s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + // modify the first node further + for (let i = 5; i < 10; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should work without prior sync state', () => { + // Scenario: ,-- c10 <-- c11 <-- c12 <-- c13 <-- c14 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- c15 <-- c16 <-- c17 + // lastSync is undefined. + + // create two peers both with divergent commits + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + //const s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 10; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2) + + for (let i = 10; i < 15; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + for (let i = 15; i < 18; i++) { + n2.put("_root", "x", i) + n2.commit("", 0) + } + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should work with prior sync state', () => { + // Scenario: ,-- c10 <-- c11 <-- c12 <-- c13 <-- c14 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- c15 <-- c16 <-- c17 + // lastSync is c9. + + // create two peers both with divergent commits + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + let s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 10; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + for (let i = 10; i < 15; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + for (let i = 15; i < 18; i++) { + n2.put("_root", "x", i) + n2.commit("", 0) + } + + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + assert.notDeepStrictEqual(n1.materialize(), n2.materialize()) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should ensure non-empty state after sync', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + const s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + assert.deepStrictEqual(s1.sharedHeads, n1.getHeads()) + assert.deepStrictEqual(s2.sharedHeads, n1.getHeads()) + }) + + it('should re-sync after one node crashed with data loss', () => { + // Scenario: (r) (n2) (n1) + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 + // n2 has changes {c0, c1, c2}, n1's lastSync is c5, and n2's lastSync is c2. + // we want to successfully sync (n1) with (r), even though (n1) believes it's talking to (n2) + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + let s1 = initSyncState() + const s2 = initSyncState() + + // n1 makes three changes, which we sync to n2 + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + // save a copy of n2 as "r" to simulate recovering from a crash + let r + let rSyncState + ;[r, rSyncState] = [n2.clone(), s2.clone()] + + // sync another few commits + for (let i = 3; i < 6; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + // everyone should be on the same page here + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + + // now make a few more changes and then attempt to sync the fully-up-to-date n1 with the confused r + for (let i = 6; i < 9; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + s1 = decodeSyncState(encodeSyncState(s1)) + rSyncState = decodeSyncState(encodeSyncState(rSyncState)) + + assert.notDeepStrictEqual(n1.getHeads(), r.getHeads()) + assert.notDeepStrictEqual(n1.materialize(), r.materialize()) + assert.deepStrictEqual(n1.materialize(), { x: 8 }) + assert.deepStrictEqual(r.materialize(), { x: 2 }) + sync(n1, r, s1, rSyncState) + assert.deepStrictEqual(n1.getHeads(), r.getHeads()) + assert.deepStrictEqual(n1.materialize(), r.materialize()) + r = null + }) + + it('should re-sync after one node experiences data loss without disconnecting', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + const s1 = initSyncState(), s2 = initSyncState() + + // n1 makes three changes, which we sync to n2 + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i) + n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + + const n2AfterDataLoss = create(true, '89abcdef') + + // "n2" now has no data, but n1 still thinks it does. Note we don't do + // decodeSyncState(encodeSyncState(s1)) in order to simulate data loss without disconnecting + sync(n1, n2AfterDataLoss, s1, initSyncState()) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should handle changes concurrent to the last sync heads', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef'), n3 = create(true, 'fedcba98') + const s12 = initSyncState(), s21 = initSyncState(), s23 = initSyncState(), s32 = initSyncState() + + // Change 1 is known to all three nodes + //n1 = Automerge.change(n1, {time: 0}, doc => doc.x = 1) + n1.put("_root", "x", 1); n1.commit("", 0) + + sync(n1, n2, s12, s21) + sync(n2, n3, s23, s32) + + // Change 2 is known to n1 and n2 + n1.put("_root", "x", 2); n1.commit("", 0) + + sync(n1, n2, s12, s21) + + // Each of the three nodes makes one change (changes 3, 4, 5) + n1.put("_root", "x", 3); n1.commit("", 0) + n2.put("_root", "x", 4); n2.commit("", 0) + n3.put("_root", "x", 5); n3.commit("", 0) + + // Apply n3's latest change to n2. If running in Node, turn the Uint8Array into a Buffer, to + // simulate transmission over a network (see https://github.com/automerge/automerge/pull/362) + let change = n3.getLastLocalChange() + if (change === null) throw new RangeError("no local change") + //ts-ignore + if (typeof Buffer === 'function') change = Buffer.from(change) + if (change === undefined) { throw new RangeError("last local change failed") } + n2.applyChanges([change]) + + // Now sync n1 and n2. n3's change is concurrent to n1 and n2's last sync heads + sync(n1, n2, s12, s21) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should handle histories with lots of branching and merging', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef'), n3 = create(true, 'fedcba98') + n1.put("_root", "x", 0); n1.commit("", 0) + const change1 = n1.getLastLocalChange() + if (change1 === null) throw new RangeError("no local change") + n2.applyChanges([change1]) + const change2 = n1.getLastLocalChange() + if (change2 === null) throw new RangeError("no local change") + n3.applyChanges([change2]) + n3.put("_root", "x", 1); n3.commit("", 0) + + // - n1c1 <------ n1c2 <------ n1c3 <-- etc. <-- n1c20 <------ n1c21 + // / \/ \/ \/ + // / /\ /\ /\ + // c0 <---- n2c1 <------ n2c2 <------ n2c3 <-- etc. <-- n2c20 <------ n2c21 + // \ / + // ---------------------------------------------- n3c1 <----- + for (let i = 1; i < 20; i++) { + n1.put("_root", "n1", i); n1.commit("", 0) + n2.put("_root", "n2", i); n2.commit("", 0) + const change1 = n1.getLastLocalChange() + if (change1 === null) throw new RangeError("no local change") + const change2 = n2.getLastLocalChange() + if (change2 === null) throw new RangeError("no local change") + n1.applyChanges([change2]) + n2.applyChanges([change1]) + } + + const s1 = initSyncState(), s2 = initSyncState() + sync(n1, n2, s1, s2) + + // Having n3's last change concurrent to the last sync heads forces us into the slower code path + const change3 = n3.getLastLocalChange() + if (change3 === null) throw new RangeError("no local change") + n2.applyChanges([change3]) + n1.put("_root", "n1", "final"); n1.commit("", 0) + n2.put("_root", "n2", "final"); n2.commit("", 0) + + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + assert.deepStrictEqual(n1.materialize(), n2.materialize()) + }) + + it('should handle a false-positive head', () => { + // Scenario: ,-- n1 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2 + // where n2 is a false positive in the Bloom filter containing {n1}. + // lastSync is c9. + let n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + let s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 10; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + for (let i = 1; ; i++) { // search for false positive; see comment above + const n1up = n1.clone('01234567'); + n1up.put("_root", "x", `${i} @ n1`); n1up.commit("", 0) + const n2up = n2.clone('89abcdef'); + n2up.put("_root", "x", `${i} @ n2`); n2up.commit("", 0) + if (new BloomFilter(n1up.getHeads()).containsHash(n2up.getHeads()[0])) { + n1 = n1up; n2 = n2up; break + } + } + const allHeads = [...n1.getHeads(), ...n2.getHeads()].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), allHeads) + assert.deepStrictEqual(n2.getHeads(), allHeads) + }) + + + describe('with a false-positive dependency', () => { + let n1: Automerge, n2: Automerge, s1: SyncState, s2: SyncState, n1hash2: Hash, n2hash2: Hash + + beforeEach(() => { + // Scenario: ,-- n1c1 <-- n1c2 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2c1 <-- n2c2 + // where n2c1 is a false positive in the Bloom filter containing {n1c1, n1c2}. + // lastSync is c9. + n1 = create(true, '01234567') + n2 = create(true, '89abcdef') + s1 = initSyncState() + s2 = initSyncState() + for (let i = 0; i < 10; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + sync(n1, n2, s1, s2) + + let n1hash1, n2hash1 + for (let i = 29; ; i++) { // search for false positive; see comment above + const n1us1 = n1.clone('01234567') + n1us1.put("_root", "x", `${i} @ n1`); n1us1.commit("", 0) + + const n2us1 = n2.clone('89abcdef') + n2us1.put("_root", "x", `${i} @ n1`); n2us1.commit("", 0) + + n1hash1 = n1us1.getHeads()[0]; n2hash1 = n2us1.getHeads()[0] + + const n1us2 = n1us1.clone(); + n1us2.put("_root", "x", `final @ n1`); n1us2.commit("", 0) + + const n2us2 = n2us1.clone(); + n2us2.put("_root", "x", `final @ n2`); n2us2.commit("", 0) + + n1hash2 = n1us2.getHeads()[0]; n2hash2 = n2us2.getHeads()[0] + if (new BloomFilter([n1hash1, n1hash2]).containsHash(n2hash1)) { + n1 = n1us2; n2 = n2us2; break + } + } + }) + + it('should sync two nodes without connection reset', () => { + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), [n1hash2, n2hash2].sort()) + assert.deepStrictEqual(n2.getHeads(), [n1hash2, n2hash2].sort()) + }) + + it('should sync two nodes with connection reset', () => { + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), [n1hash2, n2hash2].sort()) + assert.deepStrictEqual(n2.getHeads(), [n1hash2, n2hash2].sort()) + }) + + it('should sync three nodes', () => { + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + // First n1 and n2 exchange Bloom filters + let m1, m2 + m1 = n1.generateSyncMessage(s1) + m2 = n2.generateSyncMessage(s2) + if (m1 === null) { throw new RangeError("message should not be null") } + if (m2 === null) { throw new RangeError("message should not be null") } + n1.receiveSyncMessage(s1, m2) + n2.receiveSyncMessage(s2, m1) + + // Then n1 and n2 send each other their changes, except for the false positive + m1 = n1.generateSyncMessage(s1) + m2 = n2.generateSyncMessage(s2) + if (m1 === null) { throw new RangeError("message should not be null") } + if (m2 === null) { throw new RangeError("message should not be null") } + n1.receiveSyncMessage(s1, m2) + n2.receiveSyncMessage(s2, m1) + assert.strictEqual(decodeSyncMessage(m1).changes.length, 2) // n1c1 and n1c2 + assert.strictEqual(decodeSyncMessage(m2).changes.length, 1) // only n2c2; change n2c1 is not sent + + // n3 is a node that doesn't have the missing change. Nevertheless n1 is going to ask n3 for it + const n3 = create(true, 'fedcba98'), s13 = initSyncState(), s31 = initSyncState() + sync(n1, n3, s13, s31) + assert.deepStrictEqual(n1.getHeads(), [n1hash2]) + assert.deepStrictEqual(n3.getHeads(), [n1hash2]) + }) + }) + + it('should not require an additional request when a false-positive depends on a true-negative', () => { + // Scenario: ,-- n1c1 <-- n1c2 <-- n1c3 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-+ + // `-- n2c1 <-- n2c2 <-- n2c3 + // where n2c2 is a false positive in the Bloom filter containing {n1c1, n1c2, n1c3}. + // lastSync is c4. + let n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + let s1 = initSyncState(), s2 = initSyncState() + let n1hash3, n2hash3 + + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + sync(n1, n2, s1, s2) + for (let i = 86; ; i++) { // search for false positive; see comment above + const n1us1 = n1.clone('01234567') + n1us1.put("_root", "x", `${i} @ n1`); n1us1.commit("", 0) + + const n2us1 = n2.clone('89abcdef') + n2us1.put("_root", "x", `${i} @ n2`); n2us1.commit("", 0) + + //const n1us1 = Automerge.change(Automerge.clone(n1, {actorId: '01234567'}), {time: 0}, doc => doc.x = `${i} @ n1`) + //const n2us1 = Automerge.change(Automerge.clone(n2, {actorId: '89abcdef'}), {time: 0}, doc => doc.x = `${i} @ n2`) + const n1hash1 = n1us1.getHeads()[0] + + const n1us2 = n1us1.clone() + n1us2.put("_root", "x", `${i + 1} @ n1`); n1us2.commit("", 0) + + const n2us2 = n2us1.clone() + n2us2.put("_root", "x", `${i + 1} @ n2`); n2us2.commit("", 0) + + const n1hash2 = n1us2.getHeads()[0], n2hash2 = n2us2.getHeads()[0] + + const n1us3 = n1us2.clone() + n1us3.put("_root", "x", `final @ n1`); n1us3.commit("", 0) + + const n2us3 = n2us2.clone() + n2us3.put("_root", "x", `final @ n2`); n2us3.commit("", 0) + + n1hash3 = n1us3.getHeads()[0]; n2hash3 = n2us3.getHeads()[0] + + if (new BloomFilter([n1hash1, n1hash2, n1hash3]).containsHash(n2hash2)) { + n1 = n1us3; n2 = n2us3; break + } + } + const bothHeads = [n1hash3, n2hash3].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), bothHeads) + assert.deepStrictEqual(n2.getHeads(), bothHeads) + }) + + it('should handle chains of false-positives', () => { + // Scenario: ,-- c5 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-+ + // `-- n2c1 <-- n2c2 <-- n2c3 + // where n2c1 and n2c2 are both false positives in the Bloom filter containing {c5}. + // lastSync is c4. + const n1 = create(true, '01234567') + let n2 = create(true, '89abcdef') + let s1 = initSyncState(), s2 = initSyncState() + + for (let i = 0; i < 5; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + n1.put("_root", "x", 5); n1.commit("", 0) + + for (let i = 2; ; i++) { // search for false positive; see comment above + const n2us1 = n2.clone('89abcdef') + n2us1.put("_root", "x", `${i} @ n2`); n2us1.commit("", 0) + if (new BloomFilter(n1.getHeads()).containsHash(n2us1.getHeads()[0])) { + n2 = n2us1; break + } + } + for (let i = 141; ; i++) { // search for false positive; see comment above + const n2us2 = n2.clone('89abcdef') + n2us2.put("_root", "x", `${i} again`); n2us2.commit("", 0) + if (new BloomFilter(n1.getHeads()).containsHash(n2us2.getHeads()[0])) { + n2 = n2us2; break + } + } + n2.put("_root", "x", `final @ n2`); n2.commit("", 0) + + const allHeads = [...n1.getHeads(), ...n2.getHeads()].sort() + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + sync(n1, n2, s1, s2) + assert.deepStrictEqual(n1.getHeads(), allHeads) + assert.deepStrictEqual(n2.getHeads(), allHeads) + }) + + it('should allow the false-positive hash to be explicitly requested', () => { + // Scenario: ,-- n1 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2 + // where n2 causes a false positive in the Bloom filter containing {n1}. + let n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + let s1 = initSyncState(), s2 = initSyncState() + let message + + for (let i = 0; i < 10; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + + for (let i = 1; ; i++) { // brute-force search for false positive; see comment above + const n1up = n1.clone('01234567'); n1up.put("_root", "x", `${i} @ n1`); n1up.commit("", 0) + const n2up = n1.clone('89abcdef'); n2up.put("_root", "x", `${i} @ n2`); n2up.commit("", 0) + + // check if the bloom filter on n2 will believe n1 already has a particular hash + // this will mean n2 won't offer that data to n2 by receiving a sync message from n1 + if (new BloomFilter(n1up.getHeads()).containsHash(n2up.getHeads()[0])) { + n1 = n1up; n2 = n2up; break + } + } + + // n1 creates a sync message for n2 with an ill-fated bloom + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message).changes.length, 0) + + // n2 receives it and DOESN'T send a change back + n2.receiveSyncMessage(s2, message) + message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message).changes.length, 0) + + // n1 should now realize it's missing that change and request it explicitly + n1.receiveSyncMessage(s1, message) + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + assert.deepStrictEqual(decodeSyncMessage(message).need, n2.getHeads()) + + // n2 should fulfill that request + n2.receiveSyncMessage(s2, message) + message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message).changes.length, 1) + + // n1 should apply the change and the two should now be in sync + n1.receiveSyncMessage(s1, message) + assert.deepStrictEqual(n1.getHeads(), n2.getHeads()) + }) + + describe('protocol features', () => { + it('should allow multiple Bloom filters', () => { + // Scenario: ,-- n1c1 <-- n1c2 <-- n1c3 + // c0 <-- c1 <-- c2 <-+--- n2c1 <-- n2c2 <-- n2c3 + // `-- n3c1 <-- n3c2 <-- n3c3 + // n1 has {c0, c1, c2, n1c1, n1c2, n1c3, n2c1, n2c2}; + // n2 has {c0, c1, c2, n1c1, n1c2, n2c1, n2c2, n2c3}; + // n3 has {c0, c1, c2, n3c1, n3c2, n3c3}. + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef'), n3 = create(true, '76543210') + let s13 = initSyncState() + const s12 = initSyncState() + const s21 = initSyncState() + let s32 = initSyncState(), s31 = initSyncState(), s23 = initSyncState() + let message1, message3 + + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + // sync all 3 nodes + sync(n1, n2, s12, s21) // eslint-disable-line no-unused-vars -- kept for consistency + sync(n1, n3, s13, s31) + sync(n3, n2, s32, s23) + for (let i = 0; i < 2; i++) { + n1.put("_root", "x", `${i} @ n1`); n1.commit("", 0) + } + for (let i = 0; i < 2; i++) { + n2.put("_root", "x", `${i} @ n2`); n2.commit("", 0) + } + n1.applyChanges(n2.getChanges([])) + n2.applyChanges(n1.getChanges([])) + n1.put("_root", "x", `3 @ n1`); n1.commit("", 0) + n2.put("_root", "x", `3 @ n2`); n2.commit("", 0) + + for (let i = 0; i < 3; i++) { + n3.put("_root", "x", `${i} @ n3`); n3.commit("", 0) + } + const n1c3 = n1.getHeads()[0], n2c3 = n2.getHeads()[0], n3c3 = n3.getHeads()[0] + s13 = decodeSyncState(encodeSyncState(s13)) + s31 = decodeSyncState(encodeSyncState(s31)) + s23 = decodeSyncState(encodeSyncState(s23)) + s32 = decodeSyncState(encodeSyncState(s32)) + + + // Now n3 concurrently syncs with n1 and n2. Doing this naively would result in n3 receiving + // changes {n1c1, n1c2, n2c1, n2c2} twice (those are the changes that both n1 and n2 have, but + // that n3 does not have). We want to prevent this duplication. + message1 = n1.generateSyncMessage(s13) // message from n1 to n3 + if (message1 === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message1).changes.length, 0) + n3.receiveSyncMessage(s31, message1) + message3 = n3.generateSyncMessage(s31) // message from n3 to n1 + if (message3 === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message3).changes.length, 3) // {n3c1, n3c2, n3c3} + n1.receiveSyncMessage(s13, message3) + + // Copy the Bloom filter received from n1 into the message sent from n3 to n2. This Bloom + // filter indicates what changes n3 is going to receive from n1. + message3 = n3.generateSyncMessage(s32) // message from n3 to n2 + if (message3 === null) { throw new RangeError("message should not be null") } + const modifiedMessage = decodeSyncMessage(message3) + modifiedMessage.have.push(decodeSyncMessage(message1).have[0]) + assert.strictEqual(modifiedMessage.changes.length, 0) + n2.receiveSyncMessage(s23, encodeSyncMessage(modifiedMessage)) + + // n2 replies to n3, sending only n2c3 (the one change that n2 has but n1 doesn't) + const message2 = n2.generateSyncMessage(s23) + if (message2 === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message2).changes.length, 1) // {n2c3} + n3.receiveSyncMessage(s32, message2) + + // n1 replies to n3 + message1 = n1.generateSyncMessage(s13) + if (message1 === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message1).changes.length, 5) // {n1c1, n1c2, n1c3, n2c1, n2c2} + n3.receiveSyncMessage(s31, message1) + assert.deepStrictEqual(n3.getHeads(), [n1c3, n2c3, n3c3].sort()) + }) + + it('should allow any change to be requested', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + const s1 = initSyncState(), s2 = initSyncState() + let message = null + + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + const lastSync = n1.getHeads() + + for (let i = 3; i < 6; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + sync(n1, n2, s1, s2) + s1.lastSentHeads = [] // force generateSyncMessage to return a message even though nothing changed + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + const modMsg = decodeSyncMessage(message) + modMsg.need = lastSync // re-request change 2 + n2.receiveSyncMessage(s2, encodeSyncMessage(modMsg)) + message = n2.generateSyncMessage(s2) + if (message === null) { throw new RangeError("message should not be null") } + assert.strictEqual(decodeSyncMessage(message).changes.length, 1) + assert.strictEqual(decodeChange(decodeSyncMessage(message).changes[0]).hash, lastSync[0]) + }) + + it('should ignore requests for a nonexistent change', () => { + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef') + const s1 = initSyncState(), s2 = initSyncState() + let message = null + + for (let i = 0; i < 3; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + + n2.applyChanges(n1.getChanges([])) + message = n1.generateSyncMessage(s1) + if (message === null) { throw new RangeError("message should not be null") } + message = decodeSyncMessage(message) + message.need = ['0000000000000000000000000000000000000000000000000000000000000000'] + message = encodeSyncMessage(message) + n2.receiveSyncMessage(s2, message) + message = n2.generateSyncMessage(s2) + assert.strictEqual(message, null) + }) + + it('should allow a subset of changes to be sent', () => { + // ,-- c1 <-- c2 + // c0 <-+ + // `-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 + const n1 = create(true, '01234567'), n2 = create(true, '89abcdef'), n3 = create(true, '76543210') + let s1 = initSyncState(), s2 = initSyncState() + let msg + + n1.put("_root", "x", 0); n1.commit("", 0) + n3.applyChanges(n3.getChangesAdded(n1)) // merge() + for (let i = 1; i <= 2; i++) { + n1.put("_root", "x", i); n1.commit("", 0) + } + for (let i = 3; i <= 4; i++) { + n3.put("_root", "x", i); n3.commit("", 0) + } + const c2 = n1.getHeads()[0], c4 = n3.getHeads()[0] + n2.applyChanges(n2.getChangesAdded(n3)) // merge() + + // Sync n1 and n2, so their shared heads are {c2, c4} + sync(n1, n2, s1, s2) + s1 = decodeSyncState(encodeSyncState(s1)) + s2 = decodeSyncState(encodeSyncState(s2)) + assert.deepStrictEqual(s1.sharedHeads, [c2, c4].sort()) + assert.deepStrictEqual(s2.sharedHeads, [c2, c4].sort()) + + // n2 and n3 apply {c5, c6, c7, c8} + n3.put("_root", "x", 5); n3.commit("", 0) + const change5 = n3.getLastLocalChange() + if (change5 === null) throw new RangeError("no local change") + n3.put("_root", "x", 6); n3.commit("", 0) + const change6 = n3.getLastLocalChange(), c6 = n3.getHeads()[0] + if (change6 === null) throw new RangeError("no local change") + for (let i = 7; i <= 8; i++) { + n3.put("_root", "x", i); n3.commit("", 0) + } + const c8 = n3.getHeads()[0] + n2.applyChanges(n2.getChangesAdded(n3)) // merge() + + // Now n1 initiates a sync with n2, and n2 replies with {c5, c6}. n2 does not send {c7, c8} + msg = n1.generateSyncMessage(s1) + if (msg === null) { throw new RangeError("message should not be null") } + n2.receiveSyncMessage(s2, msg) + msg = n2.generateSyncMessage(s2) + if (msg === null) { throw new RangeError("message should not be null") } + const decodedMsg = decodeSyncMessage(msg) + decodedMsg.changes = [change5, change6] + msg = encodeSyncMessage(decodedMsg) + const sentHashes: any = {} + + sentHashes[decodeChange(change5).hash] = true + sentHashes[decodeChange(change6).hash] = true + + s2.sentHashes = sentHashes + n1.receiveSyncMessage(s1, msg) + assert.deepStrictEqual(s1.sharedHeads, [c2, c6].sort()) + + // n1 replies, confirming the receipt of {c5, c6} and requesting the remaining changes + msg = n1.generateSyncMessage(s1) + if (msg === null) { throw new RangeError("message should not be null") } + n2.receiveSyncMessage(s2, msg) + assert.deepStrictEqual(decodeSyncMessage(msg).need, [c8]) + assert.deepStrictEqual(decodeSyncMessage(msg).have[0].lastSync, [c2, c6].sort()) + assert.deepStrictEqual(s1.sharedHeads, [c2, c6].sort()) + assert.deepStrictEqual(s2.sharedHeads, [c2, c6].sort()) + + // n2 sends the remaining changes {c7, c8} + msg = n2.generateSyncMessage(s2) + if (msg === null) { throw new RangeError("message should not be null") } + n1.receiveSyncMessage(s1, msg) + assert.strictEqual(decodeSyncMessage(msg).changes.length, 2) + assert.deepStrictEqual(s1.sharedHeads, [c2, c8].sort()) + }) + }) + + it('can handle overlappying splices', () => { + const doc = create(true) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + doc.putObject("/", "text", "abcdefghij") + doc.splice("/text", 2, 2, "00") + doc.splice("/text", 3, 5, "11") + mat = doc.applyPatches(mat) + assert.deepEqual(mat.text, "ab011ij") + }) + + it('can handle utf16 text', () => { + const doc = create(true) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + + doc.putObject("/", "width1", "AAAAAA") + doc.putObject("/", "width2", "🐻🐻🐻🐻🐻🐻") + doc.putObject("/", "mixed", "A🐻A🐻A🐻") + + assert.deepEqual(doc.length("/width1"), 6); + assert.deepEqual(doc.length("/width2"), 12); + assert.deepEqual(doc.length("/mixed"), 9); + + const heads1 = doc.getHeads(); + + mat = doc.applyPatches(mat) + + const remote = load(doc.save(), true) + remote.enablePatches(true) + let r_mat : any = remote.materialize("/") + + assert.deepEqual(mat, { width1: "AAAAAA", width2: "🐻🐻🐻🐻🐻🐻", mixed: "A🐻A🐻A🐻" }) + assert.deepEqual(mat.width1.slice(2,4), "AA") + assert.deepEqual(mat.width2.slice(2,4), "🐻") + assert.deepEqual(mat.mixed.slice(1,4), "🐻A") + + assert.deepEqual(r_mat, { width1: "AAAAAA", width2: "🐻🐻🐻🐻🐻🐻", mixed: "A🐻A🐻A🐻" }) + assert.deepEqual(r_mat.width1.slice(2,4), "AA") + assert.deepEqual(r_mat.width2.slice(2,4), "🐻") + assert.deepEqual(r_mat.mixed.slice(1,4), "🐻A") + + doc.splice("/width1", 2, 2, "🐻") + doc.splice("/width2", 2, 2, "A🐻A") + doc.splice("/mixed", 3, 3, "X") + + mat = doc.applyPatches(mat) + remote.loadIncremental(doc.saveIncremental()); + r_mat = remote.applyPatches(r_mat) + + assert.deepEqual(mat.width1, "AA🐻AA") + assert.deepEqual(mat.width2, "🐻A🐻A🐻🐻🐻🐻") + assert.deepEqual(mat.mixed, "A🐻XA🐻") + + assert.deepEqual(r_mat.width1, "AA🐻AA") + assert.deepEqual(r_mat.width2, "🐻A🐻A🐻🐻🐻🐻") + assert.deepEqual(r_mat.mixed, "A🐻XA🐻") + assert.deepEqual(remote.length("/width1"), 6); + assert.deepEqual(remote.length("/width2"), 14); + assert.deepEqual(remote.length("/mixed"), 7); + + // when indexing in the middle of a multibyte char it indexes at the char before + doc.splice("/width2", 4, 1, "X") + mat = doc.applyPatches(mat) + remote.loadIncremental(doc.saveIncremental()); + r_mat = remote.applyPatches(r_mat) + + assert.deepEqual(mat.width2, "🐻AXA🐻🐻🐻🐻") + + assert.deepEqual(doc.length("/width1", heads1), 6); + assert.deepEqual(doc.length("/width2", heads1), 12); + assert.deepEqual(doc.length("/mixed", heads1), 9); + + assert.deepEqual(doc.get("/mixed", 0), 'A'); + assert.deepEqual(doc.get("/mixed", 1), '🐻'); + assert.deepEqual(doc.get("/mixed", 2), '🐻'); + assert.deepEqual(doc.get("/mixed", 3), 'X'); + assert.deepEqual(doc.get("/mixed", 1, heads1), '🐻'); + assert.deepEqual(doc.get("/mixed", 2, heads1), '🐻'); + assert.deepEqual(doc.get("/mixed", 3, heads1), 'A'); + assert.deepEqual(doc.get("/mixed", 4, heads1), '🐻'); + }) + + it('can handle non-characters embedded in text', () => { + const change : any = { + ops: [ + { action: 'makeText', obj: '_root', key: 'bad_text', pred: [] }, + { action: 'set', obj: '1@aaaa', elemId: '_head', insert: true, value: 'A', pred: [] }, + { action: 'set', obj: '1@aaaa', elemId: '2@aaaa', insert: true, value: 'BBBBB', pred: [] }, + { action: 'makeMap', obj: '1@aaaa', elemId: '3@aaaa', insert: true, pred: [] }, + { action: 'set', obj: '1@aaaa', elemId: '4@aaaa', insert: true, value: 'C', pred: [] } + ], + actor: 'aaaa', + seq: 1, + startOp: 1, + time: 0, + message: null, + deps: [] + } + const doc = load(encodeChange(change), true); + doc.enablePatches(true) + const mat : any = doc.materialize("/") + + // multi - char strings appear as a span of strings + // non strings appear as an object replacement unicode char + assert.deepEqual(mat.bad_text, 'ABBBBBC') + assert.deepEqual(doc.text("/bad_text"), 'ABBBBBC') + assert.deepEqual(doc.materialize("/bad_text"), 'ABBBBBC') + + // deleting in the middle of a multi-byte character will delete the whole thing + const doc1 = doc.fork() + doc1.splice("/bad_text", 3, 3, "X"); + assert.deepEqual(doc1.text("/bad_text"), 'AXC') + + // deleting in the middle of a multi-byte character will delete the whole thing + // and characters past its end + const doc2 = doc.fork() + doc2.splice("/bad_text", 3, 4, "X"); + assert.deepEqual(doc2.text("/bad_text"), 'AXC') + + const doc3 = doc.fork() + doc3.splice("/bad_text", 3, 5, "X"); + assert.deepEqual(doc3.text("/bad_text"), 'AX') + + // inserting in the middle of a mutli-bytes span inserts after + const doc4 = doc.fork() + doc4.splice("/bad_text", 3, 0, "X"); + assert.deepEqual(doc4.text("/bad_text"), 'ABBBBBXC') + + // deleting into the middle of a multi-byte span deletes the whole thing + const doc5 = doc.fork() + doc5.splice("/bad_text", 0, 2, "X"); + assert.deepEqual(doc5.text("/bad_text"), 'XC') + + // you can access elements in the text by text index + assert.deepEqual(doc5.getAll("/bad_text", 1), [['map', '4@aaaa' ]]) + assert.deepEqual(doc5.getAll("/bad_text", 2, doc.getHeads()), [['str', 'BBBBB', '3@aaaa' ]]) + }) + }) + + describe("the legacy text implementation", () => { + const root = "_root" + class FakeText { + elems: Array + constructor(elems: string | Array) { + if (typeof elems === "string") { + this.elems = Array.from(elems) + } else { + this.elems = elems + } + } + } + it("should materialize old style text", () => { + let doc = create(false); + doc.registerDatatype("text", (e: any) => new FakeText(e)) + doc.enablePatches(true) + let txt = doc.putObject(root, "text", "") + doc.splice(txt, 0, 0, "hello") + let mat: any = doc.materialize() + assert.deepEqual(mat.text, new FakeText("hello")) + }) + + it("should apply patches to old style text", () => { + let doc = create(false); + doc.registerDatatype("text", (e: any) => new FakeText(e)) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + doc.putObject("/", "text", "abcdefghij") + doc.splice("/text", 2, 2, "00") + doc.splice("/text", 3, 5, "11") + mat = doc.applyPatches(mat) + assert.deepEqual(mat.text, new FakeText("ab011ij")) + }) + + it("should apply list patches to old style text", () => { + let doc = create(false); + doc.registerDatatype("text", (e: any) => new FakeText(e)) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + doc.putObject("/", "text", "abc") + doc.insert("/text", 0, "0") + doc.insert("/text", 1, "1") + mat = doc.applyPatches(mat) + assert.deepEqual(mat.text, new FakeText("01abc")) + }) + + it("should allow inserting using list methods", () => { + let doc = create(false); + doc.registerDatatype("text", (e: any) => new FakeText(e)) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + const txt = doc.putObject("/", "text", "abc") + doc.insert(txt, 3, "d") + doc.insert(txt, 0, "0") + mat = doc.applyPatches(mat) + assert.deepEqual(mat.text, new FakeText("0abcd")) + }) + + it("should allow inserting objects in old style text", () => { + let doc = create(false); + doc.registerDatatype("text", (e: any) => new FakeText(e)) + doc.enablePatches(true) + let mat : any = doc.materialize("/") + const txt = doc.putObject("/", "text", "abc") + doc.insertObject(txt, 0, {"key": "value"}) + doc.insertObject(txt, 2, ["elem"]) + doc.insert(txt, 2, "m") + mat = doc.applyPatches(mat) + assert.deepEqual(mat.text, new FakeText([ + {"key": "value"}, "a", "m", ["elem"], "b", "c" + ])) + }) + + class RawString { + val: string; + constructor(s: string) { + this.val = s + } + } + + it("should allow registering a different type for strings", () => { + let doc = create(false); + doc.registerDatatype("str", (e: any) => new RawString(e)) + doc.enablePatches(true) + doc.put("/", "key", "value") + let mat: any = doc.materialize() + assert.deepStrictEqual(mat.key, new RawString("value")) + }) + + it("should generate patches correctly for raw strings", () => { + let doc = create(false); + doc.registerDatatype("str", (e: any) => new RawString(e)) + doc.enablePatches(true) + let mat: any = doc.materialize() + doc.put("/", "key", "value") + mat = doc.applyPatches(mat) + assert.deepStrictEqual(mat.key, new RawString("value")) + }) + + }) +}) diff --git a/rust/automerge-wasm/tsconfig.json b/rust/automerge-wasm/tsconfig.json new file mode 100644 index 00000000..339eab93 --- /dev/null +++ b/rust/automerge-wasm/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "strict": true, + "allowJs": false, + "baseUrl": ".", + "esModuleInterop": true, + "lib": ["dom", "esnext.asynciterable", "es2017", "es2016", "es2015"], + "module": "commonjs", + "moduleResolution": "node", + "paths": { "dev": ["*"]}, + "rootDir": "", + "target": "es2016", + "types": ["mocha", "node"], + "typeRoots": ["./index.d.ts"] + }, + "include": ["test/**/*.ts"], + "exclude": ["dist/**/*", "examples/**/*"] +} diff --git a/rust/automerge/.gitignore b/rust/automerge/.gitignore new file mode 100644 index 00000000..96ef6c0b --- /dev/null +++ b/rust/automerge/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/rust/automerge/Cargo.toml b/rust/automerge/Cargo.toml new file mode 100644 index 00000000..0c10cc2b --- /dev/null +++ b/rust/automerge/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "automerge" +version = "0.3.0" +edition = "2021" +license = "MIT" +repository = "https://github.com/automerge/automerge-rs" +documentation = "https://automerge.org/automerge-rs/automerge/" +rust-version = "1.57.0" +description = "A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically" +readme = "./README.md" + +[features] +optree-visualisation = ["dot", "rand"] +wasm = ["js-sys", "wasm-bindgen", "web-sys", "uuid/js"] + +[dependencies] +hex = "^0.4.3" +leb128 = "^0.2.5" +sha2 = "^0.10.0" +thiserror = "^1.0.16" +itertools = "^0.10.3" +flate2 = "^1.0.22" +uuid = { version = "^1.2.1", features=["v4", "serde"] } +smol_str = { version = "^0.1.21", features=["serde"] } +tracing = { version = "^0.1.29" } +fxhash = "^0.2.1" +tinyvec = { version = "^1.5.1", features = ["alloc"] } +serde = { version = "^1.0", features=["derive"] } + +# optional deps +dot = { version = "0.1.4", optional = true } +js-sys = { version = "^0.3", optional = true } +wasm-bindgen = { version = "^0.2", optional = true } +rand = { version = "^0.8.4", optional = true } + +[dependencies.web-sys] +version = "^0.3.55" +features = ["console"] +optional = true + +[dev-dependencies] +pretty_assertions = "1.0.0" +proptest = { version = "^1.0.0", default-features = false, features = ["std"] } +serde_json = { version = "^1.0.73", features=["float_roundtrip"], default-features=true } +maplit = { version = "^1.0" } +criterion = "0.4.0" +test-log = { version = "0.2.10", features=["trace"], default-features = false} +tracing-subscriber = {version = "0.3.9", features = ["fmt", "env-filter"] } +automerge-test = { path = "../automerge-test" } +prettytable = "0.10.0" + +[[bench]] +name = "range" +harness = false + +[[bench]] +name = "map" +harness = false + +[[bench]] +name = "sync" +harness = false diff --git a/rust/automerge/README.md b/rust/automerge/README.md new file mode 100644 index 00000000..97dbe4f8 --- /dev/null +++ b/rust/automerge/README.md @@ -0,0 +1,5 @@ +# Automerge + +Automerge is a library of data structures for building collaborative +[local-first](https://www.inkandswitch.com/local-first/) applications. This is +the Rust implementation. See [automerge.org](https://automerge.org/) diff --git a/rust/automerge/benches/map.rs b/rust/automerge/benches/map.rs new file mode 100644 index 00000000..fcf3bfa3 --- /dev/null +++ b/rust/automerge/benches/map.rs @@ -0,0 +1,268 @@ +use automerge::{transaction::Transactable, Automerge, ScalarValue, ROOT}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; + +fn repeated_increment(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "counter", ScalarValue::counter(0)).unwrap(); + for _ in 0..n { + tx.increment(ROOT, "counter", 1).unwrap(); + } + tx.commit(); + doc +} + +fn repeated_put(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + for i in 0..n { + tx.put(ROOT, "0", i).unwrap(); + } + tx.commit(); + doc +} + +fn increasing_put(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + for i in 0..n { + tx.put(ROOT, i.to_string(), i).unwrap(); + } + tx.commit(); + doc +} + +fn decreasing_put(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + for i in (0..n).rev() { + tx.put(ROOT, i.to_string(), i).unwrap(); + } + tx.commit(); + doc +} + +fn criterion_benchmark(c: &mut Criterion) { + let sizes = [100, 1_000, 10_000]; + + let mut group = c.benchmark_group("map"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| { + b.iter(|| repeated_put(size)) + }); + group.bench_with_input( + BenchmarkId::new("repeated increment", size), + size, + |b, &size| b.iter(|| repeated_increment(size)), + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| b.iter(|| increasing_put(size)), + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("decreasing put", size), + size, + |b, &size| b.iter(|| decreasing_put(size)), + ); + } + group.finish(); + + let mut group = c.benchmark_group("map save"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| { + b.iter_batched( + || repeated_put(size), + |mut doc| doc.save(), + criterion::BatchSize::LargeInput, + ) + }); + group.bench_with_input( + BenchmarkId::new("repeated increment", size), + size, + |b, &size| { + b.iter_batched( + || repeated_increment(size), + |mut doc| doc.save(), + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| { + b.iter_batched( + || increasing_put(size), + |mut doc| doc.save(), + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("decreasing put", size), + size, + |b, &size| { + b.iter_batched( + || decreasing_put(size), + |mut doc| doc.save(), + criterion::BatchSize::LargeInput, + ) + }, + ); + } + group.finish(); + + let mut group = c.benchmark_group("map load"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| { + b.iter_batched( + || repeated_put(size).save(), + |bytes| Automerge::load(&bytes).unwrap(), + criterion::BatchSize::LargeInput, + ) + }); + group.bench_with_input( + BenchmarkId::new("repeated increment", size), + size, + |b, &size| { + b.iter_batched( + || repeated_increment(size).save(), + |bytes| Automerge::load(&bytes).unwrap(), + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| { + b.iter_batched( + || increasing_put(size).save(), + |bytes| Automerge::load(&bytes).unwrap(), + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("decreasing put", size), + size, + |b, &size| { + b.iter_batched( + || decreasing_put(size).save(), + |bytes| Automerge::load(&bytes).unwrap(), + criterion::BatchSize::LargeInput, + ) + }, + ); + } + group.finish(); + + let mut group = c.benchmark_group("map apply"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input(BenchmarkId::new("repeated put", size), size, |b, &size| { + b.iter_batched( + || { + repeated_put(size) + .get_changes(&[]) + .unwrap() + .into_iter() + .cloned() + .collect::>() + }, + |changes| { + let mut doc = Automerge::new(); + doc.apply_changes(changes) + }, + criterion::BatchSize::LargeInput, + ) + }); + group.bench_with_input( + BenchmarkId::new("repeated increment", size), + size, + |b, &size| { + b.iter_batched( + || { + repeated_increment(size) + .get_changes(&[]) + .unwrap() + .into_iter() + .cloned() + .collect::>() + }, + |changes| { + let mut doc = Automerge::new(); + doc.apply_changes(changes) + }, + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| { + b.iter_batched( + || { + increasing_put(size) + .get_changes(&[]) + .unwrap() + .into_iter() + .cloned() + .collect::>() + }, + |changes| { + let mut doc = Automerge::new(); + doc.apply_changes(changes) + }, + criterion::BatchSize::LargeInput, + ) + }, + ); + + group.throughput(criterion::Throughput::Elements(*size)); + group.bench_with_input( + BenchmarkId::new("decreasing put", size), + size, + |b, &size| { + b.iter_batched( + || { + decreasing_put(size) + .get_changes(&[]) + .unwrap() + .into_iter() + .cloned() + .collect::>() + }, + |changes| { + let mut doc = Automerge::new(); + doc.apply_changes(changes) + }, + criterion::BatchSize::LargeInput, + ) + }, + ); + } + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/rust/automerge/benches/range.rs b/rust/automerge/benches/range.rs new file mode 100644 index 00000000..008ae159 --- /dev/null +++ b/rust/automerge/benches/range.rs @@ -0,0 +1,36 @@ +use automerge::{transaction::Transactable, Automerge, ReadDoc, ROOT}; +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +fn doc(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + for i in 0..n { + tx.put(ROOT, i.to_string(), i.to_string()).unwrap(); + } + tx.commit(); + doc +} + +fn range(doc: &Automerge) { + let range = doc.values(ROOT); + range.for_each(drop); +} + +fn range_at(doc: &Automerge) { + let range = doc.values_at(ROOT, &doc.get_heads()); + range.for_each(drop); +} + +fn criterion_benchmark(c: &mut Criterion) { + let n = 100_000; + let doc = doc(n); + c.bench_function(&format!("range {}", n), |b| { + b.iter(|| range(black_box(&doc))) + }); + c.bench_function(&format!("range_at {}", n), |b| { + b.iter(|| range_at(black_box(&doc))) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/rust/automerge/benches/sync.rs b/rust/automerge/benches/sync.rs new file mode 100644 index 00000000..13965792 --- /dev/null +++ b/rust/automerge/benches/sync.rs @@ -0,0 +1,95 @@ +use automerge::{ + sync::{self, SyncDoc}, + transaction::Transactable, + Automerge, ROOT, +}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; + +#[derive(Default)] +struct DocWithSync { + doc: Automerge, + peer_state: sync::State, +} + +impl From for DocWithSync { + fn from(doc: Automerge) -> Self { + Self { + doc, + peer_state: sync::State::default(), + } + } +} + +fn increasing_put(n: u64) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + for i in 0..n { + tx.put(ROOT, i.to_string(), i).unwrap(); + } + tx.commit(); + doc +} + +// keep syncing until doc1 no longer generates a sync message for doc2. +fn sync(doc1: &mut DocWithSync, doc2: &mut DocWithSync) { + while let Some(message1) = doc1.doc.generate_sync_message(&mut doc1.peer_state) { + doc2.doc + .receive_sync_message(&mut doc2.peer_state, message1) + .unwrap(); + + if let Some(message2) = doc2.doc.generate_sync_message(&mut doc2.peer_state) { + doc1.doc + .receive_sync_message(&mut doc1.peer_state, message2) + .unwrap() + } + } +} + +fn criterion_benchmark(c: &mut Criterion) { + let sizes = [100, 1_000, 10_000]; + + let mut group = c.benchmark_group("sync unidirectional"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| { + b.iter_batched( + || (increasing_put(size), DocWithSync::default()), + |(doc1, mut doc2)| sync(&mut doc1.into(), &mut doc2), + criterion::BatchSize::LargeInput, + ) + }, + ); + } + group.finish(); + + let mut group = c.benchmark_group("sync unidirectional every change"); + for size in &sizes { + group.throughput(criterion::Throughput::Elements(*size)); + + group.bench_with_input( + BenchmarkId::new("increasing put", size), + size, + |b, &size| { + b.iter(|| { + let mut doc1 = DocWithSync::default(); + let mut doc2 = DocWithSync::default(); + + for i in 0..size { + let mut tx = doc1.doc.transaction(); + tx.put(ROOT, i.to_string(), i).unwrap(); + tx.commit(); + sync(&mut doc1, &mut doc2); + } + }) + }, + ); + } + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/rust/automerge/examples/README.md b/rust/automerge/examples/README.md new file mode 100644 index 00000000..c9a9630e --- /dev/null +++ b/rust/automerge/examples/README.md @@ -0,0 +1,7 @@ +# Automerge examples + +## Quickstart + +```shell +cargo run --example quickstart +``` diff --git a/rust/automerge/examples/quickstart.rs b/rust/automerge/examples/quickstart.rs new file mode 100644 index 00000000..fcb23d5e --- /dev/null +++ b/rust/automerge/examples/quickstart.rs @@ -0,0 +1,57 @@ +use automerge::transaction::CommitOptions; +use automerge::transaction::Transactable; +use automerge::AutomergeError; +use automerge::ObjType; +use automerge::{Automerge, ReadDoc, ROOT}; + +// Based on https://automerge.github.io/docs/quickstart +fn main() { + let mut doc1 = Automerge::new(); + let (cards, card1) = doc1 + .transact_with::<_, _, AutomergeError, _>( + |_| CommitOptions::default().with_message("Add card".to_owned()), + |tx| { + let cards = tx.put_object(ROOT, "cards", ObjType::List).unwrap(); + let card1 = tx.insert_object(&cards, 0, ObjType::Map)?; + tx.put(&card1, "title", "Rewrite everything in Clojure")?; + tx.put(&card1, "done", false)?; + let card2 = tx.insert_object(&cards, 0, ObjType::Map)?; + tx.put(&card2, "title", "Rewrite everything in Haskell")?; + tx.put(&card2, "done", false)?; + Ok((cards, card1)) + }, + ) + .unwrap() + .result; + + let mut doc2 = Automerge::new(); + doc2.merge(&mut doc1).unwrap(); + + let binary = doc1.save(); + let mut doc2 = Automerge::load(&binary).unwrap(); + + doc1.transact_with::<_, _, AutomergeError, _>( + |_| CommitOptions::default().with_message("Mark card as done".to_owned()), + |tx| { + tx.put(&card1, "done", true)?; + Ok(()) + }, + ) + .unwrap(); + + doc2.transact_with::<_, _, AutomergeError, _>( + |_| CommitOptions::default().with_message("Delete card".to_owned()), + |tx| { + tx.delete(&cards, 0)?; + Ok(()) + }, + ) + .unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + for change in doc1.get_changes(&[]).unwrap() { + let length = doc1.length_at(&cards, &[change.hash()]); + println!("{} {}", change.message().unwrap(), length); + } +} diff --git a/rust/automerge/examples/watch.rs b/rust/automerge/examples/watch.rs new file mode 100644 index 00000000..4cd8f4ea --- /dev/null +++ b/rust/automerge/examples/watch.rs @@ -0,0 +1,106 @@ +use automerge::transaction::CommitOptions; +use automerge::transaction::Transactable; +use automerge::Automerge; +use automerge::AutomergeError; +use automerge::Patch; +use automerge::ReadDoc; +use automerge::VecOpObserver; +use automerge::ROOT; + +fn main() { + let mut doc = Automerge::new(); + + // a simple scalar change in the root object + let mut result = doc + .transact_observed_with::<_, _, AutomergeError, _, VecOpObserver>( + |_result| CommitOptions::default(), + |tx| { + tx.put(ROOT, "hello", "world").unwrap(); + Ok(()) + }, + ) + .unwrap(); + get_changes(&doc, result.op_observer.take_patches()); + + let mut tx = doc.transaction_with_observer(VecOpObserver::default()); + let map = tx + .put_object(ROOT, "my new map", automerge::ObjType::Map) + .unwrap(); + tx.put(&map, "blah", 1).unwrap(); + tx.put(&map, "blah2", 1).unwrap(); + let list = tx + .put_object(&map, "my list", automerge::ObjType::List) + .unwrap(); + tx.insert(&list, 0, "yay").unwrap(); + let m = tx.insert_object(&list, 0, automerge::ObjType::Map).unwrap(); + tx.put(&m, "hi", 2).unwrap(); + tx.insert(&list, 1, "woo").unwrap(); + let m = tx.insert_object(&list, 2, automerge::ObjType::Map).unwrap(); + tx.put(&m, "hi", 2).unwrap(); + let patches = tx.observer().take_patches(); + let _heads3 = tx.commit_with(CommitOptions::default()); + get_changes(&doc, patches); +} + +fn get_changes(doc: &Automerge, patches: Vec) { + for patch in patches { + match patch { + Patch::Put { + obj, prop, value, .. + } => { + println!( + "put {:?} at {:?} in obj {:?}, object path {:?}", + value, + prop, + obj, + doc.path_to_object(&obj) + ) + } + Patch::Insert { + obj, index, value, .. + } => { + println!( + "insert {:?} at {:?} in obj {:?}, object path {:?}", + value, + index, + obj, + doc.path_to_object(&obj) + ) + } + Patch::Splice { + obj, index, value, .. + } => { + println!( + "splice '{:?}' at {:?} in obj {:?}, object path {:?}", + value, + index, + obj, + doc.path_to_object(&obj) + ) + } + Patch::Increment { + obj, prop, value, .. + } => { + println!( + "increment {:?} in obj {:?} by {:?}, object path {:?}", + prop, + obj, + value, + doc.path_to_object(&obj) + ) + } + Patch::Delete { obj, prop, .. } => println!( + "delete {:?} in obj {:?}, object path {:?}", + prop, + obj, + doc.path_to_object(&obj) + ), + Patch::Expose { obj, prop, .. } => println!( + "expose {:?} in obj {:?}, object path {:?}", + prop, + obj, + doc.path_to_object(&obj) + ), + } + } +} diff --git a/fuzz/.gitignore b/rust/automerge/fuzz/.gitignore similarity index 56% rename from fuzz/.gitignore rename to rust/automerge/fuzz/.gitignore index 572e03bd..2eb15f8e 100644 --- a/fuzz/.gitignore +++ b/rust/automerge/fuzz/.gitignore @@ -1,4 +1,3 @@ - target corpus -artifacts +coverage diff --git a/rust/automerge/fuzz/Cargo.toml b/rust/automerge/fuzz/Cargo.toml new file mode 100644 index 00000000..3461e9f3 --- /dev/null +++ b/rust/automerge/fuzz/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "automerge-fuzz" +version = "0.0.0" +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +leb128 = "^0.2.5" +sha2 = "^0.10.0" + +[dependencies.automerge] +path = ".." + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[profile.release] +debug = 1 + +[[bin]] +name = "load" +path = "fuzz_targets/load.rs" +test = false +doc = false \ No newline at end of file diff --git a/rust/automerge/fuzz/fuzz_targets/load.rs b/rust/automerge/fuzz/fuzz_targets/load.rs new file mode 100644 index 00000000..0dea2624 --- /dev/null +++ b/rust/automerge/fuzz/fuzz_targets/load.rs @@ -0,0 +1,37 @@ +#![no_main] + +use sha2::{Sha256, Digest}; +use automerge::{Automerge}; +use libfuzzer_sys::arbitrary::{Arbitrary, Result, Unstructured}; +use libfuzzer_sys::fuzz_target; + +#[derive(Debug)] +struct DocumentChunk { + bytes: Vec, +} + +fn add_header(typ: u8, data: &[u8]) -> Vec { + let mut input = vec![u8::from(typ)]; + leb128::write::unsigned(&mut input, data.len() as u64).unwrap(); + input.extend(data.as_ref()); + let hash_result = Sha256::digest(input.clone()); + let array: [u8; 32] = hash_result.into(); + + let mut out = vec![133, 111, 74, 131, array[0], array[1], array[2], array[3]]; + out.extend(input); + out +} + +impl<'a> Arbitrary<'a> for DocumentChunk +{ + fn arbitrary(u: &mut Unstructured<'a>) -> Result { + let input = u.bytes(u.len())?; + let contents = add_header(0, input); + + return Ok(DocumentChunk{bytes: contents}) + } +} + +fuzz_target!(|doc: DocumentChunk| { + Automerge::load(&doc.bytes); +}); diff --git a/rust/automerge/src/autocommit.rs b/rust/automerge/src/autocommit.rs new file mode 100644 index 00000000..ae28596e --- /dev/null +++ b/rust/automerge/src/autocommit.rs @@ -0,0 +1,672 @@ +use std::ops::RangeBounds; + +use crate::exid::ExId; +use crate::op_observer::{BranchableObserver, OpObserver}; +use crate::sync::SyncDoc; +use crate::transaction::{CommitOptions, Transactable}; +use crate::{ + sync, Keys, KeysAt, ListRange, ListRangeAt, MapRange, MapRangeAt, ObjType, Parents, ReadDoc, + ScalarValue, +}; +use crate::{ + transaction::{Observation, Observed, TransactionInner, UnObserved}, + ActorId, Automerge, AutomergeError, Change, ChangeHash, Prop, TextEncoding, Value, Values, +}; + +/// An automerge document that automatically manages transactions. +/// +/// An `AutoCommit` can optionally manage an [`OpObserver`]. This observer will be notified of all +/// changes made by both remote and local changes. The type parameter `O` tracks whether this +/// document is observed or not. +/// +/// ## Creating, loading, merging and forking documents +/// +/// A new document can be created with [`Self::new`], which will create a document with a random +/// [`ActorId`]. Existing documents can be loaded with [`Self::load`]. +/// +/// If you have two documents and you want to merge the changes from one into the other you can use +/// [`Self::merge`]. +/// +/// If you have a document you want to split into two concurrent threads of execution you can use +/// [`Self::fork`]. If you want to split a document from ealier in its history you can use +/// [`Self::fork_at`]. +/// +/// ## Reading values +/// +/// [`Self`] implements [`ReadDoc`], which provides methods for reading values from the document. +/// +/// ## Modifying a document +/// +/// This type implements [`Transactable`] directly, so you can modify it using methods from [`Transactable`]. +/// +/// ## Synchronization +/// +/// To synchronise call [`Self::sync`] which returns an implementation of [`SyncDoc`] +/// +/// ## Observers +/// +/// An `AutoCommit` can optionally manage an [`OpObserver`]. [`Self::new`] will return a document +/// with no observer but you can set an observer using [`Self::with_observer`]. The observer must +/// implement both [`OpObserver`] and [`BranchableObserver`]. If you have an observed autocommit +/// then you can obtain a mutable reference to the observer with [`Self::observer`] +#[derive(Debug, Clone)] +pub struct AutoCommitWithObs { + doc: Automerge, + transaction: Option<(Obs, TransactionInner)>, + observation: Obs, +} + +/// An autocommit document with no observer +/// +/// See [`AutoCommitWithObs`] +pub type AutoCommit = AutoCommitWithObs; + +impl Default for AutoCommitWithObs> { + fn default() -> Self { + let op_observer = O::default(); + AutoCommitWithObs { + doc: Automerge::new(), + transaction: None, + observation: Observed::new(op_observer), + } + } +} + +impl AutoCommit { + pub fn new() -> AutoCommit { + AutoCommitWithObs { + doc: Automerge::new(), + transaction: None, + observation: UnObserved, + } + } + + pub fn load(data: &[u8]) -> Result { + let doc = Automerge::load(data)?; + Ok(Self { + doc, + transaction: None, + observation: UnObserved, + }) + } +} + +impl AutoCommitWithObs> { + pub fn observer(&mut self) -> &mut Obs { + self.ensure_transaction_closed(); + self.observation.observer() + } +} + +impl AutoCommitWithObs { + pub fn fork(&mut self) -> Self { + self.ensure_transaction_closed(); + Self { + doc: self.doc.fork(), + transaction: self.transaction.clone(), + observation: self.observation.clone(), + } + } + + pub fn fork_at(&mut self, heads: &[ChangeHash]) -> Result { + self.ensure_transaction_closed(); + Ok(Self { + doc: self.doc.fork_at(heads)?, + transaction: self.transaction.clone(), + observation: self.observation.clone(), + }) + } +} + +impl AutoCommitWithObs { + pub fn with_observer( + self, + op_observer: Obs2, + ) -> AutoCommitWithObs> { + AutoCommitWithObs { + doc: self.doc, + transaction: self + .transaction + .map(|(_, t)| (Observed::new(op_observer.branch()), t)), + observation: Observed::new(op_observer), + } + } + + /// Get the inner document. + #[doc(hidden)] + pub fn document(&mut self) -> &Automerge { + self.ensure_transaction_closed(); + &self.doc + } + + pub fn with_actor(mut self, actor: ActorId) -> Self { + self.ensure_transaction_closed(); + self.doc.set_actor(actor); + self + } + + pub fn set_actor(&mut self, actor: ActorId) -> &mut Self { + self.ensure_transaction_closed(); + self.doc.set_actor(actor); + self + } + + pub fn get_actor(&self) -> &ActorId { + self.doc.get_actor() + } + + /// Change the text encoding of this view of the document + /// + /// This is a cheap operation, it just changes the way indexes are calculated + pub fn with_encoding(mut self, encoding: TextEncoding) -> Self { + self.doc = self.doc.with_encoding(encoding); + self + } + + fn ensure_transaction_open(&mut self) { + if self.transaction.is_none() { + let args = self.doc.transaction_args(); + let inner = TransactionInner::new(args); + self.transaction = Some((self.observation.branch(), inner)) + } + } + + fn ensure_transaction_closed(&mut self) { + if let Some((current, tx)) = self.transaction.take() { + self.observation.merge(¤t); + tx.commit(&mut self.doc, None, None); + } + } + + /// Load an incremental save of a document. + /// + /// Unlike `load` this imports changes into an existing document. It will work with both the + /// output of [`Self::save`] and [`Self::save_incremental`] + /// + /// The return value is the number of ops which were applied, this is not useful and will + /// change in future. + pub fn load_incremental(&mut self, data: &[u8]) -> Result { + self.ensure_transaction_closed(); + // TODO - would be nice to pass None here instead of &mut () + if let Some(observer) = self.observation.observer() { + self.doc.load_incremental_with(data, Some(observer)) + } else { + self.doc.load_incremental(data) + } + } + + pub fn apply_changes( + &mut self, + changes: impl IntoIterator, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_closed(); + if let Some(observer) = self.observation.observer() { + self.doc.apply_changes_with(changes, Some(observer)) + } else { + self.doc.apply_changes(changes) + } + } + + /// Takes all the changes in `other` which are not in `self` and applies them + pub fn merge( + &mut self, + other: &mut AutoCommitWithObs, + ) -> Result, AutomergeError> { + self.ensure_transaction_closed(); + other.ensure_transaction_closed(); + if let Some(observer) = self.observation.observer() { + self.doc.merge_with(&mut other.doc, Some(observer)) + } else { + self.doc.merge(&mut other.doc) + } + } + + /// Save the entirety of this document in a compact form. + pub fn save(&mut self) -> Vec { + self.ensure_transaction_closed(); + self.doc.save() + } + + /// Save this document, but don't run it through DEFLATE afterwards + pub fn save_nocompress(&mut self) -> Vec { + self.ensure_transaction_closed(); + self.doc.save_nocompress() + } + + /// Save the changes since the last call to [Self::save`] + /// + /// The output of this will not be a compressed document format, but a series of individual + /// changes. This is useful if you know you have only made a small change since the last `save` + /// and you want to immediately send it somewhere (e.g. you've inserted a single character in a + /// text object). + pub fn save_incremental(&mut self) -> Vec { + self.ensure_transaction_closed(); + self.doc.save_incremental() + } + + pub fn get_missing_deps(&mut self, heads: &[ChangeHash]) -> Vec { + self.ensure_transaction_closed(); + self.doc.get_missing_deps(heads) + } + + /// Get the last change made by this documents actor ID + pub fn get_last_local_change(&mut self) -> Option<&Change> { + self.ensure_transaction_closed(); + self.doc.get_last_local_change() + } + + pub fn get_changes( + &mut self, + have_deps: &[ChangeHash], + ) -> Result, AutomergeError> { + self.ensure_transaction_closed(); + self.doc.get_changes(have_deps) + } + + pub fn get_change_by_hash(&mut self, hash: &ChangeHash) -> Option<&Change> { + self.ensure_transaction_closed(); + self.doc.get_change_by_hash(hash) + } + + /// Get changes in `other` that are not in `self + pub fn get_changes_added<'a>(&mut self, other: &'a mut Self) -> Vec<&'a Change> { + self.ensure_transaction_closed(); + other.ensure_transaction_closed(); + self.doc.get_changes_added(&other.doc) + } + + #[doc(hidden)] + pub fn import(&self, s: &str) -> Result<(ExId, ObjType), AutomergeError> { + self.doc.import(s) + } + + #[doc(hidden)] + pub fn dump(&mut self) { + self.ensure_transaction_closed(); + self.doc.dump() + } + + /// Return a graphviz representation of the opset. + /// + /// # Arguments + /// + /// * objects: An optional list of object IDs to display, if not specified all objects are + /// visualised + #[cfg(feature = "optree-visualisation")] + pub fn visualise_optree(&self, objects: Option>) -> String { + self.doc.visualise_optree(objects) + } + + /// Get the current heads of the document. + /// + /// This closes the transaction first, if one is in progress. + pub fn get_heads(&mut self) -> Vec { + self.ensure_transaction_closed(); + self.doc.get_heads() + } + + /// Commit any uncommitted changes + /// + /// Returns `None` if there were no operations to commit + pub fn commit(&mut self) -> Option { + self.commit_with(CommitOptions::default()) + } + + /// Commit the current operations with some options. + /// + /// Returns `None` if there were no operations to commit + /// + /// ``` + /// # use automerge::transaction::CommitOptions; + /// # use automerge::transaction::Transactable; + /// # use automerge::ROOT; + /// # use automerge::AutoCommit; + /// # use automerge::ObjType; + /// # use std::time::SystemTime; + /// let mut doc = AutoCommit::new(); + /// doc.put_object(&ROOT, "todos", ObjType::List).unwrap(); + /// let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as + /// i64; + /// doc.commit_with(CommitOptions::default().with_message("Create todos list").with_time(now)); + /// ``` + pub fn commit_with(&mut self, options: CommitOptions) -> Option { + // ensure that even no changes triggers a change + self.ensure_transaction_open(); + let (current, tx) = self.transaction.take().unwrap(); + self.observation.merge(¤t); + tx.commit(&mut self.doc, options.message, options.time) + } + + /// Remove any changes that have been made in the current transaction from the document + pub fn rollback(&mut self) -> usize { + self.transaction + .take() + .map(|(_, tx)| tx.rollback(&mut self.doc)) + .unwrap_or(0) + } + + /// Generate an empty change + /// + /// The main reason to do this is if you wish to create a "merge commit" which has all the + /// current heads of the documents as dependencies but you have no new operations to create. + /// + /// Because this structure is an "autocommit" there may actually be outstanding operations to + /// submit. If this is the case this function will create two changes, one with the outstanding + /// operations and a new one with no operations. The returned `ChangeHash` will always be the + /// hash of the empty change. + pub fn empty_change(&mut self, options: CommitOptions) -> ChangeHash { + self.ensure_transaction_closed(); + let args = self.doc.transaction_args(); + TransactionInner::empty(&mut self.doc, args, options.message, options.time) + } + + /// An implementation of [`crate::sync::SyncDoc`] for this autocommit + /// + /// This ensures that any outstanding transactions for this document are committed before + /// taking part in the sync protocol + pub fn sync(&mut self) -> impl SyncDoc + '_ { + self.ensure_transaction_closed(); + SyncWrapper { inner: self } + } +} + +impl ReadDoc for AutoCommitWithObs { + fn parents>(&self, obj: O) -> Result, AutomergeError> { + self.doc.parents(obj) + } + + fn path_to_object>(&self, obj: O) -> Result, AutomergeError> { + self.doc.path_to_object(obj) + } + + fn keys>(&self, obj: O) -> Keys<'_, '_> { + self.doc.keys(obj) + } + + fn keys_at>(&self, obj: O, heads: &[ChangeHash]) -> KeysAt<'_, '_> { + self.doc.keys_at(obj, heads) + } + + fn map_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> MapRange<'_, R> { + self.doc.map_range(obj, range) + } + + fn map_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> MapRangeAt<'_, R> { + self.doc.map_range_at(obj, range, heads) + } + + fn list_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> ListRange<'_, R> { + self.doc.list_range(obj, range) + } + + fn list_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> ListRangeAt<'_, R> { + self.doc.list_range_at(obj, range, heads) + } + + fn values>(&self, obj: O) -> Values<'_> { + self.doc.values(obj) + } + + fn values_at>(&self, obj: O, heads: &[ChangeHash]) -> Values<'_> { + self.doc.values_at(obj, heads) + } + + fn length>(&self, obj: O) -> usize { + self.doc.length(obj) + } + + fn length_at>(&self, obj: O, heads: &[ChangeHash]) -> usize { + self.doc.length_at(obj, heads) + } + + fn object_type>(&self, obj: O) -> Result { + self.doc.object_type(obj) + } + + fn text>(&self, obj: O) -> Result { + self.doc.text(obj) + } + + fn text_at>( + &self, + obj: O, + heads: &[ChangeHash], + ) -> Result { + self.doc.text_at(obj, heads) + } + + fn get, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + self.doc.get(obj, prop) + } + + fn get_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_at(obj, prop, heads) + } + + fn get_all, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_all(obj, prop) + } + + fn get_all_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_all_at(obj, prop, heads) + } + + fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec { + self.doc.get_missing_deps(heads) + } + + fn get_change_by_hash(&self, hash: &ChangeHash) -> Option<&Change> { + self.doc.get_change_by_hash(hash) + } +} + +impl Transactable for AutoCommitWithObs { + fn pending_ops(&self) -> usize { + self.transaction + .as_ref() + .map(|(_, t)| t.pending_ops()) + .unwrap_or(0) + } + + fn put, P: Into, V: Into>( + &mut self, + obj: O, + prop: P, + value: V, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.put(&mut self.doc, current.observer(), obj.as_ref(), prop, value) + } + + fn put_object, P: Into>( + &mut self, + obj: O, + prop: P, + value: ObjType, + ) -> Result { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.put_object(&mut self.doc, current.observer(), obj.as_ref(), prop, value) + } + + fn insert, V: Into>( + &mut self, + obj: O, + index: usize, + value: V, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.insert( + &mut self.doc, + current.observer(), + obj.as_ref(), + index, + value, + ) + } + + fn insert_object>( + &mut self, + obj: O, + index: usize, + value: ObjType, + ) -> Result { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.insert_object( + &mut self.doc, + current.observer(), + obj.as_ref(), + index, + value, + ) + } + + fn increment, P: Into>( + &mut self, + obj: O, + prop: P, + value: i64, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.increment(&mut self.doc, current.observer(), obj.as_ref(), prop, value) + } + + fn delete, P: Into>( + &mut self, + obj: O, + prop: P, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.delete(&mut self.doc, current.observer(), obj.as_ref(), prop) + } + + /// Splice new elements into the given sequence. Returns a vector of the OpIds used to insert + /// the new elements + fn splice, V: IntoIterator>( + &mut self, + obj: O, + pos: usize, + del: usize, + vals: V, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.splice( + &mut self.doc, + current.observer(), + obj.as_ref(), + pos, + del, + vals, + ) + } + + fn splice_text>( + &mut self, + obj: O, + pos: usize, + del: usize, + text: &str, + ) -> Result<(), AutomergeError> { + self.ensure_transaction_open(); + let (current, tx) = self.transaction.as_mut().unwrap(); + tx.splice_text( + &mut self.doc, + current.observer(), + obj.as_ref(), + pos, + del, + text, + ) + } + + fn base_heads(&self) -> Vec { + self.doc.get_heads() + } +} + +// A wrapper we return from `AutoCommit::sync` to ensure that transactions are closed before we +// start syncing +struct SyncWrapper<'a, Obs: Observation> { + inner: &'a mut AutoCommitWithObs, +} + +impl<'a, Obs: Observation> SyncDoc for SyncWrapper<'a, Obs> { + fn generate_sync_message(&self, sync_state: &mut sync::State) -> Option { + self.inner.doc.generate_sync_message(sync_state) + } + + fn receive_sync_message( + &mut self, + sync_state: &mut sync::State, + message: sync::Message, + ) -> Result<(), AutomergeError> { + self.inner.ensure_transaction_closed(); + if let Some(observer) = self.inner.observation.observer() { + self.inner + .doc + .receive_sync_message_with(sync_state, message, observer) + } else { + self.inner.doc.receive_sync_message(sync_state, message) + } + } + + fn receive_sync_message_with( + &mut self, + sync_state: &mut sync::State, + message: sync::Message, + op_observer: &mut Obs2, + ) -> Result<(), AutomergeError> { + if let Some(our_observer) = self.inner.observation.observer() { + let mut composed = crate::op_observer::compose(our_observer, op_observer); + self.inner + .doc + .receive_sync_message_with(sync_state, message, &mut composed) + } else { + self.inner + .doc + .receive_sync_message_with(sync_state, message, op_observer) + } + } +} diff --git a/rust/automerge/src/automerge.rs b/rust/automerge/src/automerge.rs new file mode 100644 index 00000000..0dd82253 --- /dev/null +++ b/rust/automerge/src/automerge.rs @@ -0,0 +1,1452 @@ +use std::cmp::Ordering; +use std::collections::{BTreeSet, HashMap, HashSet}; +use std::fmt::Debug; +use std::num::NonZeroU64; +use std::ops::RangeBounds; + +use crate::change_graph::ChangeGraph; +use crate::columnar::Key as EncodedKey; +use crate::exid::ExId; +use crate::keys::Keys; +use crate::op_observer::{BranchableObserver, OpObserver}; +use crate::op_set::OpSet; +use crate::parents::Parents; +use crate::storage::{self, load, CompressConfig, VerificationMode}; +use crate::transaction::{ + self, CommitOptions, Failure, Observed, Success, Transaction, TransactionArgs, UnObserved, +}; +use crate::types::{ + ActorId, ChangeHash, Clock, ElemId, Export, Exportable, Key, ListEncoding, ObjId, Op, OpId, + OpType, ScalarValue, TextEncoding, Value, +}; +use crate::{ + query, AutomergeError, Change, KeysAt, ListRange, ListRangeAt, MapRange, MapRangeAt, ObjType, + Prop, ReadDoc, Values, +}; +use serde::Serialize; + +mod current_state; + +#[cfg(test)] +mod tests; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) enum Actor { + Unused(ActorId), + Cached(usize), +} + +/// What to do when loading a document partially succeeds +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum OnPartialLoad { + /// Ignore the error and return the loaded changes + Ignore, + /// Fail the entire load + Error, +} + +/// An automerge document which does not manage transactions for you. +/// +/// ## Creating, loading, merging and forking documents +/// +/// A new document can be created with [`Self::new`], which will create a document with a random +/// [`ActorId`]. Existing documents can be loaded with [`Self::load`], or [`Self::load_with`]. +/// +/// If you have two documents and you want to merge the changes from one into the other you can use +/// [`Self::merge`] or [`Self::merge_with`]. +/// +/// If you have a document you want to split into two concurrent threads of execution you can use +/// [`Self::fork`]. If you want to split a document from ealier in its history you can use +/// [`Self::fork_at`]. +/// +/// ## Reading values +/// +/// [`Self`] implements [`ReadDoc`], which provides methods for reading values from the document. +/// +/// ## Modifying a document (Transactions) +/// +/// [`Automerge`] provides an interface for viewing and modifying automerge documents which does +/// not manage transactions for you. To create changes you use either [`Automerge::transaction`] or +/// [`Automerge::transact`] (or the `_with` variants). +/// +/// ## Sync +/// +/// This type implements [`crate::sync::SyncDoc`] +/// +/// ## Observers +/// +/// Many of the methods on this type have an `_with` or `_observed` variant +/// which allow you to pass in an [`OpObserver`] to observe any changes which +/// occur. +#[derive(Debug, Clone)] +pub struct Automerge { + /// The list of unapplied changes that are not causally ready. + queue: Vec, + /// The history of changes that form this document, topologically sorted too. + history: Vec, + /// Mapping from change hash to index into the history list. + history_index: HashMap, + /// Graph of changes + change_graph: ChangeGraph, + /// Mapping from actor index to list of seqs seen for them. + states: HashMap>, + /// Current dependencies of this document (heads hashes). + deps: HashSet, + /// Heads at the last save. + saved: Vec, + /// The set of operations that form this document. + ops: OpSet, + /// The current actor. + actor: Actor, + /// The maximum operation counter this document has seen. + max_op: u64, + text_encoding: TextEncoding, +} + +impl Automerge { + /// Create a new document with a random actor id. + pub fn new() -> Self { + Automerge { + queue: vec![], + history: vec![], + history_index: HashMap::new(), + change_graph: ChangeGraph::new(), + states: HashMap::new(), + ops: Default::default(), + deps: Default::default(), + saved: Default::default(), + actor: Actor::Unused(ActorId::random()), + max_op: 0, + text_encoding: Default::default(), + } + } + + pub(crate) fn ops_mut(&mut self) -> &mut OpSet { + &mut self.ops + } + + pub(crate) fn ops(&self) -> &OpSet { + &self.ops + } + + /// Whether this document has any operations + pub fn is_empty(&self) -> bool { + self.history.is_empty() && self.queue.is_empty() + } + + pub(crate) fn actor_id(&self) -> ActorId { + match &self.actor { + Actor::Unused(id) => id.clone(), + Actor::Cached(idx) => self.ops.m.actors[*idx].clone(), + } + } + + /// Remove the current actor from the opset if it has no ops + /// + /// If the current actor ID has no ops in the opset then remove it from the cache of actor IDs. + /// This us used when rolling back a transaction. If the rolled back ops are the only ops for + /// the current actor then we want to remove that actor from the opset so it doesn't end up in + /// any saved version of the document. + /// + /// # Panics + /// + /// If the last actor in the OpSet is not the actor ID of this document + pub(crate) fn rollback_last_actor(&mut self) { + if let Actor::Cached(actor_idx) = self.actor { + if self.states.get(&actor_idx).is_none() && self.ops.m.actors.len() > 0 { + assert!(self.ops.m.actors.len() == actor_idx + 1); + let actor = self.ops.m.actors.remove_last(); + self.actor = Actor::Unused(actor); + } + } + } + + pub(crate) fn text_encoding(&self) -> TextEncoding { + self.text_encoding + } + + /// Change the text encoding of this view of the document + /// + /// This is a cheap operation, it just changes the way indexes are calculated + pub fn with_encoding(mut self, encoding: TextEncoding) -> Self { + self.text_encoding = encoding; + self + } + + /// Set the actor id for this document. + pub fn with_actor(mut self, actor: ActorId) -> Self { + self.actor = Actor::Unused(actor); + self + } + + /// Set the actor id for this document. + pub fn set_actor(&mut self, actor: ActorId) -> &mut Self { + self.actor = Actor::Unused(actor); + self + } + + /// Get the current actor id of this document. + pub fn get_actor(&self) -> &ActorId { + match &self.actor { + Actor::Unused(actor) => actor, + Actor::Cached(index) => self.ops.m.actors.get(*index), + } + } + + pub(crate) fn get_actor_index(&mut self) -> usize { + match &mut self.actor { + Actor::Unused(actor) => { + let index = self + .ops + .m + .actors + .cache(std::mem::replace(actor, ActorId::from(&[][..]))); + self.actor = Actor::Cached(index); + index + } + Actor::Cached(index) => *index, + } + } + + /// Start a transaction. + pub fn transaction(&mut self) -> Transaction<'_, UnObserved> { + let args = self.transaction_args(); + Transaction::new(self, args, UnObserved) + } + + /// Start a transaction with an observer + pub fn transaction_with_observer( + &mut self, + op_observer: Obs, + ) -> Transaction<'_, Observed> { + let args = self.transaction_args(); + Transaction::new(self, args, Observed::new(op_observer)) + } + + pub(crate) fn transaction_args(&mut self) -> TransactionArgs { + let actor = self.get_actor_index(); + let seq = self.states.get(&actor).map_or(0, |v| v.len()) as u64 + 1; + let mut deps = self.get_heads(); + if seq > 1 { + let last_hash = self.get_hash(actor, seq - 1).unwrap(); + if !deps.contains(&last_hash) { + deps.push(last_hash); + } + } + // SAFETY: this unwrap is safe as we always add 1 + let start_op = NonZeroU64::new(self.max_op + 1).unwrap(); + + TransactionArgs { + actor_index: actor, + seq, + start_op, + deps, + } + } + + /// Run a transaction on this document in a closure, automatically handling commit or rollback + /// afterwards. + pub fn transact(&mut self, f: F) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, UnObserved>) -> Result, + { + self.transact_with_impl(None::<&dyn Fn(&O) -> CommitOptions>, f) + } + + /// Like [`Self::transact`] but with a function for generating the commit options. + pub fn transact_with(&mut self, c: C, f: F) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, UnObserved>) -> Result, + C: FnOnce(&O) -> CommitOptions, + { + self.transact_with_impl(Some(c), f) + } + + fn transact_with_impl( + &mut self, + c: Option, + f: F, + ) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, UnObserved>) -> Result, + C: FnOnce(&O) -> CommitOptions, + { + let mut tx = self.transaction(); + let result = f(&mut tx); + match result { + Ok(result) => { + let hash = if let Some(c) = c { + let commit_options = c(&result); + tx.commit_with(commit_options) + } else { + tx.commit() + }; + Ok(Success { + result, + hash, + op_observer: (), + }) + } + Err(error) => Err(Failure { + error, + cancelled: tx.rollback(), + }), + } + } + + /// Run a transaction on this document in a closure, observing ops with `Obs`, automatically handling commit or rollback + /// afterwards. + pub fn transact_observed(&mut self, f: F) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, Observed>) -> Result, + Obs: OpObserver + BranchableObserver + Default, + { + self.transact_observed_with_impl(None::<&dyn Fn(&O) -> CommitOptions>, f) + } + + /// Like [`Self::transact_observed`] but with a function for generating the commit options + pub fn transact_observed_with( + &mut self, + c: C, + f: F, + ) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, Observed>) -> Result, + C: FnOnce(&O) -> CommitOptions, + Obs: OpObserver + BranchableObserver + Default, + { + self.transact_observed_with_impl(Some(c), f) + } + + fn transact_observed_with_impl( + &mut self, + c: Option, + f: F, + ) -> transaction::Result + where + F: FnOnce(&mut Transaction<'_, Observed>) -> Result, + C: FnOnce(&O) -> CommitOptions, + Obs: OpObserver + BranchableObserver + Default, + { + let observer = Obs::default(); + let mut tx = self.transaction_with_observer(observer); + let result = f(&mut tx); + match result { + Ok(result) => { + let (obs, hash) = if let Some(c) = c { + let commit_options = c(&result); + tx.commit_with(commit_options) + } else { + tx.commit() + }; + Ok(Success { + result, + hash, + op_observer: obs, + }) + } + Err(error) => Err(Failure { + error, + cancelled: tx.rollback(), + }), + } + } + + /// Generate an empty change + /// + /// The main reason to do this is if you want to create a "merge commit", which is a change + /// that has all the current heads of the document as dependencies. + pub fn empty_commit(&mut self, opts: CommitOptions) -> ChangeHash { + let args = self.transaction_args(); + Transaction::empty(self, args, opts) + } + + /// Fork this document at the current point for use by a different actor. + /// + /// This will create a new actor ID for the forked document + pub fn fork(&self) -> Self { + let mut f = self.clone(); + f.set_actor(ActorId::random()); + f + } + + /// Fork this document at the given heads + /// + /// This will create a new actor ID for the forked document + pub fn fork_at(&self, heads: &[ChangeHash]) -> Result { + let mut seen = heads.iter().cloned().collect::>(); + let mut heads = heads.to_vec(); + let mut changes = vec![]; + while let Some(hash) = heads.pop() { + if let Some(idx) = self.history_index.get(&hash) { + let change = &self.history[*idx]; + for dep in change.deps() { + if !seen.contains(dep) { + heads.push(*dep); + } + } + changes.push(change); + seen.insert(hash); + } else { + return Err(AutomergeError::InvalidHash(hash)); + } + } + let mut f = Self::new(); + f.set_actor(ActorId::random()); + f.apply_changes(changes.into_iter().rev().cloned())?; + Ok(f) + } + + pub(crate) fn exid_to_obj(&self, id: &ExId) -> Result<(ObjId, ObjType), AutomergeError> { + match id { + ExId::Root => Ok((ObjId::root(), ObjType::Map)), + ExId::Id(ctr, actor, idx) => { + // do a direct get here b/c this could be foriegn and not be within the array + // bounds + let obj = if self.ops.m.actors.cache.get(*idx) == Some(actor) { + ObjId(OpId::new(*ctr, *idx)) + } else { + // FIXME - make a real error + let idx = self + .ops + .m + .actors + .lookup(actor) + .ok_or(AutomergeError::Fail)?; + ObjId(OpId::new(*ctr, idx)) + }; + if let Some(obj_type) = self.ops.object_type(&obj) { + Ok((obj, obj_type)) + } else { + Err(AutomergeError::NotAnObject) + } + } + } + } + + pub(crate) fn id_to_exid(&self, id: OpId) -> ExId { + self.ops.id_to_exid(id) + } + + /// Load a document. + pub fn load(data: &[u8]) -> Result { + Self::load_with::<()>(data, OnPartialLoad::Error, VerificationMode::Check, None) + } + + /// Load a document without verifying the head hashes + /// + /// This is useful for debugging as it allows you to examine a corrupted document. + pub fn load_unverified_heads(data: &[u8]) -> Result { + Self::load_with::<()>( + data, + OnPartialLoad::Error, + VerificationMode::DontCheck, + None, + ) + } + + /// Load a document with an observer + #[tracing::instrument(skip(data, observer), err)] + pub fn load_with( + data: &[u8], + on_error: OnPartialLoad, + mode: VerificationMode, + mut observer: Option<&mut Obs>, + ) -> Result { + if data.is_empty() { + tracing::trace!("no data, initializing empty document"); + return Ok(Self::new()); + } + tracing::trace!("loading first chunk"); + let (remaining, first_chunk) = storage::Chunk::parse(storage::parse::Input::new(data)) + .map_err(|e| load::Error::Parse(Box::new(e)))?; + if !first_chunk.checksum_valid() { + return Err(load::Error::BadChecksum.into()); + } + + let mut change: Option = None; + let mut am = match first_chunk { + storage::Chunk::Document(d) => { + tracing::trace!("first chunk is document chunk, inflating"); + let storage::load::Reconstructed { + max_op, + result: op_set, + changes, + heads, + } = storage::load::reconstruct_document(&d, mode, OpSet::builder()) + .map_err(|e| load::Error::InflateDocument(Box::new(e)))?; + let mut hashes_by_index = HashMap::new(); + let mut actor_to_history: HashMap> = HashMap::new(); + let mut change_graph = ChangeGraph::new(); + for (index, change) in changes.iter().enumerate() { + // SAFETY: This should be fine because we just constructed an opset containing + // all the changes + let actor_index = op_set.m.actors.lookup(change.actor_id()).unwrap(); + actor_to_history.entry(actor_index).or_default().push(index); + hashes_by_index.insert(index, change.hash()); + change_graph.add_change(change, actor_index)?; + } + let history_index = hashes_by_index.into_iter().map(|(k, v)| (v, k)).collect(); + Self { + queue: vec![], + history: changes, + history_index, + states: actor_to_history, + change_graph, + ops: op_set, + deps: heads.into_iter().collect(), + saved: Default::default(), + actor: Actor::Unused(ActorId::random()), + max_op, + text_encoding: Default::default(), + } + } + storage::Chunk::Change(stored_change) => { + tracing::trace!("first chunk is change chunk"); + change = Some( + Change::new_from_unverified(stored_change.into_owned(), None) + .map_err(|e| load::Error::InvalidChangeColumns(Box::new(e)))?, + ); + Self::new() + } + storage::Chunk::CompressedChange(stored_change, compressed) => { + tracing::trace!("first chunk is compressed change"); + change = Some( + Change::new_from_unverified( + stored_change.into_owned(), + Some(compressed.into_owned()), + ) + .map_err(|e| load::Error::InvalidChangeColumns(Box::new(e)))?, + ); + Self::new() + } + }; + tracing::trace!("loading change chunks"); + match load::load_changes(remaining.reset()) { + load::LoadedChanges::Complete(c) => { + am.apply_changes(change.into_iter().chain(c))?; + if !am.queue.is_empty() { + return Err(AutomergeError::MissingDeps); + } + } + load::LoadedChanges::Partial { error, .. } => { + if on_error == OnPartialLoad::Error { + return Err(error.into()); + } + } + } + if let Some(observer) = &mut observer { + current_state::observe_current_state(&am, *observer); + } + Ok(am) + } + + /// Load an incremental save of a document. + /// + /// Unlike `load` this imports changes into an existing document. It will work with both the + /// output of [`Self::save`] and [`Self::save_incremental`] + /// + /// The return value is the number of ops which were applied, this is not useful and will + /// change in future. + pub fn load_incremental(&mut self, data: &[u8]) -> Result { + self.load_incremental_with::<()>(data, None) + } + + /// Like [`Self::load_incremental`] but with an observer + pub fn load_incremental_with( + &mut self, + data: &[u8], + op_observer: Option<&mut Obs>, + ) -> Result { + if self.is_empty() { + let mut doc = + Self::load_with::<()>(data, OnPartialLoad::Ignore, VerificationMode::Check, None)?; + doc = doc + .with_encoding(self.text_encoding) + .with_actor(self.actor_id()); + if let Some(obs) = op_observer { + current_state::observe_current_state(&doc, obs); + } + *self = doc; + return Ok(self.ops.len()); + } + let changes = match load::load_changes(storage::parse::Input::new(data)) { + load::LoadedChanges::Complete(c) => c, + load::LoadedChanges::Partial { error, loaded, .. } => { + tracing::warn!(successful_chunks=loaded.len(), err=?error, "partial load"); + loaded + } + }; + let start = self.ops.len(); + self.apply_changes_with(changes, op_observer)?; + let delta = self.ops.len() - start; + Ok(delta) + } + + fn duplicate_seq(&self, change: &Change) -> bool { + let mut dup = false; + if let Some(actor_index) = self.ops.m.actors.lookup(change.actor_id()) { + if let Some(s) = self.states.get(&actor_index) { + dup = s.len() >= change.seq() as usize; + } + } + dup + } + + /// Apply changes to this document. + /// + /// This is idemptotent in the sense that if a change has already been applied it will be + /// ignored. + pub fn apply_changes( + &mut self, + changes: impl IntoIterator, + ) -> Result<(), AutomergeError> { + self.apply_changes_with::<_, ()>(changes, None) + } + + /// Like [`Self::apply_changes`] but with an observer + pub fn apply_changes_with, Obs: OpObserver>( + &mut self, + changes: I, + mut op_observer: Option<&mut Obs>, + ) -> Result<(), AutomergeError> { + // Record this so we can avoid observing each individual change and instead just observe + // the final state after all the changes have been applied. We can only do this for an + // empty document right now, once we have logic to produce the diffs between arbitrary + // states of the OpSet we can make this cleaner. + let empty_at_start = self.is_empty(); + for c in changes { + if !self.history_index.contains_key(&c.hash()) { + if self.duplicate_seq(&c) { + return Err(AutomergeError::DuplicateSeqNumber( + c.seq(), + c.actor_id().clone(), + )); + } + if self.is_causally_ready(&c) { + if empty_at_start { + self.apply_change::<()>(c, &mut None); + } else { + self.apply_change(c, &mut op_observer); + } + } else { + self.queue.push(c); + } + } + } + while let Some(c) = self.pop_next_causally_ready_change() { + if !self.history_index.contains_key(&c.hash()) { + if empty_at_start { + self.apply_change::<()>(c, &mut None); + } else { + self.apply_change(c, &mut op_observer); + } + } + } + if empty_at_start { + if let Some(observer) = &mut op_observer { + current_state::observe_current_state(self, *observer); + } + } + Ok(()) + } + + fn apply_change(&mut self, change: Change, observer: &mut Option<&mut Obs>) { + let ops = self.import_ops(&change); + self.update_history(change, ops.len()); + if let Some(observer) = observer { + for (obj, op) in ops { + self.insert_op_with_observer(&obj, op, *observer); + } + } else { + for (obj, op) in ops { + self.insert_op(&obj, op); + } + } + } + + fn is_causally_ready(&self, change: &Change) -> bool { + change + .deps() + .iter() + .all(|d| self.history_index.contains_key(d)) + } + + fn pop_next_causally_ready_change(&mut self) -> Option { + let mut index = 0; + while index < self.queue.len() { + if self.is_causally_ready(&self.queue[index]) { + return Some(self.queue.swap_remove(index)); + } + index += 1; + } + None + } + + fn import_ops(&mut self, change: &Change) -> Vec<(ObjId, Op)> { + let actor = self.ops.m.actors.cache(change.actor_id().clone()); + let mut actors = Vec::with_capacity(change.other_actor_ids().len() + 1); + actors.push(actor); + actors.extend( + change + .other_actor_ids() + .iter() + .map(|a| self.ops.m.actors.cache(a.clone())) + .collect::>(), + ); + change + .iter_ops() + .enumerate() + .map(|(i, c)| { + let id = OpId::new(change.start_op().get() + i as u64, actor); + let key = match &c.key { + EncodedKey::Prop(n) => Key::Map(self.ops.m.props.cache(n.to_string())), + EncodedKey::Elem(e) if e.is_head() => Key::Seq(ElemId::head()), + EncodedKey::Elem(ElemId(o)) => { + Key::Seq(ElemId(OpId::new(o.counter(), actors[o.actor()]))) + } + }; + let obj = if c.obj.is_root() { + ObjId::root() + } else { + ObjId(OpId::new( + c.obj.opid().counter(), + actors[c.obj.opid().actor()], + )) + }; + let pred = c + .pred + .iter() + .map(|p| OpId::new(p.counter(), actors[p.actor()])); + let pred = self.ops.m.sorted_opids(pred); + ( + obj, + Op { + id, + action: OpType::from_action_and_value(c.action, c.val), + key, + succ: Default::default(), + pred, + insert: c.insert, + }, + ) + }) + .collect() + } + + /// Takes all the changes in `other` which are not in `self` and applies them + pub fn merge(&mut self, other: &mut Self) -> Result, AutomergeError> { + self.merge_with::<()>(other, None) + } + + /// Takes all the changes in `other` which are not in `self` and applies them + pub fn merge_with( + &mut self, + other: &mut Self, + op_observer: Option<&mut Obs>, + ) -> Result, AutomergeError> { + // TODO: Make this fallible and figure out how to do this transactionally + let changes = self + .get_changes_added(other) + .into_iter() + .cloned() + .collect::>(); + tracing::trace!(changes=?changes.iter().map(|c| c.hash()).collect::>(), "merging new changes"); + self.apply_changes_with(changes, op_observer)?; + Ok(self.get_heads()) + } + + /// Save the entirety of this document in a compact form. + /// + /// This takes a mutable reference to self because it saves the heads of the last save so that + /// `save_incremental` can be used to produce only the changes since the last `save`. This API + /// will be changing in future. + pub fn save(&mut self) -> Vec { + let heads = self.get_heads(); + let c = self.history.iter(); + let bytes = crate::storage::save::save_document( + c, + self.ops.iter().map(|(objid, _, op)| (objid, op)), + &self.ops.m.actors, + &self.ops.m.props, + &heads, + None, + ); + self.saved = self.get_heads(); + bytes + } + + /// Save this document, but don't run it through DEFLATE afterwards + pub fn save_nocompress(&mut self) -> Vec { + let heads = self.get_heads(); + let c = self.history.iter(); + let bytes = crate::storage::save::save_document( + c, + self.ops.iter().map(|(objid, _, op)| (objid, op)), + &self.ops.m.actors, + &self.ops.m.props, + &heads, + Some(CompressConfig::None), + ); + self.saved = self.get_heads(); + bytes + } + + /// Save the changes since the last call to [Self::save`] + /// + /// The output of this will not be a compressed document format, but a series of individual + /// changes. This is useful if you know you have only made a small change since the last `save` + /// and you want to immediately send it somewhere (e.g. you've inserted a single character in a + /// text object). + pub fn save_incremental(&mut self) -> Vec { + let changes = self + .get_changes(self.saved.as_slice()) + .expect("Should only be getting changes using previously saved heads"); + let mut bytes = vec![]; + for c in changes { + bytes.extend(c.raw_bytes()); + } + if !bytes.is_empty() { + self.saved = self.get_heads() + } + bytes + } + + /// Filter the changes down to those that are not transitive dependencies of the heads. + /// + /// Thus a graph with these heads has not seen the remaining changes. + pub(crate) fn filter_changes( + &self, + heads: &[ChangeHash], + changes: &mut BTreeSet, + ) -> Result<(), AutomergeError> { + let heads = heads + .iter() + .filter(|hash| self.history_index.contains_key(hash)) + .copied() + .collect::>(); + + self.change_graph.remove_ancestors(changes, &heads); + + Ok(()) + } + + /// Get the changes since `have_deps` in this document using a clock internally. + fn get_changes_clock(&self, have_deps: &[ChangeHash]) -> Result, AutomergeError> { + // get the clock for the given deps + let clock = self.clock_at(have_deps); + + // get the documents current clock + + let mut change_indexes: Vec = Vec::new(); + // walk the state from the given deps clock and add them into the vec + for (actor_index, actor_changes) in &self.states { + if let Some(clock_data) = clock.get_for_actor(actor_index) { + // find the change in this actors sequence of changes that corresponds to the max_op + // recorded for them in the clock + change_indexes.extend(&actor_changes[clock_data.seq as usize..]); + } else { + change_indexes.extend(&actor_changes[..]); + } + } + + // ensure the changes are still in sorted order + change_indexes.sort_unstable(); + + Ok(change_indexes + .into_iter() + .map(|i| &self.history[i]) + .collect()) + } + + /// Get the last change this actor made to the document. + pub fn get_last_local_change(&self) -> Option<&Change> { + return self + .history + .iter() + .rev() + .find(|c| c.actor_id() == self.get_actor()); + } + + fn clock_at(&self, heads: &[ChangeHash]) -> Clock { + self.change_graph.clock_for_heads(heads) + } + + fn get_hash(&self, actor: usize, seq: u64) -> Result { + self.states + .get(&actor) + .and_then(|v| v.get(seq as usize - 1)) + .and_then(|&i| self.history.get(i)) + .map(|c| c.hash()) + .ok_or(AutomergeError::InvalidSeq(seq)) + } + + pub(crate) fn update_history(&mut self, change: Change, num_ops: usize) -> usize { + self.max_op = std::cmp::max(self.max_op, change.start_op().get() + num_ops as u64 - 1); + + self.update_deps(&change); + + let history_index = self.history.len(); + + let actor_index = self.ops.m.actors.cache(change.actor_id().clone()); + self.states + .entry(actor_index) + .or_default() + .push(history_index); + + self.history_index.insert(change.hash(), history_index); + self.change_graph + .add_change(&change, actor_index) + .expect("Change's deps should already be in the document"); + + self.history.push(change); + + history_index + } + + fn update_deps(&mut self, change: &Change) { + for d in change.deps() { + self.deps.remove(d); + } + self.deps.insert(change.hash()); + } + + #[doc(hidden)] + pub fn import(&self, s: &str) -> Result<(ExId, ObjType), AutomergeError> { + if s == "_root" { + Ok((ExId::Root, ObjType::Map)) + } else { + let n = s + .find('@') + .ok_or_else(|| AutomergeError::InvalidObjIdFormat(s.to_owned()))?; + let counter = s[0..n] + .parse() + .map_err(|_| AutomergeError::InvalidObjIdFormat(s.to_owned()))?; + let actor = ActorId::from(hex::decode(&s[(n + 1)..]).unwrap()); + let actor = self + .ops + .m + .actors + .lookup(&actor) + .ok_or_else(|| AutomergeError::InvalidObjId(s.to_owned()))?; + let obj = ExId::Id(counter, self.ops.m.actors.cache[actor].clone(), actor); + let obj_type = self + .object_type(&obj) + .map_err(|_| AutomergeError::InvalidObjId(s.to_owned()))?; + Ok((obj, obj_type)) + } + } + + pub(crate) fn to_string(&self, id: E) -> String { + match id.export() { + Export::Id(id) => format!("{}@{}", id.counter(), self.ops.m.actors[id.actor()]), + Export::Prop(index) => self.ops.m.props[index].clone(), + Export::Special(s) => s, + } + } + + pub fn dump(&self) { + log!( + " {:12} {:12} {:12} {:12} {:12} {:12}", + "id", + "obj", + "key", + "value", + "pred", + "succ" + ); + for (obj, _, op) in self.ops.iter() { + let id = self.to_string(op.id); + let obj = self.to_string(obj); + let key = match op.key { + Key::Map(n) => self.ops.m.props[n].clone(), + Key::Seq(n) => self.to_string(n), + }; + let value: String = match &op.action { + OpType::Put(value) => format!("{}", value), + OpType::Make(obj) => format!("make({})", obj), + OpType::Increment(obj) => format!("inc({})", obj), + OpType::Delete => format!("del{}", 0), + }; + let pred: Vec<_> = op.pred.iter().map(|id| self.to_string(*id)).collect(); + let succ: Vec<_> = op.succ.into_iter().map(|id| self.to_string(*id)).collect(); + log!( + " {:12} {:12} {:12} {:12} {:12?} {:12?}", + id, + obj, + key, + value, + pred, + succ + ); + } + } + + /// Return a graphviz representation of the opset. + /// + /// # Arguments + /// + /// * objects: An optional list of object IDs to display, if not specified all objects are + /// visualised + #[cfg(feature = "optree-visualisation")] + pub fn visualise_optree(&self, objects: Option>) -> String { + let objects = objects.map(|os| { + os.iter() + .filter_map(|o| self.exid_to_obj(o).ok()) + .map(|o| o.0) + .collect() + }); + self.ops.visualise(objects) + } + + pub(crate) fn insert_op(&mut self, obj: &ObjId, op: Op) -> Op { + let q = self.ops.search(obj, query::SeekOp::new(&op)); + + let succ = q.succ; + let pos = q.pos; + + self.ops.add_succ(obj, &succ, &op); + + if !op.is_delete() { + self.ops.insert(pos, obj, op.clone()); + } + op + } + + pub(crate) fn insert_op_with_observer( + &mut self, + obj: &ObjId, + op: Op, + observer: &mut Obs, + ) -> Op { + let obj_type = self.ops.object_type(obj); + let encoding = obj_type + .map(|o| ListEncoding::new(o, self.text_encoding)) + .unwrap_or_default(); + let q = self + .ops + .search(obj, query::SeekOpWithPatch::new(&op, encoding)); + + let query::SeekOpWithPatch { + pos, + succ, + seen, + last_width, + values, + had_value_before, + .. + } = q; + + let ex_obj = self.ops.id_to_exid(obj.0); + + let key = match op.key { + Key::Map(index) => self.ops.m.props[index].clone().into(), + Key::Seq(_) => seen.into(), + }; + + if op.insert { + if obj_type == Some(ObjType::Text) { + observer.splice_text(self, ex_obj, seen, op.to_str()); + } else { + let value = (op.value(), self.ops.id_to_exid(op.id)); + observer.insert(self, ex_obj, seen, value); + } + } else if op.is_delete() { + if let Some(winner) = &values.last() { + let value = (winner.value(), self.ops.id_to_exid(winner.id)); + let conflict = values.len() > 1; + observer.expose(self, ex_obj, key, value, conflict); + } else if had_value_before { + match key { + Prop::Map(k) => observer.delete_map(self, ex_obj, &k), + Prop::Seq(index) => observer.delete_seq(self, ex_obj, index, last_width), + } + } + } else if let Some(value) = op.get_increment_value() { + // only observe this increment if the counter is visible, i.e. the counter's + // create op is in the values + //if values.iter().any(|value| op.pred.contains(&value.id)) { + if values + .last() + .map(|value| op.pred.contains(&value.id)) + .unwrap_or_default() + { + // we have observed the value + observer.increment(self, ex_obj, key, (value, self.ops.id_to_exid(op.id))); + } + } else { + let just_conflict = values + .last() + .map(|value| self.ops.m.lamport_cmp(op.id, value.id) != Ordering::Greater) + .unwrap_or(false); + let value = (op.value(), self.ops.id_to_exid(op.id)); + if op.is_list_op() && !had_value_before { + observer.insert(self, ex_obj, seen, value); + } else if just_conflict { + observer.flag_conflict(self, ex_obj, key); + } else { + let conflict = !values.is_empty(); + observer.put(self, ex_obj, key, value, conflict); + } + } + + self.ops.add_succ(obj, &succ, &op); + + if !op.is_delete() { + self.ops.insert(pos, obj, op.clone()); + } + + op + } + + /// Get the heads of this document. + pub fn get_heads(&self) -> Vec { + let mut deps: Vec<_> = self.deps.iter().copied().collect(); + deps.sort_unstable(); + deps + } + + pub fn get_changes(&self, have_deps: &[ChangeHash]) -> Result, AutomergeError> { + self.get_changes_clock(have_deps) + } + + /// Get changes in `other` that are not in `self + pub fn get_changes_added<'a>(&self, other: &'a Self) -> Vec<&'a Change> { + // Depth-first traversal from the heads through the dependency graph, + // until we reach a change that is already present in other + let mut stack: Vec<_> = other.get_heads(); + tracing::trace!(their_heads=?stack, "finding changes to merge"); + let mut seen_hashes = HashSet::new(); + let mut added_change_hashes = Vec::new(); + while let Some(hash) = stack.pop() { + if !seen_hashes.contains(&hash) && self.get_change_by_hash(&hash).is_none() { + seen_hashes.insert(hash); + added_change_hashes.push(hash); + if let Some(change) = other.get_change_by_hash(&hash) { + stack.extend(change.deps()); + } + } + } + // Return those changes in the reverse of the order in which the depth-first search + // found them. This is not necessarily a topological sort, but should usually be close. + added_change_hashes.reverse(); + added_change_hashes + .into_iter() + .filter_map(|h| other.get_change_by_hash(&h)) + .collect() + } +} + +impl ReadDoc for Automerge { + fn parents>(&self, obj: O) -> Result, AutomergeError> { + let (obj_id, _) = self.exid_to_obj(obj.as_ref())?; + Ok(self.ops.parents(obj_id)) + } + + fn path_to_object>(&self, obj: O) -> Result, AutomergeError> { + Ok(self.parents(obj.as_ref().clone())?.path()) + } + + fn keys>(&self, obj: O) -> Keys<'_, '_> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + let iter_keys = self.ops.keys(obj); + Keys::new(self, iter_keys) + } else { + Keys::new(self, None) + } + } + + fn keys_at>(&self, obj: O, heads: &[ChangeHash]) -> KeysAt<'_, '_> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + let clock = self.clock_at(heads); + return KeysAt::new(self, self.ops.keys_at(obj, clock)); + } + KeysAt::new(self, None) + } + + fn map_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> MapRange<'_, R> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + MapRange::new(self, self.ops.map_range(obj, range)) + } else { + MapRange::new(self, None) + } + } + + fn map_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> MapRangeAt<'_, R> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + let clock = self.clock_at(heads); + let iter_range = self.ops.map_range_at(obj, range, clock); + return MapRangeAt::new(self, iter_range); + } + MapRangeAt::new(self, None) + } + + fn list_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> ListRange<'_, R> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + ListRange::new(self, self.ops.list_range(obj, range)) + } else { + ListRange::new(self, None) + } + } + + fn list_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> ListRangeAt<'_, R> { + if let Ok((obj, _)) = self.exid_to_obj(obj.as_ref()) { + let clock = self.clock_at(heads); + let iter_range = self.ops.list_range_at(obj, range, clock); + return ListRangeAt::new(self, iter_range); + } + ListRangeAt::new(self, None) + } + + fn values>(&self, obj: O) -> Values<'_> { + if let Ok((obj, obj_type)) = self.exid_to_obj(obj.as_ref()) { + if obj_type.is_sequence() { + Values::new(self, self.ops.list_range(obj, ..)) + } else { + Values::new(self, self.ops.map_range(obj, ..)) + } + } else { + Values::empty(self) + } + } + + fn values_at>(&self, obj: O, heads: &[ChangeHash]) -> Values<'_> { + if let Ok((obj, obj_type)) = self.exid_to_obj(obj.as_ref()) { + let clock = self.clock_at(heads); + match obj_type { + ObjType::Map | ObjType::Table => { + let iter_range = self.ops.map_range_at(obj, .., clock); + Values::new(self, iter_range) + } + ObjType::List | ObjType::Text => { + let iter_range = self.ops.list_range_at(obj, .., clock); + Values::new(self, iter_range) + } + } + } else { + Values::empty(self) + } + } + + fn length>(&self, obj: O) -> usize { + if let Ok((inner_obj, obj_type)) = self.exid_to_obj(obj.as_ref()) { + if obj_type == ObjType::Map || obj_type == ObjType::Table { + self.keys(obj).count() + } else { + let encoding = ListEncoding::new(obj_type, self.text_encoding); + self.ops.search(&inner_obj, query::Len::new(encoding)).len + } + } else { + 0 + } + } + + fn length_at>(&self, obj: O, heads: &[ChangeHash]) -> usize { + if let Ok((inner_obj, obj_type)) = self.exid_to_obj(obj.as_ref()) { + let clock = self.clock_at(heads); + if obj_type == ObjType::Map || obj_type == ObjType::Table { + self.keys_at(obj, heads).count() + } else { + let encoding = ListEncoding::new(obj_type, self.text_encoding); + self.ops + .search(&inner_obj, query::LenAt::new(clock, encoding)) + .len + } + } else { + 0 + } + } + + fn object_type>(&self, obj: O) -> Result { + let (_, obj_type) = self.exid_to_obj(obj.as_ref())?; + Ok(obj_type) + } + + fn text>(&self, obj: O) -> Result { + let obj = self.exid_to_obj(obj.as_ref())?.0; + let query = self.ops.search(&obj, query::ListVals::new()); + let mut buffer = String::new(); + for q in &query.ops { + buffer.push_str(q.to_str()); + } + Ok(buffer) + } + + fn text_at>( + &self, + obj: O, + heads: &[ChangeHash], + ) -> Result { + let obj = self.exid_to_obj(obj.as_ref())?.0; + let clock = self.clock_at(heads); + let query = self.ops.search(&obj, query::ListValsAt::new(clock)); + let mut buffer = String::new(); + for q in &query.ops { + if let OpType::Put(ScalarValue::Str(s)) = &q.action { + buffer.push_str(s); + } else { + buffer.push('\u{fffc}'); + } + } + Ok(buffer) + } + + fn get, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + Ok(self.get_all(obj, prop.into())?.last().cloned()) + } + + fn get_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + Ok(self.get_all_at(obj, prop, heads)?.last().cloned()) + } + + fn get_all, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + let obj = self.exid_to_obj(obj.as_ref())?.0; + let mut result = match prop.into() { + Prop::Map(p) => { + let prop = self.ops.m.props.lookup(&p); + if let Some(p) = prop { + self.ops + .search(&obj, query::Prop::new(p)) + .ops + .into_iter() + .map(|o| (o.value(), self.id_to_exid(o.id))) + .collect() + } else { + vec![] + } + } + Prop::Seq(n) => { + let obj_type = self.ops.object_type(&obj); + let encoding = obj_type + .map(|o| ListEncoding::new(o, self.text_encoding)) + .unwrap_or_default(); + self.ops + .search(&obj, query::Nth::new(n, encoding)) + .ops + .into_iter() + .map(|o| (o.value(), self.id_to_exid(o.id))) + .collect() + } + }; + result.sort_by(|a, b| b.1.cmp(&a.1)); + Ok(result) + } + + fn get_all_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + let prop = prop.into(); + let obj = self.exid_to_obj(obj.as_ref())?.0; + let clock = self.clock_at(heads); + let result = match prop { + Prop::Map(p) => { + let prop = self.ops.m.props.lookup(&p); + if let Some(p) = prop { + self.ops + .search(&obj, query::PropAt::new(p, clock)) + .ops + .into_iter() + .map(|o| (o.clone_value(), self.id_to_exid(o.id))) + .collect() + } else { + vec![] + } + } + Prop::Seq(n) => { + let obj_type = self.ops.object_type(&obj); + let encoding = obj_type + .map(|o| ListEncoding::new(o, self.text_encoding)) + .unwrap_or_default(); + self.ops + .search(&obj, query::NthAt::new(n, clock, encoding)) + .ops + .into_iter() + .map(|o| (o.clone_value(), self.id_to_exid(o.id))) + .collect() + } + }; + Ok(result) + } + + fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec { + let in_queue: HashSet<_> = self.queue.iter().map(|change| change.hash()).collect(); + let mut missing = HashSet::new(); + + for head in self.queue.iter().flat_map(|change| change.deps()) { + if !self.history_index.contains_key(head) { + missing.insert(head); + } + } + + for head in heads { + if !self.history_index.contains_key(head) { + missing.insert(head); + } + } + + let mut missing = missing + .into_iter() + .filter(|hash| !in_queue.contains(hash)) + .copied() + .collect::>(); + missing.sort(); + missing + } + + fn get_change_by_hash(&self, hash: &ChangeHash) -> Option<&Change> { + self.history_index + .get(hash) + .and_then(|index| self.history.get(*index)) + } +} + +impl Default for Automerge { + fn default() -> Self { + Self::new() + } +} + +#[derive(Serialize, Debug, Clone, PartialEq)] +pub(crate) struct SpanInfo { + pub(crate) id: ExId, + pub(crate) time: i64, + pub(crate) start: usize, + pub(crate) end: usize, + #[serde(rename = "type")] + pub(crate) span_type: String, + pub(crate) value: ScalarValue, +} diff --git a/rust/automerge/src/automerge/current_state.rs b/rust/automerge/src/automerge/current_state.rs new file mode 100644 index 00000000..3f7f4afc --- /dev/null +++ b/rust/automerge/src/automerge/current_state.rs @@ -0,0 +1,915 @@ +use std::{borrow::Cow, collections::HashSet, iter::Peekable}; + +use itertools::Itertools; + +use crate::{ + types::{ElemId, Key, ListEncoding, ObjId, Op, OpId}, + ObjType, OpObserver, OpType, ScalarValue, Value, +}; + +/// Traverse the "current" state of the document, notifying `observer` +/// +/// The "current" state of the document is the set of visible operations. This function will +/// traverse that set of operations and call the corresponding methods on the `observer` as it +/// encounters values. The `observer` methods will be called in the order in which they appear in +/// the document. That is to say that the observer will be notified of parent objects before the +/// objects they contain and elements of a sequence will be notified in the order they occur. +/// +/// Due to only notifying of visible operations the observer will only be called with `put`, +/// `insert`, and `splice`, operations. +pub(super) fn observe_current_state(doc: &crate::Automerge, observer: &mut O) { + // The OpSet already exposes operations in the order they appear in the document. + // `OpSet::iter_objs` iterates over the objects in causal order, this means that parent objects + // will always appear before their children. Furthermore, the operations within each object are + // ordered by key (which means by their position in a sequence for sequences). + // + // Effectively then we iterate over each object, then we group the operations in the object by + // key and for each key find the visible operations for that key. Then we notify the observer + // for each of those visible operations. + let mut visible_objs = HashSet::new(); + visible_objs.insert(ObjId::root()); + for (obj, typ, ops) in doc.ops().iter_objs() { + if !visible_objs.contains(obj) { + continue; + } + let ops_by_key = ops.group_by(|o| o.key); + let actions = ops_by_key + .into_iter() + .flat_map(|(key, key_ops)| key_actions(key, key_ops)); + if typ == ObjType::Text && !observer.text_as_seq() { + track_new_objs_and_notify( + &mut visible_objs, + doc, + obj, + typ, + observer, + text_actions(actions), + ) + } else if typ == ObjType::List { + track_new_objs_and_notify( + &mut visible_objs, + doc, + obj, + typ, + observer, + list_actions(actions), + ) + } else { + track_new_objs_and_notify(&mut visible_objs, doc, obj, typ, observer, actions) + } + } +} + +fn track_new_objs_and_notify, O: OpObserver>( + visible_objs: &mut HashSet, + doc: &crate::Automerge, + obj: &ObjId, + typ: ObjType, + observer: &mut O, + actions: I, +) { + let exid = doc.id_to_exid(obj.0); + for action in actions { + if let Some(obj) = action.made_object() { + visible_objs.insert(obj); + } + action.notify_observer(doc, &exid, obj, typ, observer); + } +} + +trait Action { + /// Notify an observer of whatever this action does + fn notify_observer( + self, + doc: &crate::Automerge, + exid: &crate::ObjId, + obj: &ObjId, + typ: ObjType, + observer: &mut O, + ); + + /// If this action created an object, return the ID of that object + fn made_object(&self) -> Option; +} + +fn key_actions<'a, I: Iterator>( + key: Key, + key_ops: I, +) -> impl Iterator> { + #[derive(Clone)] + enum CurrentOp<'a> { + Put { + value: Value<'a>, + id: OpId, + conflicted: bool, + }, + Insert(Value<'a>, OpId), + } + let current_ops = key_ops + .filter(|o| o.visible()) + .filter_map(|o| match o.action { + OpType::Make(obj_type) => { + let value = Value::Object(obj_type); + if o.insert { + Some(CurrentOp::Insert(value, o.id)) + } else { + Some(CurrentOp::Put { + value, + id: o.id, + conflicted: false, + }) + } + } + OpType::Put(ref value) => { + let value = Value::Scalar(Cow::Borrowed(value)); + if o.insert { + Some(CurrentOp::Insert(value, o.id)) + } else { + Some(CurrentOp::Put { + value, + id: o.id, + conflicted: false, + }) + } + } + _ => None, + }); + current_ops + .coalesce(|previous, current| match (previous, current) { + (CurrentOp::Put { .. }, CurrentOp::Put { value, id, .. }) => Ok(CurrentOp::Put { + value, + id, + conflicted: true, + }), + (previous, current) => Err((previous, current)), + }) + .map(move |op| match op { + CurrentOp::Put { + value, + id, + conflicted, + } => SimpleAction::Put { + prop: key, + tagged_value: (value, id), + conflict: conflicted, + }, + CurrentOp::Insert(val, id) => SimpleAction::Insert { + elem_id: ElemId(id), + tagged_value: (val, id), + }, + }) +} + +/// Either a "put" or "insert" action. i.e. not splicing for text values +enum SimpleAction<'a> { + Put { + prop: Key, + tagged_value: (Value<'a>, OpId), + conflict: bool, + }, + Insert { + elem_id: ElemId, + tagged_value: (Value<'a>, OpId), + }, +} + +impl<'a> Action for SimpleAction<'a> { + fn notify_observer( + self, + doc: &crate::Automerge, + exid: &crate::ObjId, + obj: &ObjId, + typ: ObjType, + observer: &mut O, + ) { + let encoding = match typ { + ObjType::Text => ListEncoding::Text(doc.text_encoding()), + _ => ListEncoding::List, + }; + match self { + Self::Put { + prop, + tagged_value, + conflict, + } => { + let tagged_value = (tagged_value.0, doc.id_to_exid(tagged_value.1)); + let prop = doc.ops().export_key(*obj, prop, encoding).unwrap(); + observer.put(doc, exid.clone(), prop, tagged_value, conflict); + } + Self::Insert { + elem_id, + tagged_value: (value, opid), + } => { + let index = doc + .ops() + .search(obj, crate::query::ElemIdPos::new(elem_id, encoding)) + .index() + .unwrap(); + let tagged_value = (value, doc.id_to_exid(opid)); + observer.insert(doc, doc.id_to_exid(obj.0), index, tagged_value); + } + } + } + + fn made_object(&self) -> Option { + match self { + Self::Put { + tagged_value: (Value::Object(_), id), + .. + } => Some((*id).into()), + Self::Insert { + tagged_value: (Value::Object(_), id), + .. + } => Some((*id).into()), + _ => None, + } + } +} + +/// An `Action` which splices for text values +enum TextAction<'a> { + Action(SimpleAction<'a>), + Splice { start: ElemId, chars: String }, +} + +impl<'a> Action for TextAction<'a> { + fn notify_observer( + self, + doc: &crate::Automerge, + exid: &crate::ObjId, + obj: &ObjId, + typ: ObjType, + observer: &mut O, + ) { + match self { + Self::Action(action) => action.notify_observer(doc, exid, obj, typ, observer), + Self::Splice { start, chars } => { + let index = doc + .ops() + .search( + obj, + crate::query::ElemIdPos::new( + start, + ListEncoding::Text(doc.text_encoding()), + ), + ) + .index() + .unwrap(); + observer.splice_text(doc, doc.id_to_exid(obj.0), index, chars.as_str()); + } + } + } + + fn made_object(&self) -> Option { + match self { + Self::Action(action) => action.made_object(), + _ => None, + } + } +} + +fn list_actions<'a, I: Iterator>>( + actions: I, +) -> impl Iterator> { + actions.map(|a| match a { + SimpleAction::Put { + prop: Key::Seq(elem_id), + tagged_value, + .. + } => SimpleAction::Insert { + elem_id, + tagged_value, + }, + a => a, + }) +} + +/// Condense consecutive `SimpleAction::Insert` actions into one `TextAction::Splice` +fn text_actions<'a, I>(actions: I) -> impl Iterator> +where + I: Iterator>, +{ + TextActions { + ops: actions.peekable(), + } +} + +struct TextActions<'a, I: Iterator>> { + ops: Peekable, +} + +impl<'a, I: Iterator>> Iterator for TextActions<'a, I> { + type Item = TextAction<'a>; + + fn next(&mut self) -> Option { + if let Some(SimpleAction::Insert { .. }) = self.ops.peek() { + let (start, value) = match self.ops.next() { + Some(SimpleAction::Insert { + tagged_value: (value, opid), + .. + }) => (opid, value), + _ => unreachable!(), + }; + let mut chars = match value { + Value::Scalar(Cow::Borrowed(ScalarValue::Str(s))) => s.to_string(), + _ => "\u{fffc}".to_string(), + }; + while let Some(SimpleAction::Insert { .. }) = self.ops.peek() { + if let Some(SimpleAction::Insert { + tagged_value: (value, _), + .. + }) = self.ops.next() + { + match value { + Value::Scalar(Cow::Borrowed(ScalarValue::Str(s))) => chars.push_str(s), + _ => chars.push('\u{fffc}'), + } + } + } + Some(TextAction::Splice { + start: ElemId(start), + chars, + }) + } else { + self.ops.next().map(TextAction::Action) + } + } +} + +#[cfg(test)] +mod tests { + use std::{borrow::Cow, fs}; + + use crate::{transaction::Transactable, Automerge, ObjType, OpObserver, Prop, ReadDoc, Value}; + + // Observer ops often carry a "tagged value", which is a value and the OpID of the op which + // created that value. For a lot of values (i.e. any scalar value) we don't care about the + // opid. This type implements `PartialEq` for the `Untagged` variant by ignoring the tag, which + // allows us to express tests which don't care about the tag. + #[derive(Clone, Debug)] + enum ObservedValue { + Tagged(crate::Value<'static>, crate::ObjId), + Untagged(crate::Value<'static>), + } + + impl<'a> From<(Value<'a>, crate::ObjId)> for ObservedValue { + fn from(value: (Value<'a>, crate::ObjId)) -> Self { + Self::Tagged(value.0.into_owned(), value.1) + } + } + + impl PartialEq for ObservedValue { + fn eq(&self, other: &ObservedValue) -> bool { + match (self, other) { + (Self::Tagged(v1, o1), Self::Tagged(v2, o2)) => equal_vals(v1, v2) && o1 == o2, + (Self::Untagged(v1), Self::Untagged(v2)) => equal_vals(v1, v2), + (Self::Tagged(v1, _), Self::Untagged(v2)) => equal_vals(v1, v2), + (Self::Untagged(v1), Self::Tagged(v2, _)) => equal_vals(v1, v2), + } + } + } + + /// Consider counters equal if they have the same current value + fn equal_vals(v1: &Value<'_>, v2: &Value<'_>) -> bool { + match (v1, v2) { + (Value::Scalar(v1), Value::Scalar(v2)) => match (v1.as_ref(), v2.as_ref()) { + (crate::ScalarValue::Counter(c1), crate::ScalarValue::Counter(c2)) => { + c1.current == c2.current + } + _ => v1 == v2, + }, + _ => v1 == v2, + } + } + + #[derive(Debug, Clone, PartialEq)] + enum ObserverCall { + Put { + obj: crate::ObjId, + prop: Prop, + value: ObservedValue, + conflict: bool, + }, + Insert { + obj: crate::ObjId, + index: usize, + value: ObservedValue, + }, + SpliceText { + obj: crate::ObjId, + index: usize, + chars: String, + }, + } + + // A Vec is pretty hard to look at in a test failure. This wrapper prints the + // calls out in a nice table so it's easier to see what's different + #[derive(Clone, PartialEq)] + struct Calls(Vec); + + impl std::fmt::Debug for Calls { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut table = prettytable::Table::new(); + table.set_format(*prettytable::format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR); + table.set_titles(prettytable::row![ + "Op", "Object", "Property", "Value", "Conflict" + ]); + for call in &self.0 { + match call { + ObserverCall::Put { + obj, + prop, + value, + conflict, + } => { + table.add_row(prettytable::row![ + "Put", + format!("{}", obj), + prop, + match value { + ObservedValue::Tagged(v, o) => format!("{} ({})", v, o), + ObservedValue::Untagged(v) => format!("{}", v), + }, + conflict + ]); + } + ObserverCall::Insert { obj, index, value } => { + table.add_row(prettytable::row![ + "Insert", + format!("{}", obj), + index, + match value { + ObservedValue::Tagged(v, o) => format!("{} ({})", v, o), + ObservedValue::Untagged(v) => format!("{}", v), + }, + "" + ]); + } + ObserverCall::SpliceText { obj, index, chars } => { + table.add_row(prettytable::row![ + "SpliceText", + format!("{}", obj), + index, + chars, + "" + ]); + } + } + } + let mut out = Vec::new(); + table.print(&mut out).unwrap(); + write!(f, "\n{}\n", String::from_utf8(out).unwrap()) + } + } + + struct ObserverStub { + ops: Vec, + text_as_seq: bool, + } + + impl ObserverStub { + fn new() -> Self { + Self { + ops: Vec::new(), + text_as_seq: true, + } + } + + fn new_text_v2() -> Self { + Self { + ops: Vec::new(), + text_as_seq: false, + } + } + } + + impl OpObserver for ObserverStub { + fn insert( + &mut self, + _doc: &R, + objid: crate::ObjId, + index: usize, + tagged_value: (crate::Value<'_>, crate::ObjId), + ) { + self.ops.push(ObserverCall::Insert { + obj: objid, + index, + value: tagged_value.into(), + }); + } + + fn splice_text( + &mut self, + _doc: &R, + objid: crate::ObjId, + index: usize, + value: &str, + ) { + self.ops.push(ObserverCall::SpliceText { + obj: objid, + index, + chars: value.to_string(), + }); + } + + fn put( + &mut self, + _doc: &R, + objid: crate::ObjId, + prop: crate::Prop, + tagged_value: (crate::Value<'_>, crate::ObjId), + conflict: bool, + ) { + self.ops.push(ObserverCall::Put { + obj: objid, + prop, + value: tagged_value.into(), + conflict, + }); + } + + fn expose( + &mut self, + _doc: &R, + _objid: crate::ObjId, + _prop: crate::Prop, + _tagged_value: (crate::Value<'_>, crate::ObjId), + _conflict: bool, + ) { + panic!("expose not expected"); + } + + fn increment( + &mut self, + _doc: &R, + _objid: crate::ObjId, + _prop: crate::Prop, + _tagged_value: (i64, crate::ObjId), + ) { + panic!("increment not expected"); + } + + fn delete_map(&mut self, _doc: &R, _objid: crate::ObjId, _key: &str) { + panic!("delete not expected"); + } + + fn delete_seq( + &mut self, + _doc: &R, + _objid: crate::ObjId, + _index: usize, + _num: usize, + ) { + panic!("delete not expected"); + } + + fn text_as_seq(&self) -> bool { + self.text_as_seq + } + } + + #[test] + fn basic_test() { + let mut doc = crate::AutoCommit::new(); + doc.put(crate::ROOT, "key", "value").unwrap(); + let map = doc.put_object(crate::ROOT, "map", ObjType::Map).unwrap(); + doc.put(&map, "nested_key", "value").unwrap(); + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + doc.insert(&list, 0, "value").unwrap(); + let text = doc.put_object(crate::ROOT, "text", ObjType::Text).unwrap(); + doc.insert(&text, 0, "a").unwrap(); + + let mut obs = ObserverStub::new(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "key".into(), + value: ObservedValue::Untagged("value".into()), + conflict: false, + }, + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Put { + obj: crate::ROOT, + prop: "map".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::Map), map.clone()), + conflict: false, + }, + ObserverCall::Put { + obj: crate::ROOT, + prop: "text".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::Text), text.clone()), + conflict: false, + }, + ObserverCall::Put { + obj: map.clone(), + prop: "nested_key".into(), + value: ObservedValue::Untagged("value".into()), + conflict: false, + }, + ObserverCall::Insert { + obj: list, + index: 0, + value: ObservedValue::Untagged("value".into()), + }, + ObserverCall::Insert { + obj: text, + index: 0, + value: ObservedValue::Untagged("a".into()), + }, + ]) + ); + } + + #[test] + fn test_deleted_ops_omitted() { + let mut doc = crate::AutoCommit::new(); + doc.put(crate::ROOT, "key", "value").unwrap(); + doc.delete(crate::ROOT, "key").unwrap(); + let map = doc.put_object(crate::ROOT, "map", ObjType::Map).unwrap(); + doc.put(&map, "nested_key", "value").unwrap(); + doc.delete(&map, "nested_key").unwrap(); + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + doc.insert(&list, 0, "value").unwrap(); + doc.delete(&list, 0).unwrap(); + let text = doc.put_object(crate::ROOT, "text", ObjType::Text).unwrap(); + doc.insert(&text, 0, "a").unwrap(); + doc.delete(&text, 0).unwrap(); + + doc.put_object(crate::ROOT, "deleted_map", ObjType::Map) + .unwrap(); + doc.delete(crate::ROOT, "deleted_map").unwrap(); + doc.put_object(crate::ROOT, "deleted_list", ObjType::List) + .unwrap(); + doc.delete(crate::ROOT, "deleted_list").unwrap(); + doc.put_object(crate::ROOT, "deleted_text", ObjType::Text) + .unwrap(); + doc.delete(crate::ROOT, "deleted_text").unwrap(); + + let mut obs = ObserverStub::new(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Put { + obj: crate::ROOT, + prop: "map".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::Map), map.clone()), + conflict: false, + }, + ObserverCall::Put { + obj: crate::ROOT, + prop: "text".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::Text), text.clone()), + conflict: false, + }, + ]) + ); + } + + #[test] + fn test_text_spliced() { + let mut doc = crate::AutoCommit::new(); + let text = doc.put_object(crate::ROOT, "text", ObjType::Text).unwrap(); + doc.insert(&text, 0, "a").unwrap(); + doc.splice_text(&text, 1, 0, "bcdef").unwrap(); + doc.splice_text(&text, 2, 2, "g").unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "text".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::Text), text.clone()), + conflict: false, + }, + ObserverCall::SpliceText { + obj: text, + index: 0, + chars: "abgef".to_string() + } + ]) + ); + } + + #[test] + fn test_counters() { + let actor1 = crate::ActorId::from("aa".as_bytes()); + let actor2 = crate::ActorId::from("bb".as_bytes()); + let mut doc = crate::AutoCommit::new().with_actor(actor2); + + let mut doc2 = doc.fork().with_actor(actor1); + doc2.put(crate::ROOT, "key", "someval").unwrap(); + + doc.put(crate::ROOT, "key", crate::ScalarValue::Counter(1.into())) + .unwrap(); + doc.increment(crate::ROOT, "key", 2).unwrap(); + doc.increment(crate::ROOT, "key", 3).unwrap(); + + doc.merge(&mut doc2).unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ObserverCall::Put { + obj: crate::ROOT, + prop: "key".into(), + value: ObservedValue::Untagged(Value::Scalar(Cow::Owned( + crate::ScalarValue::Counter(6.into()) + ))), + conflict: true, + },]) + ); + } + + #[test] + fn test_multiple_list_insertions() { + let mut doc = crate::AutoCommit::new(); + + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + doc.insert(&list, 0, 1).unwrap(); + doc.insert(&list, 1, 2).unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Insert { + obj: list.clone(), + index: 0, + value: ObservedValue::Untagged(1.into()), + }, + ObserverCall::Insert { + obj: list, + index: 1, + value: ObservedValue::Untagged(2.into()), + }, + ]) + ); + } + + #[test] + fn test_concurrent_insertions_at_same_index() { + let mut doc = crate::AutoCommit::new().with_actor(crate::ActorId::from("aa".as_bytes())); + + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + + let mut doc2 = doc.fork().with_actor(crate::ActorId::from("bb".as_bytes())); + + doc.insert(&list, 0, 1).unwrap(); + doc2.insert(&list, 0, 2).unwrap(); + doc.merge(&mut doc2).unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Insert { + obj: list.clone(), + index: 0, + value: ObservedValue::Untagged(2.into()), + }, + ObserverCall::Insert { + obj: list, + index: 1, + value: ObservedValue::Untagged(1.into()), + }, + ]) + ); + } + + #[test] + fn test_insert_objects() { + let mut doc = crate::AutoCommit::new().with_actor(crate::ActorId::from("aa".as_bytes())); + + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + + let map = doc.insert_object(&list, 0, ObjType::Map).unwrap(); + doc.put(&map, "key", "value").unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Insert { + obj: list.clone(), + index: 0, + value: ObservedValue::Tagged(Value::Object(ObjType::Map), map.clone()), + }, + ObserverCall::Put { + obj: map, + prop: "key".into(), + value: ObservedValue::Untagged("value".into()), + conflict: false + }, + ]) + ); + } + + #[test] + fn test_insert_and_update() { + let mut doc = crate::AutoCommit::new(); + + let list = doc.put_object(crate::ROOT, "list", ObjType::List).unwrap(); + + doc.insert(&list, 0, "one").unwrap(); + doc.insert(&list, 1, "two").unwrap(); + doc.put(&list, 0, "three").unwrap(); + doc.put(&list, 1, "four").unwrap(); + + let mut obs = ObserverStub::new_text_v2(); + super::observe_current_state(doc.document(), &mut obs); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ + ObserverCall::Put { + obj: crate::ROOT, + prop: "list".into(), + value: ObservedValue::Tagged(Value::Object(ObjType::List), list.clone()), + conflict: false, + }, + ObserverCall::Insert { + obj: list.clone(), + index: 0, + value: ObservedValue::Untagged("three".into()), + }, + ObserverCall::Insert { + obj: list.clone(), + index: 1, + value: ObservedValue::Untagged("four".into()), + }, + ]) + ); + } + + #[test] + fn test_load_changes() { + fn fixture(name: &str) -> Vec { + fs::read("./tests/fixtures/".to_owned() + name).unwrap() + } + + let mut obs = ObserverStub::new(); + let _doc = Automerge::load_with( + &fixture("counter_value_is_ok.automerge"), + crate::OnPartialLoad::Error, + crate::storage::VerificationMode::Check, + Some(&mut obs), + ); + + assert_eq!( + Calls(obs.ops), + Calls(vec![ObserverCall::Put { + obj: crate::ROOT, + prop: "a".into(), + value: ObservedValue::Untagged(crate::ScalarValue::Counter(2000.into()).into()), + conflict: false, + },]) + ); + } +} diff --git a/rust/automerge/src/automerge/tests.rs b/rust/automerge/src/automerge/tests.rs new file mode 100644 index 00000000..3511c4ed --- /dev/null +++ b/rust/automerge/src/automerge/tests.rs @@ -0,0 +1,1554 @@ +use itertools::Itertools; +use pretty_assertions::assert_eq; + +use super::*; +use crate::op_tree::B; +use crate::transaction::Transactable; +use crate::*; +use std::convert::TryInto; + +#[test] +fn insert_op() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + doc.set_actor(ActorId::random()); + let mut tx = doc.transaction(); + tx.put(ROOT, "hello", "world")?; + tx.get(ROOT, "hello")?; + tx.commit(); + Ok(()) +} + +#[test] +fn test_set() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + // setting a scalar value shouldn't return an opid as no object was created. + tx.put(ROOT, "a", 1)?; + + // setting the same value shouldn't return an opid as there is no change. + tx.put(ROOT, "a", 1)?; + + assert_eq!(tx.pending_ops(), 1); + + let map = tx.put_object(ROOT, "b", ObjType::Map)?; + // object already exists at b but setting a map again overwrites it so we get an opid. + tx.put(map, "a", 2)?; + + tx.put_object(ROOT, "b", ObjType::Map)?; + + assert_eq!(tx.pending_ops(), 4); + let map = tx.get(ROOT, "b").unwrap().unwrap().1; + assert_eq!(tx.get(&map, "a")?, None); + + tx.commit(); + Ok(()) +} + +#[test] +fn test_list() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + doc.set_actor(ActorId::random()); + let mut tx = doc.transaction(); + let list_id = tx.put_object(ROOT, "items", ObjType::List)?; + tx.put(ROOT, "zzz", "zzzval")?; + assert!(tx.get(ROOT, "items")?.unwrap().1 == list_id); + tx.insert(&list_id, 0, "a")?; + tx.insert(&list_id, 0, "b")?; + tx.insert(&list_id, 2, "c")?; + tx.insert(&list_id, 1, "d")?; + assert!(tx.get(&list_id, 0)?.unwrap().0 == "b".into()); + assert!(tx.get(&list_id, 1)?.unwrap().0 == "d".into()); + assert!(tx.get(&list_id, 2)?.unwrap().0 == "a".into()); + assert!(tx.get(&list_id, 3)?.unwrap().0 == "c".into()); + assert!(tx.length(&list_id) == 4); + tx.commit(); + doc.save(); + Ok(()) +} + +#[test] +fn test_del() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + doc.set_actor(ActorId::random()); + let mut tx = doc.transaction(); + tx.put(ROOT, "xxx", "xxx")?; + assert!(tx.get(ROOT, "xxx")?.is_some()); + tx.delete(ROOT, "xxx")?; + assert!(tx.get(ROOT, "xxx")?.is_none()); + tx.commit(); + Ok(()) +} + +#[test] +fn test_inc() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "counter", ScalarValue::counter(10))?; + assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(10)); + tx.increment(ROOT, "counter", 10)?; + assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(20)); + tx.increment(ROOT, "counter", -5)?; + assert!(tx.get(ROOT, "counter")?.unwrap().0 == Value::counter(15)); + tx.commit(); + Ok(()) +} + +#[test] +fn test_save_incremental() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + + let mut tx = doc.transaction(); + tx.put(ROOT, "foo", 1)?; + tx.commit(); + + let save1 = doc.save(); + + let mut tx = doc.transaction(); + tx.put(ROOT, "bar", 2)?; + tx.commit(); + + let save2 = doc.save_incremental(); + + let mut tx = doc.transaction(); + tx.put(ROOT, "baz", 3)?; + tx.commit(); + + let save3 = doc.save_incremental(); + + let mut save_a: Vec = vec![]; + save_a.extend(&save1); + save_a.extend(&save2); + save_a.extend(&save3); + + assert!(doc.save_incremental().is_empty()); + + let save_b = doc.save(); + + assert!(save_b.len() < save_a.len()); + + let mut doc_a = Automerge::load(&save_a)?; + let mut doc_b = Automerge::load(&save_b)?; + + assert!(doc_a.get_all(ROOT, "baz")? == doc_b.get_all(ROOT, "baz")?); + + assert!(doc_a.save() == doc_b.save()); + + Ok(()) +} + +#[test] +fn test_save_text() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text)?; + tx.commit(); + let heads1 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.splice_text(&text, 0, 0, "hello world")?; + tx.commit(); + let heads2 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.splice_text(&text, 6, 0, "big bad ")?; + tx.commit(); + let heads3 = doc.get_heads(); + + assert!(&doc.text(&text)? == "hello big bad world"); + assert!(&doc.text_at(&text, &heads1)?.is_empty()); + assert!(&doc.text_at(&text, &heads2)? == "hello world"); + assert!(&doc.text_at(&text, &heads3)? == "hello big bad world"); + + Ok(()) +} + +#[test] +fn test_props_vals_at() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + doc.set_actor("aaaa".try_into().unwrap()); + let mut tx = doc.transaction(); + tx.put(ROOT, "prop1", "val1")?; + tx.commit(); + doc.get_heads(); + let heads1 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.put(ROOT, "prop1", "val2")?; + tx.commit(); + doc.get_heads(); + let heads2 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.put(ROOT, "prop2", "val3")?; + tx.commit(); + doc.get_heads(); + let heads3 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.delete(ROOT, "prop1")?; + tx.commit(); + doc.get_heads(); + let heads4 = doc.get_heads(); + let mut tx = doc.transaction(); + tx.put(ROOT, "prop3", "val4")?; + tx.commit(); + doc.get_heads(); + let heads5 = doc.get_heads(); + assert!(doc.keys_at(ROOT, &heads1).collect_vec() == vec!["prop1".to_owned()]); + assert_eq!(doc.length_at(ROOT, &heads1), 1); + assert!(doc.get_at(ROOT, "prop1", &heads1)?.unwrap().0 == Value::str("val1")); + assert!(doc.get_at(ROOT, "prop2", &heads1)?.is_none()); + assert!(doc.get_at(ROOT, "prop3", &heads1)?.is_none()); + + assert!(doc.keys_at(ROOT, &heads2).collect_vec() == vec!["prop1".to_owned()]); + assert_eq!(doc.length_at(ROOT, &heads2), 1); + assert!(doc.get_at(ROOT, "prop1", &heads2)?.unwrap().0 == Value::str("val2")); + assert!(doc.get_at(ROOT, "prop2", &heads2)?.is_none()); + assert!(doc.get_at(ROOT, "prop3", &heads2)?.is_none()); + + assert!( + doc.keys_at(ROOT, &heads3).collect_vec() == vec!["prop1".to_owned(), "prop2".to_owned()] + ); + assert_eq!(doc.length_at(ROOT, &heads3), 2); + assert!(doc.get_at(ROOT, "prop1", &heads3)?.unwrap().0 == Value::str("val2")); + assert!(doc.get_at(ROOT, "prop2", &heads3)?.unwrap().0 == Value::str("val3")); + assert!(doc.get_at(ROOT, "prop3", &heads3)?.is_none()); + + assert!(doc.keys_at(ROOT, &heads4).collect_vec() == vec!["prop2".to_owned()]); + assert_eq!(doc.length_at(ROOT, &heads4), 1); + assert!(doc.get_at(ROOT, "prop1", &heads4)?.is_none()); + assert!(doc.get_at(ROOT, "prop2", &heads4)?.unwrap().0 == Value::str("val3")); + assert!(doc.get_at(ROOT, "prop3", &heads4)?.is_none()); + + assert!( + doc.keys_at(ROOT, &heads5).collect_vec() == vec!["prop2".to_owned(), "prop3".to_owned()] + ); + assert_eq!(doc.length_at(ROOT, &heads5), 2); + assert_eq!(doc.length(ROOT), 2); + assert!(doc.get_at(ROOT, "prop1", &heads5)?.is_none()); + assert!(doc.get_at(ROOT, "prop2", &heads5)?.unwrap().0 == Value::str("val3")); + assert!(doc.get_at(ROOT, "prop3", &heads5)?.unwrap().0 == Value::str("val4")); + + assert_eq!(doc.keys_at(ROOT, &[]).count(), 0); + assert_eq!(doc.length_at(ROOT, &[]), 0); + assert!(doc.get_at(ROOT, "prop1", &[])?.is_none()); + assert!(doc.get_at(ROOT, "prop2", &[])?.is_none()); + assert!(doc.get_at(ROOT, "prop3", &[])?.is_none()); + Ok(()) +} + +#[test] +fn test_len_at() -> Result<(), AutomergeError> { + let mut doc = Automerge::new(); + doc.set_actor("aaaa".try_into().unwrap()); + + let mut tx = doc.transaction(); + let list = tx.put_object(ROOT, "list", ObjType::List)?; + tx.commit(); + let heads1 = doc.get_heads(); + + let mut tx = doc.transaction(); + tx.insert(&list, 0, 10)?; + tx.commit(); + let heads2 = doc.get_heads(); + + let mut tx = doc.transaction(); + tx.put(&list, 0, 20)?; + tx.insert(&list, 0, 30)?; + tx.commit(); + let heads3 = doc.get_heads(); + + let mut tx = doc.transaction(); + tx.put(&list, 1, 40)?; + tx.insert(&list, 1, 50)?; + tx.commit(); + let heads4 = doc.get_heads(); + + let mut tx = doc.transaction(); + tx.delete(&list, 2)?; + tx.commit(); + let heads5 = doc.get_heads(); + + let mut tx = doc.transaction(); + tx.delete(&list, 0)?; + tx.commit(); + let heads6 = doc.get_heads(); + + assert!(doc.length_at(&list, &heads1) == 0); + assert!(doc.get_at(&list, 0, &heads1)?.is_none()); + + assert!(doc.length_at(&list, &heads2) == 1); + assert!(doc.get_at(&list, 0, &heads2)?.unwrap().0 == Value::int(10)); + + assert!(doc.length_at(&list, &heads3) == 2); + assert!(doc.get_at(&list, 0, &heads3)?.unwrap().0 == Value::int(30)); + assert!(doc.get_at(&list, 1, &heads3)?.unwrap().0 == Value::int(20)); + + assert!(doc.length_at(&list, &heads4) == 3); + assert!(doc.get_at(&list, 0, &heads4)?.unwrap().0 == Value::int(30)); + assert!(doc.get_at(&list, 1, &heads4)?.unwrap().0 == Value::int(50)); + assert!(doc.get_at(&list, 2, &heads4)?.unwrap().0 == Value::int(40)); + + assert!(doc.length_at(&list, &heads5) == 2); + assert!(doc.get_at(&list, 0, &heads5)?.unwrap().0 == Value::int(30)); + assert!(doc.get_at(&list, 1, &heads5)?.unwrap().0 == Value::int(50)); + + assert!(doc.length_at(&list, &heads6) == 1); + assert!(doc.length(&list) == 1); + assert!(doc.get_at(&list, 0, &heads6)?.unwrap().0 == Value::int(50)); + + Ok(()) +} + +#[test] +fn keys_iter_map() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 3).unwrap(); + tx.put(ROOT, "b", 4).unwrap(); + tx.put(ROOT, "c", 5).unwrap(); + tx.put(ROOT, "d", 6).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 7).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 8).unwrap(); + tx.put(ROOT, "d", 9).unwrap(); + tx.commit(); + assert_eq!(doc.keys(ROOT).count(), 4); + + let mut keys = doc.keys(ROOT); + assert_eq!(keys.next(), Some("a".into())); + assert_eq!(keys.next(), Some("b".into())); + assert_eq!(keys.next(), Some("c".into())); + assert_eq!(keys.next(), Some("d".into())); + assert_eq!(keys.next(), None); + + let mut keys = doc.keys(ROOT); + assert_eq!(keys.next_back(), Some("d".into())); + assert_eq!(keys.next_back(), Some("c".into())); + assert_eq!(keys.next_back(), Some("b".into())); + assert_eq!(keys.next_back(), Some("a".into())); + assert_eq!(keys.next_back(), None); + + let mut keys = doc.keys(ROOT); + assert_eq!(keys.next(), Some("a".into())); + assert_eq!(keys.next_back(), Some("d".into())); + assert_eq!(keys.next_back(), Some("c".into())); + assert_eq!(keys.next_back(), Some("b".into())); + assert_eq!(keys.next_back(), None); + + let mut keys = doc.keys(ROOT); + assert_eq!(keys.next_back(), Some("d".into())); + assert_eq!(keys.next(), Some("a".into())); + assert_eq!(keys.next(), Some("b".into())); + assert_eq!(keys.next(), Some("c".into())); + assert_eq!(keys.next(), None); + let keys = doc.keys(ROOT); + assert_eq!(keys.collect::>(), vec!["a", "b", "c", "d"]); +} + +#[test] +fn keys_iter_seq() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let list = tx.put_object(ROOT, "list", ObjType::List).unwrap(); + tx.insert(&list, 0, 3).unwrap(); + tx.insert(&list, 1, 4).unwrap(); + tx.insert(&list, 2, 5).unwrap(); + tx.insert(&list, 3, 6).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(&list, 0, 7).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(&list, 0, 8).unwrap(); + tx.put(&list, 3, 9).unwrap(); + tx.commit(); + let actor = doc.get_actor(); + assert_eq!(doc.keys(&list).count(), 4); + + let mut keys = doc.keys(&list); + assert_eq!(keys.next(), Some(format!("2@{}", actor))); + assert_eq!(keys.next(), Some(format!("3@{}", actor))); + assert_eq!(keys.next(), Some(format!("4@{}", actor))); + assert_eq!(keys.next(), Some(format!("5@{}", actor))); + assert_eq!(keys.next(), None); + + let mut keys = doc.keys(&list); + assert_eq!(keys.next_back(), Some(format!("5@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("4@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("3@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("2@{}", actor))); + assert_eq!(keys.next_back(), None); + + let mut keys = doc.keys(&list); + assert_eq!(keys.next(), Some(format!("2@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("5@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("4@{}", actor))); + assert_eq!(keys.next_back(), Some(format!("3@{}", actor))); + assert_eq!(keys.next_back(), None); + + let mut keys = doc.keys(&list); + assert_eq!(keys.next_back(), Some(format!("5@{}", actor))); + assert_eq!(keys.next(), Some(format!("2@{}", actor))); + assert_eq!(keys.next(), Some(format!("3@{}", actor))); + assert_eq!(keys.next(), Some(format!("4@{}", actor))); + assert_eq!(keys.next(), None); + + let keys = doc.keys(&list); + assert_eq!( + keys.collect::>(), + vec![ + format!("2@{}", actor), + format!("3@{}", actor), + format!("4@{}", actor), + format!("5@{}", actor) + ] + ); +} + +#[test] +fn range_iter_map() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 3).unwrap(); + tx.put(ROOT, "b", 4).unwrap(); + tx.put(ROOT, "c", 5).unwrap(); + tx.put(ROOT, "d", 6).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 7).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 8).unwrap(); + tx.put(ROOT, "d", 9).unwrap(); + tx.commit(); + let actor = doc.get_actor(); + assert_eq!(doc.map_range(ROOT, ..).count(), 4); + + let mut range = doc.map_range(ROOT, "b".to_owned().."d".into()); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let mut range = doc.map_range(ROOT, "b".to_owned()..="d".into()); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("d", 9.into(), ExId::Id(7, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let mut range = doc.map_range(ROOT, ..="c".to_owned()); + assert_eq!( + range.next(), + Some(("a", 8.into(), ExId::Id(6, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let range = doc.map_range(ROOT, "a".to_owned()..); + assert_eq!( + range.collect::>(), + vec![ + ("a", 8.into(), ExId::Id(6, actor.clone(), 0)), + ("b", 4.into(), ExId::Id(2, actor.clone(), 0)), + ("c", 5.into(), ExId::Id(3, actor.clone(), 0)), + ("d", 9.into(), ExId::Id(7, actor.clone(), 0)), + ] + ); +} + +#[test] +fn map_range_back_and_forth_single() { + let mut doc = AutoCommit::new(); + let actor = doc.get_actor().clone(); + + doc.put(ROOT, "1", "a").unwrap(); + doc.put(ROOT, "2", "b").unwrap(); + doc.put(ROOT, "3", "c").unwrap(); + + let mut range_all = doc.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("2", Value::str("b"), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range(ROOT, ..); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("1", "a".into(), ExId::Id(1, actor, 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); +} + +#[test] +fn map_range_back_and_forth_double() { + let mut doc1 = AutoCommit::new(); + doc1.set_actor(ActorId::from([0])); + + doc1.put(ROOT, "1", "a").unwrap(); + doc1.put(ROOT, "2", "b").unwrap(); + doc1.put(ROOT, "3", "c").unwrap(); + + // actor 2 should win in all conflicts here + let mut doc2 = AutoCommit::new(); + doc1.set_actor(ActorId::from([1])); + let actor2 = doc2.get_actor().clone(); + doc2.put(ROOT, "1", "aa").unwrap(); + doc2.put(ROOT, "2", "bb").unwrap(); + doc2.put(ROOT, "3", "cc").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + let mut range_all = doc1.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range(ROOT, ..); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range(ROOT, ..); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("1", "aa".into(), ExId::Id(1, actor2, 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); +} + +#[test] +fn map_range_at_back_and_forth_single() { + let mut doc = AutoCommit::new(); + let actor = doc.get_actor().clone(); + + doc.put(ROOT, "1", "a").unwrap(); + doc.put(ROOT, "2", "b").unwrap(); + doc.put(ROOT, "3", "c").unwrap(); + + let heads = doc.get_heads(); + + let mut range_all = doc.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("2", Value::str("b"), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "a".into(), ExId::Id(1, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range_all.next(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next_back(), + Some(("3", "c".into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "b".into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range_all.next_back(), + Some(("1", "a".into(), ExId::Id(1, actor, 0))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); +} + +#[test] +fn map_range_at_back_and_forth_double() { + let mut doc1 = AutoCommit::new(); + doc1.set_actor(ActorId::from([0])); + + doc1.put(ROOT, "1", "a").unwrap(); + doc1.put(ROOT, "2", "b").unwrap(); + doc1.put(ROOT, "3", "c").unwrap(); + + // actor 2 should win in all conflicts here + let mut doc2 = AutoCommit::new(); + doc1.set_actor(ActorId::from([1])); + let actor2 = doc2.get_actor().clone(); + doc2.put(ROOT, "1", "aa").unwrap(); + doc2.put(ROOT, "2", "bb").unwrap(); + doc2.put(ROOT, "3", "cc").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + let heads = doc1.get_heads(); + + let mut range_all = doc1.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next(), + Some(("1", "aa".into(), ExId::Id(1, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); + + let mut range_all = doc1.map_range_at(ROOT, .., &heads); + assert_eq!( + range_all.next_back(), + Some(("3", "cc".into(), ExId::Id(3, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("2", "bb".into(), ExId::Id(2, actor2.clone(), 1))) + ); + assert_eq!( + range_all.next_back(), + Some(("1", "aa".into(), ExId::Id(1, actor2, 1))) + ); + assert_eq!(range_all.next_back(), None); + assert_eq!(range_all.next(), None); +} + +#[test] +fn insert_at_index() { + let mut doc = AutoCommit::new(); + + let list = &doc.put_object(ROOT, "list", ObjType::List).unwrap(); + doc.insert(list, 0, 0).unwrap(); + doc.insert(list, 0, 1).unwrap(); // both inserts at the same index + + assert_eq!(doc.length(list), 2); + assert_eq!(doc.keys(list).count(), 2); + assert_eq!(doc.list_range(list, ..).count(), 2); +} + +#[test] +fn get_list_values() -> Result<(), AutomergeError> { + let mut doc1 = Automerge::new(); + let mut tx = doc1.transaction(); + let list = tx.put_object(ROOT, "list", ObjType::List)?; + + // insert elements + tx.insert(&list, 0, "First")?; + tx.insert(&list, 1, "Second")?; + tx.insert(&list, 2, "Third")?; + tx.insert(&list, 3, "Forth")?; + tx.insert(&list, 4, "Fith")?; + tx.insert(&list, 5, "Sixth")?; + tx.insert(&list, 6, "Seventh")?; + tx.insert(&list, 7, "Eights")?; + tx.commit(); + + let v1 = doc1.get_heads(); + let mut doc2 = doc1.fork(); + + let mut tx = doc1.transaction(); + tx.put(&list, 2, "Third V2")?; + tx.commit(); + + let mut tx = doc2.transaction(); + tx.put(&list, 2, "Third V3")?; + tx.commit(); + + doc1.merge(&mut doc2)?; + + assert_eq!(doc1.list_range(&list, ..).count(), 8); + + for (i, val1, id) in doc1.list_range(&list, ..) { + let val2 = doc1.get(&list, i)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.list_range(&list, 3..6).count(), 3); + assert_eq!(doc1.list_range(&list, 3..6).next().unwrap().0, 3); + assert_eq!(doc1.list_range(&list, 3..6).last().unwrap().0, 5); + + for (i, val1, id) in doc1.list_range(&list, 3..6) { + let val2 = doc1.get(&list, i)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.list_range_at(&list, .., &v1).count(), 8); + for (i, val1, id) in doc1.list_range_at(&list, .., &v1) { + let val2 = doc1.get_at(&list, i, &v1)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.list_range_at(&list, 3..6, &v1).count(), 3); + assert_eq!(doc1.list_range_at(&list, 3..6, &v1).next().unwrap().0, 3); + assert_eq!(doc1.list_range_at(&list, 3..6, &v1).last().unwrap().0, 5); + + for (i, val1, id) in doc1.list_range_at(&list, 3..6, &v1) { + let val2 = doc1.get_at(&list, i, &v1)?; + assert_eq!(Some((val1, id)), val2); + } + + let range: Vec<_> = doc1 + .list_range(&list, ..) + .map(|(_, val, id)| (val, id)) + .collect(); + let values = doc1.values(&list); + let values: Vec<_> = values.collect(); + assert_eq!(range, values); + + let range: Vec<_> = doc1 + .list_range_at(&list, .., &v1) + .map(|(_, val, id)| (val, id)) + .collect(); + let values: Vec<_> = doc1.values_at(&list, &v1).collect(); + assert_eq!(range, values); + + Ok(()) +} + +#[test] +fn get_range_values() -> Result<(), AutomergeError> { + let mut doc1 = Automerge::new(); + let mut tx = doc1.transaction(); + tx.put(ROOT, "aa", "aaa")?; + tx.put(ROOT, "bb", "bbb")?; + tx.put(ROOT, "cc", "ccc")?; + tx.put(ROOT, "dd", "ddd")?; + tx.commit(); + + let v1 = doc1.get_heads(); + let mut doc2 = doc1.fork(); + + let mut tx = doc1.transaction(); + tx.put(ROOT, "cc", "ccc V2")?; + tx.commit(); + + let mut tx = doc2.transaction(); + tx.put(ROOT, "cc", "ccc V3")?; + tx.commit(); + + doc1.merge(&mut doc2)?; + + let range = "b".to_string().."d".to_string(); + + assert_eq!(doc1.map_range(ROOT, range.clone()).count(), 2); + + for (key, val1, id) in doc1.map_range(ROOT, range.clone()) { + let val2 = doc1.get(ROOT, key)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.map_range(ROOT, range.clone()).rev().count(), 2); + + for (key, val1, id) in doc1.map_range(ROOT, range.clone()).rev() { + let val2 = doc1.get(ROOT, key)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.map_range_at(ROOT, range.clone(), &v1).count(), 2); + + for (key, val1, id) in doc1.map_range_at(ROOT, range.clone(), &v1) { + let val2 = doc1.get_at(ROOT, key, &v1)?; + assert_eq!(Some((val1, id)), val2); + } + + assert_eq!(doc1.map_range_at(ROOT, range.clone(), &v1).rev().count(), 2); + + for (key, val1, id) in doc1.map_range_at(ROOT, range, &v1).rev() { + let val2 = doc1.get_at(ROOT, key, &v1)?; + assert_eq!(Some((val1, id)), val2); + } + + let range: Vec<_> = doc1 + .map_range(ROOT, ..) + .map(|(_, val, id)| (val, id)) + .collect(); + let values: Vec<_> = doc1.values(ROOT).collect(); + assert_eq!(range, values); + + let range: Vec<_> = doc1 + .map_range_at(ROOT, .., &v1) + .map(|(_, val, id)| (val, id)) + .collect(); + let values: Vec<_> = doc1.values_at(ROOT, &v1).collect(); + assert_eq!(range, values); + + Ok(()) +} + +#[test] +fn range_iter_map_rev() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 3).unwrap(); + tx.put(ROOT, "b", 4).unwrap(); + tx.put(ROOT, "c", 5).unwrap(); + tx.put(ROOT, "d", 6).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 7).unwrap(); + tx.commit(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 8).unwrap(); + tx.put(ROOT, "d", 9).unwrap(); + tx.commit(); + let actor = doc.get_actor(); + assert_eq!(doc.map_range(ROOT, ..).rev().count(), 4); + + let mut range = doc.map_range(ROOT, "b".to_owned().."d".into()).rev(); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let mut range = doc.map_range(ROOT, "b".to_owned()..="d".into()).rev(); + assert_eq!( + range.next(), + Some(("d", 9.into(), ExId::Id(7, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let mut range = doc.map_range(ROOT, ..="c".to_owned()).rev(); + assert_eq!( + range.next(), + Some(("c", 5.into(), ExId::Id(3, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("b", 4.into(), ExId::Id(2, actor.clone(), 0))) + ); + assert_eq!( + range.next(), + Some(("a", 8.into(), ExId::Id(6, actor.clone(), 0))) + ); + assert_eq!(range.next(), None); + + let range = doc.map_range(ROOT, "a".to_owned()..).rev(); + assert_eq!( + range.collect::>(), + vec![ + ("d", 9.into(), ExId::Id(7, actor.clone(), 0)), + ("c", 5.into(), ExId::Id(3, actor.clone(), 0)), + ("b", 4.into(), ExId::Id(2, actor.clone(), 0)), + ("a", 8.into(), ExId::Id(6, actor.clone(), 0)), + ] + ); +} + +#[test] +fn rolling_back_transaction_has_no_effect() { + let mut doc = Automerge::new(); + let old_states = doc.states.clone(); + let bytes = doc.save(); + let tx = doc.transaction(); + tx.rollback(); + let new_states = doc.states.clone(); + assert_eq!(old_states, new_states); + let new_bytes = doc.save(); + assert_eq!(bytes, new_bytes); +} + +#[test] +fn mutate_old_objects() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + // create a map + let map1 = tx.put_object(ROOT, "a", ObjType::Map).unwrap(); + tx.put(&map1, "b", 1).unwrap(); + // overwrite the first map with a new one + let map2 = tx.put_object(ROOT, "a", ObjType::Map).unwrap(); + tx.put(&map2, "c", 2).unwrap(); + tx.commit(); + + // we can get the new map by traversing the tree + let map = doc.get(&ROOT, "a").unwrap().unwrap().1; + assert_eq!(doc.get(&map, "b").unwrap(), None); + // and get values from it + assert_eq!( + doc.get(&map, "c").unwrap().map(|s| s.0), + Some(ScalarValue::Int(2).into()) + ); + + // but we can still access the old one if we know the ID! + assert_eq!(doc.get(&map1, "b").unwrap().unwrap().0, Value::int(1)); + // and even set new things in it! + let mut tx = doc.transaction(); + tx.put(&map1, "c", 3).unwrap(); + tx.commit(); + + assert_eq!(doc.get(&map1, "c").unwrap().unwrap().0, Value::int(3)); +} + +#[test] +fn delete_nothing_in_map_is_noop() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + // deleting a missing key in a map should just be a noop + assert!(tx.delete(ROOT, "a",).is_ok()); + tx.commit(); + let last_change = doc.get_last_local_change(); + assert!(last_change.is_none()); + + let bytes = doc.save(); + assert!(Automerge::load(&bytes,).is_ok()); + + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 1).unwrap(); + tx.commit(); + let last_change = doc.get_last_local_change().unwrap(); + assert_eq!(last_change.len(), 1); + + let mut tx = doc.transaction(); + // a real op + tx.delete(ROOT, "a").unwrap(); + // a no-op + tx.delete(ROOT, "a").unwrap(); + tx.commit(); + let last_change = doc.get_last_local_change().unwrap(); + assert_eq!(last_change.len(), 1); +} + +#[test] +fn delete_nothing_in_list_returns_error() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + // deleting an element in a list that does not exist is an error + assert!(tx.delete(ROOT, 0,).is_err()); +} + +#[test] +fn loaded_doc_changes_have_hash() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + tx.put(ROOT, "a", 1_u64).unwrap(); + tx.commit(); + let hash = doc.get_last_local_change().unwrap().hash(); + let bytes = doc.save(); + let doc = Automerge::load(&bytes).unwrap(); + assert_eq!(doc.get_change_by_hash(&hash).unwrap().hash(), hash); +} + +#[test] +fn load_change_with_zero_start_op() { + let bytes = &[ + 133, 111, 74, 131, 202, 50, 52, 158, 2, 96, 163, 163, 83, 255, 255, 255, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 255, 255, 245, 53, 1, 0, 0, 0, 0, 0, 0, 4, 233, + 245, 239, 255, 1, 0, 0, 0, 133, 111, 74, 131, 163, 96, 0, 0, 2, 10, 202, 144, 125, 19, 48, + 89, 133, 49, 10, 10, 67, 91, 111, 10, 74, 131, 96, 0, 163, 131, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 1, 153, 0, 0, 246, 255, 255, 255, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 48, 254, 208, + ]; + let _ = Automerge::load(bytes); +} + +#[test] +fn load_broken_list() { + enum Action { + InsertText(usize, char), + DelText(usize), + } + use Action::*; + let actions = [ + InsertText(0, 'a'), + InsertText(0, 'b'), + DelText(1), + InsertText(0, 'c'), + DelText(1), + DelText(0), + InsertText(0, 'd'), + InsertText(0, 'e'), + InsertText(1, 'f'), + DelText(2), + DelText(1), + InsertText(0, 'g'), + DelText(1), + DelText(0), + InsertText(0, 'h'), + InsertText(1, 'i'), + DelText(1), + DelText(0), + InsertText(0, 'j'), + InsertText(0, 'k'), + DelText(1), + DelText(0), + InsertText(0, 'l'), + DelText(0), + InsertText(0, 'm'), + InsertText(0, 'n'), + DelText(1), + DelText(0), + InsertText(0, 'o'), + DelText(0), + InsertText(0, 'p'), + InsertText(1, 'q'), + InsertText(1, 'r'), + InsertText(1, 's'), + InsertText(3, 't'), + InsertText(5, 'u'), + InsertText(0, 'v'), + InsertText(3, 'w'), + InsertText(4, 'x'), + InsertText(0, 'y'), + InsertText(6, 'z'), + InsertText(11, '1'), + InsertText(0, '2'), + InsertText(0, '3'), + InsertText(0, '4'), + InsertText(13, '5'), + InsertText(11, '6'), + InsertText(17, '7'), + ]; + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let list = tx.put_object(ROOT, "list", ObjType::List).unwrap(); + for action in actions { + match action { + Action::InsertText(index, c) => { + tx.insert(&list, index, c).unwrap(); + } + Action::DelText(index) => { + tx.delete(&list, index).unwrap(); + } + } + } + tx.commit(); + let bytes = doc.save(); + let mut doc2 = Automerge::load(&bytes).unwrap(); + let bytes2 = doc2.save(); + assert_eq!(doc.text(&list).unwrap(), doc2.text(&list).unwrap()); + + assert_eq!(doc.queue, doc2.queue); + assert_eq!(doc.history, doc2.history); + assert_eq!(doc.history_index, doc2.history_index); + assert_eq!(doc.states, doc2.states); + assert_eq!(doc.deps, doc2.deps); + assert_eq!(doc.saved, doc2.saved); + assert_eq!(doc.ops, doc2.ops); + assert_eq!(doc.max_op, doc2.max_op); + + assert_eq!(bytes, bytes2); +} + +#[test] +fn load_broken_list_short() { + // breaks when the B constant in OpSet is 3 + enum Action { + InsertText(usize, char), + DelText(usize), + } + use Action::*; + let actions = [ + InsertText(0, 'a'), + InsertText(1, 'b'), + DelText(1), + InsertText(1, 'c'), + InsertText(2, 'd'), + InsertText(2, 'e'), + InsertText(0, 'f'), + DelText(4), + InsertText(4, 'g'), + ]; + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let list = tx.put_object(ROOT, "list", ObjType::List).unwrap(); + for action in actions { + match action { + Action::InsertText(index, c) => { + tx.insert(&list, index, c).unwrap(); + } + Action::DelText(index) => { + tx.delete(&list, index).unwrap(); + } + } + } + tx.commit(); + let bytes = doc.save(); + let mut doc2 = Automerge::load(&bytes).unwrap(); + let bytes2 = doc2.save(); + assert_eq!(doc.text(&list).unwrap(), doc2.text(&list).unwrap()); + + assert_eq!(doc.queue, doc2.queue); + assert_eq!(doc.history, doc2.history); + assert_eq!(doc.history_index, doc2.history_index); + assert_eq!(doc.states, doc2.states); + assert_eq!(doc.deps, doc2.deps); + assert_eq!(doc.saved, doc2.saved); + assert_eq!(doc.ops, doc2.ops); + assert_eq!(doc.max_op, doc2.max_op); + + assert_eq!(bytes, bytes2); +} + +#[test] +fn compute_list_indexes_correctly_when_list_element_is_split_across_tree_nodes() { + let max = B as u64 * 2; + let actor1 = ActorId::from(b"aaaa"); + let mut doc1 = AutoCommit::new().with_actor(actor1.clone()); + let actor2 = ActorId::from(b"bbbb"); + let mut doc2 = AutoCommit::new().with_actor(actor2.clone()); + let list = doc1.put_object(ROOT, "list", ObjType::List).unwrap(); + doc1.insert(&list, 0, 0).unwrap(); + doc2.load_incremental(&doc1.save_incremental()).unwrap(); + for i in 1..=max { + doc1.put(&list, 0, i).unwrap() + } + for i in 1..=max { + doc2.put(&list, 0, i).unwrap() + } + let change1 = doc1.save_incremental(); + let change2 = doc2.save_incremental(); + doc2.load_incremental(&change1).unwrap(); + doc1.load_incremental(&change2).unwrap(); + assert_eq!(doc1.length(&list), 1); + assert_eq!(doc2.length(&list), 1); + assert_eq!( + doc1.get_all(&list, 0).unwrap(), + vec![ + (max.into(), ExId::Id(max + 2, actor1.clone(), 0)), + (max.into(), ExId::Id(max + 2, actor2.clone(), 1)) + ] + ); + assert_eq!( + doc2.get_all(&list, 0).unwrap(), + vec![ + (max.into(), ExId::Id(max + 2, actor1, 0)), + (max.into(), ExId::Id(max + 2, actor2, 1)) + ] + ); + assert!(doc1.get(&list, 1).unwrap().is_none()); + assert!(doc2.get(&list, 1).unwrap().is_none()); +} + +#[test] +fn get_parent_objects() { + let mut doc = AutoCommit::new(); + let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap(); + let list = doc.put_object(&map, "b", ObjType::List).unwrap(); + doc.insert(&list, 0, 2).unwrap(); + let text = doc.put_object(&list, 0, ObjType::Text).unwrap(); + + assert_eq!( + doc.parents(&map).unwrap().next(), + Some(Parent { + obj: ROOT, + prop: Prop::Map("a".into()), + visible: true + }) + ); + assert_eq!( + doc.parents(&list).unwrap().next(), + Some(Parent { + obj: map, + prop: Prop::Map("b".into()), + visible: true + }) + ); + assert_eq!( + doc.parents(&text).unwrap().next(), + Some(Parent { + obj: list, + prop: Prop::Seq(0), + visible: true + }) + ); +} + +#[test] +fn get_path_to_object() { + let mut doc = AutoCommit::new(); + let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap(); + let list = doc.put_object(&map, "b", ObjType::List).unwrap(); + doc.insert(&list, 0, 2).unwrap(); + let text = doc.put_object(&list, 0, ObjType::Text).unwrap(); + + assert_eq!( + doc.path_to_object(&map).unwrap(), + vec![(ROOT, Prop::Map("a".into()))] + ); + assert_eq!( + doc.path_to_object(&list).unwrap(), + vec![ + (ROOT, Prop::Map("a".into())), + (map.clone(), Prop::Map("b".into())), + ] + ); + assert_eq!( + doc.path_to_object(text).unwrap(), + vec![ + (ROOT, Prop::Map("a".into())), + (map, Prop::Map("b".into())), + (list, Prop::Seq(0)), + ] + ); +} + +#[test] +fn parents_iterator() { + let mut doc = AutoCommit::new(); + let map = doc.put_object(ROOT, "a", ObjType::Map).unwrap(); + let list = doc.put_object(&map, "b", ObjType::List).unwrap(); + doc.insert(&list, 0, 2).unwrap(); + let text = doc.put_object(&list, 0, ObjType::Text).unwrap(); + + let mut parents = doc.parents(text).unwrap(); + assert_eq!( + parents.next(), + Some(Parent { + obj: list, + prop: Prop::Seq(0), + visible: true + }) + ); + assert_eq!( + parents.next(), + Some(Parent { + obj: map, + prop: Prop::Map("b".into()), + visible: true + }) + ); + assert_eq!( + parents.next(), + Some(Parent { + obj: ROOT, + prop: Prop::Map("a".into()), + visible: true + }) + ); + assert_eq!(parents.next(), None); +} + +#[test] +fn can_insert_a_grapheme_into_text() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap(); + let polar_bear = "🐻‍❄️"; + tx.splice_text(&text, 0, 0, polar_bear).unwrap(); + tx.commit(); + let s = doc.text(&text).unwrap(); + assert_eq!(s, polar_bear); + let len = doc.length(&text); + assert_eq!(len, 4); // 4 utf8 chars +} + +#[test] +fn long_strings_spliced_into_text_get_segmented_by_utf8_chars() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap(); + let polar_bear = "🐻‍❄️"; + let polar_bear_army = polar_bear.repeat(100); + tx.splice_text(&text, 0, 0, &polar_bear_army).unwrap(); + tx.commit(); + let s = doc.text(&text).unwrap(); + assert_eq!(s, polar_bear_army); + let len = doc.length(&text); + assert_eq!(len, polar_bear.chars().count() * 100); + assert_eq!(len, 400); +} + +#[test] +fn splice_text_uses_unicode_scalars() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap(); + let polar_bear = "🐻‍❄️"; + tx.splice_text(&text, 0, 0, polar_bear).unwrap(); + tx.commit(); + let s = doc.text(&text).unwrap(); + assert_eq!(s, polar_bear); + let len = doc.length(&text); + assert_eq!(len, 4); // 4 chars +} + +#[test] +fn observe_counter_change_application_overwrite() { + let mut doc1 = AutoCommit::new(); + doc1.set_actor(ActorId::from([1])); + doc1.put(ROOT, "counter", ScalarValue::counter(1)).unwrap(); + doc1.commit(); + + let mut doc2 = doc1.fork(); + doc2.set_actor(ActorId::from([2])); + doc2.put(ROOT, "counter", "mystring").unwrap(); + doc2.commit(); + + doc1.increment(ROOT, "counter", 2).unwrap(); + doc1.commit(); + doc1.increment(ROOT, "counter", 5).unwrap(); + doc1.commit(); + + let mut doc3 = doc1.fork().with_observer(VecOpObserver::default()); + doc3.merge(&mut doc2).unwrap(); + + assert_eq!( + doc3.observer().take_patches(), + vec![Patch::Put { + obj: ExId::Root, + path: vec![], + prop: Prop::Map("counter".into()), + value: ( + ScalarValue::Str("mystring".into()).into(), + ExId::Id(2, doc2.get_actor().clone(), 1) + ), + conflict: false + }] + ); + + let mut doc4 = doc2.clone().with_observer(VecOpObserver::default()); + doc4.merge(&mut doc1).unwrap(); + + // no patches as the increments operate on an invisible counter + assert_eq!(doc4.observer().take_patches(), vec![]); +} + +#[test] +fn observe_counter_change_application() { + let mut doc = AutoCommit::new(); + doc.put(ROOT, "counter", ScalarValue::counter(1)).unwrap(); + doc.increment(ROOT, "counter", 2).unwrap(); + doc.increment(ROOT, "counter", 5).unwrap(); + let changes = doc.get_changes(&[]).unwrap().into_iter().cloned(); + + let mut new_doc = AutoCommit::new().with_observer(VecOpObserver::default()); + // make a new change to the doc to stop the empty doc logic from skipping the intermediate + // patches. The is probably not really necessary, we could update this test to just test that + // the correct final state is emitted. For now though, we leave it as is. + new_doc.put(ROOT, "foo", "bar").unwrap(); + new_doc.observer().take_patches(); + new_doc.apply_changes(changes).unwrap(); + assert_eq!( + new_doc.observer().take_patches(), + vec![ + Patch::Put { + obj: ExId::Root, + path: vec![], + prop: Prop::Map("counter".into()), + value: ( + ScalarValue::counter(1).into(), + ExId::Id(1, doc.get_actor().clone(), 0) + ), + conflict: false + }, + Patch::Increment { + obj: ExId::Root, + path: vec![], + prop: Prop::Map("counter".into()), + value: (2, ExId::Id(2, doc.get_actor().clone(), 0)), + }, + Patch::Increment { + obj: ExId::Root, + path: vec![], + prop: Prop::Map("counter".into()), + value: (5, ExId::Id(3, doc.get_actor().clone(), 0)), + } + ] + ); +} + +#[test] +fn get_changes_heads_empty() { + let mut doc = AutoCommit::new(); + doc.put(ROOT, "key1", 1).unwrap(); + doc.commit(); + doc.put(ROOT, "key2", 1).unwrap(); + doc.commit(); + let heads = doc.get_heads(); + assert_eq!(doc.get_changes(&heads).unwrap(), Vec::<&Change>::new()); +} diff --git a/rust/automerge/src/autoserde.rs b/rust/automerge/src/autoserde.rs new file mode 100644 index 00000000..ccfc6ae6 --- /dev/null +++ b/rust/automerge/src/autoserde.rs @@ -0,0 +1,124 @@ +use serde::ser::{SerializeMap, SerializeSeq}; + +use crate::{ObjId, ObjType, ReadDoc, Value}; + +/// A wrapper type which implements [`serde::Serialize`] for a [`ReadDoc`]. +/// +/// # Example +/// +/// ``` +/// # fn main() -> Result<(), Box> { +/// use automerge::{AutoCommit, AutomergeError, Value, transaction::Transactable}; +/// let mut doc = AutoCommit::new(); +/// doc.put(automerge::ROOT, "key", "value")?; +/// +/// let serialized = serde_json::to_string(&automerge::AutoSerde::from(&doc)).unwrap(); +/// +/// assert_eq!(serialized, r#"{"key":"value"}"#); +/// # Ok(()) +/// # } +/// ``` +#[derive(Debug)] +pub struct AutoSerde<'a, R: crate::ReadDoc>(&'a R); + +impl<'a, R: ReadDoc> From<&'a R> for AutoSerde<'a, R> { + fn from(a: &'a R) -> Self { + AutoSerde(a) + } +} + +impl<'a, R: crate::ReadDoc> serde::Serialize for AutoSerde<'a, R> { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + AutoSerdeMap { + doc: self.0, + obj: ObjId::Root, + } + .serialize(serializer) + } +} + +struct AutoSerdeMap<'a, R> { + doc: &'a R, + obj: ObjId, +} + +impl<'a, R: crate::ReadDoc> serde::Serialize for AutoSerdeMap<'a, R> { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut map_ser = serializer.serialize_map(Some(self.doc.length(&ObjId::Root)))?; + for key in self.doc.keys(&self.obj) { + // SAFETY: This only errors if the object ID is unknown, but we construct this type + // with a known real object ID + let (val, obj) = self.doc.get(&self.obj, &key).unwrap().unwrap(); + let serdeval = AutoSerdeVal { + doc: self.doc, + val, + obj, + }; + map_ser.serialize_entry(&key, &serdeval)?; + } + map_ser.end() + } +} + +struct AutoSerdeSeq<'a, R> { + doc: &'a R, + obj: ObjId, +} + +impl<'a, R: crate::ReadDoc> serde::Serialize for AutoSerdeSeq<'a, R> { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut seq_ser = serializer.serialize_seq(None)?; + for i in 0..self.doc.length(&self.obj) { + // SAFETY: This only errors if the object ID is unknown, but we construct this type + // with a known real object ID + let (val, obj) = self.doc.get(&self.obj, i).unwrap().unwrap(); + let serdeval = AutoSerdeVal { + doc: self.doc, + val, + obj, + }; + seq_ser.serialize_element(&serdeval)?; + } + seq_ser.end() + } +} + +struct AutoSerdeVal<'a, R> { + doc: &'a R, + val: Value<'a>, + obj: ObjId, +} + +impl<'a, R: crate::ReadDoc> serde::Serialize for AutoSerdeVal<'a, R> { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match &self.val { + Value::Object(ObjType::Map | ObjType::Table) => { + let map = AutoSerdeMap { + doc: self.doc, + obj: self.obj.clone(), + }; + map.serialize(serializer) + } + Value::Object(ObjType::List | ObjType::Text) => { + let seq = AutoSerdeSeq { + doc: self.doc, + obj: self.obj.clone(), + }; + seq.serialize(serializer) + } + Value::Scalar(v) => v.serialize(serializer), + } + } +} diff --git a/rust/automerge/src/change.rs b/rust/automerge/src/change.rs new file mode 100644 index 00000000..be467a84 --- /dev/null +++ b/rust/automerge/src/change.rs @@ -0,0 +1,402 @@ +use std::{borrow::Cow, num::NonZeroU64}; + +use crate::{ + columnar::Key as StoredKey, + storage::{ + change::{Unverified, Verified}, + parse, Change as StoredChange, ChangeOp, Chunk, Compressed, ReadChangeOpError, + }, + types::{ActorId, ChangeHash, ElemId}, +}; + +#[derive(Clone, Debug, PartialEq)] +pub struct Change { + stored: StoredChange<'static, Verified>, + compression: CompressionState, + len: usize, +} + +impl Change { + pub(crate) fn new(stored: StoredChange<'static, Verified>) -> Self { + let len = stored.iter_ops().count(); + Self { + stored, + len, + compression: CompressionState::NotCompressed, + } + } + + pub(crate) fn new_from_unverified( + stored: StoredChange<'static, Unverified>, + compressed: Option>, + ) -> Result { + let mut len = 0; + let stored = stored.verify_ops(|_| len += 1)?; + let compression = if let Some(c) = compressed { + CompressionState::Compressed(c) + } else { + CompressionState::NotCompressed + }; + Ok(Self { + stored, + len, + compression, + }) + } + + pub fn actor_id(&self) -> &ActorId { + self.stored.actor() + } + + pub fn other_actor_ids(&self) -> &[ActorId] { + self.stored.other_actors() + } + + pub fn len(&self) -> usize { + self.len + } + + pub fn is_empty(&self) -> bool { + self.len == 0 + } + + pub fn max_op(&self) -> u64 { + self.stored.start_op().get() + (self.len as u64) - 1 + } + + pub fn start_op(&self) -> NonZeroU64 { + self.stored.start_op() + } + + pub fn message(&self) -> Option<&String> { + self.stored.message().as_ref() + } + + pub fn deps(&self) -> &[ChangeHash] { + self.stored.dependencies() + } + + pub fn hash(&self) -> ChangeHash { + self.stored.hash() + } + + pub fn seq(&self) -> u64 { + self.stored.seq() + } + + pub fn timestamp(&self) -> i64 { + self.stored.timestamp() + } + + pub fn bytes(&mut self) -> Cow<'_, [u8]> { + if let CompressionState::NotCompressed = self.compression { + if let Some(compressed) = self.stored.compress() { + self.compression = CompressionState::Compressed(compressed); + } else { + self.compression = CompressionState::TooSmallToCompress; + } + }; + match &self.compression { + // SAFETY: We just checked this case above + CompressionState::NotCompressed => unreachable!(), + CompressionState::TooSmallToCompress => Cow::Borrowed(self.stored.bytes()), + CompressionState::Compressed(c) => c.bytes(), + } + } + + pub fn raw_bytes(&self) -> &[u8] { + self.stored.bytes() + } + + pub(crate) fn iter_ops(&self) -> impl Iterator + '_ { + self.stored.iter_ops() + } + + pub fn extra_bytes(&self) -> &[u8] { + self.stored.extra_bytes() + } + + // TODO replace all uses of this with TryFrom<&[u8]> + pub fn from_bytes(bytes: Vec) -> Result { + Self::try_from(&bytes[..]) + } + + pub fn decode(&self) -> crate::ExpandedChange { + crate::ExpandedChange::from(self) + } +} + +#[derive(Clone, Debug, PartialEq)] +enum CompressionState { + /// We haven't tried to compress this change + NotCompressed, + /// We have compressed this change + Compressed(Compressed<'static>), + /// We tried to compress this change but it wasn't big enough to be worth it + TooSmallToCompress, +} + +impl AsRef> for Change { + fn as_ref(&self) -> &StoredChange<'static, Verified> { + &self.stored + } +} + +impl From for StoredChange<'static, Verified> { + fn from(c: Change) -> Self { + c.stored + } +} + +#[derive(thiserror::Error, Debug)] +pub enum LoadError { + #[error("unable to parse change: {0}")] + Parse(Box), + #[error("leftover data after parsing")] + LeftoverData, + #[error("wrong chunk type")] + WrongChunkType, +} + +impl<'a> TryFrom<&'a [u8]> for Change { + type Error = LoadError; + + fn try_from(value: &'a [u8]) -> Result { + let input = parse::Input::new(value); + let (remaining, chunk) = Chunk::parse(input).map_err(|e| LoadError::Parse(Box::new(e)))?; + if !remaining.is_empty() { + return Err(LoadError::LeftoverData); + } + match chunk { + Chunk::Change(c) => Self::new_from_unverified(c.into_owned(), None) + .map_err(|e| LoadError::Parse(Box::new(e))), + Chunk::CompressedChange(c, compressed) => { + Self::new_from_unverified(c.into_owned(), Some(compressed.into_owned())) + .map_err(|e| LoadError::Parse(Box::new(e))) + } + _ => Err(LoadError::WrongChunkType), + } + } +} + +impl<'a> TryFrom> for Change { + type Error = ReadChangeOpError; + + fn try_from(c: StoredChange<'a, Unverified>) -> Result { + Self::new_from_unverified(c.into_owned(), None) + } +} + +impl From for Change { + fn from(e: crate::ExpandedChange) -> Self { + let stored = StoredChange::builder() + .with_actor(e.actor_id) + .with_extra_bytes(e.extra_bytes) + .with_seq(e.seq) + .with_dependencies(e.deps) + .with_timestamp(e.time) + .with_start_op(e.start_op) + .with_message(e.message) + .build(e.operations.iter()); + match stored { + Ok(c) => Change::new(c), + Err(crate::storage::change::PredOutOfOrder) => { + // Should never happen because we use `SortedVec` in legacy::Op::pred + panic!("preds out of order"); + } + } + } +} + +mod convert_expanded { + use std::borrow::Cow; + + use crate::{convert, legacy, storage::AsChangeOp, types::ActorId, ScalarValue}; + + impl<'a> AsChangeOp<'a> for &'a legacy::Op { + type ActorId = &'a ActorId; + type OpId = &'a legacy::OpId; + type PredIter = std::slice::Iter<'a, legacy::OpId>; + + fn action(&self) -> u64 { + self.action.action_index() + } + + fn insert(&self) -> bool { + self.insert + } + + fn pred(&self) -> Self::PredIter { + self.pred.iter() + } + + fn key(&self) -> convert::Key<'a, Self::OpId> { + match &self.key { + legacy::Key::Map(s) => convert::Key::Prop(Cow::Borrowed(s)), + legacy::Key::Seq(legacy::ElementId::Head) => { + convert::Key::Elem(convert::ElemId::Head) + } + legacy::Key::Seq(legacy::ElementId::Id(o)) => { + convert::Key::Elem(convert::ElemId::Op(o)) + } + } + } + + fn obj(&self) -> convert::ObjId { + match &self.obj { + legacy::ObjectId::Root => convert::ObjId::Root, + legacy::ObjectId::Id(o) => convert::ObjId::Op(o), + } + } + + fn val(&self) -> Cow<'a, crate::ScalarValue> { + match self.primitive_value() { + Some(v) => Cow::Owned(v), + None => Cow::Owned(ScalarValue::Null), + } + } + } + + impl<'a> convert::OpId<&'a ActorId> for &'a legacy::OpId { + fn counter(&self) -> u64 { + legacy::OpId::counter(self) + } + + fn actor(&self) -> &'a ActorId { + &self.1 + } + } +} + +impl From<&Change> for crate::ExpandedChange { + fn from(c: &Change) -> Self { + let actors = std::iter::once(c.actor_id()) + .chain(c.other_actor_ids().iter()) + .cloned() + .enumerate() + .collect::>(); + let operations = c + .iter_ops() + .map(|o| crate::legacy::Op { + action: crate::types::OpType::from_action_and_value(o.action, o.val), + insert: o.insert, + key: match o.key { + StoredKey::Elem(e) if e.is_head() => { + crate::legacy::Key::Seq(crate::legacy::ElementId::Head) + } + StoredKey::Elem(ElemId(o)) => { + crate::legacy::Key::Seq(crate::legacy::ElementId::Id( + crate::legacy::OpId::new(o.counter(), actors.get(&o.actor()).unwrap()), + )) + } + StoredKey::Prop(p) => crate::legacy::Key::Map(p), + }, + obj: if o.obj.is_root() { + crate::legacy::ObjectId::Root + } else { + crate::legacy::ObjectId::Id(crate::legacy::OpId::new( + o.obj.opid().counter(), + actors.get(&o.obj.opid().actor()).unwrap(), + )) + }, + pred: o + .pred + .into_iter() + .map(|p| crate::legacy::OpId::new(p.counter(), actors.get(&p.actor()).unwrap())) + .collect(), + }) + .collect::>(); + crate::ExpandedChange { + operations, + actor_id: actors.get(&0).unwrap().clone(), + hash: Some(c.hash()), + time: c.timestamp(), + deps: c.deps().to_vec(), + seq: c.seq(), + start_op: c.start_op(), + extra_bytes: c.extra_bytes().to_vec(), + message: c.message().cloned(), + } + } +} + +#[cfg(test)] +pub(crate) mod gen { + use super::Change; + use crate::{ + op_tree::OpSetMetadata, + storage::{change::ChangeBuilder, convert::op_as_actor_id}, + types::{ + gen::{gen_hash, gen_op}, + ObjId, Op, OpId, + }, + ActorId, + }; + use proptest::prelude::*; + + fn gen_actor() -> impl Strategy { + proptest::array::uniform32(proptest::bits::u8::ANY).prop_map(ActorId::from) + } + + prop_compose! { + fn gen_actors()(this_actor in gen_actor(), other_actors in proptest::collection::vec(gen_actor(), 0..10)) -> (ActorId, Vec) { + (this_actor, other_actors) + } + } + + fn gen_ops( + this_actor: ActorId, + other_actors: Vec, + ) -> impl Strategy, OpSetMetadata)> { + let mut all_actors = vec![this_actor]; + all_actors.extend(other_actors); + let mut m = OpSetMetadata::from_actors(all_actors); + m.props.cache("someprop".to_string()); + let root_id = ObjId::root(); + (0_u64..10) + .prop_map(|num_ops| { + (0..num_ops) + .map(|counter| OpId::new(counter, 0)) + .collect::>() + }) + .prop_flat_map(move |opids| { + let mut strat = Just(Vec::new()).boxed(); + for opid in opids { + strat = (gen_op(opid, vec![0]), strat) + .prop_map(move |(op, ops)| { + let mut result = Vec::with_capacity(ops.len() + 1); + result.extend(ops); + result.push((root_id, op)); + result + }) + .boxed(); + } + strat + }) + .prop_map(move |ops| (ops, m.clone())) + } + + prop_compose! { + pub(crate) fn gen_change()((this_actor, other_actors) in gen_actors())( + (ops, metadata) in gen_ops(this_actor.clone(), other_actors), + start_op in 1_u64..200000, + seq in 0_u64..200000, + timestamp in 0..i64::MAX, + deps in proptest::collection::vec(gen_hash(), 0..100), + message in proptest::option::of("[a-z]{200}"), + this_actor in Just(this_actor), + ) -> Change { + let ops = ops.iter().map(|(obj, op)| op_as_actor_id(obj, op, &metadata)); + Change::new(ChangeBuilder::new() + .with_dependencies(deps) + .with_start_op(start_op.try_into().unwrap()) + .with_message(message) + .with_actor(this_actor) + .with_seq(seq) + .with_timestamp(timestamp) + .build(ops.into_iter()) + .unwrap()) + } + + } +} diff --git a/rust/automerge/src/change_graph.rs b/rust/automerge/src/change_graph.rs new file mode 100644 index 00000000..01d269d8 --- /dev/null +++ b/rust/automerge/src/change_graph.rs @@ -0,0 +1,344 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use crate::{ + clock::{Clock, ClockData}, + Change, ChangeHash, +}; + +/// The graph of changes +/// +/// This is a sort of adjacency list based representation, except that instead of using linked +/// lists, we keep all the edges and nodes in two vecs and reference them by index which plays nice +/// with the cache +#[derive(Debug, Clone)] +pub(crate) struct ChangeGraph { + nodes: Vec, + edges: Vec, + hashes: Vec, + nodes_by_hash: BTreeMap, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +struct NodeIdx(u32); + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +struct EdgeIdx(u32); + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] +struct HashIdx(u32); + +#[derive(Debug, Clone)] +struct Edge { + // Edges are always child -> parent so we only store the target, the child is implicit + // as you get the edge from the child + target: NodeIdx, + next: Option, +} + +#[derive(Debug, Clone)] +struct ChangeNode { + hash_idx: HashIdx, + actor_index: usize, + seq: u64, + max_op: u64, + parents: Option, +} + +impl ChangeGraph { + pub(crate) fn new() -> Self { + Self { + nodes: Vec::new(), + edges: Vec::new(), + nodes_by_hash: BTreeMap::new(), + hashes: Vec::new(), + } + } + + pub(crate) fn add_change( + &mut self, + change: &Change, + actor_idx: usize, + ) -> Result<(), MissingDep> { + let hash = change.hash(); + if self.nodes_by_hash.contains_key(&hash) { + return Ok(()); + } + let parent_indices = change + .deps() + .iter() + .map(|h| self.nodes_by_hash.get(h).copied().ok_or(MissingDep(*h))) + .collect::, _>>()?; + let node_idx = self.add_node(actor_idx, change); + self.nodes_by_hash.insert(hash, node_idx); + for parent_idx in parent_indices { + self.add_parent(node_idx, parent_idx); + } + Ok(()) + } + + fn add_node(&mut self, actor_index: usize, change: &Change) -> NodeIdx { + let idx = NodeIdx(self.nodes.len() as u32); + let hash_idx = self.add_hash(change.hash()); + self.nodes.push(ChangeNode { + hash_idx, + actor_index, + seq: change.seq(), + max_op: change.max_op(), + parents: None, + }); + idx + } + + fn add_hash(&mut self, hash: ChangeHash) -> HashIdx { + let idx = HashIdx(self.hashes.len() as u32); + self.hashes.push(hash); + idx + } + + fn add_parent(&mut self, child_idx: NodeIdx, parent_idx: NodeIdx) { + let new_edge_idx = EdgeIdx(self.edges.len() as u32); + let new_edge = Edge { + target: parent_idx, + next: None, + }; + self.edges.push(new_edge); + + let child = &mut self.nodes[child_idx.0 as usize]; + if let Some(edge_idx) = child.parents { + let mut edge = &mut self.edges[edge_idx.0 as usize]; + while let Some(next) = edge.next { + edge = &mut self.edges[next.0 as usize]; + } + edge.next = Some(new_edge_idx); + } else { + child.parents = Some(new_edge_idx); + } + } + + fn parents(&self, node_idx: NodeIdx) -> impl Iterator + '_ { + let mut edge_idx = self.nodes[node_idx.0 as usize].parents; + std::iter::from_fn(move || { + let this_edge_idx = edge_idx?; + let edge = &self.edges[this_edge_idx.0 as usize]; + edge_idx = edge.next; + Some(edge.target) + }) + } + + pub(crate) fn clock_for_heads(&self, heads: &[ChangeHash]) -> Clock { + let mut clock = Clock::new(); + + self.traverse_ancestors(heads, |node, _hash| { + clock.include( + node.actor_index, + ClockData { + max_op: node.max_op, + seq: node.seq, + }, + ); + }); + + clock + } + + pub(crate) fn remove_ancestors( + &self, + changes: &mut BTreeSet, + heads: &[ChangeHash], + ) { + self.traverse_ancestors(heads, |_node, hash| { + changes.remove(hash); + }); + } + + /// Call `f` for each (node, hash) in the graph, starting from the given heads + /// + /// No guarantees are made about the order of traversal but each node will only be visited + /// once. + fn traverse_ancestors( + &self, + heads: &[ChangeHash], + mut f: F, + ) { + let mut to_visit = heads + .iter() + .filter_map(|h| self.nodes_by_hash.get(h)) + .copied() + .collect::>(); + + let mut visited = BTreeSet::new(); + + while let Some(idx) = to_visit.pop() { + if visited.contains(&idx) { + continue; + } else { + visited.insert(idx); + } + let node = &self.nodes[idx.0 as usize]; + let hash = &self.hashes[node.hash_idx.0 as usize]; + f(node, hash); + to_visit.extend(self.parents(idx)); + } + } +} + +#[derive(Debug, thiserror::Error)] +#[error("attempted to derive a clock for a change with dependencies we don't have")] +pub struct MissingDep(ChangeHash); + +#[cfg(test)] +mod tests { + use std::{ + num::NonZeroU64, + time::{SystemTime, UNIX_EPOCH}, + }; + + use crate::{ + clock::ClockData, + op_tree::OpSetMetadata, + storage::{change::ChangeBuilder, convert::op_as_actor_id}, + types::{Key, ObjId, Op, OpId, OpIds}, + ActorId, + }; + + use super::*; + + #[test] + fn clock_by_heads() { + let mut builder = TestGraphBuilder::new(); + let actor1 = builder.actor(); + let actor2 = builder.actor(); + let actor3 = builder.actor(); + let change1 = builder.change(&actor1, 10, &[]); + let change2 = builder.change(&actor2, 20, &[change1]); + let change3 = builder.change(&actor3, 30, &[change1]); + let change4 = builder.change(&actor1, 10, &[change2, change3]); + let graph = builder.build(); + + let mut expected_clock = Clock::new(); + expected_clock.include(builder.index(&actor1), ClockData { max_op: 50, seq: 2 }); + expected_clock.include(builder.index(&actor2), ClockData { max_op: 30, seq: 1 }); + expected_clock.include(builder.index(&actor3), ClockData { max_op: 40, seq: 1 }); + + let clock = graph.clock_for_heads(&[change4]); + assert_eq!(clock, expected_clock); + } + + #[test] + fn remove_ancestors() { + let mut builder = TestGraphBuilder::new(); + let actor1 = builder.actor(); + let actor2 = builder.actor(); + let actor3 = builder.actor(); + let change1 = builder.change(&actor1, 10, &[]); + let change2 = builder.change(&actor2, 20, &[change1]); + let change3 = builder.change(&actor3, 30, &[change1]); + let change4 = builder.change(&actor1, 10, &[change2, change3]); + let graph = builder.build(); + + let mut changes = vec![change1, change2, change3, change4] + .into_iter() + .collect::>(); + let heads = vec![change2]; + graph.remove_ancestors(&mut changes, &heads); + + let expected_changes = vec![change3, change4].into_iter().collect::>(); + + assert_eq!(changes, expected_changes); + } + + struct TestGraphBuilder { + actors: Vec, + changes: Vec, + seqs_by_actor: BTreeMap, + } + + impl TestGraphBuilder { + fn new() -> Self { + TestGraphBuilder { + actors: Vec::new(), + changes: Vec::new(), + seqs_by_actor: BTreeMap::new(), + } + } + + fn actor(&mut self) -> ActorId { + let actor = ActorId::random(); + self.actors.push(actor.clone()); + actor + } + + fn index(&self, actor: &ActorId) -> usize { + self.actors.iter().position(|a| a == actor).unwrap() + } + + /// Create a change with `num_new_ops` and `parents` for `actor` + /// + /// The `start_op` and `seq` of the change will be computed from the + /// previous changes for the same actor. + fn change( + &mut self, + actor: &ActorId, + num_new_ops: usize, + parents: &[ChangeHash], + ) -> ChangeHash { + let mut meta = OpSetMetadata::from_actors(self.actors.clone()); + let key = meta.props.cache("key".to_string()); + + let start_op = parents + .iter() + .map(|c| { + self.changes + .iter() + .find(|change| change.hash() == *c) + .unwrap() + .max_op() + }) + .max() + .unwrap_or(0) + + 1; + + let actor_idx = self.index(actor); + let ops = (0..num_new_ops) + .map(|opnum| Op { + id: OpId::new(start_op + opnum as u64, actor_idx), + action: crate::OpType::Put("value".into()), + key: Key::Map(key), + succ: OpIds::empty(), + pred: OpIds::empty(), + insert: false, + }) + .collect::>(); + + let root = ObjId::root(); + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() as i64; + let seq = self.seqs_by_actor.entry(actor.clone()).or_insert(1); + let change = Change::new( + ChangeBuilder::new() + .with_dependencies(parents.to_vec()) + .with_start_op(NonZeroU64::new(start_op).unwrap()) + .with_actor(actor.clone()) + .with_seq(*seq) + .with_timestamp(timestamp) + .build(ops.iter().map(|op| op_as_actor_id(&root, op, &meta))) + .unwrap(), + ); + *seq = seq.checked_add(1).unwrap(); + let hash = change.hash(); + self.changes.push(change); + hash + } + + fn build(&self) -> ChangeGraph { + let mut graph = ChangeGraph::new(); + for change in &self.changes { + let actor_idx = self.index(change.actor_id()); + graph.add_change(change, actor_idx).unwrap(); + } + graph + } + } +} diff --git a/rust/automerge/src/clock.rs b/rust/automerge/src/clock.rs new file mode 100644 index 00000000..64d00fcf --- /dev/null +++ b/rust/automerge/src/clock.rs @@ -0,0 +1,161 @@ +use crate::types::OpId; +use fxhash::FxBuildHasher; +use std::{cmp::Ordering, collections::HashMap}; + +#[derive(Default, Debug, Clone, Copy, PartialEq)] +pub(crate) struct ClockData { + /// Maximum operation counter of the actor at the point in time. + pub(crate) max_op: u64, + /// Sequence number of the change from this actor. + pub(crate) seq: u64, +} + +// a clock for the same actor is ahead of another if it has a higher max_op +impl PartialOrd for ClockData { + fn partial_cmp(&self, other: &Self) -> Option { + self.max_op.partial_cmp(&other.max_op) + } +} + +/// Vector clock mapping actor indices to the max op counter of the changes created by that actor. +#[derive(Default, Debug, Clone, PartialEq)] +pub(crate) struct Clock(HashMap); + +// A general clock is greater if it has one element the other does not or has a counter higher than +// the other for a given actor. +// +// It is equal with another clock if it has the same entries everywhere. +// +// It is less than another clock otherwise. +impl PartialOrd for Clock { + fn partial_cmp(&self, other: &Self) -> Option { + if self.0 == other.0 { + Some(Ordering::Equal) + } else if self.is_greater(other) { + Some(Ordering::Greater) + } else if other.is_greater(self) { + Some(Ordering::Less) + } else { + // concurrent + None + } + } +} + +impl Clock { + pub(crate) fn new() -> Self { + Clock(Default::default()) + } + + pub(crate) fn include(&mut self, actor_index: usize, data: ClockData) { + self.0 + .entry(actor_index) + .and_modify(|d| { + if data.max_op > d.max_op { + *d = data; + } + }) + .or_insert(data); + } + + pub(crate) fn covers(&self, id: &OpId) -> bool { + if let Some(data) = self.0.get(&id.actor()) { + data.max_op >= id.counter() + } else { + false + } + } + + /// Get the max_op counter recorded in this clock for the actor. + pub(crate) fn get_for_actor(&self, actor_index: &usize) -> Option<&ClockData> { + self.0.get(actor_index) + } + + fn is_greater(&self, other: &Self) -> bool { + let mut has_greater = false; + + let mut others_found = 0; + + for (actor, data) in &self.0 { + if let Some(other_data) = other.0.get(actor) { + if data < other_data { + // may be concurrent or less + return false; + } else if data > other_data { + has_greater = true; + } + others_found += 1; + } else { + // other doesn't have this so effectively has a greater element + has_greater = true; + } + } + + if has_greater { + // if they are equal then we have seen every key in the other clock and have at least + // one greater element so our clock is greater + // + // If they aren't the same then we haven't seen every key but have a greater element + // anyway so are concurrent + others_found == other.0.len() + } else { + // our clock doesn't have anything greater than the other clock so can't be greater but + // could still be concurrent + false + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn covers() { + let mut clock = Clock::new(); + + clock.include(1, ClockData { max_op: 20, seq: 1 }); + clock.include(2, ClockData { max_op: 10, seq: 2 }); + + assert!(clock.covers(&OpId::new(10, 1))); + assert!(clock.covers(&OpId::new(20, 1))); + assert!(!clock.covers(&OpId::new(30, 1))); + + assert!(clock.covers(&OpId::new(5, 2))); + assert!(clock.covers(&OpId::new(10, 2))); + assert!(!clock.covers(&OpId::new(15, 2))); + + assert!(!clock.covers(&OpId::new(1, 3))); + assert!(!clock.covers(&OpId::new(100, 3))); + } + + #[test] + fn comparison() { + let mut base_clock = Clock::new(); + base_clock.include(1, ClockData { max_op: 1, seq: 1 }); + base_clock.include(2, ClockData { max_op: 1, seq: 1 }); + + let mut after_clock = base_clock.clone(); + after_clock.include(1, ClockData { max_op: 2, seq: 2 }); + + assert!(after_clock > base_clock); + assert!(base_clock < after_clock); + + assert!(base_clock == base_clock); + + let mut new_actor_clock = base_clock.clone(); + new_actor_clock.include(3, ClockData { max_op: 1, seq: 1 }); + + assert_eq!( + base_clock.partial_cmp(&new_actor_clock), + Some(Ordering::Less) + ); + assert_eq!( + new_actor_clock.partial_cmp(&base_clock), + Some(Ordering::Greater) + ); + + assert_eq!(after_clock.partial_cmp(&new_actor_clock), None); + assert_eq!(new_actor_clock.partial_cmp(&after_clock), None); + } +} diff --git a/rust/automerge/src/columnar.rs b/rust/automerge/src/columnar.rs new file mode 100644 index 00000000..bb727626 --- /dev/null +++ b/rust/automerge/src/columnar.rs @@ -0,0 +1,14 @@ +//! Types for reading data which is stored in a columnar storage format +//! +//! The details of how values are encoded in `encoding`, which exposes a set of "decoder" and +//! "encoder" types. +//! +//! The `column_range` module exposes a set of types - most of which are newtypes over +//! `Range` - which have useful instance methods such as `encode()` to create a new range and +//! `decoder()` to return an iterator of the correct type. +pub(crate) mod column_range; +pub(crate) use column_range::Key; +pub(crate) mod encoding; + +mod splice_error; +pub(crate) use splice_error::SpliceError; diff --git a/rust/automerge/src/columnar/column_range.rs b/rust/automerge/src/columnar/column_range.rs new file mode 100644 index 00000000..5762ed14 --- /dev/null +++ b/rust/automerge/src/columnar/column_range.rs @@ -0,0 +1,21 @@ +mod rle; +pub(crate) use rle::RleRange; +mod delta; +pub(crate) use delta::DeltaRange; +mod boolean; +pub(crate) use boolean::BooleanRange; +mod raw; +pub(crate) use raw::RawRange; +mod opid; +pub(crate) use opid::{OpIdEncoder, OpIdIter, OpIdRange}; +mod opid_list; +pub(crate) use opid_list::{OpIdListEncoder, OpIdListIter, OpIdListRange}; +mod deps; +pub(crate) use deps::{DepsIter, DepsRange}; +mod value; +pub(crate) use value::{ValueEncoder, ValueIter, ValueRange}; +pub(crate) mod generic; +mod key; +pub(crate) use key::{Key, KeyEncoder, KeyIter, KeyRange}; +mod obj_id; +pub(crate) use obj_id::{ObjIdEncoder, ObjIdIter, ObjIdRange}; diff --git a/rust/automerge/src/columnar/column_range/boolean.rs b/rust/automerge/src/columnar/column_range/boolean.rs new file mode 100644 index 00000000..3cefaf0d --- /dev/null +++ b/rust/automerge/src/columnar/column_range/boolean.rs @@ -0,0 +1,40 @@ +use std::{borrow::Cow, ops::Range}; + +use crate::columnar::encoding::{BooleanDecoder, BooleanEncoder}; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct BooleanRange(Range); + +impl BooleanRange { + pub(crate) fn decoder<'a>(&self, data: &'a [u8]) -> BooleanDecoder<'a> { + BooleanDecoder::from(Cow::Borrowed(&data[self.0.clone()])) + } + + pub(crate) fn encode>(items: I, out: &mut Vec) -> Self { + let start = out.len(); + let mut encoder = BooleanEncoder::from(out); + for i in items { + encoder.append(i); + } + let (_, len) = encoder.finish(); + (start..(start + len)).into() + } +} + +impl AsRef> for BooleanRange { + fn as_ref(&self) -> &Range { + &self.0 + } +} + +impl From> for BooleanRange { + fn from(r: Range) -> BooleanRange { + BooleanRange(r) + } +} + +impl From for Range { + fn from(r: BooleanRange) -> Range { + r.0 + } +} diff --git a/rust/automerge/src/columnar/column_range/delta.rs b/rust/automerge/src/columnar/column_range/delta.rs new file mode 100644 index 00000000..9dae43b8 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/delta.rs @@ -0,0 +1,152 @@ +use std::{borrow::Cow, convert::Infallible, ops::Range}; + +use crate::columnar::{ + encoding::{raw, DeltaDecoder, DeltaEncoder, Sink}, + SpliceError, +}; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct DeltaRange(Range); + +impl DeltaRange { + pub(crate) fn decoder<'a>(&self, data: &'a [u8]) -> DeltaDecoder<'a> { + DeltaDecoder::from(Cow::Borrowed(&data[self.0.clone()])) + } + + pub(crate) fn encoder(&self, output: S) -> DeltaEncoder { + DeltaEncoder::from(output) + } + + pub(crate) fn len(&self) -> usize { + self.0.len() + } + + pub(crate) fn encode>>(items: I, out: &mut Vec) -> Self { + // SAFETY: The incoming iterator is infallible and there are no existing items + Self::from(0..0) + .splice::(&[], 0..0, items.map(Ok), out) + .unwrap() + } + + pub(crate) fn splice, E>>>( + &self, + data: &[u8], + replace: Range, + mut replace_with: I, + out: &mut Vec, + ) -> Result> { + let start = out.len(); + let mut decoder = self.decoder(data); + let mut encoder = self.encoder(out); + let mut idx = 0; + while idx < replace.start { + match decoder + .next() + .transpose() + .map_err(SpliceError::ReadExisting)? + { + Some(elem) => encoder.append(elem), + None => panic!("out of bounds"), + } + idx += 1; + } + for _ in 0..replace.len() { + decoder + .next() + .transpose() + .map_err(SpliceError::ReadExisting)?; + if let Some(next) = replace_with + .next() + .transpose() + .map_err(SpliceError::ReadReplace)? + { + encoder.append(next); + } + } + for next in replace_with { + let next = next.map_err(SpliceError::ReadReplace)?; + encoder.append(next); + } + for next in decoder { + let next = next.map_err(SpliceError::ReadExisting)?; + encoder.append(next); + } + let (_, len) = encoder.finish(); + Ok((start..(start + len)).into()) + } +} + +impl AsRef> for DeltaRange { + fn as_ref(&self) -> &Range { + &self.0 + } +} + +impl From> for DeltaRange { + fn from(r: Range) -> DeltaRange { + DeltaRange(r) + } +} + +impl From for Range { + fn from(r: DeltaRange) -> Range { + r.0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::columnar::encoding::properties::option_splice_scenario; + use proptest::prelude::*; + + fn encode>>(vals: I) -> (DeltaRange, Vec) { + let mut buf = Vec::::new(); + let range = DeltaRange::encode(vals, &mut buf); + (range, buf) + } + + fn decode(range: DeltaRange, buf: &[u8]) -> Vec> { + range.decoder(buf).collect::, _>>().unwrap() + } + + fn encodable_int() -> impl Strategy + Clone { + 0..(i64::MAX / 2) + } + + proptest! { + #[test] + fn encode_decode_delta(vals in proptest::collection::vec(proptest::option::of(encodable_int()), 0..100)) { + let (r, encoded) = encode(vals.iter().copied()); + if vals.iter().all(|v| v.is_none()) { + assert_eq!(encoded.len(), 0); + let decoded = decode(r, &encoded); + assert_eq!(Vec::>::new(), decoded) + } else { + let decoded = decode(r, &encoded); + assert_eq!(vals, decoded) + } + } + + #[test] + fn splice_delta(scenario in option_splice_scenario(proptest::option::of(encodable_int()))) { + let (range, encoded) = encode(scenario.initial_values.iter().copied()); + let mut out = Vec::new(); + let replacements: Vec, Infallible>> = scenario.replacements.iter().cloned().map(Ok).collect(); + let new_range = range.splice(&encoded, scenario.replace_range.clone(), replacements.into_iter(), &mut out).unwrap(); + let decoded = decode(new_range, &out); + scenario.check_optional(decoded); + } + } + + #[test] + fn bugbug() { + let vals: Vec = vec![6, 5, 8, 9, 10, 11, 12, 13]; + let (r, encoded) = encode(vals.iter().copied().map(Some)); + let decoded = decode(r, &encoded) + .into_iter() + .map(Option::unwrap) + .collect::>(); + assert_eq!(decoded, vals); + } +} diff --git a/rust/automerge/src/columnar/column_range/deps.rs b/rust/automerge/src/columnar/column_range/deps.rs new file mode 100644 index 00000000..1956acd1 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/deps.rs @@ -0,0 +1,123 @@ +use super::{DeltaRange, RleRange}; +use crate::columnar::encoding::{DecodeColumnError, DeltaDecoder, RleDecoder}; + +/// A grouped column containing lists of u64s +#[derive(Clone, Debug)] +pub(crate) struct DepsRange { + num: RleRange, + deps: DeltaRange, +} + +impl DepsRange { + pub(crate) fn new(num: RleRange, deps: DeltaRange) -> Self { + Self { num, deps } + } + + pub(crate) fn num_range(&self) -> &RleRange { + &self.num + } + + pub(crate) fn deps_range(&self) -> &DeltaRange { + &self.deps + } + + pub(crate) fn encode(deps: I, out: &mut Vec) -> DepsRange + where + I: Iterator + Clone, + II: IntoIterator + ExactSizeIterator, + { + let num = RleRange::encode(deps.clone().map(|d| Some(d.len() as u64)), out); + let deps = DeltaRange::encode( + deps.flat_map(|d| d.into_iter().map(|d| Some(d as i64))), + out, + ); + DepsRange { num, deps } + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> DepsIter<'a> { + DepsIter { + num: self.num.decoder(data), + deps: self.deps.decoder(data), + } + } +} + +#[derive(Clone)] +pub(crate) struct DepsIter<'a> { + num: RleDecoder<'a, u64>, + deps: DeltaDecoder<'a>, +} + +impl<'a> DepsIter<'a> { + fn try_next(&mut self) -> Result>, DecodeColumnError> { + let num = match self + .num + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("num", e))? + { + Some(Some(n)) => n as usize, + Some(None) => { + return Err(DecodeColumnError::unexpected_null("group")); + } + None => return Ok(None), + }; + // We cannot trust `num` because it is provided over the network, + // but in the common case it will be correct and small (so we + // use with_capacity to make sure the vector is precisely the right + // size). + let mut result = Vec::with_capacity(std::cmp::min(num, 100)); + while result.len() < num { + match self + .deps + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("deps", e))? + { + Some(Some(elem)) => { + let elem = match u64::try_from(elem) { + Ok(e) => e, + Err(e) => { + tracing::error!(err=?e, dep=elem, "error converting dep index to u64"); + return Err(DecodeColumnError::invalid_value( + "deps", + "error converting dep index to u64", + )); + } + }; + result.push(elem); + } + _ => return Err(DecodeColumnError::unexpected_null("deps")), + } + } + Ok(Some(result)) + } +} + +impl<'a> Iterator for DepsIter<'a> { + type Item = Result, DecodeColumnError>; + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use proptest::collection::vec as propvec; + use proptest::prelude::*; + + fn encodable_u64() -> impl Strategy + Clone { + 0_u64..((i64::MAX / 2) as u64) + } + + proptest! { + #[test] + fn encode_decode_deps(deps in propvec(propvec(encodable_u64(), 0..100), 0..100)) { + let mut out = Vec::new(); + let range = DepsRange::encode(deps.iter().cloned().map(|d| d.into_iter()), &mut out); + let decoded = range.iter(&out).collect::, _>>().unwrap(); + assert_eq!(deps, decoded); + } + } +} diff --git a/rust/automerge/src/columnar/column_range/generic.rs b/rust/automerge/src/columnar/column_range/generic.rs new file mode 100644 index 00000000..03a0e362 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/generic.rs @@ -0,0 +1,91 @@ +use std::ops::Range; + +use crate::{columnar::encoding::DecodeColumnError, ScalarValue}; + +use super::{ValueIter, ValueRange}; +mod simple; +use simple::SimpleColIter; +pub(crate) use simple::SimpleColRange; +mod group; +use group::GroupIter; +pub(crate) use group::{GroupRange, GroupedColumnRange}; + +/// A range which can represent any column which is valid with respect to the data model of the +/// column oriented storage format. This is primarily intended to be used in two cases: +/// +/// 1. As an intermediate step when parsing binary storage. We parse the column metadata into +/// GenericColumnRange, then from there into more specific range types. +/// 2. when we encounter a column which we don't expect but which we still need to retain and +/// re-encode when writing new changes. +/// +/// The generic data model is represented by `CellValue`, an iterator over a generic column will +/// produce a `CellValue` for each row in the column. +#[derive(Debug, Clone)] +pub(crate) enum GenericColumnRange { + /// A "simple" column is one which directly corresponds to a single column in the raw format + Simple(SimpleColRange), + /// A value range consists of two columns and produces `ScalarValue`s + Value(ValueRange), + /// A "group" range consists of zero or more grouped columns and produces `CellValue::Group`s + Group(GroupRange), +} + +impl GenericColumnRange { + pub(crate) fn range(&self) -> Range { + match self { + Self::Simple(sc) => sc.range(), + Self::Value(v) => v.range(), + Self::Group(g) => g.range(), + } + } +} + +/// The type of values which can be stored in a generic column +pub(crate) enum CellValue { + /// The contents of a simple column + Simple(SimpleValue), + /// The values in a set of grouped columns + Group(Vec>), +} + +pub(crate) enum SimpleValue { + Uint(Option), + Int(Option), + String(Option), + Bool(bool), + /// The contents of a value metadata and value raw column + Value(ScalarValue), +} + +#[derive(Debug, Clone)] +#[allow(dead_code)] +pub(crate) enum GenericColIter<'a> { + Simple(SimpleColIter<'a>), + Value(ValueIter<'a>), + Group(GroupIter<'a>), +} + +impl<'a> GenericColIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + match self { + Self::Simple(s) => s + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("a simple column", e)) + .map(|v| v.map(CellValue::Simple)), + Self::Value(v) => v + .next() + .transpose() + .map(|v| v.map(|v| CellValue::Simple(SimpleValue::Value(v)))), + Self::Group(g) => g.next().transpose(), + } + } +} + +impl<'a> Iterator for GenericColIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} diff --git a/rust/automerge/src/columnar/column_range/generic/group.rs b/rust/automerge/src/columnar/column_range/generic/group.rs new file mode 100644 index 00000000..b1392428 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/generic/group.rs @@ -0,0 +1,138 @@ +use std::ops::Range; + +use super::{CellValue, SimpleColIter, SimpleColRange, SimpleValue}; +use crate::columnar::{ + column_range::{RleRange, ValueIter, ValueRange}, + encoding::{col_error::DecodeColumnError, RleDecoder}, +}; + +/// A group column range is one with a "num" column and zero or more "grouped" columns. The "num" +/// column contains RLE encoded u64s, each `u64` represents the number of values to read from each +/// of the grouped columns in order to produce a `CellValue::Group` for the current row. +#[derive(Debug, Clone)] +pub(crate) struct GroupRange { + pub(crate) num: RleRange, + pub(crate) values: Vec, +} + +impl GroupRange { + pub(crate) fn new(num: RleRange, values: Vec) -> Self { + Self { num, values } + } + + #[allow(dead_code)] + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> GroupIter<'a> { + GroupIter { + num: self.num.decoder(data), + values: self.values.iter().map(|v| v.iter(data)).collect(), + } + } + + pub(crate) fn range(&self) -> Range { + let start = self.num.start(); + let end = self + .values + .last() + .map(|v| v.range().end) + .unwrap_or_else(|| self.num.end()); + start..end + } +} + +/// The type of ranges which can be the "grouped" columns in a `GroupRange` +#[derive(Debug, Clone)] +pub(crate) enum GroupedColumnRange { + Value(ValueRange), + Simple(SimpleColRange), +} + +impl GroupedColumnRange { + fn iter<'a>(&self, data: &'a [u8]) -> GroupedColIter<'a> { + match self { + Self::Value(vr) => GroupedColIter::Value(vr.iter(data)), + Self::Simple(sc) => GroupedColIter::Simple(sc.iter(data)), + } + } + + pub(crate) fn range(&self) -> Range { + match self { + Self::Value(vr) => vr.range(), + Self::Simple(s) => s.range(), + } + } +} + +#[derive(Debug, Clone)] +pub(crate) struct GroupIter<'a> { + num: RleDecoder<'a, u64>, + values: Vec>, +} + +impl<'a> GroupIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + let num = self + .num + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("num", e))?; + match num { + None => Ok(None), + Some(None) => Err(DecodeColumnError::unexpected_null("num")), + Some(Some(num)) => { + let mut row = Vec::new(); + for _ in 0..num { + let mut inner_row = Vec::new(); + for (index, value_col) in self.values.iter_mut().enumerate() { + match value_col.next().transpose()? { + None => { + return Err(DecodeColumnError::unexpected_null(format!( + "col {}", + index + ))) + } + Some(v) => { + inner_row.push(v); + } + } + } + row.push(inner_row); + } + Ok(Some(CellValue::Group(row))) + } + } + } +} + +impl<'a> Iterator for GroupIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +#[derive(Debug, Clone)] +enum GroupedColIter<'a> { + Value(ValueIter<'a>), + Simple(SimpleColIter<'a>), +} + +impl<'a> GroupedColIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + match self { + Self::Value(viter) => Ok(viter.next().transpose()?.map(SimpleValue::Value)), + Self::Simple(siter) => siter + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("a simple column", e)), + } + } +} + +impl<'a> Iterator for GroupedColIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} diff --git a/rust/automerge/src/columnar/column_range/generic/simple.rs b/rust/automerge/src/columnar/column_range/generic/simple.rs new file mode 100644 index 00000000..9eb3c177 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/generic/simple.rs @@ -0,0 +1,76 @@ +use std::ops::Range; + +use crate::columnar::{ + column_range::{BooleanRange, DeltaRange, RleRange}, + encoding::{raw, BooleanDecoder, DeltaDecoder, RleDecoder}, +}; + +use super::SimpleValue; + +/// The four types of "simple" column defined in the raw format +#[derive(Debug, Clone)] +pub(crate) enum SimpleColRange { + /// A column containing RLE encoded u64's + RleInt(RleRange), + /// A column containing RLE encoded strings + RleString(RleRange), + /// A column containing delta -> RLE encoded i64s + Delta(DeltaRange), + /// A column containing boolean values + Boolean(BooleanRange), +} + +impl SimpleColRange { + pub(super) fn iter<'a>(&self, data: &'a [u8]) -> SimpleColIter<'a> { + match self { + Self::RleInt(r) => SimpleColIter::RleInt(r.decoder(data)), + Self::RleString(r) => SimpleColIter::RleString(r.decoder(data)), + Self::Delta(r) => SimpleColIter::Delta(r.decoder(data)), + Self::Boolean(r) => SimpleColIter::Boolean(r.decoder(data)), + } + } + + pub(crate) fn range(&self) -> Range { + match self { + Self::RleInt(r) => r.clone().into(), + Self::RleString(r) => r.clone().into(), + Self::Delta(r) => r.clone().into(), + Self::Boolean(r) => r.clone().into(), + } + } +} + +#[derive(Debug, Clone)] +pub(crate) enum SimpleColIter<'a> { + RleInt(RleDecoder<'a, u64>), + RleString(RleDecoder<'a, smol_str::SmolStr>), + Delta(DeltaDecoder<'a>), + Boolean(BooleanDecoder<'a>), +} + +impl<'a> SimpleColIter<'a> { + fn try_next(&mut self) -> Result, raw::Error> { + match self { + Self::RleInt(d) => read_col(d, SimpleValue::Uint), + Self::RleString(d) => read_col(d, SimpleValue::String), + Self::Delta(d) => read_col(d, SimpleValue::Int), + Self::Boolean(d) => Ok(d.next().transpose()?.map(SimpleValue::Bool)), + } + } +} + +fn read_col(mut col: C, f: F) -> Result, raw::Error> +where + C: Iterator, raw::Error>>, + F: Fn(Option) -> U, +{ + col.next().transpose().map(|v| v.map(f)) +} + +impl<'a> Iterator for SimpleColIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} diff --git a/rust/automerge/src/columnar/column_range/key.rs b/rust/automerge/src/columnar/column_range/key.rs new file mode 100644 index 00000000..70ea8e1e --- /dev/null +++ b/rust/automerge/src/columnar/column_range/key.rs @@ -0,0 +1,258 @@ +use std::{convert::Infallible, ops::Range}; + +use super::{DeltaRange, RleRange}; +use crate::{ + columnar::{ + encoding::{ + raw, DecodeColumnError, DeltaDecoder, DeltaEncoder, RleDecoder, RleEncoder, Sink, + }, + SpliceError, + }, + convert, + types::{ElemId, OpId}, +}; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) enum Key { + Prop(smol_str::SmolStr), + Elem(ElemId), +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct KeyRange { + actor: RleRange, + counter: DeltaRange, + string: RleRange, +} + +impl KeyRange { + pub(crate) fn new( + actor: RleRange, + counter: DeltaRange, + string: RleRange, + ) -> Self { + Self { + actor, + counter, + string, + } + } + + pub(crate) fn actor_range(&self) -> &RleRange { + &self.actor + } + + pub(crate) fn counter_range(&self) -> &DeltaRange { + &self.counter + } + + pub(crate) fn string_range(&self) -> &RleRange { + &self.string + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> KeyIter<'a> { + KeyIter { + actor: self.actor.decoder(data), + counter: self.counter.decoder(data), + string: self.string.decoder(data), + } + } + + pub(crate) fn encode<'b, O, I: Iterator> + Clone>( + items: I, + out: &mut Vec, + ) -> Self + where + O: convert::OpId, + { + // SAFETY: The incoming iterator is infallible and there are no existing items + Self { + actor: (0..0).into(), + counter: (0..0).into(), + string: (0..0).into(), + } + .splice::<_, Infallible, _>(&[], 0..0, items.map(Ok), out) + .unwrap() + } + + /// Splice new keys into this set of keys, encoding the resulting actor, counter, and str + /// columns in `out`. + pub(crate) fn splice<'b, O, E, I>( + &mut self, + data: &[u8], + replace: Range, + replace_with: I, + out: &mut Vec, + ) -> Result> + where + O: convert::OpId, + E: std::error::Error, + I: Iterator, E>> + Clone, + { + let actor = self.actor.splice( + data, + replace.clone(), + replace_with.clone().map(|k| { + k.map(|k| match k { + convert::Key::Prop(_) => None, + convert::Key::Elem(convert::ElemId::Head) => None, + convert::Key::Elem(convert::ElemId::Op(o)) => Some(o.actor() as u64), + }) + }), + out, + )?; + + let counter = self.counter.splice( + data, + replace.clone(), + replace_with.clone().map(|k| { + k.map(|k| match k { + convert::Key::Prop(_) => None, + convert::Key::Elem(convert::ElemId::Head) => Some(0), + convert::Key::Elem(convert::ElemId::Op(o)) => Some(o.counter() as i64), + }) + }), + out, + )?; + + let string = self.string.splice( + data, + replace, + replace_with.map(|k| { + k.map(|k| match k { + convert::Key::Prop(s) => Some(s), + convert::Key::Elem(_) => None, + }) + }), + out, + )?; + + Ok(Self { + actor, + counter, + string, + }) + } +} + +#[derive(Clone, Debug)] +pub(crate) struct KeyIter<'a> { + actor: RleDecoder<'a, u64>, + counter: DeltaDecoder<'a>, + string: RleDecoder<'a, smol_str::SmolStr>, +} + +impl<'a> KeyIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + let actor = self + .actor + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("actor", e))?; + let counter = self + .counter + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("counter", e))?; + let string = self + .string + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("string", e))?; + match (actor, counter, string) { + (Some(Some(_)), Some(Some(_)), Some(Some(_))) => { + Err(DecodeColumnError::invalid_value("key", "too many values")) + } + (Some(None) | None, Some(None) | None, Some(Some(string))) => { + Ok(Some(Key::Prop(string))) + } + (Some(None) | None, Some(Some(0)), Some(None) | None) => { + Ok(Some(Key::Elem(ElemId(OpId::new(0, 0))))) + } + (Some(Some(actor)), Some(Some(ctr)), Some(None) | None) => match ctr.try_into() { + //Ok(ctr) => Some(Ok(Key::Elem(ElemId(OpId(ctr, actor as usize))))), + Ok(ctr) => Ok(Some(Key::Elem(ElemId(OpId::new(ctr, actor as usize))))), + Err(_) => Err(DecodeColumnError::invalid_value( + "counter", + "negative value for counter", + )), + }, + (None | Some(None), None | Some(None), None | Some(None)) => Ok(None), + (None | Some(None), k, _) => { + tracing::error!(key=?k, "unexpected null actor"); + Err(DecodeColumnError::unexpected_null("actor")) + } + (_, None | Some(None), _) => Err(DecodeColumnError::unexpected_null("counter")), + } + } +} + +impl<'a> Iterator for KeyIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +pub(crate) struct KeyEncoder { + actor: RleEncoder, + counter: DeltaEncoder, + string: RleEncoder, +} + +impl KeyEncoder> { + pub(crate) fn new() -> KeyEncoder> { + KeyEncoder { + actor: RleEncoder::new(Vec::new()), + counter: DeltaEncoder::new(Vec::new()), + string: RleEncoder::new(Vec::new()), + } + } + + pub(crate) fn finish(self, out: &mut Vec) -> KeyRange { + let actor_start = out.len(); + let (actor, _) = self.actor.finish(); + out.extend(actor); + let actor_end = out.len(); + + let (counter, _) = self.counter.finish(); + out.extend(counter); + let counter_end = out.len(); + + let (string, _) = self.string.finish(); + out.extend(string); + let string_end = out.len(); + + KeyRange { + actor: (actor_start..actor_end).into(), + counter: (actor_end..counter_end).into(), + string: (counter_end..string_end).into(), + } + } +} + +impl KeyEncoder { + pub(crate) fn append(&mut self, key: convert::Key<'_, O>) + where + O: convert::OpId, + { + match key { + convert::Key::Prop(p) => { + self.string.append_value(p.clone()); + self.actor.append_null(); + self.counter.append_null(); + } + convert::Key::Elem(convert::ElemId::Head) => { + self.string.append_null(); + self.actor.append_null(); + self.counter.append_value(0); + } + convert::Key::Elem(convert::ElemId::Op(o)) => { + self.string.append_null(); + self.actor.append_value(o.actor() as u64); + self.counter.append_value(o.counter() as i64); + } + } + } +} diff --git a/rust/automerge/src/columnar/column_range/obj_id.rs b/rust/automerge/src/columnar/column_range/obj_id.rs new file mode 100644 index 00000000..d282563e --- /dev/null +++ b/rust/automerge/src/columnar/column_range/obj_id.rs @@ -0,0 +1,202 @@ +use std::{convert::Infallible, ops::Range}; + +use crate::{ + columnar::{ + encoding::{raw, DecodeColumnError, RleDecoder, RleEncoder, Sink}, + SpliceError, + }, + convert, + types::{ObjId, OpId}, +}; + +use super::RleRange; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ObjIdRange { + actor: RleRange, + counter: RleRange, +} + +impl ObjIdRange { + pub(crate) fn new(actor: RleRange, counter: RleRange) -> Option { + if actor.is_empty() || counter.is_empty() { + None + } else { + Some(Self { actor, counter }) + } + } + + pub(crate) fn actor_range(&self) -> &RleRange { + &self.actor + } + + pub(crate) fn counter_range(&self) -> &RleRange { + &self.counter + } + + pub(crate) fn encode> + Clone>( + ids: I, + out: &mut Vec, + ) -> Option + where + O: convert::OpId, + { + // SAFETY: the incoming iterator is infallible and there are no existing elements + Self { + actor: (0..0).into(), + counter: (0..0).into(), + } + .splice::<_, Infallible, _>(&[], 0..0, ids.map(Ok), out) + .unwrap() + } + + /// Given some existing columns of object IDs splice a new set of object IDs in with the + /// existing ones + /// + /// Note that this returns `None` if the resulting range is empty (which will only occur if the + /// replace range is larger than the input iterator and `ids` is an empty iterator). + pub(crate) fn splice< + O, + E: std::error::Error, + I: Iterator, E>> + Clone, + >( + &self, + data: &[u8], + replace: Range, + ids: I, + out: &mut Vec, + ) -> Result, SpliceError> + where + O: convert::OpId, + { + let actor = self.actor.splice( + data, + replace.clone(), + ids.clone().map(|id| id.map(encoded_actor)), + out, + )?; + + if actor.is_empty() { + return Ok(None); + } + + let counter = self.counter.splice( + data, + replace, + ids.map(|i| { + i.map(|i| match i { + convert::ObjId::Root => None, + convert::ObjId::Op(o) => Some(o.counter()), + }) + }), + out, + )?; + + Ok(Some(Self { actor, counter })) + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> ObjIdIter<'a> { + ObjIdIter { + actor: self.actor.decoder(data), + counter: self.counter.decoder(data), + } + } +} + +fn encoded_actor(id: convert::ObjId) -> Option +where + O: convert::OpId, +{ + match id { + convert::ObjId::Root => None, + convert::ObjId::Op(o) => Some(o.actor() as u64), + } +} + +#[derive(Clone)] +pub(crate) struct ObjIdIter<'a> { + actor: RleDecoder<'a, u64>, + counter: RleDecoder<'a, u64>, +} + +impl<'a> ObjIdIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + let actor = self + .actor + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("actor", e))?; + let counter = self + .counter + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("counter", e))?; + match (actor, counter) { + (None | Some(None), None | Some(None)) => Ok(Some(ObjId::root())), + (Some(Some(a)), Some(Some(c))) => Ok(Some(ObjId(OpId::new(c, a as usize)))), + (_, Some(Some(0))) => Ok(Some(ObjId::root())), + (Some(None) | None, _) => Err(DecodeColumnError::unexpected_null("actor")), + (_, Some(None) | None) => Err(DecodeColumnError::unexpected_null("counter")), + } + } +} + +impl<'a> Iterator for ObjIdIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +pub(crate) struct ObjIdEncoder { + actor: RleEncoder, + counter: RleEncoder, +} + +impl ObjIdEncoder { + pub(crate) fn append(&mut self, id: convert::ObjId) + where + O: convert::OpId, + { + match id { + convert::ObjId::Root => { + self.actor.append_null(); + self.counter.append_null(); + } + convert::ObjId::Op(o) => { + self.actor.append_value(o.actor() as u64); + self.counter.append_value(o.counter()); + } + } + } +} + +impl ObjIdEncoder> { + pub(crate) fn new() -> Self { + Self { + actor: RleEncoder::from(Vec::new()), + counter: RleEncoder::from(Vec::new()), + } + } + + pub(crate) fn finish(self, out: &mut Vec) -> Option { + let start = out.len(); + let (actor, _) = self.actor.finish(); + out.extend(actor); + let actor_end = out.len(); + + let (counter, _) = self.counter.finish(); + out.extend(counter); + let counter_end = out.len(); + + if start == counter_end { + None + } else { + Some(ObjIdRange { + actor: (start..actor_end).into(), + counter: (actor_end..counter_end).into(), + }) + } + } +} diff --git a/rust/automerge/src/columnar/column_range/opid.rs b/rust/automerge/src/columnar/column_range/opid.rs new file mode 100644 index 00000000..d2cdce79 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/opid.rs @@ -0,0 +1,210 @@ +use std::ops::Range; + +use super::{DeltaRange, RleRange}; +use crate::{ + columnar::{ + encoding::{ + raw, DecodeColumnError, DeltaDecoder, DeltaEncoder, RleDecoder, RleEncoder, Sink, + }, + SpliceError, + }, + convert, + types::OpId, +}; + +#[derive(Debug, Clone)] +pub(crate) struct OpIdRange { + actor: RleRange, + counter: DeltaRange, +} + +impl OpIdRange { + pub(crate) fn new(actor: RleRange, counter: DeltaRange) -> Self { + Self { actor, counter } + } + + pub(crate) fn actor_range(&self) -> &RleRange { + &self.actor + } + + pub(crate) fn counter_range(&self) -> &DeltaRange { + &self.counter + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> OpIdIter<'a> { + OpIdIter { + actor: self.actor.decoder(data), + counter: self.counter.decoder(data), + } + } + + pub(crate) fn encode(opids: I, out: &mut Vec) -> Self + where + O: convert::OpId, + I: Iterator + Clone, + { + let actor = RleRange::encode(opids.clone().map(|o| Some(o.actor() as u64)), out); + let counter = DeltaRange::encode(opids.map(|o| Some(o.counter() as i64)), out); + Self { actor, counter } + } + + #[allow(dead_code)] + pub(crate) fn splice( + &self, + data: &[u8], + replace: Range, + replace_with: I, + out: &mut Vec, + ) -> Result> + where + O: convert::OpId, + E: std::error::Error, + I: Iterator> + Clone, + { + let actor = self.actor.splice( + data, + replace.clone(), + replace_with + .clone() + .map(|i| i.map(|i| Some(i.actor() as u64))), + out, + )?; + let counter = self.counter.splice( + data, + replace, + replace_with.map(|i| i.map(|i| Some(i.counter() as i64))), + out, + )?; + Ok(Self { actor, counter }) + } +} + +#[derive(Clone)] +pub(crate) struct OpIdIter<'a> { + actor: RleDecoder<'a, u64>, + counter: DeltaDecoder<'a>, +} + +impl<'a> OpIdIter<'a> { + pub(crate) fn done(&self) -> bool { + self.counter.done() + } +} + +impl<'a> OpIdIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + let actor = self + .actor + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("actor", e))?; + let counter = self + .counter + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("counter", e))?; + match (actor, counter) { + (Some(Some(a)), Some(Some(c))) => match u32::try_from(c) { + Ok(c) => Ok(Some(OpId::new(c as u64, a as usize))), + Err(_) => Err(DecodeColumnError::invalid_value( + "counter", + "negative or large value encountered", + )), + }, + (Some(None), _) => Err(DecodeColumnError::unexpected_null("actor")), + (_, Some(None)) => Err(DecodeColumnError::unexpected_null("actor")), + (Some(_), None) => Err(DecodeColumnError::unexpected_null("ctr")), + (None, Some(_)) => Err(DecodeColumnError::unexpected_null("actor")), + (None, None) => Ok(None), + } + } +} + +impl<'a> Iterator for OpIdIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +pub(crate) struct OpIdEncoder { + actor: RleEncoder, + counter: DeltaEncoder, +} + +impl OpIdEncoder { + pub(crate) fn append>(&mut self, opid: O) { + self.actor.append_value(opid.actor() as u64); + self.counter.append_value(opid.counter() as i64); + } +} + +impl OpIdEncoder> { + pub(crate) fn new() -> Self { + Self { + actor: RleEncoder::from(Vec::new()), + counter: DeltaEncoder::from(Vec::new()), + } + } + + pub(crate) fn finish(self, out: &mut Vec) -> OpIdRange { + let start = out.len(); + let (actor, _) = self.actor.finish(); + out.extend(actor); + let actor_end = out.len(); + + let (counter, _) = self.counter.finish(); + out.extend(counter); + let counter_end = out.len(); + + OpIdRange { + actor: (start..actor_end).into(), + counter: (actor_end..counter_end).into(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + columnar::encoding::properties::{opid, splice_scenario}, + types::OpId, + }; + use proptest::prelude::*; + use std::convert::Infallible; + + fn encode(vals: &[OpId]) -> (Vec, OpIdRange) { + let mut out = Vec::new(); + let r = OpIdRange::encode(vals.iter().copied(), &mut out); + (out, r) + } + + fn decode(buf: &[u8], range: OpIdRange) -> Vec { + range.iter(buf).map(|c| c.unwrap()).collect() + } + + proptest! { + #[test] + fn encode_decode_opid(opids in proptest::collection::vec(opid(), 0..100)) { + let (encoded, range) = encode(&opids); + assert_eq!(opids, decode(&encoded[..], range)); + } + + #[test] + fn splice_opids(scenario in splice_scenario(opid())) { + let (encoded, range) = encode(&scenario.initial_values); + let mut out = Vec::new(); + let replacements: Vec> = scenario.replacements.iter().cloned().map(Ok).collect(); + let new_range = range.splice( + &encoded, + scenario.replace_range.clone(), + replacements.into_iter(), + &mut out + ).unwrap(); + let result = decode(&out[..], new_range); + scenario.check(result); + } + } +} diff --git a/rust/automerge/src/columnar/column_range/opid_list.rs b/rust/automerge/src/columnar/column_range/opid_list.rs new file mode 100644 index 00000000..6a9c8a38 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/opid_list.rs @@ -0,0 +1,329 @@ +use std::{convert::Infallible, ops::Range}; + +use super::{DeltaRange, RleRange}; +use crate::{ + columnar::{ + encoding::{ + raw, DecodeColumnError, DeltaDecoder, DeltaEncoder, RleDecoder, RleEncoder, Sink, + }, + SpliceError, + }, + convert, + types::OpId, +}; + +/// A collection of ranges which decode to lists of OpIds +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct OpIdListRange { + num: RleRange, + actor: RleRange, + counter: DeltaRange, +} + +impl OpIdListRange { + pub(crate) fn new(num: RleRange, actor: RleRange, counter: DeltaRange) -> Self { + Self { + num, + actor, + counter, + } + } + + pub(crate) fn group_range(&self) -> &RleRange { + &self.num + } + + pub(crate) fn actor_range(&self) -> &RleRange { + &self.actor + } + + pub(crate) fn counter_range(&self) -> &DeltaRange { + &self.counter + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> OpIdListIter<'a> { + OpIdListIter { + num: self.num.decoder(data), + actor: self.actor.decoder(data), + counter: self.counter.decoder(data), + } + } + + pub(crate) fn encode(opids: I, out: &mut Vec) -> Self + where + O: convert::OpId, + II: IntoIterator, + IE: Iterator + ExactSizeIterator, + I: Iterator + Clone, + { + let num = RleRange::encode( + opids.clone().map(|os| Some(os.into_iter().len() as u64)), + out, + ); + let actor = RleRange::encode( + opids + .clone() + .flat_map(|os| os.into_iter().map(|o| Some(o.actor() as u64))), + out, + ); + let counter = DeltaRange::encode( + opids.flat_map(|os| os.into_iter().map(|o| Some(o.counter() as i64))), + out, + ); + Self { + num, + actor, + counter, + } + } + + #[allow(dead_code)] + pub(crate) fn splice( + &self, + data: &[u8], + replace: Range, + replace_with: I, + out: &mut Vec, + ) -> Result> + where + R: std::error::Error + Clone, + II: IntoIterator, + IE: Iterator + ExactSizeIterator, + I: Iterator> + Clone, + { + let group_replace = group_replace_range(replace.clone(), self.num.decoder(data)) + .map_err(|e| e.existing())?; + let num = self.num.splice( + data, + replace, + replace_with + .clone() + .map(|elems| elems.map(|elems| Some(elems.into_iter().len() as u64))), + out, + )?; + let actor = self.actor.splice( + data, + group_replace.clone(), + replace_with.clone().flat_map(|elem| match elem { + Err(e) => SplicingIter::Failed(e), + Ok(i) => SplicingIter::Iter(i.into_iter(), |oid: OpId| oid.actor() as u64), + }), + out, + )?; + let counter = self.counter.splice( + data, + group_replace, + replace_with.flat_map(|elem| match elem { + Err(e) => SplicingIter::Failed(e), + Ok(i) => SplicingIter::Iter(i.into_iter(), |oid: OpId| oid.counter() as i64), + }), + out, + )?; + Ok(Self { + num, + actor, + counter, + }) + } +} + +enum SplicingIter { + Failed(E), + Iter(I, F), +} + +impl Iterator for SplicingIter +where + E: std::error::Error + Clone, + I: Iterator, + F: Fn(OpId) -> U, +{ + type Item = Result, E>; + + fn next(&mut self) -> Option { + match self { + Self::Failed(e) => Some(Err(e.clone())), + Self::Iter(i, f) => i.next().map(|oid| Ok(Some(f(oid)))), + } + } +} + +/// Find the replace range for the grouped columns. +fn group_replace_range( + replace: Range, + mut num: RleDecoder<'_, u64>, +) -> Result, SpliceError> { + let mut idx = 0; + let mut grouped_replace_start: usize = 0; + let mut grouped_replace_len: usize = 0; + while idx < replace.start { + if let Some(Some(count)) = num.next().transpose().map_err(SpliceError::ReadExisting)? { + grouped_replace_start += count as usize; + } + idx += 1; + } + for _ in 0..replace.len() { + if let Some(Some(count)) = num.next().transpose().map_err(SpliceError::ReadExisting)? { + grouped_replace_len += count as usize; + } + } + Ok(grouped_replace_start..(grouped_replace_start + grouped_replace_len)) +} + +#[derive(Clone)] +pub(crate) struct OpIdListIter<'a> { + num: RleDecoder<'a, u64>, + actor: RleDecoder<'a, u64>, + counter: DeltaDecoder<'a>, +} + +impl<'a> OpIdListIter<'a> { + fn try_next(&mut self) -> Result>, DecodeColumnError> { + let num = match self + .num + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("num", e))? + { + Some(Some(n)) => n, + Some(None) => return Err(DecodeColumnError::unexpected_null("num")), + None => return Ok(None), + }; + + // We cannot trust `num` because it is provided over the network, + // but in the common case it will be correct and small (so we + // use with_capacity to make sure the vector is precisely the right + // size). + let mut p = Vec::with_capacity(std::cmp::min(num, 100) as usize); + for _ in 0..num { + let actor = self + .actor + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("actor", e))?; + let counter = self + .counter + .next() + .transpose() + .map_err(|e| DecodeColumnError::decode_raw("counter", e))?; + match (actor, counter) { + (Some(Some(a)), Some(Some(ctr))) => match ctr.try_into() { + Ok(ctr) => p.push(OpId::new(ctr, a as usize)), + Err(_e) => { + return Err(DecodeColumnError::invalid_value( + "counter", + "negative value for counter", + )) + } + }, + (Some(None) | None, _) => return Err(DecodeColumnError::unexpected_null("actor")), + (_, Some(None) | None) => { + return Err(DecodeColumnError::unexpected_null("counter")) + } + } + } + Ok(Some(p)) + } +} + +impl<'a> Iterator for OpIdListIter<'a> { + type Item = Result, DecodeColumnError>; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +pub(crate) struct OpIdListEncoder { + num: RleEncoder, + actor: RleEncoder, + counter: DeltaEncoder, +} + +impl OpIdListEncoder { + pub(crate) fn append(&mut self, ids: I) + where + I: Iterator + ExactSizeIterator, + O: convert::OpId, + { + self.num.append_value(ids.len() as u64); + for id in ids { + self.actor.append_value(id.actor() as u64); + self.counter.append_value(id.counter() as i64); + } + } +} + +impl OpIdListEncoder> { + pub(crate) fn new() -> Self { + Self { + num: RleEncoder::from(Vec::new()), + actor: RleEncoder::from(Vec::new()), + counter: DeltaEncoder::from(Vec::new()), + } + } + + pub(crate) fn finish(self, out: &mut Vec) -> OpIdListRange { + let start = out.len(); + let (num, _) = self.num.finish(); + out.extend(num); + let num_end = out.len(); + + let (actor, _) = self.actor.finish(); + out.extend(actor); + let actor_end = out.len(); + + let (counter, _) = self.counter.finish(); + out.extend(counter); + let counter_end = out.len(); + + OpIdListRange { + num: (start..num_end).into(), + actor: (num_end..actor_end).into(), + counter: (actor_end..counter_end).into(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use proptest::collection::vec as propvec; + use proptest::prelude::*; + + use crate::columnar::encoding::properties::{opid, splice_scenario}; + + fn encode(opids: Vec>) -> (OpIdListRange, Vec) { + let mut out = Vec::new(); + let range = OpIdListRange::encode(opids.iter(), &mut out); + (range, out) + } + + fn decode(range: OpIdListRange, buf: &[u8]) -> Vec> { + range.iter(buf).map(|c| c.unwrap()).collect() + } + + proptest! { + #[test] + fn encode_decode_opid_list(opids in propvec(propvec(opid(), 0..100), 0..100)){ + let (range, encoded) = encode(opids.clone()); + let result = decode(range, &encoded); + assert_eq!(opids, result) + } + + #[test] + fn splice_opid_list(scenario in splice_scenario(propvec(opid(), 0..100))) { + let (range, encoded) = encode(scenario.initial_values.clone()); + let mut out = Vec::new(); + let replacements: Vec, Infallible>> = scenario.replacements.iter().cloned().map(Ok).collect(); + let new_range = range.splice( + &encoded, + scenario.replace_range.clone(), + replacements.into_iter(), + &mut out + ).unwrap(); + let result = decode(new_range, &out[..]); + scenario.check(result); + } + } +} diff --git a/rust/automerge/src/columnar/column_range/raw.rs b/rust/automerge/src/columnar/column_range/raw.rs new file mode 100644 index 00000000..3520a89a --- /dev/null +++ b/rust/automerge/src/columnar/column_range/raw.rs @@ -0,0 +1,38 @@ +use std::{borrow::Cow, ops::Range}; + +use crate::columnar::encoding::RawDecoder; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct RawRange(Range); + +impl RawRange { + pub(crate) fn decoder<'a>(&self, data: &'a [u8]) -> RawDecoder<'a> { + RawDecoder::from(Cow::Borrowed(&data[self.0.clone()])) + } + + pub(crate) fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub(crate) fn end(&self) -> usize { + self.0.end + } +} + +impl AsRef> for RawRange { + fn as_ref(&self) -> &Range { + &self.0 + } +} + +impl From> for RawRange { + fn from(r: Range) -> RawRange { + RawRange(r) + } +} + +impl From for Range { + fn from(r: RawRange) -> Range { + r.0 + } +} diff --git a/rust/automerge/src/columnar/column_range/rle.rs b/rust/automerge/src/columnar/column_range/rle.rs new file mode 100644 index 00000000..c500a7f4 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/rle.rs @@ -0,0 +1,216 @@ +use std::{ + borrow::{Borrow, Cow}, + fmt::Debug, + marker::PhantomData, + ops::Range, +}; + +use crate::columnar::{ + encoding::{raw, Decodable, Encodable, RleDecoder, RleEncoder, Sink}, + SpliceError, +}; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct RleRange { + range: Range, + _phantom: PhantomData, +} + +impl RleRange { + pub(crate) fn decoder<'a>(&self, data: &'a [u8]) -> RleDecoder<'a, T> { + RleDecoder::from(Cow::Borrowed(&data[self.range.clone()])) + } + + pub(crate) fn is_empty(&self) -> bool { + self.range.is_empty() + } + + pub(crate) fn start(&self) -> usize { + self.range.start + } + + pub(crate) fn end(&self) -> usize { + self.range.end + } +} + +impl RleRange { + /// The semantics of this are similar to `Vec::splice` + /// + /// # Arguments + /// + /// * `data` - The buffer containing the original rows + /// * `replace` - The range of elements in the original collection to replace + /// * `replace_with` - An iterator to insert in place of the original elements. + /// * `out` - The buffer to encode the resulting collection into + pub(crate) fn splice< + 'a, + I: Iterator, E>>, + TB: Borrow + 'a, + E: std::error::Error, + >( + &self, + data: &[u8], + replace: Range, + mut replace_with: I, + out: &mut Vec, + ) -> Result> { + let start = out.len(); + let mut encoder = self.encoder(out); + let mut decoder = self.decoder(data); + let mut idx = 0; + while idx < replace.start { + match decoder + .next() + .transpose() + .map_err(SpliceError::ReadExisting)? + { + Some(elem) => encoder.append(elem.as_ref()), + None => panic!("out of bounds"), + } + idx += 1; + } + for _ in 0..replace.len() { + decoder.next(); + if let Some(next) = replace_with + .next() + .transpose() + .map_err(SpliceError::ReadReplace)? + { + encoder.append(next.as_ref().map(|n| n.borrow())); + } + } + for next in replace_with { + let next = next.map_err(SpliceError::ReadReplace)?; + encoder.append(next.as_ref().map(|n| n.borrow())); + } + for next in decoder { + let next = next.map_err(SpliceError::ReadExisting)?; + encoder.append(next.as_ref()); + } + let (_, len) = encoder.finish(); + let range = start..(start + len); + Ok(range.into()) + } +} + +impl<'a, T: Encodable + Clone + PartialEq + 'a> RleRange { + pub(crate) fn encoder(&self, output: S) -> RleEncoder { + RleEncoder::from(output) + } + + pub(crate) fn encode, I: Iterator>>( + items: I, + out: &mut Vec, + ) -> Self { + let start = out.len(); + let mut encoder = RleEncoder::new(out); + for item in items { + encoder.append(item); + } + let (_, len) = encoder.finish(); + (start..(start + len)).into() + } +} + +impl AsRef> for RleRange { + fn as_ref(&self) -> &Range { + &self.range + } +} + +impl From> for RleRange { + fn from(r: Range) -> RleRange { + RleRange { + range: r, + _phantom: PhantomData, + } + } +} + +impl From> for Range { + fn from(r: RleRange) -> Range { + r.range + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::columnar::encoding::properties::option_splice_scenario; + use proptest::prelude::*; + use std::{borrow::Cow, convert::Infallible}; + + #[test] + fn rle_int_round_trip() { + let vals = [1, 1, 2, 2, 3, 2, 3, 1, 3]; + let mut buf = Vec::with_capacity(vals.len() * 3); + let mut encoder: RleEncoder<_, u64> = RleEncoder::new(&mut buf); + for val in vals { + encoder.append_value(val) + } + let (_, total_slice_len) = encoder.finish(); + let mut decoder: RleDecoder<'_, u64> = + RleDecoder::from(Cow::Borrowed(&buf[0..total_slice_len])); + let mut result = Vec::new(); + while let Some(Some(val)) = decoder.next().transpose().unwrap() { + result.push(val); + } + assert_eq!(result, vals); + } + + #[test] + fn rle_int_insert() { + let vals = [1, 1, 2, 2, 3, 2, 3, 1, 3]; + let mut buf = Vec::with_capacity(vals.len() * 3); + let mut encoder: RleEncoder<_, u64> = RleEncoder::new(&mut buf); + for val in vals.iter().take(4) { + encoder.append_value(val) + } + encoder.append_value(5); + for val in vals.iter().skip(4) { + encoder.append_value(val); + } + let (_, total_slice_len) = encoder.finish(); + let mut decoder: RleDecoder<'_, u64> = + RleDecoder::from(Cow::Borrowed(&buf[0..total_slice_len])); + let mut result = Vec::new(); + while let Some(Some(val)) = decoder.next().transpose().unwrap() { + result.push(val); + } + let expected = [1, 1, 2, 2, 5, 3, 2, 3, 1, 3]; + assert_eq!(result, expected); + } + + fn encode(vals: &[Option]) -> (RleRange, Vec) { + let mut buf = Vec::with_capacity(vals.len() * 3); + let range = RleRange::::encode(vals.iter().map(|v| v.as_ref()), &mut buf); + (range, buf) + } + + fn decode(range: RleRange, buf: &[u8]) -> Vec> { + range.decoder(buf).collect::, _>>().unwrap() + } + + proptest! { + #[test] + fn splice_ints(scenario in option_splice_scenario(any::>())) { + let (range, buf) = encode(&scenario.initial_values); + let mut out = Vec::new(); + let replacements: Vec, Infallible>> = scenario.replacements.iter().cloned().map(Ok).collect(); + let new_range = range.splice(&buf, scenario.replace_range.clone(), replacements.into_iter(), &mut out).unwrap(); + let result = decode::(new_range, &out); + scenario.check_optional(result) + } + + #[test] + fn splice_strings(scenario in option_splice_scenario(any::>())) { + let (range, buf) = encode(&scenario.initial_values); + let mut out = Vec::new(); + let replacements: Vec, Infallible>> = scenario.replacements.iter().cloned().map(Ok).collect(); + let new_range = range.splice(&buf, scenario.replace_range.clone(), replacements.into_iter(), &mut out).unwrap(); + let result = decode::(new_range, &out); + scenario.check_optional(result) + } + } +} diff --git a/rust/automerge/src/columnar/column_range/value.rs b/rust/automerge/src/columnar/column_range/value.rs new file mode 100644 index 00000000..03a5aa60 --- /dev/null +++ b/rust/automerge/src/columnar/column_range/value.rs @@ -0,0 +1,547 @@ +use std::{borrow::Cow, ops::Range}; + +use crate::{ + columnar::{ + encoding::{ + leb128::{lebsize, ulebsize}, + raw, DecodeColumnError, DecodeError, RawBytes, RawDecoder, RawEncoder, RleDecoder, + RleEncoder, Sink, + }, + SpliceError, + }, + storage::parse::{ + leb128::{leb128_i64, leb128_u64}, + Input, ParseResult, + }, + ScalarValue, +}; + +use super::{RawRange, RleRange}; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ValueRange { + meta: RleRange, + raw: RawRange, +} + +impl ValueRange { + pub(crate) fn new(meta: RleRange, raw: RawRange) -> Self { + Self { meta, raw } + } + + pub(crate) fn range(&self) -> Range { + // This is a hack, instead `raw` should be `Option` + if self.raw.is_empty() { + self.meta.clone().into() + } else { + self.meta.start()..self.raw.end() + } + } + + pub(crate) fn meta_range(&self) -> &RleRange { + &self.meta + } + + pub(crate) fn raw_range(&self) -> &RawRange { + &self.raw + } + + pub(crate) fn encode<'a, 'b, I>(items: I, out: &'b mut Vec) -> Self + where + I: Iterator> + Clone + 'a, + { + Self { + meta: (0..0).into(), + raw: (0..0).into(), + } + .splice(&[], 0..0, items, out) + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> ValueIter<'a> { + ValueIter { + meta: self.meta.decoder(data), + raw: self.raw.decoder(data), + } + } + + pub(crate) fn splice<'b, I>( + &self, + data: &[u8], + replace: Range, + replace_with: I, + out: &mut Vec, + ) -> Self + where + I: Iterator> + Clone, + { + // SAFETY: try_splice fails if either the iterator of replacements fails, or the iterator + // of existing elements fails. But the replacement iterator is infallible and there + // are no existing elements + self.try_splice::<_, ()>(data, replace, replace_with.map(Ok), out) + .unwrap() + } + + pub(crate) fn try_splice<'b, I, E>( + &self, + data: &[u8], + replace: Range, + mut replace_with: I, + out: &mut Vec, + ) -> Result> + where + I: Iterator, E>> + Clone, + { + // Our semantics here are similar to those of Vec::splice. We can describe this + // imperatively like this: + // + // * First copy everything up to the start of `replace` into the output + // * For every index in `replace` skip that index from ourselves and if `replace_with` + // returns `Some` then copy that value to the output + // * Once we have iterated past `replace.end` we continue to call `replace_with` until it + // returns None, copying the results to the output + // * Finally we copy the remainder of our data into the output + // + // However, things are complicated by the fact that our data is stored in two columns. This + // means that we do this in two passes. First we execute the above logic for the metadata + // column. Then we do it all over again for the value column. + + // First pass - metadata + // + // Copy the metadata decoder so we can iterate over it again when we read the values in the + // second pass + let start = out.len(); + let mut meta_copy = self.meta.decoder(data); + let mut meta_out = RleEncoder::<_, u64>::from(&mut *out); + let mut idx = 0; + // Copy everything up to replace.start to the output + while idx < replace.start { + let val = meta_copy + .next() + .transpose() + .map_err(SpliceError::ReadExisting)? + .unwrap_or(None); + meta_out.append(val.as_ref()); + idx += 1; + } + // Now step through replace, skipping our data and inserting the replacement data (if there + // is any) + let mut meta_replace_with = replace_with.clone(); + for _ in 0..replace.len() { + meta_copy.next(); + if let Some(val) = meta_replace_with.next() { + let val = val.map_err(SpliceError::ReadReplace)?; + // Note that we are just constructing metadata values here. + let meta_val = &u64::from(ValueMeta::from(val.as_ref())); + meta_out.append(Some(meta_val)); + } + idx += 1; + } + // Copy any remaining input from the replacments to the output + for val in meta_replace_with { + let val = val.map_err(SpliceError::ReadReplace)?; + let meta_val = &u64::from(ValueMeta::from(val.as_ref())); + meta_out.append(Some(meta_val)); + idx += 1; + } + // Now copy any remaining data we have to the output + while !meta_copy.done() { + let val = meta_copy + .next() + .transpose() + .map_err(SpliceError::ReadExisting)? + .unwrap_or(None); + meta_out.append(val.as_ref()); + } + let (_, meta_len) = meta_out.finish(); + let meta_range = start..(start + meta_len); + + // Second pass, copying the values. For this pass we iterate over ourselves. + // + // + let mut value_range_len = 0; + let mut raw_encoder = RawEncoder::from(out); + let mut iter = self.iter(data); + idx = 0; + // Copy everything up to replace.start to the output + while idx < replace.start { + let val = iter.next().unwrap().unwrap_or(ScalarValue::Null); + value_range_len += encode_val(&mut raw_encoder, &val); + idx += 1; + } + + // Now step through replace, skipping our data and inserting the replacement data (if there + // is any) + for _ in 0..replace.len() { + iter.next(); + if let Some(val) = replace_with.next() { + let val = val.map_err(SpliceError::ReadReplace)?; + value_range_len += encode_val(&mut raw_encoder, val.as_ref()); + } + idx += 1; + } + // Copy any remaining input from the replacments to the output + for val in replace_with { + let val = val.map_err(SpliceError::ReadReplace)?; + value_range_len += encode_val(&mut raw_encoder, val.as_ref()); + idx += 1; + } + // Now copy any remaining data we have to the output + while !iter.done() { + let val = iter.next().unwrap().unwrap_or(ScalarValue::Null); + value_range_len += encode_val(&mut raw_encoder, &val); + } + + let value_range = meta_range.end..(meta_range.end + value_range_len); + + Ok(Self { + meta: meta_range.into(), + raw: value_range.into(), + }) + } +} + +#[derive(Debug, Clone)] +pub(crate) struct ValueIter<'a> { + meta: RleDecoder<'a, u64>, + raw: RawDecoder<'a>, +} + +impl<'a> Iterator for ValueIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + let next = match self.meta.next().transpose() { + Ok(n) => n, + Err(e) => return Some(Err(DecodeColumnError::decode_raw("meta", e))), + }; + match next { + Some(Some(next)) => { + let val_meta = ValueMeta::from(next); + #[allow(clippy::redundant_slicing)] + match val_meta.type_code() { + ValueType::Null => Some(Ok(ScalarValue::Null)), + ValueType::True => Some(Ok(ScalarValue::Boolean(true))), + ValueType::False => Some(Ok(ScalarValue::Boolean(false))), + ValueType::Uleb => self.parse_input(val_meta, leb128_u64), + ValueType::Leb => self.parse_input(val_meta, leb128_i64), + ValueType::String => self.parse_raw(val_meta, |bytes| { + let val = std::str::from_utf8(bytes) + .map_err(|e| DecodeColumnError::invalid_value("value", e.to_string()))? + .into(); + Ok(ScalarValue::Str(val)) + }), + ValueType::Float => self.parse_raw(val_meta, |bytes| { + if val_meta.length() != 8 { + return Err(DecodeColumnError::invalid_value( + "value", + format!("float should have length 8, had {0}", val_meta.length()), + )); + } + let raw: [u8; 8] = bytes + .try_into() + // SAFETY: parse_raw() calls read_bytes(val_meta.length()) and we have + // checked that val_meta.length() == 8 + .unwrap(); + let val = f64::from_le_bytes(raw); + Ok(ScalarValue::F64(val)) + }), + ValueType::Counter => self.parse_input(val_meta, |input| { + leb128_i64(input).map(|(i, n)| (i, ScalarValue::Counter(n.into()))) + }), + ValueType::Timestamp => self.parse_input(val_meta, |input| { + leb128_i64(input).map(|(i, n)| (i, ScalarValue::Timestamp(n))) + }), + ValueType::Unknown(code) => self.parse_raw(val_meta, |bytes| { + Ok(ScalarValue::Unknown { + type_code: code, + bytes: bytes.to_vec(), + }) + }), + ValueType::Bytes => match self.raw.read_bytes(val_meta.length()) { + Err(e) => Some(Err(DecodeColumnError::invalid_value( + "value", + e.to_string(), + ))), + Ok(bytes) => Some(Ok(ScalarValue::Bytes(bytes.to_vec()))), + }, + } + } + Some(None) => Some(Err(DecodeColumnError::unexpected_null("meta"))), + None => None, + } + } +} + +impl<'a> ValueIter<'a> { + fn parse_raw<'b, R, F: Fn(&'b [u8]) -> Result>( + &'b mut self, + meta: ValueMeta, + f: F, + ) -> Option> { + let raw = match self.raw.read_bytes(meta.length()) { + Err(e) => { + return Some(Err(DecodeColumnError::invalid_value( + "value", + e.to_string(), + ))) + } + Ok(bytes) => bytes, + }; + Some(f(raw)) + } + + fn parse_input<'b, R, F: Fn(Input<'b>) -> ParseResult<'b, R, DecodeError>>( + &'b mut self, + meta: ValueMeta, + f: F, + ) -> Option> + where + R: Into, + { + self.parse_raw(meta, |raw| match f(Input::new(raw)) { + Err(e) => Err(DecodeColumnError::invalid_value("value", e.to_string())), + Ok((i, _)) if !i.is_empty() => { + Err(DecodeColumnError::invalid_value("value", "extra bytes")) + } + Ok((_, v)) => Ok(v.into()), + }) + } + + pub(crate) fn done(&self) -> bool { + self.meta.done() + } +} + +/// Appends values row-wise. That is to say, this struct manages two separate chunks of memory, one +/// for the value metadata and one for the raw values. To use it, create a new encoder using +/// `ValueEncoder::new`, sequentially append values using `ValueEncoder::append`, and finallly +/// concatenate the two columns and append them to a buffer returning the range within the output +/// buffer which contains the concatenated columns using `ValueEncoder::finish`. +pub(crate) struct ValueEncoder { + meta: RleEncoder, + raw: RawEncoder, +} + +impl ValueEncoder { + pub(crate) fn append(&mut self, value: &ScalarValue) { + let meta_val = &u64::from(ValueMeta::from(value)); + self.meta.append_value(meta_val); + encode_val(&mut self.raw, value); + } +} + +impl ValueEncoder> { + pub(crate) fn new() -> Self { + Self { + meta: RleEncoder::new(Vec::new()), + raw: RawEncoder::from(Vec::new()), + } + } + pub(crate) fn finish(self, out: &mut Vec) -> ValueRange { + let meta_start = out.len(); + let (meta, _) = self.meta.finish(); + out.extend(meta); + let meta_end = out.len(); + + let (val, _) = self.raw.finish(); + out.extend(val); + let val_end = out.len(); + ValueRange { + meta: (meta_start..meta_end).into(), + raw: (meta_end..val_end).into(), + } + } +} + +fn encode_val(out: &mut RawEncoder, val: &ScalarValue) -> usize { + match val { + ScalarValue::Uint(i) => out.append(*i), + ScalarValue::Int(i) => out.append(*i), + ScalarValue::Null => 0, + ScalarValue::Boolean(_) => 0, + ScalarValue::Timestamp(i) => out.append(*i), + ScalarValue::F64(f) => out.append(*f), + ScalarValue::Counter(i) => out.append(i.start), + ScalarValue::Str(s) => out.append(RawBytes::from(s.as_bytes())), + ScalarValue::Bytes(b) => out.append(RawBytes::from(&b[..])), + ScalarValue::Unknown { bytes, .. } => out.append(RawBytes::from(&bytes[..])), + } +} + +#[derive(Debug)] +enum ValueType { + Null, + False, + True, + Uleb, + Leb, + Float, + String, + Bytes, + Counter, + Timestamp, + Unknown(u8), +} + +#[derive(Copy, Clone)] +struct ValueMeta(u64); + +impl ValueMeta { + fn type_code(&self) -> ValueType { + let low_byte = (self.0 as u8) & 0b00001111; + match low_byte { + 0 => ValueType::Null, + 1 => ValueType::False, + 2 => ValueType::True, + 3 => ValueType::Uleb, + 4 => ValueType::Leb, + 5 => ValueType::Float, + 6 => ValueType::String, + 7 => ValueType::Bytes, + 8 => ValueType::Counter, + 9 => ValueType::Timestamp, + other => ValueType::Unknown(other), + } + } + + fn length(&self) -> usize { + (self.0 >> 4) as usize + } +} + +impl From<&ScalarValue> for ValueMeta { + fn from(p: &ScalarValue) -> Self { + match p { + ScalarValue::Uint(i) => Self((ulebsize(*i) << 4) | 3), + ScalarValue::Int(i) => Self((lebsize(*i) << 4) | 4), + ScalarValue::Null => Self(0), + ScalarValue::Boolean(b) => Self(match b { + false => 1, + true => 2, + }), + ScalarValue::Timestamp(i) => Self((lebsize(*i) << 4) | 9), + ScalarValue::F64(_) => Self((8 << 4) | 5), + ScalarValue::Counter(i) => Self((lebsize(i.start) << 4) | 8), + ScalarValue::Str(s) => Self(((s.as_bytes().len() as u64) << 4) | 6), + ScalarValue::Bytes(b) => Self(((b.len() as u64) << 4) | 7), + ScalarValue::Unknown { type_code, bytes } => { + Self(((bytes.len() as u64) << 4) | (*type_code as u64)) + } + } + } +} + +impl From for ValueMeta { + fn from(raw: u64) -> Self { + ValueMeta(raw) + } +} + +impl From for u64 { + fn from(v: ValueMeta) -> Self { + v.0 + } +} + +impl From<&ScalarValue> for ValueType { + fn from(p: &ScalarValue) -> Self { + match p { + ScalarValue::Uint(_) => ValueType::Uleb, + ScalarValue::Int(_) => ValueType::Leb, + ScalarValue::Null => ValueType::Null, + ScalarValue::Boolean(b) => match b { + true => ValueType::True, + false => ValueType::False, + }, + ScalarValue::Timestamp(_) => ValueType::Timestamp, + ScalarValue::F64(_) => ValueType::Float, + ScalarValue::Counter(_) => ValueType::Counter, + ScalarValue::Str(_) => ValueType::String, + ScalarValue::Bytes(_) => ValueType::Bytes, + ScalarValue::Unknown { type_code, .. } => ValueType::Unknown(*type_code), + } + } +} + +impl From for u64 { + fn from(v: ValueType) -> Self { + match v { + ValueType::Null => 0, + ValueType::False => 1, + ValueType::True => 2, + ValueType::Uleb => 3, + ValueType::Leb => 4, + ValueType::Float => 5, + ValueType::String => 6, + ValueType::Bytes => 7, + ValueType::Counter => 8, + ValueType::Timestamp => 9, + ValueType::Unknown(other) => other as u64, + } + } +} +#[cfg(test)] +mod tests { + use super::*; + use crate::columnar::encoding::properties::{scalar_value, splice_scenario}; + use proptest::prelude::*; + use std::borrow::Cow; + + fn encode_values(vals: &[ScalarValue]) -> (Vec, ValueRange) { + let mut out = Vec::new(); + let range = ValueRange::encode(vals.iter().cloned().map(Cow::Owned), &mut out); + (out, range) + } + + fn encode_rowwise(vals: &[ScalarValue]) -> (Vec, ValueRange) { + let mut out = Vec::new(); + let mut encoder = ValueEncoder::new(); + for val in vals { + encoder.append(val); + } + let range = encoder.finish(&mut out); + (out, range) + } + + proptest! { + #[test] + fn test_initialize_splice(values in proptest::collection::vec(scalar_value(), 0..100)) { + let (out, range) = encode_values(&values[..]); + let testvals = range.iter(&out).collect::, _>>().unwrap(); + assert_eq!(values, testvals); + } + + #[test] + fn test_splice_values(scenario in splice_scenario(scalar_value())){ + let (out, range) = encode_values(&scenario.initial_values); + let mut spliced = Vec::new(); + let new_range = range + .splice( + &out, + scenario.replace_range.clone(), + scenario.replacements.clone().into_iter().map(Cow::Owned), + &mut spliced, + ); + let result_values = new_range.iter(&spliced).collect::, _>>().unwrap(); + let mut expected: Vec<_> = scenario.initial_values.clone(); + expected.splice(scenario.replace_range, scenario.replacements); + assert_eq!(result_values, expected); + } + + #[test] + fn encode_row_wise_and_columnwise_equal(values in proptest::collection::vec(scalar_value(), 0..50)) { + let (colwise, col_range) = encode_values(&values[..]); + let (rowwise, row_range) = encode_rowwise(&values[..]); + assert_eq!(colwise, rowwise); + assert_eq!(col_range, row_range); + } + } + + #[test] + fn test_value_uleb() { + let vals = [ScalarValue::Uint(127), ScalarValue::Uint(183)]; + let (out, range) = encode_values(&vals); + let result = range.iter(&out).collect::, _>>().unwrap(); + assert_eq!(result, vals); + } +} diff --git a/rust/automerge/src/columnar/encoding.rs b/rust/automerge/src/columnar/encoding.rs new file mode 100644 index 00000000..c9435448 --- /dev/null +++ b/rust/automerge/src/columnar/encoding.rs @@ -0,0 +1,65 @@ +pub(crate) mod raw; + +pub(crate) use raw::{RawDecoder, RawEncoder}; +mod rle; +pub(crate) use rle::{RleDecoder, RleEncoder}; +mod boolean; +pub(crate) use boolean::{BooleanDecoder, BooleanEncoder}; +mod delta; +pub(crate) use delta::{DeltaDecoder, DeltaEncoder}; +pub(crate) mod leb128; + +pub(crate) mod column_decoder; +pub(crate) use column_decoder::ColumnDecoder; + +#[cfg(test)] +pub(crate) mod properties; + +pub(crate) trait Sink { + fn append(&mut self, bytes: &[u8]); +} + +impl<'a> Sink for &'a mut Vec { + fn append(&mut self, bytes: &[u8]) { + self.extend(bytes) + } +} + +impl Sink for Vec { + fn append(&mut self, bytes: &[u8]) { + self.extend(bytes) + } +} + +pub(crate) trait Encodable { + fn encode(&self, out: &mut S) -> usize; +} + +mod encodable_impls; +pub(crate) use encodable_impls::RawBytes; + +#[derive(thiserror::Error, Debug)] +pub(crate) enum DecodeError { + #[error(transparent)] + Io(#[from] std::io::Error), + #[error("invalid integer")] + FromInt(#[from] std::num::TryFromIntError), + #[error("bad leb128")] + BadLeb(#[from] ::leb128::read::Error), + #[error(transparent)] + BadLeb128(#[from] crate::storage::parse::leb128::Error), + #[error("attempted to allocate {attempted} which is larger than the maximum of {maximum}")] + OverlargeAllocation { attempted: usize, maximum: usize }, + #[error("invalid string encoding")] + BadString, +} + +pub(crate) trait Decodable: Sized { + fn decode(bytes: &mut R) -> Result + where + R: std::io::Read; +} +mod decodable_impls; + +pub(crate) mod col_error; +pub(crate) use col_error::DecodeColumnError; diff --git a/rust/automerge/src/columnar/encoding/boolean.rs b/rust/automerge/src/columnar/encoding/boolean.rs new file mode 100644 index 00000000..26cb1838 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/boolean.rs @@ -0,0 +1,131 @@ +use std::borrow::Cow; + +use super::{raw, Encodable, RawDecoder, Sink}; + +/// Encodes booleans by storing the count of the same value. +/// +/// The sequence of numbers describes the count of false values on even indices (0-indexed) and the +/// count of true values on odd indices (0-indexed). +/// +/// Counts are encoded as usize. +pub(crate) struct BooleanEncoder { + written: usize, + //buf: &'a mut Vec, + buf: S, + last: bool, + count: usize, +} + +impl BooleanEncoder> { + pub(crate) fn new() -> BooleanEncoder> { + BooleanEncoder::from_sink(Vec::new()) + } +} + +impl BooleanEncoder { + pub(crate) fn from_sink(sink: S) -> Self { + BooleanEncoder { + written: 0, + buf: sink, + last: false, + count: 0, + } + } + + pub(crate) fn append(&mut self, value: bool) { + if value == self.last { + self.count += 1; + } else { + self.written += self.count.encode(&mut self.buf); + self.last = value; + self.count = 1; + } + } + + pub(crate) fn finish(mut self) -> (S, usize) { + if self.count > 0 { + self.written += self.count.encode(&mut self.buf); + } + (self.buf, self.written) + } +} + +impl From for BooleanEncoder { + fn from(output: S) -> Self { + BooleanEncoder::from_sink(output) + } +} + +/// See the discussion of [`BooleanEncoder`] for details on this encoding +#[derive(Clone, Debug)] +pub(crate) struct BooleanDecoder<'a> { + decoder: RawDecoder<'a>, + last_value: bool, + count: usize, +} + +impl<'a> From> for BooleanDecoder<'a> { + fn from(bytes: Cow<'a, [u8]>) -> Self { + BooleanDecoder { + decoder: RawDecoder::from(bytes), + last_value: true, + count: 0, + } + } +} + +impl<'a> From<&'a [u8]> for BooleanDecoder<'a> { + fn from(d: &'a [u8]) -> Self { + Cow::Borrowed(d).into() + } +} + +// this is an endless iterator that returns false after input is exhausted +impl<'a> Iterator for BooleanDecoder<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + while self.count == 0 { + if self.decoder.done() && self.count == 0 { + return None; + } + self.count = match self.decoder.read() { + Ok(c) => c, + Err(e) => return Some(Err(e)), + }; + self.last_value = !self.last_value; + } + self.count -= 1; + Some(Ok(self.last_value)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use proptest::prelude::*; + + fn encode(vals: &[bool]) -> Vec { + let mut buf = Vec::new(); + let mut encoder = BooleanEncoder::from_sink(&mut buf); + for val in vals { + encoder.append(*val); + } + encoder.finish(); + buf + } + + fn decode(buf: &[u8]) -> Vec { + BooleanDecoder::from(buf) + .collect::, _>>() + .unwrap() + } + + proptest! { + #[test] + fn encode_decode_bools(vals in proptest::collection::vec(any::(), 0..100)) { + assert_eq!(vals, decode(&encode(&vals))) + } + } +} diff --git a/rust/automerge/src/columnar/encoding/col_error.rs b/rust/automerge/src/columnar/encoding/col_error.rs new file mode 100644 index 00000000..089556b6 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/col_error.rs @@ -0,0 +1,88 @@ +#[derive(Clone, Debug)] +pub struct DecodeColumnError { + path: Path, + error: DecodeColErrorKind, +} + +impl std::error::Error for DecodeColumnError {} + +impl std::fmt::Display for DecodeColumnError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match &self.error { + DecodeColErrorKind::UnexpectedNull => { + write!(f, "unexpected null in column {}", self.path) + } + DecodeColErrorKind::InvalidValue { reason } => { + write!(f, "invalid value in column {}: {}", self.path, reason) + } + } + } +} + +#[derive(Clone, Debug)] +struct Path(Vec); + +impl std::fmt::Display for Path { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (index, elem) in self.0.iter().rev().enumerate() { + if index != 0 { + write!(f, ":")?; + } + write!(f, "{}", elem)?; + } + Ok(()) + } +} + +impl Path { + fn push>(&mut self, col: S) { + self.0.push(col.as_ref().to_string()) + } +} + +impl> From for Path { + fn from(p: S) -> Self { + Self(vec![p.as_ref().to_string()]) + } +} + +#[derive(Clone, Debug)] +enum DecodeColErrorKind { + UnexpectedNull, + InvalidValue { reason: String }, +} + +impl DecodeColumnError { + pub(crate) fn decode_raw>(col: S, raw_err: super::raw::Error) -> Self { + Self { + path: col.into(), + error: DecodeColErrorKind::InvalidValue { + reason: raw_err.to_string(), + }, + } + } + + pub(crate) fn unexpected_null>(col: S) -> DecodeColumnError { + Self { + path: col.into(), + error: DecodeColErrorKind::UnexpectedNull, + } + } + + pub(crate) fn invalid_value, R: AsRef>( + col: S, + reason: R, + ) -> DecodeColumnError { + Self { + path: col.into(), + error: DecodeColErrorKind::InvalidValue { + reason: reason.as_ref().to_string(), + }, + } + } + + pub(crate) fn in_column>(mut self, col: S) -> DecodeColumnError { + self.path.push(col.as_ref()); + self + } +} diff --git a/rust/automerge/src/columnar/encoding/column_decoder.rs b/rust/automerge/src/columnar/encoding/column_decoder.rs new file mode 100644 index 00000000..8e3237fb --- /dev/null +++ b/rust/automerge/src/columnar/encoding/column_decoder.rs @@ -0,0 +1,157 @@ +use crate::{ + columnar::{ + column_range::{DepsIter, KeyIter, ObjIdIter, OpIdIter, OpIdListIter, ValueIter}, + encoding, Key, + }, + types::{ObjId, OpId}, + ScalarValue, +}; + +pub(crate) trait IntoColError: std::error::Error { + fn into_col_error>(self, col_name: S) -> encoding::DecodeColumnError; +} + +impl IntoColError for encoding::raw::Error { + fn into_col_error>(self, col_name: S) -> encoding::DecodeColumnError { + encoding::DecodeColumnError::decode_raw(col_name, self) + } +} + +impl IntoColError for encoding::DecodeColumnError { + fn into_col_error>(self, col_name: S) -> encoding::DecodeColumnError { + self.in_column(col_name) + } +} + +/// A helper trait which allows users to annotate decoders with errors containing a column name +/// +/// Frequently we have an iterator which decodes values from some underlying column storage, e.g. +/// we might have a `BooleanDecoder` which decodes items from an `insert` column. In the context +/// where we are reading from this column we would like to produce errors which describe which +/// column the error occurred in - to this end we require that the error produced by the underlying +/// decoder implement `IntoColError` and we provide the `next_in_col` method to call +/// `into_col_error` on any errors produced by the decoder. +pub(crate) trait ColumnDecoder: Iterator> { + type Error: IntoColError; + type Value; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError>; + + /// Decode the next value from this decoder, annotating any error with the `col_name` + fn next_in_col>( + &mut self, + col_name: S, + ) -> Result { + self.maybe_next_in_col(&col_name)? + .ok_or_else(|| encoding::DecodeColumnError::unexpected_null(col_name)) + } +} + +impl<'a> ColumnDecoder for encoding::BooleanDecoder<'a> { + type Error = encoding::raw::Error; + type Value = bool; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next() + .transpose() + .map_err(|e| e.into_col_error(col_name)) + } +} + +impl ColumnDecoder> for I +where + I: Iterator, E>>, + E: IntoColError, +{ + type Error = E; + type Value = T; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + Ok(self + .next() + .transpose() + .map_err(|e| e.into_col_error(col_name))? + .flatten()) + } +} + +impl<'a> ColumnDecoder> for OpIdListIter<'a> { + type Error = encoding::DecodeColumnError; + type Value = Vec; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result>, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} + +impl<'a> ColumnDecoder for ValueIter<'a> { + type Error = encoding::DecodeColumnError; + type Value = ScalarValue; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} + +impl<'a> ColumnDecoder for KeyIter<'a> { + type Error = encoding::DecodeColumnError; + type Value = Key; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} + +impl<'a> ColumnDecoder for ObjIdIter<'a> { + type Value = ObjId; + type Error = encoding::DecodeColumnError; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} + +impl<'a> ColumnDecoder for OpIdIter<'a> { + type Value = OpId; + type Error = encoding::DecodeColumnError; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} + +impl<'a> ColumnDecoder> for DepsIter<'a> { + type Value = Vec; + type Error = encoding::DecodeColumnError; + + fn maybe_next_in_col>( + &mut self, + col_name: S, + ) -> Result, encoding::DecodeColumnError> { + self.next().transpose().map_err(|e| e.in_column(col_name)) + } +} diff --git a/rust/automerge/src/columnar/encoding/decodable_impls.rs b/rust/automerge/src/columnar/encoding/decodable_impls.rs new file mode 100644 index 00000000..26425f15 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/decodable_impls.rs @@ -0,0 +1,175 @@ +use smol_str::SmolStr; +use std::{borrow::Cow, convert::TryFrom, io::Read, str}; + +use super::{Decodable, DecodeError}; +use crate::ActorId; + +// We don't allow decoding items which are larger than this. Almost nothing should be this large +// so this is really guarding against bad encodings which accidentally grab loads of memory +const MAX_ALLOCATION: usize = 1000000000; + +impl Decodable for u8 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let mut buffer = [0; 1]; + bytes.read_exact(&mut buffer)?; + Ok(buffer[0]) + } +} + +impl Decodable for u32 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + u64::decode::(bytes).and_then(|val| Self::try_from(val).map_err(DecodeError::from)) + } +} + +impl Decodable for usize { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + u64::decode::(bytes).and_then(|val| Self::try_from(val).map_err(DecodeError::from)) + } +} + +impl Decodable for isize { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + i64::decode::(bytes).and_then(|val| Self::try_from(val).map_err(DecodeError::from)) + } +} + +impl Decodable for i32 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + i64::decode::(bytes).and_then(|val| Self::try_from(val).map_err(DecodeError::from)) + } +} + +impl Decodable for i64 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + leb128::read::signed(bytes).map_err(DecodeError::from) + } +} + +impl Decodable for f64 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let mut buffer = [0; 8]; + bytes.read_exact(&mut buffer)?; + Ok(Self::from_le_bytes(buffer)) + } +} + +impl Decodable for f32 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let mut buffer = [0; 4]; + bytes.read_exact(&mut buffer)?; + Ok(Self::from_le_bytes(buffer)) + } +} + +impl Decodable for u64 { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + leb128::read::unsigned(bytes).map_err(DecodeError::from) + } +} + +impl Decodable for Vec { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let len = usize::decode::(bytes)?; + if len == 0 { + return Ok(vec![]); + } + if len > MAX_ALLOCATION { + return Err(DecodeError::OverlargeAllocation { + attempted: len, + maximum: MAX_ALLOCATION, + }); + } + let mut buffer = vec![0; len]; + bytes.read_exact(buffer.as_mut_slice())?; + Ok(buffer) + } +} + +impl Decodable for SmolStr { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let buffer = Vec::decode(bytes)?; + str::from_utf8(&buffer) + .map(|t| t.into()) + .map_err(|_| DecodeError::BadString) + } +} + +impl Decodable for Cow<'static, SmolStr> { + fn decode(bytes: &mut R) -> Result + where + R: std::io::Read, + { + SmolStr::decode(bytes).map(Cow::Owned) + } +} + +impl Decodable for String { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let buffer = Vec::decode(bytes)?; + str::from_utf8(&buffer) + .map(|t| t.into()) + .map_err(|_| DecodeError::BadString) + } +} + +impl Decodable for Option { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let buffer = Vec::decode(bytes)?; + if buffer.is_empty() { + return Ok(None); + } + str::from_utf8(&buffer) + .map(|t| Some(t.into())) + .map_err(|_| DecodeError::BadString) + } +} + +impl Decodable for ActorId { + fn decode(bytes: &mut R) -> Result + where + R: Read, + { + let buffer = Vec::decode(bytes)?; + Ok(buffer.into()) + } +} diff --git a/rust/automerge/src/columnar/encoding/delta.rs b/rust/automerge/src/columnar/encoding/delta.rs new file mode 100644 index 00000000..6234875b --- /dev/null +++ b/rust/automerge/src/columnar/encoding/delta.rs @@ -0,0 +1,95 @@ +use std::borrow::Cow; + +use super::{raw, RleDecoder, RleEncoder, Sink}; + +/// Encodes integers as the change since the previous value. +/// +/// The initial value is 0 encoded as u64. Deltas are encoded as i64. +/// +/// Run length encoding is then applied to the resulting sequence. +pub(crate) struct DeltaEncoder { + rle: RleEncoder, + absolute_value: i64, +} + +impl DeltaEncoder { + pub(crate) fn new(output: S) -> DeltaEncoder { + DeltaEncoder { + rle: RleEncoder::new(output), + absolute_value: 0, + } + } + + pub(crate) fn append_value(&mut self, value: i64) { + self.rle + .append_value(value.saturating_sub(self.absolute_value)); + self.absolute_value = value; + } + + pub(crate) fn append_null(&mut self) { + self.rle.append_null(); + } + + pub(crate) fn append(&mut self, val: Option) { + match val { + Some(v) => self.append_value(v), + None => self.append_null(), + } + } + + pub(crate) fn finish(self) -> (S, usize) { + self.rle.finish() + } +} + +impl From for DeltaEncoder { + fn from(output: S) -> Self { + DeltaEncoder::new(output) + } +} + +/// See discussion on [`DeltaEncoder`] for the format data is stored in. +#[derive(Debug, Clone)] +pub(crate) struct DeltaDecoder<'a> { + rle: RleDecoder<'a, i64>, + absolute_val: i64, +} + +impl<'a> DeltaDecoder<'a> { + pub(crate) fn done(&self) -> bool { + self.rle.done() + } +} + +impl<'a> From> for DeltaDecoder<'a> { + fn from(bytes: Cow<'a, [u8]>) -> Self { + DeltaDecoder { + rle: RleDecoder::from(bytes), + absolute_val: 0, + } + } +} + +impl<'a> From<&'a [u8]> for DeltaDecoder<'a> { + fn from(d: &'a [u8]) -> Self { + Cow::Borrowed(d).into() + } +} + +impl<'a> Iterator for DeltaDecoder<'a> { + type Item = Result, raw::Error>; + + fn next(&mut self) -> Option { + match self.rle.next() { + Some(Ok(next)) => match next { + Some(delta) => { + self.absolute_val = self.absolute_val.saturating_add(delta); + Some(Ok(Some(self.absolute_val))) + } + None => Some(Ok(None)), + }, + Some(Err(e)) => Some(Err(e)), + None => None, + } + } +} diff --git a/rust/automerge/src/columnar/encoding/encodable_impls.rs b/rust/automerge/src/columnar/encoding/encodable_impls.rs new file mode 100644 index 00000000..a1b5d8ce --- /dev/null +++ b/rust/automerge/src/columnar/encoding/encodable_impls.rs @@ -0,0 +1,200 @@ +use super::{Encodable, Sink}; + +use std::borrow::Cow; + +use smol_str::SmolStr; + +/// Encodes bytes without a length prefix +pub(crate) struct RawBytes<'a>(Cow<'a, [u8]>); + +impl<'a> From<&'a [u8]> for RawBytes<'a> { + fn from(r: &'a [u8]) -> Self { + RawBytes(r.into()) + } +} + +impl<'a> From> for RawBytes<'a> { + fn from(c: Cow<'a, [u8]>) -> Self { + RawBytes(c) + } +} + +impl<'a> Encodable for RawBytes<'a> { + fn encode(&self, out: &mut S) -> usize { + out.append(&self.0); + self.0.len() + } +} + +impl Encodable for SmolStr { + fn encode(&self, buf: &mut S) -> usize { + let bytes = self.as_bytes(); + let len_encoded = bytes.len().encode(buf); + let data_len = bytes.encode(buf); + len_encoded + data_len + } +} + +impl<'a> Encodable for Cow<'a, SmolStr> { + fn encode(&self, buf: &mut S) -> usize { + self.as_ref().encode(buf) + } +} + +impl Encodable for String { + fn encode(&self, buf: &mut S) -> usize { + let bytes = self.as_bytes(); + let len_encoded = bytes.len().encode(buf); + let data_len = bytes.encode(buf); + len_encoded + data_len + } +} + +impl Encodable for Option { + fn encode(&self, buf: &mut S) -> usize { + if let Some(s) = self { + s.encode(buf) + } else { + 0.encode(buf) + } + } +} + +impl<'a> Encodable for Option> { + fn encode(&self, out: &mut S) -> usize { + if let Some(s) = self { + SmolStr::encode(s, out) + } else { + 0.encode(out) + } + } +} + +impl Encodable for f64 { + fn encode(&self, buf: &mut S) -> usize { + let bytes = self.to_le_bytes(); + buf.append(&bytes); + bytes.len() + } +} + +impl Encodable for f32 { + fn encode(&self, buf: &mut S) -> usize { + let bytes = self.to_le_bytes(); + buf.append(&bytes); + bytes.len() + } +} + +impl Encodable for usize { + fn encode(&self, buf: &mut S) -> usize { + (*self as u64).encode(buf) + } +} + +impl Encodable for u32 { + fn encode(&self, buf: &mut S) -> usize { + u64::from(*self).encode(buf) + } +} + +impl Encodable for i32 { + fn encode(&self, buf: &mut S) -> usize { + i64::from(*self).encode(buf) + } +} + +impl Encodable for [u8] { + fn encode(&self, out: &mut S) -> usize { + out.append(self); + self.len() + } +} + +impl Encodable for &[u8] { + fn encode(&self, out: &mut S) -> usize { + out.append(self); + self.len() + } +} + +impl<'a> Encodable for Cow<'a, [u8]> { + fn encode(&self, out: &mut S) -> usize { + out.append(self); + self.len() + } +} + +impl Encodable for Vec { + fn encode(&self, out: &mut S) -> usize { + Encodable::encode(&self[..], out) + } +} + +mod leb128_things { + use super::{Encodable, Sink}; + + impl Encodable for u64 { + fn encode(&self, buf: &mut S) -> usize { + let mut val = *self; + let mut bytes_written = 0; + loop { + let mut byte = low_bits_of_u64(val); + val >>= 7; + if val != 0 { + // More bytes to come, so set the continuation bit. + byte |= CONTINUATION_BIT; + } + + buf.append(&[byte]); + bytes_written += 1; + + if val == 0 { + return bytes_written; + } + } + } + } + + impl Encodable for i64 { + fn encode(&self, buf: &mut S) -> usize { + let mut val = *self; + let mut bytes_written = 0; + loop { + let mut byte = val as u8; + // Keep the sign bit for testing + val >>= 6; + let done = val == 0 || val == -1; + if done { + byte &= !CONTINUATION_BIT; + } else { + // Remove the sign bit + val >>= 1; + // More bytes to come, so set the continuation bit. + byte |= CONTINUATION_BIT; + } + + buf.append(&[byte]); + bytes_written += 1; + + if done { + return bytes_written; + } + } + } + } + + #[doc(hidden)] + const CONTINUATION_BIT: u8 = 1 << 7; + + #[inline] + fn low_bits_of_byte(byte: u8) -> u8 { + byte & !CONTINUATION_BIT + } + + #[inline] + fn low_bits_of_u64(val: u64) -> u8 { + let byte = val & (std::u8::MAX as u64); + low_bits_of_byte(byte as u8) + } +} diff --git a/rust/automerge/src/columnar/encoding/leb128.rs b/rust/automerge/src/columnar/encoding/leb128.rs new file mode 100644 index 00000000..cbb82c31 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/leb128.rs @@ -0,0 +1,82 @@ +/// The number of bytes required to encode `val` as a LEB128 integer +pub(crate) fn lebsize(mut val: i64) -> u64 { + if val < 0 { + val = !val + } + // 1 extra for the sign bit + leb_bytes(1 + 64 - val.leading_zeros() as u64) +} + +/// The number of bytes required to encode `val` as a uLEB128 integer +pub(crate) fn ulebsize(val: u64) -> u64 { + if val == 0 { + return 1; + } + leb_bytes(64 - val.leading_zeros() as u64) +} + +fn leb_bytes(bits: u64) -> u64 { + (bits + 6) / 7 +} + +#[cfg(test)] +mod tests { + use super::*; + use proptest::prelude::*; + + proptest! { + #[test] + fn test_ulebsize(val in 0..u64::MAX) { + let mut out = Vec::new(); + leb128::write::unsigned(&mut out, val).unwrap(); + let expected = out.len() as u64; + assert_eq!(expected, ulebsize(val)) + } + + #[test] + fn test_lebsize(val in i64::MIN..i64::MAX) { + let mut out = Vec::new(); + leb128::write::signed(&mut out, val).unwrap(); + let expected = out.len() as u64; + assert_eq!(expected, lebsize(val)) + } + } + + #[test] + fn ulebsize_examples() { + let scenarios = vec![0, 1, 127, 128, 129, 169, u64::MAX]; + for val in scenarios { + let mut out = Vec::new(); + leb128::write::unsigned(&mut out, val).unwrap(); + let expected = out.len() as u64; + assert_eq!(ulebsize(val), expected, "value: {}", val) + } + } + + #[test] + fn lebsize_examples() { + let scenarios = vec![ + 0, + 1, + -1, + 63, + 64, + -64, + -65, + 127, + 128, + -127, + -128, + -2097152, + 169, + i64::MIN, + i64::MAX, + ]; + for val in scenarios { + let mut out = Vec::new(); + leb128::write::signed(&mut out, val).unwrap(); + let expected = out.len() as u64; + assert_eq!(lebsize(val), expected, "value: {}", val) + } + } +} diff --git a/rust/automerge/src/columnar/encoding/properties.rs b/rust/automerge/src/columnar/encoding/properties.rs new file mode 100644 index 00000000..30f1169d --- /dev/null +++ b/rust/automerge/src/columnar/encoding/properties.rs @@ -0,0 +1,178 @@ +//! Helpers for property tests. + +use std::{fmt::Debug, ops::Range}; + +use proptest::prelude::*; +use smol_str::SmolStr; + +use crate::{ + columnar::Key, + types::{ElemId, OpId, ScalarValue}, +}; + +#[derive(Clone, Debug)] +pub(crate) struct SpliceScenario { + pub(crate) initial_values: Vec, + pub(crate) replace_range: Range, + pub(crate) replacements: Vec, +} + +impl SpliceScenario { + pub(crate) fn check(&self, results: Vec) { + let mut expected = self.initial_values.clone(); + expected.splice(self.replace_range.clone(), self.replacements.clone()); + assert_eq!(expected, results) + } +} + +impl SpliceScenario> { + /// Checks that `results` are the same as `SpliceScenario::initial_values.splice(replace_range, + /// replacements)`, with two slight changes: + /// + /// * If all of `initial_values` are `None` then this returns true if the output is just + /// `replacements` + /// * If the result of `Vec::splice` would return a vector of all `None` then this checks the + /// result is actually an empty vector + /// + /// This is to accomodate the fact that the RLE encoder can encode a sequence of all `None` as + /// an empty sequence, in which case we decode it as an empty sequence. + pub(crate) fn check_optional(&self, results: Vec>) { + if self.initial_values.iter().all(|v| v.is_none()) { + if self.replacements.iter().all(|v| v.is_none()) { + assert!(results.is_empty()); + } else { + assert_eq!(results, self.replacements); + } + } else { + let mut expected = self.initial_values.clone(); + expected.splice(self.replace_range.clone(), self.replacements.clone()); + if expected.iter().all(|e| e.is_none()) { + assert!(results.is_empty()) + } else { + assert_eq!(expected, results) + } + } + } +} + +pub(crate) fn splice_scenario + Clone, T: Debug + Clone + 'static>( + item_strat: S, +) -> impl Strategy> { + ( + proptest::collection::vec(item_strat.clone(), 0..100), + proptest::collection::vec(item_strat, 0..10), + ) + .prop_flat_map(move |(values, to_splice)| { + if values.is_empty() { + Just(SpliceScenario { + initial_values: values, + replace_range: 0..0, + replacements: to_splice, + }) + .boxed() + } else { + // This is somewhat awkward to write because we have to carry the `values` and + // `to_splice` through as `Just(..)` to please the borrow checker. + (0..values.len(), Just(values), Just(to_splice)) + .prop_flat_map(move |(replace_range_start, values, to_splice)| { + ( + 0..(values.len() - replace_range_start), + Just(values), + Just(to_splice), + ) + .prop_map( + move |(replace_range_len, values, to_splice)| SpliceScenario { + initial_values: values, + replace_range: replace_range_start + ..(replace_range_start + replace_range_len), + replacements: to_splice, + }, + ) + }) + .boxed() + } + }) +} + +/// Like splice scenario except that if the initial values we generate are all `None` then the +/// replace range is 0..0. +pub(crate) fn option_splice_scenario< + S: Strategy> + Clone, + T: Debug + Clone + 'static, +>( + item_strat: S, +) -> impl Strategy>> { + ( + proptest::collection::vec(item_strat.clone(), 0..100), + proptest::collection::vec(item_strat, 0..10), + ) + .prop_flat_map(move |(values, to_splice)| { + if values.is_empty() || values.iter().all(|v| v.is_none()) { + Just(SpliceScenario { + initial_values: values, + replace_range: 0..0, + replacements: to_splice, + }) + .boxed() + } else { + // This is somewhat awkward to write because we have to carry the `values` and + // `to_splice` through as `Just(..)` to please the borrow checker. + (0..values.len(), Just(values), Just(to_splice)) + .prop_flat_map(move |(replace_range_start, values, to_splice)| { + ( + 0..(values.len() - replace_range_start), + Just(values), + Just(to_splice), + ) + .prop_map( + move |(replace_range_len, values, to_splice)| SpliceScenario { + initial_values: values, + replace_range: replace_range_start + ..(replace_range_start + replace_range_len), + replacements: to_splice, + }, + ) + }) + .boxed() + } + }) +} + +pub(crate) fn opid() -> impl Strategy + Clone { + (0..(u32::MAX as usize), 0..(u32::MAX as u64)).prop_map(|(actor, ctr)| OpId::new(ctr, actor)) +} + +pub(crate) fn elemid() -> impl Strategy + Clone { + opid().prop_map(ElemId) +} + +pub(crate) fn key() -> impl Strategy + Clone { + prop_oneof! { + elemid().prop_map(Key::Elem), + any::().prop_map(|s| Key::Prop(s.into())), + } +} + +pub(crate) fn encodable_int() -> impl Strategy + Clone { + let bounds = i64::MAX / 2; + -bounds..bounds +} + +pub(crate) fn scalar_value() -> impl Strategy + Clone { + prop_oneof! { + Just(ScalarValue::Null), + any::().prop_map(ScalarValue::Boolean), + any::().prop_map(ScalarValue::Uint), + encodable_int().prop_map(ScalarValue::Int), + any::().prop_map(ScalarValue::F64), + smol_str().prop_map(ScalarValue::Str), + any::>().prop_map(ScalarValue::Bytes), + encodable_int().prop_map(|i| ScalarValue::Counter(i.into())), + encodable_int().prop_map(ScalarValue::Timestamp), + (10..15_u8, any::>()).prop_map(|(c, b)| ScalarValue::Unknown { type_code: c, bytes: b }), + } +} + +fn smol_str() -> impl Strategy + Clone { + any::().prop_map(SmolStr::from) +} diff --git a/rust/automerge/src/columnar/encoding/raw.rs b/rust/automerge/src/columnar/encoding/raw.rs new file mode 100644 index 00000000..b86443e5 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/raw.rs @@ -0,0 +1,97 @@ +use std::{ + borrow::{Borrow, Cow}, + fmt::Debug, +}; + +use super::{Decodable, DecodeError, Encodable, Sink}; + +#[derive(Clone, Debug)] +pub(crate) struct RawDecoder<'a> { + offset: usize, + last_read: usize, + data: Cow<'a, [u8]>, +} + +#[derive(thiserror::Error, Debug)] +pub(crate) enum Error { + #[error("buffer size did not change")] + BufferSizeDidNotChange, + #[error("trying to read past end")] + TryingToReadPastEnd, + #[error(transparent)] + Decode(#[from] DecodeError), +} + +impl<'a> RawDecoder<'a> { + pub(crate) fn new(data: Cow<'a, [u8]>) -> Self { + RawDecoder { + offset: 0, + last_read: 0, + data, + } + } + + pub(crate) fn read(&mut self) -> Result { + let mut buf = &self.data[self.offset..]; + let init_len = buf.len(); + let val = T::decode::<&[u8]>(&mut buf)?; + let delta = init_len - buf.len(); + if delta == 0 { + Err(Error::BufferSizeDidNotChange) + } else { + self.last_read = delta; + self.offset += delta; + Ok(val) + } + } + + pub(crate) fn read_bytes(&mut self, index: usize) -> Result<&[u8], Error> { + if self.offset + index > self.data.len() { + Err(Error::TryingToReadPastEnd) + } else { + let head = &self.data[self.offset..self.offset + index]; + self.last_read = index; + self.offset += index; + Ok(head) + } + } + + pub(crate) fn done(&self) -> bool { + self.offset >= self.data.len() + } +} + +impl<'a> From<&'a [u8]> for RawDecoder<'a> { + fn from(d: &'a [u8]) -> Self { + Cow::Borrowed(d).into() + } +} + +impl<'a> From> for RawDecoder<'a> { + fn from(d: Cow<'a, [u8]>) -> Self { + RawDecoder::new(d) + } +} + +pub(crate) struct RawEncoder { + written: usize, + output: S, +} + +impl RawEncoder { + pub(crate) fn append, I: Encodable>(&mut self, value: B) -> usize { + let written = value.borrow().encode(&mut self.output); + self.written += written; + written + } + + pub(crate) fn finish(self) -> (S, usize) { + (self.output, self.written) + } +} + +impl From for RawEncoder { + fn from(output: S) -> Self { + RawEncoder { written: 0, output } + } +} diff --git a/rust/automerge/src/columnar/encoding/rle.rs b/rust/automerge/src/columnar/encoding/rle.rs new file mode 100644 index 00000000..26a16899 --- /dev/null +++ b/rust/automerge/src/columnar/encoding/rle.rs @@ -0,0 +1,239 @@ +use std::{ + borrow::{Borrow, Cow}, + fmt::Debug, +}; + +use super::{raw, Decodable, Encodable, RawDecoder, Sink}; + +pub(crate) struct RleEncoder +where + T: Encodable + PartialEq + Clone, +{ + buf: S, + written: usize, + state: RleState, +} + +impl RleEncoder +where + S: Sink, + T: Encodable + PartialEq + Clone, +{ + pub(crate) fn new(output_buf: S) -> RleEncoder { + RleEncoder { + buf: output_buf, + written: 0, + state: RleState::Empty, + } + } + + /// Flush the encoded values and return the output buffer and the number of bytes written + pub(crate) fn finish(mut self) -> (S, usize) { + match self.take_state() { + RleState::InitialNullRun(_size) => {} + RleState::NullRun(size) => { + self.flush_null_run(size); + } + RleState::LoneVal(value) => self.flush_lit_run(vec![value]), + RleState::Run(value, len) => self.flush_run(&value, len), + RleState::LiteralRun(last, mut run) => { + run.push(last); + self.flush_lit_run(run); + } + RleState::Empty => {} + } + (self.buf, self.written) + } + + fn flush_run(&mut self, val: &T, len: usize) { + self.encode(&(len as i64)); + self.encode(val); + } + + fn flush_null_run(&mut self, len: usize) { + self.encode::(&0); + self.encode(&len); + } + + fn flush_lit_run(&mut self, run: Vec) { + self.encode(&-(run.len() as i64)); + for val in run { + self.encode(&val); + } + } + + fn take_state(&mut self) -> RleState { + let mut state = RleState::Empty; + std::mem::swap(&mut self.state, &mut state); + state + } + + pub(crate) fn append_null(&mut self) { + self.state = match self.take_state() { + RleState::Empty => RleState::InitialNullRun(1), + RleState::InitialNullRun(size) => RleState::InitialNullRun(size + 1), + RleState::NullRun(size) => RleState::NullRun(size + 1), + RleState::LoneVal(other) => { + self.flush_lit_run(vec![other]); + RleState::NullRun(1) + } + RleState::Run(other, len) => { + self.flush_run(&other, len); + RleState::NullRun(1) + } + RleState::LiteralRun(last, mut run) => { + run.push(last); + self.flush_lit_run(run); + RleState::NullRun(1) + } + } + } + + pub(crate) fn append_value>(&mut self, value: BT) { + self.state = match self.take_state() { + RleState::Empty => RleState::LoneVal(value.borrow().clone()), + RleState::LoneVal(other) => { + if &other == value.borrow() { + RleState::Run(value.borrow().clone(), 2) + } else { + let mut v = Vec::with_capacity(2); + v.push(other); + RleState::LiteralRun(value.borrow().clone(), v) + } + } + RleState::Run(other, len) => { + if &other == value.borrow() { + RleState::Run(other, len + 1) + } else { + self.flush_run(&other, len); + RleState::LoneVal(value.borrow().clone()) + } + } + RleState::LiteralRun(last, mut run) => { + if &last == value.borrow() { + self.flush_lit_run(run); + RleState::Run(value.borrow().clone(), 2) + } else { + run.push(last); + RleState::LiteralRun(value.borrow().clone(), run) + } + } + RleState::NullRun(size) | RleState::InitialNullRun(size) => { + self.flush_null_run(size); + RleState::LoneVal(value.borrow().clone()) + } + } + } + + pub(crate) fn append>(&mut self, value: Option) { + match value { + Some(t) => self.append_value(t), + None => self.append_null(), + } + } + + fn encode(&mut self, val: &V) + where + V: Encodable, + { + self.written += val.encode(&mut self.buf); + } +} + +enum RleState { + Empty, + // Note that this is different to a `NullRun` because if every element of a column is null + // (i.e. the state when we call `finish` is `InitialNullRun`) then we don't output anything at + // all for the column + InitialNullRun(usize), + NullRun(usize), + LiteralRun(T, Vec), + LoneVal(T), + Run(T, usize), +} + +impl From for RleEncoder { + fn from(output: S) -> Self { + Self::new(output) + } +} + +/// See discussion on [`RleEncoder`] for the format data is stored in. +#[derive(Clone, Debug)] +pub(crate) struct RleDecoder<'a, T> { + decoder: RawDecoder<'a>, + last_value: Option, + count: isize, + literal: bool, +} + +impl<'a, T> RleDecoder<'a, T> { + pub(crate) fn done(&self) -> bool { + self.decoder.done() && self.count == 0 + } + + fn try_next(&mut self) -> Result>, raw::Error> + where + T: Decodable + Clone + Debug, + { + while self.count == 0 { + if self.decoder.done() { + return Ok(None); + } + match self.decoder.read::()? { + count if count > 0 => { + // normal run + self.count = count as isize; + self.last_value = Some(self.decoder.read()?); + self.literal = false; + } + count if count < 0 => { + // literal run + self.count = count.abs() as isize; + self.literal = true; + } + _ => { + // null run + // FIXME(jeffa5): handle usize > i64 here somehow + self.count = self.decoder.read::()? as isize; + self.last_value = None; + self.literal = false; + } + } + } + self.count -= 1; + if self.literal { + Ok(Some(Some(self.decoder.read()?))) + } else { + Ok(Some(self.last_value.clone())) + } + } +} + +impl<'a, T> From> for RleDecoder<'a, T> { + fn from(bytes: Cow<'a, [u8]>) -> Self { + RleDecoder { + decoder: RawDecoder::from(bytes), + last_value: None, + count: 0, + literal: false, + } + } +} + +impl<'a, T> From<&'a [u8]> for RleDecoder<'a, T> { + fn from(d: &'a [u8]) -> Self { + Cow::Borrowed(d).into() + } +} + +impl<'a, T> Iterator for RleDecoder<'a, T> +where + T: Clone + Debug + Decodable, +{ + type Item = Result, raw::Error>; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} diff --git a/rust/automerge/src/columnar/splice_error.rs b/rust/automerge/src/columnar/splice_error.rs new file mode 100644 index 00000000..54d5f478 --- /dev/null +++ b/rust/automerge/src/columnar/splice_error.rs @@ -0,0 +1,47 @@ +use std::convert::Infallible; + +/// Represents an error which occurred when splicing. +/// +/// When splicing values into existing column storage there are two kinds of errors which can +/// occur, those caused by iterating over the existing items, and those caused by iterating over +/// the replacement items. +#[derive(Debug)] +pub(crate) enum SpliceError { + /// There was an error reading from the existing column storage + ReadExisting(E), + /// There was an error reading from the iterator of new rows + ReadReplace(R), +} + +impl SpliceError { + /// Map a spliceerror which is infallible in it's `Replace` error type into a different error. + /// + /// This is used when you have performed a splice with a `replace` iterator which is + /// infallible and need to return a more general `SpliceError` + pub(crate) fn existing(self) -> SpliceError { + match self { + SpliceError::ReadExisting(e) => SpliceError::ReadExisting(e), + SpliceError::ReadReplace(_) => unreachable!("absurd"), + } + } +} + +impl std::error::Error for SpliceError +where + E: std::error::Error, + R: std::error::Error, +{ +} + +impl std::fmt::Display for SpliceError +where + E: std::fmt::Display, + R: std::fmt::Display, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ReadExisting(e) => write!(f, "error reading from existing rows: {}", e), + Self::ReadReplace(e) => write!(f, "error reading from replacement rows: {}", e), + } + } +} diff --git a/rust/automerge/src/convert.rs b/rust/automerge/src/convert.rs new file mode 100644 index 00000000..a99f96a1 --- /dev/null +++ b/rust/automerge/src/convert.rs @@ -0,0 +1,102 @@ +//! Types for converting between different OpId representations +//! +//! In various places throughout the codebase we refer to operation IDs. The canonical type for +//! representing an operation ID is [`crate::types::OpId`]. This type holds the counter of the operation +//! ID but it does not store the actor ID, instead storing an index into an array of actor IDs +//! stored elsewhere. This makes using OpIds very memory efficient. We also store operation IDs on +//! disc. Here again we use a representation where the actor ID is stored as an offset into an +//! array which is held elsewhere. We occasionally do need to refer to an operation ID which +//! contains the full actor ID - typically when exporting to other processes or to the user. +//! +//! This is problematic when we want to write code which is generic over all these representations, +//! or which needs to convert between them. This module hopes to solve that problem. The basic +//! approach is to define the trait `OpId`, which is generic over the type of its `actor`. Using a +//! trait means that there is no need to allocate intermediate collections of operation IDs when +//! converting (for example when encoding a bunch of OpSet operation IDs into a change, where we +//! have to translate the indices). +//! +//! Having defined the `OpId` trait we then define a bunch of enums representing each of the +//! entities in the automerge data model which contain an `OpId`, namely `ObjId`, `Key`, and +//! `ElemId`. Each of these enums implements a `map` method, which allows you to convert the actor +//! ID of any contained operation using a mappping function. + +use std::borrow::Cow; + +pub(crate) trait OpId { + fn actor(&self) -> ActorId; + fn counter(&self) -> u64; +} + +#[derive(Clone, Debug)] +pub(crate) enum ObjId { + Root, + Op(O), +} + +impl ObjId { + pub(crate) fn map(self, f: F) -> ObjId

+ where + F: Fn(O) -> P, + { + match self { + ObjId::Root => ObjId::Root, + ObjId::Op(o) => ObjId::Op(f(o)), + } + } +} + +#[derive(Clone)] +pub(crate) enum ElemId { + Head, + Op(O), +} + +impl ElemId { + pub(crate) fn map(self, f: F) -> ElemId

+ where + F: Fn(O) -> P, + { + match self { + ElemId::Head => ElemId::Head, + ElemId::Op(o) => ElemId::Op(f(o)), + } + } +} + +#[derive(Clone)] +pub(crate) enum Key<'a, O> { + Prop(Cow<'a, smol_str::SmolStr>), + Elem(ElemId), +} + +impl<'a, O> Key<'a, O> { + pub(crate) fn map(self, f: F) -> Key<'a, P> + where + F: Fn(O) -> P, + { + match self { + Key::Prop(p) => Key::Prop(p), + Key::Elem(e) => Key::Elem(e.map(f)), + } + } +} + +impl OpId for crate::types::OpId { + fn counter(&self) -> u64 { + self.counter() + } + + fn actor(&self) -> usize { + self.actor() + } +} + +impl<'a> OpId for &'a crate::types::OpId { + fn counter(&self) -> u64 { + crate::types::OpId::counter(self) + } + + fn actor(&self) -> usize { + crate::types::OpId::actor(self) + } +} diff --git a/automerge-backend/src/decoding.rs b/rust/automerge/src/decoding.rs similarity index 73% rename from automerge-backend/src/decoding.rs rename to rust/automerge/src/decoding.rs index a75e3a20..cd938a3c 100644 --- a/automerge-backend/src/decoding.rs +++ b/rust/automerge/src/decoding.rs @@ -1,7 +1,11 @@ use core::fmt::Debug; -use std::{borrow::Cow, convert::TryFrom, io, io::Read, str}; +use std::num::NonZeroU64; +use std::{borrow::Cow, io, io::Read, str}; -use automerge_protocol as amp; +use crate::error; +use crate::legacy as amp; +use crate::ActorId; +use smol_str::SmolStr; /// The error type for decoding operations. #[derive(Debug, thiserror::Error)] @@ -19,7 +23,7 @@ pub enum Error { )] WrongType { expected_one_of: Vec, found: u8 }, #[error("Bad change format: {0}")] - BadChangeFormat(#[source] amp::error::InvalidChangeHashSlice), + BadChangeFormat(#[source] error::InvalidChangeHashSlice), #[error("Not enough bytes")] NotEnoughBytes, #[error("Found the wrong magic bytes in the document")] @@ -40,13 +44,68 @@ pub enum Error { NoDocChanges, #[error("An overflow would have occurred, the data may be corrupt")] Overflow, + #[error("Calculated heads differed from actual heads")] + MismatchedHeads, #[error("Failed to read leb128 number {0}")] Leb128(#[from] leb128::read::Error), #[error(transparent)] Io(#[from] io::Error), } -#[derive(thiserror::Error, Debug)] +impl PartialEq for Error { + fn eq(&self, other: &Error) -> bool { + match (self, other) { + ( + Self::WrongType { + expected_one_of: l_expected_one_of, + found: l_found, + }, + Self::WrongType { + expected_one_of: r_expected_one_of, + found: r_found, + }, + ) => l_expected_one_of == r_expected_one_of && l_found == r_found, + (Self::BadChangeFormat(l0), Self::BadChangeFormat(r0)) => l0 == r0, + ( + Self::WrongByteLength { + expected: l_expected, + found: l_found, + }, + Self::WrongByteLength { + expected: r_expected, + found: r_found, + }, + ) => l_expected == r_expected && l_found == r_found, + ( + Self::ColumnsNotInAscendingOrder { + last: l_last, + found: l_found, + }, + Self::ColumnsNotInAscendingOrder { + last: r_last, + found: r_found, + }, + ) => l_last == r_last && l_found == r_found, + ( + Self::InvalidChecksum { + found: l_found, + calculated: l_calculated, + }, + Self::InvalidChecksum { + found: r_found, + calculated: r_calculated, + }, + ) => l_found == r_found && l_calculated == r_calculated, + (Self::InvalidChange(l0), Self::InvalidChange(r0)) => l0 == r0, + (Self::ChangeDecompressFailed(l0), Self::ChangeDecompressFailed(r0)) => l0 == r0, + (Self::Leb128(_l0), Self::Leb128(_r0)) => true, + (Self::Io(l0), Self::Io(r0)) => l0.kind() == r0.kind(), + _ => core::mem::discriminant(self) == core::mem::discriminant(other), + } + } +} + +#[derive(thiserror::Error, PartialEq, Debug)] pub enum InvalidChangeError { #[error("Change contained an operation with action 'set' which did not have a 'value'")] SetOpWithoutValue, @@ -55,24 +114,24 @@ pub enum InvalidChangeError { #[error("Change contained an invalid object id: {}", source.0)] InvalidObjectId { #[from] - source: amp::error::InvalidObjectId, + source: error::InvalidObjectId, }, #[error("Change contained an invalid hash: {:?}", source.0)] InvalidChangeHash { #[from] - source: amp::error::InvalidChangeHashSlice, + source: error::InvalidChangeHashSlice, }, } #[derive(Clone, Debug)] pub(crate) struct Decoder<'a> { - pub offset: usize, - pub last_read: usize, + pub(crate) offset: usize, + pub(crate) last_read: usize, data: Cow<'a, [u8]>, } impl<'a> Decoder<'a> { - pub fn new(data: Cow<'a, [u8]>) -> Self { + pub(crate) fn new(data: Cow<'a, [u8]>) -> Self { Decoder { offset: 0, last_read: 0, @@ -80,7 +139,7 @@ impl<'a> Decoder<'a> { } } - pub fn read(&mut self) -> Result { + pub(crate) fn read(&mut self) -> Result { let mut buf = &self.data[self.offset..]; let init_len = buf.len(); let val = T::decode::<&[u8]>(&mut buf).ok_or(Error::NoDecodedValue)?; @@ -94,7 +153,7 @@ impl<'a> Decoder<'a> { } } - pub fn read_bytes(&mut self, index: usize) -> Result<&[u8], Error> { + pub(crate) fn read_bytes(&mut self, index: usize) -> Result<&[u8], Error> { if self.offset + index > self.data.len() { Err(Error::TryingToReadPastEnd) } else { @@ -105,12 +164,12 @@ impl<'a> Decoder<'a> { } } - pub fn done(&self) -> bool { + pub(crate) fn done(&self) -> bool { self.offset >= self.data.len() } } -/// See discussion on [`BooleanEncoder`] for the format data is stored in. +/// See discussion on [`crate::encoding::BooleanEncoder`] for the format data is stored in. pub(crate) struct BooleanDecoder<'a> { decoder: Decoder<'a>, last_value: bool, @@ -150,10 +209,10 @@ impl<'a> Iterator for BooleanDecoder<'a> { } } -/// See discussion on [`RleEncoder`] for the format data is stored in. +/// See discussion on [`crate::encoding::RleEncoder`] for the format data is stored in. #[derive(Debug)] pub(crate) struct RleDecoder<'a, T> { - pub decoder: Decoder<'a>, + pub(crate) decoder: Decoder<'a>, last_value: Option, count: isize, literal: bool, @@ -218,7 +277,7 @@ where } } -/// See discussion on [`DeltaEncoder`] for the format data is stored in. +/// See discussion on [`crate::encoding::DeltaEncoder`] for the format data is stored in. pub(crate) struct DeltaDecoder<'a> { rle: RleDecoder<'a, i64>, absolute_val: u64, @@ -348,6 +407,15 @@ impl Decodable for u64 { } } +impl Decodable for NonZeroU64 { + fn decode(bytes: &mut R) -> Option + where + R: Read, + { + NonZeroU64::new(leb128::read::unsigned(bytes).ok()?) + } +} + impl Decodable for Vec { fn decode(bytes: &mut R) -> Option where @@ -362,6 +430,17 @@ impl Decodable for Vec { Some(buffer) } } + +impl Decodable for SmolStr { + fn decode(bytes: &mut R) -> Option + where + R: Read, + { + let buffer = Vec::decode(bytes)?; + str::from_utf8(&buffer).map(|t| t.into()).ok() + } +} + impl Decodable for String { fn decode(bytes: &mut R) -> Option where @@ -385,7 +464,7 @@ impl Decodable for Option { } } -impl Decodable for amp::ActorId { +impl Decodable for ActorId { fn decode(bytes: &mut R) -> Option where R: Read, diff --git a/rust/automerge/src/error.rs b/rust/automerge/src/error.rs new file mode 100644 index 00000000..62a7b72f --- /dev/null +++ b/rust/automerge/src/error.rs @@ -0,0 +1,107 @@ +use crate::change::LoadError as LoadChangeError; +use crate::storage::load::Error as LoadError; +use crate::types::{ActorId, ScalarValue}; +use crate::value::DataType; +use crate::{ChangeHash, ObjType}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum AutomergeError { + #[error(transparent)] + ChangeGraph(#[from] crate::change_graph::MissingDep), + #[error("failed to load compressed data: {0}")] + Deflate(#[source] std::io::Error), + #[error("duplicate seq {0} found for actor {1}")] + DuplicateSeqNumber(u64, ActorId), + #[error("key must not be an empty string")] + EmptyStringKey, + #[error("general failure")] + Fail, + #[error("invalid actor ID `{0}`")] + InvalidActorId(String), + #[error(transparent)] + InvalidChangeHashBytes(#[from] InvalidChangeHashSlice), + #[error("invalid UTF-8 character at {0}")] + InvalidCharacter(usize), + #[error("invalid hash {0}")] + InvalidHash(ChangeHash), + #[error("index {0} is out of bounds")] + InvalidIndex(usize), + #[error("invalid obj id `{0}`")] + InvalidObjId(String), + #[error("invalid obj id format `{0}`")] + InvalidObjIdFormat(String), + #[error("invalid op for object of type `{0}`")] + InvalidOp(ObjType), + #[error("seq {0} is out of bounds")] + InvalidSeq(u64), + #[error("invalid type of value, expected `{expected}` but received `{unexpected}`")] + InvalidValueType { + expected: String, + unexpected: String, + }, + #[error(transparent)] + Load(#[from] LoadError), + #[error(transparent)] + LoadChangeError(#[from] LoadChangeError), + #[error("increment operations must be against a counter value")] + MissingCounter, + #[error("hash {0} does not correspond to a change in this document")] + MissingHash(ChangeHash), + #[error("change's deps should already be in the document")] + MissingDeps, + #[error("compressed chunk was not a change")] + NonChangeCompressed, + #[error("id was not an object id")] + NotAnObject, +} + +impl PartialEq for AutomergeError { + fn eq(&self, other: &Self) -> bool { + std::mem::discriminant(self) == std::mem::discriminant(other) + } +} + +#[cfg(feature = "wasm")] +impl From for wasm_bindgen::JsValue { + fn from(err: AutomergeError) -> Self { + js_sys::Error::new(&std::format!("{}", err)).into() + } +} + +#[derive(Error, Debug)] +#[error("Invalid actor ID: {0}")] +pub struct InvalidActorId(pub String); + +#[derive(Error, Debug, PartialEq)] +#[error("Invalid scalar value, expected {expected} but received {unexpected}")] +pub(crate) struct InvalidScalarValue { + pub(crate) raw_value: ScalarValue, + pub(crate) datatype: DataType, + pub(crate) unexpected: String, + pub(crate) expected: String, +} + +#[derive(Error, Debug, Eq, PartialEq)] +#[error("Invalid change hash slice: {0:?}")] +pub struct InvalidChangeHashSlice(pub Vec); + +#[derive(Error, Debug, Eq, PartialEq)] +#[error("Invalid object ID: {0}")] +pub struct InvalidObjectId(pub String); + +#[derive(Error, Debug)] +#[error("Invalid element ID: {0}")] +pub struct InvalidElementId(pub String); + +#[derive(Error, Debug)] +#[error("Invalid OpID: {0}")] +pub struct InvalidOpId(pub String); + +#[derive(Error, Debug)] +pub enum InvalidOpType { + #[error("unrecognized action index {0}")] + UnknownAction(u64), + #[error("non numeric argument for inc op")] + NonNumericInc, +} diff --git a/rust/automerge/src/exid.rs b/rust/automerge/src/exid.rs new file mode 100644 index 00000000..3a5a2ca2 --- /dev/null +++ b/rust/automerge/src/exid.rs @@ -0,0 +1,224 @@ +use crate::storage::parse; +use crate::ActorId; +use serde::Serialize; +use serde::Serializer; +use std::cmp::{Ord, Ordering}; +use std::fmt; +use std::hash::{Hash, Hasher}; + +/// An identifier for an object in a document +/// +/// This can be persisted using `to_bytes` and `TryFrom<&[u8]>` breaking changes to the +/// serialization format will be considered breaking changes for this library version. +#[derive(Debug, Clone)] +pub enum ExId { + Root, + Id(u64, ActorId, usize), +} + +const SERIALIZATION_VERSION_TAG: u8 = 0; +const TYPE_ROOT: u8 = 0; +const TYPE_ID: u8 = 1; + +impl ExId { + /// Serialize this object ID to a byte array. + /// + /// This serialization format is versioned and incompatible changes to it will be considered a + /// breaking change for the version of this library. + pub fn to_bytes(&self) -> Vec { + // The serialized format is + // + // .--------------------------------. + // | version | type | data | + // +--------------------------------+ + // | 4 bytes |4 bytes | variable | + // '--------------------------------' + // + // Version is currently always `0` + // + // `data` depends on the type + // + // * If the type is `TYPE_ROOT` (0) then there is no data + // * If the type is `TYPE_ID` (1) then the data is + // + // .-------------------------------------------------------. + // | actor ID len | actor ID bytes | counter | actor index | + // '-------------------------------------------------------' + // + // Where the actor ID len, counter, and actor index are all uLEB encoded + // integers. The actor ID bytes is just an array of bytes. + // + match self { + ExId::Root => { + let val: u8 = SERIALIZATION_VERSION_TAG | (TYPE_ROOT << 4); + vec![val] + } + ExId::Id(id, actor, counter) => { + let actor_bytes = actor.to_bytes(); + let mut bytes = Vec::with_capacity(actor_bytes.len() + 4 + 4); + let tag = SERIALIZATION_VERSION_TAG | (TYPE_ID << 4); + bytes.push(tag); + leb128::write::unsigned(&mut bytes, actor_bytes.len() as u64).unwrap(); + bytes.extend_from_slice(actor_bytes); + leb128::write::unsigned(&mut bytes, *counter as u64).unwrap(); + leb128::write::unsigned(&mut bytes, *id).unwrap(); + bytes + } + } + } +} + +#[derive(Debug, thiserror::Error)] +pub enum ObjIdFromBytesError { + #[error("no version tag")] + NoVersion, + #[error("invalid version tag")] + InvalidVersion(u8), + #[error("invalid type tag")] + InvalidType(u8), + #[error("invalid Actor ID length: {0}")] + ParseActorLen(String), + #[error("Not enough bytes in actor ID")] + ParseActor, + #[error("invalid counter: {0}")] + ParseCounter(String), + #[error("invalid actor index hint: {0}")] + ParseActorIdxHint(String), +} + +impl<'a> TryFrom<&'a [u8]> for ExId { + type Error = ObjIdFromBytesError; + + fn try_from(value: &'a [u8]) -> Result { + let i = parse::Input::new(value); + let (i, tag) = parse::take1::<()>(i).map_err(|_| ObjIdFromBytesError::NoVersion)?; + let version = tag & 0b1111; + if version != SERIALIZATION_VERSION_TAG { + return Err(ObjIdFromBytesError::InvalidVersion(version)); + } + let type_tag = tag >> 4; + match type_tag { + TYPE_ROOT => Ok(ExId::Root), + TYPE_ID => { + let (i, len) = parse::leb128_u64::(i) + .map_err(|e| ObjIdFromBytesError::ParseActorLen(e.to_string()))?; + let (i, actor) = parse::take_n::<()>(len as usize, i) + .map_err(|_| ObjIdFromBytesError::ParseActor)?; + let (i, counter) = parse::leb128_u64::(i) + .map_err(|e| ObjIdFromBytesError::ParseCounter(e.to_string()))?; + let (_i, actor_idx_hint) = parse::leb128_u64::(i) + .map_err(|e| ObjIdFromBytesError::ParseActorIdxHint(e.to_string()))?; + Ok(Self::Id(actor_idx_hint, actor.into(), counter as usize)) + } + other => Err(ObjIdFromBytesError::InvalidType(other)), + } + } +} + +impl PartialEq for ExId { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (ExId::Root, ExId::Root) => true, + (ExId::Id(ctr1, actor1, _), ExId::Id(ctr2, actor2, _)) + if ctr1 == ctr2 && actor1 == actor2 => + { + true + } + _ => false, + } + } +} + +impl Eq for ExId {} + +impl fmt::Display for ExId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ExId::Root => write!(f, "_root"), + ExId::Id(ctr, actor, _) => write!(f, "{}@{}", ctr, actor), + } + } +} + +impl Hash for ExId { + fn hash(&self, state: &mut H) { + match self { + ExId::Root => 0.hash(state), + ExId::Id(ctr, actor, _) => { + ctr.hash(state); + actor.hash(state); + } + } + } +} + +impl Ord for ExId { + fn cmp(&self, other: &Self) -> Ordering { + match (self, other) { + (ExId::Root, ExId::Root) => Ordering::Equal, + (ExId::Root, _) => Ordering::Less, + (_, ExId::Root) => Ordering::Greater, + (ExId::Id(c1, a1, _), ExId::Id(c2, a2, _)) if c1 == c2 => a2.cmp(a1), + (ExId::Id(c1, _, _), ExId::Id(c2, _, _)) => c1.cmp(c2), + } + } +} + +impl PartialOrd for ExId { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Serialize for ExId { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(self.to_string().as_str()) + } +} + +impl AsRef for ExId { + fn as_ref(&self) -> &ExId { + self + } +} + +#[cfg(test)] +mod tests { + use super::ExId; + use proptest::prelude::*; + + use crate::ActorId; + + fn gen_actorid() -> impl Strategy { + proptest::collection::vec(any::(), 0..100).prop_map(ActorId::from) + } + + prop_compose! { + fn gen_non_root_objid()(actor in gen_actorid(), counter in any::(), idx in any::()) -> ExId { + ExId::Id(idx as u64, actor, counter) + } + } + + fn gen_obji() -> impl Strategy { + prop_oneof![Just(ExId::Root), gen_non_root_objid()] + } + + proptest! { + #[test] + fn objid_roundtrip(objid in gen_obji()) { + let bytes = objid.to_bytes(); + let objid2 = ExId::try_from(&bytes[..]).unwrap(); + assert_eq!(objid, objid2); + } + } + + #[test] + fn test_root_roundtrip() { + let bytes = ExId::Root.to_bytes(); + let objid2 = ExId::try_from(&bytes[..]).unwrap(); + assert_eq!(ExId::Root, objid2); + } +} diff --git a/rust/automerge/src/indexed_cache.rs b/rust/automerge/src/indexed_cache.rs new file mode 100644 index 00000000..b907a6f1 --- /dev/null +++ b/rust/automerge/src/indexed_cache.rs @@ -0,0 +1,137 @@ +use itertools::Itertools; +use std::collections::HashMap; +use std::hash::Hash; +use std::ops::Index; + +#[derive(Debug, Clone)] +pub(crate) struct IndexedCache { + pub(crate) cache: Vec, + lookup: HashMap, +} + +impl PartialEq for IndexedCache +where + T: PartialEq, +{ + fn eq(&self, other: &Self) -> bool { + self.cache == other.cache + } +} + +impl IndexedCache +where + T: Clone + Eq + Hash + Ord, +{ + pub(crate) fn new() -> Self { + IndexedCache { + cache: Default::default(), + lookup: Default::default(), + } + } + + pub(crate) fn cache(&mut self, item: T) -> usize { + if let Some(n) = self.lookup.get(&item) { + *n + } else { + let n = self.cache.len(); + self.cache.push(item.clone()); + self.lookup.insert(item, n); + n + } + } + + pub(crate) fn lookup(&self, item: &T) -> Option { + self.lookup.get(item).cloned() + } + + #[allow(dead_code)] + pub(crate) fn len(&self) -> usize { + self.cache.len() + } + + pub(crate) fn get(&self, index: usize) -> &T { + &self.cache[index] + } + + pub(crate) fn safe_get(&self, index: usize) -> Option<&T> { + self.cache.get(index) + } + + /// Remove the last inserted entry into this cache. + /// This is safe to do as it does not require reshuffling other entries. + /// + /// # Panics + /// + /// Panics on an empty cache. + pub(crate) fn remove_last(&mut self) -> T { + let last = self.cache.len() - 1; + let t = self.cache.remove(last); + self.lookup.remove(&t); + t + } + + pub(crate) fn sorted(&self) -> IndexedCache { + let mut sorted = Self::new(); + self.cache.iter().sorted().cloned().for_each(|item| { + let n = sorted.cache.len(); + sorted.cache.push(item.clone()); + sorted.lookup.insert(item, n); + }); + sorted + } + + /// Create a vector from positions in this index to positions in an equivalent sorted index + /// + /// This is useful primarily when encoding an `IndexedCache` in the document format. + /// In this case we encode the actors in sorted order in the document and all ops reference the + /// offset into this sorted actor array. But the `IndexedCache` we have in the + /// application does not contain actors in sorted order because we add them as we encounter + /// them, so we must map from the actor IDs in the application to the actor IDs in the document + /// format + /// + /// # Examples + /// + /// ```rust,ignore + /// let idx: IndexedCache = IndexedCache::new(); + /// let first_idx = idx.cache("b"); // first_idx is `0` + /// let second_idx = idx.cache("a"); // second_idx i `1` + /// let encoded = idx.encode_index(); + /// // first_idx (0) maps to `1` whilst second_idx (1) maps to `0` because "a" < "b" + /// assert_eq!(encoded, vec![1,0]) + /// ``` + pub(crate) fn encode_index(&self) -> Vec { + let sorted: Vec<_> = self.cache.iter().sorted().cloned().collect(); + self.cache + .iter() + .map(|a| sorted.iter().position(|r| r == a).unwrap()) + .collect() + } +} + +impl IntoIterator for IndexedCache { + type Item = T; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.cache.into_iter() + } +} + +impl Index for IndexedCache { + type Output = T; + fn index(&self, i: usize) -> &T { + &self.cache[i] + } +} + +impl FromIterator for IndexedCache { + fn from_iter>(iter: T) -> Self { + let mut cache = Vec::new(); + let mut lookup = HashMap::new(); + for (index, elem) in iter.into_iter().enumerate() { + cache.push(elem.clone()); + lookup.insert(elem, index); + } + Self { cache, lookup } + } +} diff --git a/rust/automerge/src/keys.rs b/rust/automerge/src/keys.rs new file mode 100644 index 00000000..838015ef --- /dev/null +++ b/rust/automerge/src/keys.rs @@ -0,0 +1,37 @@ +use crate::{query, Automerge}; + +/// An iterator over the keys of an object +/// +/// This is returned by [`crate::ReadDoc::keys`] and method. The returned item is either +/// the keys of a map, or the encoded element IDs of a sequence. +#[derive(Debug)] +pub struct Keys<'a, 'k> { + keys: Option>, + doc: &'a Automerge, +} + +impl<'a, 'k> Keys<'a, 'k> { + pub(crate) fn new(doc: &'a Automerge, keys: Option>) -> Self { + Self { keys, doc } + } +} + +impl<'a, 'k> Iterator for Keys<'a, 'k> { + type Item = String; + + fn next(&mut self) -> Option { + self.keys + .as_mut()? + .next() + .map(|key| self.doc.to_string(key)) + } +} + +impl<'a, 'k> DoubleEndedIterator for Keys<'a, 'k> { + fn next_back(&mut self) -> Option { + self.keys + .as_mut()? + .next_back() + .map(|key| self.doc.to_string(key)) + } +} diff --git a/rust/automerge/src/keys_at.rs b/rust/automerge/src/keys_at.rs new file mode 100644 index 00000000..fd747bbc --- /dev/null +++ b/rust/automerge/src/keys_at.rs @@ -0,0 +1,37 @@ +use crate::{query, Automerge}; + +/// An iterator over the keys of an object at a particular point in history +/// +/// This is returned by [`crate::ReadDoc::keys_at`] method. The returned item is either the keys of a map, +/// or the encoded element IDs of a sequence. +#[derive(Debug)] +pub struct KeysAt<'a, 'k> { + keys: Option>, + doc: &'a Automerge, +} + +impl<'a, 'k> KeysAt<'a, 'k> { + pub(crate) fn new(doc: &'a Automerge, keys: Option>) -> Self { + Self { keys, doc } + } +} + +impl<'a, 'k> Iterator for KeysAt<'a, 'k> { + type Item = String; + + fn next(&mut self) -> Option { + self.keys + .as_mut()? + .next() + .map(|key| self.doc.to_string(key)) + } +} + +impl<'a, 'k> DoubleEndedIterator for KeysAt<'a, 'k> { + fn next_back(&mut self) -> Option { + self.keys + .as_mut()? + .next() + .map(|key| self.doc.to_string(key)) + } +} diff --git a/rust/automerge/src/legacy/mod.rs b/rust/automerge/src/legacy/mod.rs new file mode 100644 index 00000000..6e6acec5 --- /dev/null +++ b/rust/automerge/src/legacy/mod.rs @@ -0,0 +1,276 @@ +mod serde_impls; +mod utility_impls; + +use std::num::NonZeroU64; + +pub(crate) use crate::types::{ActorId, ChangeHash, ObjType, OpType, ScalarValue}; +pub(crate) use crate::value::DataType; + +use serde::{Deserialize, Serialize}; +use smol_str::SmolStr; + +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Copy, Hash)] +#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] +#[serde(rename_all = "camelCase")] +pub(crate) enum MapType { + Map, + Table, +} + +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Copy, Hash)] +#[serde(rename_all = "camelCase")] +pub(crate) enum SequenceType { + List, + Text, +} + +#[derive(Eq, PartialEq, Hash, Clone)] +#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] +pub struct OpId(pub u64, pub ActorId); + +impl OpId { + pub fn new(seq: u64, actor: &ActorId) -> OpId { + OpId(seq, actor.clone()) + } + + pub fn actor(&self) -> &ActorId { + &self.1 + } + + pub fn counter(&self) -> u64 { + self.0 + } + + pub fn increment_by(&self, by: u64) -> OpId { + OpId(self.0 + by, self.1.clone()) + } + + /// Returns true if `other` has the same actor ID, and their counter is `delta` greater than + /// ours. + pub fn delta(&self, other: &Self, delta: u64) -> bool { + self.1 == other.1 && self.0 + delta == other.0 + } +} + +#[derive(Eq, PartialEq, Debug, Hash, Clone)] +#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] +pub enum ObjectId { + Id(OpId), + Root, +} + +#[derive(PartialEq, Eq, Debug, Hash, Clone)] +pub enum ElementId { + Head, + Id(OpId), +} + +impl ElementId { + pub fn as_opid(&self) -> Option<&OpId> { + match self { + ElementId::Head => None, + ElementId::Id(opid) => Some(opid), + } + } + + pub fn into_key(self) -> Key { + Key::Seq(self) + } + + pub fn not_head(&self) -> bool { + match self { + ElementId::Head => false, + ElementId::Id(_) => true, + } + } + + pub fn increment_by(&self, by: u64) -> Option { + match self { + ElementId::Head => None, + ElementId::Id(id) => Some(ElementId::Id(id.increment_by(by))), + } + } +} + +#[derive(Serialize, PartialEq, Eq, Debug, Hash, Clone)] +#[serde(untagged)] +pub enum Key { + Map(SmolStr), + Seq(ElementId), +} + +impl Key { + pub fn head() -> Key { + Key::Seq(ElementId::Head) + } + + pub fn is_map_key(&self) -> bool { + match self { + Key::Map(_) => true, + Key::Seq(_) => false, + } + } + + pub fn as_element_id(&self) -> Option { + match self { + Key::Map(_) => None, + Key::Seq(eid) => Some(eid.clone()), + } + } + + pub fn to_opid(&self) -> Option { + match self.as_element_id()? { + ElementId::Id(id) => Some(id), + ElementId::Head => None, + } + } + pub fn increment_by(&self, by: u64) -> Option { + match self { + Key::Map(_) => None, + Key::Seq(eid) => eid.increment_by(by).map(Key::Seq), + } + } +} + +#[derive(Debug, Default, Clone, Eq, PartialEq, Serialize)] +#[serde(transparent)] +pub struct SortedVec(Vec); + +impl SortedVec { + pub fn new() -> Self { + Self(Vec::new()) + } + + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + pub fn get(&self, index: usize) -> Option<&T> { + self.0.get(index) + } + + pub fn get_mut(&mut self, index: usize) -> Option<&mut T> { + self.0.get_mut(index) + } + + pub fn iter(&self) -> std::slice::Iter<'_, T> { + self.0.iter() + } +} + +impl From> for SortedVec { + fn from(mut other: Vec) -> Self { + other.sort_unstable(); + Self(other) + } +} + +impl FromIterator for SortedVec { + fn from_iter(iter: I) -> Self + where + I: std::iter::IntoIterator, + { + let mut inner: Vec = iter.into_iter().collect(); + inner.sort_unstable(); + Self(inner) + } +} + +impl IntoIterator for SortedVec { + type Item = T; + + type IntoIter = as IntoIterator>::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'de, T> serde::Deserialize<'de> for SortedVec +where + T: serde::Deserialize<'de> + Ord, +{ + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let mut v = Vec::deserialize(deserializer)?; + v.sort_unstable(); + Ok(Self(v)) + } +} + +#[derive(PartialEq, Debug, Clone)] +pub struct Op { + pub action: OpType, + pub obj: ObjectId, + pub key: Key, + pub pred: SortedVec, + pub insert: bool, +} + +impl Op { + pub fn primitive_value(&self) -> Option { + match &self.action { + OpType::Put(v) => Some(v.clone()), + OpType::Increment(i) => Some(ScalarValue::Int(*i)), + _ => None, + } + } + + pub fn obj_type(&self) -> Option { + match self.action { + OpType::Make(o) => Some(o), + _ => None, + } + } + + pub fn to_i64(&self) -> Option { + self.primitive_value().as_ref().and_then(|v| v.to_i64()) + } +} + +/// A change represents a group of operations performed by an actor. +#[derive(Deserialize, Serialize, Debug, Clone)] +pub struct Change { + /// The operations performed in this change. + #[serde(rename = "ops")] + pub operations: Vec, + /// The actor that performed this change. + #[serde(rename = "actor")] + pub actor_id: ActorId, + /// The hash of this change. + #[serde(skip_serializing_if = "Option::is_none", default)] + pub hash: Option, + /// The index of this change in the changes from this actor. + pub seq: u64, + /// The start operation index. Starts at 1. + #[serde(rename = "startOp")] + pub start_op: NonZeroU64, + /// The time that this change was committed. + pub time: i64, + /// The message of this change. + pub message: Option, + /// The dependencies of this change. + pub deps: Vec, + #[serde(skip_serializing_if = "Vec::is_empty", default = "Default::default")] + pub extra_bytes: Vec, +} + +impl PartialEq for Change { + // everything but hash (its computed and not always present) + fn eq(&self, other: &Self) -> bool { + self.operations == other.operations + && self.actor_id == other.actor_id + && self.seq == other.seq + && self.start_op == other.start_op + && self.time == other.time + && self.message == other.message + && self.deps == other.deps + && self.extra_bytes == other.extra_bytes + } +} diff --git a/automerge-protocol/src/serde_impls/actor_id.rs b/rust/automerge/src/legacy/serde_impls/actor_id.rs similarity index 100% rename from automerge-protocol/src/serde_impls/actor_id.rs rename to rust/automerge/src/legacy/serde_impls/actor_id.rs diff --git a/automerge-protocol/src/serde_impls/change_hash.rs b/rust/automerge/src/legacy/serde_impls/change_hash.rs similarity index 93% rename from automerge-protocol/src/serde_impls/change_hash.rs rename to rust/automerge/src/legacy/serde_impls/change_hash.rs index 4d637909..04b876af 100644 --- a/automerge-protocol/src/serde_impls/change_hash.rs +++ b/rust/automerge/src/legacy/serde_impls/change_hash.rs @@ -9,7 +9,7 @@ impl Serialize for ChangeHash { where S: Serializer, { - hex::encode(&self.0).serialize(serializer) + hex::encode(self.0).serialize(serializer) } } diff --git a/automerge-protocol/src/serde_impls/element_id.rs b/rust/automerge/src/legacy/serde_impls/element_id.rs similarity index 95% rename from automerge-protocol/src/serde_impls/element_id.rs rename to rust/automerge/src/legacy/serde_impls/element_id.rs index dd354b6f..abc1f964 100644 --- a/automerge-protocol/src/serde_impls/element_id.rs +++ b/rust/automerge/src/legacy/serde_impls/element_id.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::ElementId; +use crate::legacy::ElementId; impl Serialize for ElementId { fn serialize(&self, serializer: S) -> Result diff --git a/automerge-protocol/src/serde_impls/mod.rs b/rust/automerge/src/legacy/serde_impls/mod.rs similarity index 87% rename from automerge-protocol/src/serde_impls/mod.rs rename to rust/automerge/src/legacy/serde_impls/mod.rs index e0321c0e..11915020 100644 --- a/automerge-protocol/src/serde_impls/mod.rs +++ b/rust/automerge/src/legacy/serde_impls/mod.rs @@ -5,16 +5,11 @@ use serde::{ mod actor_id; mod change_hash; -mod cursor_diff; -mod diff; mod element_id; -mod key; -mod multi_element_insert; mod object_id; mod op; mod op_type; mod opid; -mod root_diff; mod scalar_value; // Helper method for use in custom deserialize impls diff --git a/automerge-protocol/src/serde_impls/object_id.rs b/rust/automerge/src/legacy/serde_impls/object_id.rs similarity index 96% rename from automerge-protocol/src/serde_impls/object_id.rs rename to rust/automerge/src/legacy/serde_impls/object_id.rs index 6b29cdb8..ba989eb7 100644 --- a/automerge-protocol/src/serde_impls/object_id.rs +++ b/rust/automerge/src/legacy/serde_impls/object_id.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::{ObjectId, OpId}; +use crate::legacy::{ObjectId, OpId}; impl Serialize for ObjectId { fn serialize(&self, serializer: S) -> Result diff --git a/automerge-protocol/src/serde_impls/op.rs b/rust/automerge/src/legacy/serde_impls/op.rs similarity index 68% rename from automerge-protocol/src/serde_impls/op.rs rename to rust/automerge/src/legacy/serde_impls/op.rs index beb99cc3..a3719fd6 100644 --- a/automerge-protocol/src/serde_impls/op.rs +++ b/rust/automerge/src/legacy/serde_impls/op.rs @@ -1,5 +1,3 @@ -use std::num::NonZeroU32; - use serde::{ de::{Error, MapAccess, Unexpected, Visitor}, ser::SerializeStruct, @@ -7,7 +5,7 @@ use serde::{ }; use super::read_field; -use crate::{DataType, Key, ObjType, ObjectId, Op, OpId, OpType, ScalarValue, ScalarValues}; +use crate::legacy::{DataType, Key, ObjType, ObjectId, Op, OpId, OpType, ScalarValue, SortedVec}; impl Serialize for Op { fn serialize(&self, serializer: S) -> Result @@ -21,8 +19,7 @@ impl Serialize for Op { } let numerical_datatype = match &self.action { - OpType::Set(value) => value.as_numerical_datatype(), - OpType::MultiSet(values) => values.as_numerical_datatype(), + OpType::Put(value) => value.as_numerical_datatype(), _ => None, }; @@ -50,11 +47,10 @@ impl Serialize for Op { op.serialize_field("datatype", &datatype)?; } match &self.action { - OpType::Inc(n) => op.serialize_field("value", &n)?, - OpType::Set(value) => op.serialize_field("value", &value)?, - OpType::MultiSet(values) => op.serialize_field("values", &values.vec)?, - OpType::Del(multi_op) => op.serialize_field("multiOp", &multi_op)?, - OpType::Make(..) => {} + OpType::Increment(n) => op.serialize_field("value", &n)?, + OpType::Put(ScalarValue::Counter(c)) => op.serialize_field("value", &c.start)?, + OpType::Put(value) => op.serialize_field("value", &value)?, + _ => {} } op.serialize_field("pred", &self.pred)?; op.end() @@ -67,7 +63,7 @@ impl Serialize for Op { // is the associated data // But we serialize `RawOpType` as a string, causing rmp-serde to choke on deserialization #[derive(PartialEq, Debug, Clone, Copy)] -pub enum RawOpType { +pub(crate) enum RawOpType { MakeMap, MakeTable, MakeList, @@ -108,6 +104,8 @@ impl<'de> Deserialize<'de> for RawOpType { "del", "inc", "set", + "mark", + "unmark", ]; // TODO: Probably more efficient to deserialize to a `&str` let raw_type = String::deserialize(deserializer)?; @@ -134,7 +132,7 @@ impl<'de> Deserialize<'de> for Op { impl<'de> Visitor<'de> for OperationVisitor { type Value = Op; - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { formatter.write_str("An operation object") } @@ -145,26 +143,38 @@ impl<'de> Deserialize<'de> for Op { let mut action: Option = None; let mut obj: Option = None; let mut key: Option = None; - let mut pred: Option> = None; + let mut pred: Option> = None; let mut insert: Option = None; let mut datatype: Option = None; let mut value: Option> = None; + let mut name: Option = None; + let mut expand: Option = None; let mut ref_id: Option = None; - let mut values: Option> = None; - let mut multi_op: Option = None; while let Some(field) = map.next_key::()? { match field.as_ref() { "action" => read_field("action", &mut action, &mut map)?, "obj" => read_field("obj", &mut obj, &mut map)?, - "key" => read_field("key", &mut key, &mut map)?, - "elemId" => read_field("elemId", &mut key, &mut map)?, + "key" => { + if key.is_some() { + return Err(Error::duplicate_field("key")); + } else { + key = Some(Key::Map(map.next_value()?)); + } + } + "elemId" => { + if key.is_some() { + return Err(Error::duplicate_field("elemId")); + } else { + key = Some(Key::Seq(map.next_value()?)) + } + } "pred" => read_field("pred", &mut pred, &mut map)?, "insert" => read_field("insert", &mut insert, &mut map)?, "datatype" => read_field("datatype", &mut datatype, &mut map)?, "value" => read_field("value", &mut value, &mut map)?, + "name" => read_field("name", &mut name, &mut map)?, + "expand" => read_field("expand", &mut expand, &mut map)?, "ref" => read_field("ref", &mut ref_id, &mut map)?, - "values" => read_field("values", &mut values, &mut map)?, - "multiOp" => read_field("multiOp", &mut multi_op, &mut map)?, _ => return Err(Error::unknown_field(&field, FIELDS)), } } @@ -178,52 +188,37 @@ impl<'de> Deserialize<'de> for Op { RawOpType::MakeTable => OpType::Make(ObjType::Table), RawOpType::MakeList => OpType::Make(ObjType::List), RawOpType::MakeText => OpType::Make(ObjType::Text), - RawOpType::Del => OpType::Del( - multi_op - .map(|i| NonZeroU32::new(i).unwrap()) - .unwrap_or_else(|| NonZeroU32::new(1).unwrap()), - ), + RawOpType::Del => OpType::Delete, RawOpType::Set => { - if let Some(values) = values { - let values = - ScalarValues::from_values_and_datatype::(values, datatype)?; - OpType::MultiSet(values) + let value = if let Some(datatype) = datatype { + let raw_value = value + .ok_or_else(|| Error::missing_field("value"))? + .unwrap_or(ScalarValue::Null); + raw_value.as_datatype(datatype).map_err(|e| { + Error::invalid_value( + Unexpected::Other(e.unexpected.as_str()), + &e.expected.as_str(), + ) + })? } else { - let value = if let Some(datatype) = datatype { - match datatype { - DataType::Cursor => match ref_id { - Some(opid) => ScalarValue::Cursor(opid), - None => return Err(Error::missing_field("ref")), - }, - _ => { - let raw_value = value - .ok_or_else(|| Error::missing_field("value"))? - .unwrap_or(ScalarValue::Null); - raw_value.as_datatype(datatype).map_err(|e| { - Error::invalid_value( - Unexpected::Other(e.unexpected.as_str()), - &e.expected.as_str(), - ) - })? - } - } - } else { - value - .ok_or_else(|| Error::missing_field("value"))? - .unwrap_or(ScalarValue::Null) - }; - OpType::Set(value) - } + value + .ok_or_else(|| Error::missing_field("value"))? + .unwrap_or(ScalarValue::Null) + }; + OpType::Put(value) } RawOpType::Inc => match value.flatten() { - Some(ScalarValue::Int(n)) => Ok(OpType::Inc(n)), - Some(ScalarValue::Uint(n)) => Ok(OpType::Inc(n as i64)), - Some(ScalarValue::F64(n)) => Ok(OpType::Inc(n as i64)), - Some(ScalarValue::Counter(n)) => Ok(OpType::Inc(n)), - Some(ScalarValue::Timestamp(n)) => Ok(OpType::Inc(n)), + Some(ScalarValue::Int(n)) => Ok(OpType::Increment(n)), + Some(ScalarValue::Uint(n)) => Ok(OpType::Increment(n as i64)), + Some(ScalarValue::F64(n)) => Ok(OpType::Increment(n as i64)), + Some(ScalarValue::Counter(n)) => Ok(OpType::Increment(n.into())), + Some(ScalarValue::Timestamp(n)) => Ok(OpType::Increment(n)), Some(ScalarValue::Bytes(s)) => { Err(Error::invalid_value(Unexpected::Bytes(&s), &"a number")) } + Some(ScalarValue::Unknown { bytes, .. }) => { + Err(Error::invalid_value(Unexpected::Bytes(&bytes), &"a number")) + } Some(ScalarValue::Str(s)) => { Err(Error::invalid_value(Unexpected::Str(&s), &"a number")) } @@ -233,10 +228,6 @@ impl<'de> Deserialize<'de> for Op { Some(ScalarValue::Null) => { Err(Error::invalid_value(Unexpected::Other("null"), &"a number")) } - Some(ScalarValue::Cursor(..)) => Err(Error::invalid_value( - Unexpected::Other("a cursor"), - &"a number", - )), None => Err(Error::missing_field("value")), }?, }; @@ -249,19 +240,19 @@ impl<'de> Deserialize<'de> for Op { }) } } - deserializer.deserialize_struct("Operation", &FIELDS, OperationVisitor) + deserializer.deserialize_struct("Operation", FIELDS, OperationVisitor) } } #[cfg(test)] mod tests { - use std::{convert::TryInto, str::FromStr}; + use std::str::FromStr; use super::*; + use crate::legacy as amp; #[test] fn test_deserialize_action() { - let actor = crate::ActorId::random(); struct Scenario { name: &'static str, json: serde_json::Value, @@ -279,11 +270,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Uint(123)), + action: OpType::Put(ScalarValue::Uint(123)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -297,11 +288,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Int(-123)), + action: OpType::Put(ScalarValue::Int(-123)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -315,11 +306,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::F64(-123.0)), + action: OpType::Put(ScalarValue::F64(-123.0)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: Vec::new().into(), }), }, Scenario { @@ -332,11 +323,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Str("somestring".to_string())), + action: OpType::Put(ScalarValue::Str("somestring".into())), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -349,11 +340,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::F64(1.23)), + action: OpType::Put(ScalarValue::F64(1.23)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -366,11 +357,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Boolean(true)), + action: OpType::Put(ScalarValue::Boolean(true)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -395,11 +386,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Counter(123)), + action: OpType::Put(ScalarValue::Counter(123.into())), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -443,11 +434,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -460,11 +451,11 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, Scenario { @@ -487,92 +478,13 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Set(ScalarValue::Null), + action: OpType::Put(ScalarValue::Null), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }), }, - Scenario { - name: "Set with cursor", - json: serde_json::json!({ - "action": "set", - "obj": "_root", - "key": "somekey", - "ref": actor.op_id_at(2).to_string(), - "datatype": "cursor", - "pred": [] - }), - expected: Ok(Op { - action: OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), - obj: ObjectId::Root, - key: "somekey".into(), - insert: false, - pred: Vec::new(), - }), - }, - Scenario { - name: "Set with cursor datatype but no ref", - json: serde_json::json!({ - "action": "set", - "obj": "_root", - "key": "somekey", - "datatype": "cursor", - "pred": [] - }), - expected: Err(serde_json::Error::missing_field("ref")), - }, - Scenario { - name: "Set with cursor datatype but ref which is not a valid object op ID", - json: serde_json::json!({ - "action": "set", - "obj": "_root", - "key": "somekey", - "ref": "blahblahblah", - "datatype": "cursor", - "pred": [] - }), - expected: Err(serde_json::Error::invalid_value( - Unexpected::Str("blahblahblah"), - &"A valid OpID", - )), - }, - Scenario { - name: "set with multiple values", - json: serde_json::json!({ - "action": "set", - "obj": "_root", - "key": "somekey", - "pred": [], - "values": ["one", "two"], - }), - expected: Ok(Op { - action: OpType::MultiSet({ - let one = ScalarValue::Str("one".into()); - let two = ScalarValue::Str("two".into()); - vec![one, two].try_into().unwrap() - }), - obj: ObjectId::Root, - key: "somekey".into(), - insert: false, - pred: Vec::new(), - }), - }, - Scenario { - name: "set with multiple non scalar values", - json: serde_json::json!({ - "action": "set", - "obj": "_root", - "key": "somekey", - "pred": [], - "values": ["one",{"two": 2}], - }), - expected: Err(Error::invalid_type( - Unexpected::Map, - &"a number, string, bool, or null", - )), - }, ]; for scenario in scenarios.into_iter() { @@ -613,7 +525,7 @@ mod tests { "pred": [] })) .unwrap(); - assert_eq!(root.obj, crate::ObjectId::Root); + assert_eq!(root.obj, amp::ObjectId::Root); let opid: Op = serde_json::from_value(serde_json::json!({ "action": "inc", @@ -625,7 +537,7 @@ mod tests { .unwrap(); assert_eq!( opid.obj, - crate::ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap() + amp::ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap() ); let invalid: Result = serde_json::from_value(serde_json::json!({ @@ -644,24 +556,24 @@ mod tests { #[test] fn test_serialize_key() { let map_key = Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }; let json = serde_json::to_value(map_key).unwrap(); let expected: serde_json::Value = "somekey".into(); assert_eq!(json.as_object().unwrap().get("key"), Some(&expected)); let elemid_key = Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::Root, key: OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716") .unwrap() .into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }; let json = serde_json::to_value(elemid_key).unwrap(); let expected: serde_json::Value = "1@7ef48769b04d47e9a88e98a134d62716".into(); @@ -672,54 +584,41 @@ mod tests { fn test_round_trips() { let testcases = vec![ Op { - action: OpType::Set(ScalarValue::Uint(12)), + action: OpType::Put(ScalarValue::Uint(12)), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }, Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }, Op { - action: OpType::Set(ScalarValue::Uint(12)), + action: OpType::Put(ScalarValue::Uint(12)), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: "somekey".into(), insert: false, - pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()], + pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()].into(), }, Op { - action: OpType::Inc(12), + action: OpType::Increment(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, - pred: Vec::new(), + pred: SortedVec::new(), }, Op { - action: OpType::Set("seomthing".into()), + action: OpType::Put("seomthing".into()), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716") .unwrap() .into(), insert: false, - pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()], - }, - Op { - action: OpType::MultiSet({ - let one = ScalarValue::Str("one".into()); - let two = ScalarValue::Str("two".into()); - vec![one, two].try_into().unwrap() - }), - obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), - key: OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716") - .unwrap() - .into(), - insert: true, - pred: Vec::new(), + pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()].into(), }, ]; for (testcase_num, testcase) in testcases.iter().enumerate() { diff --git a/automerge-protocol/src/serde_impls/op_type.rs b/rust/automerge/src/legacy/serde_impls/op_type.rs similarity index 80% rename from automerge-protocol/src/serde_impls/op_type.rs rename to rust/automerge/src/legacy/serde_impls/op_type.rs index 3f38f339..b054bad7 100644 --- a/automerge-protocol/src/serde_impls/op_type.rs +++ b/rust/automerge/src/legacy/serde_impls/op_type.rs @@ -15,10 +15,9 @@ impl Serialize for OpType { OpType::Make(ObjType::Table) => RawOpType::MakeTable, OpType::Make(ObjType::List) => RawOpType::MakeList, OpType::Make(ObjType::Text) => RawOpType::MakeText, - OpType::Del(..) => RawOpType::Del, - OpType::Inc(_) => RawOpType::Inc, - OpType::Set(_) => RawOpType::Set, - OpType::MultiSet(..) => RawOpType::Set, + OpType::Delete => RawOpType::Del, + OpType::Increment(_) => RawOpType::Inc, + OpType::Put(_) => RawOpType::Set, }; raw_type.serialize(serializer) } diff --git a/automerge-protocol/src/serde_impls/opid.rs b/rust/automerge/src/legacy/serde_impls/opid.rs similarity index 96% rename from automerge-protocol/src/serde_impls/opid.rs rename to rust/automerge/src/legacy/serde_impls/opid.rs index e071b8a7..06792cd4 100644 --- a/automerge-protocol/src/serde_impls/opid.rs +++ b/rust/automerge/src/legacy/serde_impls/opid.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::OpId; +use crate::legacy::OpId; impl<'de> Deserialize<'de> for OpId { fn deserialize(deserializer: D) -> Result diff --git a/automerge-protocol/src/serde_impls/scalar_value.rs b/rust/automerge/src/legacy/serde_impls/scalar_value.rs similarity index 92% rename from automerge-protocol/src/serde_impls/scalar_value.rs rename to rust/automerge/src/legacy/serde_impls/scalar_value.rs index 291a8908..b2a559ea 100644 --- a/automerge-protocol/src/serde_impls/scalar_value.rs +++ b/rust/automerge/src/legacy/serde_impls/scalar_value.rs @@ -1,6 +1,7 @@ use serde::{de, Deserialize, Deserializer}; +use smol_str::SmolStr; -use crate::ScalarValue; +use crate::types::ScalarValue; impl<'de> Deserialize<'de> for ScalarValue { fn deserialize(deserializer: D) -> Result @@ -11,7 +12,7 @@ impl<'de> Deserialize<'de> for ScalarValue { impl<'de> de::Visitor<'de> for ValueVisitor { type Value = ScalarValue; - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { formatter.write_str("a number, string, bool, or null") } @@ -47,7 +48,7 @@ impl<'de> Deserialize<'de> for ScalarValue { where E: de::Error, { - Ok(ScalarValue::Str(value.to_string())) + Ok(ScalarValue::Str(SmolStr::new(value))) } fn visit_none(self) -> Result diff --git a/automerge-protocol/src/utility_impls/element_id.rs b/rust/automerge/src/legacy/utility_impls/element_id.rs similarity index 91% rename from automerge-protocol/src/utility_impls/element_id.rs rename to rust/automerge/src/legacy/utility_impls/element_id.rs index 512c1794..623234f5 100644 --- a/automerge-protocol/src/utility_impls/element_id.rs +++ b/rust/automerge/src/legacy/utility_impls/element_id.rs @@ -1,10 +1,10 @@ use std::{ cmp::{Ordering, PartialOrd}, - convert::TryFrom, str::FromStr, }; -use crate::{error::InvalidElementId, ElementId, OpId}; +use crate::error::InvalidElementId; +use crate::legacy::{ElementId, OpId}; impl PartialOrd for ElementId { fn partial_cmp(&self, other: &Self) -> Option { @@ -60,7 +60,7 @@ impl std::fmt::Display for ElementId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { ElementId::Head => write!(f, "_head"), - ElementId::Id(id) => write!(f, "{}", id.to_string()), + ElementId::Id(id) => write!(f, "{}", id), } } } diff --git a/automerge-protocol/src/utility_impls/key.rs b/rust/automerge/src/legacy/utility_impls/key.rs similarity index 89% rename from automerge-protocol/src/utility_impls/key.rs rename to rust/automerge/src/legacy/utility_impls/key.rs index bbe864e9..ab9769f1 100644 --- a/automerge-protocol/src/utility_impls/key.rs +++ b/rust/automerge/src/legacy/utility_impls/key.rs @@ -1,6 +1,8 @@ use std::cmp::{Ordering, PartialOrd}; -use crate::{ElementId, Key, OpId}; +use smol_str::SmolStr; + +use crate::legacy::{ElementId, Key, OpId}; impl PartialOrd for Key { fn partial_cmp(&self, other: &Self) -> Option { @@ -42,6 +44,6 @@ where S: AsRef, { fn from(s: S) -> Self { - Key::Map(s.as_ref().to_string()) + Key::Map(SmolStr::new(s)) } } diff --git a/rust/automerge/src/legacy/utility_impls/mod.rs b/rust/automerge/src/legacy/utility_impls/mod.rs new file mode 100644 index 00000000..99fa1750 --- /dev/null +++ b/rust/automerge/src/legacy/utility_impls/mod.rs @@ -0,0 +1,4 @@ +mod element_id; +mod key; +mod object_id; +mod opid; diff --git a/automerge-protocol/src/utility_impls/object_id.rs b/rust/automerge/src/legacy/utility_impls/object_id.rs similarity index 95% rename from automerge-protocol/src/utility_impls/object_id.rs rename to rust/automerge/src/legacy/utility_impls/object_id.rs index 27bebcf4..c4f20f8c 100644 --- a/automerge-protocol/src/utility_impls/object_id.rs +++ b/rust/automerge/src/legacy/utility_impls/object_id.rs @@ -1,11 +1,11 @@ use std::{ cmp::{Ordering, PartialOrd}, - convert::TryFrom, fmt, str::FromStr, }; -use crate::{error::InvalidObjectId, ObjectId, OpId}; +use crate::error::InvalidObjectId; +use crate::legacy::{ObjectId, OpId}; impl PartialOrd for ObjectId { fn partial_cmp(&self, other: &Self) -> Option { diff --git a/automerge-protocol/src/utility_impls/opid.rs b/rust/automerge/src/legacy/utility_impls/opid.rs similarity index 95% rename from automerge-protocol/src/utility_impls/opid.rs rename to rust/automerge/src/legacy/utility_impls/opid.rs index f3ee9c43..aabdc67c 100644 --- a/automerge-protocol/src/utility_impls/opid.rs +++ b/rust/automerge/src/legacy/utility_impls/opid.rs @@ -1,11 +1,11 @@ use core::fmt; use std::{ cmp::{Ordering, PartialOrd}, - convert::TryFrom, str::FromStr, }; -use crate::{error::InvalidOpId, ActorId, OpId}; +use crate::error::InvalidOpId; +use crate::legacy::{ActorId, OpId}; impl Ord for OpId { fn cmp(&self, other: &Self) -> Ordering { diff --git a/rust/automerge/src/lib.rs b/rust/automerge/src/lib.rs new file mode 100644 index 00000000..cbb535af --- /dev/null +++ b/rust/automerge/src/lib.rs @@ -0,0 +1,301 @@ +//! # Automerge +//! +//! Automerge is a library of data structures for building collaborative, +//! [local-first](https://www.inkandswitch.com/local-first/) applications. The +//! idea of automerge is to provide a data structure which is quite general, +//! \- consisting of nested key/value maps and/or lists - which can be modified +//! entirely locally but which can at any time be merged with other instances of +//! the same data structure. +//! +//! In addition to the core data structure (which we generally refer to as a +//! "document"), we also provide an implementation of a sync protocol (in +//! [`crate::sync`]) which can be used over any reliable in-order transport; and +//! an efficient binary storage format. +//! +//! This crate is organised around two representations of a document - +//! [`Automerge`] and [`AutoCommit`]. The difference between the two is that +//! [`AutoCommit`] manages transactions for you. Both of these representations +//! implement [`ReadDoc`] for reading values from a document and +//! [`sync::SyncDoc`] for taking part in the sync protocol. [`AutoCommit`] +//! directly implements [`transaction::Transactable`] for making changes to a +//! document, whilst [`Automerge`] requires you to explicitly create a +//! [`transaction::Transaction`]. +//! +//! NOTE: The API this library provides for modifying data is quite low level +//! (somewhat analogous to directly creating JSON values rather than using +//! `serde` derive macros or equivalent). If you're writing a Rust application which uses automerge +//! you may want to look at [autosurgeon](https://github.com/automerge/autosurgeon). +//! +//! ## Data Model +//! +//! An automerge document is a map from strings to values +//! ([`Value`]) where values can be either +//! +//! * A nested composite value which is either +//! * A map from strings to values ([`ObjType::Map`]) +//! * A list of values ([`ObjType::List`]) +//! * A text object (a sequence of unicode characters) ([`ObjType::Text`]) +//! * A primitive value ([`ScalarValue`]) which is one of +//! * A string +//! * A 64 bit floating point number +//! * A signed 64 bit integer +//! * An unsigned 64 bit integer +//! * A boolean +//! * A counter object (a 64 bit integer which merges by addition) +//! ([`ScalarValue::Counter`]) +//! * A timestamp (a 64 bit integer which is milliseconds since the unix epoch) +//! +//! All composite values have an ID ([`ObjId`]) which is created when the value +//! is inserted into the document or is the root object ID [`ROOT`]. Values in +//! the document are then referred to by the pair (`object ID`, `key`). The +//! `key` is represented by the [`Prop`] type and is either a string for a maps, +//! or an index for sequences. +//! +//! ### Conflicts +//! +//! There are some things automerge cannot merge sensibly. For example, two +//! actors concurrently setting the key "name" to different values. In this case +//! automerge will pick a winning value in a random but deterministic way, but +//! the conflicting value is still available via the [`ReadDoc::get_all`] method. +//! +//! ### Change hashes and historical values +//! +//! Like git, points in the history of a document are identified by hash. Unlike +//! git there can be multiple hashes representing a particular point (because +//! automerge supports concurrent changes). These hashes can be obtained using +//! either [`Automerge::get_heads`] or [`AutoCommit::get_heads`] (note these +//! methods are not part of [`ReadDoc`] because in the case of [`AutoCommit`] it +//! requires a mutable reference to the document). +//! +//! These hashes can be used to read values from the document at a particular +//! point in history using the various `*_at` methods on [`ReadDoc`] which take a +//! slice of [`ChangeHash`] as an argument. +//! +//! ### Actor IDs +//! +//! Any change to an automerge document is made by an actor, represented by an +//! [`ActorId`]. An actor ID is any random sequence of bytes but each change by +//! the same actor ID must be sequential. This often means you will want to +//! maintain at least one actor ID per device. It is fine to generate a new +//! actor ID for each change, but be aware that each actor ID takes up space in +//! a document so if you expect a document to be long lived and/or to have many +//! changes then you should try to reuse actor IDs where possible. +//! +//! ### Text Encoding +//! +//! Both [`Automerge`] and [`AutoCommit`] provide a `with_encoding` method which +//! allows you to specify the [`crate::TextEncoding`] which is used for +//! interpreting the indexes passed to methods like [`ReadDoc::list_range`] or +//! [`transaction::Transactable::splice`]. The default encoding is UTF-8, but +//! you can switch to UTF-16. +//! +//! ## Sync Protocol +//! +//! See the [`sync`] module. +//! +//! ## Serde serialization +//! +//! Sometimes you just want to get the JSON value of an automerge document. For +//! this you can use [`AutoSerde`], which implements `serde::Serialize` for an +//! automerge document. +//! +//! ## Example +//! +//! Let's create a document representing an address book. +//! +//! ``` +//! use automerge::{ObjType, AutoCommit, transaction::Transactable, ReadDoc}; +//! +//! # fn main() -> Result<(), Box> { +//! let mut doc = AutoCommit::new(); +//! +//! // `put_object` creates a nested object in the root key/value map and +//! // returns the ID of the new object, in this case a list. +//! let contacts = doc.put_object(automerge::ROOT, "contacts", ObjType::List)?; +//! +//! // Now we can insert objects into the list +//! let alice = doc.insert_object(&contacts, 0, ObjType::Map)?; +//! +//! // Finally we can set keys in the "alice" map +//! doc.put(&alice, "name", "Alice")?; +//! doc.put(&alice, "email", "alice@example.com")?; +//! +//! // Create another contact +//! let bob = doc.insert_object(&contacts, 1, ObjType::Map)?; +//! doc.put(&bob, "name", "Bob")?; +//! doc.put(&bob, "email", "bob@example.com")?; +//! +//! // Now we save the address book, we can put this in a file +//! let data: Vec = doc.save(); +//! # Ok(()) +//! # } +//! ``` +//! +//! Now modify this document on two separate devices and merge the modifications. +//! +//! ``` +//! use std::borrow::Cow; +//! use automerge::{ObjType, AutoCommit, transaction::Transactable, ReadDoc}; +//! +//! # fn main() -> Result<(), Box> { +//! # let mut doc = AutoCommit::new(); +//! # let contacts = doc.put_object(automerge::ROOT, "contacts", ObjType::List)?; +//! # let alice = doc.insert_object(&contacts, 0, ObjType::Map)?; +//! # doc.put(&alice, "name", "Alice")?; +//! # doc.put(&alice, "email", "alice@example.com")?; +//! # let bob = doc.insert_object(&contacts, 1, ObjType::Map)?; +//! # doc.put(&bob, "name", "Bob")?; +//! # doc.put(&bob, "email", "bob@example.com")?; +//! # let saved: Vec = doc.save(); +//! +//! // Load the document on the first device and change alices email +//! let mut doc1 = AutoCommit::load(&saved)?; +//! let contacts = match doc1.get(automerge::ROOT, "contacts")? { +//! Some((automerge::Value::Object(ObjType::List), contacts)) => contacts, +//! _ => panic!("contacts should be a list"), +//! }; +//! let alice = match doc1.get(&contacts, 0)? { +//! Some((automerge::Value::Object(ObjType::Map), alice)) => alice, +//! _ => panic!("alice should be a map"), +//! }; +//! doc1.put(&alice, "email", "alicesnewemail@example.com")?; +//! +//! +//! // Load the document on the second device and change bobs name +//! let mut doc2 = AutoCommit::load(&saved)?; +//! let contacts = match doc2.get(automerge::ROOT, "contacts")? { +//! Some((automerge::Value::Object(ObjType::List), contacts)) => contacts, +//! _ => panic!("contacts should be a list"), +//! }; +//! let bob = match doc2.get(&contacts, 1)? { +//! Some((automerge::Value::Object(ObjType::Map), bob)) => bob, +//! _ => panic!("bob should be a map"), +//! }; +//! doc2.put(&bob, "name", "Robert")?; +//! +//! // Finally, we can merge the changes from the two devices +//! doc1.merge(&mut doc2)?; +//! let bobsname: Option = doc1.get(&bob, "name")?.map(|(v, _)| v); +//! assert_eq!(bobsname, Some(automerge::Value::Scalar(Cow::Owned("Robert".into())))); +//! +//! let alices_email: Option = doc1.get(&alice, "email")?.map(|(v, _)| v); +//! assert_eq!(alices_email, Some(automerge::Value::Scalar(Cow::Owned("alicesnewemail@example.com".into())))); +//! # Ok(()) +//! # } +//! ``` +//! + +#![doc( + html_logo_url = "https://raw.githubusercontent.com/automerge/automerge-rs/main/img/brandmark.svg", + html_favicon_url = "https:///raw.githubusercontent.com/automerge/automerge-rs/main/img/favicon.ico" +)] +#![warn( + missing_debug_implementations, + // missing_docs, // TODO: add documentation! + rust_2018_idioms, + unreachable_pub, + bad_style, + dead_code, + improper_ctypes, + non_shorthand_field_patterns, + no_mangle_generic_items, + overflowing_literals, + path_statements, + patterns_in_fns_without_body, + private_in_public, + unconditional_recursion, + unused, + unused_allocation, + unused_comparisons, + unused_parens, + while_true +)] + +#[doc(hidden)] +#[macro_export] +macro_rules! log { + ( $( $t:tt )* ) => { + { + use $crate::__log; + __log!( $( $t )* ); + } + } + } + +#[cfg(all(feature = "wasm", target_family = "wasm"))] +#[doc(hidden)] +#[macro_export] +macro_rules! __log { + ( $( $t:tt )* ) => { + web_sys::console::log_1(&format!( $( $t )* ).into()); + } + } + +#[cfg(not(all(feature = "wasm", target_family = "wasm")))] +#[doc(hidden)] +#[macro_export] +macro_rules! __log { + ( $( $t:tt )* ) => { + println!( $( $t )* ); + } + } + +mod autocommit; +mod automerge; +mod autoserde; +mod change; +mod change_graph; +mod clock; +mod columnar; +mod convert; +mod error; +mod exid; +mod indexed_cache; +mod keys; +mod keys_at; +mod legacy; +mod list_range; +mod list_range_at; +mod map_range; +mod map_range_at; +pub mod op_observer; +mod op_set; +mod op_tree; +mod parents; +mod query; +mod read; +mod storage; +pub mod sync; +pub mod transaction; +mod types; +mod value; +mod values; +#[cfg(feature = "optree-visualisation")] +mod visualisation; + +pub use crate::automerge::{Automerge, OnPartialLoad}; +pub use autocommit::{AutoCommit, AutoCommitWithObs}; +pub use autoserde::AutoSerde; +pub use change::{Change, LoadError as LoadChangeError}; +pub use error::AutomergeError; +pub use error::InvalidActorId; +pub use error::InvalidChangeHashSlice; +pub use exid::{ExId as ObjId, ObjIdFromBytesError}; +pub use keys::Keys; +pub use keys_at::KeysAt; +pub use legacy::Change as ExpandedChange; +pub use list_range::ListRange; +pub use list_range_at::ListRangeAt; +pub use map_range::MapRange; +pub use map_range_at::MapRangeAt; +pub use op_observer::OpObserver; +pub use op_observer::Patch; +pub use op_observer::VecOpObserver; +pub use parents::{Parent, Parents}; +pub use read::ReadDoc; +pub use types::{ActorId, ChangeHash, ObjType, OpType, ParseChangeHashError, Prop, TextEncoding}; +pub use value::{ScalarValue, Value}; +pub use values::Values; + +/// The object ID for the root map of a document +pub const ROOT: ObjId = ObjId::Root; diff --git a/rust/automerge/src/list_range.rs b/rust/automerge/src/list_range.rs new file mode 100644 index 00000000..a043da72 --- /dev/null +++ b/rust/automerge/src/list_range.rs @@ -0,0 +1,30 @@ +use crate::{exid::ExId, Value}; + +use crate::{query, Automerge}; +use std::ops::RangeBounds; + +/// An iterator over the elements of a list object +/// +/// This is returned by the [`crate::ReadDoc::list_range`] method +#[derive(Debug)] +pub struct ListRange<'a, R: RangeBounds> { + range: Option>, + doc: &'a Automerge, +} + +impl<'a, R: RangeBounds> ListRange<'a, R> { + pub(crate) fn new(doc: &'a Automerge, range: Option>) -> Self { + Self { range, doc } + } +} + +impl<'a, R: RangeBounds> Iterator for ListRange<'a, R> { + type Item = (usize, Value<'a>, ExId); + + fn next(&mut self) -> Option { + self.range + .as_mut()? + .next() + .map(|(idx, value, id)| (idx, value, self.doc.id_to_exid(id))) + } +} diff --git a/rust/automerge/src/list_range_at.rs b/rust/automerge/src/list_range_at.rs new file mode 100644 index 00000000..ce8f5a46 --- /dev/null +++ b/rust/automerge/src/list_range_at.rs @@ -0,0 +1,30 @@ +use crate::{exid::ExId, Value}; +use std::ops::RangeBounds; + +use crate::{query, Automerge}; + +/// An iterator over the elements of a list object at a particular set of heads +/// +/// This is returned by the [`crate::ReadDoc::list_range_at`] method +#[derive(Debug)] +pub struct ListRangeAt<'a, R: RangeBounds> { + range: Option>, + doc: &'a Automerge, +} + +impl<'a, R: RangeBounds> ListRangeAt<'a, R> { + pub(crate) fn new(doc: &'a Automerge, range: Option>) -> Self { + Self { range, doc } + } +} + +impl<'a, R: RangeBounds> Iterator for ListRangeAt<'a, R> { + type Item = (usize, Value<'a>, ExId); + + fn next(&mut self) -> Option { + self.range + .as_mut()? + .next() + .map(|(key, value, id)| (key, value, self.doc.id_to_exid(id))) + } +} diff --git a/rust/automerge/src/map_range.rs b/rust/automerge/src/map_range.rs new file mode 100644 index 00000000..ad33ebf5 --- /dev/null +++ b/rust/automerge/src/map_range.rs @@ -0,0 +1,39 @@ +use crate::{exid::ExId, Value}; +use std::ops::RangeBounds; + +use crate::{query, Automerge}; + +/// An iterator over the keys and values of a map object +/// +/// This is returned by the [`crate::ReadDoc::map_range`] method +#[derive(Debug)] +pub struct MapRange<'a, R: RangeBounds> { + range: Option>, + doc: &'a Automerge, +} + +impl<'a, R: RangeBounds> MapRange<'a, R> { + pub(crate) fn new(doc: &'a Automerge, range: Option>) -> Self { + Self { range, doc } + } +} + +impl<'a, R: RangeBounds> Iterator for MapRange<'a, R> { + type Item = (&'a str, Value<'a>, ExId); + + fn next(&mut self) -> Option { + self.range + .as_mut()? + .next() + .map(|(key, value, id)| (key, value, self.doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> DoubleEndedIterator for MapRange<'a, R> { + fn next_back(&mut self) -> Option { + self.range + .as_mut()? + .next_back() + .map(|(key, value, id)| (key, value, self.doc.id_to_exid(id))) + } +} diff --git a/rust/automerge/src/map_range_at.rs b/rust/automerge/src/map_range_at.rs new file mode 100644 index 00000000..8d008e89 --- /dev/null +++ b/rust/automerge/src/map_range_at.rs @@ -0,0 +1,39 @@ +use crate::{exid::ExId, Value}; +use std::ops::RangeBounds; + +use crate::{query, Automerge}; + +/// An iterator over the keys and values of a map object as at a particuar heads +/// +/// This is returned by the [`crate::ReadDoc::map_range_at`] method +#[derive(Debug)] +pub struct MapRangeAt<'a, R: RangeBounds> { + range: Option>, + doc: &'a Automerge, +} + +impl<'a, R: RangeBounds> MapRangeAt<'a, R> { + pub(crate) fn new(doc: &'a Automerge, range: Option>) -> Self { + Self { range, doc } + } +} + +impl<'a, R: RangeBounds> Iterator for MapRangeAt<'a, R> { + type Item = (&'a str, Value<'a>, ExId); + + fn next(&mut self) -> Option { + self.range + .as_mut()? + .next() + .map(|(key, value, id)| (key, value, self.doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> DoubleEndedIterator for MapRangeAt<'a, R> { + fn next_back(&mut self) -> Option { + self.range + .as_mut()? + .next_back() + .map(|(key, value, id)| (key, value, self.doc.id_to_exid(id))) + } +} diff --git a/rust/automerge/src/op_observer.rs b/rust/automerge/src/op_observer.rs new file mode 100644 index 00000000..5b33c21f --- /dev/null +++ b/rust/automerge/src/op_observer.rs @@ -0,0 +1,392 @@ +use crate::exid::ExId; +use crate::Prop; +use crate::ReadDoc; +use crate::Value; + +mod compose; +pub use compose::compose; + +/// An observer of operations applied to the document. +pub trait OpObserver { + /// A new value has been inserted into the given object. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been inserted into. + /// - `index`: the index the new value has been inserted at. + /// - `tagged_value`: the value that has been inserted and the id of the operation that did the + /// insert. + fn insert( + &mut self, + doc: &R, + objid: ExId, + index: usize, + tagged_value: (Value<'_>, ExId), + ); + + /// Some text has been spliced into a text object + fn splice_text(&mut self, _doc: &R, _objid: ExId, _index: usize, _value: &str); + + /// A new value has been put into the given object. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been put into. + /// - `prop`: the prop that the value as been put at. + /// - `tagged_value`: the value that has been put into the object and the id of the operation + /// that did the put. + /// - `conflict`: whether this put conflicts with other operations. + fn put( + &mut self, + doc: &R, + objid: ExId, + prop: Prop, + tagged_value: (Value<'_>, ExId), + conflict: bool, + ); + + /// When a delete op exposes a previously conflicted value + /// Similar to a put op - except for maps, lists and text, edits + /// may already exist and need to be queried + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been put into. + /// - `prop`: the prop that the value as been put at. + /// - `tagged_value`: the value that has been put into the object and the id of the operation + /// that did the put. + /// - `conflict`: whether this put conflicts with other operations. + fn expose( + &mut self, + doc: &R, + objid: ExId, + prop: Prop, + tagged_value: (Value<'_>, ExId), + conflict: bool, + ); + + /// Flag a new conflict on a value without changing it + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been put into. + /// - `prop`: the prop that the value as been put at. + fn flag_conflict(&mut self, _doc: &R, _objid: ExId, _prop: Prop) {} + + /// A counter has been incremented. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that contains the counter. + /// - `prop`: they prop that the chounter is at. + /// - `tagged_value`: the amount the counter has been incremented by, and the the id of the + /// increment operation. + fn increment( + &mut self, + doc: &R, + objid: ExId, + prop: Prop, + tagged_value: (i64, ExId), + ); + + /// A map value has beeen deleted. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been deleted in. + /// - `prop`: the prop to be deleted + fn delete(&mut self, doc: &R, objid: ExId, prop: Prop) { + match prop { + Prop::Map(k) => self.delete_map(doc, objid, &k), + Prop::Seq(i) => self.delete_seq(doc, objid, i, 1), + } + } + + /// A map value has beeen deleted. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been deleted in. + /// - `key`: the map key to be deleted + fn delete_map(&mut self, doc: &R, objid: ExId, key: &str); + + /// A one or more list values have beeen deleted. + /// + /// - `doc`: a handle to the doc after the op has been inserted, can be used to query information + /// - `objid`: the object that has been deleted in. + /// - `index`: the index of the deletion + /// - `num`: the number of sequential elements deleted + fn delete_seq(&mut self, doc: &R, objid: ExId, index: usize, num: usize); + + /// Whether to call sequence methods or `splice_text` when encountering changes in text + /// + /// Returns `false` by default + fn text_as_seq(&self) -> bool { + false + } +} + +/// An observer which can be branched +/// +/// This is used when observing operations in a transaction. In this case `branch` will be called +/// at the beginning of the transaction to return a new observer and then `merge` will be called +/// with the branched observer as `other` when the transaction is comitted. +pub trait BranchableObserver { + /// Branch of a new op_observer later to be merged + /// + /// Called when creating a new transaction. Observer branch will be merged on `commit()` or + /// thrown away on `rollback()` + fn branch(&self) -> Self; + + /// Merge observed information from a transaction. + /// + /// Called by AutoCommit on `commit()` + /// + /// - `other`: Another Op Observer of the same type + fn merge(&mut self, other: &Self); +} + +impl OpObserver for () { + fn insert( + &mut self, + _doc: &R, + _objid: ExId, + _index: usize, + _tagged_value: (Value<'_>, ExId), + ) { + } + + fn splice_text(&mut self, _doc: &R, _objid: ExId, _index: usize, _value: &str) {} + + fn put( + &mut self, + _doc: &R, + _objid: ExId, + _prop: Prop, + _tagged_value: (Value<'_>, ExId), + _conflict: bool, + ) { + } + + fn expose( + &mut self, + _doc: &R, + _objid: ExId, + _prop: Prop, + _tagged_value: (Value<'_>, ExId), + _conflict: bool, + ) { + } + + fn increment( + &mut self, + _doc: &R, + _objid: ExId, + _prop: Prop, + _tagged_value: (i64, ExId), + ) { + } + + fn delete_map(&mut self, _doc: &R, _objid: ExId, _key: &str) {} + + fn delete_seq(&mut self, _doc: &R, _objid: ExId, _index: usize, _num: usize) {} +} + +impl BranchableObserver for () { + fn merge(&mut self, _other: &Self) {} + fn branch(&self) -> Self {} +} + +/// Capture operations into a [`Vec`] and store them as patches. +#[derive(Default, Debug, Clone)] +pub struct VecOpObserver { + patches: Vec, +} + +impl VecOpObserver { + /// Take the current list of patches, leaving the internal list empty and ready for new + /// patches. + pub fn take_patches(&mut self) -> Vec { + std::mem::take(&mut self.patches) + } +} + +impl OpObserver for VecOpObserver { + fn insert( + &mut self, + doc: &R, + obj: ExId, + index: usize, + (value, id): (Value<'_>, ExId), + ) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Insert { + obj, + path: p.path(), + index, + value: (value.into_owned(), id), + }); + } + } + + fn splice_text(&mut self, doc: &R, obj: ExId, index: usize, value: &str) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Splice { + obj, + path: p.path(), + index, + value: value.to_string(), + }) + } + } + + fn put( + &mut self, + doc: &R, + obj: ExId, + prop: Prop, + (value, id): (Value<'_>, ExId), + conflict: bool, + ) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Put { + obj, + path: p.path(), + prop, + value: (value.into_owned(), id), + conflict, + }); + } + } + + fn expose( + &mut self, + doc: &R, + obj: ExId, + prop: Prop, + (value, id): (Value<'_>, ExId), + conflict: bool, + ) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Expose { + obj, + path: p.path(), + prop, + value: (value.into_owned(), id), + conflict, + }); + } + } + + fn increment(&mut self, doc: &R, obj: ExId, prop: Prop, tagged_value: (i64, ExId)) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Increment { + obj, + path: p.path(), + prop, + value: tagged_value, + }); + } + } + + fn delete_map(&mut self, doc: &R, obj: ExId, key: &str) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Delete { + obj, + path: p.path(), + prop: Prop::Map(key.to_owned()), + num: 1, + }) + } + } + + fn delete_seq(&mut self, doc: &R, obj: ExId, index: usize, num: usize) { + if let Ok(p) = doc.parents(&obj) { + self.patches.push(Patch::Delete { + obj, + path: p.path(), + prop: Prop::Seq(index), + num, + }) + } + } +} + +impl BranchableObserver for VecOpObserver { + fn merge(&mut self, other: &Self) { + self.patches.extend_from_slice(other.patches.as_slice()) + } + + fn branch(&self) -> Self { + Self::default() + } +} + +/// A notification to the application that something has changed in a document. +#[derive(Debug, Clone, PartialEq)] +pub enum Patch { + /// Associating a new value with a prop in a map, or an existing list element + Put { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was put into. + obj: ExId, + /// The prop that the new value was put at. + prop: Prop, + /// The value that was put, and the id of the operation that put it there. + value: (Value<'static>, ExId), + /// Whether this put conflicts with another. + conflict: bool, + }, + /// Exposing (via delete) an old but conflicted value with a prop in a map, or a list element + Expose { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was put into. + obj: ExId, + /// The prop that the new value was put at. + prop: Prop, + /// The value that was put, and the id of the operation that put it there. + value: (Value<'static>, ExId), + /// Whether this put conflicts with another. + conflict: bool, + }, + /// Inserting a new element into a list + Insert { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was inserted into. + obj: ExId, + /// The index that the new value was inserted at. + index: usize, + /// The value that was inserted, and the id of the operation that inserted it there. + value: (Value<'static>, ExId), + }, + /// Splicing a text object + Splice { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was inserted into. + obj: ExId, + /// The index that the new value was inserted at. + index: usize, + /// The value that was spliced + value: String, + }, + /// Incrementing a counter. + Increment { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was incremented in. + obj: ExId, + /// The prop that was incremented. + prop: Prop, + /// The amount that the counter was incremented by, and the id of the operation that + /// did the increment. + value: (i64, ExId), + }, + /// Deleting an element from a list/text + Delete { + /// path to the object + path: Vec<(ExId, Prop)>, + /// The object that was deleted from. + obj: ExId, + /// The prop that was deleted. + prop: Prop, + /// number of items deleted (for seq) + num: usize, + }, +} diff --git a/rust/automerge/src/op_observer/compose.rs b/rust/automerge/src/op_observer/compose.rs new file mode 100644 index 00000000..92fe3b1e --- /dev/null +++ b/rust/automerge/src/op_observer/compose.rs @@ -0,0 +1,102 @@ +use super::OpObserver; + +pub fn compose<'a, O1: OpObserver, O2: OpObserver>( + obs1: &'a mut O1, + obs2: &'a mut O2, +) -> impl OpObserver + 'a { + ComposeObservers { obs1, obs2 } +} + +struct ComposeObservers<'a, O1: OpObserver, O2: OpObserver> { + obs1: &'a mut O1, + obs2: &'a mut O2, +} + +impl<'a, O1: OpObserver, O2: OpObserver> OpObserver for ComposeObservers<'a, O1, O2> { + fn insert( + &mut self, + doc: &R, + objid: crate::ObjId, + index: usize, + tagged_value: (crate::Value<'_>, crate::ObjId), + ) { + self.obs1 + .insert(doc, objid.clone(), index, tagged_value.clone()); + self.obs2.insert(doc, objid, index, tagged_value); + } + + fn splice_text( + &mut self, + doc: &R, + objid: crate::ObjId, + index: usize, + value: &str, + ) { + self.obs1.splice_text(doc, objid.clone(), index, value); + self.obs2.splice_text(doc, objid, index, value); + } + + fn put( + &mut self, + doc: &R, + objid: crate::ObjId, + prop: crate::Prop, + tagged_value: (crate::Value<'_>, crate::ObjId), + conflict: bool, + ) { + self.obs1.put( + doc, + objid.clone(), + prop.clone(), + tagged_value.clone(), + conflict, + ); + self.obs2.put(doc, objid, prop, tagged_value, conflict); + } + + fn expose( + &mut self, + doc: &R, + objid: crate::ObjId, + prop: crate::Prop, + tagged_value: (crate::Value<'_>, crate::ObjId), + conflict: bool, + ) { + self.obs1.expose( + doc, + objid.clone(), + prop.clone(), + tagged_value.clone(), + conflict, + ); + self.obs2.expose(doc, objid, prop, tagged_value, conflict); + } + + fn increment( + &mut self, + doc: &R, + objid: crate::ObjId, + prop: crate::Prop, + tagged_value: (i64, crate::ObjId), + ) { + self.obs1 + .increment(doc, objid.clone(), prop.clone(), tagged_value.clone()); + self.obs2.increment(doc, objid, prop, tagged_value); + } + + fn delete_map(&mut self, doc: &R, objid: crate::ObjId, key: &str) { + self.obs1.delete_map(doc, objid.clone(), key); + self.obs2.delete_map(doc, objid, key); + } + + fn delete_seq( + &mut self, + doc: &R, + objid: crate::ObjId, + index: usize, + num: usize, + ) { + self.obs2.delete_seq(doc, objid.clone(), index, num); + self.obs2.delete_seq(doc, objid, index, num); + } +} diff --git a/rust/automerge/src/op_set.rs b/rust/automerge/src/op_set.rs new file mode 100644 index 00000000..aab8ce74 --- /dev/null +++ b/rust/automerge/src/op_set.rs @@ -0,0 +1,405 @@ +use crate::clock::Clock; +use crate::exid::ExId; +use crate::indexed_cache::IndexedCache; +use crate::op_tree::{self, OpTree}; +use crate::parents::Parents; +use crate::query::{self, OpIdVisSearch, TreeQuery}; +use crate::types::{self, ActorId, Key, ListEncoding, ObjId, Op, OpId, OpIds, OpType, Prop}; +use crate::ObjType; +use fxhash::FxBuildHasher; +use std::borrow::Borrow; +use std::cmp::Ordering; +use std::collections::HashMap; +use std::ops::RangeBounds; + +mod load; +pub(crate) use load::OpSetBuilder; + +pub(crate) type OpSet = OpSetInternal; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct OpSetInternal { + /// The map of objects to their type and ops. + trees: HashMap, + /// The number of operations in the opset. + length: usize, + /// Metadata about the operations in this opset. + pub(crate) m: OpSetMetadata, +} + +impl OpSetInternal { + pub(crate) fn builder() -> OpSetBuilder { + OpSetBuilder::new() + } + + pub(crate) fn new() -> Self { + let mut trees: HashMap<_, _, _> = Default::default(); + trees.insert(ObjId::root(), OpTree::new()); + OpSetInternal { + trees, + length: 0, + m: OpSetMetadata { + actors: IndexedCache::new(), + props: IndexedCache::new(), + }, + } + } + + pub(crate) fn id_to_exid(&self, id: OpId) -> ExId { + if id == types::ROOT { + ExId::Root + } else { + ExId::Id( + id.counter(), + self.m.actors.cache[id.actor()].clone(), + id.actor(), + ) + } + } + + pub(crate) fn iter(&self) -> Iter<'_> { + let mut objs: Vec<_> = self.trees.iter().map(|t| (t.0, t.1.objtype, t.1)).collect(); + objs.sort_by(|a, b| self.m.lamport_cmp((a.0).0, (b.0).0)); + Iter { + opset: self, + trees: objs.into_iter(), + current: None, + } + } + + /// Iterate over objects in the opset in causal order + pub(crate) fn iter_objs( + &self, + ) -> impl Iterator)> + '_ { + let mut objs: Vec<_> = self.trees.iter().map(|t| (t.0, t.1.objtype, t.1)).collect(); + objs.sort_by(|a, b| self.m.lamport_cmp((a.0).0, (b.0).0)); + IterObjs { + trees: objs.into_iter(), + } + } + + pub(crate) fn parents(&self, obj: ObjId) -> Parents<'_> { + Parents { obj, ops: self } + } + + pub(crate) fn parent_object(&self, obj: &ObjId) -> Option { + let parent = self.trees.get(obj)?.parent?; + let query = self.search(&parent, OpIdVisSearch::new(obj.0)); + let key = query.key().unwrap(); + let visible = query.visible; + Some(Parent { + obj: parent, + key, + visible, + }) + } + + pub(crate) fn export_key(&self, obj: ObjId, key: Key, encoding: ListEncoding) -> Option { + match key { + Key::Map(m) => self.m.props.safe_get(m).map(|s| Prop::Map(s.to_string())), + Key::Seq(opid) => { + if opid.is_head() { + Some(Prop::Seq(0)) + } else { + self.search(&obj, query::ElemIdPos::new(opid, encoding)) + .index() + .map(Prop::Seq) + } + } + } + } + + pub(crate) fn keys(&self, obj: ObjId) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.keys() + } else { + None + } + } + + pub(crate) fn keys_at(&self, obj: ObjId, clock: Clock) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.keys_at(clock) + } else { + None + } + } + + pub(crate) fn map_range>( + &self, + obj: ObjId, + range: R, + ) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.map_range(range, &self.m) + } else { + None + } + } + + pub(crate) fn map_range_at>( + &self, + obj: ObjId, + range: R, + clock: Clock, + ) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.map_range_at(range, &self.m, clock) + } else { + None + } + } + + pub(crate) fn list_range>( + &self, + obj: ObjId, + range: R, + ) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.list_range(range) + } else { + None + } + } + + pub(crate) fn list_range_at>( + &self, + obj: ObjId, + range: R, + clock: Clock, + ) -> Option> { + if let Some(tree) = self.trees.get(&obj) { + tree.internal.list_range_at(range, clock) + } else { + None + } + } + + pub(crate) fn search<'a, 'b: 'a, Q>(&'b self, obj: &ObjId, mut query: Q) -> Q + where + Q: TreeQuery<'a>, + { + if let Some(tree) = self.trees.get(obj) { + if query.can_shortcut_search(tree) { + query + } else { + tree.internal.search(query, &self.m) + } + } else { + query + } + } + + pub(crate) fn change_vis(&mut self, obj: &ObjId, index: usize, f: F) + where + F: Fn(&mut Op), + { + if let Some(tree) = self.trees.get_mut(obj) { + tree.last_insert = None; + tree.internal.update(index, f) + } + } + + /// Add `op` as a successor to each op at `op_indices` in `obj` + pub(crate) fn add_succ(&mut self, obj: &ObjId, op_indices: &[usize], op: &Op) { + if let Some(tree) = self.trees.get_mut(obj) { + tree.last_insert = None; + for i in op_indices { + tree.internal.update(*i, |old_op| { + old_op.add_succ(op, |left, right| self.m.lamport_cmp(*left, *right)) + }); + } + } + } + + pub(crate) fn remove(&mut self, obj: &ObjId, index: usize) -> Op { + // this happens on rollback - be sure to go back to the old state + let tree = self.trees.get_mut(obj).unwrap(); + self.length -= 1; + tree.last_insert = None; + let op = tree.internal.remove(index); + if let OpType::Make(_) = &op.action { + self.trees.remove(&op.id.into()); + } + op + } + + pub(crate) fn len(&self) -> usize { + self.length + } + + pub(crate) fn hint(&mut self, obj: &ObjId, index: usize, pos: usize) { + if let Some(tree) = self.trees.get_mut(obj) { + tree.last_insert = Some((index, pos)) + } + } + + #[tracing::instrument(skip(self, index))] + pub(crate) fn insert(&mut self, index: usize, obj: &ObjId, element: Op) { + if let OpType::Make(typ) = element.action { + self.trees.insert( + element.id.into(), + OpTree { + internal: Default::default(), + objtype: typ, + last_insert: None, + parent: Some(*obj), + }, + ); + } + + if let Some(tree) = self.trees.get_mut(obj) { + tree.last_insert = None; + tree.internal.insert(index, element); + self.length += 1; + } else { + tracing::warn!("attempting to insert op for unknown object"); + } + } + + pub(crate) fn object_type(&self, id: &ObjId) -> Option { + self.trees.get(id).map(|tree| tree.objtype) + } + + /// Return a graphviz representation of the opset. + /// + /// # Arguments + /// + /// * objects: An optional list of object IDs to display, if not specified all objects are + /// visualised + #[cfg(feature = "optree-visualisation")] + pub(crate) fn visualise(&self, objects: Option>) -> String { + use std::borrow::Cow; + let mut out = Vec::new(); + let trees = if let Some(objects) = objects { + let mut filtered = self.trees.clone(); + filtered.retain(|k, _| objects.contains(k)); + Cow::Owned(filtered) + } else { + Cow::Borrowed(&self.trees) + }; + let graph = super::visualisation::GraphVisualisation::construct(&trees, &self.m); + dot::render(&graph, &mut out).unwrap(); + String::from_utf8_lossy(&out[..]).to_string() + } +} + +impl Default for OpSetInternal { + fn default() -> Self { + Self::new() + } +} + +impl<'a> IntoIterator for &'a OpSetInternal { + type Item = (&'a ObjId, ObjType, &'a Op); + + type IntoIter = Iter<'a>; + + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + +pub(crate) struct IterObjs<'a> { + trees: std::vec::IntoIter<(&'a ObjId, ObjType, &'a op_tree::OpTree)>, +} + +impl<'a> Iterator for IterObjs<'a> { + type Item = (&'a ObjId, ObjType, op_tree::OpTreeIter<'a>); + + fn next(&mut self) -> Option { + self.trees + .next() + .map(|(id, typ, tree)| (id, typ, tree.iter())) + } +} + +#[derive(Clone)] +pub(crate) struct Iter<'a> { + opset: &'a OpSet, + trees: std::vec::IntoIter<(&'a ObjId, ObjType, &'a op_tree::OpTree)>, + current: Option<(&'a ObjId, ObjType, op_tree::OpTreeIter<'a>)>, +} +impl<'a> Iterator for Iter<'a> { + type Item = (&'a ObjId, ObjType, &'a Op); + + fn next(&mut self) -> Option { + if let Some((id, typ, tree)) = &mut self.current { + if let Some(next) = tree.next() { + return Some((id, *typ, next)); + } + } + + loop { + self.current = self.trees.next().map(|o| (o.0, o.1, o.2.iter())); + if let Some((obj, typ, tree)) = &mut self.current { + if let Some(next) = tree.next() { + return Some((obj, *typ, next)); + } + } else { + return None; + } + } + } +} + +impl<'a> ExactSizeIterator for Iter<'a> { + fn len(&self) -> usize { + self.opset.len() + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct OpSetMetadata { + pub(crate) actors: IndexedCache, + pub(crate) props: IndexedCache, +} + +impl Default for OpSetMetadata { + fn default() -> Self { + Self { + actors: IndexedCache::new(), + props: IndexedCache::new(), + } + } +} + +impl OpSetMetadata { + pub(crate) fn from_actors(actors: Vec) -> Self { + Self { + props: IndexedCache::new(), + actors: actors.into_iter().collect(), + } + } + + pub(crate) fn key_cmp(&self, left: &Key, right: &Key) -> Ordering { + match (left, right) { + (Key::Map(a), Key::Map(b)) => self.props[*a].cmp(&self.props[*b]), + _ => panic!("can only compare map keys"), + } + } + + pub(crate) fn lamport_cmp(&self, left: OpId, right: OpId) -> Ordering { + left.lamport_cmp(&right, &self.actors.cache) + } + + pub(crate) fn sorted_opids>(&self, opids: I) -> OpIds { + OpIds::new(opids, |left, right| self.lamport_cmp(*left, *right)) + } + + /// If `opids` are in ascending lamport timestamp order with respect to the actor IDs in + /// this `OpSetMetadata` then this returns `Some(OpIds)`, otherwise returns `None`. + pub(crate) fn try_sorted_opids(&self, opids: Vec) -> Option { + OpIds::new_if_sorted(opids, |a, b| self.lamport_cmp(*a, *b)) + } + + pub(crate) fn import_prop>(&mut self, key: S) -> usize { + self.props.cache(key.borrow().to_string()) + } +} + +pub(crate) struct Parent { + pub(crate) obj: ObjId, + pub(crate) key: Key, + pub(crate) visible: bool, +} diff --git a/rust/automerge/src/op_set/load.rs b/rust/automerge/src/op_set/load.rs new file mode 100644 index 00000000..e14f46b7 --- /dev/null +++ b/rust/automerge/src/op_set/load.rs @@ -0,0 +1,52 @@ +use std::collections::HashMap; + +use fxhash::FxBuildHasher; + +use super::{OpSet, OpTree}; +use crate::{ + op_tree::OpTreeInternal, + storage::load::{DocObserver, LoadedObject}, + types::ObjId, +}; + +/// An opset builder which creates an optree for each object as it finishes loading, inserting the +/// ops using `OpTreeInternal::insert`. This should be faster than using `OpSet::insert_*` but only +/// works because the ops in the document format are in the same order as in the optrees. +pub(crate) struct OpSetBuilder { + completed_objects: HashMap, +} + +impl OpSetBuilder { + pub(crate) fn new() -> OpSetBuilder { + Self { + completed_objects: HashMap::default(), + } + } +} + +impl DocObserver for OpSetBuilder { + type Output = OpSet; + + fn object_loaded(&mut self, loaded: LoadedObject) { + let mut internal = OpTreeInternal::new(); + for (index, op) in loaded.ops.into_iter().enumerate() { + internal.insert(index, op); + } + let tree = OpTree { + internal, + objtype: loaded.obj_type, + parent: loaded.parent, + last_insert: None, + }; + self.completed_objects.insert(loaded.id, tree); + } + + fn finish(self, metadata: super::OpSetMetadata) -> Self::Output { + let len = self.completed_objects.values().map(|t| t.len()).sum(); + OpSet { + trees: self.completed_objects, + length: len, + m: metadata, + } + } +} diff --git a/rust/automerge/src/op_tree.rs b/rust/automerge/src/op_tree.rs new file mode 100644 index 00000000..7de00dc3 --- /dev/null +++ b/rust/automerge/src/op_tree.rs @@ -0,0 +1,373 @@ +use std::{fmt::Debug, mem, ops::RangeBounds}; + +pub(crate) use crate::op_set::OpSetMetadata; +use crate::{ + clock::Clock, + query::{self, ChangeVisibility, QueryResult, TreeQuery}, +}; +use crate::{ + types::{ObjId, Op, OpId}, + ObjType, +}; +use std::collections::HashSet; + +mod iter; +mod node; + +pub(crate) use iter::OpTreeIter; +#[allow(unused)] +pub(crate) use node::{OpTreeNode, B}; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct OpTree { + pub(crate) internal: OpTreeInternal, + pub(crate) objtype: ObjType, + /// The id of the parent object, root has no parent. + pub(crate) parent: Option, + /// record the last list index and tree position + /// inserted into the op_set - this allows us to + /// short circuit the query if the follow op is another + /// insert or delete at the same spot + pub(crate) last_insert: Option<(usize, usize)>, +} + +impl OpTree { + pub(crate) fn new() -> Self { + Self { + internal: Default::default(), + objtype: ObjType::Map, + parent: None, + last_insert: None, + } + } + + pub(crate) fn iter(&self) -> OpTreeIter<'_> { + self.internal.iter() + } + + pub(crate) fn len(&self) -> usize { + self.internal.len() + } +} + +#[derive(Clone, Debug)] +pub(crate) struct OpTreeInternal { + pub(crate) root_node: Option, + pub(crate) ops: Vec, +} + +impl OpTreeInternal { + /// Construct a new, empty, sequence. + pub(crate) fn new() -> Self { + Self { + root_node: None, + ops: vec![], + } + } + + /// Get the length of the sequence. + pub(crate) fn len(&self) -> usize { + self.root_node.as_ref().map_or(0, |n| n.len()) + } + + pub(crate) fn keys(&self) -> Option> { + if self.root_node.is_some() { + Some(query::Keys::new(self)) + } else { + None + } + } + + pub(crate) fn keys_at(&self, clock: Clock) -> Option> { + if self.root_node.is_some() { + Some(query::KeysAt::new(self, clock)) + } else { + None + } + } + + pub(crate) fn map_range<'a, R: RangeBounds>( + &'a self, + range: R, + meta: &'a OpSetMetadata, + ) -> Option> { + if self.root_node.is_some() { + Some(query::MapRange::new(range, self, meta)) + } else { + None + } + } + + pub(crate) fn map_range_at<'a, R: RangeBounds>( + &'a self, + range: R, + meta: &'a OpSetMetadata, + clock: Clock, + ) -> Option> { + if self.root_node.is_some() { + Some(query::MapRangeAt::new(range, self, meta, clock)) + } else { + None + } + } + + pub(crate) fn list_range>( + &self, + range: R, + ) -> Option> { + if self.root_node.is_some() { + Some(query::ListRange::new(range, self)) + } else { + None + } + } + + pub(crate) fn list_range_at>( + &self, + range: R, + clock: Clock, + ) -> Option> { + if self.root_node.is_some() { + Some(query::ListRangeAt::new(range, clock, self)) + } else { + None + } + } + + pub(crate) fn search<'a, 'b: 'a, Q>(&'b self, mut query: Q, m: &OpSetMetadata) -> Q + where + Q: TreeQuery<'a>, + { + self.root_node.as_ref().map(|root| { + match query.query_node_with_metadata(root, m, &self.ops) { + QueryResult::Descend => root.search(&mut query, m, &self.ops, None), + QueryResult::Skip(skip) => root.search(&mut query, m, &self.ops, Some(skip)), + _ => true, + } + }); + query + } + + /// Create an iterator through the sequence. + pub(crate) fn iter(&self) -> OpTreeIter<'_> { + iter::OpTreeIter::new(self) + } + + /// Insert the `element` into the sequence at `index`. + /// + /// # Panics + /// + /// Panics if `index > len`. + pub(crate) fn insert(&mut self, index: usize, op: Op) { + assert!( + index <= self.len(), + "tried to insert at {} but len is {}", + index, + self.len() + ); + + let element = self.ops.len(); + self.ops.push(op); + + let old_len = self.len(); + if let Some(root) = self.root_node.as_mut() { + #[cfg(debug_assertions)] + root.check(); + + if root.is_full() { + let original_len = root.len(); + let new_root = OpTreeNode::new(); + + // move new_root to root position + let old_root = mem::replace(root, new_root); + + root.length += old_root.len(); + root.index = old_root.index.clone(); + root.children.push(old_root); + root.split_child(0, &self.ops); + + assert_eq!(original_len, root.len()); + + // after splitting the root has one element and two children, find which child the + // index is in + let first_child_len = root.children[0].len(); + let (child, insertion_index) = if first_child_len < index { + (&mut root.children[1], index - (first_child_len + 1)) + } else { + (&mut root.children[0], index) + }; + root.length += 1; + root.index.insert(&self.ops[element]); + child.insert_into_non_full_node(insertion_index, element, &self.ops) + } else { + root.insert_into_non_full_node(index, element, &self.ops) + } + } else { + let mut root = OpTreeNode::new(); + root.insert_into_non_full_node(index, element, &self.ops); + self.root_node = Some(root) + } + assert_eq!(self.len(), old_len + 1, "{:#?}", self); + } + + /// Get the `element` at `index` in the sequence. + pub(crate) fn get(&self, index: usize) -> Option<&Op> { + self.root_node + .as_ref() + .and_then(|n| n.get(index)) + .map(|n| &self.ops[n]) + } + + // this replaces get_mut() because it allows the indexes to update correctly + pub(crate) fn update(&mut self, index: usize, f: F) + where + F: FnOnce(&mut Op), + { + if self.len() > index { + let n = self.root_node.as_ref().unwrap().get(index).unwrap(); + let new_element = self.ops.get_mut(n).unwrap(); + let old_vis = new_element.visible(); + f(new_element); + let vis = ChangeVisibility { + old_vis, + new_vis: new_element.visible(), + op: new_element, + }; + self.root_node.as_mut().unwrap().update(index, vis); + } + } + + /// Removes the element at `index` from the sequence. + /// + /// # Panics + /// + /// Panics if `index` is out of bounds. + pub(crate) fn remove(&mut self, index: usize) -> Op { + if let Some(root) = self.root_node.as_mut() { + #[cfg(debug_assertions)] + let len = root.check(); + let old = root.remove(index, &self.ops); + + if root.elements.is_empty() { + if root.is_leaf() { + self.root_node = None; + } else { + self.root_node = Some(root.children.remove(0)); + } + } + + #[cfg(debug_assertions)] + debug_assert_eq!(len, self.root_node.as_ref().map_or(0, |r| r.check()) + 1); + self.ops[old].clone() + } else { + panic!("remove from empty tree") + } + } +} + +impl Default for OpTreeInternal { + fn default() -> Self { + Self::new() + } +} + +impl PartialEq for OpTreeInternal { + fn eq(&self, other: &Self) -> bool { + self.len() == other.len() && self.iter().zip(other.iter()).all(|(a, b)| a == b) + } +} + +impl<'a> IntoIterator for &'a OpTreeInternal { + type Item = &'a Op; + + type IntoIter = Iter<'a>; + + fn into_iter(self) -> Self::IntoIter { + Iter { + inner: self, + index: 0, + } + } +} + +pub(crate) struct Iter<'a> { + inner: &'a OpTreeInternal, + index: usize, +} + +impl<'a> Iterator for Iter<'a> { + type Item = &'a Op; + + fn next(&mut self) -> Option { + self.index += 1; + self.inner.get(self.index - 1) + } + + fn nth(&mut self, n: usize) -> Option { + self.index += n + 1; + self.inner.get(self.index - 1) + } +} + +#[derive(Debug, Clone, PartialEq)] +struct CounterData { + pos: usize, + val: i64, + succ: HashSet, + op: Op, +} + +#[cfg(test)] +mod tests { + use crate::legacy as amp; + use crate::types::{Op, OpId}; + + use super::*; + + fn op() -> Op { + let zero = OpId::new(0, 0); + Op { + id: zero, + action: amp::OpType::Put(0.into()), + key: zero.into(), + succ: Default::default(), + pred: Default::default(), + insert: false, + } + } + + #[test] + fn insert() { + let mut t: OpTree = OpTree::new(); + + t.internal.insert(0, op()); + t.internal.insert(1, op()); + t.internal.insert(0, op()); + t.internal.insert(0, op()); + t.internal.insert(0, op()); + t.internal.insert(3, op()); + t.internal.insert(4, op()); + } + + #[test] + fn insert_book() { + let mut t: OpTree = OpTree::new(); + + for i in 0..100 { + t.internal.insert(i % 2, op()); + } + } + + #[test] + fn insert_book_vec() { + let mut t: OpTree = OpTree::new(); + let mut v = Vec::new(); + + for i in 0..100 { + t.internal.insert(i % 3, op()); + v.insert(i % 3, op()); + + assert_eq!(v, t.internal.iter().cloned().collect::>()) + } + } +} diff --git a/rust/automerge/src/op_tree/iter.rs b/rust/automerge/src/op_tree/iter.rs new file mode 100644 index 00000000..0b19f359 --- /dev/null +++ b/rust/automerge/src/op_tree/iter.rs @@ -0,0 +1,442 @@ +use std::cmp::Ordering; + +use crate::types::Op; + +use super::{OpTreeInternal, OpTreeNode}; + +#[derive(Clone)] +pub(crate) struct OpTreeIter<'a>(Inner<'a>); + +impl<'a> OpTreeIter<'a> { + pub(crate) fn new(tree: &'a OpTreeInternal) -> OpTreeIter<'a> { + Self( + tree.root_node + .as_ref() + .map(|root| Inner::NonEmpty { + // This is a guess at the average depth of an OpTree + ancestors: Vec::with_capacity(6), + current: NodeIter { + node: root, + index: 0, + }, + cumulative_index: 0, + root_node: root, + ops: &tree.ops, + }) + .unwrap_or(Inner::Empty), + ) + } +} + +impl<'a> Iterator for OpTreeIter<'a> { + type Item = &'a Op; + + fn next(&mut self) -> Option { + self.0.next() + } + + fn nth(&mut self, n: usize) -> Option { + self.0.nth(n) + } +} + +#[derive(Clone)] +enum Inner<'a> { + Empty, + NonEmpty { + // A stack of nodes in the optree which we have descended in to to get to the current + // element. + ancestors: Vec>, + current: NodeIter<'a>, + // How far through the whole optree we are + cumulative_index: usize, + root_node: &'a OpTreeNode, + ops: &'a [Op], + }, +} + +/// A node in the op tree which we are iterating over +#[derive(Clone)] +struct NodeIter<'a> { + /// The node itself + node: &'a OpTreeNode, + /// The index of the next element we will pull from the node. This means something different + /// depending on whether the node is a leaf node or not. If the node is a leaf node then this + /// index is the index in `node.elements` which will be returned on the next call to `next()`. + /// If the node is not an internal node then this index is the index of `children` which we are + /// currently iterating as well as being the index of the next element of `elements` which we + /// will return once we have finished iterating over the child node. + index: usize, +} + +impl<'a> Iterator for Inner<'a> { + type Item = &'a Op; + + fn next(&mut self) -> Option { + match self { + Inner::Empty => None, + Inner::NonEmpty { + ancestors, + ops, + current, + cumulative_index, + .. + } => { + if current.node.is_leaf() { + // If we're in a leaf node and we haven't exhausted it yet we just return the elements + // of the leaf node + if current.index < current.node.len() { + let result = current.node.elements[current.index]; + current.index += 1; + *cumulative_index += 1; + Some(&ops[result]) + } else { + // We've exhausted the leaf node, we must find the nearest non-exhausted parent (lol) + let node_iter = loop { + if let Some( + node_iter @ NodeIter { + node: parent, + index: parent_index, + }, + ) = ancestors.pop() + { + // We've exhausted this parent + if parent_index >= parent.elements.len() { + continue; + } else { + // This parent still has elements to process, let's use it! + break node_iter; + } + } else { + // No parents left, we're done + return None; + } + }; + // if we've finished the elements in a leaf node and there's a parent node then we + // return the element from the parent node which is one after the index at which we + // descended into the child + *current = node_iter; + let result = current.node.elements[current.index]; + current.index += 1; + *cumulative_index += 1; + Some(&ops[result]) + } + } else { + // If we're in a non-leaf node then the last iteration returned an element from the + // current nodes `elements`, so we must now descend into a leaf child + ancestors.push(current.clone()); + loop { + let child = ¤t.node.children[current.index]; + current.index = 0; + if !child.is_leaf() { + ancestors.push(NodeIter { + node: child, + index: 0, + }); + current.node = child + } else { + current.node = child; + break; + } + } + self.next() + } + } + } + } + + fn nth(&mut self, n: usize) -> Option { + match self { + Self::Empty => None, + Self::NonEmpty { + root_node, + ops, + cumulative_index, + current, + ancestors, + .. + } => { + // Make sure that we don't rewind when calling nth more than once + if n < *cumulative_index { + None + } else if n >= root_node.len() { + *cumulative_index = root_node.len() - 1; + None + } else { + // rather than trying to go back up through the ancestors to find the right + // node we just start at the root. + *current = NodeIter { + node: root_node, + index: n, + }; + *cumulative_index = 0; + ancestors.clear(); + while !current.node.is_leaf() { + for (child_index, child) in current.node.children.iter().enumerate() { + match (*cumulative_index + child.len()).cmp(&n) { + Ordering::Less => { + *cumulative_index += child.len() + 1; + current.index = child_index + 1; + } + Ordering::Equal => { + *cumulative_index += child.len() + 1; + current.index = child_index + 1; + return Some(&ops[current.node.elements[child_index]]); + } + Ordering::Greater => { + current.index = child_index; + let old = std::mem::replace( + current, + NodeIter { + node: child, + index: 0, + }, + ); + ancestors.push(old); + break; + } + } + } + } + // we're in a leaf node and we kept track of the cumulative index as we went, + let index_in_this_node = n.saturating_sub(*cumulative_index); + current.index = index_in_this_node + 1; + Some(&ops[current.node.elements[index_in_this_node]]) + } + } + } + } +} + +#[cfg(test)] +mod tests { + use super::super::OpTreeInternal; + use crate::types::{Key, Op, OpId, OpType, ScalarValue}; + use proptest::prelude::*; + + #[derive(Clone)] + enum Action { + Insert(usize, Op), + Delete(usize), + } + + impl std::fmt::Debug for Action { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Insert(index, ..) => write!(f, "Insert({})", index), + Self::Delete(index) => write!(f, "Delete({})", index), + } + } + } + + // A struct which impls Debug by only printing the counters of the IDs of the ops it wraps. + // This is useful because the only difference between the ops that we generate is the counter + // of their IDs. Wrapping a Vec in DebugOps will result in output from assert! etc. which + // only shows the counters. For example, the output of a failing assert_eq! like this + // + // assert_eq!(DebugOps(&ops1), DebugOps(&ops2)) + // + // Might look like this + // + // left: `[0,1,2,3] + // right: `[0,1,2,3,4] + // + // i.e. all the other details of the ops are elided + #[derive(PartialEq)] + struct DebugOps<'a>(&'a [Op]); + + impl<'a> std::fmt::Debug for DebugOps<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "[")?; + for (index, op) in self.0.iter().enumerate() { + if index < self.0.len() - 1 { + write!(f, "{},", op.id.counter())?; + } else { + write!(f, "{}]", op.id.counter())? + } + } + Ok(()) + } + } + + fn op(counter: u64) -> Op { + Op { + action: OpType::Put(ScalarValue::Uint(counter)), + id: OpId::new(counter, 0), + key: Key::Map(0), + succ: Default::default(), + pred: Default::default(), + insert: false, + } + } + + /// A model for a property based test of the OpTreeIter. We generate a set of actions, each + /// action pertaining to a `model` - which is just a `Vec`. As we generate each action we + /// apply it to the model and record the action we took. In the property test we replay the + /// same actions against an `OpTree` and check that the iterator returns the same result as the + /// `model`. + #[derive(Clone)] + struct Model { + actions: Vec, + model: Vec, + } + + impl std::fmt::Debug for Model { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Model") + .field("actions", &self.actions) + .field("model", &DebugOps(&self.model)) + .finish() + } + } + + impl Model { + fn insert(&self, index: usize, next_op_counter: u64) -> Self { + let mut actions = self.actions.clone(); + let op = op(next_op_counter); + actions.push(Action::Insert(index, op.clone())); + let mut model = self.model.clone(); + model.insert(index, op); + Self { actions, model } + } + + fn delete(&self, index: usize) -> Self { + let mut actions = self.actions.clone(); + actions.push(Action::Delete(index)); + let mut model = self.model.clone(); + model.remove(index); + Self { actions, model } + } + + fn next(self, next_op_counter: u64) -> impl Strategy { + if self.model.is_empty() { + Just(self.insert(0, next_op_counter)).boxed() + } else { + // Note that we have to feed `self` through the `prop_flat_map` using `Just` to + // appease the borrow checker, this is annoying because it does obscure the meaning + // of the code heere which is basically "decide whether the next action should be + // insert, if it is insert choose an index between 0..model.len() + 1 and generate + // an op to insert, otherwise choose an index between 0..model.len() and generate a + // delete action". + // + // 95% chance of inserting to make sure we deal with large lists + (proptest::bool::weighted(0.95), Just(self)) + .prop_flat_map(move |(insert, model)| { + if insert { + (0..model.model.len() + 1, Just(model)) + .prop_map(move |(index, model)| { + model.insert(index, next_op_counter) + }) + .boxed() + } else { + ((0..model.model.len()), Just(model)) + .prop_map(move |(index, model)| model.delete(index)) + .boxed() + } + }) + .boxed() + } + } + } + + fn model() -> impl Strategy { + (0_u64..150).prop_flat_map(|num_steps| { + let mut strat = Just(( + 0, + Model { + actions: Vec::new(), + model: Vec::new(), + }, + )) + .boxed(); + for _ in 0..num_steps { + strat = strat + // Note the counter, which we feed through each `prop_flat_map`, incrementing + // it by one each time. This mean that the generated ops have ascending (but + // not necessarily consecutive because not every `Action` is an `Insert`) + // counters. This makes it easier to debug failures - if we just used a random + // counter it would be much harder to see where things are out of order. + .prop_flat_map(|(counter, model)| { + let next_counter = counter + 1; + model.next(counter).prop_map(move |m| (next_counter, m)) + }) + .boxed(); + } + strat.prop_map(|(_, model)| model) + }) + } + + fn make_optree(actions: &[Action]) -> super::OpTreeInternal { + let mut optree = OpTreeInternal::new(); + for action in actions { + match action { + Action::Insert(index, op) => optree.insert(*index, op.clone()), + Action::Delete(index) => { + optree.remove(*index); + } + } + } + optree + } + + /// A model for calls to `nth`. `NthModel::n` is guarnateed to be in `(0..model.len())` + #[derive(Clone)] + struct NthModel { + model: Vec, + actions: Vec, + n: usize, + } + + impl std::fmt::Debug for NthModel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Model") + .field("actions", &self.actions) + .field("model", &DebugOps(&self.model)) + .field("n", &self.n) + .finish() + } + } + + fn nth_model() -> impl Strategy { + model().prop_flat_map(|model| { + if model.model.is_empty() { + Just(NthModel { + model: model.model, + actions: model.actions, + n: 0, + }) + .boxed() + } else { + (0..model.model.len(), Just(model)) + .prop_map(|(index, model)| NthModel { + model: model.model, + actions: model.actions, + n: index, + }) + .boxed() + } + }) + } + + proptest! { + #[test] + fn optree_iter_proptest(model in model()) { + let optree = make_optree(&model.actions); + let iter = super::OpTreeIter::new(&optree); + let iterated = iter.cloned().collect::>(); + assert_eq!(DebugOps(&model.model), DebugOps(&iterated)) + } + + #[test] + fn optree_iter_nth(model in nth_model()) { + let optree = make_optree(&model.actions); + let mut iter = super::OpTreeIter::new(&optree); + let mut model_iter = model.model.iter(); + assert_eq!(model_iter.nth(model.n), iter.nth(model.n)); + + let tail = iter.cloned().collect::>(); + let expected_tail = model_iter.cloned().collect::>(); + assert_eq!(DebugOps(tail.as_slice()), DebugOps(expected_tail.as_slice())); + } + } +} diff --git a/rust/automerge/src/op_tree/node.rs b/rust/automerge/src/op_tree/node.rs new file mode 100644 index 00000000..ed1b7646 --- /dev/null +++ b/rust/automerge/src/op_tree/node.rs @@ -0,0 +1,492 @@ +use std::{ + cmp::{min, Ordering}, + fmt::Debug, + mem, +}; + +pub(crate) use crate::op_set::OpSetMetadata; +use crate::query::{ChangeVisibility, Index, QueryResult, TreeQuery}; +use crate::types::Op; +pub(crate) const B: usize = 16; + +#[derive(Clone, Debug)] +pub(crate) struct OpTreeNode { + pub(crate) children: Vec, + pub(crate) elements: Vec, + pub(crate) index: Index, + pub(crate) length: usize, +} + +impl OpTreeNode { + pub(crate) fn new() -> Self { + Self { + elements: Vec::new(), + children: Vec::new(), + index: Default::default(), + length: 0, + } + } + + fn search_element<'a, 'b: 'a, Q>( + &'b self, + query: &mut Q, + m: &OpSetMetadata, + ops: &'a [Op], + index: usize, + ) -> bool + where + Q: TreeQuery<'a>, + { + if let Some(e) = self.elements.get(index) { + if query.query_element_with_metadata(&ops[*e], m) == QueryResult::Finish { + return true; + } + } + false + } + + pub(crate) fn search<'a, 'b: 'a, Q>( + &'b self, + query: &mut Q, + m: &OpSetMetadata, + ops: &'a [Op], + mut skip: Option, + ) -> bool + where + Q: TreeQuery<'a>, + { + if self.is_leaf() { + for e in self.elements.iter().skip(skip.unwrap_or(0)) { + if query.query_element_with_metadata(&ops[*e], m) == QueryResult::Finish { + return true; + } + } + false + } else { + for (child_index, child) in self.children.iter().enumerate() { + match skip { + Some(n) if n > child.len() => { + skip = Some(n - child.len() - 1); + } + Some(n) if n == child.len() => { + skip = Some(0); // important to not be None so we never call query_node again + if self.search_element(query, m, ops, child_index) { + return true; + } + } + Some(n) => { + if child.search(query, m, ops, Some(n)) { + return true; + } + skip = Some(0); // important to not be None so we never call query_node again + if self.search_element(query, m, ops, child_index) { + return true; + } + } + None => { + // descend and try find it + match query.query_node_with_metadata(child, m, ops) { + QueryResult::Descend => { + if child.search(query, m, ops, None) { + return true; + } + } + QueryResult::Finish => return true, + QueryResult::Next => (), + QueryResult::Skip(_) => panic!("had skip from non-root node"), + } + if self.search_element(query, m, ops, child_index) { + return true; + } + } + } + } + false + } + } + + pub(crate) fn len(&self) -> usize { + self.length + } + + fn reindex(&mut self, ops: &[Op]) { + let mut index = Index::new(); + for c in &self.children { + index.merge(&c.index); + } + for i in &self.elements { + index.insert(&ops[*i]); + } + self.index = index + } + + pub(crate) fn is_leaf(&self) -> bool { + self.children.is_empty() + } + + pub(crate) fn is_full(&self) -> bool { + self.elements.len() >= 2 * B - 1 + } + + /// Returns the child index and the given index adjusted for the cumulative index before that + /// child. + fn find_child_index(&self, index: usize) -> (usize, usize) { + let mut cumulative_len = 0; + for (child_index, child) in self.children.iter().enumerate() { + if cumulative_len + child.len() >= index { + return (child_index, index - cumulative_len); + } else { + cumulative_len += child.len() + 1; + } + } + panic!("index {} not found in node with len {}", index, self.len()) + } + + pub(crate) fn insert_into_non_full_node(&mut self, index: usize, element: usize, ops: &[Op]) { + assert!(!self.is_full()); + + self.index.insert(&ops[element]); + + if self.is_leaf() { + self.length += 1; + self.elements.insert(index, element); + } else { + let (child_index, sub_index) = self.find_child_index(index); + let child = &mut self.children[child_index]; + + if child.is_full() { + self.split_child(child_index, ops); + + // child structure has changed so we need to find the index again + let (child_index, sub_index) = self.find_child_index(index); + let child = &mut self.children[child_index]; + child.insert_into_non_full_node(sub_index, element, ops); + } else { + child.insert_into_non_full_node(sub_index, element, ops); + } + self.length += 1; + } + } + + // A utility function to split the child `full_child_index` of this node + // Note that `full_child_index` must be full when this function is called. + pub(crate) fn split_child(&mut self, full_child_index: usize, ops: &[Op]) { + let original_len_self = self.len(); + + let full_child = &mut self.children[full_child_index]; + + // Create a new node which is going to store (B-1) keys + // of the full child. + let mut successor_sibling = OpTreeNode::new(); + + let original_len = full_child.len(); + assert!(full_child.is_full()); + + successor_sibling.elements = full_child.elements.split_off(B); + + if !full_child.is_leaf() { + successor_sibling.children = full_child.children.split_off(B); + } + + let middle = full_child.elements.pop().unwrap(); + + full_child.length = + full_child.elements.len() + full_child.children.iter().map(|c| c.len()).sum::(); + + successor_sibling.length = successor_sibling.elements.len() + + successor_sibling + .children + .iter() + .map(|c| c.len()) + .sum::(); + + let z_len = successor_sibling.len(); + + let full_child_len = full_child.len(); + + full_child.reindex(ops); + successor_sibling.reindex(ops); + + self.children + .insert(full_child_index + 1, successor_sibling); + + self.elements.insert(full_child_index, middle); + + assert_eq!(full_child_len + z_len + 1, original_len, "{:#?}", self); + + assert_eq!(original_len_self, self.len()); + } + + fn remove_from_leaf(&mut self, index: usize) -> usize { + self.length -= 1; + self.elements.remove(index) + } + + fn remove_element_from_non_leaf( + &mut self, + index: usize, + element_index: usize, + ops: &[Op], + ) -> usize { + self.length -= 1; + if self.children[element_index].elements.len() >= B { + let total_index = self.cumulative_index(element_index); + // recursively delete index - 1 in predecessor_node + let predecessor = self.children[element_index].remove(index - 1 - total_index, ops); + // replace element with that one + mem::replace(&mut self.elements[element_index], predecessor) + } else if self.children[element_index + 1].elements.len() >= B { + // recursively delete index + 1 in successor_node + let total_index = self.cumulative_index(element_index + 1); + let successor = self.children[element_index + 1].remove(index + 1 - total_index, ops); + // replace element with that one + mem::replace(&mut self.elements[element_index], successor) + } else { + let middle_element = self.elements.remove(element_index); + let successor_child = self.children.remove(element_index + 1); + self.children[element_index].merge(middle_element, successor_child, ops); + + let total_index = self.cumulative_index(element_index); + self.children[element_index].remove(index - total_index, ops) + } + } + + fn cumulative_index(&self, child_index: usize) -> usize { + self.children[0..child_index] + .iter() + .map(|c| c.len() + 1) + .sum() + } + + fn remove_from_internal_child( + &mut self, + index: usize, + mut child_index: usize, + ops: &[Op], + ) -> usize { + if self.children[child_index].elements.len() < B + && if child_index > 0 { + self.children[child_index - 1].elements.len() < B + } else { + true + } + && if child_index + 1 < self.children.len() { + self.children[child_index + 1].elements.len() < B + } else { + true + } + { + // if the child and its immediate siblings have B-1 elements merge the child + // with one sibling, moving an element from this node into the new merged node + // to be the median + + if child_index > 0 { + let middle = self.elements.remove(child_index - 1); + + // use the predessor sibling + let successor = self.children.remove(child_index); + child_index -= 1; + + self.children[child_index].merge(middle, successor, ops); + } else { + let middle = self.elements.remove(child_index); + + // use the sucessor sibling + let successor = self.children.remove(child_index + 1); + + self.children[child_index].merge(middle, successor, ops); + } + } else if self.children[child_index].elements.len() < B { + if child_index > 0 + && self + .children + .get(child_index - 1) + .map_or(false, |c| c.elements.len() >= B) + { + let last_element = self.children[child_index - 1].elements.pop().unwrap(); + assert!(!self.children[child_index - 1].elements.is_empty()); + self.children[child_index - 1].length -= 1; + self.children[child_index - 1] + .index + .remove(&ops[last_element]); + + let parent_element = + mem::replace(&mut self.elements[child_index - 1], last_element); + + self.children[child_index] + .index + .insert(&ops[parent_element]); + self.children[child_index] + .elements + .insert(0, parent_element); + self.children[child_index].length += 1; + + if let Some(last_child) = self.children[child_index - 1].children.pop() { + self.children[child_index - 1].length -= last_child.len(); + self.children[child_index - 1].reindex(ops); + self.children[child_index].length += last_child.len(); + self.children[child_index].children.insert(0, last_child); + self.children[child_index].reindex(ops); + } + } else if self + .children + .get(child_index + 1) + .map_or(false, |c| c.elements.len() >= B) + { + let first_element = self.children[child_index + 1].elements.remove(0); + self.children[child_index + 1] + .index + .remove(&ops[first_element]); + self.children[child_index + 1].length -= 1; + + assert!(!self.children[child_index + 1].elements.is_empty()); + + let parent_element = mem::replace(&mut self.elements[child_index], first_element); + + self.children[child_index].length += 1; + self.children[child_index] + .index + .insert(&ops[parent_element]); + self.children[child_index].elements.push(parent_element); + + if !self.children[child_index + 1].is_leaf() { + let first_child = self.children[child_index + 1].children.remove(0); + self.children[child_index + 1].length -= first_child.len(); + self.children[child_index + 1].reindex(ops); + self.children[child_index].length += first_child.len(); + + self.children[child_index].children.push(first_child); + self.children[child_index].reindex(ops); + } + } + } + self.length -= 1; + let total_index = self.cumulative_index(child_index); + self.children[child_index].remove(index - total_index, ops) + } + + pub(crate) fn check(&self) -> usize { + let l = self.elements.len() + self.children.iter().map(|c| c.check()).sum::(); + assert_eq!(self.len(), l, "{:#?}", self); + + l + } + + pub(crate) fn remove(&mut self, index: usize, ops: &[Op]) -> usize { + let original_len = self.len(); + if self.is_leaf() { + let v = self.remove_from_leaf(index); + self.index.remove(&ops[v]); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + v + } else { + let mut total_index = 0; + for (child_index, child) in self.children.iter().enumerate() { + match (total_index + child.len()).cmp(&index) { + Ordering::Less => { + // should be later on in the loop + total_index += child.len() + 1; + continue; + } + Ordering::Equal => { + let v = self.remove_element_from_non_leaf( + index, + min(child_index, self.elements.len() - 1), + ops, + ); + self.index.remove(&ops[v]); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + return v; + } + Ordering::Greater => { + let v = self.remove_from_internal_child(index, child_index, ops); + self.index.remove(&ops[v]); + assert_eq!(original_len, self.len() + 1); + debug_assert_eq!(self.check(), self.len()); + return v; + } + } + } + panic!( + "index not found to remove {} {} {} {}", + index, + total_index, + self.len(), + self.check() + ); + } + } + + fn merge(&mut self, middle: usize, successor_sibling: OpTreeNode, ops: &[Op]) { + self.index.insert(&ops[middle]); + self.index.merge(&successor_sibling.index); + self.elements.push(middle); + self.elements.extend(successor_sibling.elements); + self.children.extend(successor_sibling.children); + self.length += successor_sibling.length + 1; + assert!(self.is_full()); + } + + /// Update the operation at the given index using the provided function. + /// + /// This handles updating the indices after the update. + pub(crate) fn update<'a>( + &mut self, + index: usize, + vis: ChangeVisibility<'a>, + ) -> ChangeVisibility<'a> { + if self.is_leaf() { + self.index.change_vis(vis) + } else { + let mut cumulative_len = 0; + let len = self.len(); + for (_child_index, child) in self.children.iter_mut().enumerate() { + match (cumulative_len + child.len()).cmp(&index) { + Ordering::Less => { + cumulative_len += child.len() + 1; + } + Ordering::Equal => { + return self.index.change_vis(vis); + } + Ordering::Greater => { + let vis = child.update(index - cumulative_len, vis); + return self.index.change_vis(vis); + } + } + } + panic!("Invalid index to set: {} but len was {}", index, len) + } + } + + pub(crate) fn last(&self) -> usize { + if self.is_leaf() { + // node is never empty so this is safe + *self.elements.last().unwrap() + } else { + // if not a leaf then there is always at least one child + self.children.last().unwrap().last() + } + } + + pub(crate) fn get(&self, index: usize) -> Option { + if self.is_leaf() { + return self.elements.get(index).copied(); + } else { + let mut cumulative_len = 0; + for (child_index, child) in self.children.iter().enumerate() { + match (cumulative_len + child.len()).cmp(&index) { + Ordering::Less => { + cumulative_len += child.len() + 1; + } + Ordering::Equal => return self.elements.get(child_index).copied(), + Ordering::Greater => { + return child.get(index - cumulative_len); + } + } + } + } + None + } +} diff --git a/rust/automerge/src/parents.rs b/rust/automerge/src/parents.rs new file mode 100644 index 00000000..e1c5cc66 --- /dev/null +++ b/rust/automerge/src/parents.rs @@ -0,0 +1,121 @@ +use crate::op_set; +use crate::op_set::OpSet; +use crate::types::{ListEncoding, ObjId}; +use crate::{exid::ExId, Prop}; + +/// An iterator over the "parents" of an object +/// +/// The "parent" of an object in this context is the ([`ExId`], [`Prop`]) pair which specifies the +/// location of this object in the composite object which contains it. Each element in the iterator +/// is a [`Parent`], yielded in reverse order. This means that once the iterator returns `None` you +/// have reached the root of the document. +/// +/// This is returned by [`crate::ReadDoc::parents`] +#[derive(Debug)] +pub struct Parents<'a> { + pub(crate) obj: ObjId, + pub(crate) ops: &'a OpSet, +} + +impl<'a> Parents<'a> { + /// Return the path this `Parents` represents + /// + /// This is _not_ in reverse order. + pub fn path(self) -> Vec<(ExId, Prop)> { + let mut path = self + .map(|Parent { obj, prop, .. }| (obj, prop)) + .collect::>(); + path.reverse(); + path + } + + /// Like `path` but returns `None` if the target is not visible + pub fn visible_path(self) -> Option> { + let mut path = Vec::new(); + for Parent { obj, prop, visible } in self { + if !visible { + return None; + } + path.push((obj, prop)) + } + path.reverse(); + Some(path) + } +} + +impl<'a> Iterator for Parents<'a> { + type Item = Parent; + + fn next(&mut self) -> Option { + if self.obj.is_root() { + None + } else if let Some(op_set::Parent { obj, key, visible }) = self.ops.parent_object(&self.obj) + { + self.obj = obj; + Some(Parent { + obj: self.ops.id_to_exid(self.obj.0), + prop: self + .ops + .export_key(self.obj, key, ListEncoding::List) + .unwrap(), + visible, + }) + } else { + None + } + } +} + +/// A component of a path to an object +#[derive(Debug, PartialEq, Eq)] +pub struct Parent { + /// The object ID this component refers to + pub obj: ExId, + /// The property within `obj` this component refers to + pub prop: Prop, + /// Whether this component is "visible" + /// + /// An "invisible" component is one where the property is hidden, either because it has been + /// deleted or because there is a conflict on this (object, property) pair and this value does + /// not win the conflict. + pub visible: bool, +} + +#[cfg(test)] +mod tests { + use super::Parent; + use crate::{transaction::Transactable, Prop, ReadDoc}; + + #[test] + fn test_invisible_parents() { + // Create a document with a list of objects, then delete one of the objects, then generate + // a path to the deleted object. + + let mut doc = crate::AutoCommit::new(); + let list = doc + .put_object(crate::ROOT, "list", crate::ObjType::List) + .unwrap(); + let obj1 = doc.insert_object(&list, 0, crate::ObjType::Map).unwrap(); + let _obj2 = doc.insert_object(&list, 1, crate::ObjType::Map).unwrap(); + doc.put(&obj1, "key", "value").unwrap(); + doc.delete(&list, 0).unwrap(); + + let mut parents = doc.parents(&obj1).unwrap().collect::>(); + parents.reverse(); + assert_eq!( + parents, + vec![ + Parent { + obj: crate::ROOT, + prop: Prop::Map("list".to_string()), + visible: true, + }, + Parent { + obj: list, + prop: Prop::Seq(0), + visible: false, + }, + ] + ); + } +} diff --git a/rust/automerge/src/query.rs b/rust/automerge/src/query.rs new file mode 100644 index 00000000..640ecf8d --- /dev/null +++ b/rust/automerge/src/query.rs @@ -0,0 +1,362 @@ +use crate::op_tree::{OpSetMetadata, OpTree, OpTreeNode}; +use crate::types::{ + Clock, Counter, Key, ListEncoding, Op, OpId, OpType, ScalarValue, TextEncoding, +}; +use fxhash::FxBuildHasher; +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet}; +use std::fmt::Debug; + +mod elem_id_pos; +mod insert; +mod keys; +mod keys_at; +mod len; +mod len_at; +mod list_range; +mod list_range_at; +mod list_vals; +mod list_vals_at; +mod map_range; +mod map_range_at; +mod nth; +mod nth_at; +mod opid; +mod opid_vis; +mod prop; +mod prop_at; +mod seek_op; +mod seek_op_with_patch; + +pub(crate) use elem_id_pos::ElemIdPos; +pub(crate) use insert::InsertNth; +pub(crate) use keys::Keys; +pub(crate) use keys_at::KeysAt; +pub(crate) use len::Len; +pub(crate) use len_at::LenAt; +pub(crate) use list_range::ListRange; +pub(crate) use list_range_at::ListRangeAt; +pub(crate) use list_vals::ListVals; +pub(crate) use list_vals_at::ListValsAt; +pub(crate) use map_range::MapRange; +pub(crate) use map_range_at::MapRangeAt; +pub(crate) use nth::Nth; +pub(crate) use nth_at::NthAt; +pub(crate) use opid::OpIdSearch; +pub(crate) use opid_vis::OpIdVisSearch; +pub(crate) use prop::Prop; +pub(crate) use prop_at::PropAt; +pub(crate) use seek_op::SeekOp; +pub(crate) use seek_op_with_patch::SeekOpWithPatch; + +// use a struct for the args for clarity as they are passed up the update chain in the optree +#[derive(Debug, Clone)] +pub(crate) struct ChangeVisibility<'a> { + pub(crate) old_vis: bool, + pub(crate) new_vis: bool, + pub(crate) op: &'a Op, +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct CounterData { + pos: usize, + val: i64, + succ: HashSet, + op: Op, +} + +pub(crate) trait TreeQuery<'a>: Clone + Debug { + fn equiv(&mut self, _other: &Self) -> bool { + false + } + + fn can_shortcut_search(&mut self, _tree: &'a OpTree) -> bool { + false + } + + #[inline(always)] + fn query_node_with_metadata( + &mut self, + child: &'a OpTreeNode, + _m: &OpSetMetadata, + ops: &[Op], + ) -> QueryResult { + self.query_node(child, ops) + } + + fn query_node(&mut self, _child: &'a OpTreeNode, _ops: &[Op]) -> QueryResult { + QueryResult::Descend + } + + #[inline(always)] + fn query_element_with_metadata(&mut self, element: &'a Op, _m: &OpSetMetadata) -> QueryResult { + self.query_element(element) + } + + fn query_element(&mut self, _element: &'a Op) -> QueryResult { + panic!("invalid element query") + } +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) enum QueryResult { + Next, + /// Skip this many elements, only allowed from the root node. + Skip(usize), + Descend, + Finish, +} + +#[derive(Clone, Debug, PartialEq)] +struct TextWidth { + utf8: usize, + utf16: usize, +} + +impl TextWidth { + fn add_op(&mut self, op: &Op) { + self.utf8 += op.width(ListEncoding::Text(TextEncoding::Utf8)); + self.utf16 += op.width(ListEncoding::Text(TextEncoding::Utf16)); + } + + fn remove_op(&mut self, op: &Op) { + // Why are we using saturating_sub here? Shouldn't this always be greater than 0? + // + // In the case of objects which are _not_ `Text` we may end up subtracting more than the + // current width. This can happen if the elements in a list are `ScalarValue::str` and + // there are conflicting elements for the same index in the list. Like so: + // + // ```notrust + // [ + // "element", + // ["conflict1", "conflict2_longer"], + // "element" + // ] + // ``` + // + // Where there are two conflicted elements at index 1 + // + // in `Index::insert` and `Index::change_visibility` we add the width of the inserted op in + // utf8 and utf16 to the current width, but only if there was not a previous element for + // that index. Imagine that we encounter the "conflict1" op first, then we will add the + // length of 'conflict1' to the text widths. When 'conflict2_longer' is added we don't do + // anything because we've already seen an op for this index. Imagine that later we remove + // the `conflict2_longer` op, then we will end up subtracting the length of + // 'conflict2_longer' from the text widths, hence, `saturating_sub`. This isn't a problem + // because for non text objects we don't need the text widths to be accurate anyway. + // + // Really this is a sign that we should be tracking the type of the Index (List or Text) at + // the type level, but for now we just look the other way. + self.utf8 = self + .utf8 + .saturating_sub(op.width(ListEncoding::Text(TextEncoding::Utf8))); + self.utf16 = self + .utf16 + .saturating_sub(op.width(ListEncoding::Text(TextEncoding::Utf16))); + } + + fn merge(&mut self, other: &TextWidth) { + self.utf8 += other.utf8; + self.utf16 += other.utf16; + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct Index { + /// The map of visible keys to the number of visible operations for that key. + visible: HashMap, + visible_text: TextWidth, + /// Set of opids found in this node and below. + ops: HashSet, +} + +impl Index { + pub(crate) fn new() -> Self { + Index { + visible: Default::default(), + visible_text: TextWidth { utf8: 0, utf16: 0 }, + ops: Default::default(), + } + } + + /// Get the number of visible elements in this index. + pub(crate) fn visible_len(&self, encoding: ListEncoding) -> usize { + match encoding { + ListEncoding::List => self.visible.len(), + ListEncoding::Text(TextEncoding::Utf8) => self.visible_text.utf8, + ListEncoding::Text(TextEncoding::Utf16) => self.visible_text.utf16, + } + } + + pub(crate) fn has_visible(&self, seen: &Key) -> bool { + self.visible.contains_key(seen) + } + + /// Whether `opid` is in this node or any below it + pub(crate) fn has_op(&self, opid: &OpId) -> bool { + self.ops.contains(opid) + } + + pub(crate) fn change_vis<'a>( + &mut self, + change_vis: ChangeVisibility<'a>, + ) -> ChangeVisibility<'a> { + let ChangeVisibility { + old_vis, + new_vis, + op, + } = &change_vis; + let key = op.elemid_or_key(); + match (old_vis, new_vis) { + (true, false) => match self.visible.get(&key).copied() { + Some(n) if n == 1 => { + self.visible.remove(&key); + self.visible_text.remove_op(op); + } + Some(n) => { + self.visible.insert(key, n - 1); + } + None => panic!("remove overun in index"), + }, + (false, true) => { + if let Some(n) = self.visible.get(&key) { + self.visible.insert(key, n + 1); + } else { + self.visible.insert(key, 1); + self.visible_text.add_op(op); + } + } + _ => {} + } + change_vis + } + + pub(crate) fn insert(&mut self, op: &Op) { + self.ops.insert(op.id); + if op.visible() { + let key = op.elemid_or_key(); + if let Some(n) = self.visible.get(&key) { + self.visible.insert(key, n + 1); + } else { + self.visible.insert(key, 1); + self.visible_text.add_op(op); + } + } + } + + pub(crate) fn remove(&mut self, op: &Op) { + self.ops.remove(&op.id); + if op.visible() { + let key = op.elemid_or_key(); + match self.visible.get(&key).copied() { + Some(n) if n == 1 => { + self.visible.remove(&key); + self.visible_text.remove_op(op); + } + Some(n) => { + self.visible.insert(key, n - 1); + } + None => panic!("remove overun in index"), + } + } + } + + pub(crate) fn merge(&mut self, other: &Index) { + for id in &other.ops { + self.ops.insert(*id); + } + for (elem, other_len) in other.visible.iter() { + self.visible + .entry(*elem) + .and_modify(|len| *len += *other_len) + .or_insert(*other_len); + } + self.visible_text.merge(&other.visible_text); + } +} + +impl Default for Index { + fn default() -> Self { + Self::new() + } +} + +#[derive(Debug, Clone, PartialEq, Default)] +pub(crate) struct VisWindow { + counters: HashMap, +} + +impl VisWindow { + fn visible_at(&mut self, op: &Op, pos: usize, clock: &Clock) -> bool { + if !clock.covers(&op.id) { + return false; + } + + let mut visible = false; + match op.action { + OpType::Put(ScalarValue::Counter(Counter { start, .. })) => { + self.counters.insert( + op.id, + CounterData { + pos, + val: start, + succ: op.succ.into_iter().cloned().collect(), + op: op.clone(), + }, + ); + if !op.succ.into_iter().any(|i| clock.covers(i)) { + visible = true; + } + } + OpType::Increment(inc_val) => { + for id in &op.pred { + // pred is always before op.id so we can see them + if let Some(mut entry) = self.counters.get_mut(id) { + entry.succ.remove(&op.id); + entry.val += inc_val; + entry.op.action = OpType::Put(ScalarValue::counter(entry.val)); + if !entry.succ.iter().any(|i| clock.covers(i)) { + visible = true; + } + } + } + } + _ => { + if !op.succ.into_iter().any(|i| clock.covers(i)) { + visible = true; + } + } + }; + visible + } + + pub(crate) fn seen_op(&self, op: &Op, pos: usize) -> Vec<(usize, Op)> { + let mut result = vec![]; + for pred in &op.pred { + if let Some(entry) = self.counters.get(pred) { + result.push((entry.pos, entry.op.clone())); + } + } + if result.is_empty() { + result.push((pos, op.clone())); + } + result + } +} + +pub(crate) fn binary_search_by(node: &OpTreeNode, ops: &[Op], f: F) -> usize +where + F: Fn(&Op) -> Ordering, +{ + let mut right = node.len(); + let mut left = 0; + while left < right { + let seq = (left + right) / 2; + if f(&ops[node.get(seq).unwrap()]) == Ordering::Less { + left = seq + 1; + } else { + right = seq; + } + } + left +} diff --git a/rust/automerge/src/query/elem_id_pos.rs b/rust/automerge/src/query/elem_id_pos.rs new file mode 100644 index 00000000..cb559216 --- /dev/null +++ b/rust/automerge/src/query/elem_id_pos.rs @@ -0,0 +1,74 @@ +use crate::{ + op_tree::OpTreeNode, + types::{ElemId, ListEncoding, Op, OpId}, +}; + +use super::{QueryResult, TreeQuery}; + +/// Lookup the index in the list that this elemid occupies, includes hidden elements. +#[derive(Clone, Debug)] +pub(crate) struct ElemIdPos { + elem_opid: OpId, + pos: usize, + found: bool, + encoding: ListEncoding, +} + +impl ElemIdPos { + pub(crate) fn new(elemid: ElemId, encoding: ListEncoding) -> Self { + if elemid.is_head() { + Self { + elem_opid: elemid.0, + pos: 0, + found: true, + encoding, + } + } else { + Self { + elem_opid: elemid.0, + pos: 0, + found: false, + encoding, + } + } + } + + pub(crate) fn index(&self) -> Option { + if self.found { + Some(self.pos) + } else { + None + } + } +} + +impl<'a> TreeQuery<'a> for ElemIdPos { + fn query_node(&mut self, child: &OpTreeNode, _ops: &[Op]) -> QueryResult { + if self.found { + return QueryResult::Finish; + } + // if index has our element then we can continue + if child.index.has_op(&self.elem_opid) { + // element is in this node somewhere + QueryResult::Descend + } else { + // not in this node, try the next one + self.pos += child.index.visible_len(self.encoding); + QueryResult::Next + } + } + + fn query_element(&mut self, element: &crate::types::Op) -> QueryResult { + if self.found { + return QueryResult::Finish; + } + if element.elemid() == Some(ElemId(self.elem_opid)) { + // this is it + self.found = true; + return QueryResult::Finish; + } else if element.visible() { + self.pos += element.width(self.encoding); + } + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/insert.rs b/rust/automerge/src/query/insert.rs new file mode 100644 index 00000000..0dc0e98d --- /dev/null +++ b/rust/automerge/src/query/insert.rs @@ -0,0 +1,125 @@ +use crate::error::AutomergeError; +use crate::op_tree::OpTreeNode; +use crate::query::{OpTree, QueryResult, TreeQuery}; +use crate::types::{ElemId, Key, ListEncoding, Op, HEAD}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct InsertNth { + /// the index in the realised list that we want to insert at + target: usize, + /// the number of visible operations seen + seen: usize, + last_width: usize, + encoding: ListEncoding, + //pub pos: usize, + /// the number of operations (including non-visible) that we have seen + n: usize, + valid: Option, + /// last_seen is the target elemid of the last `seen` operation. + /// It is used to avoid double counting visible elements (which arise through conflicts) that are split across nodes. + last_seen: Option, + last_insert: Option, + last_valid_insert: Option, +} + +impl InsertNth { + pub(crate) fn new(target: usize, encoding: ListEncoding) -> Self { + let (valid, last_valid_insert) = if target == 0 { + (Some(0), Some(Key::Seq(HEAD))) + } else { + (None, None) + }; + InsertNth { + target, + seen: 0, + last_width: 0, + encoding, + n: 0, + valid, + last_seen: None, + last_insert: None, + last_valid_insert, + } + } + + pub(crate) fn pos(&self) -> usize { + self.valid.unwrap_or(self.n) + } + + pub(crate) fn key(&self) -> Result { + self.last_valid_insert + .ok_or(AutomergeError::InvalidIndex(self.target)) + } +} + +impl<'a> TreeQuery<'a> for InsertNth { + fn equiv(&mut self, other: &Self) -> bool { + self.pos() == other.pos() && self.key() == other.key() + } + + fn can_shortcut_search(&mut self, tree: &'a OpTree) -> bool { + if let Some((index, pos)) = &tree.last_insert { + if let Some(op) = tree.internal.get(*pos) { + if *index + op.width(self.encoding) == self.target { + self.valid = Some(*pos + 1); + self.last_valid_insert = Some(op.elemid_or_key()); + return true; + } + } + } + false + } + + fn query_node(&mut self, child: &OpTreeNode, ops: &[Op]) -> QueryResult { + // if this node has some visible elements then we may find our target within + let mut num_vis = child.index.visible_len(self.encoding); + if let Some(last_seen) = self.last_seen { + if child.index.has_visible(&last_seen) { + num_vis -= 1; + } + } + + if self.seen + num_vis >= self.target { + // our target is within this node + QueryResult::Descend + } else { + // our target is not in this node so try the next one + self.n += child.len(); + self.seen += num_vis; + + // We have updated seen by the number of visible elements in this index, before we skip it. + // We also need to keep track of the last elemid that we have seen (and counted as seen). + // We can just use the elemid of the last op in this node as either: + // - the insert was at a previous node and this is a long run of overwrites so last_seen should already be set correctly + // - the visible op is in this node and the elemid references it so it can be set here + // - the visible op is in a future node and so it will be counted as seen there + let last_elemid = ops[child.last()].elemid_or_key(); + if child.index.has_visible(&last_elemid) { + self.last_seen = Some(last_elemid); + } + QueryResult::Next + } + } + + fn query_element(&mut self, element: &Op) -> QueryResult { + if element.insert { + if self.valid.is_none() && self.seen >= self.target { + self.valid = Some(self.n); + } + self.last_seen = None; + self.last_insert = element.elemid(); + } + if self.last_seen.is_none() && element.visible() { + if self.seen >= self.target { + return QueryResult::Finish; + } + self.last_width = element.width(self.encoding); + self.seen += self.last_width; + self.last_seen = Some(element.elemid_or_key()); + self.last_valid_insert = self.last_seen + } + self.n += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/keys.rs b/rust/automerge/src/query/keys.rs new file mode 100644 index 00000000..edda4fe9 --- /dev/null +++ b/rust/automerge/src/query/keys.rs @@ -0,0 +1,54 @@ +use crate::op_tree::OpTreeInternal; +use crate::types::Key; +use std::fmt::Debug; + +#[derive(Debug)] +pub(crate) struct Keys<'a> { + index: usize, + last_key: Option, + index_back: usize, + last_key_back: Option, + op_tree: &'a OpTreeInternal, +} + +impl<'a> Keys<'a> { + pub(crate) fn new(op_tree: &'a OpTreeInternal) -> Self { + Self { + index: 0, + last_key: None, + index_back: op_tree.len(), + last_key_back: None, + op_tree, + } + } +} + +impl<'a> Iterator for Keys<'a> { + type Item = Key; + + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + self.index += 1; + if Some(op.elemid_or_key()) != self.last_key && op.visible() { + self.last_key = Some(op.elemid_or_key()); + return Some(op.elemid_or_key()); + } + } + None + } +} + +impl<'a> DoubleEndedIterator for Keys<'a> { + fn next_back(&mut self) -> Option { + for i in (self.index..self.index_back).rev() { + let op = self.op_tree.get(i)?; + self.index_back -= 1; + if Some(op.elemid_or_key()) != self.last_key_back && op.visible() { + self.last_key_back = Some(op.elemid_or_key()); + return Some(op.elemid_or_key()); + } + } + None + } +} diff --git a/rust/automerge/src/query/keys_at.rs b/rust/automerge/src/query/keys_at.rs new file mode 100644 index 00000000..bf5b5e0e --- /dev/null +++ b/rust/automerge/src/query/keys_at.rs @@ -0,0 +1,61 @@ +use crate::op_tree::OpTreeInternal; +use crate::query::VisWindow; +use crate::types::{Clock, Key}; +use std::fmt::Debug; + +#[derive(Debug)] +pub(crate) struct KeysAt<'a> { + clock: Clock, + window: VisWindow, + index: usize, + last_key: Option, + index_back: usize, + last_key_back: Option, + op_tree: &'a OpTreeInternal, +} + +impl<'a> KeysAt<'a> { + pub(crate) fn new(op_tree: &'a OpTreeInternal, clock: Clock) -> Self { + Self { + clock, + window: VisWindow::default(), + index: 0, + last_key: None, + index_back: op_tree.len(), + last_key_back: None, + op_tree, + } + } +} + +impl<'a> Iterator for KeysAt<'a> { + type Item = Key; + + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + let visible = self.window.visible_at(op, i, &self.clock); + self.index += 1; + if Some(op.elemid_or_key()) != self.last_key && visible { + self.last_key = Some(op.elemid_or_key()); + return Some(op.elemid_or_key()); + } + } + None + } +} + +impl<'a> DoubleEndedIterator for KeysAt<'a> { + fn next_back(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + let visible = self.window.visible_at(op, i, &self.clock); + self.index_back -= 1; + if Some(op.elemid_or_key()) != self.last_key_back && visible { + self.last_key_back = Some(op.elemid_or_key()); + return Some(op.elemid_or_key()); + } + } + None + } +} diff --git a/rust/automerge/src/query/len.rs b/rust/automerge/src/query/len.rs new file mode 100644 index 00000000..9134b11f --- /dev/null +++ b/rust/automerge/src/query/len.rs @@ -0,0 +1,23 @@ +use crate::op_tree::OpTreeNode; +use crate::query::{QueryResult, TreeQuery}; +use crate::types::{ListEncoding, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Len { + pub(crate) len: usize, + encoding: ListEncoding, +} + +impl Len { + pub(crate) fn new(encoding: ListEncoding) -> Self { + Len { len: 0, encoding } + } +} + +impl<'a> TreeQuery<'a> for Len { + fn query_node(&mut self, child: &OpTreeNode, _ops: &[Op]) -> QueryResult { + self.len = child.index.visible_len(self.encoding); + QueryResult::Finish + } +} diff --git a/rust/automerge/src/query/len_at.rs b/rust/automerge/src/query/len_at.rs new file mode 100644 index 00000000..9380501e --- /dev/null +++ b/rust/automerge/src/query/len_at.rs @@ -0,0 +1,42 @@ +use crate::query::{QueryResult, TreeQuery, VisWindow}; +use crate::types::{Clock, ElemId, ListEncoding, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct LenAt { + pub(crate) len: usize, + clock: Clock, + pos: usize, + encoding: ListEncoding, + last: Option, + window: VisWindow, +} + +impl LenAt { + pub(crate) fn new(clock: Clock, encoding: ListEncoding) -> Self { + LenAt { + clock, + pos: 0, + len: 0, + encoding, + last: None, + window: Default::default(), + } + } +} + +impl<'a> TreeQuery<'a> for LenAt { + fn query_element(&mut self, op: &'a Op) -> QueryResult { + if op.insert { + self.last = None; + } + let elem = op.elemid(); + let visible = self.window.visible_at(op, self.pos, &self.clock); + if elem != self.last && visible { + self.len += op.width(self.encoding); + self.last = elem; + } + self.pos += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/list_range.rs b/rust/automerge/src/query/list_range.rs new file mode 100644 index 00000000..d01082ab --- /dev/null +++ b/rust/automerge/src/query/list_range.rs @@ -0,0 +1,67 @@ +use crate::exid::ExId; +use crate::op_tree::OpTreeInternal; +use crate::types::{ElemId, OpId}; +use crate::values::ValueIter; +use crate::{Automerge, Value}; +use std::fmt::Debug; +use std::ops::RangeBounds; + +#[derive(Debug)] +pub(crate) struct ListRange<'a, R: RangeBounds> { + range: R, + index: usize, + pos: usize, + last_elemid: Option, + next_result: Option<(usize, Value<'a>, OpId)>, + index_back: usize, + op_tree: &'a OpTreeInternal, +} + +impl<'a, R: RangeBounds> ListRange<'a, R> { + pub(crate) fn new(range: R, op_tree: &'a OpTreeInternal) -> Self { + Self { + range, + index: 0, // FIXME root_child.seek_to_pos(range.start) + pos: 0, // FIXME range.start + last_elemid: None, + next_result: None, + index_back: op_tree.len(), + op_tree, + } + } +} + +impl<'a, R: RangeBounds> ValueIter<'a> for ListRange<'a, R> { + fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)> { + self.next().map(|(_, val, id)| (val, doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> Iterator for ListRange<'a, R> { + type Item = (usize, Value<'a>, OpId); + + // FIXME: this is fine if we're scanning everything (see values()) but could be much more efficient + // if we're scanning a narrow range on a large sequence ... we should be able to seek to the starting + // point and stop at the end point and not needless scan all the ops before and after the range + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + self.index += 1; + if op.visible() { + if op.elemid() != self.last_elemid { + self.last_elemid = op.elemid(); + self.pos += 1; + if self.range.contains(&(self.pos - 1)) { + let result = self.next_result.replace((self.pos - 1, op.value(), op.id)); + if result.is_some() { + return result; + } + } + } else if self.pos > 0 && self.range.contains(&(self.pos - 1)) { + self.next_result = Some((self.pos - 1, op.value(), op.id)); + } + } + } + self.next_result.take() + } +} diff --git a/rust/automerge/src/query/list_range_at.rs b/rust/automerge/src/query/list_range_at.rs new file mode 100644 index 00000000..33cdf548 --- /dev/null +++ b/rust/automerge/src/query/list_range_at.rs @@ -0,0 +1,70 @@ +use super::VisWindow; +use crate::exid::ExId; +use crate::op_tree::OpTreeInternal; +use crate::types::{Clock, ElemId, OpId}; +use crate::values::ValueIter; +use crate::{Automerge, Value}; +use std::fmt::Debug; +use std::ops::RangeBounds; + +#[derive(Debug)] +pub(crate) struct ListRangeAt<'a, R: RangeBounds> { + range: R, + index: usize, + pos: usize, + last_elemid: Option, + next_result: Option<(usize, Value<'a>, OpId)>, + index_back: usize, + op_tree: &'a OpTreeInternal, + clock: Clock, + window: VisWindow, +} + +impl<'a, R: RangeBounds> ValueIter<'a> for ListRangeAt<'a, R> { + fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)> { + self.next().map(|(_, val, id)| (val, doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> ListRangeAt<'a, R> { + pub(crate) fn new(range: R, clock: Clock, op_tree: &'a OpTreeInternal) -> Self { + Self { + range, + index: 0, // FIXME root_child.seek_to_pos(range.start) + pos: 0, // FIXME range.start + last_elemid: None, + next_result: None, + index_back: op_tree.len(), + op_tree, + clock, + window: VisWindow::default(), + } + } +} + +impl<'a, R: RangeBounds> Iterator for ListRangeAt<'a, R> { + type Item = (usize, Value<'a>, OpId); + + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + let visible = self.window.visible_at(op, i, &self.clock); + self.index += 1; + if visible { + if op.elemid() != self.last_elemid { + self.last_elemid = op.elemid(); + self.pos += 1; + if self.range.contains(&(self.pos - 1)) { + let result = self.next_result.replace((self.pos - 1, op.value(), op.id)); + if result.is_some() { + return result; + } + } + } else if self.pos > 0 && self.range.contains(&(self.pos - 1)) { + self.next_result = Some((self.pos - 1, op.value(), op.id)); + } + } + } + self.next_result.take() + } +} diff --git a/rust/automerge/src/query/list_vals.rs b/rust/automerge/src/query/list_vals.rs new file mode 100644 index 00000000..6c056621 --- /dev/null +++ b/rust/automerge/src/query/list_vals.rs @@ -0,0 +1,36 @@ +use crate::op_tree::OpTreeNode; +use crate::query::{QueryResult, TreeQuery}; +use crate::types::{ElemId, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ListVals { + last_elem: Option, + pub(crate) ops: Vec, +} + +impl ListVals { + pub(crate) fn new() -> Self { + ListVals { + last_elem: None, + ops: vec![], + } + } +} + +impl<'a> TreeQuery<'a> for ListVals { + fn query_node(&mut self, child: &OpTreeNode, ops: &[Op]) -> QueryResult { + let start = 0; + for pos in start..child.len() { + let op = &ops[child.get(pos).unwrap()]; + if op.insert { + self.last_elem = None; + } + if self.last_elem.is_none() && op.visible() { + self.last_elem = op.elemid(); + self.ops.push(op.clone()); + } + } + QueryResult::Finish + } +} diff --git a/rust/automerge/src/query/list_vals_at.rs b/rust/automerge/src/query/list_vals_at.rs new file mode 100644 index 00000000..57c7596b --- /dev/null +++ b/rust/automerge/src/query/list_vals_at.rs @@ -0,0 +1,49 @@ +use crate::query::{OpSetMetadata, QueryResult, TreeQuery, VisWindow}; +use crate::types::{Clock, ElemId, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ListValsAt { + clock: Clock, + last_elem: Option, + pub(crate) ops: Vec, + window: VisWindow, + pos: usize, +} + +impl ListValsAt { + pub(crate) fn new(clock: Clock) -> Self { + ListValsAt { + clock, + last_elem: None, + ops: vec![], + window: Default::default(), + pos: 0, + } + } +} + +impl<'a> TreeQuery<'a> for ListValsAt { + fn query_element_with_metadata(&mut self, op: &'a Op, m: &OpSetMetadata) -> QueryResult { + if op.insert { + self.last_elem = None; + } + if self.last_elem.is_none() && self.window.visible_at(op, self.pos, &self.clock) { + for (_, vop) in self.window.seen_op(op, self.pos) { + self.last_elem = vop.elemid(); + if vop.is_counter() { + // this could be out of order - because of inc's - insert in the right place + let pos = self + .ops + .binary_search_by(|probe| m.lamport_cmp(probe.id, op.id)) + .unwrap_err(); + self.ops.insert(pos, vop); + } else { + self.ops.push(vop); + } + } + } + self.pos += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/map_range.rs b/rust/automerge/src/query/map_range.rs new file mode 100644 index 00000000..909312db --- /dev/null +++ b/rust/automerge/src/query/map_range.rs @@ -0,0 +1,106 @@ +use crate::exid::ExId; +use crate::op_tree::{OpSetMetadata, OpTreeInternal}; +use crate::types::{Key, OpId}; +use crate::values::ValueIter; +use crate::{Automerge, Value}; +use std::fmt::Debug; +use std::ops::RangeBounds; + +#[derive(Debug)] +pub(crate) struct MapRange<'a, R: RangeBounds> { + range: R, + index: usize, + last_key: Option, + next_result: Option<(&'a str, Value<'a>, OpId)>, + index_back: usize, + last_key_back: Option, + op_tree: &'a OpTreeInternal, + meta: &'a OpSetMetadata, +} + +impl<'a, R: RangeBounds> ValueIter<'a> for MapRange<'a, R> { + fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)> { + self.next().map(|(_, val, id)| (val, doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> MapRange<'a, R> { + pub(crate) fn new(range: R, op_tree: &'a OpTreeInternal, meta: &'a OpSetMetadata) -> Self { + Self { + range, + index: 0, + last_key: None, + next_result: None, + index_back: op_tree.len(), + last_key_back: None, + op_tree, + meta, + } + } +} + +impl<'a, R: RangeBounds> Iterator for MapRange<'a, R> { + type Item = (&'a str, Value<'a>, OpId); + + // FIXME: this is fine if we're scanning everything (see values()) but could be much more efficient + // if we're scanning a narrow range on a map with many keys... we should be able to seek to the starting + // point and stop at the end point and not needless scan all the ops before and after the range + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + self.index += 1; + if op.visible() { + let prop = match op.key { + Key::Map(m) => self.meta.props.get(m), + Key::Seq(_) => return None, // this is a list + }; + if self.range.contains(prop) { + let result = self.next_result.replace((prop, op.value(), op.id)); + if Some(op.key) != self.last_key { + self.last_key = Some(op.key); + if result.is_some() { + return result; + } + } + } + } + } + self.next_result.take() + } +} + +impl<'a, R: RangeBounds> DoubleEndedIterator for MapRange<'a, R> { + fn next_back(&mut self) -> Option { + for i in (self.index..self.index_back).rev() { + let op = self.op_tree.get(i)?; + self.index_back -= 1; + + if Some(op.key) != self.last_key_back && op.visible() { + self.last_key_back = Some(op.key); + let prop = match op.key { + Key::Map(m) => self.meta.props.get(m), + Key::Seq(_) => return None, // this is a list + }; + if self.range.contains(prop) { + return Some((prop, op.value(), op.id)); + } + } + } + + // we're now overlapping the index and index_back so try and take the result from the next query + if let Some((prop, a, b)) = self.next_result.take() { + let last_prop = match self.last_key_back { + None => None, + Some(Key::Map(u)) => Some(self.meta.props.get(u).as_str()), + Some(Key::Seq(_)) => None, + }; + + // we can only use this result if we haven't ended in the prop's state (to account for + // conflicts). + if Some(prop) != last_prop { + return Some((prop, a, b)); + } + } + None + } +} diff --git a/rust/automerge/src/query/map_range_at.rs b/rust/automerge/src/query/map_range_at.rs new file mode 100644 index 00000000..c5c5af06 --- /dev/null +++ b/rust/automerge/src/query/map_range_at.rs @@ -0,0 +1,119 @@ +use crate::clock::Clock; +use crate::exid::ExId; +use crate::op_tree::{OpSetMetadata, OpTreeInternal}; +use crate::types::{Key, OpId}; +use crate::values::ValueIter; +use crate::{Automerge, Value}; +use std::fmt::Debug; +use std::ops::RangeBounds; + +use super::VisWindow; + +#[derive(Debug)] +pub(crate) struct MapRangeAt<'a, R: RangeBounds> { + clock: Clock, + window: VisWindow, + + range: R, + index: usize, + last_key: Option, + next_result: Option<(&'a str, Value<'a>, OpId)>, + + index_back: usize, + last_key_back: Option, + + op_tree: &'a OpTreeInternal, + meta: &'a OpSetMetadata, +} + +impl<'a, R: RangeBounds> ValueIter<'a> for MapRangeAt<'a, R> { + fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)> { + self.next().map(|(_, val, id)| (val, doc.id_to_exid(id))) + } +} + +impl<'a, R: RangeBounds> MapRangeAt<'a, R> { + pub(crate) fn new( + range: R, + op_tree: &'a OpTreeInternal, + meta: &'a OpSetMetadata, + clock: Clock, + ) -> Self { + Self { + clock, + window: VisWindow::default(), + range, + index: 0, + last_key: None, + next_result: None, + index_back: op_tree.len(), + last_key_back: None, + op_tree, + meta, + } + } +} + +impl<'a, R: RangeBounds> Iterator for MapRangeAt<'a, R> { + type Item = (&'a str, Value<'a>, OpId); + + fn next(&mut self) -> Option { + for i in self.index..self.index_back { + let op = self.op_tree.get(i)?; + let visible = self.window.visible_at(op, i, &self.clock); + self.index += 1; + if visible { + let prop = match op.key { + Key::Map(m) => self.meta.props.get(m), + Key::Seq(_) => return None, // this is a list + }; + if self.range.contains(prop) { + let result = self.next_result.replace((prop, op.value(), op.id)); + if Some(op.key) != self.last_key { + self.last_key = Some(op.key); + if result.is_some() { + return result; + } + } + } + } + } + self.next_result.take() + } +} + +impl<'a, R: RangeBounds> DoubleEndedIterator for MapRangeAt<'a, R> { + fn next_back(&mut self) -> Option { + for i in (self.index..self.index_back).rev() { + let op = self.op_tree.get(i)?; + let visible = self.window.visible_at(op, i, &self.clock); + self.index_back -= 1; + if Some(op.key) != self.last_key_back && visible { + self.last_key_back = Some(op.key); + let prop = match op.key { + Key::Map(m) => self.meta.props.get(m), + Key::Seq(_) => return None, // this is a list + }; + if self.range.contains(prop) { + return Some((prop, op.value(), op.id)); + } + } + } + + // we're now overlapping the index and index_back so try and take the result from the next query + if let Some((prop, a, b)) = self.next_result.take() { + let last_prop = match self.last_key_back { + None => None, + Some(Key::Map(u)) => Some(self.meta.props.get(u).as_str()), + Some(Key::Seq(_)) => None, + }; + + // we can only use this result if we haven't ended in the prop's state (to account for + // conflicts). + if Some(prop) != last_prop { + return Some((prop, a, b)); + } + } + None + } +} diff --git a/rust/automerge/src/query/nth.rs b/rust/automerge/src/query/nth.rs new file mode 100644 index 00000000..ed374b9b --- /dev/null +++ b/rust/automerge/src/query/nth.rs @@ -0,0 +1,127 @@ +use crate::error::AutomergeError; +use crate::op_set::OpSet; +use crate::op_tree::{OpTree, OpTreeNode}; +use crate::query::{QueryResult, TreeQuery}; +use crate::types::{Key, ListEncoding, Op, OpIds}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Nth<'a> { + target: usize, + seen: usize, + encoding: ListEncoding, + last_width: usize, + /// last_seen is the target elemid of the last `seen` operation. + /// It is used to avoid double counting visible elements (which arise through conflicts) that are split across nodes. + last_seen: Option, + pub(crate) ops: Vec<&'a Op>, + pub(crate) ops_pos: Vec, + pub(crate) pos: usize, +} + +impl<'a> Nth<'a> { + pub(crate) fn new(target: usize, encoding: ListEncoding) -> Self { + Nth { + target, + seen: 0, + last_width: 1, + encoding, + last_seen: None, + ops: vec![], + ops_pos: vec![], + pos: 0, + } + } + + pub(crate) fn pred(&self, ops: &OpSet) -> OpIds { + ops.m.sorted_opids(self.ops.iter().map(|o| o.id)) + } + + /// Get the key + pub(crate) fn key(&self) -> Result { + // the query collects the ops so we can use that to get the key they all use + if let Some(e) = self.ops.first().and_then(|op| op.elemid()) { + Ok(Key::Seq(e)) + } else { + Err(AutomergeError::InvalidIndex(self.target)) + } + } + + pub(crate) fn index(&self) -> usize { + self.seen - self.last_width + } +} + +impl<'a> TreeQuery<'a> for Nth<'a> { + fn equiv(&mut self, other: &Self) -> bool { + self.index() == other.index() && self.key() == other.key() + } + + fn can_shortcut_search(&mut self, tree: &'a OpTree) -> bool { + if let Some((index, pos)) = &tree.last_insert { + if *index == self.target { + if let Some(op) = tree.internal.get(*pos) { + self.last_width = op.width(self.encoding); + self.seen = *index + self.last_width; + self.ops.push(op); + self.ops_pos.push(*pos); + self.pos = *pos + 1; + return true; + } + } + } + false + } + + fn query_node(&mut self, child: &OpTreeNode, ops: &[Op]) -> QueryResult { + let mut num_vis = child.index.visible_len(self.encoding); + if let Some(last_seen) = self.last_seen { + if child.index.has_visible(&last_seen) { + num_vis -= 1; + } + } + + if self.seen + num_vis > self.target { + QueryResult::Descend + } else { + // skip this node as no useful ops in it + self.pos += child.len(); + self.seen += num_vis; + + // We have updated seen by the number of visible elements in this index, before we skip it. + // We also need to keep track of the last elemid that we have seen (and counted as seen). + // We can just use the elemid of the last op in this node as either: + // - the insert was at a previous node and this is a long run of overwrites so last_seen should already be set correctly + // - the visible op is in this node and the elemid references it so it can be set here + // - the visible op is in a future node and so it will be counted as seen there + let last_elemid = ops[child.last()].elemid_or_key(); + if child.index.has_visible(&last_elemid) { + self.last_seen = Some(last_elemid); + } + QueryResult::Next + } + } + + fn query_element(&mut self, element: &'a Op) -> QueryResult { + if element.insert { + if self.seen > self.target { + return QueryResult::Finish; + } + // we have a new potentially visible element so reset last_seen + self.last_seen = None + } + let visible = element.visible(); + if visible && self.last_seen.is_none() { + self.last_width = element.width(self.encoding); + self.seen += self.last_width; + // we have a new visible element + self.last_seen = Some(element.elemid_or_key()) + } + if self.seen > self.target && visible { + self.ops.push(element); + self.ops_pos.push(self.pos); + } + self.pos += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/nth_at.rs b/rust/automerge/src/query/nth_at.rs new file mode 100644 index 00000000..e193ca03 --- /dev/null +++ b/rust/automerge/src/query/nth_at.rs @@ -0,0 +1,67 @@ +use crate::query::{QueryResult, TreeQuery, VisWindow}; +use crate::types::{Clock, ElemId, ListEncoding, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct NthAt { + clock: Clock, + target: usize, + seen: usize, + encoding: ListEncoding, + last_seen: Option, + window: VisWindow, + pub(crate) ops: Vec, + pub(crate) ops_pos: Vec, + pub(crate) pos: usize, +} + +impl NthAt { + pub(crate) fn new(target: usize, clock: Clock, encoding: ListEncoding) -> Self { + NthAt { + clock, + target, + seen: 0, + encoding, + last_seen: None, + ops: vec![], + ops_pos: vec![], + pos: 0, + window: Default::default(), + } + } +} + +impl<'a> TreeQuery<'a> for NthAt { + fn query_element(&mut self, element: &'a Op) -> QueryResult { + if element.insert { + if self.seen > self.target { + return QueryResult::Finish; + }; + self.last_seen = None + } + let visible = self.window.visible_at(element, self.pos, &self.clock); + if visible && self.last_seen.is_none() { + self.seen += element.width(self.encoding); + self.last_seen = element.elemid() + } + if self.seen > self.target && visible { + for (vpos, vop) in self.window.seen_op(element, self.pos) { + if vop.is_counter() { + // this could be out of order because of inc's - we can find the right place + // since pos will always be in order + let pos = self + .ops_pos + .binary_search_by(|probe| probe.cmp(&vpos)) + .unwrap_err(); + self.ops.insert(pos, vop); + self.ops_pos.insert(pos, vpos); + } else { + self.ops.push(vop); + self.ops_pos.push(vpos); + } + } + } + self.pos += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/opid.rs b/rust/automerge/src/query/opid.rs new file mode 100644 index 00000000..3d4c8b24 --- /dev/null +++ b/rust/automerge/src/query/opid.rs @@ -0,0 +1,54 @@ +use crate::op_tree::OpTreeNode; +use crate::query::{QueryResult, TreeQuery}; +use crate::types::{Key, Op, OpId}; + +/// Search for an OpId in a tree. +/// Returns the index of the operation in the tree. +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct OpIdSearch { + target: OpId, + pos: usize, + found: bool, + key: Option, +} + +impl OpIdSearch { + pub(crate) fn new(target: OpId) -> Self { + OpIdSearch { + target, + pos: 0, + found: false, + key: None, + } + } + + /// Get the index of the operation, if found. + pub(crate) fn index(&self) -> Option { + if self.found { + Some(self.pos) + } else { + None + } + } +} + +impl<'a> TreeQuery<'a> for OpIdSearch { + fn query_node(&mut self, child: &OpTreeNode, _ops: &[Op]) -> QueryResult { + if child.index.ops.contains(&self.target) { + QueryResult::Descend + } else { + self.pos += child.len(); + QueryResult::Next + } + } + + fn query_element(&mut self, element: &Op) -> QueryResult { + if element.id == self.target { + self.found = true; + QueryResult::Finish + } else { + self.pos += 1; + QueryResult::Next + } + } +} diff --git a/rust/automerge/src/query/opid_vis.rs b/rust/automerge/src/query/opid_vis.rs new file mode 100644 index 00000000..c0d2cc89 --- /dev/null +++ b/rust/automerge/src/query/opid_vis.rs @@ -0,0 +1,62 @@ +use crate::op_tree::OpTreeNode; +use crate::query::{QueryResult, TreeQuery}; +use crate::types::{Key, Op, OpId}; + +/// Search for an OpId in a tree. +/// Returns the index of the operation in the tree. +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct OpIdVisSearch { + target: OpId, + found: bool, + pub(crate) visible: bool, + key: Option, +} + +impl OpIdVisSearch { + pub(crate) fn new(target: OpId) -> Self { + OpIdVisSearch { + target, + found: false, + visible: true, + key: None, + } + } + + pub(crate) fn key(&self) -> &Option { + &self.key + } +} + +impl<'a> TreeQuery<'a> for OpIdVisSearch { + fn query_node(&mut self, child: &OpTreeNode, _ops: &[Op]) -> QueryResult { + if child.index.ops.contains(&self.target) { + QueryResult::Descend + } else { + QueryResult::Next + } + } + + fn query_element(&mut self, element: &Op) -> QueryResult { + if element.id == self.target { + self.found = true; + self.key = Some(element.elemid_or_key()); + if element.visible() { + QueryResult::Next + } else { + self.visible = false; + QueryResult::Finish + } + } else if self.found { + if self.key != Some(element.elemid_or_key()) { + QueryResult::Finish + } else if element.visible() { + self.visible = false; + QueryResult::Finish + } else { + QueryResult::Next + } + } else { + QueryResult::Next + } + } +} diff --git a/rust/automerge/src/query/prop.rs b/rust/automerge/src/query/prop.rs new file mode 100644 index 00000000..d2a11361 --- /dev/null +++ b/rust/automerge/src/query/prop.rs @@ -0,0 +1,49 @@ +use crate::op_tree::{OpSetMetadata, OpTreeNode}; +use crate::query::{binary_search_by, QueryResult, TreeQuery}; +use crate::types::{Key, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Prop<'a> { + key: Key, + pub(crate) ops: Vec<&'a Op>, + pub(crate) ops_pos: Vec, + pub(crate) pos: usize, +} + +impl<'a> Prop<'a> { + pub(crate) fn new(prop: usize) -> Self { + Prop { + key: Key::Map(prop), + ops: vec![], + ops_pos: vec![], + pos: 0, + } + } +} + +impl<'a> TreeQuery<'a> for Prop<'a> { + fn query_node_with_metadata( + &mut self, + child: &'a OpTreeNode, + m: &OpSetMetadata, + ops: &[Op], + ) -> QueryResult { + let start = binary_search_by(child, ops, |op| m.key_cmp(&op.key, &self.key)); + self.pos = start; + QueryResult::Skip(start) + } + + fn query_element(&mut self, op: &'a Op) -> QueryResult { + // don't bother looking at things past our key + if op.key != self.key { + return QueryResult::Finish; + } + if op.visible() { + self.ops.push(op); + self.ops_pos.push(self.pos); + } + self.pos += 1; + QueryResult::Next + } +} diff --git a/rust/automerge/src/query/prop_at.rs b/rust/automerge/src/query/prop_at.rs new file mode 100644 index 00000000..f0c2eedc --- /dev/null +++ b/rust/automerge/src/query/prop_at.rs @@ -0,0 +1,63 @@ +use crate::op_tree::{OpSetMetadata, OpTreeNode}; +use crate::query::{binary_search_by, QueryResult, TreeQuery, VisWindow}; +use crate::types::{Clock, Key, Op}; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct PropAt { + clock: Clock, + key: Key, + pub(crate) ops: Vec, + pub(crate) ops_pos: Vec, + pub(crate) pos: usize, +} + +impl PropAt { + pub(crate) fn new(prop: usize, clock: Clock) -> Self { + PropAt { + clock, + key: Key::Map(prop), + ops: vec![], + ops_pos: vec![], + pos: 0, + } + } +} + +impl<'a> TreeQuery<'a> for PropAt { + fn query_node_with_metadata( + &mut self, + child: &'a OpTreeNode, + m: &OpSetMetadata, + ops: &[Op], + ) -> QueryResult { + let start = binary_search_by(child, ops, |op| m.key_cmp(&op.key, &self.key)); + let mut window: VisWindow = Default::default(); + self.pos = start; + for pos in start..child.len() { + let op = &ops[child.get(pos).unwrap()]; + if op.key != self.key { + break; + } + if window.visible_at(op, pos, &self.clock) { + for (vpos, vop) in window.seen_op(op, pos) { + if vop.is_counter() { + // this could be out of order because of inc's - we can find the right place + // since pos will always be in order + let pos = self + .ops_pos + .binary_search_by(|probe| probe.cmp(&vpos)) + .unwrap_err(); + self.ops.insert(pos, vop); + self.ops_pos.insert(pos, vpos); + } else { + self.ops.push(vop); + self.ops_pos.push(vpos); + } + } + } + self.pos += 1; + } + QueryResult::Finish + } +} diff --git a/rust/automerge/src/query/seek_op.rs b/rust/automerge/src/query/seek_op.rs new file mode 100644 index 00000000..2ed875d2 --- /dev/null +++ b/rust/automerge/src/query/seek_op.rs @@ -0,0 +1,247 @@ +use crate::op_tree::{OpSetMetadata, OpTreeNode}; +use crate::query::{binary_search_by, QueryResult, TreeQuery}; +use crate::types::{Key, Op, HEAD}; +use std::cmp::Ordering; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct SeekOp<'a> { + /// the op we are looking for + op: &'a Op, + /// The position to insert at + pub(crate) pos: usize, + /// The indices of ops that this op overwrites + pub(crate) succ: Vec, + /// whether a position has been found + found: bool, +} + +impl<'a> SeekOp<'a> { + pub(crate) fn new(op: &'a Op) -> Self { + SeekOp { + op, + succ: vec![], + pos: 0, + found: false, + } + } + + fn lesser_insert(&self, op: &Op, m: &OpSetMetadata) -> bool { + op.insert && m.lamport_cmp(op.id, self.op.id) == Ordering::Less + } + + fn greater_opid(&self, op: &Op, m: &OpSetMetadata) -> bool { + m.lamport_cmp(op.id, self.op.id) == Ordering::Greater + } + + fn is_target_insert(&self, op: &Op) -> bool { + op.insert && op.elemid() == self.op.key.elemid() + } +} + +impl<'a> TreeQuery<'a> for SeekOp<'a> { + fn query_node_with_metadata( + &mut self, + child: &OpTreeNode, + m: &OpSetMetadata, + ops: &[Op], + ) -> QueryResult { + if self.found { + return QueryResult::Descend; + } + match self.op.key { + Key::Seq(HEAD) => { + while self.pos < child.len() { + let op = &ops[child.get(self.pos).unwrap()]; + if op.insert && m.lamport_cmp(op.id, self.op.id) == Ordering::Less { + break; + } + self.pos += 1; + } + QueryResult::Finish + } + Key::Seq(e) => { + if child.index.ops.contains(&e.0) { + QueryResult::Descend + } else { + self.pos += child.len(); + QueryResult::Next + } + } + Key::Map(_) => { + let start = binary_search_by(child, ops, |op| m.key_cmp(&op.key, &self.op.key)); + self.pos = start; + QueryResult::Skip(start) + } + } + } + + fn query_element_with_metadata(&mut self, e: &Op, m: &OpSetMetadata) -> QueryResult { + match self.op.key { + Key::Map(_) => { + // don't bother looking at things past our key + if e.key != self.op.key { + return QueryResult::Finish; + } + + if self.op.overwrites(e) { + self.succ.push(self.pos); + } + + if m.lamport_cmp(e.id, self.op.id) == Ordering::Greater { + return QueryResult::Finish; + } + + self.pos += 1; + QueryResult::Next + } + Key::Seq(_) => { + if !self.found { + if self.is_target_insert(e) { + self.found = true; + if self.op.overwrites(e) { + self.succ.push(self.pos); + } + } + self.pos += 1; + QueryResult::Next + } else { + // we have already found the target + if self.op.overwrites(e) { + self.succ.push(self.pos); + } + if self.op.insert { + if self.lesser_insert(e, m) { + QueryResult::Finish + } else { + self.pos += 1; + QueryResult::Next + } + } else if e.insert || self.greater_opid(e, m) { + QueryResult::Finish + } else { + self.pos += 1; + QueryResult::Next + } + } + } + } + } +} + +#[cfg(test)] +pub(crate) mod tests { + use crate::{ + op_set::OpSet, + op_tree::B, + query::SeekOp, + types::{Key, ObjId, Op, OpId}, + ActorId, ScalarValue, + }; + + /// Create an optree in which the only visible ops are on the boundaries of the nodes, + /// i.e. the visible elements are in the internal nodes. Like so + /// + /// ```notrust + /// + /// .----------------------. + /// | id | key | succ | + /// | B | "a" | | + /// | 2B | "b" | | + /// '----------------------' + /// / | \ + /// ;------------------------. | `------------------------------------. + /// | id | op | succ | | | id | op | succ | + /// | 0 |set "a" | 1 | | | 2B + 1 |set "c" | 2B + 2 | + /// | 1 |set "a" | 2 | | | 2B + 2 |set "c" | 2B + 3 | + /// | 2 |set "a" | 3 | | ... + /// ... | | 3B |set "c" | | + /// | B - 1 |set "a" | B | | '------------------------------------' + /// '--------'--------'------' | + /// | + /// .-----------------------------. + /// | id | key | succ | + /// | B + 1 | "b" | B + 2 | + /// | B + 2 | "b" | B + 3 | + /// .... + /// | B + (B - 1 | "b" | 2B | + /// '-----------------------------' + /// ``` + /// + /// The important point here is that the leaf nodes contain no visible ops for keys "a" and + /// "b". + /// + /// # Returns + /// + /// The opset in question and an op which should be inserted at the next position after the + /// internally visible ops. + pub(crate) fn optree_with_only_internally_visible_ops() -> (OpSet, Op) { + let mut set = OpSet::new(); + let actor = set.m.actors.cache(ActorId::random()); + let a = set.m.props.cache("a".to_string()); + let b = set.m.props.cache("b".to_string()); + let c = set.m.props.cache("c".to_string()); + + let mut counter = 0; + // For each key insert `B` operations with the `pred` and `succ` setup such that the final + // operation for each key is the only visible op. + for key in [a, b, c] { + for iteration in 0..B { + // Generate a value to insert + let keystr = set.m.props.get(key); + let val = keystr.repeat(iteration + 1); + + // Only the last op is visible + let pred = if iteration == 0 { + Default::default() + } else { + set.m + .sorted_opids(vec![OpId::new(counter - 1, actor)].into_iter()) + }; + + // only the last op is visible + let succ = if iteration == B - 1 { + Default::default() + } else { + set.m + .sorted_opids(vec![OpId::new(counter, actor)].into_iter()) + }; + + let op = Op { + id: OpId::new(counter, actor), + action: crate::OpType::Put(ScalarValue::Str(val.into())), + key: Key::Map(key), + succ, + pred, + insert: false, + }; + set.insert(counter as usize, &ObjId::root(), op); + counter += 1; + } + } + + // Now try and create an op which inserts at the next index of 'a' + let new_op = Op { + id: OpId::new(counter, actor), + action: crate::OpType::Put(ScalarValue::Str("test".into())), + key: Key::Map(a), + succ: Default::default(), + pred: set + .m + .sorted_opids(std::iter::once(OpId::new(B as u64 - 1, actor))), + insert: false, + }; + (set, new_op) + } + + #[test] + fn seek_on_page_boundary() { + let (set, new_op) = optree_with_only_internally_visible_ops(); + + let q = SeekOp::new(&new_op); + let q = set.search(&ObjId::root(), q); + + // we've inserted `B - 1` elements for "a", so the index should be `B` + assert_eq!(q.pos, B); + } +} diff --git a/rust/automerge/src/query/seek_op_with_patch.rs b/rust/automerge/src/query/seek_op_with_patch.rs new file mode 100644 index 00000000..cd30f5bb --- /dev/null +++ b/rust/automerge/src/query/seek_op_with_patch.rs @@ -0,0 +1,291 @@ +use crate::op_tree::{OpSetMetadata, OpTreeNode}; +use crate::query::{binary_search_by, QueryResult, TreeQuery}; +use crate::types::{Key, ListEncoding, Op, HEAD}; +use std::cmp::Ordering; +use std::fmt::Debug; + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct SeekOpWithPatch<'a> { + op: Op, + pub(crate) pos: usize, + pub(crate) succ: Vec, + found: bool, + encoding: ListEncoding, + pub(crate) seen: usize, + pub(crate) last_width: usize, + last_seen: Option, + pub(crate) values: Vec<&'a Op>, + pub(crate) had_value_before: bool, +} + +impl<'a> SeekOpWithPatch<'a> { + pub(crate) fn new(op: &Op, encoding: ListEncoding) -> Self { + SeekOpWithPatch { + op: op.clone(), + succ: vec![], + pos: 0, + found: false, + encoding, + seen: 0, + last_width: 0, + last_seen: None, + values: vec![], + had_value_before: false, + } + } + + fn lesser_insert(&self, op: &Op, m: &OpSetMetadata) -> bool { + op.insert && m.lamport_cmp(op.id, self.op.id) == Ordering::Less + } + + fn greater_opid(&self, op: &Op, m: &OpSetMetadata) -> bool { + m.lamport_cmp(op.id, self.op.id) == Ordering::Greater + } + + fn is_target_insert(&self, op: &Op) -> bool { + op.insert && op.elemid() == self.op.key.elemid() + } + + /// Keeps track of the number of visible list elements we have seen. Increments `self.seen` if + /// operation `e` associates a visible value with a list element, and if we have not already + /// counted that list element (this ensures that if a list element has several values, i.e. + /// a conflict, then it is still only counted once). + fn count_visible(&mut self, e: &Op) { + if e.elemid() == self.op.elemid() { + return; + } + if e.insert { + self.last_seen = None + } + if e.visible() && self.last_seen.is_none() { + self.seen += e.width(self.encoding); + self.last_seen = Some(e.elemid_or_key()) + } + } +} + +impl<'a> TreeQuery<'a> for SeekOpWithPatch<'a> { + fn query_node_with_metadata( + &mut self, + child: &'a OpTreeNode, + m: &OpSetMetadata, + ops: &[Op], + ) -> QueryResult { + if self.found { + return QueryResult::Descend; + } + match self.op.key { + // Special case for insertion at the head of the list (`e == HEAD` is only possible for + // an insertion operation). Skip over any list elements whose elemId is greater than + // the opId of the operation being inserted. + Key::Seq(e) if e == HEAD => { + while self.pos < child.len() { + let op = &ops[child.get(self.pos).unwrap()]; + if op.insert && m.lamport_cmp(op.id, self.op.id) == Ordering::Less { + break; + } + self.count_visible(op); + self.pos += 1; + } + QueryResult::Finish + } + + // Updating a list: search for the tree node that contains the new operation's + // reference element (i.e. the element we're updating or inserting after) + Key::Seq(e) => { + if self.found || child.index.ops.contains(&e.0) { + QueryResult::Descend + } else { + self.pos += child.len(); + + // When we skip over a subtree, we need to count the number of visible list + // elements we're skipping over. Each node stores the number of visible + // elements it contains. However, it could happen that a visible element is + // split across two tree nodes. To avoid double-counting in this situation, we + // subtract one if the last visible element also appears in this tree node. + let mut num_vis = child.index.visible_len(self.encoding); + if num_vis > 0 { + // FIXME: I think this is wrong: we should subtract one only if this + // subtree contains a *visible* (i.e. empty succs) operation for the list + // element with elemId `last_seen`; this will subtract one even if all + // values for this list element have been deleted in this subtree. + if let Some(last_seen) = self.last_seen { + if child.index.has_visible(&last_seen) { + num_vis -= 1; + } + } + self.seen += num_vis; + + // FIXME: this is also wrong: `last_seen` needs to be the elemId of the + // last *visible* list element in this subtree, but I think this returns + // the last operation's elemId regardless of whether it's visible or not. + // This will lead to incorrect counting if `last_seen` is not visible: it's + // not counted towards `num_vis`, so we shouldn't be subtracting 1. + self.last_seen = Some(ops[child.last()].elemid_or_key()); + } + QueryResult::Next + } + } + + // Updating a map: operations appear in sorted order by key + Key::Map(_) => { + let start = binary_search_by(child, ops, |op| m.key_cmp(&op.key, &self.op.key)); + self.pos = start; + QueryResult::Skip(start) + } + } + } + + // Only called when operating on a sequence (list/text) object, since updates of a map are + // handled in `query_node_with_metadata`. + fn query_element_with_metadata(&mut self, e: &'a Op, m: &OpSetMetadata) -> QueryResult { + match self.op.key { + Key::Map(_) => { + if !self.found { + // Iterate over any existing operations for the same key; stop when we reach an + // operation with a different key + if e.key != self.op.key { + return QueryResult::Finish; + } + + // Keep track of any ops we're overwriting and any conflicts on this key + if self.op.overwrites(e) { + // when we encounter an increment op we also want to find the counter for + // it. + if self.op.is_inc() && e.is_counter() && e.visible() { + self.values.push(e); + } + self.succ.push(self.pos); + self.last_width = e.width(self.encoding); + + if e.visible() { + self.had_value_before = true; + } + } else if e.visible() { + self.values.push(e); + } + + // Ops for the same key should be in ascending order of opId, so we break when + // we reach an op with an opId greater than that of the new operation + if m.lamport_cmp(e.id, self.op.id) == Ordering::Greater { + self.found = true; + return QueryResult::Next; + } + + self.pos += 1; + } else { + // For the purpose of reporting conflicts, we also need to take into account any + // ops for the same key that appear after the new operation + + if e.key != self.op.key { + return QueryResult::Finish; + } + // No need to check if `self.op.overwrites(op)` because an operation's `preds` + // must always have lower Lamport timestamps than that op itself, and the ops + // here all have greater opIds than the new op + if e.visible() { + self.values.push(e); + } + } + QueryResult::Next + } + Key::Seq(_) => { + let result = if !self.found { + // First search for the referenced list element (i.e. the element we're updating, or + // after which we're inserting) + if self.is_target_insert(e) { + self.found = true; + if self.op.overwrites(e) { + // when we encounter an increment op we also want to find the counter for + // it. + if self.op.is_inc() && e.is_counter() && e.visible() { + self.values.push(e); + } + self.succ.push(self.pos); + self.last_width = e.width(self.encoding); + } + if e.visible() { + self.had_value_before = true; + } + } + self.pos += 1; + QueryResult::Next + } else { + // Once we've found the reference element, keep track of any ops that we're overwriting + let overwritten = self.op.overwrites(e); + if overwritten { + // when we encounter an increment op we also want to find the counter for + // it. + if self.op.is_inc() && e.is_counter() && e.visible() { + self.values.push(e); + } + self.succ.push(self.pos); + self.last_width = e.width(self.encoding); + } + + // If the new op is an insertion, skip over any existing list elements whose elemId is + // greater than the ID of the new insertion + if self.op.insert { + if self.lesser_insert(e, m) { + // Insert before the first existing list element whose elemId is less than that + // of the new insertion + QueryResult::Finish + } else { + self.pos += 1; + QueryResult::Next + } + } else if e.insert { + // If the new op is an update of an existing list element, the first insertion op + // we encounter after the reference element indicates the end of the reference elem + QueryResult::Finish + } else { + // When updating an existing list element, keep track of any conflicts on this list + // element. We also need to remember if the list element had any visible elements + // prior to applying the new operation: if not, the new operation is resurrecting + // a deleted list element, so it looks like an insertion in the patch. + if e.visible() { + self.had_value_before = true; + if !overwritten { + self.values.push(e); + } + } + + // We now need to put the ops for the same list element into ascending order, so we + // skip over any ops whose ID is less than that of the new operation. + if !self.greater_opid(e, m) { + self.pos += 1; + } + QueryResult::Next + } + }; + + // The patch needs to know the list index of each operation, so we count the number of + // visible list elements up to the insertion position of the new operation + if result == QueryResult::Next { + self.count_visible(e); + } + result + } + } + } +} + +#[cfg(test)] +mod tests { + use super::{super::seek_op::tests::optree_with_only_internally_visible_ops, SeekOpWithPatch}; + use crate::{ + op_tree::B, + types::{ListEncoding, ObjId}, + }; + + #[test] + fn test_insert_on_internal_only_nodes() { + let (set, new_op) = optree_with_only_internally_visible_ops(); + + let q = SeekOpWithPatch::new(&new_op, ListEncoding::List); + let q = set.search(&ObjId::root(), q); + + // we've inserted `B - 1` elements for "a", so the index should be `B` + assert_eq!(q.pos, B); + } +} diff --git a/rust/automerge/src/read.rs b/rust/automerge/src/read.rs new file mode 100644 index 00000000..6d479718 --- /dev/null +++ b/rust/automerge/src/read.rs @@ -0,0 +1,199 @@ +use crate::{ + error::AutomergeError, exid::ExId, keys::Keys, keys_at::KeysAt, list_range::ListRange, + list_range_at::ListRangeAt, map_range::MapRange, map_range_at::MapRangeAt, parents::Parents, + values::Values, Change, ChangeHash, ObjType, Prop, Value, +}; + +use std::ops::RangeBounds; + +/// Methods for reading values from an automerge document +/// +/// Many of the methods on this trait have an alternate `*_at` version which +/// takes an additional argument of `&[ChangeHash]`. This allows you to retrieve +/// the value at a particular point in the document history identified by the +/// given change hashes. +pub trait ReadDoc { + /// Get the parents of an object in the document tree. + /// + /// See the documentation for [`Parents`] for more details. + /// + /// ### Errors + /// + /// Returns an error when the id given is not the id of an object in this document. + /// This function does not get the parents of scalar values contained within objects. + /// + /// ### Experimental + /// + /// This function may in future be changed to allow getting the parents from the id of a scalar + /// value. + fn parents>(&self, obj: O) -> Result, AutomergeError>; + + /// Get the path to an object + /// + /// "path" here means the sequence of `(object Id, key)` pairs which leads + /// to the object in question. + /// + /// ### Errors + /// + /// * If the object ID `obj` is not in the document + fn path_to_object>(&self, obj: O) -> Result, AutomergeError>; + + /// Get the keys of the object `obj`. + /// + /// For a map this returns the keys of the map. + /// For a list this returns the element ids (opids) encoded as strings. + fn keys>(&self, obj: O) -> Keys<'_, '_>; + + /// Get the keys of the object `obj` as at `heads` + /// + /// See [`Self::keys`] + fn keys_at>(&self, obj: O, heads: &[ChangeHash]) -> KeysAt<'_, '_>; + + /// Iterate over the keys and values of the map `obj` in the given range. + /// + /// If the object correspoding to `obj` is a list then this will return an empty iterator + /// + /// The returned iterator yields `(key, value, exid)` tuples, where the + /// third element is the ID of the operation which created the value. + fn map_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> MapRange<'_, R>; + + /// Iterate over the keys and values of the map `obj` in the given range as + /// at `heads` + /// + /// If the object correspoding to `obj` is a list then this will return an empty iterator + /// + /// The returned iterator yields `(key, value, exid)` tuples, where the + /// third element is the ID of the operation which created the value. + /// + /// See [`Self::map_range`] + fn map_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> MapRangeAt<'_, R>; + + /// Iterate over the indexes and values of the list or text `obj` in the given range. + /// + /// The reuturned iterator yields `(index, value, exid)` tuples, where the third + /// element is the ID of the operation which created the value. + fn list_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> ListRange<'_, R>; + + /// Iterate over the indexes and values of the list or text `obj` in the given range as at `heads` + /// + /// The returned iterator yields `(index, value, exid)` tuples, where the third + /// element is the ID of the operation which created the value. + /// + /// See [`Self::list_range`] + fn list_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> ListRangeAt<'_, R>; + + /// Iterate over the values in a map, list, or text object + /// + /// The returned iterator yields `(value, exid)` tuples, where the second element + /// is the ID of the operation which created the value. + fn values>(&self, obj: O) -> Values<'_>; + + /// Iterate over the values in a map, list, or text object as at `heads` + /// + /// The returned iterator yields `(value, exid)` tuples, where the second element + /// is the ID of the operation which created the value. + /// + /// See [`Self::values`] + fn values_at>(&self, obj: O, heads: &[ChangeHash]) -> Values<'_>; + + /// Get the length of the given object. + /// + /// If the given object is not in this document this method will return `0` + fn length>(&self, obj: O) -> usize; + + /// Get the length of the given object as at `heads` + /// + /// If the given object is not in this document this method will return `0` + /// + /// See [`Self::length`] + fn length_at>(&self, obj: O, heads: &[ChangeHash]) -> usize; + + /// Get the type of this object, if it is an object. + fn object_type>(&self, obj: O) -> Result; + + /// Get the string represented by the given text object. + fn text>(&self, obj: O) -> Result; + + /// Get the string represented by the given text object as at `heads`, see + /// [`Self::text`] + fn text_at>( + &self, + obj: O, + heads: &[ChangeHash], + ) -> Result; + + /// Get a value out of the document. + /// + /// This returns a tuple of `(value, object ID)`. This is for two reasons: + /// + /// 1. If `value` is an object (represented by `Value::Object`) then the ID + /// is the ID of that object. This can then be used to retrieve nested + /// values from the document. + /// 2. Even if `value` is a scalar, the ID represents the operation which + /// created the value. This is useful if there are conflicting values for + /// this key as each value is tagged with the ID. + /// + /// In the case of a key which has conflicting values, this method will + /// return a single arbitrarily chosen value. This value will be chosen + /// deterministically on all nodes. If you want to get all the values for a + /// key use [`Self::get_all`]. + fn get, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError>; + + /// Get the value of the given key as at `heads`, see `[Self::get]` + fn get_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError>; + + /// Get all conflicting values out of the document at this prop that conflict. + /// + /// If there are multiple conflicting values for a given key this method + /// will return all of them, with each value tagged by the ID of the + /// operation which created it. + fn get_all, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError>; + + /// Get all possibly conflicting values for a key as at `heads` + /// + /// See `[Self::get_all]` + fn get_all_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError>; + + /// Get the hashes of the changes in this document that aren't transitive dependencies of the + /// given `heads`. + fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec; + + /// Get a change by its hash. + fn get_change_by_hash(&self, hash: &ChangeHash) -> Option<&Change>; +} diff --git a/rust/automerge/src/storage.rs b/rust/automerge/src/storage.rs new file mode 100644 index 00000000..5b3d03a7 --- /dev/null +++ b/rust/automerge/src/storage.rs @@ -0,0 +1,24 @@ +use std::ops::Range; + +pub(crate) mod change; +mod chunk; +mod columns; +pub(crate) mod convert; +mod document; +pub(crate) mod load; +pub(crate) mod parse; +pub(crate) mod save; + +pub(crate) use { + change::{AsChangeOp, Change, ChangeOp, Compressed, ReadChangeOpError}, + chunk::{CheckSum, Chunk, ChunkType, Header}, + columns::{Columns, MismatchingColumn, RawColumn, RawColumns}, + document::{AsChangeMeta, AsDocOp, ChangeMetadata, CompressConfig, DocOp, Document}, + load::VerificationMode, +}; + +fn shift_range(range: Range, by: usize) -> Range { + range.start + by..range.end + by +} + +pub(crate) const MAGIC_BYTES: [u8; 4] = [0x85, 0x6f, 0x4a, 0x83]; diff --git a/rust/automerge/src/storage/change.rs b/rust/automerge/src/storage/change.rs new file mode 100644 index 00000000..61db0b00 --- /dev/null +++ b/rust/automerge/src/storage/change.rs @@ -0,0 +1,511 @@ +use std::{borrow::Cow, io::Write, marker::PhantomData, num::NonZeroU64, ops::Range}; + +use crate::{convert, ActorId, ChangeHash, ScalarValue}; + +use super::{parse, shift_range, CheckSum, ChunkType, Columns, Header, RawColumns}; + +mod change_op_columns; +use change_op_columns::ChangeOpsColumns; +pub(crate) use change_op_columns::{ChangeOp, ReadChangeOpError}; + +mod change_actors; +pub(crate) use change_actors::PredOutOfOrder; +mod compressed; +mod op_with_change_actors; +pub(crate) use compressed::Compressed; + +pub(crate) const DEFLATE_MIN_SIZE: usize = 256; + +/// Changes present an iterator over the operations encoded in them. Before we have read these +/// changes we don't know if they are valid, so we expose an iterator with items which are +/// `Result`s. However, frequently we know that the changes are valid, this trait is used as a +/// witness that we have verified the operations in a change so we can expose an iterator which +/// does not return `Results` +pub(crate) trait OpReadState {} +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Verified; +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Unverified; +impl OpReadState for Verified {} +impl OpReadState for Unverified {} + +/// A `Change` is the result of parsing a change chunk as specified in [1] +/// +/// The type parameter to this type represents whether or not operation have been "verified". +/// Operations in a change chunk are stored in a compressed column oriented storage format. In +/// general there is no guarantee that this storage is valid. Therefore we use the `OpReadState` +/// type parameter to distinguish between contexts where we know that the ops are valid and those +/// where we don't. The `Change::verify_ops` method can be used to obtain a verified `Change` which +/// can provide an iterator over `ChangeOp`s directly, rather than over `Result`. +/// +/// [1]: https://alexjg.github.io/automerge-storage-docs/#change-chunks +#[derive(Clone, Debug)] +pub(crate) struct Change<'a, O: OpReadState> { + /// The raw bytes of the entire chunk containing this change, including the header. + bytes: Cow<'a, [u8]>, + header: Header, + dependencies: Vec, + actor: ActorId, + other_actors: Vec, + seq: u64, + start_op: NonZeroU64, + timestamp: i64, + message: Option, + ops_meta: ChangeOpsColumns, + /// The range in `Self::bytes` where the ops column data is + ops_data: Range, + extra_bytes: Range, + _phantom: PhantomData, +} + +impl<'a, O: OpReadState> PartialEq for Change<'a, O> { + fn eq(&self, other: &Self) -> bool { + self.bytes == other.bytes + } +} + +#[derive(thiserror::Error, Debug)] +pub(crate) enum ParseError { + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), + #[error(transparent)] + InvalidUtf8(#[from] parse::InvalidUtf8), + #[error("failed to parse change columns: {0}")] + RawColumns(#[from] crate::storage::columns::raw_column::ParseError), + #[error("failed to parse header: {0}")] + Header(#[from] super::chunk::error::Header), + #[error("change contained compressed columns")] + CompressedChangeCols, + #[error("invalid change cols: {0}")] + InvalidColumns(Box), +} + +impl<'a> Change<'a, Unverified> { + pub(crate) fn parse( + input: parse::Input<'a>, + ) -> parse::ParseResult<'a, Change<'a, Unverified>, ParseError> { + // TODO(alex): check chunk type + let (i, header) = Header::parse(input)?; + let parse::Split { + first: chunk_input, + remaining, + } = i.split(header.data_bytes().len()); + let (_, change) = Self::parse_following_header(chunk_input, header)?; + Ok((remaining, change)) + } + + /// Parse a change chunk. `input` should be the entire chunk, including the header bytes. + pub(crate) fn parse_following_header( + input: parse::Input<'a>, + header: Header, + ) -> parse::ParseResult<'_, Change<'a, Unverified>, ParseError> { + let (i, deps) = parse::length_prefixed(parse::change_hash)(input)?; + let (i, actor) = parse::actor_id(i)?; + let (i, seq) = parse::leb128_u64(i)?; + let (i, start_op) = parse::nonzero_leb128_u64(i)?; + let (i, timestamp) = parse::leb128_i64(i)?; + let (i, message_len) = parse::leb128_u64(i)?; + let (i, message) = parse::utf_8(message_len as usize, i)?; + let (i, other_actors) = parse::length_prefixed(parse::actor_id)(i)?; + let (i, ops_meta) = RawColumns::parse(i)?; + let ( + i, + parse::RangeOf { + range: ops_data, .. + }, + ) = parse::range_of(|i| parse::take_n(ops_meta.total_column_len(), i), i)?; + + let ( + _i, + parse::RangeOf { + range: extra_bytes, .. + }, + ) = parse::range_of(parse::take_rest, i)?; + + let ops_meta = ops_meta + .uncompressed() + .ok_or(parse::ParseError::Error(ParseError::CompressedChangeCols))?; + let col_layout = Columns::parse(ops_data.len(), ops_meta.iter()) + .map_err(|e| parse::ParseError::Error(ParseError::InvalidColumns(Box::new(e))))?; + let ops_meta = ChangeOpsColumns::try_from(col_layout) + .map_err(|e| parse::ParseError::Error(ParseError::InvalidColumns(Box::new(e))))?; + + Ok(( + parse::Input::empty(), + Change { + bytes: input.bytes().into(), + header, + dependencies: deps, + actor, + other_actors, + seq, + start_op, + timestamp, + message: if message.is_empty() { + None + } else { + Some(message) + }, + ops_meta, + ops_data, + extra_bytes, + _phantom: PhantomData, + }, + )) + } + + /// Iterate over the ops in this chunk. The iterator will return an error if any of the ops are + /// malformed. + pub(crate) fn iter_ops( + &'a self, + ) -> impl Iterator> + Clone + 'a { + self.ops_meta.iter(self.ops_data()) + } + + /// Verify all the ops in this change executing `f` for each one + /// + /// `f` will be called for each op in this change, allowing callers to collect additional + /// information about the ops (e.g. all the actor IDs in the change, or the number of ops) + /// + /// # Errors + /// * If there is an error reading an operation + pub(crate) fn verify_ops( + self, + mut f: F, + ) -> Result, ReadChangeOpError> { + for op in self.iter_ops() { + f(op?); + } + if u32::try_from(u64::from(self.start_op)).is_err() { + return Err(ReadChangeOpError::CounterTooLarge); + } + Ok(Change { + bytes: self.bytes, + header: self.header, + dependencies: self.dependencies, + actor: self.actor, + other_actors: self.other_actors, + seq: self.seq, + start_op: self.start_op, + timestamp: self.timestamp, + message: self.message, + ops_meta: self.ops_meta, + ops_data: self.ops_data, + extra_bytes: self.extra_bytes, + _phantom: PhantomData, + }) + } +} + +impl<'a> Change<'a, Verified> { + pub(crate) fn builder() -> ChangeBuilder { + ChangeBuilder::new() + } + + pub(crate) fn iter_ops(&'a self) -> impl Iterator + Clone + 'a { + // SAFETY: This unwrap is okay because a `Change<'_, Verified>` can only be constructed + // using either `verify_ops` or `Builder::build`, so we know the ops columns are valid. + self.ops_meta.iter(self.ops_data()).map(|o| o.unwrap()) + } +} + +impl<'a, O: OpReadState> Change<'a, O> { + pub(crate) fn checksum(&self) -> CheckSum { + self.header.checksum() + } + + pub(crate) fn actor(&self) -> &ActorId { + &self.actor + } + pub(crate) fn other_actors(&self) -> &[ActorId] { + &self.other_actors + } + + pub(crate) fn start_op(&self) -> NonZeroU64 { + self.start_op + } + + pub(crate) fn message(&self) -> &Option { + &self.message + } + + pub(crate) fn dependencies(&self) -> &[ChangeHash] { + &self.dependencies + } + + pub(crate) fn seq(&self) -> u64 { + self.seq + } + + pub(crate) fn timestamp(&self) -> i64 { + self.timestamp + } + + pub(crate) fn extra_bytes(&self) -> &[u8] { + &self.bytes[self.extra_bytes.clone()] + } + + pub(crate) fn checksum_valid(&self) -> bool { + self.header.checksum_valid() + } + + pub(crate) fn body_bytes(&self) -> &[u8] { + &self.bytes[self.header.len()..] + } + + pub(crate) fn bytes(&self) -> &[u8] { + &self.bytes + } + + pub(crate) fn hash(&self) -> ChangeHash { + self.header.hash() + } + + pub(crate) fn ops_data(&self) -> &[u8] { + &self.bytes[self.ops_data.clone()] + } + + pub(crate) fn into_owned(self) -> Change<'static, O> { + Change { + dependencies: self.dependencies, + bytes: Cow::Owned(self.bytes.into_owned()), + header: self.header, + actor: self.actor, + other_actors: self.other_actors, + seq: self.seq, + start_op: self.start_op, + timestamp: self.timestamp, + message: self.message, + ops_meta: self.ops_meta, + ops_data: self.ops_data, + extra_bytes: self.extra_bytes, + _phantom: PhantomData, + } + } + + pub(crate) fn compress(&self) -> Option> { + if self.bytes.len() > DEFLATE_MIN_SIZE { + Some(Compressed::compress(self)) + } else { + None + } + } +} + +fn length_prefixed_bytes>(b: B, out: &mut Vec) -> usize { + let prefix_len = leb128::write::unsigned(out, b.as_ref().len() as u64).unwrap(); + out.write_all(b.as_ref()).unwrap(); + prefix_len + b.as_ref().len() +} + +// Bunch of type safe builder boilerplate +pub(crate) struct Unset; +pub(crate) struct Set { + value: T, +} + +#[allow(non_camel_case_types)] +pub(crate) struct ChangeBuilder { + dependencies: Vec, + actor: ACTOR, + seq: SEQ, + start_op: START_OP, + timestamp: TIME, + message: Option, + extra_bytes: Option>, +} + +impl ChangeBuilder { + pub(crate) fn new() -> Self { + Self { + dependencies: vec![], + actor: Unset, + seq: Unset, + start_op: Unset, + timestamp: Unset, + message: None, + extra_bytes: None, + } + } +} + +#[allow(non_camel_case_types)] +impl ChangeBuilder { + pub(crate) fn with_dependencies(self, mut dependencies: Vec) -> Self { + dependencies.sort_unstable(); + Self { + dependencies, + ..self + } + } + + pub(crate) fn with_message(self, message: Option) -> Self { + Self { message, ..self } + } + + pub(crate) fn with_extra_bytes(self, extra_bytes: Vec) -> Self { + Self { + extra_bytes: Some(extra_bytes), + ..self + } + } +} + +#[allow(non_camel_case_types)] +impl ChangeBuilder { + pub(crate) fn with_seq(self, seq: u64) -> ChangeBuilder, TIME> { + ChangeBuilder { + dependencies: self.dependencies, + actor: self.actor, + seq: Set { value: seq }, + start_op: self.start_op, + timestamp: self.timestamp, + message: self.message, + extra_bytes: self.extra_bytes, + } + } +} + +#[allow(non_camel_case_types)] +impl ChangeBuilder { + pub(crate) fn with_actor( + self, + actor: ActorId, + ) -> ChangeBuilder, SEQ, TIME> { + ChangeBuilder { + dependencies: self.dependencies, + actor: Set { value: actor }, + seq: self.seq, + start_op: self.start_op, + timestamp: self.timestamp, + message: self.message, + extra_bytes: self.extra_bytes, + } + } +} + +impl ChangeBuilder { + pub(crate) fn with_start_op( + self, + start_op: NonZeroU64, + ) -> ChangeBuilder, ACTOR, SEQ, TIME> { + ChangeBuilder { + dependencies: self.dependencies, + actor: self.actor, + seq: self.seq, + start_op: Set { value: start_op }, + timestamp: self.timestamp, + message: self.message, + extra_bytes: self.extra_bytes, + } + } +} + +#[allow(non_camel_case_types)] +impl ChangeBuilder { + pub(crate) fn with_timestamp(self, time: i64) -> ChangeBuilder> { + ChangeBuilder { + dependencies: self.dependencies, + actor: self.actor, + seq: self.seq, + start_op: self.start_op, + timestamp: Set { value: time }, + message: self.message, + extra_bytes: self.extra_bytes, + } + } +} + +/// A row to be encoded as a change op +/// +/// The lifetime `'a` is the lifetime of the value and key data types. For types which cannot +/// provide a reference (e.g. because they are decoding from some columnar storage on each +/// iteration) this should be `'static`. +pub(crate) trait AsChangeOp<'a> { + /// The type of the Actor ID component of the op IDs for this impl. This is typically either + /// `&'a ActorID` or `usize` + type ActorId; + /// The type of the op IDs this impl produces. + type OpId: convert::OpId; + /// The type of the predecessor iterator returned by `Self::pred`. This can often be omitted + type PredIter: Iterator + ExactSizeIterator; + + fn obj(&self) -> convert::ObjId; + fn key(&self) -> convert::Key<'a, Self::OpId>; + fn insert(&self) -> bool; + fn action(&self) -> u64; + fn val(&self) -> Cow<'a, ScalarValue>; + fn pred(&self) -> Self::PredIter; +} + +impl ChangeBuilder, Set, Set, Set> { + pub(crate) fn build<'a, A, I, O>( + self, + ops: I, + ) -> Result, PredOutOfOrder> + where + A: AsChangeOp<'a, OpId = O> + 'a, + O: convert::OpId<&'a ActorId> + 'a, + I: Iterator + Clone + 'a, + { + let mut col_data = Vec::new(); + let actors = change_actors::ChangeActors::new(self.actor.value, ops)?; + let cols = ChangeOpsColumns::encode(actors.iter(), &mut col_data); + + let (actor, other_actors) = actors.done(); + + let mut data = Vec::with_capacity(col_data.len()); + leb128::write::unsigned(&mut data, self.dependencies.len() as u64).unwrap(); + for dep in &self.dependencies { + data.write_all(dep.as_bytes()).unwrap(); + } + length_prefixed_bytes(&actor, &mut data); + leb128::write::unsigned(&mut data, self.seq.value).unwrap(); + leb128::write::unsigned(&mut data, self.start_op.value.into()).unwrap(); + leb128::write::signed(&mut data, self.timestamp.value).unwrap(); + length_prefixed_bytes( + self.message.as_ref().map(|m| m.as_bytes()).unwrap_or(&[]), + &mut data, + ); + leb128::write::unsigned(&mut data, other_actors.len() as u64).unwrap(); + for actor in other_actors.iter() { + length_prefixed_bytes(actor, &mut data); + } + cols.raw_columns().write(&mut data); + let ops_data_start = data.len(); + let ops_data = ops_data_start..(ops_data_start + col_data.len()); + + data.extend(col_data); + let extra_bytes = + data.len()..(data.len() + self.extra_bytes.as_ref().map(|e| e.len()).unwrap_or(0)); + if let Some(extra) = self.extra_bytes { + data.extend(extra); + } + + let header = Header::new(ChunkType::Change, &data); + + let mut bytes = Vec::with_capacity(header.len() + data.len()); + header.write(&mut bytes); + bytes.extend(data); + + let ops_data = shift_range(ops_data, header.len()); + let extra_bytes = shift_range(extra_bytes, header.len()); + + Ok(Change { + bytes: Cow::Owned(bytes), + header, + dependencies: self.dependencies, + actor, + other_actors, + seq: self.seq.value, + start_op: self.start_op.value, + timestamp: self.timestamp.value, + message: self.message, + ops_meta: cols, + ops_data, + extra_bytes, + _phantom: PhantomData, + }) + } +} diff --git a/rust/automerge/src/storage/change/change_actors.rs b/rust/automerge/src/storage/change/change_actors.rs new file mode 100644 index 00000000..61f1221d --- /dev/null +++ b/rust/automerge/src/storage/change/change_actors.rs @@ -0,0 +1,304 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use crate::convert; + +use super::AsChangeOp; + +/// This struct represents the ordering of actor indices in a change chunk. Operations in a change +/// chunk are encoded with the actor ID represented as an offset into an array of actors which are +/// encoded at the start of the chunk. This array is in a specific order: the author of the change +/// is always the first actor, then all other actors referenced in a change are encoded in +/// lexicographic order. +/// +/// The intended usage is to construct a `ChangeActors` from an iterator over `AsChangeOp` where +/// the `ActorId` of the `AsChangeOp` implementation is the original actor ID. The resulting +/// `ChangeActors` implements `Iterator` where the `item` implements +/// `AsChangeOp>`, which can be passed to `ChangeOpColumns::encode`. +/// +/// Once encoding is complete you can use `ChangeActors::done` to retrieve the original actor and the +/// other actors in the change. +/// +/// # Note on type parameters +/// +/// The type paramters are annoying, they basically exist because we can't have generic associated +/// types, so we have to feed the concrete types of the associated types of the `AsChangeOp` +/// implementation through here. Here's what they all refer to: +/// +/// * A - The type of the actor ID used in the operation IDs of the incoming changes +/// * I - The type of the iterator over the `AsChangeOp` implementation of the incoming changes +/// * O - The concrete type of the operation ID which implementas `convert::OpId` +/// * C - The concrete type (which implements `AsChangeOp`) of the incoming changes +/// * 'a - The lifetime bound for the AsChangeOp trait and it's associated types +/// +/// Maybe when GATs land we can make this simpler. +pub(crate) struct ChangeActors<'a, ActorId, I, O, C> { + actor: ActorId, + other_actors: Vec, + index: BTreeMap, + wrapped: I, + num_ops: usize, + _phantom: std::marker::PhantomData<(&'a O, C)>, +} + +#[derive(thiserror::Error, Debug)] +#[error("actor index {0} referenced by an operation was not found in the changes")] +pub(crate) struct MissingActor(usize); + +#[derive(Debug, thiserror::Error)] +#[error("pred OpIds out of order")] +pub(crate) struct PredOutOfOrder; + +impl<'a, A, I, O, C> ChangeActors<'a, A, I, O, C> +where + A: PartialEq + Ord + Clone + std::hash::Hash + 'static, + O: convert::OpId<&'a A> + 'a, + C: AsChangeOp<'a, OpId = O> + 'a, + I: Iterator + Clone + 'a, +{ + /// Create a new change actor mapping + /// + /// # Arguments + /// * actor - the actor ID of the actor who authored this change + /// * ops - an iterator containing the operations which will be encoded into the change + /// + /// # Errors + /// * If one of the ops herein contains a `pred` with ops which are not in lamport timestamp + /// order + pub(crate) fn new(actor: A, ops: I) -> Result, PredOutOfOrder> { + // Change actors indices are encoded with the 0th element being the actor who authored the + // change and all other actors referenced in the chain following the author in + // lexicographic order. Here we collect all the actors referenced by operations in `ops` + let (num_ops, mut other_actors) = + ops.clone() + .try_fold((0, BTreeSet::new()), |(count, mut acc), op| { + if let convert::Key::Elem(convert::ElemId::Op(o)) = op.key() { + if o.actor() != &actor { + acc.insert(o.actor()); + } + } + + if !are_sorted(op.pred()) { + return Err(PredOutOfOrder); + } + for pred in op.pred() { + if pred.actor() != &actor { + acc.insert(pred.actor()); + } + } + if let convert::ObjId::Op(o) = op.obj() { + if o.actor() != &actor { + acc.insert(o.actor()); + } + } + Ok((count + 1, acc)) + })?; + // This shouldn't be necessary but just in case + other_actors.remove(&actor); + let mut other_actors = other_actors.into_iter().cloned().collect::>(); + other_actors.sort(); + let index = std::iter::once(actor.clone()) + .chain(other_actors.clone().into_iter()) + .enumerate() + .map(|(idx, actor)| (actor, idx)) + .collect(); + Ok(ChangeActors { + actor, + other_actors, + index, + wrapped: ops, + num_ops, + _phantom: std::marker::PhantomData, + }) + } + + /// Translate an OpID from the OpSet index to the change index + fn translate_opid(&self, opid: &O) -> ChangeOpId { + ChangeOpId { + actor: *self.index.get(opid.actor()).unwrap(), + counter: opid.counter(), + } + } + + /// Returns a clonable iterator over the converted operations. The item of the iterator is an + /// implementation of `AsChangeOp` which uses the index of the actor of each operation into the + /// actors as encoded in a change. This is suitable for passing to `ChangeOpColumns::encode` + pub(crate) fn iter<'b>(&'b self) -> WithChangeActorsOpIter<'b, 'a, A, I, O, C> { + WithChangeActorsOpIter { + change_actors: self, + inner: self.wrapped.clone(), + } + } + + pub(crate) fn done(self) -> (A, Vec) { + (self.actor, self.other_actors) + } +} + +/// The actual implementation of the converted iterator +pub(crate) struct WithChangeActorsOpIter<'actors, 'aschangeop, A, I, O, C> { + change_actors: &'actors ChangeActors<'aschangeop, A, I, O, C>, + inner: I, +} + +impl<'actors, 'aschangeop, A: 'aschangeop, I, O, C> Clone + for WithChangeActorsOpIter<'actors, 'aschangeop, A, I, O, C> +where + I: Clone, +{ + fn clone(&self) -> Self { + Self { + change_actors: self.change_actors, + inner: self.inner.clone(), + } + } +} + +impl<'actors, 'aschangeop, A: 'aschangeop, I, O, C> Iterator + for WithChangeActorsOpIter<'actors, 'aschangeop, A, I, O, C> +where + C: AsChangeOp<'aschangeop, OpId = O>, + O: convert::OpId<&'aschangeop A>, + I: Iterator + Clone, +{ + type Item = WithChangeActors<'actors, 'aschangeop, A, I, O, C>; + + fn next(&mut self) -> Option { + self.inner.next().map(|o| WithChangeActors { + op: o, + actors: self.change_actors, + }) + } +} + +impl<'actors, 'aschangeop, A: 'aschangeop, I, O, C> ExactSizeIterator + for WithChangeActorsOpIter<'actors, 'aschangeop, A, I, O, C> +where + C: AsChangeOp<'aschangeop, OpId = O>, + O: convert::OpId<&'aschangeop A>, + I: Iterator + Clone, +{ + fn len(&self) -> usize { + self.change_actors.num_ops + } +} + +pub(crate) struct ChangeOpId { + actor: usize, + counter: u64, +} + +impl convert::OpId for ChangeOpId { + fn actor(&self) -> usize { + self.actor + } + + fn counter(&self) -> u64 { + self.counter + } +} + +/// A struct which implements `AsChangeOp` by translating the actor IDs in the incoming operations +/// into the index into the actors in the `ChangeActors`. +pub(crate) struct WithChangeActors<'actors, 'aschangeop, A, I, O, C> { + op: C, + actors: &'actors ChangeActors<'aschangeop, A, I, O, C>, +} + +impl<'actors, 'aschangeop, A, I, O, P, C> AsChangeOp<'aschangeop> + for WithChangeActors<'actors, 'aschangeop, A, I, O, C> +where + A: PartialEq + Ord + Clone + std::hash::Hash + 'static, + O: convert::OpId<&'aschangeop A>, + P: Iterator + ExactSizeIterator + 'aschangeop, + C: AsChangeOp<'aschangeop, PredIter = P, OpId = O> + 'aschangeop, + I: Iterator + Clone + 'aschangeop, +{ + type ActorId = usize; + type OpId = ChangeOpId; + type PredIter = WithChangeActorsPredIter<'actors, 'aschangeop, A, I, O, C, P>; + + fn action(&self) -> u64 { + self.op.action() + } + + fn insert(&self) -> bool { + self.op.insert() + } + + fn pred(&self) -> Self::PredIter { + WithChangeActorsPredIter { + wrapped: self.op.pred(), + actors: self.actors, + _phantom: std::marker::PhantomData, + } + } + + fn key(&self) -> convert::Key<'aschangeop, Self::OpId> { + self.op.key().map(|o| self.actors.translate_opid(&o)) + } + + fn obj(&self) -> convert::ObjId { + self.op.obj().map(|o| self.actors.translate_opid(&o)) + } + + fn val(&self) -> std::borrow::Cow<'aschangeop, crate::ScalarValue> { + self.op.val() + } +} + +pub(crate) struct WithChangeActorsPredIter<'actors, 'aschangeop, A, I, O, C, P> { + wrapped: P, + actors: &'actors ChangeActors<'aschangeop, A, I, O, C>, + _phantom: std::marker::PhantomData, +} + +impl<'actors, 'aschangeop, A, I, O, C, P> ExactSizeIterator + for WithChangeActorsPredIter<'actors, 'aschangeop, A, I, O, C, P> +where + A: PartialEq + Ord + Clone + std::hash::Hash + 'static, + O: convert::OpId<&'aschangeop A>, + P: Iterator + ExactSizeIterator + 'aschangeop, + C: AsChangeOp<'aschangeop, OpId = O> + 'aschangeop, + I: Iterator + Clone + 'aschangeop, +{ + fn len(&self) -> usize { + self.wrapped.len() + } +} + +impl<'actors, 'aschangeop, A, I, O, C, P> Iterator + for WithChangeActorsPredIter<'actors, 'aschangeop, A, I, O, C, P> +where + A: PartialEq + Ord + Clone + std::hash::Hash + 'static, + O: convert::OpId<&'aschangeop A>, + P: Iterator + 'aschangeop, + C: AsChangeOp<'aschangeop, OpId = O> + 'aschangeop, + I: Iterator + Clone + 'aschangeop, +{ + type Item = ChangeOpId; + + fn next(&mut self) -> Option { + self.wrapped.next().map(|o| self.actors.translate_opid(&o)) + } +} + +fn are_sorted(mut opids: I) -> bool +where + A: PartialEq + Ord + Clone, + O: convert::OpId, + I: Iterator, +{ + if let Some(first) = opids.next() { + let mut prev = first; + for opid in opids { + if opid.counter() < prev.counter() { + return false; + } + if opid.counter() == prev.counter() && opid.actor() < prev.actor() { + return false; + } + prev = opid; + } + } + true +} diff --git a/rust/automerge/src/storage/change/change_op_columns.rs b/rust/automerge/src/storage/change/change_op_columns.rs new file mode 100644 index 00000000..86ec59c2 --- /dev/null +++ b/rust/automerge/src/storage/change/change_op_columns.rs @@ -0,0 +1,499 @@ +use std::{convert::TryFrom, ops::Range}; + +use crate::{ + columnar::{ + column_range::{ + generic::{GenericColumnRange, GroupRange, GroupedColumnRange, SimpleColRange}, + BooleanRange, DeltaRange, Key, KeyEncoder, KeyIter, KeyRange, ObjIdEncoder, ObjIdIter, + ObjIdRange, OpIdListEncoder, OpIdListIter, OpIdListRange, RleRange, ValueEncoder, + ValueIter, ValueRange, + }, + encoding::{ + BooleanDecoder, BooleanEncoder, ColumnDecoder, DecodeColumnError, RleDecoder, + RleEncoder, + }, + }, + convert, + error::InvalidOpType, + storage::{ + change::AsChangeOp, + columns::{ + compression, ColumnId, ColumnSpec, ColumnType, Columns, MismatchingColumn, RawColumn, + }, + RawColumns, + }, + types::{ElemId, ObjId, OpId, ScalarValue}, + OpType, +}; + +const OBJ_COL_ID: ColumnId = ColumnId::new(0); +const KEY_COL_ID: ColumnId = ColumnId::new(1); +const INSERT_COL_ID: ColumnId = ColumnId::new(3); +const ACTION_COL_ID: ColumnId = ColumnId::new(4); +const VAL_COL_ID: ColumnId = ColumnId::new(5); +const PRED_COL_ID: ColumnId = ColumnId::new(7); + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct ChangeOp { + pub(crate) key: Key, + pub(crate) insert: bool, + pub(crate) val: ScalarValue, + pub(crate) pred: Vec, + pub(crate) action: u64, + pub(crate) obj: ObjId, +} + +impl<'a, A: AsChangeOp<'a, ActorId = usize, OpId = OpId>> From for ChangeOp { + fn from(a: A) -> Self { + ChangeOp { + key: match a.key() { + convert::Key::Prop(s) => Key::Prop(s.into_owned()), + convert::Key::Elem(convert::ElemId::Head) => Key::Elem(ElemId::head()), + convert::Key::Elem(convert::ElemId::Op(o)) => Key::Elem(ElemId(o)), + }, + obj: match a.obj() { + convert::ObjId::Root => ObjId::root(), + convert::ObjId::Op(o) => ObjId(o), + }, + val: a.val().into_owned(), + pred: a.pred().collect(), + insert: a.insert(), + action: a.action(), + } + } +} + +impl<'a> AsChangeOp<'a> for &'a ChangeOp { + type OpId = &'a crate::types::OpId; + type ActorId = usize; + type PredIter = std::slice::Iter<'a, crate::types::OpId>; + + fn obj(&self) -> convert::ObjId { + if self.obj.is_root() { + convert::ObjId::Root + } else { + convert::ObjId::Op(self.obj.opid()) + } + } + + fn key(&self) -> convert::Key<'a, Self::OpId> { + match &self.key { + Key::Prop(s) => convert::Key::Prop(std::borrow::Cow::Borrowed(s)), + Key::Elem(e) if e.is_head() => convert::Key::Elem(convert::ElemId::Head), + Key::Elem(e) => convert::Key::Elem(convert::ElemId::Op(&e.0)), + } + } + + fn val(&self) -> std::borrow::Cow<'a, ScalarValue> { + std::borrow::Cow::Borrowed(&self.val) + } + + fn pred(&self) -> Self::PredIter { + self.pred.iter() + } + + fn insert(&self) -> bool { + self.insert + } + + fn action(&self) -> u64 { + self.action + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct ChangeOpsColumns { + obj: Option, + key: KeyRange, + insert: BooleanRange, + action: RleRange, + val: ValueRange, + pred: OpIdListRange, +} + +impl ChangeOpsColumns { + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> ChangeOpsIter<'a> { + ChangeOpsIter { + failed: false, + obj: self.obj.as_ref().map(|o| o.iter(data)), + key: self.key.iter(data), + insert: self.insert.decoder(data), + action: self.action.decoder(data), + val: self.val.iter(data), + pred: self.pred.iter(data), + } + } + + #[tracing::instrument(skip(ops, out))] + pub(crate) fn encode<'a, 'b, 'c, I, C, Op>(ops: I, out: &'b mut Vec) -> ChangeOpsColumns + where + I: Iterator + Clone + ExactSizeIterator + 'a, + Op: convert::OpId + 'a, + C: AsChangeOp<'c, OpId = Op> + 'a, + { + if ops.len() > 10000 { + Self::encode_rowwise(ops, out) + } else { + Self::encode_columnwise(ops, out) + } + } + + pub(crate) fn encode_columnwise<'a, 'b, 'c, I, C, Op>( + ops: I, + out: &'b mut Vec, + ) -> ChangeOpsColumns + where + I: Iterator + Clone + 'a, + Op: convert::OpId + 'a, + C: AsChangeOp<'c, OpId = Op> + 'a, + { + let obj = ObjIdRange::encode(ops.clone().map(|o| o.obj()), out); + let key = KeyRange::encode(ops.clone().map(|o| o.key()), out); + let insert = BooleanRange::encode(ops.clone().map(|o| o.insert()), out); + let action = RleRange::encode(ops.clone().map(|o| Some(o.action())), out); + let val = ValueRange::encode(ops.clone().map(|o| o.val()), out); + let pred = OpIdListRange::encode(ops.map(|o| o.pred()), out); + Self { + obj, + key, + insert, + action, + val, + pred, + } + } + + fn encode_rowwise<'a, 'b, 'c, I, C, Op>(ops: I, out: &'b mut Vec) -> ChangeOpsColumns + where + I: Iterator + Clone + 'a, + Op: convert::OpId + 'a, + C: AsChangeOp<'c, OpId = Op> + 'a, + { + let mut obj = ObjIdEncoder::new(); + let mut key = KeyEncoder::new(); + let mut insert = BooleanEncoder::new(); + let mut action = RleEncoder::<_, u64>::from(Vec::new()); + let mut val = ValueEncoder::new(); + let mut pred = OpIdListEncoder::new(); + for op in ops { + obj.append(op.obj()); + key.append(op.key()); + insert.append(op.insert()); + action.append_value(op.action()); + val.append(&op.val()); + pred.append(op.pred()); + } + let obj = obj.finish(out); + let key = key.finish(out); + + let insert_start = out.len(); + let (insert, _) = insert.finish(); + out.extend(insert); + let insert = BooleanRange::from(insert_start..out.len()); + + let action_start = out.len(); + let (action, _) = action.finish(); + out.extend(action); + let action = RleRange::from(action_start..out.len()); + + let val = val.finish(out); + let pred = pred.finish(out); + + Self { + obj, + key, + insert, + action, + val, + pred, + } + } + + pub(crate) fn raw_columns(&self) -> RawColumns { + let mut cols = vec![ + RawColumn::new( + ColumnSpec::new(OBJ_COL_ID, ColumnType::Actor, false), + self.obj + .as_ref() + .map(|o| o.actor_range().clone().into()) + .unwrap_or(0..0), + ), + RawColumn::new( + ColumnSpec::new(OBJ_COL_ID, ColumnType::Integer, false), + self.obj + .as_ref() + .map(|o| o.counter_range().clone().into()) + .unwrap_or(0..0), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::Actor, false), + self.key.actor_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::DeltaInteger, false), + self.key.counter_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::String, false), + self.key.string_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(INSERT_COL_ID, ColumnType::Boolean, false), + self.insert.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(ACTION_COL_ID, ColumnType::Integer, false), + self.action.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(VAL_COL_ID, ColumnType::ValueMetadata, false), + self.val.meta_range().clone().into(), + ), + ]; + if !self.val.raw_range().is_empty() { + cols.push(RawColumn::new( + ColumnSpec::new(VAL_COL_ID, ColumnType::Value, false), + self.val.raw_range().clone().into(), + )); + } + cols.push(RawColumn::new( + ColumnSpec::new(PRED_COL_ID, ColumnType::Group, false), + self.pred.group_range().clone().into(), + )); + if !self.pred.actor_range().is_empty() { + cols.extend([ + RawColumn::new( + ColumnSpec::new(PRED_COL_ID, ColumnType::Actor, false), + self.pred.actor_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(PRED_COL_ID, ColumnType::DeltaInteger, false), + self.pred.counter_range().clone().into(), + ), + ]); + } + cols.into_iter().collect() + } +} + +#[derive(thiserror::Error, Debug)] +#[error(transparent)] +pub enum ReadChangeOpError { + #[error(transparent)] + DecodeError(#[from] DecodeColumnError), + #[error(transparent)] + InvalidOpType(#[from] InvalidOpType), + #[error("counter too large")] + CounterTooLarge, +} + +#[derive(Clone)] +pub(crate) struct ChangeOpsIter<'a> { + failed: bool, + obj: Option>, + key: KeyIter<'a>, + insert: BooleanDecoder<'a>, + action: RleDecoder<'a, u64>, + val: ValueIter<'a>, + pred: OpIdListIter<'a>, +} + +impl<'a> ChangeOpsIter<'a> { + fn done(&self) -> bool { + self.action.done() + } + + fn try_next(&mut self) -> Result, ReadChangeOpError> { + if self.failed || self.done() { + Ok(None) + } else { + let obj = if let Some(ref mut objs) = self.obj { + objs.next_in_col("obj")? + } else { + ObjId::root() + }; + let key = self.key.next_in_col("key")?; + let insert = self.insert.next_in_col("insert")?; + let action = self.action.next_in_col("action")?; + let val = self.val.next_in_col("value")?; + let pred = self.pred.next_in_col("pred")?; + + // This check is necessary to ensure that OpType::from_action_and_value + // cannot panic later in the process. + OpType::validate_action_and_value(action, &val)?; + + Ok(Some(ChangeOp { + obj, + key, + insert, + action, + val, + pred, + })) + } + } +} + +impl<'a> Iterator for ChangeOpsIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + match self.try_next() { + Ok(v) => v.map(Ok), + Err(e) => { + self.failed = true; + Some(Err(e)) + } + } + } +} + +#[derive(thiserror::Error, Debug)] +pub(crate) enum ParseChangeColumnsError { + #[error("mismatching column at {index}.")] + MismatchingColumn { index: usize }, +} + +impl From for ParseChangeColumnsError { + fn from(m: MismatchingColumn) -> Self { + Self::MismatchingColumn { index: m.index } + } +} + +impl TryFrom for ChangeOpsColumns { + type Error = ParseChangeColumnsError; + + fn try_from(columns: Columns) -> Result { + let mut obj_actor: Option> = None; + let mut obj_ctr: Option> = None; + let mut key_actor: Option> = None; + let mut key_ctr: Option = None; + let mut key_str: Option> = None; + let mut insert: Option> = None; + let mut action: Option> = None; + let mut val: Option = None; + let mut pred_group: Option> = None; + let mut pred_actor: Option> = None; + let mut pred_ctr: Option = None; + let mut other = Columns::empty(); + + for (index, col) in columns.into_iter().enumerate() { + match (col.id(), col.col_type()) { + (OBJ_COL_ID, ColumnType::Actor) => obj_actor = Some(col.range().into()), + (OBJ_COL_ID, ColumnType::Integer) => obj_ctr = Some(col.range().into()), + (KEY_COL_ID, ColumnType::Actor) => key_actor = Some(col.range().into()), + (KEY_COL_ID, ColumnType::DeltaInteger) => key_ctr = Some(col.range().into()), + (KEY_COL_ID, ColumnType::String) => key_str = Some(col.range().into()), + (INSERT_COL_ID, ColumnType::Boolean) => insert = Some(col.range()), + (ACTION_COL_ID, ColumnType::Integer) => action = Some(col.range()), + (VAL_COL_ID, ColumnType::ValueMetadata) => match col.into_ranges() { + GenericColumnRange::Value(v) => { + val = Some(v); + } + _ => return Err(ParseChangeColumnsError::MismatchingColumn { index }), + }, + (PRED_COL_ID, ColumnType::Group) => match col.into_ranges() { + GenericColumnRange::Group(GroupRange { num, values }) => { + let mut cols = values.into_iter(); + pred_group = Some(num); + // If there was no data in the group at all then the columns won't be + // present + if cols.len() == 0 { + pred_actor = Some((0..0).into()); + pred_ctr = Some((0..0).into()); + } else { + let first = cols.next(); + let second = cols.next(); + match (first, second) { + ( + Some(GroupedColumnRange::Simple(SimpleColRange::RleInt( + actor_range, + ))), + Some(GroupedColumnRange::Simple(SimpleColRange::Delta( + ctr_range, + ))), + ) => { + pred_actor = Some(actor_range); + pred_ctr = Some(ctr_range); + } + _ => { + return Err(ParseChangeColumnsError::MismatchingColumn { + index, + }) + } + } + } + if cols.next().is_some() { + return Err(ParseChangeColumnsError::MismatchingColumn { index }); + } + } + _ => return Err(ParseChangeColumnsError::MismatchingColumn { index }), + }, + (other_type, other_col) => { + tracing::warn!(typ=?other_type, id=?other_col, "unknown column"); + other.append(col); + } + } + } + let pred = OpIdListRange::new( + pred_group.unwrap_or_else(|| (0..0).into()), + pred_actor.unwrap_or_else(|| (0..0).into()), + pred_ctr.unwrap_or_else(|| (0..0).into()), + ); + Ok(ChangeOpsColumns { + obj: ObjIdRange::new( + obj_actor.unwrap_or_else(|| (0..0).into()), + obj_ctr.unwrap_or_else(|| (0..0).into()), + ), + key: KeyRange::new( + key_actor.unwrap_or_else(|| (0..0).into()), + key_ctr.unwrap_or_else(|| (0..0).into()), + key_str.unwrap_or_else(|| (0..0).into()), + ), + insert: insert.unwrap_or(0..0).into(), + action: action.unwrap_or(0..0).into(), + val: val.unwrap_or_else(|| ValueRange::new((0..0).into(), (0..0).into())), + pred, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::columnar::encoding::properties::{key, opid, scalar_value}; + use proptest::prelude::*; + + prop_compose! { + fn change_op() + (key in key(), + value in scalar_value(), + pred in proptest::collection::vec(opid(), 0..20), + action in 0_u64..6, + obj in opid(), + insert in any::()) -> ChangeOp { + + let val = if action == 5 && !(value.is_int() || value.is_uint()) { + ScalarValue::Uint(0) + } else { value }; + ChangeOp { + obj: obj.into(), + key, + val, + pred, + action, + insert, + } + } + } + + proptest! { + #[test] + fn test_encode_decode_change_ops(ops in proptest::collection::vec(change_op(), 0..100)) { + let mut out = Vec::new(); + let cols2 = ChangeOpsColumns::encode(ops.iter(), &mut out); + let decoded = cols2.iter(&out[..]).collect::, _>>().unwrap(); + assert_eq!(ops, decoded); + } + } +} diff --git a/rust/automerge/src/storage/change/compressed.rs b/rust/automerge/src/storage/change/compressed.rs new file mode 100644 index 00000000..55d56ffb --- /dev/null +++ b/rust/automerge/src/storage/change/compressed.rs @@ -0,0 +1,51 @@ +use std::{borrow::Cow, io::Read}; + +use crate::storage::{Change, CheckSum, ChunkType, MAGIC_BYTES}; + +use super::OpReadState; + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct Compressed<'a> { + checksum: CheckSum, + bytes: Cow<'a, [u8]>, +} + +impl<'a> Compressed<'a> { + pub(crate) fn new(checksum: CheckSum, bytes: Cow<'a, [u8]>) -> Self { + Self { checksum, bytes } + } + + pub(crate) fn compress<'b, O: OpReadState>(change: &'b Change<'b, O>) -> Compressed<'static> { + let mut result = Vec::with_capacity(change.bytes().len()); + result.extend(MAGIC_BYTES); + result.extend(change.checksum().bytes()); + result.push(u8::from(ChunkType::Compressed)); + let mut deflater = flate2::bufread::DeflateEncoder::new( + change.body_bytes(), + flate2::Compression::default(), + ); + let mut deflated = Vec::new(); + let deflated_len = deflater.read_to_end(&mut deflated).unwrap(); + leb128::write::unsigned(&mut result, deflated_len as u64).unwrap(); + result.extend(&deflated[..]); + Compressed { + checksum: change.checksum(), + bytes: Cow::Owned(result), + } + } + + pub(crate) fn bytes(&self) -> Cow<'a, [u8]> { + self.bytes.clone() + } + + pub(crate) fn checksum(&self) -> CheckSum { + self.checksum + } + + pub(crate) fn into_owned(self) -> Compressed<'static> { + Compressed { + checksum: self.checksum, + bytes: Cow::Owned(self.bytes.into_owned()), + } + } +} diff --git a/automerge-backend-wasm/tests/app.rs b/rust/automerge/src/storage/change/op_with_change_actors.rs similarity index 100% rename from automerge-backend-wasm/tests/app.rs rename to rust/automerge/src/storage/change/op_with_change_actors.rs diff --git a/rust/automerge/src/storage/chunk.rs b/rust/automerge/src/storage/chunk.rs new file mode 100644 index 00000000..d0048528 --- /dev/null +++ b/rust/automerge/src/storage/chunk.rs @@ -0,0 +1,293 @@ +use std::{ + borrow::Cow, + convert::{TryFrom, TryInto}, + io::Read, + ops::Range, +}; + +use sha2::{Digest, Sha256}; + +use super::{change::Unverified, parse, Change, Compressed, Document, MAGIC_BYTES}; +use crate::{columnar::encoding::leb128::ulebsize, ChangeHash}; + +pub(crate) enum Chunk<'a> { + Document(Document<'a>), + Change(Change<'a, Unverified>), + CompressedChange(Change<'static, Unverified>, Compressed<'a>), +} + +pub(crate) mod error { + use super::parse; + use crate::storage::{change, document}; + + #[derive(thiserror::Error, Debug)] + pub(crate) enum Chunk { + #[error("there was data in a chunk leftover after parsing")] + LeftoverData, + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), + #[error("failed to parse header: {0}")] + Header(#[from] Header), + #[error("bad change chunk: {0}")] + Change(#[from] change::ParseError), + #[error("bad document chunk: {0}")] + Document(#[from] document::ParseError), + #[error("unable to decompresse compressed chunk")] + Deflate, + } + + #[derive(thiserror::Error, Debug)] + pub(crate) enum Header { + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), + #[error("unknown chunk type: {0}")] + UnknownChunkType(u8), + #[error("Invalid magic bytes")] + InvalidMagicBytes, + } +} + +impl<'a> Chunk<'a> { + pub(crate) fn parse( + input: parse::Input<'a>, + ) -> parse::ParseResult<'a, Chunk<'a>, error::Chunk> { + let (i, header) = Header::parse::(input)?; + let parse::Split { + first: chunk_input, + remaining, + } = i.split(header.data_bytes().len()); + tracing::trace!(?header, "parsed chunk header"); + let chunk = match header.chunk_type { + ChunkType::Change => { + let (remaining, change) = + Change::parse_following_header(chunk_input, header).map_err(|e| e.lift())?; + if !remaining.is_empty() { + return Err(parse::ParseError::Error(error::Chunk::LeftoverData)); + } + Chunk::Change(change) + } + ChunkType::Document => { + let (remaining, doc) = + Document::parse(chunk_input, header).map_err(|e| e.lift())?; + if !remaining.is_empty() { + return Err(parse::ParseError::Error(error::Chunk::LeftoverData)); + } + Chunk::Document(doc) + } + ChunkType::Compressed => { + let compressed = &input.unconsumed_bytes()[header.data_bytes()]; + let mut decoder = flate2::bufread::DeflateDecoder::new(compressed); + let mut decompressed = Vec::new(); + decoder + .read_to_end(&mut decompressed) + .map_err(|_| parse::ParseError::Error(error::Chunk::Deflate))?; + let inner_header = header.with_data(ChunkType::Change, &decompressed); + let mut inner_chunk = Vec::with_capacity(inner_header.len() + decompressed.len()); + inner_header.write(&mut inner_chunk); + inner_chunk.extend(&decompressed); + let (remaining, change) = + Change::parse(parse::Input::new(&inner_chunk)).map_err(|e| e.lift())?; + if !remaining.is_empty() { + return Err(parse::ParseError::Error(error::Chunk::LeftoverData)); + } + Chunk::CompressedChange( + change.into_owned(), + Compressed::new(header.checksum, Cow::Borrowed(chunk_input.bytes())), + ) + } + }; + Ok((remaining, chunk)) + } + + pub(crate) fn checksum_valid(&self) -> bool { + match self { + Self::Document(d) => d.checksum_valid(), + Self::Change(c) => c.checksum_valid(), + Self::CompressedChange(change, compressed) => { + compressed.checksum() == change.checksum() && change.checksum_valid() + } + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub(crate) enum ChunkType { + Document, + Change, + Compressed, +} + +impl TryFrom for ChunkType { + type Error = u8; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::Document), + 1 => Ok(Self::Change), + 2 => Ok(Self::Compressed), + other => Err(other), + } + } +} + +impl From for u8 { + fn from(ct: ChunkType) -> Self { + match ct { + ChunkType::Document => 0, + ChunkType::Change => 1, + ChunkType::Compressed => 2, + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub(crate) struct CheckSum([u8; 4]); + +impl CheckSum { + pub(crate) fn bytes(&self) -> [u8; 4] { + self.0 + } +} + +impl From<[u8; 4]> for CheckSum { + fn from(raw: [u8; 4]) -> Self { + CheckSum(raw) + } +} + +impl AsRef<[u8]> for CheckSum { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl From for CheckSum { + fn from(h: ChangeHash) -> Self { + let bytes = h.as_bytes(); + [bytes[0], bytes[1], bytes[2], bytes[3]].into() + } +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Header { + checksum: CheckSum, + chunk_type: ChunkType, + data_len: usize, + header_size: usize, + hash: ChangeHash, +} + +impl Header { + pub(crate) fn new(chunk_type: ChunkType, data: &[u8]) -> Self { + let hash = hash(chunk_type, data); + Self { + hash, + checksum: hash.checksum().into(), + data_len: data.len(), + header_size: MAGIC_BYTES.len() + + 4 // checksum + + 1 // chunk type + + (ulebsize(data.len() as u64) as usize), + chunk_type, + } + } + + /// Returns a header with the same checksum but with a different chunk type and data length. + /// This is primarily useful when processing compressed chunks, where the checksum is actually + /// derived from the uncompressed data. + pub(crate) fn with_data(&self, chunk_type: ChunkType, data: &[u8]) -> Header { + let hash = hash(chunk_type, data); + Self { + hash, + checksum: self.checksum, + data_len: data.len(), + header_size: MAGIC_BYTES.len() + + 4 // checksum + + 1 // chunk type + + (ulebsize(data.len() as u64) as usize), + chunk_type, + } + } + + pub(crate) fn len(&self) -> usize { + self.header_size + } + + pub(crate) fn write(&self, out: &mut Vec) { + out.extend(MAGIC_BYTES); + out.extend(self.checksum.bytes()); + out.push(u8::from(self.chunk_type)); + leb128::write::unsigned(out, self.data_len as u64).unwrap(); + } + + pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Header, E> + where + E: From, + { + let ( + i, + parse::RangeOf { + range: header, + value: (checksum_bytes, chunk_type, chunk_len), + }, + ) = parse::range_of( + |i| { + let (i, magic) = parse::take4(i)?; + if magic != MAGIC_BYTES { + return Err(parse::ParseError::Error(E::from( + error::Header::InvalidMagicBytes, + ))); + } + let (i, checksum_bytes) = parse::take4(i)?; + let (i, raw_chunk_type) = parse::take1(i)?; + let chunk_type: ChunkType = raw_chunk_type.try_into().map_err(|_| { + parse::ParseError::Error(E::from(error::Header::UnknownChunkType( + raw_chunk_type, + ))) + })?; + let (i, chunk_len) = parse::leb128_u64(i).map_err(|e| e.lift())?; + Ok((i, (checksum_bytes, chunk_type, chunk_len))) + }, + input, + )?; + + let (_, data) = parse::take_n(chunk_len as usize, i)?; + let hash = hash(chunk_type, data); + Ok(( + i, + Header { + checksum: checksum_bytes.into(), + chunk_type, + data_len: data.len(), + header_size: header.len(), + hash, + }, + )) + } + + /// The range of the input which corresponds to the data specified by this header + pub(crate) fn data_bytes(&self) -> Range { + self.header_size..(self.header_size + self.data_len) + } + + pub(crate) fn hash(&self) -> ChangeHash { + self.hash + } + + pub(crate) fn checksum_valid(&self) -> bool { + CheckSum(self.hash.checksum()) == self.checksum + } + + pub(crate) fn checksum(&self) -> CheckSum { + self.checksum + } +} + +fn hash(typ: ChunkType, data: &[u8]) -> ChangeHash { + let mut out = vec![u8::from(typ)]; + leb128::write::unsigned(&mut out, data.len() as u64).unwrap(); + out.extend(data); + let hash_result = Sha256::digest(out); + let array: [u8; 32] = hash_result.into(); + ChangeHash(array) +} diff --git a/rust/automerge/src/storage/columns.rs b/rust/automerge/src/storage/columns.rs new file mode 100644 index 00000000..2ff6fa1f --- /dev/null +++ b/rust/automerge/src/storage/columns.rs @@ -0,0 +1,355 @@ +/// This module contains types which represent the column metadata which is encoded in the columnar +/// storage format specified in [1]. In this format metadata about each column is packed into a 32 +/// bit integer, which is represented by the types in `column_specification`. The column data in +/// the format is a sequence of (`ColumnSpecification`, `usize`) pairs where each pair represents +/// the type of the column and the length of the column in the data which follows, these pairs are +/// represented by `RawColumn` and `RawColumns`. Some columns are actually composites of several +/// underlying columns and so not every `RawColumns` is valid. The types in `column` and +/// `column_builder` take a `RawColumns` and produce a `Columns` - which is a valid set of possibly +/// composite column metadata. +/// +/// There are two typical workflows: +/// +/// ## Reading +/// * First parse a `RawColumns` from the underlying data using `RawColumns::parse` +/// * Ensure that the columns are decompressed using `RawColumns::decompress` (checking first if +/// you can avoid this using `RawColumns::uncompressed`) +/// * Parse the `RawColumns` into a `Columns` using `Columns::parse` +/// +/// ## Writing +/// * Construct a `RawColumns` +/// * Compress using `RawColumns::compress` +/// * Write to output using `RawColumns::write` +/// +/// [1]: https://alexjg.github.io/automerge-storage-docs/#_columnar_storage_format +use std::ops::Range; + +mod column_specification; +pub(crate) use column_specification::{ColumnId, ColumnSpec, ColumnType}; +mod column; +pub(crate) use column::Column; +mod column_builder; +pub(crate) use column_builder::{ + AwaitingRawColumnValueBuilder, ColumnBuilder, GroupAwaitingValue, GroupBuilder, +}; + +pub(crate) mod raw_column; +pub(crate) use raw_column::{RawColumn, RawColumns}; + +#[derive(Debug, thiserror::Error)] +#[error("mismatching column at {index}.")] +pub(crate) struct MismatchingColumn { + pub(crate) index: usize, +} + +pub(crate) mod compression { + #[derive(Clone, Debug)] + pub(crate) struct Unknown; + #[derive(Clone, Debug)] + pub(crate) struct Uncompressed; + + /// A witness for what we know about whether or not a column is compressed + pub(crate) trait ColumnCompression {} + impl ColumnCompression for Unknown {} + impl ColumnCompression for Uncompressed {} +} + +/// `Columns` represents a sequence of "logical" columns. "Logical" in this sense means that +/// each column produces one value, but may be composed of multiple [`RawColumn`]s. For example, in a +/// logical column containing values there are two `RawColumn`s, one for the metadata about the +/// values, and one for the values themselves. +#[derive(Clone, Debug)] +pub(crate) struct Columns { + columns: Vec, +} + +impl Columns { + pub(crate) fn empty() -> Self { + Self { + columns: Vec::new(), + } + } + + pub(crate) fn append(&mut self, col: Column) { + self.columns.push(col) + } + + pub(crate) fn parse<'a, I: Iterator>>( + data_size: usize, + cols: I, + ) -> Result { + let mut parser = ColumnLayoutParser::new(data_size, None); + for raw_col in cols { + parser.add_column(raw_col.spec(), raw_col.data())?; + } + parser.build() + } +} + +impl FromIterator for Result { + fn from_iter>(iter: T) -> Self { + let iter = iter.into_iter(); + let mut result = Vec::with_capacity(iter.size_hint().1.unwrap_or(0)); + let mut last_column: Option = None; + for col in iter { + if let Some(last_col) = last_column { + if col.spec().normalize() < last_col.normalize() { + return Err(BadColumnLayout::OutOfOrder); + } + } + last_column = Some(col.spec()); + result.push(col); + } + Ok(Columns { columns: result }) + } +} + +impl IntoIterator for Columns { + type Item = Column; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.columns.into_iter() + } +} + +#[derive(Debug, thiserror::Error)] +pub(crate) enum BadColumnLayout { + #[error("duplicate column specifications: {0}")] + DuplicateColumnSpecs(u32), + #[error("out of order columns")] + OutOfOrder, + #[error("nested group")] + NestedGroup, + #[error("raw value column without metadata column")] + LoneRawValueColumn, + #[error("value metadata followed by value column with different column ID")] + MismatchingValueMetadataId, + #[error("non contiguous columns")] + NonContiguousColumns, + #[error("data out of range")] + DataOutOfRange, +} + +struct ColumnLayoutParser { + columns: Vec, + last_spec: Option, + state: LayoutParserState, + total_data_size: usize, +} + +enum LayoutParserState { + Ready, + InValue(AwaitingRawColumnValueBuilder), + InGroup(ColumnId, GroupParseState), +} + +#[derive(Debug)] +enum GroupParseState { + Ready(GroupBuilder), + InValue(GroupAwaitingValue), +} + +impl ColumnLayoutParser { + fn new(data_size: usize, size_hint: Option) -> Self { + ColumnLayoutParser { + columns: Vec::with_capacity(size_hint.unwrap_or(0)), + last_spec: None, + state: LayoutParserState::Ready, + total_data_size: data_size, + } + } + + fn build(mut self) -> Result { + let columns = match self.state { + LayoutParserState::Ready => self.columns, + LayoutParserState::InValue(mut builder) => { + self.columns.push(builder.build((0..0).into())); + self.columns + } + LayoutParserState::InGroup(_, groupstate) => { + match groupstate { + GroupParseState::InValue(mut builder) => { + self.columns.push(builder.finish_empty().finish()); + } + GroupParseState::Ready(mut builder) => { + self.columns.push(builder.finish()); + } + }; + self.columns + } + }; + Ok(Columns { columns }) + } + + #[tracing::instrument(skip(self), err)] + fn add_column( + &mut self, + column: ColumnSpec, + range: Range, + ) -> Result<(), BadColumnLayout> { + self.check_contiguous(&range)?; + self.check_bounds(&range)?; + if let Some(last_spec) = self.last_spec { + if last_spec.normalize() > column.normalize() { + return Err(BadColumnLayout::OutOfOrder); + } else if last_spec == column { + return Err(BadColumnLayout::DuplicateColumnSpecs(column.into())); + } + } + match &mut self.state { + LayoutParserState::Ready => match column.col_type() { + ColumnType::Group => { + self.state = LayoutParserState::InGroup( + column.id(), + GroupParseState::Ready(ColumnBuilder::start_group(column, range.into())), + ); + Ok(()) + } + ColumnType::ValueMetadata => { + self.state = LayoutParserState::InValue(ColumnBuilder::start_value( + column, + range.into(), + )); + Ok(()) + } + ColumnType::Value => Err(BadColumnLayout::LoneRawValueColumn), + ColumnType::Actor => { + self.columns + .push(ColumnBuilder::build_actor(column, range.into())); + Ok(()) + } + ColumnType::String => { + self.columns + .push(ColumnBuilder::build_string(column, range.into())); + Ok(()) + } + ColumnType::Integer => { + self.columns + .push(ColumnBuilder::build_integer(column, range.into())); + Ok(()) + } + ColumnType::DeltaInteger => { + self.columns + .push(ColumnBuilder::build_delta_integer(column, range.into())); + Ok(()) + } + ColumnType::Boolean => { + self.columns + .push(ColumnBuilder::build_boolean(column, range.into())); + Ok(()) + } + }, + LayoutParserState::InValue(builder) => match column.col_type() { + ColumnType::Value => { + if builder.id() != column.id() { + return Err(BadColumnLayout::MismatchingValueMetadataId); + } + self.columns.push(builder.build(range.into())); + self.state = LayoutParserState::Ready; + Ok(()) + } + _ => { + self.columns.push(builder.build((0..0).into())); + self.state = LayoutParserState::Ready; + self.add_column(column, range) + } + }, + LayoutParserState::InGroup(id, group_state) => { + if *id != column.id() { + match group_state { + GroupParseState::Ready(b) => self.columns.push(b.finish()), + GroupParseState::InValue(b) => self.columns.push(b.finish_empty().finish()), + }; + std::mem::swap(&mut self.state, &mut LayoutParserState::Ready); + self.add_column(column, range) + } else { + match group_state { + GroupParseState::Ready(builder) => match column.col_type() { + ColumnType::Group => Err(BadColumnLayout::NestedGroup), + ColumnType::Value => Err(BadColumnLayout::LoneRawValueColumn), + ColumnType::ValueMetadata => { + *group_state = + GroupParseState::InValue(builder.start_value(column, range)); + Ok(()) + } + ColumnType::Actor => { + builder.add_actor(column, range); + Ok(()) + } + ColumnType::Boolean => { + builder.add_boolean(column, range); + Ok(()) + } + ColumnType::DeltaInteger => { + builder.add_delta_integer(column, range); + Ok(()) + } + ColumnType::Integer => { + builder.add_integer(column, range); + Ok(()) + } + ColumnType::String => { + builder.add_string(column, range); + Ok(()) + } + }, + GroupParseState::InValue(builder) => match column.col_type() { + ColumnType::Value => { + *group_state = GroupParseState::Ready(builder.finish_value(range)); + Ok(()) + } + _ => { + *group_state = GroupParseState::Ready(builder.finish_empty()); + self.add_column(column, range) + } + }, + } + } + } + } + } + + fn check_contiguous(&self, next_range: &Range) -> Result<(), BadColumnLayout> { + match &self.state { + LayoutParserState::Ready => { + if let Some(prev) = self.columns.last() { + if prev.range().end != next_range.start { + tracing::error!(prev=?prev.range(), next=?next_range, "it's here"); + Err(BadColumnLayout::NonContiguousColumns) + } else { + Ok(()) + } + } else { + Ok(()) + } + } + LayoutParserState::InValue(builder) => { + if builder.meta_range().end() != next_range.start { + Err(BadColumnLayout::NonContiguousColumns) + } else { + Ok(()) + } + } + LayoutParserState::InGroup(_, group_state) => { + let end = match group_state { + GroupParseState::InValue(b) => b.range().end, + GroupParseState::Ready(b) => b.range().end, + }; + if end != next_range.start { + Err(BadColumnLayout::NonContiguousColumns) + } else { + Ok(()) + } + } + } + } + + fn check_bounds(&self, next_range: &Range) -> Result<(), BadColumnLayout> { + if next_range.end > self.total_data_size { + Err(BadColumnLayout::DataOutOfRange) + } else { + Ok(()) + } + } +} diff --git a/rust/automerge/src/storage/columns/column.rs b/rust/automerge/src/storage/columns/column.rs new file mode 100644 index 00000000..6f834439 --- /dev/null +++ b/rust/automerge/src/storage/columns/column.rs @@ -0,0 +1,42 @@ +use std::ops::Range; + +use crate::columnar::column_range::generic::GenericColumnRange; + +use super::{ColumnId, ColumnSpec, ColumnType}; + +/// A combination of a column specification and the range of data associated with it. Note that +/// multiple (adjacent) ranges can be associated with one column as some columns are composite. +/// This is encapsulated in the `GenericColumnRange` type. +#[derive(Clone, Debug)] +pub(crate) struct Column { + spec: ColumnSpec, + range: GenericColumnRange, +} + +impl Column { + pub(crate) fn new(spec: ColumnSpec, range: GenericColumnRange) -> Column { + Self { spec, range } + } +} + +impl Column { + pub(crate) fn range(&self) -> Range { + self.range.range() + } + + pub(crate) fn into_ranges(self) -> GenericColumnRange { + self.range + } + + pub(crate) fn col_type(&self) -> ColumnType { + self.spec.col_type() + } + + pub(crate) fn id(&self) -> ColumnId { + self.spec.id() + } + + pub(crate) fn spec(&self) -> ColumnSpec { + self.spec + } +} diff --git a/rust/automerge/src/storage/columns/column_builder.rs b/rust/automerge/src/storage/columns/column_builder.rs new file mode 100644 index 00000000..5cc41a21 --- /dev/null +++ b/rust/automerge/src/storage/columns/column_builder.rs @@ -0,0 +1,199 @@ +use std::ops::Range; + +use crate::columnar::column_range::{ + generic::{GenericColumnRange, GroupRange, GroupedColumnRange, SimpleColRange}, + BooleanRange, DeltaRange, RawRange, RleRange, ValueRange, +}; + +use super::{Column, ColumnId, ColumnSpec}; + +pub(crate) struct ColumnBuilder; + +impl ColumnBuilder { + pub(crate) fn build_actor(spec: ColumnSpec, range: RleRange) -> Column { + Column::new( + spec, + GenericColumnRange::Simple(SimpleColRange::RleInt(range)), + ) + } + + pub(crate) fn build_string(spec: ColumnSpec, range: RleRange) -> Column { + Column::new( + spec, + GenericColumnRange::Simple(SimpleColRange::RleString(range)), + ) + } + + pub(crate) fn build_integer(spec: ColumnSpec, range: RleRange) -> Column { + Column::new( + spec, + GenericColumnRange::Simple(SimpleColRange::RleInt(range)), + ) + } + + pub(crate) fn build_delta_integer(spec: ColumnSpec, range: DeltaRange) -> Column { + Column::new( + spec, + GenericColumnRange::Simple(SimpleColRange::Delta(range)), + ) + } + + pub(crate) fn build_boolean(spec: ColumnSpec, range: BooleanRange) -> Column { + Column::new( + spec, + GenericColumnRange::Simple(SimpleColRange::Boolean(range)), + ) + } + + pub(crate) fn start_value( + spec: ColumnSpec, + meta: RleRange, + ) -> AwaitingRawColumnValueBuilder { + AwaitingRawColumnValueBuilder { spec, meta } + } + + pub(crate) fn start_group(spec: ColumnSpec, num: RleRange) -> GroupBuilder { + GroupBuilder { + spec, + num_range: num, + columns: Vec::new(), + } + } +} + +pub(crate) struct AwaitingRawColumnValueBuilder { + spec: ColumnSpec, + meta: RleRange, +} + +impl AwaitingRawColumnValueBuilder { + pub(crate) fn id(&self) -> ColumnId { + self.spec.id() + } + + pub(crate) fn meta_range(&self) -> &RleRange { + &self.meta + } + + pub(crate) fn build(&mut self, raw: RawRange) -> Column { + Column::new( + self.spec, + GenericColumnRange::Value(ValueRange::new(self.meta.clone(), raw)), + ) + } +} + +#[derive(Debug)] +pub(crate) struct GroupBuilder { + spec: ColumnSpec, + num_range: RleRange, + columns: Vec, +} + +impl GroupBuilder { + pub(crate) fn range(&self) -> Range { + let start = self.num_range.start(); + let end = self + .columns + .last() + .map(|c| c.range().end) + .unwrap_or_else(|| self.num_range.end()); + start..end + } + + pub(crate) fn add_actor(&mut self, _spec: ColumnSpec, range: Range) { + self.columns + .push(GroupedColumnRange::Simple(SimpleColRange::RleInt( + range.into(), + ))); + } + + pub(crate) fn add_string(&mut self, _spec: ColumnSpec, range: Range) { + self.columns + .push(GroupedColumnRange::Simple(SimpleColRange::RleString( + range.into(), + ))); + } + + pub(crate) fn add_integer(&mut self, _spec: ColumnSpec, range: Range) { + self.columns + .push(GroupedColumnRange::Simple(SimpleColRange::RleInt( + range.into(), + ))); + } + + pub(crate) fn add_delta_integer(&mut self, _spec: ColumnSpec, range: Range) { + self.columns + .push(GroupedColumnRange::Simple(SimpleColRange::Delta( + range.into(), + ))); + } + + pub(crate) fn add_boolean(&mut self, _spec: ColumnSpec, range: Range) { + self.columns + .push(GroupedColumnRange::Simple(SimpleColRange::Boolean( + range.into(), + ))); + } + + pub(crate) fn start_value( + &mut self, + _spec: ColumnSpec, + meta: Range, + ) -> GroupAwaitingValue { + GroupAwaitingValue { + spec: self.spec, + num_range: self.num_range.clone(), + columns: std::mem::take(&mut self.columns), + val_meta: meta.into(), + } + } + + pub(crate) fn finish(&mut self) -> Column { + Column::new( + self.spec, + GenericColumnRange::Group(GroupRange::new( + self.num_range.clone(), + std::mem::take(&mut self.columns), + )), + ) + } +} + +#[derive(Debug)] +pub(crate) struct GroupAwaitingValue { + spec: ColumnSpec, + num_range: RleRange, + columns: Vec, + val_meta: RleRange, +} + +impl GroupAwaitingValue { + pub(crate) fn finish_empty(&mut self) -> GroupBuilder { + self.columns.push(GroupedColumnRange::Value(ValueRange::new( + self.val_meta.clone(), + (0..0).into(), + ))); + GroupBuilder { + spec: self.spec, + num_range: self.num_range.clone(), + columns: std::mem::take(&mut self.columns), + } + } + + pub(crate) fn finish_value(&mut self, raw: Range) -> GroupBuilder { + self.columns.push(GroupedColumnRange::Value(ValueRange::new( + self.val_meta.clone(), + raw.into(), + ))); + GroupBuilder { + spec: self.spec, + num_range: self.num_range.clone(), + columns: std::mem::take(&mut self.columns), + } + } + + pub(crate) fn range(&self) -> Range { + self.num_range.start()..self.val_meta.end() + } +} diff --git a/rust/automerge/src/storage/columns/column_specification.rs b/rust/automerge/src/storage/columns/column_specification.rs new file mode 100644 index 00000000..5bde0e7a --- /dev/null +++ b/rust/automerge/src/storage/columns/column_specification.rs @@ -0,0 +1,285 @@ +/// An implementation of column specifications as specified in [1] +/// +/// [1]: https://alexjg.github.io/automerge-storage-docs/#column-specifications +#[derive(Eq, PartialEq, Clone, Copy)] +pub(crate) struct ColumnSpec(u32); + +impl ColumnSpec { + pub(crate) fn new(id: ColumnId, col_type: ColumnType, deflate: bool) -> Self { + let mut raw = id.0 << 4; + raw |= u8::from(col_type) as u32; + if deflate { + raw |= 0b00001000; + } else { + raw &= 0b11110111; + } + ColumnSpec(raw) + } + + pub(crate) fn col_type(&self) -> ColumnType { + self.0.to_be_bytes()[3].into() + } + + pub(crate) fn id(&self) -> ColumnId { + ColumnId(self.0 >> 4) + } + + pub(crate) fn deflate(&self) -> bool { + self.0 & 0b00001000 > 0 + } + + pub(crate) fn deflated(&self) -> Self { + Self::new(self.id(), self.col_type(), true) + } + + pub(crate) fn inflated(&self) -> Self { + Self::new(self.id(), self.col_type(), false) + } + + pub(crate) fn normalize(&self) -> Normalized { + Normalized(self.0 & 0b11110111) + } +} + +#[derive(PartialEq, PartialOrd)] +pub(crate) struct Normalized(u32); + +impl std::fmt::Debug for ColumnSpec { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "ColumnSpec(id: {:?}, type: {}, deflate: {})", + self.id(), + self.col_type(), + self.deflate() + ) + } +} + +#[derive(Eq, PartialEq, Clone, Copy)] +pub(crate) struct ColumnId(u32); + +impl ColumnId { + pub(crate) const fn new(raw: u32) -> Self { + ColumnId(raw) + } +} + +impl From for ColumnId { + fn from(raw: u32) -> Self { + Self(raw) + } +} + +impl std::fmt::Debug for ColumnId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +/// The differente possible column types, as specified in [1] +/// +/// [1]: https://alexjg.github.io/automerge-storage-docs/#column-specifications +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub(crate) enum ColumnType { + Group, + Actor, + Integer, + DeltaInteger, + Boolean, + String, + ValueMetadata, + Value, +} + +impl std::fmt::Display for ColumnType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Group => write!(f, "Group"), + Self::Actor => write!(f, "Actor"), + Self::Integer => write!(f, "Integer"), + Self::DeltaInteger => write!(f, "DeltaInteger"), + Self::Boolean => write!(f, "Boolean"), + Self::String => write!(f, "String"), + Self::ValueMetadata => write!(f, "ValueMetadata"), + Self::Value => write!(f, "Value"), + } + } +} + +impl From for ColumnType { + fn from(v: u8) -> Self { + let type_bits = v & 0b00000111; + match type_bits { + 0 => Self::Group, + 1 => Self::Actor, + 2 => Self::Integer, + 3 => Self::DeltaInteger, + 4 => Self::Boolean, + 5 => Self::String, + 6 => Self::ValueMetadata, + 7 => Self::Value, + _ => unreachable!(), + } + } +} + +impl From for u8 { + fn from(ct: ColumnType) -> Self { + match ct { + ColumnType::Group => 0, + ColumnType::Actor => 1, + ColumnType::Integer => 2, + ColumnType::DeltaInteger => 3, + ColumnType::Boolean => 4, + ColumnType::String => 5, + ColumnType::ValueMetadata => 6, + ColumnType::Value => 7, + } + } +} + +impl From for ColumnSpec { + fn from(raw: u32) -> Self { + ColumnSpec(raw) + } +} + +impl From for u32 { + fn from(spec: ColumnSpec) -> Self { + spec.0 + } +} + +impl From<[u8; 4]> for ColumnSpec { + fn from(raw: [u8; 4]) -> Self { + u32::from_be_bytes(raw).into() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn column_spec_encoding() { + struct Scenario { + id: ColumnId, + col_type: ColumnType, + int_val: u32, + } + + let scenarios = vec![ + Scenario { + id: ColumnId(7), + col_type: ColumnType::Group, + int_val: 112, + }, + Scenario { + id: ColumnId(0), + col_type: ColumnType::Actor, + int_val: 1, + }, + Scenario { + id: ColumnId(0), + col_type: ColumnType::Integer, + int_val: 2, + }, + Scenario { + id: ColumnId(1), + col_type: ColumnType::DeltaInteger, + int_val: 19, + }, + Scenario { + id: ColumnId(3), + col_type: ColumnType::Boolean, + int_val: 52, + }, + Scenario { + id: ColumnId(1), + col_type: ColumnType::String, + int_val: 21, + }, + Scenario { + id: ColumnId(5), + col_type: ColumnType::ValueMetadata, + int_val: 86, + }, + Scenario { + id: ColumnId(5), + col_type: ColumnType::Value, + int_val: 87, + }, + ]; + + for (index, scenario) in scenarios.into_iter().enumerate() { + let spec = ColumnSpec::new(scenario.id, scenario.col_type, false); + + let encoded_val = u32::from(spec); + if encoded_val != scenario.int_val { + panic!( + "Scenario {} failed encoding: expected {} but got {}", + index + 1, + scenario.int_val, + encoded_val + ); + } + + if spec.col_type() != scenario.col_type { + panic!( + "Scenario {} failed col type: expected {:?} but got {:?}", + index + 1, + scenario.col_type, + spec.col_type() + ); + } + + if spec.deflate() { + panic!( + "Scenario {} failed: spec returned true for deflate, should have been false", + index + 1 + ); + } + + if spec.id() != scenario.id { + panic!( + "Scenario {} failed id: expected {:?} but got {:?}", + index + 1, + scenario.id, + spec.id() + ); + } + + let deflated = ColumnSpec::new(scenario.id, scenario.col_type, true); + + if deflated.id() != spec.id() { + panic!("Scenario {} failed deflate id test", index + 1); + } + + if deflated.col_type() != spec.col_type() { + panic!("Scenario {} failed col type test", index + 1); + } + + if !deflated.deflate() { + panic!( + "Scenario {} failed: when deflate bit set deflate returned false", + index + 1 + ); + } + + let expected = scenario.int_val | 0b00001000; + if expected != u32::from(deflated) { + panic!( + "Scenario {} failed deflate bit test, expected {} got {}", + index + 1, + expected, + u32::from(deflated) + ); + } + + if deflated.normalize() != spec.normalize() { + panic!("Scenario {} failed normalize test", index + 1); + } + } + } +} diff --git a/rust/automerge/src/storage/columns/raw_column.rs b/rust/automerge/src/storage/columns/raw_column.rs new file mode 100644 index 00000000..ac9a5759 --- /dev/null +++ b/rust/automerge/src/storage/columns/raw_column.rs @@ -0,0 +1,272 @@ +use std::{io::Read, marker::PhantomData, ops::Range}; + +use crate::storage::parse; + +use super::{compression, ColumnSpec}; + +/// This is a "raw" column in the sense that it is just the column specification[1] and range. This +/// is in contrast to [`super::Column`] which is aware of composite columns such as value columns[2] and +/// group columns[3]. +/// +/// `RawColumn` is generally an intermediary object which is parsed into a [`super::Column`]. +/// +/// The type parameter `T` is a witness to whether this column is compressed. If `T: +/// compression::Uncompressed` then we have proved that this column is not compressed, otherwise it +/// may be compressed. +/// +/// [1]: https://alexjg.github.io/automerge-storage-docs/#column-specifications +/// [2]: https://alexjg.github.io/automerge-storage-docs/#raw-value-columns +/// [3]: https://alexjg.github.io/automerge-storage-docs/#group-columns +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct RawColumn { + spec: ColumnSpec, + /// The location of the data in the column data block. Note that this range starts at the + /// beginning of the column data block - i.e. the `data` attribute of the first column in the + /// column data block will be 0 - not at the start of the chunk. + data: Range, + _phantom: PhantomData, +} + +impl RawColumn { + pub(crate) fn new(spec: ColumnSpec, data: Range) -> Self { + Self { + spec: ColumnSpec::new(spec.id(), spec.col_type(), false), + data, + _phantom: PhantomData, + } + } +} + +impl RawColumn { + pub(crate) fn spec(&self) -> ColumnSpec { + self.spec + } + + pub(crate) fn data(&self) -> Range { + self.data.clone() + } + + fn compress(&self, input: &[u8], out: &mut Vec, threshold: usize) -> (ColumnSpec, usize) { + let (spec, len) = if self.data.len() < threshold || self.spec.deflate() { + out.extend(&input[self.data.clone()]); + (self.spec, self.data.len()) + } else { + let mut deflater = flate2::bufread::DeflateEncoder::new( + &input[self.data.clone()], + flate2::Compression::default(), + ); + //This unwrap should be okay as we're reading and writing to in memory buffers + (self.spec.deflated(), deflater.read_to_end(out).unwrap()) + }; + (spec, len) + } + + pub(crate) fn uncompressed(&self) -> Option> { + if self.spec.deflate() { + None + } else { + Some(RawColumn { + spec: self.spec, + data: self.data.clone(), + _phantom: PhantomData, + }) + } + } + + fn decompress( + &self, + input: &[u8], + out: &mut Vec, + ) -> Result<(ColumnSpec, usize), ParseError> { + let len = if self.spec.deflate() { + let mut inflater = flate2::bufread::DeflateDecoder::new(&input[self.data.clone()]); + inflater.read_to_end(out).map_err(ParseError::Deflate)? + } else { + out.extend(&input[self.data.clone()]); + self.data.len() + }; + Ok((self.spec.inflated(), len)) + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) struct RawColumns(Vec>); + +impl RawColumns { + /// Returns `Some` if no column in this set of columns is marked as compressed + pub(crate) fn uncompressed(&self) -> Option> { + let mut result = Vec::with_capacity(self.0.len()); + for col in &self.0 { + if let Some(uncomp) = col.uncompressed() { + result.push(uncomp); + } else { + return None; + } + } + Some(RawColumns(result)) + } + + /// Write each column in `input` represented by `self` into `out`, possibly compressing. + /// + /// # Returns + /// The `RawColumns` corresponding to the data written to `out` + /// + /// # Panics + /// * If any of the ranges in `self` is outside the bounds of `input` + pub(crate) fn compress( + &self, + input: &[u8], + out: &mut Vec, + threshold: usize, + ) -> RawColumns { + let mut result = Vec::with_capacity(self.0.len()); + let mut start = 0; + for col in &self.0 { + let (spec, len) = col.compress(input, out, threshold); + result.push(RawColumn { + spec, + data: start..(start + len), + _phantom: PhantomData::, + }); + start += len; + } + RawColumns(result) + } + + /// Read each column from `input` and write to `out`, decompressing any compressed columns + /// + /// # Returns + /// The `RawColumns` corresponding to the data written to `out` + /// + /// # Panics + /// * If any of the ranges in `self` is outside the bounds of `input` + pub(crate) fn uncompress( + &self, + input: &[u8], + out: &mut Vec, + ) -> Result, ParseError> { + let mut result = Vec::with_capacity(self.0.len()); + let mut start = 0; + for col in &self.0 { + let (spec, len) = if let Some(decomp) = col.uncompressed() { + out.extend(&input[decomp.data.clone()]); + (decomp.spec, decomp.data.len()) + } else { + col.decompress(input, out)? + }; + result.push(RawColumn { + spec, + data: start..(start + len), + _phantom: PhantomData::, + }); + start += len; + } + Ok(RawColumns(result)) + } +} + +impl FromIterator> for RawColumns { + fn from_iter>>(iter: U) -> Self { + Self(iter.into_iter().filter(|c| !c.data.is_empty()).collect()) + } +} + +impl FromIterator<(ColumnSpec, Range)> for RawColumns { + fn from_iter)>>(iter: T) -> Self { + Self( + iter.into_iter() + .filter_map(|(spec, data)| { + if data.is_empty() { + None + } else { + Some(RawColumn { + spec, + data, + _phantom: PhantomData, + }) + } + }) + .collect(), + ) + } +} + +#[derive(Debug, thiserror::Error)] +pub(crate) enum ParseError { + #[error("columns were not in normalized order")] + NotInNormalOrder, + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), + #[error(transparent)] + Deflate(#[from] std::io::Error), +} + +impl RawColumns { + pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, E> + where + E: From, + { + let i = input; + let (i, num_columns) = parse::leb128_u64(i).map_err(|e| e.lift())?; + let (i, specs_and_lens) = parse::apply_n( + num_columns as usize, + parse::tuple2( + parse::map(parse::leb128_u32, ColumnSpec::from), + parse::leb128_u64, + ), + )(i) + .map_err(|e| e.lift())?; + let columns: Vec> = specs_and_lens + .into_iter() + .scan(0_usize, |offset, (spec, len)| { + // Note: we use a saturating add here as len was passed over the network + // and so could be anything. If the addition does every saturate we would + // expect parsing to fail later (but at least it won't panic!). + let end = offset.saturating_add(len as usize); + let data = *offset..end; + *offset = end; + Some(RawColumn { + spec, + data, + _phantom: PhantomData, + }) + }) + .collect::>(); + if !are_normal_sorted(&columns) { + return Err(parse::ParseError::Error( + ParseError::NotInNormalOrder.into(), + )); + } + Ok((i, RawColumns(columns))) + } +} + +impl RawColumns { + pub(crate) fn write(&self, out: &mut Vec) -> usize { + let mut written = leb128::write::unsigned(out, self.0.len() as u64).unwrap(); + for col in &self.0 { + written += leb128::write::unsigned(out, u32::from(col.spec) as u64).unwrap(); + written += leb128::write::unsigned(out, col.data.len() as u64).unwrap(); + } + written + } + + pub(crate) fn total_column_len(&self) -> usize { + self.0.iter().map(|c| c.data.len()).sum() + } + + pub(crate) fn iter(&self) -> impl Iterator> + '_ { + self.0.iter() + } +} + +fn are_normal_sorted(cols: &[RawColumn]) -> bool { + if cols.len() > 1 { + for (i, col) in cols[1..].iter().enumerate() { + if col.spec.normalize() < cols[i].spec.normalize() { + return false; + } + } + } + true +} diff --git a/rust/automerge/src/storage/convert.rs b/rust/automerge/src/storage/convert.rs new file mode 100644 index 00000000..48f83d03 --- /dev/null +++ b/rust/automerge/src/storage/convert.rs @@ -0,0 +1,5 @@ +mod op_as_changeop; +pub(crate) use op_as_changeop::op_as_actor_id; + +mod op_as_docop; +pub(crate) use op_as_docop::op_as_docop; diff --git a/rust/automerge/src/storage/convert/op_as_changeop.rs b/rust/automerge/src/storage/convert/op_as_changeop.rs new file mode 100644 index 00000000..00b5e940 --- /dev/null +++ b/rust/automerge/src/storage/convert/op_as_changeop.rs @@ -0,0 +1,128 @@ +/// Types for converting an OpTree op into a `ChangeOp` or a `DocOp` +use std::borrow::Cow; + +use crate::{ + convert, + op_set::OpSetMetadata, + storage::AsChangeOp, + types::{ActorId, Key, ObjId, Op, OpId, OpType, ScalarValue}, +}; + +/// Wrap an op in an implementation of `AsChangeOp` which represents actor IDs using a reference to +/// the actor ID stored in the metadata. +/// +/// Note that the methods of `AsChangeOp` will panic if the actor is missing from the metadata +pub(crate) fn op_as_actor_id<'a>( + obj: &'a ObjId, + op: &'a Op, + metadata: &'a OpSetMetadata, +) -> OpWithMetadata<'a> { + OpWithMetadata { obj, op, metadata } +} + +pub(crate) struct OpWithMetadata<'a> { + obj: &'a ObjId, + op: &'a Op, + metadata: &'a OpSetMetadata, +} + +impl<'a> OpWithMetadata<'a> { + fn wrap(&self, opid: &'a OpId) -> OpIdWithMetadata<'a> { + OpIdWithMetadata { + opid, + metadata: self.metadata, + } + } +} + +pub(crate) struct OpIdWithMetadata<'a> { + opid: &'a OpId, + metadata: &'a OpSetMetadata, +} + +impl<'a> convert::OpId<&'a ActorId> for OpIdWithMetadata<'a> { + fn counter(&self) -> u64 { + self.opid.counter() + } + + fn actor(&self) -> &'a ActorId { + self.metadata.actors.get(self.opid.actor()) + } +} + +pub(crate) struct PredWithMetadata<'a> { + op: &'a Op, + offset: usize, + metadata: &'a OpSetMetadata, +} + +impl<'a> ExactSizeIterator for PredWithMetadata<'a> { + fn len(&self) -> usize { + self.op.pred.len() + } +} + +impl<'a> Iterator for PredWithMetadata<'a> { + type Item = OpIdWithMetadata<'a>; + + fn next(&mut self) -> Option { + if let Some(op) = self.op.pred.get(self.offset) { + self.offset += 1; + Some(OpIdWithMetadata { + opid: op, + metadata: self.metadata, + }) + } else { + None + } + } +} + +impl<'a> AsChangeOp<'a> for OpWithMetadata<'a> { + type ActorId = &'a ActorId; + type OpId = OpIdWithMetadata<'a>; + type PredIter = PredWithMetadata<'a>; + + fn action(&self) -> u64 { + self.op.action.action_index() + } + + fn insert(&self) -> bool { + self.op.insert + } + + fn val(&self) -> Cow<'a, ScalarValue> { + match &self.op.action { + OpType::Make(..) | OpType::Delete => Cow::Owned(ScalarValue::Null), + OpType::Increment(i) => Cow::Owned(ScalarValue::Int(*i)), + OpType::Put(s) => Cow::Borrowed(s), + } + } + + fn obj(&self) -> convert::ObjId { + if self.obj.is_root() { + convert::ObjId::Root + } else { + convert::ObjId::Op(OpIdWithMetadata { + opid: self.obj.opid(), + metadata: self.metadata, + }) + } + } + + fn pred(&self) -> Self::PredIter { + PredWithMetadata { + op: self.op, + offset: 0, + metadata: self.metadata, + } + } + + fn key(&self) -> convert::Key<'a, Self::OpId> { + match &self.op.key { + Key::Map(idx) => convert::Key::Prop(Cow::Owned(self.metadata.props.get(*idx).into())), + Key::Seq(e) if e.is_head() => convert::Key::Elem(convert::ElemId::Head), + Key::Seq(e) => convert::Key::Elem(convert::ElemId::Op(self.wrap(&e.0))), + } + } +} diff --git a/rust/automerge/src/storage/convert/op_as_docop.rs b/rust/automerge/src/storage/convert/op_as_docop.rs new file mode 100644 index 00000000..8d237354 --- /dev/null +++ b/rust/automerge/src/storage/convert/op_as_docop.rs @@ -0,0 +1,145 @@ +use std::borrow::Cow; + +use crate::{ + convert, + indexed_cache::IndexedCache, + storage::AsDocOp, + types::{ElemId, Key, ObjId, Op, OpId, OpType, ScalarValue}, +}; + +/// Create an [`AsDocOp`] implementation for a [`crate::types::Op`] +/// +/// # Arguments +/// * actors - A vector where the i'th element is the actor index of the document encoding of actor +/// i, as returned by [`OpSetMetadata.actors.encode_index`] +/// * props - An indexed cache containing the properties in this op_as_docop +/// * obj - The object ID this op refers too +/// * op - The op itself +/// +/// # Panics +/// +/// The methods of the resulting `AsDocOp` implementation will panic if any actor ID in the op +/// references an index not in `actors` or a property not in `props` +pub(crate) fn op_as_docop<'a>( + actors: &'a [usize], + props: &'a IndexedCache, + obj: &'a ObjId, + op: &'a Op, +) -> OpAsDocOp<'a> { + OpAsDocOp { + op, + obj, + actor_lookup: actors, + props, + } +} + +pub(crate) struct OpAsDocOp<'a> { + op: &'a Op, + obj: &'a ObjId, + actor_lookup: &'a [usize], + props: &'a IndexedCache, +} + +#[derive(Debug)] +pub(crate) struct DocOpId { + actor: usize, + counter: u64, +} + +impl convert::OpId for DocOpId { + fn actor(&self) -> usize { + self.actor + } + + fn counter(&self) -> u64 { + self.counter + } +} + +impl<'a> OpAsDocOp<'a> {} + +impl<'a> AsDocOp<'a> for OpAsDocOp<'a> { + type ActorId = usize; + type OpId = DocOpId; + type SuccIter = OpAsDocOpSuccIter<'a>; + + fn id(&self) -> Self::OpId { + translate(self.actor_lookup, &self.op.id) + } + + fn obj(&self) -> convert::ObjId { + if self.obj.is_root() { + convert::ObjId::Root + } else { + convert::ObjId::Op(translate(self.actor_lookup, self.obj.opid())) + } + } + + fn key(&self) -> convert::Key<'a, Self::OpId> { + match self.op.key { + Key::Map(idx) => convert::Key::Prop(Cow::Owned(self.props.get(idx).into())), + Key::Seq(e) if e.is_head() => convert::Key::Elem(convert::ElemId::Head), + Key::Seq(ElemId(o)) => { + convert::Key::Elem(convert::ElemId::Op(translate(self.actor_lookup, &o))) + } + } + } + + fn val(&self) -> Cow<'a, crate::ScalarValue> { + match &self.op.action { + OpType::Put(v) => Cow::Borrowed(v), + OpType::Increment(i) => Cow::Owned(ScalarValue::Int(*i)), + _ => Cow::Owned(ScalarValue::Null), + } + } + + fn succ(&self) -> Self::SuccIter { + OpAsDocOpSuccIter { + op: self.op, + offset: 0, + actor_index: self.actor_lookup, + } + } + + fn insert(&self) -> bool { + self.op.insert + } + + fn action(&self) -> u64 { + self.op.action.action_index() + } +} + +pub(crate) struct OpAsDocOpSuccIter<'a> { + op: &'a Op, + offset: usize, + actor_index: &'a [usize], +} + +impl<'a> Iterator for OpAsDocOpSuccIter<'a> { + type Item = DocOpId; + + fn next(&mut self) -> Option { + if let Some(s) = self.op.succ.get(self.offset) { + self.offset += 1; + Some(translate(self.actor_index, s)) + } else { + None + } + } +} + +impl<'a> ExactSizeIterator for OpAsDocOpSuccIter<'a> { + fn len(&self) -> usize { + self.op.succ.len() + } +} + +fn translate<'a>(actor_lookup: &'a [usize], op: &'a OpId) -> DocOpId { + let index = actor_lookup[op.actor()]; + DocOpId { + actor: index, + counter: op.counter(), + } +} diff --git a/rust/automerge/src/storage/document.rs b/rust/automerge/src/storage/document.rs new file mode 100644 index 00000000..ecef0bfd --- /dev/null +++ b/rust/automerge/src/storage/document.rs @@ -0,0 +1,343 @@ +use std::{borrow::Cow, ops::Range}; + +use super::{parse, shift_range, ChunkType, Columns, Header, RawColumns}; + +use crate::{convert, ActorId, ChangeHash}; + +mod doc_op_columns; +use doc_op_columns::DocOpColumns; +pub(crate) use doc_op_columns::{AsDocOp, DocOp, ReadDocOpError}; +mod doc_change_columns; +use doc_change_columns::DocChangeColumns; +pub(crate) use doc_change_columns::{AsChangeMeta, ChangeMetadata, ReadChangeError}; +mod compression; + +#[allow(dead_code)] +pub(crate) enum CompressConfig { + None, + Threshold(usize), +} + +#[derive(Debug)] +pub(crate) struct Document<'a> { + bytes: Cow<'a, [u8]>, + #[allow(dead_code)] + compressed_bytes: Option>, + header: Header, + actors: Vec, + heads: Vec, + op_metadata: DocOpColumns, + op_bytes: Range, + change_metadata: DocChangeColumns, + change_bytes: Range, + #[allow(dead_code)] + head_indices: Vec, +} + +#[derive(thiserror::Error, Debug)] +pub(crate) enum ParseError { + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), + #[error(transparent)] + RawColumns(#[from] crate::storage::columns::raw_column::ParseError), + #[error("bad column layout for {column_type}s: {error}")] + BadColumnLayout { + column_type: &'static str, + error: super::columns::BadColumnLayout, + }, + #[error(transparent)] + BadDocOps(#[from] doc_op_columns::Error), + #[error(transparent)] + BadDocChanges(#[from] doc_change_columns::ReadChangeError), +} + +impl<'a> Document<'a> { + /// Parse a document chunk. Input must be the entire chunk including the header and magic + /// bytes but the header must already have been parsed. That is to say, this is expected to be + /// used like so: + /// + /// ```rust,ignore + /// # use automerge::storage::{parse::{ParseResult, Input}, Document, Header}; + /// # fn main() -> ParseResult<(), ()> { + /// let chunkbytes: &[u8] = todo!(); + /// let input = Input::new(chunkbytes); + /// let (i, header) = Header::parse(input)?; + /// let (i, doc) = Document::parse(i, header)?; + /// # } + /// ``` + pub(crate) fn parse( + input: parse::Input<'a>, + header: Header, + ) -> parse::ParseResult<'a, Document<'a>, ParseError> { + let i = input; + + // Because some columns in a document may be compressed we do some funky stuff when + // parsing. As we're parsing the chunk we split the data into four parts: + // + // .----------------. + // | Prefix | + // |.--------------.| + // || Actors || + // || Heads || + // || Change Meta || + // || Ops Meta || + // |'--------------'| + // +----------------+ + // | Change data | + // +----------------+ + // | Ops data | + // +----------------+ + // | Suffix | + // |.--------------.| + // || Head indices || + // |'--------------'| + // '----------------' + // + // We record the range of each of these sections using `parse::range_of`. Later, we check + // if any of the column definitions in change meta or ops meta specify that their columns + // are compressed. If there are compressed columns then we copy the uncompressed parts of the + // input data to a new output vec, then decompress the compressed parts. Specifically we do + // the following: + // + // * Copy everything in prefix to the output buffer + // * If any of change columns are compressed, copy all of change data to the output buffer + // decompressing each compressed column + // * Likewise if any of ops columns are compressed copy the data decompressing as required + // * Finally copy the suffix + // + // The reason for all this work is that we end up keeping all of the data behind the + // document chunk in a single Vec, which plays nicely with the cache and makes dumping the + // document to disk or network straightforward. + + // parse everything in the prefix + let ( + i, + parse::RangeOf { + range: prefix, + value: (actors, heads, change_meta, ops_meta), + }, + ) = parse::range_of( + |i| -> parse::ParseResult<'_, _, ParseError> { + let (i, actors) = parse::length_prefixed(parse::actor_id)(i)?; + let (i, heads) = parse::length_prefixed(parse::change_hash)(i)?; + let (i, change_meta) = RawColumns::parse::(i)?; + let (i, ops_meta) = RawColumns::parse::(i)?; + Ok((i, (actors, heads, change_meta, ops_meta))) + }, + i, + )?; + + // parse the change data + let (i, parse::RangeOf { range: changes, .. }) = + parse::range_of(|i| parse::take_n(change_meta.total_column_len(), i), i)?; + + // parse the ops data + let (i, parse::RangeOf { range: ops, .. }) = + parse::range_of(|i| parse::take_n(ops_meta.total_column_len(), i), i)?; + + // parse the suffix, which may be empty if this document was produced by an older version + // of the JS automerge implementation + let (i, suffix, head_indices) = if i.is_empty() { + (i, 0..0, Vec::new()) + } else { + let ( + i, + parse::RangeOf { + range: suffix, + value: head_indices, + }, + ) = parse::range_of( + |i| parse::apply_n(heads.len(), parse::leb128_u64::)(i), + i, + )?; + (i, suffix, head_indices) + }; + + let compression::Decompressed { + change_bytes, + op_bytes, + uncompressed, + compressed, + changes, + ops, + } = compression::decompress(compression::Args { + prefix: prefix.start, + suffix: suffix.start, + original: Cow::Borrowed(input.bytes()), + changes: compression::Cols { + data: changes, + raw_columns: change_meta, + }, + ops: compression::Cols { + data: ops, + raw_columns: ops_meta, + }, + extra_args: (), + }) + .map_err(|e| parse::ParseError::Error(ParseError::RawColumns(e)))?; + + let ops_layout = Columns::parse(op_bytes.len(), ops.iter()).map_err(|e| { + parse::ParseError::Error(ParseError::BadColumnLayout { + column_type: "ops", + error: e, + }) + })?; + let ops_cols = + DocOpColumns::try_from(ops_layout).map_err(|e| parse::ParseError::Error(e.into()))?; + + let change_layout = Columns::parse(change_bytes.len(), changes.iter()).map_err(|e| { + parse::ParseError::Error(ParseError::BadColumnLayout { + column_type: "changes", + error: e, + }) + })?; + let change_cols = DocChangeColumns::try_from(change_layout) + .map_err(|e| parse::ParseError::Error(e.into()))?; + + Ok(( + i, + Document { + bytes: uncompressed, + compressed_bytes: compressed, + header, + actors, + heads, + op_metadata: ops_cols, + op_bytes, + change_metadata: change_cols, + change_bytes, + head_indices, + }, + )) + } + + pub(crate) fn new<'b, I, C, IC, D, O>( + mut actors: Vec, + heads_with_indices: Vec<(ChangeHash, usize)>, + ops: I, + changes: IC, + compress: CompressConfig, + ) -> Document<'static> + where + I: Iterator + Clone + ExactSizeIterator, + O: convert::OpId, + D: AsDocOp<'b, OpId = O>, + C: AsChangeMeta<'b>, + IC: Iterator + Clone, + { + let mut ops_out = Vec::new(); + let ops_meta = DocOpColumns::encode(ops, &mut ops_out); + + let mut change_out = Vec::new(); + let change_meta = DocChangeColumns::encode(changes, &mut change_out); + actors.sort_unstable(); + + let mut data = Vec::with_capacity(ops_out.len() + change_out.len()); + leb128::write::unsigned(&mut data, actors.len() as u64).unwrap(); + for actor in &actors { + leb128::write::unsigned(&mut data, actor.to_bytes().len() as u64).unwrap(); + data.extend(actor.to_bytes()); + } + leb128::write::unsigned(&mut data, heads_with_indices.len() as u64).unwrap(); + for (head, _) in &heads_with_indices { + data.extend(head.as_bytes()); + } + let prefix_len = data.len(); + + change_meta.raw_columns().write(&mut data); + ops_meta.raw_columns().write(&mut data); + let change_start = data.len(); + let change_end = change_start + change_out.len(); + data.extend(change_out); + let ops_start = data.len(); + let ops_end = ops_start + ops_out.len(); + data.extend(ops_out); + let suffix_start = data.len(); + + let head_indices = heads_with_indices + .iter() + .map(|(_, i)| *i as u64) + .collect::>(); + for index in &head_indices { + leb128::write::unsigned(&mut data, *index).unwrap(); + } + + let header = Header::new(ChunkType::Document, &data); + let mut bytes = Vec::with_capacity(data.len() + header.len()); + header.write(&mut bytes); + let header_len = bytes.len(); + bytes.extend(&data); + + let op_bytes = shift_range(ops_start..ops_end, header.len()); + let change_bytes = shift_range(change_start..change_end, header.len()); + + let compressed_bytes = if let CompressConfig::Threshold(threshold) = compress { + let compressed = Cow::Owned(compression::compress(compression::Args { + prefix: prefix_len + header.len(), + suffix: suffix_start + header.len(), + ops: compression::Cols { + raw_columns: ops_meta.raw_columns(), + data: op_bytes.clone(), + }, + changes: compression::Cols { + raw_columns: change_meta.raw_columns(), + data: change_bytes.clone(), + }, + original: Cow::Borrowed(&bytes), + extra_args: compression::CompressArgs { + threshold, + original_header_len: header_len, + }, + })); + Some(compressed) + } else { + None + }; + + Document { + actors, + bytes: Cow::Owned(bytes), + compressed_bytes, + header, + heads: heads_with_indices.into_iter().map(|(h, _)| h).collect(), + op_metadata: ops_meta, + op_bytes, + change_metadata: change_meta, + change_bytes, + head_indices, + } + } + + pub(crate) fn iter_ops( + &'a self, + ) -> impl Iterator> + Clone + 'a { + self.op_metadata.iter(&self.bytes[self.op_bytes.clone()]) + } + + pub(crate) fn iter_changes( + &'a self, + ) -> impl Iterator, ReadChangeError>> + Clone + 'a { + self.change_metadata + .iter(&self.bytes[self.change_bytes.clone()]) + } + + pub(crate) fn into_bytes(self) -> Vec { + if let Some(compressed) = self.compressed_bytes { + compressed.into_owned() + } else { + self.bytes.into_owned() + } + } + + pub(crate) fn checksum_valid(&self) -> bool { + self.header.checksum_valid() + } + + pub(crate) fn actors(&self) -> &[ActorId] { + &self.actors + } + + pub(crate) fn heads(&self) -> &[ChangeHash] { + &self.heads + } +} diff --git a/rust/automerge/src/storage/document/compression.rs b/rust/automerge/src/storage/document/compression.rs new file mode 100644 index 00000000..2f0e96ce --- /dev/null +++ b/rust/automerge/src/storage/document/compression.rs @@ -0,0 +1,356 @@ +use std::{borrow::Cow, convert::Infallible, ops::Range}; + +use crate::storage::{ + columns::{compression, raw_column}, + shift_range, ChunkType, Header, RawColumns, +}; + +pub(super) struct Args<'a, T: compression::ColumnCompression, DirArgs> { + /// The original data of the entire document chunk (compressed or uncompressed) + pub(super) original: Cow<'a, [u8]>, + /// The number of bytes in the original before the beginning of the change column metadata + pub(super) prefix: usize, + /// The offset in the original after the end of the ops column data + pub(super) suffix: usize, + /// The column data for the changes + pub(super) changes: Cols, + /// The column data for the ops + pub(super) ops: Cols, + /// Additional arguments specific to the direction (compression or uncompression) + pub(super) extra_args: DirArgs, +} + +pub(super) struct CompressArgs { + pub(super) threshold: usize, + pub(super) original_header_len: usize, +} + +/// Compress a document chunk returning the compressed bytes +pub(super) fn compress(args: Args<'_, compression::Uncompressed, CompressArgs>) -> Vec { + let header_len = args.extra_args.original_header_len; + let threshold = args.extra_args.threshold; + // Wrap in a closure so we can use `?` in the construction but still force the compiler + // to check that the error type is `Infallible` + let result: Result<_, Infallible> = (|| { + Ok(Compression::::new( + args, + Compressing { + threshold, + header_len, + }, + ) + .changes()? + .ops()? + .write_data() + .finish()) + })(); + // We just checked the error is `Infallible` so unwrap is fine + result.unwrap() +} + +pub(super) fn decompress<'a>( + args: Args<'a, compression::Unknown, ()>, +) -> Result, raw_column::ParseError> { + match ( + args.changes.raw_columns.uncompressed(), + args.ops.raw_columns.uncompressed(), + ) { + (Some(changes), Some(ops)) => Ok(Decompressed { + changes, + ops, + compressed: None, + uncompressed: args.original, + change_bytes: args.changes.data, + op_bytes: args.ops.data, + }), + _ => Ok( + Compression::<'a, Decompressing, _>::new(args, Decompressing) + .changes()? + .ops()? + .write_data() + .finish(), + ), + } +} + +pub(super) struct Decompressed<'a> { + /// The original compressed data, if there was any + pub(super) compressed: Option>, + /// The final uncompressed data + pub(super) uncompressed: Cow<'a, [u8]>, + /// The ops column metadata + pub(super) ops: RawColumns, + /// The change column metadata + pub(super) changes: RawColumns, + /// The location of the change column data in the uncompressed data + pub(super) change_bytes: Range, + /// The location of the op column data in the uncompressed data + pub(super) op_bytes: Range, +} + +struct Compression<'a, D: Direction, S: CompressionState> { + args: Args<'a, D::In, D::Args>, + state: S, + direction: D, +} + +/// Some columns in the original data +pub(super) struct Cols { + /// The metadata for these columns + pub(super) raw_columns: RawColumns, + /// The location in the original chunk of the data for these columns + pub(super) data: Range, +} + +// Compression and decompression involve almost the same steps in either direction. This trait +// encapsulates that. +trait Direction: std::fmt::Debug { + type Out: compression::ColumnCompression; + type In: compression::ColumnCompression; + type Error; + type Args; + + /// This method represents the (de)compression process for a direction. The arguments are: + /// + /// * cols - The columns we are processing + /// * input - the entire document chunk + /// * out - the vector to place the processed columns in + /// * meta_out - the vector to place processed column metadata in + fn process( + &self, + cols: &Cols, + input: &[u8], + out: &mut Vec, + meta_out: &mut Vec, + ) -> Result, Self::Error>; +} +#[derive(Debug)] +struct Compressing { + threshold: usize, + header_len: usize, +} + +impl Direction for Compressing { + type Error = Infallible; + type Out = compression::Unknown; + type In = compression::Uncompressed; + type Args = CompressArgs; + + fn process( + &self, + cols: &Cols, + input: &[u8], + out: &mut Vec, + meta_out: &mut Vec, + ) -> Result, Self::Error> { + let start = out.len(); + let raw_columns = cols + .raw_columns + .compress(&input[cols.data.clone()], out, self.threshold); + raw_columns.write(meta_out); + Ok(Cols { + data: start..out.len(), + raw_columns, + }) + } +} + +#[derive(Debug)] +struct Decompressing; + +impl Direction for Decompressing { + type Error = raw_column::ParseError; + type Out = compression::Uncompressed; + type In = compression::Unknown; + type Args = (); + + fn process( + &self, + cols: &Cols, + input: &[u8], + out: &mut Vec, + meta_out: &mut Vec, + ) -> Result, raw_column::ParseError> { + let start = out.len(); + let raw_columns = cols + .raw_columns + .uncompress(&input[cols.data.clone()], out)?; + raw_columns.write(meta_out); + Ok(Cols { + data: start..out.len(), + raw_columns, + }) + } +} + +// Somewhat absurdly I (alex) kept getting the order of writing ops and changes wrong as well as +// the order that column metadata vs data should be written in. This is a type state to get the +// compiler to enforce that things are done in the right order. +trait CompressionState {} +impl CompressionState for Starting {} +impl CompressionState for Changes {} +impl CompressionState for ChangesAndOps {} +impl CompressionState for Finished {} + +/// We haven't done any processing yet +struct Starting { + /// The vector to write column data to + data_out: Vec, + /// The vector to write column metadata to + meta_out: Vec, +} + +/// We've processed the changes columns +struct Changes { + /// The `Cols` for the processed change columns + change_cols: Cols, + /// The vector to write column metadata to + meta_out: Vec, + /// The vector to write column data to + data_out: Vec, +} + +/// We've processed the ops columns +struct ChangesAndOps { + /// The `Cols` for the processed change columns + change_cols: Cols, + /// The `Cols` for the processed op columns + ops_cols: Cols, + /// The vector to write column metadata to + meta_out: Vec, + /// The vector to write column data to + data_out: Vec, +} + +/// We've written the column metadata and the op metadata for changes and ops to the output buffer +/// and added the prefix and suffix from the args. +struct Finished { + /// The `Cols` for the processed change columns + change_cols: Cols, + /// The `Cols` for the processed op columns + ops_cols: Cols, + /// The start of the change column metadata in the processed chunk + data_start: usize, + /// The processed chunk + out: Vec, +} + +impl<'a, D: Direction> Compression<'a, D, Starting> { + fn new(args: Args<'a, D::In, D::Args>, direction: D) -> Compression<'a, D, Starting> { + let mut meta_out = Vec::with_capacity(args.original.len() * 2); + meta_out.extend(&args.original[..args.prefix]); + Compression { + args, + direction, + state: Starting { + meta_out, + data_out: Vec::new(), + }, + } + } +} + +impl<'a, D: Direction> Compression<'a, D, Starting> { + fn changes(self) -> Result>, D::Error> { + let Starting { + mut data_out, + mut meta_out, + } = self.state; + let change_cols = self.direction.process( + &self.args.changes, + &self.args.original, + &mut data_out, + &mut meta_out, + )?; + Ok(Compression { + args: self.args, + direction: self.direction, + state: Changes { + change_cols, + meta_out, + data_out, + }, + }) + } +} + +impl<'a, D: Direction> Compression<'a, D, Changes> { + fn ops(self) -> Result>, D::Error> { + let Changes { + change_cols, + mut meta_out, + mut data_out, + } = self.state; + let ops_cols = self.direction.process( + &self.args.ops, + &self.args.original, + &mut data_out, + &mut meta_out, + )?; + Ok(Compression { + args: self.args, + direction: self.direction, + state: ChangesAndOps { + change_cols, + ops_cols, + meta_out, + data_out, + }, + }) + } +} + +impl<'a, D: Direction> Compression<'a, D, ChangesAndOps> { + fn write_data(self) -> Compression<'a, D, Finished> { + let ChangesAndOps { + data_out, + mut meta_out, + change_cols, + ops_cols, + } = self.state; + let data_start = meta_out.len(); + meta_out.extend(&data_out); + meta_out.extend(&self.args.original[self.args.suffix..]); + Compression { + args: self.args, + direction: self.direction, + state: Finished { + ops_cols, + change_cols, + out: meta_out, + data_start, + }, + } + } +} + +impl<'a> Compression<'a, Decompressing, Finished> { + fn finish(self) -> Decompressed<'a> { + let Finished { + change_cols, + ops_cols, + data_start, + out, + } = self.state; + Decompressed { + ops: ops_cols.raw_columns, + changes: change_cols.raw_columns, + uncompressed: Cow::Owned(out), + compressed: Some(self.args.original), + change_bytes: shift_range(change_cols.data, data_start), + op_bytes: shift_range(ops_cols.data, data_start), + } + } +} + +impl<'a> Compression<'a, Compressing, Finished> { + fn finish(self) -> Vec { + let Finished { out, .. } = self.state; + let headerless = &out[self.direction.header_len..]; + let header = Header::new(ChunkType::Document, headerless); + let mut result = Vec::with_capacity(header.len() + out.len()); + header.write(&mut result); + result.extend(headerless); + result + } +} diff --git a/rust/automerge/src/storage/document/doc_change_columns.rs b/rust/automerge/src/storage/document/doc_change_columns.rs new file mode 100644 index 00000000..93fa28e3 --- /dev/null +++ b/rust/automerge/src/storage/document/doc_change_columns.rs @@ -0,0 +1,339 @@ +use std::{borrow::Cow, convert::TryFrom}; + +use crate::{ + columnar::{ + column_range::{ + generic::{GenericColumnRange, GroupRange, GroupedColumnRange, SimpleColRange}, + DeltaRange, DepsIter, DepsRange, RleRange, ValueIter, ValueRange, + }, + encoding::{ColumnDecoder, DecodeColumnError, DeltaDecoder, RleDecoder}, + }, + storage::{ + columns::{compression, ColumnId, ColumnSpec, ColumnType}, + Columns, MismatchingColumn, RawColumn, RawColumns, + }, + types::ScalarValue, +}; + +const ACTOR_COL_ID: ColumnId = ColumnId::new(0); +const SEQ_COL_ID: ColumnId = ColumnId::new(0); +const MAX_OP_COL_ID: ColumnId = ColumnId::new(1); +const TIME_COL_ID: ColumnId = ColumnId::new(2); +const MESSAGE_COL_ID: ColumnId = ColumnId::new(3); +const DEPS_COL_ID: ColumnId = ColumnId::new(4); +const EXTRA_COL_ID: ColumnId = ColumnId::new(5); + +#[derive(Debug)] +pub(crate) struct ChangeMetadata<'a> { + pub(crate) actor: usize, + pub(crate) seq: u64, + pub(crate) max_op: u64, + pub(crate) timestamp: i64, + pub(crate) message: Option, + pub(crate) deps: Vec, + pub(crate) extra: Cow<'a, [u8]>, +} + +/// A row to be encoded as change metadata in the document format +/// +/// The lifetime `'a` is the lifetime of the extra bytes Cow. For types which cannot +/// provide a reference (e.g. because they are decoding from some columnar storage on each +/// iteration) this should be `'static`. +pub(crate) trait AsChangeMeta<'a> { + /// The type of the iterator over dependency indices + type DepsIter: Iterator + ExactSizeIterator; + + fn actor(&self) -> u64; + fn seq(&self) -> u64; + fn max_op(&self) -> u64; + fn timestamp(&self) -> i64; + fn message(&self) -> Option>; + fn deps(&self) -> Self::DepsIter; + fn extra(&self) -> Cow<'a, [u8]>; +} + +#[derive(Debug, Clone)] +pub(crate) struct DocChangeColumns { + actor: RleRange, + seq: DeltaRange, + max_op: DeltaRange, + time: DeltaRange, + message: RleRange, + deps: DepsRange, + extra: ValueRange, + #[allow(dead_code)] + other: Columns, +} + +impl DocChangeColumns { + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> DocChangeColumnIter<'a> { + DocChangeColumnIter { + actors: self.actor.decoder(data), + seq: self.seq.decoder(data), + max_op: self.max_op.decoder(data), + time: self.time.decoder(data), + message: if self.message.is_empty() { + None + } else { + Some(self.message.decoder(data)) + }, + deps: self.deps.iter(data), + extra: ExtraDecoder { + val: self.extra.iter(data), + }, + } + } + + pub(crate) fn encode<'a, I, C>(changes: I, out: &mut Vec) -> DocChangeColumns + where + C: AsChangeMeta<'a>, + I: Iterator + Clone, + { + let actor = RleRange::::encode( + // TODO: make this fallible once iterators have a try_splice + changes.clone().map(|c| Some(c.actor())), + out, + ); + let seq = DeltaRange::encode(changes.clone().map(|c| Some(c.seq() as i64)), out); + let max_op = DeltaRange::encode(changes.clone().map(|c| Some(c.max_op() as i64)), out); + let time = DeltaRange::encode(changes.clone().map(|c| Some(c.timestamp())), out); + let message = RleRange::encode(changes.clone().map(|c| c.message()), out); + let deps = DepsRange::encode(changes.clone().map(|c| c.deps()), out); + let extra = ValueRange::encode( + changes.map(|c| Cow::Owned(ScalarValue::Bytes(c.extra().to_vec()))), + out, + ); + DocChangeColumns { + actor, + seq, + max_op, + time, + message, + deps, + extra, + other: Columns::empty(), + } + } + + pub(crate) fn raw_columns(&self) -> RawColumns { + let mut cols = vec![ + RawColumn::new( + ColumnSpec::new(ACTOR_COL_ID, ColumnType::Actor, false), + self.actor.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(SEQ_COL_ID, ColumnType::DeltaInteger, false), + self.seq.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(MAX_OP_COL_ID, ColumnType::DeltaInteger, false), + self.max_op.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(TIME_COL_ID, ColumnType::DeltaInteger, false), + self.time.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(MESSAGE_COL_ID, ColumnType::String, false), + self.message.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(DEPS_COL_ID, ColumnType::Group, false), + self.deps.num_range().clone().into(), + ), + ]; + if self.deps.deps_range().len() > 0 { + cols.push(RawColumn::new( + ColumnSpec::new(DEPS_COL_ID, ColumnType::DeltaInteger, false), + self.deps.deps_range().clone().into(), + )) + } + cols.push(RawColumn::new( + ColumnSpec::new(EXTRA_COL_ID, ColumnType::ValueMetadata, false), + self.extra.meta_range().clone().into(), + )); + if !self.extra.raw_range().is_empty() { + cols.push(RawColumn::new( + ColumnSpec::new(EXTRA_COL_ID, ColumnType::Value, false), + self.extra.raw_range().clone().into(), + )) + } + cols.into_iter().collect() + } +} + +#[derive(Debug, thiserror::Error)] +pub(crate) enum ReadChangeError { + #[error("unexpected null value for {0}")] + UnexpectedNull(String), + #[error("mismatching column types for column {index}")] + MismatchingColumn { index: usize }, + #[error("incorrect value in extra bytes column")] + InvalidExtraBytes, + #[error(transparent)] + ReadColumn(#[from] DecodeColumnError), +} + +impl From for ReadChangeError { + fn from(m: MismatchingColumn) -> Self { + Self::MismatchingColumn { index: m.index } + } +} + +#[derive(Clone)] +pub(crate) struct DocChangeColumnIter<'a> { + actors: RleDecoder<'a, u64>, + seq: DeltaDecoder<'a>, + max_op: DeltaDecoder<'a>, + time: DeltaDecoder<'a>, + message: Option>, + deps: DepsIter<'a>, + extra: ExtraDecoder<'a>, +} + +impl<'a> DocChangeColumnIter<'a> { + fn try_next(&mut self) -> Result>, ReadChangeError> { + let actor = match self.actors.maybe_next_in_col("actor")? { + Some(actor) => actor as usize, + None => { + // The actor column should always have a value so if the actor iterator returns None that + // means we should be done, we check by asserting that all the other iterators + // return none (which is what Self::check_done does). + if self.check_done() { + return Ok(None); + } else { + return Err(ReadChangeError::UnexpectedNull("actor".to_string())); + } + } + }; + let seq = self.seq.next_in_col("seq").and_then(|seq| { + u64::try_from(seq).map_err(|e| DecodeColumnError::invalid_value("seq", e.to_string())) + })?; + let max_op = self.max_op.next_in_col("max_op").and_then(|seq| { + u64::try_from(seq).map_err(|e| DecodeColumnError::invalid_value("seq", e.to_string())) + })?; + let time = self.time.next_in_col("time")?; + let message = if let Some(ref mut message) = self.message { + message.maybe_next_in_col("message")? + } else { + None + }; + let deps = self.deps.next_in_col("deps")?; + let extra = self.extra.next().transpose()?.unwrap_or(Cow::Borrowed(&[])); + Ok(Some(ChangeMetadata { + actor, + seq, + max_op, + timestamp: time, + message, + deps, + extra, + })) + } +} + +impl<'a> Iterator for DocChangeColumnIter<'a> { + type Item = Result, ReadChangeError>; + + fn next(&mut self) -> Option { + self.try_next().transpose() + } +} + +impl<'a> DocChangeColumnIter<'a> { + fn check_done(&mut self) -> bool { + let other_cols = [ + self.seq.next().is_none(), + self.max_op.next().is_none(), + self.time.next().is_none(), + self.deps.next().is_none(), + ]; + other_cols.iter().any(|f| *f) + } +} + +#[derive(Clone)] +struct ExtraDecoder<'a> { + val: ValueIter<'a>, +} + +impl<'a> Iterator for ExtraDecoder<'a> { + type Item = Result, ReadChangeError>; + fn next(&mut self) -> Option { + match self.val.next() { + Some(Ok(ScalarValue::Bytes(b))) => Some(Ok(Cow::Owned(b))), + Some(Ok(_)) => Some(Err(ReadChangeError::InvalidExtraBytes)), + Some(Err(e)) => Some(Err(e.into())), + None => None, + } + } +} + +impl TryFrom for DocChangeColumns { + type Error = ReadChangeError; + + fn try_from(columns: Columns) -> Result { + let mut actor: Option> = None; + let mut seq: Option = None; + let mut max_op: Option = None; + let mut time: Option = None; + let mut message: Option> = None; + let mut deps: Option = None; + let mut extra: Option = None; + let mut other = Columns::empty(); + + for (index, col) in columns.into_iter().enumerate() { + match (col.id(), col.col_type()) { + (ACTOR_COL_ID, ColumnType::Actor) => actor = Some(col.range().into()), + (SEQ_COL_ID, ColumnType::DeltaInteger) => seq = Some(col.range().into()), + (MAX_OP_COL_ID, ColumnType::DeltaInteger) => max_op = Some(col.range().into()), + (TIME_COL_ID, ColumnType::DeltaInteger) => time = Some(col.range().into()), + (MESSAGE_COL_ID, ColumnType::String) => message = Some(col.range().into()), + (DEPS_COL_ID, ColumnType::Group) => match col.into_ranges() { + GenericColumnRange::Group(GroupRange { num, values }) => { + let mut cols = values.into_iter(); + let deps_group = num; + let first = cols.next(); + let deps_index = match first { + Some(GroupedColumnRange::Simple(SimpleColRange::Delta( + index_range, + ))) => index_range, + Some(_) => { + tracing::error!( + "deps column contained more than one grouped column" + ); + return Err(ReadChangeError::MismatchingColumn { index: 5 }); + } + None => (0..0).into(), + }; + if cols.next().is_some() { + return Err(ReadChangeError::MismatchingColumn { index }); + } + deps = Some(DepsRange::new(deps_group, deps_index)); + } + _ => return Err(ReadChangeError::MismatchingColumn { index }), + }, + (EXTRA_COL_ID, ColumnType::ValueMetadata) => match col.into_ranges() { + GenericColumnRange::Value(val) => { + extra = Some(val); + } + _ => return Err(ReadChangeError::MismatchingColumn { index }), + }, + (other_id, other_type) => { + tracing::warn!(id=?other_id, typ=?other_type, "unknown column"); + other.append(col); + } + } + } + Ok(DocChangeColumns { + actor: actor.unwrap_or_else(|| (0..0).into()), + seq: seq.unwrap_or_else(|| (0..0).into()), + max_op: max_op.unwrap_or_else(|| (0..0).into()), + time: time.unwrap_or_else(|| (0..0).into()), + message: message.unwrap_or_else(|| (0..0).into()), + deps: deps.unwrap_or_else(|| DepsRange::new((0..0).into(), (0..0).into())), + extra: extra.unwrap_or_else(|| ValueRange::new((0..0).into(), (0..0).into())), + other, + }) + } +} diff --git a/rust/automerge/src/storage/document/doc_op_columns.rs b/rust/automerge/src/storage/document/doc_op_columns.rs new file mode 100644 index 00000000..82de17eb --- /dev/null +++ b/rust/automerge/src/storage/document/doc_op_columns.rs @@ -0,0 +1,450 @@ +use std::{borrow::Cow, convert::TryFrom}; + +use crate::{ + columnar::{ + column_range::{ + generic::{GenericColumnRange, GroupRange, GroupedColumnRange, SimpleColRange}, + BooleanRange, DeltaRange, Key, KeyEncoder, KeyIter, KeyRange, ObjIdEncoder, ObjIdIter, + ObjIdRange, OpIdEncoder, OpIdIter, OpIdListEncoder, OpIdListIter, OpIdListRange, + OpIdRange, RleRange, ValueEncoder, ValueIter, ValueRange, + }, + encoding::{ + BooleanDecoder, BooleanEncoder, ColumnDecoder, DecodeColumnError, RleDecoder, + RleEncoder, + }, + }, + convert, + storage::{ + columns::{compression, ColumnId, ColumnSpec, ColumnType}, + Columns, MismatchingColumn, RawColumn, RawColumns, + }, + types::{ObjId, OpId, ScalarValue}, +}; + +const OBJ_COL_ID: ColumnId = ColumnId::new(0); +const KEY_COL_ID: ColumnId = ColumnId::new(1); +const ID_COL_ID: ColumnId = ColumnId::new(2); +const INSERT_COL_ID: ColumnId = ColumnId::new(3); +const ACTION_COL_ID: ColumnId = ColumnId::new(4); +const VAL_COL_ID: ColumnId = ColumnId::new(5); +const SUCC_COL_ID: ColumnId = ColumnId::new(8); + +/// The form operations take in the compressed document format. +#[derive(Debug)] +pub(crate) struct DocOp { + pub(crate) id: OpId, + pub(crate) object: ObjId, + pub(crate) key: Key, + pub(crate) insert: bool, + pub(crate) action: usize, + pub(crate) value: ScalarValue, + pub(crate) succ: Vec, +} + +#[derive(Debug, Clone)] +pub(crate) struct DocOpColumns { + obj: Option, + key: KeyRange, + id: OpIdRange, + insert: BooleanRange, + action: RleRange, + val: ValueRange, + succ: OpIdListRange, + #[allow(dead_code)] + other: Columns, +} + +struct DocId { + actor: usize, + counter: u64, +} + +impl convert::OpId for DocId { + fn actor(&self) -> usize { + self.actor + } + + fn counter(&self) -> u64 { + self.counter + } +} + +/// A row to be encoded as an op in the document format +/// +/// The lifetime `'a` is the lifetime of the value and key data types. For types which cannot +/// provide a reference (e.g. because they are decoding from some columnar storage on each +/// iteration) this should be `'static`. +pub(crate) trait AsDocOp<'a> { + /// The type of the Actor ID component of the op IDs for this impl. This is typically either + /// `&'a ActorID` or `usize` + type ActorId; + /// The type of the op IDs this impl produces. + type OpId: convert::OpId; + /// The type of the successor iterator returned by `Self::pred`. This can often be omitted + type SuccIter: Iterator + ExactSizeIterator; + + fn obj(&self) -> convert::ObjId; + fn id(&self) -> Self::OpId; + fn key(&self) -> convert::Key<'a, Self::OpId>; + fn insert(&self) -> bool; + fn action(&self) -> u64; + fn val(&self) -> Cow<'a, ScalarValue>; + fn succ(&self) -> Self::SuccIter; +} + +impl DocOpColumns { + pub(crate) fn encode<'a, I, C, O>(ops: I, out: &mut Vec) -> DocOpColumns + where + I: Iterator + Clone + ExactSizeIterator, + O: convert::OpId, + C: AsDocOp<'a, OpId = O>, + { + if ops.len() > 30000 { + Self::encode_rowwise(ops, out) + } else { + Self::encode_columnwise(ops, out) + } + } + + fn encode_columnwise<'a, I, O, C>(ops: I, out: &mut Vec) -> DocOpColumns + where + I: Iterator + Clone, + O: convert::OpId, + C: AsDocOp<'a, OpId = O>, + { + let obj = ObjIdRange::encode(ops.clone().map(|o| o.obj()), out); + let key = KeyRange::encode(ops.clone().map(|o| o.key()), out); + let id = OpIdRange::encode(ops.clone().map(|o| o.id()), out); + let insert = BooleanRange::encode(ops.clone().map(|o| o.insert()), out); + let action = RleRange::encode(ops.clone().map(|o| Some(o.action())), out); + let val = ValueRange::encode(ops.clone().map(|o| o.val()), out); + let succ = OpIdListRange::encode(ops.map(|o| o.succ()), out); + Self { + obj, + key, + id, + insert, + action, + val, + succ, + other: Columns::empty(), + } + } + + fn encode_rowwise<'a, I, O, C>(ops: I, out: &mut Vec) -> DocOpColumns + where + I: Iterator, + O: convert::OpId, + C: AsDocOp<'a, OpId = O>, + { + let mut obj = ObjIdEncoder::new(); + let mut key = KeyEncoder::new(); + let mut id = OpIdEncoder::new(); + let mut insert = BooleanEncoder::new(); + let mut action = RleEncoder::<_, u64>::from(Vec::new()); + let mut val = ValueEncoder::new(); + let mut succ = OpIdListEncoder::new(); + for op in ops { + obj.append(op.obj()); + key.append(op.key()); + id.append(op.id()); + insert.append(op.insert()); + action.append(Some(op.action())); + val.append(&op.val()); + succ.append(op.succ()); + } + let obj = obj.finish(out); + let key = key.finish(out); + let id = id.finish(out); + + let insert_start = out.len(); + let (insert_out, _) = insert.finish(); + out.extend(insert_out); + let insert = BooleanRange::from(insert_start..out.len()); + + let action_start = out.len(); + let (action_out, _) = action.finish(); + out.extend(action_out); + let action = RleRange::from(action_start..out.len()); + + let val = val.finish(out); + let succ = succ.finish(out); + DocOpColumns { + obj, + key, + id, + insert, + action, + val, + succ, + other: Columns::empty(), + } + } + + pub(crate) fn iter<'a>(&self, data: &'a [u8]) -> DocOpColumnIter<'a> { + DocOpColumnIter { + id: self.id.iter(data), + action: self.action.decoder(data), + objs: self.obj.as_ref().map(|o| o.iter(data)), + keys: self.key.iter(data), + insert: self.insert.decoder(data), + value: self.val.iter(data), + succ: self.succ.iter(data), + } + } + + pub(crate) fn raw_columns(&self) -> RawColumns { + let mut cols = vec![ + RawColumn::new( + ColumnSpec::new(OBJ_COL_ID, ColumnType::Actor, false), + self.obj + .as_ref() + .map(|o| o.actor_range().clone().into()) + .unwrap_or(0..0), + ), + RawColumn::new( + ColumnSpec::new(OBJ_COL_ID, ColumnType::Integer, false), + self.obj + .as_ref() + .map(|o| o.counter_range().clone().into()) + .unwrap_or(0..0), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::Actor, false), + self.key.actor_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::DeltaInteger, false), + self.key.counter_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(KEY_COL_ID, ColumnType::String, false), + self.key.string_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(ID_COL_ID, ColumnType::Actor, false), + self.id.actor_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(ID_COL_ID, ColumnType::DeltaInteger, false), + self.id.counter_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(INSERT_COL_ID, ColumnType::Boolean, false), + self.insert.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(ACTION_COL_ID, ColumnType::Integer, false), + self.action.clone().into(), + ), + RawColumn::new( + ColumnSpec::new(VAL_COL_ID, ColumnType::ValueMetadata, false), + self.val.meta_range().clone().into(), + ), + ]; + if !self.val.raw_range().is_empty() { + cols.push(RawColumn::new( + ColumnSpec::new(VAL_COL_ID, ColumnType::Value, false), + self.val.raw_range().clone().into(), + )); + } + cols.push(RawColumn::new( + ColumnSpec::new(SUCC_COL_ID, ColumnType::Group, false), + self.succ.group_range().clone().into(), + )); + if !self.succ.actor_range().is_empty() { + cols.extend([ + RawColumn::new( + ColumnSpec::new(SUCC_COL_ID, ColumnType::Actor, false), + self.succ.actor_range().clone().into(), + ), + RawColumn::new( + ColumnSpec::new(SUCC_COL_ID, ColumnType::DeltaInteger, false), + self.succ.counter_range().clone().into(), + ), + ]); + } + cols.into_iter().collect() + } +} + +#[derive(Clone)] +pub(crate) struct DocOpColumnIter<'a> { + id: OpIdIter<'a>, + action: RleDecoder<'a, u64>, + objs: Option>, + keys: KeyIter<'a>, + insert: BooleanDecoder<'a>, + value: ValueIter<'a>, + succ: OpIdListIter<'a>, +} + +impl<'a> DocOpColumnIter<'a> { + fn done(&self) -> bool { + self.id.done() + } +} + +#[derive(Debug, thiserror::Error)] +#[error(transparent)] +pub(crate) struct ReadDocOpError(#[from] DecodeColumnError); + +impl<'a> Iterator for DocOpColumnIter<'a> { + type Item = Result; + + fn next(&mut self) -> Option { + if self.done() { + None + } else { + match self.try_next() { + Ok(Some(op)) => Some(Ok(op)), + Ok(None) => None, + Err(e) => Some(Err(e.into())), + } + } + } +} + +impl<'a> DocOpColumnIter<'a> { + fn try_next(&mut self) -> Result, DecodeColumnError> { + if self.done() { + Ok(None) + } else { + let id = self.id.next_in_col("id")?; + let action = self.action.next_in_col("action")?; + let obj = if let Some(ref mut objs) = self.objs { + objs.next_in_col("obj")? + } else { + ObjId::root() + }; + let key = self.keys.next_in_col("key")?; + let value = self.value.next_in_col("value")?; + let succ = self.succ.next_in_col("succ")?; + let insert = self.insert.next_in_col("insert")?; + Ok(Some(DocOp { + id, + value, + action: action as usize, + object: obj, + key, + succ, + insert, + })) + } + } +} + +#[derive(Debug, thiserror::Error)] +pub(crate) enum Error { + #[error("mismatching column at {index}.")] + MismatchingColumn { index: usize }, +} + +impl From for Error { + fn from(m: MismatchingColumn) -> Self { + Error::MismatchingColumn { index: m.index } + } +} + +impl TryFrom for DocOpColumns { + type Error = Error; + + fn try_from(columns: Columns) -> Result { + let mut obj_actor: Option> = None; + let mut obj_ctr: Option> = None; + let mut key_actor: Option> = None; + let mut key_ctr: Option = None; + let mut key_str: Option> = None; + let mut id_actor: Option> = None; + let mut id_ctr: Option = None; + let mut insert: Option = None; + let mut action: Option> = None; + let mut val: Option = None; + let mut succ_group: Option> = None; + let mut succ_actor: Option> = None; + let mut succ_ctr: Option = None; + let mut other = Columns::empty(); + + for (index, col) in columns.into_iter().enumerate() { + match (col.id(), col.col_type()) { + (ID_COL_ID, ColumnType::Actor) => id_actor = Some(col.range().into()), + (ID_COL_ID, ColumnType::DeltaInteger) => id_ctr = Some(col.range().into()), + (OBJ_COL_ID, ColumnType::Actor) => obj_actor = Some(col.range().into()), + (OBJ_COL_ID, ColumnType::Integer) => obj_ctr = Some(col.range().into()), + (KEY_COL_ID, ColumnType::Actor) => key_actor = Some(col.range().into()), + (KEY_COL_ID, ColumnType::DeltaInteger) => key_ctr = Some(col.range().into()), + (KEY_COL_ID, ColumnType::String) => key_str = Some(col.range().into()), + (INSERT_COL_ID, ColumnType::Boolean) => insert = Some(col.range().into()), + (ACTION_COL_ID, ColumnType::Integer) => action = Some(col.range().into()), + (VAL_COL_ID, ColumnType::ValueMetadata) => match col.into_ranges() { + GenericColumnRange::Value(v) => val = Some(v), + _ => { + tracing::error!("col 9 should be a value column"); + return Err(Error::MismatchingColumn { index }); + } + }, + (SUCC_COL_ID, ColumnType::Group) => match col.into_ranges() { + GenericColumnRange::Group(GroupRange { num, values }) => { + let mut cols = values.into_iter(); + let first = cols.next(); + let second = cols.next(); + succ_group = Some(num); + match (first, second) { + ( + Some(GroupedColumnRange::Simple(SimpleColRange::RleInt( + actor_range, + ))), + Some(GroupedColumnRange::Simple(SimpleColRange::Delta(ctr_range))), + ) => { + succ_actor = Some(actor_range); + succ_ctr = Some(ctr_range); + } + (None, None) => { + succ_actor = Some((0..0).into()); + succ_ctr = Some((0..0).into()); + } + _ => { + tracing::error!( + "expected a two column group of (actor, rle int) for index 10" + ); + return Err(Error::MismatchingColumn { index }); + } + }; + if cols.next().is_some() { + return Err(Error::MismatchingColumn { index }); + } + } + _ => return Err(Error::MismatchingColumn { index }), + }, + (other_col, other_type) => { + tracing::warn!(id=?other_col, typ=?other_type, "unknown column type"); + other.append(col) + } + } + } + Ok(DocOpColumns { + obj: ObjIdRange::new( + obj_actor.unwrap_or_else(|| (0..0).into()), + obj_ctr.unwrap_or_else(|| (0..0).into()), + ), + key: KeyRange::new( + key_actor.unwrap_or_else(|| (0..0).into()), + key_ctr.unwrap_or_else(|| (0..0).into()), + key_str.unwrap_or_else(|| (0..0).into()), + ), + id: OpIdRange::new( + id_actor.unwrap_or_else(|| (0..0).into()), + id_ctr.unwrap_or_else(|| (0..0).into()), + ), + insert: insert.unwrap_or_else(|| (0..0).into()), + action: action.unwrap_or_else(|| (0..0).into()), + val: val.unwrap_or_else(|| ValueRange::new((0..0).into(), (0..0).into())), + succ: OpIdListRange::new( + succ_group.unwrap_or_else(|| (0..0).into()), + succ_actor.unwrap_or_else(|| (0..0).into()), + succ_ctr.unwrap_or_else(|| (0..0).into()), + ), + other, + }) + } +} diff --git a/rust/automerge/src/storage/load.rs b/rust/automerge/src/storage/load.rs new file mode 100644 index 00000000..80ab3d82 --- /dev/null +++ b/rust/automerge/src/storage/load.rs @@ -0,0 +1,120 @@ +use tracing::instrument; + +use crate::{ + change::Change, + storage::{self, parse}, +}; + +mod change_collector; +mod reconstruct_document; +pub(crate) use reconstruct_document::{ + reconstruct_document, DocObserver, LoadedObject, Reconstructed, VerificationMode, +}; + +#[derive(Debug, thiserror::Error)] +#[allow(unreachable_pub)] +pub enum Error { + #[error("unable to parse chunk: {0}")] + Parse(Box), + #[error("invalid change columns: {0}")] + InvalidChangeColumns(Box), + #[error("invalid ops columns: {0}")] + InvalidOpsColumns(Box), + #[error("a chunk contained leftover data")] + LeftoverData, + #[error("error inflating document chunk ops: {0}")] + InflateDocument(Box), + #[error("bad checksum")] + BadChecksum, +} + +pub(crate) enum LoadedChanges<'a> { + /// All the data was succesfully loaded into a list of changes + Complete(Vec), + /// We only managed to load _some_ changes. + Partial { + /// The succesfully loaded changes + loaded: Vec, + /// The data which we were unable to parse + #[allow(dead_code)] + remaining: parse::Input<'a>, + /// The error encountered whilst trying to parse `remaining` + error: Error, + }, +} + +/// Attempt to Load all the chunks in `data`. +/// +/// # Partial Loads +/// +/// Automerge documents are encoded as one or more concatenated chunks. Each chunk containing one +/// or more changes. This means it is possible to partially load corrupted data if the first `n` +/// chunks are valid. This function returns a `LoadedChanges` which you can examine to determine if +/// this is the case. +#[instrument(skip(data))] +pub(crate) fn load_changes<'a>(mut data: parse::Input<'a>) -> LoadedChanges<'a> { + let mut changes = Vec::new(); + while !data.is_empty() { + let remaining = match load_next_change(data, &mut changes) { + Ok(d) => d, + Err(e) => { + return LoadedChanges::Partial { + loaded: changes, + remaining: data, + error: e, + }; + } + }; + data = remaining.reset(); + } + LoadedChanges::Complete(changes) +} + +fn load_next_change<'a>( + data: parse::Input<'a>, + changes: &mut Vec, +) -> Result, Error> { + let (remaining, chunk) = storage::Chunk::parse(data).map_err(|e| Error::Parse(Box::new(e)))?; + if !chunk.checksum_valid() { + return Err(Error::BadChecksum); + } + match chunk { + storage::Chunk::Document(d) => { + tracing::trace!("loading document chunk"); + let Reconstructed { + changes: new_changes, + .. + } = reconstruct_document(&d, VerificationMode::DontCheck, NullObserver) + .map_err(|e| Error::InflateDocument(Box::new(e)))?; + changes.extend(new_changes); + } + storage::Chunk::Change(change) => { + tracing::trace!("loading change chunk"); + let change = Change::new_from_unverified(change.into_owned(), None) + .map_err(|e| Error::InvalidChangeColumns(Box::new(e)))?; + #[cfg(debug_assertions)] + { + let loaded_ops = change.iter_ops().collect::>(); + tracing::trace!(actor=?change.actor_id(), num_ops=change.len(), ops=?loaded_ops, "loaded change"); + } + #[cfg(not(debug_assertions))] + tracing::trace!(actor=?change.actor_id(), num_ops=change.len(), "loaded change"); + changes.push(change); + } + storage::Chunk::CompressedChange(change, compressed) => { + tracing::trace!("loading compressed change chunk"); + let change = + Change::new_from_unverified(change.into_owned(), Some(compressed.into_owned())) + .map_err(|e| Error::InvalidChangeColumns(Box::new(e)))?; + changes.push(change); + } + }; + Ok(remaining) +} + +struct NullObserver; +impl DocObserver for NullObserver { + type Output = (); + fn finish(self, _metadata: crate::op_tree::OpSetMetadata) -> Self::Output {} + fn object_loaded(&mut self, _object: LoadedObject) {} +} diff --git a/rust/automerge/src/storage/load/change_collector.rs b/rust/automerge/src/storage/load/change_collector.rs new file mode 100644 index 00000000..d05367a9 --- /dev/null +++ b/rust/automerge/src/storage/load/change_collector.rs @@ -0,0 +1,222 @@ +use std::{ + borrow::Cow, + collections::{BTreeSet, HashMap}, + num::NonZeroU64, +}; + +use tracing::instrument; + +use crate::{ + op_tree::OpSetMetadata, + storage::{ + change::{PredOutOfOrder, Verified}, + convert::op_as_actor_id, + Change as StoredChange, ChangeMetadata, + }, + types::{ChangeHash, ObjId, Op}, +}; + +#[derive(Debug, thiserror::Error)] +pub(crate) enum Error { + #[error("a change referenced an actor index we couldn't find")] + MissingActor, + #[error("changes out of order")] + ChangesOutOfOrder, + #[error("missing change")] + MissingChange, + #[error("unable to read change metadata: {0}")] + ReadChange(Box), + #[error("incorrect max op")] + IncorrectMaxOp, + #[error("missing ops")] + MissingOps, +} + +pub(crate) struct ChangeCollector<'a> { + changes_by_actor: HashMap>>, +} + +pub(crate) struct CollectedChanges<'a> { + pub(crate) history: Vec>, + pub(crate) heads: BTreeSet, +} + +impl<'a> ChangeCollector<'a> { + pub(crate) fn new( + changes: I, + ) -> Result, Error> + where + I: IntoIterator, E>>, + { + let mut changes_by_actor: HashMap>> = HashMap::new(); + for (index, change) in changes.into_iter().enumerate() { + tracing::trace!(?change, "importing change metadata"); + let change = change.map_err(|e| Error::ReadChange(Box::new(e)))?; + let actor_changes = changes_by_actor.entry(change.actor).or_default(); + if let Some(prev) = actor_changes.last() { + // Note that we allow max_op to be equal to the previous max_op in case the + // previous change had no ops (which is permitted) + if prev.max_op > change.max_op { + return Err(Error::ChangesOutOfOrder); + } + } + actor_changes.push(PartialChange { + index, + deps: change.deps, + actor: change.actor, + seq: change.seq, + timestamp: change.timestamp, + max_op: change.max_op, + message: change.message, + extra_bytes: change.extra, + ops: Vec::new(), + }) + } + let num_changes: usize = changes_by_actor.values().map(|v| v.len()).sum(); + tracing::trace!(num_changes, "change collection context created"); + Ok(ChangeCollector { changes_by_actor }) + } + + #[instrument(skip(self))] + pub(crate) fn collect(&mut self, obj: ObjId, op: Op) -> Result<(), Error> { + let actor_changes = self + .changes_by_actor + .get_mut(&op.id.actor()) + .ok_or_else(|| { + tracing::error!(missing_actor = op.id.actor(), "missing actor for op"); + Error::MissingActor + })?; + let change_index = actor_changes.partition_point(|c| c.max_op < op.id.counter()); + let change = actor_changes.get_mut(change_index).ok_or_else(|| { + tracing::error!(missing_change_index = change_index, "missing change for op"); + Error::MissingChange + })?; + change.ops.push((obj, op)); + Ok(()) + } + + #[instrument(skip(self, metadata))] + pub(crate) fn finish( + self, + metadata: &OpSetMetadata, + ) -> Result, Error> { + let mut changes_in_order = + Vec::with_capacity(self.changes_by_actor.values().map(|c| c.len()).sum()); + for (_, changes) in self.changes_by_actor { + let mut seq = None; + for change in changes { + if let Some(seq) = seq { + if seq != change.seq - 1 { + return Err(Error::ChangesOutOfOrder); + } + } else if change.seq != 1 { + return Err(Error::ChangesOutOfOrder); + } + seq = Some(change.seq); + changes_in_order.push(change); + } + } + changes_in_order.sort_by_key(|c| c.index); + + let mut hashes_by_index = HashMap::new(); + let mut history = Vec::new(); + let mut heads = BTreeSet::new(); + for (index, change) in changes_in_order.into_iter().enumerate() { + let finished = change.finish(&hashes_by_index, metadata)?; + let hash = finished.hash(); + hashes_by_index.insert(index, hash); + for dep in finished.dependencies() { + heads.remove(dep); + } + heads.insert(hash); + history.push(finished.into_owned()); + } + + Ok(CollectedChanges { history, heads }) + } +} + +#[derive(Debug)] +struct PartialChange<'a> { + index: usize, + deps: Vec, + actor: usize, + seq: u64, + max_op: u64, + timestamp: i64, + message: Option, + extra_bytes: Cow<'a, [u8]>, + ops: Vec<(ObjId, Op)>, +} + +impl<'a> PartialChange<'a> { + /// # Panics + /// + /// * If any op references a property index which is not in `props` + /// * If any op references an actor index which is not in `actors` + #[instrument(skip(self, known_changes, metadata))] + fn finish( + mut self, + known_changes: &HashMap, + metadata: &OpSetMetadata, + ) -> Result, Error> { + let deps_len = self.deps.len(); + let mut deps = self.deps.into_iter().try_fold::<_, _, Result<_, Error>>( + Vec::with_capacity(deps_len), + |mut acc, dep| { + acc.push(known_changes.get(&(dep as usize)).cloned().ok_or_else(|| { + tracing::error!( + dependent_index = self.index, + dep_index = dep, + "could not find dependency" + ); + Error::MissingChange + })?); + Ok(acc) + }, + )?; + deps.sort(); + let num_ops = self.ops.len() as u64; + self.ops.sort_by_key(|o| o.1.id); + let converted_ops = self + .ops + .iter() + .map(|(obj, op)| op_as_actor_id(obj, op, metadata)); + let actor = metadata + .actors + .safe_get(self.actor) + .ok_or_else(|| { + tracing::error!(actor_index = self.actor, "actor out of bounds"); + Error::MissingActor + })? + .clone(); + + if num_ops > self.max_op { + return Err(Error::IncorrectMaxOp); + } + + let change = match StoredChange::builder() + .with_dependencies(deps) + .with_actor(actor) + .with_seq(self.seq) + .with_start_op(NonZeroU64::new(self.max_op - num_ops + 1).ok_or(Error::MissingOps)?) + .with_timestamp(self.timestamp) + .with_message(self.message.map(|s| s.to_string())) + .with_extra_bytes(self.extra_bytes.into_owned()) + .build(converted_ops) + { + Ok(s) => s, + Err(PredOutOfOrder) => { + // SAFETY: types::Op::preds is `types::OpIds` which ensures ops are always sorted + panic!("preds out of order"); + } + }; + #[cfg(not(debug_assertions))] + tracing::trace!(?change, hash=?change.hash(), "collected change"); + #[cfg(debug_assertions)] + { + tracing::trace!(?change, ops=?self.ops, hash=?change.hash(), "collected change"); + } + Ok(change) + } +} diff --git a/rust/automerge/src/storage/load/reconstruct_document.rs b/rust/automerge/src/storage/load/reconstruct_document.rs new file mode 100644 index 00000000..44ace72a --- /dev/null +++ b/rust/automerge/src/storage/load/reconstruct_document.rs @@ -0,0 +1,391 @@ +use super::change_collector::ChangeCollector; +use std::collections::{BTreeSet, HashMap}; +use tracing::instrument; + +use crate::{ + change::Change, + columnar::Key as DocOpKey, + op_tree::OpSetMetadata, + storage::{change::Verified, Change as StoredChange, DocOp, Document}, + types::{ChangeHash, ElemId, Key, ObjId, ObjType, Op, OpId, OpIds, OpType}, + ScalarValue, +}; + +#[derive(Debug, thiserror::Error)] +pub(crate) enum Error { + #[error("the document contained ops which were out of order")] + OpsOutOfOrder, + #[error("error reading operation: {0:?}")] + ReadOp(Box), + #[error("an operation contained an invalid action")] + InvalidAction, + #[error("an operation referenced a missing actor id")] + MissingActor, + #[error("invalid changes: {0}")] + InvalidChanges(#[from] super::change_collector::Error), + #[error("mismatching heads")] + MismatchingHeads(MismatchedHeads), + #[error("missing operations")] + MissingOps, + #[error("succ out of order")] + SuccOutOfOrder, +} + +pub(crate) struct MismatchedHeads { + changes: Vec>, + expected_heads: BTreeSet, + derived_heads: BTreeSet, +} + +impl std::fmt::Debug for MismatchedHeads { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("MismatchedHeads") + .field("changes", &self.changes.len()) + .field("expected_heads", &self.expected_heads) + .field("derived_heads", &self.derived_heads) + .finish() + } +} + +/// All the operations loaded from an object in the document format +pub(crate) struct LoadedObject { + /// The id of the object + pub(crate) id: ObjId, + /// The id of the parent object, if any + pub(crate) parent: Option, + /// The operations for this object + pub(crate) ops: Vec, + /// The type of the object + pub(crate) obj_type: ObjType, +} + +/// An observer which will be notified of each object as it completes and which can produce a +/// result once all the operations are loaded and the change graph is verified. +pub(crate) trait DocObserver { + type Output; + + /// The operations for an object have been loaded + fn object_loaded(&mut self, object: LoadedObject); + /// The document has finished loading. The `metadata` is the `OpSetMetadata` which was used to + /// create the indices in the operations which were passed to `object_loaded` + fn finish(self, metadata: OpSetMetadata) -> Self::Output; +} + +/// The result of reconstructing the change history from a document +pub(crate) struct Reconstructed { + /// The maximum op counter that was found in the document + pub(crate) max_op: u64, + /// The changes in the document, in the order they were encoded in the document + pub(crate) changes: Vec, + /// The result produced by the `DocObserver` which was watching the reconstruction + pub(crate) result: Output, + /// The heads of the document + pub(crate) heads: BTreeSet, +} + +#[derive(Debug)] +pub enum VerificationMode { + Check, + DontCheck, +} + +#[instrument(skip(doc, observer))] +pub(crate) fn reconstruct_document<'a, O: DocObserver>( + doc: &'a Document<'a>, + mode: VerificationMode, + mut observer: O, +) -> Result, Error> { + // The document format does not contain the bytes of the changes which are encoded in it + // directly. Instead the metadata about the changes (the actor, the start op, etc.) are all + // encoded separately to all the ops in the document. We need to reconstruct the changes in + // order to verify the heads of the document. To do this we iterate over the document + // operations adding each operation to a `ChangeCollector`. Once we've collected all the + // changes, the `ChangeCollector` knows how to group all the operations together to produce the + // change graph. + // + // Some of the work involved in reconstructing the changes could in principle be quite costly. + // For example, delete operations dont appear in the document at all, instead the delete + // operations are recorded as `succ` operations on the operations which they delete. This means + // that to reconstruct delete operations we have to first collect all the operations, then look + // for succ operations which we have not seen a concrete operation for. Happily we can take + // advantage of the fact that operations are encoded in the order of the object they apply to. + // This is the purpose of `LoadingObject`. + // + // Finally, when constructing an OpSet from this data we want to process the operations in the + // order they appear in the document, this allows us to create the OpSet more efficiently than + // if we were directly applying the reconstructed change graph. This is the purpose of the + // `DocObserver`, which we pass operations to as we complete the processing of each object. + + // The metadata which we create from the doc and which we will pass to the observer + let mut metadata = OpSetMetadata::from_actors(doc.actors().to_vec()); + // The object we are currently loading, starts with the root + let mut current_object = LoadingObject::root(); + // The changes we are collecting to later construct the change graph from + let mut collector = ChangeCollector::new(doc.iter_changes())?; + // A map where we record the create operations so that when the object ID the incoming + // operations refer to switches we can lookup the object type for the new object. We also + // need it so we can pass the parent object ID to the observer + let mut create_ops = HashMap::new(); + // The max op we've seen + let mut max_op = 0; + // The objects we have finished loaded + let mut objs_loaded = BTreeSet::new(); + + for op_res in doc.iter_ops() { + let doc_op = op_res.map_err(|e| Error::ReadOp(Box::new(e)))?; + max_op = std::cmp::max(max_op, doc_op.id.counter()); + + // Delete ops only appear as succ values in the document operations, so if a delete + // operation is the max op we will only see it here. Therefore we step through the document + // operations succs checking for max op + for succ in &doc_op.succ { + max_op = std::cmp::max(max_op, succ.counter()); + } + + let obj = doc_op.object; + check_opid(&metadata, *obj.opid())?; + let op = import_op(&mut metadata, doc_op)?; + tracing::trace!(?op, ?obj, "loading document op"); + + if let OpType::Make(obj_type) = op.action { + create_ops.insert( + ObjId::from(op.id), + CreateOp { + obj_type, + parent_id: obj, + }, + ); + }; + if obj == current_object.id { + current_object.append_op(op.clone())?; + } else { + let create_op = match create_ops.get(&obj) { + Some(t) => Ok(t), + None => { + tracing::error!( + ?op, + "operation referenced an object which we haven't seen a create op for yet" + ); + Err(Error::OpsOutOfOrder) + } + }?; + if obj < current_object.id { + tracing::error!(?op, previous_obj=?current_object.id, "op referenced an object ID which was smaller than the previous object ID"); + return Err(Error::OpsOutOfOrder); + } else { + let loaded = current_object.finish(&mut collector, &metadata)?; + objs_loaded.insert(loaded.id); + observer.object_loaded(loaded); + current_object = + LoadingObject::new(obj, Some(create_op.parent_id), create_op.obj_type); + current_object.append_op(op.clone())?; + } + } + } + let loaded = current_object.finish(&mut collector, &metadata)?; + objs_loaded.insert(loaded.id); + observer.object_loaded(loaded); + + // If an op created an object but no operation targeting that object was ever made then the + // object will only exist in the create_ops map. We collect all such objects here. + for ( + obj_id, + CreateOp { + parent_id, + obj_type, + }, + ) in create_ops.into_iter() + { + if !objs_loaded.contains(&obj_id) { + observer.object_loaded(LoadedObject { + parent: Some(parent_id), + id: obj_id, + ops: Vec::new(), + obj_type, + }) + } + } + + let super::change_collector::CollectedChanges { history, heads } = + collector.finish(&metadata)?; + if matches!(mode, VerificationMode::Check) { + let expected_heads: BTreeSet<_> = doc.heads().iter().cloned().collect(); + if expected_heads != heads { + tracing::error!(?expected_heads, ?heads, "mismatching heads"); + return Err(Error::MismatchingHeads(MismatchedHeads { + changes: history, + expected_heads, + derived_heads: heads, + })); + } + } + let result = observer.finish(metadata); + + Ok(Reconstructed { + result, + changes: history.into_iter().map(Change::new).collect(), + heads, + max_op, + }) +} + +struct CreateOp { + parent_id: ObjId, + obj_type: ObjType, +} +struct LoadingObject { + id: ObjId, + parent_id: Option, + ops: Vec, + obj_type: ObjType, + preds: HashMap>, + /// Operations which set a value, stored to later lookup keys when reconstructing delete events + set_ops: HashMap, + /// To correctly load the values of the `Counter` struct in the value of op IDs we need to + /// lookup the various increment operations which have been applied by the succesors of the + /// initial operation which creates the counter. + inc_ops: HashMap, +} + +impl LoadingObject { + fn root() -> Self { + Self::new(ObjId::root(), None, ObjType::Map) + } + + fn new(id: ObjId, parent_id: Option, obj_type: ObjType) -> Self { + LoadingObject { + id, + parent_id, + ops: Vec::new(), + obj_type, + preds: HashMap::new(), + set_ops: HashMap::new(), + inc_ops: HashMap::new(), + } + } + + fn append_op(&mut self, op: Op) -> Result<(), Error> { + // Collect set and make operations so we can find the keys which delete operations refer to + // in `finish` + if matches!(op.action, OpType::Put(_) | OpType::Make(_)) { + match op.key { + Key::Map(_) => { + self.set_ops.insert(op.id, op.key); + } + Key::Seq(ElemId(o)) => { + let elem_opid = if op.insert { op.id } else { o }; + self.set_ops.insert(op.id, Key::Seq(ElemId(elem_opid))); + } + }; + } + // Collect increment operations so we can reconstruct counters properly in `finish` + if let OpType::Increment(inc) = op.action { + self.inc_ops.insert(op.id, inc); + } + for succ in &op.succ { + self.preds.entry(*succ).or_default().push(op.id); + } + self.ops.push(op); + Ok(()) + } + + fn finish( + mut self, + collector: &mut ChangeCollector<'_>, + meta: &OpSetMetadata, + ) -> Result { + let mut ops = Vec::new(); + for mut op in self.ops.into_iter() { + if let Some(preds) = self.preds.remove(&op.id) { + op.pred = meta.sorted_opids(preds.into_iter()); + } + if let OpType::Put(ScalarValue::Counter(c)) = &mut op.action { + let inc_ops = op.succ.iter().filter_map(|s| self.inc_ops.get(s).copied()); + c.increment(inc_ops); + } + collector.collect(self.id, op.clone())?; + ops.push(op) + } + // Any remaining pred ops must be delete operations + // TODO (alex): Figure out what index these should be inserted at. Does it even matter? + for (opid, preds) in self.preds.into_iter() { + let key = self.set_ops.get(&preds[0]).ok_or_else(|| { + tracing::error!(?opid, ?preds, "no delete operation found"); + Error::MissingOps + })?; + collector.collect( + self.id, + Op { + id: opid, + pred: meta.sorted_opids(preds.into_iter()), + insert: false, + succ: OpIds::empty(), + key: *key, + action: OpType::Delete, + }, + )?; + } + Ok(LoadedObject { + id: self.id, + parent: self.parent_id, + ops, + obj_type: self.obj_type, + }) + } +} + +fn import_op(m: &mut OpSetMetadata, op: DocOp) -> Result { + let key = match op.key { + DocOpKey::Prop(s) => Key::Map(m.import_prop(s)), + DocOpKey::Elem(ElemId(op)) => Key::Seq(ElemId(check_opid(m, op)?)), + }; + for opid in &op.succ { + if m.actors.safe_get(opid.actor()).is_none() { + tracing::error!(?opid, "missing actor"); + return Err(Error::MissingActor); + } + } + Ok(Op { + id: check_opid(m, op.id)?, + action: parse_optype(op.action, op.value)?, + key, + succ: m.try_sorted_opids(op.succ).ok_or(Error::SuccOutOfOrder)?, + pred: OpIds::empty(), + insert: op.insert, + }) +} + +/// We construct the OpSetMetadata directly from the vector of actors which are encoded in the +/// start of the document. Therefore we need to check for each opid in the docuemnt that the actor +/// ID which it references actually exists in the metadata. +fn check_opid(m: &OpSetMetadata, opid: OpId) -> Result { + match m.actors.safe_get(opid.actor()) { + Some(_) => Ok(opid), + None => { + tracing::error!("missing actor"); + Err(Error::MissingActor) + } + } +} + +fn parse_optype(action_index: usize, value: ScalarValue) -> Result { + match action_index { + 0 => Ok(OpType::Make(ObjType::Map)), + 1 => Ok(OpType::Put(value)), + 2 => Ok(OpType::Make(ObjType::List)), + 3 => Ok(OpType::Delete), + 4 => Ok(OpType::Make(ObjType::Text)), + 5 => match value { + ScalarValue::Int(i) => Ok(OpType::Increment(i)), + _ => { + tracing::error!(?value, "invalid value for counter op"); + Err(Error::InvalidAction) + } + }, + 6 => Ok(OpType::Make(ObjType::Table)), + other => { + tracing::error!(action = other, "unknown action type"); + Err(Error::InvalidAction) + } + } +} diff --git a/rust/automerge/src/storage/parse.rs b/rust/automerge/src/storage/parse.rs new file mode 100644 index 00000000..6751afb4 --- /dev/null +++ b/rust/automerge/src/storage/parse.rs @@ -0,0 +1,595 @@ +//! A small parser combinator library inspired by [`nom`](https://docs.rs/crate/nom/5.0.0). +//! +//! The primary reason for using this rather than `nom` is that this is only a few hundred lines of +//! code because we don't need a fully fledged combinator library - automerge is a low level +//! library so it's good to avoid dependencies where we can. +//! +//! # Basic Usage +//! +//! The basic components of this library are [`Parser`]s, which parse [`Input`]s and produce +//! [`ParseResult`]s. `Input` is a combination of an `&[u8]` which is the incoming data along with +//! the position it has read up to in the data. `Parser` is a trait but has a blanket `impl` for +//! `FnMut(Input<'a>) -> ParseResult<'a, O, E>` so in practice you can think of parsers as a +//! function which takes some input and returns a result plus any remaining input. This final part +//! is encapsulated by the `ParseResult` which is a type alias for a `Result`. This means that +//! typical usage will look something like this: +//! +//! ```rust,ignore +//! use automerge::storage::parse::{ParseResult, take_1}; +//! fn do_something<'a>(input: Input<'a>) -> ParseResult<'a, [u8; 3], ()> { +//! let (i, a) = take_1::<()>(input)?; +//! let (i, b) = take_1::<()>(i)?; +//! let (i, c) = take_1::<()>(i)?; +//! let result = [a, b, c]; +//! Ok((i, result)) +//! } +//! +//! let input = Input::new(&[b"12345"]); +//! let result = do_something(input); +//! if let Ok((_, result)) = result { +//! assert_eq!(&result, &['1', '2', '3']); +//! } else { +//! panic!(); +//! } +//! ``` +//! +//! Three things to note here: +//! +//! 1. The rebinding of the input (in `i`) after each call to `take_1`, this is how parser state is passed from +//! one call to the next +//! 2. We return a tuple containing the remaining input plus the result +//! 3. `take_1` has a type parameter we must pass to it representing the error type. Generally you +//! don't need to do that as type inference is often good enough. +//! +//! # Errors +//! +//! The error branch of `ParseError` is an enum containing either `ParseError::Incomplete` +//! indicating that with more input we might be able to succeed, or a `ParseError::Error`. The +//! latter branch is where parser specific errors (e.g. "this u8 is not a valid chunk type") are +//! passed. This has implications for returning and handling errors. +//! +//! ## Returning Errors +//! +//! If you want to return an error from a parser you will need to wrap the error in +//! `ParseError::Error`. +//! +//! ```rust,ignore +//! struct MyError; +//! fn my_bad_parser() -> ParseResult<(), MyError> { +//! Err(ParseError::Error(MyError)) +//! } +//! ``` +//! +//! ## Handling Errors +//! +//! Handling errors is generally important when you want to compose parsers with different error +//! types. In this case you will often have an error type you want to map each of the underlying +//! errors into. For this purpose you can use `ParseError::lift` +//! +//! ```rust,ignore +//! # use automerge::parse::{ParseResult, Input}; +//! #[derive(thiserror::Error, Debug)] +//! #[error("this is a bad string")] +//! struct BadString; +//! +//! #[derive(thiserror::Error, Debug)] +//! #[error("this is a bad number")] +//! struct BadNumber; +//! +//! fn parse_string<'a>(input: Input<'a>) -> ParseResult<'a, String, BadString> { +//! Err(ParseError::Error(BadString)) +//! } +//! +//! fn parse_number<'a>(input: Input<'a>) -> ParseResult<'a, u32, BadNumber> { +//! Err(ParseError::Error(BadNumber)) +//! } +//! +//! #[derive(thiserror::Error, Debug)] +//! struct CombinedError{ +//! #[error(transparent)] +//! String(#[from] BadString), +//! #[error(transparent)] +//! Number(#[from] BadNumber), +//! } +//! +//! fn parse_string_then_number<'a>(input: Input<'a>) -> ParseResult<'a, (String, u32), CombinedError> { +//! // Note the `e.lift()` here, this works because of the `From` impl generated by +//! // `thiserror::Error` +//! let (i, thestring) = parse_string(input).map_err(|e| e.lift())?; +//! let (i, thenumber) = parse_number(i).map_err(|e| e.lift())?; +//! Ok((i, (thestring, thenumber))) +//! } +//! ``` + +use core::num::NonZeroUsize; +use std::convert::TryInto; + +pub(crate) mod leb128; +use crate::{ActorId, ChangeHash}; + +const HASH_SIZE: usize = 32; // 256 bits = 32 bytes + +#[allow(unused_imports)] +pub(crate) use self::leb128::{leb128_i64, leb128_u32, leb128_u64, nonzero_leb128_u64}; + +pub(crate) type ParseResult<'a, O, E> = Result<(Input<'a>, O), ParseError>; + +/// The input to be parsed. This is a combination of an underlying slice, plus an offset into that +/// slice. Consequently it is very cheap to copy. +#[derive(PartialEq, Clone, Copy)] +pub(crate) struct Input<'a> { + bytes: &'a [u8], + position: usize, + original: &'a [u8], +} + +impl<'a> std::fmt::Debug for Input<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Input(len: {}, position: {}, original_len: {})", + self.bytes.len(), + self.position, + self.original.len() + ) + } +} + +impl<'a> Input<'a> { + pub(crate) fn new(bytes: &'a [u8]) -> Self { + Self { + bytes, + position: 0, + original: bytes, + } + } + + #[cfg(test)] + pub(in crate::storage::parse) fn with_position(bytes: &'a [u8], position: usize) -> Input<'a> { + let remaining = &bytes[position..]; + Self { + bytes: remaining, + position, + original: bytes, + } + } + + pub(crate) fn empty() -> Self { + Self { + bytes: &[], + position: 0, + original: &[], + } + } + + fn take_1(&self) -> ParseResult<'a, u8, E> { + if let Some(need) = NonZeroUsize::new(1_usize.saturating_sub(self.bytes.len())) { + Err(ParseError::Incomplete(Needed::Size(need))) + } else { + let (result, remaining) = self.bytes.split_at(1); + let new_input = Input { + bytes: remaining, + original: self.original, + position: self.position + 1, + }; + Ok((new_input, result[0])) + } + } + + fn take_n(&self, n: usize) -> ParseResult<'a, &'a [u8], E> { + if let Some(need) = NonZeroUsize::new(n.saturating_sub(self.bytes.len())) { + Err(ParseError::Incomplete(Needed::Size(need))) + } else { + let (result, remaining) = self.bytes.split_at(n); + let new_input = Input { + bytes: remaining, + original: self.original, + position: self.position + n, + }; + Ok((new_input, result)) + } + } + + fn take_4(&self) -> ParseResult<'a, [u8; 4], E> { + if let Some(need) = NonZeroUsize::new(4_usize.saturating_sub(self.bytes.len())) { + Err(ParseError::Incomplete(Needed::Size(need))) + } else { + let (result, remaining) = self.bytes.split_at(4); + let new_input = Input { + bytes: remaining, + original: self.original, + position: self.position + 4, + }; + Ok((new_input, result.try_into().expect("we checked the length"))) + } + } + + fn range_of(&self, mut parser: P) -> ParseResult<'a, RangeOf, E> + where + P: Parser<'a, R, E>, + { + let (new_input, value) = parser.parse(*self)?; + let range = self.position..new_input.position; + Ok((new_input, RangeOf { range, value })) + } + + fn rest(&self) -> ParseResult<'a, &'a [u8], E> { + let position = self.position + self.bytes.len(); + let new_input = Self { + position, + original: self.original, + bytes: &[], + }; + Ok((new_input, self.bytes)) + } + + fn truncate(&self, length: usize) -> Input<'a> { + let length = if length > self.bytes.len() { + self.bytes.len() + } else { + length + }; + Input { + bytes: &self.bytes[..length], + position: self.position, + original: &self.original[..(self.position + length)], + } + } + + fn skip(&self, length: usize) -> Input<'a> { + if length > self.bytes.len() { + Input { + bytes: &[], + position: self.bytes.len(), + original: self.original, + } + } else { + Input { + bytes: &self.bytes[length..], + position: self.position + length, + original: &self.original[(self.position + length)..], + } + } + } + + /// Split this input into two separate inputs, the first is the same as the current input but + /// with the remaining unconsumed_bytes set to at most length. The remaining `Input` is the bytes + /// after `length`. + /// + /// This is useful if you are parsing input which contains length delimited chunks. In this + /// case you may have a single input where you parse a header, then you want to parse the + /// current input up until the length and then parse the next chunk from the remainign input. + /// For example: + /// + /// ```rust,ignore + /// # use automerge::storage::parse::{Input, ParseResult}; + /// + /// fn parse_chunk(input: Input<'_>) -> ParseResult<(), ()> { + /// Ok(()) + /// } + /// + /// # fn main() -> ParseResult<(), ()> { + /// let incoming_bytes: &[u8] = todo!(); + /// let mut input = Input::new(incoming_bytes); + /// let mut chunks = Vec::new(); + /// while !input.is_empty() { + /// let (i, chunk_len) = leb128_u64(input)?; + /// let Split{first: i, remaining} = i.split(chunk_len); + /// // Note that here, the `i` we pass into `parse_chunk` has already parsed the header, + /// // so the logic of the `parse_chunk` function doesn't need to reimplement the header + /// // parsing + /// let (i, chunk) = parse_chunk(i)?; + /// let input = remaining; + /// } + /// parse_chunk(i); + /// # } + /// ``` + pub(crate) fn split(&self, length: usize) -> Split<'a> { + Split { + first: self.truncate(length), + remaining: self.skip(length), + } + } + + /// Return a new `Input` which forgets about the consumed input. The new `Input` will have it's + /// position set to 0. This is equivalent to `Input::new(self.bytes())` + pub(crate) fn reset(&self) -> Input<'a> { + Input::new(self.bytes) + } + + /// Check if there are any more bytes left to consume + pub(crate) fn is_empty(&self) -> bool { + self.bytes.is_empty() + } + + /// The bytes which have not yet been consumed + pub(crate) fn unconsumed_bytes(&self) -> &'a [u8] { + self.bytes + } + + /// The bytes behind this input - including bytes which have been consumed + #[allow(clippy::misnamed_getters)] + pub(crate) fn bytes(&self) -> &'a [u8] { + self.original + } +} + +/// Returned by [`Input::split`] +pub(crate) struct Split<'a> { + /// The input up to the length passed to `split`. This is identical to the original input + /// except that [`Input::bytes`] and [`Input::unconsumed_bytes`] will only return the original + /// input up to `length` bytes from the point at which `split` was called. + pub(crate) first: Input<'a>, + /// The remaining input after the length passed to `split`. This is equivalent to + /// + /// ```rust,ignore + /// # use automerge::storage::parse::Input; + /// # let split_length = 1; + /// let original_input = todo!(); + /// Input::new(original_input.bytes()[split_length..]) + /// ``` + pub(crate) remaining: Input<'a>, +} + +pub(crate) trait Parser<'a, O, E> { + fn parse(&mut self, input: Input<'a>) -> ParseResult<'a, O, E>; +} + +impl<'a, O, F, E> Parser<'a, O, E> for F +where + F: FnMut(Input<'a>) -> ParseResult<'a, O, E>, +{ + fn parse(&mut self, input: Input<'a>) -> ParseResult<'a, O, E> { + (self)(input) + } +} + +#[derive(Clone, Debug, PartialEq)] +pub(crate) enum ParseError { + /// Some application specific error occurred + Error(E), + /// A combinator requested more data than we have available + Incomplete(Needed), +} + +impl ParseError { + /// Convert any underlying `E` into `F`. This is useful when you are composing parsers + pub(crate) fn lift(self) -> ParseError + where + F: From, + { + match self { + Self::Error(e) => ParseError::Error(F::from(e)), + Self::Incomplete(n) => ParseError::Incomplete(n), + } + } +} + +impl std::fmt::Display for ParseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Error(e) => write!(f, "{}", e), + Self::Incomplete(_) => write!(f, "not enough data"), + } + } +} + +impl std::error::Error for ParseError {} + +/// How much more input we need +#[derive(Clone, Debug, PartialEq)] +pub(crate) enum Needed { + /// We don't know how much more + #[allow(dead_code)] + Unknown, + /// We need _at least_ this much more + Size(NonZeroUsize), +} + +/// Map the function `f` over the result of `parser` returning a new parser +pub(crate) fn map<'a, O1, O2, F, G, Er>( + mut parser: F, + mut f: G, +) -> impl FnMut(Input<'a>) -> ParseResult<'a, O2, Er> +where + F: Parser<'a, O1, Er>, + G: FnMut(O1) -> O2, +{ + move |input: Input<'a>| { + let (input, o1) = parser.parse(input)?; + Ok((input, f(o1))) + } +} + +/// Pull one byte from the input +pub(crate) fn take1(input: Input<'_>) -> ParseResult<'_, u8, E> { + input.take_1() +} + +/// Parse an array of four bytes from the input +pub(crate) fn take4(input: Input<'_>) -> ParseResult<'_, [u8; 4], E> { + input.take_4() +} + +/// Parse a slice of length `n` from `input` +pub(crate) fn take_n(n: usize, input: Input<'_>) -> ParseResult<'_, &[u8], E> { + input.take_n(n) +} + +/// Parse a length prefixed collection of `g` +/// +/// This first parses a LEB128 encoded `u64` from the input, then applies the parser `g` this many +/// times, returning the result in a `Vec`. +pub(crate) fn length_prefixed<'a, G, O, Er>( + mut g: G, +) -> impl FnMut(Input<'a>) -> ParseResult<'a, Vec, Er> +where + G: Parser<'a, O, Er>, + Er: From, +{ + move |input: Input<'a>| { + let (i, count) = leb128_u64(input).map_err(|e| e.lift())?; + let mut res = Vec::new(); + let mut input = i; + for _ in 0..count { + match g.parse(input) { + Ok((i, e)) => { + input = i; + res.push(e); + } + Err(e) => { + return Err(e); + } + } + } + Ok((input, res)) + } +} + +/// Parse a length prefixed array of bytes from the input +/// +/// This first parses a LEB128 encoded `u64` from the input, then parses this many bytes from the +/// underlying input. +pub(crate) fn length_prefixed_bytes(input: Input<'_>) -> ParseResult<'_, &[u8], E> +where + E: From, +{ + let (i, len) = leb128_u64(input).map_err(|e| e.lift())?; + take_n(len as usize, i) +} + +/// Apply two parsers, returning the result in a 2 tuple +/// +/// This first applies `f`, then `g` and returns the result as `(f, g)`. +pub(super) fn tuple2<'a, F, E, G, H, Er>( + mut f: F, + mut g: G, +) -> impl FnMut(Input<'a>) -> ParseResult<'_, (E, H), Er> +where + F: Parser<'a, E, Er>, + G: Parser<'a, H, Er>, +{ + move |input: Input<'a>| { + let (i, one) = f.parse(input)?; + let (i, two) = g.parse(i)?; + Ok((i, (one, two))) + } +} + +/// Apply the parser `f` `n` times and reutrn the result in a `Vec` +pub(super) fn apply_n<'a, F, E, Er>( + n: usize, + mut f: F, +) -> impl FnMut(Input<'a>) -> ParseResult<'_, Vec, Er> +where + F: Parser<'a, E, Er>, +{ + move |input: Input<'a>| { + let mut i = input; + let mut result = Vec::new(); + for _ in 0..n { + let (new_i, e) = f.parse(i)?; + result.push(e); + i = new_i; + } + Ok((i, result)) + } +} + +/// Parse a length prefixed actor ID +/// +/// This first parses a LEB128 encoded u64 from the input, then the corresponding number of bytes +/// which are returned wrapped in an `ActorId` +pub(crate) fn actor_id(input: Input<'_>) -> ParseResult<'_, ActorId, E> +where + E: From, +{ + let (i, length) = leb128_u64(input).map_err(|e| e.lift())?; + let (i, bytes) = take_n(length as usize, i)?; + Ok((i, bytes.into())) +} + +/// Parse a change hash. +/// +/// This is just a nice wrapper around `take_4` +pub(crate) fn change_hash(input: Input<'_>) -> ParseResult<'_, ChangeHash, E> { + let (i, bytes) = take_n(HASH_SIZE, input)?; + let byte_arr: ChangeHash = bytes.try_into().expect("we checked the length above"); + Ok((i, byte_arr)) +} + +#[derive(thiserror::Error, Debug)] +#[error("invalid UTF-8")] +pub(crate) struct InvalidUtf8; + +/// Parse a length prefixed UTF-8 string +/// +/// This first parses a LEB128 encode `u64` from the input, then parses this many bytes from the +/// input before attempting to convert these bytes into a `String`, returning +/// `ParseError::Error(InvalidUtf8)` if that fails. +pub(crate) fn utf_8(len: usize, input: Input<'_>) -> ParseResult<'_, String, E> +where + E: From, +{ + let (i, bytes) = take_n(len, input)?; + let result = String::from_utf8(bytes.to_vec()) + .map_err(|_| ParseError::Error(InvalidUtf8)) + .map_err(|e| e.lift())?; + Ok((i, result)) +} + +/// Returned from `range_of` +pub(crate) struct RangeOf { + /// The range in the input where we parsed from + pub(crate) range: std::ops::Range, + /// The value we parsed + pub(crate) value: T, +} + +/// Evaluate `parser` and then return the value parsed, as well as the range in the input which we +/// just parsed. +/// +/// This is useful when you want to parse some data from an input in order to check that is valid, +/// but you will also be holding on to the input data and want to know where in the input data the +/// valid data was parsed from. +/// +/// # Example +/// +/// Imagine that we are parsing records of some kind from a file, as well as parsing the record we +/// want to record the offset in the file where the record is so we can update it in place. +/// +/// ```rust,ignore +/// # use automerge::storage::parse::{ParseResult, Input}; +/// struct Message; +/// struct Record { +/// message: Message, +/// location: std::ops::Range +/// } +/// +/// fn parse_message<'a>(input: Input<'a>) -> ParseResult<'a, Message, ()> { +/// unimplemented!() +/// } +/// +/// fn parse_record<'a>(input: Input<'a>) -> ParseResult<'a, Record, ()> { +/// let (i, RangeOf{range: location, value: message}) = range_of(|i| parse_message(i), i)?; +/// Ok((i, Record { +/// location, // <- this is the location in the input where the message was parsed from +/// message, +/// })) +/// } +/// +/// let file_contents: Vec = unimplemented!(); +/// let input = Input::new(&file_contents); +/// let record = parse_record(input).unwrap().1; +/// ``` +pub(crate) fn range_of<'a, P, R, E>(parser: P, input: Input<'a>) -> ParseResult<'a, RangeOf, E> +where + P: Parser<'a, R, E>, +{ + input.range_of(parser) +} + +/// Parse all the remaining input from the parser. This can never fail +pub(crate) fn take_rest(input: Input<'_>) -> ParseResult<'_, &'_ [u8], E> { + input.rest() +} diff --git a/rust/automerge/src/storage/parse/leb128.rs b/rust/automerge/src/storage/parse/leb128.rs new file mode 100644 index 00000000..9f5e72a2 --- /dev/null +++ b/rust/automerge/src/storage/parse/leb128.rs @@ -0,0 +1,302 @@ +use std::num::NonZeroU64; + +use super::{take1, Input, ParseError, ParseResult}; + +#[derive(PartialEq, thiserror::Error, Debug, Clone)] +pub(crate) enum Error { + #[error("leb128 was too large for the destination type")] + Leb128TooLarge, + #[error("leb128 was improperly encoded")] + Leb128Overlong, + #[error("leb128 was zero when it was expected to be nonzero")] + UnexpectedZero, +} + +pub(crate) fn leb128_u64(input: Input<'_>) -> ParseResult<'_, u64, E> +where + E: From, +{ + let mut res = 0; + let mut shift = 0; + let mut input = input; + + loop { + let (i, byte) = take1(input)?; + input = i; + res |= ((byte & 0x7F) as u64) << shift; + shift += 7; + + if (byte & 0x80) == 0 { + if shift > 64 && byte > 1 { + return Err(ParseError::Error(Error::Leb128TooLarge.into())); + } else if shift > 7 && byte == 0 { + return Err(ParseError::Error(Error::Leb128Overlong.into())); + } + return Ok((input, res)); + } else if shift > 64 { + return Err(ParseError::Error(Error::Leb128TooLarge.into())); + } + } +} + +pub(crate) fn leb128_i64(input: Input<'_>) -> ParseResult<'_, i64, E> +where + E: From, +{ + let mut res = 0; + let mut shift = 0; + + let mut input = input; + let mut prev = 0; + loop { + let (i, byte) = take1(input)?; + input = i; + res |= ((byte & 0x7F) as i64) << shift; + shift += 7; + + if (byte & 0x80) == 0 { + if shift > 64 && byte != 0 && byte != 0x7f { + // the 10th byte (if present) must contain only the sign-extended sign bit + return Err(ParseError::Error(Error::Leb128TooLarge.into())); + } else if shift > 7 + && ((byte == 0 && prev & 0x40 == 0) || (byte == 0x7f && prev & 0x40 > 0)) + { + // overlong if the sign bit of penultimate byte has been extended + return Err(ParseError::Error(Error::Leb128Overlong.into())); + } else if shift < 64 && byte & 0x40 > 0 { + // sign extend negative numbers + res |= -1 << shift; + } + return Ok((input, res)); + } else if shift > 64 { + return Err(ParseError::Error(Error::Leb128TooLarge.into())); + } + prev = byte; + } +} + +pub(crate) fn leb128_u32(input: Input<'_>) -> ParseResult<'_, u32, E> +where + E: From, +{ + let (i, num) = leb128_u64(input)?; + let result = u32::try_from(num).map_err(|_| ParseError::Error(Error::Leb128TooLarge.into()))?; + Ok((i, result)) +} + +/// Parse a LEB128 encoded u64 from the input, throwing an error if it is `0` +pub(crate) fn nonzero_leb128_u64(input: Input<'_>) -> ParseResult<'_, NonZeroU64, E> +where + E: From, +{ + let (input, num) = leb128_u64(input)?; + let result = + NonZeroU64::new(num).ok_or_else(|| ParseError::Error(Error::UnexpectedZero.into()))?; + Ok((input, result)) +} + +#[cfg(test)] +mod tests { + use super::super::Needed; + use super::*; + use std::num::NonZeroUsize; + + const NEED_ONE: Needed = Needed::Size(unsafe { NonZeroUsize::new_unchecked(1) }); + + #[test] + fn leb_128_u64() { + let one = &[0b00000001_u8]; + let one_two_nine = &[0b10000001, 0b00000001]; + let one_and_more = &[0b00000001, 0b00000011]; + + let scenarios: Vec<(&'static [u8], ParseResult<'_, u64, Error>)> = vec![ + (one, Ok((Input::with_position(one, 1), 1))), + ( + one_two_nine, + Ok((Input::with_position(one_two_nine, 2), 129)), + ), + (one_and_more, Ok((Input::with_position(one_and_more, 1), 1))), + ]; + for (index, (input, expected)) in scenarios.clone().into_iter().enumerate() { + let result = leb128_u64(Input::new(input)); + if result != expected { + panic!( + "Scenario {} failed for u64: expected {:?} got {:?}", + index + 1, + expected, + result + ); + } + } + + let error_cases: Vec<(&'static str, &'static [u8], ParseError<_>)> = vec![ + ( + "too many bytes", + &[129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "too many bits", + &[129, 129, 129, 129, 129, 129, 129, 129, 129, 2], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "overlong encoding", + &[129, 0], + ParseError::Error(Error::Leb128Overlong), + ), + ("missing data", &[255], ParseError::Incomplete(NEED_ONE)), + ]; + error_cases.into_iter().for_each(|(desc, input, expected)| { + match leb128_u64::(Input::new(input)) { + Ok((_, x)) => panic!("leb128_u64 should fail with {}, got {}", desc, x), + Err(error) => { + if error != expected { + panic!("leb128_u64 should fail with {}, got {}", expected, error) + } + } + } + }); + + let success_cases: Vec<(&'static [u8], u64)> = vec![ + (&[0], 0), + (&[0x7f], 127), + (&[0x80, 0x01], 128), + (&[0xff, 0x7f], 16383), + ( + &[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1], + u64::MAX, + ), + ]; + success_cases.into_iter().for_each(|(input, expected)| { + match leb128_u64::(Input::new(input)) { + Ok((_, x)) => { + if x != expected { + panic!("leb128_u64 should succeed with {}, got {}", expected, x) + } + } + Err(error) => panic!("leb128_u64 should succeed with {}, got {}", expected, error), + } + }); + } + + #[test] + fn leb_128_u32() { + let error_cases: Vec<(&'static str, &'static [u8], ParseError<_>)> = vec![ + ( + "too many bytes", + &[129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "too many bits", + &[0xff, 0xff, 0xff, 0xff, 0x1f], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "overlong encoding", + &[129, 0], + ParseError::Error(Error::Leb128Overlong), + ), + ("missing data", &[0xaa], ParseError::Incomplete(NEED_ONE)), + ]; + error_cases.into_iter().for_each(|(desc, input, expected)| { + match leb128_u32::(Input::new(input)) { + Ok((_, x)) => panic!("leb128_u32 should fail with {}, got {}", desc, x), + Err(error) => { + if error != expected { + panic!("leb128_u32 should fail with {}, got {}", expected, error) + } + } + } + }); + + let success_cases: Vec<(&'static [u8], u32)> = vec![ + (&[0], 0), + (&[0x7f], 127), + (&[0x80, 0x01], 128), + (&[0xff, 0x7f], 16383), + (&[0xff, 0xff, 0xff, 0xff, 0x0f], u32::MAX), + ]; + success_cases.into_iter().for_each(|(input, expected)| { + match leb128_u32::(Input::new(input)) { + Ok((_, x)) => { + if x != expected { + panic!("leb128_u32 should succeed with {}, got {}", expected, x) + } + } + Err(error) => panic!("leb128_u64 should succeed with {}, got {}", expected, error), + } + }); + } + + #[test] + fn leb_128_i64() { + let error_cases: Vec<(&'static str, &'static [u8], ParseError<_>)> = vec![ + ( + "too many bytes", + &[129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "too many positive bits", + &[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "too many negative bits", + &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e], + ParseError::Error(Error::Leb128TooLarge), + ), + ( + "overlong positive encoding", + &[0xbf, 0], + ParseError::Error(Error::Leb128Overlong), + ), + ( + "overlong negative encoding", + &[0x81, 0xff, 0x7f], + ParseError::Error(Error::Leb128Overlong), + ), + ("missing data", &[0x90], ParseError::Incomplete(NEED_ONE)), + ]; + error_cases.into_iter().for_each(|(desc, input, expected)| { + match leb128_i64::(Input::new(input)) { + Ok((_, x)) => panic!("leb128_i64 should fail with {}, got {}", desc, x), + Err(error) => { + if error != expected { + panic!("leb128_i64 should fail with {}, got {}", expected, error) + } + } + } + }); + + let success_cases: Vec<(&'static [u8], i64)> = vec![ + (&[0], 0), + (&[0x7f], -1), + (&[0x3f], 63), + (&[0x40], -64), + (&[0x80, 0x01], 128), + (&[0xff, 0x3f], 8191), + (&[0x80, 0x40], -8192), + ( + &[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0], + i64::MAX, + ), + ( + &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f], + i64::MIN, + ), + ]; + success_cases.into_iter().for_each(|(input, expected)| { + match leb128_i64::(Input::new(input)) { + Ok((_, x)) => { + if x != expected { + panic!("leb128_i64 should succeed with {}, got {}", expected, x) + } + } + Err(error) => panic!("leb128_u64 should succeed with {}, got {}", expected, error), + } + }); + } +} diff --git a/rust/automerge/src/storage/save.rs b/rust/automerge/src/storage/save.rs new file mode 100644 index 00000000..4921bd35 --- /dev/null +++ b/rust/automerge/src/storage/save.rs @@ -0,0 +1,2 @@ +mod document; +pub(crate) use document::save_document; diff --git a/rust/automerge/src/storage/save/document.rs b/rust/automerge/src/storage/save/document.rs new file mode 100644 index 00000000..f27d920d --- /dev/null +++ b/rust/automerge/src/storage/save/document.rs @@ -0,0 +1,146 @@ +use std::{borrow::Cow, collections::BTreeMap, iter::Iterator}; + +use crate::{ + indexed_cache::IndexedCache, + storage::{ + change::DEFLATE_MIN_SIZE, convert::op_as_docop, AsChangeMeta, CompressConfig, Document, + }, + types::{ActorId, ObjId, Op}, + Change, ChangeHash, +}; + +/// # Panics +/// +/// * If any of the `heads` are not in `changes` +/// * If any of ops in `ops` reference an actor which is not in `actors` +/// * If any of ops in `ops` reference a property which is not in `props` +/// * If any of the changes reference a dependency index which is not in `changes` +#[tracing::instrument(skip(changes, ops, actors, props, config))] +pub(crate) fn save_document<'a, I, O>( + changes: I, + ops: O, + actors: &'a IndexedCache, + props: &IndexedCache, + heads: &[ChangeHash], + config: Option, +) -> Vec +where + I: Iterator + Clone + 'a, + O: Iterator + Clone + ExactSizeIterator, +{ + let actor_lookup = actors.encode_index(); + let doc_ops = ops.map(|(obj, op)| op_as_docop(&actor_lookup, props, obj, op)); + + let hash_graph = HashGraph::new(changes.clone()); + let changes = changes.map(|c| ChangeWithGraph { + actors, + actor_lookup: &actor_lookup, + change: c, + graph: &hash_graph, + }); + + let doc = Document::new( + actors.sorted().cache, + hash_graph.heads_with_indices(heads.to_vec()), + doc_ops, + changes, + config.unwrap_or(CompressConfig::Threshold(DEFLATE_MIN_SIZE)), + ); + doc.into_bytes() +} + +struct HashGraph { + index_by_hash: BTreeMap, +} + +impl HashGraph { + fn new<'a, I>(changes: I) -> Self + where + I: Iterator, + { + let mut index_by_hash = BTreeMap::new(); + for (index, change) in changes.enumerate() { + index_by_hash.insert(change.hash(), index); + } + Self { index_by_hash } + } + + fn change_index(&self, hash: &ChangeHash) -> usize { + self.index_by_hash[hash] + } + + fn heads_with_indices(&self, heads: Vec) -> Vec<(ChangeHash, usize)> { + heads + .into_iter() + .map(|h| (h, self.index_by_hash[&h])) + .collect() + } +} + +struct ChangeWithGraph<'a> { + change: &'a Change, + graph: &'a HashGraph, + actor_lookup: &'a [usize], + actors: &'a IndexedCache, +} + +impl<'a> AsChangeMeta<'a> for ChangeWithGraph<'a> { + type DepsIter = ChangeDepsIter<'a>; + + fn actor(&self) -> u64 { + self.actor_lookup[self.actors.lookup(self.change.actor_id()).unwrap()] as u64 + } + + fn seq(&self) -> u64 { + self.change.seq() + } + + fn deps(&self) -> Self::DepsIter { + ChangeDepsIter { + change: self.change, + graph: self.graph, + offset: 0, + } + } + + fn extra(&self) -> Cow<'a, [u8]> { + self.change.extra_bytes().into() + } + + fn max_op(&self) -> u64 { + self.change.max_op() + } + + fn message(&self) -> Option> { + self.change.message().map(|m| Cow::Owned(m.into())) + } + + fn timestamp(&self) -> i64 { + self.change.timestamp() + } +} + +struct ChangeDepsIter<'a> { + change: &'a Change, + graph: &'a HashGraph, + offset: usize, +} + +impl<'a> ExactSizeIterator for ChangeDepsIter<'a> { + fn len(&self) -> usize { + self.change.deps().len() + } +} + +impl<'a> Iterator for ChangeDepsIter<'a> { + type Item = u64; + + fn next(&mut self) -> Option { + if let Some(dep) = self.change.deps().get(self.offset) { + self.offset += 1; + Some(self.graph.change_index(dep) as u64) + } else { + None + } + } +} diff --git a/rust/automerge/src/sync.rs b/rust/automerge/src/sync.rs new file mode 100644 index 00000000..d6dc2580 --- /dev/null +++ b/rust/automerge/src/sync.rs @@ -0,0 +1,963 @@ +//! # Sync Protocol +//! +//! The sync protocol is based on this paper: +//! , it assumes a reliable in-order stream +//! between two peers who are synchronizing a document. +//! +//! Each peer maintains a [`State`] for each peer they are synchronizing with. +//! This state tracks things like what the heads of the other peer are and +//! whether there are in-flight messages. Anything which implements [`SyncDoc`] +//! can take part in the sync protocol. The flow goes something like this: +//! +//! * The initiating peer creates an empty [`State`] and then calls +//! [`SyncDoc::generate_sync_message`] to generate new sync message and sends +//! it to the receiving peer. +//! * The receiving peer receives a message from the initiator, creates a new +//! [`State`], and calls [`SyncDoc::receive_sync_message`] on it's view of the +//! document +//! * The receiving peer then calls [`SyncDoc::generate_sync_message`] to generate +//! a new sync message and send it back to the initiator +//! * From this point on each peer operates in a loop, receiving a sync message +//! from the other peer and then generating a new message to send back. +//! +//! ## Example +//! +//! ``` +//! use automerge::{transaction::Transactable, sync::{self, SyncDoc}, ReadDoc}; +//! # fn main() -> Result<(), automerge::AutomergeError> { +//! // Create a document on peer1 +//! let mut peer1 = automerge::AutoCommit::new(); +//! peer1.put(automerge::ROOT, "key", "value")?; +//! +//! // Create a state to track our sync with peer2 +//! let mut peer1_state = sync::State::new(); +//! // Generate the initial message to send to peer2, unwrap for brevity +//! let message1to2 = peer1.sync().generate_sync_message(&mut peer1_state).unwrap(); +//! +//! // We receive the message on peer2. We don't have a document at all yet +//! // so we create one +//! let mut peer2 = automerge::AutoCommit::new(); +//! // We don't have a state for peer1 (it's a new connection), so we create one +//! let mut peer2_state = sync::State::new(); +//! // Now receive the message from peer 1 +//! peer2.sync().receive_sync_message(&mut peer2_state, message1to2)?; +//! +//! // Now we loop, sending messages from one to two and two to one until +//! // neither has anything new to send +//! +//! loop { +//! let two_to_one = peer2.sync().generate_sync_message(&mut peer2_state); +//! if let Some(message) = two_to_one.as_ref() { +//! println!("two to one"); +//! peer1.sync().receive_sync_message(&mut peer1_state, message.clone())?; +//! } +//! let one_to_two = peer1.sync().generate_sync_message(&mut peer1_state); +//! if let Some(message) = one_to_two.as_ref() { +//! println!("one to two"); +//! peer2.sync().receive_sync_message(&mut peer2_state, message.clone())?; +//! } +//! if two_to_one.is_none() && one_to_two.is_none() { +//! break; +//! } +//! } +//! +//! assert_eq!(peer2.get(automerge::ROOT, "key")?.unwrap().0.to_str(), Some("value")); +//! +//! # Ok(()) +//! # } +//! ``` + +use itertools::Itertools; +use serde::ser::SerializeMap; +use std::collections::{HashMap, HashSet}; + +use crate::{ + storage::{parse, Change as StoredChange, ReadChangeOpError}, + Automerge, AutomergeError, Change, ChangeHash, OpObserver, ReadDoc, +}; + +mod bloom; +mod state; + +pub use bloom::{BloomFilter, DecodeError as DecodeBloomError}; +pub use state::DecodeError as DecodeStateError; +pub use state::{Have, State}; + +/// A document which can take part in the sync protocol +/// +/// See the [module level documentation](crate::sync) for more details. +pub trait SyncDoc { + /// Generate a sync message for the remote peer represented by `sync_state` + /// + /// If this returns `None` then there are no new messages to send, either because we are + /// waiting for an acknolwedgement of an in-flight message, or because the remote is up to + /// date. + fn generate_sync_message(&self, sync_state: &mut State) -> Option; + + /// Apply a received sync message to this document and `sync_state` + fn receive_sync_message( + &mut self, + sync_state: &mut State, + message: Message, + ) -> Result<(), AutomergeError>; + + /// Apply a received sync message to this document and `sync_state`, observing any changes with + /// `op_observer` + fn receive_sync_message_with( + &mut self, + sync_state: &mut State, + message: Message, + op_observer: &mut Obs, + ) -> Result<(), AutomergeError>; +} + +const MESSAGE_TYPE_SYNC: u8 = 0x42; // first byte of a sync message, for identification + +impl SyncDoc for Automerge { + fn generate_sync_message(&self, sync_state: &mut State) -> Option { + let our_heads = self.get_heads(); + + let our_need = self.get_missing_deps(sync_state.their_heads.as_ref().unwrap_or(&vec![])); + + let their_heads_set = if let Some(ref heads) = sync_state.their_heads { + heads.iter().collect::>() + } else { + HashSet::new() + }; + let our_have = if our_need.iter().all(|hash| their_heads_set.contains(hash)) { + vec![self.make_bloom_filter(sync_state.shared_heads.clone())] + } else { + Vec::new() + }; + + if let Some(ref their_have) = sync_state.their_have { + if let Some(first_have) = their_have.first().as_ref() { + if !first_have + .last_sync + .iter() + .all(|hash| self.get_change_by_hash(hash).is_some()) + { + let reset_msg = Message { + heads: our_heads, + need: Vec::new(), + have: vec![Have::default()], + changes: Vec::new(), + }; + return Some(reset_msg); + } + } + } + + let changes_to_send = if let (Some(their_have), Some(their_need)) = ( + sync_state.their_have.as_ref(), + sync_state.their_need.as_ref(), + ) { + self.get_changes_to_send(their_have, their_need) + .expect("Should have only used hashes that are in the document") + } else { + Vec::new() + }; + + let heads_unchanged = sync_state.last_sent_heads == our_heads; + + let heads_equal = if let Some(their_heads) = sync_state.their_heads.as_ref() { + their_heads == &our_heads + } else { + false + }; + + // deduplicate the changes to send with those we have already sent and clone it now + let changes_to_send = changes_to_send + .into_iter() + .filter_map(|change| { + if !sync_state.sent_hashes.contains(&change.hash()) { + Some(change.clone()) + } else { + None + } + }) + .collect::>(); + + if heads_unchanged { + if heads_equal && changes_to_send.is_empty() { + return None; + } + if sync_state.in_flight { + return None; + } + } + + sync_state.last_sent_heads = our_heads.clone(); + sync_state + .sent_hashes + .extend(changes_to_send.iter().map(|c| c.hash())); + + let sync_message = Message { + heads: our_heads, + have: our_have, + need: our_need, + changes: changes_to_send, + }; + + sync_state.in_flight = true; + Some(sync_message) + } + + fn receive_sync_message( + &mut self, + sync_state: &mut State, + message: Message, + ) -> Result<(), AutomergeError> { + self.do_receive_sync_message::<()>(sync_state, message, None) + } + + fn receive_sync_message_with( + &mut self, + sync_state: &mut State, + message: Message, + op_observer: &mut Obs, + ) -> Result<(), AutomergeError> { + self.do_receive_sync_message(sync_state, message, Some(op_observer)) + } +} + +impl Automerge { + fn make_bloom_filter(&self, last_sync: Vec) -> Have { + let new_changes = self + .get_changes(&last_sync) + .expect("Should have only used hashes that are in the document"); + let hashes = new_changes.iter().map(|change| change.hash()); + Have { + last_sync, + bloom: BloomFilter::from_hashes(hashes), + } + } + + fn get_changes_to_send( + &self, + have: &[Have], + need: &[ChangeHash], + ) -> Result, AutomergeError> { + if have.is_empty() { + Ok(need + .iter() + .filter_map(|hash| self.get_change_by_hash(hash)) + .collect()) + } else { + let mut last_sync_hashes = HashSet::new(); + let mut bloom_filters = Vec::with_capacity(have.len()); + + for h in have { + let Have { last_sync, bloom } = h; + last_sync_hashes.extend(last_sync); + bloom_filters.push(bloom); + } + let last_sync_hashes = last_sync_hashes.into_iter().copied().collect::>(); + + let changes = self.get_changes(&last_sync_hashes)?; + + let mut change_hashes = HashSet::with_capacity(changes.len()); + let mut dependents: HashMap> = HashMap::new(); + let mut hashes_to_send = HashSet::new(); + + for change in &changes { + change_hashes.insert(change.hash()); + + for dep in change.deps() { + dependents.entry(*dep).or_default().push(change.hash()); + } + + if bloom_filters + .iter() + .all(|bloom| !bloom.contains_hash(&change.hash())) + { + hashes_to_send.insert(change.hash()); + } + } + + let mut stack = hashes_to_send.iter().copied().collect::>(); + while let Some(hash) = stack.pop() { + if let Some(deps) = dependents.get(&hash) { + for dep in deps { + if hashes_to_send.insert(*dep) { + stack.push(*dep); + } + } + } + } + + let mut changes_to_send = Vec::new(); + for hash in need { + if !hashes_to_send.contains(hash) { + if let Some(change) = self.get_change_by_hash(hash) { + changes_to_send.push(change); + } + } + } + + for change in changes { + if hashes_to_send.contains(&change.hash()) { + changes_to_send.push(change); + } + } + Ok(changes_to_send) + } + } + + fn do_receive_sync_message( + &mut self, + sync_state: &mut State, + message: Message, + op_observer: Option<&mut Obs>, + ) -> Result<(), AutomergeError> { + let before_heads = self.get_heads(); + + let Message { + heads: message_heads, + changes: message_changes, + need: message_need, + have: message_have, + } = message; + + let changes_is_empty = message_changes.is_empty(); + if !changes_is_empty { + self.apply_changes_with(message_changes, op_observer)?; + sync_state.shared_heads = advance_heads( + &before_heads.iter().collect(), + &self.get_heads().into_iter().collect(), + &sync_state.shared_heads, + ); + } + + // trim down the sent hashes to those that we know they haven't seen + self.filter_changes(&message_heads, &mut sync_state.sent_hashes)?; + + if changes_is_empty && message_heads == before_heads { + sync_state.last_sent_heads = message_heads.clone(); + } + + if sync_state.sent_hashes.is_empty() { + sync_state.in_flight = false; + } + + let known_heads = message_heads + .iter() + .filter(|head| self.get_change_by_hash(head).is_some()) + .collect::>(); + if known_heads.len() == message_heads.len() { + sync_state.shared_heads = message_heads.clone(); + sync_state.in_flight = false; + // If the remote peer has lost all its data, reset our state to perform a full resync + if message_heads.is_empty() { + sync_state.last_sent_heads = Default::default(); + sync_state.sent_hashes = Default::default(); + } + } else { + sync_state.shared_heads = sync_state + .shared_heads + .iter() + .chain(known_heads) + .copied() + .unique() + .sorted() + .collect::>(); + } + + sync_state.their_have = Some(message_have); + sync_state.their_heads = Some(message_heads); + sync_state.their_need = Some(message_need); + + Ok(()) + } +} + +#[derive(Debug, thiserror::Error)] +pub enum ReadMessageError { + #[error("expected {expected_one_of:?} but found {found}")] + WrongType { expected_one_of: Vec, found: u8 }, + #[error("{0}")] + Parse(String), + #[error(transparent)] + ReadChangeOps(#[from] ReadChangeOpError), + #[error("not enough input")] + NotEnoughInput, +} + +impl From for ReadMessageError { + fn from(e: parse::leb128::Error) -> Self { + ReadMessageError::Parse(e.to_string()) + } +} + +impl From for ReadMessageError { + fn from(e: bloom::ParseError) -> Self { + ReadMessageError::Parse(e.to_string()) + } +} + +impl From for ReadMessageError { + fn from(e: crate::storage::change::ParseError) -> Self { + ReadMessageError::Parse(format!("error parsing changes: {}", e)) + } +} + +impl From for parse::ParseError { + fn from(e: ReadMessageError) -> Self { + parse::ParseError::Error(e) + } +} + +impl From> for ReadMessageError { + fn from(p: parse::ParseError) -> Self { + match p { + parse::ParseError::Error(e) => e, + parse::ParseError::Incomplete(..) => Self::NotEnoughInput, + } + } +} + +/// The sync message to be sent. +#[derive(Clone, Debug, PartialEq)] +pub struct Message { + /// The heads of the sender. + pub heads: Vec, + /// The hashes of any changes that are being explicitly requested from the recipient. + pub need: Vec, + /// A summary of the changes that the sender already has. + pub have: Vec, + /// The changes for the recipient to apply. + pub changes: Vec, +} + +impl serde::Serialize for Message { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut map = serializer.serialize_map(Some(4))?; + map.serialize_entry("heads", &self.heads)?; + map.serialize_entry("need", &self.need)?; + map.serialize_entry("have", &self.have)?; + map.serialize_entry( + "changes", + &self + .changes + .iter() + .map(crate::ExpandedChange::from) + .collect::>(), + )?; + map.end() + } +} + +fn parse_have(input: parse::Input<'_>) -> parse::ParseResult<'_, Have, ReadMessageError> { + let (i, last_sync) = parse::length_prefixed(parse::change_hash)(input)?; + let (i, bloom_bytes) = parse::length_prefixed_bytes(i)?; + let (_, bloom) = BloomFilter::parse(parse::Input::new(bloom_bytes)).map_err(|e| e.lift())?; + Ok((i, Have { last_sync, bloom })) +} + +impl Message { + pub fn decode(input: &[u8]) -> Result { + let input = parse::Input::new(input); + match Self::parse(input) { + Ok((_, msg)) => Ok(msg), + Err(parse::ParseError::Error(e)) => Err(e), + Err(parse::ParseError::Incomplete(_)) => Err(ReadMessageError::NotEnoughInput), + } + } + + pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, ReadMessageError> { + let (i, message_type) = parse::take1(input)?; + if message_type != MESSAGE_TYPE_SYNC { + return Err(parse::ParseError::Error(ReadMessageError::WrongType { + expected_one_of: vec![MESSAGE_TYPE_SYNC], + found: message_type, + })); + } + + let (i, heads) = parse::length_prefixed(parse::change_hash)(i)?; + let (i, need) = parse::length_prefixed(parse::change_hash)(i)?; + let (i, have) = parse::length_prefixed(parse_have)(i)?; + + let change_parser = |i| { + let (i, bytes) = parse::length_prefixed_bytes(i)?; + let (_, change) = + StoredChange::parse(parse::Input::new(bytes)).map_err(|e| e.lift())?; + Ok((i, change)) + }; + let (i, stored_changes) = parse::length_prefixed(change_parser)(i)?; + let changes_len = stored_changes.len(); + let changes: Vec = stored_changes + .into_iter() + .try_fold::<_, _, Result<_, ReadMessageError>>( + Vec::with_capacity(changes_len), + |mut acc, stored| { + let change = Change::new_from_unverified(stored.into_owned(), None) + .map_err(ReadMessageError::ReadChangeOps)?; + acc.push(change); + Ok(acc) + }, + )?; + + Ok(( + i, + Message { + heads, + need, + have, + changes, + }, + )) + } + + pub fn encode(mut self) -> Vec { + let mut buf = vec![MESSAGE_TYPE_SYNC]; + + encode_hashes(&mut buf, &self.heads); + encode_hashes(&mut buf, &self.need); + encode_many(&mut buf, self.have.iter(), |buf, h| { + encode_hashes(buf, &h.last_sync); + leb128::write::unsigned(buf, h.bloom.to_bytes().len() as u64).unwrap(); + buf.extend(h.bloom.to_bytes()); + }); + + encode_many(&mut buf, self.changes.iter_mut(), |buf, change| { + leb128::write::unsigned(buf, change.raw_bytes().len() as u64).unwrap(); + buf.extend::<&[u8]>(change.raw_bytes().as_ref()) + }); + + buf + } +} + +fn encode_many<'a, I, It, F>(out: &mut Vec, data: I, f: F) +where + I: Iterator + ExactSizeIterator + 'a, + F: Fn(&mut Vec, It), +{ + leb128::write::unsigned(out, data.len() as u64).unwrap(); + for datum in data { + f(out, datum) + } +} + +fn encode_hashes(buf: &mut Vec, hashes: &[ChangeHash]) { + debug_assert!( + hashes.windows(2).all(|h| h[0] <= h[1]), + "hashes were not sorted" + ); + encode_many(buf, hashes.iter(), |buf, hash| buf.extend(hash.as_bytes())) +} + +fn advance_heads( + my_old_heads: &HashSet<&ChangeHash>, + my_new_heads: &HashSet, + our_old_shared_heads: &[ChangeHash], +) -> Vec { + let new_heads = my_new_heads + .iter() + .filter(|head| !my_old_heads.contains(head)) + .copied() + .collect::>(); + + let common_heads = our_old_shared_heads + .iter() + .filter(|head| my_new_heads.contains(head)) + .copied() + .collect::>(); + + let mut advanced_heads = HashSet::with_capacity(new_heads.len() + common_heads.len()); + for head in new_heads.into_iter().chain(common_heads) { + advanced_heads.insert(head); + } + let mut advanced_heads = advanced_heads.into_iter().collect::>(); + advanced_heads.sort(); + advanced_heads +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::change::gen::gen_change; + use crate::storage::parse::Input; + use crate::transaction::Transactable; + use crate::types::gen::gen_hash; + use crate::ActorId; + use proptest::prelude::*; + + prop_compose! { + fn gen_bloom()(hashes in gen_sorted_hashes(0..10)) -> BloomFilter { + BloomFilter::from_hashes(hashes.into_iter()) + } + } + + prop_compose! { + fn gen_have()(bloom in gen_bloom(), last_sync in gen_sorted_hashes(0..10)) -> Have { + Have { + bloom, + last_sync, + } + } + } + + fn gen_sorted_hashes(size: std::ops::Range) -> impl Strategy> { + proptest::collection::vec(gen_hash(), size).prop_map(|mut h| { + h.sort(); + h + }) + } + + prop_compose! { + fn gen_sync_message()( + heads in gen_sorted_hashes(0..10), + need in gen_sorted_hashes(0..10), + have in proptest::collection::vec(gen_have(), 0..10), + changes in proptest::collection::vec(gen_change(), 0..10), + ) -> Message { + Message { + heads, + need, + have, + changes, + } + } + + } + + #[test] + fn encode_decode_empty_message() { + let msg = Message { + heads: vec![], + need: vec![], + have: vec![], + changes: vec![], + }; + let encoded = msg.encode(); + Message::parse(Input::new(&encoded)).unwrap(); + } + + proptest! { + #[test] + fn encode_decode_message(msg in gen_sync_message()) { + let encoded = msg.clone().encode(); + let (i, decoded) = Message::parse(Input::new(&encoded)).unwrap(); + assert!(i.is_empty()); + assert_eq!(msg, decoded); + } + } + + #[test] + fn generate_sync_message_twice_does_nothing() { + let mut doc = crate::AutoCommit::new(); + doc.put(crate::ROOT, "key", "value").unwrap(); + let mut sync_state = State::new(); + + assert!(doc.sync().generate_sync_message(&mut sync_state).is_some()); + assert!(doc.sync().generate_sync_message(&mut sync_state).is_none()); + } + + #[test] + fn should_not_reply_if_we_have_no_data() { + let mut doc1 = crate::AutoCommit::new(); + let mut doc2 = crate::AutoCommit::new(); + let mut s1 = State::new(); + let mut s2 = State::new(); + let m1 = doc1 + .sync() + .generate_sync_message(&mut s1) + .expect("message was none"); + + doc2.sync().receive_sync_message(&mut s2, m1).unwrap(); + let m2 = doc2.sync().generate_sync_message(&mut s2); + assert!(m2.is_none()); + } + + #[test] + fn should_allow_simultaneous_messages_during_synchronisation() { + // create & synchronize two nodes + let mut doc1 = crate::AutoCommit::new().with_actor(ActorId::try_from("abc123").unwrap()); + let mut doc2 = crate::AutoCommit::new().with_actor(ActorId::try_from("def456").unwrap()); + let mut s1 = State::new(); + let mut s2 = State::new(); + + for i in 0..5 { + doc1.put(&crate::ROOT, "x", i).unwrap(); + doc1.commit(); + doc2.put(&crate::ROOT, "y", i).unwrap(); + doc2.commit(); + } + + let head1 = doc1.get_heads()[0]; + let head2 = doc2.get_heads()[0]; + + //// both sides report what they have but have no shared peer state + let msg1to2 = doc1 + .sync() + .generate_sync_message(&mut s1) + .expect("initial sync from 1 to 2 was None"); + let msg2to1 = doc2 + .sync() + .generate_sync_message(&mut s2) + .expect("initial sync message from 2 to 1 was None"); + assert_eq!(msg1to2.changes.len(), 0); + assert_eq!(msg1to2.have[0].last_sync.len(), 0); + assert_eq!(msg2to1.changes.len(), 0); + assert_eq!(msg2to1.have[0].last_sync.len(), 0); + + //// doc1 and doc2 receive that message and update sync state + doc1.sync().receive_sync_message(&mut s1, msg2to1).unwrap(); + doc2.sync().receive_sync_message(&mut s2, msg1to2).unwrap(); + + //// now both reply with their local changes the other lacks + //// (standard warning that 1% of the time this will result in a "need" message) + let msg1to2 = doc1 + .sync() + .generate_sync_message(&mut s1) + .expect("first reply from 1 to 2 was None"); + assert_eq!(msg1to2.changes.len(), 5); + + let msg2to1 = doc2 + .sync() + .generate_sync_message(&mut s2) + .expect("first reply from 2 to 1 was None"); + assert_eq!(msg2to1.changes.len(), 5); + + //// both should now apply the changes + doc1.sync().receive_sync_message(&mut s1, msg2to1).unwrap(); + assert_eq!(doc1.get_missing_deps(&[]), Vec::new()); + + doc2.sync().receive_sync_message(&mut s2, msg1to2).unwrap(); + assert_eq!(doc2.get_missing_deps(&[]), Vec::new()); + + //// The response acknowledges the changes received and sends no further changes + let msg1to2 = doc1 + .sync() + .generate_sync_message(&mut s1) + .expect("second reply from 1 to 2 was None"); + assert_eq!(msg1to2.changes.len(), 0); + let msg2to1 = doc2 + .sync() + .generate_sync_message(&mut s2) + .expect("second reply from 2 to 1 was None"); + assert_eq!(msg2to1.changes.len(), 0); + + //// After receiving acknowledgements, their shared heads should be equal + doc1.sync().receive_sync_message(&mut s1, msg2to1).unwrap(); + doc2.sync().receive_sync_message(&mut s2, msg1to2).unwrap(); + + assert_eq!(s1.shared_heads, s2.shared_heads); + + //// We're in sync, no more messages required + assert!(doc1.sync().generate_sync_message(&mut s1).is_none()); + assert!(doc2.sync().generate_sync_message(&mut s2).is_none()); + + //// If we make one more change and start another sync then its lastSync should be updated + doc1.put(crate::ROOT, "x", 5).unwrap(); + doc1.commit(); + let msg1to2 = doc1 + .sync() + .generate_sync_message(&mut s1) + .expect("third reply from 1 to 2 was None"); + let mut expected_heads = vec![head1, head2]; + expected_heads.sort(); + let mut actual_heads = msg1to2.have[0].last_sync.clone(); + actual_heads.sort(); + assert_eq!(actual_heads, expected_heads); + } + + #[test] + fn should_handle_false_positive_head() { + // Scenario: ,-- n1 + // c0 <-- c1 <-- c2 <-- c3 <-- c4 <-- c5 <-- c6 <-- c7 <-- c8 <-- c9 <-+ + // `-- n2 + // where n2 is a false positive in the Bloom filter containing {n1}. + // lastSync is c9. + + let mut doc1 = crate::AutoCommit::new().with_actor(ActorId::try_from("abc123").unwrap()); + let mut doc2 = crate::AutoCommit::new().with_actor(ActorId::try_from("def456").unwrap()); + let mut s1 = State::new(); + let mut s2 = State::new(); + + for i in 0..10 { + doc1.put(crate::ROOT, "x", i).unwrap(); + doc1.commit(); + } + + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + + // search for false positive; see comment above + let mut i = 0; + let (mut doc1, mut doc2) = loop { + let mut doc1copy = doc1 + .clone() + .with_actor(ActorId::try_from("01234567").unwrap()); + let val1 = format!("{} @ n1", i); + doc1copy.put(crate::ROOT, "x", val1).unwrap(); + doc1copy.commit(); + + let mut doc2copy = doc1 + .clone() + .with_actor(ActorId::try_from("89abcdef").unwrap()); + let val2 = format!("{} @ n2", i); + doc2copy.put(crate::ROOT, "x", val2).unwrap(); + doc2copy.commit(); + + let n1_bloom = BloomFilter::from_hashes(doc1copy.get_heads().into_iter()); + if n1_bloom.contains_hash(&doc2copy.get_heads()[0]) { + break (doc1copy, doc2copy); + } + i += 1; + }; + + let mut all_heads = doc1.get_heads(); + all_heads.extend(doc2.get_heads()); + all_heads.sort(); + + // reset sync states + let (_, mut s1) = State::parse(Input::new(s1.encode().as_slice())).unwrap(); + let (_, mut s2) = State::parse(Input::new(s2.encode().as_slice())).unwrap(); + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + assert_eq!(doc1.get_heads(), all_heads); + assert_eq!(doc2.get_heads(), all_heads); + } + + #[test] + fn should_handle_chains_of_false_positives() { + //// Scenario: ,-- c5 + //// c0 <-- c1 <-- c2 <-- c3 <-- c4 <-+ + //// `-- n2c1 <-- n2c2 <-- n2c3 + //// where n2c1 and n2c2 are both false positives in the Bloom filter containing {c5}. + //// lastSync is c4. + let mut doc1 = crate::AutoCommit::new().with_actor(ActorId::try_from("abc123").unwrap()); + let mut doc2 = crate::AutoCommit::new().with_actor(ActorId::try_from("def456").unwrap()); + let mut s1 = State::new(); + let mut s2 = State::new(); + + for i in 0..10 { + doc1.put(crate::ROOT, "x", i).unwrap(); + doc1.commit(); + } + + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + + doc1.put(crate::ROOT, "x", 5).unwrap(); + doc1.commit(); + let bloom = BloomFilter::from_hashes(doc1.get_heads().into_iter()); + + // search for false positive; see comment above + let mut i = 0; + let mut doc2 = loop { + let mut doc = doc2 + .fork() + .with_actor(ActorId::try_from("89abcdef").unwrap()); + doc.put(crate::ROOT, "x", format!("{} at 89abdef", i)) + .unwrap(); + doc.commit(); + if bloom.contains_hash(&doc.get_heads()[0]) { + break doc; + } + i += 1; + }; + + // find another false positive building on the first + i = 0; + let mut doc2 = loop { + let mut doc = doc2 + .fork() + .with_actor(ActorId::try_from("89abcdef").unwrap()); + doc.put(crate::ROOT, "x", format!("{} again", i)).unwrap(); + doc.commit(); + if bloom.contains_hash(&doc.get_heads()[0]) { + break doc; + } + i += 1; + }; + + doc2.put(crate::ROOT, "x", "final @ 89abcdef").unwrap(); + + let mut all_heads = doc1.get_heads(); + all_heads.extend(doc2.get_heads()); + all_heads.sort(); + + let (_, mut s1) = State::parse(Input::new(s1.encode().as_slice())).unwrap(); + let (_, mut s2) = State::parse(Input::new(s2.encode().as_slice())).unwrap(); + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + assert_eq!(doc1.get_heads(), all_heads); + assert_eq!(doc2.get_heads(), all_heads); + } + + #[test] + fn should_handle_lots_of_branching_and_merging() { + let mut doc1 = crate::AutoCommit::new().with_actor(ActorId::try_from("01234567").unwrap()); + let mut doc2 = crate::AutoCommit::new().with_actor(ActorId::try_from("89abcdef").unwrap()); + let mut doc3 = crate::AutoCommit::new().with_actor(ActorId::try_from("fedcba98").unwrap()); + let mut s1 = State::new(); + let mut s2 = State::new(); + + doc1.put(crate::ROOT, "x", 0).unwrap(); + let change1 = doc1.get_last_local_change().unwrap().clone(); + + doc2.apply_changes([change1.clone()]).unwrap(); + doc3.apply_changes([change1]).unwrap(); + + doc3.put(crate::ROOT, "x", 1).unwrap(); + + //// - n1c1 <------ n1c2 <------ n1c3 <-- etc. <-- n1c20 <------ n1c21 + //// / \/ \/ \/ + //// / /\ /\ /\ + //// c0 <---- n2c1 <------ n2c2 <------ n2c3 <-- etc. <-- n2c20 <------ n2c21 + //// \ / + //// ---------------------------------------------- n3c1 <----- + for i in 1..20 { + doc1.put(crate::ROOT, "n1", i).unwrap(); + doc2.put(crate::ROOT, "n2", i).unwrap(); + let change1 = doc1.get_last_local_change().unwrap().clone(); + let change2 = doc2.get_last_local_change().unwrap().clone(); + doc1.apply_changes([change2.clone()]).unwrap(); + doc2.apply_changes([change1]).unwrap(); + } + + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + + //// Having n3's last change concurrent to the last sync heads forces us into the slower code path + let change3 = doc3.get_last_local_change().unwrap().clone(); + doc2.apply_changes([change3]).unwrap(); + + doc1.put(crate::ROOT, "n1", "final").unwrap(); + doc2.put(crate::ROOT, "n1", "final").unwrap(); + + sync(&mut doc1, &mut doc2, &mut s1, &mut s2); + + assert_eq!(doc1.get_heads(), doc2.get_heads()); + } + + fn sync( + a: &mut crate::AutoCommit, + b: &mut crate::AutoCommit, + a_sync_state: &mut State, + b_sync_state: &mut State, + ) { + //function sync(a: Automerge, b: Automerge, aSyncState = initSyncState(), bSyncState = initSyncState()) { + const MAX_ITER: usize = 10; + let mut iterations = 0; + + loop { + let a_to_b = a.sync().generate_sync_message(a_sync_state); + let b_to_a = b.sync().generate_sync_message(b_sync_state); + if a_to_b.is_none() && b_to_a.is_none() { + break; + } + if iterations > MAX_ITER { + panic!("failed to sync in {} iterations", MAX_ITER); + } + if let Some(msg) = a_to_b { + b.sync().receive_sync_message(b_sync_state, msg).unwrap() + } + if let Some(msg) = b_to_a { + a.sync().receive_sync_message(a_sync_state, msg).unwrap() + } + iterations += 1; + } + } +} diff --git a/automerge-backend/src/sync/bloom.rs b/rust/automerge/src/sync/bloom.rs similarity index 55% rename from automerge-backend/src/sync/bloom.rs rename to rust/automerge/src/sync/bloom.rs index eda1bdaa..8523061e 100644 --- a/automerge-backend/src/sync/bloom.rs +++ b/rust/automerge/src/sync/bloom.rs @@ -1,8 +1,7 @@ -use std::{borrow::Cow, convert::TryFrom}; +use std::borrow::Borrow; -use automerge_protocol::ChangeHash; - -use crate::{decoding, decoding::Decoder, encoding, encoding::Encodable}; +use crate::storage::parse; +use crate::ChangeHash; // These constants correspond to a 1% false positive rate. The values can be changed without // breaking compatibility of the network protocol, since the parameters used for a particular @@ -10,7 +9,7 @@ use crate::{decoding, decoding::Decoder, encoding, encoding::Encodable}; const BITS_PER_ENTRY: u32 = 10; const NUM_PROBES: u32 = 7; -#[derive(Default, Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)] pub struct BloomFilter { num_entries: u32, num_bits_per_entry: u32, @@ -18,17 +17,52 @@ pub struct BloomFilter { bits: Vec, } +impl Default for BloomFilter { + fn default() -> Self { + BloomFilter { + num_entries: 0, + num_bits_per_entry: BITS_PER_ENTRY, + num_probes: NUM_PROBES, + bits: Vec::new(), + } + } +} + +#[derive(Debug, thiserror::Error)] +pub(crate) enum ParseError { + #[error(transparent)] + Leb128(#[from] parse::leb128::Error), +} + impl BloomFilter { - pub fn into_bytes(self) -> Result, encoding::Error> { - if self.num_entries == 0 { - Ok(Vec::new()) + pub fn to_bytes(&self) -> Vec { + let mut buf = Vec::new(); + if self.num_entries != 0 { + leb128::write::unsigned(&mut buf, self.num_entries as u64).unwrap(); + leb128::write::unsigned(&mut buf, self.num_bits_per_entry as u64).unwrap(); + leb128::write::unsigned(&mut buf, self.num_probes as u64).unwrap(); + buf.extend(&self.bits); + } + buf + } + + pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, ParseError> { + if input.is_empty() { + Ok((input, Self::default())) } else { - let mut buf = Vec::new(); - self.num_entries.encode(&mut buf)?; - self.num_bits_per_entry.encode(&mut buf)?; - self.num_probes.encode(&mut buf)?; - buf.extend(self.bits); - Ok(buf) + let (i, num_entries) = parse::leb128_u32(input)?; + let (i, num_bits_per_entry) = parse::leb128_u32(i)?; + let (i, num_probes) = parse::leb128_u32(i)?; + let (i, bits) = parse::take_n(bits_capacity(num_entries, num_bits_per_entry), i)?; + Ok(( + i, + Self { + num_entries, + num_bits_per_entry, + num_probes, + bits: bits.to_vec(), + }, + )) } } @@ -45,7 +79,8 @@ impl BloomFilter { let z = u32::from_le_bytes([hash_bytes[8], hash_bytes[9], hash_bytes[10], hash_bytes[11]]) % modulo; - let mut probes = vec![x]; + let mut probes = Vec::with_capacity(self.num_probes as usize); + probes.push(x); for _ in 1..self.num_probes { x = (x + y) % modulo; y = (y + z) % modulo; @@ -56,13 +91,13 @@ impl BloomFilter { fn add_hash(&mut self, hash: &ChangeHash) { for probe in self.get_probes(hash) { - self.set_bit(probe as usize) + self.set_bit(probe as usize); } } fn set_bit(&mut self, probe: usize) { if let Some(byte) = self.bits.get_mut(probe >> 3) { - *byte |= 1 << (probe & 7) + *byte |= 1 << (probe & 7); } } @@ -86,19 +121,12 @@ impl BloomFilter { true } } -} -fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize { - let f = ((f64::from(num_entries) * f64::from(num_bits_per_entry)) / 8_f64).ceil(); - f as usize -} - -impl From<&[ChangeHash]> for BloomFilter { - fn from(hashes: &[ChangeHash]) -> Self { + pub fn from_hashes>(hashes: impl ExactSizeIterator) -> Self { let num_entries = hashes.len() as u32; let num_bits_per_entry = BITS_PER_ENTRY; let num_probes = NUM_PROBES; - let bits = vec![0; bits_capacity(num_entries, num_bits_per_entry) as usize]; + let bits = vec![0; bits_capacity(num_entries, num_bits_per_entry)]; let mut filter = Self { num_entries, num_bits_per_entry, @@ -106,31 +134,27 @@ impl From<&[ChangeHash]> for BloomFilter { bits, }; for hash in hashes { - filter.add_hash(hash) + filter.add_hash(hash.borrow()); } filter } } +fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize { + let f = ((f64::from(num_entries) * f64::from(num_bits_per_entry)) / 8_f64).ceil(); + f as usize +} + +#[derive(thiserror::Error, Debug)] +#[error("{0}")] +pub struct DecodeError(String); + impl TryFrom<&[u8]> for BloomFilter { - type Error = decoding::Error; + type Error = DecodeError; fn try_from(bytes: &[u8]) -> Result { - if bytes.is_empty() { - Ok(Self::default()) - } else { - let mut decoder = Decoder::new(Cow::Borrowed(bytes)); - let num_entries = decoder.read()?; - let num_bits_per_entry = decoder.read()?; - let num_probes = decoder.read()?; - let bits = - decoder.read_bytes(bits_capacity(num_entries, num_bits_per_entry) as usize)?; - Ok(Self { - num_entries, - num_bits_per_entry, - num_probes, - bits: bits.to_vec(), - }) - } + Self::parse(parse::Input::new(bytes)) + .map(|(_, b)| b) + .map_err(|e| DecodeError(e.to_string())) } } diff --git a/rust/automerge/src/sync/state.rs b/rust/automerge/src/sync/state.rs new file mode 100644 index 00000000..354c605f --- /dev/null +++ b/rust/automerge/src/sync/state.rs @@ -0,0 +1,110 @@ +use std::collections::BTreeSet; + +use super::{encode_hashes, BloomFilter}; +use crate::storage::parse; +use crate::ChangeHash; + +const SYNC_STATE_TYPE: u8 = 0x43; // first byte of an encoded sync state, for identification + +#[derive(Debug, thiserror::Error)] +pub enum DecodeError { + #[error("{0:?}")] + Parse(String), + #[error("wrong type: expected one of {expected_one_of:?} but found {found}")] + WrongType { expected_one_of: Vec, found: u8 }, + #[error("not enough input")] + NotEnoughInput, +} + +impl From for DecodeError { + fn from(_: parse::leb128::Error) -> Self { + Self::Parse("bad leb128 encoding".to_string()) + } +} + +/// The state of synchronisation with a peer. +/// +/// This should be persisted using [`Self::encode`] when you know you will be interacting with the +/// same peer in multiple sessions. [`Self::encode`] only encodes state which should be reused +/// across connections. +#[derive(Debug, Clone, Default, PartialEq, Eq, Hash)] +pub struct State { + /// The hashes which we know both peers have + pub shared_heads: Vec, + /// The heads we last sent + pub last_sent_heads: Vec, + /// The heads we last received from them + pub their_heads: Option>, + /// Any specific changes they last said they needed + pub their_need: Option>, + /// The bloom filters summarising what they said they have + pub their_have: Option>, + /// The hashes we have sent in this session + pub sent_hashes: BTreeSet, + + /// `generate_sync_message` should return `None` if there are no new changes to send. In + /// particular, if there are changes in flight which the other end has not yet acknowledged we + /// do not wish to generate duplicate sync messages. This field tracks whether the changes we + /// expect to send to the peer based on this sync state have been sent or not. If + /// `in_flight` is `false` then `generate_sync_message` will return a new message (provided + /// there are in fact changes to send). If it is `true` then we don't. This flag is cleared + /// in `receive_sync_message`. + pub in_flight: bool, +} + +/// A summary of the changes that the sender of the message already has. +/// This is implicitly a request to the recipient to send all changes that the +/// sender does not already have. +#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, serde::Serialize)] +pub struct Have { + /// The heads at the time of the last successful sync with this recipient. + pub last_sync: Vec, + /// A bloom filter summarising all of the changes that the sender of the message has added + /// since the last sync. + pub bloom: BloomFilter, +} + +impl State { + pub fn new() -> Self { + Default::default() + } + + pub fn encode(&self) -> Vec { + let mut buf = vec![SYNC_STATE_TYPE]; + encode_hashes(&mut buf, &self.shared_heads); + buf + } + + pub fn decode(input: &[u8]) -> Result { + let input = parse::Input::new(input); + match Self::parse(input) { + Ok((_, state)) => Ok(state), + Err(parse::ParseError::Incomplete(_)) => Err(DecodeError::NotEnoughInput), + Err(parse::ParseError::Error(e)) => Err(e), + } + } + + pub(crate) fn parse(input: parse::Input<'_>) -> parse::ParseResult<'_, Self, DecodeError> { + let (i, record_type) = parse::take1(input)?; + if record_type != SYNC_STATE_TYPE { + return Err(parse::ParseError::Error(DecodeError::WrongType { + expected_one_of: vec![SYNC_STATE_TYPE], + found: record_type, + })); + } + + let (i, shared_heads) = parse::length_prefixed(parse::change_hash)(i)?; + Ok(( + i, + Self { + shared_heads, + last_sent_heads: Vec::new(), + their_heads: None, + their_need: None, + their_have: Some(Vec::new()), + sent_hashes: BTreeSet::new(), + in_flight: false, + }, + )) + } +} diff --git a/rust/automerge/src/transaction.rs b/rust/automerge/src/transaction.rs new file mode 100644 index 00000000..b513bc63 --- /dev/null +++ b/rust/automerge/src/transaction.rs @@ -0,0 +1,16 @@ +mod commit; +mod inner; +mod manual_transaction; +pub(crate) mod observation; +mod result; +mod transactable; + +pub use self::commit::CommitOptions; +pub use self::transactable::Transactable; +pub(crate) use inner::{TransactionArgs, TransactionInner}; +pub use manual_transaction::Transaction; +pub use observation::{Observation, Observed, UnObserved}; +pub use result::Failure; +pub use result::Success; + +pub type Result = std::result::Result, Failure>; diff --git a/rust/automerge/src/transaction/commit.rs b/rust/automerge/src/transaction/commit.rs new file mode 100644 index 00000000..d2873af3 --- /dev/null +++ b/rust/automerge/src/transaction/commit.rs @@ -0,0 +1,32 @@ +/// Optional metadata for a commit. +#[derive(Debug, Default)] +pub struct CommitOptions { + pub message: Option, + pub time: Option, +} + +impl CommitOptions { + /// Add a message to the commit. + pub fn with_message>(mut self, message: S) -> Self { + self.message = Some(message.into()); + self + } + + /// Add a message to the commit. + pub fn set_message>(&mut self, message: S) -> &mut Self { + self.message = Some(message.into()); + self + } + + /// Add a timestamp to the commit. + pub fn with_time(mut self, time: i64) -> Self { + self.time = Some(time); + self + } + + /// Add a timestamp to the commit. + pub fn set_time(&mut self, time: i64) -> &mut Self { + self.time = Some(time); + self + } +} diff --git a/rust/automerge/src/transaction/inner.rs b/rust/automerge/src/transaction/inner.rs new file mode 100644 index 00000000..0fe735d5 --- /dev/null +++ b/rust/automerge/src/transaction/inner.rs @@ -0,0 +1,731 @@ +use std::num::NonZeroU64; + +use crate::exid::ExId; +use crate::query::{self, OpIdSearch}; +use crate::storage::Change as StoredChange; +use crate::types::{Key, ListEncoding, ObjId, OpId, OpIds, TextEncoding}; +use crate::{op_tree::OpSetMetadata, types::Op, Automerge, Change, ChangeHash, OpObserver, Prop}; +use crate::{AutomergeError, ObjType, OpType, ScalarValue}; + +#[derive(Debug, Clone)] +pub(crate) struct TransactionInner { + actor: usize, + seq: u64, + start_op: NonZeroU64, + time: i64, + message: Option, + deps: Vec, + operations: Vec<(ObjId, Op)>, +} + +/// Arguments required to create a new transaction +pub(crate) struct TransactionArgs { + /// The index of the actor ID this transaction will create ops for in the + /// [`OpSetMetadata::actors`] + pub(crate) actor_index: usize, + /// The sequence number of the change this transaction will create + pub(crate) seq: u64, + /// The start op of the change this transaction will create + pub(crate) start_op: NonZeroU64, + /// The dependencies of the change this transaction will create + pub(crate) deps: Vec, +} + +impl TransactionInner { + pub(crate) fn new( + TransactionArgs { + actor_index: actor, + seq, + start_op, + deps, + }: TransactionArgs, + ) -> Self { + TransactionInner { + actor, + seq, + start_op, + time: 0, + message: None, + operations: vec![], + deps, + } + } + + /// Create an empty change + pub(crate) fn empty( + doc: &mut Automerge, + args: TransactionArgs, + message: Option, + time: Option, + ) -> ChangeHash { + Self::new(args).commit_impl(doc, message, time) + } + + pub(crate) fn pending_ops(&self) -> usize { + self.operations.len() + } + + /// Commit the operations performed in this transaction, returning the hashes corresponding to + /// the new heads. + /// + /// Returns `None` if there were no operations to commit + #[tracing::instrument(skip(self, doc))] + pub(crate) fn commit( + self, + doc: &mut Automerge, + message: Option, + time: Option, + ) -> Option { + if self.pending_ops() == 0 { + return None; + } + Some(self.commit_impl(doc, message, time)) + } + + pub(crate) fn commit_impl( + mut self, + doc: &mut Automerge, + message: Option, + time: Option, + ) -> ChangeHash { + if message.is_some() { + self.message = message; + } + + if let Some(t) = time { + self.time = t; + } + + let num_ops = self.pending_ops(); + let change = self.export(&doc.ops().m); + let hash = change.hash(); + #[cfg(not(debug_assertions))] + tracing::trace!(commit=?hash, deps=?change.deps(), "committing transaction"); + #[cfg(debug_assertions)] + { + let ops = change.iter_ops().collect::>(); + tracing::trace!(commit=?hash, ?ops, deps=?change.deps(), "committing transaction"); + } + doc.update_history(change, num_ops); + debug_assert_eq!(doc.get_heads(), vec![hash]); + hash + } + + #[tracing::instrument(skip(self, metadata))] + pub(crate) fn export(self, metadata: &OpSetMetadata) -> Change { + use crate::storage::{change::PredOutOfOrder, convert::op_as_actor_id}; + + let actor = metadata.actors.get(self.actor).clone(); + let deps = self.deps.clone(); + let stored = match StoredChange::builder() + .with_actor(actor) + .with_seq(self.seq) + .with_start_op(self.start_op) + .with_message(self.message.clone()) + .with_dependencies(deps) + .with_timestamp(self.time) + .build( + self.operations + .iter() + .map(|(obj, op)| op_as_actor_id(obj, op, metadata)), + ) { + Ok(s) => s, + Err(PredOutOfOrder) => { + // SAFETY: types::Op::preds is `types::OpIds` which ensures ops are always sorted + panic!("preds out of order"); + } + }; + #[cfg(debug_assertions)] + { + let realized_ops = self.operations.iter().collect::>(); + tracing::trace!(?stored, ops=?realized_ops, "committing change"); + } + #[cfg(not(debug_assertions))] + tracing::trace!(?stored, "committing change"); + Change::new(stored) + } + + /// Undo the operations added in this transaction, returning the number of cancelled + /// operations. + pub(crate) fn rollback(self, doc: &mut Automerge) -> usize { + let num = self.pending_ops(); + // remove in reverse order so sets are removed before makes etc... + for (obj, op) in self.operations.into_iter().rev() { + for pred_id in &op.pred { + if let Some(p) = doc.ops().search(&obj, OpIdSearch::new(*pred_id)).index() { + doc.ops_mut().change_vis(&obj, p, |o| o.remove_succ(&op)); + } + } + if let Some(pos) = doc.ops().search(&obj, OpIdSearch::new(op.id)).index() { + doc.ops_mut().remove(&obj, pos); + } + } + + doc.rollback_last_actor(); + + num + } + + /// Set the value of property `P` to value `V` in object `obj`. + /// + /// # Returns + /// + /// The opid of the operation which was created, or None if this operation doesn't change the + /// document + /// + /// # Errors + /// + /// This will return an error if + /// - The object does not exist + /// - The key is the wrong type for the object + /// - The key does not exist in the object + pub(crate) fn put, V: Into, Obs: OpObserver>( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + prop: P, + value: V, + ) -> Result<(), AutomergeError> { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + let value = value.into(); + let prop = prop.into(); + match (&prop, obj_type) { + (Prop::Map(_), ObjType::Map) => Ok(()), + (Prop::Seq(_), ObjType::List) => Ok(()), + (Prop::Seq(_), ObjType::Text) => Ok(()), + _ => Err(AutomergeError::InvalidOp(obj_type)), + }?; + self.local_op(doc, op_observer, obj, prop, value.into())?; + Ok(()) + } + + /// Set the value of property `P` to value `V` in object `obj`. + /// + /// # Returns + /// + /// The opid of the operation which was created, or None if this operation doesn't change the + /// document + /// + /// # Errors + /// + /// This will return an error if + /// - The object does not exist + /// - The key is the wrong type for the object + /// - The key does not exist in the object + pub(crate) fn put_object, Obs: OpObserver>( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + prop: P, + value: ObjType, + ) -> Result { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + let prop = prop.into(); + match (&prop, obj_type) { + (Prop::Map(_), ObjType::Map) => Ok(()), + (Prop::Seq(_), ObjType::List) => Ok(()), + _ => Err(AutomergeError::InvalidOp(obj_type)), + }?; + let id = self + .local_op(doc, op_observer, obj, prop, value.into())? + .unwrap(); + let id = doc.id_to_exid(id); + Ok(id) + } + + fn next_id(&mut self) -> OpId { + OpId::new(self.start_op.get() + self.pending_ops() as u64, self.actor) + } + + fn next_insert(&mut self, key: Key, value: ScalarValue) -> Op { + Op { + id: self.next_id(), + action: OpType::Put(value), + key, + succ: Default::default(), + pred: Default::default(), + insert: true, + } + } + + fn next_delete(&mut self, key: Key, pred: OpIds) -> Op { + Op { + id: self.next_id(), + action: OpType::Delete, + key, + succ: Default::default(), + pred, + insert: false, + } + } + + #[allow(clippy::too_many_arguments)] + fn insert_local_op( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + prop: Prop, + op: Op, + pos: usize, + obj: ObjId, + succ_pos: &[usize], + ) { + doc.ops_mut().add_succ(&obj, succ_pos, &op); + + if !op.is_delete() { + doc.ops_mut().insert(pos, &obj, op.clone()); + } + + self.finalize_op(doc, op_observer, obj, prop, op); + } + + pub(crate) fn insert, Obs: OpObserver>( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + index: usize, + value: V, + ) -> Result<(), AutomergeError> { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + if !matches!(obj_type, ObjType::List | ObjType::Text) { + return Err(AutomergeError::InvalidOp(obj_type)); + } + let value = value.into(); + tracing::trace!(obj=?obj, value=?value, "inserting value"); + self.do_insert(doc, op_observer, obj, index, value.into())?; + Ok(()) + } + + pub(crate) fn insert_object( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + index: usize, + value: ObjType, + ) -> Result { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + if !matches!(obj_type, ObjType::List | ObjType::Text) { + return Err(AutomergeError::InvalidOp(obj_type)); + } + let id = self.do_insert(doc, op_observer, obj, index, value.into())?; + let id = doc.id_to_exid(id); + Ok(id) + } + + fn do_insert( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: ObjId, + index: usize, + action: OpType, + ) -> Result { + let id = self.next_id(); + + let query = doc + .ops() + .search(&obj, query::InsertNth::new(index, ListEncoding::List)); + + let key = query.key()?; + + let op = Op { + id, + action, + key, + succ: Default::default(), + pred: Default::default(), + insert: true, + }; + + doc.ops_mut().insert(query.pos(), &obj, op.clone()); + + self.finalize_op(doc, op_observer, obj, Prop::Seq(index), op); + + Ok(id) + } + + pub(crate) fn local_op( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: ObjId, + prop: Prop, + action: OpType, + ) -> Result, AutomergeError> { + match prop { + Prop::Map(s) => self.local_map_op(doc, op_observer, obj, s, action), + Prop::Seq(n) => self.local_list_op(doc, op_observer, obj, n, action), + } + } + + fn local_map_op( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: ObjId, + prop: String, + action: OpType, + ) -> Result, AutomergeError> { + if prop.is_empty() { + return Err(AutomergeError::EmptyStringKey); + } + + let id = self.next_id(); + let prop_index = doc.ops_mut().m.props.cache(prop.clone()); + let query = doc.ops().search(&obj, query::Prop::new(prop_index)); + + // no key present to delete + if query.ops.is_empty() && action == OpType::Delete { + return Ok(None); + } + + if query.ops.len() == 1 && query.ops[0].is_noop(&action) { + return Ok(None); + } + + // increment operations are only valid against counter values. + // if there are multiple values (from conflicts) then we just need one of them to be a counter. + if matches!(action, OpType::Increment(_)) && query.ops.iter().all(|op| !op.is_counter()) { + return Err(AutomergeError::MissingCounter); + } + + let pred = doc.ops().m.sorted_opids(query.ops.iter().map(|o| o.id)); + + let op = Op { + id, + action, + key: Key::Map(prop_index), + succ: Default::default(), + pred, + insert: false, + }; + + let pos = query.pos; + let ops_pos = query.ops_pos; + self.insert_local_op(doc, op_observer, Prop::Map(prop), op, pos, obj, &ops_pos); + + Ok(Some(id)) + } + + fn local_list_op( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: ObjId, + index: usize, + action: OpType, + ) -> Result, AutomergeError> { + let query = doc + .ops() + .search(&obj, query::Nth::new(index, ListEncoding::List)); + + let id = self.next_id(); + let pred = doc.ops().m.sorted_opids(query.ops.iter().map(|o| o.id)); + let key = query.key()?; + + if query.ops.len() == 1 && query.ops[0].is_noop(&action) { + return Ok(None); + } + + // increment operations are only valid against counter values. + // if there are multiple values (from conflicts) then we just need one of them to be a counter. + if matches!(action, OpType::Increment(_)) && query.ops.iter().all(|op| !op.is_counter()) { + return Err(AutomergeError::MissingCounter); + } + + let op = Op { + id, + action, + key, + succ: Default::default(), + pred, + insert: false, + }; + + let pos = query.pos; + let ops_pos = query.ops_pos; + self.insert_local_op(doc, op_observer, Prop::Seq(index), op, pos, obj, &ops_pos); + + Ok(Some(id)) + } + + pub(crate) fn increment, Obs: OpObserver>( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: &ExId, + prop: P, + value: i64, + ) -> Result<(), AutomergeError> { + let obj = doc.exid_to_obj(obj)?.0; + self.local_op(doc, op_observer, obj, prop.into(), OpType::Increment(value))?; + Ok(()) + } + + pub(crate) fn delete, Obs: OpObserver>( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + prop: P, + ) -> Result<(), AutomergeError> { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + let prop = prop.into(); + if obj_type == ObjType::Text { + let index = prop.to_index().ok_or(AutomergeError::InvalidOp(obj_type))?; + self.inner_splice( + doc, + op_observer, + SpliceArgs { + obj, + index, + del: 1, + values: vec![], + splice_type: SpliceType::Text("", doc.text_encoding()), + }, + )?; + } else { + self.local_op(doc, op_observer, obj, prop, OpType::Delete)?; + } + Ok(()) + } + + /// Splice new elements into the given sequence. Returns a vector of the OpIds used to insert + /// the new elements + pub(crate) fn splice( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + index: usize, + del: usize, + vals: impl IntoIterator, + ) -> Result<(), AutomergeError> { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + if !matches!(obj_type, ObjType::List | ObjType::Text) { + return Err(AutomergeError::InvalidOp(obj_type)); + } + let values = vals.into_iter().collect(); + self.inner_splice( + doc, + op_observer, + SpliceArgs { + obj, + index, + del, + values, + splice_type: SpliceType::List, + }, + ) + } + + /// Splice string into a text object + pub(crate) fn splice_text( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + ex_obj: &ExId, + index: usize, + del: usize, + text: &str, + ) -> Result<(), AutomergeError> { + let (obj, obj_type) = doc.exid_to_obj(ex_obj)?; + if obj_type != ObjType::Text { + return Err(AutomergeError::InvalidOp(obj_type)); + } + let values = text.chars().map(ScalarValue::from).collect(); + self.inner_splice( + doc, + op_observer, + SpliceArgs { + obj, + index, + del, + values, + splice_type: SpliceType::Text(text, doc.text_encoding()), + }, + ) + } + + fn inner_splice( + &mut self, + doc: &mut Automerge, + mut op_observer: Option<&mut Obs>, + SpliceArgs { + obj, + mut index, + mut del, + values, + splice_type, + }: SpliceArgs<'_>, + ) -> Result<(), AutomergeError> { + let ex_obj = doc.ops().id_to_exid(obj.0); + let encoding = splice_type.encoding(); + // delete `del` items - performing the query for each one + let mut deleted = 0; + while deleted < del { + // TODO: could do this with a single custom query + let query = doc.ops().search(&obj, query::Nth::new(index, encoding)); + + // if we delete in the middle of a multi-character + // move cursor back to the beginning and expand the del width + let adjusted_index = query.index(); + if adjusted_index < index { + del += index - adjusted_index; + index = adjusted_index; + } + + let step = if let Some(op) = query.ops.last() { + op.width(encoding) + } else { + break; + }; + + let op = self.next_delete(query.key()?, query.pred(doc.ops())); + + let ops_pos = query.ops_pos; + doc.ops_mut().add_succ(&obj, &ops_pos, &op); + + self.operations.push((obj, op)); + + deleted += step; + } + + if deleted > 0 { + if let Some(obs) = op_observer.as_mut() { + obs.delete_seq(doc, ex_obj.clone(), index, deleted); + } + } + + // do the insert query for the first item and then + // insert the remaining ops one after the other + if !values.is_empty() { + let query = doc + .ops() + .search(&obj, query::InsertNth::new(index, encoding)); + let mut pos = query.pos(); + let mut key = query.key()?; + let mut cursor = index; + let mut width = 0; + + for v in &values { + let op = self.next_insert(key, v.clone()); + + doc.ops_mut().insert(pos, &obj, op.clone()); + + width = op.width(encoding); + cursor += width; + pos += 1; + key = op.id.into(); + + self.operations.push((obj, op)); + } + + doc.ops_mut().hint(&obj, cursor - width, pos - 1); + + // handle the observer + if let Some(obs) = op_observer.as_mut() { + match splice_type { + SpliceType::Text(text, _) if !obs.text_as_seq() => { + obs.splice_text(doc, ex_obj, index, text) + } + SpliceType::List | SpliceType::Text(..) => { + let start = self.operations.len() - values.len(); + for (offset, v) in values.iter().enumerate() { + let op = &self.operations[start + offset].1; + let value = (v.clone().into(), doc.ops().id_to_exid(op.id)); + obs.insert(doc, ex_obj.clone(), index + offset, value) + } + } + } + } + } + + Ok(()) + } + + fn finalize_op( + &mut self, + doc: &mut Automerge, + op_observer: Option<&mut Obs>, + obj: ObjId, + prop: Prop, + op: Op, + ) { + // TODO - id_to_exid should be a noop if not used - change type to Into? + if let Some(op_observer) = op_observer { + let ex_obj = doc.ops().id_to_exid(obj.0); + if op.insert { + let obj_type = doc.ops().object_type(&obj); + assert!(obj_type.unwrap().is_sequence()); + match (obj_type, prop) { + (Some(ObjType::List), Prop::Seq(index)) => { + let value = (op.value(), doc.ops().id_to_exid(op.id)); + op_observer.insert(doc, ex_obj, index, value) + } + (Some(ObjType::Text), Prop::Seq(index)) => { + // FIXME + if op_observer.text_as_seq() { + let value = (op.value(), doc.ops().id_to_exid(op.id)); + op_observer.insert(doc, ex_obj, index, value) + } else { + op_observer.splice_text(doc, ex_obj, index, op.to_str()) + } + } + _ => {} + } + } else if op.is_delete() { + op_observer.delete(doc, ex_obj, prop); + } else if let Some(value) = op.get_increment_value() { + op_observer.increment(doc, ex_obj, prop, (value, doc.ops().id_to_exid(op.id))); + } else { + let value = (op.value(), doc.ops().id_to_exid(op.id)); + op_observer.put(doc, ex_obj, prop, value, false); + } + } + self.operations.push((obj, op)); + } +} + +enum SpliceType<'a> { + List, + Text(&'a str, TextEncoding), +} + +impl<'a> SpliceType<'a> { + fn encoding(&self) -> ListEncoding { + match self { + SpliceType::List => ListEncoding::List, + SpliceType::Text(_, encoding) => ListEncoding::Text(*encoding), + } + } +} + +struct SpliceArgs<'a> { + obj: ObjId, + index: usize, + del: usize, + values: Vec, + splice_type: SpliceType<'a>, +} + +#[cfg(test)] +mod tests { + use crate::{transaction::Transactable, ReadDoc, ROOT}; + + use super::*; + + #[test] + fn map_rollback_doesnt_panic() { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + + let a = tx.put_object(ROOT, "a", ObjType::Map).unwrap(); + tx.put(&a, "b", 1).unwrap(); + assert!(tx.get(&a, "b").unwrap().is_some()); + } +} diff --git a/rust/automerge/src/transaction/manual_transaction.rs b/rust/automerge/src/transaction/manual_transaction.rs new file mode 100644 index 00000000..fa5f6340 --- /dev/null +++ b/rust/automerge/src/transaction/manual_transaction.rs @@ -0,0 +1,348 @@ +use std::ops::RangeBounds; + +use crate::exid::ExId; +use crate::op_observer::BranchableObserver; +use crate::{ + Automerge, ChangeHash, KeysAt, ObjType, OpObserver, Prop, ReadDoc, ScalarValue, Value, Values, +}; +use crate::{AutomergeError, Keys}; +use crate::{ListRange, ListRangeAt, MapRange, MapRangeAt}; + +use super::{observation, CommitOptions, Transactable, TransactionArgs, TransactionInner}; + +/// A transaction on a document. +/// Transactions group operations into a single change so that no other operations can happen +/// in-between. +/// +/// Created from [`Automerge::transaction`]. +/// +/// ## Drop +/// +/// This transaction should be manually committed or rolled back. If not done manually then it will +/// be rolled back when it is dropped. This is to prevent the document being in an unsafe +/// intermediate state. +/// This is consistent with `?` error handling. +#[derive(Debug)] +pub struct Transaction<'a, Obs: observation::Observation> { + // this is an option so that we can take it during commit and rollback to prevent it being + // rolled back during drop. + inner: Option, + // As with `inner` this is an `Option` so we can `take` it during `commit` + observation: Option, + doc: &'a mut Automerge, +} + +impl<'a, Obs: observation::Observation> Transaction<'a, Obs> { + pub(crate) fn new(doc: &'a mut Automerge, args: TransactionArgs, obs: Obs) -> Self { + Self { + inner: Some(TransactionInner::new(args)), + doc, + observation: Some(obs), + } + } +} + +impl<'a> Transaction<'a, observation::UnObserved> { + pub(crate) fn empty( + doc: &'a mut Automerge, + args: TransactionArgs, + opts: CommitOptions, + ) -> ChangeHash { + TransactionInner::empty(doc, args, opts.message, opts.time) + } +} + +impl<'a, Obs: OpObserver + BranchableObserver> Transaction<'a, observation::Observed> { + pub fn observer(&mut self) -> &mut Obs { + self.observation.as_mut().unwrap().observer() + } +} + +impl<'a, Obs: observation::Observation> Transaction<'a, Obs> { + /// Get the heads of the document before this transaction was started. + pub fn get_heads(&self) -> Vec { + self.doc.get_heads() + } + + /// Commit the operations performed in this transaction, returning the hashes corresponding to + /// the new heads. + pub fn commit(mut self) -> Obs::CommitResult { + let tx = self.inner.take().unwrap(); + let hash = tx.commit(self.doc, None, None); + let obs = self.observation.take().unwrap(); + obs.make_result(hash) + } + + /// Commit the operations in this transaction with some options. + /// + /// ``` + /// # use automerge::transaction::CommitOptions; + /// # use automerge::transaction::Transactable; + /// # use automerge::ROOT; + /// # use automerge::Automerge; + /// # use automerge::ObjType; + /// # use std::time::SystemTime; + /// let mut doc = Automerge::new(); + /// let mut tx = doc.transaction(); + /// tx.put_object(ROOT, "todos", ObjType::List).unwrap(); + /// let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as + /// i64; + /// tx.commit_with(CommitOptions::default().with_message("Create todos list").with_time(now)); + /// ``` + pub fn commit_with(mut self, options: CommitOptions) -> Obs::CommitResult { + let tx = self.inner.take().unwrap(); + let hash = tx.commit(self.doc, options.message, options.time); + let obs = self.observation.take().unwrap(); + obs.make_result(hash) + } + + /// Undo the operations added in this transaction, returning the number of cancelled + /// operations. + pub fn rollback(mut self) -> usize { + self.inner.take().unwrap().rollback(self.doc) + } + + fn do_tx(&mut self, f: F) -> O + where + F: FnOnce(&mut TransactionInner, &mut Automerge, Option<&mut Obs::Obs>) -> O, + { + let tx = self.inner.as_mut().unwrap(); + if let Some(obs) = self.observation.as_mut() { + f(tx, self.doc, obs.observer()) + } else { + f(tx, self.doc, None) + } + } +} + +impl<'a, Obs: observation::Observation> ReadDoc for Transaction<'a, Obs> { + fn keys>(&self, obj: O) -> Keys<'_, '_> { + self.doc.keys(obj) + } + + fn keys_at>(&self, obj: O, heads: &[ChangeHash]) -> KeysAt<'_, '_> { + self.doc.keys_at(obj, heads) + } + + fn map_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> MapRange<'_, R> { + self.doc.map_range(obj, range) + } + + fn map_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> MapRangeAt<'_, R> { + self.doc.map_range_at(obj, range, heads) + } + + fn list_range, R: RangeBounds>( + &self, + obj: O, + range: R, + ) -> ListRange<'_, R> { + self.doc.list_range(obj, range) + } + + fn list_range_at, R: RangeBounds>( + &self, + obj: O, + range: R, + heads: &[ChangeHash], + ) -> ListRangeAt<'_, R> { + self.doc.list_range_at(obj, range, heads) + } + + fn values>(&self, obj: O) -> Values<'_> { + self.doc.values(obj) + } + + fn values_at>(&self, obj: O, heads: &[ChangeHash]) -> Values<'_> { + self.doc.values_at(obj, heads) + } + + fn length>(&self, obj: O) -> usize { + self.doc.length(obj) + } + + fn length_at>(&self, obj: O, heads: &[ChangeHash]) -> usize { + self.doc.length_at(obj, heads) + } + + fn object_type>(&self, obj: O) -> Result { + self.doc.object_type(obj) + } + + fn text>(&self, obj: O) -> Result { + self.doc.text(obj) + } + + fn text_at>( + &self, + obj: O, + heads: &[ChangeHash], + ) -> Result { + self.doc.text_at(obj, heads) + } + + fn get, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + self.doc.get(obj, prop) + } + + fn get_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_at(obj, prop, heads) + } + + fn get_all, P: Into>( + &self, + obj: O, + prop: P, + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_all(obj, prop) + } + + fn get_all_at, P: Into>( + &self, + obj: O, + prop: P, + heads: &[ChangeHash], + ) -> Result, ExId)>, AutomergeError> { + self.doc.get_all_at(obj, prop, heads) + } + + fn parents>(&self, obj: O) -> Result, AutomergeError> { + self.doc.parents(obj) + } + + fn path_to_object>(&self, obj: O) -> Result, AutomergeError> { + self.doc.path_to_object(obj) + } + + fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec { + self.doc.get_missing_deps(heads) + } + + fn get_change_by_hash(&self, hash: &ChangeHash) -> Option<&crate::Change> { + self.doc.get_change_by_hash(hash) + } +} + +impl<'a, Obs: observation::Observation> Transactable for Transaction<'a, Obs> { + /// Get the number of pending operations in this transaction. + fn pending_ops(&self) -> usize { + self.inner.as_ref().unwrap().pending_ops() + } + + /// Set the value of property `P` to value `V` in object `obj`. + /// + /// # Errors + /// + /// This will return an error if + /// - The object does not exist + /// - The key is the wrong type for the object + /// - The key does not exist in the object + fn put, P: Into, V: Into>( + &mut self, + obj: O, + prop: P, + value: V, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.put(doc, obs, obj.as_ref(), prop, value)) + } + + fn put_object, P: Into>( + &mut self, + obj: O, + prop: P, + value: ObjType, + ) -> Result { + self.do_tx(|tx, doc, obs| tx.put_object(doc, obs, obj.as_ref(), prop, value)) + } + + fn insert, V: Into>( + &mut self, + obj: O, + index: usize, + value: V, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.insert(doc, obs, obj.as_ref(), index, value)) + } + + fn insert_object>( + &mut self, + obj: O, + index: usize, + value: ObjType, + ) -> Result { + self.do_tx(|tx, doc, obs| tx.insert_object(doc, obs, obj.as_ref(), index, value)) + } + + fn increment, P: Into>( + &mut self, + obj: O, + prop: P, + value: i64, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.increment(doc, obs, obj.as_ref(), prop, value)) + } + + fn delete, P: Into>( + &mut self, + obj: O, + prop: P, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.delete(doc, obs, obj.as_ref(), prop)) + } + + /// Splice new elements into the given sequence. Returns a vector of the OpIds used to insert + /// the new elements + fn splice, V: IntoIterator>( + &mut self, + obj: O, + pos: usize, + del: usize, + vals: V, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.splice(doc, obs, obj.as_ref(), pos, del, vals)) + } + + fn splice_text>( + &mut self, + obj: O, + pos: usize, + del: usize, + text: &str, + ) -> Result<(), AutomergeError> { + self.do_tx(|tx, doc, obs| tx.splice_text(doc, obs, obj.as_ref(), pos, del, text)) + } + + fn base_heads(&self) -> Vec { + self.doc.get_heads() + } +} + +// If a transaction is not commited or rolled back manually then it can leave the document in an +// intermediate state. +// This defaults to rolling back the transaction to be compatible with `?` error returning before +// reaching a call to `commit`. +impl<'a, Obs: observation::Observation> Drop for Transaction<'a, Obs> { + fn drop(&mut self) { + if let Some(txn) = self.inner.take() { + txn.rollback(self.doc); + } + } +} diff --git a/rust/automerge/src/transaction/observation.rs b/rust/automerge/src/transaction/observation.rs new file mode 100644 index 00000000..53723711 --- /dev/null +++ b/rust/automerge/src/transaction/observation.rs @@ -0,0 +1,80 @@ +//! This module is essentially a type level Option. It is used in sitations where we know at +//! compile time whether an `OpObserver` is available to track changes in a transaction. +use crate::{op_observer::BranchableObserver, ChangeHash, OpObserver}; + +mod private { + use crate::op_observer::BranchableObserver; + + pub trait Sealed {} + impl Sealed for super::Observed {} + impl Sealed for super::UnObserved {} +} + +pub trait Observation: private::Sealed { + type Obs: OpObserver + BranchableObserver; + type CommitResult; + + fn observer(&mut self) -> Option<&mut Self::Obs>; + fn make_result(self, hash: Option) -> Self::CommitResult; + fn branch(&self) -> Self; + fn merge(&mut self, other: &Self); +} + +#[derive(Clone, Debug)] +pub struct Observed(Obs); + +impl Observed { + pub(crate) fn new(o: O) -> Self { + Self(o) + } + + pub(crate) fn observer(&mut self) -> &mut O { + &mut self.0 + } +} + +impl Observation for Observed { + type Obs = Obs; + type CommitResult = (Obs, Option); + fn observer(&mut self) -> Option<&mut Self::Obs> { + Some(&mut self.0) + } + + fn make_result(self, hash: Option) -> Self::CommitResult { + (self.0, hash) + } + + fn branch(&self) -> Self { + Self(self.0.branch()) + } + + fn merge(&mut self, other: &Self) { + self.0.merge(&other.0) + } +} + +#[derive(Clone, Default, Debug)] +pub struct UnObserved; +impl UnObserved { + pub fn new() -> Self { + Self + } +} + +impl Observation for UnObserved { + type Obs = (); + type CommitResult = Option; + fn observer(&mut self) -> Option<&mut Self::Obs> { + None + } + + fn make_result(self, hash: Option) -> Self::CommitResult { + hash + } + + fn branch(&self) -> Self { + Self + } + + fn merge(&mut self, _other: &Self) {} +} diff --git a/rust/automerge/src/transaction/result.rs b/rust/automerge/src/transaction/result.rs new file mode 100644 index 00000000..5327ff44 --- /dev/null +++ b/rust/automerge/src/transaction/result.rs @@ -0,0 +1,20 @@ +use crate::ChangeHash; + +/// The result of a successful, and committed, transaction. +#[derive(Debug)] +pub struct Success { + /// The result of the transaction. + pub result: O, + /// The hash of the change, will be `None` if the transaction did not create any operations + pub hash: Option, + pub op_observer: Obs, +} + +/// The result of a failed, and rolled back, transaction. +#[derive(Debug)] +pub struct Failure { + /// The error returned from the transaction. + pub error: E, + /// The number of operations cancelled. + pub cancelled: usize, +} diff --git a/rust/automerge/src/transaction/transactable.rs b/rust/automerge/src/transaction/transactable.rs new file mode 100644 index 00000000..05c48c79 --- /dev/null +++ b/rust/automerge/src/transaction/transactable.rs @@ -0,0 +1,93 @@ +use crate::exid::ExId; +use crate::{AutomergeError, ChangeHash, ObjType, Prop, ReadDoc, ScalarValue}; + +/// A way of mutating a document within a single change. +pub trait Transactable: ReadDoc { + /// Get the number of pending operations in this transaction. + fn pending_ops(&self) -> usize; + + /// Set the value of property `P` to value `V` in object `obj`. + /// + /// # Errors + /// + /// This will return an error if + /// - The object does not exist + /// - The key is the wrong type for the object + /// - The key does not exist in the object + fn put, P: Into, V: Into>( + &mut self, + obj: O, + prop: P, + value: V, + ) -> Result<(), AutomergeError>; + + /// Set the value of property `P` to the new object `V` in object `obj`. + /// + /// # Returns + /// + /// The id of the object which was created. + /// + /// # Errors + /// + /// This will return an error if + /// - The object does not exist + /// - The key is the wrong type for the object + /// - The key does not exist in the object + fn put_object, P: Into>( + &mut self, + obj: O, + prop: P, + object: ObjType, + ) -> Result; + + /// Insert a value into a list at the given index. + fn insert, V: Into>( + &mut self, + obj: O, + index: usize, + value: V, + ) -> Result<(), AutomergeError>; + + /// Insert an object into a list at the given index. + fn insert_object>( + &mut self, + obj: O, + index: usize, + object: ObjType, + ) -> Result; + + /// Increment the counter at the prop in the object by `value`. + fn increment, P: Into>( + &mut self, + obj: O, + prop: P, + value: i64, + ) -> Result<(), AutomergeError>; + + /// Delete the value at prop in the object. + fn delete, P: Into>( + &mut self, + obj: O, + prop: P, + ) -> Result<(), AutomergeError>; + + fn splice, V: IntoIterator>( + &mut self, + obj: O, + pos: usize, + del: usize, + vals: V, + ) -> Result<(), AutomergeError>; + + /// Like [`Self::splice`] but for text. + fn splice_text>( + &mut self, + obj: O, + pos: usize, + del: usize, + text: &str, + ) -> Result<(), AutomergeError>; + + /// The heads this transaction will be based on + fn base_heads(&self) -> Vec; +} diff --git a/rust/automerge/src/types.rs b/rust/automerge/src/types.rs new file mode 100644 index 00000000..468986ec --- /dev/null +++ b/rust/automerge/src/types.rs @@ -0,0 +1,844 @@ +use crate::error; +use crate::legacy as amp; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; +use std::cmp::Eq; +use std::cmp::Ordering; +use std::fmt; +use std::fmt::Display; +use std::str::FromStr; +use tinyvec::{ArrayVec, TinyVec}; +//use crate::indexed_cache::IndexedCache; + +mod opids; +pub(crate) use opids::OpIds; + +pub(crate) use crate::clock::Clock; +pub(crate) use crate::value::{Counter, ScalarValue, Value}; + +pub(crate) const HEAD: ElemId = ElemId(OpId(0, 0)); +pub(crate) const ROOT: OpId = OpId(0, 0); + +const ROOT_STR: &str = "_root"; +const HEAD_STR: &str = "_head"; + +/// An actor id is a sequence of bytes. By default we use a uuid which can be nicely stack +/// allocated. +/// +/// In the event that users want to use their own type of identifier that is longer than a uuid +/// then they will likely end up pushing it onto the heap which is still fine. +/// +// Note that change encoding relies on the Ord implementation for the ActorId being implemented in +// terms of the lexicographic ordering of the underlying bytes. Be aware of this if you are +// changing the ActorId implementation in ways which might affect the Ord implementation +#[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord)] +#[cfg_attr(feature = "derive-arbitrary", derive(arbitrary::Arbitrary))] +pub struct ActorId(TinyVec<[u8; 16]>); + +impl fmt::Debug for ActorId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("ActorID") + .field(&hex::encode(&self.0)) + .finish() + } +} + +impl ActorId { + pub fn random() -> ActorId { + ActorId(TinyVec::from(*uuid::Uuid::new_v4().as_bytes())) + } + + pub fn to_bytes(&self) -> &[u8] { + &self.0 + } + + pub fn to_hex_string(&self) -> String { + hex::encode(&self.0) + } +} + +impl TryFrom<&str> for ActorId { + type Error = error::InvalidActorId; + + fn try_from(s: &str) -> Result { + hex::decode(s) + .map(ActorId::from) + .map_err(|_| error::InvalidActorId(s.into())) + } +} + +impl TryFrom for ActorId { + type Error = error::InvalidActorId; + + fn try_from(s: String) -> Result { + hex::decode(&s) + .map(ActorId::from) + .map_err(|_| error::InvalidActorId(s)) + } +} + +impl AsRef<[u8]> for ActorId { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl From for ActorId { + fn from(u: uuid::Uuid) -> Self { + ActorId(TinyVec::from(*u.as_bytes())) + } +} + +impl From<&[u8]> for ActorId { + fn from(b: &[u8]) -> Self { + ActorId(TinyVec::from(b)) + } +} + +impl From<&Vec> for ActorId { + fn from(b: &Vec) -> Self { + ActorId::from(b.as_slice()) + } +} + +impl From> for ActorId { + fn from(b: Vec) -> Self { + let inner = if let Ok(arr) = ArrayVec::try_from(b.as_slice()) { + TinyVec::Inline(arr) + } else { + TinyVec::Heap(b) + }; + ActorId(inner) + } +} + +impl From<[u8; N]> for ActorId { + fn from(array: [u8; N]) -> Self { + ActorId::from(&array) + } +} + +impl From<&[u8; N]> for ActorId { + fn from(slice: &[u8; N]) -> Self { + let inner = if let Ok(arr) = ArrayVec::try_from(slice.as_slice()) { + TinyVec::Inline(arr) + } else { + TinyVec::Heap(slice.to_vec()) + }; + ActorId(inner) + } +} + +impl FromStr for ActorId { + type Err = error::InvalidActorId; + + fn from_str(s: &str) -> Result { + ActorId::try_from(s) + } +} + +impl fmt::Display for ActorId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.to_hex_string()) + } +} + +/// The type of an object +#[derive(Deserialize, Serialize, Debug, Clone, PartialEq, Eq, Copy, Hash)] +#[serde(rename_all = "camelCase", untagged)] +pub enum ObjType { + /// A map + Map, + /// Retained for backwards compatibility, tables are identical to maps + Table, + /// A sequence of arbitrary values + List, + /// A sequence of characters + Text, +} + +impl ObjType { + pub fn is_sequence(&self) -> bool { + matches!(self, Self::List | Self::Text) + } +} + +impl From for ObjType { + fn from(other: amp::MapType) -> Self { + match other { + amp::MapType::Map => Self::Map, + amp::MapType::Table => Self::Table, + } + } +} + +impl From for ObjType { + fn from(other: amp::SequenceType) -> Self { + match other { + amp::SequenceType::List => Self::List, + amp::SequenceType::Text => Self::Text, + } + } +} + +impl fmt::Display for ObjType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ObjType::Map => write!(f, "map"), + ObjType::Table => write!(f, "table"), + ObjType::List => write!(f, "list"), + ObjType::Text => write!(f, "text"), + } + } +} + +#[derive(PartialEq, Debug, Clone)] +pub enum OpType { + Make(ObjType), + Delete, + Increment(i64), + Put(ScalarValue), +} + +impl OpType { + /// The index into the action array as specified in [1] + /// + /// [1]: https://alexjg.github.io/automerge-storage-docs/#action-array + pub(crate) fn action_index(&self) -> u64 { + match self { + Self::Make(ObjType::Map) => 0, + Self::Put(_) => 1, + Self::Make(ObjType::List) => 2, + Self::Delete => 3, + Self::Make(ObjType::Text) => 4, + Self::Increment(_) => 5, + Self::Make(ObjType::Table) => 6, + } + } + + pub(crate) fn validate_action_and_value( + action: u64, + value: &ScalarValue, + ) -> Result<(), error::InvalidOpType> { + match action { + 0..=4 => Ok(()), + 5 => match value { + ScalarValue::Int(_) | ScalarValue::Uint(_) => Ok(()), + _ => Err(error::InvalidOpType::NonNumericInc), + }, + 6 => Ok(()), + _ => Err(error::InvalidOpType::UnknownAction(action)), + } + } + + pub(crate) fn from_action_and_value(action: u64, value: ScalarValue) -> OpType { + match action { + 0 => Self::Make(ObjType::Map), + 1 => Self::Put(value), + 2 => Self::Make(ObjType::List), + 3 => Self::Delete, + 4 => Self::Make(ObjType::Text), + 5 => match value { + ScalarValue::Int(i) => Self::Increment(i), + ScalarValue::Uint(i) => Self::Increment(i as i64), + _ => unreachable!("validate_action_and_value returned NonNumericInc"), + }, + 6 => Self::Make(ObjType::Table), + _ => unreachable!("validate_action_and_value returned UnknownAction"), + } + } +} + +impl From for OpType { + fn from(v: ObjType) -> Self { + OpType::Make(v) + } +} + +impl From for OpType { + fn from(v: ScalarValue) -> Self { + OpType::Put(v) + } +} + +#[derive(Debug)] +pub(crate) enum Export { + Id(OpId), + Special(String), + Prop(usize), +} + +pub(crate) trait Exportable { + fn export(&self) -> Export; +} + +impl Exportable for ObjId { + fn export(&self) -> Export { + if self.0 == ROOT { + Export::Special(ROOT_STR.to_owned()) + } else { + Export::Id(self.0) + } + } +} + +impl Exportable for &ObjId { + fn export(&self) -> Export { + if self.0 == ROOT { + Export::Special(ROOT_STR.to_owned()) + } else { + Export::Id(self.0) + } + } +} + +impl Exportable for ElemId { + fn export(&self) -> Export { + if self == &HEAD { + Export::Special(HEAD_STR.to_owned()) + } else { + Export::Id(self.0) + } + } +} + +impl Exportable for OpId { + fn export(&self) -> Export { + Export::Id(*self) + } +} + +impl Exportable for Key { + fn export(&self) -> Export { + match self { + Key::Map(p) => Export::Prop(*p), + Key::Seq(e) => e.export(), + } + } +} + +impl From for OpId { + fn from(o: ObjId) -> Self { + o.0 + } +} + +impl From for ObjId { + fn from(o: OpId) -> Self { + ObjId(o) + } +} + +impl From for ElemId { + fn from(o: OpId) -> Self { + ElemId(o) + } +} + +impl From for Prop { + fn from(p: String) -> Self { + Prop::Map(p) + } +} + +impl From<&String> for Prop { + fn from(p: &String) -> Self { + Prop::Map(p.clone()) + } +} + +impl From<&str> for Prop { + fn from(p: &str) -> Self { + Prop::Map(p.to_owned()) + } +} + +impl From for Prop { + fn from(index: usize) -> Self { + Prop::Seq(index) + } +} + +impl From for Prop { + fn from(index: f64) -> Self { + Prop::Seq(index as usize) + } +} + +impl From for Key { + fn from(id: OpId) -> Self { + Key::Seq(ElemId(id)) + } +} + +impl From for Key { + fn from(e: ElemId) -> Self { + Key::Seq(e) + } +} + +impl From> for ElemId { + fn from(e: Option) -> Self { + e.unwrap_or(HEAD) + } +} + +impl From> for Key { + fn from(e: Option) -> Self { + Key::Seq(e.into()) + } +} + +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, Hash)] +pub(crate) enum Key { + Map(usize), + Seq(ElemId), +} + +/// A property of an object +/// +/// This is either a string representing a property in a map, or an integer +/// which is the index into a sequence +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] +pub enum Prop { + /// A property in a map + Map(String), + /// An index into a sequence + Seq(usize), +} + +impl Prop { + pub(crate) fn to_index(&self) -> Option { + match self { + Prop::Map(_) => None, + Prop::Seq(n) => Some(*n), + } + } +} + +impl Display for Prop { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Prop::Map(s) => write!(f, "{}", s), + Prop::Seq(i) => write!(f, "{}", i), + } + } +} + +impl Key { + pub(crate) fn elemid(&self) -> Option { + match self { + Key::Map(_) => None, + Key::Seq(id) => Some(*id), + } + } +} + +#[derive(Debug, Clone, PartialOrd, Ord, Eq, PartialEq, Copy, Hash, Default)] +pub(crate) struct OpId(u32, u32); + +impl OpId { + pub(crate) fn new(counter: u64, actor: usize) -> Self { + Self(counter.try_into().unwrap(), actor.try_into().unwrap()) + } + + #[inline] + pub(crate) fn counter(&self) -> u64 { + self.0.into() + } + + #[inline] + pub(crate) fn actor(&self) -> usize { + self.1.try_into().unwrap() + } + + #[inline] + pub(crate) fn lamport_cmp(&self, other: &OpId, actors: &[ActorId]) -> Ordering { + self.0 + .cmp(&other.0) + .then_with(|| actors[self.1 as usize].cmp(&actors[other.1 as usize])) + } +} + +#[derive(Debug, Clone, Copy, PartialOrd, Eq, PartialEq, Ord, Hash, Default)] +pub(crate) struct ObjId(pub(crate) OpId); + +impl ObjId { + pub(crate) const fn root() -> Self { + ObjId(OpId(0, 0)) + } + + pub(crate) fn is_root(&self) -> bool { + self.0.counter() == 0 + } + + pub(crate) fn opid(&self) -> &OpId { + &self.0 + } +} + +/// How indexes into text sequeces are calculated +/// +/// Automerge text objects are internally sequences of utf8 characters. This +/// means that in environments (such as javascript) which use a different +/// encoding the indexes into the text sequence will be different. This enum +/// represents the different ways indexes can be calculated. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum TextEncoding { + /// The indexes are calculated using the utf8 encoding + Utf8, + /// The indexes are calculated using the utf16 encoding + Utf16, +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub(crate) enum ListEncoding { + List, + Text(TextEncoding), +} + +impl Default for ListEncoding { + fn default() -> Self { + ListEncoding::List + } +} + +impl Default for TextEncoding { + fn default() -> Self { + TextEncoding::Utf8 + } +} + +impl ListEncoding { + pub(crate) fn new(obj: ObjType, text_encoding: TextEncoding) -> Self { + if obj == ObjType::Text { + ListEncoding::Text(text_encoding) + } else { + ListEncoding::List + } + } +} + +#[derive(Debug, Clone, Copy, PartialOrd, Eq, PartialEq, Ord, Hash, Default)] +pub(crate) struct ElemId(pub(crate) OpId); + +impl ElemId { + pub(crate) fn is_head(&self) -> bool { + *self == HEAD + } + + pub(crate) fn head() -> Self { + Self(OpId(0, 0)) + } +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct Op { + pub(crate) id: OpId, + pub(crate) action: OpType, + pub(crate) key: Key, + pub(crate) succ: OpIds, + pub(crate) pred: OpIds, + pub(crate) insert: bool, +} + +impl Op { + pub(crate) fn add_succ std::cmp::Ordering>(&mut self, op: &Op, cmp: F) { + self.succ.add(op.id, cmp); + if let OpType::Put(ScalarValue::Counter(Counter { + current, + increments, + .. + })) = &mut self.action + { + if let OpType::Increment(n) = &op.action { + *current += *n; + *increments += 1; + } + } + } + + pub(crate) fn remove_succ(&mut self, op: &Op) { + self.succ.retain(|id| id != &op.id); + if let OpType::Put(ScalarValue::Counter(Counter { + current, + increments, + .. + })) = &mut self.action + { + if let OpType::Increment(n) = &op.action { + *current -= *n; + *increments -= 1; + } + } + } + + pub(crate) fn width(&self, encoding: ListEncoding) -> usize { + match encoding { + ListEncoding::List => 1, + ListEncoding::Text(TextEncoding::Utf8) => self.to_str().chars().count(), + ListEncoding::Text(TextEncoding::Utf16) => self.to_str().encode_utf16().count(), + } + } + + pub(crate) fn to_str(&self) -> &str { + if let OpType::Put(ScalarValue::Str(s)) = &self.action { + s + } else { + "\u{fffc}" + } + } + + pub(crate) fn visible(&self) -> bool { + if self.is_inc() { + false + } else if self.is_counter() { + self.succ.len() <= self.incs() + } else { + self.succ.is_empty() + } + } + + pub(crate) fn incs(&self) -> usize { + if let OpType::Put(ScalarValue::Counter(Counter { increments, .. })) = &self.action { + *increments + } else { + 0 + } + } + + pub(crate) fn is_delete(&self) -> bool { + matches!(&self.action, OpType::Delete) + } + + pub(crate) fn is_inc(&self) -> bool { + matches!(&self.action, OpType::Increment(_)) + } + + pub(crate) fn is_counter(&self) -> bool { + matches!(&self.action, OpType::Put(ScalarValue::Counter(_))) + } + + pub(crate) fn is_noop(&self, action: &OpType) -> bool { + matches!((&self.action, action), (OpType::Put(n), OpType::Put(m)) if n == m) + } + + pub(crate) fn is_list_op(&self) -> bool { + matches!(&self.key, Key::Seq(_)) + } + + pub(crate) fn overwrites(&self, other: &Op) -> bool { + self.pred.iter().any(|i| i == &other.id) + } + + pub(crate) fn elemid(&self) -> Option { + self.elemid_or_key().elemid() + } + + pub(crate) fn elemid_or_key(&self) -> Key { + if self.insert { + Key::Seq(ElemId(self.id)) + } else { + self.key + } + } + + pub(crate) fn get_increment_value(&self) -> Option { + if let OpType::Increment(i) = self.action { + Some(i) + } else { + None + } + } + + pub(crate) fn value(&self) -> Value<'_> { + match &self.action { + OpType::Make(obj_type) => Value::Object(*obj_type), + OpType::Put(scalar) => Value::Scalar(Cow::Borrowed(scalar)), + _ => panic!("cant convert op into a value - {:?}", self), + } + } + + pub(crate) fn clone_value(&self) -> Value<'static> { + match &self.action { + OpType::Make(obj_type) => Value::Object(*obj_type), + OpType::Put(scalar) => Value::Scalar(Cow::Owned(scalar.clone())), + _ => panic!("cant convert op into a value - {:?}", self), + } + } + + #[allow(dead_code)] + pub(crate) fn dump(&self) -> String { + match &self.action { + OpType::Put(value) if self.insert => format!("i:{}", value), + OpType::Put(value) => format!("s:{}", value), + OpType::Make(obj) => format!("make{}", obj), + OpType::Increment(val) => format!("inc:{}", val), + OpType::Delete => "del".to_string(), + } + } +} + +#[derive(Debug, Clone)] +pub(crate) struct Peer {} + +/// The number of bytes in a change hash. +pub(crate) const HASH_SIZE: usize = 32; // 256 bits = 32 bytes + +/// The sha256 hash of a change. +#[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord, Copy)] +pub struct ChangeHash(pub [u8; HASH_SIZE]); + +impl ChangeHash { + pub(crate) fn as_bytes(&self) -> &[u8] { + &self.0 + } + + pub(crate) fn checksum(&self) -> [u8; 4] { + [self.0[0], self.0[1], self.0[2], self.0[3]] + } +} + +impl AsRef<[u8]> for ChangeHash { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl fmt::Debug for ChangeHash { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("ChangeHash") + .field(&hex::encode(self.0)) + .finish() + } +} + +impl fmt::Display for ChangeHash { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", hex::encode(self.0)) + } +} + +#[derive(thiserror::Error, Debug)] +pub enum ParseChangeHashError { + #[error(transparent)] + HexDecode(#[from] hex::FromHexError), + #[error( + "incorrect length, change hash should be {} bytes, got {actual}", + HASH_SIZE + )] + IncorrectLength { actual: usize }, +} + +impl FromStr for ChangeHash { + type Err = ParseChangeHashError; + + fn from_str(s: &str) -> Result { + let bytes = hex::decode(s)?; + if bytes.len() == HASH_SIZE { + Ok(ChangeHash(bytes.try_into().unwrap())) + } else { + Err(ParseChangeHashError::IncorrectLength { + actual: bytes.len(), + }) + } + } +} + +impl TryFrom<&[u8]> for ChangeHash { + type Error = error::InvalidChangeHashSlice; + + fn try_from(bytes: &[u8]) -> Result { + if bytes.len() != HASH_SIZE { + Err(error::InvalidChangeHashSlice(Vec::from(bytes))) + } else { + let mut array = [0; HASH_SIZE]; + array.copy_from_slice(bytes); + Ok(ChangeHash(array)) + } + } +} + +#[cfg(feature = "wasm")] +impl From for wasm_bindgen::JsValue { + fn from(prop: Prop) -> Self { + match prop { + Prop::Map(key) => key.into(), + Prop::Seq(index) => (index as f64).into(), + } + } +} + +#[cfg(test)] +pub(crate) mod gen { + use super::{ + ChangeHash, Counter, ElemId, Key, ObjType, Op, OpId, OpIds, OpType, ScalarValue, HASH_SIZE, + }; + use proptest::prelude::*; + + pub(crate) fn gen_hash() -> impl Strategy { + proptest::collection::vec(proptest::bits::u8::ANY, HASH_SIZE) + .prop_map(|b| ChangeHash::try_from(&b[..]).unwrap()) + } + + pub(crate) fn gen_scalar_value() -> impl Strategy { + prop_oneof![ + proptest::collection::vec(proptest::bits::u8::ANY, 0..200).prop_map(ScalarValue::Bytes), + "[a-z]{10,500}".prop_map(|s| ScalarValue::Str(s.into())), + any::().prop_map(ScalarValue::Int), + any::().prop_map(ScalarValue::Uint), + any::().prop_map(ScalarValue::F64), + any::().prop_map(|c| ScalarValue::Counter(Counter::from(c))), + any::().prop_map(ScalarValue::Timestamp), + any::().prop_map(ScalarValue::Boolean), + Just(ScalarValue::Null), + ] + } + + pub(crate) fn gen_objtype() -> impl Strategy { + prop_oneof![ + Just(ObjType::Map), + Just(ObjType::Table), + Just(ObjType::List), + Just(ObjType::Text), + ] + } + + pub(crate) fn gen_action() -> impl Strategy { + prop_oneof![ + Just(OpType::Delete), + any::().prop_map(OpType::Increment), + gen_scalar_value().prop_map(OpType::Put), + gen_objtype().prop_map(OpType::Make) + ] + } + + pub(crate) fn gen_key(key_indices: Vec) -> impl Strategy { + prop_oneof![ + proptest::sample::select(key_indices).prop_map(Key::Map), + Just(Key::Seq(ElemId(OpId::new(0, 0)))), + ] + } + + /// Generate an arbitrary op + /// + /// The generated op will have no preds or succs + /// + /// # Arguments + /// + /// * `id` - the OpId this op will be given + /// * `key_prop_indices` - The indices of props which will be used to generate keys of type + /// `Key::Map`. I.e. this is what would typically be in `OpSetMetadata::props + pub(crate) fn gen_op(id: OpId, key_prop_indices: Vec) -> impl Strategy { + (gen_key(key_prop_indices), any::(), gen_action()).prop_map( + move |(key, insert, action)| Op { + id, + key, + insert, + action, + succ: OpIds::empty(), + pred: OpIds::empty(), + }, + ) + } +} diff --git a/rust/automerge/src/types/opids.rs b/rust/automerge/src/types/opids.rs new file mode 100644 index 00000000..a81ccb36 --- /dev/null +++ b/rust/automerge/src/types/opids.rs @@ -0,0 +1,198 @@ +use itertools::Itertools; + +use super::OpId; + +/// A wrapper around `Vec` which preserves the invariant that the ops are +/// in ascending order with respect to their counters and actor IDs. In order to +/// maintain this invariant you must provide a comparator function when adding +/// ops as the actor indices in an OpId are not sufficient to order the OpIds +#[derive(Debug, Clone, PartialEq, Default)] +pub(crate) struct OpIds(Vec); + +impl<'a> IntoIterator for &'a OpIds { + type Item = &'a OpId; + type IntoIter = std::slice::Iter<'a, OpId>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl OpIds { + pub(crate) fn empty() -> Self { + Self(Vec::new()) + } + + pub(crate) fn new, F: Fn(&OpId, &OpId) -> std::cmp::Ordering>( + opids: I, + cmp: F, + ) -> Self { + let mut inner = opids.collect::>(); + inner.sort_by(cmp); + Self(inner) + } + + /// Create a new OpIds if `opids` are sorted with respect to `cmp` and contain no duplicates. + /// + /// Returns `Some(OpIds)` if `opids` is sorted and has no duplicates, otherwise returns `None` + pub(crate) fn new_if_sorted std::cmp::Ordering>( + opids: Vec, + cmp: F, + ) -> Option { + if are_sorted_and_unique(opids.iter(), cmp) { + Some(Self(opids)) + } else { + None + } + } + + /// Add an op to this set of OpIds. The `comparator` must provide a + /// consistent ordering between successive calls to `add`. + pub(crate) fn add std::cmp::Ordering>( + &mut self, + opid: OpId, + comparator: F, + ) { + use std::cmp::Ordering::*; + if self.is_empty() { + self.0.push(opid); + return; + } + let idx_and_elem = self + .0 + .iter() + .find_position(|an_opid| matches!(comparator(an_opid, &opid), Greater | Equal)); + if let Some((idx, an_opid)) = idx_and_elem { + if comparator(an_opid, &opid) == Equal { + // nothing to do + } else { + self.0.insert(idx, opid); + } + } else { + self.0.push(opid); + } + } + + pub(crate) fn retain bool>(&mut self, f: F) { + self.0.retain(f) + } + + pub(crate) fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub(crate) fn len(&self) -> usize { + self.0.len() + } + + pub(crate) fn iter(&self) -> std::slice::Iter<'_, OpId> { + self.0.iter() + } + + pub(crate) fn contains(&self, op: &OpId) -> bool { + self.0.contains(op) + } + + pub(crate) fn get(&self, idx: usize) -> Option<&OpId> { + self.0.get(idx) + } +} + +fn are_sorted_and_unique< + 'a, + I: Iterator, + F: FnMut(&OpId, &OpId) -> std::cmp::Ordering, +>( + mut opids: I, + mut f: F, +) -> bool { + use std::cmp::Ordering; + let mut last = match opids.next() { + Some(e) => e, + None => return true, + }; + + for next in opids { + if matches!(f(last, next), Ordering::Greater | Ordering::Equal) { + return false; + } + last = next; + } + true +} + +#[cfg(test)] +mod tests { + use super::{OpId, OpIds}; + use crate::ActorId; + use proptest::prelude::*; + + fn gen_opid(actors: Vec) -> impl Strategy { + (0..actors.len()).prop_flat_map(|actor_idx| { + (Just(actor_idx), 0..(u32::MAX as u64)) + .prop_map(|(actor_idx, counter)| OpId::new(counter, actor_idx)) + }) + } + + fn scenario(size: std::ops::Range) -> impl Strategy, Vec)> { + let actors = vec![ + "aaaa".try_into().unwrap(), + "cccc".try_into().unwrap(), + "bbbb".try_into().unwrap(), + ]; + proptest::collection::vec(gen_opid(actors.clone()), size) + .prop_map(move |opids| (actors.clone(), opids)) + } + + fn duplicate_unsorted_scenario() -> impl Strategy, Vec)> { + scenario(1..100).prop_map(|(actors, mut opids)| { + let mut sorted_opids = opids.clone(); + sorted_opids.sort_by(|left, right| cmp(&actors, left, right)); + sorted_opids.dedup(); + // Unwrap is okay due to the size we pass to `scenario()` + let last = *sorted_opids.last().unwrap(); + if sorted_opids == opids { + // Opids are sorted and deduplicated, just copy the last opid and insert it at the + // front + opids.insert(0, last); + } + (actors, opids) + }) + } + + proptest! { + #[test] + fn test_sorted_opids((actors, opids) in scenario(0..100)) { + let mut sorted_opids = OpIds::default(); + for opid in &opids { + sorted_opids.add(*opid, |left, right| cmp(&actors, left, right)); + } + let result = sorted_opids.into_iter().cloned().collect::>(); + let mut expected = opids; + expected.sort_by(|left, right| cmp(&actors, left, right)); + expected.dedup(); + assert_eq!(result, expected); + } + + #[test] + fn test_new_if_sorted((actors, opids) in duplicate_unsorted_scenario()) { + let mut expected = opids.clone(); + assert_eq!(OpIds::new_if_sorted(opids, |left, right| cmp(&actors, left, right)), None); + expected.sort_by(|left, right| cmp(&actors, left, right)); + expected.dedup(); + let result = OpIds::new_if_sorted(expected.clone(), |left, right| cmp(&actors, left, right)).unwrap().into_iter().cloned().collect::>(); + assert_eq!(result, expected) + } + } + + fn cmp(actors: &[ActorId], left: &OpId, right: &OpId) -> std::cmp::Ordering { + use std::cmp::Ordering; + match (left, right) { + (OpId(0, _), OpId(0, _)) => Ordering::Equal, + (OpId(0, _), OpId(_, _)) => Ordering::Less, + (OpId(_, _), OpId(0, _)) => Ordering::Greater, + (OpId(a, x), OpId(b, y)) if a == b => actors[*x as usize].cmp(&actors[*y as usize]), + (OpId(a, _), OpId(b, _)) => a.cmp(b), + } + } +} diff --git a/rust/automerge/src/value.rs b/rust/automerge/src/value.rs new file mode 100644 index 00000000..be128787 --- /dev/null +++ b/rust/automerge/src/value.rs @@ -0,0 +1,748 @@ +use crate::error; +use crate::types::ObjType; +use serde::{Deserialize, Serialize, Serializer}; +use smol_str::SmolStr; +use std::borrow::Cow; +use std::fmt; + +/// The type of values in an automerge document +#[derive(Debug, Clone, PartialEq)] +pub enum Value<'a> { + /// An composite object of type `ObjType` + Object(ObjType), + /// A non composite value + // TODO: if we don't have to store this in patches any more then it might be able to be just a + // &'a ScalarValue rather than a Cow + Scalar(Cow<'a, ScalarValue>), +} + +impl<'a> Value<'a> { + pub fn map() -> Value<'a> { + Value::Object(ObjType::Map) + } + + pub fn list() -> Value<'a> { + Value::Object(ObjType::List) + } + + pub fn text() -> Value<'a> { + Value::Object(ObjType::Text) + } + + pub fn table() -> Value<'a> { + Value::Object(ObjType::Table) + } + + pub fn str(s: &str) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::Str(s.into()))) + } + + pub fn int(n: i64) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::Int(n))) + } + + pub fn uint(n: u64) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::Uint(n))) + } + + pub fn counter(n: i64) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::counter(n))) + } + + pub fn timestamp(n: i64) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::Timestamp(n))) + } + + pub fn f64(n: f64) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::F64(n))) + } + + pub fn bytes(b: Vec) -> Value<'a> { + Value::Scalar(Cow::Owned(ScalarValue::Bytes(b))) + } + + pub fn is_object(&self) -> bool { + matches!(&self, Value::Object(_)) + } + + pub fn is_scalar(&self) -> bool { + matches!(&self, Value::Scalar(_)) + } + + pub fn is_bytes(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_bytes() + } else { + false + } + } + + pub fn is_str(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_str() + } else { + false + } + } + + pub fn is_int(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_int() + } else { + false + } + } + + pub fn is_uint(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_uint() + } else { + false + } + } + + pub fn is_f64(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_f64() + } else { + false + } + } + + pub fn is_counter(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_counter() + } else { + false + } + } + + pub fn is_timestamp(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_timestamp() + } else { + false + } + } + + pub fn is_boolean(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_boolean() + } else { + false + } + } + + pub fn is_null(&self) -> bool { + if let Self::Scalar(s) = self { + s.is_null() + } else { + false + } + } + + pub fn into_scalar(self) -> Result { + match self { + Self::Scalar(s) => Ok(s.into_owned()), + _ => Err(self), + } + } + + pub fn to_scalar(&self) -> Option<&ScalarValue> { + match self { + Self::Scalar(s) => Some(s), + _ => None, + } + } + + pub fn to_objtype(&self) -> Option { + match self { + Self::Object(o) => Some(*o), + _ => None, + } + } + + pub fn into_owned(self) -> Value<'static> { + match self { + Value::Object(o) => Value::Object(o), + Value::Scalar(Cow::Owned(s)) => Value::Scalar(Cow::Owned(s)), + Value::Scalar(Cow::Borrowed(s)) => Value::Scalar(Cow::Owned((*s).clone())), + } + } + + pub fn to_owned(&self) -> Value<'static> { + match self { + Value::Object(o) => Value::Object(*o), + Value::Scalar(Cow::Owned(s)) => Value::Scalar(Cow::Owned(s.clone())), + Value::Scalar(Cow::Borrowed(s)) => Value::Scalar(Cow::Owned((*s).clone())), + } + } + + pub fn into_bytes(self) -> Result, Self> { + match self { + Value::Scalar(s) => s + .into_owned() + .into_bytes() + .map_err(|v| Value::Scalar(Cow::Owned(v))), + _ => Err(self), + } + } + + pub fn to_bytes(&self) -> Option<&[u8]> { + match self { + Value::Scalar(s) => s.to_bytes(), + _ => None, + } + } + + pub fn into_string(self) -> Result { + match self { + Value::Scalar(s) => s + .into_owned() + .into_string() + .map_err(|v| Value::Scalar(Cow::Owned(v))), + _ => Err(self), + } + } + + pub fn to_str(&self) -> Option<&str> { + match self { + Value::Scalar(val) => val.to_str(), + _ => None, + } + } + + /// If this value can be coerced to an i64, return the i64 value + pub fn to_i64(&self) -> Option { + match self { + Value::Scalar(s) => s.to_i64(), + _ => None, + } + } + + pub fn to_u64(&self) -> Option { + match self { + Value::Scalar(s) => s.to_u64(), + _ => None, + } + } + + pub fn to_f64(&self) -> Option { + match self { + Value::Scalar(s) => s.to_f64(), + _ => None, + } + } + + pub fn to_bool(&self) -> Option { + match self { + Value::Scalar(s) => s.to_bool(), + _ => None, + } + } +} + +impl<'a> fmt::Display for Value<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Value::Object(o) => write!(f, "Object: {}", o), + Value::Scalar(s) => write!(f, "Scalar: {}", s), + } + } +} + +impl<'a> From<&str> for Value<'a> { + fn from(s: &str) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Str(s.into()))) + } +} + +impl<'a> From<&String> for Value<'a> { + fn from(s: &String) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Str(s.into()))) + } +} + +impl<'a> From for Value<'a> { + fn from(s: String) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Str(s.into()))) + } +} + +impl<'a> From for Value<'a> { + fn from(s: SmolStr) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Str(s))) + } +} + +impl<'a> From for Value<'a> { + fn from(c: char) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Str(SmolStr::new(c.to_string())))) + } +} + +impl<'a> From> for Value<'a> { + fn from(v: Vec) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Bytes(v))) + } +} + +impl<'a> From for Value<'a> { + fn from(n: f64) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::F64(n))) + } +} + +impl<'a> From for Value<'a> { + fn from(n: i64) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Int(n))) + } +} + +impl<'a> From for Value<'a> { + fn from(n: i32) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Int(n.into()))) + } +} + +impl<'a> From for Value<'a> { + fn from(n: u32) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Uint(n.into()))) + } +} + +impl<'a> From for Value<'a> { + fn from(n: u64) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Uint(n))) + } +} + +impl<'a> From for Value<'a> { + fn from(v: bool) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Boolean(v))) + } +} + +impl<'a> From<()> for Value<'a> { + fn from(_: ()) -> Self { + Value::Scalar(Cow::Owned(ScalarValue::Null)) + } +} + +impl<'a> From for Value<'a> { + fn from(o: ObjType) -> Self { + Value::Object(o) + } +} + +impl<'a> From for Value<'a> { + fn from(v: ScalarValue) -> Self { + Value::Scalar(Cow::Owned(v)) + } +} + +#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)] +pub(crate) enum DataType { + #[serde(rename = "counter")] + Counter, + #[serde(rename = "timestamp")] + Timestamp, + #[serde(rename = "bytes")] + Bytes, + #[serde(rename = "uint")] + Uint, + #[serde(rename = "int")] + Int, + #[serde(rename = "float64")] + F64, + #[serde(rename = "undefined")] + Undefined, +} + +#[derive(Debug, Clone)] +pub struct Counter { + pub(crate) start: i64, + pub(crate) current: i64, + pub(crate) increments: usize, +} + +impl Counter { + pub(crate) fn increment>(&mut self, increments: I) { + for inc in increments { + self.current += inc; + self.increments += 1; + } + } +} + +impl Serialize for Counter { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_i64(self.current) + } +} + +impl fmt::Display for Counter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", &self.current) + } +} + +impl From for Counter { + fn from(n: i64) -> Self { + Counter { + start: n, + current: n, + increments: 0, + } + } +} + +impl From<&i64> for Counter { + fn from(n: &i64) -> Self { + Counter { + start: *n, + current: *n, + increments: 0, + } + } +} + +impl From<&Counter> for i64 { + fn from(val: &Counter) -> Self { + val.current + } +} + +impl From for i64 { + fn from(val: Counter) -> Self { + val.current + } +} + +impl From<&Counter> for u64 { + fn from(val: &Counter) -> Self { + val.current as u64 + } +} + +impl From<&Counter> for f64 { + fn from(val: &Counter) -> Self { + val.current as f64 + } +} + +/// A value which is not a composite value +#[derive(Serialize, PartialEq, Debug, Clone)] +#[serde(untagged)] +pub enum ScalarValue { + Bytes(Vec), + Str(SmolStr), + Int(i64), + Uint(u64), + F64(f64), + Counter(Counter), + Timestamp(i64), + Boolean(bool), + /// A value from a future version of automerge + Unknown { + type_code: u8, + bytes: Vec, + }, + Null, +} + +impl PartialEq for Counter { + fn eq(&self, other: &Self) -> bool { + self.current == other.current + } +} + +impl ScalarValue { + pub(crate) fn as_datatype( + &self, + datatype: DataType, + ) -> Result { + match (datatype, self) { + (DataType::Counter, ScalarValue::Int(i)) => Ok(ScalarValue::Counter(i.into())), + (DataType::Counter, ScalarValue::Uint(u)) => match i64::try_from(*u) { + Ok(i) => Ok(ScalarValue::Counter(i.into())), + Err(_) => Err(error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an integer".to_string(), + unexpected: "an integer larger than i64::max_value".to_string(), + datatype, + }), + }, + (DataType::Bytes, ScalarValue::Bytes(bytes)) => Ok(ScalarValue::Bytes(bytes.clone())), + (DataType::Bytes, v) => Err(error::InvalidScalarValue { + raw_value: self.clone(), + expected: "a vector of bytes".to_string(), + unexpected: v.to_string(), + datatype, + }), + (DataType::Counter, v) => Err(error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an integer".to_string(), + unexpected: v.to_string(), + datatype, + }), + (DataType::Timestamp, ScalarValue::Int(i)) => Ok(ScalarValue::Timestamp(*i)), + (DataType::Timestamp, ScalarValue::Uint(u)) => match i64::try_from(*u) { + Ok(i) => Ok(ScalarValue::Timestamp(i)), + Err(_) => Err(error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an integer".to_string(), + unexpected: "an integer larger than i64::max_value".to_string(), + datatype, + }), + }, + (DataType::Timestamp, v) => Err(error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an integer".to_string(), + unexpected: v.to_string(), + datatype, + }), + (DataType::Int, v) => Ok(ScalarValue::Int(v.to_i64().ok_or( + error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an int".to_string(), + unexpected: v.to_string(), + datatype, + }, + )?)), + (DataType::Uint, v) => Ok(ScalarValue::Uint(v.to_u64().ok_or( + error::InvalidScalarValue { + raw_value: self.clone(), + expected: "a uint".to_string(), + unexpected: v.to_string(), + datatype, + }, + )?)), + (DataType::F64, v) => Ok(ScalarValue::F64(v.to_f64().ok_or( + error::InvalidScalarValue { + raw_value: self.clone(), + expected: "an f64".to_string(), + unexpected: v.to_string(), + datatype, + }, + )?)), + (DataType::Undefined, _) => Ok(self.clone()), + } + } + + /// Returns an Option containing a `DataType` if + /// `self` represents a numerical scalar value + /// This is necessary b/c numerical values are not self-describing + /// (unlike strings / bytes / etc. ) + pub(crate) fn as_numerical_datatype(&self) -> Option { + match self { + ScalarValue::Counter(..) => Some(DataType::Counter), + ScalarValue::Timestamp(..) => Some(DataType::Timestamp), + ScalarValue::Int(..) => Some(DataType::Int), + ScalarValue::Uint(..) => Some(DataType::Uint), + ScalarValue::F64(..) => Some(DataType::F64), + _ => None, + } + } + + pub fn is_bytes(&self) -> bool { + matches!(self, Self::Bytes(_)) + } + + pub fn is_str(&self) -> bool { + matches!(self, Self::Str(_)) + } + + pub fn is_int(&self) -> bool { + matches!(self, Self::Int(_)) + } + + pub fn is_uint(&self) -> bool { + matches!(self, Self::Uint(_)) + } + + pub fn is_f64(&self) -> bool { + matches!(self, Self::F64(_)) + } + + pub fn is_counter(&self) -> bool { + matches!(self, Self::Counter(_)) + } + + pub fn is_timestamp(&self) -> bool { + matches!(self, Self::Timestamp(_)) + } + + pub fn is_boolean(&self) -> bool { + matches!(self, Self::Boolean(_)) + } + + pub fn is_null(&self) -> bool { + matches!(self, Self::Null) + } + + pub fn into_bytes(self) -> Result, Self> { + match self { + ScalarValue::Bytes(b) => Ok(b), + _ => Err(self), + } + } + + pub fn to_bytes(&self) -> Option<&[u8]> { + match self { + ScalarValue::Bytes(b) => Some(b), + _ => None, + } + } + + pub fn into_string(self) -> Result { + match self { + ScalarValue::Str(s) => Ok(s.to_string()), + _ => Err(self), + } + } + + pub fn to_str(&self) -> Option<&str> { + match self { + ScalarValue::Str(s) => Some(s), + _ => None, + } + } + + /// If this value can be coerced to an i64, return the i64 value + pub fn to_i64(&self) -> Option { + match self { + ScalarValue::Int(n) => Some(*n), + ScalarValue::Uint(n) => Some(*n as i64), + ScalarValue::F64(n) => Some(*n as i64), + ScalarValue::Counter(n) => Some(n.into()), + ScalarValue::Timestamp(n) => Some(*n), + _ => None, + } + } + + pub fn to_u64(&self) -> Option { + match self { + ScalarValue::Int(n) => Some(*n as u64), + ScalarValue::Uint(n) => Some(*n), + ScalarValue::F64(n) => Some(*n as u64), + ScalarValue::Counter(n) => Some(n.into()), + ScalarValue::Timestamp(n) => Some(*n as u64), + _ => None, + } + } + + pub fn to_f64(&self) -> Option { + match self { + ScalarValue::Int(n) => Some(*n as f64), + ScalarValue::Uint(n) => Some(*n as f64), + ScalarValue::F64(n) => Some(*n), + ScalarValue::Counter(n) => Some(n.into()), + ScalarValue::Timestamp(n) => Some(*n as f64), + _ => None, + } + } + + pub fn to_bool(&self) -> Option { + match self { + ScalarValue::Boolean(b) => Some(*b), + _ => None, + } + } + + pub fn counter(n: i64) -> ScalarValue { + ScalarValue::Counter(n.into()) + } +} + +impl From<&str> for ScalarValue { + fn from(s: &str) -> Self { + ScalarValue::Str(s.into()) + } +} + +impl From<&String> for ScalarValue { + fn from(s: &String) -> Self { + ScalarValue::Str(s.into()) + } +} + +impl From for ScalarValue { + fn from(s: String) -> Self { + ScalarValue::Str(s.into()) + } +} + +impl From> for ScalarValue { + fn from(b: Vec) -> Self { + ScalarValue::Bytes(b) + } +} + +impl From for ScalarValue { + fn from(n: i64) -> Self { + ScalarValue::Int(n) + } +} + +impl From for ScalarValue { + fn from(n: f64) -> Self { + ScalarValue::F64(n) + } +} + +impl From for ScalarValue { + fn from(n: u64) -> Self { + ScalarValue::Uint(n) + } +} + +impl From for ScalarValue { + fn from(n: u32) -> Self { + ScalarValue::Uint(n.into()) + } +} + +impl From for ScalarValue { + fn from(n: i32) -> Self { + ScalarValue::Int(n as i64) + } +} + +impl From for ScalarValue { + fn from(b: bool) -> Self { + ScalarValue::Boolean(b) + } +} + +impl From<()> for ScalarValue { + fn from(_: ()) -> Self { + ScalarValue::Null + } +} + +impl From for ScalarValue { + fn from(c: char) -> Self { + ScalarValue::Str(SmolStr::new(c.to_string())) + } +} + +impl fmt::Display for ScalarValue { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ScalarValue::Bytes(b) => write!(f, "\"{:?}\"", b), + ScalarValue::Str(s) => write!(f, "\"{}\"", s), + ScalarValue::Int(i) => write!(f, "{}", i), + ScalarValue::Uint(i) => write!(f, "{}", i), + ScalarValue::F64(n) => write!(f, "{:.324}", n), + ScalarValue::Counter(c) => write!(f, "Counter: {}", c), + ScalarValue::Timestamp(i) => write!(f, "Timestamp: {}", i), + ScalarValue::Boolean(b) => write!(f, "{}", b), + ScalarValue::Null => write!(f, "null"), + ScalarValue::Unknown { type_code, .. } => write!(f, "unknown type {}", type_code), + } + } +} diff --git a/rust/automerge/src/values.rs b/rust/automerge/src/values.rs new file mode 100644 index 00000000..15ccb4cb --- /dev/null +++ b/rust/automerge/src/values.rs @@ -0,0 +1,57 @@ +use crate::exid::ExId; +use crate::{Automerge, Value}; +use std::fmt; + +/// An iterator over the values in an object +/// +/// This is returned by the [`crate::ReadDoc::values`] and [`crate::ReadDoc::values_at`] methods +pub struct Values<'a> { + range: Box>, + doc: &'a Automerge, +} + +impl<'a> fmt::Debug for Values<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Values").finish() + } +} + +pub(crate) trait ValueIter<'a> { + fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)>; +} + +pub(crate) struct NoValues {} + +impl<'a> ValueIter<'a> for NoValues { + fn next_value(&mut self, _doc: &'a Automerge) -> Option<(Value<'a>, ExId)> { + None + } +} + +impl<'a> Values<'a> { + pub(crate) fn new>(doc: &'a Automerge, range: Option) -> Self { + if let Some(range) = range { + Self { + range: Box::new(range), + doc, + } + } else { + Self::empty(doc) + } + } + + pub(crate) fn empty(doc: &'a Automerge) -> Self { + Self { + range: Box::new(NoValues {}), + doc, + } + } +} + +impl<'a> Iterator for Values<'a> { + type Item = (Value<'a>, ExId); + + fn next(&mut self) -> Option { + self.range.next_value(self.doc) + } +} diff --git a/rust/automerge/src/visualisation.rs b/rust/automerge/src/visualisation.rs new file mode 100644 index 00000000..31e9bbdb --- /dev/null +++ b/rust/automerge/src/visualisation.rs @@ -0,0 +1,280 @@ +use crate::types::{ObjId, Op}; +use fxhash::FxHasher; +use std::{borrow::Cow, collections::HashMap, hash::BuildHasherDefault}; + +use rand::Rng; + +#[derive(Copy, Clone, PartialEq, Hash, Eq)] +pub(crate) struct NodeId(u64); + +impl Default for NodeId { + fn default() -> Self { + let mut rng = rand::thread_rng(); + let u = rng.gen(); + NodeId(u) + } +} + +#[derive(Clone)] +pub(crate) struct Node<'a> { + id: NodeId, + children: Vec, + node_type: NodeType<'a>, + metadata: &'a crate::op_set::OpSetMetadata, +} + +#[derive(Clone)] +pub(crate) enum NodeType<'a> { + ObjRoot(crate::types::ObjId), + ObjTreeNode(ObjId, &'a crate::op_tree::OpTreeNode, &'a [Op]), +} + +#[derive(Clone)] +pub(crate) struct Edge { + parent_id: NodeId, + child_id: NodeId, +} + +pub(crate) struct GraphVisualisation<'a> { + nodes: HashMap>, + actor_shorthands: HashMap, +} + +impl<'a> GraphVisualisation<'a> { + pub(super) fn construct( + trees: &'a HashMap< + crate::types::ObjId, + crate::op_tree::OpTree, + BuildHasherDefault, + >, + metadata: &'a crate::op_set::OpSetMetadata, + ) -> GraphVisualisation<'a> { + let mut nodes = HashMap::new(); + for (obj_id, tree) in trees { + if let Some(root_node) = &tree.internal.root_node { + let tree_id = Self::construct_nodes( + root_node, + &tree.internal.ops, + obj_id, + &mut nodes, + metadata, + ); + let obj_tree_id = NodeId::default(); + nodes.insert( + obj_tree_id, + Node { + id: obj_tree_id, + children: vec![tree_id], + node_type: NodeType::ObjRoot(*obj_id), + metadata, + }, + ); + } + } + let mut actor_shorthands = HashMap::new(); + for actor in 0..metadata.actors.len() { + actor_shorthands.insert(actor, format!("actor{}", actor)); + } + GraphVisualisation { + nodes, + actor_shorthands, + } + } + + fn construct_nodes( + node: &'a crate::op_tree::OpTreeNode, + ops: &'a [Op], + objid: &ObjId, + nodes: &mut HashMap>, + m: &'a crate::op_set::OpSetMetadata, + ) -> NodeId { + let node_id = NodeId::default(); + let mut child_ids = Vec::new(); + for child in &node.children { + let child_id = Self::construct_nodes(child, ops, objid, nodes, m); + child_ids.push(child_id); + } + nodes.insert( + node_id, + Node { + id: node_id, + children: child_ids, + node_type: NodeType::ObjTreeNode(*objid, node, ops), + metadata: m, + }, + ); + node_id + } +} + +impl<'a> dot::GraphWalk<'a, &'a Node<'a>, Edge> for GraphVisualisation<'a> { + fn nodes(&'a self) -> dot::Nodes<'a, &'a Node<'a>> { + Cow::Owned(self.nodes.values().collect::>()) + } + + fn edges(&'a self) -> dot::Edges<'a, Edge> { + let mut edges = Vec::new(); + for node in self.nodes.values() { + for child in &node.children { + edges.push(Edge { + parent_id: node.id, + child_id: *child, + }); + } + } + Cow::Owned(edges) + } + + fn source(&'a self, edge: &Edge) -> &'a Node<'a> { + self.nodes.get(&edge.parent_id).unwrap() + } + + fn target(&'a self, edge: &Edge) -> &'a Node<'a> { + self.nodes.get(&edge.child_id).unwrap() + } +} + +impl<'a> dot::Labeller<'a, &'a Node<'a>, Edge> for GraphVisualisation<'a> { + fn graph_id(&'a self) -> dot::Id<'a> { + dot::Id::new("OpSet").unwrap() + } + + fn node_id(&'a self, n: &&Node<'a>) -> dot::Id<'a> { + dot::Id::new(format!("node_{}", n.id.0)).unwrap() + } + + fn node_shape(&'a self, node: &&'a Node<'a>) -> Option> { + let shape = match node.node_type { + NodeType::ObjTreeNode(_, _, _) => dot::LabelText::label("none"), + NodeType::ObjRoot(_) => dot::LabelText::label("ellipse"), + }; + Some(shape) + } + + fn node_label(&'a self, n: &&Node<'a>) -> dot::LabelText<'a> { + match n.node_type { + NodeType::ObjTreeNode(objid, tree_node, ops) => dot::LabelText::HtmlStr( + OpTable::create(tree_node, ops, &objid, n.metadata, &self.actor_shorthands) + .to_html() + .into(), + ), + NodeType::ObjRoot(objid) => { + dot::LabelText::label(print_opid(&objid.0, &self.actor_shorthands)) + } + } + } +} + +struct OpTable { + rows: Vec, +} + +impl OpTable { + fn create<'a>( + node: &'a crate::op_tree::OpTreeNode, + ops: &'a [Op], + obj: &ObjId, + metadata: &crate::op_set::OpSetMetadata, + actor_shorthands: &HashMap, + ) -> Self { + let rows = node + .elements + .iter() + .map(|e| OpTableRow::create(&ops[*e], obj, metadata, actor_shorthands)) + .collect(); + OpTable { rows } + } + + fn to_html(&self) -> String { + let rows = self + .rows + .iter() + .map(|r| r.to_html()) + .collect::>() + .join(""); + format!( + "\ + \ + \ + \ + \ + \ + \ + \ + \ +
\ + {}\ +
opobjpropactionsuccpred
", + rows + ) + } +} + +struct OpTableRow { + obj_id: String, + op_id: String, + prop: String, + op_description: String, + succ: String, + pred: String, +} + +impl OpTableRow { + fn to_html(&self) -> String { + let rows = [ + &self.op_id, + &self.obj_id, + &self.prop, + &self.op_description, + &self.succ, + &self.pred, + ]; + let row = rows + .iter() + .map(|r| format!("{}", &r)) + .collect::(); + format!("{}", row) + } +} + +impl OpTableRow { + fn create( + op: &super::types::Op, + obj: &ObjId, + metadata: &crate::op_set::OpSetMetadata, + actor_shorthands: &HashMap, + ) -> Self { + let op_description = match &op.action { + crate::OpType::Delete => "del".to_string(), + crate::OpType::Put(v) => format!("set {}", v), + crate::OpType::Make(obj) => format!("make {}", obj), + crate::OpType::Increment(v) => format!("inc {}", v), + }; + let prop = match op.key { + crate::types::Key::Map(k) => metadata.props[k].clone(), + crate::types::Key::Seq(e) => print_opid(&e.0, actor_shorthands), + }; + let succ = op + .succ + .iter() + .map(|s| format!(",{}", print_opid(s, actor_shorthands))) + .collect(); + let pred = op + .pred + .iter() + .map(|s| format!(",{}", print_opid(s, actor_shorthands))) + .collect(); + OpTableRow { + op_description, + obj_id: print_opid(&obj.0, actor_shorthands), + op_id: print_opid(&op.id, actor_shorthands), + prop, + succ, + pred, + } + } +} + +fn print_opid(opid: &crate::types::OpId, actor_shorthands: &HashMap) -> String { + format!("{}@{}", opid.counter(), actor_shorthands[&opid.actor()]) +} diff --git a/rust/automerge/tests/fixtures/64bit_obj_id_change.automerge b/rust/automerge/tests/fixtures/64bit_obj_id_change.automerge new file mode 100644 index 00000000..700342a2 Binary files /dev/null and b/rust/automerge/tests/fixtures/64bit_obj_id_change.automerge differ diff --git a/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge b/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge new file mode 100644 index 00000000..6beb57fe Binary files /dev/null and b/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge differ diff --git a/rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge b/rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge new file mode 100644 index 00000000..2290b446 Binary files /dev/null and b/rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge differ diff --git a/rust/automerge/tests/fixtures/counter_value_is_ok.automerge b/rust/automerge/tests/fixtures/counter_value_is_ok.automerge new file mode 100644 index 00000000..fdc59896 Binary files /dev/null and b/rust/automerge/tests/fixtures/counter_value_is_ok.automerge differ diff --git a/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge b/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge new file mode 100644 index 00000000..831346f7 Binary files /dev/null and b/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge differ diff --git a/rust/automerge/tests/fixtures/two_change_chunks.automerge b/rust/automerge/tests/fixtures/two_change_chunks.automerge new file mode 100644 index 00000000..1a84b363 Binary files /dev/null and b/rust/automerge/tests/fixtures/two_change_chunks.automerge differ diff --git a/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge b/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge new file mode 100644 index 00000000..9e3f305f Binary files /dev/null and b/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge differ diff --git a/rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge b/rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge new file mode 100644 index 00000000..9ba0355f Binary files /dev/null and b/rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/action-is-48.automerge b/rust/automerge/tests/fuzz-crashers/action-is-48.automerge new file mode 100644 index 00000000..16e6f719 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/action-is-48.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 b/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 new file mode 100644 index 00000000..bcb12cdd Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 differ diff --git a/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge b/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge new file mode 100644 index 00000000..05cc2c82 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge b/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge new file mode 100644 index 00000000..21e869eb Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_actor.automerge b/rust/automerge/tests/fuzz-crashers/missing_actor.automerge new file mode 100644 index 00000000..cc8c61b1 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/missing_actor.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps.automerge new file mode 100644 index 00000000..8a57a0f4 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/missing_deps.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge new file mode 100644 index 00000000..2c7b123b Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge new file mode 100644 index 00000000..2fe439af Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge b/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge new file mode 100644 index 00000000..45771f34 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge b/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge new file mode 100644 index 00000000..657ce993 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge differ diff --git a/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge b/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge new file mode 100644 index 00000000..661258b0 Binary files /dev/null and b/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge differ diff --git a/rust/automerge/tests/test.rs b/rust/automerge/tests/test.rs new file mode 100644 index 00000000..3be6725e --- /dev/null +++ b/rust/automerge/tests/test.rs @@ -0,0 +1,1499 @@ +use automerge::transaction::Transactable; +use automerge::{ + ActorId, AutoCommit, Automerge, AutomergeError, Change, ExpandedChange, ObjType, ReadDoc, + ScalarValue, VecOpObserver, ROOT, +}; +use std::fs; + +// set up logging for all the tests +//use test_log::test; + +#[allow(unused_imports)] +use automerge_test::{ + assert_doc, assert_obj, list, map, mk_counter, new_doc, new_doc_with_actor, pretty_print, + realize, realize_obj, sorted_actors, RealizedObject, +}; +use pretty_assertions::assert_eq; + +#[test] +fn no_conflict_on_repeated_assignment() { + let mut doc = AutoCommit::new(); + doc.put(&automerge::ROOT, "foo", 1).unwrap(); + doc.put(&automerge::ROOT, "foo", 2).unwrap(); + assert_doc!( + &doc, + map! { + "foo" => { 2 }, + } + ); +} + +#[test] +fn repeated_map_assignment_which_resolves_conflict_not_ignored() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "field", 123).unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc2.put(&automerge::ROOT, "field", 456).unwrap(); + doc1.put(&automerge::ROOT, "field", 789).unwrap(); + doc1.merge(&mut doc2).unwrap(); + assert_eq!(doc1.get_all(&automerge::ROOT, "field").unwrap().len(), 2); + + doc1.put(&automerge::ROOT, "field", 123).unwrap(); + assert_doc!( + &doc1, + map! { + "field" => { 123 } + } + ); +} + +#[test] +fn repeated_list_assignment_which_resolves_conflict_not_ignored() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let list_id = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc1.insert(&list_id, 0, 123).unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc2.put(&list_id, 0, 456).unwrap(); + doc1.merge(&mut doc2).unwrap(); + doc1.put(&list_id, 0, 789).unwrap(); + + assert_doc!( + &doc1, + map! { + "list" => { + list![ + { 789 }, + ] + } + } + ); +} + +#[test] +fn list_deletion() { + let mut doc = new_doc(); + let list_id = doc + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc.insert(&list_id, 0, 123).unwrap(); + doc.insert(&list_id, 1, 456).unwrap(); + doc.insert(&list_id, 2, 789).unwrap(); + doc.delete(&list_id, 1).unwrap(); + assert_doc!( + &doc, + map! { + "list" => { list![ + { 123 }, + { 789 }, + ]} + } + ) +} + +#[test] +fn merge_concurrent_map_prop_updates() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "foo", "bar").unwrap(); + doc2.put(&automerge::ROOT, "hello", "world").unwrap(); + doc1.merge(&mut doc2).unwrap(); + assert_eq!( + doc1.get(&automerge::ROOT, "foo").unwrap().unwrap().0, + "bar".into() + ); + assert_doc!( + &doc1, + map! { + "foo" => { "bar" }, + "hello" => { "world" }, + } + ); + doc2.merge(&mut doc1).unwrap(); + assert_doc!( + &doc2, + map! { + "foo" => { "bar" }, + "hello" => { "world" }, + } + ); + assert_eq!(realize(doc1.document()), realize(doc2.document())); +} + +#[test] +fn add_concurrent_increments_of_same_property() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "counter", mk_counter(0)) + .unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc1.increment(&automerge::ROOT, "counter", 1).unwrap(); + doc2.increment(&automerge::ROOT, "counter", 2).unwrap(); + doc1.merge(&mut doc2).unwrap(); + assert_doc!( + &doc1, + map! { + "counter" => { + mk_counter(3) + } + } + ); +} + +#[test] +fn add_increments_only_to_preceeded_values() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + + doc1.put(&automerge::ROOT, "counter", mk_counter(0)) + .unwrap(); + doc1.increment(&automerge::ROOT, "counter", 1).unwrap(); + + // create a counter in doc2 + doc2.put(&automerge::ROOT, "counter", mk_counter(0)) + .unwrap(); + doc2.increment(&automerge::ROOT, "counter", 3).unwrap(); + + // The two values should be conflicting rather than added + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "counter" => { + mk_counter(1), + mk_counter(3), + } + } + ); +} + +#[test] +fn concurrent_updates_of_same_field() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "field", "one").unwrap(); + doc2.put(&automerge::ROOT, "field", "two").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "field" => { + "one", + "two", + } + } + ); +} + +#[test] +fn concurrent_updates_of_same_list_element() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let list_id = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::List) + .unwrap(); + doc1.insert(&list_id, 0, "finch").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc1.put(&list_id, 0, "greenfinch").unwrap(); + doc2.put(&list_id, 0, "goldfinch").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => { + list![{ + "greenfinch", + "goldfinch", + }] + } + } + ); +} + +#[test] +fn assignment_conflicts_of_different_types() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let mut doc3 = new_doc(); + doc1.put(&automerge::ROOT, "field", "string").unwrap(); + doc2.put_object(&automerge::ROOT, "field", ObjType::List) + .unwrap(); + doc3.put_object(&automerge::ROOT, "field", ObjType::Map) + .unwrap(); + doc1.merge(&mut doc2).unwrap(); + doc1.merge(&mut doc3).unwrap(); + + assert_doc!( + &doc1, + map! { + "field" => { + "string", + list!{}, + map!{}, + } + } + ); +} + +#[test] +fn changes_within_conflicting_map_field() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "field", "string").unwrap(); + let map_id = doc2 + .put_object(&automerge::ROOT, "field", ObjType::Map) + .unwrap(); + doc2.put(&map_id, "innerKey", 42).unwrap(); + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "field" => { + "string", + map!{ + "innerKey" => { + 42, + } + } + } + } + ); +} + +#[test] +fn changes_within_conflicting_list_element() { + let (actor1, actor2) = sorted_actors(); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + let list_id = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc1.insert(&list_id, 0, "hello").unwrap(); + doc2.merge(&mut doc1).unwrap(); + + let map_in_doc1 = doc1.put_object(&list_id, 0, ObjType::Map).unwrap(); + doc1.put(&map_in_doc1, "map1", true).unwrap(); + doc1.put(&map_in_doc1, "key", 1).unwrap(); + + let map_in_doc2 = doc2.put_object(&list_id, 0, ObjType::Map).unwrap(); + doc1.merge(&mut doc2).unwrap(); + doc2.put(&map_in_doc2, "map2", true).unwrap(); + doc2.put(&map_in_doc2, "key", 2).unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "list" => { + list![ + { + map!{ + "map2" => { true }, + "key" => { 2 }, + }, + map!{ + "key" => { 1 }, + "map1" => { true }, + } + } + ] + } + } + ); +} + +#[test] +fn concurrently_assigned_nested_maps_should_not_merge() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + + let doc1_map_id = doc1 + .put_object(&automerge::ROOT, "config", ObjType::Map) + .unwrap(); + doc1.put(&doc1_map_id, "background", "blue").unwrap(); + + let doc2_map_id = doc2 + .put_object(&automerge::ROOT, "config", ObjType::Map) + .unwrap(); + doc2.put(&doc2_map_id, "logo_url", "logo.png").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "config" => { + map!{ + "background" => {"blue"} + }, + map!{ + "logo_url" => {"logo.png"} + } + } + } + ); +} + +#[test] +fn concurrent_insertions_at_different_list_positions() { + let (actor1, actor2) = sorted_actors(); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + assert!(doc1.get_actor() < doc2.get_actor()); + + let list_id = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + + doc1.insert(&list_id, 0, "one").unwrap(); + doc1.insert(&list_id, 1, "three").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc1.splice(&list_id, 1, 0, vec!["two".into()]).unwrap(); + doc2.insert(&list_id, 2, "four").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "list" => { + list![ + {"one"}, + {"two"}, + {"three"}, + {"four"}, + ] + } + } + ); +} + +#[test] +fn concurrent_insertions_at_same_list_position() { + let (actor1, actor2) = sorted_actors(); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + assert!(doc1.get_actor() < doc2.get_actor()); + + let list_id = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::List) + .unwrap(); + doc1.insert(&list_id, 0, "parakeet").unwrap(); + + doc2.merge(&mut doc1).unwrap(); + doc1.insert(&list_id, 1, "starling").unwrap(); + doc2.insert(&list_id, 1, "chaffinch").unwrap(); + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => { + list![ + { + "parakeet", + }, + { + "chaffinch", + }, + { + "starling", + }, + ] + }, + } + ); +} + +#[test] +fn concurrent_assignment_and_deletion_of_a_map_entry() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + doc1.put(&automerge::ROOT, "bestBird", "robin").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc1.delete(&automerge::ROOT, "bestBird").unwrap(); + doc2.put(&automerge::ROOT, "bestBird", "magpie").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "bestBird" => { + "magpie", + } + } + ); +} + +#[test] +fn concurrent_assignment_and_deletion_of_list_entry() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let list_id = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::List) + .unwrap(); + doc1.insert(&list_id, 0, "blackbird").unwrap(); + doc1.insert(&list_id, 1, "thrush").unwrap(); + doc1.insert(&list_id, 2, "goldfinch").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc1.put(&list_id, 1, "starling").unwrap(); + doc2.delete(&list_id, 1).unwrap(); + + assert_doc!( + &doc2, + map! { + "birds" => {list![ + {"blackbird"}, + {"goldfinch"}, + ]} + } + ); + + assert_doc!( + &doc1, + map! { + "birds" => {list![ + { "blackbird" }, + { "starling" }, + { "goldfinch" }, + ]} + } + ); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => {list![ + { "blackbird" }, + { "starling" }, + { "goldfinch" }, + ]} + } + ); +} + +#[test] +fn insertion_after_a_deleted_list_element() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let list_id = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::List) + .unwrap(); + + doc1.insert(&list_id, 0, "blackbird").unwrap(); + doc1.insert(&list_id, 1, "thrush").unwrap(); + doc1.insert(&list_id, 2, "goldfinch").unwrap(); + + doc2.merge(&mut doc1).unwrap(); + + doc1.splice(&list_id, 1, 2, Vec::new()).unwrap(); + + doc2.splice(&list_id, 2, 0, vec!["starling".into()]) + .unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => {list![ + { "blackbird" }, + { "starling" } + ]} + } + ); + + doc2.merge(&mut doc1).unwrap(); + assert_doc!( + &doc2, + map! { + "birds" => {list![ + { "blackbird" }, + { "starling" } + ]} + } + ); +} + +#[test] +fn concurrent_deletion_of_same_list_element() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + let list_id = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::List) + .unwrap(); + + doc1.insert(&list_id, 0, "albatross").unwrap(); + doc1.insert(&list_id, 1, "buzzard").unwrap(); + doc1.insert(&list_id, 2, "cormorant").unwrap(); + + doc2.merge(&mut doc1).unwrap(); + + doc1.delete(&list_id, 1).unwrap(); + + doc2.delete(&list_id, 1).unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => {list![ + { "albatross" }, + { "cormorant" } + ]} + } + ); + + doc2.merge(&mut doc1).unwrap(); + assert_doc!( + &doc2, + map! { + "birds" => {list![ + { "albatross" }, + { "cormorant" } + ]} + } + ); +} + +#[test] +fn concurrent_updates_at_different_levels() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + + let animals = doc1 + .put_object(&automerge::ROOT, "animals", ObjType::Map) + .unwrap(); + let birds = doc1.put_object(&animals, "birds", ObjType::Map).unwrap(); + doc1.put(&birds, "pink", "flamingo").unwrap(); + doc1.put(&birds, "black", "starling").unwrap(); + + let mammals = doc1.put_object(&animals, "mammals", ObjType::List).unwrap(); + doc1.insert(&mammals, 0, "badger").unwrap(); + + doc2.merge(&mut doc1).unwrap(); + + doc1.put(&birds, "brown", "sparrow").unwrap(); + + doc2.delete(&animals, "birds").unwrap(); + doc1.merge(&mut doc2).unwrap(); + + assert_obj!( + &doc1, + &automerge::ROOT, + "animals", + map! { + "mammals" => { + list![{ "badger" }], + } + } + ); + + assert_obj!( + doc2.document(), + &automerge::ROOT, + "animals", + map! { + "mammals" => { + list![{ "badger" }], + } + } + ); +} + +#[test] +fn concurrent_updates_of_concurrently_deleted_objects() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + + let birds = doc1 + .put_object(&automerge::ROOT, "birds", ObjType::Map) + .unwrap(); + let blackbird = doc1.put_object(&birds, "blackbird", ObjType::Map).unwrap(); + doc1.put(&blackbird, "feathers", "black").unwrap(); + + doc2.merge(&mut doc1).unwrap(); + + doc1.delete(&birds, "blackbird").unwrap(); + + doc2.put(&blackbird, "beak", "orange").unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "birds" => { + map!{}, + } + } + ); +} + +#[test] +fn does_not_interleave_sequence_insertions_at_same_position() { + let (actor1, actor2) = sorted_actors(); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + + let wisdom = doc1 + .put_object(&automerge::ROOT, "wisdom", ObjType::List) + .unwrap(); + doc2.merge(&mut doc1).unwrap(); + + doc1.splice( + &wisdom, + 0, + 0, + vec![ + "to".into(), + "be".into(), + "is".into(), + "to".into(), + "do".into(), + ], + ) + .unwrap(); + + doc2.splice( + &wisdom, + 0, + 0, + vec![ + "to".into(), + "do".into(), + "is".into(), + "to".into(), + "be".into(), + ], + ) + .unwrap(); + + doc1.merge(&mut doc2).unwrap(); + + assert_doc!( + &doc1, + map! { + "wisdom" => {list![ + {"to"}, + {"do"}, + {"is"}, + {"to"}, + {"be"}, + {"to"}, + {"be"}, + {"is"}, + {"to"}, + {"do"}, + ]} + } + ); +} + +#[test] +fn mutliple_insertions_at_same_list_position_with_insertion_by_greater_actor_id() { + let (actor1, actor2) = sorted_actors(); + assert!(actor2 > actor1); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + + let list = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc1.insert(&list, 0, "two").unwrap(); + doc2.merge(&mut doc1).unwrap(); + + doc2.insert(&list, 0, "one").unwrap(); + assert_doc!( + &doc2, + map! { + "list" => { list![ + { "one" }, + { "two" }, + ]} + } + ); +} + +#[test] +fn mutliple_insertions_at_same_list_position_with_insertion_by_lesser_actor_id() { + let (actor2, actor1) = sorted_actors(); + assert!(actor2 < actor1); + let mut doc1 = new_doc_with_actor(actor1); + let mut doc2 = new_doc_with_actor(actor2); + + let list = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc1.insert(&list, 0, "two").unwrap(); + doc2.merge(&mut doc1).unwrap(); + + doc2.insert(&list, 0, "one").unwrap(); + assert_doc!( + &doc2, + map! { + "list" => { list![ + { "one" }, + { "two" }, + ]} + } + ); +} + +#[test] +fn insertion_consistent_with_causality() { + let mut doc1 = new_doc(); + let mut doc2 = new_doc(); + + let list = doc1 + .put_object(&automerge::ROOT, "list", ObjType::List) + .unwrap(); + doc1.insert(&list, 0, "four").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc2.insert(&list, 0, "three").unwrap(); + doc1.merge(&mut doc2).unwrap(); + doc1.insert(&list, 0, "two").unwrap(); + doc2.merge(&mut doc1).unwrap(); + doc2.insert(&list, 0, "one").unwrap(); + + assert_doc!( + &doc2, + map! { + "list" => { list![ + {"one"}, + {"two"}, + {"three" }, + {"four"}, + ]} + } + ); +} + +#[test] +fn save_and_restore_empty() { + let mut doc = new_doc(); + let loaded = Automerge::load(&doc.save()).unwrap(); + + assert_doc!(&loaded, map! {}); +} + +#[test] +fn save_restore_complex() { + let mut doc1 = new_doc(); + let todos = doc1 + .put_object(&automerge::ROOT, "todos", ObjType::List) + .unwrap(); + + let first_todo = doc1.insert_object(&todos, 0, ObjType::Map).unwrap(); + doc1.put(&first_todo, "title", "water plants").unwrap(); + doc1.put(&first_todo, "done", false).unwrap(); + + let mut doc2 = new_doc(); + doc2.merge(&mut doc1).unwrap(); + doc2.put(&first_todo, "title", "weed plants").unwrap(); + + doc1.put(&first_todo, "title", "kill plants").unwrap(); + doc1.merge(&mut doc2).unwrap(); + + let reloaded = Automerge::load(&doc1.save()).unwrap(); + + assert_doc!( + &reloaded, + map! { + "todos" => {list![ + {map!{ + "title" => { + "weed plants", + "kill plants", + }, + "done" => {false}, + }} + ]} + } + ); +} + +#[test] +fn handle_repeated_out_of_order_changes() -> Result<(), automerge::AutomergeError> { + let mut doc1 = new_doc(); + let list = doc1.put_object(ROOT, "list", ObjType::List)?; + doc1.insert(&list, 0, "a")?; + let mut doc2 = doc1.fork(); + doc1.insert(&list, 1, "b")?; + doc1.commit(); + doc1.insert(&list, 2, "c")?; + doc1.commit(); + doc1.insert(&list, 3, "d")?; + doc1.commit(); + let changes = doc1 + .get_changes(&[]) + .unwrap() + .into_iter() + .cloned() + .collect::>(); + doc2.apply_changes(changes[2..].to_vec())?; + doc2.apply_changes(changes[2..].to_vec())?; + doc2.apply_changes(changes)?; + assert_eq!(doc1.save(), doc2.save()); + Ok(()) +} + +#[test] +fn save_restore_complex_transactional() { + let mut doc1 = Automerge::new(); + let first_todo = doc1 + .transact::<_, _, automerge::AutomergeError>(|d| { + let todos = d.put_object(&automerge::ROOT, "todos", ObjType::List)?; + let first_todo = d.insert_object(&todos, 0, ObjType::Map)?; + d.put(&first_todo, "title", "water plants")?; + d.put(&first_todo, "done", false)?; + Ok(first_todo) + }) + .unwrap() + .result; + + let mut doc2 = Automerge::new(); + doc2.merge(&mut doc1).unwrap(); + doc2.transact::<_, _, automerge::AutomergeError>(|tx| { + tx.put(&first_todo, "title", "weed plants")?; + Ok(()) + }) + .unwrap(); + + doc1.transact::<_, _, automerge::AutomergeError>(|tx| { + tx.put(&first_todo, "title", "kill plants")?; + Ok(()) + }) + .unwrap(); + doc1.merge(&mut doc2).unwrap(); + + let reloaded = Automerge::load(&doc1.save()).unwrap(); + + assert_doc!( + &reloaded, + map! { + "todos" => {list![ + {map!{ + "title" => { + "weed plants", + "kill plants", + }, + "done" => {false}, + }} + ]} + } + ); +} + +#[test] +fn list_counter_del() -> Result<(), automerge::AutomergeError> { + let mut v = vec![ActorId::random(), ActorId::random(), ActorId::random()]; + v.sort(); + let actor1 = v[0].clone(); + let actor2 = v[1].clone(); + let actor3 = v[2].clone(); + + let mut doc1 = new_doc_with_actor(actor1); + + let list = doc1.put_object(ROOT, "list", ObjType::List)?; + doc1.insert(&list, 0, "a")?; + doc1.insert(&list, 1, "b")?; + doc1.insert(&list, 2, "c")?; + + let mut doc2 = AutoCommit::load(&doc1.save())?; + doc2.set_actor(actor2); + + let mut doc3 = AutoCommit::load(&doc1.save())?; + doc3.set_actor(actor3); + + doc1.put(&list, 1, ScalarValue::counter(0))?; + doc2.put(&list, 1, ScalarValue::counter(10))?; + doc3.put(&list, 1, ScalarValue::counter(100))?; + + doc1.put(&list, 2, ScalarValue::counter(0))?; + doc2.put(&list, 2, ScalarValue::counter(10))?; + doc3.put(&list, 2, 100)?; + + doc1.increment(&list, 1, 1)?; + doc1.increment(&list, 2, 1)?; + + doc1.merge(&mut doc2).unwrap(); + doc1.merge(&mut doc3).unwrap(); + + assert_obj!( + doc1.document(), + &automerge::ROOT, + "list", + list![ + { + "a", + }, + { + ScalarValue::counter(1), + ScalarValue::counter(10), + ScalarValue::counter(100) + }, + { + ScalarValue::Int(100), + ScalarValue::counter(1), + ScalarValue::counter(10), + } + ] + ); + + doc1.increment(&list, 1, 1)?; + doc1.increment(&list, 2, 1)?; + + assert_obj!( + doc1.document(), + &automerge::ROOT, + "list", + list![ + { + "a", + }, + { + ScalarValue::counter(2), + ScalarValue::counter(11), + ScalarValue::counter(101) + }, + { + ScalarValue::counter(2), + ScalarValue::counter(11), + } + ] + ); + + doc1.delete(&list, 2)?; + + assert_eq!(doc1.length(&list), 2); + + let doc4 = AutoCommit::load(&doc1.save())?; + + assert_eq!(doc4.length(&list), 2); + + doc1.delete(&list, 1)?; + + assert_eq!(doc1.length(&list), 1); + + let doc5 = AutoCommit::load(&doc1.save())?; + + assert_eq!(doc5.length(&list), 1); + + Ok(()) +} + +#[test] +fn observe_counter_change_application() { + let mut doc = AutoCommit::new(); + doc.put(ROOT, "counter", ScalarValue::counter(1)).unwrap(); + doc.increment(ROOT, "counter", 2).unwrap(); + doc.increment(ROOT, "counter", 5).unwrap(); + let changes = doc.get_changes(&[]).unwrap().into_iter().cloned(); + + let mut doc = AutoCommit::new().with_observer(VecOpObserver::default()); + doc.apply_changes(changes).unwrap(); +} + +#[test] +fn increment_non_counter_map() { + let mut doc = AutoCommit::new(); + // can't increment nothing + assert!(matches!( + doc.increment(ROOT, "nothing", 2), + Err(AutomergeError::MissingCounter) + )); + + // can't increment a non-counter + doc.put(ROOT, "non-counter", "mystring").unwrap(); + assert!(matches!( + doc.increment(ROOT, "non-counter", 2), + Err(AutomergeError::MissingCounter) + )); + + // can increment a counter still + doc.put(ROOT, "counter", ScalarValue::counter(1)).unwrap(); + assert!(matches!(doc.increment(ROOT, "counter", 2), Ok(()))); + + // can increment a counter that is part of a conflict + let mut doc1 = AutoCommit::new(); + doc1.set_actor(ActorId::from([1])); + let mut doc2 = AutoCommit::new(); + doc2.set_actor(ActorId::from([2])); + + doc1.put(ROOT, "key", ScalarValue::counter(1)).unwrap(); + doc2.put(ROOT, "key", "mystring").unwrap(); + doc1.merge(&mut doc2).unwrap(); + + assert!(matches!(doc1.increment(ROOT, "key", 2), Ok(()))); +} + +#[test] +fn increment_non_counter_list() { + let mut doc = AutoCommit::new(); + let list = doc.put_object(ROOT, "list", ObjType::List).unwrap(); + + // can't increment a non-counter + doc.insert(&list, 0, "mystring").unwrap(); + assert!(matches!( + doc.increment(&list, 0, 2), + Err(AutomergeError::MissingCounter) + )); + + // can increment a counter + doc.insert(&list, 0, ScalarValue::counter(1)).unwrap(); + assert!(matches!(doc.increment(&list, 0, 2), Ok(()))); + + // can increment a counter that is part of a conflict + let mut doc1 = AutoCommit::new(); + doc1.set_actor(ActorId::from([1])); + let list = doc1.put_object(ROOT, "list", ObjType::List).unwrap(); + doc1.insert(&list, 0, ()).unwrap(); + let mut doc2 = doc1.fork(); + doc2.set_actor(ActorId::from([2])); + + doc1.put(&list, 0, ScalarValue::counter(1)).unwrap(); + doc2.put(&list, 0, "mystring").unwrap(); + doc1.merge(&mut doc2).unwrap(); + + assert!(matches!(doc1.increment(&list, 0, 2), Ok(()))); +} + +#[test] +fn test_local_inc_in_map() { + let mut v = vec![ActorId::random(), ActorId::random(), ActorId::random()]; + v.sort(); + let actor1 = v[0].clone(); + let actor2 = v[1].clone(); + let actor3 = v[2].clone(); + + let mut doc1 = new_doc_with_actor(actor1); + doc1.put(&automerge::ROOT, "hello", "world").unwrap(); + + let mut doc2 = AutoCommit::load(&doc1.save()).unwrap(); + doc2.set_actor(actor2); + + let mut doc3 = AutoCommit::load(&doc1.save()).unwrap(); + doc3.set_actor(actor3); + + doc1.put(ROOT, "cnt", 20_u64).unwrap(); + doc2.put(ROOT, "cnt", ScalarValue::counter(0)).unwrap(); + doc3.put(ROOT, "cnt", ScalarValue::counter(10)).unwrap(); + doc1.merge(&mut doc2).unwrap(); + doc1.merge(&mut doc3).unwrap(); + + assert_doc! {doc1.document(), map!{ + "cnt" => { + 20_u64, + ScalarValue::counter(0), + ScalarValue::counter(10), + }, + "hello" => {"world"}, + }}; + + doc1.increment(ROOT, "cnt", 5).unwrap(); + + assert_doc! {doc1.document(), map!{ + "cnt" => { + ScalarValue::counter(5), + ScalarValue::counter(15), + }, + "hello" => {"world"}, + }}; + let mut doc4 = AutoCommit::load(&doc1.save()).unwrap(); + assert_eq!(doc4.save(), doc1.save()); +} + +#[test] +fn test_merging_test_conflicts_then_saving_and_loading() { + let (actor1, actor2) = sorted_actors(); + + let mut doc1 = new_doc_with_actor(actor1); + let text = doc1.put_object(ROOT, "text", ObjType::Text).unwrap(); + doc1.splice_text(&text, 0, 0, "hello").unwrap(); + + let mut doc2 = AutoCommit::load(&doc1.save()).unwrap(); + doc2.set_actor(actor2); + + assert_doc! {&doc2, map!{ + "text" => { list![{"h"}, {"e"}, {"l"}, {"l"}, {"o"}]}, + }}; + + doc2.splice_text(&text, 4, 1, "").unwrap(); + doc2.splice_text(&text, 4, 0, "!").unwrap(); + doc2.splice_text(&text, 5, 0, " ").unwrap(); + doc2.splice_text(&text, 6, 0, "world").unwrap(); + + assert_doc!( + &doc2, + map! { + "text" => { list![{"h"}, {"e"}, {"l"}, {"l"}, {"!"}, {" "}, {"w"} , {"o"}, {"r"}, {"l"}, {"d"}]} + } + ); + + let doc3 = AutoCommit::load(&doc2.save()).unwrap(); + + assert_doc!( + &doc3, + map! { + "text" => { list![{"h"}, {"e"}, {"l"}, {"l"}, {"!"}, {" "}, {"w"} , {"o"}, {"r"}, {"l"}, {"d"}]} + } + ); +} + +/// Surfaces an error which occurs when loading a document with a change which only contains a +/// delete operation. In this case the delete operation doesn't appear in the encoded document +/// operations except as a succ, so the max_op was calculated incorectly. +#[test] +fn delete_only_change() { + let actor = automerge::ActorId::random(); + let mut doc1 = automerge::Automerge::new().with_actor(actor.clone()); + let list = doc1 + .transact::<_, _, automerge::AutomergeError>(|d| { + let l = d.put_object(&automerge::ROOT, "list", ObjType::List)?; + d.insert(&l, 0, 'a')?; + Ok(l) + }) + .unwrap() + .result; + + let mut doc2 = automerge::Automerge::load(&doc1.save()) + .unwrap() + .with_actor(actor.clone()); + doc2.transact::<_, _, automerge::AutomergeError>(|d| d.delete(&list, 0)) + .unwrap(); + + let mut doc3 = automerge::Automerge::load(&doc2.save()) + .unwrap() + .with_actor(actor.clone()); + doc3.transact(|d| d.insert(&list, 0, "b")).unwrap(); + + let doc4 = automerge::Automerge::load(&doc3.save()) + .unwrap() + .with_actor(actor); + + let changes = doc4.get_changes(&[]).unwrap(); + assert_eq!(changes.len(), 3); + let c = changes[2]; + assert_eq!(c.start_op().get(), 4); +} + +/// Expose an error where a document which contained a create operation without any subsequent +/// operations targeting the created object did not load the object correctly. +#[test] +fn save_and_reload_create_object() { + let actor = automerge::ActorId::random(); + let mut doc = automerge::Automerge::new().with_actor(actor); + + // Create a change containing an object but no other operations + let list = doc + .transact::<_, _, automerge::AutomergeError>(|d| { + d.put_object(&automerge::ROOT, "foo", ObjType::List) + }) + .unwrap() + .result; + + // Save and load the change + let mut doc2 = automerge::Automerge::load(&doc.save()).unwrap(); + doc2.transact::<_, _, automerge::AutomergeError>(|d| { + d.insert(&list, 0, 1_u64)?; + Ok(()) + }) + .unwrap(); + + assert_doc!(&doc2, map! {"foo" => { list! [{1_u64}]}}); + + let _doc3 = automerge::Automerge::load(&doc2.save()).unwrap(); +} + +#[test] +fn test_compressed_changes() { + let mut doc = new_doc(); + // crate::storage::DEFLATE_MIN_SIZE is 250, so this should trigger compression + doc.put(ROOT, "bytes", ScalarValue::Bytes(vec![10; 300])) + .unwrap(); + let mut change = doc.get_last_local_change().unwrap().clone(); + let uncompressed = change.raw_bytes().to_vec(); + assert!(uncompressed.len() > 256); + let compressed = change.bytes().to_vec(); + assert!(compressed.len() < uncompressed.len()); + + let reloaded = automerge::Change::try_from(&compressed[..]).unwrap(); + assert_eq!(change.raw_bytes(), reloaded.raw_bytes()); +} + +#[test] +fn test_compressed_doc_cols() { + // In this test, the keyCtr column is long enough for deflate compression to kick in, but the + // keyStr column is short. Thus, the deflate bit gets set for keyCtr but not for keyStr. + // When checking whether the columns appear in ascending order, we must ignore the deflate bit. + let mut doc = new_doc(); + let list = doc.put_object(ROOT, "list", ObjType::List).unwrap(); + let mut expected = Vec::new(); + for i in 0..200 { + doc.insert(&list, i, i as u64).unwrap(); + expected.push(i as u64); + } + let uncompressed = doc.save_nocompress(); + let compressed = doc.save(); + assert!(compressed.len() < uncompressed.len()); + let loaded = automerge::Automerge::load(&compressed).unwrap(); + assert_doc!( + &loaded, + map! { + "list" => { expected} + } + ); +} + +#[test] +fn test_change_encoding_expanded_change_round_trip() { + let change_bytes: Vec = vec![ + 0x85, 0x6f, 0x4a, 0x83, // magic bytes + 0xb2, 0x98, 0x9e, 0xa9, // checksum + 1, 61, 0, 2, 0x12, 0x34, // chunkType: change, length, deps, actor '1234' + 1, 1, 252, 250, 220, 255, 5, // seq, startOp, time + 14, 73, 110, 105, 116, 105, 97, 108, 105, 122, 97, 116, 105, 111, + 110, // message: 'Initialization' + 0, 6, // actor list, column count + 0x15, 3, 0x34, 1, 0x42, 2, // keyStr, insert, action + 0x56, 2, 0x57, 1, 0x70, 2, // valLen, valRaw, predNum + 0x7f, 1, 0x78, // keyStr: 'x' + 1, // insert: false + 0x7f, 1, // action: set + 0x7f, 19, // valLen: 1 byte of type uint + 1, // valRaw: 1 + 0x7f, 0, // predNum: 0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // 10 trailing bytes + ]; + let change = automerge::Change::try_from(&change_bytes[..]).unwrap(); + assert_eq!(change.raw_bytes(), change_bytes); + let expanded = automerge::ExpandedChange::from(&change); + let unexpanded: automerge::Change = expanded.try_into().unwrap(); + assert_eq!(unexpanded.raw_bytes(), change_bytes); +} + +#[test] +fn save_and_load_incremented_counter() { + let mut doc = AutoCommit::new(); + doc.put(ROOT, "counter", ScalarValue::counter(1)).unwrap(); + doc.commit(); + doc.increment(ROOT, "counter", 1).unwrap(); + doc.commit(); + let changes1: Vec = doc.get_changes(&[]).unwrap().into_iter().cloned().collect(); + let json: Vec<_> = changes1 + .iter() + .map(|c| serde_json::to_string(&c.decode()).unwrap()) + .collect(); + let changes2: Vec = json + .iter() + .map(|j| serde_json::from_str::(j).unwrap().into()) + .collect(); + + assert_eq!(changes1, changes2); +} + +#[test] +fn load_incremental_with_corrupted_tail() { + let mut doc = AutoCommit::new(); + doc.put(ROOT, "key", ScalarValue::Str("value".into())) + .unwrap(); + doc.commit(); + let mut bytes = doc.save(); + bytes.extend_from_slice(&[1, 2, 3, 4]); + let mut loaded = Automerge::new(); + let loaded_len = loaded.load_incremental(&bytes).unwrap(); + assert_eq!(loaded_len, 1); + assert_doc!( + &loaded, + map! { + "key" => { "value" }, + } + ); +} + +#[test] +fn load_doc_with_deleted_objects() { + // Reproduces an issue where a document with deleted objects failed to load + let mut doc = AutoCommit::new(); + doc.put_object(ROOT, "list", ObjType::List).unwrap(); + doc.put_object(ROOT, "text", ObjType::Text).unwrap(); + doc.put_object(ROOT, "map", ObjType::Map).unwrap(); + doc.put_object(ROOT, "table", ObjType::Table).unwrap(); + doc.delete(&ROOT, "list").unwrap(); + doc.delete(&ROOT, "text").unwrap(); + doc.delete(&ROOT, "map").unwrap(); + doc.delete(&ROOT, "table").unwrap(); + let saved = doc.save(); + Automerge::load(&saved).unwrap(); +} + +#[test] +fn insert_after_many_deletes() { + let mut doc = AutoCommit::new(); + let obj = doc.put_object(&ROOT, "object", ObjType::Map).unwrap(); + for i in 0..100 { + doc.put(&obj, i.to_string(), i).unwrap(); + doc.delete(&obj, i.to_string()).unwrap(); + } +} + +#[test] +fn simple_bad_saveload() { + let mut doc = Automerge::new(); + doc.transact::<_, _, AutomergeError>(|d| { + d.put(ROOT, "count", 0)?; + Ok(()) + }) + .unwrap(); + + doc.transact::<_, _, AutomergeError>(|_d| Ok(())).unwrap(); + + doc.transact::<_, _, AutomergeError>(|d| { + d.put(ROOT, "count", 0)?; + Ok(()) + }) + .unwrap(); + + let bytes = doc.save(); + Automerge::load(&bytes).unwrap(); +} + +#[test] +fn ops_on_wrong_objets() -> Result<(), AutomergeError> { + let mut doc = AutoCommit::new(); + let list = doc.put_object(&automerge::ROOT, "list", ObjType::List)?; + doc.insert(&list, 0, "a")?; + doc.insert(&list, 1, "b")?; + let e1 = doc.put(&list, "a", "AAA"); + assert_eq!(e1, Err(AutomergeError::InvalidOp(ObjType::List))); + let e2 = doc.splice_text(&list, 0, 0, "hello world"); + assert_eq!(e2, Err(AutomergeError::InvalidOp(ObjType::List))); + let map = doc.put_object(&automerge::ROOT, "map", ObjType::Map)?; + doc.put(&map, "a", "AAA")?; + doc.put(&map, "b", "BBB")?; + let e3 = doc.insert(&map, 0, "b"); + assert_eq!(e3, Err(AutomergeError::InvalidOp(ObjType::Map))); + let e4 = doc.splice_text(&map, 0, 0, "hello world"); + assert_eq!(e4, Err(AutomergeError::InvalidOp(ObjType::Map))); + let text = doc.put_object(&automerge::ROOT, "text", ObjType::Text)?; + doc.splice_text(&text, 0, 0, "hello world")?; + let e5 = doc.put(&text, "a", "AAA"); + assert_eq!(e5, Err(AutomergeError::InvalidOp(ObjType::Text))); + //let e6 = doc.insert(&text, 0, "b"); + //assert_eq!(e6, Err(AutomergeError::InvalidOp(ObjType::Text))); + Ok(()) +} + +#[test] +fn fuzz_crashers() { + let paths = fs::read_dir("./tests/fuzz-crashers").unwrap(); + + for path in paths { + // uncomment this line to figure out which fixture is crashing: + // println!("{:?}", path.as_ref().unwrap().path().display()); + let bytes = fs::read(path.as_ref().unwrap().path()); + let res = Automerge::load(&bytes.unwrap()); + assert!(res.is_err()); + } +} + +fn fixture(name: &str) -> Vec { + fs::read("./tests/fixtures/".to_owned() + name).unwrap() +} + +#[test] +fn overlong_leb() { + // the value metadata says "2", but the LEB is only 1-byte long and there's an extra 0 + assert!(Automerge::load(&fixture("counter_value_has_incorrect_meta.automerge")).is_err()); + // the LEB is overlong (using 2 bytes where one would have sufficed) + assert!(Automerge::load(&fixture("counter_value_is_overlong.automerge")).is_err()); + // the LEB is correct + assert!(Automerge::load(&fixture("counter_value_is_ok.automerge")).is_ok()); +} + +#[test] +fn load() { + fn check_fixture(name: &str) { + let doc = Automerge::load(&fixture(name)).unwrap(); + let map_id = doc.get(ROOT, "a").unwrap().unwrap().1; + assert_eq!(doc.get(map_id, "a").unwrap().unwrap().0, "b".into()); + } + + check_fixture("two_change_chunks.automerge"); + check_fixture("two_change_chunks_compressed.automerge"); + check_fixture("two_change_chunks_out_of_order.automerge"); +} + +#[test] +fn negative_64() { + let mut doc = Automerge::new(); + assert!(doc.transact(|d| { d.put(ROOT, "a", -64_i64) }).is_ok()) +} + +#[test] +fn obj_id_64bits() { + // this change has an opId of 2**42, which when cast to a 32-bit int gives 0. + // The file should either fail to load (a limit of ~4 billion ops per doc seems reasonable), or be handled correctly. + if let Ok(doc) = Automerge::load(&fixture("64bit_obj_id_change.automerge")) { + let map_id = doc.get(ROOT, "a").unwrap().unwrap().1; + assert!(map_id != ROOT) + } + + // this fixture is the same as the above, but as a document chunk. + if let Ok(doc) = Automerge::load(&fixture("64bit_obj_id_doc.automerge")) { + let map_id = doc.get(ROOT, "a").unwrap().unwrap().1; + assert!(map_id != ROOT) + } +} + +#[test] +fn bad_change_on_optree_node_boundary() { + let mut doc = Automerge::new(); + doc.transact::<_, _, AutomergeError>(|d| { + d.put(ROOT, "a", "z")?; + d.put(ROOT, "b", 0)?; + d.put(ROOT, "c", 0)?; + Ok(()) + }) + .unwrap(); + let iterations = 15_u64; + for i in 0_u64..iterations { + doc.transact::<_, _, AutomergeError>(|d| { + let s = "a".repeat(i as usize); + d.put(ROOT, "a", s)?; + d.put(ROOT, "b", i + 1)?; + d.put(ROOT, "c", i + 1)?; + Ok(()) + }) + .unwrap(); + } + let mut doc2 = Automerge::load(doc.save().as_slice()).unwrap(); + doc.transact::<_, _, AutomergeError>(|d| { + let i = iterations + 2; + let s = "a".repeat(i as usize); + d.put(ROOT, "a", s)?; + d.put(ROOT, "b", i)?; + d.put(ROOT, "c", i)?; + Ok(()) + }) + .unwrap(); + let change = doc.get_changes(&doc2.get_heads()).unwrap(); + doc2.apply_changes(change.into_iter().cloned().collect::>()) + .unwrap(); + Automerge::load(doc2.save().as_slice()).unwrap(); +} diff --git a/rust/deny.toml b/rust/deny.toml new file mode 100644 index 00000000..473cdae8 --- /dev/null +++ b/rust/deny.toml @@ -0,0 +1,216 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #{ triple = "x86_64-unknown-linux-musl" }, + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory database is cloned/fetched into +db-path = "~/.cargo/advisory-db" +# The url(s) of the advisory databases to use +db-urls = ["https://github.com/rustsec/advisory-db"] +# The lint level for security vulnerabilities +vulnerability = "deny" +# The lint level for unmaintained crates +unmaintained = "warn" +# The lint level for crates that have been yanked from their source registry +yanked = "warn" +notice = "warn" +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + #"RUSTSEC-0000-0000", +] +# Threshold for security vulnerabilities, any vulnerability with a CVSS score +# lower than the range specified will be ignored. Note that ignored advisories +# will still output a note when they are encountered. +# * None - CVSS Score 0.0 +# * Low - CVSS Score 0.1 - 3.9 +# * Medium - CVSS Score 4.0 - 6.9 +# * High - CVSS Score 7.0 - 8.9 +# * Critical - CVSS Score 9.0 - 10.0 +#severity-threshold = + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# The lint level for crates which do not have a detectable license +unlicensed = "deny" +# List of explictly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + "MIT", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", +] +# List of explictly disallowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +deny = [ + #"Nokia", +] +# Lint level for licenses considered copyleft +copyleft = "warn" +# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses +# * both - The license will be approved if it is both OSI-approved *AND* FSF +# * either - The license will be approved if it is either OSI-approved *OR* FSF +# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF +# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved +# * neither - This predicate is ignored and the default lint level is used +allow-osi-fsf-free = "neither" +# Lint level used when no other predicates are matched +# 1. License isn't in the allow or deny lists +# 2. License isn't copyleft +# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" +default = "deny" +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.8 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # The Unicode-DFS--2016 license is necessary for unicode-ident because they + # use data from the unicode tables to generate the tables which are + # included in the application. We do not distribute those data files so + # this is not a problem for us. See https://github.com/dtolnay/unicode-ident/pull/9/files + # for more details. + { allow = ["MIT", "Apache-2.0", "Unicode-DFS-2016"], name = "unicode-ident" }, + + # these are needed by cbindgen and its dependancies + # should be revied more fully before release + { allow = ["MPL-2.0"], name = "cbindgen" }, + { allow = ["BSD-3-Clause"], name = "instant" }, + + # we only use prettytable in tests + { allow = ["BSD-3-Clause"], name = "prettytable" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +#[[licenses.clarify]] +# The name of the crate the clarification applies to +#name = "ring" +# The optional version constraint for the crate +#version = "*" +# The SPDX expression for the license requirements of the crate +#expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +#license-files = [ + # Each entry is a crate relative path, and the (opaque) hash of its contents + #{ path = "LICENSE", hash = 0xbd0eed23 } +#] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries +ignore = true +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "deny" +# Lint level for when a crate version requirement is `*` +wildcards = "allow" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# List of crates that are allowed. Use with care! +allow = [ +] +# List of crates to deny +deny = [ + # Each entry the name of a crate and a version range. If version is + # not specified, all versions will be matched. + #{ name = "ansi_term", version = "=0.11.0" }, + # + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, +] +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + # duct, which we only depend on for integration tests in automerge-cli, + # pulls in a version of os_pipe which in turn pulls in a version of + # windows-sys which is different to the version in pulled in by is-terminal. + # This is fine to ignore for now because it doesn't end up in downstream + # dependencies. + { name = "windows-sys", version = "0.42.0" } +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite +skip-tree = [ + # // We only ever use criterion in benchmarks + { name = "criterion", version = "0.4.0", depth=10}, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "warn" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "warn" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] + +[sources.allow-org] +# 1 or more github.com organizations to allow git sources for +# github = [""] +# 1 or more gitlab.com organizations to allow git sources for +# gitlab = [""] +# 1 or more bitbucket.org organizations to allow git sources for +# bitbucket = [""] diff --git a/rust/edit-trace/.gitignore b/rust/edit-trace/.gitignore new file mode 100644 index 00000000..55778aca --- /dev/null +++ b/rust/edit-trace/.gitignore @@ -0,0 +1,6 @@ +/target +Cargo.lock +node_modules +yarn.lock +flamegraph.svg +/prof diff --git a/rust/edit-trace/Cargo.toml b/rust/edit-trace/Cargo.toml new file mode 100644 index 00000000..eaebde46 --- /dev/null +++ b/rust/edit-trace/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "edit-trace" +version = "0.1.0" +edition = "2021" +license = "MIT" + +[dependencies] +automerge = { path = "../automerge" } +criterion = "0.4.0" +json = "0.12.4" +rand = "^0.8" + + +[[bin]] +name = "edit-trace" +doc = false +bench = false + +[[bench]] +debug = true +name = "main" +harness = false + diff --git a/rust/edit-trace/Makefile b/rust/edit-trace/Makefile new file mode 100644 index 00000000..e0e77643 --- /dev/null +++ b/rust/edit-trace/Makefile @@ -0,0 +1,25 @@ +.PHONY: rust +rust: + cargo run --release + +.PHONY: build-wasm +build-wasm: + cd ../automerge-wasm && yarn + cd ../automerge-wasm && yarn release + +.PHONY: wasm +wasm: build-wasm + node automerge-wasm.js + +.PHONY: build-js +build-js: build-wasm + cd ../automerge-js && yarn + cd ../automerge-js && yarn build + +.PHONY: js +js: build-js + node automerge-js.js + +.PHONY: baseline +baseline: + node baseline.js diff --git a/rust/edit-trace/README.md b/rust/edit-trace/README.md new file mode 100644 index 00000000..aabe83dc --- /dev/null +++ b/rust/edit-trace/README.md @@ -0,0 +1,48 @@ +# Edit trace benchmarks + +Try the different editing traces on different automerge implementations + +## Automerge Experiement - pure rust + +```sh +make rust +``` + +### Benchmarks + +There are some criterion benchmarks in the `benches` folder which can be run with `cargo bench` or `cargo criterion`. +For flamegraphing, `cargo flamegraph --bench main -- --bench "save" # or "load" or "replay" or nothing` can be useful. + +## Automerge Experiement - wasm api + +```sh +make wasm +``` + +## Automerge Experiment - JS wrapper + +```sh +make js +``` + +## Automerge 1.0 pure javascript - new fast backend + +This assumes automerge has been checked out in a directory along side this repo + +```sh +node automerge-1.0.js +``` + +## Automerge 1.0 with rust backend + +This assumes automerge has been checked out in a directory along side this repo + +```sh +node automerge-rs.js +``` + +## Baseline Test. Javascript Array with no CRDT info + +```sh +make baseline +``` diff --git a/rust/edit-trace/automerge-1.0.js b/rust/edit-trace/automerge-1.0.js new file mode 100644 index 00000000..49a423a4 --- /dev/null +++ b/rust/edit-trace/automerge-1.0.js @@ -0,0 +1,26 @@ + +// this assumes automerge has been checked out along side this repo + +const { edits, finalText } = require('./editing-trace') +const Automerge = require('../../automerge') + +const start = new Date() +let state = Automerge.from({text: new Automerge.Text()}) + +state = Automerge.change(state, doc => { + for (let i = 0; i < edits.length; i++) { + if (i % 1000 === 0) { + console.log(`Processed ${i} edits in ${new Date() - start} ms`) + } + if (edits[i][1] > 0) doc.text.deleteAt(edits[i][0], edits[i][1]) + if (edits[i].length > 2) doc.text.insertAt(edits[i][0], ...edits[i].slice(2)) + } +}) + +let _ = Automerge.save(state) +console.log(`Done in ${new Date() - start} ms`) + + +if (state.text.join('') !== finalText) { + throw new RangeError('ERROR: final text did not match expectation') +} diff --git a/rust/edit-trace/automerge-js.js b/rust/edit-trace/automerge-js.js new file mode 100644 index 00000000..2956d5d5 --- /dev/null +++ b/rust/edit-trace/automerge-js.js @@ -0,0 +1,29 @@ +// Apply the paper editing trace to an Automerge.Text object, one char at a time +const { edits, finalText } = require('./editing-trace') +const Automerge = require('../../javascript') + +let start = new Date() +let state = Automerge.from({text: ""}) + +state = Automerge.change(state, doc => { + for (let i = 0; i < edits.length; i++) { + if (i % 10000 === 0) { + console.log(`Processed ${i} edits in ${new Date() - start} ms`) + } + let edit = edits[i] + Automerge.splice(doc, 'text', ... edit) + } +}) +console.log(`Done in ${new Date() - start} ms`) + +start = new Date() +let bytes = Automerge.save(state) +console.log(`Save in ${new Date() - start} ms`) + +start = new Date() +let _load = Automerge.load(bytes) +console.log(`Load in ${new Date() - start} ms`) + +if (state.text !== finalText) { + throw new RangeError('ERROR: final text did not match expectation') +} diff --git a/rust/edit-trace/automerge-wasm.js b/rust/edit-trace/automerge-wasm.js new file mode 100644 index 00000000..8f6f51af --- /dev/null +++ b/rust/edit-trace/automerge-wasm.js @@ -0,0 +1,40 @@ +const { edits, finalText } = require('./editing-trace') +const Automerge = require('../automerge-wasm') + +const start = new Date() + +let doc = Automerge.create(); +doc.enablePatches(true) +let mat = doc.materialize("/") +let text = doc.putObject("_root", "text", "", "text") + +for (let i = 0; i < edits.length; i++) { + let edit = edits[i] + if (i % 10000 === 0) { + console.log(`Processed ${i} edits in ${new Date() - start} ms`) + } + doc.splice(text, ...edit) +} + +console.log(`Done in ${new Date() - start} ms`) + +let t_time = new Date() +let saved = doc.save() +console.log(`doc.save in ${new Date() - t_time} ms`) + +t_time = new Date() +Automerge.load(saved) +console.log(`doc.load in ${new Date() - t_time} ms`) + +t_time = new Date() +let t = doc.text(text); +console.log(`doc.text in ${new Date() - t_time} ms`) + +t_time = new Date() +t = doc.text(text); +mat = doc.applyPatches(mat) +console.log(`doc.applyPatches() in ${new Date() - t_time} ms`) + +if (doc.text(text) !== finalText) { + throw new RangeError('ERROR: final text did not match expectation') +} diff --git a/rust/edit-trace/baseline.js b/rust/edit-trace/baseline.js new file mode 100644 index 00000000..b99f0ae7 --- /dev/null +++ b/rust/edit-trace/baseline.js @@ -0,0 +1,23 @@ +// Apply the paper editing trace to a regular JavaScript array (using .splice, one char at a time) +const { edits, finalText } = require('./editing-trace') + +const start = new Date() +let chars = [] +for (let i = 0; i < edits.length; i++) { + let edit = edits[i] + if (i % 10000 === 0) { + console.log(`Processed ${i} edits in ${new Date() - start} ms`) + } + chars.splice(...edit) +} + +let _save = JSON.stringify(chars) + +const time = new Date() - start + +console.log(`Done in ${time} ms`) + +if (chars.join('') !== finalText) { + throw new RangeError('ERROR: final text did not match expectation') +} + diff --git a/rust/edit-trace/benches/main.rs b/rust/edit-trace/benches/main.rs new file mode 100644 index 00000000..00028945 --- /dev/null +++ b/rust/edit-trace/benches/main.rs @@ -0,0 +1,122 @@ +use automerge::{transaction::Transactable, AutoCommit, Automerge, ObjType, ROOT}; +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +use std::fs; + +fn replay_trace_tx(commands: Vec<(usize, usize, String)>) -> Automerge { + let mut doc = Automerge::new(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap(); + for (pos, del, vals) in commands { + tx.splice_text(&text, pos, del, &vals).unwrap(); + } + tx.commit(); + doc +} + +fn replay_trace_autotx(commands: Vec<(usize, usize, String)>) -> AutoCommit { + let mut doc = AutoCommit::new(); + let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap(); + for (pos, del, vals) in commands { + doc.splice_text(&text, pos, del, &vals).unwrap(); + } + doc.commit(); + doc +} + +fn save_trace(mut doc: Automerge) { + doc.save(); +} + +fn save_trace_autotx(mut doc: AutoCommit) { + doc.save(); +} + +fn load_trace(bytes: &[u8]) { + Automerge::load(bytes).unwrap(); +} + +fn load_trace_autotx(bytes: &[u8]) { + AutoCommit::load(bytes).unwrap(); +} + +fn bench(c: &mut Criterion) { + let contents = fs::read_to_string("edits.json").expect("cannot read edits file"); + let edits = json::parse(&contents).expect("cant parse edits"); + let mut commands = vec![]; + for i in 0..edits.len() { + let pos: usize = edits[i][0].as_usize().unwrap(); + let del: usize = edits[i][1].as_usize().unwrap(); + let mut vals = String::new(); + for j in 2..edits[i].len() { + let v = edits[i][j].as_str().unwrap(); + vals.push_str(v); + } + commands.push((pos, del, vals)); + } + + let mut group = c.benchmark_group("edit trace"); + group.throughput(Throughput::Elements(commands.len() as u64)); + + group.bench_with_input( + BenchmarkId::new("replay", commands.len()), + &commands, + |b, commands| { + b.iter_batched( + || commands.clone(), + replay_trace_tx, + criterion::BatchSize::LargeInput, + ) + }, + ); + + let commands_len = commands.len(); + let mut doc = replay_trace_tx(commands.clone()); + group.bench_with_input(BenchmarkId::new("save", commands_len), &doc, |b, doc| { + b.iter_batched(|| doc.clone(), save_trace, criterion::BatchSize::LargeInput) + }); + + let bytes = doc.save(); + group.bench_with_input( + BenchmarkId::new("load", commands_len), + &bytes, + |b, bytes| b.iter(|| load_trace(bytes)), + ); + + group.bench_with_input( + BenchmarkId::new("replay autotx", commands_len), + &commands, + |b, commands| { + b.iter_batched( + || commands.clone(), + replay_trace_autotx, + criterion::BatchSize::LargeInput, + ) + }, + ); + + let commands_len = commands.len(); + let mut doc = replay_trace_autotx(commands); + group.bench_with_input( + BenchmarkId::new("save autotx", commands_len), + &doc, + |b, doc| { + b.iter_batched( + || doc.clone(), + save_trace_autotx, + criterion::BatchSize::LargeInput, + ) + }, + ); + + let bytes = doc.save(); + group.bench_with_input( + BenchmarkId::new("load autotx", commands_len), + &bytes, + |b, bytes| b.iter(|| load_trace_autotx(bytes)), + ); + + group.finish(); +} + +criterion_group!(benches, bench); +criterion_main!(benches); diff --git a/rust/edit-trace/editing-trace.js b/rust/edit-trace/editing-trace.js new file mode 100644 index 00000000..aadf32ad --- /dev/null +++ b/rust/edit-trace/editing-trace.js @@ -0,0 +1,259783 @@ +const edits = [ + [0, 0, "\\"], + [1, 0, "d"], + [2, 0, "o"], + [3, 0, "c"], + [4, 0, "u"], + [5, 0, "m"], + [6, 0, "e"], + [7, 0, "n"], + [8, 0, "t"], + [9, 0, "c"], + [10, 0, "l"], + [11, 0, "a"], + [12, 0, "s"], + [13, 0, "s"], + [14, 0, "["], + [15, 0, "a"], + [16, 0, "4"], + [17, 0, "p"], + [18, 0, "a"], + [19, 0, "p"], + [20, 0, "e"], + [21, 0, "r"], + [22, 0, ","], + [23, 0, "t"], + [24, 0, "w"], + [25, 0, "o"], + [26, 0, "c"], + [27, 0, "o"], + [28, 0, "l"], + [29, 0, "u"], + [30, 0, "m"], + [31, 0, "n"], + [32, 0, ","], + [33, 0, "1"], + [34, 0, "0"], + [35, 0, "p"], + [36, 0, "t"], + [37, 0, "]"], + [38, 0, "{"], + [39, 0, "a"], + [40, 0, "r"], + [41, 0, "t"], + [42, 0, "i"], + [43, 0, "c"], + [44, 0, "l"], + [45, 0, "e"], + [46, 0, "}"], + [47, 0, "\n"], + [48, 0, "\\"], + [49, 0, "u"], + [50, 0, "s"], + [51, 0, "e"], + [52, 0, "p"], + [53, 0, "a"], + [54, 0, "c"], + [55, 0, "k"], + [56, 0, "a"], + [57, 0, "g"], + [58, 0, "e"], + [59, 0, "{"], + [59, 1], + [59, 0, "["], + [60, 0, "u"], + [61, 0, "t"], + [62, 0, "f"], + [63, 0, "8"], + [64, 0, "]"], + [65, 0, "{"], + [66, 0, "i"], + [67, 0, "n"], + [68, 0, "p"], + [69, 0, "u"], + [70, 0, "t"], + [71, 0, "e"], + [72, 0, "n"], + [73, 0, "c"], + [74, 0, "}"], + [75, 0, "\n"], + [76, 0, "\\"], + [77, 0, "u"], + [78, 0, "s"], + [79, 0, "e"], + [80, 0, "p"], + [81, 0, "a"], + [82, 0, "c"], + [83, 0, "k"], + [84, 0, "a"], + [85, 0, "g"], + [86, 0, "e"], + [87, 0, "{"], + [88, 0, "m"], + [89, 0, "a"], + [90, 0, "t"], + [91, 0, "h"], + [92, 0, "p"], + [93, 0, "t"], + [94, 0, "m"], + [95, 0, "x"], + [96, 0, "}"], + [97, 0, " "], + [98, 0, "%"], + [99, 0, " "], + [100, 0, "t"], + [101, 0, "i"], + [102, 0, "m"], + [103, 0, "e"], + [104, 0, "s"], + [105, 0, " "], + [106, 0, "r"], + [107, 0, "o"], + [108, 0, "m"], + [109, 0, "a"], + [110, 0, "n"], + [111, 0, ","], + [112, 0, " "], + [113, 0, "i"], + [114, 0, "n"], + [115, 0, "c"], + [116, 0, "l"], + [117, 0, "u"], + [118, 0, "d"], + [119, 0, "i"], + [120, 0, "n"], + [121, 0, "g"], + [122, 0, " "], + [123, 0, "m"], + [124, 0, "a"], + [125, 0, "t"], + [126, 0, "h"], + [127, 0, "\n"], + [128, 0, "\\"], + [129, 0, "u"], + [130, 0, "s"], + [131, 0, "e"], + [132, 0, "p"], + [133, 0, "a"], + [134, 0, "c"], + [135, 0, "k"], + [136, 0, "a"], + [137, 0, "g"], + [138, 0, "e"], + [139, 0, "["], + [140, 0, "h"], + [141, 0, "y"], + [142, 0, "p"], + [143, 0, "h"], + [144, 0, "e"], + [145, 0, "n"], + [146, 0, "s"], + [147, 0, "]"], + [148, 0, "{"], + [149, 0, "u"], + [150, 0, "r"], + [151, 0, "l"], + [152, 0, "}"], + [153, 0, "\n"], + [154, 0, "\\"], + [155, 0, "u"], + [156, 0, "s"], + [157, 0, "e"], + [158, 0, "p"], + [159, 0, "a"], + [160, 0, "c"], + [161, 0, "k"], + [162, 0, "a"], + [163, 0, "g"], + [164, 0, "e"], + [165, 0, "{"], + [166, 0, "d"], + [167, 0, "o"], + [168, 0, "i"], + [169, 0, "}"], + [170, 0, "\n"], + [171, 0, "\\"], + [172, 0, "u"], + [173, 0, "s"], + [174, 0, "e"], + [175, 0, "p"], + [176, 0, "a"], + [177, 0, "c"], + [178, 0, "k"], + [179, 0, "a"], + [180, 0, "g"], + [181, 0, "e"], + [182, 0, "{"], + [183, 0, "h"], + [184, 0, "y"], + [185, 0, "p"], + [186, 0, "e"], + [187, 0, "r"], + [188, 0, "r"], + [189, 0, "e"], + [190, 0, "f"], + [191, 0, "}"], + [192, 0, "\n"], + [193, 0, "\\"], + [194, 0, "u"], + [195, 0, "s"], + [196, 0, "e"], + [197, 0, "p"], + [198, 0, "a"], + [199, 0, "c"], + [200, 0, "k"], + [201, 0, "a"], + [202, 0, "g"], + [203, 0, "e"], + [204, 0, "["], + [205, 0, "n"], + [206, 0, "u"], + [207, 0, "m"], + [208, 0, "b"], + [209, 0, "e"], + [210, 0, "r"], + [211, 0, "s"], + [212, 0, ","], + [213, 0, "s"], + [214, 0, "o"], + [215, 0, "r"], + [216, 0, "t"], + [217, 0, "]"], + [218, 0, "{"], + [219, 0, "n"], + [220, 0, "a"], + [221, 0, "t"], + [222, 0, "b"], + [223, 0, "i"], + [224, 0, "t"], + [224, 1], + [224, 0, "b"], + [225, 0, "}"], + [226, 0, "\n"], + [227, 0, "\\"], + [228, 0, "h"], + [229, 0, "y"], + [230, 0, "p"], + [231, 0, "h"], + [232, 0, "e"], + [233, 0, "n"], + [234, 0, "a"], + [235, 0, "t"], + [236, 0, "i"], + [237, 0, "o"], + [238, 0, "n"], + [239, 0, "{"], + [240, 0, "d"], + [241, 0, "a"], + [242, 0, "t"], + [243, 0, "a"], + [243, 1], + [242, 1], + [242, 0, "-"], + [243, 0, "d"], + [243, 1], + [243, 0, "t"], + [244, 0, "a"], + [245, 0, "-"], + [246, 0, "c"], + [247, 0, "e"], + [248, 0, "n"], + [249, 0, "-"], + [250, 0, "t"], + [251, 0, "e"], + [252, 0, "r"], + [253, 0, " "], + [254, 0, "d"], + [255, 0, "a"], + [256, 0, "-"], + [257, 0, "t"], + [258, 0, "a"], + [259, 0, "-"], + [260, 0, "c"], + [261, 0, "e"], + [262, 0, "n"], + [263, 0, "-"], + [264, 0, "t"], + [265, 0, "e"], + [266, 0, "r"], + [267, 0, "s"], + [268, 0, "}"], + [269, 0, "\n"], + [270, 0, "\\"], + [271, 0, "f"], + [272, 0, "r"], + [273, 0, "e"], + [274, 0, "n"], + [275, 0, "c"], + [276, 0, "h"], + [277, 0, "s"], + [278, 0, "p"], + [279, 0, "a"], + [280, 0, "c"], + [281, 0, "i"], + [282, 0, "n"], + [283, 0, "g"], + [284, 0, "\n"], + [285, 0, "\n"], + [286, 0, "\\"], + [287, 0, "b"], + [288, 0, "e"], + [289, 0, "g"], + [290, 0, "i"], + [291, 0, "n"], + [292, 0, "{"], + [293, 0, "d"], + [294, 0, "o"], + [295, 0, "c"], + [296, 0, "u"], + [297, 0, "m"], + [298, 0, "e"], + [299, 0, "n"], + [300, 0, "t"], + [301, 0, "}"], + [302, 0, "\n"], + [303, 0, "\\"], + [304, 0, "s"], + [305, 0, "l"], + [306, 0, "o"], + [307, 0, "p"], + [308, 0, "p"], + [309, 0, "y"], + [310, 0, "\n"], + [311, 0, "\\"], + [312, 0, "t"], + [313, 0, "i"], + [314, 0, "t"], + [315, 0, "l"], + [316, 0, "e"], + [317, 0, "{"], + [318, 0, "C"], + [319, 0, "o"], + [320, 0, "m"], + [321, 0, "p"], + [322, 0, "o"], + [323, 0, "s"], + [324, 0, "i"], + [325, 0, "n"], + [326, 0, "g"], + [327, 0, " "], + [328, 0, "D"], + [329, 0, "a"], + [330, 0, "t"], + [331, 0, "a"], + [332, 0, " "], + [333, 0, "S"], + [334, 0, "t"], + [335, 0, "r"], + [336, 0, "u"], + [337, 0, "c"], + [338, 0, "t"], + [339, 0, "u"], + [340, 0, "r"], + [341, 0, "e"], + [342, 0, "s"], + [343, 0, " "], + [344, 0, "f"], + [345, 0, "o"], + [346, 0, "r"], + [347, 0, " "], + [348, 0, "C"], + [349, 0, "o"], + [350, 0, "l"], + [351, 0, "l"], + [352, 0, "a"], + [353, 0, "b"], + [354, 0, "o"], + [355, 0, "r"], + [356, 0, "a"], + [357, 0, "t"], + [358, 0, "i"], + [359, 0, "v"], + [360, 0, "e"], + [361, 0, " "], + [362, 0, "D"], + [363, 0, "o"], + [364, 0, "u"], + [365, 0, "m"], + [366, 0, "e"], + [367, 0, "n"], + [368, 0, "t"], + [368, 1], + [367, 1], + [366, 1], + [365, 1], + [364, 1], + [364, 0, "c"], + [365, 0, "u"], + [366, 0, "m"], + [367, 0, "e"], + [368, 0, "n"], + [369, 0, "t"], + [370, 0, " "], + [371, 0, "E"], + [372, 0, "d"], + [373, 0, "i"], + [374, 0, "t"], + [375, 0, "i"], + [376, 0, "n"], + [377, 0, "g"], + [378, 0, "}"], + [379, 0, "\n"], + [380, 0, "\\"], + [381, 0, "a"], + [382, 0, "u"], + [383, 0, "t"], + [384, 0, "h"], + [385, 0, "o"], + [386, 0, "r"], + [387, 0, "{"], + [388, 0, "}"], + [389, 0, "\n"], + [390, 0, "\\"], + [391, 0, "m"], + [392, 0, "a"], + [393, 0, "k"], + [394, 0, "e"], + [395, 0, "t"], + [396, 0, "i"], + [397, 0, "t"], + [398, 0, "l"], + [399, 0, "e"], + [400, 0, "\n"], + [401, 0, "\n"], + [402, 0, "\\"], + [403, 0, "s"], + [404, 0, "u"], + [405, 0, "b"], + [406, 0, "s"], + [407, 0, "e"], + [408, 0, "c"], + [409, 0, "t"], + [410, 0, "i"], + [411, 0, "o"], + [412, 0, "n"], + [413, 0, "*"], + [414, 0, "{"], + [415, 0, "A"], + [416, 0, "b"], + [417, 0, "s"], + [418, 0, "t"], + [419, 0, "r"], + [420, 0, "a"], + [421, 0, "c"], + [422, 0, "g"], + [423, 0, "t"], + [424, 0, "}"], + [424, 1], + [423, 1], + [422, 1], + [422, 0, "t"], + [423, 0, "}"], + [424, 0, "\n"], + [425, 0, "\n"], + [426, 0, "\\"], + [427, 0, "s"], + [428, 0, "e"], + [429, 0, "c"], + [430, 0, "t"], + [431, 0, "i"], + [432, 0, "o"], + [433, 0, "n"], + [434, 0, "{"], + [435, 0, "I"], + [436, 0, "n"], + [437, 0, "t"], + [438, 0, "r"], + [439, 0, "o"], + [440, 0, "d"], + [441, 0, "u"], + [442, 0, "c"], + [443, 0, "t"], + [444, 0, "i"], + [445, 0, "o"], + [446, 0, "n"], + [447, 0, "}"], + [448, 0, "\n"], + [449, 0, "\n"], + [450, 0, "\n"], + [451, 0, "\\"], + [452, 0, "e"], + [453, 0, "n"], + [454, 0, "d"], + [455, 0, "{"], + [456, 0, "d"], + [457, 0, "o"], + [458, 0, "c"], + [459, 0, "u"], + [460, 0, "m"], + [461, 0, "e"], + [462, 0, "n"], + [463, 0, "t"], + [464, 0, "}"], + [465, 0, "\n"], + [450, 0, "\n"], + [451, 0, "{"], + [452, 0, "\\"], + [453, 0, "f"], + [454, 0, "o"], + [455, 0, "o"], + [456, 0, "t"], + [457, 0, "n"], + [458, 0, "o"], + [459, 0, "t"], + [460, 0, "e"], + [461, 0, "s"], + [462, 0, "i"], + [463, 0, "z"], + [464, 0, "e"], + [465, 0, "\n"], + [466, 0, "\\"], + [467, 0, "b"], + [468, 0, "i"], + [469, 0, "b"], + [470, 0, "l"], + [471, 0, "i"], + [472, 0, "o"], + [473, 0, "g"], + [474, 0, "r"], + [475, 0, "a"], + [476, 0, "p"], + [477, 0, "h"], + [478, 0, "y"], + [479, 0, "s"], + [480, 0, "t"], + [481, 0, "y"], + [482, 0, "l"], + [483, 0, "e"], + [484, 0, "{"], + [485, 0, "p"], + [486, 0, "l"], + [487, 0, "a"], + [488, 0, "i"], + [489, 0, "n"], + [490, 0, "n"], + [491, 0, "a"], + [492, 0, "t"], + [493, 0, "}"], + [494, 0, "\n"], + [495, 0, "\\"], + [496, 0, "b"], + [497, 0, "i"], + [498, 0, "b"], + [499, 0, "l"], + [500, 0, "i"], + [501, 0, "o"], + [502, 0, "g"], + [503, 0, "r"], + [504, 0, "a"], + [505, 0, "p"], + [506, 0, "h"], + [507, 0, "y"], + [508, 0, "{"], + [509, 0, "r"], + [510, 0, "e"], + [511, 0, "f"], + [512, 0, "e"], + [513, 0, "r"], + [514, 0, "e"], + [515, 0, "n"], + [516, 0, "c"], + [517, 0, "e"], + [518, 0, "s"], + [519, 0, "}"], + [520, 0, "{"], + [521, 0, "}"], + [522, 0, "}"], + [449, 0, "\n"], + [450, 0, "\\"], + [451, 0, "c"], + [452, 0, "i"], + [453, 0, "t"], + [454, 0, "e"], + [455, 0, "{"], + [456, 0, "R"], + [457, 0, "o"], + [458, 0, "h"], + [459, 0, ":"], + [460, 0, "2"], + [461, 0, "0"], + [462, 0, "1"], + [463, 0, "1"], + [464, 0, "d"], + [465, 0, "w"], + [466, 0, "}"], + [456, 0, "S"], + [457, 0, "h"], + [458, 0, "a"], + [459, 0, "p"], + [460, 0, "i"], + [461, 0, "r"], + [462, 0, "o"], + [463, 0, ":"], + [464, 0, "2"], + [465, 0, "0"], + [466, 0, "1"], + [467, 0, "1"], + [468, 0, "w"], + [469, 0, "y"], + [470, 0, ","], + [450, 0, "C"], + [451, 0, "R"], + [452, 0, "D"], + [453, 0, "T"], + [454, 0, "s"], + [455, 0, "~"], + [489, 0, "\n"], + [489, 0, "\n"], + [490, 0, "\\"], + [491, 0, "s"], + [492, 0, "e"], + [493, 0, "c"], + [494, 0, "t"], + [495, 0, "i"], + [496, 0, "o"], + [497, 0, "n"], + [498, 0, "{"], + [499, 0, "O"], + [500, 0, "p"], + [501, 0, "e"], + [502, 0, "r"], + [503, 0, "a"], + [504, 0, "t"], + [505, 0, "i"], + [506, 0, "o"], + [507, 0, "n"], + [508, 0, "a"], + [509, 0, "l"], + [510, 0, " "], + [511, 0, "S"], + [512, 0, "e"], + [513, 0, "m"], + [514, 0, "a"], + [515, 0, "n"], + [516, 0, "t"], + [517, 0, "i"], + [518, 0, "c"], + [519, 0, "s"], + [520, 0, "}"], + [521, 0, "\n"], + [522, 0, "\n"], + [523, 0, "T"], + [524, 0, "h"], + [525, 0, "e"], + [526, 0, " "], + [527, 0, "R"], + [528, 0, "e"], + [529, 0, "p"], + [530, 0, "l"], + [530, 1], + [529, 1], + [528, 1], + [527, 1], + [527, 0, "\\"], + [528, 0, "e"], + [529, 0, "m"], + [530, 0, "p"], + [531, 0, "h"], + [532, 0, "{"], + [533, 0, "R"], + [534, 0, "e"], + [535, 0, "p"], + [536, 0, "l"], + [537, 0, "i"], + [538, 0, "c"], + [539, 0, "a"], + [540, 0, "t"], + [541, 0, "e"], + [542, 0, "d"], + [543, 0, " "], + [544, 0, "G"], + [545, 0, "r"], + [546, 0, "o"], + [547, 0, "w"], + [548, 0, "a"], + [549, 0, "b"], + [550, 0, "l"], + [551, 0, "e"], + [552, 0, " "], + [553, 0, "A"], + [554, 0, "r"], + [555, 0, "r"], + [556, 0, "a"], + [557, 0, "y"], + [558, 0, "}"], + [559, 0, " "], + [560, 0, "("], + [561, 0, "R"], + [562, 0, "G"], + [563, 0, "A"], + [564, 0, ")"], + [565, 0, " "], + [566, 0, "d"], + [567, 0, "a"], + [568, 0, "t"], + [569, 0, "a"], + [570, 0, "t"], + [571, 0, "y"], + [572, 0, "p"], + [573, 0, "e"], + [574, 0, " "], + [575, 0, "w"], + [576, 0, "a"], + [577, 0, "s"], + [578, 0, " "], + [579, 0, "o"], + [580, 0, "r"], + [581, 0, "i"], + [582, 0, "g"], + [583, 0, "i"], + [584, 0, "n"], + [585, 0, "a"], + [586, 0, "l"], + [587, 0, "l"], + [588, 0, "y"], + [589, 0, " "], + [590, 0, "d"], + [591, 0, "e"], + [592, 0, "f"], + [593, 0, "i"], + [594, 0, "n"], + [595, 0, "e"], + [596, 0, "d"], + [597, 0, " "], + [598, 0, "b"], + [599, 0, "y"], + [600, 0, " "], + [601, 0, "R"], + [602, 0, "o"], + [603, 0, "h"], + [604, 0, " "], + [605, 0, "e"], + [606, 0, "t"], + [607, 0, " "], + [608, 0, "a"], + [609, 0, "l"], + [610, 0, "."], + [611, 0, "\\"], + [612, 0, " "], + [613, 0, "u"], + [614, 0, "s"], + [615, 0, "i"], + [616, 0, "n"], + [617, 0, "g"], + [618, 0, " "], + [619, 0, "p"], + [620, 0, "s"], + [621, 0, "e"], + [622, 0, "u"], + [623, 0, "d"], + [624, 0, "o"], + [625, 0, "c"], + [626, 0, "o"], + [627, 0, "d"], + [628, 0, "e"], + [629, 0, "~"], + [630, 0, "\\"], + [631, 0, "c"], + [632, 0, "i"], + [633, 0, "t"], + [634, 0, "e"], + [635, 0, "{"], + [636, 0, "R"], + [637, 0, "o"], + [638, 0, "h"], + [639, 0, ":"], + [640, 0, "2"], + [641, 0, "0"], + [642, 0, "1"], + [643, 0, "1"], + [644, 0, "d"], + [645, 0, "w"], + [646, 0, "}"], + [647, 0, "."], + [648, 0, " "], + [649, 0, "I"], + [650, 0, "n"], + [651, 0, " "], + [652, 0, "t"], + [653, 0, "h"], + [654, 0, "i"], + [655, 0, "s"], + [656, 0, " "], + [657, 0, "s"], + [658, 0, "e"], + [659, 0, "c"], + [660, 0, "t"], + [661, 0, "i"], + [662, 0, "o"], + [663, 0, "n"], + [664, 0, " "], + [665, 0, "w"], + [666, 0, "e"], + [667, 0, " "], + [668, 0, "p"], + [669, 0, "r"], + [670, 0, "e"], + [671, 0, "s"], + [672, 0, "e"], + [673, 0, "n"], + [674, 0, "t"], + [675, 0, " "], + [676, 0, "t"], + [677, 0, "h"], + [678, 0, "e"], + [679, 0, " "], + [680, 0, "a"], + [681, 0, "l"], + [682, 0, "g"], + [683, 0, "o"], + [684, 0, "r"], + [685, 0, "i"], + [686, 0, "t"], + [687, 0, "h"], + [688, 0, "m"], + [689, 0, " "], + [690, 0, "i"], + [691, 0, "n"], + [692, 0, " "], + [693, 0, "a"], + [694, 0, "n"], + [695, 0, " "], + [696, 0, "a"], + [697, 0, "l"], + [698, 0, "t"], + [699, 0, "e"], + [700, 0, "r"], + [701, 0, "n"], + [702, 0, "a"], + [703, 0, "t"], + [704, 0, "i"], + [705, 0, "v"], + [706, 0, "e"], + [707, 0, " "], + [708, 0, "f"], + [709, 0, "o"], + [710, 0, "r"], + [711, 0, "m"], + [712, 0, " "], + [713, 0, "w"], + [714, 0, "h"], + [715, 0, "i"], + [716, 0, "c"], + [717, 0, "h"], + [718, 0, " "], + [719, 0, "i"], + [720, 0, "s"], + [721, 0, " "], + [722, 0, "m"], + [723, 0, "o"], + [724, 0, "r"], + [725, 0, "e"], + [726, 0, " "], + [727, 0, "a"], + [728, 0, "m"], + [729, 0, "e"], + [730, 0, "n"], + [731, 0, "a"], + [732, 0, "b"], + [733, 0, "l"], + [734, 0, "e"], + [735, 0, " "], + [736, 0, "t"], + [737, 0, "o"], + [738, 0, " "], + [739, 0, "p"], + [740, 0, "r"], + [741, 0, "o"], + [742, 0, "o"], + [743, 0, "f"], + [744, 0, "s"], + [745, 0, "."], + [746, 0, "\n"], + [747, 0, "\n"], + [748, 0, "E"], + [749, 0, "a"], + [750, 0, "c"], + [751, 0, "h"], + [752, 0, " "], + [753, 0, "p"], + [754, 0, "e"], + [755, 0, "e"], + [756, 0, "r"], + [757, 0, " "], + [758, 0, "t"], + [759, 0, "h"], + [760, 0, "a"], + [761, 0, "t"], + [762, 0, " "], + [763, 0, "m"], + [764, 0, "a"], + [765, 0, "i"], + [766, 0, "n"], + [767, 0, "t"], + [768, 0, "a"], + [769, 0, "i"], + [770, 0, "n"], + [771, 0, "s"], + [772, 0, " "], + [773, 0, "a"], + [774, 0, " "], + [775, 0, "r"], + [776, 0, "e"], + [777, 0, "p"], + [778, 0, "l"], + [779, 0, "i"], + [780, 0, "c"], + [781, 0, "a"], + [782, 0, " "], + [783, 0, "o"], + [784, 0, "f"], + [785, 0, " "], + [786, 0, "a"], + [787, 0, "n"], + [788, 0, " "], + [789, 0, "R"], + [790, 0, "G"], + [791, 0, "A"], + [792, 0, " "], + [793, 0, "s"], + [794, 0, "t"], + [795, 0, "o"], + [796, 0, "r"], + [797, 0, "e"], + [798, 0, "s"], + [799, 0, " "], + [800, 0, "a"], + [801, 0, " "], + [802, 0, "c"], + [803, 0, "o"], + [804, 0, "p"], + [805, 0, "y"], + [806, 0, " "], + [807, 0, "o"], + [808, 0, "f"], + [809, 0, " "], + [810, 0, "i"], + [811, 0, "t"], + [812, 0, "s"], + [813, 0, " "], + [814, 0, "s"], + [815, 0, "t"], + [816, 0, "a"], + [817, 0, "t"], + [818, 0, "e"], + [819, 0, " "], + [820, 0, "$"], + [821, 0, "A"], + [822, 0, "$"], + [823, 0, ","], + [824, 0, " "], + [825, 0, "w"], + [826, 0, "h"], + [827, 0, "i"], + [828, 0, "c"], + [829, 0, "h"], + [830, 0, " "], + [831, 0, "i"], + [832, 0, "s"], + [833, 0, " "], + [834, 0, "a"], + [835, 0, " "], + [836, 0, "s"], + [837, 0, "e"], + [838, 0, "t"], + [839, 0, " "], + [840, 0, "o"], + [841, 0, "f"], + [842, 0, " "], + [843, 0, "t"], + [844, 0, "r"], + [845, 0, "i"], + [846, 0, "p"], + [847, 0, "l"], + [848, 0, "e"], + [849, 0, "s"], + [850, 0, " "], + [851, 0, "("], + [851, 1], + [851, 0, "$"], + [852, 0, "("], + [853, 0, "\\"], + [854, 0, "m"], + [855, 0, "a"], + [856, 0, "t"], + [857, 0, "h"], + [858, 0, "i"], + [859, 0, "t"], + [860, 0, "{"], + [861, 0, "i"], + [862, 0, "d"], + [863, 0, "}"], + [864, 0, ","], + [865, 0, " "], + [866, 0, "\\"], + [867, 0, "m"], + [868, 0, "a"], + [869, 0, "t"], + [870, 0, "h"], + [871, 0, "i"], + [872, 0, "t"], + [873, 0, "{"], + [874, 0, "v"], + [875, 0, "a"], + [876, 0, "l"], + [877, 0, "u"], + [878, 0, "e"], + [879, 0, "}"], + [880, 0, ","], + [881, 0, " "], + [882, 0, "\\"], + [883, 0, "m"], + [884, 0, "a"], + [885, 0, "t"], + [886, 0, "h"], + [887, 0, "i"], + [888, 0, "t"], + [889, 0, "{"], + [890, 0, "n"], + [891, 0, "e"], + [892, 0, "x"], + [893, 0, "t"], + [894, 0, "}"], + [895, 0, ")"], + [896, 0, "$"], + [897, 0, "."], + [898, 0, " "], + [899, 0, "T"], + [900, 0, "h"], + [901, 0, "e"], + [902, 0, " "], + [903, 0, "e"], + [904, 0, "m"], + [905, 0, "p"], + [906, 0, "t"], + [907, 0, "y"], + [908, 0, " "], + [909, 0, "a"], + [910, 0, "r"], + [911, 0, "r"], + [912, 0, "a"], + [913, 0, "y"], + [914, 0, " "], + [915, 0, "i"], + [916, 0, "s"], + [917, 0, " "], + [918, 0, "r"], + [919, 0, "e"], + [920, 0, "p"], + [921, 0, "r"], + [922, 0, "e"], + [923, 0, "s"], + [924, 0, "e"], + [925, 0, "n"], + [914, 0, " "], + [915, 0, "$"], + [916, 0, "A"], + [917, 0, "_"], + [918, 0, "\\"], + [919, 0, "e"], + [920, 0, "m"], + [921, 0, "p"], + [922, 0, "t"], + [923, 0, "y"], + [924, 0, "s"], + [925, 0, "e"], + [926, 0, "t"], + [927, 0, "$"], + [940, 0, "t"], + [941, 0, "e"], + [942, 0, "d"], + [943, 0, " "], + [944, 0, "b"], + [945, 0, "y"], + [946, 0, " "], + [947, 0, "a"], + [948, 0, " "], + [949, 0, "s"], + [950, 0, "e"], + [951, 0, "t"], + [952, 0, " "], + [953, 0, "c"], + [954, 0, "o"], + [955, 0, "n"], + [956, 0, "t"], + [957, 0, "a"], + [958, 0, "i"], + [959, 0, "n"], + [960, 0, "i"], + [961, 0, "n"], + [962, 0, "g"], + [963, 0, " "], + [964, 0, "a"], + [965, 0, " "], + [966, 0, "s"], + [967, 0, "i"], + [968, 0, "n"], + [969, 0, "g"], + [970, 0, "l"], + [971, 0, "e"], + [972, 0, " "], + [973, 0, "t"], + [974, 0, "u"], + [975, 0, "p"], + [976, 0, "l"], + [977, 0, "e"], + [978, 0, ":"], + [979, 0, "\n"], + [980, 0, "\\"], + [981, 0, "b"], + [982, 0, "e"], + [983, 0, "g"], + [984, 0, "i"], + [985, 0, "n"], + [986, 0, "{"], + [987, 0, "e"], + [988, 0, "q"], + [989, 0, "u"], + [990, 0, "a"], + [991, 0, "t"], + [992, 0, "i"], + [993, 0, "o"], + [994, 0, "n"], + [995, 0, "}"], + [996, 0, "\n"], + [997, 0, "\\"], + [998, 0, "e"], + [999, 0, "n"], + [1000, 0, "d"], + [1001, 0, "{"], + [1002, 0, "e"], + [1003, 0, "q"], + [1004, 0, "u"], + [1005, 0, "a"], + [1006, 0, "t"], + [1007, 0, "i"], + [1008, 0, "o"], + [1009, 0, "n"], + [1010, 0, "}"], + [996, 0, "\n"], + [997, 0, "A"], + [998, 0, "_"], + [999, 0, "\\"], + [1000, 0, "e"], + [1001, 0, "m"], + [1002, 0, "p"], + [1003, 0, "t"], + [1004, 0, "y"], + [1005, 0, "s"], + [1006, 0, "e"], + [1007, 0, "t"], + [1008, 0, " "], + [1009, 0, "="], + [1010, 0, " "], + [1011, 0, "{"], + [1012, 0, "("], + [1013, 0, "\\"], + [1014, 0, "v"], + [1015, 0, "d"], + [1016, 0, "a"], + [1017, 0, "s"], + [1018, 0, "h"], + [1019, 0, ","], + [1020, 0, " "], + [1021, 0, "\\"], + [1022, 0, "b"], + [1023, 0, "o"], + [1024, 0, "t"], + [1025, 0, ","], + [1026, 0, " "], + [1027, 0, "\\"], + [1028, 0, "d"], + [1029, 0, "a"], + [1030, 0, "s"], + [1031, 0, "h"], + [1032, 0, "v"], + [1033, 0, ")"], + [1034, 0, "}"], + [1050, 0, "\n"], + [1051, 0, "w"], + [1052, 0, "h"], + [1053, 0, "e"], + [1054, 0, "r"], + [1055, 0, "e"], + [1056, 0, " "], + [1057, 0, "$"], + [1058, 0, "\\"], + [1059, 0, "v"], + [1060, 0, "d"], + [1061, 0, "a"], + [1062, 0, "s"], + [1063, 0, "h"], + [1064, 0, "$"], + [1065, 0, " "], + [1066, 0, "i"], + [1067, 0, "s"], + [1068, 0, " "], + [1069, 0, "a"], + [1070, 0, " "], + [1071, 0, "s"], + [1072, 0, "p"], + [1073, 0, "e"], + [1074, 0, "c"], + [1075, 0, "i"], + [1076, 0, "a"], + [1077, 0, "l"], + [1078, 0, " "], + [1079, 0, "I"], + [1080, 0, "D"], + [1081, 0, " "], + [1082, 0, "d"], + [1083, 0, "e"], + [1084, 0, "n"], + [1085, 0, "o"], + [1086, 0, "t"], + [1087, 0, "i"], + [1088, 0, "n"], + [1089, 0, "g"], + [1090, 0, " "], + [1091, 0, "t"], + [1092, 0, "h"], + [1093, 0, "e"], + [1094, 0, " "], + [1095, 0, "h"], + [1096, 0, "e"], + [1097, 0, "a"], + [1098, 0, "d"], + [1099, 0, " "], + [1100, 0, "o"], + [1101, 0, "f"], + [1102, 0, " "], + [1103, 0, "t"], + [1104, 0, "h"], + [1105, 0, "e"], + [1106, 0, " "], + [1107, 0, "l"], + [1108, 0, "i"], + [1109, 0, "s"], + [1110, 0, "t"], + [1111, 0, ","], + [1112, 0, " "], + [1113, 0, "$"], + [1114, 0, "\\"], + [1115, 0, "d"], + [1116, 0, "a"], + [1117, 0, "s"], + [1118, 0, "h"], + [1119, 0, "v"], + [1120, 0, "$"], + [1121, 0, " "], + [1122, 0, "i"], + [1123, 0, "n"], + [1124, 0, "d"], + [1125, 0, "i"], + [1126, 0, "c"], + [1127, 0, "a"], + [1128, 0, "t"], + [1129, 0, "e"], + [1130, 0, "s"], + [1131, 0, " "], + [1132, 0, "t"], + [1133, 0, "h"], + [1134, 0, "e"], + [1135, 0, " "], + [1136, 0, "e"], + [1137, 0, "n"], + [1138, 0, "d"], + [1139, 0, " "], + [1140, 0, "o"], + [1141, 0, "f"], + [1142, 0, " "], + [1143, 0, "t"], + [1144, 0, "h"], + [1145, 0, "e"], + [1146, 0, " "], + [1147, 0, "l"], + [1148, 0, "i"], + [1149, 0, "s"], + [1150, 0, "t"], + [1151, 0, ","], + [1152, 0, " "], + [1153, 0, "a"], + [1154, 0, "n"], + [1155, 0, "d"], + [1156, 0, " "], + [1157, 0, "$"], + [1158, 0, "\\"], + [1159, 0, "b"], + [1160, 0, "o"], + [1161, 0, "t"], + [1162, 0, "$"], + [1163, 0, " "], + [1164, 0, "i"], + [1165, 0, "s"], + [1166, 0, " "], + [1167, 0, "t"], + [1168, 0, "h"], + [1169, 0, "e"], + [1170, 0, " "], + [1171, 0, "b"], + [1171, 1], + [1171, 0, "a"], + [1172, 0, "b"], + [1173, 0, "s"], + [1174, 0, "e"], + [1175, 0, "n"], + [1176, 0, "c"], + [1177, 0, "e"], + [1178, 0, " "], + [1179, 0, "o"], + [1180, 0, "f"], + [1181, 0, " "], + [1182, 0, "a"], + [1183, 0, " "], + [1184, 0, "v"], + [1185, 0, "a"], + [1186, 0, "l"], + [1187, 0, "u"], + [1188, 0, "e"], + [1189, 0, "."], + [1011, 0, "\\"], + [1035, 0, "\\"], + [995, 0, "*"], + [997, 1], + [996, 1], + [995, 1], + [994, 1], + [993, 1], + [992, 1], + [991, 1], + [990, 1], + [989, 1], + [988, 1], + [987, 1], + [986, 1], + [985, 1], + [984, 1], + [983, 1], + [982, 1], + [981, 1], + [980, 1], + [980, 0, "$"], + [981, 0, "$"], + [982, 0, " "], + [1037, 1], + [1036, 1], + [1035, 1], + [1034, 1], + [1033, 1], + [1032, 1], + [1031, 1], + [1030, 1], + [1029, 1], + [1028, 1], + [1027, 1], + [1026, 1], + [1025, 1], + [1024, 1], + [1023, 1], + [1023, 0, " "], + [1024, 0, "$"], + [1025, 0, "$"], + [739, 0, "c"], + [740, 0, "o"], + [741, 0, "r"], + [742, 0, "r"], + [743, 0, "e"], + [744, 0, "c"], + [745, 0, "t"], + [746, 0, "n"], + [747, 0, "e"], + [748, 0, "s"], + [749, 0, "s"], + [750, 0, " "], + [1178, 0, "\n"], + [1179, 0, "\n"], + [1180, 0, "W"], + [1181, 0, "e"], + [1182, 0, " "], + [1183, 0, "c"], + [1184, 0, "a"], + [1185, 0, "n"], + [1186, 0, " "], + [1186, 1], + [1185, 1], + [1184, 1], + [1183, 1], + [1183, 0, "t"], + [1183, 1], + [1183, 0, "d"], + [1184, 0, "e"], + [1185, 0, "f"], + [1186, 0, "i"], + [1187, 0, "n"], + [1188, 0, "e"], + [1189, 0, " "], + [1190, 0, "s"], + [1191, 0, "o"], + [1192, 0, "m"], + [1193, 0, "e"], + [1194, 0, " "], + [1195, 0, "c"], + [1196, 0, "o"], + [1197, 0, "n"], + [1198, 0, "v"], + [1199, 0, "e"], + [1200, 0, "n"], + [1201, 0, "i"], + [1202, 0, "c"], + [1202, 1], + [1202, 0, "e"], + [1203, 0, "n"], + [1204, 0, "c"], + [1205, 0, "e"], + [1206, 0, " "], + [1207, 0, "f"], + [1208, 0, "u"], + [1209, 0, "n"], + [1210, 0, "c"], + [1211, 0, "t"], + [1212, 0, "i"], + [1213, 0, "o"], + [1214, 0, "n"], + [1215, 0, "s"], + [1216, 0, " "], + [1217, 0, "f"], + [1218, 0, "o"], + [1219, 0, "r"], + [1220, 0, " "], + [1221, 0, "a"], + [1222, 0, "c"], + [1223, 0, "c"], + [1224, 0, "e"], + [1225, 0, "s"], + [1226, 0, "s"], + [1227, 0, "i"], + [1228, 0, "n"], + [1229, 0, "g"], + [1230, 0, " "], + [1231, 0, "t"], + [1232, 0, "h"], + [1233, 0, "e"], + [1234, 0, " "], + [1235, 0, "s"], + [1236, 0, "t"], + [1237, 0, "a"], + [1238, 0, "t"], + [1239, 0, "e"], + [1240, 0, " "], + [1241, 0, "$"], + [1242, 0, "A"], + [1243, 0, "$"], + [1244, 0, ":"], + [1245, 0, "\n"], + [1246, 0, "\\"], + [1247, 0, "b"], + [1248, 0, "e"], + [1249, 0, "g"], + [1250, 0, "i"], + [1251, 0, "n"], + [1252, 0, "{"], + [1253, 0, "e"], + [1254, 0, "q"], + [1255, 0, "n"], + [1256, 0, "a"], + [1257, 0, "r"], + [1258, 0, "r"], + [1259, 0, "a"], + [1260, 0, "y"], + [1261, 0, "*"], + [1262, 0, "}"], + [1263, 0, "\n"], + [1264, 0, "\\"], + [1265, 0, "e"], + [1266, 0, "n"], + [1267, 0, "d"], + [1268, 0, "{"], + [1269, 0, "e"], + [1270, 0, "q"], + [1271, 0, "n"], + [1272, 0, "a"], + [1273, 0, "r"], + [1274, 0, "r"], + [1275, 0, "a"], + [1276, 0, "y"], + [1277, 0, "*"], + [1278, 0, "}"], + [1263, 0, "\n"], + [1264, 0, "\\"], + [1265, 0, "m"], + [1266, 0, "a"], + [1267, 0, "t"], + [1268, 0, "h"], + [1269, 0, "r"], + [1270, 0, "m"], + [1271, 0, "{"], + [1272, 0, "n"], + [1273, 0, "e"], + [1274, 0, "x"], + [1275, 0, "t"], + [1276, 0, "}"], + [1277, 0, "("], + [1278, 0, "A"], + [1279, 0, ","], + [1280, 0, " "], + [1281, 0, "\\"], + [1282, 0, "m"], + [1283, 0, "a"], + [1284, 0, "t"], + [1285, 0, "h"], + [1286, 0, "i"], + [1287, 0, "t"], + [1288, 0, "{"], + [1289, 0, "i"], + [1290, 0, "d"], + [1291, 0, "}"], + [1292, 0, ")"], + [1293, 0, " "], + [1294, 0, "="], + [1295, 0, " "], + [1294, 0, "&"], + [1296, 0, "&"], + [1298, 0, "n"], + [1299, 0, " "], + [1300, 0, "\\"], + [1301, 0, "q"], + [1302, 0, "u"], + [1303, 0, "a"], + [1304, 0, "t"], + [1304, 1], + [1304, 0, "d"], + [1305, 0, " "], + [1306, 0, "\\"], + [1307, 0, "m"], + [1308, 0, "a"], + [1309, 0, "t"], + [1310, 0, "h"], + [1311, 0, "r"], + [1312, 0, "m"], + [1313, 0, "{"], + [1314, 0, "s"], + [1315, 0, "u"], + [1316, 0, "c"], + [1317, 0, "h"], + [1318, 0, " "], + [1319, 0, "t"], + [1320, 0, "h"], + [1321, 0, "a"], + [1322, 0, "t"], + [1323, 0, "}"], + [1324, 0, " "], + [1325, 0, "\\"], + [1326, 0, ";"], + [1327, 0, " "], + [1328, 0, "("], + [1329, 0, "\\"], + [1330, 0, "m"], + [1331, 0, "a"], + [1332, 0, "t"], + [1333, 0, "h"], + [1334, 0, "i"], + [1335, 0, "t"], + [1336, 0, "{"], + [1337, 0, "i"], + [1338, 0, "d"], + [1339, 0, "}"], + [1340, 0, ","], + [1341, 0, " "], + [1342, 0, "\\"], + [1343, 0, "v"], + [1344, 0, "i"], + [1345, 0, "s"], + [1346, 0, "i"], + [1347, 0, "b"], + [1348, 0, "l"], + [1349, 0, "e"], + [1350, 0, "s"], + [1351, 0, "p"], + [1352, 0, "a"], + [1353, 0, "c"], + [1354, 0, "e"], + [1355, 0, ","], + [1356, 0, " "], + [1357, 0, "n"], + [1358, 0, ")"], + [1359, 0, " "], + [1360, 0, "\\"], + [1361, 0, "i"], + [1362, 0, "n"], + [1363, 0, " "], + [1364, 0, "A"], + [1343, 0, "t"], + [1344, 0, "e"], + [1345, 0, "x"], + [1346, 0, "t"], + [1260, 1], + [1259, 1], + [1258, 1], + [1257, 1], + [1256, 1], + [1255, 1], + [1254, 1], + [1253, 1], + [1253, 0, "a"], + [1254, 0, "l"], + [1255, 0, "i"], + [1256, 0, "g"], + [1257, 0, "n"], + [1379, 1], + [1378, 1], + [1377, 1], + [1376, 1], + [1375, 1], + [1374, 1], + [1373, 1], + [1372, 1], + [1372, 0, "a"], + [1373, 0, "l"], + [1374, 0, "i"], + [1375, 0, "g"], + [1376, 0, "n"], + [75, 0, "\n"], + [76, 0, "\\"], + [77, 0, "u"], + [78, 0, "s"], + [79, 0, "e"], + [80, 0, "p"], + [81, 0, "a"], + [82, 0, "c"], + [83, 0, "k"], + [84, 0, "a"], + [85, 0, "g"], + [86, 0, "e"], + [87, 0, "{"], + [88, 0, "a"], + [89, 0, "m"], + [90, 0, "s"], + [91, 0, "m"], + [92, 0, "a"], + [93, 0, "t"], + [94, 0, "h"], + [95, 0, "}"], + [96, 0, " "], + [97, 0, "%"], + [98, 0, " "], + [99, 0, "a"], + [100, 0, "l"], + [101, 0, "i"], + [102, 0, "g"], + [103, 0, "n"], + [104, 0, " "], + [105, 0, "e"], + [106, 0, "n"], + [107, 0, "v"], + [107, 1], + [106, 1], + [106, 0, "n"], + [107, 0, "v"], + [108, 0, "i"], + [109, 0, "r"], + [110, 0, "o"], + [111, 0, "n"], + [112, 0, "m"], + [113, 0, "e"], + [114, 0, "n"], + [115, 0, "t"], + [1334, 1], + [1349, 1], + [1348, 1], + [1347, 1], + [1346, 1], + [1345, 1], + [1344, 1], + [1344, 0, "t"], + [1345, 0, "e"], + [1346, 0, "x"], + [1347, 0, "t"], + [1361, 1], + [1361, 0, "q"], + [1362, 0, "u"], + [1363, 0, "a"], + [1364, 0, "d"], + [1407, 0, "\n"], + [1408, 0, "\\"], + [1409, 0, "m"], + [1410, 0, "a"], + [1411, 0, "t"], + [1412, 0, "h"], + [1413, 0, "r"], + [1414, 0, "m"], + [1415, 0, "{"], + [1416, 0, "v"], + [1417, 0, "a"], + [1418, 0, "l"], + [1419, 0, "}"], + [1420, 0, "("], + [1421, 0, "A"], + [1422, 0, ","], + [1423, 0, " "], + [1424, 0, "\\"], + [1425, 0, "m"], + [1426, 0, "a"], + [1427, 0, "t"], + [1428, 0, "h"], + [1429, 0, "i"], + [1430, 0, "t"], + [1431, 0, "{"], + [1432, 0, "i"], + [1433, 0, "d"], + [1434, 0, "}"], + [1435, 0, ")"], + [1436, 0, " "], + [1437, 0, " "], + [1438, 0, "&"], + [1439, 0, "="], + [1440, 0, " "], + [1441, 0, "n"], + [1442, 0, " "], + [1443, 0, "\\"], + [1444, 0, "q"], + [1445, 0, "u"], + [1446, 0, "a"], + [1447, 0, "d"], + [1448, 0, " "], + [1449, 0, "\\"], + [1450, 0, "t"], + [1451, 0, "e"], + [1452, 0, "x"], + [1453, 0, "t"], + [1454, 0, "{"], + [1455, 0, "s"], + [1456, 0, "u"], + [1457, 0, "c"], + [1458, 0, "h"], + [1459, 0, " "], + [1460, 0, "t"], + [1461, 0, "h"], + [1462, 0, "a"], + [1463, 0, "t"], + [1464, 0, "}"], + [1465, 0, " "], + [1466, 0, "\\"], + [1467, 0, "q"], + [1468, 0, "u"], + [1469, 0, "a"], + [1470, 0, "d"], + [1471, 0, " "], + [1472, 0, "("], + [1473, 0, "\\"], + [1474, 0, "m"], + [1475, 0, "a"], + [1476, 0, "t"], + [1477, 0, "h"], + [1478, 0, "i"], + [1479, 0, "d"], + [1480, 0, "{"], + [1481, 0, "i"], + [1482, 0, "d"], + [1483, 0, "}"], + [1484, 0, ","], + [1485, 0, " "], + [1441, 1], + [1441, 0, "v"], + [1486, 0, "v"], + [1487, 0, ","], + [1488, 0, " "], + [1489, 0, "\\"], + [1490, 0, "t"], + [1491, 0, "e"], + [1492, 0, "x"], + [1493, 0, "t"], + [1494, 0, "v"], + [1495, 0, "i"], + [1496, 0, "s"], + [1497, 0, "i"], + [1498, 0, "s"], + [1498, 1], + [1498, 0, "b"], + [1499, 0, "l"], + [1500, 0, "e"], + [1501, 0, "s"], + [1502, 0, "p"], + [1503, 0, "a"], + [1504, 0, "c"], + [1505, 0, "e"], + [1506, 0, ")"], + [1507, 0, " "], + [1508, 0, "\\"], + [1509, 0, "i"], + [1510, 0, "n"], + [1511, 0, " "], + [1512, 0, "A"], + [1407, 0, " "], + [1408, 0, "\\"], + [1409, 0, "\\"], + [325, 0, "\n"], + [326, 0, "\n"], + [327, 0, "%"], + [328, 0, " "], + [329, 0, "L"], + [330, 0, "i"], + [331, 0, "k"], + [332, 0, "e"], + [333, 0, " "], + [334, 0, "\\"], + [335, 0, "t"], + [336, 0, "e"], + [337, 0, "x"], + [338, 0, "t"], + [339, 0, "v"], + [340, 0, "i"], + [341, 0, "s"], + [342, 0, "i"], + [343, 0, "b"], + [344, 0, "l"], + [345, 0, "e"], + [346, 0, "s"], + [347, 0, "p"], + [348, 0, "a"], + [349, 0, "c"], + [350, 0, "e"], + [329, 0, "P"], + [330, 0, "l"], + [331, 0, "a"], + [332, 0, "c"], + [333, 0, "e"], + [334, 0, " "], + [334, 1], + [334, 0, "h"], + [335, 0, "j"], + [336, 0, "o"], + [336, 1], + [335, 1], + [335, 0, "o"], + [336, 0, "l"], + [337, 0, "d"], + [338, 0, "e"], + [339, 0, "r"], + [340, 0, " "], + [341, 0, "c"], + [342, 0, "h"], + [343, 0, "a"], + [344, 0, "r"], + [345, 0, "a"], + [346, 0, "c"], + [347, 0, "t"], + [348, 0, "e"], + [349, 0, "r"], + [350, 0, " "], + [351, 1], + [351, 0, "l"], + [373, 0, ","], + [374, 0, " "], + [375, 0, "b"], + [376, 0, "u"], + [377, 0, "t"], + [378, 0, " "], + [379, 0, "w"], + [380, 0, "o"], + [381, 0, "r"], + [382, 0, "k"], + [383, 0, "s"], + [384, 0, " "], + [385, 0, "i"], + [386, 0, "n"], + [387, 0, " "], + [388, 0, "m"], + [389, 0, "a"], + [390, 0, "t"], + [391, 0, "h"], + [392, 0, " "], + [393, 0, "m"], + [394, 0, "o"], + [395, 0, "d"], + [396, 0, "e"], + [397, 0, "\n"], + [398, 0, "\\"], + [399, 0, "n"], + [400, 0, "e"], + [401, 0, "w"], + [402, 0, "c"], + [403, 0, "o"], + [404, 0, "m"], + [405, 0, "m"], + [406, 0, "a"], + [407, 0, "n"], + [408, 0, "d"], + [409, 0, "\\"], + [410, 0, "p"], + [411, 0, "l"], + [412, 0, "a"], + [413, 0, "c"], + [414, 0, "e"], + [415, 0, "h"], + [416, 0, "o"], + [417, 0, "l"], + [418, 0, "d"], + [419, 0, "e"], + [420, 0, "r"], + [421, 0, "{"], + [422, 0, "%"], + [423, 0, "\n"], + [424, 0, " "], + [425, 0, " "], + [426, 0, "\\"], + [427, 0, "m"], + [428, 0, "a"], + [429, 0, "k"], + [430, 0, "e"], + [431, 0, "b"], + [432, 0, "o"], + [433, 0, "x"], + [434, 0, "["], + [435, 0, "0"], + [436, 0, "."], + [437, 0, "5"], + [438, 0, "e"], + [439, 0, "m"], + [440, 0, "]"], + [441, 0, "{"], + [442, 0, "%"], + [443, 0, "\n"], + [444, 0, " "], + [445, 0, " "], + [446, 0, " "], + [447, 0, " "], + [448, 0, "\\"], + [449, 0, "k"], + [450, 0, "e"], + [451, 0, "r"], + [452, 0, "n"], + [453, 0, "0"], + [454, 0, "."], + [454, 1], + [453, 1], + [452, 1], + [452, 0, "n"], + [453, 0, "."], + [454, 0, "0"], + [455, 0, "7"], + [456, 0, "e"], + [457, 0, "m"], + [458, 0, "\n"], + [459, 0, " "], + [460, 0, " "], + [461, 0, " "], + [462, 0, " "], + [463, 0, "\\"], + [464, 0, "v"], + [465, 0, "r"], + [466, 0, "u"], + [467, 0, "l"], + [468, 0, "e"], + [469, 0, " "], + [470, 0, "h"], + [471, 0, "e"], + [472, 0, "i"], + [473, 0, "g"], + [474, 0, "h"], + [475, 0, "t"], + [476, 0, "."], + [477, 0, "3"], + [478, 0, "e"], + [479, 0, "x"], + [480, 0, "\n"], + [481, 0, " "], + [482, 0, " "], + [483, 0, " "], + [484, 0, " "], + [485, 0, "\\"], + [486, 0, "h"], + [487, 0, "r"], + [488, 0, "u"], + [489, 0, "l"], + [490, 0, "e"], + [491, 0, "f"], + [492, 0, "i"], + [493, 0, "l"], + [494, 0, "l"], + [495, 0, "\n"], + [496, 0, " "], + [497, 0, " "], + [498, 0, " "], + [499, 0, " "], + [500, 0, "\\"], + [501, 0, "v"], + [502, 0, "r"], + [503, 0, "u"], + [504, 0, "l"], + [505, 0, "e"], + [506, 0, " "], + [507, 0, "h"], + [508, 0, "e"], + [509, 0, "i"], + [510, 0, "g"], + [511, 0, "h"], + [512, 0, "t"], + [513, 0, "."], + [514, 0, "3"], + [515, 0, "e"], + [516, 0, "x"], + [517, 0, "\n"], + [518, 0, " "], + [519, 0, " "], + [520, 0, " "], + [521, 0, " "], + [522, 0, " "], + [522, 1], + [522, 0, "\\"], + [523, 0, "k"], + [524, 0, "e"], + [525, 0, "r"], + [526, 0, "n"], + [527, 0, "."], + [528, 0, "0"], + [529, 0, "7"], + [530, 0, "e"], + [531, 0, "m"], + [532, 0, "\n"], + [533, 0, " "], + [534, 0, " "], + [535, 0, "}"], + [536, 0, "%"], + [537, 0, "\n"], + [538, 0, "}"], + [1722, 1], + [1721, 1], + [1720, 1], + [1719, 1], + [1718, 1], + [1717, 1], + [1716, 1], + [1715, 1], + [1714, 1], + [1713, 1], + [1712, 1], + [1711, 1], + [1710, 1], + [1709, 1], + [1708, 1], + [1707, 1], + [1707, 0, "p"], + [1708, 0, "l"], + [1709, 0, "a"], + [1710, 0, "c"], + [1711, 0, "e"], + [1712, 0, "h"], + [1713, 0, "o"], + [1714, 0, "l"], + [1715, 0, "d"], + [1716, 0, "e"], + [1717, 0, "r"], + [1610, 1], + [1609, 1], + [1608, 1], + [1607, 1], + [1606, 1], + [1605, 1], + [1604, 1], + [1603, 1], + [1602, 1], + [1601, 1], + [1600, 1], + [1599, 1], + [1598, 1], + [1597, 1], + [1596, 1], + [1595, 1], + [1595, 0, "p"], + [1596, 0, "l"], + [1597, 0, "a"], + [1598, 0, "c"], + [1599, 0, "e"], + [1600, 0, "h"], + [1601, 0, "o"], + [1602, 0, "l"], + [1603, 0, "d"], + [1604, 0, "e"], + [1605, 0, "r"], + [1691, 1], + [1691, 0, "t"], + [1692, 0, "q"], + [1692, 1], + [1557, 0, "&"], + [1662, 0, "&"], + [1612, 0, "&"], + [1718, 0, "&"], + [437, 1], + [437, 0, "8"], + [1557, 1], + [1662, 1], + [1573, 0, "&"], + [1679, 0, "&"], + [437, 1], + [437, 0, "7"], + [1573, 1], + [1678, 1], + [1716, 1], + [1611, 1], + [1116, 1], + [1115, 1], + [1114, 1], + [1113, 1], + [1112, 1], + [1111, 1], + [1110, 1], + [1109, 1], + [1108, 1], + [1107, 1], + [1106, 1], + [1105, 1], + [1104, 1], + [1103, 1], + [1103, 0, "p"], + [1104, 0, "a"], + [1105, 0, "r"], + [1106, 0, "t"], + [1107, 0, "i"], + [1108, 0, "a"], + [1109, 0, "l"], + [1110, 0, " "], + [1111, 0, "f"], + [1112, 0, "u"], + [1113, 0, "n"], + [1114, 0, "c"], + [1115, 0, "t"], + [1116, 0, "i"], + [1117, 0, "o"], + [1118, 0, "n"], + [1119, 0, " "], + [1120, 0, "f"], + [1121, 0, "r"], + [1122, 0, "o"], + [1123, 0, "m"], + [1124, 0, " "], + [1125, 0, "a"], + [1126, 0, "n"], + [1127, 0, " "], + [1128, 0, "I"], + [1129, 0, "t"], + [1130, 0, "e"], + [1131, 0, "m"], + [1132, 0, "I"], + [1133, 0, "D"], + [1136, 1], + [1147, 0, "$"], + [1148, 0, " "], + [1149, 0, "t"], + [1150, 0, "o"], + [1151, 0, " "], + [1152, 0, "a"], + [1153, 0, " "], + [1154, 0, "p"], + [1155, 0, "a"], + [1156, 0, "i"], + [1157, 0, "r"], + [1158, 0, " "], + [1159, 0, "o"], + [1160, 0, "f"], + [1161, 0, " "], + [1163, 1], + [1162, 1], + [1162, 0, "$"], + [1163, 0, "("], + [1275, 1], + [1274, 1], + [1273, 1], + [1272, 1], + [1271, 1], + [1270, 1], + [1269, 1], + [1268, 1], + [1267, 1], + [1266, 1], + [1265, 1], + [1264, 1], + [1263, 1], + [1262, 1], + [1261, 1], + [1260, 1], + [1259, 1], + [1258, 1], + [1257, 1], + [1256, 1], + [1255, 1], + [1254, 1], + [1253, 1], + [1252, 1], + [1251, 1], + [1250, 1], + [1249, 1], + [1248, 1], + [1247, 1], + [1133, 1], + [1132, 1], + [1131, 1], + [1130, 1], + [1129, 1], + [1128, 1], + [1127, 1], + [1126, 1], + [1125, 1], + [1124, 1], + [1143, 1], + [1142, 1], + [1146, 0, "s"], + [1200, 1], + [1199, 1], + [1198, 1], + [1197, 1], + [1196, 1], + [1196, 0, "l"], + [1197, 0, "i"], + [1198, 0, "s"], + [1199, 0, "t"], + [1234, 1], + [1233, 1], + [1232, 1], + [1231, 1], + [1230, 1], + [1230, 0, "a"], + [1231, 0, "s"], + [1232, 0, " "], + [1233, 0, "f"], + [1234, 0, "o"], + [1235, 0, "l"], + [1236, 0, "l"], + [1237, 0, "o"], + [1238, 0, "w"], + [1239, 0, "s"], + [1261, 1], + [1269, 0, "("], + [1267, 1], + [1267, 0, " "], + [1268, 0, "\\"], + [1269, 0, "m"], + [1270, 0, "a"], + [1271, 0, "p"], + [1272, 0, "s"], + [1273, 0, "t"], + [1274, 0, "o"], + [1266, 1], + [1265, 1], + [1264, 1], + [1263, 1], + [1262, 1], + [1262, 0, "m"], + [1263, 0, "a"], + [1264, 0, "t"], + [1265, 0, "h"], + [1266, 0, "s"], + [1267, 0, "f"], + [1268, 0, "{"], + [1269, 0, "h"], + [1270, 0, "e"], + [1271, 0, "a"], + [1272, 0, "d"], + [1273, 0, "}"], + [1295, 1], + [1294, 1], + [1293, 1], + [1292, 1], + [1291, 1], + [1291, 0, "m"], + [1292, 0, "a"], + [1293, 0, "t"], + [1294, 0, "h"], + [1295, 0, "s"], + [1296, 0, "f"], + [1297, 0, "{"], + [1298, 0, "t"], + [1299, 0, "a"], + [1300, 0, "i"], + [1301, 0, "l"], + [1302, 0, "}"], + [1322, 1], + [1321, 1], + [1320, 1], + [1319, 1], + [1318, 1], + [1318, 0, "m"], + [1319, 0, "a"], + [1320, 0, "t"], + [1321, 0, "h"], + [1322, 0, "s"], + [1323, 0, "f"], + [1324, 0, "{"], + [1325, 0, "h"], + [1326, 0, "e"], + [1327, 0, "a"], + [1328, 0, "d"], + [1329, 0, "}"], + [1331, 0, " "], + [1332, 0, "a"], + [1333, 0, "n"], + [1334, 0, "d"], + [1335, 0, " "], + [1336, 0, "$"], + [1337, 0, "\\"], + [1338, 0, "m"], + [1339, 0, "a"], + [1340, 0, "t"], + [1341, 0, "h"], + [1342, 0, "s"], + [1343, 0, "f"], + [1344, 0, "{"], + [1345, 0, "t"], + [1346, 0, "a"], + [1347, 0, "i"], + [1348, 0, "l"], + [1349, 0, "}"], + [1350, 0, "$"], + [1353, 1], + [1352, 1], + [1351, 1], + [1353, 0, "r"], + [1354, 0, "e"], + [1366, 0, "s"], + [1385, 0, " "], + [1386, 0, "a"], + [1387, 0, "n"], + [1388, 0, "d"], + [1389, 0, " "], + [1390, 0, "t"], + [1391, 0, "a"], + [1392, 0, "i"], + [1393, 0, "l"], + [1407, 0, " "], + [1408, 0, "r"], + [1409, 0, "e"], + [1410, 0, "s"], + [1411, 0, "p"], + [1412, 0, "e"], + [1413, 0, "c"], + [1414, 0, "t"], + [1415, 0, "i"], + [1416, 0, "v"], + [1417, 0, "e"], + [1418, 0, "l"], + [1419, 0, "y"], + [1458, 1], + [1457, 1], + [1456, 1], + [1455, 1], + [1454, 1], + [1453, 1], + [1452, 1], + [1451, 1], + [1450, 1], + [1449, 1], + [1448, 1], + [1447, 1], + [1446, 1], + [1445, 1], + [1444, 1], + [1443, 1], + [1442, 1], + [1441, 1], + [1440, 1], + [1439, 1], + [1438, 1], + [1437, 1], + [1436, 1], + [1435, 1], + [1434, 1], + [1433, 1], + [1432, 1], + [1431, 1], + [1430, 1], + [1429, 1], + [1428, 1], + [1427, 1], + [1426, 1], + [1425, 1], + [1424, 1], + [1423, 1], + [1422, 1], + [1421, 1], + [1420, 1], + [1434, 1], + [1433, 1], + [1433, 0, "d"], + [1434, 0, "e"], + [1435, 0, "n"], + [1436, 0, "o"], + [1437, 0, "t"], + [1438, 0, "e"], + [1439, 0, "s"], + [1763, 1], + [1762, 1], + [1761, 1], + [1760, 1], + [1759, 1], + [1758, 1], + [1757, 1], + [1756, 1], + [1755, 1], + [1754, 1], + [1753, 1], + [1752, 1], + [1751, 1], + [1750, 1], + [1749, 1], + [1748, 1], + [1747, 1], + [1746, 1], + [1745, 1], + [1744, 1], + [1743, 1], + [1742, 1], + [1741, 1], + [1740, 1], + [1739, 1], + [1738, 1], + [1737, 1], + [1736, 1], + [1735, 1], + [1734, 1], + [1733, 1], + [1732, 1], + [1731, 1], + [1730, 1], + [1729, 1], + [1728, 1], + [1727, 1], + [1726, 1], + [1725, 1], + [1724, 1], + [1723, 1], + [1722, 1], + [1721, 1], + [1720, 1], + [1719, 1], + [1718, 1], + [1717, 1], + [1716, 1], + [1715, 1], + [1714, 1], + [1713, 1], + [1712, 1], + [1711, 1], + [1710, 1], + [1709, 1], + [1708, 1], + [1707, 1], + [1706, 1], + [1705, 1], + [1704, 1], + [1703, 1], + [1702, 1], + [1701, 1], + [1700, 1], + [1699, 1], + [1698, 1], + [1697, 1], + [1696, 1], + [1695, 1], + [1694, 1], + [1693, 1], + [1692, 1], + [1691, 1], + [1690, 1], + [1689, 1], + [1688, 1], + [1687, 1], + [1686, 1], + [1685, 1], + [1684, 1], + [1683, 1], + [1682, 1], + [1681, 1], + [1680, 1], + [1679, 1], + [1678, 1], + [1677, 1], + [1676, 1], + [1675, 1], + [1674, 1], + [1673, 1], + [1672, 1], + [1671, 1], + [1670, 1], + [1669, 1], + [1668, 1], + [1667, 1], + [1666, 1], + [1665, 1], + [1664, 1], + [1663, 1], + [1662, 1], + [1661, 1], + [1660, 1], + [1659, 1], + [1658, 1], + [1657, 1], + [1656, 1], + [1655, 1], + [1654, 1], + [1653, 1], + [1652, 1], + [1651, 1], + [1650, 1], + [1649, 1], + [1648, 1], + [1647, 1], + [1646, 1], + [1645, 1], + [1644, 1], + [1643, 1], + [1642, 1], + [1641, 1], + [1640, 1], + [1639, 1], + [1638, 1], + [1637, 1], + [1636, 1], + [1635, 1], + [1634, 1], + [1633, 1], + [1632, 1], + [1631, 1], + [1630, 1], + [1629, 1], + [1628, 1], + [1627, 1], + [1626, 1], + [1625, 1], + [1624, 1], + [1623, 1], + [1622, 1], + [1621, 1], + [1620, 1], + [1619, 1], + [1618, 1], + [1617, 1], + [1616, 1], + [1615, 1], + [1614, 1], + [1613, 1], + [1612, 1], + [1611, 1], + [1610, 1], + [1609, 1], + [1608, 1], + [1607, 1], + [1606, 1], + [1605, 1], + [1604, 1], + [1603, 1], + [1602, 1], + [1601, 1], + [1600, 1], + [1599, 1], + [1598, 1], + [1597, 1], + [1596, 1], + [1595, 1], + [1594, 1], + [1593, 1], + [1592, 1], + [1591, 1], + [1590, 1], + [1589, 1], + [1588, 1], + [1587, 1], + [1586, 1], + [1585, 1], + [1584, 1], + [1583, 1], + [1582, 1], + [1581, 1], + [1580, 1], + [1579, 1], + [1578, 1], + [1577, 1], + [1576, 1], + [1575, 1], + [1574, 1], + [1573, 1], + [1572, 1], + [1571, 1], + [1570, 1], + [1569, 1], + [1568, 1], + [1567, 1], + [1566, 1], + [1565, 1], + [1564, 1], + [1563, 1], + [1562, 1], + [1561, 1], + [1560, 1], + [1559, 1], + [1558, 1], + [1557, 1], + [1556, 1], + [1555, 1], + [1554, 1], + [1553, 1], + [1552, 1], + [1551, 1], + [1550, 1], + [1549, 1], + [1548, 1], + [1547, 1], + [1546, 1], + [1545, 1], + [1544, 1], + [1543, 1], + [1542, 1], + [1541, 1], + [1540, 1], + [1539, 1], + [1538, 1], + [1537, 1], + [1536, 1], + [1535, 1], + [1534, 1], + [1533, 1], + [1532, 1], + [1531, 1], + [1530, 1], + [1529, 1], + [1528, 1], + [1527, 1], + [1526, 1], + [1525, 1], + [1524, 1], + [1523, 1], + [1522, 1], + [1521, 1], + [1520, 1], + [1519, 1], + [1518, 1], + [1517, 1], + [1516, 1], + [1515, 1], + [1514, 1], + [1513, 1], + [1512, 1], + [1511, 1], + [1510, 1], + [1509, 1], + [1508, 1], + [1507, 1], + [1506, 1], + [1505, 1], + [1504, 1], + [1503, 1], + [1502, 1], + [1501, 1], + [1500, 1], + [1499, 1], + [1498, 1], + [1497, 1], + [1496, 1], + [1495, 1], + [1494, 1], + [1493, 1], + [1492, 1], + [1491, 1], + [1490, 1], + [1489, 1], + [1488, 1], + [1487, 1], + [1486, 1], + [1485, 1], + [1484, 1], + [1483, 1], + [1482, 1], + [1481, 1], + [1480, 1], + [1479, 1], + [1478, 1], + [1477, 1], + [1476, 1], + [1475, 1], + [1474, 1], + [1473, 1], + [1472, 1], + [1471, 1], + [1470, 1], + [1469, 1], + [1468, 1], + [1467, 1], + [1466, 1], + [1239, 1], + [1238, 1], + [1237, 1], + [1236, 1], + [1235, 1], + [1234, 1], + [1233, 1], + [1233, 0, "a"], + [1234, 0, " "], + [1235, 0, "f"], + [1236, 0, "u"], + [1237, 0, "n"], + [1238, 0, "c"], + [1239, 0, "t"], + [1240, 0, "i"], + [1241, 0, "o"], + [1242, 0, "n"], + [1243, 0, " "], + [1244, 0, "w"], + [1245, 0, "h"], + [1246, 0, "o"], + [1247, 0, "s"], + [1248, 0, "e"], + [1249, 0, " "], + [1250, 0, "d"], + [1251, 0, "o"], + [1252, 0, "m"], + [1253, 0, "a"], + [1254, 0, "i"], + [1255, 0, "n"], + [1256, 0, " "], + [1257, 0, "i"], + [1258, 0, "s"], + [1259, 0, " "], + [1260, 0, "t"], + [1261, 0, "h"], + [1262, 0, "e"], + [1263, 0, " "], + [1264, 0, "s"], + [1265, 0, "i"], + [1266, 0, "n"], + [1267, 0, "g"], + [1268, 0, "l"], + [1269, 0, "e"], + [1270, 0, " "], + [1271, 0, "v"], + [1272, 0, "a"], + [1273, 0, "l"], + [1274, 0, "u"], + [1275, 0, "e"], + [1276, 0, " "], + [1277, 0, "$"], + [1278, 0, "\\"], + [1279, 0, "m"], + [1280, 0, "a"], + [1281, 0, "t"], + [1282, 0, "h"], + [1283, 0, "i"], + [1284, 0, "t"], + [1285, 0, "{"], + [1286, 0, "h"], + [1287, 0, "e"], + [1288, 0, "a"], + [1289, 0, "d"], + [1290, 0, "}"], + [1291, 0, "$"], + [1284, 1], + [1283, 1], + [1283, 0, "s"], + [1284, 0, "f"], + [1518, 0, "W"], + [1519, 0, "e"], + [1520, 0, " "], + [1521, 0, "u"], + [1522, 0, "s"], + [1523, 0, "e"], + [1524, 0, " "], + [1525, 0, "t"], + [1526, 0, "h"], + [1527, 0, "e"], + [1528, 0, " "], + [1529, 0, "n"], + [1530, 0, "o"], + [1531, 0, "t"], + [1532, 0, "a"], + [1533, 0, "t"], + [1534, 0, "i"], + [1535, 0, "o"], + [1536, 0, "n"], + [1537, 0, " "], + [1538, 0, "$"], + [1539, 0, "A"], + [1540, 0, "\\"], + [1541, 0, "["], + [1542, 0, "a"], + [1543, 0, " "], + [1544, 0, "\\"], + [1545, 0, "m"], + [1546, 0, "a"], + [1547, 0, "p"], + [1548, 0, "s"], + [1549, 0, "t"], + [1550, 0, "o"], + [1551, 0, " "], + [1552, 0, "("], + [1553, 0, "b"], + [1554, 0, ","], + [1555, 0, " "], + [1556, 0, "c"], + [1557, 0, ")"], + [1558, 0, "\\"], + [1559, 0, "]"], + [1560, 0, "$"], + [1561, 0, " "], + [1562, 0, "t"], + [1563, 0, "o"], + [1564, 0, " "], + [1565, 0, "d"], + [1566, 0, "e"], + [1567, 0, "n"], + [1568, 0, "o"], + [1569, 0, "t"], + [1570, 0, "e"], + [1571, 0, " "], + [1572, 0, "a"], + [1573, 0, " "], + [1574, 0, "f"], + [1575, 0, "u"], + [1576, 0, "n"], + [1577, 0, "c"], + [1578, 0, "t"], + [1579, 0, "i"], + [1580, 0, "o"], + [1581, 0, "n"], + [1582, 0, " "], + [1583, 0, "i"], + [1584, 0, "d"], + [1585, 0, "e"], + [1586, 0, "n"], + [1587, 0, "t"], + [1588, 0, "i"], + [1589, 0, "c"], + [1590, 0, "a"], + [1591, 0, "l"], + [1592, 0, " "], + [1593, 0, "t"], + [1594, 0, "o"], + [1595, 0, " "], + [1596, 0, "$"], + [1597, 0, "A"], + [1598, 0, "$"], + [1599, 0, ","], + [1600, 0, " "], + [1601, 0, "e"], + [1602, 0, "x"], + [1603, 0, "c"], + [1604, 0, "e"], + [1605, 0, "p"], + [1606, 0, "t"], + [1607, 0, " "], + [1608, 0, "t"], + [1609, 0, "h"], + [1610, 0, "a"], + [1611, 0, "t"], + [1612, 0, " "], + [1613, 0, "$"], + [1614, 0, "A"], + [1615, 0, "("], + [1616, 0, "a"], + [1617, 0, ")"], + [1618, 0, "="], + [1619, 0, "("], + [1620, 0, "b"], + [1621, 0, ","], + [1622, 0, "c"], + [1623, 0, ")"], + [1624, 0, "$"], + [1625, 0, "."], + [1558, 1], + [1540, 1], + [1625, 0, "\n"], + [1626, 0, "\n"], + [1626, 0, "T"], + [1627, 0, "h"], + [1628, 0, "e"], + [1629, 0, " "], + [1630, 0, "o"], + [1631, 0, "p"], + [1632, 0, "e"], + [1633, 0, "r"], + [1634, 0, "a"], + [1635, 0, "t"], + [1636, 0, "i"], + [1637, 0, "o"], + [1638, 0, "n"], + [1639, 0, " "], + [1640, 0, "$"], + [1641, 0, "\\"], + [1642, 0, "m"], + [1643, 0, "a"], + [1644, 0, "t"], + [1645, 0, "h"], + [1646, 0, "s"], + [1647, 0, "f"], + [1648, 0, "{"], + [1649, 0, "i"], + [1650, 0, "n"], + [1651, 0, "s"], + [1652, 0, "e"], + [1653, 0, "r"], + [1654, 0, "t"], + [1655, 0, "}"], + [1656, 0, "("], + [1657, 0, "\\"], + [1658, 0, "m"], + [1659, 0, "a"], + [1660, 0, "t"], + [1661, 0, "h"], + [1662, 0, "i"], + [1663, 0, "t"], + [1664, 0, "{"], + [1665, 0, "i"], + [1666, 0, "d"], + [1667, 0, "}"], + [1668, 0, ","], + [1669, 0, " "], + [1670, 0, "\\"], + [1671, 0, "m"], + [1672, 0, "a"], + [1673, 0, "t"], + [1674, 0, "h"], + [1675, 0, "i"], + [1676, 0, "t"], + [1677, 0, "{"], + [1678, 0, "p"], + [1679, 0, "r"], + [1680, 0, "e"], + [1681, 0, "v"], + [1682, 0, "}"], + [1683, 0, " "], + [1683, 1], + [1683, 0, ","], + [1684, 0, " "], + [1685, 0, "v"], + [1686, 0, ")"], + [1687, 0, "$"], + [1688, 0, " "], + [1689, 0, "i"], + [1690, 0, "s"], + [1691, 0, " "], + [1692, 0, "a"], + [1693, 0, "n"], + [1694, 0, " "], + [1695, 0, "i"], + [1696, 0, "n"], + [1697, 0, "s"], + [1698, 0, "t"], + [1699, 0, "r"], + [1700, 0, "u"], + [1701, 0, "c"], + [1702, 0, "t"], + [1703, 0, "i"], + [1704, 0, "o"], + [1705, 0, "n"], + [1706, 0, " "], + [1707, 0, "t"], + [1708, 0, "o"], + [1709, 0, " "], + [1710, 0, "i"], + [1711, 0, "n"], + [1712, 0, "s"], + [1713, 0, "e"], + [1714, 0, "r"], + [1715, 0, "t"], + [1716, 0, " "], + [1717, 0, "t"], + [1718, 0, "h"], + [1719, 0, "e"], + [1720, 0, " "], + [1721, 0, "v"], + [1722, 0, "a"], + [1723, 0, "l"], + [1724, 0, "u"], + [1725, 0, "e"], + [1726, 0, " "], + [1727, 0, "$"], + [1728, 0, "v"], + [1729, 0, "$"], + [1730, 0, " "], + [1731, 0, "i"], + [1732, 0, "n"], + [1733, 0, "t"], + [1734, 0, "o"], + [1735, 0, " "], + [1736, 0, "a"], + [1737, 0, " "], + [1738, 0, "l"], + [1739, 0, "i"], + [1740, 0, "s"], + [1741, 0, "t"], + [1742, 0, " "], + [1743, 0, "a"], + [1744, 0, "t"], + [1745, 0, " "], + [1746, 0, "a"], + [1747, 0, " "], + [1748, 0, "p"], + [1749, 0, "o"], + [1750, 0, "s"], + [1751, 0, "i"], + [1752, 0, "t"], + [1753, 0, "i"], + [1754, 0, "o"], + [1755, 0, "n"], + [1756, 0, " "], + [1757, 0, "f"], + [1758, 0, "o"], + [1759, 0, "l"], + [1760, 0, "l"], + [1761, 0, "o"], + [1762, 0, "w"], + [1763, 0, "i"], + [1764, 0, "n"], + [1765, 0, "g"], + [1766, 0, " "], + [1767, 0, "t"], + [1768, 0, "h"], + [1769, 0, "e"], + [1770, 0, " "], + [1771, 0, "e"], + [1772, 0, "x"], + [1773, 0, "i"], + [1774, 0, "s"], + [1775, 0, "t"], + [1776, 0, "i"], + [1777, 0, "n"], + [1778, 0, "g"], + [1779, 0, " "], + [1780, 0, "l"], + [1781, 0, "i"], + [1782, 0, "s"], + [1783, 0, "t"], + [1784, 0, " "], + [1785, 0, "e"], + [1786, 0, "l"], + [1787, 0, "e"], + [1788, 0, "m"], + [1789, 0, "e"], + [1790, 0, "n"], + [1791, 0, "t"], + [1792, 0, " "], + [1793, 0, "w"], + [1794, 0, "i"], + [1795, 0, "t"], + [1796, 0, "h"], + [1797, 0, " "], + [1798, 0, "I"], + [1799, 0, "D"], + [1800, 0, " "], + [1801, 0, "$"], + [1802, 0, "\\"], + [1803, 0, "m"], + [1804, 0, "a"], + [1805, 0, "t"], + [1806, 0, "h"], + [1807, 0, "i"], + [1808, 0, "t"], + [1809, 0, "{"], + [1810, 0, "p"], + [1811, 0, "r"], + [1812, 0, "e"], + [1813, 0, "v"], + [1814, 0, "}"], + [1815, 0, "$"], + [1816, 0, " "], + [1817, 0, "("], + [1817, 1], + [1816, 1], + [1816, 0, "."], + [1817, 0, " "], + [1818, 0, "A"], + [1819, 0, "n"], + [1820, 0, " "], + [1821, 0, "i"], + [1822, 0, "n"], + [1823, 0, "s"], + [1824, 0, "e"], + [1825, 0, "r"], + [1826, 0, "t"], + [1827, 0, "i"], + [1828, 0, "o"], + [1829, 0, "n"], + [1830, 0, " "], + [1831, 0, "a"], + [1832, 0, "t"], + [1833, 0, " "], + [1834, 0, "t"], + [1835, 0, "h"], + [1836, 0, "e"], + [1837, 0, " "], + [1838, 0, "h"], + [1839, 0, "e"], + [1840, 0, "a"], + [1841, 0, "d"], + [1842, 0, " "], + [1843, 0, "o"], + [1844, 0, "f"], + [1845, 0, " "], + [1846, 0, "t"], + [1847, 0, "h"], + [1848, 0, "e"], + [1849, 0, " "], + [1850, 0, "l"], + [1851, 0, "i"], + [1852, 0, "s"], + [1853, 0, "t"], + [1854, 0, " "], + [1855, 0, "i"], + [1856, 0, "s"], + [1857, 0, " "], + [1858, 0, "e"], + [1859, 0, "x"], + [1860, 0, "p"], + [1861, 0, "r"], + [1862, 0, "e"], + [1863, 0, "s"], + [1864, 0, "s"], + [1865, 0, "e"], + [1866, 0, "d"], + [1867, 0, " "], + [1868, 0, "a"], + [1869, 0, "s"], + [1870, 0, " "], + [1871, 0, "$"], + [1872, 0, "\\"], + [1873, 0, "m"], + [1874, 0, "a"], + [1875, 0, "t"], + [1876, 0, "h"], + [1877, 0, "s"], + [1878, 0, "f"], + [1879, 0, "{"], + [1880, 0, "i"], + [1881, 0, "n"], + [1882, 0, "s"], + [1883, 0, "e"], + [1884, 0, "r"], + [1885, 0, "t"], + [1886, 0, "}"], + [1887, 0, "("], + [1888, 0, "\\"], + [1889, 0, "m"], + [1890, 0, "a"], + [1891, 0, "t"], + [1892, 0, "h"], + [1893, 0, "i"], + [1894, 0, "d"], + [1894, 1], + [1894, 0, "t"], + [1895, 0, "{"], + [1896, 0, "i"], + [1897, 0, "d"], + [1898, 0, "}"], + [1899, 0, ","], + [1900, 0, " "], + [1901, 0, "\\"], + [1902, 0, "m"], + [1903, 0, "a"], + [1904, 0, "t"], + [1905, 0, "h"], + [1906, 0, "s"], + [1907, 0, "f"], + [1908, 0, "{"], + [1909, 0, "h"], + [1910, 0, "e"], + [1911, 0, "a"], + [1912, 0, "d"], + [1913, 0, "}"], + [1914, 0, ","], + [1915, 0, " "], + [1916, 0, "v"], + [1917, 0, ")"], + [1918, 0, "$"], + [1919, 0, "."], + [1920, 0, " "], + [1921, 0, "T"], + [1922, 0, "h"], + [1923, 0, "e"], + [1924, 0, " "], + [1925, 0, "$"], + [1926, 0, "\\"], + [1927, 0, "m"], + [1928, 0, "a"], + [1929, 0, "t"], + [1930, 0, "h"], + [1931, 0, "i"], + [1932, 0, "t"], + [1933, 0, "{"], + [1934, 0, "i"], + [1935, 0, "d"], + [1936, 0, "}"], + [1937, 0, "$"], + [1938, 0, " "], + [1939, 0, "i"], + [1940, 0, "s"], + [1941, 0, " "], + [1942, 0, "t"], + [1943, 0, "h"], + [1944, 0, "e"], + [1945, 0, " "], + [1946, 0, "u"], + [1947, 0, "n"], + [1948, 0, "i"], + [1949, 0, "q"], + [1950, 0, "u"], + [1951, 0, "e"], + [1952, 0, " "], + [1953, 0, "I"], + [1954, 0, "D"], + [1955, 0, " "], + [1956, 0, "o"], + [1957, 0, "f"], + [1958, 0, " "], + [1959, 0, "t"], + [1960, 0, "h"], + [1961, 0, "i"], + [1962, 0, "s"], + [1963, 0, " "], + [1964, 0, "o"], + [1965, 0, "p"], + [1966, 0, "e"], + [1967, 0, "r"], + [1968, 0, "a"], + [1969, 0, "t"], + [1970, 0, "i"], + [1971, 0, "o"], + [1972, 0, "n"], + [1973, 0, "."], + [1974, 0, "\n"], + [1975, 0, "\n"], + [1976, 0, "T"], + [1977, 0, "h"], + [1978, 0, "e"], + [1979, 0, " "], + [1979, 1], + [1978, 1], + [1977, 1], + [1976, 1], + [1976, 0, "W"], + [1977, 0, "h"], + [1978, 0, "e"], + [1979, 0, "n"], + [1980, 0, " "], + [1981, 0, "t"], + [1982, 0, "h"], + [1983, 0, "e"], + [1984, 0, " "], + [1985, 0, "o"], + [1986, 0, "p"], + [1987, 0, "e"], + [1988, 0, "r"], + [1989, 0, "a"], + [1990, 0, "t"], + [1991, 0, "i"], + [1992, 0, "o"], + [1993, 0, "n"], + [1994, 0, " "], + [1995, 0, "i"], + [1996, 0, "s"], + [1997, 0, " "], + [1998, 0, "a"], + [1999, 0, "p"], + [2000, 0, "p"], + [2001, 0, "l"], + [2002, 0, "i"], + [2003, 0, "e"], + [2004, 0, "d"], + [2005, 0, " "], + [2006, 0, "t"], + [2007, 0, "o"], + [2008, 0, " "], + [2009, 0, "a"], + [2010, 0, " "], + [2010, 1], + [2009, 1], + [2009, 0, "t"], + [2010, 0, "h"], + [2011, 0, "e"], + [2012, 0, " "], + [2013, 0, "l"], + [2014, 0, "i"], + [2015, 0, "s"], + [2016, 0, "t"], + [2017, 0, " "], + [2018, 0, "s"], + [2019, 0, "t"], + [2020, 0, "a"], + [2021, 0, "t"], + [2022, 0, "e"], + [2023, 0, " "], + [2024, 0, "$"], + [2025, 0, "A"], + [2026, 0, "$"], + [2027, 0, ","], + [2028, 0, " "], + [2029, 0, "i"], + [2030, 0, "t"], + [2031, 0, " "], + [2032, 0, "p"], + [2033, 0, "r"], + [2034, 0, "o"], + [2035, 0, "d"], + [2036, 0, "u"], + [2037, 0, "c"], + [2038, 0, "e"], + [2039, 0, "s"], + [2040, 0, " "], + [2041, 0, "a"], + [2042, 0, " "], + [2043, 0, "m"], + [2044, 0, "o"], + [2045, 0, "d"], + [2046, 0, "i"], + [2047, 0, "f"], + [2048, 0, "i"], + [2049, 0, "e"], + [2050, 0, "d"], + [2051, 0, " "], + [2052, 0, "l"], + [2053, 0, "i"], + [2054, 0, "s"], + [2055, 0, "t"], + [2056, 0, " "], + [2057, 0, "s"], + [2058, 0, "t"], + [2059, 0, "a"], + [2060, 0, "t"], + [2061, 0, "e"], + [2062, 0, " "], + [2063, 0, "$"], + [2064, 0, "A"], + [2065, 0, "^"], + [2066, 0, "\\"], + [2067, 0, "p"], + [2068, 0, "r"], + [2069, 0, "i"], + [2070, 0, "m"], + [2071, 0, "e"], + [2072, 0, "$"], + [2073, 0, " "], + [2074, 0, "a"], + [2075, 0, "s"], + [2076, 0, " "], + [2077, 0, "f"], + [2078, 0, "o"], + [2079, 0, "l"], + [2080, 0, "l"], + [2081, 0, "o"], + [2082, 0, "w"], + [2083, 0, "s"], + [2084, 0, ":"], + [2085, 0, "\n"], + [2086, 0, "\\"], + [2087, 0, "b"], + [2088, 0, "e"], + [2089, 0, "g"], + [2090, 0, "i"], + [2091, 0, "n"], + [2092, 0, "{"], + [2093, 0, "a"], + [2094, 0, "l"], + [2095, 0, "i"], + [2096, 0, "g"], + [2097, 0, "n"], + [2098, 0, "&"], + [2099, 0, "*"], + [2099, 1], + [2098, 1], + [2098, 0, "*"], + [2099, 0, "}"], + [2100, 0, "\n"], + [2101, 0, "\\"], + [2102, 0, "e"], + [2103, 0, "n"], + [2104, 0, "d"], + [2105, 0, "{"], + [2106, 0, "a"], + [2107, 0, "l"], + [2108, 0, "i"], + [2109, 0, "g"], + [2110, 0, "n"], + [2111, 0, "*"], + [2112, 0, "&"], + [2112, 1], + [2112, 0, "}"], + [2100, 0, "\n"], + [2101, 0, "A"], + [2102, 0, "^"], + [2103, 0, "\\"], + [2104, 0, "p"], + [2105, 0, "r"], + [2106, 0, "i"], + [2107, 0, "m"], + [2108, 0, "e"], + [2109, 0, " "], + [2110, 0, "="], + [2111, 0, " "], + [2112, 0, "\\"], + [2113, 0, "m"], + [2114, 0, "a"], + [2115, 0, "t"], + [2116, 0, "h"], + [2117, 0, "r"], + [2118, 0, "m"], + [2119, 0, "{"], + [2120, 0, "a"], + [2121, 0, "p"], + [2122, 0, "p"], + [2123, 0, "l"], + [2124, 0, "y"], + [2125, 0, "}"], + [2126, 0, "("], + [2127, 0, "A"], + [2128, 0, ","], + [2129, 0, " "], + [2130, 0, "\\"], + [2131, 0, "m"], + [2132, 0, "a"], + [2133, 0, "t"], + [2134, 0, "h"], + [2135, 0, "s"], + [2136, 0, "f"], + [2137, 0, "{"], + [2138, 0, "i"], + [2139, 0, "n"], + [2140, 0, "s"], + [2141, 0, "e"], + [2142, 0, "r"], + [2143, 0, "t"], + [2144, 0, "}"], + [2145, 0, "("], + [2146, 0, "\\"], + [2147, 0, "m"], + [2148, 0, "a"], + [2149, 0, "t"], + [2150, 0, "h"], + [2151, 0, "i"], + [2152, 0, "t"], + [2153, 0, "{"], + [2154, 0, "i"], + [2155, 0, "d"], + [2156, 0, "}"], + [2157, 0, " "], + [2157, 1], + [2157, 0, ","], + [2158, 0, " "], + [2159, 0, "\\"], + [2160, 0, "m"], + [2161, 0, "a"], + [2162, 0, "t"], + [2163, 0, "h"], + [2164, 0, "i"], + [2165, 0, "t"], + [2166, 0, "{"], + [2167, 0, "p"], + [2168, 0, "r"], + [2169, 0, "e"], + [2170, 0, "v"], + [2171, 0, "}"], + [2172, 0, ","], + [2173, 0, " "], + [2174, 0, "v"], + [2175, 0, ")"], + [2176, 0, ")"], + [2177, 0, " "], + [2178, 0, "="], + [2071, 1], + [2070, 1], + [2069, 1], + [2068, 1], + [2067, 1], + [2066, 1], + [2065, 1], + [2065, 0, "'"], + [2102, 1], + [2101, 1], + [2100, 1], + [2099, 1], + [2098, 1], + [2097, 1], + [2096, 1], + [2096, 0, "'"], + [2167, 0, " "], + [2168, 0, "\\"], + [2169, 0, "\\"], + [2170, 0, "\n"], + [2171, 0, "\\"], + [2172, 0, "b"], + [2173, 0, "e"], + [2174, 0, "g"], + [2175, 0, "i"], + [2176, 0, "n"], + [2177, 0, "{"], + [2178, 0, "c"], + [2179, 0, "a"], + [2180, 0, "s"], + [2181, 0, "e"], + [2182, 0, "s"], + [2183, 0, "}"], + [2184, 0, "\n"], + [2185, 0, "\\"], + [2186, 0, "e"], + [2187, 0, "n"], + [2188, 0, "d"], + [2189, 0, "{"], + [2190, 0, "c"], + [2191, 0, "a"], + [2192, 0, "s"], + [2193, 0, "e"], + [2194, 0, "s"], + [2195, 0, "}"], + [2184, 0, "\n"], + [2185, 0, "a"], + [2186, 0, " "], + [2187, 0, "&"], + [2188, 0, " "], + [2189, 0, "\\"], + [2190, 0, "q"], + [2191, 0, "u"], + [2192, 0, "a"], + [2193, 0, "d"], + [2194, 0, "\\"], + [2195, 0, "t"], + [2196, 0, "e"], + [2197, 0, "x"], + [2198, 0, "t"], + [2199, 0, "{"], + [2200, 0, "i"], + [2201, 0, "f"], + [2202, 0, " "], + [2203, 0, "f"], + [2204, 0, "o"], + [2205, 0, "o"], + [2206, 0, "}"], + [2205, 1], + [2204, 1], + [2203, 1], + [2185, 1], + [2185, 0, "\\"], + [2186, 0, "m"], + [2187, 0, "a"], + [2188, 0, "t"], + [2189, 0, "h"], + [2190, 0, "r"], + [2191, 0, "m"], + [2192, 0, "{"], + [2193, 0, "a"], + [2194, 0, "p"], + [2195, 0, "p"], + [2196, 0, "l"], + [2197, 0, "y"], + [2198, 0, "}"], + [2199, 0, "("], + [2200, 0, "A"], + [2201, 0, ","], + [2202, 0, " "], + [2203, 0, "\\"], + [2204, 0, "m"], + [2205, 0, "a"], + [2206, 0, "t"], + [2207, 0, "h"], + [2208, 0, "s"], + [2209, 0, "f"], + [2210, 0, "{"], + [2211, 0, "i"], + [2212, 0, "n"], + [2213, 0, "s"], + [2214, 0, "e"], + [2215, 0, "r"], + [2216, 0, "t"], + [2217, 0, "}"], + [2218, 0, "("], + [2219, 0, "\\"], + [2220, 0, "m"], + [2221, 0, "a"], + [2222, 0, "t"], + [2223, 0, "h"], + [2224, 0, "i"], + [2225, 0, "t"], + [2226, 0, "{"], + [2227, 0, "i"], + [2228, 0, "d"], + [2229, 0, "}"], + [2230, 0, ","], + [2231, 0, " "], + [2232, 0, "n"], + [2233, 0, ","], + [2234, 0, " "], + [2235, 0, "v"], + [2236, 0, ")"], + [2237, 0, ")"], + [2256, 0, " "], + [2257, 0, "A"], + [2258, 0, "("], + [2259, 0, "\\"], + [2260, 0, "m"], + [2261, 0, "a"], + [2262, 0, "t"], + [2263, 0, "h"], + [2264, 0, "i"], + [2265, 0, "t"], + [2266, 0, "{"], + [2267, 0, "p"], + [2268, 0, "r"], + [2269, 0, "e"], + [2270, 0, "v"], + [2271, 0, "}"], + [2272, 0, ")"], + [2273, 0, " "], + [2274, 0, "="], + [2275, 0, " "], + [2276, 0, "("], + [2277, 0, "\\"], + [2278, 0, "p"], + [2279, 0, "l"], + [2280, 0, "a"], + [2281, 0, "c"], + [2282, 0, "e"], + [2283, 0, "h"], + [2284, 0, "o"], + [2285, 0, "l"], + [2286, 0, "d"], + [2287, 0, "e"], + [2288, 0, "r"], + [2289, 0, ","], + [2290, 0, " "], + [2291, 0, "n"], + [2292, 0, ")"], + [2091, 1], + [2090, 1], + [2089, 1], + [2088, 1], + [2087, 1], + [2088, 1], + [2087, 1], + [2086, 1], + [2085, 1], + [2084, 1], + [2083, 1], + [2082, 1], + [2081, 1], + [2080, 1], + [2080, 0, "$"], + [2081, 0, "$"], + [2305, 1], + [2304, 1], + [2303, 1], + [2302, 1], + [2301, 1], + [2300, 1], + [2299, 1], + [2298, 1], + [2297, 1], + [2296, 1], + [2295, 1], + [2294, 1], + [2294, 0, "$"], + [2295, 0, "$"], + [2082, 1], + [2082, 0, " "], + [2293, 1], + [2293, 0, " "], + [2081, 1], + [2080, 1], + [2080, 0, "\\"], + [2081, 0, "b"], + [2082, 0, "e"], + [2083, 0, "g"], + [2084, 0, "i"], + [2085, 0, "n"], + [2086, 0, "{"], + [2087, 0, "e"], + [2088, 0, "q"], + [2089, 0, "u"], + [2090, 0, "a"], + [2091, 0, "t"], + [2092, 0, "i"], + [2093, 0, "o"], + [2094, 0, "n"], + [2095, 0, "*"], + [2096, 0, "}"], + [2097, 0, "\n"], + [2098, 1], + [2310, 1], + [2309, 1], + [2308, 1], + [2308, 1], + [2308, 0, "\n"], + [2309, 0, "\\"], + [2310, 0, "e"], + [2311, 0, "n"], + [2312, 0, "d"], + [2313, 0, "{"], + [2314, 0, "e"], + [2315, 0, "q"], + [2316, 0, "u"], + [2317, 0, "a"], + [2318, 0, "t"], + [2319, 0, "i"], + [2320, 0, "o"], + [2321, 0, "n"], + [2322, 0, "*"], + [2323, 0, "}"], + [2324, 0, "\n"], + [2296, 0, " "], + [2297, 0, "\\"], + [2298, 0, "\\"], + [2299, 0, "\n"], + [2300, 0, "A"], + [2301, 0, "["], + [2302, 0, "\\"], + [2303, 0, "m"], + [2304, 0, "a"], + [2305, 0, "t"], + [2306, 0, "h"], + [2307, 0, "i"], + [2308, 0, "t"], + [2309, 0, "{"], + [2310, 0, "p"], + [2311, 0, "r"], + [2312, 0, "e"], + [2313, 0, "v"], + [2314, 0, "]"], + [2314, 1], + [2314, 0, "}"], + [2315, 0, " "], + [2316, 0, "\\"], + [2317, 0, "m"], + [2318, 0, "a"], + [2319, 0, "p"], + [2320, 0, "s"], + [2321, 0, "t"], + [2322, 0, "o"], + [2323, 0, " "], + [2324, 0, "("], + [2325, 0, "v"], + [2326, 0, "_"], + [2327, 0, "p"], + [2328, 0, ","], + [2329, 0, " "], + [2330, 0, "\\"], + [2331, 0, "m"], + [2332, 0, "a"], + [2333, 0, "t"], + [2334, 0, "h"], + [2335, 0, "i"], + [2336, 0, "t"], + [2337, 0, "{"], + [2338, 0, "i"], + [2339, 0, "d"], + [2340, 0, "}"], + [2341, 0, ")"], + [2342, 0, ","], + [2343, 0, " "], + [2344, 0, "\\"], + [2345, 0, "m"], + [2346, 0, "a"], + [2347, 0, "t"], + [2348, 0, "h"], + [2349, 0, "i"], + [2350, 0, "t"], + [2351, 0, "{"], + [2352, 0, "i"], + [2353, 0, "d"], + [2354, 0, "}"], + [2355, 0, " "], + [2356, 0, "\\"], + [2357, 0, "m"], + [2358, 0, "a"], + [2359, 0, "p"], + [2360, 0, "s"], + [2361, 0, "t"], + [2362, 0, "o"], + [2363, 0, " "], + [2364, 0, "("], + [2365, 0, "v"], + [2366, 0, ","], + [2367, 0, " "], + [2368, 0, "n"], + [2369, 0, ")"], + [2370, 0, " "], + [2371, 0, "&"], + [2372, 0, " "], + [2373, 0, "\\"], + [2374, 0, "q"], + [2375, 0, "u"], + [2376, 0, "a"], + [2377, 0, "d"], + [2378, 0, "\\"], + [2379, 0, "t"], + [2380, 0, "e"], + [2381, 0, "x"], + [2382, 0, "t"], + [2383, 0, "{"], + [2384, 0, "i"], + [2385, 0, "f"], + [2386, 0, " "], + [2387, 0, "}"], + [2370, 0, "]"], + [2370, 0, "\\"], + [2371, 0, ","], + [2302, 0, "\\"], + [2303, 0, ","], + [1541, 0, "\\"], + [1542, 0, ","], + [1559, 0, "\\"], + [1560, 0, ","], + [2246, 1], + [2246, 0, "\\"], + [2247, 0, "\\"], + [2248, 1], + [2248, 0, "\n"], + [2249, 0, " "], + [2250, 0, " "], + [2251, 0, " "], + [2252, 0, " "], + [2385, 1], + [2385, 0, "\\"], + [2386, 0, "\\"], + [2387, 0, "\n"], + [2388, 0, " "], + [2389, 0, " "], + [2390, 0, " "], + [2098, 1], + [2097, 1], + [2096, 1], + [2095, 1], + [2094, 1], + [2093, 1], + [2092, 1], + [2091, 1], + [2091, 0, "a"], + [2092, 0, "l"], + [2093, 0, "i"], + [2094, 0, "g"], + [2095, 0, "n"], + [2429, 1], + [2428, 1], + [2427, 1], + [2426, 1], + [2425, 1], + [2424, 1], + [2423, 1], + [2422, 1], + [2422, 0, "a"], + [2423, 0, "l"], + [2424, 0, "i"], + [2425, 0, "g"], + [2426, 0, "n"], + [2265, 0, "\\"], + [2266, 0, "l"], + [2266, 1], + [2266, 0, ";"], + [2263, 1], + [2403, 1], + [2404, 0, "\\"], + [2405, 0, ";"], + [2403, 0, " "], + [2263, 0, " "], + [2304, 0, " "], + [2305, 0, "\\"], + [2306, 0, "w"], + [2307, 0, "e"], + [2308, 0, "d"], + [2309, 0, "g"], + [2310, 0, "e"], + [2311, 0, " "], + [2312, 0, "n"], + [2313, 0, " "], + [2314, 0, ">"], + [2315, 0, " "], + [2315, 1], + [2314, 1], + [2313, 1], + [2312, 1], + [2312, 0, "\\"], + [2313, 0, "m"], + [2314, 0, "a"], + [2315, 0, "t"], + [2316, 0, "h"], + [2317, 0, "i"], + [2318, 0, "t"], + [2319, 0, "{"], + [2320, 0, "i"], + [2321, 0, "d"], + [2322, 0, "}"], + [2323, 0, " "], + [2324, 0, "<"], + [2325, 0, " "], + [2326, 0, "n"], + [2431, 0, " "], + [2432, 0, "A"], + [2433, 0, "("], + [2434, 0, "\\"], + [2435, 0, "m"], + [2436, 0, "a"], + [2437, 0, "t"], + [2438, 0, "h"], + [2439, 0, "i"], + [2440, 0, "t"], + [2441, 0, "{"], + [2442, 0, "p"], + [2443, 0, "r"], + [2444, 0, "e"], + [2445, 0, "v"], + [2446, 0, "}"], + [2447, 0, ")"], + [2448, 0, " "], + [2449, 0, "="], + [2450, 0, " "], + [2451, 0, "("], + [2452, 0, "v"], + [2453, 0, "_"], + [2454, 0, "p"], + [2455, 0, ","], + [2456, 0, " "], + [2457, 0, "n"], + [2458, 0, ")"], + [2459, 0, " "], + [2460, 0, "\\"], + [2461, 0, "w"], + [2462, 0, "e"], + [2463, 0, "d"], + [2464, 0, "g"], + [2465, 0, "e"], + [2466, 0, " "], + [2467, 0, "n"], + [2468, 0, " "], + [2469, 0, "<"], + [2470, 0, " "], + [2471, 0, "\\"], + [2472, 0, "m"], + [2473, 0, "a"], + [2474, 0, "t"], + [2475, 0, "h"], + [2476, 0, "i"], + [2477, 0, "t"], + [2478, 0, "{"], + [2479, 0, "i"], + [2480, 0, "d"], + [2481, 0, "}"], + [2305, 0, "\\"], + [2306, 0, ";"], + [2313, 0, "\\"], + [2314, 0, ";"], + [2464, 0, "\\"], + [2465, 0, ";"], + [2472, 0, "\\"], + [2473, 0, "'"], + [2473, 1], + [2473, 0, ";"], + [2419, 0, "q"], + [2335, 0, "\\"], + [2336, 0, "q"], + [2337, 0, "u"], + [2338, 0, "a"], + [2339, 0, "d"], + [2340, 0, " "], + [2189, 0, "\\"], + [2190, 0, "q"], + [2191, 0, "u"], + [2192, 0, "a"], + [2193, 0, "d"], + [2194, 0, " "], + [2257, 0, "q"], + [2172, 0, "&"], + [2172, 1], + [2102, 0, "&"], + [2175, 0, "&"], + [2395, 0, "\\"], + [2396, 0, ";"], + [2176, 0, "="], + [2175, 0, " "], + [2535, 0, "\n"], + [2536, 0, "\n"], + [2537, 0, "E"], + [2538, 0, "x"], + [2539, 0, "p"], + [2540, 0, "l"], + [2541, 0, "a"], + [2542, 0, "i"], + [2543, 0, "n"], + [2544, 0, "e"], + [2545, 0, "d"], + [2546, 0, " "], + [2547, 0, "i"], + [2548, 0, "n"], + [2549, 0, "f"], + [2550, 0, "o"], + [2551, 0, "r"], + [2552, 0, "m"], + [2553, 0, "a"], + [2554, 0, "l"], + [2555, 0, "l"], + [2556, 0, "y"], + [2557, 0, ","], + [2558, 0, " "], + [2559, 0, "a"], + [2560, 0, "p"], + [2561, 0, "p"], + [2562, 0, "l"], + [2563, 0, "y"], + [2564, 0, "i"], + [2565, 0, "n"], + [2566, 0, "g"], + [2567, 0, " "], + [2568, 0, "a"], + [2569, 0, "n"], + [2570, 0, " "], + [2571, 0, "\\"], + [2571, 1], + [2571, 0, "$"], + [2572, 0, "\\"], + [2573, 0, "m"], + [2574, 0, "a"], + [2575, 0, "t"], + [2576, 0, "h"], + [2577, 0, "s"], + [2578, 0, "f"], + [2579, 0, "{"], + [2580, 0, "i"], + [2581, 0, "n"], + [2582, 0, "s"], + [2583, 0, "e"], + [2584, 0, "r"], + [2585, 0, "t"], + [2586, 0, "}"], + [2587, 0, "$"], + [2588, 0, " "], + [2589, 0, "o"], + [2590, 0, "p"], + [2591, 0, "e"], + [2592, 0, "r"], + [2593, 0, "a"], + [2594, 0, "t"], + [2595, 0, "i"], + [2596, 0, "o"], + [2597, 0, "n"], + [2598, 0, " "], + [2599, 0, "i"], + [2600, 0, "s"], + [2601, 0, " "], + [2602, 0, "l"], + [2603, 0, "i"], + [2604, 0, "k"], + [2605, 0, "e"], + [2606, 0, " "], + [2607, 0, "i"], + [2608, 0, "n"], + [2609, 0, "s"], + [2610, 0, "e"], + [2611, 0, "r"], + [2612, 0, "t"], + [2613, 0, "i"], + [2614, 0, "n"], + [2615, 0, "g"], + [2616, 0, " "], + [2617, 0, "a"], + [2618, 0, "n"], + [2619, 0, " "], + [2620, 0, "e"], + [2621, 0, "l"], + [2622, 0, "e"], + [2623, 0, "m"], + [2624, 0, "e"], + [2625, 0, "n"], + [2626, 0, "t"], + [2627, 0, " "], + [2628, 0, "i"], + [2629, 0, "n"], + [2630, 0, "t"], + [2631, 0, "o"], + [2632, 0, " "], + [2633, 0, "a"], + [2634, 0, " "], + [2635, 0, "l"], + [2636, 0, "i"], + [2637, 0, "n"], + [2638, 0, "k"], + [2639, 0, "e"], + [2640, 0, "d"], + [2641, 0, " "], + [2642, 0, "l"], + [2643, 0, "i"], + [2644, 0, "s"], + [2645, 0, "t"], + [2646, 0, ","], + [2647, 0, " "], + [2648, 0, "w"], + [2649, 0, "i"], + [2650, 0, "t"], + [2651, 0, "h"], + [2652, 0, " "], + [2653, 0, "t"], + [2654, 0, "h"], + [2655, 0, "e"], + [2655, 1], + [2654, 1], + [2653, 1], + [2652, 1], + [2651, 1], + [2650, 1], + [2649, 1], + [2648, 1], + [2648, 0, "e"], + [2649, 0, "x"], + [2650, 0, "c"], + [2651, 0, "e"], + [2652, 0, "p"], + [2653, 0, "t"], + [2654, 0, " "], + [2655, 0, "t"], + [2656, 0, "h"], + [2657, 0, "a"], + [2658, 0, "t"], + [2659, 0, " "], + [2660, 0, "t"], + [2661, 0, "h"], + [2662, 0, "e"], + [2663, 0, " "], + [2664, 0, "f"], + [2665, 0, "u"], + [2666, 0, "n"], + [2667, 0, "c"], + [2668, 0, "t"], + [2669, 0, "i"], + [2670, 0, "o"], + [2671, 0, "n"], + [2672, 0, " "], + [2673, 0, "f"], + [2674, 0, "i"], + [2675, 0, "r"], + [2676, 0, "s"], + [2677, 0, "t"], + [2678, 0, " "], + [2679, 0, "s"], + [2680, 0, "k"], + [2681, 0, "i"], + [2682, 0, "p"], + [2683, 0, "s"], + [2684, 0, " "], + [2685, 0, "o"], + [2686, 0, "v"], + [2687, 0, "e"], + [2688, 0, "r"], + [2689, 0, " "], + [2690, 0, "l"], + [2691, 0, "i"], + [2692, 0, "s"], + [2693, 0, "t"], + [2694, 0, " "], + [2695, 0, "e"], + [2696, 0, "l"], + [2697, 0, "e"], + [2698, 0, "m"], + [2699, 0, "e"], + [2700, 0, "n"], + [2701, 0, "t"], + [2702, 0, "s"], + [2703, 0, " "], + [2704, 0, "t"], + [2705, 0, "h"], + [2706, 0, "a"], + [2707, 0, "t"], + [2708, 0, " "], + [2708, 1], + [2707, 1], + [2706, 1], + [2705, 1], + [2704, 1], + [2704, 0, "w"], + [2705, 0, "i"], + [2706, 0, "t"], + [2707, 0, "h"], + [2708, 0, " "], + [2709, 0, "a"], + [2710, 0, "n"], + [2711, 0, " "], + [2712, 0, "I"], + [2713, 0, "D"], + [2714, 0, " "], + [2559, 1], + [2558, 1], + [2557, 1], + [2556, 1], + [2555, 1], + [2554, 1], + [2553, 1], + [2552, 1], + [2551, 1], + [2550, 1], + [2549, 1], + [2548, 1], + [2547, 1], + [2546, 1], + [2545, 1], + [2544, 1], + [2543, 1], + [2542, 1], + [2541, 1], + [2540, 1], + [2539, 1], + [2538, 1], + [2537, 1], + [2537, 0, "A"], + [2693, 0, "g"], + [2694, 0, "r"], + [2695, 0, "e"], + [2696, 0, "a"], + [2697, 0, "t"], + [2698, 0, "e"], + [2699, 0, "r"], + [2700, 0, " "], + [2701, 0, "t"], + [2702, 0, "h"], + [2703, 0, "a"], + [2704, 0, "n"], + [2705, 0, " "], + [2706, 0, "t"], + [2707, 0, "h"], + [2708, 0, "e"], + [2709, 0, " "], + [2710, 0, "I"], + [2711, 0, "D"], + [2712, 0, " "], + [2713, 0, "o"], + [2714, 0, "f"], + [2715, 0, " "], + [2716, 0, "t"], + [2717, 0, "h"], + [2718, 0, "e"], + [2719, 0, " "], + [2720, 0, "n"], + [2721, 0, "e"], + [2722, 0, "w"], + [2723, 0, " "], + [2724, 0, "e"], + [2725, 0, "l"], + [2726, 0, "e"], + [2727, 0, "m"], + [2728, 0, "e"], + [2729, 0, "n"], + [2730, 0, "t"], + [2731, 0, " "], + [2732, 0, "b"], + [2733, 0, "e"], + [2734, 0, "i"], + [2735, 0, "n"], + [2736, 0, "g"], + [2737, 0, " "], + [2738, 0, "i"], + [2739, 0, "n"], + [2740, 0, "s"], + [2741, 0, "e"], + [2742, 0, "r"], + [2743, 0, "t"], + [2744, 0, "e"], + [2745, 0, "d"], + [2746, 0, "."], + [2747, 0, " "], + [2748, 0, "T"], + [2749, 0, "h"], + [2750, 0, "u"], + [2751, 0, "s"], + [2752, 0, " "], + [2752, 1], + [2751, 1], + [2750, 1], + [2750, 0, "i"], + [2751, 0, "s"], + [2752, 0, " "], + [2753, 0, "h"], + [2754, 0, "a"], + [2755, 0, "s"], + [2756, 0, " "], + [2757, 0, "t"], + [2758, 0, "h"], + [2759, 0, "e"], + [2760, 0, " "], + [2761, 0, "e"], + [2762, 0, "f"], + [2763, 0, "f"], + [2764, 0, "e"], + [2765, 0, "c"], + [2766, 0, "t"], + [2767, 0, " "], + [2768, 0, "o"], + [2769, 0, "f"], + [2770, 0, " "], + [2771, 0, "d"], + [2772, 0, "e"], + [2773, 0, "t"], + [2774, 0, "e"], + [2775, 0, "r"], + [2776, 0, "m"], + [2777, 0, "i"], + [2778, 0, "n"], + [2779, 0, "i"], + [2780, 0, "s"], + [2781, 0, "t"], + [2782, 0, "i"], + [2783, 0, "c"], + [2784, 0, "a"], + [2785, 0, "l"], + [2786, 0, "l"], + [2787, 0, "y"], + [2788, 0, " "], + [2789, 0, "o"], + [2790, 0, "r"], + [2791, 0, "d"], + [2792, 0, "e"], + [2793, 0, "r"], + [2794, 0, "i"], + [2795, 0, "n"], + [2796, 0, "g"], + [2797, 0, " "], + [2798, 0, "c"], + [2799, 0, "o"], + [2800, 0, "n"], + [2801, 0, "c"], + [2802, 0, "u"], + [2803, 0, "r"], + [2804, 0, "r"], + [2805, 0, "e"], + [2806, 0, "n"], + [2807, 0, "t"], + [2808, 0, " "], + [2809, 0, "i"], + [2810, 0, "n"], + [2811, 0, "s"], + [2812, 0, "e"], + [2813, 0, "r"], + [2814, 0, "t"], + [2815, 0, "i"], + [2816, 0, "o"], + [2817, 0, "n"], + [2818, 0, "s"], + [2819, 0, " "], + [2820, 0, "m"], + [2821, 0, "a"], + [2822, 0, "d"], + [2823, 0, "e"], + [2824, 0, " "], + [2825, 0, "a"], + [2826, 0, "t"], + [2827, 0, " "], + [2828, 0, "t"], + [2829, 0, "h"], + [2830, 0, "e"], + [2831, 0, " "], + [2832, 0, "s"], + [2833, 0, "a"], + [2834, 0, "m"], + [2835, 0, "e"], + [2836, 0, " "], + [2837, 0, "p"], + [2838, 0, "o"], + [2839, 0, "s"], + [2840, 0, "i"], + [2841, 0, "t"], + [2842, 0, "i"], + [2843, 0, "o"], + [2844, 0, "n"], + [2845, 0, " "], + [2846, 0, "o"], + [2847, 0, "f"], + [2848, 0, " "], + [2849, 0, "t"], + [2850, 0, "h"], + [2851, 0, "e"], + [2852, 0, " "], + [2853, 0, "l"], + [2854, 0, "i"], + [2855, 0, "s"], + [2856, 0, "t"], + [2857, 0, "."], + [2858, 0, " "], + [2859, 0, "T"], + [2860, 0, "h"], + [2861, 0, "i"], + [2862, 0, "s"], + [2863, 0, " "], + [2864, 0, "p"], + [2865, 0, "r"], + [2866, 0, "o"], + [2867, 0, "p"], + [2868, 0, "e"], + [2869, 0, "r"], + [2870, 0, "t"], + [2871, 0, "y"], + [2872, 0, " "], + [2873, 0, "i"], + [2874, 0, "s"], + [2875, 0, " "], + [2876, 0, "p"], + [2877, 0, "r"], + [2878, 0, "o"], + [2879, 0, "v"], + [2880, 0, "e"], + [2881, 0, "d"], + [2882, 0, " "], + [2883, 0, "f"], + [2884, 0, "o"], + [2885, 0, "r"], + [2886, 0, "m"], + [2887, 0, "a"], + [2888, 0, "l"], + [2889, 0, "l"], + [2890, 0, "y"], + [2891, 0, " "], + [2892, 0, "b"], + [2893, 0, "e"], + [2894, 0, "l"], + [2895, 0, "o"], + [2896, 0, "w"], + [2897, 0, "."], + [2898, 0, "\n"], + [2899, 0, "\n"], + [2900, 0, "T"], + [2901, 0, "h"], + [2902, 0, "e"], + [2903, 0, " "], + [2904, 0, "o"], + [2905, 0, "p"], + [2906, 0, "e"], + [2907, 0, "r"], + [2908, 0, "a"], + [2909, 0, "t"], + [2910, 0, "i"], + [2911, 0, "o"], + [2912, 0, "n"], + [2913, 0, " "], + [2914, 0, "\\"], + [2914, 1], + [2914, 0, "$"], + [2915, 0, "\\"], + [2916, 0, "m"], + [2917, 0, "a"], + [2918, 0, "t"], + [2919, 0, "h"], + [2920, 0, "s"], + [2921, 0, "f"], + [2922, 0, "{"], + [2923, 0, "d"], + [2924, 0, "e"], + [2925, 0, "l"], + [2926, 0, "e"], + [2927, 0, "t"], + [2928, 0, "e"], + [2929, 0, "}"], + [2930, 0, "$"], + [2931, 0, " "], + [2932, 0, "i"], + [2933, 0, "s"], + [2934, 0, " "], + [2935, 0, "a"], + [2936, 0, "n"], + [2937, 0, " "], + [2938, 0, "i"], + [2939, 0, "n"], + [2940, 0, "s"], + [2941, 0, "t"], + [2942, 0, "r"], + [2943, 0, "u"], + [2944, 0, "c"], + [2945, 0, "t"], + [2946, 0, "i"], + [2947, 0, "o"], + [2948, 0, "n"], + [2949, 0, " "], + [2950, 0, "t"], + [2951, 0, "o"], + [2952, 0, " "], + [2953, 0, "d"], + [2954, 0, "e"], + [2955, 0, "l"], + [2956, 0, "e"], + [2957, 0, "t"], + [2958, 0, "e"], + [2959, 0, " "], + [2930, 0, "("], + [2931, 0, "\\"], + [2932, 0, "m"], + [2933, 0, "a"], + [2934, 0, "t"], + [2935, 0, "h"], + [2936, 0, "i"], + [2937, 0, "t"], + [2938, 0, "{"], + [2939, 0, "i"], + [2940, 0, "d"], + [2941, 0, "}"], + [2942, 0, ")"], + [2973, 0, "t"], + [2974, 0, "h"], + [2975, 0, "e"], + [2976, 0, " "], + [2977, 0, "e"], + [2978, 0, "l"], + [2979, 0, "e"], + [2980, 0, "m"], + [2981, 0, "e"], + [2982, 0, "n"], + [2983, 0, "t"], + [2984, 0, " "], + [2985, 0, "w"], + [2986, 0, "i"], + [2987, 0, "t"], + [2988, 0, "h"], + [2989, 0, " "], + [2990, 0, "I"], + [2991, 0, "D"], + [2992, 0, " "], + [2993, 0, "$"], + [2994, 0, "\\"], + [2995, 0, "m"], + [2996, 0, "a"], + [2997, 0, "t"], + [2998, 0, "h"], + [2999, 0, "i"], + [3000, 0, "t"], + [3001, 0, "{"], + [3002, 0, "i"], + [3003, 0, "d"], + [3004, 0, "}"], + [3005, 0, "$"], + [3006, 0, " "], + [3007, 0, "f"], + [3008, 0, "r"], + [3009, 0, "o"], + [3010, 0, "m"], + [3011, 0, " "], + [3012, 0, "t"], + [3013, 0, "h"], + [3014, 0, "e"], + [3015, 0, " "], + [3016, 0, "l"], + [3017, 0, "i"], + [3018, 0, "s"], + [3019, 0, "t"], + [3020, 0, "."], + [3021, 0, " "], + [3022, 0, "W"], + [3023, 0, "h"], + [3024, 0, "e"], + [3025, 0, "n"], + [3026, 0, " "], + [3027, 0, "t"], + [3028, 0, "h"], + [3029, 0, "e"], + [3030, 0, " "], + [3031, 0, "o"], + [3032, 0, "p"], + [3033, 0, "e"], + [3034, 0, "r"], + [3035, 0, "a"], + [3036, 0, "t"], + [3037, 0, "i"], + [3038, 0, "o"], + [3039, 0, "n"], + [3040, 0, " "], + [3041, 0, "i"], + [3042, 0, "s"], + [3043, 0, " "], + [3044, 0, "a"], + [3045, 0, "p"], + [3046, 0, "p"], + [3047, 0, "l"], + [3048, 0, "i"], + [3049, 0, "e"], + [3050, 0, "d"], + [3051, 0, " "], + [3052, 0, "t"], + [3027, 1], + [3026, 1], + [3025, 1], + [3024, 1], + [3023, 1], + [3022, 1], + [3022, 0, "T"], + [3047, 1], + [3046, 1], + [3045, 1], + [3044, 1], + [3043, 1], + [3042, 1], + [3041, 1], + [3040, 1], + [3039, 1], + [3038, 1], + [3037, 1], + [3036, 1], + [3036, 0, "h"], + [3037, 0, "a"], + [3038, 0, "s"], + [3039, 0, " "], + [3040, 0, "t"], + [3041, 0, "h"], + [3042, 0, "e"], + [3043, 0, " "], + [3044, 0, "f"], + [3045, 0, "o"], + [3046, 0, "l"], + [3047, 0, "l"], + [3048, 0, "o"], + [3049, 0, "w"], + [3050, 0, "i"], + [3051, 0, "n"], + [3052, 0, "g"], + [3053, 0, " "], + [3054, 0, "s"], + [3055, 0, "e"], + [3056, 0, "m"], + [3057, 0, "a"], + [3058, 0, "n"], + [3059, 0, "t"], + [3060, 0, "i"], + [3061, 0, "c"], + [3062, 0, "s"], + [3063, 0, ":"], + [3064, 0, "\n"], + [3065, 0, "\\"], + [3066, 0, "e"], + [3067, 0, "b"], + [3068, 0, "e"], + [3069, 0, "g"], + [3069, 1], + [3068, 1], + [3067, 1], + [3066, 1], + [3066, 0, "b"], + [3067, 0, "e"], + [3068, 0, "g"], + [3069, 0, "i"], + [3070, 0, "n"], + [3071, 0, "{"], + [3072, 0, "a"], + [3073, 0, "l"], + [3074, 0, "i"], + [3075, 0, "g"], + [3076, 0, "n"], + [3077, 0, "*"], + [3078, 0, "}"], + [3079, 0, "\n"], + [3080, 0, "A"], + [3081, 0, "'"], + [3082, 0, " "], + [3083, 0, "&"], + [3084, 0, "="], + [3085, 0, " "], + [3086, 0, "\\"], + [3087, 0, "m"], + [3088, 0, "a"], + [3089, 0, "t"], + [3090, 0, "h"], + [3091, 0, "r"], + [3092, 0, "m"], + [3093, 0, "{"], + [3094, 0, "a"], + [3095, 0, "p"], + [3096, 0, "p"], + [3097, 0, "l"], + [3098, 0, "y"], + [3099, 0, "}"], + [3100, 0, "("], + [3101, 0, "\\"], + [3102, 0, "m"], + [3103, 0, "a"], + [3104, 0, "t"], + [3105, 0, "h"], + [3106, 0, "s"], + [3107, 0, "f"], + [3108, 0, "{"], + [3109, 0, "d"], + [3110, 0, "e"], + [3111, 0, "l"], + [3112, 0, "e"], + [3113, 0, "t"], + [3114, 0, "e"], + [3115, 0, "("], + [3115, 1], + [3115, 0, "}"], + [3116, 0, "{"], + [3117, 0, "\\"], + [3118, 0, "m"], + [3119, 0, "a"], + [3120, 0, "t"], + [3121, 0, "h"], + [3122, 0, "i"], + [3123, 0, "t"], + [3124, 0, "{"], + [3125, 0, "i"], + [3126, 0, "d"], + [3127, 0, "}"], + [3116, 1], + [3116, 0, "("], + [3128, 0, ")"], + [3129, 0, ")"], + [3130, 0, " "], + [3131, 0, "="], + [3132, 0, " "], + [3134, 0, "\\"], + [3135, 0, "b"], + [3136, 0, "e"], + [3137, 0, "g"], + [3138, 0, "i"], + [3139, 0, "n"], + [3140, 0, "{"], + [3141, 0, "a"], + [3142, 0, "l"], + [3143, 0, "i"], + [3144, 0, "g"], + [3145, 0, "n"], + [3146, 0, "&"], + [3146, 1], + [3146, 0, "*"], + [3147, 0, "}"], + [3148, 0, "\n"], + [3133, 0, "A"], + [3134, 0, "["], + [3135, 0, "\\"], + [3136, 0, ","], + [3137, 0, "\\"], + [3138, 0, "m"], + [3139, 0, "a"], + [3140, 0, "t"], + [3141, 0, "h"], + [3142, 0, "i"], + [3143, 0, "t"], + [3144, 0, "{"], + [3145, 0, "i"], + [3146, 0, "d"], + [3147, 0, "}"], + [3148, 0, " "], + [3149, 0, "\\"], + [3150, 0, "m"], + [3151, 0, "a"], + [3152, 0, "p"], + [3153, 0, "s"], + [3154, 0, "t"], + [3155, 0, "o"], + [3156, 0, " "], + [3157, 0, "("], + [3158, 0, "\\"], + [3159, 0, "b"], + [3160, 0, "o"], + [3161, 0, "t"], + [3162, 0, ","], + [3163, 0, " "], + [3164, 0, "n"], + [3165, 0, ")"], + [3166, 0, "\\"], + [3167, 0, ","], + [3168, 0, "]"], + [3169, 0, " "], + [3170, 0, "\\"], + [3171, 0, ";"], + [3172, 0, "\\"], + [3173, 0, "t"], + [3174, 0, "e"], + [3175, 0, "x"], + [3176, 0, "t"], + [3177, 0, "{"], + [3178, 0, "i"], + [3179, 0, "f"], + [3180, 0, "}"], + [3181, 0, " "], + [3182, 0, "A"], + [3183, 0, "("], + [3184, 0, "\\"], + [3185, 0, "m"], + [3186, 0, "a"], + [3187, 0, "t"], + [3188, 0, "h"], + [3189, 0, "i"], + [3190, 0, "t"], + [3191, 0, "{"], + [3192, 0, "i"], + [3193, 0, "d"], + [3194, 0, "}"], + [3195, 0, ")"], + [3196, 0, " "], + [3169, 1], + [3169, 0, "\n"], + [3197, 0, "="], + [3198, 0, " "], + [3199, 0, "("], + [3200, 0, "\\"], + [3201, 0, "p"], + [3202, 0, "l"], + [3203, 0, "a"], + [3204, 0, "c"], + [3205, 0, "e"], + [3206, 0, "h"], + [3207, 0, "o"], + [3208, 0, "l"], + [3209, 0, "d"], + [3210, 0, "e"], + [3211, 0, "r"], + [3212, 0, ","], + [3213, 0, " "], + [3214, 0, "n"], + [3215, 0, ")"], + [3180, 0, " "], + [3182, 0, "\\"], + [3183, 0, ";"], + [3171, 1], + [3171, 0, "q"], + [3172, 0, "u"], + [3173, 0, "a"], + [3174, 0, "d"], + [3228, 1], + [3227, 1], + [3226, 1], + [3225, 1], + [3224, 1], + [3224, 0, "e"], + [3225, 0, "n"], + [3226, 0, "d"], + [2172, 1], + [2171, 1], + [3129, 0, "\\"], + [3130, 0, "\\"], + [3131, 0, " "], + [3132, 0, "&"], + [3134, 1], + [3134, 0, "\n"], + [777, 0, "\n"], + [778, 0, "\\"], + [779, 0, "s"], + [780, 0, "b"], + [780, 1], + [780, 0, "u"], + [781, 0, "b"], + [782, 0, "s"], + [783, 0, "e"], + [784, 0, "c"], + [785, 0, "t"], + [786, 0, "i"], + [787, 0, "o"], + [788, 0, "n"], + [789, 0, "{"], + [790, 0, "O"], + [791, 0, "r"], + [792, 0, "d"], + [793, 0, "e"], + [794, 0, "r"], + [795, 0, "e"], + [796, 0, "d"], + [797, 0, " "], + [798, 0, "L"], + [799, 0, "i"], + [800, 0, "s"], + [801, 0, "t"], + [802, 0, " "], + [803, 0, "O"], + [804, 0, "P"], + [805, 0, "e"], + [806, 0, "r"], + [807, 0, "a"], + [807, 1], + [806, 1], + [805, 1], + [804, 1], + [804, 0, "p"], + [805, 0, "e"], + [806, 0, "r"], + [807, 0, "a"], + [808, 0, "t"], + [809, 0, "i"], + [810, 0, "o"], + [811, 0, "n"], + [812, 0, "s"], + [813, 0, "}"], + [814, 0, "\n"], + [776, 0, "\n"], + [777, 0, "\n"], + [778, 0, "W"], + [779, 0, "e"], + [780, 0, " "], + [781, 0, "a"], + [782, 0, "s"], + [783, 0, "s"], + [784, 0, "u"], + [785, 0, "m"], + [786, 0, "e"], + [787, 0, " "], + [788, 0, "t"], + [789, 0, "h"], + [790, 0, "a"], + [791, 0, "t"], + [792, 0, " "], + [793, 0, "e"], + [794, 0, "a"], + [795, 0, "c"], + [796, 0, "h"], + [797, 0, " "], + [798, 0, "p"], + [799, 0, "e"], + [800, 0, "e"], + [801, 0, "r"], + [802, 0, " "], + [803, 0, "h"], + [804, 0, "a"], + [805, 0, "s"], + [806, 0, " "], + [807, 0, "a"], + [808, 0, " "], + [809, 0, "u"], + [810, 0, "n"], + [811, 0, "i"], + [812, 0, "q"], + [813, 0, "u"], + [814, 0, "e"], + [815, 0, " "], + [816, 0, "i"], + [817, 0, "d"], + [818, 0, "e"], + [819, 0, "n"], + [820, 0, "t"], + [821, 0, "i"], + [822, 0, "f"], + [823, 0, "i"], + [824, 0, "e"], + [825, 0, "r"], + [826, 0, " "], + [827, 0, "("], + [828, 0, "f"], + [829, 0, "o"], + [830, 0, "r"], + [831, 0, " "], + [832, 0, "e"], + [833, 0, "x"], + [834, 0, "a"], + [835, 0, "m"], + [836, 0, "p"], + [837, 0, "l"], + [838, 0, "e"], + [839, 0, ","], + [840, 0, " "], + [841, 0, "t"], + [842, 0, "h"], + [843, 0, "e"], + [844, 0, " "], + [845, 0, "h"], + [846, 0, "a"], + [847, 0, "s"], + [848, 0, "h"], + [849, 0, " "], + [850, 0, "o"], + [851, 0, "f"], + [852, 0, " "], + [853, 0, "i"], + [854, 0, "t"], + [855, 0, "s"], + [856, 0, " "], + [857, 0, "p"], + [858, 0, "u"], + [859, 0, "b"], + [860, 0, "l"], + [861, 0, "i"], + [862, 0, "c"], + [863, 0, " "], + [864, 0, "k"], + [865, 0, "e"], + [866, 0, "y"], + [867, 0, ")"], + [868, 0, "."], + [869, 0, " "], + [870, 0, "W"], + [871, 0, "e"], + [872, 0, " "], + [873, 0, "c"], + [874, 0, "a"], + [875, 0, "n"], + [876, 0, " "], + [877, 0, "t"], + [878, 0, "h"], + [879, 0, "e"], + [880, 0, "n"], + [881, 0, " "], + [881, 1], + [880, 1], + [879, 1], + [878, 1], + [877, 1], + [876, 1], + [875, 1], + [874, 1], + [873, 1], + [872, 1], + [871, 1], + [870, 1], + [870, 0, "W"], + [871, 0, "h"], + [872, 0, "e"], + [873, 0, "n"], + [874, 0, "e"], + [875, 0, "v"], + [876, 0, "e"], + [877, 0, "r"], + [878, 0, " "], + [879, 0, "a"], + [880, 0, "n"], + [881, 0, " "], + [882, 0, "e"], + [883, 0, "d"], + [884, 0, "i"], + [885, 0, "t"], + [886, 0, " "], + [887, 0, "t"], + [888, 0, "o"], + [889, 0, " "], + [890, 0, "a"], + [891, 0, " "], + [892, 0, "d"], + [893, 0, "o"], + [894, 0, "c"], + [895, 0, "u"], + [896, 0, "m"], + [897, 0, "e"], + [898, 0, "n"], + [899, 0, "t"], + [900, 0, " "], + [901, 0, "i"], + [902, 0, "s"], + [903, 0, " "], + [904, 0, "m"], + [905, 0, "a"], + [906, 0, "d"], + [907, 0, "e"], + [908, 0, " "], + [909, 0, "a"], + [910, 0, "t"], + [911, 0, " "], + [912, 0, "o"], + [913, 0, "n"], + [914, 0, "e"], + [915, 0, " "], + [916, 0, "o"], + [917, 0, "f"], + [918, 0, " "], + [919, 0, "t"], + [920, 0, "h"], + [921, 0, "e"], + [922, 0, " "], + [923, 0, "p"], + [924, 0, "e"], + [925, 0, "e"], + [926, 0, "r"], + [927, 0, "s"], + [928, 0, ","], + [929, 0, " "], + [930, 0, "w"], + [931, 0, "e"], + [932, 0, " "], + [933, 0, "g"], + [934, 0, "e"], + [935, 0, "n"], + [936, 0, "e"], + [937, 0, "r"], + [938, 0, "a"], + [939, 0, "t"], + [940, 0, "e"], + [941, 0, " "], + [942, 0, "a"], + [943, 0, " "], + [944, 0, "u"], + [945, 0, "n"], + [946, 0, "i"], + [947, 0, "q"], + [948, 0, "u"], + [949, 0, "e"], + [950, 0, " "], + [951, 0, "i"], + [952, 0, "d"], + [953, 0, "e"], + [954, 0, "n"], + [955, 0, "t"], + [956, 0, "i"], + [957, 0, "f"], + [958, 0, "i"], + [959, 0, "e"], + [960, 0, "r"], + [961, 0, " "], + [962, 0, "f"], + [963, 0, "o"], + [964, 0, "r"], + [965, 0, " "], + [966, 0, "t"], + [967, 0, "h"], + [968, 0, "a"], + [969, 0, "t"], + [970, 0, " "], + [971, 0, "e"], + [972, 0, "d"], + [973, 0, "i"], + [974, 0, "t"], + [975, 0, " "], + [976, 0, "o"], + [977, 0, "p"], + [978, 0, "e"], + [979, 0, "r"], + [980, 0, "a"], + [981, 0, "t"], + [982, 0, "i"], + [983, 0, "o"], + [984, 0, "n"], + [985, 0, " "], + [986, 0, "u"], + [987, 0, "s"], + [988, 0, "i"], + [989, 0, "n"], + [990, 0, "g"], + [991, 0, " "], + [992, 0, "L"], + [993, 0, "a"], + [994, 0, "m"], + [995, 0, "p"], + [996, 0, "o"], + [997, 0, "r"], + [998, 0, "t"], + [999, 0, " "], + [1000, 0, "t"], + [1001, 0, "i"], + [1002, 0, "m"], + [1003, 0, "e"], + [1004, 0, "s"], + [1005, 0, "t"], + [1006, 0, "a"], + [1007, 0, "m"], + [1008, 0, "p"], + [1009, 0, "s"], + [1010, 0, "~"], + [1011, 0, "\\"], + [1012, 0, "c"], + [1013, 0, "i"], + [1014, 0, "t"], + [1015, 0, "e"], + [1016, 0, "{"], + [1017, 0, "L"], + [1018, 0, "a"], + [1019, 0, "m"], + [1020, 0, "p"], + [1021, 0, "o"], + [1022, 0, "r"], + [1023, 0, "t"], + [1024, 0, ":"], + [1025, 0, "1"], + [1026, 0, "9"], + [1027, 0, "7"], + [1028, 0, "8"], + [1029, 0, "j"], + [1030, 0, "q"], + [1031, 0, "}"], + [1032, 0, "."], + [1033, 0, " "], + [1033, 1], + [1033, 0, "\n"], + [1034, 0, "\n"], + [1035, 0, "A"], + [1036, 0, " "], + [1037, 0, "L"], + [1038, 0, "a"], + [1039, 0, "m"], + [1040, 0, "p"], + [1041, 0, "o"], + [1042, 0, "r"], + [1043, 0, "t"], + [1044, 0, " "], + [1045, 0, "t"], + [1046, 0, "i"], + [1047, 0, "m"], + [1048, 0, "e"], + [1049, 0, "s"], + [1050, 0, "t"], + [1051, 0, "a"], + [1052, 0, "m"], + [1053, 0, "p"], + [1054, 0, " "], + [1055, 0, "i"], + [1056, 0, "s"], + [1057, 0, " "], + [1058, 0, "a"], + [1059, 0, " "], + [1060, 0, "p"], + [1061, 0, "a"], + [1062, 0, "i"], + [1063, 0, "r"], + [1064, 0, " "], + [1065, 0, "("], + [1065, 1], + [1065, 0, "$"], + [1066, 0, "("], + [1067, 0, ")"], + [1067, 1], + [1067, 0, "c"], + [1068, 0, ","], + [1069, 0, " "], + [1070, 0, "n"], + [1071, 0, ")"], + [1072, 0, "$"], + [1073, 0, " "], + [1074, 0, "w"], + [1075, 0, "h"], + [1076, 0, "e"], + [1077, 0, "r"], + [1078, 0, "e"], + [1079, 0, " "], + [1080, 0, "$"], + [1081, 0, "c"], + [1082, 0, "$"], + [1083, 0, " "], + [1084, 0, "i"], + [1085, 0, "s"], + [1086, 0, " "], + [1087, 0, "a"], + [1088, 0, " "], + [1089, 0, "c"], + [1090, 0, "o"], + [1091, 0, "u"], + [1092, 0, "n"], + [1093, 0, "t"], + [1094, 0, "e"], + [1095, 0, "r"], + [1096, 0, " "], + [1097, 0, "t"], + [1098, 0, "h"], + [1099, 0, "a"], + [1100, 0, "t"], + [1101, 0, " "], + [1102, 0, "i"], + [1103, 0, "s"], + [1104, 0, " "], + [1105, 0, "s"], + [1106, 0, "t"], + [1107, 0, "o"], + [1108, 0, "r"], + [1109, 0, "e"], + [1110, 0, "d"], + [1111, 0, " "], + [1112, 0, "a"], + [1113, 0, "t"], + [1114, 0, " "], + [1115, 0, "n"], + [1116, 0, "o"], + [1117, 0, "d"], + [1118, 0, "e"], + [1119, 0, " "], + [1079, 0, " "], + [1080, 0, "$"], + [1081, 0, "n"], + [1082, 0, "$"], + [1083, 0, " "], + [1084, 0, "i"], + [1085, 0, "s"], + [1086, 0, " "], + [1087, 0, "t"], + [1088, 0, "h"], + [1089, 0, "e"], + [1090, 0, " "], + [1091, 0, "u"], + [1092, 0, "n"], + [1093, 0, "i"], + [1094, 0, "q"], + [1095, 0, "u"], + [1096, 0, "e"], + [1097, 0, " "], + [1098, 0, "i"], + [1099, 0, "d"], + [1100, 0, "e"], + [1101, 0, "n"], + [1102, 0, "t"], + [1103, 0, "i"], + [1104, 0, "f"], + [1105, 0, "i"], + [1106, 0, "e"], + [1107, 0, "r"], + [1108, 0, " "], + [1109, 0, "o"], + [1110, 0, "f"], + [1111, 0, " "], + [1112, 0, "t"], + [1113, 0, "h"], + [1114, 0, "e"], + [1115, 0, " "], + [1116, 0, "n"], + [1117, 0, "o"], + [1118, 0, "d"], + [1119, 0, "e"], + [1120, 0, " "], + [1121, 0, "o"], + [1122, 0, "n"], + [1123, 0, " "], + [1124, 0, "w"], + [1125, 0, "h"], + [1126, 0, "i"], + [1127, 0, "c"], + [1128, 0, "h"], + [1129, 0, " "], + [1130, 0, "t"], + [1131, 0, "h"], + [1132, 0, "e"], + [1133, 0, " "], + [1134, 0, "e"], + [1135, 0, "d"], + [1136, 0, "i"], + [1137, 0, "t"], + [1138, 0, " "], + [1139, 0, "i"], + [1140, 0, "s"], + [1141, 0, " "], + [1142, 0, "m"], + [1143, 0, "a"], + [1144, 0, "d"], + [1145, 0, "e"], + [1146, 0, ","], + [1147, 0, " "], + [1148, 0, "a"], + [1149, 0, "n"], + [1150, 0, "d"], + [1150, 1], + [1149, 1], + [1148, 1], + [1147, 1], + [1146, 1], + [1146, 0, "."], + [1187, 1], + [1186, 1], + [1185, 1], + [1184, 1], + [1183, 1], + [1183, 0, "e"], + [1184, 0, "a"], + [1185, 0, "c"], + [1186, 0, "h"], + [1187, 0, " "], + [1188, 0, "n"], + [1189, 0, "o"], + [1190, 0, "d"], + [1191, 0, "e"], + [1192, 0, " "], + [1193, 0, "a"], + [1194, 0, "n"], + [1195, 0, "d"], + [1196, 0, " "], + [1197, 0, "i"], + [1198, 0, "n"], + [1199, 0, "c"], + [1200, 0, "r"], + [1201, 0, "e"], + [1202, 0, "m"], + [1203, 0, "e"], + [1204, 0, "n"], + [1205, 0, "t"], + [1206, 0, "e"], + [1207, 0, "d"], + [1208, 0, " "], + [1209, 0, "f"], + [1210, 0, "o"], + [1211, 0, "r"], + [1212, 0, " "], + [1213, 0, "e"], + [1214, 0, "v"], + [1215, 0, "e"], + [1216, 0, "r"], + [1217, 0, "y"], + [1218, 0, " "], + [1219, 0, "o"], + [1220, 0, "p"], + [1221, 0, "e"], + [1222, 0, "r"], + [1223, 0, "a"], + [1224, 0, "t"], + [1225, 0, "i"], + [1226, 0, "o"], + [1227, 0, "n"], + [1228, 0, "."], + [1229, 0, " "], + [1230, 0, "M"], + [1231, 0, "o"], + [1232, 0, "r"], + [1233, 0, "e"], + [1234, 0, "o"], + [1235, 0, "v"], + [1236, 0, "e"], + [1237, 0, "r"], + [1238, 0, ","], + [1239, 0, " "], + [1240, 0, "w"], + [1241, 0, "h"], + [1242, 0, "e"], + [1243, 0, "n"], + [1244, 0, "e"], + [1245, 0, "v"], + [1246, 0, "e"], + [1247, 0, "r"], + [1248, 0, " "], + [1070, 1], + [1070, 0, "p"], + [1081, 1], + [1081, 0, "p"], + [1119, 1], + [1118, 1], + [1117, 1], + [1116, 1], + [1116, 0, "p"], + [1117, 0, "e"], + [1118, 0, "e"], + [1119, 0, "r"], + [1191, 1], + [1190, 1], + [1189, 1], + [1188, 1], + [1188, 0, "p"], + [1189, 0, "e"], + [1190, 0, "e"], + [1191, 0, "r"], + [1249, 0, "a"], + [1250, 0, " "], + [1251, 0, "p"], + [1252, 0, "e"], + [1253, 0, "e"], + [1254, 0, "r"], + [1255, 0, " "], + [1256, 0, "r"], + [1257, 0, "e"], + [1258, 0, "c"], + [1259, 0, "e"], + [1260, 0, "i"], + [1261, 0, "v"], + [1262, 0, "e"], + [1263, 0, "s"], + [1264, 0, " "], + [1265, 0, "a"], + [1266, 0, "n"], + [1267, 0, " "], + [1238, 1], + [1237, 1], + [1236, 1], + [1235, 1], + [1234, 1], + [1233, 1], + [1232, 1], + [1231, 1], + [1230, 1], + [1230, 0, "T"], + [1231, 0, "h"], + [1232, 0, "e"], + [1233, 0, " "], + [1234, 0, "p"], + [1235, 0, "a"], + [1236, 0, "i"], + [1237, 0, "r"], + [1238, 0, " "], + [1239, 0, "$"], + [1240, 0, "("], + [1241, 0, "c"], + [1242, 0, ","], + [1243, 0, " "], + [1244, 0, "p"], + [1245, 0, ")"], + [1246, 0, "$"], + [1247, 0, " "], + [1248, 0, "i"], + [1249, 0, "s"], + [1250, 0, " "], + [1251, 0, "s"], + [1252, 0, "e"], + [1253, 0, "n"], + [1254, 0, "t"], + [1255, 0, " "], + [1256, 0, "t"], + [1257, 0, "o"], + [1258, 0, " "], + [1259, 0, "o"], + [1260, 0, "t"], + [1261, 0, "h"], + [1262, 0, "e"], + [1263, 0, "r"], + [1237, 1], + [1236, 1], + [1235, 1], + [1234, 1], + [1233, 1], + [1232, 1], + [1231, 1], + [1230, 1], + [1230, 0, "W"], + [1231, 0, "h"], + [1232, 0, "e"], + [1233, 0, "n"], + [1234, 0, "e"], + [1235, 0, "v"], + [1236, 0, "e"], + [1237, 0, "r"], + [1238, 0, " "], + [1239, 0, "a"], + [1240, 0, "n"], + [1241, 0, " "], + [1242, 0, "o"], + [1243, 0, "p"], + [1244, 0, "e"], + [1245, 0, "r"], + [1246, 0, "a"], + [1247, 0, "t"], + [1248, 0, "i"], + [1249, 0, "o"], + [1250, 0, "n"], + [1251, 0, " "], + [1252, 0, "i"], + [1253, 0, "s"], + [1254, 0, " "], + [1255, 0, "s"], + [1256, 0, "e"], + [1257, 0, "n"], + [1258, 0, "t"], + [1259, 0, " "], + [1260, 0, "t"], + [1261, 0, "o"], + [1262, 0, " "], + [1263, 0, "o"], + [1264, 0, "t"], + [1265, 0, "h"], + [1266, 0, "e"], + [1267, 0, "r"], + [1268, 0, " "], + [1269, 0, "p"], + [1270, 0, "e"], + [1271, 0, "e"], + [1272, 0, "r"], + [1273, 0, "s"], + [1274, 0, ","], + [1275, 0, " "], + [1276, 0, "t"], + [1277, 0, "h"], + [1278, 0, "e"], + [1279, 0, " "], + [1280, 0, "L"], + [1281, 0, "a"], + [1282, 0, "m"], + [1283, 0, "p"], + [1284, 0, "o"], + [1285, 0, "r"], + [1286, 0, "t"], + [1287, 0, " "], + [1288, 0, "t"], + [1289, 0, "i"], + [1290, 0, "m"], + [1291, 0, "e"], + [1292, 0, "s"], + [1293, 0, "t"], + [1294, 0, "a"], + [1295, 0, "m"], + [1296, 0, "p"], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 1], + [1310, 0, "i"], + [1311, 0, "n"], + [1312, 0, "c"], + [1313, 0, "l"], + [1314, 0, "u"], + [1315, 0, "d"], + [1316, 0, "e"], + [1317, 0, "d"], + [1318, 0, " "], + [1319, 0, "i"], + [1320, 0, "n"], + [1321, 0, " "], + [1322, 0, "t"], + [1323, 0, "h"], + [1324, 0, "e"], + [1325, 0, " "], + [1326, 0, "m"], + [1327, 0, "e"], + [1328, 0, "s"], + [1329, 0, "s"], + [1330, 0, "a"], + [1331, 0, "g"], + [1332, 0, "e"], + [1333, 0, "."], + [1334, 0, " "], + [1335, 0, "I"], + [1306, 0, " "], + [1307, 0, "f"], + [1308, 0, "o"], + [1309, 0, "r"], + [1310, 0, " "], + [1311, 0, "t"], + [1312, 0, "h"], + [1313, 0, "a"], + [1314, 0, "t"], + [1315, 0, " "], + [1316, 0, "o"], + [1317, 0, "p"], + [1318, 0, "e"], + [1319, 0, "r"], + [1320, 0, "a"], + [1321, 0, "t"], + [1322, 0, "i"], + [1323, 0, "o"], + [1324, 0, "n"], + [1354, 1], + [1354, 0, "W"], + [1355, 0, "h"], + [1356, 0, "e"], + [1357, 0, "n"], + [1358, 0, " "], + [1358, 1], + [1357, 1], + [1356, 1], + [1355, 1], + [1354, 1], + [1354, 0, "I"], + [1355, 0, "f"], + [1356, 0, " "], + [1357, 0, "a"], + [1358, 0, " "], + [1359, 0, "p"], + [1360, 0, "e"], + [1361, 0, "e"], + [1362, 0, "r"], + [1363, 0, " "], + [1364, 0, "r"], + [1365, 0, "e"], + [1366, 0, "c"], + [1367, 0, "e"], + [1368, 0, "i"], + [1369, 0, "v"], + [1370, 0, "e"], + [1371, 0, "s"], + [1372, 0, " "], + [1373, 0, "a"], + [1374, 0, "n"], + [1375, 0, " "], + [1376, 0, "o"], + [1377, 0, "p"], + [1378, 0, "e"], + [1379, 0, "r"], + [1380, 0, "a"], + [1381, 0, "t"], + [1382, 0, "i"], + [1383, 0, "o"], + [1384, 0, "n"], + [1385, 0, " "], + [1386, 0, "w"], + [1387, 0, "i"], + [1388, 0, "t"], + [1389, 0, "h"], + [1390, 0, " "], + [1391, 0, "a"], + [1392, 0, " "], + [1393, 0, "c"], + [1394, 0, "o"], + [1395, 0, "u"], + [1396, 0, "n"], + [1397, 0, "t"], + [1398, 0, "e"], + [1399, 0, "r"], + [1400, 0, " "], + [1401, 0, "v"], + [1402, 0, "a"], + [1403, 0, "l"], + [1404, 0, "u"], + [1405, 0, "e"], + [1406, 0, " "], + [1407, 0, "$"], + [1408, 0, "c"], + [1409, 0, "$"], + [1410, 0, " "], + [1411, 0, "t"], + [1412, 0, "h"], + [1413, 0, "a"], + [1414, 0, "t"], + [1415, 0, " "], + [1416, 0, "i"], + [1417, 0, "s"], + [1418, 0, " "], + [1419, 0, "g"], + [1420, 0, "r"], + [1421, 0, "e"], + [1422, 0, "a"], + [1423, 0, "t"], + [1424, 0, " "], + [1424, 1], + [1424, 0, "e"], + [1425, 0, "r"], + [1426, 0, " "], + [1427, 0, "t"], + [1428, 0, "h"], + [1429, 0, "a"], + [1430, 0, "n"], + [1431, 0, " "], + [1432, 0, "t"], + [1433, 0, "h"], + [1434, 0, "e"], + [1435, 0, " "], + [1436, 0, "l"], + [1437, 0, "o"], + [1438, 0, "c"], + [1439, 0, "a"], + [1440, 0, "l"], + [1441, 0, "l"], + [1442, 0, "y"], + [1443, 0, " "], + [1444, 0, "s"], + [1445, 0, "t"], + [1446, 0, "o"], + [1447, 0, "r"], + [1448, 0, "e"], + [1449, 0, "d"], + [1450, 0, " "], + [1451, 0, "c"], + [1452, 0, "o"], + [1453, 0, "u"], + [1454, 0, "n"], + [1455, 0, "t"], + [1456, 0, "e"], + [1457, 0, "r"], + [1458, 0, " "], + [1459, 0, "v"], + [1460, 0, "a"], + [1461, 0, "l"], + [1462, 0, "u"], + [1463, 0, "e"], + [1464, 0, ","], + [1465, 0, " "], + [1466, 0, "t"], + [1467, 0, "h"], + [1468, 0, "e"], + [1469, 0, " "], + [1470, 0, "l"], + [1471, 0, "o"], + [1472, 0, "c"], + [1473, 0, "a"], + [1474, 0, "l"], + [1475, 0, " "], + [1476, 0, "c"], + [1477, 0, "o"], + [1478, 0, "u"], + [1479, 0, "n"], + [1480, 0, "t"], + [1481, 0, "e"], + [1482, 0, "r"], + [1483, 0, " "], + [1484, 0, "i"], + [1485, 0, "s"], + [1486, 0, " "], + [1487, 0, "i"], + [1488, 0, "n"], + [1489, 0, "c"], + [1490, 0, "r"], + [1491, 0, "e"], + [1492, 0, "a"], + [1493, 0, "s"], + [1494, 0, "e"], + [1495, 0, "d"], + [1496, 0, " "], + [1497, 0, "t"], + [1498, 0, "o"], + [1499, 0, " "], + [1500, 0, "t"], + [1501, 0, "h"], + [1502, 0, "e"], + [1503, 0, " "], + [1504, 0, "v"], + [1505, 0, "a"], + [1506, 0, "l"], + [1507, 0, "u"], + [1508, 0, "e"], + [1509, 0, " "], + [1510, 0, "o"], + [1511, 0, "f"], + [1512, 0, " "], + [1513, 0, "t"], + [1514, 0, "h"], + [1515, 0, "e"], + [1516, 0, " "], + [1517, 0, "i"], + [1518, 0, "n"], + [1519, 0, "c"], + [1520, 0, "o"], + [1521, 0, "m"], + [1522, 0, "i"], + [1523, 0, "n"], + [1524, 0, "g"], + [1525, 0, " "], + [1526, 0, "c"], + [1527, 0, "o"], + [1528, 0, "u"], + [1529, 0, "n"], + [1530, 0, "t"], + [1531, 0, "e"], + [1532, 0, "r"], + [1533, 0, "."], + [1353, 1], + [1353, 0, "\n"], + [1354, 0, "\n"], + [1535, 0, " "], + [1536, 0, "T"], + [1537, 0, "h"], + [1538, 0, "i"], + [1539, 0, "s"], + [1540, 0, " "], + [1541, 0, "e"], + [1542, 0, "n"], + [1543, 0, "s"], + [1544, 0, "u"], + [1545, 0, "r"], + [1546, 0, "e"], + [1547, 0, "s"], + [1548, 0, " "], + [1549, 0, "t"], + [1550, 0, "h"], + [1551, 0, "a"], + [1552, 0, "t"], + [1553, 0, " "], + [1554, 0, "i"], + [1555, 0, "f"], + [1556, 0, " "], + [1557, 0, "o"], + [1558, 0, "p"], + [1559, 0, "e"], + [1560, 0, "r"], + [1561, 0, "a"], + [1562, 0, "t"], + [1563, 0, "i"], + [1564, 0, "o"], + [1565, 0, "n"], + [1566, 0, " "], + [1567, 0, "$"], + [1568, 0, "o"], + [1569, 0, "_"], + [1570, 0, "1"], + [1571, 0, "$"], + [1572, 0, " "], + [1573, 0, "h"], + [1574, 0, "a"], + [1575, 0, "p"], + [1576, 0, "p"], + [1577, 0, "e"], + [1578, 0, "n"], + [1579, 0, "e"], + [1580, 0, "d"], + [1581, 0, " "], + [1582, 0, "b"], + [1583, 0, "e"], + [1584, 0, "f"], + [1585, 0, "o"], + [1586, 0, "r"], + [1587, 0, "e"], + [1588, 0, " "], + [1589, 0, "$"], + [1590, 0, "o"], + [1591, 0, "_"], + [1592, 0, "2"], + [1593, 0, "$"], + [1594, 0, " "], + [1595, 0, "("], + [1596, 0, "t"], + [1597, 0, "h"], + [1598, 0, "a"], + [1599, 0, "t"], + [1600, 0, " "], + [1601, 0, "i"], + [1602, 0, "s"], + [1603, 0, ","], + [1604, 0, " "], + [1605, 0, "t"], + [1606, 0, "h"], + [1607, 0, "e"], + [1608, 0, " "], + [1609, 0, "p"], + [1610, 0, "e"], + [1611, 0, "e"], + [1612, 0, "r"], + [1613, 0, " "], + [1614, 0, "t"], + [1615, 0, "h"], + [1616, 0, "a"], + [1617, 0, "t"], + [1618, 0, " "], + [1619, 0, "g"], + [1620, 0, "e"], + [1621, 0, "n"], + [1622, 0, "e"], + [1623, 0, "r"], + [1624, 0, "a"], + [1625, 0, "t"], + [1626, 0, "e"], + [1627, 0, "d"], + [1628, 0, " "], + [1629, 0, "$"], + [1630, 0, "o"], + [1631, 0, "_"], + [1632, 0, "2"], + [1633, 0, "$"], + [1634, 0, " "], + [1635, 0, "k"], + [1636, 0, "n"], + [1637, 0, "e"], + [1638, 0, "w"], + [1639, 0, " "], + [1640, 0, "a"], + [1641, 0, "b"], + [1642, 0, "o"], + [1643, 0, "u"], + [1644, 0, "t"], + [1645, 0, " "], + [1646, 0, "t"], + [1647, 0, "h"], + [1648, 0, "e"], + [1649, 0, " "], + [1649, 1], + [1648, 1], + [1647, 1], + [1646, 1], + [1645, 1], + [1644, 1], + [1643, 1], + [1642, 1], + [1641, 1], + [1640, 1], + [1639, 1], + [1638, 1], + [1637, 1], + [1636, 1], + [1635, 1], + [1635, 0, "h"], + [1636, 0, "a"], + [1637, 0, "d"], + [1638, 0, " "], + [1639, 0, "r"], + [1640, 0, "e"], + [1641, 0, "c"], + [1642, 0, "e"], + [1643, 0, "i"], + [1644, 0, "v"], + [1645, 0, "e"], + [1646, 0, "d"], + [1647, 0, " "], + [1648, 0, "a"], + [1649, 0, "n"], + [1650, 0, "d"], + [1651, 0, " "], + [1652, 0, "p"], + [1653, 0, "r"], + [1654, 0, "o"], + [1655, 0, "c"], + [1656, 0, "e"], + [1657, 0, "s"], + [1658, 0, "s"], + [1659, 0, "e"], + [1660, 0, "d"], + [1661, 0, " "], + [1662, 0, "$"], + [1663, 0, "o"], + [1664, 0, "_"], + [1665, 0, "1"], + [1666, 0, "$"], + [1667, 0, " "], + [1668, 0, "b"], + [1669, 0, "e"], + [1670, 0, "f"], + [1671, 0, "o"], + [1672, 0, "r"], + [1673, 0, "e"], + [1674, 0, " "], + [1675, 0, "$"], + [1676, 0, "o"], + [1677, 0, "_"], + [1678, 0, "2"], + [1679, 0, "$"], + [1680, 0, " "], + [1681, 0, "w"], + [1682, 0, "a"], + [1683, 0, "s"], + [1684, 0, " "], + [1685, 0, "g"], + [1686, 0, "e"], + [1687, 0, "n"], + [1688, 0, "e"], + [1689, 0, "r"], + [1690, 0, "a"], + [1691, 0, "t"], + [1692, 0, "e"], + [1693, 0, "d"], + [1694, 0, ")"], + [1695, 0, ","], + [1696, 0, " "], + [1697, 0, "t"], + [1698, 0, "h"], + [1699, 0, "e"], + [1700, 0, "n"], + [1701, 0, " "], + [1702, 0, "$"], + [1703, 0, "o"], + [1704, 0, "_"], + [1705, 0, "2"], + [1706, 0, "$"], + [1707, 0, " "], + [1708, 0, "m"], + [1709, 0, "u"], + [1710, 0, "s"], + [1711, 0, "t"], + [1712, 0, " "], + [1713, 0, "h"], + [1714, 0, "a"], + [1715, 0, "v"], + [1716, 0, "e"], + [1717, 0, " "], + [1718, 0, "a"], + [1719, 0, " "], + [1720, 0, "g"], + [1721, 0, "r"], + [1722, 0, "e"], + [1723, 0, "a"], + [1724, 0, "t"], + [1725, 0, "e"], + [1726, 0, "r"], + [1727, 0, " "], + [1728, 0, "c"], + [1729, 0, "o"], + [1730, 0, "u"], + [1731, 0, "n"], + [1732, 0, "t"], + [1733, 0, "e"], + [1734, 0, "r"], + [1735, 0, " "], + [1736, 0, "v"], + [1737, 0, "a"], + [1738, 0, "l"], + [1739, 0, "u"], + [1740, 0, "e"], + [1741, 0, " "], + [1742, 0, "t"], + [1743, 0, "h"], + [1744, 0, "a"], + [1745, 0, "n"], + [1746, 0, " "], + [1747, 0, "$"], + [1748, 0, "o"], + [1749, 0, "_"], + [1750, 0, "1"], + [1751, 0, "$"], + [1752, 0, "."], + [1753, 0, " "], + [1754, 0, "O"], + [1755, 0, "n"], + [1756, 0, "l"], + [1757, 0, "y"], + [1758, 0, " "], + [1759, 0, "c"], + [1760, 0, "o"], + [1761, 0, "n"], + [1762, 0, "c"], + [1763, 0, "u"], + [1764, 0, "r"], + [1765, 0, "r"], + [1766, 0, "e"], + [1767, 0, "n"], + [1768, 0, "t"], + [1769, 0, " "], + [1770, 0, "o"], + [1771, 0, "p"], + [1772, 0, "e"], + [1773, 0, "r"], + [1774, 0, "a"], + [1775, 0, "t"], + [1776, 0, "i"], + [1777, 0, "o"], + [1778, 0, "n"], + [1779, 0, "s"], + [1780, 0, " "], + [1781, 0, "c"], + [1782, 0, "a"], + [1783, 0, "n"], + [1784, 0, " "], + [1785, 0, "h"], + [1786, 0, "a"], + [1787, 0, "v"], + [1788, 0, "e"], + [1789, 0, " "], + [1790, 0, "e"], + [1791, 0, "q"], + [1792, 0, "u"], + [1793, 0, "a"], + [1794, 0, "l"], + [1795, 0, " "], + [1796, 0, "c"], + [1797, 0, "o"], + [1798, 0, "u"], + [1799, 0, "n"], + [1800, 0, "t"], + [1801, 0, "e"], + [1802, 0, "r"], + [1803, 0, " "], + [1804, 0, "v"], + [1805, 0, "a"], + [1806, 0, "l"], + [1807, 0, "u"], + [1808, 0, "e"], + [1809, 0, "s"], + [1810, 0, "."], + [1811, 0, "\n"], + [1812, 0, "\n"], + [1813, 0, "W"], + [1814, 0, "e"], + [1815, 0, " "], + [1816, 0, "c"], + [1817, 0, "a"], + [1818, 0, "n"], + [1819, 0, " "], + [1820, 0, "t"], + [1821, 0, "h"], + [1822, 0, "u"], + [1823, 0, "s"], + [1824, 0, " "], + [1825, 0, "d"], + [1826, 0, "e"], + [1827, 0, "f"], + [1828, 0, "i"], + [1829, 0, "n"], + [1830, 0, "e"], + [1831, 0, " "], + [1832, 0, "a"], + [1833, 0, " "], + [1834, 0, "t"], + [1835, 0, "o"], + [1836, 0, "t"], + [1837, 0, "a"], + [1838, 0, "l"], + [1839, 0, " "], + [1840, 0, "o"], + [1841, 0, "r"], + [1842, 0, "d"], + [1843, 0, "e"], + [1844, 0, "r"], + [1845, 0, "i"], + [1846, 0, "n"], + [1847, 0, "g"], + [1848, 0, " "], + [1849, 0, "o"], + [1850, 0, "n"], + [1851, 0, " "], + [1852, 0, "o"], + [1853, 0, "p"], + [1854, 0, "e"], + [1855, 0, "r"], + [1856, 0, "a"], + [1857, 0, "t"], + [1858, 0, "i"], + [1859, 0, "o"], + [1860, 0, "n"], + [1861, 0, "s"], + [1862, 0, "."], + [1863, 0, " "], + [1850, 1], + [1849, 1], + [1861, 1], + [1860, 1], + [1859, 1], + [1858, 1], + [1857, 1], + [1856, 1], + [1855, 1], + [1854, 1], + [1853, 1], + [1852, 1], + [1851, 1], + [1850, 1], + [1849, 1], + [1849, 0, "f"], + [1850, 0, "o"], + [1851, 0, "r"], + [1852, 0, " "], + [1853, 0, "L"], + [1854, 0, "a"], + [1855, 0, "m"], + [1856, 0, "p"], + [1857, 0, "o"], + [1858, 0, "r"], + [1859, 0, "t"], + [1860, 0, " "], + [1861, 0, "t"], + [1862, 0, "i"], + [1863, 0, "m"], + [1864, 0, "e"], + [1865, 0, "s"], + [1866, 0, "t"], + [1867, 0, "a"], + [1868, 0, "m"], + [1869, 0, "p"], + [1870, 0, "s"], + [1871, 0, ":"], + [1872, 0, "\n"], + [1873, 0, "$"], + [1874, 0, "$"], + [1875, 0, " "], + [1875, 1], + [1875, 0, "("], + [1876, 0, "c"], + [1877, 0, "_"], + [1878, 0, "1"], + [1879, 0, ","], + [1880, 0, " "], + [1881, 0, "p"], + [1882, 0, "_"], + [1883, 0, "1"], + [1884, 0, ")"], + [1885, 0, " "], + [1886, 0, "<"], + [1887, 0, " "], + [1888, 0, "("], + [1889, 0, "c"], + [1890, 0, "_"], + [1891, 0, "2"], + [1892, 0, ","], + [1893, 0, " "], + [1894, 0, "p"], + [1895, 0, "_"], + [1896, 0, "2"], + [1897, 0, ")"], + [1898, 0, " "], + [1899, 0, "\\"], + [1900, 0, "q"], + [1901, 0, "u"], + [1902, 0, "a"], + [1903, 0, "d"], + [1904, 0, "{"], + [1904, 1], + [1904, 0, "\\"], + [1905, 0, "t"], + [1906, 0, "e"], + [1907, 0, "x"], + [1908, 0, "t"], + [1909, 0, "{"], + [1910, 0, "i"], + [1911, 0, "f"], + [1912, 0, "f"], + [1913, 0, "}"], + [1914, 0, "\\"], + [1915, 0, "q"], + [1916, 0, "u"], + [1917, 0, "a"], + [1918, 0, "d"], + [1919, 0, " "], + [1920, 0, "("], + [1921, 0, "c"], + [1922, 0, "_"], + [1923, 0, "1"], + [1924, 0, " "], + [1925, 0, "<"], + [1926, 0, " "], + [1927, 0, "c"], + [1928, 0, "_"], + [1929, 0, "2"], + [1930, 0, ")"], + [1931, 0, " "], + [1932, 0, "\\"], + [1933, 0, "v"], + [1934, 0, "e"], + [1935, 0, "e"], + [1936, 0, " "], + [1937, 0, "("], + [1938, 0, "c"], + [1939, 0, "_"], + [1940, 0, "1"], + [1941, 0, " "], + [1942, 0, "="], + [1943, 0, " "], + [1944, 0, "c"], + [1945, 0, "_"], + [1946, 0, "2"], + [1947, 0, " "], + [1948, 0, "\\"], + [1949, 0, "w"], + [1950, 0, "e"], + [1951, 0, "d"], + [1952, 0, "g"], + [1953, 0, "e"], + [1954, 0, " "], + [1955, 0, "p"], + [1956, 0, "_"], + [1957, 0, "1"], + [1958, 0, " "], + [1959, 0, "<"], + [1960, 0, " "], + [1961, 0, "p"], + [1962, 0, "_"], + [1963, 0, "2"], + [1964, 0, ")"], + [1965, 0, "."], + [1966, 0, "$"], + [1967, 0, "$"], + [1968, 0, "\n"], + [1969, 0, "T"], + [1970, 0, "h"], + [1971, 0, "i"], + [1972, 0, "s"], + [1973, 0, " "], + [1974, 0, "o"], + [1975, 0, "r"], + [1976, 0, "d"], + [1977, 0, "e"], + [1978, 0, "r"], + [1979, 0, "i"], + [1980, 0, "n"], + [1981, 0, "g"], + [1982, 0, " "], + [1983, 0, "i"], + [1984, 0, "s"], + [1985, 0, " "], + [1986, 0, "c"], + [1987, 0, "o"], + [1988, 0, "n"], + [1989, 0, "s"], + [1990, 0, "i"], + [1991, 0, "s"], + [1992, 0, "t"], + [1993, 0, "e"], + [1994, 0, "n"], + [1995, 0, "t"], + [1996, 0, " "], + [1997, 0, "w"], + [1998, 0, "i"], + [1999, 0, "t"], + [2000, 0, "h"], + [2001, 0, " "], + [2002, 0, "c"], + [2003, 0, "a"], + [2004, 0, "u"], + [2005, 0, "s"], + [2006, 0, "a"], + [2007, 0, "l"], + [2008, 0, "i"], + [2009, 0, "t"], + [2010, 0, "y"], + [2011, 0, ","], + [2012, 0, " "], + [2013, 0, "t"], + [2014, 0, "h"], + [2015, 0, "a"], + [2016, 0, "t"], + [2017, 0, " "], + [2018, 0, "i"], + [2019, 0, "s"], + [2020, 0, ","], + [2021, 0, " "], + [2022, 0, "i"], + [2023, 0, "f"], + [2024, 0, " "], + [2025, 0, "o"], + [2026, 0, "p"], + [2027, 0, "e"], + [2028, 0, "r"], + [2029, 0, "a"], + [2030, 0, "t"], + [2031, 0, "i"], + [2032, 0, "o"], + [2033, 0, "n"], + [2034, 0, " "], + [2035, 0, "$"], + [2036, 0, "o"], + [2037, 0, "_"], + [2038, 0, "1"], + [2039, 0, "$"], + [2040, 0, " "], + [2041, 0, "h"], + [2042, 0, "a"], + [2043, 0, "p"], + [2044, 0, "p"], + [2045, 0, "e"], + [2046, 0, "n"], + [2047, 0, "e"], + [2048, 0, "d"], + [2049, 0, " "], + [2050, 0, "b"], + [2051, 0, "e"], + [2052, 0, "f"], + [2053, 0, "o"], + [2054, 0, "r"], + [2055, 0, "e"], + [2056, 0, " "], + [2057, 0, "$"], + [2058, 0, "o"], + [2059, 0, "_"], + [2060, 0, "2"], + [2061, 0, "$"], + [2062, 0, ","], + [2063, 0, " "], + [2064, 0, "t"], + [2065, 0, "h"], + [2066, 0, "e"], + [2067, 0, "n"], + [2068, 0, " "], + [2069, 0, "$"], + [2070, 0, "o"], + [2071, 0, "_"], + [2072, 0, "1"], + [2073, 0, "$"], + [2074, 0, " "], + [2075, 0, "i"], + [2076, 0, "s"], + [2077, 0, " "], + [2078, 0, "g"], + [2079, 0, "u"], + [2080, 0, "a"], + [2081, 0, "r"], + [2082, 0, "a"], + [2083, 0, "n"], + [2084, 0, "t"], + [2085, 0, "e"], + [2086, 0, "e"], + [2086, 1], + [2085, 1], + [2084, 1], + [2083, 1], + [2082, 1], + [2081, 1], + [2080, 1], + [2079, 1], + [2078, 1], + [2077, 1], + [2076, 1], + [2075, 1], + [2075, 0, "h"], + [2076, 0, "a"], + [2077, 0, "s"], + [2078, 0, " "], + [2079, 0, "a"], + [2080, 0, " "], + [2081, 0, "l"], + [2082, 0, "o"], + [2083, 0, "w"], + [2084, 0, "e"], + [2084, 1], + [2083, 1], + [2082, 1], + [2081, 1], + [2080, 1], + [2079, 1], + [2078, 1], + [2077, 1], + [2076, 1], + [2075, 1], + [2074, 1], + [2073, 1], + [2072, 1], + [2071, 1], + [2070, 1], + [2069, 1], + [2068, 1], + [2067, 1], + [2066, 1], + [2065, 1], + [2064, 1], + [2063, 1], + [2062, 1], + [2061, 1], + [2060, 1], + [2059, 1], + [2058, 1], + [2057, 1], + [2056, 1], + [2055, 1], + [2054, 1], + [2053, 1], + [2052, 1], + [2051, 1], + [2050, 1], + [2049, 1], + [2048, 1], + [2047, 1], + [2046, 1], + [2045, 1], + [2044, 1], + [2043, 1], + [2042, 1], + [2041, 1], + [2040, 1], + [2039, 1], + [2038, 1], + [2037, 1], + [2036, 1], + [2035, 1], + [2034, 1], + [2033, 1], + [2032, 1], + [2031, 1], + [2030, 1], + [2029, 1], + [2028, 1], + [2027, 1], + [2026, 1], + [2025, 1], + [2024, 1], + [2023, 1], + [2022, 1], + [2021, 1], + [2020, 1], + [2019, 1], + [2018, 1], + [2017, 1], + [2016, 1], + [2015, 1], + [2014, 1], + [2013, 1], + [2012, 1], + [2011, 1], + [2010, 1], + [2009, 1], + [2008, 1], + [2007, 1], + [2006, 1], + [2005, 1], + [2004, 1], + [2003, 1], + [2002, 1], + [2001, 1], + [2000, 1], + [1999, 1], + [1998, 1], + [1997, 1], + [1996, 1], + [1995, 1], + [1994, 1], + [1993, 1], + [1992, 1], + [1991, 1], + [1990, 1], + [1989, 1], + [1988, 1], + [1987, 1], + [1986, 1], + [1985, 1], + [1984, 1], + [1983, 1], + [1982, 1], + [1981, 1], + [1980, 1], + [1979, 1], + [1978, 1], + [1977, 1], + [1976, 1], + [1975, 1], + [1974, 1], + [1973, 1], + [1972, 1], + [1971, 1], + [1970, 1], + [1969, 1], + [1969, 0, "I"], + [1970, 0, "f"], + [1971, 0, " "], + [1972, 0, "o"], + [1973, 0, "n"], + [1974, 0, "e"], + [1975, 0, " "], + [1976, 0, "o"], + [1977, 0, "p"], + [1978, 0, "e"], + [1979, 0, "r"], + [1980, 0, "a"], + [1981, 0, "t"], + [1982, 0, "i"], + [1983, 0, "o"], + [1984, 0, "n"], + [1985, 0, " "], + [1986, 0, "h"], + [1987, 0, "a"], + [1988, 0, "p"], + [1989, 0, "p"], + [1990, 0, "e"], + [1991, 0, "n"], + [1992, 0, "e"], + [1993, 0, "d"], + [1994, 0, " "], + [1995, 0, "b"], + [1996, 0, "e"], + [1997, 0, "f"], + [1998, 0, "o"], + [1999, 0, "r"], + [2000, 0, "e"], + [2001, 0, " "], + [2002, 0, "a"], + [2003, 0, "n"], + [2004, 0, "o"], + [2005, 0, "t"], + [2006, 0, "h"], + [2007, 0, "e"], + [2008, 0, "r"], + [2009, 0, ","], + [2010, 0, " "], + [2011, 0, "t"], + [2012, 0, "h"], + [2013, 0, "i"], + [2014, 0, "s"], + [2015, 0, " "], + [2016, 0, "o"], + [2017, 0, "r"], + [2018, 0, "d"], + [2019, 0, "e"], + [2020, 0, "r"], + [2021, 0, "i"], + [2022, 0, "n"], + [2023, 0, "g"], + [2024, 0, " "], + [2025, 0, "i"], + [2026, 0, "s"], + [2027, 0, " "], + [2028, 0, "c"], + [2029, 0, "o"], + [2030, 0, "n"], + [2031, 0, "s"], + [2032, 0, "i"], + [2033, 0, "s"], + [2034, 0, "t"], + [2035, 0, "e"], + [2036, 0, "n"], + [2037, 0, "t"], + [2038, 0, " "], + [2039, 0, "w"], + [2040, 0, "i"], + [2041, 0, "t"], + [2042, 0, "h"], + [2043, 0, " "], + [2044, 0, "c"], + [2045, 0, "a"], + [2046, 0, "u"], + [2047, 0, "s"], + [2048, 0, "a"], + [2049, 0, "l"], + [2050, 0, "i"], + [2051, 0, "t"], + [2052, 0, "y"], + [2053, 0, " "], + [2054, 0, "("], + [2055, 0, "t"], + [2056, 0, "h"], + [2057, 0, "e"], + [2058, 0, " "], + [2059, 0, "e"], + [2060, 0, "a"], + [2061, 0, "r"], + [2062, 0, "l"], + [2063, 0, "i"], + [2064, 0, "e"], + [2065, 0, "r"], + [2066, 0, " "], + [2067, 0, "o"], + [2068, 0, "p"], + [2069, 0, "e"], + [2070, 0, "r"], + [2071, 0, "a"], + [2072, 0, "t"], + [2073, 0, "i"], + [2074, 0, "o"], + [2075, 0, "n"], + [2076, 0, " "], + [2077, 0, "h"], + [2078, 0, "a"], + [2079, 0, "s"], + [2080, 0, " "], + [2081, 0, "a"], + [2082, 0, " "], + [2083, 0, "l"], + [2084, 0, "o"], + [2085, 0, "w"], + [2086, 0, "e"], + [2087, 0, "r"], + [2088, 0, " "], + [2089, 0, "t"], + [2090, 0, "i"], + [2091, 0, "m"], + [2092, 0, "e"], + [2093, 0, "s"], + [2094, 0, "e"], + [2095, 0, "t"], + [2096, 0, "a"], + [2097, 0, "m"], + [2098, 0, "p"], + [2099, 0, ")"], + [2100, 0, "."], + [2101, 0, " "], + [2102, 0, "I"], + [2103, 0, "f"], + [2104, 0, " "], + [2105, 0, "t"], + [2106, 0, "w"], + [2107, 0, "o"], + [2108, 0, " "], + [2109, 0, "o"], + [2110, 0, "p"], + [2111, 0, "e"], + [2112, 0, "r"], + [2113, 0, "a"], + [2114, 0, "t"], + [2115, 0, "i"], + [2116, 0, "o"], + [2117, 0, "n"], + [2118, 0, "s"], + [2119, 0, " "], + [2120, 0, "a"], + [2121, 0, "r"], + [2122, 0, "e"], + [2123, 0, " "], + [2124, 0, "c"], + [2125, 0, "o"], + [2126, 0, "n"], + [2127, 0, "c"], + [2128, 0, "u"], + [2129, 0, "r"], + [2130, 0, "r"], + [2131, 0, "e"], + [2132, 0, "n"], + [2133, 0, "t"], + [2134, 0, ","], + [2135, 0, " "], + [2136, 0, "t"], + [2137, 0, "h"], + [2138, 0, "i"], + [2139, 0, "s"], + [2140, 0, " "], + [2141, 0, "o"], + [2142, 0, "r"], + [2143, 0, "d"], + [2144, 0, "e"], + [2145, 0, "r"], + [2146, 0, "i"], + [2147, 0, "n"], + [2148, 0, "g"], + [2149, 0, " "], + [2150, 0, "i"], + [2151, 0, "s"], + [2152, 0, " "], + [2153, 0, "a"], + [2154, 0, "r"], + [2155, 0, "b"], + [2156, 0, "i"], + [2157, 0, "t"], + [2158, 0, "r"], + [2159, 0, "a"], + [2160, 0, "r"], + [2161, 0, "y"], + [2162, 0, " "], + [2163, 0, "b"], + [2164, 0, "u"], + [2165, 0, "t"], + [2166, 0, " "], + [2167, 0, "d"], + [2168, 0, "e"], + [2169, 0, "t"], + [2170, 0, "e"], + [2171, 0, "r"], + [2172, 0, "m"], + [2173, 0, "i"], + [2174, 0, "n"], + [2175, 0, "i"], + [2176, 0, "s"], + [2177, 0, "t"], + [2178, 0, "i"], + [2179, 0, "c"], + [2180, 0, "."], + [1903, 1], + [1902, 1], + [1901, 1], + [1900, 1], + [1900, 0, ";"], + [1915, 1], + [1914, 1], + [1913, 1], + [1912, 1], + [1912, 0, ";"], + [1913, 0, "\\"], + [1914, 0, ";"], + [1912, 1], + [1911, 1], + [1910, 0, " "], + [1907, 0, " "], + [2135, 1], + [2134, 1], + [2134, 0, "e"], + [2143, 1], + [2142, 1], + [2141, 1], + [2141, 0, " "], + [2142, 0, "$"], + [2143, 0, "<"], + [2144, 0, "$"], + [1848, 0, " "], + [1849, 0, "$"], + [1850, 0, "<"], + [1851, 0, "$"], + [2139, 0, "i"], + [2140, 0, "r"], + [2147, 0, " "], + [2148, 0, "a"], + [2149, 0, "c"], + [2150, 0, "c"], + [2151, 0, "o"], + [2152, 0, "r"], + [2153, 0, "d"], + [2154, 0, "i"], + [2155, 0, "n"], + [2156, 0, "g"], + [2157, 0, " "], + [2158, 0, "t"], + [2159, 0, "o"], + [2160, 0, "1"], + [2160, 1], + [2643, 0, " "], + [2644, 0, "T"], + [2645, 0, "h"], + [2646, 0, "e"], + [2647, 0, " "], + [2648, 0, "p"], + [2649, 0, "a"], + [2650, 0, "r"], + [2651, 0, "a"], + [2652, 0, "m"], + [2653, 0, "e"], + [2654, 0, "t"], + [2655, 0, "e"], + [2656, 0, "r"], + [2657, 0, " "], + [2658, 0, "$"], + [2659, 0, "\\"], + [2660, 0, "m"], + [2661, 0, "a"], + [2662, 0, "t"], + [2663, 0, "h"], + [2664, 0, "i"], + [2665, 0, "d"], + [2665, 1], + [2665, 0, "t"], + [2666, 0, "{"], + [2667, 0, "i"], + [2668, 0, "d"], + [2669, 0, "}"], + [2670, 0, "$"], + [2671, 0, " "], + [2672, 0, "i"], + [2673, 0, "s"], + [2674, 0, " "], + [2675, 0, "e"], + [2676, 0, "i"], + [2677, 0, "t"], + [2678, 0, "h"], + [2679, 0, "e"], + [2680, 0, "r"], + [2681, 0, " "], + [2682, 0, "a"], + [2683, 0, " "], + [2684, 0, "L"], + [2685, 0, "a"], + [2686, 0, "m"], + [2687, 0, "p"], + [2688, 0, "o"], + [2689, 0, "r"], + [2690, 0, "t"], + [2691, 0, " "], + [2692, 0, "t"], + [2693, 0, "i"], + [2694, 0, "m"], + [2695, 0, "e"], + [2696, 0, "s"], + [2697, 0, "t"], + [2698, 0, "a"], + [2699, 0, "m"], + [2700, 0, "p"], + [2701, 0, " "], + [2702, 0, "o"], + [2703, 0, "r"], + [2704, 0, " "], + [2705, 0, "t"], + [2706, 0, "h"], + [2707, 0, "e"], + [2708, 0, " "], + [2709, 0, "s"], + [2710, 0, "p"], + [2711, 0, "e"], + [2712, 0, "c"], + [2713, 0, "i"], + [2714, 0, "a"], + [2715, 0, "l"], + [2716, 0, " "], + [2717, 0, "s"], + [2718, 0, "y"], + [2719, 0, "m"], + [2720, 0, "b"], + [2721, 0, "o"], + [2722, 0, "l"], + [2723, 0, " "], + [2724, 0, "$"], + [2725, 0, "\\"], + [2726, 0, "m"], + [2727, 0, "a"], + [2728, 0, "t"], + [2729, 0, "h"], + [2730, 0, "s"], + [2731, 0, "f"], + [2732, 0, "{"], + [2733, 0, "h"], + [2734, 0, "e"], + [2735, 0, "a"], + [2736, 0, "d"], + [2737, 0, "}"], + [2738, 0, "$"], + [2739, 0, ","], + [2740, 0, " "], + [2741, 0, "i"], + [2742, 0, "n"], + [2743, 0, "d"], + [2744, 0, "i"], + [2745, 0, "c"], + [2746, 0, "a"], + [2747, 0, "t"], + [2748, 0, "i"], + [2749, 0, "n"], + [2750, 0, "g"], + [2751, 0, " "], + [2752, 0, "t"], + [2753, 0, "h"], + [2754, 0, "e"], + [2755, 0, " "], + [2756, 0, "h"], + [2757, 0, "e"], + [2758, 0, "a"], + [2759, 0, "d"], + [2760, 0, " "], + [2761, 0, "o"], + [2762, 0, "f"], + [2763, 0, " "], + [2764, 0, "t"], + [2765, 0, "h"], + [2766, 0, "e"], + [2767, 0, " "], + [2768, 0, "l"], + [2769, 0, "i"], + [2770, 0, "s"], + [2771, 0, "t"], + [2772, 0, "."], + [2773, 0, " "], + [2774, 0, "%"], + [2774, 1], + [2774, 0, "$"], + [2775, 0, "\\"], + [2776, 0, "m"], + [2777, 0, "a"], + [2778, 0, "t"], + [2779, 0, "h"], + [2780, 0, "i"], + [2781, 0, "t"], + [2782, 0, "{"], + [2783, 0, "n"], + [2784, 0, "e"], + [2785, 0, "x"], + [2786, 0, "t"], + [2787, 0, "}"], + [2788, 0, "$"], + [2789, 0, " "], + [2790, 0, "i"], + [2791, 0, "s"], + [2792, 0, " "], + [2793, 0, "e"], + [2794, 0, "i"], + [2795, 0, "t"], + [2796, 0, "h"], + [2797, 0, "e"], + [2798, 0, "r"], + [2799, 0, " "], + [2800, 0, "a"], + [2801, 0, " "], + [2802, 0, "L"], + [2803, 0, "a"], + [2804, 0, "m"], + [2805, 0, "p"], + [2806, 0, "o"], + [2807, 0, "r"], + [2808, 0, "t"], + [2809, 0, " "], + [2810, 0, "t"], + [2811, 0, "i"], + [2812, 0, "m"], + [2813, 0, "e"], + [2814, 0, "s"], + [2815, 0, "t"], + [2816, 0, "a"], + [2817, 0, "m"], + [2818, 0, "p"], + [2819, 0, " "], + [2820, 0, "o"], + [2821, 0, "r"], + [2822, 0, " "], + [2823, 0, "t"], + [2824, 0, "h"], + [2825, 0, "e"], + [2826, 0, " "], + [2827, 0, "s"], + [2828, 0, "y"], + [2829, 0, "m"], + [2830, 0, "b"], + [2831, 0, "o"], + [2832, 0, "l"], + [2833, 0, " "], + [2834, 0, "$"], + [2835, 0, "\\"], + [2836, 0, "m"], + [2837, 0, "a"], + [2838, 0, "t"], + [2839, 0, "h"], + [2840, 0, "s"], + [2841, 0, "f"], + [2842, 0, "{"], + [2843, 0, "t"], + [2844, 0, "a"], + [2845, 0, "i"], + [2846, 0, "l"], + [2847, 0, "}"], + [2848, 0, "$"], + [2849, 0, ","], + [2850, 0, " "], + [2851, 0, "d"], + [2852, 0, "e"], + [2853, 0, "n"], + [2854, 0, "o"], + [2855, 0, "t"], + [2856, 0, "i"], + [2857, 0, "n"], + [2858, 0, "g"], + [2859, 0, " "], + [2860, 0, "t"], + [2861, 0, "h"], + [2862, 0, "e"], + [2863, 0, " "], + [2864, 0, "e"], + [2865, 0, "n"], + [2866, 0, "d"], + [2867, 0, " "], + [2868, 0, "o"], + [2869, 0, "f"], + [2870, 0, " "], + [2871, 0, "t"], + [2872, 0, "h"], + [2873, 0, "e"], + [2874, 0, " "], + [2875, 0, "l"], + [2876, 0, "i"], + [2877, 0, "s"], + [2878, 0, "t"], + [2879, 0, "."], + [2880, 0, "\n"], + [2881, 0, "\n"], + [2882, 1], + [3054, 1], + [3054, 0, "."], + [3055, 0, " "], + [3212, 1], + [3211, 1], + [3210, 1], + [3209, 1], + [3208, 1], + [3207, 1], + [3206, 1], + [3205, 1], + [3204, 1], + [3203, 1], + [3202, 1], + [3201, 1], + [3200, 1], + [3199, 1], + [3198, 1], + [3197, 1], + [3196, 1], + [3195, 1], + [3194, 1], + [3193, 1], + [3192, 1], + [3191, 1], + [3190, 1], + [3189, 1], + [3188, 1], + [3187, 1], + [3186, 1], + [3185, 1], + [3184, 1], + [3183, 1], + [3182, 1], + [3181, 1], + [3180, 1], + [3179, 1], + [3178, 1], + [3177, 1], + [3176, 1], + [3175, 1], + [3174, 1], + [3173, 1], + [3172, 1], + [3171, 1], + [3170, 1], + [3169, 1], + [3168, 1], + [3167, 1], + [3166, 1], + [3165, 1], + [3164, 1], + [3163, 1], + [3162, 1], + [3161, 1], + [3160, 1], + [3159, 1], + [3158, 1], + [3157, 1], + [3156, 1], + [3155, 1], + [3154, 1], + [3153, 1], + [3152, 1], + [3151, 1], + [3150, 1], + [3149, 1], + [3148, 1], + [3147, 1], + [3146, 1], + [3145, 1], + [3144, 1], + [3143, 1], + [3142, 1], + [3141, 1], + [3140, 1], + [3139, 1], + [3138, 1], + [3137, 1], + [3136, 1], + [3135, 1], + [3134, 1], + [3133, 1], + [3132, 1], + [3131, 1], + [3130, 1], + [3129, 1], + [3128, 1], + [3127, 1], + [3126, 1], + [3125, 1], + [3124, 1], + [3123, 1], + [3122, 1], + [3121, 1], + [3120, 1], + [3119, 1], + [3118, 1], + [3117, 1], + [3116, 1], + [3115, 1], + [3114, 1], + [3113, 1], + [3112, 1], + [3111, 1], + [3110, 1], + [3109, 1], + [3108, 1], + [3107, 1], + [3106, 1], + [3105, 1], + [3104, 1], + [3103, 1], + [3102, 1], + [3101, 1], + [3100, 1], + [3099, 1], + [3098, 1], + [3097, 1], + [3096, 1], + [3095, 1], + [3094, 1], + [3093, 1], + [3092, 1], + [3091, 1], + [3090, 1], + [3089, 1], + [3088, 1], + [3087, 1], + [3086, 1], + [3085, 1], + [3084, 1], + [3083, 1], + [3082, 1], + [3081, 1], + [3080, 1], + [3079, 1], + [3078, 1], + [3077, 1], + [3076, 1], + [3075, 1], + [3074, 1], + [3073, 1], + [3072, 1], + [3071, 1], + [3070, 1], + [3069, 1], + [3068, 1], + [3067, 1], + [3066, 1], + [3065, 1], + [3064, 1], + [3063, 1], + [3062, 1], + [3061, 1], + [3060, 1], + [3059, 1], + [3058, 1], + [2880, 0, " "], + [2881, 0, "$"], + [2882, 0, "\\"], + [2883, 0, "m"], + [2884, 0, "a"], + [2885, 0, "t"], + [2886, 0, "h"], + [2887, 0, "i"], + [2888, 0, "t"], + [2889, 0, "{"], + [2890, 0, "v"], + [2891, 0, "a"], + [2892, 0, "l"], + [2893, 0, "u"], + [2894, 0, "e"], + [2895, 0, "}"], + [2896, 0, "$"], + [2897, 0, " "], + [2898, 0, "i"], + [2899, 0, "s"], + [2900, 0, " "], + [2901, 0, "a"], + [2902, 0, "n"], + [2903, 0, "y"], + [2904, 0, " "], + [2905, 0, "v"], + [2906, 0, "a"], + [2907, 0, "l"], + [2908, 0, "u"], + [2909, 0, "e"], + [2910, 0, " "], + [2911, 0, "o"], + [2912, 0, "f"], + [2913, 0, " "], + [2914, 0, "t"], + [2915, 0, "h"], + [2916, 0, "e"], + [2917, 0, " "], + [2918, 0, "d"], + [2919, 0, "a"], + [2920, 0, "t"], + [2921, 0, "a"], + [2922, 0, "t"], + [2923, 0, "y"], + [2924, 0, "p"], + [2925, 0, "e"], + [2926, 0, " "], + [2927, 0, "o"], + [2928, 0, "f"], + [2929, 0, " "], + [2930, 0, "l"], + [2931, 0, "i"], + [2932, 0, "s"], + [2933, 0, "t"], + [2934, 0, " "], + [2935, 0, "e"], + [2936, 0, "l"], + [2937, 0, "e"], + [2938, 0, "m"], + [2939, 0, "e"], + [2940, 0, "n"], + [2941, 0, "t"], + [2942, 0, "s"], + [2943, 0, ","], + [2944, 0, " "], + [2945, 0, "o"], + [2946, 0, "r"], + [2947, 0, " "], + [2948, 0, "t"], + [2949, 0, "h"], + [2950, 0, "e"], + [2951, 0, " "], + [2952, 0, "s"], + [2953, 0, "p"], + [2954, 0, "e"], + [2955, 0, "c"], + [2956, 0, "i"], + [2957, 0, "a"], + [2958, 0, "l"], + [2959, 0, " "], + [2960, 0, "v"], + [2961, 0, "a"], + [2962, 0, "l"], + [2963, 0, "u"], + [2964, 0, "e"], + [2965, 0, " "], + [2966, 0, "$"], + [2967, 0, "\\"], + [2968, 0, "b"], + [2969, 0, "o"], + [2970, 0, "t"], + [2971, 0, "$"], + [2972, 0, ","], + [2973, 0, " "], + [2974, 0, "i"], + [2975, 0, "n"], + [2976, 0, "d"], + [2977, 0, "i"], + [2978, 0, "c"], + [2979, 0, "a"], + [2980, 0, "t"], + [2981, 0, "i"], + [2982, 0, "n"], + [2983, 0, "g"], + [2984, 0, " "], + [2985, 0, "t"], + [2986, 0, "h"], + [2987, 0, "e"], + [2988, 0, " "], + [2989, 0, "a"], + [2990, 0, "b"], + [2991, 0, "s"], + [2992, 0, "e"], + [2993, 0, "n"], + [2994, 0, "c"], + [2995, 0, "e"], + [2996, 0, " "], + [2997, 0, "o"], + [2998, 0, "f"], + [2999, 0, " "], + [3000, 0, "a"], + [3001, 0, " "], + [3002, 0, "v"], + [3003, 0, "a"], + [3004, 0, "l"], + [3005, 0, "u"], + [3006, 0, "e"], + [3007, 0, "."], + [4203, 0, "\n"], + [4204, 0, "w"], + [4205, 0, "h"], + [4206, 0, "e"], + [4207, 0, "r"], + [4208, 0, "e"], + [4209, 0, " "], + [4210, 0, "$"], + [4211, 0, "<"], + [4212, 0, "$"], + [4213, 0, " "], + [4214, 0, "i"], + [4215, 0, "s"], + [4216, 0, " "], + [4217, 0, "t"], + [4218, 0, "h"], + [4219, 0, "e"], + [4220, 0, " "], + [4221, 0, "t"], + [4222, 0, "o"], + [4223, 0, "t"], + [4224, 0, "a"], + [4225, 0, "l"], + [4226, 0, " "], + [4227, 0, "o"], + [4228, 0, "r"], + [4229, 0, "d"], + [4230, 0, "e"], + [4231, 0, "r"], + [4232, 0, " "], + [4233, 0, "o"], + [4234, 0, "n"], + [4235, 0, " "], + [4236, 0, "L"], + [4237, 0, "a"], + [4238, 0, "m"], + [4239, 0, "p"], + [4240, 0, "o"], + [4241, 0, "r"], + [4242, 0, "t"], + [4243, 0, " "], + [4244, 0, "t"], + [4245, 0, "i"], + [4246, 0, "m"], + [4247, 0, "e"], + [4248, 0, "s"], + [4249, 0, "t"], + [4250, 0, "a"], + [4251, 0, "m"], + [4252, 0, "p"], + [4253, 0, "s"], + [4254, 0, ","], + [4255, 0, " "], + [4256, 0, "w"], + [4257, 0, "i"], + [4258, 0, "t"], + [4259, 0, "h"], + [4260, 0, " "], + [4261, 0, "t"], + [4262, 0, "h"], + [4263, 0, "e"], + [4264, 0, " "], + [4265, 0, "a"], + [4266, 0, "d"], + [4267, 0, "d"], + [4268, 0, "i"], + [4269, 0, "t"], + [4270, 0, "i"], + [4271, 0, "o"], + [4272, 0, "n"], + [4273, 0, " "], + [4274, 0, "t"], + [4275, 0, "h"], + [4276, 0, "a"], + [4277, 0, "t"], + [4278, 0, " "], + [4279, 0, "$"], + [4280, 0, "\\"], + [4281, 0, "m"], + [4282, 0, "a"], + [4283, 0, "t"], + [4284, 0, "h"], + [4285, 0, "s"], + [4286, 0, "f"], + [4287, 0, "{"], + [4288, 0, "t"], + [4289, 0, "a"], + [4290, 0, "i"], + [4291, 0, "l"], + [4292, 0, "}"], + [4293, 0, " "], + [4294, 0, "<"], + [4295, 0, " "], + [4296, 0, "("], + [4297, 0, "c"], + [4298, 0, ","], + [4299, 0, " "], + [4300, 0, "p"], + [4301, 0, ")"], + [4302, 0, " "], + [4303, 0, "<"], + [4304, 0, " "], + [4305, 0, "m"], + [4306, 0, "a"], + [4306, 1], + [4305, 1], + [4305, 0, "\\"], + [4306, 0, "m"], + [4307, 0, "a"], + [4308, 0, "t"], + [4309, 0, "h"], + [4310, 0, "s"], + [4311, 0, "f"], + [4312, 0, "{"], + [4313, 0, "h"], + [4314, 0, "e"], + [4315, 0, "a"], + [4316, 0, "d"], + [4317, 0, "}"], + [4318, 0, "$"], + [4319, 0, " "], + [4320, 0, "f"], + [4321, 0, "o"], + [4322, 0, "r"], + [4323, 0, " "], + [4324, 0, "a"], + [4325, 0, "n"], + [4326, 0, "y"], + [4327, 0, " "], + [4328, 0, "L"], + [4329, 0, "a"], + [4330, 0, "m"], + [4331, 0, "p"], + [4332, 0, "o"], + [4333, 0, "r"], + [4334, 0, "t"], + [4335, 0, " "], + [4336, 0, "t"], + [4337, 0, "i"], + [4338, 0, "m"], + [4339, 0, "e"], + [4340, 0, "s"], + [4341, 0, "t"], + [4342, 0, "a"], + [4343, 0, "m"], + [4344, 0, "p"], + [4345, 0, " "], + [4346, 0, "("], + [4346, 1], + [4346, 0, "$"], + [4347, 0, "("], + [4348, 0, "c"], + [4349, 0, ","], + [4350, 0, " "], + [4351, 0, "p"], + [4352, 0, ")"], + [4353, 0, "$"], + [4354, 0, "."], + [4111, 0, "\\"], + [4112, 0, "q"], + [4113, 0, "u"], + [4114, 0, "a"], + [4115, 0, "d"], + [3934, 0, "\\"], + [3935, 0, "q"], + [3936, 0, "u"], + [3937, 0, "a"], + [3938, 0, "d"], + [3298, 0, "\n"], + [3299, 0, "\n"], + [3300, 0, "L"], + [3301, 0, "i"], + [3302, 0, "s"], + [3303, 0, "t"], + [3304, 0, " "], + [3305, 0, "i"], + [3306, 0, "t"], + [3307, 0, "e"], + [3308, 0, "m"], + [3309, 0, "s"], + [3310, 0, " "], + [3311, 0, "a"], + [3312, 0, "r"], + [3313, 0, "e"], + [3314, 0, " "], + [3315, 0, "i"], + [3316, 0, "n"], + [3317, 0, "s"], + [3318, 0, "e"], + [3319, 0, "r"], + [3320, 0, "t"], + [3321, 0, "e"], + [3322, 0, "d"], + [3323, 0, " "], + [3323, 1], + [3322, 1], + [3321, 1], + [3320, 1], + [3319, 1], + [3318, 1], + [3317, 1], + [3316, 1], + [3315, 1], + [3314, 1], + [3313, 1], + [3312, 1], + [3311, 1], + [3310, 1], + [3309, 1], + [3308, 1], + [3307, 1], + [3306, 1], + [3305, 1], + [3304, 1], + [3303, 1], + [3302, 1], + [3301, 1], + [3300, 1], + [3300, 0, "E"], + [3301, 0, "a"], + [3302, 0, "c"], + [3303, 0, "h"], + [3304, 0, " "], + [3305, 0, "l"], + [3306, 0, "i"], + [3307, 0, "s"], + [3308, 0, "t"], + [3309, 0, " "], + [3310, 0, "i"], + [3311, 0, "t"], + [3312, 0, "e"], + [3313, 0, "m"], + [3314, 0, " "], + [3315, 0, "i"], + [3316, 0, "s"], + [3317, 0, " "], + [3318, 0, "u"], + [3319, 0, "n"], + [3320, 0, "i"], + [3321, 0, "q"], + [3322, 0, "u"], + [3323, 0, "e"], + [3324, 0, "l"], + [3325, 0, "y"], + [3326, 0, " "], + [3327, 0, "i"], + [3328, 0, "d"], + [3329, 0, "e"], + [3330, 0, "n"], + [3331, 0, "t"], + [3332, 0, "i"], + [3333, 0, "f"], + [3334, 0, "i"], + [3335, 0, "e"], + [3336, 0, "d"], + [3337, 0, " "], + [3338, 0, "b"], + [3339, 0, "y"], + [3340, 0, " "], + [3341, 0, "t"], + [3342, 0, "h"], + [3343, 0, "e"], + [3344, 0, " "], + [3345, 0, "L"], + [3346, 0, "a"], + [3347, 0, "m"], + [3348, 0, "p"], + [3349, 0, "o"], + [3350, 0, "r"], + [3351, 0, "t"], + [3352, 0, " "], + [3353, 0, "t"], + [3354, 0, "i"], + [3355, 0, "m"], + [3356, 0, "e"], + [3357, 0, "s"], + [3358, 0, "t"], + [3359, 0, "a"], + [3360, 0, "m"], + [3361, 0, "p"], + [3362, 0, " "], + [3363, 0, "o"], + [3364, 0, "f"], + [3365, 0, " "], + [3366, 0, "t"], + [3367, 0, "h"], + [3368, 0, "e"], + [3369, 0, " "], + [3370, 0, "\\"], + [3370, 1], + [3370, 0, "$"], + [3371, 0, "\\"], + [3372, 0, "m"], + [3373, 0, "a"], + [3374, 0, "t"], + [3375, 0, "h"], + [3376, 0, "s"], + [3377, 0, "f"], + [3378, 0, "{"], + [3379, 0, "i"], + [3380, 0, "n"], + [3381, 0, "s"], + [3382, 0, "e"], + [3383, 0, "r"], + [3384, 0, "t"], + [3385, 0, "}"], + [3386, 0, " "], + [3386, 1], + [3386, 0, "$"], + [3387, 0, " "], + [3388, 0, "o"], + [3389, 0, "p"], + [3390, 0, "e"], + [3391, 0, "r"], + [3392, 0, "a"], + [3393, 0, "t"], + [3394, 0, "i"], + [3395, 0, "o"], + [3396, 0, "n"], + [3397, 0, " "], + [3398, 0, "t"], + [3399, 0, "h"], + [3400, 0, "a"], + [3401, 0, "t"], + [3402, 0, " "], + [3403, 0, "i"], + [3404, 0, "n"], + [3405, 0, "s"], + [3406, 0, "e"], + [3407, 0, "r"], + [3408, 0, "t"], + [3409, 0, "e"], + [3410, 0, "d"], + [3411, 0, " "], + [3412, 0, "t"], + [3413, 0, "h"], + [3414, 0, "e"], + [3415, 0, " "], + [3416, 0, "i"], + [3417, 0, "t"], + [3418, 0, "e"], + [3419, 0, "m"], + [3420, 0, "."], + [3421, 0, " "], + [3422, 0, "T"], + [3423, 0, "h"], + [3313, 1], + [3312, 1], + [3311, 1], + [3310, 1], + [3310, 0, "e"], + [3311, 0, "l"], + [3312, 0, "e"], + [3313, 0, "m"], + [3314, 0, "e"], + [3315, 0, "n"], + [3316, 0, "t"], + [3422, 1], + [3421, 1], + [3420, 1], + [3419, 1], + [3418, 1], + [3417, 1], + [3416, 1], + [3415, 1], + [3415, 0, "i"], + [3416, 0, "t"], + [3413, 1], + [3412, 1], + [3411, 1], + [3410, 1], + [3409, 1], + [3408, 1], + [3407, 1], + [3406, 1], + [3406, 0, "c"], + [3407, 0, "r"], + [3408, 0, "e"], + [3409, 0, "a"], + [3410, 0, "t"], + [3411, 0, "e"], + [3412, 0, "d"], + [3419, 1], + [3418, 1], + [3418, 0, "W"], + [3419, 0, "e"], + [3420, 0, " "], + [3421, 0, "c"], + [3422, 0, "a"], + [3423, 0, "l"], + [3424, 0, "l"], + [3425, 0, " "], + [3426, 0, "t"], + [3427, 0, "h"], + [3428, 0, "e"], + [3429, 0, " "], + [3430, 0, "L"], + [3431, 0, "a"], + [3432, 0, "m"], + [3433, 0, "p"], + [3434, 0, "o"], + [3435, 0, "r"], + [3436, 0, "t"], + [3437, 0, " "], + [3438, 0, "t"], + [3439, 0, "i"], + [3440, 0, "m"], + [3441, 0, "e"], + [3442, 0, "s"], + [3443, 0, "t"], + [3444, 0, "a"], + [3445, 0, "m"], + [3446, 0, "p"], + [3447, 0, " "], + [3447, 1], + [3446, 1], + [3445, 1], + [3444, 1], + [3443, 1], + [3442, 1], + [3441, 1], + [3440, 1], + [3439, 1], + [3438, 1], + [3437, 1], + [3436, 1], + [3435, 1], + [3434, 1], + [3433, 1], + [3432, 1], + [3431, 1], + [3430, 1], + [3429, 1], + [3428, 1], + [3427, 1], + [3426, 1], + [3425, 1], + [3424, 1], + [3423, 1], + [3422, 1], + [3421, 1], + [3420, 1], + [3419, 1], + [3418, 1], + [3417, 1], + [3417, 0, " "], + [3417, 1], + [3299, 0, "\n"], + [3300, 0, "L"], + [3301, 0, "i"], + [3302, 0, "s"], + [3302, 1], + [3301, 1], + [3300, 1], + [3300, 0, "E"], + [3301, 0, "l"], + [3302, 0, "e"], + [3303, 0, "m"], + [3304, 0, "e"], + [3305, 0, "n"], + [3306, 0, "t"], + [3307, 0, " "], + [3307, 1], + [3306, 1], + [3305, 1], + [3304, 1], + [3303, 1], + [3302, 1], + [3301, 1], + [3300, 1], + [3300, 0, "A"], + [3301, 0, " "], + [3302, 0, "l"], + [3303, 0, "i"], + [3304, 0, "s"], + [3305, 0, "t"], + [3306, 0, " "], + [3307, 0, "e"], + [3308, 0, "l"], + [3309, 0, "e"], + [3310, 0, "m"], + [3311, 0, "e"], + [3312, 0, "n"], + [3313, 0, "t"], + [3314, 0, " "], + [3315, 0, "i"], + [3316, 0, "s"], + [3317, 0, " "], + [3318, 0, "c"], + [3319, 0, "r"], + [3320, 0, "e"], + [3321, 0, "a"], + [3322, 0, "t"], + [3323, 0, "e"], + [3324, 0, "d"], + [3325, 0, " "], + [3326, 0, "w"], + [3327, 0, "i"], + [3328, 0, "t"], + [3329, 0, "h"], + [3330, 0, " "], + [3331, 0, "a"], + [3332, 0, "n"], + [3333, 0, " "], + [3334, 0, "$"], + [3335, 0, "\\"], + [3336, 0, "m"], + [3337, 0, "a"], + [3338, 0, "t"], + [3339, 0, "h"], + [3340, 0, "s"], + [3341, 0, "f"], + [3342, 0, "{"], + [3343, 0, "i"], + [3344, 0, "n"], + [3345, 0, "s"], + [3346, 0, "e"], + [3347, 0, "r"], + [3348, 0, "t"], + [3349, 0, "}"], + [3350, 0, "$"], + [3351, 0, " "], + [3352, 0, "o"], + [3353, 0, "p"], + [3354, 0, "e"], + [3355, 0, "r"], + [3356, 0, "a"], + [3357, 0, "t"], + [3358, 0, "i"], + [3359, 0, "o"], + [3360, 0, "n"], + [3361, 0, "."], + [3362, 0, " "], + [3363, 0, "S"], + [3364, 0, "i"], + [3365, 0, "n"], + [3366, 0, "c"], + [3367, 0, "e"], + [3368, 0, " "], + [3369, 0, "e"], + [3370, 0, "a"], + [3371, 0, "c"], + [3372, 0, "h"], + [3373, 0, " "], + [3374, 0, "o"], + [3375, 0, "p"], + [3376, 0, "e"], + [3377, 0, "r"], + [3378, 0, "a"], + [3379, 0, "t"], + [3380, 0, "i"], + [3381, 0, "o"], + [3382, 0, "n"], + [3383, 0, " "], + [3384, 0, "h"], + [3385, 0, "a"], + [3386, 0, "s"], + [3387, 0, " "], + [3388, 0, "a"], + [3389, 0, " "], + [3390, 0, "L"], + [3391, 0, "a"], + [3392, 0, "m"], + [3393, 0, "p"], + [3394, 0, "o"], + [3395, 0, "r"], + [3396, 0, "t"], + [3397, 0, " "], + [3398, 0, "t"], + [3399, 0, "i"], + [3400, 0, "m"], + [3401, 0, "e"], + [3402, 0, "s"], + [3403, 0, "t"], + [3404, 0, "a"], + [3405, 0, "m"], + [3406, 0, "p"], + [3407, 0, ","], + [3408, 0, " "], + [3409, 0, "a"], + [3410, 0, " "], + [3411, 0, "l"], + [3412, 0, "i"], + [3413, 0, "s"], + [3414, 0, "t"], + [3415, 0, " "], + [3416, 0, "e"], + [3417, 0, "l"], + [3418, 0, "e"], + [3419, 0, "m"], + [3420, 0, "e"], + [3421, 0, "n"], + [3422, 0, "t"], + [3423, 0, " "], + [3424, 0, "c"], + [3425, 0, "a"], + [3426, 0, "n"], + [3427, 0, " "], + [3428, 0, "b"], + [3429, 0, "e"], + [3430, 0, " "], + [3430, 1], + [3429, 1], + [3428, 1], + [3427, 1], + [3426, 1], + [3425, 1], + [3424, 1], + [3441, 1], + [3440, 1], + [3439, 1], + [3438, 1], + [3437, 1], + [3436, 1], + [3435, 1], + [3434, 1], + [3433, 1], + [3432, 1], + [3431, 1], + [3430, 1], + [3429, 1], + [3428, 1], + [3427, 1], + [3426, 1], + [3425, 1], + [3424, 1], + [3423, 1], + [3460, 1], + [3459, 1], + [3458, 1], + [3457, 1], + [3456, 1], + [3455, 1], + [3454, 1], + [3453, 1], + [3452, 1], + [3451, 1], + [3450, 1], + [3450, 0, "i"], + [3451, 0, "t"], + [3452, 0, "s"], + [3463, 0, ","], + [3464, 0, " "], + [3465, 0, "w"], + [3466, 0, "h"], + [3467, 0, "i"], + [3468, 0, "c"], + [3469, 0, "h"], + [3470, 0, " "], + [3471, 0, "r"], + [3472, 0, "e"], + [3473, 0, "m"], + [3474, 0, "a"], + [3475, 0, "i"], + [3476, 0, "n"], + [3477, 0, "s"], + [3478, 0, " "], + [3479, 0, "i"], + [3480, 0, "m"], + [3481, 0, "m"], + [3482, 0, "u"], + [3483, 0, "t"], + [3484, 0, "a"], + [3485, 0, "b"], + [3486, 0, "l"], + [3487, 0, "e"], + [3488, 0, "."], + [3488, 0, " "], + [3489, 0, "f"], + [3490, 0, "o"], + [3491, 0, "r"], + [3492, 0, " "], + [3493, 0, "t"], + [3494, 0, "h"], + [3495, 0, "e"], + [3496, 0, " "], + [3497, 0, "l"], + [3498, 0, "i"], + [3499, 0, "f"], + [3500, 0, "e"], + [3501, 0, "t"], + [3502, 0, "i"], + [3503, 0, "m"], + [3504, 0, "e"], + [3505, 0, " "], + [3506, 0, "o"], + [3507, 0, "f"], + [3508, 0, " "], + [3509, 0, "t"], + [3510, 0, "h"], + [3511, 0, "e"], + [3512, 0, " "], + [3513, 0, "d"], + [3514, 0, "o"], + [3515, 0, "c"], + [3516, 0, "u"], + [3517, 0, "m"], + [3518, 0, "e"], + [3519, 0, "n"], + [3520, 0, "t"], + [3522, 0, " "], + [3523, 0, "W"], + [3524, 0, "e"], + [3525, 0, " "], + [3526, 0, "c"], + [3527, 0, "a"], + [3528, 0, "l"], + [3529, 0, "l"], + [3530, 0, " "], + [3531, 0, "t"], + [3532, 0, "h"], + [3533, 0, "a"], + [3534, 0, "t"], + [3535, 0, " "], + [3536, 0, "L"], + [3537, 0, "a"], + [3538, 0, "m"], + [3539, 0, "p"], + [3540, 0, "o"], + [3541, 0, "r"], + [3542, 0, "t"], + [3543, 0, " "], + [3544, 0, "t"], + [3545, 0, "i"], + [3546, 0, "m"], + [3547, 0, "e"], + [3548, 0, "s"], + [3549, 0, "t"], + [3550, 0, "a"], + [3551, 0, "m"], + [3552, 0, "p"], + [3553, 0, " "], + [3554, 0, "t"], + [3555, 0, "h"], + [3556, 0, "e"], + [3557, 0, " "], + [3558, 0, "I"], + [3559, 0, "D"], + [3560, 0, " "], + [3561, 0, "o"], + [3562, 0, "f"], + [3563, 0, " "], + [3564, 0, "t"], + [3565, 0, "h"], + [3566, 0, "e"], + [3567, 0, " "], + [3568, 0, "l"], + [3569, 0, "i"], + [3570, 0, "s"], + [3571, 0, "t"], + [3572, 0, " "], + [3573, 0, "e"], + [3574, 0, "l"], + [3575, 0, "e"], + [3576, 0, "m"], + [3577, 0, "e"], + [3578, 0, "n"], + [3579, 0, "t"], + [3580, 0, "."], + [3632, 1], + [3631, 1], + [3630, 1], + [3629, 1], + [3628, 1], + [3627, 1], + [3626, 1], + [3625, 1], + [3624, 1], + [3623, 1], + [3622, 1], + [3621, 1], + [3620, 1], + [3619, 1], + [3618, 1], + [3617, 1], + [3616, 1], + [3615, 1], + [3614, 1], + [3613, 1], + [3612, 1], + [3611, 1], + [3610, 1], + [3609, 1], + [3608, 1], + [3607, 1], + [3606, 1], + [3605, 1], + [3604, 1], + [3603, 1], + [3602, 1], + [3601, 1], + [3600, 1], + [3599, 1], + [3598, 1], + [3597, 1], + [3596, 1], + [3595, 1], + [3594, 1], + [3593, 1], + [3592, 1], + [3591, 1], + [3590, 1], + [3589, 1], + [3588, 1], + [3587, 1], + [3586, 1], + [3585, 1], + [3584, 1], + [3583, 1], + [3582, 1], + [3581, 1], + [4566, 0, "a"], + [4567, 0, "l"], + [4568, 0, " "], + [4569, 0, "r"], + [4570, 0, "e"], + [4571, 0, "q"], + [4572, 0, "u"], + [4573, 0, "i"], + [4574, 0, "r"], + [4575, 0, "e"], + [4576, 0, "m"], + [4577, 0, "e"], + [4578, 0, "n"], + [4579, 0, "t"], + [4624, 1], + [4623, 1], + [4622, 1], + [4621, 1], + [4620, 1], + [4619, 1], + [4618, 1], + [4617, 1], + [4616, 1], + [4615, 1], + [4614, 1], + [4613, 1], + [4612, 1], + [4611, 1], + [4610, 1], + [4609, 1], + [5350, 0, "\n"], + [5351, 0, "\n"], + [5352, 0, "T"], + [5353, 0, "h"], + [5354, 0, "e"], + [5355, 0, " "], + [5356, 0, "u"], + [5357, 0, "s"], + [5358, 0, "e"], + [5359, 0, "r"], + [5360, 0, " "], + [5361, 0, "v"], + [5362, 0, "i"], + [5363, 0, "e"], + [5364, 0, "w"], + [5365, 0, " "], + [5366, 0, "o"], + [5367, 0, "f"], + [5368, 0, " "], + [5369, 0, "a"], + [5370, 0, " "], + [5371, 0, "l"], + [5372, 0, "i"], + [5373, 0, "s"], + [5374, 0, "t"], + [5375, 0, " "], + [5376, 0, "A"], + [5377, 0, " "], + [5378, 0, "i"], + [5379, 0, "t"], + [5380, 0, "e"], + [5381, 0, "r"], + [5382, 0, "a"], + [5383, 0, "t"], + [5384, 0, "e"], + [5385, 0, "s"], + [5386, 0, " "], + [5387, 0, "o"], + [5388, 0, "v"], + [5389, 0, "e"], + [5390, 0, "r"], + [5391, 0, " "], + [5392, 0, "t"], + [5393, 0, "h"], + [5394, 0, "e"], + [5395, 0, " "], + [5396, 0, "l"], + [5397, 0, "i"], + [5398, 0, "s"], + [5399, 0, "t"], + [5400, 0, " "], + [5401, 0, "e"], + [5402, 0, "l"], + [5403, 0, "e"], + [5404, 0, "m"], + [5405, 0, "e"], + [5406, 0, "n"], + [5407, 0, "t"], + [5408, 0, "s"], + [5409, 0, " "], + [5410, 0, "f"], + [5411, 0, "r"], + [5412, 0, "o"], + [5413, 0, "m"], + [5414, 0, " "], + [5415, 0, "\\"], + [5415, 1], + [5415, 0, "$"], + [5416, 0, "\\"], + [5417, 0, "m"], + [5418, 0, "a"], + [5419, 0, "t"], + [5420, 0, "h"], + [5421, 0, "s"], + [5422, 0, "f"], + [5423, 0, "{"], + [5424, 0, "h"], + [5425, 0, "e"], + [5426, 0, "a"], + [5427, 0, "d"], + [5428, 0, "}"], + [5429, 0, "$"], + [5430, 0, " "], + [5431, 0, "t"], + [5432, 0, "o"], + [5433, 0, " "], + [5434, 0, "$"], + [5435, 0, "\\"], + [5436, 0, "m"], + [5437, 0, "a"], + [5438, 0, "t"], + [5439, 0, "h"], + [5440, 0, "s"], + [5441, 0, "f"], + [5442, 0, "{"], + [5443, 0, "t"], + [5444, 0, "a"], + [5445, 0, "i"], + [5446, 0, "l"], + [5447, 0, "}"], + [5448, 0, "$"], + [5449, 0, ","], + [5450, 0, " "], + [5451, 0, "s"], + [5452, 0, "k"], + [5453, 0, "i"], + [5454, 0, "p"], + [5455, 0, "p"], + [5456, 0, "i"], + [5457, 0, "n"], + [5458, 0, "g"], + [5459, 0, " "], + [5460, 0, "a"], + [5461, 0, "n"], + [5462, 0, "y"], + [5463, 0, " "], + [5464, 0, "d"], + [5465, 0, "e"], + [5466, 0, "l"], + [5467, 0, "e"], + [5468, 0, "t"], + [5469, 0, "e"], + [5470, 0, "d"], + [5471, 0, " "], + [5472, 0, "e"], + [5473, 0, "l"], + [5474, 0, "e"], + [5475, 0, "m"], + [5476, 0, "e"], + [5477, 0, "n"], + [5478, 0, "t"], + [5479, 0, "s"], + [5480, 0, " "], + [5481, 0, "("], + [5482, 0, "t"], + [5483, 0, "o"], + [5484, 0, "m"], + [5485, 0, "b"], + [5486, 0, "s"], + [5487, 0, "t"], + [5488, 0, "o"], + [5489, 0, "n"], + [5490, 0, "e"], + [5491, 0, "s"], + [5492, 0, ")"], + [5493, 0, ":"], + [5494, 0, "\n"], + [5495, 0, "\\"], + [5496, 0, "b"], + [5497, 0, "e"], + [5498, 0, "g"], + [5499, 0, "i"], + [5500, 0, "n"], + [5501, 0, "{"], + [5502, 0, "a"], + [5503, 0, "l"], + [5504, 0, "i"], + [5505, 0, "g"], + [5506, 0, "n"], + [5507, 0, "*"], + [5508, 0, "}"], + [5509, 0, "\n"], + [5510, 0, "\\"], + [5511, 0, "e"], + [5512, 0, "n"], + [5513, 0, "d"], + [5514, 0, "{"], + [5515, 0, "a"], + [5516, 0, "l"], + [5517, 0, "i"], + [5518, 0, "g"], + [5519, 0, "n"], + [5520, 0, "*"], + [5521, 0, "}"], + [5509, 0, "\n"], + [5510, 0, "\\"], + [5511, 0, "m"], + [5512, 0, "a"], + [5513, 0, "t"], + [5514, 0, "h"], + [5515, 0, "r"], + [5516, 0, "m"], + [5517, 0, "("], + [5517, 1], + [5517, 0, "{"], + [5518, 0, "v"], + [5519, 0, "i"], + [5520, 0, "e"], + [5521, 0, "w"], + [5522, 0, "}"], + [5523, 0, "("], + [5524, 0, "A"], + [5525, 0, ")"], + [5526, 0, " "], + [5527, 0, "="], + [5528, 0, " "], + [5529, 0, "\\"], + [5530, 0, "a"], + [5531, 0, "t"], + [5531, 1], + [5530, 1], + [5530, 0, "m"], + [5531, 0, "a"], + [5532, 0, "t"], + [5533, 0, "h"], + [5534, 0, "r"], + [5535, 0, "m"], + [5536, 0, "{"], + [5537, 0, "i"], + [5538, 0, "t"], + [5539, 0, "e"], + [5540, 0, "r"], + [5541, 0, "}"], + [5542, 0, "("], + [5543, 0, "A"], + [5544, 0, ","], + [5545, 0, " "], + [5546, 0, "\\"], + [5547, 0, "m"], + [5548, 0, "a"], + [5549, 0, "t"], + [5550, 0, "h"], + [5551, 0, "s"], + [5552, 0, "f"], + [5553, 0, "{"], + [5554, 0, "h"], + [5555, 0, "e"], + [5556, 0, "a"], + [5557, 0, "d"], + [5558, 0, "}"], + [5559, 0, ")"], + [5560, 0, " "], + [5561, 0, "\\"], + [5562, 0, "\\"], + [5527, 0, "&"], + [5564, 0, "\n"], + [5565, 0, "\\"], + [5566, 0, "m"], + [5567, 0, "a"], + [5568, 0, "t"], + [5569, 0, "h"], + [5570, 0, "r"], + [5571, 0, "m"], + [5572, 0, "{"], + [5573, 0, "i"], + [5574, 0, "t"], + [5575, 0, "e"], + [5576, 0, "r"], + [5577, 0, "}"], + [5578, 0, "("], + [5579, 0, "A"], + [5580, 0, ","], + [5581, 0, " "], + [5582, 0, "\\"], + [5583, 0, "m"], + [5584, 0, "a"], + [5585, 0, "t"], + [5586, 0, "h"], + [5587, 0, "i"], + [5588, 0, "t"], + [5589, 0, "{"], + [5590, 0, "I"], + [5590, 1], + [5590, 0, "i"], + [5591, 0, "d"], + [5592, 0, "}"], + [5593, 0, ")"], + [5594, 0, " "], + [5595, 0, "&"], + [5596, 0, "="], + [5597, 0, " "], + [5598, 0, "\\"], + [5599, 0, "b"], + [5600, 0, "e"], + [5601, 0, "g"], + [5602, 0, "i"], + [5603, 0, "n"], + [5604, 0, "{"], + [5605, 0, "c"], + [5606, 0, "a"], + [5607, 0, "s"], + [5608, 0, "e"], + [5609, 0, "s"], + [5610, 0, "}"], + [5611, 0, "\n"], + [5612, 0, "\\"], + [5613, 0, "e"], + [5614, 0, "n"], + [5615, 0, "d"], + [5616, 0, "["], + [5616, 1], + [5616, 0, "{"], + [5617, 0, "c"], + [5618, 0, "a"], + [5619, 0, "s"], + [5620, 0, "e"], + [5621, 0, "s"], + [5622, 0, "}"], + [5611, 0, "\n"], + [5612, 0, " "], + [5613, 0, " "], + [5614, 0, " "], + [5615, 0, " "], + [5616, 0, "["], + [5617, 0, "v"], + [5618, 0, "]"], + [5619, 0, " "], + [5620, 0, ":"], + [5621, 0, ":"], + [5622, 0, " "], + [5622, 1], + [5621, 1], + [5620, 1], + [5619, 1], + [5619, 0, " "], + [5620, 0, "\\"], + [5621, 0, "m"], + [5622, 0, "a"], + [5623, 0, "t"], + [5624, 0, "h"], + [5625, 0, "b"], + [5626, 0, "i"], + [5627, 0, "n"], + [5628, 0, "{"], + [5629, 0, ":"], + [5630, 0, ":"], + [5631, 0, "}"], + [5632, 0, " "], + [5633, 0, "\\"], + [5634, 0, "m"], + [5635, 0, "a"], + [5636, 0, "t"], + [5637, 0, "h"], + [5638, 0, "r"], + [5639, 0, "m"], + [5640, 0, "{"], + [5641, 0, "i"], + [5642, 0, "t"], + [5643, 0, "e"], + [5644, 0, "r"], + [5645, 0, "}"], + [5646, 0, "("], + [5647, 0, "A"], + [5648, 0, ","], + [5649, 0, " "], + [5650, 0, "n"], + [5651, 0, ")"], + [5652, 0, " "], + [5653, 0, "\\"], + [5654, 0, "q"], + [5655, 0, "u"], + [5656, 0, "a"], + [5657, 0, "d"], + [5658, 0, " "], + [5659, 0, "\\"], + [5660, 0, "t"], + [5661, 0, "e"], + [5662, 0, "x"], + [5663, 0, "t"], + [5664, 0, "{"], + [5665, 0, "i"], + [5666, 0, "f"], + [5667, 0, " "], + [5668, 0, "}"], + [5669, 0, ";"], + [5669, 1], + [5669, 0, "\\"], + [5670, 0, ";"], + [5671, 0, " "], + [5672, 0, "A"], + [5673, 0, "("], + [5674, 0, "\\"], + [5675, 0, "m"], + [5676, 0, "a"], + [5677, 0, "t"], + [5678, 0, "h"], + [5679, 0, "i"], + [5680, 0, "t"], + [5681, 0, "{"], + [5682, 0, "i"], + [5683, 0, "d"], + [5684, 0, "}"], + [5685, 0, ")"], + [5686, 0, " "], + [5687, 0, "="], + [5688, 0, " "], + [5689, 0, "("], + [5690, 0, "v"], + [5691, 0, ","], + [5692, 0, " "], + [5693, 0, "n"], + [5694, 0, ")"], + [5695, 0, " "], + [5696, 0, "\\"], + [5697, 0, ";"], + [5698, 0, "w"], + [5698, 1], + [5698, 0, "\\"], + [5699, 0, "w"], + [5700, 0, "e"], + [5701, 0, "d"], + [5702, 0, "g"], + [5703, 0, "e"], + [5704, 0, "\\"], + [5705, 0, ";"], + [5706, 0, " "], + [5707, 0, "v"], + [5708, 0, " "], + [5709, 0, "\\"], + [5710, 0, "n"], + [5711, 0, "e"], + [5712, 0, "q"], + [5713, 0, " "], + [5714, 0, "\\"], + [5715, 0, "b"], + [5716, 0, "o"], + [5717, 0, "t"], + [5718, 0, " "], + [5719, 0, "\\"], + [5720, 0, "\\"], + [5721, 0, "\n"], + [5722, 0, " "], + [5723, 0, " "], + [5724, 0, " "], + [5725, 0, " "], + [5726, 0, "\\"], + [5727, 0, "m"], + [5728, 0, "a"], + [5729, 0, "t"], + [5730, 0, "h"], + [5731, 0, "r"], + [5732, 0, "m"], + [5733, 0, "{"], + [5734, 0, "i"], + [5735, 0, "t"], + [5736, 0, "e"], + [5737, 0, "r"], + [5738, 0, "}"], + [5739, 0, "("], + [5740, 0, "A"], + [5741, 0, ","], + [5742, 0, " "], + [5743, 0, "n"], + [5744, 0, ")"], + [5745, 0, " "], + [5746, 0, "\\"], + [5747, 0, "q"], + [5748, 0, "u"], + [5749, 0, "a"], + [5750, 0, "d"], + [5751, 0, " "], + [5752, 0, "\\"], + [5753, 0, "t"], + [5754, 0, "e"], + [5755, 0, "x"], + [5756, 0, "t"], + [5726, 0, " "], + [5727, 0, " "], + [5728, 0, " "], + [5729, 0, " "], + [5730, 0, " "], + [5731, 0, " "], + [5732, 0, " "], + [5733, 0, " "], + [5734, 0, " "], + [5735, 0, " "], + [5736, 0, " "], + [5737, 0, " "], + [5738, 0, " "], + [5739, 0, " "], + [5740, 0, " "], + [5741, 0, " "], + [5742, 0, " "], + [5743, 0, " "], + [5744, 0, " "], + [5745, 0, " "], + [5746, 0, " "], + [5747, 0, " "], + [5748, 0, " "], + [5749, 0, " "], + [5750, 0, " "], + [5751, 0, " "], + [5752, 0, " "], + [5753, 0, " "], + [5754, 0, " "], + [5755, 0, " "], + [5755, 1], + [5754, 1], + [5753, 1], + [5752, 1], + [5751, 1], + [5750, 1], + [5749, 1], + [5748, 1], + [5747, 1], + [5746, 1], + [5745, 1], + [5744, 1], + [5743, 1], + [5774, 0, "{"], + [5775, 0, "i"], + [5776, 0, "f"], + [5777, 0, " "], + [5778, 0, "}"], + [5779, 0, "\\"], + [5780, 0, ";"], + [5781, 0, " "], + [5782, 0, "A"], + [5783, 0, "("], + [5784, 0, "\\"], + [5785, 0, "m"], + [5786, 0, "a"], + [5787, 0, "t"], + [5788, 0, "h"], + [5789, 0, "i"], + [5790, 0, "t"], + [5791, 0, "{"], + [5792, 0, "i"], + [5793, 0, "d"], + [5794, 0, "}"], + [5795, 0, ")"], + [5796, 0, " "], + [5797, 0, "="], + [5798, 0, " "], + [5799, 0, "("], + [5800, 0, "v"], + [5801, 0, ","], + [5802, 0, " "], + [5803, 0, "n"], + [5804, 0, ")"], + [5805, 0, " "], + [5806, 0, "\\"], + [5807, 0, ";"], + [5808, 0, "\\"], + [5809, 0, "w"], + [5810, 0, "e"], + [5811, 0, "d"], + [5812, 0, "g"], + [5813, 0, "e"], + [5814, 0, "\\"], + [5815, 0, ";"], + [5816, 0, " "], + [5817, 0, "v"], + [5818, 0, " "], + [5819, 0, "="], + [5820, 0, " "], + [5821, 0, "\\"], + [5822, 0, "b"], + [5823, 0, "o"], + [5824, 0, "t"], + [5825, 0, " "], + [5826, 0, "\\"], + [5827, 0, "\\"], + [5828, 0, "\n"], + [5829, 0, " "], + [5830, 0, " "], + [5831, 0, " "], + [5832, 0, " "], + [5833, 0, "p"], + [5833, 1], + [5833, 0, "["], + [5834, 0, "]"], + [5835, 0, " "], + [5836, 0, "\\"], + [5837, 0, "q"], + [5838, 0, "u"], + [5839, 0, "a"], + [5840, 0, "d"], + [5841, 0, " "], + [5842, 0, "\\"], + [5843, 0, "t"], + [5844, 0, "e"], + [5845, 0, "x"], + [5846, 0, "t"], + [5847, 0, "{"], + [5848, 0, "i"], + [5849, 0, "f"], + [5850, 0, " "], + [5851, 0, "}"], + [5852, 0, ";"], + [5852, 1], + [5852, 0, "\\"], + [5853, 0, ";"], + [5854, 0, " "], + [5855, 0, "\\"], + [5856, 0, "m"], + [5857, 0, "a"], + [5858, 0, "t"], + [5859, 0, "h"], + [5860, 0, "i"], + [5861, 0, "t"], + [5862, 0, "{"], + [5863, 0, "i"], + [5864, 0, "d"], + [5865, 0, "}"], + [5866, 0, " "], + [5867, 0, "="], + [5868, 0, " "], + [5869, 0, "\\"], + [5870, 0, "m"], + [5871, 0, "a"], + [5872, 0, "t"], + [5873, 0, "h"], + [5874, 0, "s"], + [5875, 0, "f"], + [5876, 0, "{"], + [5877, 0, "t"], + [5878, 0, "a"], + [5879, 0, "i"], + [5880, 0, "l"], + [5881, 0, "}"], + [5658, 1], + [5657, 1], + [5656, 1], + [5655, 1], + [5654, 1], + [5653, 1], + [5653, 0, "&"], + [5763, 1], + [5762, 1], + [5761, 1], + [5760, 1], + [5759, 1], + [5758, 1], + [5758, 0, "&"], + [5759, 0, " "], + [5654, 0, " "], + [5832, 1], + [5831, 1], + [5830, 1], + [5829, 1], + [5828, 1], + [5828, 0, "&"], + [5826, 0, "\\"], + [5827, 0, ","], + [5576, 1], + [5575, 1], + [5642, 1], + [5641, 1], + [5745, 1], + [5745, 1], + [5541, 1], + [5540, 1], + [5540, 0, "r"], + [5574, 0, "r"], + [5641, 0, "r"], + [5746, 0, "r"], + [5893, 0, "\n"], + [5894, 0, "\n"], + [5895, 0, "\\"], + [5896, 0, "s"], + [5897, 0, "u"], + [5898, 0, "b"], + [5899, 0, "s"], + [5900, 0, "e"], + [5901, 0, "c"], + [5902, 0, "t"], + [5903, 0, "i"], + [5904, 0, "o"], + [5905, 0, "n"], + [5906, 0, "{"], + [5907, 0, "C"], + [5908, 0, "o"], + [5909, 0, "n"], + [5910, 0, "v"], + [5911, 0, "e"], + [5912, 0, "r"], + [5913, 0, "g"], + [5914, 0, "e"], + [5915, 0, "n"], + [5916, 0, "c"], + [5917, 0, "e"], + [5918, 0, "}"], + [5919, 0, "\n"], + [5920, 0, "\n"], + [5921, 0, "W"], + [5922, 0, "e"], + [5923, 0, " "], + [5924, 0, "n"], + [5925, 0, "o"], + [5926, 0, "w"], + [5927, 0, " "], + [5928, 0, "p"], + [5929, 0, "r"], + [5930, 0, "o"], + [5931, 0, "v"], + [5932, 0, "e"], + [5933, 0, " "], + [5934, 0, "t"], + [5935, 0, "h"], + [5936, 0, "e"], + [5937, 0, " "], + [5938, 0, "c"], + [5939, 0, "o"], + [5940, 0, "n"], + [5941, 0, "v"], + [5942, 0, "e"], + [5943, 0, "r"], + [5944, 0, "g"], + [5945, 0, "e"], + [5946, 0, "n"], + [5947, 0, "c"], + [5948, 0, "e"], + [5949, 0, " "], + [5950, 0, "p"], + [5951, 0, "r"], + [5952, 0, "o"], + [5953, 0, "p"], + [5954, 0, "e"], + [5955, 0, "r"], + [5956, 0, "t"], + [5957, 0, "y"], + [5958, 0, ","], + [5959, 0, " "], + [5960, 0, "a"], + [5961, 0, "l"], + [5962, 0, "s"], + [5963, 0, "o"], + [5964, 0, " "], + [5965, 0, "k"], + [5966, 0, "n"], + [5967, 0, "o"], + [5968, 0, "w"], + [5969, 0, "n"], + [5970, 0, " "], + [5971, 0, "a"], + [5972, 0, "s"], + [5973, 0, " "], + [5974, 0, "\\"], + [5975, 0, "e"], + [5976, 0, "m"], + [5977, 0, "p"], + [5978, 0, "h"], + [5979, 0, "{"], + [5980, 0, "e"], + [5981, 0, "v"], + [5982, 0, "e"], + [5983, 0, "n"], + [5984, 0, "t"], + [5985, 0, "u"], + [5986, 0, "a"], + [5987, 0, "l"], + [5988, 0, " "], + [5989, 0, "c"], + [5990, 0, "o"], + [5991, 0, "n"], + [5992, 0, "s"], + [5993, 0, "i"], + [5994, 0, "s"], + [5995, 0, "t"], + [5996, 0, "e"], + [5997, 0, "n"], + [5998, 0, "c"], + [5999, 0, "y"], + [6000, 0, "}"], + [6001, 0, ","], + [6002, 0, " "], + [6003, 0, "f"], + [6004, 0, "o"], + [6005, 0, "r"], + [6006, 0, " "], + [6007, 0, "t"], + [6008, 0, "h"], + [6009, 0, "i"], + [6010, 0, "s"], + [6011, 0, " "], + [6012, 0, "d"], + [6013, 0, "a"], + [6014, 0, "t"], + [6015, 0, "a"], + [6016, 0, " "], + [6017, 0, "s"], + [6018, 0, "t"], + [6019, 0, "r"], + [6020, 0, "u"], + [6021, 0, "c"], + [6022, 0, "t"], + [6023, 0, "u"], + [6024, 0, "r"], + [6025, 0, "e"], + [6026, 0, "."], + [6027, 0, "\n"], + [6028, 0, "\n"], + [6029, 0, "\\"], + [6030, 0, "t"], + [6031, 0, "e"], + [6032, 0, "x"], + [6033, 0, "t"], + [6034, 0, "b"], + [6035, 0, "f"], + [6036, 0, "{"], + [6037, 0, "T"], + [6038, 0, "h"], + [6039, 0, "e"], + [6040, 0, "o"], + [6041, 0, "r"], + [6042, 0, "e"], + [6043, 0, "m"], + [6044, 0, "."], + [6045, 0, "}"], + [6046, 0, " "], + [6047, 0, "I"], + [6048, 0, "f"], + [6049, 0, " "], + [6050, 0, "t"], + [6051, 0, "w"], + [6052, 0, "o"], + [6053, 0, " "], + [6054, 0, "p"], + [6055, 0, "e"], + [6056, 0, "e"], + [6057, 0, "r"], + [6058, 0, "s"], + [6059, 0, " "], + [6060, 0, "p"], + [6061, 0, "r"], + [6062, 0, "o"], + [6063, 0, "c"], + [6064, 0, "e"], + [6065, 0, "s"], + [6066, 0, "s"], + [6067, 0, " "], + [6068, 0, "t"], + [6069, 0, "h"], + [6070, 0, "e"], + [6071, 0, " "], + [6072, 0, "s"], + [6073, 0, "a"], + [6074, 0, "m"], + [6075, 0, "e"], + [6076, 0, " "], + [6077, 0, "s"], + [6078, 0, "e"], + [6079, 0, "t"], + [6080, 0, " "], + [6081, 0, "o"], + [6082, 0, "f"], + [6083, 0, " "], + [6084, 0, "\\"], + [6084, 1], + [6084, 0, "$"], + [6085, 0, "\\"], + [6086, 0, "t"], + [6087, 0, "e"], + [6087, 1], + [6086, 1], + [6086, 0, "m"], + [6087, 0, "a"], + [6088, 0, "t"], + [6089, 0, "h"], + [6090, 0, "s"], + [6091, 0, "f"], + [6092, 0, "{"], + [6093, 0, "i"], + [6094, 0, "n"], + [6095, 0, "s"], + [6096, 0, "e"], + [6097, 0, "r"], + [6098, 0, "t"], + [6099, 0, "}"], + [6100, 0, "$"], + [6101, 0, " "], + [6102, 0, "a"], + [6103, 0, "n"], + [6104, 0, "d"], + [6105, 0, " "], + [6106, 0, "$"], + [6107, 0, "\\"], + [6108, 0, "m"], + [6109, 0, "a"], + [6110, 0, "t"], + [6111, 0, "h"], + [6112, 0, "s"], + [6113, 0, "f"], + [6114, 0, "{"], + [6115, 0, "d"], + [6116, 0, "e"], + [6117, 0, "l"], + [6118, 0, "e"], + [6119, 0, "t"], + [6120, 0, "e"], + [6121, 0, "}"], + [6122, 0, "$"], + [6123, 0, " "], + [6124, 0, "o"], + [6125, 0, "p"], + [6126, 0, "e"], + [6127, 0, "r"], + [6128, 0, "a"], + [6129, 0, "t"], + [6130, 0, "i"], + [6131, 0, "o"], + [6132, 0, "n"], + [6133, 0, "s"], + [6134, 0, ","], + [6135, 0, " "], + [6136, 0, "i"], + [6137, 0, "n"], + [6138, 0, " "], + [6139, 0, "d"], + [6140, 0, "i"], + [6141, 0, "f"], + [6142, 0, "f"], + [6143, 0, "e"], + [6144, 0, "r"], + [6145, 0, "e"], + [6146, 0, "n"], + [6147, 0, "t"], + [6148, 0, " "], + [6149, 0, "c"], + [6150, 0, "a"], + [6151, 0, "u"], + [6152, 0, "s"], + [6153, 0, "a"], + [6154, 0, "l"], + [6155, 0, "l"], + [6156, 0, "y"], + [6157, 0, " "], + [6158, 0, "c"], + [6159, 0, "o"], + [6160, 0, "n"], + [6161, 0, "s"], + [6162, 0, "i"], + [6163, 0, "s"], + [6164, 0, "t"], + [6165, 0, "e"], + [6166, 0, "n"], + [6167, 0, "t"], + [6168, 0, " "], + [6169, 0, "o"], + [6170, 0, "r"], + [6171, 0, "d"], + [6172, 0, "e"], + [6173, 0, "r"], + [6174, 0, "s"], + [6175, 0, ","], + [6176, 0, " "], + [6177, 0, "t"], + [6178, 0, "h"], + [6179, 0, "e"], + [6180, 0, "i"], + [6181, 0, "r"], + [6182, 0, " "], + [6183, 0, "f"], + [6184, 0, "i"], + [6185, 0, "n"], + [6186, 0, "a"], + [6187, 0, "l"], + [6188, 0, " "], + [6189, 0, "s"], + [6190, 0, "t"], + [6191, 0, "a"], + [6192, 0, "t"], + [6193, 0, "e"], + [6194, 0, " "], + [6195, 0, "i"], + [6196, 0, "s"], + [6197, 0, " "], + [6198, 0, "i"], + [6199, 0, "d"], + [6200, 0, "e"], + [6201, 0, "n"], + [6202, 0, "t"], + [6203, 0, "i"], + [6204, 0, "c"], + [6205, 0, "a"], + [6206, 0, "l"], + [6207, 0, "."], + [6208, 0, "\n"], + [6209, 0, "\n"], + [6177, 0, "t"], + [6178, 0, "h"], + [6179, 0, "e"], + [6180, 0, "n"], + [6181, 0, "b"], + [6182, 0, " "], + [6182, 1], + [6181, 1], + [6181, 0, " "], + [6199, 0, "s"], + [6202, 1], + [6201, 1], + [6201, 0, "a"], + [6202, 0, "r"], + [6203, 0, "e"], + [6200, 0, " "], + [6201, 0, "a"], + [6202, 0, "f"], + [6203, 0, "t"], + [6204, 0, "e"], + [6205, 0, "r"], + [6206, 0, " "], + [6207, 0, "p"], + [6208, 0, "r"], + [6209, 0, "o"], + [6210, 0, "c"], + [6211, 0, "e"], + [6212, 0, "s"], + [6213, 0, "s"], + [6214, 0, "i"], + [6215, 0, "n"], + [6216, 0, "g"], + [6217, 0, " "], + [6218, 0, "a"], + [6219, 0, "l"], + [6220, 0, "l"], + [6221, 0, " "], + [6222, 0, "o"], + [6223, 0, "p"], + [6224, 0, "e"], + [6225, 0, "r"], + [6226, 0, "a"], + [6227, 0, "t"], + [6228, 0, "i"], + [6229, 0, "o"], + [6230, 0, "n"], + [6231, 0, "s"], + [6231, 1], + [6230, 1], + [6229, 1], + [6228, 1], + [6227, 1], + [6226, 1], + [6225, 1], + [6224, 1], + [6223, 1], + [6222, 1], + [6221, 1], + [6220, 1], + [6219, 1], + [6218, 1], + [6217, 1], + [6216, 1], + [6215, 1], + [6214, 1], + [6213, 1], + [6212, 1], + [6211, 1], + [6210, 1], + [6209, 1], + [6208, 1], + [6207, 1], + [6206, 1], + [6205, 1], + [6204, 1], + [6203, 1], + [6202, 1], + [6201, 1], + [6200, 1], + [6217, 0, "W"], + [6218, 0, "e"], + [6219, 0, " "], + [6220, 0, "c"], + [6221, 0, "o"], + [6222, 0, "n"], + [6223, 0, "s"], + [6224, 0, "i"], + [6224, 1], + [6223, 1], + [6222, 1], + [6221, 1], + [6220, 1], + [6219, 1], + [6218, 1], + [6217, 1], + [6217, 0, "C"], + [6218, 0, "o"], + [6219, 0, "n"], + [6220, 0, "s"], + [6221, 0, "i"], + [6222, 0, "d"], + [6223, 0, "e"], + [6224, 0, "r"], + [6224, 1], + [6223, 1], + [6222, 1], + [6221, 1], + [6220, 1], + [6219, 1], + [6218, 1], + [6217, 1], + [6217, 0, "S"], + [6218, 0, "i"], + [6219, 0, "n"], + [6220, 0, "c"], + [6221, 0, "e"], + [6222, 0, " "], + [6223, 0, "e"], + [6224, 0, "a"], + [6225, 0, "c"], + [6226, 0, "h"], + [6227, 0, " "], + [6228, 0, "p"], + [6229, 0, "e"], + [6230, 0, "e"], + [6231, 0, "r"], + [6232, 0, " "], + [6233, 0, "p"], + [6234, 0, "r"], + [6235, 0, "o"], + [6236, 0, "c"], + [6237, 0, "e"], + [6238, 0, "s"], + [6239, 0, "s"], + [6240, 0, "e"], + [6241, 0, "s"], + [6242, 0, " "], + [6243, 0, "o"], + [6244, 0, "p"], + [6245, 0, "e"], + [6246, 0, "r"], + [6247, 0, "a"], + [6248, 0, "t"], + [6249, 0, "i"], + [6250, 0, "o"], + [6251, 0, "n"], + [6252, 0, "s"], + [6253, 0, " "], + [6254, 0, "i"], + [6255, 0, "n"], + [6256, 0, " "], + [6257, 0, "s"], + [6258, 0, "o"], + [6259, 0, "m"], + [6260, 0, "e"], + [6261, 0, " "], + [6262, 0, "s"], + [6263, 0, "e"], + [6264, 0, "q"], + [6265, 0, "u"], + [6266, 0, "e"], + [6267, 0, "n"], + [6268, 0, "t"], + [6269, 0, "i"], + [6270, 0, "a"], + [6271, 0, "l"], + [6272, 0, " "], + [6273, 0, "o"], + [6274, 0, "r"], + [6275, 0, "d"], + [6276, 0, "e"], + [6277, 0, "r"], + [6278, 0, ","], + [6279, 0, " "], + [6280, 0, "a"], + [6281, 0, "n"], + [6282, 0, "d"], + [6283, 0, " "], + [6284, 0, "t"], + [6285, 0, "h"], + [6286, 0, "e"], + [6287, 0, " "], + [6288, 0, "s"], + [6289, 0, "t"], + [6290, 0, "a"], + [6291, 0, "t"], + [6292, 0, "e"], + [6293, 0, " "], + [6294, 0, "o"], + [6295, 0, "f"], + [6296, 0, " "], + [6297, 0, "a"], + [6298, 0, " "], + [6299, 0, "p"], + [6300, 0, "e"], + [6301, 0, "e"], + [6302, 0, "r"], + [6303, 0, " "], + [6304, 0, "i"], + [6305, 0, "s"], + [6306, 0, " "], + [6307, 0, "m"], + [6308, 0, "o"], + [6309, 0, "d"], + [6310, 0, "i"], + [6311, 0, "f"], + [6312, 0, "i"], + [6313, 0, "e"], + [6314, 0, "d"], + [6315, 0, " "], + [6316, 0, "o"], + [6317, 0, "n"], + [6318, 0, "l"], + [6319, 0, "y"], + [6320, 0, " "], + [6321, 0, "b"], + [6322, 0, "y"], + [6323, 0, " "], + [6324, 0, "o"], + [6325, 0, "p"], + [6326, 0, "e"], + [6327, 0, "r"], + [6328, 0, "a"], + [6329, 0, "t"], + [6330, 0, "i"], + [6331, 0, "o"], + [6332, 0, "n"], + [6333, 0, "s"], + [6334, 0, ","], + [6335, 0, " "], + [6336, 0, "w"], + [6337, 0, "e"], + [6338, 0, " "], + [6339, 0, "c"], + [6340, 0, "a"], + [6341, 0, "n"], + [6342, 0, " "], + [6343, 0, "d"], + [6344, 0, "e"], + [6345, 0, "s"], + [6346, 0, "c"], + [6347, 0, "r"], + [6348, 0, "i"], + [6349, 0, "b"], + [6350, 0, "e"], + [6351, 0, " "], + [6351, 1], + [6350, 1], + [6349, 1], + [6348, 1], + [6347, 1], + [6346, 1], + [6345, 1], + [6345, 0, "r"], + [6346, 0, "i"], + [6347, 0, "v"], + [6348, 0, "e"], + [6349, 0, " "], + [6350, 0, "t"], + [6351, 0, "h"], + [6352, 0, "e"], + [6353, 0, " "], + [6354, 0, "s"], + [6355, 0, "t"], + [6356, 0, "a"], + [6357, 0, "t"], + [6358, 0, "e"], + [6359, 0, " "], + [6360, 0, "o"], + [6361, 0, "f"], + [6362, 0, " "], + [6363, 0, "a"], + [6364, 0, " "], + [6365, 0, "p"], + [6366, 0, "e"], + [6367, 0, "e"], + [6368, 0, "r"], + [6369, 0, " "], + [6370, 0, "b"], + [6371, 0, "y"], + [6372, 0, " "], + [6373, 0, "c"], + [6374, 0, "o"], + [6375, 0, "n"], + [6376, 0, "s"], + [6377, 0, "i"], + [6378, 0, "d"], + [6379, 0, "e"], + [6380, 0, "r"], + [6381, 0, "i"], + [6382, 0, "n"], + [6383, 0, "g"], + [6384, 0, " "], + [6385, 0, "t"], + [6386, 0, "h"], + [6387, 0, "e"], + [6388, 0, " "], + [6389, 0, "\\"], + [6390, 0, "e"], + [6391, 0, "m"], + [6392, 0, "p"], + [6393, 0, "h"], + [6394, 0, "{"], + [6395, 0, "h"], + [6396, 0, "i"], + [6397, 0, "s"], + [6398, 0, "t"], + [6399, 0, "o"], + [6400, 0, "r"], + [6401, 0, "y"], + [6402, 0, "}"], + [6403, 0, " "], + [6404, 0, "o"], + [6405, 0, "f"], + [6406, 0, " "], + [6407, 0, "o"], + [6408, 0, "p"], + [6050, 0, "a"], + [6051, 0, "n"], + [6052, 0, "y"], + [6053, 0, " "], + [6413, 0, "e"], + [6414, 0, "r"], + [6415, 0, "a"], + [6416, 0, "t"], + [6417, 0, "i"], + [6418, 0, "o"], + [6419, 0, "n"], + [6420, 0, "s"], + [6421, 0, " "], + [6422, 0, "a"], + [6423, 0, "t"], + [6424, 0, " "], + [6425, 0, "e"], + [6426, 0, "a"], + [6427, 0, "c"], + [6428, 0, "h"], + [6429, 0, " "], + [6430, 0, "p"], + [6431, 0, "e"], + [6432, 0, "e"], + [6433, 0, "r"], + [6434, 0, " "], + [6435, 0, "a"], + [6436, 0, "n"], + [6437, 0, "d"], + [6438, 0, " "], + [6439, 0, "a"], + [6440, 0, "p"], + [6441, 0, "p"], + [6442, 0, "l"], + [6443, 0, "y"], + [6444, 0, "i"], + [6445, 0, "n"], + [6446, 0, "g"], + [6447, 0, " "], + [6448, 0, "t"], + [6449, 0, "h"], + [6450, 0, "e"], + [6451, 0, " "], + [6452, 0, "o"], + [6453, 0, "p"], + [6454, 0, "e"], + [6455, 0, "r"], + [6456, 0, "a"], + [6457, 0, "t"], + [6458, 0, "i"], + [6459, 0, "o"], + [6460, 0, "n"], + [6461, 0, "s"], + [6462, 0, " "], + [6463, 0, "i"], + [6464, 0, "n"], + [6465, 0, " "], + [6466, 0, "t"], + [6467, 0, "h"], + [6468, 0, "e"], + [6469, 0, " "], + [6470, 0, "o"], + [6471, 0, "r"], + [6472, 0, "d"], + [6473, 0, "e"], + [6474, 0, "r"], + [6475, 0, " "], + [6476, 0, "o"], + [6477, 0, "f"], + [6478, 0, " "], + [6479, 0, "t"], + [6480, 0, "h"], + [6481, 0, "e"], + [6482, 0, " "], + [6483, 0, "h"], + [6484, 0, "i"], + [6485, 0, "s"], + [6486, 0, "t"], + [6487, 0, "o"], + [6488, 0, "r"], + [6489, 0, "y"], + [6490, 0, "."], + [6491, 0, "\n"], + [6492, 0, "\n"], + [6493, 0, "W"], + [6493, 1], + [6493, 0, "C"], + [6493, 1], + [6493, 0, "W"], + [6494, 0, "e"], + [6495, 0, " "], + [6496, 0, "c"], + [6497, 0, "a"], + [6498, 0, "n"], + [6499, 0, " "], + [6500, 0, "p"], + [6501, 0, "r"], + [6502, 0, "o"], + [6503, 0, "v"], + [6504, 0, "e"], + [6505, 0, " "], + [6506, 0, "t"], + [6507, 0, "h"], + [6508, 0, "e"], + [6509, 0, " "], + [6510, 0, "t"], + [6511, 0, "h"], + [6512, 0, "e"], + [6513, 0, "o"], + [6514, 0, "r"], + [6515, 0, "e"], + [6516, 0, "m"], + [6517, 0, " "], + [6518, 0, "b"], + [6519, 0, "y"], + [6520, 0, " "], + [6521, 0, "i"], + [6522, 0, "n"], + [6523, 0, "d"], + [6524, 0, "u"], + [6525, 0, "c"], + [6526, 0, "t"], + [6527, 0, "i"], + [6528, 0, "o"], + [6529, 0, "n"], + [6493, 0, "C"], + [6494, 0, "o"], + [6495, 0, "n"], + [6496, 0, "s"], + [6497, 0, "i"], + [6498, 0, "d"], + [6499, 0, "e"], + [6500, 0, "r"], + [6501, 0, " "], + [6502, 0, "t"], + [6503, 0, "h"], + [6504, 0, "e"], + [6505, 0, " "], + [6506, 0, "h"], + [6507, 0, "i"], + [6508, 0, "s"], + [6509, 0, "t"], + [6510, 0, "o"], + [6511, 0, "r"], + [6512, 0, "y"], + [6513, 0, " "], + [6514, 0, "o"], + [6515, 0, "f"], + [6516, 0, " "], + [6517, 0, "o"], + [6518, 0, "p"], + [6519, 0, "e"], + [6520, 0, "r"], + [6521, 0, "a"], + [6522, 0, "t"], + [6523, 0, "i"], + [6524, 0, "o"], + [6525, 0, "n"], + [6526, 0, "s"], + [6527, 0, " "], + [6528, 0, "a"], + [6529, 0, "t"], + [6530, 0, " "], + [6530, 1], + [6529, 1], + [6528, 1], + [6528, 0, "$"], + [6529, 0, "H"], + [6530, 0, "_"], + [6531, 0, "p"], + [6532, 0, "$"], + [6533, 0, " "], + [6534, 0, "a"], + [6535, 0, "t"], + [6536, 0, " "], + [6537, 0, "p"], + [6538, 0, "e"], + [6539, 0, "e"], + [6540, 0, "r"], + [6541, 0, " "], + [6542, 0, "$"], + [6543, 0, "p"], + [6544, 0, "$"], + [6545, 0, ","], + [6546, 0, " "], + [6547, 0, "c"], + [6548, 0, "o"], + [6549, 0, "n"], + [6550, 0, "s"], + [6551, 0, "i"], + [6552, 0, "s"], + [6553, 0, "t"], + [6554, 0, "i"], + [6555, 0, "n"], + [6556, 0, "g"], + [6557, 0, " "], + [6558, 0, "o"], + [6559, 0, "f"], + [6560, 0, " "], + [6561, 0, "a"], + [6562, 0, " "], + [6563, 0, "s"], + [6564, 0, "e"], + [6565, 0, "q"], + [6566, 0, "u"], + [6567, 0, "e"], + [6568, 0, "n"], + [6569, 0, "c"], + [6570, 0, "e"], + [6571, 0, " "], + [6572, 0, "o"], + [6573, 0, "f"], + [6574, 0, " "], + [6575, 0, "o"], + [6576, 0, "p"], + [6577, 0, "e"], + [6578, 0, "r"], + [6579, 0, "a"], + [6580, 0, "t"], + [6581, 0, "i"], + [6582, 0, "o"], + [6583, 0, "n"], + [6584, 0, "s"], + [6585, 0, " "], + [6586, 0, "$"], + [6587, 0, "H"], + [6588, 0, "_"], + [6589, 0, "p"], + [6590, 0, "="], + [6591, 0, "o"], + [6592, 0, "_"], + [6593, 0, "1"], + [6594, 0, " "], + [6595, 0, "\\"], + [6596, 0, "d"], + [6597, 0, "o"], + [6598, 0, "t"], + [6599, 0, "s"], + [6600, 0, " "], + [6601, 0, "o"], + [6602, 0, "_"], + [6603, 0, "n"], + [6604, 0, "$"], + [6605, 0, "."], + [6606, 0, " "], + [6644, 0, " "], + [6645, 0, "o"], + [6646, 0, "v"], + [6647, 0, "e"], + [6648, 0, "r"], + [6649, 0, " "], + [6650, 0, "t"], + [6651, 0, "h"], + [6652, 0, "e"], + [6653, 0, " "], + [6654, 0, "l"], + [6655, 0, "e"], + [6656, 0, "n"], + [6657, 0, "g"], + [6658, 0, "t"], + [6659, 0, "h"], + [6660, 0, " "], + [6661, 0, "o"], + [6662, 0, "f"], + [6663, 0, " "], + [6664, 0, "t"], + [6665, 0, "h"], + [6666, 0, "e"], + [6667, 0, " "], + [6668, 0, "h"], + [6669, 0, "i"], + [6670, 0, "s"], + [6671, 0, "t"], + [6672, 0, "o"], + [6673, 0, "r"], + [6674, 0, "n"], + [6675, 0, " "], + [6676, 0, "$"], + [6676, 1], + [6675, 1], + [6674, 1], + [6674, 0, "y"], + [6675, 0, " "], + [6676, 0, "$"], + [6677, 0, "n"], + [6678, 0, "$"], + [6679, 0, "."], + [6680, 0, "\n"], + [6681, 0, "\n"], + [6682, 0, "B"], + [6683, 0, "a"], + [6684, 0, "s"], + [6685, 0, "e"], + [6686, 0, " "], + [6687, 0, "c"], + [6688, 0, "a"], + [6689, 0, "s"], + [6690, 0, "e"], + [6691, 0, ":"], + [6682, 0, "\\"], + [6683, 0, "e"], + [6684, 0, "m"], + [6685, 0, "p"], + [6686, 0, "h"], + [6687, 0, "{"], + [6698, 0, "}"], + [6699, 0, " "], + [6700, 0, "A"], + [6701, 0, " "], + [6702, 0, "h"], + [6703, 0, "i"], + [6704, 0, "s"], + [6705, 0, "t"], + [6706, 0, "o"], + [6707, 0, "r"], + [6708, 0, "y"], + [6709, 0, " "], + [6710, 0, "o"], + [6711, 0, "f"], + [6712, 0, " "], + [6713, 0, "$"], + [6714, 0, "n"], + [6715, 0, "="], + [6716, 0, "0"], + [6717, 0, "$"], + [6718, 0, " "], + [6719, 0, "o"], + [6720, 0, "p"], + [6721, 0, "e"], + [6722, 0, "r"], + [6723, 0, "a"], + [6724, 0, "t"], + [6725, 0, "i"], + [6726, 0, "o"], + [6727, 0, "n"], + [6728, 0, "s"], + [6729, 0, " "], + [6730, 0, "d"], + [6731, 0, "e"], + [6732, 0, "s"], + [6733, 0, "c"], + [6734, 0, "r"], + [6735, 0, "i"], + [6736, 0, "b"], + [6737, 0, "e"], + [6738, 0, "s"], + [6739, 0, " "], + [6740, 0, "a"], + [6741, 0, "n"], + [6742, 0, " "], + [6743, 0, "e"], + [6744, 0, "m"], + [6745, 0, "p"], + [6746, 0, "t"], + [6747, 0, "y"], + [6748, 0, " "], + [6749, 0, "d"], + [6750, 0, "o"], + [6751, 0, "c"], + [6752, 0, "u"], + [6753, 0, "m"], + [6754, 0, "e"], + [6755, 0, "n"], + [6756, 0, "t"], + [6757, 0, "."], + [6758, 0, " "], + [6759, 0, "A"], + [6760, 0, "n"], + [6761, 0, " "], + [6762, 0, "e"], + [6763, 0, "m"], + [6764, 0, "p"], + [6765, 0, "t"], + [6766, 0, "y"], + [6767, 0, " "], + [6768, 0, "d"], + [6769, 0, "o"], + [6770, 0, "c"], + [6771, 0, "u"], + [6772, 0, "m"], + [6773, 0, "e"], + [6774, 0, "n"], + [6775, 0, "t"], + [6776, 0, " "], + [6777, 0, "i"], + [6778, 0, "s"], + [6779, 0, " "], + [6780, 0, "d"], + [6781, 0, "e"], + [6782, 0, "t"], + [6783, 0, "e"], + [6784, 0, "r"], + [6785, 0, "m"], + [6786, 0, "i"], + [6787, 0, "n"], + [6788, 0, "i"], + [6789, 0, "s"], + [6790, 0, "t"], + [6791, 0, "i"], + [6792, 0, "c"], + [6793, 0, "a"], + [6794, 0, "l"], + [6795, 0, "l"], + [6796, 0, "y"], + [6797, 0, " "], + [6798, 0, "d"], + [6799, 0, "e"], + [6800, 0, "f"], + [6801, 0, "i"], + [6802, 0, "n"], + [6803, 0, "e"], + [6804, 0, "d"], + [6805, 0, ","], + [6806, 0, " "], + [6807, 0, "s"], + [6808, 0, "o"], + [6809, 0, " "], + [6810, 0, "a"], + [6811, 0, "n"], + [6812, 0, "y"], + [6813, 0, " "], + [6814, 0, "t"], + [6815, 0, "w"], + [6816, 0, "o"], + [6817, 0, " "], + [6818, 0, "p"], + [6819, 0, "e"], + [6820, 0, "e"], + [6821, 0, "r"], + [6822, 0, "s"], + [6823, 0, " "], + [6824, 0, "t"], + [6825, 0, "h"], + [6826, 0, "a"], + [6827, 0, "t"], + [6828, 0, " "], + [6829, 0, "h"], + [6830, 0, "a"], + [6831, 0, "v"], + [6832, 0, "e"], + [6833, 0, " "], + [6834, 0, "n"], + [6835, 0, "o"], + [6836, 0, "t"], + [6837, 0, " "], + [6838, 0, "e"], + [6839, 0, "x"], + [6840, 0, "e"], + [6841, 0, "c"], + [6842, 0, "u"], + [6843, 0, "t"], + [6844, 0, "e"], + [6845, 0, "d"], + [6846, 0, " "], + [6847, 0, "a"], + [6848, 0, "n"], + [6849, 0, "y"], + [6850, 0, " "], + [6851, 0, "o"], + [6852, 0, "p"], + [6853, 0, "e"], + [6854, 0, "r"], + [6855, 0, "a"], + [6856, 0, "t"], + [6857, 0, "i"], + [6858, 0, "o"], + [6859, 0, "n"], + [6860, 0, "s"], + [6861, 0, " "], + [6862, 0, "a"], + [6863, 0, "r"], + [6864, 0, "e"], + [6865, 0, " "], + [6866, 0, "b"], + [6867, 0, "y"], + [6868, 0, " "], + [6869, 0, "d"], + [6870, 0, "e"], + [6871, 0, "f"], + [6872, 0, "i"], + [6873, 0, "n"], + [6874, 0, "i"], + [6875, 0, "t"], + [6876, 0, "i"], + [6877, 0, "o"], + [6878, 0, "n"], + [6879, 0, " "], + [6880, 0, "i"], + [6881, 0, "n"], + [6882, 0, " "], + [6883, 0, "t"], + [6884, 0, "h"], + [6885, 0, "e"], + [6886, 0, " "], + [6887, 0, "s"], + [6888, 0, "a"], + [6889, 0, "m"], + [6890, 0, "e"], + [6891, 0, " "], + [6892, 0, "s"], + [6893, 0, "t"], + [6894, 0, "a"], + [6895, 0, "t"], + [6896, 0, "e"], + [6897, 0, "."], + [6898, 0, "\n"], + [6899, 0, "\n"], + [6900, 0, "\\"], + [6901, 0, "e"], + [6902, 0, "m"], + [6903, 0, "p"], + [6904, 0, "h"], + [6905, 0, "{"], + [6906, 0, "I"], + [6907, 0, "n"], + [6908, 0, "d"], + [6909, 0, "u"], + [6910, 0, "c"], + [6911, 0, "t"], + [6912, 0, "i"], + [6913, 0, "o"], + [6914, 0, "n"], + [6915, 0, " "], + [6916, 0, "s"], + [6917, 0, "t"], + [6918, 0, "e"], + [6919, 0, "p"], + [6920, 0, ":"], + [6921, 0, "}"], + [6922, 0, " "], + [6923, 0, "G"], + [6924, 0, "i"], + [6925, 0, "v"], + [6926, 0, "e"], + [6927, 0, "n"], + [6928, 0, " "], + [6929, 0, "c"], + [6930, 0, "a"], + [6931, 0, "u"], + [6932, 0, "s"], + [6933, 0, "a"], + [6934, 0, "l"], + [6935, 0, " "], + [6936, 0, "h"], + [6937, 0, "i"], + [6938, 0, "s"], + [6939, 0, "t"], + [6940, 0, "o"], + [6941, 0, "r"], + [6942, 0, "i"], + [6943, 0, "e"], + [6944, 0, "s"], + [6945, 0, " "], + [6946, 0, "H"], + [6946, 1], + [6946, 0, "$"], + [6947, 0, "H"], + [6948, 0, "_"], + [6949, 0, "1"], + [6950, 0, "$"], + [6951, 0, " "], + [6952, 0, "a"], + [6953, 0, "n"], + [6954, 0, "d"], + [6955, 0, " "], + [6956, 0, "$"], + [6957, 0, "H"], + [6958, 0, "_"], + [6959, 0, "2"], + [6960, 0, "$"], + [6961, 0, ","], + [6962, 0, " "], + [6963, 0, "s"], + [6964, 0, "u"], + [6965, 0, "c"], + [6966, 0, "h"], + [6967, 0, " "], + [6968, 0, "t"], + [6969, 0, "h"], + [6970, 0, "a"], + [6971, 0, "t"], + [6972, 0, " "], + [6973, 0, "$"], + [6974, 0, "H"], + [6975, 0, "_"], + [6976, 0, "1"], + [6977, 0, "="], + [6978, 0, "o"], + [6979, 0, "_"], + [6980, 0, "1"], + [6981, 0, " "], + [6982, 0, "\\"], + [6983, 0, "d"], + [6984, 0, "o"], + [6985, 0, "t"], + [6986, 0, "s"], + [6987, 0, " "], + [6988, 0, "o"], + [6989, 0, "_"], + [6990, 0, "n"], + [6991, 0, "$"], + [6992, 0, " "], + [6993, 0, "a"], + [6994, 0, "n"], + [6995, 0, "d"], + [6996, 0, " "], + [6997, 0, "$"], + [6998, 0, "H"], + [6999, 0, "_"], + [7000, 0, "2"], + [7001, 0, "$"], + [7002, 0, " "], + [7003, 0, "i"], + [7004, 0, "s"], + [7005, 0, " "], + [7006, 0, "a"], + [7007, 0, " "], + [7008, 0, "p"], + [7009, 0, "e"], + [7010, 0, "r"], + [7011, 0, "m"], + [7012, 0, "u"], + [7013, 0, "t"], + [7014, 0, "a"], + [7015, 0, "t"], + [7016, 0, "i"], + [7017, 0, "o"], + [7018, 0, "n"], + [7019, 0, " "], + [7020, 0, "o"], + [7021, 0, "f"], + [7022, 0, " "], + [7023, 0, "$"], + [7024, 0, "H"], + [7025, 0, "1"], + [7025, 1], + [7025, 0, "_"], + [7026, 0, "1"], + [7027, 0, "$"], + [7028, 0, ","], + [7029, 0, " "], + [7030, 0, "w"], + [7030, 1], + [7030, 0, "a"], + [7031, 0, "n"], + [7032, 0, "d"], + [7033, 0, " "], + [7034, 0, "s"], + [7035, 0, "u"], + [7036, 0, "c"], + [7037, 0, "h"], + [7038, 0, " "], + [7039, 0, "t"], + [7040, 0, "h"], + [7041, 0, "a"], + [7042, 0, "t"], + [7043, 0, " "], + [7044, 0, "a"], + [7045, 0, "p"], + [7046, 0, "p"], + [7047, 0, "l"], + [7048, 0, "y"], + [7049, 0, "i"], + [7050, 0, "n"], + [7051, 0, "g"], + [7052, 0, " "], + [7053, 0, "$"], + [7054, 0, "H"], + [7055, 0, "_"], + [7056, 0, "1"], + [7057, 0, "$"], + [7058, 0, " "], + [7059, 0, "r"], + [7060, 0, "e"], + [7061, 0, "s"], + [7062, 0, "u"], + [7063, 0, "l"], + [7064, 0, "t"], + [7065, 0, "s"], + [7066, 0, " "], + [7067, 0, "i"], + [7068, 0, "n"], + [7069, 0, " "], + [7070, 0, "t"], + [7071, 0, "h"], + [7072, 0, "e"], + [7073, 0, " "], + [7074, 0, "s"], + [7075, 0, "a"], + [7076, 0, "m"], + [7077, 0, "e"], + [7078, 0, " "], + [7079, 0, "s"], + [7080, 0, "t"], + [7081, 0, "a"], + [7082, 0, "t"], + [7083, 0, "e"], + [7084, 0, " "], + [7085, 0, "a"], + [7086, 0, "s"], + [7087, 0, " "], + [7088, 0, "a"], + [7089, 0, "p"], + [7090, 0, "p"], + [7091, 0, "l"], + [7092, 0, "y"], + [7093, 0, "i"], + [7094, 0, "n"], + [7095, 0, "g"], + [7096, 0, " "], + [7097, 0, "$"], + [7098, 0, "H"], + [7099, 0, "_"], + [7100, 0, "2"], + [7101, 0, "$"], + [6928, 0, " "], + [6929, 0, "a"], + [6930, 0, "m"], + [6931, 0, "u"], + [6931, 1], + [6930, 1], + [6930, 0, "n"], + [6931, 0, "y"], + [6932, 0, " "], + [6932, 1], + [6931, 1], + [6930, 1], + [6929, 1], + [6928, 1], + [7102, 0, ","], + [7103, 0, " "], + [7104, 0, "w"], + [7105, 0, "e"], + [7106, 0, " "], + [7107, 0, "c"], + [7108, 0, "a"], + [7109, 0, "n"], + [7110, 0, " "], + [7111, 0, "e"], + [7112, 0, "x"], + [7113, 0, "t"], + [7114, 0, "e"], + [7115, 0, "n"], + [7116, 0, "d"], + [7117, 0, " "], + [7118, 0, "t"], + [7119, 0, "h"], + [7120, 0, "e"], + [7121, 0, " "], + [7122, 0, "h"], + [7123, 0, "i"], + [7124, 0, "s"], + [7125, 0, "t"], + [7126, 0, "o"], + [7127, 0, "r"], + [7128, 0, "y"], + [7129, 0, " "], + [7130, 0, "b"], + [7131, 0, "y"], + [7132, 0, " "], + [7132, 1], + [7131, 1], + [7130, 1], + [7129, 1], + [7128, 1], + [7127, 1], + [7126, 1], + [7125, 1], + [7124, 1], + [7123, 1], + [7122, 1], + [7121, 1], + [7120, 1], + [7119, 1], + [7118, 1], + [7117, 1], + [7116, 1], + [7115, 1], + [7114, 1], + [7113, 1], + [7112, 1], + [7111, 1], + [7111, 0, "c"], + [7112, 0, "o"], + [7113, 0, "n"], + [7114, 0, "s"], + [7115, 0, "t"], + [7116, 0, "r"], + [7117, 0, "u"], + [7118, 0, "c"], + [7119, 0, "t"], + [7120, 0, " "], + [7121, 0, "n"], + [7122, 0, "e"], + [7123, 0, "w"], + [7124, 0, " "], + [7125, 0, "h"], + [7126, 0, "i"], + [7127, 0, "s"], + [7128, 0, "t"], + [7129, 0, "o"], + [7130, 0, "r"], + [7131, 0, "i"], + [7132, 0, "e"], + [7133, 0, "s"], + [7134, 0, " "], + [7135, 0, "o"], + [7136, 0, "f"], + [7137, 0, " "], + [7138, 0, "l"], + [7139, 0, "e"], + [7140, 0, "n"], + [7141, 0, "g"], + [7142, 0, "t"], + [7143, 0, "h"], + [7144, 0, " "], + [7145, 0, "$"], + [7146, 0, "n"], + [7147, 0, "+"], + [7148, 0, "1"], + [7149, 0, "$"], + [7150, 0, " "], + [7151, 0, "b"], + [7152, 0, "y"], + [7153, 0, " "], + [7154, 0, "i"], + [7155, 0, "n"], + [7156, 0, "s"], + [7157, 0, "e"], + [7158, 0, "r"], + [7159, 0, "t"], + [7160, 0, "i"], + [7161, 0, "n"], + [7162, 0, "g"], + [7163, 0, " "], + [7164, 0, "a"], + [7165, 0, "n"], + [7166, 0, " "], + [7167, 0, "o"], + [7168, 0, "p"], + [7169, 0, "e"], + [7170, 0, "r"], + [7171, 0, "a"], + [7172, 0, "t"], + [7173, 0, "i"], + [7174, 0, "o"], + [7175, 0, "n"], + [7176, 0, " "], + [7177, 0, "$"], + [7178, 0, "o"], + [7179, 0, "_"], + [7180, 0, "{"], + [7181, 0, "n"], + [7182, 0, "+"], + [7183, 0, "1"], + [7184, 0, "}"], + [7185, 0, "$"], + [7186, 0, " "], + [7187, 0, "a"], + [7188, 0, "t"], + [7189, 0, " "], + [7190, 0, "a"], + [7191, 0, "n"], + [7192, 0, "y"], + [7193, 0, " "], + [7194, 0, "c"], + [7195, 0, "a"], + [7196, 0, "u"], + [7197, 0, "s"], + [7198, 0, "a"], + [7199, 0, "l"], + [7200, 0, "l"], + [7201, 0, "y"], + [7202, 0, " "], + [7203, 0, "r"], + [7204, 0, "e"], + [7205, 0, "a"], + [7206, 0, "d"], + [7207, 0, "y"], + [7208, 0, " "], + [6961, 0, " "], + [6962, 0, "o"], + [6963, 0, "f"], + [6964, 0, " "], + [6965, 0, "l"], + [6966, 0, "e"], + [6967, 0, "n"], + [6968, 0, "g"], + [6969, 0, "t"], + [6970, 0, "h"], + [6971, 0, " "], + [6972, 0, "$"], + [6973, 0, "n"], + [6974, 0, "$"], + [7223, 0, "p"], + [7224, 0, "o"], + [7225, 0, "s"], + [7226, 0, "i"], + [7227, 0, "t"], + [7228, 0, "i"], + [7229, 0, "o"], + [7230, 0, "n"], + [7231, 0, " "], + [7232, 0, "i"], + [7233, 0, "n"], + [7234, 0, " "], + [7235, 0, "e"], + [7236, 0, "i"], + [7237, 0, "t"], + [7238, 0, "h"], + [7239, 0, "e"], + [7240, 0, "r"], + [7241, 0, " "], + [7242, 0, "h"], + [7243, 0, "i"], + [7244, 0, "s"], + [7245, 0, "t"], + [7246, 0, "o"], + [7247, 0, "r"], + [7248, 0, "y"], + [7249, 0, "."], + [7250, 0, " "], + [7250, 1], + [7249, 1], + [7248, 1], + [7247, 1], + [7246, 1], + [7245, 1], + [7244, 1], + [7243, 1], + [7242, 1], + [7242, 0, "$"], + [7243, 0, "H"], + [7244, 0, "_"], + [7245, 0, "1"], + [7246, 0, "$"], + [7247, 0, " "], + [7248, 0, "o"], + [7249, 0, "r"], + [7250, 0, " "], + [7251, 0, "$"], + [7252, 0, "H"], + [7253, 0, "_"], + [7254, 0, "2"], + [7255, 0, "$"], + [7256, 0, "."], + [7257, 0, " "], + [7258, 0, "W"], + [7259, 0, "e"], + [7260, 0, " "], + [7261, 0, "m"], + [7262, 0, "u"], + [7263, 0, "s"], + [7264, 0, "t"], + [7265, 0, " "], + [7266, 0, "t"], + [7267, 0, "h"], + [7268, 0, "e"], + [7269, 0, "n"], + [7270, 0, " "], + [7271, 0, "s"], + [7272, 0, "h"], + [7273, 0, "o"], + [7274, 0, "w"], + [7275, 0, " "], + [7276, 0, "t"], + [7277, 0, "h"], + [7278, 0, "a"], + [7279, 0, "t"], + [7280, 0, " "], + [7281, 0, "a"], + [7282, 0, "l"], + [7283, 0, "l"], + [7284, 0, " "], + [7285, 0, "o"], + [7286, 0, "f"], + [7287, 0, " "], + [7288, 0, "t"], + [7289, 0, "h"], + [7290, 0, "e"], + [7291, 0, " "], + [7292, 0, "h"], + [7293, 0, "i"], + [7294, 0, "s"], + [7295, 0, "t"], + [7296, 0, "o"], + [7297, 0, "r"], + [7298, 0, "i"], + [7299, 0, "e"], + [7300, 0, "s"], + [7301, 0, " "], + [7302, 0, "c"], + [7303, 0, "o"], + [7304, 0, "n"], + [7305, 0, "s"], + [7306, 0, "t"], + [7307, 0, "r"], + [7308, 0, "u"], + [7309, 0, "c"], + [7310, 0, "t"], + [7311, 0, "e"], + [7312, 0, "d"], + [7313, 0, " "], + [7314, 0, "t"], + [7315, 0, "h"], + [7316, 0, "i"], + [7317, 0, "s"], + [7318, 0, " "], + [7319, 0, "w"], + [7320, 0, "a"], + [7321, 0, "y"], + [7322, 0, " "], + [7281, 0, "a"], + [7282, 0, "p"], + [7283, 0, "p"], + [7284, 0, "l"], + [7285, 0, "y"], + [7286, 0, "i"], + [7287, 0, "n"], + [7288, 0, "g"], + [7289, 0, " "], + [7289, 1], + [7288, 1], + [7287, 1], + [7286, 1], + [7285, 1], + [7284, 1], + [7283, 1], + [7282, 1], + [7281, 1], + [7281, 0, "f"], + [7282, 0, "o"], + [7283, 0, "r"], + [7284, 0, " "], + [7326, 1], + [7326, 0, ","], + [7327, 0, " "], + [7328, 0, "a"], + [7329, 0, "p"], + [7330, 0, "p"], + [7331, 0, "l"], + [7332, 0, "y"], + [7333, 0, "i"], + [7334, 0, "n"], + [7335, 0, "g"], + [7336, 0, " "], + [7337, 0, "t"], + [7338, 0, "h"], + [7339, 0, "e"], + [7340, 0, " "], + [7341, 0, "o"], + [7342, 0, "p"], + [7343, 0, "e"], + [7344, 0, "r"], + [7345, 0, "a"], + [7346, 0, "t"], + [7347, 0, "i"], + [7348, 0, "o"], + [7349, 0, "n"], + [7350, 0, "s"], + [7351, 0, " "], + [7352, 0, "r"], + [7353, 0, "e"], + [7354, 0, "s"], + [7355, 0, "u"], + [7356, 0, "l"], + [7357, 0, "t"], + [7358, 0, "s"], + [7359, 0, " "], + [7360, 0, "i"], + [7361, 0, "n"], + [7362, 0, " "], + [7363, 0, "t"], + [7364, 0, "h"], + [7365, 0, "e"], + [7366, 0, " "], + [7367, 0, "s"], + [7368, 0, "a"], + [7369, 0, "m"], + [7370, 0, "e"], + [7371, 0, " "], + [7372, 0, "f"], + [7373, 0, "i"], + [7374, 0, "n"], + [7375, 0, "a"], + [7376, 0, "l"], + [7377, 0, " "], + [7378, 0, "s"], + [7379, 0, "t"], + [7380, 0, "a"], + [7381, 0, "t"], + [7382, 0, "e"], + [7383, 0, "."], + [6152, 0, " "], + [6153, 0, "b"], + [6154, 0, "u"], + [6155, 0, "t"], + [6155, 1], + [6154, 1], + [6153, 1], + [6152, 1], + [6151, 1], + [6150, 1], + [6149, 1], + [6148, 1], + [6147, 1], + [6146, 1], + [6145, 1], + [6144, 1], + [6143, 1], + [6143, 0, "a"], + [6144, 0, "n"], + [6145, 0, "y"], + [6172, 1], + [6172, 0, " "], + [6173, 0, "("], + [6174, 0, "b"], + [6175, 0, "u"], + [6176, 0, "t"], + [6177, 0, " "], + [6178, 0, "n"], + [6179, 0, "o"], + [6180, 0, "t"], + [6181, 0, " "], + [6182, 0, "n"], + [6183, 0, "e"], + [6184, 0, "c"], + [6185, 0, "e"], + [6186, 0, "s"], + [6187, 0, "s"], + [6188, 0, "a"], + [6189, 0, "r"], + [6190, 0, "i"], + [6191, 0, "l"], + [6192, 0, "y"], + [6193, 0, " "], + [6194, 0, "t"], + [6195, 0, "h"], + [6196, 0, "e"], + [6197, 0, " "], + [6198, 0, "s"], + [6199, 0, "a"], + [6200, 0, "m"], + [6201, 0, "e"], + [6202, 0, " "], + [6203, 0, "o"], + [6204, 0, "r"], + [6205, 0, "d"], + [6206, 0, "e"], + [6207, 0, "r"], + [6208, 0, ")"], + [6520, 1], + [6520, 0, ":"], + [6521, 0, "\n"], + [6522, 0, "$"], + [6523, 0, "$"], + [6524, 0, " "], + [6525, 0, "A"], + [6526, 0, "_"], + [6527, 0, "\\"], + [6528, 0, "m"], + [6529, 0, "a"], + [6530, 0, "t"], + [6531, 0, "h"], + [6532, 0, "r"], + [6533, 0, "m"], + [6534, 0, "{"], + [6535, 0, "f"], + [6536, 0, "i"], + [6537, 0, "n"], + [6538, 0, "a"], + [6539, 0, "l"], + [6540, 0, "}"], + [6541, 0, "}"], + [6527, 0, "{"], + [6543, 0, " "], + [6544, 0, "="], + [6545, 0, " "], + [5212, 0, "A"], + [5213, 0, ","], + [5214, 0, " "], + [6549, 0, "\\"], + [6550, 0, "m"], + [6551, 0, "a"], + [6552, 0, "t"], + [6553, 0, "h"], + [6554, 0, "r"], + [6555, 0, "m"], + [6556, 0, "{"], + [6557, 0, "a"], + [6558, 0, "p"], + [6559, 0, "p"], + [6560, 0, "l"], + [6561, 0, "y"], + [6562, 0, "}"], + [6563, 0, "("], + [6564, 0, "\\"], + [6565, 0, "m"], + [6566, 0, "a"], + [6567, 0, "t"], + [6568, 0, "h"], + [6569, 0, "r"], + [6570, 0, "m"], + [6571, 0, "{"], + [6572, 0, "a"], + [6573, 0, "p"], + [6574, 0, "p"], + [6575, 0, "l"], + [6576, 0, "y"], + [6577, 0, "}"], + [6578, 0, "("], + [6579, 0, "\\"], + [6580, 0, "d"], + [6581, 0, "o"], + [6582, 0, "t"], + [6583, 0, "s"], + [6584, 0, " "], + [6585, 0, "\\"], + [6586, 0, "m"], + [6587, 0, "a"], + [6588, 0, "t"], + [6589, 0, "h"], + [6590, 0, "r"], + [6591, 0, "m"], + [6592, 0, "{"], + [6593, 0, "a"], + [6594, 0, "p"], + [6595, 0, "p"], + [6596, 0, "l"], + [6597, 0, "y"], + [6598, 0, "}"], + [6599, 0, "("], + [6600, 0, "A"], + [6601, 0, "_"], + [6602, 0, "\\"], + [6603, 0, "e"], + [6604, 0, "m"], + [6605, 0, "p"], + [6606, 0, "t"], + [6607, 0, "y"], + [6608, 0, "s"], + [6609, 0, "e"], + [6610, 0, "t"], + [6611, 0, ","], + [6612, 0, " "], + [6613, 0, "o"], + [6614, 0, "_"], + [6615, 0, "1"], + [6616, 0, ")"], + [6617, 0, ","], + [6618, 0, " "], + [6619, 0, "\\"], + [6620, 0, "d"], + [6621, 0, "o"], + [6622, 0, "t"], + [6623, 0, "s"], + [6624, 0, ","], + [6625, 0, " "], + [6626, 0, "o"], + [6627, 0, "_"], + [6628, 0, "{"], + [6629, 0, "n"], + [6630, 0, "-"], + [6631, 0, "1"], + [6632, 0, "}"], + [6633, 0, ")"], + [6634, 0, ","], + [6635, 0, " "], + [6636, 0, "o"], + [6637, 0, "_"], + [6638, 0, "n"], + [6639, 0, ")"], + [6640, 0, " "], + [6641, 0, "$"], + [6642, 0, "$"], + [6260, 1], + [6259, 1], + [6258, 1], + [6257, 1], + [6256, 1], + [6255, 1], + [6254, 1], + [6254, 0, "E"], + [6367, 1], + [6366, 1], + [6365, 1], + [6365, 0, "."], + [6366, 0, " "], + [6367, 0, "T"], + [6368, 0, "h"], + [6369, 0, "e"], + [6370, 0, "r"], + [6371, 0, "e"], + [6372, 0, "f"], + [6373, 0, "o"], + [6374, 0, "r"], + [6375, 0, "e"], + [6376, 0, ","], + [6377, 0, " "], + [6378, 0, "w"], + [6390, 1], + [6390, 0, "e"], + [6425, 1], + [6424, 1], + [6423, 1], + [6422, 1], + [6421, 1], + [6420, 1], + [6419, 1], + [6418, 1], + [6417, 1], + [6416, 1], + [6415, 1], + [6414, 1], + [6413, 1], + [6412, 1], + [6412, 0, "f"], + [6413, 0, "r"], + [6414, 0, "o"], + [6415, 0, "m"], + [6434, 1], + [6426, 1], + [6425, 1], + [6424, 1], + [6423, 1], + [6422, 1], + [6421, 1], + [6442, 0, " "], + [6405, 1], + [6404, 1], + [6409, 0, " "], + [6410, 0, "$"], + [6411, 0, "p"], + [6412, 0, "$"], + [6445, 0, "$"], + [6446, 0, "H"], + [6447, 0, "_"], + [6448, 0, "p"], + [6449, 0, "="], + [6450, 0, "o"], + [6451, 0, "_"], + [6452, 0, "1"], + [6453, 0, " "], + [6454, 0, "\\"], + [6455, 0, "d"], + [6456, 0, "o"], + [6457, 0, "t"], + [6458, 0, "s"], + [6459, 0, " "], + [6460, 0, "o"], + [6461, 0, "_"], + [6462, 0, "n"], + [6463, 0, "$"], + [6464, 0, " "], + [6465, 0, "a"], + [6466, 0, "p"], + [6467, 0, "p"], + [6468, 0, "l"], + [6469, 0, "i"], + [6470, 0, "e"], + [6471, 0, "d"], + [6479, 1], + [6478, 1], + [6477, 1], + [6476, 1], + [6476, 0, "t"], + [6477, 0, "h"], + [6478, 0, "a"], + [6479, 0, "t"], + [6512, 1], + [6511, 1], + [6510, 1], + [6509, 1], + [6508, 1], + [6507, 1], + [6506, 1], + [6505, 1], + [6504, 1], + [6503, 1], + [6502, 1], + [6501, 1], + [6500, 1], + [6499, 1], + [6498, 1], + [6497, 1], + [6496, 1], + [6495, 1], + [6494, 1], + [6493, 1], + [6492, 1], + [6491, 1], + [6490, 1], + [6489, 1], + [6488, 1], + [6487, 1], + [6486, 1], + [6485, 1], + [6485, 0, ","], + [6487, 0, "p"], + [6488, 0, "r"], + [6489, 0, "o"], + [6490, 0, "c"], + [6491, 0, "e"], + [6492, 0, "s"], + [6493, 0, "s"], + [6494, 0, "e"], + [6495, 0, "d"], + [6496, 0, " "], + [6641, 0, "."], + [6760, 1], + [6759, 1], + [6758, 1], + [6757, 1], + [6756, 1], + [6755, 1], + [6754, 1], + [6753, 1], + [6752, 1], + [6751, 1], + [6750, 1], + [6749, 1], + [6748, 1], + [6747, 1], + [6746, 1], + [6745, 1], + [6744, 1], + [6743, 1], + [6742, 1], + [6741, 1], + [6740, 1], + [6739, 1], + [6738, 1], + [6737, 1], + [6736, 1], + [6735, 1], + [6734, 1], + [6733, 1], + [6732, 1], + [6731, 1], + [6730, 1], + [6729, 1], + [6728, 1], + [6727, 1], + [6726, 1], + [6725, 1], + [6724, 1], + [6723, 1], + [6722, 1], + [6721, 1], + [6720, 1], + [6719, 1], + [6718, 1], + [6717, 1], + [6716, 1], + [6715, 1], + [6714, 1], + [6713, 1], + [6712, 1], + [6711, 1], + [6710, 1], + [6709, 1], + [6708, 1], + [6707, 1], + [6706, 1], + [6705, 1], + [6704, 1], + [6703, 1], + [6702, 1], + [6701, 1], + [6700, 1], + [6699, 1], + [6698, 1], + [6697, 1], + [6696, 1], + [6695, 1], + [6694, 1], + [6693, 1], + [6692, 1], + [6691, 1], + [6690, 1], + [6689, 1], + [6688, 1], + [6687, 1], + [6686, 1], + [6685, 1], + [6684, 1], + [6683, 1], + [6682, 1], + [6681, 1], + [6680, 1], + [6679, 1], + [6678, 1], + [6677, 1], + [6676, 1], + [6675, 1], + [6674, 1], + [6673, 1], + [6672, 1], + [6671, 1], + [6670, 1], + [6669, 1], + [6668, 1], + [6667, 1], + [6666, 1], + [6665, 1], + [6664, 1], + [6663, 1], + [6662, 1], + [6661, 1], + [6660, 1], + [6659, 1], + [6658, 1], + [6657, 1], + [6656, 1], + [6655, 1], + [6654, 1], + [6653, 1], + [6652, 1], + [6651, 1], + [6650, 1], + [6649, 1], + [6648, 1], + [6647, 1], + [6545, 1], + [6544, 1], + [6543, 1], + [6542, 1], + [6541, 1], + [6540, 1], + [6539, 1], + [6538, 1], + [6537, 1], + [6536, 1], + [6535, 1], + [6534, 1], + [6533, 1], + [6532, 1], + [6532, 0, "H"], + [6533, 0, "_"], + [6534, 0, "p"], + [6254, 0, "\\"], + [6255, 0, "t"], + [6256, 0, "e"], + [6257, 0, "x"], + [6258, 0, "t"], + [6259, 0, "b"], + [6260, 0, "f"], + [6261, 0, "{"], + [6262, 0, "P"], + [6263, 0, "r"], + [6264, 0, "o"], + [6265, 0, "o"], + [6266, 0, "f"], + [6267, 0, "."], + [6268, 0, " "], + [6268, 1], + [6268, 0, "}"], + [6269, 0, " "], + [7429, 0, "\n"], + [7430, 0, "\n"], + [7431, 0, "W"], + [7432, 0, "e"], + [7433, 0, " "], + [7434, 0, "s"], + [7435, 0, "h"], + [7436, 0, "o"], + [7437, 0, "w"], + [7438, 0, " "], + [7439, 0, "t"], + [7440, 0, "h"], + [7441, 0, "e"], + [7442, 0, " "], + [7443, 0, "i"], + [7444, 0, "n"], + [7445, 0, "d"], + [7446, 0, "u"], + [7447, 0, "c"], + [7448, 0, "t"], + [7449, 0, "i"], + [7450, 0, "o"], + [7451, 0, "n"], + [7452, 0, " "], + [7453, 0, "s"], + [7454, 0, "t"], + [7455, 0, "e"], + [7456, 0, "p"], + [7457, 0, " "], + [7458, 0, "c"], + [7459, 0, "a"], + [7460, 0, "s"], + [7461, 0, "e"], + [7462, 0, " "], + [7463, 0, "b"], + [7464, 0, "y"], + [7465, 0, " "], + [7466, 0, "c"], + [7467, 0, "a"], + [7468, 0, "s"], + [7469, 0, "e"], + [7470, 0, ","], + [7471, 0, " "], + [7472, 0, "c"], + [7473, 0, "o"], + [7474, 0, "n"], + [7475, 0, "s"], + [7476, 0, "i"], + [7477, 0, "d"], + [7478, 0, "e"], + [7479, 0, "r"], + [7480, 0, "i"], + [7481, 0, "n"], + [7482, 0, "g"], + [7483, 0, " "], + [7484, 0, "e"], + [7485, 0, "a"], + [7486, 0, "c"], + [7487, 0, "h"], + [7488, 0, " "], + [7489, 0, "t"], + [7490, 0, "y"], + [7491, 0, "p"], + [7492, 0, "e"], + [7493, 0, " "], + [7494, 0, "o"], + [7495, 0, "f"], + [7496, 0, " "], + [7497, 0, "o"], + [7498, 0, "p"], + [7499, 0, "e"], + [7500, 0, "r"], + [7501, 0, "a"], + [7502, 0, "t"], + [7503, 0, "i"], + [7504, 0, "o"], + [7505, 0, "n"], + [7506, 0, " "], + [7507, 0, "$"], + [7508, 0, "P"], + [7508, 1], + [7508, 0, "o"], + [7509, 0, "_"], + [7510, 0, "{"], + [7511, 0, "n"], + [7512, 0, "+"], + [7513, 0, "1"], + [7514, 0, "}"], + [7515, 0, "$"], + [7516, 0, " "], + [7517, 0, "t"], + [7518, 0, "h"], + [7519, 0, "a"], + [7520, 0, "t"], + [7521, 0, " "], + [7522, 0, "m"], + [7523, 0, "a"], + [7524, 0, "y"], + [7525, 0, " "], + [7526, 0, "b"], + [7527, 0, "e"], + [7528, 0, " "], + [7529, 0, "i"], + [7530, 0, "n"], + [7531, 0, "s"], + [7532, 0, "e"], + [7533, 0, "r"], + [7534, 0, "t"], + [7535, 0, "e"], + [7536, 0, "d"], + [7537, 0, "."], + [7538, 0, " "], + [7539, 0, "F"], + [7540, 0, "i"], + [7541, 0, "r"], + [7542, 0, "s"], + [7543, 0, "t"], + [7544, 0, " "], + [7545, 0, "c"], + [7546, 0, "o"], + [7547, 0, "n"], + [7548, 0, "s"], + [7549, 0, "i"], + [7550, 0, "d"], + [7551, 0, "e"], + [7552, 0, "r"], + [7553, 0, " "], + [7554, 0, "t"], + [7555, 0, "h"], + [7556, 0, "e"], + [7557, 0, " "], + [7558, 0, "c"], + [7559, 0, "a"], + [7560, 0, "s"], + [7561, 0, "e"], + [7562, 0, " "], + [7563, 0, "t"], + [7564, 0, "h"], + [7565, 0, "a"], + [7566, 0, "t"], + [7567, 0, " "], + [7568, 0, "$"], + [7569, 0, "o"], + [7570, 0, "_"], + [7538, 1], + [7538, 0, "\n"], + [7539, 0, "\n"], + [7572, 0, "{"], + [7573, 0, "n"], + [7574, 0, "+"], + [7575, 0, "1"], + [7576, 0, "}"], + [7577, 0, "="], + [7578, 0, "\\"], + [7579, 0, "m"], + [7580, 0, "a"], + [7581, 0, "t"], + [7582, 0, "h"], + [7583, 0, "s"], + [7584, 0, "f"], + [7585, 0, "{"], + [7586, 0, "d"], + [7587, 0, "e"], + [7588, 0, "l"], + [7589, 0, "e"], + [7590, 0, "t"], + [7591, 0, "e"], + [7592, 0, "}"], + [7593, 0, "("], + [7594, 0, "\\"], + [7595, 0, "m"], + [7596, 0, "a"], + [7597, 0, "t"], + [7598, 0, "h"], + [7599, 0, "i"], + [7600, 0, "t"], + [7601, 0, "{"], + [7602, 0, "i"], + [7603, 0, "d"], + [7604, 0, "}"], + [7605, 0, ")"], + [7606, 0, "$"], + [7607, 0, "."], + [7608, 0, " "], + [7609, 0, "B"], + [7610, 0, "y"], + [7611, 0, " "], + [7612, 0, "c"], + [7613, 0, "a"], + [7614, 0, "u"], + [7615, 0, "s"], + [7616, 0, "a"], + [7617, 0, "l"], + [7618, 0, "i"], + [7619, 0, "t"], + [7620, 0, "y"], + [7621, 0, ","], + [7622, 0, " "], + [7623, 0, "t"], + [7624, 0, "h"], + [7624, 1], + [7623, 1], + [7622, 1], + [7621, 1], + [7620, 1], + [7619, 1], + [7618, 1], + [7617, 1], + [7616, 1], + [7615, 1], + [7614, 1], + [7613, 1], + [7612, 1], + [7611, 1], + [7610, 1], + [7609, 1], + [7609, 0, "A"], + [7610, 0, " "], + [7611, 0, "l"], + [7612, 0, "i"], + [7613, 0, "s"], + [7614, 0, "t"], + [7615, 0, " "], + [7616, 0, "e"], + [7617, 0, "l"], + [7618, 0, "e"], + [7619, 0, "m"], + [7620, 0, "e"], + [7621, 0, "n"], + [7622, 0, "t"], + [7623, 0, " "], + [7624, 0, "c"], + [7625, 0, "a"], + [7626, 0, "n"], + [7627, 0, " "], + [7628, 0, "o"], + [7629, 0, "n"], + [7630, 0, "l"], + [7631, 0, "y"], + [7632, 0, " "], + [7633, 0, "b"], + [7634, 0, "e"], + [7635, 0, " "], + [7636, 0, "d"], + [7637, 0, "e"], + [7638, 0, "l"], + [7639, 0, "e"], + [7640, 0, "t"], + [7641, 0, "e"], + [7642, 0, "d"], + [7643, 0, " "], + [7644, 0, "i"], + [7645, 0, "f"], + [7646, 0, " "], + [7647, 0, "i"], + [7648, 0, "t"], + [7649, 0, " "], + [7650, 0, "e"], + [7651, 0, "x"], + [7652, 0, "i"], + [7653, 0, "s"], + [7654, 0, "t"], + [7655, 0, "s"], + [7656, 0, " "], + [7657, 0, "i"], + [7658, 0, "n"], + [7659, 0, " "], + [7660, 0, "t"], + [7661, 0, "h"], + [7662, 0, "e"], + [7663, 0, " "], + [7664, 0, "l"], + [7665, 0, "i"], + [7666, 0, "s"], + [7667, 0, "t"], + [7668, 0, ","], + [7669, 0, " "], + [7670, 0, "s"], + [7671, 0, "o"], + [7672, 0, " "], + [7673, 0, "b"], + [7674, 0, "y"], + [7675, 0, " "], + [7676, 0, "c"], + [7677, 0, "a"], + [7678, 0, "u"], + [7679, 0, "s"], + [7680, 0, "a"], + [7681, 0, "l"], + [7682, 0, "i"], + [7683, 0, "t"], + [7684, 0, "y"], + [7685, 0, ","], + [7686, 0, " "], + [7687, 0, "t"], + [7688, 0, "h"], + [7689, 0, "e"], + [7690, 0, "r"], + [7691, 0, "e"], + [7692, 0, " "], + [7693, 0, "m"], + [7694, 0, "u"], + [7695, 0, "s"], + [7696, 0, "t"], + [7697, 0, " "], + [7698, 0, "b"], + [7699, 0, "e"], + [7700, 0, " "], + [7701, 0, "a"], + [7702, 0, " "], + [7703, 0, "p"], + [7704, 0, "r"], + [7705, 0, "i"], + [7706, 0, "o"], + [7707, 0, "r"], + [7708, 0, " "], + [7708, 1], + [7707, 1], + [7706, 1], + [7705, 1], + [7704, 1], + [7703, 1], + [7702, 1], + [7702, 0, "n"], + [7703, 0, " "], + [7704, 0, "o"], + [7705, 0, "p"], + [7706, 0, "e"], + [7707, 0, "r"], + [7708, 0, "a"], + [7709, 0, "t"], + [7710, 0, "i"], + [7711, 0, "o"], + [7712, 0, "n"], + [7713, 0, " "], + [7714, 0, "$"], + [7715, 0, "o"], + [7716, 0, "_"], + [7717, 0, "i"], + [7718, 0, "="], + [7719, 0, "\\"], + [7720, 0, "m"], + [7721, 0, "a"], + [7722, 0, "t"], + [7723, 0, "h"], + [7724, 0, "s"], + [7725, 0, "f"], + [7726, 0, "{"], + [7727, 0, "i"], + [7728, 0, "n"], + [7729, 0, "s"], + [7730, 0, "e"], + [7731, 0, "r"], + [7732, 0, "t"], + [7733, 0, "}"], + [7734, 0, "("], + [7735, 0, "\\"], + [7736, 0, "m"], + [7737, 0, "a"], + [7738, 0, "t"], + [7739, 0, "h"], + [7740, 0, "i"], + [7741, 0, "t"], + [7742, 0, "{"], + [7743, 0, "i"], + [7744, 0, "d"], + [7745, 0, "}"], + [7746, 0, ","], + [7747, 0, " "], + [7748, 0, "\\"], + [7749, 0, "p"], + [7750, 0, "l"], + [7751, 0, "a"], + [7752, 0, "c"], + [7753, 0, "e"], + [7754, 0, "h"], + [7755, 0, "o"], + [7756, 0, "l"], + [7757, 0, "d"], + [7758, 0, "e"], + [7759, 0, "r"], + [7760, 0, ","], + [7761, 0, " "], + [7762, 0, "\\"], + [7763, 0, "p"], + [7764, 0, "l"], + [7765, 0, "a"], + [7766, 0, "c"], + [7767, 0, "e"], + [7768, 0, "h"], + [7769, 0, "o"], + [7770, 0, "l"], + [7771, 0, "d"], + [7772, 0, "e"], + [7773, 0, "r"], + [7774, 0, ")"], + [7775, 0, "$"], + [7776, 0, " "], + [7777, 0, "a"], + [7778, 0, "t"], + [7779, 0, " "], + [7780, 0, "a"], + [7781, 0, " "], + [7782, 0, "p"], + [7783, 0, "r"], + [7784, 0, "i"], + [7785, 0, "o"], + [7786, 0, "r"], + [7787, 0, " "], + [7788, 0, "p"], + [7789, 0, "o"], + [7790, 0, "i"], + [7791, 0, "n"], + [7792, 0, "t"], + [7793, 0, " "], + [7794, 0, "i"], + [7795, 0, "n"], + [7796, 0, " "], + [7797, 0, "t"], + [7798, 0, "h"], + [7799, 0, "e"], + [7800, 0, " "], + [7801, 0, "h"], + [7802, 0, "i"], + [7803, 0, "s"], + [7804, 0, "t"], + [7805, 0, "o"], + [7806, 0, "r"], + [7807, 0, "y"], + [7808, 0, "."], + [7809, 0, " "], + [7810, 0, "M"], + [7811, 0, "o"], + [7812, 0, "r"], + [7813, 0, "e"], + [7814, 0, "o"], + [7815, 0, "v"], + [7816, 0, "e"], + [7817, 0, "r"], + [7818, 0, ","], + [7819, 0, " "], + [7820, 0, "L"], + [7821, 0, "a"], + [7822, 0, "m"], + [7823, 0, "p"], + [7824, 0, "o"], + [7825, 0, "r"], + [7826, 0, "t"], + [7827, 0, " "], + [7828, 0, "t"], + [7829, 0, "i"], + [7830, 0, "m"], + [7831, 0, "e"], + [7832, 0, "s"], + [7833, 0, "t"], + [7834, 0, "a"], + [7835, 0, "m"], + [7836, 0, "p"], + [7837, 0, "s"], + [7838, 0, " "], + [7839, 0, "u"], + [7840, 0, "s"], + [7841, 0, "e"], + [7842, 0, "d"], + [7843, 0, " "], + [7820, 0, "t"], + [7821, 0, "h"], + [7822, 0, "e"], + [7823, 0, " "], + [7841, 1], + [7847, 0, "a"], + [7848, 0, "s"], + [7849, 0, " "], + [7850, 0, "\\"], + [7850, 1], + [7850, 0, "$"], + [7851, 0, "\\"], + [7852, 0, "m"], + [7853, 0, "a"], + [7854, 0, "t"], + [7855, 0, "h"], + [7856, 0, "i"], + [7857, 0, "d"], + [7858, 0, "{"], + [7858, 1], + [7857, 1], + [7857, 0, "t"], + [7858, 0, "{"], + [7859, 0, "i"], + [7860, 0, "d"], + [7861, 0, "}"], + [7862, 0, "$"], + [7863, 0, " "], + [7864, 0, "i"], + [7865, 0, "s"], + [7866, 0, " "], + [7867, 0, "u"], + [7868, 0, "n"], + [7869, 0, "i"], + [7870, 0, "q"], + [7871, 0, "u"], + [7872, 0, "e"], + [7873, 0, ","], + [7874, 0, " "], + [7875, 0, "s"], + [7876, 0, "o"], + [7877, 0, " "], + [7878, 0, "t"], + [7879, 0, "h"], + [7880, 0, "e"], + [7881, 0, "r"], + [7882, 0, "e"], + [7883, 0, " "], + [7884, 0, "m"], + [7885, 0, "u"], + [7886, 0, "s"], + [7887, 0, "t"], + [7888, 0, " "], + [7889, 0, "b"], + [7890, 0, "e"], + [7891, 0, " "], + [7892, 0, "e"], + [7893, 0, "x"], + [7894, 0, "a"], + [7895, 0, "c"], + [7896, 0, "t"], + [7897, 0, "l"], + [7898, 0, "y"], + [7899, 0, " "], + [7900, 0, "o"], + [7901, 0, "n"], + [7902, 0, "e"], + [7903, 0, " "], + [7904, 0, "s"], + [7905, 0, "u"], + [7906, 0, "c"], + [7907, 0, "h"], + [7908, 0, " "], + [7909, 0, "$"], + [7910, 0, "\\"], + [7911, 0, "m"], + [7912, 0, "a"], + [7913, 0, "t"], + [7914, 0, "h"], + [7915, 0, "s"], + [7916, 0, "f"], + [7917, 0, "{"], + [7918, 0, "i"], + [7919, 0, "n"], + [7920, 0, "s"], + [7921, 0, "e"], + [7922, 0, "r"], + [7923, 0, "t"], + [7924, 0, "}"], + [7925, 0, "$"], + [7926, 0, " "], + [7927, 0, "o"], + [7928, 0, "p"], + [7929, 0, "e"], + [7930, 0, "r"], + [7931, 0, "a"], + [7932, 0, "t"], + [7933, 0, "i"], + [7934, 0, "o"], + [7935, 0, "n"], + [7936, 0, ","], + [7937, 0, " "], + [7938, 0, "a"], + [7939, 0, "n"], + [7940, 0, "d"], + [7941, 0, " "], + [7942, 0, "t"], + [7943, 0, "h"], + [7944, 0, "e"], + [7945, 0, "r"], + [7946, 0, "e"], + [7947, 0, " "], + [7948, 0, "c"], + [7949, 0, "a"], + [7950, 0, "n"], + [7951, 0, "n"], + [7952, 0, "o"], + [7953, 0, "t"], + [7954, 0, " "], + [7955, 0, "b"], + [7956, 0, "e"], + [7957, 0, " "], + [7958, 0, "a"], + [7959, 0, "n"], + [7960, 0, "y"], + [7961, 0, " "], + [7962, 0, "$"], + [7963, 0, "\\"], + [7964, 0, "m"], + [7965, 0, "a"], + [7966, 0, "t"], + [7967, 0, "h"], + [7968, 0, "s"], + [7969, 0, "f"], + [7970, 0, "{"], + [7971, 0, "i"], + [7972, 0, "s"], + [7973, 0, "n"], + [7974, 0, "e"], + [7975, 0, "r"], + [7976, 0, "t"], + [7976, 1], + [7975, 1], + [7974, 1], + [7973, 1], + [7972, 1], + [7972, 0, "n"], + [7973, 0, "s"], + [7974, 0, "e"], + [7975, 0, "r"], + [7976, 0, "t"], + [7977, 0, "}"], + [7978, 0, "$"], + [7979, 0, " "], + [7980, 0, "o"], + [7981, 0, "p"], + [7982, 0, "e"], + [7983, 0, "r"], + [7984, 0, "a"], + [7985, 0, "t"], + [7986, 0, "i"], + [7987, 0, "o"], + [7988, 0, "n"], + [7989, 0, " "], + [7990, 0, "f"], + [7991, 0, "o"], + [7992, 0, "r"], + [7993, 0, " "], + [7994, 0, "t"], + [7995, 0, "h"], + [7996, 0, "e"], + [7997, 0, " "], + [7998, 0, "s"], + [7999, 0, "a"], + [8000, 0, "m"], + [8001, 0, "e"], + [8002, 0, " "], + [8003, 0, "$"], + [8004, 0, "\\"], + [8005, 0, "m"], + [8006, 0, "a"], + [8007, 0, "t"], + [8008, 0, "h"], + [8009, 0, "i"], + [8010, 0, "t"], + [8011, 0, "{"], + [8012, 0, "i"], + [8013, 0, "d"], + [8014, 0, "}"], + [8015, 0, "$"], + [8016, 0, " "], + [8017, 0, "a"], + [8018, 0, "t"], + [8019, 0, " "], + [8020, 0, "a"], + [8021, 0, " "], + [8022, 0, "p"], + [8023, 0, "o"], + [8024, 0, "i"], + [8025, 0, "n"], + [8026, 0, "t"], + [8027, 0, " "], + [8028, 0, "a"], + [8029, 0, "f"], + [8030, 0, "t"], + [8031, 0, "e"], + [8032, 0, "r"], + [8033, 0, " "], + [8034, 0, "$"], + [8035, 0, "o"], + [8036, 0, "_"], + [8037, 0, "{"], + [8038, 0, "n"], + [8039, 0, "+"], + [8040, 0, "1"], + [8041, 0, "}"], + [8042, 0, "$"], + [8043, 0, " "], + [8044, 0, "i"], + [8045, 0, "n"], + [8046, 0, " "], + [8047, 0, "t"], + [8048, 0, "h"], + [8049, 0, "e"], + [8050, 0, " "], + [8051, 0, "h"], + [8052, 0, "i"], + [8053, 0, "s"], + [8054, 0, "t"], + [8055, 0, "o"], + [8056, 0, "r"], + [8057, 0, "y"], + [8058, 0, "."], + [8059, 0, "\n"], + [8060, 0, "\n"], + [8061, 0, "T"], + [8062, 0, "h"], + [8063, 0, "u"], + [8064, 0, "s"], + [8065, 0, ","], + [8066, 0, " "], + [8067, 0, "t"], + [8068, 0, "h"], + [8069, 0, "e"], + [8070, 0, " "], + [8071, 0, "o"], + [8072, 0, "n"], + [8073, 0, "l"], + [8074, 0, "y"], + [8075, 0, " "], + [8076, 0, "m"], + [8076, 1], + [8076, 0, "o"], + [8077, 0, "p"], + [8078, 0, "e"], + [8079, 0, "r"], + [8080, 0, "a"], + [8081, 0, "t"], + [8082, 0, "i"], + [8083, 0, "o"], + [8084, 0, "n"], + [8085, 0, " "], + [8086, 0, "t"], + [8087, 0, "h"], + [8088, 0, "a"], + [8089, 0, "t"], + [8090, 0, " "], + [8091, 0, "c"], + [8092, 0, "a"], + [8093, 0, "n"], + [8094, 0, " "], + [8095, 0, "m"], + [8096, 0, "o"], + [8097, 0, "d"], + [8098, 0, "i"], + [8099, 0, "f"], + [8100, 0, "y"], + [8101, 0, " "], + [8102, 0, "t"], + [8103, 0, "h"], + [8104, 0, "e"], + [8105, 0, " "], + [8106, 0, "m"], + [8107, 0, "a"], + [8108, 0, "p"], + [8109, 0, "p"], + [8110, 0, "i"], + [8111, 0, "n"], + [8112, 0, "g"], + [8113, 0, " "], + [8114, 0, "f"], + [8115, 0, "o"], + [8116, 0, "r"], + [8117, 0, " "], + [8118, 0, "t"], + [8119, 0, "h"], + [8120, 0, "e"], + [8121, 0, " "], + [8121, 1], + [8120, 1], + [8119, 1], + [8118, 1], + [8118, 0, "$"], + [8119, 0, "A"], + [8120, 0, "("], + [8121, 0, "\\"], + [8122, 0, "m"], + [8123, 0, "a"], + [8124, 0, "t"], + [8125, 0, "h"], + [8126, 0, "i"], + [8127, 0, "t"], + [8128, 0, "{"], + [8129, 0, "i"], + [8130, 0, "d"], + [8131, 0, "}"], + [8132, 0, "$"], + [8132, 1], + [8132, 0, ")"], + [8133, 0, "$"], + [8134, 0, " "], + [8060, 0, "\n"], + [8061, 0, "N"], + [8062, 0, "o"], + [8063, 0, "t"], + [8064, 0, "e"], + [8065, 0, " "], + [8066, 0, "t"], + [8067, 0, "h"], + [8068, 0, "a"], + [8069, 0, "t"], + [8070, 0, " "], + [8071, 0, "t"], + [8072, 0, "h"], + [8073, 0, "e"], + [8074, 0, " "], + [8074, 1], + [8073, 1], + [8072, 1], + [8071, 1], + [8071, 0, "a"], + [8072, 0, "p"], + [8073, 0, "p"], + [8074, 0, "l"], + [8075, 0, "y"], + [8076, 0, "i"], + [8077, 0, "n"], + [8078, 0, "g"], + [8079, 0, " "], + [8080, 0, "$"], + [8081, 0, "\\"], + [8082, 0, "m"], + [8083, 0, "a"], + [8084, 0, "t"], + [8085, 0, "h"], + [8086, 0, "s"], + [8087, 0, "f"], + [8088, 0, "{"], + [8089, 0, "d"], + [8090, 0, "e"], + [8091, 0, "l"], + [8092, 0, "e"], + [8093, 0, "t"], + [8094, 0, "e"], + [8095, 0, "}"], + [8096, 0, "("], + [8097, 0, "\\"], + [8098, 0, "m"], + [8099, 0, "a"], + [8100, 0, "t"], + [8101, 0, "h"], + [8102, 0, "i"], + [8103, 0, "t"], + [8104, 0, "{"], + [8105, 0, "i"], + [8106, 0, "d"], + [8107, 0, "}"], + [8108, 0, ")"], + [8109, 0, "$"], + [8110, 0, " "], + [8145, 1], + [8144, 1], + [8143, 1], + [8142, 1], + [8141, 1], + [8140, 1], + [8139, 1], + [8138, 1], + [8137, 1], + [8136, 1], + [8135, 1], + [8134, 1], + [8133, 1], + [8132, 1], + [8131, 1], + [8130, 1], + [8129, 1], + [8128, 1], + [8127, 1], + [8126, 1], + [8125, 1], + [8124, 1], + [8123, 1], + [8122, 1], + [8121, 1], + [8120, 1], + [8119, 1], + [8118, 1], + [8117, 1], + [8116, 1], + [8115, 1], + [8114, 1], + [8113, 1], + [8112, 1], + [8111, 1], + [8116, 1], + [8116, 0, "i"], + [8117, 0, "e"], + [8118, 0, "s"], + [8119, 0, " "], + [8120, 0, "o"], + [8121, 0, "n"], + [8122, 0, "l"], + [8123, 0, "y"], + [8158, 0, "i"], + [8159, 0, "n"], + [8160, 0, " "], + [8161, 0, "t"], + [8162, 0, "h"], + [8163, 0, "e"], + [8164, 0, " "], + [8165, 0, "s"], + [8166, 0, "t"], + [8167, 0, "a"], + [8168, 0, "t"], + [8169, 0, "e"], + [8170, 0, " "], + [8157, 0, ","], + [8160, 1], + [8159, 1], + [8159, 0, "a"], + [8160, 0, "n"], + [8161, 0, "d"], + [8162, 0, " "], + [8163, 0, "o"], + [8164, 0, "t"], + [8165, 0, "h"], + [8166, 0, "e"], + [8167, 0, "r"], + [8168, 0, "w"], + [8169, 0, "i"], + [8170, 0, "s"], + [8171, 0, "e"], + [8172, 0, " "], + [8173, 0, "l"], + [8174, 0, "e"], + [8175, 0, "a"], + [8176, 0, "v"], + [8177, 0, "e"], + [8178, 0, "s"], + [8190, 0, "$"], + [8191, 0, "A"], + [8192, 0, "$"], + [8193, 0, " "], + [8194, 0, "u"], + [8195, 0, "n"], + [8196, 0, "c"], + [8197, 0, "h"], + [8198, 0, "a"], + [8199, 0, "n"], + [8200, 0, "g"], + [8201, 0, "e"], + [8202, 0, "d"], + [8203, 0, "."], + [8204, 0, " "], + [8205, 0, "T"], + [8206, 0, "h"], + [8207, 0, "e"], + [8208, 0, " "], + [8209, 0, "o"], + [8210, 0, "p"], + [8211, 0, "e"], + [8212, 0, "r"], + [8213, 0, "a"], + [8214, 0, "t"], + [8215, 0, "i"], + [8216, 0, "o"], + [8217, 0, "n"], + [8218, 0, " "], + [8219, 0, "c"], + [8220, 0, "a"], + [8221, 0, "n"], + [8222, 0, " "], + [8223, 0, "t"], + [8224, 0, "h"], + [8225, 0, "u"], + [8226, 0, "s"], + [8227, 0, " "], + [8228, 0, "o"], + [8229, 0, "n"], + [8230, 0, "l"], + [8231, 0, "y"], + [8232, 0, " "], + [8233, 0, "i"], + [8234, 0, "n"], + [8235, 0, "t"], + [8236, 0, "e"], + [8237, 0, "r"], + [8238, 0, "a"], + [8239, 0, "c"], + [8240, 0, "t"], + [8241, 0, " "], + [8242, 0, "w"], + [8243, 0, "i"], + [8244, 0, "t"], + [8245, 0, "h"], + [8246, 0, " "], + [8247, 0, "a"], + [8248, 0, "n"], + [8249, 0, "o"], + [8250, 0, "t"], + [8251, 0, "h"], + [8252, 0, "e"], + [8253, 0, "r"], + [8254, 0, " "], + [8255, 0, "o"], + [8256, 0, "p"], + [8257, 0, "e"], + [8258, 0, "r"], + [8259, 0, "a"], + [8260, 0, "t"], + [8261, 0, "i"], + [8262, 0, "o"], + [8263, 0, "n"], + [8264, 0, " "], + [8265, 0, "t"], + [8266, 0, "h"], + [8267, 0, "a"], + [8268, 0, "t"], + [8269, 0, " "], + [8270, 0, "m"], + [8271, 0, "o"], + [8272, 0, "d"], + [8273, 0, "i"], + [8274, 0, "f"], + [8275, 0, "i"], + [8276, 0, "e"], + [8277, 0, "s"], + [8278, 0, " "], + [8279, 0, "t"], + [8280, 0, "h"], + [8281, 0, "e"], + [8282, 0, " "], + [8283, 0, "m"], + [8284, 0, "a"], + [8285, 0, "p"], + [8286, 0, "p"], + [8287, 0, "i"], + [8288, 0, "n"], + [8289, 0, "g"], + [8290, 0, " "], + [8291, 0, "f"], + [8292, 0, "o"], + [8293, 0, "r"], + [8294, 0, " "], + [8295, 0, "$"], + [8296, 0, "A"], + [8297, 0, "("], + [8298, 0, "\\"], + [8299, 0, "m"], + [8300, 0, "a"], + [8301, 0, "t"], + [8302, 0, "h"], + [8303, 0, "i"], + [8304, 0, "t"], + [8305, 0, "{"], + [8306, 0, "i"], + [8307, 0, "d"], + [8308, 0, "}"], + [8309, 0, ")"], + [8310, 0, "$"], + [8311, 0, ";"], + [8312, 0, " "], + [8313, 0, "i"], + [8314, 0, "t"], + [8315, 0, " "], + [8316, 0, "i"], + [8317, 0, "s"], + [8318, 0, " "], + [8319, 0, "t"], + [8320, 0, "r"], + [8321, 0, "i"], + [8322, 0, "v"], + [8323, 0, "i"], + [8324, 0, "a"], + [8325, 0, "l"], + [8326, 0, "l"], + [8327, 0, "y"], + [8328, 0, " "], + [8311, 1], + [8311, 0, ","], + [8312, 0, " "], + [8313, 0, "a"], + [8314, 0, "n"], + [8315, 0, "d"], + [8333, 0, "c"], + [8334, 0, "o"], + [8335, 0, "m"], + [8336, 0, "m"], + [8337, 0, "u"], + [8338, 0, "t"], + [8339, 0, "a"], + [8340, 0, "t"], + [8341, 0, "i"], + [8342, 0, "v"], + [8343, 0, "e"], + [8344, 0, " "], + [8345, 0, "w"], + [8346, 0, "i"], + [8347, 0, "t"], + [8348, 0, "h"], + [8349, 0, " "], + [8350, 0, "r"], + [8351, 0, "e"], + [8352, 0, "s"], + [8353, 0, "p"], + [8354, 0, "e"], + [8355, 0, "c"], + [8356, 0, "t"], + [8357, 0, " "], + [8358, 0, "t"], + [8359, 0, "o"], + [8360, 0, " "], + [8361, 0, "a"], + [8203, 0, ","], + [8204, 0, " "], + [8205, 0, "s"], + [8206, 0, "o"], + [8207, 0, " "], + [8208, 0, "i"], + [8209, 0, "t"], + [8210, 0, " "], + [8211, 0, "i"], + [8212, 0, "s"], + [8213, 0, " "], + [8214, 0, "t"], + [8215, 0, "r"], + [8216, 0, "i"], + [8217, 0, "v"], + [8218, 0, "i"], + [8219, 0, "a"], + [8220, 0, "l"], + [8221, 0, "l"], + [8222, 0, "y"], + [8223, 0, " "], + [8224, 0, "c"], + [8225, 0, "o"], + [8226, 0, "m"], + [8227, 0, "m"], + [8228, 0, "u"], + [8229, 0, "t"], + [8230, 0, "a"], + [8231, 0, "t"], + [8232, 0, "i"], + [8233, 0, "v"], + [8234, 0, "e"], + [8235, 0, " "], + [8236, 0, "w"], + [8237, 0, "i"], + [8238, 0, "t"], + [8239, 0, "h"], + [8240, 0, " "], + [8241, 0, "r"], + [8242, 0, "e"], + [8243, 0, "s"], + [8244, 0, "p"], + [8245, 0, "e"], + [8246, 0, "c"], + [8247, 0, "t"], + [8248, 0, " "], + [8249, 0, "t"], + [8250, 0, "o"], + [8251, 0, " "], + [8252, 0, "a"], + [8253, 0, "n"], + [8254, 0, "y"], + [8255, 0, " "], + [8256, 0, "o"], + [8257, 0, "p"], + [8258, 0, "e"], + [8259, 0, "r"], + [8260, 0, "a"], + [8261, 0, "t"], + [8262, 0, "i"], + [8263, 0, "o"], + [8264, 0, "n"], + [8265, 0, " "], + [8266, 0, "t"], + [8267, 0, "h"], + [8268, 0, "a"], + [8269, 0, "t"], + [8270, 0, " "], + [8271, 0, "d"], + [8272, 0, "o"], + [8273, 0, "e"], + [8274, 0, "s"], + [8275, 0, " "], + [8276, 0, "n"], + [8277, 0, "o"], + [8278, 0, "t"], + [8279, 0, " "], + [8280, 0, "m"], + [8281, 0, "o"], + [8282, 0, "d"], + [8283, 0, "i"], + [8284, 0, "f"], + [8285, 0, "y"], + [8286, 0, " "], + [8287, 0, "o"], + [8288, 0, "r"], + [8289, 0, " "], + [8290, 0, "d"], + [8291, 0, "e"], + [8292, 0, "p"], + [8293, 0, "e"], + [8294, 0, "n"], + [8295, 0, "d"], + [8296, 0, " "], + [8297, 0, "o"], + [8298, 0, "n"], + [8299, 0, " "], + [8300, 0, "$"], + [8301, 0, "A"], + [8302, 0, "("], + [8303, 0, "\\"], + [8304, 0, "m"], + [8305, 0, "a"], + [8306, 0, "t"], + [8307, 0, "h"], + [8308, 0, "i"], + [8309, 0, "t"], + [8310, 0, "{"], + [8311, 0, "i"], + [8312, 0, "d"], + [8313, 0, "}"], + [8314, 0, ")"], + [8315, 0, "$"], + [8317, 0, "\n"], + [8318, 0, "\n"], + [7539, 0, "\n"], + [7540, 0, "\\"], + [7541, 0, "s"], + [7542, 0, "u"], + [7543, 0, "b"], + [7544, 0, "s"], + [7545, 0, "u"], + [7546, 0, "b"], + [7547, 0, "s"], + [7548, 0, "e"], + [7549, 0, "c"], + [7550, 0, "t"], + [7551, 0, "i"], + [7552, 0, "o"], + [7553, 0, "n"], + [7554, 0, "{"], + [7555, 0, "D"], + [7556, 0, "e"], + [7557, 0, "l"], + [7558, 0, "e"], + [7559, 0, "t"], + [7560, 0, "i"], + [7561, 0, "o"], + [7562, 0, "n"], + [7563, 0, "}"], + [7564, 0, "\n"], + [7555, 0, "C"], + [7556, 0, "o"], + [7557, 0, "m"], + [7558, 0, "m"], + [7559, 0, "u"], + [7560, 0, "t"], + [7561, 0, "a"], + [7562, 0, "t"], + [7563, 0, "i"], + [7564, 0, "v"], + [7565, 0, "i"], + [7566, 0, "t"], + [7567, 0, "y"], + [7568, 0, " "], + [7569, 0, "o"], + [7570, 0, "f"], + [7571, 0, " "], + [7572, 1], + [7572, 0, "d"], + [8519, 1], + [8518, 1], + [8517, 1], + [8516, 1], + [8515, 1], + [8514, 1], + [8513, 1], + [8512, 1], + [8511, 1], + [8510, 1], + [8509, 1], + [8508, 1], + [8507, 1], + [8506, 1], + [8505, 1], + [8504, 1], + [8503, 1], + [8502, 1], + [8501, 1], + [8500, 1], + [8499, 1], + [8498, 1], + [8497, 1], + [8496, 1], + [8495, 1], + [8494, 1], + [8493, 1], + [8492, 1], + [8491, 1], + [8490, 1], + [8489, 1], + [8488, 1], + [8487, 1], + [8486, 1], + [8485, 1], + [8484, 1], + [8483, 1], + [8482, 1], + [8481, 1], + [8480, 1], + [8479, 1], + [8478, 1], + [8477, 1], + [8476, 1], + [8475, 1], + [8474, 1], + [8473, 1], + [8472, 1], + [8471, 1], + [8470, 1], + [8469, 1], + [8468, 1], + [8467, 1], + [8466, 1], + [8465, 1], + [8464, 1], + [8463, 1], + [8462, 1], + [8461, 1], + [8460, 1], + [8459, 1], + [8458, 1], + [8457, 1], + [8456, 1], + [8455, 1], + [8454, 1], + [8453, 1], + [8452, 1], + [8451, 1], + [8450, 1], + [8449, 1], + [8448, 1], + [8447, 1], + [8446, 1], + [8445, 1], + [8444, 1], + [8443, 1], + [8442, 1], + [8441, 1], + [8440, 1], + [8439, 1], + [8438, 1], + [8437, 1], + [8436, 1], + [8435, 1], + [8434, 1], + [8433, 1], + [8432, 1], + [8431, 1], + [8430, 1], + [8429, 1], + [8428, 1], + [8427, 1], + [8426, 1], + [8425, 1], + [8424, 1], + [8423, 1], + [8422, 1], + [8421, 1], + [8420, 1], + [8419, 1], + [8418, 1], + [8417, 1], + [8416, 1], + [8415, 1], + [8414, 1], + [8413, 1], + [8412, 1], + [8411, 1], + [8410, 1], + [8409, 1], + [8408, 1], + [8407, 1], + [8406, 1], + [8405, 1], + [8404, 1], + [8403, 1], + [8402, 1], + [8401, 1], + [8400, 1], + [8399, 1], + [8398, 1], + [8397, 1], + [8396, 1], + [8395, 1], + [8394, 1], + [8393, 1], + [8392, 1], + [8391, 1], + [8390, 1], + [8389, 1], + [8388, 1], + [8387, 1], + [8386, 1], + [8385, 1], + [8384, 1], + [8383, 1], + [8382, 1], + [8381, 1], + [8380, 1], + [8379, 1], + [8378, 1], + [8377, 1], + [8376, 1], + [8375, 1], + [8374, 1], + [8373, 1], + [8372, 1], + [8371, 1], + [8370, 1], + [8369, 1], + [8368, 1], + [8367, 1], + [8366, 1], + [8365, 1], + [8364, 1], + [8363, 1], + [8362, 1], + [7742, 1], + [7741, 1], + [7741, 0, "e"], + [7742, 0, "x"], + [7743, 0, "i"], + [7744, 0, "s"], + [7745, 0, "t"], + [8365, 0, "T"], + [8366, 0, "h"], + [8367, 0, "e"], + [8368, 0, " "], + [8369, 0, "f"], + [8370, 0, "i"], + [8371, 0, "r"], + [8372, 0, "s"], + [8373, 0, "t"], + [8374, 0, " "], + [8375, 0, "k"], + [8376, 0, "i"], + [8377, 0, "n"], + [8378, 0, "d"], + [8379, 0, " "], + [8380, 0, "o"], + [8381, 0, "f"], + [8382, 0, " "], + [8383, 0, "o"], + [8384, 0, "p"], + [8385, 0, "e"], + [8386, 0, "r"], + [8387, 0, "a"], + [8388, 0, "t"], + [8389, 0, "i"], + [8390, 0, "o"], + [8391, 0, "n"], + [8392, 0, " "], + [8393, 0, "t"], + [8394, 0, "h"], + [8395, 0, "a"], + [8396, 0, "t"], + [8397, 0, " "], + [8398, 0, "c"], + [8399, 0, "a"], + [8400, 0, "n"], + [8401, 0, " "], + [8402, 0, "a"], + [8402, 1], + [8402, 0, "m"], + [8403, 0, "o"], + [8404, 0, "d"], + [8405, 0, "i"], + [8406, 0, "f"], + [8407, 0, "y"], + [8408, 0, " "], + [8409, 0, "t"], + [8410, 0, "h"], + [8411, 0, "e"], + [8412, 0, " "], + [8413, 0, "s"], + [8414, 0, "a"], + [8415, 0, "m"], + [8416, 0, "e"], + [8417, 0, " "], + [8418, 0, "$"], + [8419, 0, "A"], + [8420, 0, "("], + [8421, 0, "\\"], + [8422, 0, "m"], + [8423, 0, "a"], + [8424, 0, "t"], + [8425, 0, "h"], + [8426, 0, "i"], + [8427, 0, "t"], + [8428, 0, "{"], + [8429, 0, "i"], + [8430, 0, "d"], + [8431, 0, "}"], + [8432, 0, ")"], + [8433, 0, "$"], + [8434, 0, " "], + [8435, 0, "i"], + [8436, 0, "s"], + [8437, 0, " "], + [8438, 0, "a"], + [8439, 0, " "], + [8440, 0, "$"], + [8441, 0, "\\"], + [8442, 0, "m"], + [8443, 0, "a"], + [8444, 0, "t"], + [8445, 0, "h"], + [8446, 0, "s"], + [8447, 0, "f"], + [8448, 0, "{"], + [8449, 0, "d"], + [8450, 0, "e"], + [8451, 0, "l"], + [8452, 0, "e"], + [8453, 0, "t"], + [8454, 0, "e"], + [8455, 0, "}"], + [8456, 0, "$"], + [8457, 0, " "], + [8458, 0, "o"], + [8459, 0, "p"], + [8460, 0, "e"], + [8461, 0, "r"], + [8462, 0, "a"], + [8463, 0, "t"], + [8464, 0, "i"], + [8465, 0, "o"], + [8466, 0, "n"], + [8467, 0, " "], + [8468, 0, "f"], + [8469, 0, "o"], + [8470, 0, "r"], + [8471, 0, " "], + [8472, 0, "t"], + [8473, 0, "h"], + [8474, 0, "e"], + [8475, 0, " "], + [8476, 0, "s"], + [8477, 0, "a"], + [8478, 0, "m"], + [8479, 0, "e"], + [8480, 0, " "], + [8481, 0, "l"], + [8482, 0, "i"], + [8483, 0, "s"], + [8484, 0, "t"], + [8485, 0, " "], + [8486, 0, "e"], + [8487, 0, "l"], + [8488, 0, "e"], + [8489, 0, "m"], + [8490, 0, "e"], + [8491, 0, "n"], + [8492, 0, "t"], + [8493, 0, " "], + [8494, 0, "$"], + [8495, 0, "\\"], + [8496, 0, "m"], + [8497, 0, "a"], + [8498, 0, "t"], + [8499, 0, "h"], + [8500, 0, "i"], + [8501, 0, "t"], + [8502, 0, "{"], + [8503, 0, "i"], + [8504, 0, "d"], + [8505, 0, "}"], + [8506, 0, "$"], + [8507, 0, "."], + [8508, 0, " "], + [8509, 0, "A"], + [8510, 0, "s"], + [8511, 0, " "], + [8512, 0, "t"], + [8513, 0, "h"], + [8514, 0, "e"], + [8515, 0, " "], + [8516, 0, "r"], + [8517, 0, "u"], + [8518, 0, "l"], + [8519, 0, "e"], + [8520, 0, " "], + [8521, 0, "f"], + [8522, 0, "o"], + [8523, 0, "r"], + [8524, 0, " "], + [8525, 0, "a"], + [8526, 0, "p"], + [8527, 0, "p"], + [8528, 0, "l"], + [8529, 0, "y"], + [8530, 0, "i"], + [8531, 0, "n"], + [8532, 0, "g"], + [8533, 0, " "], + [8534, 0, "t"], + [8535, 0, "h"], + [8536, 0, "i"], + [8537, 0, "s"], + [8538, 0, " "], + [8539, 0, "o"], + [8540, 0, "p"], + [8541, 0, "e"], + [8542, 0, "r"], + [8543, 0, "a"], + [8544, 0, "t"], + [8545, 0, "i"], + [8546, 0, "o"], + [8547, 0, "n"], + [8548, 0, " "], + [8549, 0, "i"], + [8550, 0, "s"], + [8551, 0, " "], + [8552, 0, "i"], + [8553, 0, "d"], + [8554, 0, "e"], + [8555, 0, "m"], + [8556, 0, "p"], + [8557, 0, "o"], + [8558, 0, "t"], + [8559, 0, "e"], + [8560, 0, "n"], + [8561, 0, "t"], + [8562, 0, ","], + [8563, 0, " "], + [8564, 0, "t"], + [8565, 0, "h"], + [8566, 0, "e"], + [8567, 0, " "], + [8568, 0, "p"], + [8569, 0, "r"], + [8570, 0, "e"], + [8571, 0, "s"], + [8572, 0, "e"], + [8573, 0, "n"], + [8574, 0, "c"], + [8575, 0, "e"], + [8576, 0, " "], + [8577, 0, "o"], + [8578, 0, "f"], + [8579, 0, " "], + [8580, 0, "a"], + [8581, 0, "n"], + [8582, 0, "y"], + [8583, 0, " "], + [8584, 0, "o"], + [8585, 0, "t"], + [8586, 0, "h"], + [8587, 0, "e"], + [8588, 0, "r"], + [8589, 0, " "], + [8590, 0, "$"], + [8591, 0, "\\"], + [8592, 0, "m"], + [8593, 0, "a"], + [8594, 0, "t"], + [8595, 0, "h"], + [8596, 0, "s"], + [8597, 0, "f"], + [8598, 0, "{"], + [8599, 0, "d"], + [8600, 0, "e"], + [8601, 0, "l"], + [8602, 0, "e"], + [8603, 0, "t"], + [8604, 0, "e"], + [8605, 0, "}"], + [8606, 0, "("], + [8607, 0, "\\"], + [8608, 0, "m"], + [8609, 0, "a"], + [8610, 0, "t"], + [8611, 0, "h"], + [8612, 0, "i"], + [8613, 0, "t"], + [8614, 0, "{"], + [8615, 0, "i"], + [8616, 0, "d"], + [8617, 0, "}"], + [8618, 0, ")"], + [8619, 0, "$"], + [8620, 0, " "], + [8621, 0, "o"], + [8622, 0, "p"], + [8623, 0, "e"], + [8624, 0, "r"], + [8625, 0, "a"], + [8626, 0, "t"], + [8627, 0, "i"], + [8628, 0, "o"], + [8629, 0, "n"], + [8630, 0, "s"], + [8631, 0, " "], + [8632, 0, "b"], + [8633, 0, "e"], + [8634, 0, "f"], + [8635, 0, "o"], + [8636, 0, "r"], + [8637, 0, "e"], + [8638, 0, " "], + [8639, 0, "o"], + [8640, 0, "r"], + [8641, 0, " "], + [8642, 0, "a"], + [8643, 0, "f"], + [8644, 0, "t"], + [8645, 0, "e"], + [8646, 0, "r"], + [8647, 0, " "], + [8648, 0, "$"], + [8649, 0, "{"], + [8649, 1], + [8649, 0, "o"], + [8650, 0, "_"], + [8651, 0, "{"], + [8652, 0, "n"], + [8653, 0, "+"], + [8654, 0, "1"], + [8655, 0, "}"], + [8656, 0, "$"], + [8657, 0, " "], + [8658, 0, "i"], + [8659, 0, "n"], + [8660, 0, " "], + [8661, 0, "t"], + [8662, 0, "h"], + [8663, 0, "e"], + [8664, 0, " "], + [8665, 0, "h"], + [8666, 0, "i"], + [8667, 0, "s"], + [8668, 0, "t"], + [8669, 0, "o"], + [8670, 0, "r"], + [8671, 0, "y"], + [8672, 0, " "], + [8673, 0, "d"], + [8674, 0, "o"], + [8675, 0, "e"], + [8676, 0, "s"], + [8677, 0, " "], + [8678, 0, "n"], + [8679, 0, "o"], + [8680, 0, "t"], + [8681, 0, " "], + [8682, 0, "h"], + [8683, 0, "a"], + [8684, 0, "v"], + [8685, 0, "e"], + [8686, 0, " "], + [8687, 0, "a"], + [8688, 0, "n"], + [8689, 0, "y"], + [8690, 0, " "], + [8691, 0, "e"], + [8692, 0, "f"], + [8693, 0, "f"], + [8694, 0, "e"], + [8695, 0, "c"], + [8696, 0, "t"], + [8697, 0, " "], + [8698, 0, "o"], + [8699, 0, "n"], + [8700, 0, " "], + [8701, 0, "t"], + [8702, 0, "h"], + [8703, 0, "e"], + [8704, 0, " "], + [8705, 0, "f"], + [8706, 0, "i"], + [8707, 0, "n"], + [8708, 0, "a"], + [8709, 0, "l"], + [8710, 0, " "], + [8711, 0, "s"], + [8712, 0, "t"], + [8713, 0, "a"], + [8714, 0, "t"], + [8715, 0, "e"], + [8716, 0, "."], + [8717, 0, "\n"], + [8718, 0, "\n"], + [8719, 0, "T"], + [8720, 0, "h"], + [8721, 0, "e"], + [8722, 0, " "], + [8723, 0, "o"], + [8724, 0, "n"], + [8725, 0, "l"], + [8726, 0, "y"], + [8727, 0, " "], + [8728, 0, "o"], + [8729, 0, "t"], + [8730, 0, "h"], + [8731, 0, "e"], + [8732, 0, "r"], + [8733, 0, " "], + [8734, 0, "k"], + [8735, 0, "i"], + [8736, 0, "n"], + [8737, 0, "d"], + [8738, 0, " "], + [8739, 0, "o"], + [8740, 0, "f"], + [8741, 0, " "], + [8742, 0, "o"], + [8743, 0, "p"], + [8744, 0, "e"], + [8745, 0, "r"], + [8746, 0, "a"], + [8747, 0, "t"], + [8748, 0, "i"], + [8749, 0, "o"], + [8750, 0, "n"], + [8751, 0, " "], + [8752, 0, "t"], + [8753, 0, "h"], + [8754, 0, "a"], + [8755, 0, "t"], + [8756, 0, " "], + [8757, 0, "c"], + [8758, 0, "a"], + [8759, 0, "n"], + [8760, 0, " "], + [8761, 0, "d"], + [8762, 0, "e"], + [8763, 0, "p"], + [8764, 0, "e"], + [8765, 0, "n"], + [8766, 0, "d"], + [8767, 0, " "], + [8768, 0, "o"], + [8769, 0, "n"], + [8770, 0, " "], + [8771, 0, "o"], + [8772, 0, "r"], + [8773, 0, " "], + [8774, 0, "m"], + [8775, 0, "o"], + [8776, 0, "d"], + [8777, 0, "i"], + [8778, 0, "f"], + [8779, 0, "y"], + [8780, 0, " "], + [8781, 0, "$"], + [8782, 0, "A"], + [8783, 0, "("], + [8784, 0, "\\"], + [8785, 0, "m"], + [8786, 0, "a"], + [8787, 0, "t"], + [8788, 0, "h"], + [8789, 0, "i"], + [8790, 0, "t"], + [8791, 0, "{"], + [8792, 0, "i"], + [8793, 0, "d"], + [8794, 0, "}"], + [8795, 0, ")"], + [8796, 0, "$"], + [8797, 0, " "], + [8798, 0, "i"], + [8799, 0, "s"], + [8800, 0, " "], + [8801, 0, "a"], + [8802, 0, "n"], + [8803, 0, " "], + [8804, 0, "\\"], + [8804, 1], + [8804, 0, "$"], + [8805, 0, "\\"], + [8806, 0, "m"], + [8807, 0, "a"], + [8808, 0, "t"], + [8809, 0, "h"], + [8810, 0, "s"], + [8811, 0, "f"], + [8812, 0, "{"], + [8813, 0, "i"], + [8814, 0, "n"], + [8815, 0, "s"], + [8816, 0, "e"], + [8817, 0, "r"], + [8818, 0, "t"], + [8819, 0, "}"], + [8820, 0, "$"], + [8821, 0, " "], + [8822, 0, "o"], + [8823, 0, "p"], + [8824, 0, "e"], + [8825, 0, "r"], + [8826, 0, "a"], + [8827, 0, "t"], + [8828, 0, "i"], + [8829, 0, "o"], + [8830, 0, "n"], + [8831, 0, " "], + [8832, 0, "i"], + [8833, 0, "n"], + [8834, 0, " "], + [8835, 0, "w"], + [8836, 0, "h"], + [8837, 0, "i"], + [8838, 0, "c"], + [8839, 0, "h"], + [8840, 0, " "], + [8840, 1], + [8839, 1], + [8838, 1], + [8837, 1], + [8836, 1], + [8835, 1], + [8834, 1], + [8833, 1], + [8832, 1], + [8831, 1], + [8820, 0, "("], + [8821, 0, "\\"], + [8822, 0, "p"], + [8823, 0, "l"], + [8824, 0, "a"], + [8825, 0, "c"], + [8826, 0, "e"], + [8827, 0, "h"], + [8828, 0, "o"], + [8829, 0, "l"], + [8830, 0, "d"], + [8831, 0, "e"], + [8832, 0, "r"], + [8833, 0, ","], + [8834, 0, " "], + [8835, 0, "\\"], + [8836, 0, "m"], + [8837, 0, "a"], + [8838, 0, "t"], + [8839, 0, "h"], + [8840, 0, "i"], + [8841, 0, "t"], + [8842, 0, "{"], + [8843, 0, "i"], + [8844, 0, "d"], + [8845, 0, "}"], + [8846, 0, ","], + [8847, 0, " "], + [8848, 0, "\\"], + [8849, 0, "p"], + [8850, 0, "l"], + [8851, 0, "a"], + [8852, 0, "c"], + [8853, 0, "e"], + [8854, 0, "h"], + [8855, 0, "o"], + [8856, 0, "l"], + [8857, 0, "d"], + [8858, 0, "e"], + [8859, 0, "r"], + [8860, 0, ")"], + [8872, 0, "."], + [8719, 0, " "], + [8719, 0, "W"], + [8720, 0, "e"], + [8721, 0, " "], + [8722, 0, "s"], + [8723, 0, "h"], + [8724, 0, "o"], + [8725, 0, "w"], + [8726, 0, "e"], + [8727, 0, "d"], + [8728, 0, " "], + [8729, 0, "t"], + [8730, 0, "h"], + [8731, 0, "a"], + [8732, 0, "t"], + [8733, 0, " "], + [8734, 0, "a"], + [8735, 0, "n"], + [8736, 0, " "], + [8737, 0, "$"], + [8738, 0, "\\"], + [8739, 0, "m"], + [8740, 0, "a"], + [8741, 0, "t"], + [8742, 0, "h"], + [8743, 0, "s"], + [8744, 0, "f"], + [8745, 0, "{"], + [8746, 0, "i"], + [8747, 0, "n"], + [8748, 0, "s"], + [8749, 0, "e"], + [8750, 0, "r"], + [8751, 0, "t"], + [8752, 0, "}"], + [8753, 0, "("], + [8754, 0, "\\"], + [8755, 0, "m"], + [8756, 0, "a"], + [8757, 0, "t"], + [8758, 0, "h"], + [8759, 0, "i"], + [8760, 0, "t"], + [8761, 0, "{"], + [8762, 0, "i"], + [8763, 0, "d"], + [8764, 0, "}"], + [8765, 0, ","], + [8766, 0, " "], + [8767, 0, "\\"], + [8768, 0, "p"], + [8769, 0, "l"], + [8770, 0, "a"], + [8771, 0, "c"], + [8772, 0, "e"], + [8773, 0, "h"], + [8774, 0, "o"], + [8775, 0, "l"], + [8776, 0, "d"], + [8777, 0, "e"], + [8778, 0, "r"], + [8779, 0, ","], + [8780, 0, " "], + [8781, 0, "\\"], + [8782, 0, "p"], + [8783, 0, "l"], + [8784, 0, "a"], + [8785, 0, "c"], + [8786, 0, "e"], + [8787, 0, "h"], + [8788, 0, "o"], + [8789, 0, "l"], + [8790, 0, "d"], + [8791, 0, "e"], + [8792, 0, "r"], + [8793, 0, ")"], + [8794, 0, "$"], + [8795, 0, " "], + [8796, 0, "o"], + [8797, 0, "p"], + [8798, 0, "e"], + [8799, 0, "r"], + [8800, 0, "a"], + [8801, 0, "t"], + [8802, 0, "i"], + [8803, 0, "o"], + [8804, 0, "n"], + [8805, 0, " "], + [8806, 0, "c"], + [8807, 0, "a"], + [8808, 0, "n"], + [8809, 0, " "], + [8810, 0, "o"], + [8811, 0, "n"], + [8812, 0, "l"], + [8813, 0, "y"], + [8814, 0, " "], + [8815, 0, "o"], + [8816, 0, "c"], + [8817, 0, "c"], + [8818, 0, "u"], + [8819, 0, "r"], + [8820, 0, " "], + [8821, 0, "p"], + [8822, 0, "r"], + [8823, 0, "i"], + [8824, 0, "o"], + [8825, 0, "r"], + [8826, 0, " "], + [8827, 0, "t"], + [8828, 0, "o"], + [8829, 0, " "], + [8830, 0, "$"], + [8831, 0, "\\"], + [8832, 0, "m"], + [8833, 0, "a"], + [8834, 0, "t"], + [8835, 0, "h"], + [8836, 0, "s"], + [8837, 0, "f"], + [8838, 0, "{"], + [8839, 0, "d"], + [8840, 0, "e"], + [8841, 0, "l"], + [8842, 0, "e"], + [8843, 0, "t"], + [8844, 0, "e"], + [8845, 0, "}"], + [8846, 0, "("], + [8847, 0, "\\"], + [8848, 0, "m"], + [8849, 0, "a"], + [8850, 0, "t"], + [8851, 0, "h"], + [8852, 0, "i"], + [8853, 0, "t"], + [8854, 0, "{"], + [8855, 0, "i"], + [8856, 0, "d"], + [8857, 0, "}"], + [8858, 0, ")"], + [8859, 0, "$"], + [8860, 0, "."], + [8861, 0, " "], + [8862, 0, "T"], + [8863, 0, "h"], + [8864, 0, "u"], + [8865, 0, "s"], + [8866, 0, ","], + [8868, 1], + [8868, 0, "t"], + [9021, 0, ","], + [9022, 0, " "], + [9023, 0, "o"], + [9024, 0, "r"], + [9025, 0, " "], + [9026, 0, "a"], + [9027, 0, " "], + [9028, 0, "r"], + [9029, 0, "e"], + [9030, 0, "c"], + [9031, 0, "u"], + [9032, 0, "r"], + [9033, 0, "s"], + [9034, 0, "i"], + [9035, 0, "v"], + [9036, 0, "e"], + [9037, 0, " "], + [9038, 0, "c"], + [9039, 0, "a"], + [9040, 0, "l"], + [9041, 0, "l"], + [9042, 0, " "], + [9043, 0, "t"], + [9044, 0, "o"], + [9045, 0, " "], + [9046, 0, "t"], + [9047, 0, "h"], + [9048, 0, "e"], + [9049, 0, " "], + [9050, 0, "$"], + [9051, 0, "\\"], + [9052, 0, "m"], + [9053, 0, "a"], + [9054, 0, "t"], + [9055, 0, "h"], + [9056, 0, "r"], + [9057, 0, "m"], + [9058, 0, "{"], + [9059, 0, "a"], + [9060, 0, "p"], + [9061, 0, "p"], + [9062, 0, "l"], + [9063, 0, "y"], + [9064, 0, "}"], + [9065, 0, "$"], + [9066, 0, " "], + [9067, 0, "f"], + [9068, 0, "u"], + [9069, 0, "n"], + [9070, 0, "c"], + [9071, 0, "t"], + [9072, 0, "i"], + [9073, 0, "o"], + [9074, 0, "n"], + [9075, 0, " "], + [9076, 0, "t"], + [9077, 0, "h"], + [9078, 0, "a"], + [9079, 0, "t"], + [9080, 0, " "], + [9081, 0, "u"], + [9082, 0, "s"], + [9083, 0, "e"], + [9084, 0, "s"], + [9085, 0, " "], + [9086, 0, "s"], + [9087, 0, "u"], + [9088, 0, "c"], + [9089, 0, "h"], + [9090, 0, " "], + [9091, 0, "a"], + [9092, 0, "n"], + [9093, 0, " "], + [9094, 0, "o"], + [9095, 0, "p"], + [9096, 0, "e"], + [9097, 0, "r"], + [9098, 0, "a"], + [9099, 0, "t"], + [9100, 0, "i"], + [9101, 0, "o"], + [9102, 0, "n"], + [9103, 0, " "], + [9104, 0, "i"], + [9105, 0, "n"], + [9106, 0, "t"], + [9107, 0, "e"], + [9108, 0, "r"], + [9109, 0, "n"], + [9110, 0, "a"], + [9111, 0, "l"], + [9112, 0, "l"], + [9113, 0, "y"], + [9115, 0, " "], + [9116, 0, "N"], + [9117, 0, "o"], + [9118, 0, "t"], + [9119, 0, "e"], + [9120, 0, " "], + [9121, 0, "t"], + [9122, 0, "h"], + [9123, 0, "a"], + [9124, 0, "t"], + [9125, 0, " "], + [9126, 0, "a"], + [9127, 0, "l"], + [9128, 0, "l"], + [9129, 0, " "], + [9130, 0, "l"], + [9131, 0, "o"], + [9132, 0, "o"], + [9133, 0, "k"], + [9134, 0, "u"], + [9135, 0, "p"], + [9136, 0, "s"], + [9137, 0, " "], + [9137, 1], + [9136, 1], + [9135, 1], + [9134, 1], + [9133, 1], + [9132, 1], + [9131, 1], + [9130, 1], + [9129, 1], + [9128, 1], + [9127, 1], + [9126, 1], + [9126, 0, "w"], + [9127, 0, "h"], + [9128, 0, "e"], + [9129, 0, "n"], + [9130, 0, " "], + [9131, 0, "a"], + [9132, 0, "p"], + [9133, 0, "p"], + [9134, 0, "l"], + [9135, 0, "y"], + [9136, 0, "i"], + [9137, 0, "n"], + [9138, 0, "g"], + [9139, 0, " "], + [9140, 0, "s"], + [9141, 0, "u"], + [9142, 0, "c"], + [9143, 0, "h"], + [9144, 0, " "], + [9145, 0, "a"], + [9146, 0, "n"], + [9147, 0, " "], + [9148, 0, "i"], + [9149, 0, "n"], + [9150, 0, "s"], + [9151, 0, "e"], + [9152, 0, "r"], + [9152, 1], + [9151, 1], + [9150, 1], + [9149, 1], + [9148, 1], + [9148, 0, "$"], + [9149, 0, "\\"], + [9150, 0, "m"], + [9151, 0, "a"], + [9152, 0, "t"], + [9153, 0, "h"], + [9154, 0, "s"], + [9155, 0, "f"], + [9156, 0, "{"], + [9157, 0, "i"], + [9158, 0, "n"], + [9159, 0, "s"], + [9160, 0, "e"], + [9161, 0, "r"], + [9162, 0, "t"], + [9163, 0, "}"], + [9164, 0, "$"], + [9165, 0, " "], + [9166, 0, "o"], + [9167, 0, "p"], + [9168, 0, "e"], + [9169, 0, "r"], + [9170, 0, "a"], + [9171, 0, "t"], + [9172, 0, "i"], + [9173, 0, "o"], + [9174, 0, "n"], + [9175, 0, ","], + [9176, 0, " "], + [9177, 0, "t"], + [9178, 0, "h"], + [9179, 0, "e"], + [9180, 0, " "], + [9181, 0, "q"], + [9182, 0, "u"], + [9183, 0, "e"], + [9184, 0, "r"], + [9185, 0, "y"], + [9186, 0, " "], + [9187, 0, "f"], + [9188, 0, "o"], + [9189, 0, "r"], + [9190, 0, " "], + [9191, 0, "$"], + [9192, 0, "A"], + [9193, 0, "("], + [9194, 0, "\\"], + [9195, 0, "m"], + [9196, 0, "a"], + [9197, 0, "t"], + [9198, 0, "h"], + [9199, 0, "i"], + [9200, 0, "t"], + [9201, 0, "{"], + [9202, 0, "p"], + [9203, 0, "r"], + [9204, 0, "e"], + [9205, 0, "v"], + [9206, 0, "}"], + [9207, 0, ")"], + [9208, 0, "$"], + [9209, 0, " "], + [9210, 0, "i"], + [9211, 0, "g"], + [9212, 0, "n"], + [9213, 0, "o"], + [9214, 0, "r"], + [9215, 0, "e"], + [9216, 0, "s"], + [9217, 0, " "], + [9218, 0, "t"], + [9219, 0, "h"], + [9220, 0, "e"], + [9221, 0, " "], + [9222, 0, "\\"], + [9223, 0, "m"], + [9224, 0, "a"], + [9225, 0, "t"], + [9226, 0, "h"], + [9227, 0, "i"], + [9228, 0, "t"], + [9229, 0, "{"], + [9230, 0, "v"], + [9231, 0, "a"], + [9232, 0, "l"], + [9233, 0, "u"], + [9234, 0, "e"], + [9235, 0, "}"], + [9222, 0, "$"], + [9237, 0, "$"], + [9238, 0, " "], + [9239, 0, "e"], + [9240, 0, "l"], + [9241, 0, "e"], + [9242, 0, "m"], + [9243, 0, "e"], + [9244, 0, "n"], + [9245, 0, "t"], + [9246, 0, " "], + [9247, 0, "o"], + [9248, 0, "f"], + [9249, 0, " "], + [9250, 0, "t"], + [9251, 0, "h"], + [9252, 0, "e"], + [9253, 0, " "], + [9185, 1], + [9185, 0, "i"], + [9186, 0, "e"], + [9187, 0, "s"], + [9218, 1], + [9217, 1], + [9216, 1], + [9215, 1], + [9214, 1], + [9213, 1], + [9212, 1], + [9212, 0, "i"], + [9213, 0, "g"], + [9214, 0, "n"], + [9215, 0, "o"], + [9216, 0, "r"], + [9217, 0, "e"], + [9255, 0, "t"], + [9256, 0, "u"], + [9257, 0, "p"], + [9258, 0, "l"], + [9259, 0, "e"], + [9260, 0, " "], + [9261, 0, "a"], + [9262, 0, "n"], + [9263, 0, "d"], + [9264, 0, " "], + [9265, 0, "l"], + [9266, 0, "e"], + [9267, 0, "a"], + [9268, 0, "v"], + [9269, 0, "e"], + [9270, 0, " "], + [9271, 0, "i"], + [9272, 0, "t"], + [9273, 0, " "], + [9274, 0, "u"], + [9275, 0, "n"], + [9276, 0, "a"], + [9276, 1], + [9276, 0, "c"], + [9277, 0, "h"], + [9278, 0, "a"], + [9279, 0, "n"], + [9280, 0, "g"], + [9281, 0, "e"], + [9282, 0, "d"], + [9283, 0, ","], + [9284, 0, " "], + [9285, 0, "a"], + [9286, 0, "n"], + [9287, 0, "d"], + [9288, 0, " "], + [9289, 0, "o"], + [9290, 0, "n"], + [9291, 0, "l"], + [9292, 0, "y"], + [9293, 0, " "], + [9294, 0, "e"], + [9295, 0, "x"], + [9296, 0, "a"], + [9297, 0, "m"], + [9298, 0, "i"], + [9299, 0, "n"], + [9300, 0, "e"], + [9301, 0, " "], + [9302, 0, "a"], + [9303, 0, "n"], + [9304, 0, "d"], + [9305, 0, " "], + [9306, 0, "m"], + [9307, 0, "o"], + [9308, 0, "d"], + [9309, 0, "i"], + [9310, 0, "f"], + [9311, 0, "y"], + [9312, 0, " "], + [9313, 0, "t"], + [9314, 0, "h"], + [9315, 0, "e"], + [9316, 0, " "], + [9317, 0, "$"], + [9318, 0, "\\"], + [9319, 0, "m"], + [9320, 0, "a"], + [9321, 0, "t"], + [9322, 0, "h"], + [9323, 0, "i"], + [9324, 0, "t"], + [9325, 0, "{"], + [9326, 0, "n"], + [9327, 0, "e"], + [9328, 0, "x"], + [9329, 0, "t"], + [9330, 0, "}"], + [9331, 0, "$"], + [9332, 0, " "], + [9333, 0, "e"], + [9334, 0, "l"], + [9335, 0, "e"], + [9336, 0, "m"], + [9337, 0, "e"], + [9338, 0, "n"], + [9339, 0, "t"], + [9340, 0, " "], + [9341, 0, "o"], + [9342, 0, "f"], + [9343, 0, " "], + [9344, 0, "t"], + [9345, 0, "h"], + [9346, 0, "e"], + [9347, 0, " "], + [9348, 0, "t"], + [9349, 0, "u"], + [9350, 0, "p"], + [9351, 0, "l"], + [9352, 0, "e"], + [9353, 0, "."], + [9354, 0, " "], + [9355, 0, "B"], + [9356, 0, "y"], + [9357, 0, " "], + [9358, 0, "c"], + [9359, 0, "o"], + [9360, 0, "n"], + [9361, 0, "t"], + [9362, 0, "r"], + [9363, 0, "a"], + [9364, 0, "s"], + [9365, 0, "t"], + [9366, 0, ","], + [9367, 0, " "], + [9368, 0, "$"], + [9368, 1], + [9368, 0, "a"], + [9369, 0, "p"], + [9370, 0, "p"], + [9371, 0, "l"], + [9372, 0, "y"], + [9373, 0, "i"], + [9374, 0, "n"], + [9375, 0, "g"], + [9376, 0, " "], + [9377, 0, "$"], + [9378, 0, "|"], + [9378, 1], + [9378, 0, "\\"], + [9379, 0, "m"], + [9380, 0, "a"], + [9381, 0, "t"], + [9382, 0, "h"], + [9383, 0, "s"], + [9384, 0, "f"], + [9385, 0, "{"], + [9386, 0, "d"], + [9387, 0, "e"], + [9388, 0, "l"], + [9389, 0, "e"], + [9390, 0, "t"], + [9391, 0, "e"], + [9392, 0, "}"], + [9393, 0, "("], + [9394, 0, "\\"], + [9395, 0, "m"], + [9396, 0, "a"], + [9397, 0, "t"], + [9398, 0, "h"], + [9399, 0, "i"], + [9400, 0, "t"], + [9401, 0, "{"], + [9402, 0, "i"], + [9403, 0, "d"], + [9404, 0, "}"], + [9405, 0, ")"], + [9406, 0, "$"], + [9407, 0, " "], + [9408, 0, "m"], + [9409, 0, "o"], + [9410, 0, "d"], + [9411, 0, "i"], + [9412, 0, "f"], + [9413, 0, "i"], + [9414, 0, "e"], + [9415, 0, "s"], + [9416, 0, " "], + [9417, 0, "o"], + [9418, 0, "n"], + [9419, 0, "l"], + [9420, 0, "y"], + [9421, 0, " "], + [9422, 0, "t"], + [9423, 0, "h"], + [9424, 0, "e"], + [9425, 0, " "], + [9426, 0, "$"], + [9427, 0, "\\"], + [9428, 0, "m"], + [9429, 0, "a"], + [9430, 0, "t"], + [9431, 0, "h"], + [9432, 0, "i"], + [9433, 0, "t"], + [9434, 0, "{"], + [9435, 0, "v"], + [9436, 0, "a"], + [9437, 0, "l"], + [9438, 0, "u"], + [9439, 0, "e"], + [9440, 0, "}"], + [9441, 0, "$"], + [9442, 0, " "], + [9443, 0, "e"], + [9444, 0, "l"], + [9445, 0, "e"], + [9446, 0, "m"], + [9447, 0, "e"], + [9448, 0, "n"], + [9449, 0, "t"], + [9450, 0, " "], + [9451, 0, "o"], + [9452, 0, "f"], + [9453, 0, " "], + [9454, 0, "$"], + [9455, 0, "A"], + [9456, 0, "("], + [9457, 0, "\\"], + [9458, 0, "m"], + [9459, 0, "a"], + [9460, 0, "t"], + [9461, 0, "h"], + [9462, 0, "i"], + [9463, 0, "t"], + [9464, 0, "{"], + [9465, 0, "i"], + [9466, 0, "d"], + [9467, 0, "}"], + [9468, 0, ")"], + [9469, 0, "$"], + [9470, 0, ","], + [9471, 0, " "], + [9472, 0, "a"], + [9473, 0, "n"], + [9474, 0, "d"], + [9475, 0, " "], + [9475, 1], + [9474, 1], + [9473, 1], + [9472, 1], + [9472, 0, "a"], + [9473, 0, "n"], + [9474, 0, "d"], + [9475, 0, " "], + [9476, 0, "l"], + [9477, 0, "e"], + [9478, 0, "a"], + [9479, 0, "v"], + [9480, 0, "e"], + [9481, 0, "s"], + [9482, 0, " "], + [9483, 0, "t"], + [9484, 0, "h"], + [9485, 0, "e"], + [9486, 0, " "], + [9487, 0, "$"], + [9488, 0, "\\"], + [9489, 0, "m"], + [9490, 0, "a"], + [9491, 0, "t"], + [9492, 0, "h"], + [9493, 0, "i"], + [9494, 0, "t"], + [9495, 0, "{"], + [9496, 0, "n"], + [9497, 0, "e"], + [9498, 0, "x"], + [9499, 0, "t"], + [9500, 0, "}"], + [9501, 0, "$"], + [9502, 0, " "], + [9503, 0, "e"], + [9504, 0, "l"], + [9505, 0, "e"], + [9506, 0, "m"], + [9507, 0, "e"], + [9508, 0, "n"], + [9509, 0, "t"], + [9510, 0, " "], + [9511, 0, "u"], + [9512, 0, "n"], + [9513, 0, "c"], + [9514, 0, "h"], + [9515, 0, "a"], + [9516, 0, "n"], + [9517, 0, "g"], + [9518, 0, "e"], + [9519, 0, "d"], + [9520, 0, "."], + [9521, 0, " "], + [9522, 0, "T"], + [9523, 0, "h"], + [9524, 0, "u"], + [9525, 0, "s"], + [9526, 0, ","], + [9527, 0, " "], + [9528, 0, "t"], + [9529, 0, "h"], + [9530, 0, "e"], + [9531, 0, " "], + [9531, 1], + [9530, 1], + [9529, 1], + [9528, 1], + [9527, 1], + [9526, 1], + [9525, 1], + [9524, 1], + [9523, 1], + [9522, 1], + [9521, 1], + [9521, 0, "\n"], + [9522, 0, "\n"], + [9523, 0, "T"], + [9524, 0, "h"], + [9525, 0, "u"], + [9526, 0, "s"], + [9527, 0, ","], + [9528, 0, " "], + [9529, 0, "i"], + [9530, 0, "n"], + [9531, 0, "s"], + [9532, 0, "e"], + [9533, 0, "r"], + [9534, 0, "t"], + [9535, 0, "i"], + [9536, 0, "n"], + [9537, 0, "g"], + [9538, 0, " "], + [9539, 0, "$"], + [9540, 0, "o"], + [9541, 0, "_"], + [9542, 0, "{"], + [9543, 0, "n"], + [9544, 0, "+"], + [9545, 0, "1"], + [9546, 0, "}"], + [9547, 0, "="], + [9548, 0, "\\"], + [9549, 0, "m"], + [9550, 0, "a"], + [9551, 0, "t"], + [9552, 0, "h"], + [9553, 0, "s"], + [9554, 0, "f"], + [9555, 0, "{"], + [9556, 0, "d"], + [9557, 0, "e"], + [9558, 0, "l"], + [9559, 0, "e"], + [9560, 0, "t"], + [9561, 0, "e"], + [9562, 0, "}"], + [9563, 0, "("], + [9564, 0, "\\"], + [9565, 0, "m"], + [9566, 0, "a"], + [9567, 0, "t"], + [9568, 0, "h"], + [9569, 0, "i"], + [9570, 0, "t"], + [9571, 0, "{"], + [9572, 0, "i"], + [9573, 0, "d"], + [9574, 0, "}"], + [9575, 0, ")"], + [9576, 0, "$"], + [9577, 0, " "], + [9578, 0, "a"], + [9579, 0, "t"], + [9580, 0, " "], + [9581, 0, "a"], + [9582, 0, "n"], + [9583, 0, "y"], + [9584, 0, " "], + [9585, 0, "c"], + [9586, 0, "a"], + [9587, 0, "u"], + [9588, 0, "s"], + [9589, 0, "a"], + [9590, 0, "l"], + [9591, 0, "l"], + [9592, 0, "y"], + [9593, 0, " "], + [9594, 0, "r"], + [9595, 0, "e"], + [9596, 0, "a"], + [9597, 0, "d"], + [9598, 0, "y"], + [9599, 0, " "], + [9600, 0, "p"], + [9601, 0, "o"], + [9602, 0, "i"], + [9603, 0, "n"], + [9604, 0, "t"], + [9605, 0, " "], + [9606, 0, "i"], + [9607, 0, "n"], + [9608, 0, " "], + [9609, 0, "a"], + [9610, 0, " "], + [9611, 0, "h"], + [9612, 0, "i"], + [9613, 0, "s"], + [9614, 0, "t"], + [9615, 0, "o"], + [9616, 0, "r"], + [9617, 0, "y"], + [9618, 0, " "], + [9537, 1], + [9536, 1], + [9535, 1], + [9534, 1], + [9533, 1], + [9532, 1], + [9531, 1], + [9530, 1], + [9529, 1], + [9529, 0, "i"], + [9530, 0, "f"], + [9571, 0, "i"], + [9572, 0, "s"], + [9573, 0, " "], + [9574, 0, "i"], + [9575, 0, "n"], + [9576, 0, "s"], + [9577, 0, "e"], + [9578, 0, "r"], + [9579, 0, "t"], + [9580, 0, "e"], + [9581, 0, "d"], + [9582, 0, " "], + [9623, 1], + [9623, 0, ","], + [9624, 0, " "], + [9625, 0, "t"], + [9626, 0, "h"], + [9627, 0, "e"], + [9628, 0, " "], + [9629, 0, "f"], + [9630, 0, "i"], + [9631, 0, "n"], + [9632, 0, "a"], + [9633, 0, "l"], + [9634, 0, " "], + [9635, 0, "s"], + [9636, 0, "t"], + [9637, 0, "a"], + [9638, 0, "t"], + [9639, 0, "e"], + [9640, 0, " "], + [9641, 0, "d"], + [9642, 0, "o"], + [9643, 0, "e"], + [9644, 0, "s"], + [9645, 0, " "], + [9646, 0, "n"], + [9647, 0, "o"], + [9648, 0, "t"], + [9649, 0, " "], + [9650, 0, "d"], + [9651, 0, "e"], + [9652, 0, "p"], + [9653, 0, "e"], + [9654, 0, "n"], + [9655, 0, "d"], + [9656, 0, " "], + [9657, 0, "o"], + [9658, 0, "n"], + [9659, 0, " "], + [9660, 0, "t"], + [9661, 0, "h"], + [9662, 0, "e"], + [9663, 0, " "], + [9664, 0, "i"], + [9665, 0, "n"], + [9666, 0, "s"], + [9667, 0, "e"], + [9668, 0, "r"], + [9669, 0, "t"], + [9670, 0, "i"], + [9671, 0, "o"], + [9672, 0, "n"], + [9673, 0, " "], + [9674, 0, "p"], + [9675, 0, "o"], + [9676, 0, "i"], + [9677, 0, "n"], + [9678, 0, "t"], + [9679, 0, ","], + [9680, 0, " "], + [9681, 0, "b"], + [9682, 0, "e"], + [9683, 0, "c"], + [9684, 0, "a"], + [9685, 0, "u"], + [9686, 0, "s"], + [9687, 0, "e"], + [9688, 0, " "], + [9689, 0, "t"], + [9690, 0, "h"], + [9691, 0, "e"], + [9692, 0, " "], + [9693, 0, "i"], + [9694, 0, "n"], + [9695, 0, "s"], + [9696, 0, "e"], + [9697, 0, "r"], + [9698, 0, "t"], + [9699, 0, "e"], + [9700, 0, "d"], + [9701, 0, " "], + [9702, 0, "o"], + [9703, 0, "p"], + [9704, 0, "e"], + [9705, 0, "r"], + [9706, 0, "a"], + [9707, 0, "t"], + [9708, 0, "i"], + [9709, 0, "o"], + [9710, 0, "n"], + [9711, 0, " "], + [9712, 0, "d"], + [9713, 0, "o"], + [9714, 0, "e"], + [9715, 0, "s"], + [9716, 0, " "], + [9717, 0, "n"], + [9718, 0, "o"], + [9719, 0, "t"], + [9720, 0, " "], + [9721, 0, "i"], + [9722, 0, "n"], + [9723, 0, "t"], + [9724, 0, "e"], + [9725, 0, "r"], + [9726, 0, "a"], + [9727, 0, "c"], + [9728, 0, "t"], + [9729, 0, " "], + [9730, 0, "w"], + [9731, 0, "i"], + [9732, 0, "t"], + [9733, 0, "h"], + [9734, 0, " "], + [9735, 0, "a"], + [9736, 0, "n"], + [9737, 0, "y"], + [9738, 0, " "], + [9739, 0, "p"], + [9740, 0, "r"], + [9741, 0, "i"], + [9742, 0, "o"], + [9743, 0, "r"], + [9744, 0, " "], + [9745, 0, "o"], + [9746, 0, "r"], + [9747, 0, " "], + [9748, 0, "f"], + [9749, 0, "o"], + [9750, 0, "l"], + [9751, 0, "l"], + [9752, 0, "o"], + [9753, 0, "w"], + [9754, 0, "i"], + [9755, 0, "n"], + [9756, 0, "g"], + [9757, 0, " "], + [9758, 0, "o"], + [9759, 0, "p"], + [9760, 0, "e"], + [9761, 0, "r"], + [9762, 0, "a"], + [9763, 0, "t"], + [9764, 0, "i"], + [9765, 0, "o"], + [9766, 0, "n"], + [9767, 0, "s"], + [9768, 0, "."], + [9769, 0, "\n"], + [9770, 0, "\n"], + [9771, 0, "\\"], + [9772, 0, "s"], + [9773, 0, "u"], + [9774, 0, "b"], + [9775, 0, "s"], + [9776, 0, "u"], + [9777, 0, "b"], + [9778, 0, "s"], + [9779, 0, "e"], + [9780, 0, "c"], + [9781, 0, "t"], + [9782, 0, "i"], + [9783, 0, "o"], + [9784, 0, "n"], + [9785, 0, "{"], + [9786, 0, "C"], + [9787, 0, "o"], + [9788, 0, "m"], + [9789, 0, "m"], + [9790, 0, "u"], + [9791, 0, "t"], + [9792, 0, "a"], + [9793, 0, "t"], + [9794, 0, "i"], + [9795, 0, "v"], + [9796, 0, "i"], + [9797, 0, "t"], + [9798, 0, "y"], + [9799, 0, " "], + [9800, 0, "o"], + [9801, 0, "f"], + [9802, 0, " "], + [9803, 0, "i"], + [9804, 0, "n"], + [9805, 0, "s"], + [9806, 0, "e"], + [9807, 0, "r"], + [9808, 0, "t"], + [9809, 0, "i"], + [9810, 0, "o"], + [9811, 0, "n"], + [9812, 0, "}"], + [9813, 0, "\n"], + [9814, 0, "\n"], + [9815, 0, "N"], + [9816, 0, "o"], + [9817, 0, "w"], + [9818, 0, " "], + [9819, 0, "c"], + [9820, 0, "o"], + [9821, 0, "n"], + [9822, 0, "s"], + [9823, 0, "i"], + [9824, 0, "d"], + [9825, 0, "e"], + [9826, 0, "r"], + [9827, 0, " "], + [9828, 0, "t"], + [9829, 0, "h"], + [9830, 0, "e"], + [9831, 0, " "], + [9832, 0, "c"], + [9833, 0, "a"], + [9834, 0, "s"], + [9835, 0, "e"], + [9836, 0, " "], + [9837, 0, "t"], + [9838, 0, "h"], + [9839, 0, "a"], + [9840, 0, "t"], + [9841, 0, " "], + [9842, 0, "$"], + [9843, 0, "{"], + [9843, 1], + [9843, 0, "o"], + [9844, 0, "_"], + [9845, 0, "{"], + [9846, 0, "n"], + [9847, 0, "+"], + [9848, 0, "1"], + [9849, 0, "}"], + [9850, 0, "="], + [9851, 0, "\\"], + [9852, 0, "m"], + [9853, 0, "a"], + [9854, 0, "t"], + [9855, 0, "h"], + [9856, 0, "s"], + [9857, 0, "f"], + [9858, 0, "{"], + [9859, 0, "i"], + [9860, 0, "n"], + [9861, 0, "s"], + [9862, 0, "e"], + [9863, 0, "r"], + [9864, 0, "t"], + [9865, 0, "}"], + [9866, 0, "("], + [9867, 0, "\\"], + [9868, 0, "m"], + [9869, 0, "a"], + [9870, 0, "t"], + [9871, 0, "h"], + [9872, 0, "i"], + [9873, 0, "t"], + [9874, 0, "{"], + [9875, 0, "i"], + [9876, 0, "d"], + [9877, 0, "}"], + [9878, 0, ","], + [9879, 0, " "], + [9880, 0, "\\"], + [9881, 0, "m"], + [9882, 0, "a"], + [9883, 0, "t"], + [9884, 0, "h"], + [9885, 0, "i"], + [9886, 0, "t"], + [9887, 0, "{"], + [9888, 0, "p"], + [9889, 0, "r"], + [9890, 0, "e"], + [9891, 0, "v"], + [9892, 0, "}"], + [9893, 0, ","], + [9894, 0, " "], + [9895, 0, "v"], + [9896, 0, ")"], + [9897, 0, "$"], + [9898, 0, "."], + [9899, 0, " "], + [9900, 0, "I"], + [9901, 0, "n"], + [9902, 0, " "], + [9903, 0, "t"], + [9904, 0, "h"], + [9905, 0, "i"], + [9906, 0, "s"], + [9907, 0, " "], + [9908, 0, "o"], + [9909, 0, "p"], + [9910, 0, "e"], + [9911, 0, "r"], + [9912, 0, "a"], + [9913, 0, "t"], + [9914, 0, "i"], + [9915, 0, "o"], + [9916, 0, "n"], + [9917, 0, ","], + [9918, 0, " "], + [9919, 0, "$"], + [9920, 0, "\\"], + [9921, 0, "m"], + [9922, 0, "a"], + [9923, 0, "t"], + [9924, 0, "h"], + [9925, 0, "i"], + [9926, 0, "t"], + [9927, 0, "{"], + [9928, 0, "i"], + [9929, 0, "d"], + [9930, 0, "}"], + [9931, 0, "$"], + [9932, 0, " "], + [9933, 0, "i"], + [9934, 0, "s"], + [9935, 0, " "], + [9936, 0, "a"], + [9937, 0, " "], + [9938, 0, "f"], + [9939, 0, "r"], + [9940, 0, "e"], + [9941, 0, "s"], + [9942, 0, "h"], + [9943, 0, "l"], + [9944, 0, "y"], + [9945, 0, " "], + [9946, 0, "g"], + [9947, 0, "e"], + [9948, 0, "n"], + [9949, 0, "e"], + [9950, 0, "r"], + [9951, 0, "a"], + [9952, 0, "t"], + [9953, 0, "e"], + [9954, 0, "d"], + [9955, 0, " "], + [9956, 0, "L"], + [9957, 0, "a"], + [9958, 0, "m"], + [9959, 0, "p"], + [9960, 0, "o"], + [9961, 0, "r"], + [9962, 0, "t"], + [9963, 0, " "], + [9964, 0, "t"], + [9965, 0, "i"], + [9966, 0, "m"], + [9967, 0, "e"], + [9968, 0, "s"], + [9969, 0, "t"], + [9970, 0, "a"], + [9971, 0, "m"], + [9972, 0, "p"], + [9917, 1], + [9916, 1], + [9915, 1], + [9914, 1], + [9913, 1], + [9912, 1], + [9911, 1], + [9910, 1], + [9909, 1], + [9908, 1], + [9907, 1], + [9906, 1], + [9905, 1], + [9904, 1], + [9903, 1], + [9902, 1], + [9901, 1], + [9900, 1], + [9900, 0, "T"], + [9901, 0, "h"], + [9902, 0, "e"], + [9903, 0, " "], + [9904, 0, "L"], + [9905, 0, "a"], + [9906, 0, "m"], + [9907, 0, "p"], + [9908, 0, "o"], + [9909, 0, "r"], + [9910, 0, "t"], + [9911, 0, " "], + [9912, 0, "t"], + [9913, 0, "i"], + [9914, 0, "m"], + [9915, 0, "e"], + [9916, 0, "s"], + [9917, 0, "t"], + [9918, 0, "a"], + [9919, 0, "m"], + [9920, 0, "p"], + [9939, 1], + [9938, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9957, 1], + [9958, 0, "b"], + [9959, 0, "y"], + [9960, 0, " "], + [9961, 0, "t"], + [9961, 1], + [9960, 1], + [9959, 1], + [9958, 1], + [9957, 0, "b"], + [9958, 0, "y"], + [9959, 0, " "], + [9960, 0, "t"], + [9961, 0, "h"], + [9962, 0, "e"], + [9963, 0, " "], + [9964, 0, "p"], + [9965, 0, "e"], + [9966, 0, "e"], + [9967, 0, "r"], + [9968, 0, " "], + [9969, 0, "o"], + [9970, 0, "n"], + [9971, 0, " "], + [9972, 0, "w"], + [9973, 0, "h"], + [9974, 0, "i"], + [9975, 0, "c"], + [9976, 0, "h"], + [9977, 0, " "], + [9978, 0, "t"], + [9979, 0, "h"], + [9980, 0, "e"], + [9981, 0, " "], + [9982, 0, "e"], + [9983, 0, "d"], + [9984, 0, "i"], + [9985, 0, "t"], + [9986, 0, " "], + [9987, 0, "w"], + [9988, 0, "a"], + [9989, 0, "s"], + [9990, 0, " "], + [9991, 0, "p"], + [9992, 0, "e"], + [9993, 0, "r"], + [9994, 0, "f"], + [9995, 0, "o"], + [9996, 0, "r"], + [9997, 0, "m"], + [9998, 0, "e"], + [9999, 0, "d"], + [10000, 0, "."], + [10001, 0, " "], + [10002, 0, "B"], + [9900, 0, "\n"], + [9901, 0, "\n"], + [9900, 0, "L"], + [9901, 0, "e"], + [9902, 0, "t"], + [9903, 0, " "], + [9904, 0, "$"], + [9905, 0, "A"], + [9906, 0, "_"], + [9907, 0, "o"], + [9908, 0, "$"], + [9909, 0, " "], + [9910, 0, "b"], + [9911, 0, "e"], + [9912, 0, " "], + [9913, 0, "t"], + [9914, 0, "h"], + [9915, 0, "e"], + [9916, 0, " "], + [9917, 0, "s"], + [9918, 0, "t"], + [9919, 0, "a"], + [9920, 0, "t"], + [9921, 0, "e"], + [9922, 0, " "], + [9923, 0, "o"], + [9924, 0, "f"], + [9925, 0, " "], + [9926, 0, "t"], + [9927, 0, "h"], + [9928, 0, "e"], + [9929, 0, " "], + [9930, 0, "p"], + [9931, 0, "e"], + [9932, 0, "e"], + [9933, 0, "r"], + [9934, 0, " "], + [9935, 0, "o"], + [9936, 0, "n"], + [9937, 0, " "], + [9938, 0, "w"], + [9939, 0, "h"], + [9940, 0, "i"], + [9941, 0, "c"], + [9942, 0, "h"], + [9943, 0, " "], + [9944, 0, "$"], + [9945, 0, "o"], + [9946, 0, "_"], + [9947, 0, "{"], + [9948, 0, "n"], + [9949, 0, "+"], + [9950, 0, "1"], + [9951, 0, "}"], + [9952, 0, "$"], + [9953, 0, " "], + [9954, 0, "w"], + [9955, 0, "a"], + [9956, 0, "s"], + [9957, 0, " "], + [9958, 0, "g"], + [9959, 0, "e"], + [9960, 0, "n"], + [9961, 0, "e"], + [9962, 0, "r"], + [9963, 0, "a"], + [9964, 0, "t"], + [9965, 0, "e"], + [9966, 0, "d"], + [9967, 0, ","], + [9968, 0, " "], + [9969, 0, "i"], + [9970, 0, "m"], + [9971, 0, "m"], + [9972, 0, "e"], + [9973, 0, "d"], + [9974, 0, "i"], + [9975, 0, "a"], + [9976, 0, "t"], + [9977, 0, "e"], + [9978, 0, "l"], + [9979, 0, "y"], + [9980, 0, " "], + [9981, 0, "a"], + [9982, 0, "f"], + [9983, 0, "t"], + [9984, 0, "e"], + [9985, 0, "r"], + [9986, 0, " "], + [9987, 0, "$"], + [9988, 0, "o"], + [9989, 0, "_"], + [9990, 0, "{"], + [9991, 0, "n"], + [9992, 0, "+"], + [9993, 0, "1"], + [9994, 0, "}"], + [9995, 0, "$"], + [9996, 0, " "], + [9997, 0, "w"], + [9998, 0, "a"], + [9999, 0, "s"], + [10000, 0, " "], + [10001, 0, "l"], + [10002, 0, "o"], + [10003, 0, "c"], + [10004, 0, "a"], + [10005, 0, "l"], + [10006, 0, "l"], + [10007, 0, "y"], + [10008, 0, " "], + [10009, 0, "a"], + [10010, 0, "p"], + [10011, 0, "p"], + [10012, 0, "l"], + [10013, 0, "i"], + [10014, 0, "e"], + [10015, 0, "d"], + [10016, 0, "."], + [10017, 0, " "], + [10122, 1], + [10122, 0, "L"], + [10123, 0, "e"], + [10124, 0, "t"], + [10125, 0, " "], + [10126, 0, "$"], + [10127, 0, "A"], + [10128, 0, "_"], + [10129, 0, "o"], + [10130, 0, "$"], + [10131, 0, " "], + [10132, 0, "b"], + [10133, 0, "e"], + [10134, 0, " "], + [10135, 0, "t"], + [10136, 0, "h"], + [10137, 0, "e"], + [10138, 0, " "], + [10139, 0, "s"], + [10140, 0, "t"], + [10141, 0, "a"], + [10142, 0, "t"], + [10143, 0, "e"], + [10144, 0, " "], + [10145, 0, "o"], + [10146, 0, "f"], + [10147, 0, " "], + [10148, 0, "t"], + [10149, 0, "h"], + [10150, 0, "e"], + [10151, 0, " "], + [10152, 0, "p"], + [10153, 0, "e"], + [10154, 0, "e"], + [10155, 0, "r"], + [10156, 0, " "], + [10157, 0, "o"], + [10158, 0, "n"], + [10159, 0, " "], + [10160, 0, "w"], + [10161, 0, "h"], + [10162, 0, "i"], + [10163, 0, "c"], + [10164, 0, "h"], + [10165, 0, " "], + [10166, 0, "$"], + [10167, 0, "o"], + [10168, 0, "_"], + [10169, 0, "{"], + [10170, 0, "n"], + [10171, 0, "+"], + [10172, 0, "1"], + [10173, 0, "}"], + [10174, 0, "$"], + [10175, 0, " "], + [10176, 0, "w"], + [10177, 0, "a"], + [10178, 0, "s"], + [10179, 0, " "], + [10180, 0, "g"], + [10181, 0, "e"], + [10182, 0, "n"], + [10183, 0, "e"], + [10184, 0, "r"], + [10185, 0, "a"], + [10186, 0, "t"], + [10187, 0, "e"], + [10188, 0, "d"], + [10189, 0, ","], + [10190, 0, " "], + [10191, 0, "i"], + [10192, 0, "m"], + [10193, 0, "m"], + [10194, 0, "e"], + [10195, 0, "d"], + [10196, 0, "i"], + [10197, 0, "a"], + [10198, 0, "t"], + [10199, 0, "e"], + [10200, 0, "l"], + [10201, 0, "y"], + [10202, 0, " "], + [10203, 0, "a"], + [10204, 0, "f"], + [10205, 0, "t"], + [10206, 0, "e"], + [10207, 0, "r"], + [10208, 0, " "], + [10209, 0, "$"], + [10210, 0, "#"], + [10210, 1], + [10210, 0, "o"], + [10211, 0, "_"], + [10212, 0, "{"], + [10213, 0, "n"], + [10214, 0, "+"], + [10215, 0, "1"], + [10216, 0, "}"], + [10217, 0, "$"], + [10218, 0, " "], + [10219, 0, "w"], + [10220, 0, "a"], + [10221, 0, "s"], + [10222, 0, " "], + [10223, 0, "l"], + [10224, 0, "o"], + [10225, 0, "c"], + [10226, 0, "a"], + [10227, 0, "l"], + [10228, 0, "l"], + [10229, 0, "y"], + [10230, 0, " "], + [10231, 0, "a"], + [10232, 0, "p"], + [10233, 0, "p"], + [10234, 0, "l"], + [10235, 0, "i"], + [10236, 0, "e"], + [10237, 0, "d"], + [10238, 0, "."], + [10019, 1], + [10018, 1], + [10017, 1], + [10016, 1], + [10015, 1], + [10014, 1], + [10013, 1], + [10012, 1], + [10011, 1], + [10010, 1], + [10009, 1], + [10008, 1], + [10007, 1], + [10006, 1], + [10005, 1], + [10004, 1], + [10003, 1], + [10002, 1], + [10001, 1], + [10000, 1], + [9999, 1], + [9998, 1], + [9997, 1], + [9996, 1], + [9995, 1], + [9994, 1], + [9993, 1], + [9992, 1], + [9991, 1], + [9990, 1], + [9989, 1], + [9988, 1], + [9987, 1], + [9986, 1], + [9985, 1], + [9984, 1], + [9983, 1], + [9982, 1], + [9981, 1], + [9980, 1], + [9979, 1], + [9978, 1], + [9977, 1], + [9976, 1], + [9975, 1], + [9974, 1], + [9973, 1], + [9972, 1], + [9971, 1], + [9970, 1], + [9969, 1], + [9968, 1], + [9967, 1], + [9966, 1], + [9965, 1], + [9964, 1], + [9963, 1], + [9962, 1], + [9961, 1], + [9960, 1], + [9959, 1], + [9958, 1], + [9957, 1], + [9956, 1], + [9955, 1], + [9954, 1], + [9953, 1], + [9952, 1], + [9951, 1], + [9950, 1], + [9949, 1], + [9948, 1], + [9947, 1], + [9946, 1], + [9945, 1], + [9944, 1], + [9943, 1], + [9942, 1], + [9941, 1], + [9940, 1], + [9939, 1], + [9938, 1], + [9937, 1], + [9936, 1], + [9935, 1], + [9934, 1], + [9933, 1], + [9932, 1], + [9931, 1], + [9930, 1], + [9929, 1], + [9928, 1], + [9927, 1], + [9926, 1], + [9925, 1], + [9924, 1], + [9923, 1], + [9922, 1], + [9921, 1], + [9920, 1], + [9919, 1], + [9918, 1], + [9917, 1], + [9916, 1], + [9915, 1], + [9914, 1], + [9913, 1], + [9912, 1], + [9911, 1], + [9910, 1], + [9909, 1], + [9908, 1], + [9907, 1], + [9906, 1], + [9905, 1], + [9904, 1], + [9903, 1], + [9902, 1], + [9901, 1], + [9900, 1], + [10119, 0, " "], + [10120, 0, "B"], + [10121, 0, "y"], + [10122, 0, " "], + [10123, 0, "t"], + [10124, 0, "h"], + [10125, 0, "e"], + [10126, 0, " "], + [10127, 0, "d"], + [10128, 0, "e"], + [10129, 0, "f"], + [10130, 0, "i"], + [10131, 0, "n"], + [10132, 0, "i"], + [10133, 0, "t"], + [10134, 0, "i"], + [10135, 0, "o"], + [10136, 0, "n"], + [10137, 0, " "], + [10138, 0, "o"], + [10139, 0, "f"], + [10140, 0, " "], + [10141, 0, "L"], + [10142, 0, "a"], + [10143, 0, "m"], + [10144, 0, "p"], + [10145, 0, "o"], + [10146, 0, "r"], + [10147, 0, "t"], + [10148, 0, " "], + [10149, 0, "t"], + [10150, 0, "i"], + [10151, 0, "m"], + [10152, 0, "e"], + [10153, 0, "s"], + [10154, 0, "t"], + [10155, 0, "a"], + [10156, 0, "m"], + [10157, 0, "p"], + [10158, 0, "s"], + [10159, 0, ","], + [10160, 0, " "], + [10161, 0, "$"], + [10162, 0, "\\"], + [10163, 0, "m"], + [10164, 0, "a"], + [10165, 0, "t"], + [10166, 0, "h"], + [10167, 0, "i"], + [10168, 0, "t"], + [10169, 0, "{"], + [10170, 0, "i"], + [10171, 0, "d"], + [10172, 0, "}"], + [10173, 0, "$"], + [10174, 0, " "], + [10175, 0, "i"], + [10176, 0, "s"], + [10177, 0, " "], + [10178, 0, "t"], + [10179, 0, "h"], + [10180, 0, "e"], + [10181, 0, " "], + [10182, 0, "g"], + [10183, 0, "r"], + [10184, 0, "e"], + [10185, 0, "a"], + [10186, 0, "t"], + [10187, 0, "e"], + [10188, 0, "s"], + [10189, 0, "t"], + [10190, 0, " "], + [10191, 0, "t"], + [10192, 0, "i"], + [10193, 0, "m"], + [10194, 0, "e"], + [10195, 0, "s"], + [10196, 0, "t"], + [10197, 0, "a"], + [10198, 0, "m"], + [10199, 0, "p"], + [10200, 0, " "], + [10201, 0, "i"], + [10202, 0, "n"], + [10203, 0, " "], + [10204, 0, "$"], + [10205, 0, "A"], + [10206, 0, "_"], + [10207, 0, "o"], + [10208, 0, "$"], + [10209, 0, "."], + [10210, 0, " "], + [10211, 0, "T"], + [10212, 0, "h"], + [10213, 0, "e"], + [10214, 0, "r"], + [10215, 0, "e"], + [10216, 0, "f"], + [10217, 0, "o"], + [10218, 0, "r"], + [10219, 0, "e"], + [10220, 0, ","], + [10221, 0, " "], + [10222, 0, "t"], + [10223, 0, "h"], + [10224, 0, "e"], + [10225, 0, " "], + [10226, 0, "$"], + [10227, 0, "\\"], + [10228, 0, "m"], + [10229, 0, "a"], + [10230, 0, "t"], + [10231, 0, "h"], + [10232, 0, "r"], + [10233, 0, "m"], + [10234, 0, "{"], + [10235, 0, "a"], + [10236, 0, "p"], + [10237, 0, "p"], + [10238, 0, "l"], + [10239, 0, "y"], + [10240, 0, "}"], + [10241, 0, "$"], + [10242, 0, " "], + [10009, 1], + [10009, 0, "p"], + [10069, 1], + [10086, 1], + [10085, 1], + [10084, 1], + [10083, 1], + [10082, 1], + [10082, 0, "b"], + [10083, 0, "e"], + [10084, 0, "f"], + [10085, 0, "o"], + [10086, 0, "r"], + [10087, 0, "e"], + [10109, 1], + [10108, 1], + [10107, 1], + [10106, 1], + [10105, 1], + [10104, 1], + [10103, 1], + [10102, 1], + [10110, 0, ","], + [10111, 0, " "], + [10112, 0, "a"], + [10113, 0, "n"], + [10114, 0, "d"], + [10115, 0, " "], + [10116, 0, "l"], + [10117, 0, "e"], + [10118, 0, "t"], + [10119, 0, " "], + [10120, 0, "$"], + [10121, 0, "A"], + [10122, 0, "_"], + [10123, 0, "p"], + [10124, 0, "'"], + [10125, 0, "$"], + [10126, 0, " "], + [10127, 0, "b"], + [10128, 0, "e"], + [10129, 0, " "], + [10130, 0, "t"], + [10131, 0, "h"], + [10132, 0, "e"], + [10133, 0, " "], + [10134, 0, "s"], + [10135, 0, "t"], + [10136, 0, "a"], + [10137, 0, "t"], + [10138, 0, "e"], + [10139, 0, " "], + [10140, 0, "o"], + [10141, 0, "f"], + [10142, 0, " "], + [10143, 0, "t"], + [10144, 0, "h"], + [10145, 0, "e"], + [10146, 0, " "], + [10147, 0, "s"], + [10148, 0, "a"], + [10149, 0, "m"], + [10150, 0, "e"], + [10151, 0, " "], + [10152, 0, "p"], + [10153, 0, "e"], + [10154, 0, "e"], + [10155, 0, "r"], + [10156, 0, " "], + [10157, 0, "i"], + [10158, 0, "m"], + [10159, 0, "m"], + [10160, 0, "e"], + [10161, 0, "d"], + [10162, 0, "i"], + [10163, 0, "a"], + [10164, 0, "t"], + [10165, 0, "e"], + [10166, 0, "l"], + [10167, 0, "y"], + [10168, 0, " "], + [10169, 0, "a"], + [10170, 0, "f"], + [10171, 0, "t"], + [10172, 0, "e"], + [10173, 0, "r"], + [10174, 0, " "], + [10175, 0, "$"], + [10176, 0, "o"], + [10177, 0, "{"], + [10177, 1], + [10177, 0, "_"], + [10178, 0, "{"], + [10179, 0, "n"], + [10180, 0, "+"], + [10181, 0, "1"], + [10182, 0, "}"], + [10183, 0, "$"], + [10184, 0, " "], + [10185, 0, "w"], + [10186, 0, "a"], + [10187, 0, "s"], + [10188, 0, " "], + [10189, 0, "a"], + [10190, 0, "p"], + [10191, 0, "p"], + [10192, 0, "l"], + [10193, 0, "i"], + [10194, 0, "e"], + [10195, 0, "d"], + [10197, 1], + [10197, 0, "\n"], + [10198, 0, "\n"], + [10287, 0, "'"], + [10289, 0, ","], + [10290, 0, " "], + [10291, 0, "a"], + [10292, 0, "n"], + [10293, 0, "d"], + [10294, 0, " "], + [10295, 0, "g"], + [10296, 0, "r"], + [10297, 0, "e"], + [10298, 0, "a"], + [10299, 0, "t"], + [10300, 0, "e"], + [10301, 0, "r"], + [10302, 0, " "], + [10303, 0, "t"], + [10304, 0, "h"], + [10305, 0, "a"], + [10306, 0, "n"], + [10307, 0, " "], + [10308, 0, "a"], + [10309, 0, "n"], + [10310, 0, "y"], + [10311, 0, " "], + [10312, 0, "t"], + [10313, 0, "i"], + [10314, 0, "m"], + [10315, 0, "e"], + [10316, 0, "s"], + [10317, 0, "t"], + [10318, 0, "a"], + [10319, 0, "m"], + [10320, 0, "p"], + [10321, 0, " "], + [10322, 0, "o"], + [10323, 0, "c"], + [10324, 0, "c"], + [10325, 0, "u"], + [10326, 0, "r"], + [10327, 0, "r"], + [10328, 0, "i"], + [10329, 0, "n"], + [10330, 0, "g"], + [10331, 0, " "], + [10332, 0, "i"], + [10333, 0, "n"], + [10334, 0, " "], + [10335, 0, "$"], + [10336, 0, "A"], + [10337, 0, "_"], + [10338, 0, "p"], + [10339, 0, "$"], + [10286, 1], + [10286, 0, "p"], + [10374, 0, "f"], + [10375, 0, "u"], + [10376, 0, "n"], + [10377, 0, "c"], + [10378, 0, "t"], + [10379, 0, "i"], + [10380, 0, "o"], + [10381, 0, "n"], + [10382, 0, " "], + [10383, 0, "t"], + [10384, 0, "h"], + [10385, 0, "a"], + [10386, 0, "t"], + [10387, 0, " "], + [10388, 0, "t"], + [10389, 0, "r"], + [10390, 0, "a"], + [10391, 0, "n"], + [10392, 0, "s"], + [10393, 0, "f"], + [10394, 0, "o"], + [10395, 0, "r"], + [10396, 0, "m"], + [10397, 0, "e"], + [10398, 0, "d"], + [10399, 0, " "], + [10400, 0, "$"], + [10401, 0, "A"], + [10402, 0, "_"], + [10403, 0, "p"], + [10404, 0, "$"], + [10405, 0, " "], + [10406, 0, "i"], + [10407, 0, "n"], + [10408, 0, "t"], + [10409, 0, "o"], + [10410, 0, " "], + [10411, 0, "$"], + [10412, 0, "A"], + [10413, 0, "_"], + [10414, 0, "p"], + [10415, 0, "'"], + [10416, 0, "$"], + [10417, 0, " "], + [10417, 1], + [10416, 1], + [10415, 1], + [10414, 1], + [10413, 1], + [10412, 1], + [10411, 1], + [10410, 1], + [10409, 1], + [10408, 1], + [10407, 1], + [10406, 1], + [10405, 1], + [10404, 1], + [10403, 1], + [10402, 1], + [10401, 1], + [10400, 1], + [10399, 1], + [10398, 1], + [10397, 1], + [10396, 1], + [10395, 1], + [10394, 1], + [10393, 1], + [10392, 1], + [10391, 1], + [10390, 1], + [10389, 1], + [10388, 1], + [10387, 1], + [10386, 1], + [10385, 1], + [10384, 1], + [10383, 1], + [10382, 1], + [10381, 1], + [10380, 1], + [10379, 1], + [10378, 1], + [10377, 1], + [10376, 1], + [10375, 1], + [10374, 1], + [10373, 1], + [10372, 1], + [10356, 0, " "], + [10356, 1], + [10353, 0, "i"], + [10354, 0, "n"], + [10355, 0, " "], + [10359, 0, " "], + [10360, 0, "s"], + [10361, 0, "t"], + [10362, 0, "a"], + [10363, 0, "t"], + [10364, 0, "e"], + [10365, 0, " "], + [10366, 0, "u"], + [10367, 0, "p"], + [10368, 0, "d"], + [10369, 0, "a"], + [10370, 0, "t"], + [10371, 0, "e"], + [10374, 0, "A"], + [10375, 0, "P"], + [10375, 1], + [10375, 0, "_"], + [10376, 0, "p"], + [10377, 0, "'"], + [10378, 0, " "], + [10379, 0, "="], + [10380, 0, " "], + [10395, 0, "("], + [10396, 0, "A"], + [10397, 0, "_"], + [10398, 0, "p"], + [10399, 0, ","], + [10400, 0, " "], + [10401, 0, "\\"], + [10402, 0, "m"], + [10403, 0, "a"], + [10404, 0, "t"], + [10405, 0, "h"], + [10406, 0, "s"], + [10407, 0, "f"], + [10408, 0, "{"], + [10409, 0, "i"], + [10410, 0, "n"], + [10411, 0, "s"], + [10412, 0, "e"], + [10413, 0, "r"], + [10414, 0, "t"], + [10415, 0, "}"], + [10416, 0, "("], + [10417, 0, "\\"], + [10418, 0, "m"], + [10419, 0, "a"], + [10420, 0, "t"], + [10421, 0, "h"], + [10422, 0, "i"], + [10423, 0, "t"], + [10424, 0, "{"], + [10425, 0, "i"], + [10426, 0, "d"], + [10427, 0, "}"], + [10428, 0, ","], + [10429, 0, " "], + [10430, 0, "\\"], + [10431, 0, "m"], + [10432, 0, "a"], + [10433, 0, "t"], + [10434, 0, "h"], + [10435, 0, "i"], + [10436, 0, "t"], + [10437, 0, "{"], + [10438, 0, "p"], + [10439, 0, "r"], + [10440, 0, "e"], + [10441, 0, "v"], + [10442, 0, "}"], + [10443, 0, ","], + [10444, 0, " "], + [10445, 0, "v"], + [10446, 0, ")"], + [10447, 0, ")"], + [10448, 0, "$"], + [10449, 0, " "], + [10450, 0, "t"], + [10451, 0, "h"], + [10452, 0, "e"], + [10453, 0, " "], + [10454, 0, "s"], + [10455, 0, "e"], + [10456, 0, "c"], + [10456, 1], + [10455, 1], + [10454, 1], + [10454, 0, "n"], + [10455, 0, "o"], + [10456, 0, "n"], + [10457, 0, "-"], + [10458, 0, "r"], + [10459, 0, "e"], + [10460, 0, "c"], + [10461, 0, "u"], + [10462, 0, "r"], + [10463, 0, "s"], + [10464, 0, "i"], + [10465, 0, "v"], + [10466, 0, "e"], + [10467, 0, " "], + [10468, 0, "c"], + [10469, 0, "a"], + [10470, 0, "s"], + [10471, 0, "e"], + [10472, 0, " "], + [10473, 0, "("], + [10474, 0, "$"], + [10475, 0, "n"], + [10476, 0, " "], + [10477, 0, "<"], + [10478, 0, " "], + [10479, 0, "\\"], + [10480, 0, "m"], + [10481, 0, "a"], + [10482, 0, "t"], + [10483, 0, "h"], + [10484, 0, "i"], + [10485, 0, "t"], + [10486, 0, "{"], + [10487, 0, "i"], + [10488, 0, "d"], + [10489, 0, "}"], + [10490, 0, "$"], + [10491, 0, ")"], + [10492, 0, " "], + [10493, 0, "m"], + [10494, 0, "u"], + [10495, 0, "s"], + [10496, 0, "t"], + [10497, 0, " "], + [10498, 0, "a"], + [10499, 0, "p"], + [10500, 0, "p"], + [10501, 0, "l"], + [10502, 0, "y"], + [10005, 0, " "], + [10006, 0, "$"], + [10007, 0, "p"], + [10008, 0, "$"], + [10009, 0, " "], + [10010, 0, "b"], + [10011, 0, "y"], + [10012, 0, " "], + [10013, 0, "t"], + [10014, 0, "h"], + [10015, 0, "e"], + [10016, 0, " "], + [10017, 0, "p"], + [10018, 0, "e"], + [10019, 0, "e"], + [10020, 0, "r"], + [10021, 0, " "], + [10022, 0, "o"], + [10023, 0, "n"], + [10024, 0, " "], + [10025, 0, "w"], + [10026, 0, "h"], + [10027, 0, "i"], + [10028, 0, "c"], + [10029, 0, "h"], + [10030, 0, " "], + [10031, 0, "$"], + [10032, 0, "{"], + [10032, 1], + [10032, 0, "o"], + [10033, 0, "_"], + [10034, 0, "{"], + [10035, 0, "n"], + [10036, 0, "+"], + [10037, 0, "1"], + [10038, 0, "}"], + [10039, 0, "$"], + [10040, 0, " "], + [10041, 0, "w"], + [10042, 0, "a"], + [10043, 0, "s"], + [10044, 0, " "], + [10045, 0, "g"], + [10046, 0, "e"], + [10047, 0, "n"], + [10048, 0, "e"], + [10049, 0, "r"], + [10050, 0, "a"], + [10051, 0, "t"], + [10052, 0, "e"], + [10053, 0, "d"], + [10054, 0, ","], + [10055, 0, " "], + [10056, 0, "l"], + [10057, 0, "e"], + [10058, 0, "t"], + [10122, 1], + [10121, 1], + [10120, 1], + [10119, 1], + [10118, 1], + [10117, 1], + [10116, 1], + [10115, 1], + [10114, 1], + [10113, 1], + [10112, 1], + [10111, 1], + [10110, 1], + [10109, 1], + [10108, 1], + [10107, 1], + [10106, 1], + [10105, 1], + [10104, 1], + [10103, 1], + [10102, 1], + [10101, 1], + [10100, 1], + [10099, 1], + [10098, 1], + [10097, 1], + [10096, 1], + [10095, 1], + [10094, 1], + [10093, 1], + [10092, 1], + [10091, 1], + [10090, 1], + [10089, 1], + [10088, 1], + [10087, 1], + [10086, 1], + [10085, 1], + [10084, 1], + [10083, 1], + [10082, 1], + [10082, 0, "$"], + [10083, 0, "p"], + [10084, 0, "$"], + [10171, 1], + [10170, 1], + [10169, 1], + [10168, 1], + [10167, 1], + [10166, 1], + [10165, 1], + [10164, 1], + [10163, 1], + [10162, 1], + [10161, 1], + [10160, 1], + [10159, 1], + [10159, 0, "$"], + [10160, 0, "p"], + [10161, 0, "$"], + [10509, 0, "."], + [309, 0, " "], + [310, 0, "t"], + [311, 0, "i"], + [312, 0, "m"], + [313, 0, "e"], + [314, 0, "-"], + [315, 0, "s"], + [316, 0, "t"], + [317, 0, "a"], + [318, 0, "m"], + [319, 0, "p"], + [10466, 0, ","], + [10466, 1], + [10465, 0, ","], + [10522, 0, " "], + [10523, 0, "T"], + [10524, 0, "h"], + [10525, 0, "e"], + [10526, 0, "r"], + [10527, 0, "e"], + [10528, 0, "f"], + [10529, 0, "o"], + [10530, 0, "r"], + [10531, 0, "e"], + [10532, 0, " "], + [10533, 0, "w"], + [10534, 0, "e"], + [10535, 0, " "], + [10536, 0, "h"], + [10537, 0, "a"], + [10538, 0, "v"], + [10539, 0, "e"], + [10540, 0, ":"], + [10541, 0, "\n"], + [10542, 0, "$"], + [10543, 0, "$"], + [10544, 0, " "], + [10545, 0, "A"], + [10546, 0, "_"], + [10547, 0, "p"], + [10548, 0, "'"], + [10549, 0, " "], + [10550, 0, "="], + [10551, 0, " "], + [10552, 0, "A"], + [10553, 0, "["], + [10554, 0, "\\"], + [10555, 0, ","], + [10556, 0, "\\"], + [10557, 0, "m"], + [10558, 0, "a"], + [10559, 0, "t"], + [10560, 0, "h"], + [10561, 0, "i"], + [10562, 0, "t"], + [10563, 0, "{"], + [10564, 0, "p"], + [10565, 0, "r"], + [10566, 0, "e"], + [10567, 0, "v"], + [10568, 0, "}"], + [10569, 0, " "], + [10570, 0, "\\"], + [10571, 0, "m"], + [10572, 0, "a"], + [10573, 0, "p"], + [10574, 0, "s"], + [10575, 0, "t"], + [10576, 0, "o"], + [10553, 0, "_"], + [10554, 0, "p"], + [10579, 0, " "], + [10580, 0, "("], + [10581, 0, "v"], + [10582, 0, "_"], + [10583, 0, "p"], + [10584, 0, ","], + [10585, 0, " "], + [10586, 0, "\\"], + [10587, 0, "m"], + [10588, 0, "a"], + [10589, 0, "t"], + [10590, 0, "h"], + [10591, 0, "i"], + [10592, 0, "t"], + [10593, 0, "{"], + [10594, 0, "i"], + [10595, 0, "d"], + [10596, 0, "}"], + [10597, 0, ")"], + [10598, 0, ","], + [10599, 0, " "], + [10600, 0, "\\"], + [10601, 0, "m"], + [10602, 0, "a"], + [10603, 0, "t"], + [10604, 0, "h"], + [10599, 0, "\\"], + [10600, 0, ";"], + [10607, 0, "i"], + [10608, 0, "t"], + [10609, 0, "{"], + [10610, 0, "i"], + [10611, 0, "d"], + [10612, 0, "}"], + [10613, 0, " "], + [10614, 0, "\\"], + [10615, 0, "m"], + [10616, 0, "a"], + [10617, 0, "p"], + [10618, 0, "s"], + [10619, 0, "t"], + [10620, 0, "o"], + [10621, 0, " "], + [10622, 0, "("], + [10623, 0, "v"], + [10624, 0, ","], + [10625, 0, " "], + [10626, 0, "n"], + [10627, 0, ")"], + [10628, 0, "\\"], + [10629, 0, ","], + [10630, 0, "]"], + [10631, 0, "\n"], + [10632, 0, "\\"], + [10633, 0, "q"], + [10634, 0, "u"], + [10635, 0, "a"], + [10636, 0, "d"], + [10637, 0, "\\"], + [10638, 0, "t"], + [10639, 0, "e"], + [10640, 0, "x"], + [10641, 0, "t"], + [10642, 0, "{"], + [10643, 0, " "], + [10644, 0, "w"], + [10645, 0, "h"], + [10646, 0, "e"], + [10647, 0, "r"], + [10648, 0, "e"], + [10649, 0, " "], + [10650, 0, "}"], + [10651, 0, "\\"], + [10652, 0, ";"], + [10653, 0, " "], + [10654, 0, "A"], + [10655, 0, "("], + [10656, 0, "\\"], + [10657, 0, "m"], + [10658, 0, "a"], + [10659, 0, "t"], + [10660, 0, "h"], + [10661, 0, "i"], + [10662, 0, "t"], + [10663, 0, "{"], + [10664, 0, "p"], + [10665, 0, "r"], + [10666, 0, "e"], + [10667, 0, "v"], + [10668, 0, "}"], + [10669, 0, ")"], + [10670, 0, " "], + [10671, 0, "="], + [10672, 0, " "], + [10673, 0, "("], + [10674, 0, "v"], + [10675, 0, "_"], + [10676, 0, "p"], + [10677, 0, ","], + [10678, 0, " "], + [10679, 0, "n"], + [10680, 0, ")"], + [10681, 0, "."], + [10682, 0, " "], + [10683, 0, "$"], + [10684, 0, "$"], + [10643, 1], + [10648, 1], + [10650, 1], + [10650, 0, "q"], + [10651, 0, "u"], + [10652, 0, "a"], + [10653, 0, "d"], + [10631, 0, " "], + [10632, 0, "$"], + [10633, 0, "$"], + [10645, 1], + [10644, 1], + [10643, 1], + [10642, 1], + [10641, 1], + [10640, 1], + [10639, 1], + [10638, 1], + [10637, 1], + [10636, 1], + [10635, 1], + [10645, 1], + [10644, 1], + [10643, 1], + [10642, 1], + [10641, 1], + [10640, 1], + [10640, 0, " "], + [10641, 0, "$"], + [10642, 1], + [10672, 1], + [10670, 1], + [10643, 0, "_"], + [10644, 0, "p"], + [10669, 1], + [10669, 0, "\\"], + [10670, 0, "m"], + [10671, 0, "a"], + [10672, 0, "t"], + [10673, 0, "h"], + [10674, 0, "i"], + [10675, 0, "t"], + [10676, 0, "{"], + [10677, 0, "n"], + [10678, 0, "e"], + [10679, 0, "x"], + [10680, 0, "t"], + [10681, 0, "}"], + [10666, 0, "\\"], + [10667, 0, "m"], + [10668, 0, "a"], + [10669, 0, "t"], + [10670, 0, "h"], + [10671, 0, "i"], + [10672, 0, "t"], + [10673, 0, "{"], + [10672, 1], + [10671, 1], + [10671, 0, "r"], + [10672, 0, "m"], + [10675, 0, "r"], + [10676, 0, "e"], + [10677, 0, "v"], + [10678, 0, "}"], + [10583, 1], + [10583, 0, "\\"], + [10584, 0, "m"], + [10585, 0, "a"], + [10586, 0, "t"], + [10587, 0, "h"], + [10588, 0, "r"], + [10589, 0, "m"], + [10590, 0, "{"], + [10591, 0, "p"], + [10592, 0, "r"], + [10593, 0, "e"], + [10594, 0, "v"], + [10595, 0, "}"], + [10638, 1], + [10638, 0, "\\"], + [10639, 0, "m"], + [10640, 0, "a"], + [10641, 0, "t"], + [10642, 0, "h"], + [10643, 0, "i"], + [10644, 0, "t"], + [10645, 0, "{"], + [10646, 0, "n"], + [10647, 0, "e"], + [10648, 0, "x"], + [10649, 0, "t"], + [10650, 0, "}"], + [10589, 1], + [10588, 1], + [10588, 0, "i"], + [10589, 0, "t"], + [10696, 1], + [10695, 1], + [10695, 0, "i"], + [10696, 0, "t"], + [10719, 1], + [10720, 0, " "], + [10721, 0, "a"], + [10722, 0, "n"], + [10723, 0, "d"], + [10724, 0, " "], + [10725, 0, "$"], + [10726, 0, "\\"], + [10727, 0, "m"], + [10728, 0, "a"], + [10729, 0, "t"], + [10730, 0, "h"], + [10731, 0, "i"], + [10732, 0, "t"], + [10733, 0, "{"], + [10734, 0, "p"], + [10735, 0, "r"], + [10736, 0, "e"], + [10737, 0, "v"], + [10738, 0, "}"], + [10739, 0, " "], + [10740, 0, "<"], + [10741, 0, " "], + [10742, 0, "\\"], + [10743, 0, "m"], + [10744, 0, "a"], + [10745, 0, "t"], + [10746, 0, "h"], + [10747, 0, "i"], + [10748, 0, "t"], + [10749, 0, "{"], + [10750, 0, "i"], + [10751, 0, "d"], + [10752, 0, "}"], + [10753, 0, "$"], + [10754, 0, " "], + [10755, 0, "a"], + [10756, 0, "n"], + [10757, 0, "d"], + [10758, 0, " "], + [10759, 0, "$"], + [10760, 0, "\\"], + [10761, 0, "m"], + [10762, 0, "a"], + [10763, 0, "t"], + [10764, 0, "h"], + [10765, 0, "i"], + [10766, 0, "t"], + [10767, 0, "{"], + [10768, 0, "n"], + [10769, 0, "e"], + [10770, 0, "x"], + [10771, 0, "t"], + [10772, 0, "}"], + [10773, 0, " "], + [10774, 0, "<"], + [10775, 0, " "], + [10776, 0, "\\"], + [10777, 0, "m"], + [10778, 0, "a"], + [10779, 0, "t"], + [10780, 0, "h"], + [10781, 0, "i"], + [10782, 0, "t"], + [10783, 0, "{"], + [10784, 0, "n"], + [10784, 1], + [10784, 0, "i"], + [10785, 0, "d"], + [10786, 0, "}"], + [10787, 0, "$"], + [10788, 0, "."], + [10541, 0, "\n"], + [10542, 0, "\\"], + [10543, 0, "b"], + [10544, 0, "e"], + [10545, 0, "g"], + [10546, 0, "i"], + [10547, 0, "n"], + [10548, 0, "{"], + [10549, 0, "a"], + [10550, 0, "l"], + [10551, 0, "i"], + [10552, 0, "g"], + [10553, 0, "n"], + [10554, 0, "*"], + [10555, 0, "}"], + [10559, 1], + [10558, 1], + [10557, 1], + [10669, 1], + [10668, 1], + [10668, 0, "\\"], + [10669, 0, "\\"], + [10671, 0, "\\"], + [10672, 0, "t"], + [10673, 0, "e"], + [10674, 0, "x"], + [10675, 0, "t"], + [10676, 0, "{"], + [10682, 0, "}"], + [10683, 0, "\\"], + [10684, 0, "q"], + [10685, 0, "u"], + [10686, 0, "a"], + [10687, 0, "d"], + [10749, 1], + [10748, 1], + [10747, 1], + [10746, 1], + [10745, 1], + [10744, 1], + [10743, 1], + [10743, 0, " "], + [10744, 0, "\\"], + [10745, 0, "\\"], + [10746, 0, "\n"], + [10774, 1], + [10775, 0, "\\"], + [10776, 0, "q"], + [10777, 0, "u"], + [10778, 0, "a"], + [10779, 0, "d"], + [10780, 0, "\\"], + [10781, 0, "t"], + [10782, 0, "e"], + [10783, 0, "x"], + [10784, 0, "t"], + [10785, 0, "{"], + [10789, 0, "}"], + [10790, 0, "\\"], + [10791, 0, "q"], + [10792, 0, "u"], + [10793, 0, "a"], + [10794, 0, "d"], + [10796, 1], + [10823, 1], + [10824, 0, "\n"], + [10825, 0, "\\"], + [10826, 0, "e"], + [10827, 0, "n"], + [10828, 0, "d"], + [10829, 0, "{"], + [10830, 0, "a"], + [10831, 0, "l"], + [10832, 0, "i"], + [10833, 0, "g"], + [10834, 0, "n"], + [10835, 0, "*"], + [10836, 0, "}"], + [10689, 1], + [10562, 0, "&"], + [10709, 0, "&"], + [10748, 0, "&"], + [10749, 0, " "], + [10690, 0, "&"], + [10691, 0, " "], + [10711, 1], + [10564, 0, "&"], + [10692, 0, "&"], + [10689, 1], + [10688, 1], + [10687, 1], + [10686, 1], + [10685, 1], + [10746, 0, "&"], + [10746, 1], + [10686, 1], + [10685, 0, "\\"], + [10686, 0, "q"], + [10687, 0, "u"], + [10688, 0, "a"], + [10689, 0, "d"], + [10564, 1], + [10565, 0, "&"], + [10566, 0, " "], + [10562, 1], + [10563, 0, "\\"], + [10564, 0, ";"], + [10845, 0, "\n"], + [10846, 0, "\n"], + [10846, 0, "T"], + [10847, 0, "h"], + [10848, 0, "e"], + [10849, 0, " "], + [10850, 0, "r"], + [10851, 0, "u"], + [10852, 0, "l"], + [10853, 0, "e"], + [10854, 0, "s"], + [10855, 0, " "], + [10856, 0, "t"], + [10857, 0, "h"], + [10858, 0, "a"], + [10859, 0, "t"], + [10860, 0, " "], + [10861, 0, "m"], + [10862, 0, "o"], + [10863, 0, "d"], + [10864, 0, "i"], + [10865, 0, "f"], + [10866, 0, "y"], + [10867, 0, " "], + [10868, 0, "a"], + [10869, 0, " "], + [10870, 0, "p"], + [10871, 0, "p"], + [10871, 1], + [10871, 0, "e"], + [10872, 0, "e"], + [10873, 0, "r"], + [10874, 0, "'"], + [10875, 0, "s"], + [10876, 0, " "], + [10877, 0, "s"], + [10878, 0, "t"], + [10879, 0, "a"], + [10880, 0, "t"], + [10881, 0, "e"], + [10882, 0, " "], + [10883, 0, "n"], + [10884, 0, "e"], + [10885, 0, "v"], + [10886, 0, "e"], + [10887, 0, "r"], + [10888, 0, " "], + [10889, 0, "r"], + [10890, 0, "e"], + [10891, 0, "m"], + [10892, 0, "o"], + [10893, 0, "v"], + [10894, 0, "e"], + [10895, 0, " "], + [10896, 0, "a"], + [10897, 0, "n"], + [10898, 0, " "], + [10899, 0, "I"], + [10900, 0, "D"], + [10901, 0, " "], + [10902, 0, "f"], + [10903, 0, "r"], + [10904, 0, "o"], + [10905, 0, "m"], + [10906, 0, " "], + [10907, 0, "t"], + [10908, 0, "h"], + [10909, 0, "e"], + [10910, 0, " "], + [10911, 0, "s"], + [10912, 0, "t"], + [10913, 0, "a"], + [10914, 0, "t"], + [10915, 0, "e"], + [10916, 0, " "], + [10917, 0, "("], + [10915, 1], + [10914, 1], + [10913, 1], + [10912, 1], + [10911, 1], + [10910, 1], + [10909, 1], + [10908, 1], + [10907, 1], + [10906, 1], + [10905, 1], + [10904, 1], + [10903, 1], + [10902, 1], + [10901, 1], + [10903, 0, "i"], + [10904, 0, "."], + [10905, 0, "e"], + [10906, 0, "."], + [10907, 0, "\\"], + [10908, 0, " "], + [10909, 0, "t"], + [10910, 0, "h"], + [10911, 0, "e"], + [10912, 0, " "], + [10913, 0, "d"], + [10914, 0, "o"], + [10915, 0, "m"], + [10916, 0, "a"], + [10917, 0, "i"], + [10918, 0, "n"], + [10919, 0, " "], + [10920, 0, "o"], + [10921, 0, "f"], + [10922, 0, " "], + [10923, 0, "t"], + [10924, 0, "h"], + [10925, 0, "e"], + [10926, 0, " "], + [10927, 0, "p"], + [10928, 0, "a"], + [10929, 0, "r"], + [10930, 0, "t"], + [10931, 0, "i"], + [10932, 0, "a"], + [10933, 0, "l"], + [10934, 0, " "], + [10935, 0, "f"], + [10936, 0, "u"], + [10937, 0, "n"], + [10938, 0, "c"], + [10939, 0, "t"], + [10940, 0, "i"], + [10941, 0, "o"], + [10942, 0, "n"], + [10943, 0, " "], + [10944, 0, "$"], + [10945, 0, "A"], + [10946, 0, "$"], + [10947, 0, " "], + [10948, 0, "m"], + [10949, 0, "o"], + [10950, 0, "n"], + [10951, 0, "o"], + [10952, 0, "t"], + [10953, 0, "o"], + [10954, 0, "n"], + [10955, 0, "i"], + [10956, 0, "c"], + [10957, 0, "a"], + [10958, 0, "l"], + [10959, 0, "l"], + [10960, 0, "y"], + [10961, 0, " "], + [10962, 0, "g"], + [10963, 0, "r"], + [10964, 0, "o"], + [10965, 0, "w"], + [10966, 0, "s"], + [10967, 0, " "], + [10968, 0, "a"], + [10969, 0, "s"], + [10970, 0, " "], + [10971, 0, "o"], + [10972, 0, "p"], + [10973, 0, "e"], + [10974, 0, "r"], + [10975, 0, "a"], + [10976, 0, "t"], + [10977, 0, "i"], + [10978, 0, "o"], + [10979, 0, "n"], + [10980, 0, "s"], + [10981, 0, " "], + [10982, 0, "a"], + [10983, 0, "r"], + [10984, 0, "e"], + [10985, 0, " "], + [10986, 0, "a"], + [10987, 0, "p"], + [10988, 0, "p"], + [10989, 0, "l"], + [10990, 0, "i"], + [10991, 0, "e"], + [10992, 0, "d"], + [10993, 0, ")"], + [10994, 0, "."], + [10995, 0, " "], + [10996, 0, "T"], + [10997, 0, "h"], + [10998, 0, "u"], + [10999, 0, "s"], + [11000, 0, ","], + [11001, 0, " "], + [11002, 0, "w"], + [11003, 0, "h"], + [11004, 0, "e"], + [11005, 0, "n"], + [11006, 0, " "], + [11007, 0, "$"], + [11008, 0, "o"], + [11009, 0, "_"], + [11010, 0, "{"], + [11011, 0, "n"], + [11012, 0, "+"], + [11013, 0, "1"], + [11014, 0, "}"], + [11015, 0, "$"], + [11016, 0, " "], + [11017, 0, "i"], + [11018, 0, "s"], + [11019, 0, " "], + [11020, 0, "a"], + [11021, 0, "p"], + [11022, 0, "p"], + [11023, 0, "l"], + [11024, 0, "i"], + [11025, 0, "e"], + [11026, 0, "d"], + [11027, 0, " "], + [11028, 0, "a"], + [11029, 0, "t"], + [11030, 0, " "], + [11031, 0, "a"], + [11032, 0, "n"], + [11033, 0, "o"], + [11034, 0, "t"], + [11035, 0, "h"], + [11036, 0, "e"], + [11037, 0, "r"], + [11038, 0, " "], + [11039, 0, "p"], + [11040, 0, "e"], + [11041, 0, "e"], + [11042, 0, "r"], + [11043, 0, " "], + [11044, 0, "$"], + [11045, 0, "q"], + [11046, 0, "$"], + [11047, 0, " "], + [11048, 0, "a"], + [11049, 0, "t"], + [11050, 0, " "], + [11051, 0, "a"], + [11052, 0, "n"], + [11053, 0, "y"], + [11054, 0, " "], + [11055, 0, "c"], + [11056, 0, "a"], + [11057, 0, "u"], + [11058, 0, "s"], + [11059, 0, "a"], + [11060, 0, "l"], + [11061, 0, "l"], + [11062, 0, "y"], + [11063, 0, " "], + [11064, 0, "r"], + [11065, 0, "e"], + [11066, 0, "a"], + [11067, 0, "d"], + [11068, 0, "y"], + [11069, 0, " "], + [11070, 0, "t"], + [11071, 0, "i"], + [11072, 0, "m"], + [11073, 0, "e"], + [11074, 0, " "], + [11075, 0, "i"], + [11076, 0, "n"], + [11077, 0, " "], + [11078, 0, "i"], + [11079, 0, "t"], + [11080, 0, "s"], + [11081, 0, " "], + [11082, 0, "h"], + [11083, 0, "i"], + [11084, 0, "s"], + [11085, 0, "t"], + [11086, 0, "o"], + [11087, 0, "r"], + [11088, 0, "y"], + [11089, 0, ","], + [11090, 0, " "], + [11091, 0, "$"], + [11092, 0, "\\"], + [11093, 0, "m"], + [11094, 0, "a"], + [11095, 0, "t"], + [11096, 0, "h"], + [11097, 0, "i"], + [11098, 0, "t"], + [11099, 0, "{"], + [11100, 0, "p"], + [11101, 0, "r"], + [11102, 0, "e"], + [11103, 0, "v"], + [11104, 0, "}"], + [11105, 0, "$"], + [11106, 0, " "], + [11092, 0, "A"], + [11093, 0, "_"], + [11094, 0, "q"], + [11095, 0, "("], + [11109, 0, ")"], + [11112, 0, "a"], + [11113, 0, "n"], + [11114, 0, "d"], + [11115, 0, " "], + [11116, 0, "$"], + [11117, 0, "A"], + [11118, 0, "_"], + [11119, 0, "q"], + [11120, 0, "("], + [11121, 0, "\\"], + [11122, 0, "m"], + [11123, 0, "a"], + [11124, 0, "t"], + [11125, 0, "h"], + [11126, 0, "i"], + [11127, 0, "t"], + [11128, 0, "{"], + [11129, 0, "n"], + [11130, 0, "e"], + [11131, 0, "x"], + [11132, 0, "t"], + [11133, 0, "}"], + [11134, 0, ")"], + [11135, 0, "$"], + [11136, 0, " "], + [11137, 0, "m"], + [11138, 0, "u"], + [11139, 0, "s"], + [11140, 0, "t"], + [11141, 0, " "], + [11142, 0, "b"], + [11143, 0, "e"], + [11144, 0, " "], + [11145, 0, "d"], + [11146, 0, "e"], + [11147, 0, "f"], + [11148, 0, "i"], + [11149, 0, "n"], + [11150, 0, "e"], + [11151, 0, "d"], + [11152, 0, " "], + [11153, 0, "i"], + [11154, 0, "n"], + [11155, 0, " "], + [11156, 0, "t"], + [11157, 0, "h"], + [11158, 0, "e"], + [11159, 0, " "], + [11160, 0, "s"], + [11161, 0, "t"], + [11162, 0, "a"], + [11163, 0, "t"], + [11164, 0, "e"], + [11165, 0, " "], + [11166, 0, "$"], + [11167, 0, "A"], + [11168, 0, "_"], + [11169, 0, "q"], + [11170, 0, "$"], + [11171, 0, " "], + [11172, 0, "o"], + [11173, 0, "f"], + [11174, 0, " "], + [11175, 0, "$"], + [11176, 0, "Q"], + [11176, 1], + [11176, 0, "q"], + [11177, 0, "$"], + [11178, 0, " "], + [11179, 0, "a"], + [11180, 0, "t"], + [11181, 0, " "], + [11182, 0, "t"], + [11183, 0, "h"], + [11184, 0, "e"], + [11185, 0, " "], + [11186, 0, "t"], + [11187, 0, "i"], + [11188, 0, "m"], + [11189, 0, "e"], + [11190, 0, " "], + [11191, 0, "w"], + [11192, 0, "h"], + [11193, 0, "e"], + [11194, 0, "n"], + [11195, 0, " "], + [11196, 0, "$"], + [11197, 0, "O"], + [11197, 1], + [11197, 0, "o"], + [11198, 0, "_"], + [11199, 0, "{"], + [11200, 0, "n"], + [11201, 0, "+"], + [11202, 0, "1"], + [11203, 0, "}"], + [11204, 0, "$"], + [11205, 0, " "], + [11206, 0, "i"], + [11207, 0, "s"], + [11208, 0, " "], + [11209, 0, "a"], + [11210, 0, "p"], + [11211, 0, "p"], + [11212, 0, "l"], + [11213, 0, "i"], + [11214, 0, "e"], + [11215, 0, "d"], + [11216, 0, "."], + [11215, 1], + [11214, 1], + [11213, 1], + [11212, 1], + [11211, 1], + [11210, 1], + [11209, 1], + [11208, 1], + [11207, 1], + [11206, 1], + [11205, 1], + [11204, 1], + [11203, 1], + [11202, 1], + [11201, 1], + [11200, 1], + [11199, 1], + [11198, 1], + [11197, 1], + [11196, 1], + [11195, 1], + [11194, 1], + [11193, 1], + [11192, 1], + [11191, 1], + [11190, 1], + [11189, 1], + [11188, 1], + [11187, 1], + [11186, 1], + [11185, 1], + [11184, 1], + [11183, 1], + [11182, 1], + [11181, 1], + [11180, 1], + [11179, 1], + [11178, 1], + [11177, 1], + [11177, 0, "$"], + [11177, 1], + [11176, 1], + [11175, 1], + [11174, 1], + [11173, 1], + [11172, 1], + [11171, 1], + [11172, 0, "\n"], + [11173, 0, "\n"], + [11174, 0, "N"], + [11175, 0, "o"], + [11176, 0, "t"], + [11177, 0, "e"], + [11178, 0, " "], + [11179, 0, "t"], + [11180, 0, "h"], + [11181, 0, "s"], + [11181, 1], + [11181, 0, "a"], + [11182, 0, "t"], + [11183, 0, " "], + [11184, 0, "t"], + [11185, 0, "h"], + [11186, 0, "e"], + [11187, 0, " "], + [11188, 0, "l"], + [11189, 0, "i"], + [11190, 0, "n"], + [11191, 0, "k"], + [11192, 0, "e"], + [11193, 0, "d"], + [11194, 0, " "], + [11195, 0, "l"], + [11196, 0, "i"], + [11197, 0, "s"], + [11198, 0, "t"], + [11199, 0, " "], + [11200, 0, "s"], + [11201, 0, "t"], + [11202, 0, "r"], + [11203, 0, "u"], + [11204, 0, "c"], + [11205, 0, "t"], + [11206, 0, "u"], + [11207, 0, "r"], + [11208, 0, "e"], + [11209, 0, " "], + [11210, 0, "i"], + [11211, 0, "s"], + [11212, 0, " "], + [11213, 0, "o"], + [11214, 0, "n"], + [11215, 0, "l"], + [11216, 0, "y"], + [11217, 0, " "], + [11218, 0, "m"], + [11219, 0, "o"], + [11220, 0, "d"], + [11221, 0, "i"], + [11222, 0, "f"], + [11223, 0, "i"], + [11224, 0, "e"], + [11225, 0, "d"], + [11226, 0, " "], + [11227, 0, "b"], + [11228, 0, "y"], + [11229, 0, " "], + [11230, 0, "a"], + [11231, 0, "p"], + [11232, 0, "p"], + [11233, 0, "l"], + [11234, 0, "y"], + [11235, 0, "i"], + [11236, 0, "n"], + [11237, 0, "g"], + [11238, 0, " "], + [11239, 0, "$"], + [11240, 0, "\\"], + [11241, 0, "]"], + [11241, 1], + [11241, 0, "m"], + [11242, 0, "a"], + [11243, 0, "t"], + [11244, 0, "h"], + [11245, 0, "s"], + [11246, 0, "f"], + [11247, 0, "{"], + [11248, 0, "i"], + [11249, 0, "n"], + [11250, 0, "s"], + [11251, 0, "e"], + [11252, 0, "r"], + [11253, 0, "t"], + [11254, 0, "}"], + [11255, 0, "$"], + [11256, 0, " "], + [11257, 0, "o"], + [11258, 0, "p"], + [11259, 0, "e"], + [11260, 0, "r"], + [11261, 0, "a"], + [11262, 0, "t"], + [11263, 0, "i"], + [11264, 0, "o"], + [11265, 0, "n"], + [11266, 0, "s"], + [11267, 0, " "], + [11268, 0, "("], + [11269, 0, "$"], + [11270, 0, "\\"], + [11271, 0, "m"], + [11272, 0, "a"], + [11273, 0, "t"], + [11274, 0, "h"], + [11275, 0, "s"], + [11276, 0, "f"], + [11277, 0, "{"], + [11278, 0, "d"], + [11279, 0, "e"], + [11280, 0, "l"], + [11281, 0, "e"], + [11282, 0, "t"], + [11283, 0, "e"], + [11284, 0, "}"], + [11285, 0, " "], + [11285, 1], + [11285, 0, "$"], + [11286, 0, " "], + [11287, 0, "o"], + [11288, 0, "p"], + [11289, 0, "e"], + [11290, 0, "r"], + [11291, 0, "a"], + [11292, 0, "t"], + [11293, 0, "i"], + [11294, 0, "o"], + [11295, 0, "n"], + [11296, 0, "s"], + [11297, 0, " "], + [11298, 0, "m"], + [11299, 0, "o"], + [11300, 0, "d"], + [11301, 0, "i"], + [11302, 0, "f"], + [11303, 0, "y"], + [11304, 0, " "], + [11305, 0, "v"], + [11306, 0, "a"], + [11307, 0, "l"], + [11308, 0, "u"], + [11309, 0, "e"], + [11310, 0, "s"], + [11311, 0, ","], + [11312, 0, " "], + [11313, 0, "b"], + [11314, 0, "u"], + [11315, 0, "t"], + [11316, 0, " "], + [11317, 0, "t"], + [11317, 1], + [11317, 0, "n"], + [11318, 0, "o"], + [11319, 0, "t"], + [11320, 0, " "], + [11321, 0, "t"], + [11322, 0, "h"], + [11323, 0, "e"], + [11324, 0, " "], + [11325, 0, "o"], + [11326, 0, "r"], + [11327, 0, "d"], + [11328, 0, "e"], + [11329, 0, "r"], + [11330, 0, " "], + [11331, 0, "o"], + [11332, 0, "f"], + [11333, 0, " "], + [11334, 0, "i"], + [11335, 0, "t"], + [11336, 0, "e"], + [11337, 0, "m"], + [11338, 0, "s"], + [11339, 0, " "], + [11340, 0, "i"], + [11341, 0, "n"], + [11342, 0, " "], + [11343, 0, "t"], + [11344, 0, "h"], + [11345, 0, "e"], + [11346, 0, " "], + [11347, 0, "l"], + [11348, 0, "i"], + [11349, 0, "s"], + [11350, 0, "t"], + [11351, 0, ")"], + [11352, 0, ","], + [11353, 0, " "], + [11354, 0, "a"], + [11355, 0, "n"], + [11356, 0, "d"], + [11357, 0, " "], + [11358, 0, "a"], + [11359, 0, "p"], + [11360, 0, "p"], + [11361, 0, "l"], + [11362, 0, "y"], + [11363, 0, "i"], + [11364, 0, "n"], + [11365, 0, "g"], + [11366, 0, " "], + [11367, 0, "a"], + [11368, 0, "n"], + [11369, 0, " "], + [11370, 0, "$"], + [11371, 0, "\\"], + [11372, 0, "m"], + [11373, 0, "a"], + [11374, 0, "t"], + [11375, 0, "h"], + [11376, 0, "s"], + [11377, 0, "f"], + [11378, 0, "{"], + [11379, 0, "i"], + [11380, 0, "n"], + [11381, 0, "s"], + [11382, 0, "e"], + [11383, 0, "r"], + [11384, 0, "t"], + [11385, 0, "}"], + [11386, 0, "$"], + [11387, 0, " "], + [11388, 0, "o"], + [11389, 0, "p"], + [11390, 0, "e"], + [11391, 0, "r"], + [11392, 0, "a"], + [11393, 0, "t"], + [11394, 0, "i"], + [11395, 0, "o"], + [11396, 0, "n"], + [11397, 0, " "], + [11398, 0, "a"], + [11399, 0, "l"], + [11400, 0, "w"], + [11401, 0, "a"], + [11402, 0, "y"], + [11403, 0, "s"], + [11404, 0, " "], + [4621, 0, " "], + [4622, 0, "a"], + [4623, 0, "n"], + [4624, 0, "d"], + [4625, 0, " "], + [4626, 0, "$"], + [4627, 0, "\\"], + [4628, 0, "m"], + [4629, 0, "a"], + [4630, 0, "t"], + [4631, 0, "h"], + [4632, 0, "s"], + [4633, 0, "f"], + [4634, 0, "{"], + [4635, 0, "h"], + [4636, 0, "e"], + [4637, 0, "a"], + [4638, 0, "d"], + [4639, 0, "}"], + [4640, 0, " "], + [4641, 0, "<"], + [4642, 0, " "], + [4643, 0, "("], + [4644, 0, "c"], + [4645, 0, ","], + [4646, 0, " "], + [4647, 0, "p"], + [4648, 0, ")"], + [4649, 0, "$"], + [11433, 1], + [11432, 1], + [11431, 1], + [11430, 1], + [11429, 1], + [11428, 1], + [11427, 1], + [11426, 1], + [11425, 1], + [11424, 1], + [11423, 1], + [11422, 1], + [11421, 1], + [11420, 1], + [11419, 1], + [11418, 1], + [11417, 1], + [11416, 1], + [11415, 1], + [11414, 1], + [11413, 1], + [11412, 1], + [11411, 1], + [11410, 1], + [11409, 1], + [11408, 1], + [11407, 1], + [11406, 1], + [11405, 1], + [11404, 1], + [11403, 1], + [11402, 1], + [11401, 1], + [11400, 1], + [11399, 1], + [11398, 1], + [11397, 1], + [11396, 1], + [11395, 1], + [11394, 1], + [11393, 1], + [11392, 1], + [11391, 1], + [11390, 1], + [11389, 1], + [11388, 1], + [11387, 1], + [11386, 1], + [11385, 1], + [11384, 1], + [11383, 1], + [11382, 1], + [11381, 1], + [11381, 0, "."], + [11381, 0, ","], + [11382, 0, " "], + [11383, 0, "s"], + [11384, 0, "o"], + [11385, 0, " "], + [11386, 0, "$"], + [11387, 0, "o"], + [11388, 0, "_"], + [11389, 0, "{"], + [11390, 0, "n"], + [11391, 0, "+"], + [11392, 0, "1"], + [11393, 0, "}"], + [11394, 0, "$"], + [11395, 0, " "], + [11381, 1], + [11381, 0, "."], + [11382, 0, " "], + [11383, 0, "C"], + [11384, 0, "a"], + [11385, 0, "u"], + [11386, 0, "s"], + [11387, 0, "a"], + [11388, 0, "l"], + [11389, 0, "l"], + [11390, 0, "y"], + [11391, 0, " "], + [11392, 0, "o"], + [11393, 0, "r"], + [11394, 0, "d"], + [11395, 0, "e"], + [11396, 0, "r"], + [11397, 0, "e"], + [11398, 0, "d"], + [11399, 0, " "], + [11400, 0, "d"], + [11401, 0, "e"], + [11402, 0, "l"], + [11403, 0, "i"], + [11404, 0, "v"], + [11405, 0, "e"], + [11406, 0, "r"], + [11407, 0, "y"], + [11408, 0, " "], + [11409, 0, "r"], + [11410, 0, "e"], + [11411, 0, "q"], + [11412, 0, "u"], + [11413, 0, "i"], + [11414, 0, "r"], + [11415, 0, "e"], + [11416, 0, "s"], + [11417, 0, " "], + [11418, 0, "$"], + [11419, 0, "o"], + [11420, 0, "_"], + [11421, 0, "{"], + [11422, 0, "n"], + [11423, 0, "+"], + [11424, 0, "1"], + [11425, 0, "}"], + [11426, 0, "$"], + [11427, 0, " "], + [11428, 0, "t"], + [11429, 0, "o"], + [11430, 0, " "], + [11431, 0, "b"], + [11432, 0, "e"], + [11433, 0, " "], + [11434, 0, "d"], + [11435, 0, "e"], + [11436, 0, "l"], + [11437, 0, "i"], + [11438, 0, "v"], + [11439, 0, "e"], + [11440, 0, "r"], + [11441, 0, "e"], + [11442, 0, "d"], + [11443, 0, " "], + [11444, 0, "a"], + [11445, 0, "f"], + [11446, 0, "t"], + [11446, 1], + [11445, 1], + [11444, 1], + [11443, 1], + [11442, 1], + [11441, 1], + [11440, 1], + [11439, 1], + [11438, 1], + [11437, 1], + [11436, 1], + [11435, 1], + [11434, 1], + [11434, 0, "a"], + [11435, 0, "p"], + [11436, 0, "p"], + [11437, 0, "l"], + [11438, 0, "i"], + [11439, 0, "e"], + [11440, 0, "d"], + [11441, 0, " "], + [11407, 1], + [11406, 1], + [11405, 1], + [11404, 1], + [11403, 1], + [11402, 1], + [11401, 1], + [11400, 1], + [11399, 1], + [11398, 1], + [11397, 1], + [11397, 0, "i"], + [11398, 0, "n"], + [11399, 0, "g"], + [11434, 0, "a"], + [11435, 0, "f"], + [11436, 0, "t"], + [11437, 0, "e"], + [11438, 0, "r"], + [11439, 0, " "], + [11440, 0, "a"], + [11441, 0, "n"], + [11442, 0, "y"], + [11443, 0, " "], + [11444, 0, "o"], + [11445, 0, "p"], + [11446, 0, "e"], + [11447, 0, "r"], + [11448, 0, "a"], + [11449, 0, "t"], + [11450, 0, "i"], + [11451, 0, "o"], + [11452, 0, "n"], + [11453, 0, " "], + [11454, 0, "t"], + [11455, 0, "h"], + [11456, 0, "a"], + [11457, 0, "t"], + [11458, 0, " "], + [11459, 0, "h"], + [11460, 0, "a"], + [11461, 0, "p"], + [11462, 0, "p"], + [11463, 0, "e"], + [11464, 0, "n"], + [11465, 0, "e"], + [11466, 0, "d"], + [11467, 0, " "], + [11468, 0, "b"], + [11469, 0, "e"], + [11470, 0, "f"], + [11471, 0, "o"], + [11472, 0, "r"], + [11473, 0, "e"], + [11474, 0, " "], + [11475, 0, "a"], + [11476, 0, "n"], + [11477, 0, "d"], + [11478, 0, " "], + [11479, 0, "b"], + [11480, 0, "e"], + [11481, 0, "f"], + [11482, 0, "o"], + [11483, 0, "r"], + [11484, 0, "e"], + [11485, 0, " "], + [11486, 0, "a"], + [11487, 0, "n"], + [11488, 0, "y"], + [11489, 0, " "], + [11490, 0, "o"], + [11491, 0, "p"], + [11492, 0, "e"], + [11493, 0, "r"], + [11494, 0, "a"], + [11495, 0, "t"], + [11496, 0, "i"], + [11497, 0, "o"], + [11498, 0, "n"], + [11499, 0, " "], + [11500, 0, "t"], + [11501, 0, "h"], + [11502, 0, "a"], + [11503, 0, "t"], + [11504, 0, " "], + [11505, 0, "h"], + [11506, 0, "a"], + [11507, 0, "p"], + [11508, 0, "p"], + [11509, 0, "e"], + [11510, 0, "n"], + [11511, 0, "e"], + [11512, 0, "d"], + [11513, 0, " "], + [11514, 0, "c"], + [11515, 0, "a"], + [11516, 0, "u"], + [11517, 0, "s"], + [11518, 0, "a"], + [11519, 0, "l"], + [11520, 0, "l"], + [11521, 0, "y"], + [11522, 0, " "], + [11523, 0, "l"], + [11524, 0, "a"], + [11525, 0, "t"], + [11526, 0, "e"], + [11527, 0, "r"], + [11528, 0, ","], + [11532, 0, " "], + [11533, 0, "w"], + [11534, 0, "e"], + [11535, 0, " "], + [11536, 0, "n"], + [11537, 0, "e"], + [11538, 0, "e"], + [11539, 0, "d"], + [11540, 0, " "], + [11541, 0, "o"], + [11542, 0, "n"], + [11543, 0, "l"], + [11544, 0, "y"], + [11545, 0, " "], + [11546, 0, "c"], + [11547, 0, "o"], + [11548, 0, "n"], + [11549, 0, "s"], + [11550, 0, "i"], + [11551, 0, "d"], + [11552, 0, "e"], + [11553, 0, "r"], + [11554, 0, " "], + [11555, 0, "a"], + [11556, 0, "l"], + [11557, 0, "l"], + [11558, 0, " "], + [11559, 0, "p"], + [11560, 0, "o"], + [11561, 0, "s"], + [11562, 0, "s"], + [11563, 0, "i"], + [11564, 0, "b"], + [11565, 0, "l"], + [11566, 0, "e"], + [11567, 0, " "], + [11568, 0, "o"], + [11569, 0, "r"], + [11570, 0, "d"], + [11571, 0, "e"], + [11572, 0, "r"], + [11573, 0, "i"], + [11574, 0, "n"], + [11575, 0, "g"], + [11576, 0, "s"], + [11577, 0, " "], + [11578, 0, "o"], + [11579, 0, "f"], + [11591, 0, "w"], + [11592, 0, "i"], + [11593, 0, "t"], + [11594, 0, "h"], + [11595, 0, " "], + [11596, 0, "r"], + [11597, 0, "e"], + [11598, 0, "s"], + [11599, 0, "p"], + [11600, 0, "e"], + [11601, 0, "c"], + [11602, 0, "t"], + [11603, 0, " "], + [11604, 0, "t"], + [11605, 0, "o"], + [11606, 0, " "], + [11607, 0, "o"], + [11608, 0, "t"], + [11609, 0, "h"], + [11610, 0, "e"], + [11611, 0, "r"], + [11612, 0, " "], + [11613, 0, "c"], + [11614, 0, "o"], + [11615, 0, "n"], + [11616, 0, "c"], + [11617, 0, "u"], + [11618, 0, "r"], + [11619, 0, "r"], + [11620, 0, "e"], + [11621, 0, "n"], + [11622, 0, "t"], + [11623, 0, " "], + [11624, 0, "\\"], + [11624, 1], + [11624, 0, "$"], + [11625, 0, "\\"], + [11626, 0, "m"], + [11627, 0, "a"], + [11628, 0, "t"], + [11629, 0, "h"], + [11630, 0, "s"], + [11631, 0, "f"], + [11632, 0, "{"], + [11633, 0, "i"], + [11634, 0, "n"], + [11635, 0, "s"], + [11636, 0, "e"], + [11637, 0, "r"], + [11638, 0, "t"], + [11639, 0, "}"], + [11640, 0, "$"], + [11641, 0, " "], + [11642, 0, "o"], + [11643, 0, "p"], + [11644, 0, "e"], + [11645, 0, "r"], + [11646, 0, "a"], + [11647, 0, "t"], + [11648, 0, "i"], + [11649, 0, "o"], + [11650, 0, "n"], + [11651, 0, "s"], + [11390, 1], + [11389, 1], + [11652, 0, "\n"], + [11653, 0, "\n"], + [11653, 0, "M"], + [11654, 0, "o"], + [11655, 0, "r"], + [11656, 0, "e"], + [11657, 0, "o"], + [11658, 0, "v"], + [11659, 0, "e"], + [11660, 0, "r"], + [11661, 0, ","], + [11662, 0, " "], + [11663, 0, "t"], + [11664, 0, "h"], + [11665, 0, "e"], + [11666, 0, " "], + [11667, 0, "l"], + [11668, 0, "i"], + [11669, 0, "s"], + [11670, 0, "t"], + [11671, 0, " "], + [11672, 0, "s"], + [11673, 0, "t"], + [11674, 0, "r"], + [11675, 0, "u"], + [11676, 0, "c"], + [11677, 0, "t"], + [11678, 0, "u"], + [11679, 0, "r"], + [11680, 0, "e"], + [11681, 0, " "], + [11682, 0, "i"], + [11683, 0, "s"], + [11684, 0, " "], + [11685, 0, "o"], + [11686, 0, "n"], + [11687, 0, "l"], + [11688, 0, "y"], + [11689, 0, " "], + [11690, 0, "m"], + [11691, 0, "o"], + [11692, 0, "d"], + [11693, 0, "i"], + [11694, 0, "f"], + [11695, 0, "i"], + [11696, 0, "e"], + [11697, 0, "d"], + [11698, 0, " "], + [11699, 0, "b"], + [11700, 0, "y"], + [11701, 0, " "], + [11702, 0, "i"], + [11703, 0, "n"], + [11704, 0, "s"], + [11705, 0, "e"], + [11706, 0, "r"], + [11707, 0, "t"], + [11708, 0, "i"], + [11709, 0, "n"], + [11710, 0, "g"], + [11711, 0, " "], + [11712, 0, "a"], + [11713, 0, " "], + [11714, 0, "n"], + [11715, 0, "e"], + [11716, 0, "w"], + [11717, 0, " "], + [11718, 0, "e"], + [11719, 0, "l"], + [11720, 0, "e"], + [11721, 0, "m"], + [11722, 0, "e"], + [11723, 0, "n"], + [11724, 0, "t"], + [11725, 0, " "], + [11726, 0, "b"], + [11727, 0, "e"], + [11728, 0, "t"], + [11729, 0, "w"], + [11730, 0, "e"], + [11731, 0, "e"], + [11732, 0, "n"], + [11733, 0, " "], + [11734, 0, "t"], + [11735, 0, "w"], + [11736, 0, "o"], + [11737, 0, " "], + [11738, 0, "e"], + [11739, 0, "x"], + [11740, 0, "i"], + [11741, 0, "s"], + [11742, 0, "t"], + [11743, 0, "i"], + [11744, 0, "n"], + [11745, 0, "g"], + [11746, 0, ","], + [11747, 0, " "], + [11748, 0, "a"], + [11749, 0, "d"], + [11750, 0, "j"], + [11751, 0, "a"], + [11752, 0, "c"], + [11753, 0, "e"], + [11754, 0, "n"], + [11755, 0, "t"], + [11756, 0, " "], + [11757, 0, "e"], + [11758, 0, "l"], + [11759, 0, "e"], + [11760, 0, "m"], + [11761, 0, "e"], + [11762, 0, "n"], + [11763, 0, "t"], + [11764, 0, "s"], + [11765, 0, "."], + [11766, 0, " "], + [11767, 0, "W"], + [11768, 0, "h"], + [11769, 0, "e"], + [11770, 0, "n"], + [11771, 0, " "], + [11772, 0, "$"], + [11773, 0, "o"], + [11774, 0, "{"], + [11774, 1], + [11774, 0, "_"], + [11775, 0, "{"], + [11776, 0, "n"], + [11777, 0, "+"], + [11778, 0, "1"], + [11779, 0, "}"], + [11780, 0, "$"], + [11781, 0, " "], + [11782, 0, "i"], + [11783, 0, "s"], + [11784, 0, " "], + [11785, 0, "a"], + [11786, 0, "p"], + [11787, 0, "p"], + [11788, 0, "l"], + [11789, 0, "i"], + [11790, 0, "e"], + [11791, 0, "d"], + [11792, 0, " "], + [11793, 0, "a"], + [11794, 0, "t"], + [11795, 0, " "], + [11796, 0, "p"], + [11797, 0, "e"], + [11798, 0, "e"], + [11799, 0, "r"], + [11800, 0, " "], + [11801, 0, "$"], + [11802, 0, "q"], + [11803, 0, "$"], + [11804, 0, ","], + [11805, 0, " "], + [11806, 0, "t"], + [11807, 0, "h"], + [11808, 0, "e"], + [11809, 0, " "], + [11810, 0, "e"], + [11811, 0, "l"], + [11812, 0, "e"], + [11813, 0, "m"], + [11814, 0, "e"], + [11815, 0, "n"], + [11816, 0, "t"], + [11817, 0, "s"], + [11818, 0, " "], + [11819, 0, "$"], + [11820, 0, "\\"], + [11821, 0, "m"], + [11822, 0, "a"], + [11823, 0, "t"], + [11824, 0, "h"], + [11825, 0, "i"], + [11826, 0, "t"], + [11827, 0, "{"], + [11828, 0, "p"], + [11829, 0, "r"], + [11830, 0, "e"], + [11831, 0, "v"], + [11832, 0, "}"], + [11833, 0, "$"], + [11834, 0, " "], + [11835, 0, "a"], + [11836, 0, "n"], + [11837, 0, "d"], + [11838, 0, " "], + [11818, 0, " "], + [11819, 0, "i"], + [11820, 0, "d"], + [11821, 0, "e"], + [11822, 0, "n"], + [11823, 0, "t"], + [11824, 0, "i"], + [11825, 0, "f"], + [11826, 0, "i"], + [11827, 0, "e"], + [11828, 0, "d"], + [11829, 0, " "], + [11830, 0, "b"], + [11831, 0, "y"], + [11853, 0, "$"], + [11854, 0, "\\"], + [11855, 0, "m"], + [11856, 0, "a"], + [11857, 0, "t"], + [11858, 0, "h"], + [11859, 0, "i"], + [11860, 0, "t"], + [11861, 0, "{"], + [11862, 0, "n"], + [11863, 0, "e"], + [11864, 0, "x"], + [11865, 0, "t"], + [11866, 0, "}"], + [11867, 0, "$"], + [11868, 0, " "], + [11869, 0, "a"], + [11870, 0, "r"], + [11871, 0, "e"], + [11872, 0, " "], + [11873, 0, "n"], + [11874, 0, "o"], + [11875, 0, " "], + [11876, 0, "l"], + [11877, 0, "o"], + [11878, 0, "n"], + [11879, 0, "g"], + [11880, 0, "e"], + [11881, 0, "r"], + [11882, 0, " "], + [11883, 0, "n"], + [11884, 0, "e"], + [11885, 0, "c"], + [11886, 0, "e"], + [11887, 0, "s"], + [11888, 0, "s"], + [11889, 0, "a"], + [11890, 0, "r"], + [11891, 0, "i"], + [11892, 0, "l"], + [11893, 0, "y"], + [11894, 0, " "], + [11895, 0, "a"], + [11896, 0, "d"], + [11897, 0, "j"], + [11898, 0, "a"], + [11899, 0, "c"], + [11900, 0, "e"], + [11901, 0, "n"], + [11902, 0, "t"], + [11903, 0, " "], + [11904, 0, "("], + [11905, 0, "a"], + [11906, 0, "s"], + [11907, 0, " "], + [11908, 0, "a"], + [11908, 1], + [11907, 1], + [11906, 1], + [11905, 1], + [11904, 1], + [11904, 0, "i"], + [11905, 0, "n"], + [11906, 0, " "], + [11907, 0, "$"], + [11908, 0, "A"], + [11909, 0, "_"], + [11910, 0, "q"], + [11911, 0, "4"], + [11911, 1], + [11911, 0, "$"], + [11912, 0, ","], + [11913, 0, " "], + [11914, 0, "B"], + [11915, 0, "U"], + [11916, 0, "T"], + [11917, 0, " "], + [11917, 1], + [11916, 1], + [11915, 1], + [11914, 1], + [11914, 0, "b"], + [11915, 0, "u"], + [11916, 0, "t"], + [11917, 0, " "], + [11918, 0, "w"], + [11919, 0, "e"], + [11920, 0, " "], + [11921, 0, "k"], + [11922, 0, "n"], + [11923, 0, "o"], + [11924, 0, "w"], + [11925, 0, " "], + [11926, 0, "f"], + [11927, 0, "r"], + [11928, 0, "o"], + [11929, 0, "m"], + [11930, 0, " "], + [11930, 1], + [11929, 1], + [11928, 1], + [11927, 1], + [11926, 1], + [11926, 0, "t"], + [11927, 0, "h"], + [11928, 0, "a"], + [11929, 0, "t"], + [11930, 0, " "], + [11931, 0, "a"], + [11932, 0, "n"], + [11933, 0, "y"], + [11934, 0, " "], + [11935, 0, "o"], + [11936, 0, "t"], + [11937, 0, "h"], + [11938, 0, "e"], + [11939, 0, "r"], + [11940, 0, " "], + [11941, 0, "I"], + [11942, 0, "D"], + [11943, 0, " "], + [11944, 0, "i"], + [11945, 0, "n"], + [11946, 0, "s"], + [11947, 0, "e"], + [11948, 0, "r"], + [11949, 0, "t"], + [11950, 0, "e"], + [11951, 0, "d"], + [11952, 0, " "], + [11953, 0, "b"], + [11954, 0, "e"], + [11955, 0, "t"], + [11956, 0, "w"], + [11957, 0, "e"], + [11958, 0, "e"], + [11959, 0, "n"], + [11960, 0, " "], + [11961, 0, "t"], + [11962, 0, "h"], + [11963, 0, "o"], + [11964, 0, "s"], + [11965, 0, "e"], + [11966, 0, " "], + [11967, 0, "e"], + [11968, 0, "l"], + [11969, 0, "e"], + [11970, 0, "m"], + [11971, 0, "e"], + [11972, 0, "n"], + [11973, 0, "t"], + [11974, 0, "s"], + [11975, 0, " "], + [11976, 0, "m"], + [11977, 0, "u"], + [11978, 0, "s"], + [11979, 0, "t"], + [11980, 0, " "], + [11981, 0, "h"], + [11982, 0, "a"], + [11983, 0, "v"], + [11984, 0, "e"], + [11985, 0, " "], + [11986, 0, "$"], + [11987, 0, "\\"], + [11988, 0, "m"], + [11989, 0, "a"], + [11990, 0, "t"], + [11991, 0, "h"], + [11992, 0, "i"], + [11993, 0, "t"], + [11994, 0, "{"], + [11995, 0, "p"], + [11996, 0, "r"], + [11997, 0, "e"], + [11998, 0, "v"], + [11943, 0, " "], + [11944, 0, "$"], + [11945, 0, "\\"], + [11946, 0, "m"], + [11947, 0, "a"], + [11948, 0, "t"], + [11949, 0, "h"], + [11950, 0, "i"], + [11951, 0, "t"], + [11952, 0, "{"], + [11953, 0, "i"], + [11954, 0, "d"], + [11955, 0, "}"], + [11956, 0, "'"], + [11957, 0, "$"], + [12014, 0, "}"], + [12015, 0, " "], + [12016, 0, "<"], + [12017, 0, " "], + [12018, 0, "\\"], + [12019, 0, "m"], + [12020, 0, "a"], + [12021, 0, "t"], + [12022, 0, "h"], + [12023, 0, "i"], + [12024, 0, "t"], + [12025, 0, "{"], + [12026, 0, "i"], + [12027, 0, "d"], + [12028, 0, "}"], + [12029, 0, "'"], + [12030, 0, "$"], + [12031, 0, " "], + [12032, 0, "a"], + [12033, 0, "n"], + [12034, 0, "d"], + [12035, 0, " "], + [12036, 0, "$"], + [12037, 0, "\\"], + [12038, 0, "m"], + [12039, 0, "a"], + [12040, 0, "t"], + [12041, 0, "h"], + [12042, 0, "i"], + [12043, 0, "t"], + [12044, 0, "{"], + [12045, 0, "n"], + [12046, 0, "e"], + [12047, 0, "x"], + [12048, 0, "t"], + [12049, 0, "}"], + [12050, 0, " "], + [12051, 0, "<"], + [12052, 0, " "], + [12053, 0, "\\"], + [12054, 0, "m"], + [12055, 0, "a"], + [12056, 0, "t"], + [12057, 0, "h"], + [12058, 0, "i"], + [12059, 0, "t"], + [12060, 0, "{"], + [12061, 0, "i"], + [12062, 0, "d"], + [12063, 0, "}"], + [12064, 0, "'"], + [12065, 0, "$"], + [12066, 0, " "], + [12067, 0, "a"], + [12068, 0, "c"], + [12069, 0, "c"], + [12070, 0, "o"], + [12071, 0, "r"], + [12072, 0, "d"], + [12073, 0, "i"], + [12074, 0, "n"], + [12075, 0, "g"], + [12076, 0, " "], + [12077, 0, "t"], + [12078, 0, "o"], + [12079, 0, " "], + [12080, 0, "t"], + [12081, 0, "h"], + [12082, 0, "e"], + [12083, 0, " "], + [12084, 0, "o"], + [12085, 0, "b"], + [12086, 0, "s"], + [12087, 0, "e"], + [12088, 0, "r"], + [12089, 0, "v"], + [12090, 0, "a"], + [12091, 0, "t"], + [12092, 0, "i"], + [12093, 0, "o"], + [12094, 0, "n"], + [12095, 0, " "], + [12096, 0, "a"], + [12097, 0, "b"], + [12098, 0, "o"], + [12099, 0, "v"], + [12100, 0, "e"], + [12101, 0, "."], + [11931, 0, "t"], + [11932, 0, "h"], + [11933, 0, "e"], + [11934, 0, "y"], + [11935, 0, " "], + [11936, 0, "m"], + [11937, 0, "u"], + [11938, 0, "s"], + [11939, 0, "t"], + [11940, 0, " "], + [11941, 0, "s"], + [11942, 0, "t"], + [11943, 0, "i"], + [11944, 0, "l"], + [11945, 0, "l"], + [11946, 0, " "], + [11947, 0, "b"], + [11948, 0, "e"], + [11949, 0, " "], + [11950, 0, "i"], + [11951, 0, "n"], + [11952, 0, " "], + [11953, 0, "t"], + [11954, 0, "h"], + [11955, 0, "e"], + [11956, 0, " "], + [11957, 0, "s"], + [11958, 0, "a"], + [11959, 0, "m"], + [11960, 0, "e"], + [11961, 0, " "], + [11962, 0, "o"], + [11963, 0, "r"], + [11964, 0, "d"], + [11965, 0, "e"], + [11966, 0, "r"], + [11967, 0, ","], + [11968, 0, " "], + [11969, 0, "a"], + [11970, 0, "n"], + [11971, 0, "d"], + [11972, 0, " "], + [11973, 0, "w"], + [11974, 0, "e"], + [11975, 0, " "], + [11975, 1], + [11974, 1], + [11973, 1], + [11972, 1], + [11971, 1], + [11970, 1], + [11969, 1], + [11968, 1], + [11967, 1], + [11967, 0, "."], + [11968, 0, " "], + [11969, 0, "A"], + [11970, 0, "c"], + [11971, 0, "c"], + [11972, 0, "o"], + [11973, 0, "r"], + [11974, 0, "d"], + [11975, 0, "i"], + [11976, 0, "n"], + [11977, 0, "g"], + [11978, 0, " "], + [11979, 0, "t"], + [11980, 0, "o"], + [11981, 0, " "], + [11982, 0, "t"], + [11983, 0, "h"], + [11984, 0, "e"], + [11985, 0, " "], + [11986, 0, "o"], + [11987, 0, "b"], + [11988, 0, "s"], + [11989, 0, "e"], + [11990, 0, "r"], + [11991, 0, "v"], + [11992, 0, "a"], + [11993, 0, "t"], + [11994, 0, "i"], + [11995, 0, "o"], + [11996, 0, "n"], + [11997, 0, " "], + [11998, 0, "a"], + [11999, 0, "b"], + [12000, 0, "o"], + [12001, 0, "v"], + [12002, 0, "e"], + [12003, 0, ","], + [12004, 0, " "], + [12005, 0, "w"], + [12006, 0, "e"], + [12007, 0, " "], + [12008, 0, "a"], + [12009, 0, "l"], + [12010, 0, "s"], + [12011, 0, "o"], + [12012, 0, " "], + [12013, 0, "k"], + [12014, 0, "n"], + [12015, 0, "o"], + [12016, 0, "w"], + [12017, 0, " "], + [12018, 0, "t"], + [12019, 0, "h"], + [12020, 0, "a"], + [12021, 0, "t"], + [12022, 0, " "], + [12192, 1], + [12191, 1], + [12190, 1], + [12189, 1], + [12188, 1], + [12187, 1], + [12186, 1], + [12185, 1], + [12184, 1], + [12183, 1], + [12182, 1], + [12181, 1], + [12180, 1], + [12179, 1], + [12178, 1], + [12177, 1], + [12176, 1], + [12175, 1], + [12174, 1], + [12173, 1], + [12172, 1], + [12171, 1], + [12170, 1], + [12169, 1], + [12168, 1], + [12167, 1], + [12166, 1], + [12165, 1], + [12164, 1], + [12163, 1], + [12162, 1], + [12161, 1], + [12160, 1], + [12159, 1], + [12158, 1], + [11881, 1], + [11880, 1], + [11879, 1], + [11878, 1], + [11877, 1], + [11876, 1], + [11875, 1], + [11875, 0, "t"], + [11472, 0, ","], + [12154, 0, "\n"], + [12155, 0, "\n"], + [11200, 0, ","], + [11201, 0, " "], + [11202, 0, "o"], + [11203, 0, "r"], + [11204, 0, " "], + [11205, 0, "\\"], + [11206, 0, "m"], + [11207, 0, "a"], + [11208, 0, "t"], + [11205, 0, "$"], + [11210, 0, "h"], + [11211, 0, "i"], + [11212, 0, "t"], + [11213, 0, "{"], + [11214, 0, "n"], + [11215, 0, "e"], + [11216, 0, "x"], + [11217, 0, "t"], + [11218, 0, "}"], + [11219, 0, " "], + [11220, 0, "="], + [11221, 0, " "], + [11222, 0, "\\"], + [11223, 0, "m"], + [11224, 0, "a"], + [11225, 0, "t"], + [11226, 0, "h"], + [11227, 0, "s"], + [11228, 0, "f"], + [11229, 0, "{"], + [11230, 0, "t"], + [11231, 0, "a"], + [11232, 0, "i"], + [11233, 0, "l"], + [11234, 0, "}"], + [11235, 0, "$"], + [12192, 0, "B"], + [12193, 0, "y"], + [12194, 0, " "], + [12195, 0, "t"], + [12196, 0, "h"], + [12197, 0, "e"], + [12198, 0, " "], + [12199, 0, "i"], + [12200, 0, "n"], + [12201, 0, "d"], + [12202, 0, "u"], + [12203, 0, "c"], + [12204, 0, "t"], + [12205, 0, "i"], + [12206, 0, "o"], + [12207, 0, "n"], + [12208, 0, " "], + [12209, 0, "h"], + [12210, 0, "y"], + [12211, 0, "p"], + [12212, 0, "o"], + [12213, 0, "t"], + [12214, 0, "h"], + [12215, 0, "e"], + [12216, 0, "s"], + [12217, 0, "i"], + [12218, 0, "s"], + [12219, 0, " "], + [12219, 1], + [12219, 0, ","], + [12220, 0, " "], + [12221, 0, "a"], + [12222, 0, "s"], + [12223, 0, "s"], + [12224, 0, "u"], + [12225, 0, "m"], + [12226, 0, "e"], + [12227, 0, " "], + [12228, 0, "a"], + [12229, 0, " "], + [12229, 1], + [12228, 1], + [12228, 0, "w"], + [12229, 0, "e"], + [12230, 0, " "], + [12231, 0, "h"], + [12232, 0, "a"], + [12233, 0, "v"], + [12234, 0, "e"], + [12235, 0, " "], + [12235, 1], + [12234, 1], + [12233, 1], + [12232, 1], + [12231, 1], + [12230, 1], + [12229, 1], + [12228, 1], + [12227, 1], + [12226, 1], + [12225, 1], + [12224, 1], + [12223, 1], + [12222, 1], + [12221, 1], + [12221, 0, "l"], + [12222, 0, "e"], + [12223, 0, "t"], + [12224, 0, " "], + [12225, 0, "h"], + [12226, 0, "i"], + [12227, 0, "s"], + [12228, 0, "t"], + [12228, 1], + [12227, 1], + [12227, 0, "s"], + [12228, 0, "t"], + [12229, 0, "o"], + [12230, 0, "r"], + [12231, 0, "i"], + [12232, 0, "e"], + [12233, 0, "s"], + [12234, 0, " "], + [12235, 0, "H"], + [12236, 0, "1"], + [12236, 1], + [12235, 1], + [12235, 0, "$"], + [12236, 0, "#"], + [12236, 1], + [12236, 0, "H"], + [12237, 0, "_"], + [12238, 0, "1"], + [12239, 0, "$"], + [12240, 0, " "], + [12241, 0, "a"], + [12242, 0, "n"], + [12243, 0, "d"], + [12244, 0, " "], + [12245, 0, "$"], + [12246, 0, "H"], + [12247, 0, "J"], + [12247, 1], + [12247, 0, "_"], + [12248, 0, "@"], + [12248, 1], + [12248, 0, "2"], + [12249, 0, "$"], + [12250, 0, " "], + [12234, 1], + [12233, 1], + [12232, 1], + [12231, 1], + [12230, 1], + [12229, 1], + [12228, 1], + [12227, 1], + [12226, 1], + [12225, 1], + [12241, 0, "b"], + [12242, 0, "e"], + [12243, 0, " "], + [12244, 0, "c"], + [12245, 0, "a"], + [12246, 0, "u"], + [12247, 0, "s"], + [12248, 0, "a"], + [12249, 0, "l"], + [12250, 0, " "], + [12251, 0, "h"], + [12252, 0, "i"], + [12253, 0, "s"], + [12254, 0, "t"], + [12255, 0, "o"], + [12256, 0, "r"], + [12257, 0, "i"], + [12258, 0, "e"], + [12259, 0, "s"], + [12260, 0, " "], + [12261, 0, "o"], + [12262, 0, "f"], + [12263, 0, " "], + [12264, 0, "o"], + [12265, 0, "p"], + [12266, 0, "e"], + [12267, 0, "r"], + [12268, 0, "a"], + [12269, 0, "t"], + [12270, 0, "i"], + [12271, 0, "o"], + [12272, 0, "n"], + [12273, 0, "s"], + [12274, 0, " "], + [12275, 0, "$"], + [12276, 0, "o"], + [12277, 0, "_"], + [12278, 0, "n"], + [12279, 0, "1"], + [12280, 0, " "], + [12280, 1], + [12279, 1], + [12278, 1], + [12278, 0, "1"], + [12279, 0, " "], + [12280, 0, "\\"], + [12281, 0, "d"], + [12282, 0, "o"], + [12283, 0, "t"], + [12284, 0, "s"], + [12285, 0, " "], + [12286, 0, "o"], + [12287, 0, "_"], + [12288, 0, "n"], + [12289, 0, "$"], + [12290, 0, " "], + [12291, 0, "w"], + [12292, 0, "h"], + [12293, 0, "i"], + [12294, 0, "c"], + [12295, 0, "h"], + [12296, 0, " "], + [12297, 0, "r"], + [12298, 0, "e"], + [12299, 0, "s"], + [12300, 0, "u"], + [12301, 0, "l"], + [12302, 0, "t"], + [12303, 0, " "], + [12304, 0, "i"], + [12305, 0, "n"], + [12306, 0, " "], + [12307, 0, "t"], + [12308, 0, "h"], + [12309, 0, "e"], + [12310, 0, " "], + [12311, 0, "s"], + [12312, 0, "a"], + [12313, 0, "m"], + [12314, 0, "e"], + [12315, 0, " "], + [12316, 0, "f"], + [12317, 0, "i"], + [12318, 0, "n"], + [12319, 0, "a"], + [12320, 0, "l"], + [12321, 0, " "], + [12322, 0, "s"], + [12323, 0, "t"], + [12324, 0, "a"], + [12325, 0, "t"], + [12326, 0, "e"], + [12327, 0, " "], + [12328, 0, "w"], + [12329, 0, "h"], + [12330, 0, "e"], + [12331, 0, "n"], + [12332, 0, " "], + [12333, 0, "a"], + [12334, 0, "p"], + [12335, 0, "p"], + [12336, 0, "l"], + [12337, 0, "i"], + [12338, 0, "e"], + [12339, 0, "d"], + [12340, 0, "."], + [12341, 0, " "], + [12342, 0, "W"], + [12343, 0, "h"], + [12344, 0, "e"], + [12345, 0, "n"], + [12346, 0, " "], + [12347, 0, "$"], + [12348, 0, "o"], + [12349, 0, "_"], + [12350, 0, "{"], + [12351, 0, "n"], + [12352, 0, "+"], + [12353, 0, "1"], + [12354, 0, "}"], + [12355, 0, "$"], + [12356, 0, " "], + [12357, 0, "i"], + [12358, 0, "s"], + [12359, 0, " "], + [12360, 0, "i"], + [12361, 0, "n"], + [12362, 0, "s"], + [12363, 0, "e"], + [12364, 0, "r"], + [12365, 0, "t"], + [12366, 0, "e"], + [12367, 0, "d"], + [12368, 0, " "], + [12369, 0, "i"], + [12370, 0, "n"], + [12371, 0, "t"], + [12372, 0, "o"], + [12373, 0, " "], + [12374, 0, "t"], + [12375, 0, "i"], + [12376, 0, "e"], + [12377, 0, "h"], + [12378, 0, "t"], + [12378, 1], + [12377, 1], + [12376, 1], + [12375, 1], + [12374, 1], + [12374, 0, "e"], + [12375, 0, "i"], + [12376, 0, "t"], + [12377, 0, "h"], + [12378, 0, "e"], + [12379, 0, "r"], + [12380, 0, " "], + [12381, 0, "o"], + [12382, 0, "f"], + [12383, 0, " "], + [12384, 0, "t"], + [12385, 0, "h"], + [12386, 0, "e"], + [12387, 0, "s"], + [12388, 0, "e"], + [12389, 0, " "], + [12390, 0, "h"], + [12391, 0, "i"], + [12392, 0, "s"], + [12393, 0, "t"], + [12394, 0, "o"], + [12395, 0, "r"], + [12396, 0, "i"], + [12397, 0, "e"], + [12398, 0, "s"], + [12399, 0, ","], + [12400, 0, " "], + [12401, 0, "c"], + [12402, 0, "a"], + [12403, 0, "u"], + [12404, 0, "s"], + [12405, 0, "a"], + [12406, 0, "l"], + [12407, 0, "i"], + [12408, 0, "t"], + [12409, 0, "y"], + [12410, 0, " "], + [12411, 0, "d"], + [12412, 0, "e"], + [12413, 0, "m"], + [12414, 0, "a"], + [12415, 0, "n"], + [12416, 0, "d"], + [12417, 0, "s"], + [12418, 0, " "], + [12419, 0, "t"], + [12420, 0, "h"], + [12421, 0, "a"], + [12422, 0, "t"], + [12423, 0, " "], + [12424, 0, "$"], + [12425, 0, "\\"], + [12426, 0, "m"], + [12427, 0, "a"], + [12428, 0, "t"], + [12429, 0, "h"], + [12430, 0, "i"], + [12431, 0, "t"], + [12432, 0, "{"], + [12433, 0, "p"], + [12434, 0, "r"], + [12435, 0, "e"], + [12436, 0, "v"], + [12437, 0, "}"], + [12438, 0, "$"], + [12439, 0, " "], + [12440, 0, "a"], + [12441, 0, "n"], + [12442, 0, "d"], + [12443, 0, " "], + [12444, 0, "$"], + [12445, 0, "\\"], + [12446, 0, "m"], + [12447, 0, "a"], + [12448, 0, "t"], + [12449, 0, "h"], + [12450, 0, "i"], + [12451, 0, "t"], + [12452, 0, "{"], + [12453, 0, "n"], + [12454, 0, "e"], + [12455, 0, "x"], + [12456, 0, "t"], + [12457, 0, "}"], + [12458, 0, "$"], + [12424, 0, "l"], + [12425, 0, "i"], + [12426, 0, "s"], + [12427, 0, "t"], + [12428, 0, " "], + [12429, 0, "e"], + [12430, 0, "l"], + [12431, 0, "e"], + [12432, 0, "m"], + [12433, 0, "e"], + [12434, 0, "n"], + [12435, 0, "t"], + [12436, 0, "s"], + [12437, 0, " "], + [12473, 0, " "], + [12474, 0, "a"], + [12475, 0, "r"], + [12476, 0, "e"], + [12477, 0, " "], + [12478, 0, "i"], + [12479, 0, "n"], + [12480, 0, "s"], + [12481, 0, "e"], + [12482, 0, "r"], + [12483, 0, "t"], + [12484, 0, "e"], + [12485, 0, "d"], + [12486, 0, " "], + [12487, 0, "b"], + [12487, 1], + [12487, 0, "a"], + [12488, 0, "t"], + [12489, 0, " "], + [12490, 0, "s"], + [12491, 0, "o"], + [12492, 0, "m"], + [12493, 0, "e"], + [12494, 0, " "], + [12495, 0, "p"], + [12496, 0, "o"], + [12497, 0, "i"], + [12498, 0, "n"], + [12499, 0, "t"], + [12500, 0, " "], + [12501, 0, "p"], + [12502, 0, "r"], + [12503, 0, "i"], + [12504, 0, "o"], + [12505, 0, "r"], + [12506, 0, " "], + [12507, 0, "t"], + [12508, 0, "o"], + [12509, 0, " "], + [12510, 0, "$"], + [12511, 0, "o"], + [12512, 0, "_"], + [12513, 0, "{"], + [12514, 0, "n"], + [12515, 0, "+"], + [12516, 0, "1"], + [12517, 0, "}"], + [12518, 0, "$"], + [12519, 0, " "], + [12520, 0, "i"], + [12521, 0, "n"], + [12522, 0, " "], + [12523, 0, "t"], + [12524, 0, "h"], + [12525, 0, "e"], + [12526, 0, " "], + [12527, 0, "h"], + [12528, 0, "i"], + [12529, 0, "s"], + [12530, 0, "t"], + [12531, 0, "o"], + [12532, 0, "r"], + [12533, 0, "y"], + [12534, 0, "."], + [12535, 0, " "], + [12536, 0, "W"], + [12537, 0, "h"], + [12538, 0, "e"], + [12539, 0, "n"], + [12540, 0, " "], + [12541, 0, "$"], + [12542, 0, "o"], + [12543, 0, "_"], + [12544, 0, "{"], + [12545, 0, "n"], + [12546, 0, "+"], + [12547, 0, "1"], + [12548, 0, "}"], + [12549, 0, "$"], + [12550, 0, " "], + [12551, 0, "i"], + [12552, 0, "s"], + [12553, 0, " "], + [12554, 0, "a"], + [12555, 0, "p"], + [12556, 0, "p"], + [12557, 0, "l"], + [12558, 0, "i"], + [12559, 0, "e"], + [12560, 0, "d"], + [12561, 0, ","], + [12562, 0, " "], + [12563, 0, "t"], + [12564, 0, "h"], + [12565, 0, "e"], + [12566, 0, " "], + [12567, 0, "$"], + [12568, 0, "\\"], + [12569, 0, "m"], + [12570, 0, "a"], + [12571, 0, "t"], + [12572, 0, "h"], + [12573, 0, "r"], + [12574, 0, "m"], + [12575, 0, "{"], + [12576, 0, "a"], + [12577, 0, "p"], + [12578, 0, "p"], + [12579, 0, "l"], + [12580, 0, "y"], + [12581, 0, "}"], + [12582, 0, "("], + [12583, 0, "\\"], + [12584, 0, "p"], + [12585, 0, "l"], + [12586, 0, "a"], + [12587, 0, "c"], + [12588, 0, "e"], + [12589, 0, "h"], + [12590, 0, "o"], + [12591, 0, "l"], + [12592, 0, "d"], + [12593, 0, "e"], + [12594, 0, "r"], + [12595, 0, ","], + [12596, 0, " "], + [12597, 0, "\\"], + [12598, 0, "m"], + [12599, 0, "a"], + [12600, 0, "t"], + [12601, 0, "h"], + [12602, 0, "s"], + [12603, 0, "f"], + [12604, 0, "{"], + [12605, 0, "i"], + [12606, 0, "n"], + [12607, 0, "s"], + [12608, 0, "e"], + [12609, 0, "r"], + [12610, 0, "t"], + [12611, 0, "}"], + [12612, 0, "("], + [12613, 0, "\\"], + [12614, 0, "m"], + [12615, 0, "a"], + [12616, 0, "t"], + [12617, 0, "h"], + [12618, 0, "i"], + [12619, 0, "t"], + [12620, 0, "{"], + [12621, 0, "i"], + [12622, 0, "d"], + [12623, 0, "}"], + [12624, 0, ","], + [12625, 0, " "], + [12626, 0, "\\"], + [12627, 0, "m"], + [12628, 0, "a"], + [12629, 0, "t"], + [12630, 0, "h"], + [12631, 0, "i"], + [12632, 0, "t"], + [12633, 0, "{"], + [12634, 0, "p"], + [12635, 0, "r"], + [12636, 0, "e"], + [12637, 0, "v"], + [12638, 0, "}"], + [12639, 0, ","], + [12640, 0, " "], + [12641, 0, "v"], + [12642, 0, ")"], + [12643, 0, ")"], + [12644, 0, "$"], + [12645, 0, " "], + [12646, 0, "r"], + [12647, 0, "u"], + [12648, 0, "l"], + [12649, 0, "e"], + [12650, 0, " "], + [12651, 0, "s"], + [12652, 0, "t"], + [12653, 0, "a"], + [12654, 0, "r"], + [12655, 0, "t"], + [12656, 0, "s"], + [12657, 0, " "], + [12658, 0, "i"], + [12659, 0, "t"], + [12660, 0, "e"], + [12661, 0, "r"], + [12662, 0, "a"], + [12663, 0, "t"], + [12664, 0, "i"], + [12665, 0, "n"], + [12666, 0, "g"], + [12667, 0, " "], + [12668, 0, "a"], + [12669, 0, "t"], + [12670, 0, " "], + [12671, 0, "$"], + [12672, 0, "\\"], + [12673, 0, "m"], + [12674, 0, "a"], + [12675, 0, "t"], + [12676, 0, "h"], + [12677, 0, "i"], + [12678, 0, "t"], + [12679, 0, "{"], + [12680, 0, "p"], + [12681, 0, "r"], + [12682, 0, "e"], + [12683, 0, "v"], + [12684, 0, "}"], + [12685, 0, "$"], + [12686, 0, " "], + [12687, 0, "a"], + [12688, 0, "n"], + [12689, 0, "d"], + [12690, 0, " "], + [12691, 0, "s"], + [12692, 0, "k"], + [12693, 0, "i"], + [12694, 0, "p"], + [12695, 0, "s"], + [12696, 0, " "], + [12697, 0, "o"], + [12698, 0, "v"], + [12699, 0, "e"], + [12700, 0, "r"], + [12701, 0, " "], + [12702, 0, "a"], + [12703, 0, "n"], + [12704, 0, "y"], + [12705, 0, " "], + [12706, 0, "e"], + [12707, 0, "l"], + [12708, 0, "e"], + [12709, 0, "m"], + [12710, 0, "e"], + [12711, 0, "n"], + [12712, 0, "t"], + [12713, 0, "s"], + [12714, 0, " "], + [12715, 0, "w"], + [12716, 0, "i"], + [12717, 0, "t"], + [12718, 0, "h"], + [12719, 0, " "], + [12720, 0, "a"], + [12721, 0, "n"], + [12722, 0, " "], + [12723, 0, "I"], + [12724, 0, "D"], + [12725, 0, " "], + [12726, 0, "g"], + [12727, 0, "r"], + [12728, 0, "e"], + [12729, 0, "a"], + [12730, 0, "t"], + [12731, 0, "e"], + [12732, 0, "r"], + [12733, 0, " "], + [12734, 0, "t"], + [12735, 0, "h"], + [12736, 0, "a"], + [12737, 0, "n"], + [12738, 0, " "], + [12739, 0, "$"], + [12740, 0, "\\"], + [12741, 0, "m"], + [12742, 0, "a"], + [12743, 0, "t"], + [12744, 0, "h"], + [12745, 0, "i"], + [12746, 0, "t"], + [12747, 0, "{"], + [12748, 0, "i"], + [12749, 0, "d"], + [12750, 0, "}"], + [12751, 0, "$"], + [12752, 0, "."], + [12753, 0, " "], + [12754, 0, "S"], + [12755, 0, "i"], + [12756, 0, "n"], + [12757, 0, "c"], + [12758, 0, "e"], + [12759, 0, " "], + [12760, 0, "$"], + [12761, 0, "\\"], + [12762, 0, "m"], + [12763, 0, "a"], + [12764, 0, "t"], + [12765, 0, "h"], + [12766, 0, "i"], + [12767, 0, "d"], + [12768, 0, "{"], + [12769, 0, "n"], + [12770, 0, "e"], + [12771, 0, "x"], + [12772, 0, "t"], + [12773, 0, "}"], + [12774, 0, " "], + [12775, 0, "<"], + [12776, 0, " "], + [12777, 0, "\\"], + [12778, 0, "m"], + [12779, 0, "a"], + [12780, 0, "t"], + [12781, 0, "h"], + [12782, 0, "i"], + [12783, 0, "d"], + [12784, 0, "{"], + [12785, 0, "i"], + [12786, 0, "d"], + [12787, 0, "}"], + [12783, 1], + [12783, 0, "t"], + [12788, 0, "$"], + [12789, 0, ","], + [12790, 0, " "], + [12791, 0, "t"], + [12792, 0, "h"], + [12793, 0, "i"], + [12794, 0, "s"], + [12795, 0, " "], + [12796, 0, "i"], + [12797, 0, "t"], + [12798, 0, "e"], + [12799, 0, "r"], + [12800, 0, "a"], + [12801, 0, "t"], + [12802, 0, "i"], + [12803, 0, "o"], + [12804, 0, "n"], + [12805, 0, " "], + [12805, 1], + [12804, 1], + [12803, 1], + [12802, 1], + [12801, 1], + [12800, 1], + [12799, 1], + [12798, 1], + [12797, 1], + [12796, 1], + [12795, 1], + [12794, 1], + [12793, 1], + [12793, 0, "e"], + [12794, 0, " "], + [12795, 0, "r"], + [12796, 0, "e"], + [12797, 0, "c"], + [12798, 0, "u"], + [12799, 0, "r"], + [12800, 0, "s"], + [12801, 0, "i"], + [12802, 0, "o"], + [12803, 0, "n"], + [12804, 0, " "], + [12805, 0, "n"], + [12806, 0, "e"], + [12807, 0, "v"], + [12808, 0, "e"], + [12809, 0, "r"], + [12810, 0, " "], + [12811, 0, "c"], + [12812, 0, "o"], + [12813, 0, "n"], + [12814, 0, "t"], + [12815, 0, "i"], + [12816, 0, "n"], + [12817, 0, "u"], + [12818, 0, "e"], + [12819, 0, "s"], + [12820, 0, " "], + [12821, 0, "b"], + [12822, 0, "e"], + [12823, 0, "y"], + [12824, 0, "o"], + [12825, 0, "n"], + [12826, 0, "d"], + [12827, 0, " "], + [12828, 0, "$"], + [12829, 0, "\\"], + [12830, 0, "m"], + [12831, 0, "a"], + [12832, 0, "t"], + [12833, 0, "h"], + [12834, 0, "i"], + [12835, 0, "t"], + [12836, 0, "{"], + [12837, 0, "n"], + [12838, 0, "e"], + [12839, 0, "x"], + [12840, 0, "t"], + [12841, 0, "}"], + [12842, 0, "$"], + [12843, 0, "."], + [12844, 0, " "], + [12845, 0, "T"], + [12846, 0, "h"], + [12847, 0, "u"], + [12848, 0, "s"], + [12849, 0, ","], + [12850, 0, " "], + [12851, 0, "t"], + [12852, 0, "h"], + [12853, 0, "e"], + [12854, 0, " "], + [12855, 0, "$"], + [12856, 0, "\\"], + [12857, 0, "m"], + [12858, 0, "a"], + [12859, 0, "t"], + [12860, 0, "h"], + [12861, 0, "i"], + [12862, 0, "t"], + [12863, 0, "{"], + [12864, 0, "a"], + [12865, 0, "p"], + [12866, 0, "p"], + [12866, 1], + [12865, 1], + [12864, 1], + [12863, 1], + [12862, 1], + [12861, 1], + [12861, 0, "r"], + [12862, 0, "m"], + [12863, 0, "{"], + [12864, 0, "a"], + [12865, 0, "p"], + [12866, 0, "p"], + [12867, 0, "l"], + [12868, 0, "y"], + [12869, 0, "}"], + [12870, 0, "$"], + [12871, 0, " "], + [12872, 0, "r"], + [12873, 0, "u"], + [12874, 0, "l"], + [12875, 0, "e"], + [12876, 0, " "], + [12877, 0, "i"], + [12878, 0, "s"], + [12879, 0, " "], + [12880, 0, "g"], + [12881, 0, "u"], + [12882, 0, "a"], + [12883, 0, "r"], + [12884, 0, "a"], + [12885, 0, "n"], + [12886, 0, "t"], + [12887, 0, "e"], + [12888, 0, "e"], + [12889, 0, "d"], + [12890, 0, " "], + [12891, 0, "t"], + [12892, 0, "o"], + [12893, 0, " "], + [12894, 0, "i"], + [12895, 0, "n"], + [12896, 0, "s"], + [12897, 0, "e"], + [12898, 0, "r"], + [12899, 0, "t"], + [12900, 0, " "], + [12901, 0, "$"], + [12902, 0, "\\"], + [12903, 0, "m"], + [12904, 0, "a"], + [12905, 0, "t"], + [12906, 0, "h"], + [12907, 0, "i"], + [12908, 0, "t"], + [12909, 0, "{"], + [12910, 0, "i"], + [12911, 0, "d"], + [12912, 0, "}"], + [12913, 0, "$"], + [12914, 0, " "], + [12915, 0, "a"], + [12916, 0, "t"], + [12917, 0, " "], + [12918, 0, "s"], + [12919, 0, "o"], + [12920, 0, "m"], + [12921, 0, "e"], + [12922, 0, " "], + [12923, 0, "p"], + [12924, 0, "o"], + [12925, 0, "s"], + [12926, 0, "i"], + [12927, 0, "t"], + [12928, 0, "i"], + [12929, 0, "o"], + [12930, 0, "n"], + [12931, 0, " "], + [12932, 0, "b"], + [12933, 0, "e"], + [12934, 0, "t"], + [12935, 0, "w"], + [12936, 0, "e"], + [12937, 0, "e"], + [12938, 0, "n"], + [12939, 0, " "], + [12940, 0, "$"], + [12941, 0, "\\"], + [12942, 0, "m"], + [12943, 0, "a"], + [12944, 0, "t"], + [12945, 0, "h"], + [12946, 0, "i"], + [12947, 0, "t"], + [12948, 0, "{"], + [12949, 0, "p"], + [12950, 0, "r"], + [12951, 0, "e"], + [12952, 0, "v"], + [12953, 0, "}"], + [12954, 0, "$"], + [12955, 0, " "], + [12956, 0, "a"], + [12957, 0, "n"], + [12958, 0, "d"], + [12959, 0, " "], + [12960, 0, "$"], + [12961, 0, "\\"], + [12962, 0, "m"], + [12963, 0, "a"], + [12964, 0, "t"], + [12965, 0, "h"], + [12966, 0, "i"], + [12967, 0, "t"], + [12968, 0, "{"], + [12969, 0, "n"], + [12970, 0, "e"], + [12971, 0, "x"], + [12972, 0, "t"], + [12973, 0, "}"], + [12974, 0, "$"], + [12975, 0, "."], + [12767, 1], + [12767, 0, "t"], + [12476, 1], + [12475, 1], + [12474, 1], + [12474, 0, "w"], + [12475, 0, "e"], + [12476, 0, "r"], + [12477, 0, "e"], + [12478, 0, " "], + [12479, 0, "a"], + [12480, 0, "l"], + [12481, 0, "r"], + [12482, 0, "e"], + [12483, 0, "a"], + [12484, 0, "d"], + [12485, 0, "y"], + [12509, 0, " "], + [12510, 0, "i"], + [12511, 0, "n"], + [12512, 0, " "], + [12513, 0, "t"], + [12514, 0, "h"], + [12515, 0, "e"], + [12516, 0, " "], + [12517, 0, "h"], + [12518, 0, "i"], + [12519, 0, "s"], + [12520, 0, "t"], + [12521, 0, "o"], + [12522, 0, "r"], + [12523, 0, "y"], + [12557, 1], + [12556, 1], + [12555, 1], + [12554, 1], + [12553, 1], + [12552, 1], + [12551, 1], + [12550, 1], + [12549, 1], + [12548, 1], + [12547, 1], + [12546, 1], + [12545, 1], + [12544, 1], + [12543, 1], + [12985, 0, "\n"], + [12986, 0, "\n"], + [12987, 0, "T"], + [12988, 0, "h"], + [12989, 0, "u"], + [12990, 0, "s"], + [12991, 0, ","], + [12992, 0, " "], + [12993, 0, "w"], + [12994, 0, "e"], + [12995, 0, " "], + [12995, 1], + [12994, 1], + [12993, 1], + [12992, 1], + [12991, 1], + [12990, 1], + [12989, 1], + [12989, 0, "h"], + [12990, 0, "e"], + [12991, 0, "r"], + [12991, 1], + [12990, 1], + [12989, 1], + [12989, 0, "e"], + [12990, 0, "r"], + [12991, 0, "e"], + [12992, 0, "f"], + [12993, 0, "o"], + [12994, 0, "r"], + [12995, 0, "e"], + [12996, 0, " "], + [12996, 1], + [12996, 0, ","], + [12997, 0, " "], + [12998, 0, "w"], + [12999, 0, "e"], + [13000, 0, " "], + [13001, 0, "n"], + [13002, 0, "e"], + [13003, 0, "e"], + [13004, 0, "d"], + [13005, 0, " "], + [13006, 0, "o"], + [13007, 0, "n"], + [13008, 0, "l"], + [13009, 0, "y"], + [13010, 0, " "], + [13011, 0, "c"], + [13012, 0, "o"], + [13013, 0, "n"], + [13014, 0, "s"], + [13015, 0, "i"], + [13016, 0, "d"], + [13017, 0, "e"], + [13018, 0, "r"], + [13019, 0, " "], + [13020, 0, "i"], + [13021, 0, "n"], + [13022, 0, "s"], + [13023, 0, "e"], + [13024, 0, "r"], + [13025, 0, "t"], + [13026, 0, "i"], + [13027, 0, "o"], + [13028, 0, "n"], + [13029, 0, "s"], + [13030, 0, " "], + [13031, 0, "t"], + [13032, 0, "h"], + [13033, 0, "a"], + [13034, 0, "t"], + [13035, 0, " "], + [13036, 0, "a"], + [13037, 0, "r"], + [13038, 0, "e"], + [13039, 0, " "], + [13040, 0, "c"], + [13041, 0, "o"], + [13042, 0, "n"], + [13043, 0, "c"], + [13044, 0, "u"], + [13045, 0, "r"], + [13046, 0, "r"], + [13047, 0, "e"], + [13048, 0, "n"], + [13049, 0, "t"], + [13050, 0, " "], + [13051, 0, "t"], + [13052, 0, "o"], + [13053, 0, " "], + [13054, 0, "$"], + [13055, 0, "o"], + [13056, 0, "_"], + [13057, 0, "["], + [13057, 1], + [13057, 0, "{"], + [13058, 0, "n"], + [13059, 0, "+"], + [13060, 0, "1"], + [13061, 0, "}"], + [13062, 0, "$"], + [13063, 0, " "], + [13064, 0, "a"], + [13065, 0, "n"], + [13066, 0, "d"], + [13067, 0, " "], + [13068, 0, "t"], + [13069, 0, "h"], + [13070, 0, "a"], + [13071, 0, "t"], + [13072, 0, " "], + [13073, 0, "i"], + [13074, 0, "n"], + [13075, 0, "s"], + [13076, 0, "e"], + [13077, 0, "r"], + [13078, 0, "t"], + [13079, 0, " "], + [13080, 0, "a"], + [13081, 0, "t"], + [13082, 0, " "], + [13083, 0, "s"], + [13084, 0, "o"], + [13085, 0, "m"], + [13086, 0, "e"], + [13087, 0, " "], + [13088, 0, "p"], + [13089, 0, "o"], + [13090, 0, "s"], + [13091, 0, "i"], + [13092, 0, "t"], + [13093, 0, "i"], + [13094, 0, "o"], + [13095, 0, "n"], + [13096, 0, " "], + [13097, 0, "b"], + [13098, 0, "e"], + [13099, 0, "t"], + [13100, 0, "w"], + [13101, 0, "e"], + [13102, 0, "e"], + [13103, 0, "n"], + [13104, 0, " "], + [13105, 0, "$"], + [13106, 0, "\\"], + [13107, 0, "m"], + [13108, 0, "a"], + [13109, 0, "t"], + [13110, 0, "h"], + [13111, 0, "i"], + [13112, 0, "t"], + [13113, 0, "{"], + [13114, 0, "p"], + [13115, 0, "r"], + [13116, 0, "e"], + [13117, 0, "v"], + [13118, 0, "}"], + [13119, 0, "$"], + [13120, 0, " "], + [13121, 0, "a"], + [13122, 0, "n"], + [13123, 0, "d"], + [13124, 0, " "], + [13125, 0, "$"], + [13126, 0, "\\"], + [13127, 0, "m"], + [13128, 0, "a"], + [13129, 0, "t"], + [13130, 0, "h"], + [13131, 0, "i"], + [13132, 0, "t"], + [13133, 0, "{"], + [13134, 0, "n"], + [13135, 0, "e"], + [13136, 0, "x"], + [13137, 0, "t"], + [13138, 0, "}"], + [13139, 0, "$"], + [13140, 0, "."], + [13141, 0, " "], + [13142, 0, "N"], + [13143, 0, "o"], + [13144, 0, "t"], + [13145, 0, "e"], + [13146, 0, " "], + [13147, 0, "t"], + [13148, 0, "h"], + [13149, 0, "a"], + [13150, 0, "t"], + [13151, 0, " "], + [13152, 0, "t"], + [13153, 0, "h"], + [13154, 0, "e"], + [13155, 0, " "], + [13156, 0, "$"], + [13157, 0, "\\"], + [13158, 0, "m"], + [13159, 0, "a"], + [13160, 0, "t"], + [13161, 0, "h"], + [13162, 0, "r"], + [13163, 0, "m"], + [13164, 0, "{"], + [13165, 0, "a"], + [13166, 0, "p"], + [13167, 0, "p"], + [13168, 0, "l"], + [13169, 0, "y"], + [13170, 0, "}"], + [13171, 0, "$"], + [13172, 0, " "], + [13173, 0, "r"], + [13174, 0, "u"], + [13175, 0, "l"], + [13176, 0, "e"], + [13177, 0, " "], + [13178, 0, "h"], + [13179, 0, "a"], + [13180, 0, "s"], + [13180, 1], + [13179, 1], + [13178, 1], + [13178, 0, "e"], + [13179, 0, "n"], + [13180, 0, "s"], + [13181, 0, "u"], + [13182, 0, "r"], + [13183, 0, "e"], + [13184, 0, "s"], + [13185, 0, " "], + [13186, 0, "t"], + [13187, 0, "h"], + [13188, 0, "a"], + [13189, 0, "t"], + [13190, 0, " "], + [13191, 0, "a"], + [13192, 0, "f"], + [13193, 0, "t"], + [13194, 0, "e"], + [13195, 0, "r"], + [13196, 0, " "], + [13197, 0, "$"], + [13198, 0, "\\"], + [13199, 0, "m"], + [13200, 0, "a"], + [13201, 0, "t"], + [13202, 0, "h"], + [13203, 0, "i"], + [13204, 0, "t"], + [13205, 0, "{"], + [13206, 0, "i"], + [13207, 0, "d"], + [13208, 0, "}"], + [13209, 0, "$"], + [13210, 0, " "], + [13211, 0, "i"], + [13212, 0, "s"], + [13213, 0, " "], + [13214, 0, "i"], + [13215, 0, "n"], + [13216, 0, "s"], + [13217, 0, "e"], + [13218, 0, "r"], + [13219, 0, "t"], + [13220, 0, "e"], + [13221, 0, "d"], + [13222, 0, ","], + [13223, 0, " "], + [13224, 0, "a"], + [13225, 0, "l"], + [13226, 0, "l"], + [13227, 0, " "], + [13228, 0, "l"], + [13229, 0, "i"], + [13230, 0, "s"], + [13231, 0, "t"], + [13232, 0, " "], + [13233, 0, "e"], + [13234, 0, "l"], + [13235, 0, "e"], + [13236, 0, "m"], + [13237, 0, "e"], + [13238, 0, "n"], + [13239, 0, "t"], + [13240, 0, "s"], + [13241, 0, " "], + [13242, 0, "b"], + [13243, 0, "e"], + [13244, 0, "t"], + [13245, 0, "w"], + [13246, 0, "e"], + [13247, 0, "e"], + [13248, 0, "n"], + [13249, 0, " "], + [13250, 0, "$"], + [13251, 0, "\\"], + [13252, 0, "m"], + [13253, 0, "a"], + [13254, 0, "t"], + [13255, 0, "h"], + [13256, 0, "i"], + [13257, 0, "t"], + [13258, 0, "{"], + [13259, 0, "p"], + [13260, 0, "r"], + [13261, 0, "e"], + [13262, 0, "v"], + [13263, 0, "}"], + [13264, 0, "$"], + [13265, 0, " "], + [13266, 0, "a"], + [13267, 0, "n"], + [13268, 0, "d"], + [13269, 0, " "], + [13270, 0, "$"], + [13271, 0, "\\"], + [13272, 0, "m"], + [13273, 0, "a"], + [13274, 0, "t"], + [13275, 0, "h"], + [13276, 0, "i"], + [13277, 0, "t"], + [13278, 0, "{"], + [13279, 0, "i"], + [13280, 0, "d"], + [13281, 0, "}"], + [13282, 0, "$"], + [13283, 0, " "], + [13284, 0, "a"], + [13285, 0, "r"], + [13286, 0, "e"], + [13287, 0, " "], + [13287, 1], + [13286, 1], + [13285, 1], + [13284, 1], + [13284, 0, "h"], + [13285, 0, "a"], + [13286, 0, "v"], + [13287, 0, "e"], + [13288, 0, " "], + [13289, 0, "a"], + [13290, 0, "n"], + [13291, 0, " "], + [13292, 0, "I"], + [13293, 0, "D"], + [13294, 0, " "], + [13295, 0, "g"], + [13296, 0, "r"], + [13297, 0, "e"], + [13298, 0, "a"], + [13299, 0, "t"], + [13300, 0, "e"], + [13301, 0, "r"], + [13302, 0, " "], + [13303, 0, "t"], + [13304, 0, "h"], + [13305, 0, "a"], + [13306, 0, "n"], + [13307, 0, " "], + [13308, 0, "$"], + [13309, 0, "\\"], + [13310, 0, "m"], + [13311, 0, "a"], + [13312, 0, "t"], + [13313, 0, "h"], + [13314, 0, "i"], + [13315, 0, "t"], + [13316, 0, "{"], + [13317, 0, "i"], + [13318, 0, "d"], + [13319, 0, "}"], + [13320, 0, "$"], + [13321, 0, ","], + [13322, 0, " "], + [13323, 0, "a"], + [13324, 0, "n"], + [13325, 0, "d"], + [13326, 0, " "], + [13282, 1], + [13281, 1], + [13280, 1], + [13279, 1], + [13278, 1], + [13277, 1], + [13276, 1], + [13275, 1], + [13274, 1], + [13273, 1], + [13272, 1], + [13271, 1], + [13270, 1], + [13270, 0, "t"], + [13271, 0, "h"], + [13272, 0, "e"], + [13273, 0, " "], + [13274, 0, "i"], + [13275, 0, "n"], + [13276, 0, "s"], + [13277, 0, "e"], + [13278, 0, "r"], + [13279, 0, "t"], + [13280, 0, "i"], + [13281, 0, "o"], + [13282, 0, "n"], + [13283, 0, " "], + [13284, 0, "p"], + [13285, 0, "o"], + [13286, 0, "i"], + [13287, 0, "n"], + [13288, 0, "t"], + [13333, 0, "t"], + [13334, 0, "h"], + [13335, 0, "e"], + [13336, 0, " "], + [13337, 0, "l"], + [13338, 0, "i"], + [13339, 0, "s"], + [13340, 0, "t"], + [13341, 0, " "], + [13342, 0, "e"], + [13343, 0, "l"], + [13344, 0, "e"], + [13345, 0, "m"], + [13346, 0, "e"], + [13347, 0, "n"], + [13348, 0, "t"], + [13349, 0, " "], + [13350, 0, "f"], + [13351, 0, "o"], + [13352, 0, "l"], + [13353, 0, "l"], + [13354, 0, "o"], + [13355, 0, "w"], + [13356, 0, "i"], + [13357, 0, "n"], + [13358, 0, "g"], + [13359, 0, " "], + [13360, 0, "t"], + [13361, 0, "h"], + [13362, 0, "e"], + [13363, 0, " "], + [13364, 0, "i"], + [13365, 0, "n"], + [13366, 0, "s"], + [13367, 0, "e"], + [13368, 0, "r"], + [13369, 0, "t"], + [13370, 0, "i"], + [13371, 0, "o"], + [13372, 0, "n"], + [13373, 0, " "], + [13374, 0, "p"], + [13375, 0, "o"], + [13376, 0, "i"], + [13377, 0, "n"], + [13378, 0, "t"], + [13379, 0, " "], + [13380, 0, "h"], + [13381, 0, "a"], + [13382, 0, "s"], + [13383, 0, " "], + [13384, 0, "a"], + [13385, 0, "n"], + [13386, 0, " "], + [13387, 0, "I"], + [13388, 0, "D"], + [13389, 0, " "], + [13390, 0, "l"], + [13391, 0, "e"], + [13392, 0, "s"], + [13393, 0, "s"], + [13394, 0, " "], + [13395, 0, "t"], + [13396, 0, "h"], + [13397, 0, "a"], + [13398, 0, "n"], + [13399, 0, " "], + [13400, 0, "$"], + [13401, 0, "\\"], + [13402, 0, "m"], + [13403, 0, "a"], + [13404, 0, "t"], + [13405, 0, "h"], + [13406, 0, "i"], + [13407, 0, "t"], + [13408, 0, "{"], + [13409, 0, "i"], + [13410, 0, "d"], + [13411, 0, "}"], + [13412, 0, "$"], + [13413, 0, "."], + [13414, 0, " "], + [13415, 0, "W"], + [13416, 0, "e"], + [13417, 0, " "], + [13418, 0, "u"], + [13419, 0, "s"], + [13420, 0, "e"], + [13421, 0, " "], + [13422, 0, "t"], + [13423, 0, "h"], + [13424, 0, "i"], + [13425, 0, "s"], + [13426, 0, " "], + [13427, 0, "p"], + [13428, 0, "o"], + [13428, 1], + [13428, 0, "r"], + [13429, 0, "o"], + [13430, 0, "p"], + [13431, 0, "e"], + [13432, 0, "r"], + [13433, 0, "t"], + [13434, 0, "y"], + [13435, 0, " "], + [13436, 0, "t"], + [13437, 0, "o"], + [13438, 0, " "], + [13439, 0, "s"], + [13440, 0, "h"], + [13441, 0, "o"], + [13442, 0, "w"], + [13443, 0, " "], + [13444, 0, "t"], + [13445, 0, "h"], + [13446, 0, "a"], + [13447, 0, "t"], + [13448, 0, " "], + [13449, 0, "n"], + [13450, 0, "o"], + [13451, 0, " "], + [13452, 0, "m"], + [13453, 0, "a"], + [13454, 0, "t"], + [13455, 0, "t"], + [13456, 0, "e"], + [13457, 0, "r"], + [13458, 0, " "], + [13459, 0, "w"], + [13460, 0, "h"], + [13461, 0, "e"], + [13462, 0, "r"], + [13463, 0, "e"], + [13464, 0, " "], + [13465, 0, "$"], + [13466, 0, "o"], + [13467, 0, "{"], + [13467, 1], + [13467, 0, "_"], + [13468, 0, "{"], + [13469, 0, "n"], + [13470, 0, "+"], + [13471, 0, "1"], + [13472, 0, "}"], + [13473, 0, "$"], + [13474, 0, " "], + [13475, 0, "i"], + [13476, 0, "s"], + [13477, 0, " "], + [13478, 0, "i"], + [13479, 0, "n"], + [13480, 0, "s"], + [13481, 0, "e"], + [13482, 0, "r"], + [13483, 0, "t"], + [13484, 0, "e"], + [13485, 0, "d"], + [13486, 0, " "], + [13487, 0, "i"], + [13488, 0, "n"], + [13489, 0, " "], + [13490, 0, "$"], + [13491, 0, "H"], + [13492, 0, "-"], + [13492, 1], + [13492, 0, "_"], + [13493, 0, "1"], + [13494, 0, "$"], + [13495, 0, " "], + [13496, 0, "a"], + [13497, 0, "n"], + [13498, 0, "d"], + [13499, 0, " "], + [13500, 0, "$"], + [13501, 0, "H"], + [13502, 0, "_"], + [13503, 0, "2"], + [13504, 0, "$"], + [13505, 0, ","], + [13506, 0, " "], + [13507, 0, "t"], + [13508, 0, "h"], + [13509, 0, "e"], + [13510, 0, " "], + [13511, 0, "o"], + [13512, 0, "u"], + [13513, 0, "t"], + [13514, 0, "c"], + [13515, 0, "o"], + [13516, 0, "m"], + [13517, 0, "e"], + [13518, 0, " "], + [13519, 0, "i"], + [13520, 0, "s"], + [13521, 0, " "], + [13522, 0, "t"], + [13523, 0, "h"], + [13524, 0, "e"], + [13525, 0, " "], + [13526, 0, "s"], + [13527, 0, "a"], + [13528, 0, "m"], + [13529, 0, "e"], + [13530, 0, " "], + [13531, 0, "s"], + [13532, 0, "e"], + [13533, 0, "q"], + [13534, 0, "u"], + [13535, 0, "e"], + [13536, 0, "n"], + [13537, 0, "c"], + [13538, 0, "e"], + [13539, 0, " "], + [13540, 0, "o"], + [13541, 0, "f"], + [13542, 0, " "], + [13543, 0, "l"], + [13544, 0, "i"], + [13545, 0, "s"], + [13546, 0, "t"], + [13547, 0, " "], + [13548, 0, "e"], + [13549, 0, "l"], + [13550, 0, "e"], + [13551, 0, "m"], + [13552, 0, "e"], + [13553, 0, "n"], + [13554, 0, "t"], + [13555, 0, "s"], + [13556, 0, "."], + [13557, 0, "\n"], + [13558, 0, "\n"], + [13559, 0, "L"], + [13560, 0, "e"], + [13561, 0, "t"], + [13562, 0, " "], + [13563, 0, "$"], + [13564, 0, "H"], + [13565, 0, "_"], + [13566, 0, "c"], + [13567, 0, "$"], + [13568, 0, " "], + [13569, 0, "b"], + [13570, 0, "e"], + [13571, 0, " "], + [13572, 0, "a"], + [13573, 0, " "], + [13574, 0, "h"], + [13575, 0, "i"], + [13576, 0, "s"], + [13577, 0, "t"], + [13578, 0, "o"], + [13579, 0, "r"], + [13580, 0, "y"], + [13581, 0, " "], + [13582, 0, "o"], + [13583, 0, "f"], + [13584, 0, " "], + [13585, 0, "o"], + [13586, 0, "p"], + [13587, 0, "e"], + [13588, 0, "r"], + [13589, 0, "a"], + [13590, 0, "t"], + [13591, 0, "i"], + [13592, 0, "o"], + [13593, 0, "n"], + [13594, 0, "s"], + [13595, 0, " "], + [13595, 1], + [13595, 0, ","], + [13596, 0, " "], + [13597, 0, "d"], + [13598, 0, "e"], + [13599, 0, "r"], + [13600, 0, "i"], + [13601, 0, "v"], + [13602, 0, "e"], + [13603, 0, "d"], + [13604, 0, " "], + [13605, 0, "b"], + [13605, 1], + [13605, 0, "f"], + [13606, 0, "r"], + [13607, 0, "o"], + [13608, 0, "m"], + [13609, 0, " "], + [13610, 0, "e"], + [13611, 0, "i"], + [13612, 0, "t"], + [13613, 0, "h"], + [13614, 0, "e"], + [13615, 0, "r"], + [13616, 0, " "], + [13617, 0, "$"], + [13618, 0, "H"], + [13619, 0, "_"], + [13620, 0, "1"], + [13621, 0, "$"], + [13622, 0, " "], + [13623, 0, "o"], + [13624, 0, "r"], + [13625, 0, " "], + [13626, 0, "$"], + [13627, 0, "H"], + [13628, 0, "_"], + [13629, 0, "2"], + [13630, 0, "$"], + [13631, 0, " "], + [13632, 0, "b"], + [13633, 0, "y"], + [13634, 0, " "], + [13635, 0, "c"], + [13636, 0, "o"], + [13637, 0, "n"], + [13638, 0, "d"], + [13639, 0, "i"], + [13640, 0, "d"], + [13641, 0, "e"], + [13642, 0, "r"], + [13643, 0, "i"], + [13644, 0, "n"], + [13645, 0, "g"], + [13646, 0, " "], + [13647, 0, "o"], + [13648, 0, "n"], + [13649, 0, "l"], + [13650, 0, "y"], + [13651, 0, " "], + [13652, 0, "i"], + [13653, 0, "n"], + [13654, 0, "s"], + [13655, 0, "e"], + [13656, 0, "r"], + [13657, 0, "t"], + [13658, 0, " "], + [13659, 0, "o"], + [13660, 0, "p"], + [13652, 0, "$"], + [13653, 0, "\\"], + [13654, 0, "m"], + [13655, 0, "a"], + [13656, 0, "t"], + [13657, 0, "h"], + [13658, 0, "s"], + [13659, 0, "f"], + [13660, 0, "{"], + [13667, 0, "}"], + [13668, 0, "$"], + [13672, 0, "e"], + [13673, 0, "r"], + [13674, 0, "a"], + [13675, 0, "t"], + [13676, 0, "i"], + [13677, 0, "o"], + [13678, 0, "n"], + [13679, 0, "s"], + [13680, 0, " "], + [13681, 0, "t"], + [13682, 0, "h"], + [13683, 0, "a"], + [13684, 0, "t"], + [13685, 0, " "], + [13686, 0, "a"], + [13687, 0, "r"], + [13688, 0, "e"], + [13689, 0, " "], + [13690, 0, "c"], + [13691, 0, "o"], + [13692, 0, "n"], + [13693, 0, "c"], + [13694, 0, "u"], + [13695, 0, "r"], + [13696, 0, "r"], + [13697, 0, "e"], + [13698, 0, "n"], + [13699, 0, "t"], + [13700, 0, " "], + [13701, 0, "w"], + [13702, 0, "i"], + [13703, 0, "t"], + [13704, 0, "h"], + [13705, 0, " "], + [13706, 0, "$"], + [13707, 0, "o"], + [13708, 0, "_"], + [13709, 0, "{"], + [13710, 0, "n"], + [13711, 0, "+"], + [13712, 0, "1"], + [13713, 0, "}"], + [13714, 0, "$"], + [13645, 1], + [13644, 1], + [13643, 1], + [13642, 1], + [13641, 1], + [13640, 1], + [13639, 1], + [13638, 1], + [13637, 1], + [13636, 1], + [13635, 1], + [13635, 0, "s"], + [13636, 0, "e"], + [13637, 0, "l"], + [13638, 0, "e"], + [13639, 0, "c"], + [13640, 0, "t"], + [13641, 0, "i"], + [13642, 0, "n"], + [13643, 0, "g"], + [13713, 0, " "], + [13714, 0, "a"], + [13715, 0, "n"], + [13716, 0, "d"], + [13717, 0, " "], + [13718, 0, "t"], + [13719, 0, "h"], + [13720, 0, "a"], + [13721, 0, "t"], + [13722, 0, " "], + [13723, 0, "i"], + [13724, 0, "n"], + [13725, 0, "s"], + [13726, 0, "e"], + [13727, 0, "r"], + [13728, 0, "t"], + [13729, 0, " "], + [13730, 0, "a"], + [13731, 0, "t"], + [13732, 0, " "], + [13733, 0, "a"], + [13734, 0, " "], + [13735, 0, "p"], + [13736, 0, "o"], + [13737, 0, "s"], + [13738, 0, "i"], + [13739, 0, "t"], + [13740, 0, "i"], + [13741, 0, "o"], + [13742, 0, "n"], + [13743, 0, " "], + [13744, 0, "b"], + [13745, 0, "e"], + [13746, 0, "t"], + [13747, 0, "w"], + [13748, 0, "e"], + [13749, 0, "e"], + [13750, 0, "n"], + [13751, 0, " "], + [13752, 0, "$"], + [13753, 0, "\\"], + [13754, 0, "m"], + [13755, 0, "a"], + [13756, 0, "t"], + [13757, 0, "h"], + [13758, 0, "i"], + [13759, 0, "t"], + [13760, 0, "{"], + [13761, 0, "p"], + [13762, 0, "r"], + [13763, 0, "e"], + [13764, 0, "v"], + [13765, 0, "}"], + [13766, 0, "$"], + [13767, 0, " "], + [13768, 0, "a"], + [13769, 0, "n"], + [13770, 0, "d"], + [13771, 0, " "], + [13772, 0, "$"], + [13773, 0, "\\"], + [13774, 0, "m"], + [13775, 0, "a"], + [13776, 0, "t"], + [13777, 0, "h"], + [13778, 0, "i"], + [13779, 0, "t"], + [13780, 0, "{"], + [13781, 0, "n"], + [13782, 0, "e"], + [13783, 0, "x"], + [13784, 0, "t"], + [13785, 0, "}"], + [13786, 0, "$"], + [13787, 0, "."], + [13788, 0, " "], + [13789, 0, "A"], + [13790, 0, "m"], + [13791, 0, "o"], + [13792, 0, "n"], + [13793, 0, "g"], + [13794, 0, " "], + [13795, 0, "t"], + [13796, 0, "h"], + [13797, 0, "e"], + [13798, 0, " "], + [13799, 0, "o"], + [13800, 0, "p"], + [13801, 0, "e"], + [13802, 0, "r"], + [13803, 0, "a"], + [13804, 0, "t"], + [13805, 0, "i"], + [13806, 0, "o"], + [13807, 0, "n"], + [13808, 0, "s"], + [13809, 0, " "], + [13810, 0, "i"], + [13811, 0, "n"], + [13812, 0, " "], + [13813, 0, "$"], + [13814, 0, "H"], + [13815, 0, "_"], + [13816, 0, "c"], + [13817, 0, "$"], + [13818, 0, " "], + [13819, 0, "t"], + [13820, 0, "h"], + [13821, 0, "e"], + [13822, 0, "r"], + [13823, 0, "e"], + [13824, 0, " "], + [13825, 0, "i"], + [13826, 0, "s"], + [13827, 0, " "], + [13828, 0, "a"], + [13829, 0, " "], + [13830, 0, "s"], + [13831, 0, "u"], + [13832, 0, "b"], + [13833, 0, "s"], + [13834, 0, "e"], + [13835, 0, "t"], + [13836, 0, " "], + [13837, 0, "o"], + [13838, 0, "f"], + [13839, 0, " "], + [13840, 0, "o"], + [13841, 0, "p"], + [13842, 0, "e"], + [13843, 0, "r"], + [13844, 0, "a"], + [13845, 0, "t"], + [13846, 0, "i"], + [13847, 0, "o"], + [13848, 0, "n"], + [13849, 0, "s"], + [13850, 0, " "], + [13851, 0, "$"], + [13852, 0, "H"], + [13853, 0, "_"], + [13854, 0, "s"], + [13855, 0, "$"], + [13856, 0, " "], + [13857, 0, "t"], + [13858, 0, "h"], + [13859, 0, "a"], + [13860, 0, "t"], + [13861, 0, " "], + [13862, 0, "a"], + [13863, 0, "r"], + [13864, 0, "e"], + [13865, 0, " "], + [13866, 0, "`"], + [13867, 0, "`"], + [13868, 0, "s"], + [13869, 0, "t"], + [13870, 0, "a"], + [13871, 0, "r"], + [13872, 0, "t"], + [13873, 0, "i"], + [13874, 0, "n"], + [13875, 0, "g"], + [13876, 0, " "], + [13877, 0, "o"], + [13878, 0, "p"], + [13879, 0, "e"], + [13880, 0, "r"], + [13881, 0, "a"], + [13882, 0, "t"], + [13883, 0, "i"], + [13884, 0, "o"], + [13885, 0, "n"], + [13886, 0, "s"], + [13887, 0, "'"], + [13888, 0, "'"], + [13889, 0, ":"], + [13890, 0, " "], + [13891, 0, "t"], + [13892, 0, "h"], + [13893, 0, "e"], + [13894, 0, "y"], + [13895, 0, " "], + [13896, 0, "d"], + [13897, 0, "o"], + [13898, 0, " "], + [13899, 0, "n"], + [13900, 0, "o"], + [13901, 0, "t"], + [13902, 0, " "], + [13903, 0, "c"], + [13904, 0, "u"], + [13904, 1], + [13904, 0, "a"], + [13905, 0, "u"], + [13906, 0, "s"], + [13907, 0, "a"], + [13908, 0, "l"], + [13909, 0, "l"], + [13910, 0, "y"], + [13911, 0, " "], + [13912, 0, "d"], + [13913, 0, "e"], + [13914, 0, "p"], + [13915, 0, "e"], + [13916, 0, "n"], + [13917, 0, "d"], + [13918, 0, " "], + [13919, 0, "o"], + [13920, 0, "n"], + [13921, 0, " "], + [13922, 0, "a"], + [13923, 0, "n"], + [13924, 0, "y"], + [13925, 0, " "], + [13926, 0, "o"], + [13927, 0, "t"], + [13928, 0, "h"], + [13929, 0, "e"], + [13930, 0, "r"], + [13931, 0, " "], + [13932, 0, "o"], + [13933, 0, "p"], + [13934, 0, "e"], + [13935, 0, "r"], + [13936, 0, "a"], + [13937, 0, "t"], + [13938, 0, "i"], + [13939, 0, "o"], + [13940, 0, "n"], + [13941, 0, " "], + [13942, 0, "i"], + [13943, 0, "n"], + [13944, 0, " "], + [13945, 0, "$"], + [13946, 0, "H"], + [13947, 0, "_"], + [13948, 0, "c"], + [13949, 0, "$"], + [13950, 0, "."], + [13789, 0, "L"], + [13790, 0, "e"], + [13791, 0, "t"], + [13792, 0, " "], + [13793, 0, "$"], + [13794, 0, "H"], + [13795, 0, "-"], + [13795, 1], + [13795, 0, "_"], + [13796, 0, "s"], + [13797, 0, "$"], + [13798, 0, " "], + [13799, 0, "b"], + [13800, 0, "e"], + [13801, 0, " "], + [13802, 0, "t"], + [13803, 0, "h"], + [13804, 0, "e"], + [13805, 0, " "], + [13814, 1], + [13813, 1], + [13812, 1], + [13811, 1], + [13810, 1], + [13809, 1], + [13808, 1], + [13807, 1], + [13806, 1], + [13806, 0, "s"], + [13807, 0, "u"], + [13808, 0, "b"], + [13809, 0, "s"], + [13810, 0, "e"], + [13811, 0, "t"], + [13812, 0, " "], + [13813, 0, "o"], + [13814, 0, "f"], + [13872, 1], + [13871, 1], + [13870, 1], + [13869, 1], + [13868, 1], + [13867, 1], + [13866, 1], + [13865, 1], + [13864, 1], + [13863, 1], + [13862, 1], + [13861, 1], + [13860, 1], + [13859, 1], + [13858, 1], + [13857, 1], + [13856, 1], + [13855, 1], + [13854, 1], + [13853, 1], + [13852, 1], + [13851, 1], + [13850, 1], + [13849, 1], + [13848, 1], + [13847, 1], + [13846, 1], + [13845, 1], + [13844, 1], + [13843, 1], + [13842, 1], + [13841, 1], + [13840, 1], + [13839, 1], + [13838, 1], + [13837, 1], + [13836, 1], + [13835, 1], + [13930, 0, " "], + [13931, 0, "A"], + [13932, 0, "f"], + [13933, 0, "t"], + [13934, 0, "e"], + [13935, 0, "r"], + [13936, 0, " "], + [13937, 0, "a"], + [13938, 0, "p"], + [13939, 0, "p"], + [13940, 0, "l"], + [13941, 0, "y"], + [13942, 0, "i"], + [13943, 0, "n"], + [13944, 0, "g"], + [13945, 0, " "], + [13946, 0, "$"], + [13947, 0, "#"], + [13947, 1], + [13947, 0, "o"], + [13948, 0, "_"], + [13949, 0, "{"], + [13950, 0, "n"], + [13950, 1], + [13949, 1], + [13948, 1], + [13947, 1], + [13946, 1], + [13945, 1], + [13944, 1], + [13943, 1], + [13942, 1], + [13941, 1], + [13940, 1], + [13939, 1], + [13938, 1], + [13937, 1], + [13936, 1], + [13935, 1], + [13934, 1], + [13933, 1], + [13932, 1], + [13931, 1], + [13931, 0, "N"], + [13932, 0, "o"], + [13933, 0, "t"], + [13934, 0, "e"], + [13935, 0, " "], + [13936, 0, "t"], + [13937, 0, "h"], + [13938, 0, "a"], + [13939, 0, "t"], + [13940, 0, " "], + [13941, 0, "$"], + [13942, 0, "o"], + [13943, 0, "_"], + [13944, 0, "{"], + [13945, 0, "n"], + [13946, 0, "+"], + [13947, 0, "1"], + [13948, 0, "}"], + [13949, 0, "$"], + [13950, 0, " "], + [13951, 0, "i"], + [13952, 0, "s"], + [13953, 0, " "], + [13954, 0, "a"], + [13955, 0, "l"], + [13956, 0, "s"], + [13957, 0, "o"], + [13958, 0, " "], + [13959, 0, "a"], + [13960, 0, " "], + [13961, 0, "s"], + [13962, 0, "t"], + [13963, 0, "a"], + [13964, 0, "r"], + [13965, 0, "t"], + [13966, 0, "i"], + [13967, 0, "n"], + [13968, 0, "g"], + [13969, 0, " "], + [13970, 0, "o"], + [13971, 0, "p"], + [13972, 0, "e"], + [13973, 0, "r"], + [13974, 0, "a"], + [13975, 0, "t"], + [13976, 0, "i"], + [13977, 0, "o"], + [13978, 0, "n"], + [13979, 0, "."], + [13979, 0, ","], + [13980, 0, " "], + [13981, 0, "s"], + [13982, 0, "i"], + [13983, 0, "n"], + [13984, 0, "c"], + [13985, 0, "e"], + [13986, 0, " "], + [13987, 0, "i"], + [13988, 0, "t"], + [13989, 0, " "], + [13990, 0, "d"], + [13991, 0, "o"], + [13992, 0, "e"], + [13993, 0, "s"], + [13994, 0, " "], + [13995, 0, "n"], + [13996, 0, "o"], + [13997, 0, "t"], + [13998, 0, " "], + [13999, 0, "h"], + [14000, 0, "a"], + [14001, 0, "v"], + [14002, 0, "e"], + [14003, 0, " "], + [14004, 0, "a"], + [14005, 0, "n"], + [14006, 0, "y"], + [14007, 0, " "], + [14008, 0, "c"], + [14009, 0, "a"], + [14010, 0, "u"], + [14011, 0, "s"], + [14012, 0, "a"], + [14013, 0, "l"], + [14014, 0, " "], + [14015, 0, "d"], + [14016, 0, "e"], + [14017, 0, "p"], + [14018, 0, "e"], + [14019, 0, "n"], + [14020, 0, "d"], + [14021, 0, "e"], + [14022, 0, "n"], + [14023, 0, "c"], + [14024, 0, "i"], + [14025, 0, "e"], + [14026, 0, "s"], + [14027, 0, " "], + [14028, 0, "i"], + [14029, 0, "n"], + [14030, 0, " "], + [14031, 0, "$"], + [14032, 0, "H"], + [14033, 0, "_"], + [14034, 0, "c"], + [14035, 0, "$"], + [14037, 0, "\n"], + [14038, 0, "\n"], + [14039, 0, "L"], + [14040, 0, "e"], + [14041, 0, "t"], + [14042, 0, " "], + [14043, 0, "$"], + [14044, 0, "O"], + [14044, 1], + [14044, 0, "o"], + [14045, 0, "_"], + [14046, 0, "i"], + [14047, 0, "$"], + [14048, 0, " "], + [14049, 0, "b"], + [14050, 0, "e"], + [14051, 0, " "], + [14052, 0, "a"], + [14053, 0, " "], + [14054, 0, "s"], + [14055, 0, "t"], + [14056, 0, "a"], + [14057, 0, "r"], + [14058, 0, "t"], + [14059, 0, "i"], + [14060, 0, "n"], + [14061, 0, "g"], + [14062, 0, " "], + [14047, 0, " "], + [14048, 0, "\\"], + [14049, 0, "i"], + [14050, 0, "n"], + [14051, 0, " "], + [14052, 0, "H"], + [14053, 0, "_"], + [14054, 0, "s"], + [14071, 0, "o"], + [14072, 0, "p"], + [14073, 0, "e"], + [14074, 0, "r"], + [14075, 0, "a"], + [14076, 0, "t"], + [14077, 0, "i"], + [14078, 0, "o"], + [14079, 0, "n"], + [14080, 0, "."], + [14081, 0, " "], + [14082, 0, "N"], + [14083, 0, "o"], + [14084, 0, "t"], + [14085, 0, "e"], + [14086, 0, " "], + [14087, 0, "t"], + [14088, 0, "h"], + [14089, 0, "a"], + [14090, 0, "t"], + [14091, 0, " "], + [14092, 0, "b"], + [14093, 0, "y"], + [14094, 0, " "], + [14095, 0, "t"], + [14096, 0, "h"], + [14097, 0, "e"], + [14098, 0, " "], + [14099, 0, "d"], + [14100, 0, "e"], + [14101, 0, "f"], + [14102, 0, "i"], + [14103, 0, "n"], + [14104, 0, "i"], + [14105, 0, "t"], + [14106, 0, "i"], + [14107, 0, "o"], + [14108, 0, "n"], + [14109, 0, " "], + [14110, 0, "o"], + [14111, 0, "f"], + [14112, 0, " "], + [14113, 0, "L"], + [14114, 0, "a"], + [14115, 0, "m"], + [14116, 0, "p"], + [14117, 0, "o"], + [14118, 0, "r"], + [14119, 0, "t"], + [14120, 0, " "], + [14121, 0, "t"], + [14122, 0, "i"], + [14123, 0, "m"], + [14124, 0, "e"], + [14125, 0, "s"], + [14126, 0, "t"], + [14127, 0, "a"], + [14128, 0, "m"], + [14129, 0, "p"], + [14130, 0, "s"], + [14131, 0, ","], + [14132, 0, " "], + [14133, 0, "a"], + [14134, 0, "n"], + [14135, 0, "y"], + [14136, 0, " "], + [14137, 0, "o"], + [14138, 0, "p"], + [14139, 0, "e"], + [14140, 0, "r"], + [14141, 0, "a"], + [14142, 0, "t"], + [14143, 0, "i"], + [14144, 0, "o"], + [14145, 0, "n"], + [14146, 0, " "], + [14147, 0, "t"], + [14148, 0, "h"], + [14149, 0, "a"], + [14150, 0, "t"], + [14151, 0, " "], + [14152, 0, "c"], + [14153, 0, "a"], + [14154, 0, "u"], + [14155, 0, "s"], + [14156, 0, "a"], + [14157, 0, "l"], + [14158, 0, "l"], + [14159, 0, "y"], + [14160, 0, " "], + [14161, 0, "d"], + [14162, 0, "e"], + [14163, 0, "p"], + [14164, 0, "e"], + [14165, 0, "n"], + [14166, 0, "d"], + [14167, 0, "s"], + [14168, 0, " "], + [14169, 0, "o"], + [14170, 0, "n"], + [14171, 0, " "], + [14172, 0, "$"], + [14173, 0, "o"], + [14174, 0, "_"], + [14175, 0, "i"], + [14176, 0, "$"], + [14177, 0, " "], + [14178, 0, "m"], + [14179, 0, "u"], + [14180, 0, "s"], + [14181, 0, "t"], + [14182, 0, " "], + [14183, 0, "h"], + [14184, 0, "a"], + [14185, 0, "v"], + [14186, 0, "e"], + [14187, 0, " "], + [14188, 0, "a"], + [14189, 0, " "], + [14190, 0, "g"], + [14191, 0, "r"], + [14192, 0, "e"], + [14193, 0, "a"], + [14194, 0, "t"], + [14195, 0, "e"], + [14196, 0, "r"], + [14197, 0, " "], + [14198, 0, "t"], + [14199, 0, "i"], + [14200, 0, "m"], + [14201, 0, "e"], + [14202, 0, "s"], + [14203, 0, "t"], + [14204, 0, "a"], + [14205, 0, "m"], + [14206, 0, "p"], + [14207, 0, " "], + [14208, 0, "t"], + [14209, 0, "h"], + [14210, 0, "a"], + [14211, 0, "n"], + [14212, 0, " "], + [14213, 0, "$"], + [14214, 0, "o"], + [14215, 0, "_"], + [14216, 0, "i"], + [14217, 0, "$"], + [14218, 0, "."], + [14219, 0, " "], + [14220, 0, "T"], + [14221, 0, "h"], + [14222, 0, "u"], + [14223, 0, "s"], + [14224, 0, ","], + [14225, 0, " "], + [14226, 0, "$"], + [14226, 1], + [14226, 0, "i"], + [14227, 0, "f"], + [14228, 0, " "], + [14229, 0, "t"], + [14230, 0, "h"], + [14231, 0, "e"], + [14232, 0, " "], + [14233, 0, "$"], + [14234, 0, "\\"], + [14235, 0, "m"], + [14236, 0, "a"], + [14237, 0, "t"], + [14238, 0, "h"], + [14239, 0, "r"], + [14240, 0, "m"], + [14241, 0, "{"], + [14242, 0, "a"], + [14243, 0, "p"], + [14244, 0, "p"], + [14245, 0, "l"], + [14246, 0, "y"], + [14247, 0, "}"], + [14248, 0, "$"], + [14249, 0, " "], + [14250, 0, "r"], + [14251, 0, "u"], + [14252, 0, "l"], + [14253, 0, "e"], + [14254, 0, " "], + [14255, 0, "i"], + [14256, 0, "n"], + [14257, 0, "s"], + [14258, 0, "e"], + [14259, 0, "r"], + [14260, 0, "t"], + [14261, 0, "s"], + [14262, 0, " "], + [14263, 0, "$"], + [14264, 0, "o"], + [14265, 0, "_"], + [14266, 0, "{"], + [14267, 0, "n"], + [14268, 0, "+"], + [14269, 0, "1"], + [14270, 0, "}"], + [14271, 0, "$"], + [14272, 0, " "], + [14273, 0, "a"], + [14274, 0, "f"], + [14275, 0, "t"], + [14276, 0, "e"], + [14277, 0, "r"], + [14278, 0, " "], + [14279, 0, "$"], + [14280, 0, "o"], + [14281, 0, "_"], + [14282, 0, "i"], + [14283, 0, "$"], + [14284, 0, ","], + [14285, 0, " "], + [14286, 0, "t"], + [14287, 0, "h"], + [14288, 0, "e"], + [14289, 0, "n"], + [14290, 0, " "], + [14291, 0, "$"], + [14292, 0, "o"], + [14292, 1], + [14291, 1], + [14291, 0, "a"], + [14292, 0, "l"], + [14293, 0, "l"], + [14294, 0, " "], + [14295, 0, "o"], + [14296, 0, "p"], + [14297, 0, "e"], + [14298, 0, "r"], + [14299, 0, "a"], + [14300, 0, "t"], + [14301, 0, "i"], + [14302, 0, "o"], + [14303, 0, "n"], + [14304, 0, "s"], + [14305, 0, " "], + [14306, 0, "t"], + [14307, 0, "h"], + [14308, 0, "a"], + [14309, 0, "t"], + [14310, 0, " "], + [14311, 0, "c"], + [14312, 0, "a"], + [14313, 0, "u"], + [14314, 0, "s"], + [14315, 0, "a"], + [14316, 0, "l"], + [14317, 0, "l"], + [14318, 0, "y"], + [14319, 0, " "], + [14320, 0, "d"], + [14321, 0, "e"], + [14322, 0, "p"], + [14323, 0, "e"], + [14324, 0, "n"], + [14325, 0, "d"], + [14326, 0, " "], + [14327, 0, "o"], + [14328, 0, "n"], + [14329, 0, " "], + [14330, 0, "$"], + [14331, 0, "o"], + [14332, 0, "_"], + [14333, 0, "i"], + [14334, 0, "$"], + [14335, 0, " "], + [14336, 0, "n"], + [14337, 0, "e"], + [14338, 0, "c"], + [14339, 0, "e"], + [14340, 0, "s"], + [14341, 0, "s"], + [14342, 0, "a"], + [14343, 0, "r"], + [14344, 0, "i"], + [14345, 0, "l"], + [14346, 0, "y"], + [14347, 0, " "], + [14348, 0, "a"], + [14349, 0, "l"], + [14350, 0, "s"], + [14351, 0, "o"], + [14352, 0, " "], + [14353, 0, "a"], + [14354, 0, "p"], + [14355, 0, "p"], + [14356, 0, "e"], + [14357, 0, "a"], + [14358, 0, "r"], + [14359, 0, " "], + [14360, 0, "b"], + [14361, 0, "e"], + [14362, 0, "f"], + [14363, 0, "o"], + [14364, 0, "r"], + [14365, 0, "e"], + [14366, 0, " "], + [14367, 0, "$"], + [14368, 0, "o"], + [14369, 0, "_"], + [14370, 0, "{"], + [14371, 0, "n"], + [14372, 0, "+"], + [14373, 0, "1"], + [14374, 0, "}"], + [14375, 0, "$"], + [14376, 0, " "], + [14377, 0, "i"], + [14378, 0, "n"], + [14379, 0, " "], + [14380, 0, "t"], + [14381, 0, "h"], + [14382, 0, "e"], + [14383, 0, " "], + [14384, 0, "f"], + [14385, 0, "i"], + [14386, 0, "n"], + [14387, 0, "a"], + [14388, 0, "l"], + [14389, 0, " "], + [14390, 0, "s"], + [14391, 0, "t"], + [14392, 0, "a"], + [14393, 0, "t"], + [14394, 0, "e"], + [14395, 0, "."], + [14396, 0, "\n"], + [14397, 0, "\n"], + [13142, 0, "\n"], + [13143, 0, "\n"], + [13142, 0, "L"], + [13143, 0, "e"], + [13144, 0, "t"], + [13145, 0, " "], + [13146, 0, "$"], + [13147, 0, "H"], + [13148, 0, "_"], + [13149, 0, "c"], + [13150, 0, "$"], + [13151, 0, " "], + [13152, 0, "b"], + [13153, 0, "e"], + [13154, 0, " "], + [13155, 0, "a"], + [13156, 0, " "], + [13157, 0, "h"], + [13158, 0, "i"], + [13159, 0, "s"], + [13160, 0, "t"], + [13161, 0, "o"], + [13162, 0, "r"], + [13163, 0, "y"], + [13164, 0, " "], + [13165, 0, "o"], + [13166, 0, "f"], + [13167, 0, " "], + [13168, 0, "o"], + [13169, 0, "p"], + [13170, 0, "e"], + [13171, 0, "r"], + [13172, 0, "a"], + [13173, 0, "t"], + [13174, 0, "i"], + [13175, 0, "o"], + [13176, 0, "n"], + [13177, 0, "s"], + [13178, 0, ","], + [13179, 0, " "], + [13180, 0, "d"], + [13181, 0, "e"], + [13182, 0, "r"], + [13183, 0, "i"], + [13184, 0, "v"], + [13185, 0, "e"], + [13186, 0, "d"], + [13187, 0, " "], + [13188, 0, "f"], + [13189, 0, "r"], + [13190, 0, "o"], + [13191, 0, "m"], + [13192, 0, " "], + [13193, 0, "e"], + [13194, 0, "i"], + [13195, 0, "t"], + [13196, 0, "h"], + [13197, 0, "e"], + [13198, 0, "r"], + [13199, 0, " "], + [13200, 0, "$"], + [13201, 0, "H"], + [13202, 0, "_"], + [13203, 0, "1"], + [13204, 0, "$"], + [13205, 0, " "], + [13206, 0, "o"], + [13207, 0, "r"], + [13208, 0, " "], + [13209, 0, "$"], + [13210, 0, "H"], + [13211, 0, "_"], + [13212, 0, "2"], + [13213, 0, "$"], + [13214, 0, " "], + [13215, 0, "b"], + [13216, 0, "y"], + [13217, 0, " "], + [13218, 0, "s"], + [13219, 0, "e"], + [13220, 0, "l"], + [13221, 0, "e"], + [13222, 0, "c"], + [13223, 0, "t"], + [13224, 0, "i"], + [13225, 0, "n"], + [13226, 0, "g"], + [13227, 0, " "], + [13228, 0, "o"], + [13229, 0, "n"], + [13230, 0, "l"], + [13231, 0, "y"], + [13232, 0, " "], + [13233, 0, "$"], + [13234, 0, "\\"], + [13235, 0, "m"], + [13236, 0, "a"], + [13237, 0, "t"], + [13238, 0, "h"], + [13239, 0, "s"], + [13240, 0, "f"], + [13241, 0, "{"], + [13242, 0, "i"], + [13243, 0, "n"], + [13244, 0, "s"], + [13245, 0, "e"], + [13246, 0, "r"], + [13247, 0, "t"], + [13248, 0, "}"], + [13249, 0, "$"], + [13250, 0, " "], + [13251, 0, "o"], + [13252, 0, "p"], + [13253, 0, "e"], + [13254, 0, "r"], + [13255, 0, "a"], + [13256, 0, "t"], + [13257, 0, "i"], + [13258, 0, "o"], + [13259, 0, "n"], + [13260, 0, "s"], + [13261, 0, " "], + [13262, 0, "t"], + [13263, 0, "h"], + [13264, 0, "a"], + [13265, 0, "t"], + [13266, 0, " "], + [13267, 0, "a"], + [13268, 0, "r"], + [13269, 0, "e"], + [13270, 0, " "], + [13271, 0, "c"], + [13272, 0, "o"], + [13273, 0, "n"], + [13274, 0, "c"], + [13275, 0, "u"], + [13276, 0, "r"], + [13277, 0, "r"], + [13278, 0, "e"], + [13279, 0, "n"], + [13280, 0, "t"], + [13281, 0, " "], + [13282, 0, "w"], + [13283, 0, "i"], + [13284, 0, "t"], + [13285, 0, "h"], + [13286, 0, " "], + [13287, 0, "$"], + [13288, 0, "{"], + [13288, 1], + [13288, 0, "o"], + [13289, 0, "_"], + [13290, 0, "{"], + [13291, 0, "n"], + [13292, 0, "+"], + [13293, 0, "1"], + [13294, 0, "}"], + [13295, 0, "$"], + [13296, 0, " "], + [13297, 0, "a"], + [13298, 0, "n"], + [13299, 0, "d"], + [13300, 0, " "], + [13301, 0, "t"], + [13302, 0, "h"], + [13303, 0, "a"], + [13304, 0, "t"], + [13305, 0, " "], + [13306, 0, "i"], + [13307, 0, "n"], + [13308, 0, "s"], + [13309, 0, "e"], + [13310, 0, "r"], + [13311, 0, "t"], + [13312, 0, " "], + [13313, 0, "a"], + [13314, 0, " "], + [13314, 1], + [13314, 0, "t"], + [13315, 0, " "], + [13316, 0, "a"], + [13317, 0, " "], + [13318, 0, "p"], + [13319, 0, "o"], + [13320, 0, "s"], + [13321, 0, "i"], + [13322, 0, "t"], + [13323, 0, "i"], + [13324, 0, "o"], + [13325, 0, "n"], + [13326, 0, " "], + [13327, 0, "w"], + [13328, 0, "i"], + [13329, 0, "t"], + [13330, 0, "h"], + [13331, 0, "i"], + [13332, 0, "n"], + [13333, 0, " "], + [13334, 0, "t"], + [13335, 0, "h"], + [13336, 0, "e"], + [13337, 0, " "], + [13338, 0, "i"], + [13339, 0, "n"], + [13340, 0, "t"], + [13341, 0, "e"], + [13342, 0, "r"], + [13343, 0, "v"], + [13344, 0, "a"], + [13345, 0, "l"], + [13346, 0, " "], + [13347, 0, "f"], + [13348, 0, "r"], + [13349, 0, "o"], + [13350, 0, "m"], + [13351, 0, " "], + [13352, 0, "$"], + [13353, 0, "\\"], + [13354, 0, "m"], + [13355, 0, "a"], + [13356, 0, "t"], + [13357, 0, "h"], + [13358, 0, "i"], + [13359, 0, "t"], + [13360, 0, "{"], + [13361, 0, "p"], + [13362, 0, "r"], + [13363, 0, "e"], + [13364, 0, "v"], + [13365, 0, "}"], + [13366, 0, "$"], + [13367, 0, " "], + [13368, 0, "t"], + [13369, 0, "o"], + [13370, 0, " "], + [13371, 0, "$"], + [13372, 0, "\\"], + [13373, 0, "m"], + [13374, 0, "a"], + [13375, 0, "t"], + [13376, 0, "h"], + [13377, 0, "i"], + [13378, 0, "t"], + [13379, 0, "{"], + [13380, 0, "n"], + [13381, 0, "e"], + [13382, 0, "x"], + [13383, 0, "t"], + [13384, 0, "}"], + [13385, 0, "$"], + [13386, 0, "."], + [13387, 0, " "], + [13388, 0, "T"], + [13389, 0, "h"], + [13390, 0, "e"], + [13391, 0, " "], + [13392, 0, "o"], + [13393, 0, "p"], + [13394, 0, "e"], + [13395, 0, "r"], + [13396, 0, "a"], + [13397, 0, "t"], + [13398, 0, "i"], + [13399, 0, "o"], + [13400, 0, "n"], + [13401, 0, "s"], + [13402, 0, " "], + [13403, 0, "i"], + [13404, 0, "n"], + [13405, 0, " "], + [13406, 0, "$"], + [13407, 0, "H"], + [13408, 0, "_"], + [13409, 0, "c"], + [13410, 0, "$"], + [13411, 0, " "], + [13412, 0, "d"], + [13413, 0, "e"], + [13414, 0, "t"], + [13415, 0, "e"], + [13416, 0, "r"], + [13417, 0, "m"], + [13418, 0, "i"], + [13419, 0, "n"], + [13420, 0, "e"], + [13421, 0, " "], + [13422, 0, "t"], + [13423, 0, "h"], + [13424, 0, "e"], + [13425, 0, " "], + [13426, 0, "f"], + [13427, 0, "i"], + [13428, 0, "n"], + [13429, 0, "a"], + [13430, 0, "l"], + [13431, 0, " "], + [13432, 0, "o"], + [13433, 0, "r"], + [13434, 0, "d"], + [13435, 0, "e"], + [13436, 0, "r"], + [13437, 0, " "], + [13438, 0, "o"], + [13439, 0, "f"], + [13440, 0, " "], + [13441, 0, "l"], + [13442, 0, "i"], + [13443, 0, "s"], + [13444, 0, "t"], + [13445, 0, " "], + [13446, 0, "e"], + [13447, 0, "l"], + [13448, 0, "e"], + [13449, 0, "m"], + [13450, 0, "t"], + [13451, 0, "n"], + [13452, 0, "s"], + [13453, 0, " "], + [13453, 1], + [13452, 1], + [13451, 1], + [13450, 1], + [13450, 0, "e"], + [13451, 0, "m"], + [13452, 0, "t"], + [13452, 1], + [13451, 1], + [13451, 0, "n"], + [13452, 0, "t"], + [13453, 0, "s"], + [13454, 0, " "], + [13455, 0, "w"], + [13456, 0, "i"], + [13457, 0, "t"], + [13458, 0, "h"], + [13459, 0, "i"], + [13460, 0, "n"], + [13461, 0, " "], + [13462, 0, "t"], + [13463, 0, "h"], + [13464, 0, "a"], + [13465, 0, "t"], + [13466, 0, " "], + [13467, 0, "i"], + [13468, 0, "n"], + [13469, 0, "t"], + [13470, 0, "e"], + [13471, 0, "r"], + [13472, 0, "v"], + [13473, 0, "a"], + [13474, 0, "l"], + [13475, 0, ","], + [13476, 0, " "], + [13477, 0, "a"], + [13478, 0, "n"], + [13479, 0, "d"], + [13480, 0, " "], + [13481, 0, "d"], + [13482, 0, "o"], + [13483, 0, " "], + [13484, 0, "n"], + [13485, 0, "o"], + [13486, 0, "t"], + [13487, 0, " "], + [13488, 0, "a"], + [13489, 0, "f"], + [13490, 0, "f"], + [13491, 0, "e"], + [13492, 0, "c"], + [13493, 0, "t"], + [13494, 0, " "], + [13495, 0, "("], + [13496, 0, "a"], + [13497, 0, "n"], + [13498, 0, "d"], + [13499, 0, " "], + [13500, 0, "a"], + [13501, 0, "r"], + [13502, 0, "e"], + [13503, 0, " "], + [13504, 0, "n"], + [13505, 0, "o"], + [13506, 0, "t"], + [13507, 0, " "], + [13508, 0, "a"], + [13509, 0, "f"], + [13510, 0, "f"], + [13511, 0, "e"], + [13512, 0, "c"], + [13513, 0, "t"], + [13514, 0, "e"], + [13515, 0, "d"], + [13516, 0, " "], + [13517, 0, "b"], + [13518, 0, "y"], + [13519, 0, ")"], + [13520, 0, " "], + [13521, 0, "t"], + [13522, 0, "h"], + [13523, 0, "e"], + [13524, 0, " "], + [13525, 0, "o"], + [13526, 0, "r"], + [13527, 0, "d"], + [13528, 0, "e"], + [13529, 0, "r"], + [13529, 1], + [13528, 1], + [13527, 1], + [13526, 1], + [13525, 1], + [13525, 0, "l"], + [13526, 0, "i"], + [13527, 0, "s"], + [13528, 0, "t"], + [13529, 0, " "], + [13530, 0, "o"], + [13531, 0, "r"], + [13532, 0, "d"], + [13533, 0, "e"], + [13534, 0, "r"], + [13535, 0, " "], + [13536, 0, "o"], + [13537, 0, "u"], + [13538, 0, "t"], + [13539, 0, "s"], + [13540, 0, "i"], + [13541, 0, "d"], + [13542, 0, "e"], + [13543, 0, " "], + [13544, 0, "o"], + [13545, 0, "f"], + [13546, 0, " "], + [13547, 0, "t"], + [13548, 0, "h"], + [13549, 0, "a"], + [13550, 0, "t"], + [13551, 0, " "], + [13552, 0, "i"], + [13553, 0, "n"], + [13554, 0, "t"], + [13555, 0, "e"], + [13556, 0, "r"], + [13557, 0, "v"], + [13558, 0, "a"], + [13559, 0, "l"], + [13560, 0, "."], + [13561, 0, " "], + [13562, 0, "B"], + [13563, 0, "y"], + [13564, 0, " "], + [13565, 0, "t"], + [13566, 0, "h"], + [13567, 0, "e"], + [13568, 0, " "], + [13569, 0, "i"], + [13570, 0, "n"], + [13571, 0, "d"], + [13572, 0, "u"], + [13573, 0, "c"], + [13574, 0, "t"], + [13575, 0, "i"], + [13576, 0, "o"], + [13577, 0, "n"], + [13578, 0, " "], + [13579, 0, "h"], + [13580, 0, "y"], + [13581, 0, "p"], + [13582, 0, "o"], + [13583, 0, "t"], + [13584, 0, "h"], + [13585, 0, "e"], + [13586, 0, "s"], + [13587, 0, "i"], + [13588, 0, "s"], + [13589, 0, ","], + [13590, 0, " "], + [13591, 0, "t"], + [13592, 0, "h"], + [13593, 0, "e"], + [13594, 0, " "], + [13595, 0, "o"], + [13596, 0, "p"], + [13597, 0, "e"], + [13598, 0, "r"], + [13599, 0, "a"], + [13600, 0, "t"], + [13601, 0, "i"], + [13602, 0, "o"], + [13603, 0, "n"], + [13604, 0, "s"], + [13605, 0, " "], + [13606, 0, "i"], + [13607, 0, "n"], + [13608, 0, " "], + [13609, 0, "$"], + [13610, 0, "H"], + [13611, 0, "_"], + [13612, 0, "c"], + [13613, 0, "$"], + [13614, 0, " "], + [13607, 1], + [13606, 1], + [13605, 1], + [13604, 1], + [13603, 1], + [13602, 1], + [13601, 1], + [13600, 1], + [13599, 1], + [13598, 1], + [13597, 1], + [13596, 1], + [13595, 1], + [13594, 1], + [13593, 1], + [13592, 1], + [13591, 1], + [13591, 0, "a"], + [13592, 0, "l"], + [13593, 0, "l"], + [13594, 0, " "], + [13595, 0, "p"], + [13596, 0, "o"], + [13597, 0, "s"], + [13598, 0, "s"], + [13599, 0, "i"], + [13600, 0, "b"], + [13601, 0, "l"], + [13602, 0, "e"], + [13603, 0, " "], + [13604, 0, "c"], + [13605, 0, "h"], + [13606, 0, "o"], + [13607, 0, "i"], + [13608, 0, "c"], + [13609, 0, "e"], + [13610, 0, "s"], + [13611, 0, " "], + [13612, 0, "o"], + [13613, 0, "f"], + [13621, 0, "r"], + [13622, 0, "e"], + [13623, 0, "s"], + [13624, 0, "u"], + [13625, 0, "l"], + [13626, 0, "t"], + [13627, 0, " "], + [13628, 0, "i"], + [13629, 0, "n"], + [13630, 0, " "], + [13631, 0, "t"], + [13632, 0, "h"], + [13633, 0, "e"], + [13634, 0, " "], + [13635, 0, "s"], + [13636, 0, "a"], + [13637, 0, "m"], + [13638, 0, "e"], + [13639, 0, " "], + [13640, 0, "f"], + [13641, 0, "i"], + [13642, 0, "n"], + [13643, 0, "a"], + [13644, 0, "l"], + [13645, 0, " "], + [13646, 0, "l"], + [13647, 0, "i"], + [13648, 0, "s"], + [13649, 0, "t"], + [13650, 0, " "], + [13651, 0, "o"], + [13652, 0, "r"], + [13653, 0, "d"], + [13654, 0, "e"], + [13655, 0, "r"], + [13656, 0, " "], + [13657, 0, "w"], + [13658, 0, "i"], + [13659, 0, "t"], + [13660, 0, "h"], + [13661, 0, "i"], + [13662, 0, "n"], + [13663, 0, " "], + [13387, 0, " "], + [13388, 0, "B"], + [13389, 0, "y"], + [13390, 0, " "], + [13391, 0, "t"], + [13392, 0, "h"], + [13393, 0, "e"], + [13394, 0, " "], + [13395, 0, "i"], + [13396, 0, "n"], + [13397, 0, "d"], + [13398, 0, "u"], + [13399, 0, "c"], + [13400, 0, "t"], + [13401, 0, "i"], + [13402, 0, "o"], + [13403, 0, "n"], + [13404, 0, " "], + [13405, 0, "h"], + [13406, 0, "y"], + [13407, 0, "p"], + [13408, 0, "o"], + [13409, 0, "t"], + [13410, 0, "h"], + [13411, 0, "e"], + [13412, 0, "s"], + [13413, 0, "i"], + [13414, 0, "s"], + [13415, 0, ","], + [13433, 1], + [13432, 1], + [13431, 1], + [13430, 1], + [13429, 1], + [13428, 1], + [13427, 1], + [13426, 1], + [13425, 1], + [13424, 1], + [13423, 1], + [13422, 1], + [13421, 1], + [13420, 1], + [13419, 1], + [13418, 1], + [13417, 1], + [13417, 0, "a"], + [13418, 0, "l"], + [13419, 0, "l"], + [13420, 0, " "], + [13421, 0, "p"], + [13422, 0, "o"], + [13423, 0, "s"], + [13424, 0, "s"], + [13425, 0, "i"], + [13426, 0, "b"], + [13427, 0, "l"], + [13428, 0, "e"], + [13429, 0, " "], + [13430, 0, "s"], + [13431, 0, "u"], + [13432, 0, "b"], + [13433, 0, "-"], + [13434, 0, "h"], + [13435, 0, "i"], + [13436, 0, "s"], + [13437, 0, "t"], + [13438, 0, "o"], + [13439, 0, "r"], + [13440, 0, "i"], + [13441, 0, "e"], + [13442, 0, "s"], + [13458, 1], + [13457, 1], + [13456, 1], + [13455, 1], + [13454, 1], + [13453, 1], + [13452, 1], + [13451, 1], + [13450, 1], + [13450, 0, "r"], + [13451, 0, "e"], + [13452, 0, "s"], + [13453, 0, "u"], + [13454, 0, "l"], + [13455, 0, "t"], + [13456, 0, " "], + [13457, 0, "i"], + [13458, 0, "n"], + [13459, 0, " "], + [13460, 0, "t"], + [13461, 0, "h"], + [13461, 1], + [13460, 1], + [13459, 1], + [13463, 0, " "], + [13464, 0, "s"], + [13465, 0, "a"], + [13466, 0, "m"], + [13467, 0, "e"], + [13522, 1], + [13521, 1], + [13520, 1], + [13519, 1], + [13518, 1], + [13518, 0, "."], + [13519, 0, " "], + [13520, 0, "T"], + [13521, 0, "h"], + [13522, 0, "e"], + [13523, 0, " "], + [13524, 0, "o"], + [13525, 0, "p"], + [13526, 0, "e"], + [13527, 0, "r"], + [13528, 0, "a"], + [13529, 0, "t"], + [13530, 0, "i"], + [13531, 0, "o"], + [13532, 0, "n"], + [13533, 0, "s"], + [13534, 0, " "], + [13535, 0, "i"], + [13536, 0, "n"], + [13537, 0, " "], + [13538, 0, "$"], + [13539, 0, "H"], + [13540, 0, "_"], + [13541, 0, "c"], + [13542, 0, "$"], + [13726, 1], + [13725, 1], + [13724, 1], + [13723, 1], + [13722, 1], + [13721, 1], + [13720, 1], + [13719, 1], + [13718, 1], + [13717, 1], + [13716, 1], + [13715, 1], + [13714, 1], + [13713, 1], + [13712, 1], + [13711, 1], + [13710, 1], + [13709, 1], + [13708, 1], + [13707, 1], + [13706, 1], + [13705, 1], + [13704, 1], + [13703, 1], + [13702, 1], + [13701, 1], + [13700, 1], + [13699, 1], + [13698, 1], + [13697, 1], + [13696, 1], + [13695, 1], + [13694, 1], + [13693, 1], + [13692, 1], + [13691, 1], + [13690, 1], + [13689, 1], + [13688, 1], + [13687, 1], + [13686, 1], + [13685, 1], + [13684, 1], + [13683, 1], + [13682, 1], + [13681, 1], + [13680, 1], + [13679, 1], + [13678, 1], + [13677, 1], + [13676, 1], + [13675, 1], + [13674, 1], + [13673, 1], + [13672, 1], + [13671, 1], + [13670, 1], + [13669, 1], + [13668, 1], + [13667, 1], + [13666, 1], + [13665, 1], + [13664, 1], + [13663, 1], + [13662, 1], + [13661, 1], + [13660, 1], + [13659, 1], + [13658, 1], + [13657, 1], + [13656, 1], + [13655, 1], + [13654, 1], + [13653, 1], + [13652, 1], + [13651, 1], + [13650, 1], + [13649, 1], + [13648, 1], + [13647, 1], + [13646, 1], + [13645, 1], + [13644, 1], + [13643, 1], + [13642, 1], + [13641, 1], + [13640, 1], + [13639, 1], + [13638, 1], + [13637, 1], + [13636, 1], + [13635, 1], + [13634, 1], + [13633, 1], + [13632, 1], + [13631, 1], + [13630, 1], + [13629, 1], + [13628, 1], + [13627, 1], + [13626, 1], + [13625, 1], + [13624, 1], + [13623, 1], + [13623, 0, ","], + [13624, 0, " "], + [13625, 0, "s"], + [13626, 0, "o"], + [13627, 0, " "], + [13628, 0, "w"], + [13629, 0, "e"], + [13630, 0, " "], + [13631, 0, "c"], + [13632, 0, "a"], + [13633, 0, "n"], + [13634, 0, " "], + [13635, 0, "c"], + [13636, 0, "o"], + [13637, 0, "n"], + [13638, 0, "s"], + [13639, 0, "i"], + [13640, 0, "d"], + [13641, 0, "e"], + [13642, 0, "r"], + [13643, 0, " "], + [13644, 0, "$"], + [13645, 0, "H"], + [13646, 0, "_"], + [13647, 0, "c"], + [13648, 0, "$"], + [13649, 0, " "], + [13650, 0, "i"], + [13651, 0, "n"], + [13652, 0, " "], + [13653, 0, "i"], + [13654, 0, "s"], + [13655, 0, "o"], + [13656, 0, "l"], + [13657, 0, "a"], + [13658, 0, "t"], + [13659, 0, "i"], + [13660, 0, "o"], + [13661, 0, "n"], + [13662, 0, "."], + [14311, 1], + [14310, 1], + [14309, 1], + [14308, 1], + [14307, 1], + [14306, 1], + [14305, 1], + [14304, 1], + [14303, 1], + [14302, 1], + [14301, 1], + [14300, 1], + [14299, 1], + [14298, 1], + [14297, 1], + [14296, 1], + [14295, 1], + [14294, 1], + [14293, 1], + [14292, 1], + [14291, 1], + [14290, 1], + [14289, 1], + [14288, 1], + [14287, 1], + [14286, 1], + [14285, 1], + [14284, 1], + [14283, 1], + [14282, 1], + [14281, 1], + [14280, 1], + [14279, 1], + [14278, 1], + [14277, 1], + [14276, 1], + [14275, 1], + [14274, 1], + [14273, 1], + [14272, 1], + [14271, 1], + [14270, 1], + [14269, 1], + [14268, 1], + [14267, 1], + [14266, 1], + [14265, 1], + [14264, 1], + [14263, 1], + [14262, 1], + [14261, 1], + [14260, 1], + [14259, 1], + [14258, 1], + [14257, 1], + [14256, 1], + [14255, 1], + [14254, 1], + [14253, 1], + [14252, 1], + [14251, 1], + [14250, 1], + [14249, 1], + [14248, 1], + [14247, 1], + [14246, 1], + [14245, 1], + [14244, 1], + [14243, 1], + [14242, 1], + [14241, 1], + [14240, 1], + [14239, 1], + [14238, 1], + [14237, 1], + [14236, 1], + [14235, 1], + [14234, 1], + [14233, 1], + [14232, 1], + [14231, 1], + [14230, 1], + [14229, 1], + [14228, 1], + [14227, 1], + [14226, 1], + [14225, 1], + [14224, 1], + [14223, 1], + [14222, 1], + [14221, 1], + [14220, 1], + [14219, 1], + [14218, 1], + [14217, 1], + [14216, 1], + [14215, 1], + [14214, 1], + [14213, 1], + [14212, 1], + [14211, 1], + [14210, 1], + [14209, 1], + [14208, 1], + [14207, 1], + [14206, 1], + [14205, 1], + [14204, 1], + [14203, 1], + [14202, 1], + [14201, 1], + [14200, 1], + [14199, 1], + [14198, 1], + [14197, 1], + [14196, 1], + [14195, 1], + [14194, 1], + [14193, 1], + [14192, 1], + [14191, 1], + [14190, 1], + [14189, 1], + [14188, 1], + [14187, 1], + [14186, 1], + [14185, 1], + [14184, 1], + [14183, 1], + [14182, 1], + [14181, 1], + [14180, 1], + [14179, 1], + [14178, 1], + [14177, 1], + [14176, 1], + [14175, 1], + [14174, 1], + [14173, 1], + [14172, 1], + [14171, 1], + [14170, 1], + [14169, 1], + [14168, 1], + [14167, 1], + [14166, 1], + [14165, 1], + [14164, 1], + [14163, 1], + [14162, 1], + [14161, 1], + [14160, 1], + [14159, 1], + [14158, 1], + [14157, 1], + [14156, 1], + [14155, 1], + [14154, 1], + [14153, 1], + [14152, 1], + [14151, 1], + [14150, 1], + [14149, 1], + [14148, 1], + [14147, 1], + [14146, 1], + [14145, 1], + [14144, 1], + [14143, 1], + [14142, 1], + [14141, 1], + [14140, 1], + [14139, 1], + [14138, 1], + [14137, 1], + [14136, 1], + [14135, 1], + [14134, 1], + [14133, 1], + [14132, 1], + [14131, 1], + [14130, 1], + [14129, 1], + [14128, 1], + [14127, 1], + [14126, 1], + [14125, 1], + [14124, 1], + [14123, 1], + [14122, 1], + [14121, 1], + [14120, 1], + [14119, 1], + [14118, 1], + [14117, 1], + [14116, 1], + [14115, 1], + [14114, 1], + [14113, 1], + [14112, 1], + [14111, 1], + [14110, 1], + [14109, 1], + [14108, 1], + [14107, 1], + [14106, 1], + [14105, 1], + [14104, 1], + [14103, 1], + [14102, 1], + [14101, 1], + [14100, 1], + [14099, 1], + [14098, 1], + [14097, 1], + [14096, 1], + [14095, 1], + [14094, 1], + [14093, 1], + [14092, 1], + [14091, 1], + [14090, 1], + [14089, 1], + [14088, 1], + [14087, 1], + [14086, 1], + [14085, 1], + [14084, 1], + [14083, 1], + [14082, 1], + [13663, 0, "\n"], + [13664, 0, "\n"], + [13665, 0, "L"], + [13666, 0, "e"], + [13667, 0, "t"], + [13668, 0, " "], + [13669, 0, "$"], + [13670, 0, "["], + [13671, 0, "\\"], + [13672, 0, "m"], + [13673, 0, "a"], + [13674, 0, "t"], + [13675, 0, "h"], + [13676, 0, "i"], + [13677, 0, "t"], + [13678, 0, "{"], + [13679, 0, "i"], + [13680, 0, "d"], + [13681, 0, "}"], + [13682, 0, "_"], + [13683, 0, "1"], + [13684, 0, ","], + [13685, 0, " "], + [13686, 0, "\\"], + [13687, 0, "d"], + [13688, 0, "o"], + [13689, 0, "t"], + [13690, 0, "s"], + [13691, 0, ","], + [13692, 0, " "], + [13693, 0, "\\"], + [13694, 0, "m"], + [13695, 0, "a"], + [13696, 0, "t"], + [13697, 0, "h"], + [13698, 0, "i"], + [13699, 0, "t"], + [13700, 0, "{"], + [13701, 0, "i"], + [13702, 0, "d"], + [13703, 0, "}"], + [13704, 0, "_"], + [13705, 0, "k"], + [13706, 0, "]"], + [13707, 0, "$"], + [13708, 0, " "], + [13709, 0, "b"], + [13710, 0, "e"], + [13711, 0, " "], + [13712, 0, "t"], + [13713, 0, "h"], + [13714, 0, "e"], + [13715, 0, " "], + [13716, 0, "o"], + [13717, 0, "r"], + [13718, 0, "d"], + [13719, 0, "e"], + [13720, 0, "r"], + [13721, 0, " "], + [13722, 0, "o"], + [13723, 0, "f"], + [13724, 0, " "], + [13725, 0, "l"], + [13726, 0, "i"], + [13727, 0, "s"], + [13728, 0, "t"], + [13729, 0, " "], + [13730, 0, "e"], + [13731, 0, "l"], + [13732, 0, "e"], + [13733, 0, "m"], + [13734, 0, "e"], + [13735, 0, "n"], + [13736, 0, "t"], + [13737, 0, "s"], + [13738, 0, " "], + [13715, 0, " "], + [13716, 0, "L"], + [13717, 0, "a"], + [13718, 0, "m"], + [13719, 0, "p"], + [13720, 0, "o"], + [13721, 0, "r"], + [13722, 0, "t"], + [13723, 0, " "], + [13724, 0, "t"], + [13725, 0, "i"], + [13726, 0, "m"], + [13727, 0, "e"], + [13728, 0, "s"], + [13729, 0, "t"], + [13730, 0, "a"], + [13731, 0, "m"], + [13732, 0, "p"], + [13733, 0, "s"], + [13734, 0, " "], + [13735, 0, "o"], + [13736, 0, "f"], + [13745, 1], + [13744, 1], + [13743, 1], + [13742, 1], + [13741, 1], + [13740, 1], + [13739, 1], + [13738, 1], + [13738, 0, "t"], + [13739, 0, "h"], + [13740, 0, "e"], + [13756, 0, "i"], + [13757, 0, "n"], + [13758, 0, "s"], + [13759, 0, "e"], + [13760, 0, "r"], + [13761, 0, "t"], + [13761, 1], + [13760, 1], + [13759, 1], + [13758, 1], + [13757, 1], + [13756, 1], + [13756, 0, "d"], + [13757, 0, "e"], + [13758, 0, "f"], + [13759, 0, "i"], + [13760, 0, "n"], + [13761, 0, "e"], + [13761, 1], + [13760, 1], + [13759, 1], + [13758, 1], + [13757, 1], + [13756, 1], + [13756, 0, "i"], + [13757, 0, "n"], + [13758, 0, " "], + [13759, 0, "t"], + [13760, 0, "h"], + [13761, 0, "e"], + [13762, 0, " "], + [13763, 0, "i"], + [13764, 0, "n"], + [13765, 0, "t"], + [13766, 0, "e"], + [13767, 0, "r"], + [13768, 0, "v"], + [13769, 0, "a"], + [13770, 0, "l"], + [13771, 0, " "], + [13772, 0, "b"], + [13773, 0, "e"], + [13774, 0, "t"], + [13775, 0, "w"], + [13776, 0, "e"], + [13777, 0, "e"], + [13778, 0, "n"], + [13779, 0, " "], + [13780, 0, "$"], + [13781, 0, "\\"], + [13782, 0, "m"], + [13783, 0, "a"], + [13784, 0, "t"], + [13785, 0, "h"], + [13786, 0, "i"], + [13787, 0, "t"], + [13788, 0, "{"], + [13789, 0, "p"], + [13790, 0, "r"], + [13791, 0, "e"], + [13792, 0, "v"], + [13793, 0, "}"], + [13794, 0, "$"], + [13795, 0, " "], + [13796, 0, "a"], + [13797, 0, "n"], + [13798, 0, "d"], + [13799, 0, " "], + [13800, 0, "$"], + [13801, 0, "\\"], + [13802, 0, "m"], + [13803, 0, "a"], + [13804, 0, "t"], + [13805, 0, "h"], + [13806, 0, "i"], + [13807, 0, "t"], + [13808, 0, "{"], + [13809, 0, "n"], + [13810, 0, "e"], + [13811, 0, "x"], + [13812, 0, "t"], + [13813, 0, "}"], + [13814, 0, "$"], + [13815, 0, ","], + [13816, 0, " "], + [13817, 0, "i"], + [13818, 0, "n"], + [13819, 0, " "], + [13820, 0, "t"], + [13821, 0, "h"], + [13822, 0, "e"], + [13823, 0, " "], + [13824, 0, "l"], + [13825, 0, "i"], + [13826, 0, "s"], + [13827, 0, "t"], + [13828, 0, " "], + [13829, 0, "o"], + [13830, 0, "r"], + [13831, 0, "d"], + [13832, 0, "e"], + [13833, 0, "r"], + [13834, 0, " "], + [13835, 0, "u"], + [13836, 0, "n"], + [13837, 0, "a"], + [13838, 0, "m"], + [13839, 0, "b"], + [13840, 0, "i"], + [13841, 0, "g"], + [13842, 0, "u"], + [13843, 0, "o"], + [13844, 0, "u"], + [13845, 0, "s"], + [13846, 0, "l"], + [13847, 0, "y"], + [13848, 0, " "], + [13849, 0, "d"], + [13850, 0, "e"], + [13851, 0, "f"], + [13852, 0, "i"], + [13853, 0, "n"], + [13854, 0, "e"], + [13855, 0, "d"], + [13856, 0, " "], + [13857, 0, "b"], + [13858, 0, "y"], + [13859, 0, " "], + [13860, 0, "$"], + [13861, 0, "H"], + [13862, 0, "_"], + [13863, 0, "c"], + [13864, 0, "$"], + [13865, 0, "."], + [13866, 0, " "], + [13867, 0, "W"], + [13868, 0, "e"], + [13869, 0, " "], + [13870, 0, "n"], + [13871, 0, "e"], + [13872, 0, "e"], + [13873, 0, "d"], + [13874, 0, " "], + [13875, 0, "t"], + [13876, 0, "o"], + [13877, 0, " "], + [13878, 0, "s"], + [13879, 0, "h"], + [13880, 0, "o"], + [13881, 0, "w"], + [13882, 0, " "], + [13883, 0, "t"], + [13884, 0, "h"], + [13885, 0, "a"], + [13886, 0, "t"], + [13887, 0, " "], + [13888, 0, "r"], + [13889, 0, "e"], + [13890, 0, "g"], + [13891, 0, "a"], + [13892, 0, "r"], + [13893, 0, "d"], + [13894, 0, "l"], + [13895, 0, "e"], + [13896, 0, "s"], + [13897, 0, "s"], + [13898, 0, " "], + [13899, 0, "a"], + [13900, 0, "t"], + [13901, 0, " "], + [13902, 0, "w"], + [13903, 0, "h"], + [13904, 0, "a"], + [13905, 0, "t"], + [13906, 0, " "], + [13907, 0, "p"], + [13908, 0, "o"], + [13909, 0, "s"], + [13910, 0, "i"], + [13911, 0, "t"], + [13912, 0, "i"], + [13913, 0, "o"], + [13914, 0, "n"], + [13915, 0, " "], + [13916, 0, "i"], + [13917, 0, "n"], + [13918, 0, " "], + [13919, 0, "$"], + [13920, 0, "H"], + [13921, 0, "_"], + [13922, 0, "c"], + [13923, 0, "$"], + [13924, 0, " "], + [13925, 0, "w"], + [13926, 0, "e"], + [13927, 0, " "], + [13928, 0, "i"], + [13929, 0, "n"], + [13930, 0, "s"], + [13931, 0, "e"], + [13932, 0, "r"], + [13933, 0, "t"], + [13934, 0, " "], + [13935, 0, "t"], + [13936, 0, "h"], + [13937, 0, "e"], + [13938, 0, " "], + [13939, 0, "o"], + [13940, 0, "p"], + [13941, 0, "e"], + [13942, 0, "r"], + [13943, 0, "a"], + [13944, 0, "t"], + [13945, 0, "i"], + [13946, 0, "o"], + [13947, 0, "n"], + [13948, 0, " "], + [13949, 0, "$"], + [13950, 0, "o"], + [13951, 0, "_"], + [13952, 0, "{"], + [13953, 0, "n"], + [13954, 0, "+"], + [13955, 0, "1"], + [13956, 0, "}"], + [13957, 0, "$"], + [13958, 0, ","], + [13959, 0, " "], + [13960, 0, "t"], + [13961, 0, "h"], + [13962, 0, "e"], + [13963, 0, " "], + [13964, 0, "o"], + [13965, 0, "u"], + [13966, 0, "t"], + [13967, 0, "c"], + [13968, 0, "o"], + [13969, 0, "m"], + [13970, 0, "e"], + [13971, 0, " "], + [13972, 0, "i"], + [13973, 0, "s"], + [13974, 0, " "], + [13975, 0, "t"], + [13976, 0, "h"], + [13977, 0, "e"], + [13978, 0, " "], + [13979, 0, "s"], + [13980, 0, "a"], + [13981, 0, "m"], + [13982, 0, "e"], + [13983, 0, " "], + [13984, 0, "s"], + [13985, 0, "e"], + [13986, 0, "q"], + [13987, 0, "u"], + [13988, 0, "e"], + [13989, 0, "n"], + [13990, 0, "c"], + [13991, 0, "e"], + [13992, 0, " "], + [13993, 0, "o"], + [13994, 0, "f"], + [13995, 0, " "], + [13996, 0, "l"], + [13997, 0, "i"], + [13998, 0, "s"], + [13999, 0, "t"], + [14000, 0, " "], + [14001, 0, "e"], + [14002, 0, "l"], + [14003, 0, "e"], + [14004, 0, "m"], + [14005, 0, "e"], + [14006, 0, "n"], + [14007, 0, "t"], + [14008, 0, "s"], + [14009, 0, "."], + [14010, 0, " "], + [14011, 0, "E"], + [14012, 0, "q"], + [14013, 0, "u"], + [14014, 0, "i"], + [14015, 0, "v"], + [14016, 0, "a"], + [14017, 0, "l"], + [14018, 0, "e"], + [14019, 0, "n"], + [14020, 0, "t"], + [14021, 0, "l"], + [14022, 0, "y"], + [14023, 0, ","], + [14024, 0, " "], + [14025, 0, "w"], + [14026, 0, "e"], + [14027, 0, " "], + [14028, 0, "c"], + [14029, 0, "a"], + [14030, 0, "n"], + [14031, 0, " "], + [14032, 0, "s"], + [14033, 0, "h"], + [14034, 0, "o"], + [14035, 0, "w"], + [14036, 0, " "], + [14036, 1], + [14035, 1], + [14034, 1], + [14033, 1], + [14032, 1], + [14031, 1], + [14030, 1], + [14029, 1], + [14028, 1], + [14027, 1], + [14026, 1], + [14025, 1], + [14024, 1], + [14023, 1], + [14022, 1], + [14021, 1], + [14020, 1], + [14019, 1], + [14018, 1], + [14017, 1], + [14016, 1], + [14015, 1], + [14014, 1], + [14013, 1], + [14012, 1], + [14011, 1], + [14010, 1], + [14009, 1], + [14008, 1], + [14008, 0, "s"], + [14009, 0, " "], + [14010, 0, "$"], + [14011, 0, "["], + [14012, 0, "\\"], + [14013, 0, "m"], + [14014, 0, "a"], + [14015, 0, "t"], + [14016, 0, "h"], + [14017, 0, "i"], + [14018, 0, "t"], + [14019, 0, "{"], + [14020, 0, "i"], + [14021, 0, "d"], + [14022, 0, "_"], + [14023, 0, "1"], + [14024, 0, ","], + [14025, 0, " "], + [14026, 0, "\\"], + [14027, 0, "d"], + [14028, 0, "o"], + [14029, 0, "t"], + [14030, 0, "s"], + [14031, 0, ","], + [14032, 0, " "], + [14022, 0, "}"], + [14034, 0, "\\"], + [14035, 0, "m"], + [14036, 0, "a"], + [14037, 0, "t"], + [14038, 0, "h"], + [14039, 0, "i"], + [14040, 0, "t"], + [14041, 0, "{"], + [14042, 0, "i"], + [14043, 0, "d"], + [14044, 0, "}"], + [14045, 0, ","], + [14046, 0, " "], + [14047, 0, "\\"], + [14048, 0, "d"], + [14049, 0, "o"], + [14050, 0, "t"], + [14051, 0, "s"], + [14052, 0, ","], + [14053, 0, " "], + [14054, 0, "\\"], + [14055, 0, "m"], + [14056, 0, "a"], + [14057, 0, "t"], + [14058, 0, "h"], + [14059, 0, "i"], + [14060, 0, "t"], + [14061, 0, "{"], + [14062, 0, "i"], + [14063, 0, "d"], + [14064, 0, "}"], + [14065, 0, "_"], + [14066, 0, "k"], + [14067, 0, "]"], + [14068, 0, "$"], + [14069, 0, "."], + [14070, 0, " "], + [14070, 1], + [14070, 0, "\n"], + [14071, 0, "\n"], + [14072, 0, "S"], + [14073, 0, "i"], + [14074, 0, "n"], + [14075, 0, "c"], + [14076, 0, "e"], + [14077, 0, " "], + [14078, 0, "i"], + [14079, 0, "n"], + [14079, 1], + [14078, 1], + [14078, 0, "$"], + [14079, 0, "\\"], + [14080, 0, "m"], + [14081, 0, "a"], + [14082, 0, "t"], + [14083, 0, "h"], + [14084, 0, "i"], + [14085, 0, "t"], + [14086, 0, "{"], + [14086, 1], + [14085, 1], + [14084, 1], + [14084, 0, "s"], + [14085, 0, "f"], + [14086, 0, "{"], + [14087, 0, "i"], + [14088, 0, "n"], + [14089, 0, "s"], + [14090, 0, "e"], + [14091, 0, "r"], + [14092, 0, "t"], + [14093, 0, "}"], + [14094, 0, "$"], + [14095, 0, " "], + [14096, 0, "o"], + [14097, 0, "p"], + [14098, 0, "e"], + [14099, 0, "r"], + [14100, 0, "a"], + [14101, 0, "t"], + [14102, 0, "i"], + [14103, 0, "o"], + [14104, 0, "n"], + [14105, 0, "s"], + [14106, 0, " "], + [14107, 0, "o"], + [14108, 0, "n"], + [14109, 0, "l"], + [14110, 0, "y"], + [14111, 0, " "], + [14112, 0, "a"], + [14113, 0, "d"], + [14114, 0, "d"], + [14115, 0, " "], + [14116, 0, "a"], + [14117, 0, " "], + [14118, 0, "n"], + [14119, 0, "e"], + [14120, 0, "w"], + [14121, 0, " "], + [14122, 0, "e"], + [14123, 0, "l"], + [14124, 0, "e"], + [14125, 0, "m"], + [14126, 0, "e"], + [14127, 0, "n"], + [14128, 0, "t"], + [14129, 0, " "], + [14130, 0, "b"], + [14131, 0, "e"], + [14132, 0, "t"], + [14133, 0, "w"], + [14134, 0, "e"], + [14135, 0, "e"], + [14136, 0, "n"], + [14137, 0, " "], + [14138, 0, "t"], + [14139, 0, "w"], + [14140, 0, "o"], + [14141, 0, " "], + [14142, 0, "a"], + [14143, 0, "d"], + [14143, 1], + [14142, 1], + [14142, 0, "e"], + [14143, 0, "x"], + [14144, 0, "i"], + [14145, 0, "s"], + [14146, 0, "t"], + [14147, 0, "i"], + [14148, 0, "n"], + [14149, 0, "g"], + [14150, 0, ","], + [14151, 0, " "], + [14152, 0, "a"], + [14153, 0, "d"], + [14154, 0, "j"], + [14155, 0, "a"], + [14156, 0, "c"], + [14157, 0, "e"], + [14158, 0, "n"], + [14159, 0, "t"], + [14160, 0, " "], + [14161, 0, "e"], + [14162, 0, "l"], + [14163, 0, "e"], + [14164, 0, "m"], + [14165, 0, "e"], + [14166, 0, "n"], + [14167, 0, "t"], + [14168, 0, "s"], + [14169, 0, ","], + [14170, 0, " "], + [14171, 0, "i"], + [14172, 0, "t"], + [14173, 0, " "], + [14174, 0, "i"], + [14175, 0, "s"], + [14176, 0, " "], + [14177, 0, "e"], + [14178, 0, "q"], + [14179, 0, "u"], + [14180, 0, "i"], + [14181, 0, "v"], + [14182, 0, "a"], + [14183, 0, "l"], + [14184, 0, "e"], + [14185, 0, "n"], + [14186, 0, "t"], + [14187, 0, " "], + [14188, 0, "t"], + [14189, 0, "o"], + [14190, 0, " "], + [14191, 0, "s"], + [14192, 0, "h"], + [14193, 0, "o"], + [14194, 0, "w"], + [14195, 0, " "], + [14196, 0, "t"], + [14197, 0, "h"], + [14198, 0, "a"], + [14199, 0, "t"], + [14200, 0, " "], + [14201, 0, "r"], + [14202, 0, "e"], + [14203, 0, "g"], + [14204, 0, "a"], + [14205, 0, "r"], + [14206, 0, "d"], + [14207, 0, "l"], + [14208, 0, "e"], + [14209, 0, "s"], + [14210, 0, "s"], + [14211, 0, " "], + [14212, 0, "w"], + [14213, 0, "h"], + [14214, 0, "e"], + [14215, 0, "r"], + [14216, 0, "e"], + [14217, 0, " "], + [14218, 0, "$"], + [14219, 0, "o"], + [14220, 0, "_"], + [14221, 0, "{"], + [14222, 0, "n"], + [14223, 0, "+"], + [14224, 0, "$"], + [14224, 1], + [14224, 0, "1"], + [14225, 0, "}"], + [14226, 0, "$"], + [14227, 0, " "], + [14228, 0, "i"], + [14229, 0, "s"], + [14230, 0, " "], + [14231, 0, "a"], + [14232, 0, "d"], + [14233, 0, "d"], + [14234, 0, "e"], + [14234, 1], + [14233, 1], + [14232, 1], + [14231, 1], + [14231, 0, "i"], + [14232, 0, "n"], + [14233, 0, "s"], + [14234, 0, "e"], + [14235, 0, "r"], + [14236, 0, "t"], + [14237, 0, "e"], + [14238, 0, "d"], + [14239, 0, " "], + [14240, 0, "t"], + [14241, 0, "o"], + [14242, 0, " "], + [14243, 0, "$"], + [14244, 0, "H"], + [14245, 0, "_"], + [14246, 0, "c"], + [14247, 0, "$"], + [14033, 0, " "], + [14034, 0, "\\"], + [14035, 0, "m"], + [14036, 0, "a"], + [14037, 0, "t"], + [14038, 0, "h"], + [14039, 0, "i"], + [14040, 0, "t"], + [14041, 0, "{"], + [14042, 0, "i"], + [14043, 0, "d"], + [14044, 0, "}"], + [14045, 0, "_"], + [14046, 0, "m"], + [14047, 0, ","], + [14061, 0, " "], + [14062, 0, "\\"], + [14063, 0, "m"], + [14064, 0, "a"], + [14065, 0, "t"], + [14066, 0, "h"], + [14067, 0, "i"], + [14068, 0, "t"], + [14069, 0, "{"], + [14070, 0, "i"], + [14071, 0, "d"], + [14072, 0, "}"], + [14073, 0, "_"], + [14074, 0, "{"], + [14075, 0, "m"], + [14076, 0, "+"], + [14077, 0, "1"], + [14078, 0, "}"], + [14079, 0, ","], + [14282, 0, ","], + [14283, 0, " "], + [14284, 0, "t"], + [14285, 0, "h"], + [14286, 0, "e"], + [14287, 0, " "], + [14288, 0, "s"], + [14289, 0, "e"], + [14290, 0, "t"], + [14291, 0, " "], + [14292, 0, "o"], + [14293, 0, "f"], + [14294, 0, " "], + [14295, 0, "l"], + [14296, 0, "i"], + [14297, 0, "s"], + [14298, 0, "t"], + [14299, 0, " "], + [14300, 0, "e"], + [14301, 0, "l"], + [14302, 0, "e"], + [14303, 0, "m"], + [14304, 0, "e"], + [14305, 0, "n"], + [14306, 0, "t"], + [14307, 0, "s"], + [14308, 0, " "], + [14309, 0, "$"], + [14310, 0, "\\"], + [14311, 0, "m"], + [14312, 0, "a"], + [14313, 0, "t"], + [14314, 0, "h"], + [14315, 0, "i"], + [14316, 0, "t"], + [14317, 0, "{"], + [14318, 0, "i"], + [14319, 0, "d"], + [14320, 0, "}"], + [14321, 0, "_"], + [14322, 0, "1"], + [14310, 0, "{"], + [14310, 0, "\\"], + [14325, 0, ","], + [14326, 0, " "], + [14327, 0, "\\"], + [14328, 0, "d"], + [14329, 0, "o"], + [14330, 0, "t"], + [14331, 0, "s"], + [14332, 0, ","], + [14333, 0, " "], + [14334, 0, "\\"], + [14335, 0, "m"], + [14336, 0, "a"], + [14337, 0, "t"], + [14338, 0, "h"], + [14339, 0, "i"], + [14340, 0, "t"], + [14341, 0, "{"], + [14342, 0, "i"], + [14343, 0, "d"], + [14344, 0, "}"], + [14345, 0, "_"], + [14346, 0, "m"], + [14347, 0, "\\"], + [14348, 0, "}"], + [14349, 0, "$"], + [14350, 0, " "], + [14351, 0, "t"], + [14352, 0, "h"], + [14353, 0, "a"], + [14354, 0, "t"], + [14355, 0, " "], + [14356, 0, "a"], + [14357, 0, "p"], + [14358, 0, "p"], + [14359, 0, "e"], + [14360, 0, "a"], + [14361, 0, "r"], + [14362, 0, " "], + [14363, 0, "\\"], + [14364, 0, "e"], + [14365, 0, "m"], + [14366, 0, "p"], + [14367, 0, "h"], + [14368, 0, "{"], + [14369, 0, "b"], + [14370, 0, "e"], + [14371, 0, "f"], + [14372, 0, "o"], + [14373, 0, "r"], + [14374, 0, "e"], + [14375, 0, "}"], + [14376, 0, " "], + [14377, 0, "$"], + [14377, 1], + [14377, 0, "t"], + [14378, 0, "h"], + [14379, 0, "e"], + [14380, 0, " "], + [14381, 0, "l"], + [14382, 0, "i"], + [14383, 0, "s"], + [14384, 0, "t"], + [14385, 0, " "], + [14386, 0, "e"], + [14387, 0, "l"], + [14388, 0, "e"], + [14389, 0, "m"], + [14390, 0, "e"], + [14391, 0, "n"], + [14392, 0, "t"], + [14393, 0, " "], + [14394, 0, "f"], + [14395, 0, "o"], + [14396, 0, "r"], + [14397, 0, " "], + [14398, 0, "$"], + [14399, 0, "o"], + [14400, 0, "_"], + [14401, 0, "{"], + [14402, 0, "n"], + [14403, 0, "+"], + [14404, 0, "1"], + [14405, 0, "}"], + [14406, 0, "$"], + [14407, 0, " "], + [14408, 0, "i"], + [14409, 0, "s"], + [14410, 0, " "], + [14411, 0, "t"], + [14412, 0, "h"], + [14413, 0, "e"], + [14414, 0, " "], + [14415, 0, "s"], + [14416, 0, "a"], + [14417, 0, "m"], + [14418, 0, "e"], + [14419, 0, "."], + [14420, 0, " "], + [14421, 0, "B"], + [14422, 0, "y"], + [14423, 0, " "], + [14220, 1], + [14219, 1], + [14218, 1], + [14217, 1], + [14216, 1], + [14215, 1], + [14214, 1], + [14213, 1], + [14212, 1], + [14211, 1], + [14211, 0, "s"], + [14212, 0, "u"], + [14213, 0, "f"], + [14214, 0, "f"], + [14215, 0, "i"], + [14216, 0, "c"], + [14217, 0, "i"], + [14218, 0, "e"], + [14219, 0, "n"], + [14220, 0, "t"], + [14423, 1], + [14422, 1], + [14421, 1], + [14420, 1], + [14694, 0, "\n"], + [14695, 0, "\n"], + [14694, 0, " "], + [14695, 0, "F"], + [14696, 0, "u"], + [14697, 0, "r"], + [14698, 0, "t"], + [14699, 0, "h"], + [14700, 0, "e"], + [14701, 0, "r"], + [14702, 0, " "], + [14703, 0, "n"], + [14704, 0, "o"], + [14705, 0, "t"], + [14706, 0, "e"], + [14707, 0, " "], + [14708, 0, "t"], + [14709, 0, "h"], + [14710, 0, "a"], + [14711, 0, "t"], + [14712, 0, " "], + [14713, 0, "b"], + [14714, 0, "y"], + [14715, 0, " "], + [14716, 0, "t"], + [14717, 0, "h"], + [14718, 0, "e"], + [14719, 0, " "], + [14720, 0, "d"], + [14721, 0, "e"], + [14722, 0, "f"], + [14723, 0, "i"], + [14724, 0, "n"], + [14725, 0, "i"], + [14726, 0, "t"], + [14727, 0, "i"], + [14728, 0, "o"], + [14729, 0, "n"], + [14730, 0, " "], + [14731, 0, "o"], + [14732, 0, "f"], + [14733, 0, " "], + [14734, 0, "L"], + [14735, 0, "a"], + [14736, 0, "m"], + [14737, 0, "p"], + [14738, 0, "o"], + [14739, 0, "r"], + [14740, 0, "t"], + [14741, 0, " "], + [14742, 0, "t"], + [14743, 0, "i"], + [14744, 0, "m"], + [14745, 0, "e"], + [14746, 0, "s"], + [14747, 0, "t"], + [14748, 0, "a"], + [14749, 0, "m"], + [14750, 0, "p"], + [14751, 0, "s"], + [14752, 0, ","], + [14753, 0, " "], + [14754, 0, "a"], + [14755, 0, "n"], + [14756, 0, "y"], + [14757, 0, " "], + [14758, 0, "o"], + [14759, 0, "p"], + [14760, 0, "e"], + [14761, 0, "r"], + [14762, 0, "a"], + [14763, 0, "t"], + [14764, 0, "i"], + [14765, 0, "o"], + [14766, 0, "n"], + [14767, 0, " "], + [14768, 0, "t"], + [14769, 0, "h"], + [14770, 0, "a"], + [14771, 0, "t"], + [14772, 0, " "], + [14773, 0, "c"], + [14774, 0, "a"], + [14775, 0, "u"], + [14776, 0, "s"], + [14777, 0, "a"], + [14778, 0, "l"], + [14779, 0, "l"], + [14780, 0, "y"], + [14781, 0, " "], + [14782, 0, "d"], + [14783, 0, "e"], + [14784, 0, "p"], + [14785, 0, "e"], + [14786, 0, "n"], + [14787, 0, "d"], + [14788, 0, "s"], + [14789, 0, " "], + [14790, 0, "o"], + [14791, 0, "n"], + [14792, 0, " "], + [14793, 0, "a"], + [14794, 0, "n"], + [14795, 0, " "], + [14796, 0, "o"], + [14797, 0, "p"], + [14798, 0, "e"], + [14799, 0, "r"], + [14800, 0, "a"], + [14801, 0, "t"], + [14802, 0, "i"], + [14803, 0, "o"], + [14804, 0, "n"], + [14805, 0, " "], + [14806, 0, "$"], + [14807, 0, "O"], + [14807, 1], + [14807, 0, "o"], + [14808, 0, "_"], + [14809, 0, "i"], + [14810, 0, "$"], + [14811, 0, " "], + [14812, 0, "m"], + [14813, 0, "u"], + [14814, 0, "s"], + [14815, 0, "t"], + [14816, 0, " "], + [14817, 0, "h"], + [14818, 0, "a"], + [14819, 0, "v"], + [14820, 0, "e"], + [14821, 0, " "], + [14822, 0, "a"], + [14823, 0, " "], + [14824, 0, "g"], + [14825, 0, "r"], + [14826, 0, "e"], + [14827, 0, "a"], + [14828, 0, "t"], + [14829, 0, "e"], + [14830, 0, "r"], + [14831, 0, " "], + [14832, 0, "I"], + [14833, 0, "D"], + [14834, 0, " "], + [14835, 0, "t"], + [14836, 0, "h"], + [14837, 0, "a"], + [14838, 0, "n"], + [14839, 0, " "], + [14840, 0, "$"], + [14841, 0, "o"], + [14842, 0, "_"], + [14843, 0, "i"], + [14844, 0, "$"], + [14845, 0, "."], + [14990, 1], + [14989, 1], + [14988, 1], + [14987, 1], + [14986, 1], + [14985, 1], + [14984, 1], + [14983, 1], + [14982, 1], + [14981, 1], + [14980, 1], + [14979, 1], + [14978, 1], + [14977, 1], + [14976, 1], + [14975, 1], + [14974, 1], + [14973, 1], + [14972, 1], + [14971, 1], + [14970, 1], + [14969, 1], + [14968, 1], + [14967, 1], + [14966, 1], + [14965, 1], + [14964, 1], + [14963, 1], + [14962, 1], + [14961, 1], + [14960, 1], + [14959, 1], + [14958, 1], + [14957, 1], + [14956, 1], + [14955, 1], + [14954, 1], + [14953, 1], + [14952, 1], + [14951, 1], + [14950, 1], + [14949, 1], + [14948, 1], + [14947, 1], + [14946, 1], + [14945, 1], + [14944, 1], + [14943, 1], + [14942, 1], + [14941, 1], + [14940, 1], + [14939, 1], + [14938, 1], + [14937, 1], + [14936, 1], + [14935, 1], + [14934, 1], + [14933, 1], + [14932, 1], + [14931, 1], + [14930, 1], + [14929, 1], + [14928, 1], + [14927, 1], + [14926, 1], + [14925, 1], + [14924, 1], + [14923, 1], + [14922, 1], + [14921, 1], + [14920, 1], + [14919, 1], + [14918, 1], + [14917, 1], + [14916, 1], + [14915, 1], + [14914, 1], + [14913, 1], + [14912, 1], + [14911, 1], + [14910, 1], + [14909, 1], + [14908, 1], + [14907, 1], + [14906, 1], + [14905, 1], + [14904, 1], + [14903, 1], + [14902, 1], + [14901, 1], + [14900, 1], + [14899, 1], + [14898, 1], + [14897, 1], + [14896, 1], + [14895, 1], + [14894, 1], + [14893, 1], + [14892, 1], + [14891, 1], + [14890, 1], + [14889, 1], + [14888, 1], + [14887, 1], + [14886, 1], + [14885, 1], + [14884, 1], + [14883, 1], + [14882, 1], + [14881, 1], + [14880, 1], + [14879, 1], + [14878, 1], + [14877, 1], + [14876, 1], + [14875, 1], + [14874, 1], + [14873, 1], + [14872, 1], + [14871, 1], + [14870, 1], + [14869, 1], + [14868, 1], + [14867, 1], + [14866, 1], + [14865, 1], + [14864, 1], + [14863, 1], + [14862, 1], + [14861, 1], + [14860, 1], + [14859, 1], + [14858, 1], + [14857, 1], + [14856, 1], + [14855, 1], + [14854, 1], + [14853, 1], + [14852, 1], + [14851, 1], + [14850, 1], + [14849, 1], + [14848, 1], + [14103, 0, ","], + [14104, 0, " "], + [14105, 0, "w"], + [14106, 0, "h"], + [14107, 0, "e"], + [14108, 0, "r"], + [14109, 0, "e"], + [14110, 0, " "], + [14111, 0, "$"], + [14112, 0, "\\"], + [14113, 0, "m"], + [14114, 0, "a"], + [14115, 0, "t"], + [14116, 0, "h"], + [14117, 0, "i"], + [14118, 0, "t"], + [14119, 0, "{"], + [14120, 0, "i"], + [14121, 0, "d"], + [14122, 0, "}"], + [14123, 0, "$"], + [14124, 0, " "], + [14125, 0, "i"], + [14126, 0, "s"], + [14127, 0, " "], + [14128, 0, "t"], + [14129, 0, "h"], + [14130, 0, "e"], + [14131, 0, " "], + [14132, 0, "L"], + [14133, 0, "a"], + [14134, 0, "m"], + [14135, 0, "p"], + [14136, 0, "o"], + [14137, 0, "r"], + [14138, 0, "t"], + [14139, 0, " "], + [14140, 0, "t"], + [14141, 0, "i"], + [14142, 0, "m"], + [14143, 0, "e"], + [14144, 0, "s"], + [14145, 0, "t"], + [14146, 0, "a"], + [14147, 0, "m"], + [14148, 0, "p"], + [14149, 0, " "], + [14150, 0, "o"], + [14151, 0, "f"], + [14152, 0, " "], + [14153, 0, "$"], + [14154, 0, "o"], + [14155, 0, "_"], + [14156, 0, "{"], + [14157, 0, "n"], + [14158, 0, "+"], + [14159, 0, "1"], + [14160, 0, "}"], + [14161, 0, "$"], + [14464, 1], + [14463, 1], + [14462, 1], + [14461, 1], + [14460, 1], + [14459, 1], + [14458, 1], + [14458, 0, "\\"], + [14459, 0, "m"], + [14460, 0, "a"], + [14461, 0, "t"], + [14462, 0, "h"], + [14463, 0, "i"], + [14464, 0, "t"], + [14465, 0, "{"], + [14466, 0, "i"], + [14467, 0, "d"], + [14468, 0, "}"], + [14456, 1], + [14455, 1], + [14454, 1], + [14453, 1], + [14452, 1], + [14451, 1], + [14450, 1], + [14449, 1], + [14448, 1], + [14447, 1], + [14446, 1], + [14445, 1], + [14444, 1], + [14443, 1], + [14442, 1], + [14441, 1], + [14440, 1], + [14439, 1], + [14438, 1], + [14437, 1], + [14436, 1], + [14434, 1], + [14427, 1], + [14426, 1], + [14425, 1], + [14424, 1], + [14423, 1], + [14422, 1], + [14442, 0, " "], + [14443, 0, "i"], + [14444, 0, "n"], + [14445, 0, " "], + [14446, 0, "t"], + [14447, 0, "h"], + [14448, 0, "e"], + [14449, 0, " "], + [14450, 0, "f"], + [14451, 0, "i"], + [14452, 0, "n"], + [14453, 0, "a"], + [14454, 0, "l"], + [14455, 0, " "], + [14456, 0, "o"], + [14457, 0, "r"], + [14458, 0, "d"], + [14459, 0, "e"], + [14460, 0, "r"], + [14474, 0, " "], + [14475, 0, "T"], + [14476, 0, "h"], + [14477, 0, "i"], + [14478, 0, "s"], + [14479, 0, " "], + [14479, 1], + [14478, 1], + [14477, 1], + [14476, 1], + [14475, 1], + [14474, 1], + [14902, 0, "L"], + [14903, 0, "e"], + [14904, 0, "t"], + [14905, 0, " "], + [14906, 0, "$"], + [14907, 0, "o"], + [14908, 0, "_"], + [14909, 0, "i"], + [14910, 0, "$"], + [14907, 1], + [14907, 0, "\\"], + [14908, 0, "m"], + [14909, 0, "a"], + [14910, 0, "t"], + [14911, 0, "h"], + [14912, 0, "i"], + [14913, 0, "t"], + [14914, 0, "{"], + [14915, 0, "i"], + [14916, 0, "d"], + [14917, 0, "}"], + [14920, 0, " "], + [14921, 0, "\\"], + [14922, 0, "i"], + [14923, 0, "n"], + [14924, 0, " "], + [14925, 0, "{"], + [14926, 0, "\\"], + [14927, 0, "m"], + [14928, 0, "a"], + [14929, 0, "t"], + [14930, 0, "h"], + [14931, 0, "i"], + [14932, 0, "t"], + [14933, 0, "{"], + [14934, 0, "i"], + [14935, 0, "d"], + [14936, 0, "_"], + [14937, 0, "1"], + [14938, 0, ","], + [14939, 0, " "], + [14936, 0, "}"], + [14941, 0, "\\"], + [14942, 0, "d"], + [14943, 0, "o"], + [14944, 0, "t"], + [14945, 0, "s"], + [14946, 0, ","], + [14947, 0, " "], + [14948, 0, "\\"], + [14949, 0, "m"], + [14950, 0, "a"], + [14951, 0, "t"], + [14952, 0, "h"], + [14953, 0, "i"], + [14954, 0, "t"], + [14955, 0, "{"], + [14956, 0, "i"], + [14957, 0, "d"], + [14958, 0, "}"], + [14959, 0, "_"], + [14960, 0, "m"], + [14961, 0, "}"], + [14961, 0, "\\"], + [14925, 0, "\\"], + [14965, 0, " "], + [14966, 0, "b"], + [14967, 0, "e"], + [14968, 0, " "], + [14969, 0, "t"], + [14970, 0, "h"], + [14971, 0, "e"], + [14972, 0, " "], + [14973, 0, "I"], + [14974, 0, "D"], + [14975, 0, " "], + [14976, 0, "o"], + [14977, 0, "f"], + [14978, 0, " "], + [14979, 0, "a"], + [14980, 0, "n"], + [14981, 0, "y"], + [14982, 0, " "], + [14983, 0, "l"], + [14984, 0, "i"], + [14985, 0, "s"], + [14986, 0, "t"], + [14987, 0, " "], + [14988, 0, "e"], + [14989, 0, "l"], + [14990, 0, "e"], + [14991, 0, "m"], + [14992, 0, "e"], + [14993, 0, "n"], + [14994, 0, "t"], + [14995, 0, " "], + [14996, 0, "t"], + [14997, 0, "h"], + [14998, 0, "a"], + [14999, 0, "t"], + [15000, 0, " "], + [15001, 0, "a"], + [15002, 0, "p"], + [15003, 0, "p"], + [15004, 0, "e"], + [15005, 0, "a"], + [15006, 0, "r"], + [15007, 0, "s"], + [15008, 0, " "], + [15009, 0, "b"], + [15010, 0, "e"], + [15011, 0, "f"], + [15012, 0, "o"], + [15013, 0, "r"], + [15014, 0, "e"], + [15015, 0, " "], + [15016, 0, "$"], + [15017, 0, "o"], + [15018, 0, "_"], + [15019, 0, "{"], + [15020, 0, "n"], + [15021, 0, "+"], + [15022, 0, "1"], + [15023, 0, "}"], + [15024, 0, "$"], + [15025, 0, " "], + [15026, 0, "i"], + [15027, 0, "n"], + [15028, 0, " "], + [15029, 0, "t"], + [15030, 0, "h"], + [15031, 0, "e"], + [15032, 0, " "], + [15033, 0, "f"], + [15034, 0, "i"], + [15035, 0, "n"], + [15036, 0, "a"], + [15037, 0, "l"], + [15038, 0, " "], + [15039, 0, "o"], + [15040, 0, "r"], + [15041, 0, "d"], + [15042, 0, "e"], + [15043, 0, "r"], + [15044, 0, "."], + [15045, 0, " "], + [15046, 0, "T"], + [15047, 0, "h"], + [15048, 0, "e"], + [15049, 0, " "], + [15050, 0, "o"], + [15051, 0, "p"], + [15052, 0, "e"], + [15053, 0, "r"], + [15054, 0, "a"], + [15055, 0, "t"], + [15056, 0, "i"], + [15057, 0, "o"], + [15058, 0, "n"], + [15059, 0, " "], + [15060, 0, "$"], + [15061, 0, "O"], + [15061, 1], + [15061, 0, "o"], + [15062, 0, "_"], + [15063, 0, "i"], + [15064, 0, "#"], + [15065, 0, "$"], + [15065, 1], + [15064, 1], + [15064, 0, "$"], + [15065, 0, " "], + [15066, 0, "t"], + [15067, 0, "h"], + [15068, 0, "a"], + [15069, 0, "t"], + [15070, 0, " "], + [15071, 0, "i"], + [15072, 0, "n"], + [15073, 0, "s"], + [15074, 0, "e"], + [15075, 0, "r"], + [15076, 0, "t"], + [15077, 0, "s"], + [15078, 0, " "], + [15079, 0, "$"], + [15080, 0, "\\"], + [15081, 0, "m"], + [15082, 0, "a"], + [15083, 0, "t"], + [15084, 0, "h"], + [15085, 0, "i"], + [15086, 0, "t"], + [15087, 0, "{"], + [15088, 0, "i"], + [15089, 0, "d"], + [15090, 0, "}"], + [15091, 0, "_"], + [15092, 0, "i"], + [15093, 0, "$"], + [15094, 0, " "], + [15095, 0, "o"], + [15096, 0, "c"], + [15097, 0, "c"], + [15098, 0, "u"], + [15099, 0, "r"], + [15100, 0, "s"], + [15101, 0, " "], + [15102, 0, "e"], + [15103, 0, "i"], + [15104, 0, "t"], + [15105, 0, "h"], + [15106, 0, "e"], + [15107, 0, "r"], + [15108, 0, " "], + [15109, 0, "b"], + [15110, 0, "e"], + [15111, 0, "f"], + [15112, 0, "o"], + [15113, 0, "r"], + [15114, 0, "e"], + [15115, 0, " "], + [15116, 0, "o"], + [15117, 0, "r"], + [15118, 0, " "], + [15119, 0, "a"], + [15120, 0, "f"], + [15121, 0, "t"], + [15122, 0, "e"], + [15123, 0, "r"], + [15124, 0, " "], + [15125, 0, "$"], + [15126, 0, "o"], + [15127, 0, "_"], + [15128, 0, "{"], + [15129, 0, "n"], + [15130, 0, "+"], + [15131, 0, "1"], + [15132, 0, "}"], + [15133, 0, "$"], + [15134, 0, " "], + [15135, 0, "i"], + [15136, 0, "n"], + [15137, 0, " "], + [15138, 0, "$"], + [15139, 0, "H"], + [15140, 0, "_"], + [15141, 0, "c"], + [15142, 0, "$"], + [15143, 0, "."], + [15144, 0, " "], + [15100, 1], + [15099, 1], + [15098, 1], + [15097, 1], + [15096, 1], + [15095, 1], + [15095, 0, "i"], + [15096, 0, "s"], + [15097, 0, " "], + [15098, 0, "a"], + [15099, 0, "p"], + [15100, 0, "p"], + [15101, 0, "l"], + [15102, 0, "i"], + [15103, 0, "e"], + [15104, 0, "d"], + [15149, 0, "I"], + [15150, 0, "f"], + [15151, 0, " "], + [15152, 0, "$"], + [15153, 0, "o"], + [15154, 0, "_"], + [15155, 0, "i"], + [15156, 0, "$"], + [15157, 0, " "], + [15158, 0, "i"], + [15159, 0, "s"], + [15160, 0, " "], + [15161, 0, "a"], + [15162, 0, "p"], + [15163, 0, "p"], + [15164, 0, "l"], + [15165, 0, "i"], + [15166, 0, "e"], + [15167, 0, "d"], + [15168, 0, " "], + [15169, 0, "b"], + [15170, 0, "e"], + [15171, 0, "f"], + [15172, 0, "o"], + [15173, 0, "r"], + [15174, 0, "e"], + [15175, 0, " "], + [15176, 0, "$"], + [15177, 0, "o"], + [15178, 0, "_"], + [15179, 0, "{"], + [15180, 0, "n"], + [15181, 0, "+"], + [15182, 0, "1"], + [15183, 0, "}"], + [15184, 0, "$"], + [15185, 0, ","], + [15186, 0, " "], + [15187, 0, "t"], + [15188, 0, "h"], + [15189, 0, "a"], + [15190, 0, "t"], + [15191, 0, " "], + [15192, 0, "i"], + [15193, 0, "m"], + [15194, 0, "p"], + [15195, 0, "l"], + [15196, 0, "i"], + [15197, 0, "e"], + [15198, 0, "s"], + [15199, 0, " "], + [15200, 0, "$"], + [15201, 0, "\\"], + [15202, 0, "m"], + [15203, 0, "a"], + [15204, 0, "t"], + [15205, 0, "h"], + [15206, 0, "i"], + [15207, 0, "t"], + [15208, 0, "{"], + [15209, 0, "i"], + [15210, 0, "d"], + [15211, 0, "}"], + [15212, 0, "_"], + [15213, 0, "i"], + [15214, 0, " "], + [15214, 1], + [15214, 0, "$"], + [15215, 0, "."], + [15201, 0, "\\"], + [15202, 0, "m"], + [15203, 0, "a"], + [15204, 0, "t"], + [15205, 0, "h"], + [15206, 0, "i"], + [15207, 0, "t"], + [15208, 0, "{"], + [15209, 0, "i"], + [15210, 0, "d"], + [15211, 0, "}"], + [15212, 0, " "], + [15213, 0, "<"], + [15214, 0, " "], + [14900, 0, "\n"], + [14901, 0, "\n"], + [14902, 0, "L"], + [14903, 0, "e"], + [14904, 0, "t"], + [14905, 0, " "], + [14906, 0, "$"], + [14907, 0, "O"], + [14908, 0, "_"], + [14909, 0, "{"], + [14909, 1], + [14909, 0, "\\"], + [14910, 0, "m"], + [14911, 0, "a"], + [14912, 0, "t"], + [14913, 0, "h"], + [14914, 0, "i"], + [14915, 0, "t"], + [14916, 0, "{"], + [14917, 0, "l"], + [14918, 0, "e"], + [14919, 0, "f"], + [14920, 0, "t"], + [14921, 0, "}"], + [14922, 0, " "], + [14923, 0, "="], + [14924, 0, " "], + [14907, 1], + [14907, 0, "T"], + [14925, 0, "\\"], + [14926, 0, "{"], + [14927, 0, "\\"], + [14928, 0, "m"], + [14929, 0, "a"], + [14930, 0, "t"], + [14931, 0, "h"], + [14932, 0, "i"], + [14933, 0, "t"], + [14934, 0, "{"], + [14935, 0, "i"], + [14936, 0, "d"], + [14937, 0, "}"], + [14938, 0, "_"], + [14939, 0, "i"], + [14940, 0, " "], + [14941, 0, "\\"], + [14942, 0, "m"], + [14943, 0, "i"], + [14944, 0, "d"], + [14945, 0, " "], + [14946, 0, "\\"], + [14947, 0, "m"], + [14948, 0, "a"], + [14949, 0, "t"], + [14950, 0, "h"], + [14951, 0, "s"], + [14952, 0, "f"], + [14953, 0, "{"], + [14954, 0, "i"], + [14955, 0, "n"], + [14956, 0, "s"], + [14957, 0, "e"], + [14958, 0, "r"], + [14959, 0, "t"], + [14960, 0, "}"], + [14961, 0, "("], + [14962, 0, "\\"], + [14963, 0, "m"], + [14964, 0, "a"], + [14965, 0, "t"], + [14966, 0, "h"], + [14967, 0, "i"], + [14968, 0, "d"], + [14969, 0, "{"], + [14969, 1], + [14968, 1], + [14968, 0, "t"], + [14969, 0, "{"], + [14970, 0, "i"], + [14971, 0, "d"], + [14972, 0, "}"], + [14973, 0, "_"], + [14974, 0, "i"], + [14975, 0, ","], + [14976, 0, " "], + [14977, 0, "\\"], + [14978, 0, "m"], + [14979, 0, "a"], + [14980, 0, "t"], + [14981, 0, "h"], + [14982, 0, "i"], + [14983, 0, "t"], + [14984, 0, "{"], + [14985, 0, "p"], + [14986, 0, "r"], + [14987, 0, "e"], + [14988, 0, "v"], + [14989, 0, "}"], + [14990, 0, ","], + [14991, 0, " "], + [14992, 0, "\\"], + [14993, 0, "p"], + [14994, 0, "l"], + [14995, 0, "a"], + [14996, 0, "c"], + [14997, 0, "e"], + [14998, 0, "h"], + [14999, 0, "o"], + [15000, 0, "l"], + [15001, 0, "d"], + [15002, 0, "e"], + [15003, 0, "r"], + [15004, 0, ")"], + [15005, 0, " "], + [15006, 0, "\\"], + [15007, 0, "i"], + [15008, 0, "n"], + [15009, 0, " "], + [15010, 0, "H"], + [15011, 0, "_"], + [15012, 0, "c"], + [15013, 0, "\\"], + [15014, 0, "}"], + [15015, 0, "$"], + [15016, 0, " "], + [15017, 0, "b"], + [15018, 0, "e"], + [15019, 0, " "], + [15020, 0, "t"], + [15021, 0, "h"], + [15022, 0, "e"], + [15023, 0, " "], + [15024, 0, "I"], + [15025, 0, "D"], + [15026, 0, "s"], + [15027, 0, " "], + [15028, 0, "o"], + [15029, 0, "f"], + [15030, 0, " "], + [15031, 0, "a"], + [15032, 0, "l"], + [15033, 0, "l"], + [15034, 0, " "], + [15035, 0, "o"], + [15036, 0, "p"], + [15037, 0, "e"], + [15038, 0, "r"], + [15039, 0, "a"], + [15040, 0, "t"], + [15041, 0, "i"], + [15042, 0, "o"], + [15043, 0, "n"], + [15044, 0, "s"], + [15045, 0, " "], + [15046, 0, "i"], + [15047, 0, "n"], + [15048, 0, " "], + [15049, 0, "$"], + [15050, 0, "H"], + [15051, 0, "_"], + [15052, 0, "c"], + [15053, 0, "$"], + [15054, 0, " "], + [15055, 0, "t"], + [15056, 0, "h"], + [15057, 0, "a"], + [15058, 0, "t"], + [15059, 0, " "], + [15060, 0, "u"], + [15061, 0, "s"], + [15062, 0, "e"], + [15063, 0, " "], + [15064, 0, "$"], + [15065, 0, "\\"], + [15066, 0, "m"], + [15067, 0, "a"], + [15068, 0, "t"], + [15069, 0, "h"], + [15070, 0, "i"], + [15071, 0, "t"], + [15072, 0, "{"], + [15073, 0, "p"], + [15074, 0, "r"], + [15075, 0, "e"], + [15076, 0, "v"], + [15077, 0, "}"], + [15078, 0, "$"], + [15079, 0, " "], + [15080, 0, "a"], + [15081, 0, "s"], + [15082, 0, " "], + [15083, 0, "t"], + [15084, 0, "h"], + [15085, 0, "e"], + [15086, 0, "i"], + [15087, 0, "r"], + [15088, 0, " "], + [15089, 0, "r"], + [15090, 0, "e"], + [15091, 0, "f"], + [15092, 0, "e"], + [15093, 0, "r"], + [15094, 0, "e"], + [15095, 0, "n"], + [15096, 0, "c"], + [15097, 0, "e"], + [15098, 0, " "], + [15099, 0, "p"], + [15100, 0, "o"], + [15101, 0, "s"], + [15102, 0, "i"], + [15103, 0, "t"], + [15104, 0, "i"], + [15105, 0, "o"], + [15106, 0, "n"], + [15107, 0, "."], + [15015, 0, " "], + [15016, 0, "\\"], + [15017, 0, "c"], + [15018, 0, "u"], + [15019, 0, " "], + [15020, 0, "p"], + [15020, 1], + [15019, 1], + [15019, 0, "p"], + [15020, 0, " "], + [15021, 0, "\\"], + [15022, 0, "m"], + [15023, 0, "a"], + [15024, 0, "t"], + [15025, 0, "h"], + [15026, 0, "i"], + [15027, 0, "t"], + [15021, 0, "\\"], + [15022, 0, "{"], + [15030, 0, "{"], + [15031, 0, "i"], + [15032, 0, "d"], + [15033, 0, "}"], + [15034, 0, "\\"], + [15035, 0, "}"], + [15075, 0, " "], + [15076, 0, "a"], + [15077, 0, "n"], + [15078, 0, "d"], + [15079, 0, " "], + [15080, 0, "$"], + [15080, 1], + [15079, 1], + [15078, 1], + [15077, 1], + [15076, 1], + [15075, 1], + [15035, 1], + [15034, 1], + [15033, 1], + [15032, 1], + [15031, 1], + [15030, 1], + [15029, 1], + [15028, 1], + [15027, 1], + [15026, 1], + [15025, 1], + [15024, 1], + [15023, 1], + [15022, 1], + [15021, 1], + [15020, 1], + [15019, 1], + [15018, 1], + [15017, 1], + [15016, 1], + [15015, 1], + [14905, 0, " "], + [14906, 0, "t"], + [14907, 0, "h"], + [14908, 0, "e"], + [14909, 0, " "], + [14910, 0, "s"], + [14911, 0, "e"], + [14912, 0, "t"], + [15026, 1], + [15025, 1], + [15025, 0, "c"], + [15026, 0, "o"], + [15027, 0, "n"], + [15028, 0, "t"], + [15029, 0, "a"], + [15030, 0, "i"], + [15031, 0, "n"], + [15121, 0, " "], + [15122, 0, "A"], + [15123, 0, "n"], + [15124, 0, "y"], + [15125, 0, " "], + [15126, 0, "h"], + [15127, 0, "i"], + [15128, 0, "s"], + [15129, 0, "t"], + [15130, 0, "o"], + [15131, 0, "r"], + [15132, 0, "y"], + [15133, 0, " "], + [15134, 0, "c"], + [15135, 0, "o"], + [15136, 0, "n"], + [15137, 0, "t"], + [15138, 0, "a"], + [15139, 0, "i"], + [15140, 0, "n"], + [15141, 0, "i"], + [15142, 0, "n"], + [15143, 0, "g"], + [15144, 0, " "], + [15145, 0, "t"], + [15146, 0, "h"], + [15147, 0, "e"], + [15148, 0, "s"], + [15149, 0, "e"], + [15150, 0, " "], + [15151, 0, "o"], + [15152, 0, "p"], + [15153, 0, "e"], + [15154, 0, "r"], + [15155, 0, "a"], + [15156, 0, "t"], + [15157, 0, "i"], + [15158, 0, "o"], + [15159, 0, "n"], + [15160, 0, "s"], + [15145, 0, "o"], + [15146, 0, "n"], + [15147, 0, "l"], + [15148, 0, "y"], + [15149, 0, " "], + [15143, 1], + [15142, 1], + [15141, 1], + [15140, 1], + [15139, 1], + [15138, 1], + [15137, 1], + [15137, 0, "s"], + [15138, 0, "i"], + [15139, 0, "s"], + [15140, 0, "t"], + [15141, 0, "i"], + [15142, 0, "n"], + [15143, 0, "g"], + [15149, 0, " "], + [15150, 0, "o"], + [15151, 0, "f"], + [15169, 0, " "], + [15169, 1], + [15169, 0, ","], + [15170, 0, " "], + [15171, 0, "i"], + [15172, 0, "n"], + [15173, 0, " "], + [15174, 0, "a"], + [15175, 0, "n"], + [15176, 0, "y"], + [15177, 0, " "], + [15178, 0, "o"], + [15179, 0, "r"], + [15180, 0, "d"], + [15181, 0, "e"], + [15182, 0, "r"], + [15183, 0, ","], + [15184, 0, " "], + [15185, 0, "r"], + [15186, 0, "e"], + [15187, 0, "s"], + [15188, 0, "u"], + [15189, 0, "l"], + [15190, 0, "t"], + [15191, 0, "s"], + [15192, 0, " "], + [15193, 0, "i"], + [15194, 0, "n"], + [15195, 0, " "], + [15196, 0, "t"], + [15197, 0, "h"], + [15198, 0, "e"], + [15199, 0, " "], + [15200, 0, "s"], + [15201, 0, "a"], + [15202, 0, "m"], + [15203, 0, "e"], + [15204, 0, " "], + [15205, 0, "f"], + [15206, 0, "i"], + [15207, 0, "n"], + [15208, 0, "a"], + [15209, 0, "l"], + [15210, 0, " "], + [15211, 0, "l"], + [15212, 0, "i"], + [15213, 0, "s"], + [15214, 0, "t"], + [15215, 0, " "], + [15216, 0, "o"], + [15217, 0, "r"], + [15218, 0, "d"], + [15219, 0, "e"], + [15220, 0, "r"], + [15221, 0, ","], + [15222, 0, " "], + [15223, 0, "n"], + [15224, 0, "a"], + [15225, 0, "m"], + [15226, 0, "e"], + [15227, 0, "l"], + [15228, 0, "y"], + [15229, 0, " "], + [15230, 0, "i"], + [15231, 0, "n"], + [15232, 0, " "], + [15233, 0, "o"], + [15234, 0, "r"], + [15235, 0, "d"], + [15236, 0, "e"], + [15237, 0, "r"], + [15238, 0, " "], + [15239, 0, "o"], + [15240, 0, "f"], + [15241, 0, " "], + [15242, 0, "d"], + [15243, 0, "e"], + [15244, 0, "s"], + [15245, 0, "c"], + [15246, 0, "e"], + [15247, 0, "n"], + [15248, 0, "d"], + [15249, 0, "i"], + [15250, 0, "n"], + [15251, 0, "g"], + [15252, 0, " "], + [15253, 0, "L"], + [15254, 0, "a"], + [15255, 0, "m"], + [15256, 0, "p"], + [15257, 0, "o"], + [15258, 0, "r"], + [15259, 0, "t"], + [15260, 0, " "], + [15261, 0, "t"], + [15262, 0, "i"], + [15263, 0, "m"], + [15264, 0, "e"], + [15265, 0, "s"], + [15266, 0, "t"], + [15267, 0, "a"], + [15268, 0, "m"], + [15269, 0, "p"], + [15270, 0, "."], + [15271, 0, " "], + [15272, 0, "S"], + [15273, 0, "i"], + [15274, 0, "n"], + [15275, 0, "c"], + [15276, 0, "e"], + [15277, 0, " "], + [15278, 0, "L"], + [15279, 0, "a"], + [15280, 0, "m"], + [15281, 0, "p"], + [15282, 0, "o"], + [15283, 0, "r"], + [15284, 0, "t"], + [15285, 0, " "], + [15286, 0, "t"], + [15287, 0, "i"], + [15288, 0, "m"], + [15289, 0, "e"], + [15290, 0, "s"], + [15291, 0, "t"], + [15292, 0, "a"], + [15293, 0, "m"], + [15294, 0, "p"], + [15295, 0, "s"], + [15296, 0, " "], + [15297, 0, "a"], + [15298, 0, "r"], + [15299, 0, "e"], + [15300, 0, " "], + [15301, 0, "t"], + [15302, 0, "o"], + [15303, 0, "t"], + [15304, 0, "a"], + [15305, 0, "l"], + [15306, 0, "l"], + [15307, 0, "y"], + [15308, 0, " "], + [15309, 0, "o"], + [15310, 0, "r"], + [15311, 0, "d"], + [15312, 0, "e"], + [15313, 0, "r"], + [15314, 0, "e"], + [15315, 0, "d"], + [15316, 0, ","], + [15317, 0, " "], + [15318, 0, "t"], + [15319, 0, "h"], + [15320, 0, "i"], + [15321, 0, "s"], + [15322, 0, " "], + [15323, 0, "l"], + [15324, 0, "i"], + [15325, 0, "s"], + [15326, 0, "t"], + [15327, 0, " "], + [15328, 0, "o"], + [15329, 0, "r"], + [15330, 0, "d"], + [15331, 0, "e"], + [15332, 0, "r"], + [15333, 0, " "], + [15334, 0, "i"], + [15335, 0, "s"], + [15336, 0, " "], + [15337, 0, "d"], + [15338, 0, "e"], + [15339, 0, "t"], + [15340, 0, "e"], + [15341, 0, "r"], + [15342, 0, "m"], + [15343, 0, "i"], + [15344, 0, "n"], + [15345, 0, "i"], + [15346, 0, "s"], + [15347, 0, "t"], + [15348, 0, "i"], + [15349, 0, "c"], + [15350, 0, " "], + [15351, 0, "a"], + [15352, 0, "n"], + [15353, 0, "d"], + [15354, 0, " "], + [15355, 0, "u"], + [15356, 0, "n"], + [15357, 0, "q"], + [15358, 0, "i"], + [15358, 1], + [15357, 1], + [15357, 0, "i"], + [15358, 0, "q"], + [15359, 0, "u"], + [15360, 0, "e"], + [15361, 0, "."], + [15362, 0, "\n"], + [15363, 0, "\n"], + [15364, 0, "W"], + [15365, 0, "h"], + [15366, 0, "e"], + [15367, 0, "n"], + [15368, 0, " "], + [15369, 0, "o"], + [15370, 0, "p"], + [15371, 0, "e"], + [15372, 0, "r"], + [15373, 0, "a"], + [15374, 0, "t"], + [15375, 0, "i"], + [15376, 0, "o"], + [15377, 0, "n"], + [15378, 0, "s"], + [15379, 0, " "], + [15380, 0, "a"], + [15381, 0, "r"], + [15382, 0, "e"], + [15383, 0, " "], + [15384, 0, "a"], + [15385, 0, "d"], + [15386, 0, "d"], + [15387, 0, "e"], + [15388, 0, "d"], + [15270, 0, " "], + [15271, 0, "("], + [15272, 0, "T"], + [15273, 0, "O"], + [15274, 0, "D"], + [15275, 0, "O"], + [15276, 0, " "], + [15277, 0, "p"], + [15278, 0, "r"], + [15279, 0, "o"], + [15280, 0, "v"], + [15281, 0, "e"], + [15282, 0, " "], + [15283, 0, "t"], + [15284, 0, "h"], + [15285, 0, "i"], + [15286, 0, "s"], + [15287, 0, " "], + [15288, 0, "i"], + [15289, 0, "n"], + [15290, 0, " "], + [15291, 0, "a"], + [15292, 0, " "], + [15293, 0, "l"], + [15294, 0, "e"], + [15295, 0, "m"], + [15296, 0, "m"], + [15297, 0, "a"], + [15298, 0, ")"], + [15298, 0, ","], + [15299, 0, " "], + [15300, 0, "i"], + [15301, 0, "t"], + [15302, 0, " "], + [15303, 0, "m"], + [15304, 0, "i"], + [15305, 0, "g"], + [15306, 0, "h"], + [15307, 0, "t"], + [15308, 0, " "], + [15309, 0, "n"], + [15310, 0, "o"], + [15311, 0, "t"], + [15312, 0, " "], + [15313, 0, "b"], + [15314, 0, "e"], + [15315, 0, " "], + [15316, 0, "o"], + [15317, 0, "b"], + [15318, 0, "v"], + [15319, 0, "i"], + [15320, 0, "o"], + [15321, 0, "u"], + [15322, 0, "s"], + [15433, 0, " "], + [15421, 1], + [15420, 1], + [15419, 1], + [15418, 1], + [15418, 0, "A"], + [15419, 0, "n"], + [15420, 0, "y"], + [15433, 0, "i"], + [15434, 0, "n"], + [15435, 0, " "], + [15436, 0, "$"], + [15437, 0, "H"], + [15438, 0, "_"], + [15439, 0, "c"], + [15440, 0, "$"], + [15441, 0, " "], + [15416, 0, " "], + [15417, 0, "$"], + [15418, 0, "\\"], + [15419, 0, "m"], + [15420, 0, "a"], + [15421, 0, "t"], + [15422, 0, "h"], + [15423, 0, "i"], + [15424, 0, "t"], + [15425, 0, "{"], + [15426, 0, "i"], + [15427, 0, "d"], + [15428, 0, "}"], + [15429, 0, "$"], + [15430, 0, " "], + [15431, 0, "h"], + [15432, 0, "a"], + [15433, 0, "s"], + [15434, 0, " "], + [15435, 0, "a"], + [15436, 0, " "], + [15437, 0, "d"], + [15438, 0, "e"], + [15439, 0, "t"], + [15440, 0, "e"], + [15441, 0, "r"], + [15442, 0, "m"], + [15443, 0, "i"], + [15444, 0, "n"], + [15445, 0, "i"], + [15446, 0, "s"], + [15447, 0, "t"], + [15448, 0, "i"], + [15449, 0, "c"], + [15450, 0, " "], + [15451, 0, "p"], + [15452, 0, "o"], + [15453, 0, "s"], + [15454, 0, "i"], + [15455, 0, "t"], + [15456, 0, "i"], + [15457, 0, "o"], + [15458, 0, "n"], + [15459, 0, " "], + [15460, 0, "w"], + [15461, 0, "i"], + [15462, 0, "t"], + [15463, 0, "h"], + [15464, 0, "i"], + [15465, 0, "n"], + [15466, 0, " "], + [15467, 0, "t"], + [15468, 0, "h"], + [15469, 0, "i"], + [15470, 0, "s"], + [15471, 0, " "], + [15472, 0, "o"], + [15473, 0, "r"], + [15474, 0, "d"], + [15475, 0, "e"], + [15476, 0, "r"], + [15477, 0, "."], + [15513, 1], + [15512, 1], + [15511, 1], + [15510, 1], + [15509, 1], + [15508, 1], + [15507, 1], + [15506, 1], + [15505, 1], + [15504, 1], + [15504, 0, "t"], + [15505, 0, "h"], + [15506, 0, "a"], + [15507, 0, "t"], + [15508, 0, " "], + [15509, 0, "u"], + [15510, 0, "s"], + [15511, 0, "e"], + [15512, 0, " "], + [15513, 0, "a"], + [15514, 0, " "], + [15515, 0, "d"], + [15516, 0, "i"], + [15517, 0, "f"], + [15518, 0, "f"], + [15519, 0, "e"], + [15520, 0, "r"], + [15521, 0, "e"], + [15522, 0, "n"], + [15523, 0, "t"], + [15524, 0, " "], + [15525, 0, "l"], + [15526, 0, "i"], + [15527, 0, "s"], + [15528, 0, "t"], + [15529, 0, " "], + [15530, 0, "e"], + [15531, 0, "l"], + [15532, 0, "e"], + [15533, 0, "m"], + [15534, 0, "e"], + [15535, 0, "n"], + [15536, 0, "t"], + [15537, 0, " "], + [15538, 0, "("], + [15539, 0, "n"], + [15540, 0, "o"], + [15541, 0, "t"], + [15542, 0, " "], + [15543, 0, "$"], + [15544, 0, "\\"], + [15545, 0, "m"], + [15546, 0, "a"], + [15547, 0, "t"], + [15548, 0, "h"], + [15549, 0, "i"], + [15550, 0, "t"], + [15551, 0, "{"], + [15552, 0, "p"], + [15553, 0, "r"], + [15554, 0, "e"], + [15555, 0, "v"], + [15556, 0, "}"], + [15557, 0, "$"], + [15558, 0, " "], + [15558, 1], + [15558, 0, ")"], + [15559, 0, " "], + [15560, 0, "a"], + [15561, 0, "s"], + [15562, 0, " "], + [15563, 0, "t"], + [15564, 0, "h"], + [15565, 0, "e"], + [15566, 0, "i"], + [15567, 0, "r"], + [15568, 0, " "], + [15569, 0, "r"], + [15570, 0, "e"], + [15571, 0, "f"], + [15572, 0, "e"], + [15573, 0, "r"], + [15574, 0, "e"], + [15575, 0, "n"], + [15576, 0, "c"], + [15577, 0, "e"], + [15578, 0, " "], + [15579, 0, "p"], + [15580, 0, "o"], + [15581, 0, "s"], + [15582, 0, "i"], + [15583, 0, "t"], + [15584, 0, "i"], + [15585, 0, "o"], + [15586, 0, "n"], + [15587, 0, " "], + [15588, 0, "a"], + [15589, 0, "p"], + [15590, 0, "p"], + [15591, 0, "e"], + [15592, 0, "a"], + [15593, 0, "r"], + [15594, 0, " "], + [15595, 0, "a"], + [15595, 1], + [15595, 0, "a"], + [15596, 0, "t"], + [15597, 0, " "], + [15598, 0, "s"], + [15599, 0, "o"], + [15600, 0, "m"], + [15601, 0, "e"], + [15602, 0, " "], + [15603, 0, "p"], + [15604, 0, "o"], + [15605, 0, "s"], + [15606, 0, "i"], + [15607, 0, "t"], + [15608, 0, "i"], + [15609, 0, "o"], + [15610, 0, "n"], + [15611, 0, " "], + [15612, 0, "a"], + [15613, 0, "f"], + [15614, 0, "t"], + [15615, 0, "e"], + [15616, 0, "r"], + [15617, 0, " "], + [15618, 0, "t"], + [15619, 0, "h"], + [15620, 0, "e"], + [15621, 0, "i"], + [15622, 0, "r"], + [15623, 0, " "], + [15624, 0, "r"], + [15625, 0, "e"], + [15626, 0, "f"], + [15627, 0, "e"], + [15628, 0, "r"], + [15629, 0, "e"], + [15630, 0, "n"], + [15631, 0, "c"], + [15632, 0, "e"], + [15633, 0, " "], + [15634, 0, "e"], + [15635, 0, "l"], + [15636, 0, "e"], + [15637, 0, "m"], + [15638, 0, "e"], + [15639, 0, "n"], + [15640, 0, "t"], + [15641, 0, " "], + [15642, 0, "i"], + [15643, 0, "n"], + [15644, 0, " "], + [15645, 0, "t"], + [15646, 0, "h"], + [15647, 0, "e"], + [15648, 0, " "], + [15649, 0, "f"], + [15650, 0, "i"], + [15651, 0, "n"], + [15652, 0, "a"], + [15653, 0, "l"], + [15654, 0, " "], + [15655, 0, "l"], + [15656, 0, "i"], + [15657, 0, "s"], + [15658, 0, "t"], + [15659, 0, " "], + [15660, 0, "o"], + [15661, 0, "r"], + [15662, 0, "d"], + [15663, 0, "e"], + [15664, 0, "r"], + [15665, 0, ","], + [15666, 0, " "], + [15667, 0, "a"], + [15668, 0, "n"], + [15669, 0, "d"], + [15670, 0, " "], + [15671, 0, "h"], + [15672, 0, "a"], + [15673, 0, "v"], + [15674, 0, "e"], + [15675, 0, " "], + [15676, 0, "a"], + [15677, 0, " "], + [15678, 0, "L"], + [15679, 0, "a"], + [15680, 0, "m"], + [15681, 0, "p"], + [15682, 0, "o"], + [15683, 0, "r"], + [15684, 0, "t"], + [15685, 0, " "], + [15686, 0, "t"], + [15687, 0, "i"], + [15688, 0, "m"], + [15689, 0, "e"], + [15690, 0, "s"], + [15691, 0, "t"], + [15692, 0, "a"], + [15693, 0, "m"], + [15694, 0, "p"], + [15695, 0, " "], + [15696, 0, "g"], + [15697, 0, "r"], + [15698, 0, "e"], + [15699, 0, "a"], + [15700, 0, "t"], + [15701, 0, "e"], + [15702, 0, "r"], + [15703, 0, " "], + [15704, 0, "t"], + [15705, 0, "h"], + [15706, 0, "a"], + [15707, 0, "n"], + [15708, 0, " "], + [15709, 0, "t"], + [15710, 0, "h"], + [15711, 0, "e"], + [15712, 0, "i"], + [15713, 0, "r"], + [15714, 0, " "], + [15715, 0, "r"], + [15716, 0, "e"], + [15717, 0, "f"], + [15718, 0, "e"], + [15719, 0, "r"], + [15720, 0, "e"], + [15721, 0, "n"], + [15722, 0, "c"], + [15723, 0, "e"], + [15724, 0, " "], + [15725, 0, "e"], + [15726, 0, "l"], + [15727, 0, "e"], + [15728, 0, "m"], + [15729, 0, "e"], + [15730, 0, "n"], + [15731, 0, "t"], + [15732, 0, "."], + [15733, 0, " "], + [15734, 0, "I"], + [15735, 0, "f"], + [15736, 0, " "], + [15737, 0, "t"], + [15738, 0, "h"], + [15739, 0, "e"], + [15740, 0, " "], + [15741, 0, "r"], + [15742, 0, "e"], + [15743, 0, "f"], + [15744, 0, "e"], + [15745, 0, "r"], + [15746, 0, "e"], + [15747, 0, "n"], + [15748, 0, "c"], + [15749, 0, "e"], + [15750, 0, " "], + [15751, 0, "e"], + [15752, 0, "l"], + [15753, 0, "e"], + [15754, 0, "m"], + [15755, 0, "e"], + [15756, 0, "n"], + [15757, 0, "t"], + [15758, 0, " "], + [15759, 0, "a"], + [15760, 0, "p"], + [15761, 0, "p"], + [15762, 0, "e"], + [15763, 0, "a"], + [15764, 0, "r"], + [15765, 0, "s"], + [15766, 0, " "], + [15767, 0, "b"], + [15768, 0, "e"], + [15769, 0, "f"], + [15770, 0, "o"], + [15771, 0, "r"], + [15772, 0, "e"], + [15773, 0, " "], + [15774, 0, "$"], + [15775, 0, "o"], + [15776, 0, "_"], + [15777, 0, "{"], + [15778, 0, "n"], + [15779, 0, "+"], + [15780, 0, "1"], + [15781, 0, "}"], + [15782, 0, "$"], + [15783, 0, " "], + [15784, 0, "i"], + [15785, 0, "n"], + [15786, 0, " "], + [15787, 0, "t"], + [15788, 0, "h"], + [15789, 0, "e"], + [15790, 0, " "], + [15791, 0, "f"], + [15792, 0, "i"], + [15793, 0, "n"], + [15794, 0, "a"], + [15795, 0, "l"], + [15796, 0, " "], + [15797, 0, "o"], + [15798, 0, "r"], + [15799, 0, "d"], + [15800, 0, "e"], + [15801, 0, "r"], + [15802, 0, ","], + [15803, 0, " "], + [15804, 0, "a"], + [15805, 0, "n"], + [15806, 0, "d"], + [15807, 0, " "], + [15493, 1], + [15493, 0, " "], + [15494, 0, "$"], + [15495, 0, "o"], + [15496, 0, "_"], + [15497, 0, "i"], + [15498, 0, "$"], + [15517, 0, "s"], + [15573, 1], + [15572, 1], + [15571, 1], + [15570, 1], + [15569, 1], + [15568, 1], + [15568, 0, " "], + [15569, 0, "i"], + [15570, 0, "t"], + [15571, 0, "s"], + [15598, 0, "s"], + [15627, 1], + [15626, 1], + [15625, 1], + [15624, 1], + [15623, 1], + [15623, 0, "i"], + [15624, 0, "t"], + [15625, 0, "s"], + [15677, 1], + [15676, 1], + [15676, 0, "s"], + [15715, 1], + [15714, 1], + [15713, 1], + [15712, 1], + [15711, 1], + [15711, 0, "i"], + [15712, 0, "t"], + [15713, 0, "s"], + [15808, 0, "a"], + [15809, 0, "n"], + [15810, 0, "d"], + [15811, 0, " "], + [15812, 0, "$"], + [15812, 1], + [15811, 1], + [15810, 1], + [15809, 1], + [15808, 1], + [15808, 0, "$"], + [15809, 0, "o"], + [15810, 0, "_"], + [15811, 0, "i"], + [15812, 0, "$"], + [15813, 0, " "], + [15814, 0, "a"], + [15815, 0, "p"], + [15816, 0, "p"], + [15817, 0, "e"], + [15818, 0, "a"], + [15819, 0, "r"], + [15820, 0, "s"], + [15821, 0, " "], + [15822, 0, "b"], + [15823, 0, "e"], + [15824, 0, "f"], + [15825, 0, "o"], + [15826, 0, "r"], + [15827, 0, "e"], + [15828, 0, " "], + [15829, 0, "$"], + [15830, 0, "o"], + [15831, 0, "_"], + [15832, 0, "{"], + [15833, 0, "n"], + [15834, 0, "+"], + [15835, 0, "1"], + [15836, 0, "}"], + [15837, 0, "$"], + [15838, 0, " "], + [15839, 0, "i"], + [15840, 0, "n"], + [15841, 0, " "], + [15842, 0, "t"], + [15843, 0, "h"], + [15844, 0, "e"], + [15845, 0, " "], + [15846, 0, "h"], + [15847, 0, "i"], + [15848, 0, "s"], + [15849, 0, "t"], + [15850, 0, "o"], + [15851, 0, "r"], + [15852, 0, "y"], + [15853, 0, ","], + [15854, 0, " "], + [15855, 0, "t"], + [15856, 0, "h"], + [15857, 0, "e"], + [15858, 0, "n"], + [15859, 0, " "], + [15860, 0, "t"], + [15861, 0, "h"], + [15862, 0, "e"], + [15863, 0, " "], + [15864, 0, "a"], + [15865, 0, "p"], + [15866, 0, "p"], + [15867, 0, "l"], + [15868, 0, "y"], + [15869, 0, " "], + [15870, 0, "r"], + [15871, 0, "u"], + [15872, 0, "l"], + [15873, 0, "e"], + [15874, 0, " "], + [15875, 0, "w"], + [15876, 0, "i"], + [15877, 0, "l"], + [15878, 0, "l"], + [15879, 0, " "], + [15879, 1], + [15878, 1], + [15877, 1], + [15876, 1], + [15875, 1], + [15875, 0, "f"], + [15876, 0, "o"], + [15877, 0, "r"], + [15878, 0, " "], + [15879, 0, "#"], + [15879, 1], + [15879, 0, "$"], + [15880, 0, "o"], + [15881, 0, "_"], + [15882, 0, "{"], + [15883, 0, "n"], + [15884, 0, "+"], + [15885, 0, "1"], + [15886, 0, "}"], + [15887, 0, "$"], + [15888, 0, " "], + [15889, 0, "s"], + [15890, 0, "k"], + [15891, 0, "i"], + [15892, 0, "p"], + [15893, 0, "s"], + [15894, 0, " "], + [15895, 0, "o"], + [15896, 0, "v"], + [15897, 0, "e"], + [15898, 0, "r"], + [15899, 0, " "], + [15900, 0, "b"], + [15901, 0, "o"], + [15902, 0, "t"], + [15903, 0, "h"], + [15904, 0, " "], + [15905, 0, "$"], + [15906, 0, "o"], + [15907, 0, "_"], + [15908, 0, "i"], + [15909, 0, "$"], + [15910, 0, " "], + [15911, 0, "a"], + [15912, 0, "n"], + [15913, 0, "d"], + [15914, 0, " "], + [15915, 0, "t"], + [15916, 0, "h"], + [15917, 0, "e"], + [15918, 0, " "], + [15919, 0, "r"], + [15920, 0, "e"], + [15921, 0, "f"], + [15922, 0, "e"], + [15923, 0, "r"], + [15924, 0, "e"], + [15925, 0, "n"], + [15926, 0, "c"], + [15927, 0, "e"], + [15928, 0, " "], + [15929, 0, "e"], + [15930, 0, "l"], + [15931, 0, "e"], + [15932, 0, "m"], + [15933, 0, "e"], + [15934, 0, "n"], + [15935, 0, "t"], + [15936, 0, ","], + [15937, 0, " "], + [15938, 0, "s"], + [15939, 0, "i"], + [15940, 0, "n"], + [15941, 0, "c"], + [15942, 0, "e"], + [15943, 0, " "], + [15944, 0, "t"], + [15945, 0, "h"], + [15946, 0, "e"], + [15947, 0, "y"], + [15948, 0, " "], + [15949, 0, "m"], + [15950, 0, "u"], + [15951, 0, "s"], + [15952, 0, "t"], + [15953, 0, " "], + [15954, 0, "b"], + [15955, 0, "o"], + [15956, 0, "t"], + [15957, 0, "h"], + [15958, 0, " "], + [15959, 0, "h"], + [15960, 0, "a"], + [15961, 0, "v"], + [15962, 0, "e"], + [15963, 0, " "], + [15964, 0, "t"], + [15965, 0, "i"], + [15966, 0, "m"], + [15967, 0, "e"], + [15968, 0, "s"], + [15969, 0, "t"], + [15970, 0, "a"], + [15971, 0, "m"], + [15972, 0, "p"], + [15973, 0, "s"], + [15974, 0, " "], + [15975, 0, "g"], + [15976, 0, "r"], + [15977, 0, "e"], + [15978, 0, "a"], + [15979, 0, "t"], + [15980, 0, "h"], + [15981, 0, "e"], + [15982, 0, "r"], + [15983, 0, " "], + [15984, 0, "t"], + [15985, 0, "h"], + [15986, 0, "a"], + [15986, 1], + [15985, 1], + [15984, 1], + [15983, 1], + [15982, 1], + [15981, 1], + [15980, 1], + [15980, 0, "e"], + [15981, 0, "r"], + [15982, 0, " "], + [15983, 0, "t"], + [15984, 0, "h"], + [15985, 0, "a"], + [15986, 0, "n"], + [15987, 0, " "], + [15988, 0, "$"], + [15989, 0, "\\"], + [15990, 0, "m"], + [15991, 0, "a"], + [15992, 0, "t"], + [15993, 0, "h"], + [15994, 0, "i"], + [15995, 0, "t"], + [15996, 0, "{"], + [15997, 0, "i"], + [15998, 0, "d"], + [15999, 0, "}"], + [16000, 0, "$"], + [16001, 0, "."], + [16002, 0, " "], + [16003, 0, "I"], + [16004, 0, "f"], + [16005, 0, " "], + [16006, 0, "t"], + [16007, 0, "h"], + [16008, 0, "e"], + [16009, 0, " "], + [16010, 0, "r"], + [16011, 0, "e"], + [16012, 0, "f"], + [16013, 0, "e"], + [16014, 0, "r"], + [16015, 0, "e"], + [16016, 0, "n"], + [16017, 0, "c"], + [16018, 0, "e"], + [16019, 0, " "], + [16020, 0, "e"], + [16021, 0, "l"], + [16022, 0, "e"], + [16023, 0, "m"], + [16024, 0, "e"], + [16025, 0, "n"], + [16026, 0, "t"], + [16027, 0, " "], + [16028, 0, "a"], + [16029, 0, "p"], + [16030, 0, "p"], + [16031, 0, "e"], + [16032, 0, "a"], + [16033, 0, "r"], + [16034, 0, "s"], + [16035, 0, " "], + [16036, 0, "b"], + [16037, 0, "e"], + [16038, 0, "f"], + [16039, 0, "o"], + [16040, 0, "r"], + [16041, 0, "e"], + [16042, 0, " "], + [16043, 0, "$"], + [16044, 0, "o"], + [16045, 0, "_"], + [16046, 0, "{"], + [16047, 0, "n"], + [16048, 0, "+"], + [16049, 0, "1"], + [16050, 0, "}"], + [16051, 0, "$"], + [16052, 0, " "], + [16053, 0, "i"], + [16054, 0, "n"], + [16055, 0, " "], + [16056, 0, "t"], + [16057, 0, "h"], + [16058, 0, "e"], + [16059, 0, " "], + [16060, 0, "f"], + [16061, 0, "i"], + [16062, 0, "n"], + [16063, 0, "a"], + [16064, 0, "l"], + [16065, 0, " "], + [16066, 0, "o"], + [16067, 0, "r"], + [16068, 0, "d"], + [16069, 0, "e"], + [16070, 0, "r"], + [16071, 0, ","], + [16072, 0, " "], + [16073, 0, "a"], + [16074, 0, "n"], + [16075, 0, "d"], + [16076, 0, " "], + [16077, 0, "$"], + [16078, 0, "o"], + [16079, 0, "_"], + [16080, 0, "i"], + [16081, 0, "$"], + [16082, 0, " "], + [16083, 0, "a"], + [16084, 0, "p"], + [16085, 0, "p"], + [16086, 0, "e"], + [16087, 0, "a"], + [16088, 0, "r"], + [16089, 0, "s"], + [16090, 0, " "], + [16091, 0, "a"], + [16092, 0, "f"], + [16093, 0, "t"], + [16094, 0, "e"], + [16095, 0, "r"], + [16096, 0, " "], + [16097, 0, "$"], + [16098, 0, "#"], + [16098, 1], + [16098, 0, "o"], + [16099, 0, "_"], + [16100, 0, "{"], + [16101, 0, "n"], + [16102, 0, "+"], + [16103, 0, "1"], + [16104, 0, "}"], + [16105, 0, "$"], + [16106, 0, " "], + [16107, 0, "i"], + [16108, 0, "n"], + [16109, 0, " "], + [16110, 0, "t"], + [16111, 0, "h"], + [16112, 0, "e"], + [16113, 0, "i"], + [16113, 1], + [16113, 0, " "], + [16114, 0, "h"], + [16115, 0, "i"], + [16116, 0, "s"], + [16117, 0, "t"], + [16118, 0, "o"], + [16119, 0, "r"], + [16120, 0, "y"], + [15803, 0, " "], + [15804, 0, "t"], + [15805, 0, "h"], + [15806, 0, "a"], + [15807, 0, "t"], + [15808, 0, " "], + [15809, 0, "m"], + [15810, 0, "e"], + [15811, 0, "a"], + [15812, 0, "n"], + [15813, 0, "s"], + [15814, 0, " "], + [15815, 0, "t"], + [15816, 0, "h"], + [15817, 0, "e"], + [15818, 0, " "], + [15819, 0, "t"], + [15820, 0, "i"], + [15821, 0, "m"], + [15822, 0, "e"], + [15823, 0, "s"], + [15824, 0, "t"], + [15825, 0, "a"], + [15826, 0, "m"], + [15827, 0, "p"], + [15828, 0, " "], + [15829, 0, "o"], + [15830, 0, "f"], + [15831, 0, " "], + [15832, 0, "t"], + [15833, 0, "h"], + [15834, 0, "e"], + [15835, 0, " "], + [15836, 0, "r"], + [15837, 0, "e"], + [15838, 0, "f"], + [15839, 0, "e"], + [15840, 0, "r"], + [15841, 0, "e"], + [15842, 0, "n"], + [15843, 0, "c"], + [15844, 0, "e"], + [15845, 0, " "], + [15846, 0, "e"], + [15847, 0, "l"], + [15848, 0, "e"], + [15849, 0, "m"], + [15850, 0, "e"], + [15851, 0, "n"], + [15852, 0, "t"], + [15853, 0, " "], + [15854, 0, "i"], + [15855, 0, "s"], + [15856, 0, " "], + [15857, 0, "g"], + [15858, 0, "r"], + [15859, 0, "e"], + [15860, 0, "a"], + [15861, 0, "t"], + [15862, 0, "e"], + [15863, 0, "r"], + [15864, 0, " "], + [15865, 0, "t"], + [15866, 0, "h"], + [15867, 0, "a"], + [15868, 0, "n"], + [15869, 0, " "], + [15870, 0, "$"], + [15871, 0, "\\"], + [15872, 0, "m"], + [15873, 0, "a"], + [15874, 0, "t"], + [15875, 0, "h"], + [15876, 0, "i"], + [15877, 0, "t"], + [15878, 0, "{"], + [15879, 0, "i"], + [15880, 0, "d"], + [15881, 0, "}"], + [15882, 0, "$"], + [15855, 1], + [15854, 1], + [15854, 0, "a"], + [15855, 0, "n"], + [15856, 0, "d"], + [15857, 0, " "], + [15857, 1], + [15856, 1], + [15855, 1], + [15854, 1], + [15854, 0, "i"], + [15855, 0, "s"], + [15883, 0, ","], + [15888, 0, " "], + [15889, 0, "s"], + [15890, 0, "o"], + [15891, 0, " "], + [15892, 0, "t"], + [15893, 0, "h"], + [15894, 0, "e"], + [15895, 0, " "], + [15896, 0, "t"], + [15897, 0, "i"], + [15898, 0, "m"], + [15899, 0, "e"], + [15900, 0, "s"], + [15901, 0, "t"], + [15902, 0, "a"], + [15903, 0, "m"], + [15904, 0, "p"], + [15905, 0, " "], + [15906, 0, "o"], + [15907, 0, "f"], + [15908, 0, " "], + [15908, 1], + [15914, 0, " "], + [15915, 0, "i"], + [15916, 0, "s"], + [15917, 0, " "], + [15918, 0, "a"], + [15919, 0, "l"], + [15920, 0, "s"], + [15921, 0, "o"], + [15922, 0, " "], + [15923, 0, "g"], + [15924, 0, "r"], + [15925, 0, "e"], + [15926, 0, "a"], + [15927, 0, "t"], + [15928, 0, "e"], + [15929, 0, "r"], + [15930, 0, " "], + [15931, 0, "t"], + [15932, 0, "h"], + [15933, 0, "a"], + [15934, 0, "n"], + [15935, 0, " "], + [15936, 0, "$"], + [15937, 0, "{"], + [15937, 1], + [15937, 0, "\n"], + [15937, 1], + [15937, 0, "\\"], + [15938, 0, "m"], + [15939, 0, "a"], + [15940, 0, "t"], + [15941, 0, "h"], + [15942, 0, "i"], + [15943, 0, "t"], + [15944, 0, "{"], + [15945, 0, "i"], + [15946, 0, "d"], + [15947, 0, "}"], + [15948, 0, "$"], + [15949, 0, "."], + [15950, 0, " "], + [15951, 0, "I"], + [15952, 0, "f"], + [15953, 0, " "], + [15954, 0, "$"], + [15955, 0, "o"], + [15956, 0, "_"], + [15957, 0, "{"], + [15958, 0, "n"], + [15959, 0, "+"], + [15960, 0, "1"], + [15961, 0, "}"], + [15962, 0, "$"], + [15987, 1], + [15986, 1], + [15985, 1], + [15984, 1], + [15983, 1], + [15982, 1], + [15981, 1], + [15980, 1], + [15979, 1], + [15978, 1], + [15977, 1], + [15976, 1], + [15975, 1], + [15974, 1], + [15973, 1], + [15972, 1], + [15972, 0, "a"], + [15973, 0, "f"], + [15974, 0, "t"], + [15975, 0, "e"], + [15976, 0, "r"], + [15977, 0, " "], + [15978, 0, "$"], + [15979, 0, "o"], + [15980, 0, "_"], + [15981, 0, "i"], + [15982, 0, "$"], + [16145, 1], + [16144, 1], + [16143, 1], + [16142, 1], + [16141, 1], + [16140, 1], + [16139, 1], + [16138, 1], + [16137, 1], + [16136, 1], + [16135, 1], + [16134, 1], + [16133, 1], + [16132, 1], + [16131, 1], + [16130, 1], + [16129, 1], + [16128, 1], + [16127, 1], + [16126, 1], + [16125, 1], + [16124, 1], + [16123, 1], + [16122, 1], + [16121, 1], + [16120, 1], + [16119, 1], + [16118, 1], + [16117, 1], + [16116, 1], + [16115, 1], + [16114, 1], + [16113, 1], + [16112, 1], + [16111, 1], + [16110, 1], + [16109, 1], + [16108, 1], + [16107, 1], + [16106, 1], + [16105, 1], + [16104, 1], + [16103, 1], + [16102, 1], + [16101, 1], + [16100, 1], + [16099, 1], + [16098, 1], + [16097, 1], + [16096, 1], + [16095, 1], + [16094, 1], + [16093, 1], + [16092, 1], + [16091, 1], + [16090, 1], + [16089, 1], + [16088, 1], + [16087, 1], + [16086, 1], + [16085, 1], + [16084, 1], + [16083, 1], + [16082, 1], + [16081, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [16086, 1], + [15733, 0, " "], + [15734, 0, "i"], + [15735, 0, "f"], + [15736, 0, " "], + [15736, 1], + [15735, 1], + [15734, 1], + [15734, 0, "I"], + [15735, 0, "f"], + [15736, 0, " "], + [15737, 0, "t"], + [15738, 0, "h"], + [15739, 0, "e"], + [15740, 0, " "], + [15741, 0, "r"], + [15742, 0, "e"], + [15743, 0, "f"], + [15744, 0, "e"], + [15745, 0, "r"], + [15746, 0, "e"], + [15747, 0, "n"], + [15748, 0, "c"], + [15749, 0, "e"], + [15750, 0, " "], + [15751, 0, "e"], + [15752, 0, "l"], + [15753, 0, "e"], + [15754, 0, "m"], + [15755, 0, "e"], + [15756, 0, "n"], + [15757, 0, "t"], + [15758, 0, " "], + [15759, 0, "a"], + [15760, 0, "p"], + [15761, 0, "p"], + [15762, 0, "e"], + [15763, 0, "a"], + [15764, 0, "r"], + [15765, 0, "s"], + [15766, 0, " "], + [15767, 0, "a"], + [15768, 0, "f"], + [15769, 0, "t"], + [15770, 0, "e"], + [15771, 0, "r"], + [15772, 0, " "], + [15773, 0, "$"], + [15774, 0, "o"], + [15775, 0, "_"], + [15776, 0, "{"], + [15777, 0, "n"], + [15778, 0, "+"], + [15779, 0, "1"], + [15780, 0, "}"], + [15781, 0, "$"], + [15782, 0, " "], + [15783, 0, "i"], + [15784, 0, "n"], + [15785, 0, " "], + [15786, 0, "t"], + [15787, 0, "h"], + [15788, 0, "e"], + [15789, 0, " "], + [15790, 0, "f"], + [15791, 0, "i"], + [15792, 0, "n"], + [15793, 0, "a"], + [15794, 0, "l"], + [15795, 0, " "], + [15796, 0, "o"], + [15797, 0, "r"], + [15798, 0, "d"], + [15799, 0, "e"], + [15800, 0, "r"], + [15801, 0, ","], + [15802, 0, " "], + [15803, 0, "$"], + [15804, 0, "o"], + [15805, 0, "_"], + [15806, 0, "i"], + [15807, 0, "$"], + [15808, 0, " "], + [15809, 0, "a"], + [15810, 0, "l"], + [15811, 0, "s"], + [15812, 0, "o"], + [15813, 0, " "], + [15814, 0, "a"], + [15815, 0, "p"], + [15816, 0, "p"], + [15817, 0, "e"], + [15818, 0, "a"], + [15819, 0, "r"], + [15820, 0, "s"], + [15821, 0, " "], + [15822, 0, "a"], + [15823, 0, "f"], + [15824, 0, "t"], + [15825, 0, "e"], + [15826, 0, "r"], + [15827, 0, " "], + [15828, 0, "$"], + [15829, 0, "o"], + [15830, 0, "_"], + [15831, 0, "{"], + [15832, 0, "n"], + [15833, 0, "+"], + [15834, 0, "1"], + [15835, 0, "}"], + [15836, 0, "$"], + [15837, 0, ","], + [15838, 0, " "], + [15839, 0, "r"], + [15840, 0, "e"], + [15841, 0, "g"], + [15842, 0, "a"], + [15843, 0, "r"], + [15844, 0, "d"], + [15845, 0, "l"], + [15846, 0, "e"], + [15847, 0, "s"], + [15848, 0, "s"], + [15849, 0, " "], + [15850, 0, "o"], + [15851, 0, "f"], + [15852, 0, " "], + [15853, 0, "t"], + [15854, 0, "h"], + [15855, 0, "e"], + [15856, 0, " "], + [15857, 0, "o"], + [15858, 0, "r"], + [15859, 0, "d"], + [15860, 0, "e"], + [15861, 0, "r"], + [15862, 0, " "], + [15863, 0, "o"], + [15864, 0, "f"], + [15865, 0, " "], + [15865, 1], + [15864, 1], + [15863, 1], + [15862, 1], + [15862, 0, " "], + [15863, 0, "i"], + [15864, 0, "n"], + [15865, 0, " "], + [15866, 0, "w"], + [15867, 0, "h"], + [15868, 0, "i"], + [15869, 0, "c"], + [15870, 0, "h"], + [15871, 0, " "], + [15872, 0, "o"], + [15873, 0, "p"], + [15874, 0, "e"], + [15875, 0, "r"], + [15876, 0, "a"], + [15877, 0, "t"], + [15878, 0, "i"], + [15879, 0, "o"], + [15880, 0, "n"], + [15881, 0, "s"], + [15882, 0, " "], + [15883, 0, "a"], + [15884, 0, "r"], + [15885, 0, "e"], + [15886, 0, " "], + [15887, 0, "a"], + [15888, 0, "p"], + [15889, 0, "p"], + [15890, 0, "l"], + [15891, 0, "i"], + [15892, 0, "e"], + [15893, 0, "d"], + [15894, 0, "."], + [15895, 1], + [15895, 0, "\n"], + [15896, 0, "\n"], + [16293, 0, ","], + [16294, 0, " "], + [16295, 0, "t"], + [16296, 0, "h"], + [16297, 0, "e"], + [16298, 0, " "], + [16299, 0, "a"], + [16300, 0, "p"], + [16301, 0, "p"], + [16302, 0, "l"], + [16303, 0, "y"], + [16304, 0, " "], + [16305, 0, "r"], + [16306, 0, "u"], + [16307, 0, "l"], + [16308, 0, "e"], + [16309, 0, " "], + [16310, 0, "f"], + [16311, 0, "o"], + [16312, 0, "r"], + [16313, 0, " "], + [16314, 0, "$"], + [16315, 0, "o"], + [16316, 0, "_"], + [16317, 0, "i"], + [16318, 0, "$"], + [16319, 0, " "], + [16320, 0, "d"], + [16321, 0, "o"], + [16322, 0, "e"], + [16323, 0, "s"], + [16324, 0, " "], + [16325, 0, "n"], + [16326, 0, "o"], + [16327, 0, "t"], + [16328, 0, " "], + [16329, 0, "s"], + [16330, 0, "k"], + [16331, 0, "i"], + [16332, 0, "p"], + [16333, 0, " "], + [16334, 0, "o"], + [16335, 0, "v"], + [16336, 0, "e"], + [16337, 0, "r"], + [16338, 0, " "], + [16339, 0, "$"], + [16340, 0, "o"], + [16341, 0, "_"], + [16342, 0, "{"], + [16343, 0, "n"], + [16344, 0, "+"], + [16345, 0, "1"], + [16346, 0, "}"], + [16347, 0, "$"], + [16338, 0, " "], + [16339, 0, "t"], + [16340, 0, "h"], + [16341, 0, "e"], + [16342, 0, " "], + [16343, 0, "l"], + [16344, 0, "i"], + [16345, 0, "s"], + [16346, 0, "t"], + [16347, 0, " "], + [16348, 0, "e"], + [16349, 0, "l"], + [16350, 0, "e"], + [16351, 0, "m"], + [16352, 0, "e"], + [16353, 0, "n"], + [16354, 0, "t"], + [16355, 0, " "], + [16356, 0, "f"], + [16357, 0, "o"], + [16358, 0, "r"], + [16369, 0, ","], + [16370, 0, " "], + [16371, 0, "b"], + [16372, 0, "e"], + [16373, 0, "c"], + [16374, 0, "a"], + [16375, 0, "u"], + [16376, 0, "s"], + [16377, 0, "e"], + [16378, 0, " "], + [16371, 0, "a"], + [16372, 0, "g"], + [16373, 0, "a"], + [16374, 0, "i"], + [16375, 0, "n"], + [16376, 0, " "], + [16385, 0, "t"], + [16386, 0, "h"], + [16387, 0, "e"], + [16388, 0, " "], + [16389, 0, "t"], + [16390, 0, "i"], + [16391, 0, "m"], + [16392, 0, "e"], + [16393, 0, "s"], + [16394, 0, "t"], + [16395, 0, "a"], + [16396, 0, "m"], + [16397, 0, "p"], + [16398, 0, " "], + [16399, 0, "f"], + [16400, 0, "o"], + [16401, 0, "r"], + [16402, 0, " "], + [16403, 0, "$"], + [16404, 0, "o"], + [16405, 0, "_"], + [16406, 0, "i"], + [16407, 0, "$"], + [16408, 0, " "], + [16409, 0, "i"], + [16410, 0, "s"], + [16411, 0, " "], + [16412, 0, "g"], + [16413, 0, "r"], + [16414, 0, "e"], + [16415, 0, "a"], + [16416, 0, "t"], + [16417, 0, "h"], + [16418, 0, "e"], + [16419, 0, "r"], + [16420, 0, " "], + [16421, 0, "t"], + [16422, 0, "h"], + [16423, 0, "a"], + [16424, 0, "n"], + [16424, 1], + [16423, 1], + [16422, 1], + [16421, 1], + [16420, 1], + [16419, 1], + [16418, 1], + [16417, 1], + [16417, 0, "e"], + [16418, 0, "r"], + [16419, 0, " "], + [16420, 0, "t"], + [16421, 0, "h"], + [16422, 0, "a"], + [16423, 0, "n"], + [16424, 0, " "], + [16425, 0, "$"], + [16426, 0, "\\"], + [16427, 0, "m"], + [16428, 0, "a"], + [16429, 0, "t"], + [16430, 0, "h"], + [16431, 0, "i"], + [16432, 0, "t"], + [16433, 0, "{"], + [16434, 0, "i"], + [16435, 0, "d"], + [16436, 0, "}"], + [16437, 0, "$"], + [16438, 0, "."], + [16439, 0, " "], + [16440, 0, "E"], + [16441, 0, "i"], + [16442, 0, "t"], + [16443, 0, "h"], + [16444, 0, "e"], + [16445, 0, "r"], + [16446, 0, " "], + [16447, 0, "w"], + [16448, 0, "a"], + [16449, 0, "y"], + [16450, 0, ","], + [16451, 0, " "], + [16452, 0, "b"], + [16453, 0, "o"], + [16454, 0, "t"], + [16455, 0, "h"], + [16456, 0, " "], + [16456, 1], + [16455, 1], + [16454, 1], + [16453, 1], + [16452, 1], + [16452, 0, "i"], + [16453, 0, "f"], + [16454, 0, " "], + [16455, 0, "t"], + [16456, 0, "h"], + [16457, 0, "e"], + [16458, 0, " "], + [16459, 0, "r"], + [16460, 0, "e"], + [16461, 0, "f"], + [16462, 0, "e"], + [16463, 0, "r"], + [16464, 0, "e"], + [16465, 0, "n"], + [16466, 0, "c"], + [16467, 0, "e"], + [16468, 0, " "], + [16469, 0, "e"], + [16470, 0, "l"], + [16471, 0, "e"], + [16472, 0, "m"], + [16473, 0, "e"], + [16474, 0, "n"], + [16475, 0, "t"], + [16476, 0, " "], + [16477, 0, "a"], + [16478, 0, "p"], + [16479, 0, "p"], + [16480, 0, "e"], + [16481, 0, "a"], + [16482, 0, "r"], + [16483, 0, "s"], + [16484, 0, " "], + [16485, 0, "b"], + [16486, 0, "e"], + [16487, 0, "f"], + [16488, 0, "o"], + [16489, 0, "r"], + [16490, 0, "e"], + [16491, 0, " "], + [16492, 0, "$"], + [16493, 0, "o"], + [16494, 0, "_"], + [16495, 0, "["], + [16495, 1], + [16495, 0, "{"], + [16496, 0, "n"], + [16497, 0, "+"], + [16498, 0, "1"], + [16499, 0, "}"], + [16500, 0, "$"], + [16501, 0, " "], + [16502, 0, "i"], + [16503, 0, "n"], + [16504, 0, " "], + [16505, 0, "t"], + [16506, 0, "h"], + [16507, 0, "e"], + [16508, 0, " "], + [16509, 0, "f"], + [16510, 0, "i"], + [16511, 0, "n"], + [16512, 0, "a"], + [16513, 0, "l"], + [16514, 0, " "], + [16515, 0, "o"], + [16516, 0, "r"], + [16517, 0, "d"], + [16518, 0, "e"], + [16519, 0, "r"], + [16520, 0, ","], + [16521, 0, " "], + [16522, 0, "s"], + [16523, 0, "o"], + [16524, 0, " "], + [16525, 0, "d"], + [16526, 0, "o"], + [16527, 0, "e"], + [16528, 0, "s"], + [16529, 0, " "], + [16530, 0, "$"], + [16531, 0, "o"], + [16532, 0, "_"], + [16533, 0, "i"], + [16534, 0, "$"], + [16535, 0, ","], + [16536, 0, " "], + [16537, 0, "r"], + [16538, 0, "e"], + [16539, 0, "g"], + [16540, 0, "a"], + [16541, 0, "r"], + [16542, 0, "d"], + [16543, 0, "l"], + [16544, 0, "e"], + [16545, 0, "s"], + [16546, 0, "s"], + [16547, 0, " "], + [16548, 0, "o"], + [16549, 0, "f"], + [16550, 0, " "], + [16551, 0, "t"], + [16552, 0, "h"], + [16553, 0, "e"], + [16554, 0, " "], + [16555, 0, "o"], + [16556, 0, "r"], + [16557, 0, "d"], + [16558, 0, "e"], + [16559, 0, "r"], + [16560, 0, " "], + [16561, 0, "i"], + [16562, 0, "n"], + [16563, 0, " "], + [16564, 0, "w"], + [16565, 0, "h"], + [16566, 0, "i"], + [16567, 0, "c"], + [16568, 0, "h"], + [16569, 0, " "], + [16570, 0, "a"], + [16570, 1], + [16570, 0, "o"], + [16571, 0, "p"], + [16572, 0, "e"], + [16573, 0, "r"], + [16574, 0, "a"], + [16575, 0, "t"], + [16576, 0, "i"], + [16577, 0, "o"], + [16578, 0, "n"], + [16579, 0, "s"], + [16580, 0, " "], + [16581, 0, "a"], + [16582, 0, "r"], + [16583, 0, "e"], + [16584, 0, " "], + [16585, 0, "a"], + [16586, 0, "p"], + [16587, 0, "p"], + [16588, 0, "l"], + [16589, 0, "i"], + [16590, 0, "e"], + [16591, 0, "d"], + [16592, 0, "."], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 1], + [16595, 0, "T"], + [16596, 0, "O"], + [16597, 0, "D"], + [16598, 0, "O"], + [16599, 0, " "], + [16600, 0, "t"], + [16601, 0, "h"], + [16602, 0, "a"], + [16603, 0, "t"], + [16604, 0, " "], + [16605, 0, "l"], + [16606, 0, "a"], + [16607, 0, "s"], + [16608, 0, "t"], + [16609, 0, " "], + [16610, 0, "b"], + [16611, 0, "i"], + [16612, 0, "t"], + [16613, 0, " "], + [16614, 0, "o"], + [16615, 0, "f"], + [16616, 0, " "], + [16617, 0, "t"], + [16618, 0, "h"], + [16619, 0, "e"], + [16620, 0, " "], + [16621, 0, "a"], + [16622, 0, "r"], + [16623, 0, "g"], + [16624, 0, "u"], + [16625, 0, "m"], + [16626, 0, "e"], + [16627, 0, "n"], + [16628, 0, "t"], + [16629, 0, " "], + [16630, 0, "i"], + [16631, 0, "s"], + [16632, 0, " "], + [16633, 0, "a"], + [16634, 0, " "], + [16635, 0, "b"], + [16636, 0, "i"], + [16637, 0, "t"], + [16638, 0, " "], + [16639, 0, "h"], + [16640, 0, "a"], + [16641, 0, "n"], + [16642, 0, "d"], + [16643, 0, "-"], + [16644, 0, "w"], + [16645, 0, "a"], + [16646, 0, "v"], + [16647, 0, "y"], + [16648, 0, ","], + [16649, 0, " "], + [16650, 0, "n"], + [16651, 0, "e"], + [16652, 0, "e"], + [16653, 0, "d"], + [16654, 0, " "], + [16655, 0, "t"], + [16656, 0, "o"], + [16657, 0, " "], + [16658, 0, "m"], + [16659, 0, "a"], + [16660, 0, "k"], + [16661, 0, "e"], + [16662, 0, " "], + [16663, 0, "i"], + [16664, 0, "t"], + [16665, 0, " "], + [16666, 0, "m"], + [16667, 0, "o"], + [16668, 0, "r"], + [16669, 0, "e"], + [16670, 0, " "], + [16671, 0, "p"], + [16672, 0, "r"], + [16673, 0, "e"], + [16674, 0, "c"], + [16675, 0, "i"], + [16676, 0, "s"], + [16677, 0, "e"], + [16678, 0, "."], + [16679, 0, " "], + [16680, 0, "B"], + [16681, 0, "u"], + [16682, 0, "t"], + [16683, 0, " "], + [16684, 0, "I"], + [16685, 0, " "], + [16686, 0, "t"], + [16687, 0, "h"], + [16688, 0, "i"], + [16689, 0, "n"], + [16690, 0, "k"], + [16691, 0, " "], + [16692, 0, "t"], + [16693, 0, "h"], + [16694, 0, "e"], + [16695, 0, " "], + [16696, 0, "g"], + [16697, 0, "e"], + [16698, 0, "n"], + [16699, 0, "e"], + [16700, 0, "r"], + [16701, 0, "a"], + [16702, 0, "l"], + [16703, 0, " "], + [16704, 0, "a"], + [16705, 0, "p"], + [16706, 0, "p"], + [16707, 0, "r"], + [16708, 0, "o"], + [16709, 0, "a"], + [16710, 0, "c"], + [16711, 0, "h"], + [16712, 0, " "], + [16713, 0, "i"], + [16714, 0, "s"], + [16715, 0, " "], + [16716, 0, "o"], + [16717, 0, "k"], + [16718, 0, "."], + [16719, 0, " "], + [16720, 0, "T"], + [16721, 0, "h"], + [16722, 0, "a"], + [16723, 0, "t"], + [16724, 0, " "], + [16725, 0, "c"], + [16726, 0, "o"], + [16727, 0, "m"], + [16728, 0, "p"], + [16729, 0, "l"], + [16730, 0, "e"], + [16731, 0, "t"], + [16732, 0, "e"], + [16733, 0, "s"], + [16734, 0, " "], + [16735, 0, "t"], + [16736, 0, "h"], + [16737, 0, "e"], + [16738, 0, " "], + [16739, 0, "i"], + [16740, 0, "n"], + [16741, 0, "d"], + [16742, 0, "u"], + [16743, 0, "c"], + [16744, 0, "t"], + [16745, 0, "i"], + [16746, 0, "o"], + [16747, 0, "n"], + [16748, 0, " "], + [16749, 0, "s"], + [16750, 0, "t"], + [16751, 0, "e"], + [16752, 0, "p"], + [16753, 0, ","], + [16754, 0, " "], + [16755, 0, "a"], + [16756, 0, "n"], + [16757, 0, "d"], + [16758, 0, " "], + [16759, 0, "t"], + [16760, 0, "h"], + [16761, 0, "u"], + [16762, 0, "s"], + [16763, 0, " "], + [16764, 0, "t"], + [16765, 0, "h"], + [16766, 0, "e"], + [16767, 0, " "], + [16768, 0, "p"], + [16769, 0, "r"], + [16770, 0, "o"], + [16771, 0, "o"], + [16772, 0, "f"], + [16773, 0, "."], + [16774, 1], + [16774, 1], + [3942, 0, "\n"], + [3943, 0, "\n"], + [3944, 0, "\\"], + [3945, 0, "b"], + [3946, 0, "e"], + [3947, 0, "g"], + [3948, 0, "i"], + [3949, 0, "n"], + [3950, 0, "{"], + [3951, 0, "f"], + [3952, 0, "i"], + [3953, 0, "g"], + [3954, 0, "u"], + [3955, 0, "r"], + [3956, 0, "e"], + [3957, 0, "*"], + [3958, 0, "}"], + [3959, 0, "\n"], + [3960, 0, "\\"], + [3961, 0, "e"], + [3962, 0, "n"], + [3963, 0, "d"], + [3964, 0, "{"], + [3965, 0, "f"], + [3966, 0, "i"], + [3967, 0, "g"], + [3968, 0, "u"], + [3969, 0, "r"], + [3970, 0, "e"], + [3971, 0, "*"], + [3972, 0, "}"], + [3959, 0, "\n"], + [3960, 0, "\\"], + [3961, 0, "c"], + [3962, 0, "a"], + [3963, 0, "p"], + [3964, 0, "t"], + [3965, 0, "u"], + [3965, 1], + [3965, 0, "i"], + [3966, 0, "o"], + [3967, 0, "n"], + [3968, 0, "{"], + [3969, 0, "R"], + [3970, 0, "u"], + [3971, 0, "l"], + [3972, 0, "e"], + [3973, 0, "s"], + [3974, 0, " "], + [3975, 0, "f"], + [3976, 0, "o"], + [3977, 0, "r"], + [3978, 0, " "], + [3979, 0, "m"], + [3980, 0, "u"], + [3981, 0, "t"], + [3982, 0, "a"], + [3983, 0, "t"], + [3984, 0, "i"], + [3985, 0, "n"], + [3986, 0, "g"], + [3987, 0, " "], + [3988, 0, "a"], + [3989, 0, "n"], + [3990, 0, " "], + [3991, 0, "o"], + [3992, 0, "r"], + [3993, 0, "d"], + [3994, 0, "e"], + [3995, 0, "r"], + [3996, 0, "e"], + [3997, 0, "d"], + [3998, 0, " "], + [3999, 0, "l"], + [4000, 0, "i"], + [4001, 0, "s"], + [4002, 0, "t"], + [4003, 0, "}"], + [4004, 0, "\n"], + [4005, 0, "\\"], + [4006, 0, "l"], + [4007, 0, "a"], + [4008, 0, "b"], + [4009, 0, "e"], + [4010, 0, "l"], + [4011, 0, "{"], + [4012, 0, "f"], + [4013, 0, "i"], + [4014, 0, "g"], + [4015, 0, ":"], + [4016, 0, "r"], + [4017, 0, "g"], + [4018, 0, "a"], + [4019, 0, "-"], + [4020, 0, "r"], + [4021, 0, "u"], + [4022, 0, "l"], + [4023, 0, "e"], + [4024, 0, "s"], + [4025, 0, "}"], + [168, 0, "\n"], + [169, 0, "\\"], + [170, 0, "u"], + [171, 0, "s"], + [172, 0, "e"], + [173, 0, "p"], + [174, 0, "a"], + [175, 0, "c"], + [176, 0, "k"], + [177, 0, "a"], + [178, 0, "g"], + [179, 0, "e"], + [180, 0, "{"], + [181, 0, "p"], + [182, 0, "a"], + [182, 1], + [181, 1], + [181, 0, "m"], + [182, 0, "a"], + [183, 0, "t"], + [184, 0, "h"], + [185, 0, "p"], + [186, 0, "a"], + [187, 0, "r"], + [188, 0, "t"], + [189, 0, "i"], + [190, 0, "r"], + [191, 0, "}"], + [192, 0, " "], + [193, 0, "%"], + [194, 0, " "], + [195, 0, "i"], + [196, 0, "n"], + [197, 0, "f"], + [198, 0, "e"], + [199, 0, "r"], + [200, 0, "e"], + [201, 0, "n"], + [202, 0, "c"], + [203, 0, "e"], + [204, 0, " "], + [205, 0, "r"], + [206, 0, "u"], + [207, 0, "l"], + [208, 0, "e"], + [209, 0, "s"], + [195, 0, "n"], + [196, 0, "o"], + [197, 0, "t"], + [198, 0, "a"], + [199, 0, "t"], + [200, 0, "i"], + [201, 0, "o"], + [202, 0, "n"], + [203, 0, " "], + [204, 0, "f"], + [205, 0, "o"], + [206, 0, "r"], + [207, 0, " "], + [4014, 0, "\n"], + [4015, 0, "\\"], + [4016, 0, "i"], + [4017, 0, "n"], + [4018, 0, "f"], + [4019, 0, "e"], + [4020, 0, "r"], + [4021, 0, "r"], + [4022, 0, "u"], + [4023, 0, "l"], + [4024, 0, "e"], + [4025, 0, "["], + [4026, 0, "i"], + [4027, 0, "n"], + [4028, 0, "s"], + [4029, 0, "e"], + [4030, 0, "r"], + [4031, 0, "t"], + [4032, 0, "]"], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 0, "s"], + [182, 0, "e"], + [183, 0, "m"], + [184, 0, "a"], + [185, 0, "n"], + [186, 0, "t"], + [187, 0, "i"], + [188, 0, "c"], + [4031, 0, "\n"], + [4032, 0, "\\"], + [4033, 0, "i"], + [4034, 0, "n"], + [4035, 0, "f"], + [4036, 0, "e"], + [4037, 0, "r"], + [4038, 0, "e"], + [4039, 0, "n"], + [4040, 0, "c"], + [4041, 0, "e"], + [4042, 0, "["], + [4043, 0, "i"], + [4044, 0, "n"], + [4045, 0, "s"], + [4046, 0, "e"], + [4047, 0, "r"], + [4048, 0, "t"], + [4048, 1], + [4047, 1], + [4046, 1], + [4045, 1], + [4044, 1], + [4043, 1], + [4043, 0, "I"], + [4044, 0, "n"], + [4045, 0, "s"], + [4046, 0, "e"], + [4047, 0, "r"], + [4048, 0, "t"], + [4049, 0, "]"], + [4030, 1], + [4029, 1], + [4028, 1], + [4027, 1], + [4026, 1], + [4025, 1], + [4024, 1], + [4023, 1], + [4022, 1], + [4021, 1], + [4020, 1], + [4019, 1], + [4018, 1], + [4017, 1], + [4016, 1], + [4015, 1], + [4014, 1], + [4013, 1], + [4012, 1], + [4031, 0, "{"], + [4032, 0, "\n"], + [4033, 0, " "], + [4034, 0, " "], + [4035, 0, " "], + [4036, 0, " "], + [4037, 0, "\\"], + [4038, 0, "e"], + [4039, 0, "x"], + [4040, 0, "i"], + [4041, 0, "s"], + [4042, 0, "t"], + [4043, 0, "s"], + [4044, 0, " "], + [390, 0, "\n"], + [391, 0, "\\"], + [392, 0, "r"], + [393, 0, "e"], + [394, 0, "n"], + [395, 0, "e"], + [396, 0, "w"], + [397, 0, "c"], + [398, 0, "o"], + [399, 0, "m"], + [400, 0, "m"], + [401, 0, "a"], + [402, 0, "n"], + [403, 0, "d"], + [404, 0, "{"], + [405, 0, "\\"], + [406, 0, "p"], + [407, 0, "r"], + [408, 0, "e"], + [409, 0, "d"], + [410, 0, "i"], + [411, 0, "a"], + [412, 0, "t"], + [413, 0, "e"], + [414, 0, "}"], + [415, 0, "["], + [416, 0, "1"], + [417, 0, "]"], + [418, 0, "{"], + [419, 0, "$"], + [420, 0, " "], + [421, 0, "#"], + [422, 0, "1"], + [423, 0, " "], + [424, 0, "$"], + [425, 0, "}"], + [426, 0, "\n"], + [390, 0, "\n"], + [391, 0, "$"], + [392, 0, " "], + [392, 1], + [391, 1], + [391, 0, "%"], + [392, 0, " "], + [393, 0, "F"], + [394, 0, "o"], + [395, 0, "r"], + [396, 0, " "], + [397, 0, "s"], + [398, 0, "e"], + [399, 0, "m"], + [400, 0, "a"], + [401, 0, "n"], + [402, 0, "t"], + [403, 0, "i"], + [404, 0, "c"], + [405, 0, " "], + [406, 0, "p"], + [407, 0, "a"], + [408, 0, "c"], + [409, 0, "k"], + [410, 0, "a"], + [411, 0, "g"], + [412, 0, "e"], + [413, 0, ","], + [414, 0, " "], + [415, 0, "u"], + [416, 0, "s"], + [417, 0, "e"], + [418, 0, " "], + [419, 0, "m"], + [420, 0, "a"], + [421, 0, "t"], + [422, 0, "h"], + [423, 0, " "], + [424, 0, "m"], + [425, 0, "o"], + [426, 0, "d"], + [427, 0, "e"], + [428, 0, " "], + [429, 0, "f"], + [430, 0, "o"], + [431, 0, "r"], + [432, 0, " "], + [433, 0, "a"], + [434, 0, "l"], + [435, 0, "l"], + [436, 0, " "], + [437, 0, "p"], + [438, 0, "r"], + [439, 0, "e"], + [440, 0, "m"], + [441, 0, "i"], + [442, 0, "s"], + [443, 0, "e"], + [444, 0, "s"], + [445, 0, " "], + [445, 1], + [444, 1], + [443, 1], + [442, 1], + [441, 1], + [440, 1], + [439, 1], + [438, 1], + [437, 1], + [436, 1], + [435, 1], + [434, 1], + [433, 1], + [432, 1], + [431, 1], + [430, 1], + [429, 1], + [428, 1], + [428, 0, " "], + [429, 0, "w"], + [430, 0, "i"], + [431, 0, "t"], + [432, 0, "h"], + [433, 0, "i"], + [434, 0, "n"], + [435, 0, " "], + [436, 0, "i"], + [437, 0, "n"], + [438, 0, "f"], + [439, 0, "e"], + [440, 0, "r"], + [441, 0, "e"], + [442, 0, "n"], + [443, 0, "c"], + [444, 0, "e"], + [445, 0, " "], + [446, 0, "r"], + [447, 0, "u"], + [448, 0, "l"], + [449, 0, "e"], + [450, 0, "s"], + [472, 0, "c"], + [4144, 0, "v"], + [4145, 0, "P"], + [4145, 1], + [4145, 0, "_"], + [4146, 0, "p"], + [4147, 0, ","], + [4148, 0, " "], + [4149, 0, "\\"], + [4150, 0, "m"], + [4151, 0, "a"], + [4152, 0, "t"], + [4153, 0, "h"], + [4154, 0, "i"], + [4155, 0, "t"], + [4156, 0, "{"], + [4157, 0, "n"], + [4158, 0, "e"], + [4159, 0, "x"], + [4160, 0, "t"], + [4161, 0, "}"], + [4162, 0, "."], + [4163, 0, " "], + [4164, 0, "A"], + [4165, 0, "("], + [4166, 0, "\\"], + [4167, 0, "m"], + [4168, 0, "a"], + [4169, 0, "t"], + [4170, 0, "h"], + [4171, 0, "i"], + [4172, 0, "t"], + [4173, 0, "{"], + [4174, 0, "p"], + [4175, 0, "r"], + [4176, 0, "e"], + [4177, 0, "v"], + [4178, 0, "}"], + [4179, 0, ")"], + [4180, 0, " "], + [4181, 0, "="], + [4182, 0, " "], + [4183, 0, "("], + [4184, 0, "v"], + [4185, 0, "_"], + [4186, 0, "p"], + [4187, 0, ","], + [4188, 0, " "], + [4189, 0, "\\"], + [4190, 0, "n"], + [4190, 1], + [4190, 0, "m"], + [4191, 0, "a"], + [4192, 0, "t"], + [4193, 0, "h"], + [4194, 0, "i"], + [4195, 0, "t"], + [4196, 0, "{"], + [4197, 0, "n"], + [4198, 0, "e"], + [4199, 0, "x"], + [4200, 0, "t"], + [4201, 0, "}"], + [4202, 0, ")"], + [4203, 0, " "], + [4204, 0, "&"], + [4205, 0, " "], + [4206, 0, "\\"], + [4207, 0, "m"], + [4208, 0, "a"], + [4209, 0, "t"], + [4210, 0, "h"], + [4211, 0, "i"], + [4212, 0, "t"], + [4213, 0, "{"], + [4214, 0, "i"], + [4215, 0, "d"], + [4216, 0, "}"], + [4217, 0, " "], + [4218, 0, "<"], + [4219, 0, " "], + [4220, 0, "\\"], + [4221, 0, "m"], + [4222, 0, "a"], + [4223, 0, "t"], + [4224, 0, "h"], + [4225, 0, "i"], + [4226, 0, "t"], + [4227, 0, "{"], + [4228, 0, "n"], + [4229, 0, "e"], + [4230, 0, "x"], + [4231, 0, "t"], + [4232, 0, "}"], + [4233, 0, "\n"], + [4234, 0, "}"], + [4235, 0, "{"], + [4236, 0, "\n"], + [4237, 0, " "], + [4238, 0, " "], + [4239, 0, " "], + [4240, 0, " "], + [4241, 0, "A"], + [4242, 0, ","], + [4243, 0, " "], + [4244, 0, "\\"], + [4245, 0, "m"], + [4246, 0, "a"], + [4247, 0, "t"], + [4248, 0, "h"], + [4249, 0, "r"], + [4250, 0, "m"], + [4251, 0, "{"], + [4252, 0, "a"], + [4253, 0, "p"], + [4254, 0, "p"], + [4255, 0, "l"], + [4256, 0, "y"], + [4257, 0, "}"], + [4258, 0, "("], + [4258, 1], + [4257, 1], + [4256, 1], + [4255, 1], + [4254, 1], + [4253, 1], + [4252, 1], + [4251, 1], + [4250, 1], + [4249, 1], + [4248, 1], + [4247, 1], + [4246, 1], + [4245, 1], + [4244, 1], + [4244, 0, "\\"], + [4245, 0, "m"], + [4246, 0, "a"], + [4247, 0, "t"], + [4248, 0, "h"], + [4249, 0, "s"], + [4250, 0, "f"], + [4251, 0, "{"], + [4252, 0, "i"], + [4253, 0, "n"], + [4254, 0, "s"], + [4255, 0, "e"], + [4256, 0, "r"], + [4257, 0, "t"], + [4258, 0, "}"], + [4259, 0, "("], + [4260, 0, "\\"], + [4261, 0, "m"], + [4262, 0, "a"], + [4263, 0, "t"], + [4264, 0, "h"], + [4265, 0, "i"], + [4266, 0, "t"], + [4267, 0, "{"], + [4268, 0, "i"], + [4269, 0, "d"], + [4270, 0, "}"], + [4271, 0, ","], + [4272, 0, " "], + [4273, 0, "\\"], + [4274, 0, "m"], + [4275, 0, "a"], + [4276, 0, "t"], + [4277, 0, "h"], + [4278, 0, "i"], + [4279, 0, "t"], + [4280, 0, "{"], + [4281, 0, "p"], + [4282, 0, "r"], + [4283, 0, "e"], + [4284, 0, "v"], + [4285, 0, "}"], + [4286, 0, ","], + [4287, 0, " "], + [4288, 0, "v"], + [4289, 0, ")"], + [4290, 0, " "], + [4291, 0, "="], + [4292, 0, "="], + [4293, 0, ">"], + [4294, 0, " "], + [4295, 0, "A"], + [4296, 0, "'"], + [4233, 0, " "], + [4234, 0, "&"], + [4235, 0, "\n"], + [4236, 0, " "], + [4237, 0, " "], + [4238, 0, " "], + [4239, 0, " "], + [4240, 0, "A"], + [4241, 0, ","], + [4242, 0, " "], + [4243, 0, "\\"], + [4244, 0, "m"], + [4245, 0, "a"], + [4246, 0, "t"], + [4247, 0, "h"], + [4248, 0, "s"], + [4249, 0, "f"], + [4250, 0, "{"], + [4251, 0, "i"], + [4252, 0, "n"], + [4253, 0, "s"], + [4254, 0, "e"], + [4255, 0, "r"], + [4256, 0, "t"], + [4257, 0, "}"], + [4258, 0, "("], + [4259, 0, "\\"], + [4260, 0, "m"], + [4261, 0, "a"], + [4262, 0, "t"], + [4263, 0, "h"], + [4264, 0, "i"], + [4265, 0, "t"], + [4266, 0, "{"], + [4267, 0, "i"], + [4268, 0, "d"], + [4269, 0, "}"], + [4270, 0, ","], + [4271, 0, " "], + [4272, 0, "\\"], + [4273, 0, "m"], + [4274, 0, "a"], + [4275, 0, "t"], + [4276, 0, "h"], + [4277, 0, "i"], + [4278, 0, "t"], + [4279, 0, "{"], + [4280, 0, "n"], + [4281, 0, "e"], + [4282, 0, "x"], + [4283, 0, "t"], + [4284, 0, "}"], + [4285, 0, ","], + [4286, 0, " "], + [4287, 0, "v"], + [4288, 0, ")"], + [4289, 0, " "], + [4290, 0, "="], + [4291, 0, "="], + [4292, 0, ">"], + [4293, 0, " "], + [4294, 0, "A"], + [4295, 0, "'"], + [4360, 0, "\n"], + [4361, 0, "}"], + [4163, 0, "\\"], + [4164, 0, ";"], + [4164, 1], + [4163, 1], + [4162, 1], + [4162, 0, " "], + [4163, 0, "\\"], + [4164, 0, "m"], + [4165, 0, "a"], + [4166, 0, "t"], + [4167, 0, "h"], + [4168, 0, "b"], + [4169, 0, "i"], + [4170, 0, "n"], + [4171, 0, "{"], + [4172, 0, ":"], + [4173, 0, "}"], + [4303, 1], + [4302, 1], + [4301, 1], + [4300, 1], + [4300, 0, " "], + [4301, 0, "\\"], + [4302, 0, "e"], + [4303, 0, "v"], + [4304, 0, "a"], + [4305, 0, "l"], + [4306, 0, "t"], + [4307, 0, "o"], + [4371, 1], + [4370, 1], + [4369, 1], + [4368, 1], + [4368, 0, " "], + [4369, 0, "\\"], + [4370, 0, "e"], + [4371, 0, "v"], + [4372, 0, "a"], + [4373, 0, "l"], + [4374, 0, "t"], + [4375, 0, "o"], + [572, 0, "{"], + [585, 0, "}"], + [488, 0, "\n"], + [489, 0, "\n"], + [490, 0, "\\"], + [491, 0, "n"], + [492, 0, "e"], + [493, 0, "w"], + [494, 0, "c"], + [495, 0, "o"], + [496, 0, "m"], + [497, 0, "m"], + [498, 0, "a"], + [499, 0, "n"], + [500, 0, "d"], + [501, 0, "{"], + [502, 0, "\\"], + [503, 0, "e"], + [504, 0, "v"], + [505, 0, "a"], + [506, 0, "l"], + [507, 0, "t"], + [508, 0, "o"], + [509, 0, "}"], + [510, 0, "{"], + [511, 0, "\\"], + [512, 0, "q"], + [513, 0, "u"], + [514, 0, "a"], + [515, 0, "d"], + [516, 0, "\\"], + [517, 0, "L"], + [518, 0, "o"], + [519, 0, "n"], + [520, 0, "g"], + [521, 0, "r"], + [522, 0, "i"], + [523, 0, "g"], + [524, 0, "h"], + [525, 0, "t"], + [526, 0, "a"], + [527, 0, "r"], + [528, 0, "r"], + [529, 0, "o"], + [530, 0, "w"], + [531, 0, "\\"], + [532, 0, "q"], + [533, 0, "u"], + [534, 0, "a"], + [535, 0, "d"], + [536, 0, "}"], + [515, 1], + [514, 1], + [513, 1], + [512, 1], + [512, 0, ";"], + [529, 1], + [529, 1], + [529, 1], + [529, 1], + [529, 0, ";"], + [452, 0, "%"], + [488, 1], + [487, 1], + [486, 1], + [485, 1], + [484, 1], + [483, 1], + [482, 1], + [481, 1], + [480, 1], + [479, 1], + [478, 1], + [477, 1], + [476, 1], + [475, 1], + [474, 1], + [473, 1], + [472, 1], + [471, 1], + [470, 1], + [469, 1], + [468, 1], + [467, 1], + [466, 1], + [465, 1], + [464, 1], + [463, 1], + [462, 1], + [461, 1], + [460, 1], + [459, 1], + [458, 1], + [457, 1], + [456, 1], + [455, 1], + [454, 1], + [453, 1], + [452, 1], + [451, 1], + [450, 1], + [449, 1], + [448, 1], + [447, 1], + [446, 1], + [445, 1], + [444, 1], + [443, 1], + [442, 1], + [441, 1], + [440, 1], + [439, 1], + [438, 1], + [437, 1], + [436, 1], + [435, 1], + [434, 1], + [433, 1], + [432, 1], + [431, 1], + [430, 1], + [429, 1], + [428, 1], + [427, 1], + [426, 1], + [425, 1], + [424, 1], + [423, 1], + [422, 1], + [421, 1], + [420, 1], + [419, 1], + [418, 1], + [417, 1], + [416, 1], + [415, 1], + [414, 1], + [413, 1], + [412, 1], + [411, 1], + [410, 1], + [409, 1], + [408, 1], + [407, 1], + [406, 1], + [405, 1], + [404, 1], + [403, 1], + [402, 1], + [401, 1], + [400, 1], + [399, 1], + [398, 1], + [397, 1], + [396, 1], + [395, 1], + [394, 1], + [393, 1], + [392, 1], + [391, 1], + [390, 1], + [389, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 0, "m"], + [182, 0, "a"], + [183, 0, "t"], + [184, 0, "h"], + [185, 0, "p"], + [186, 0, "a"], + [187, 0, "r"], + [188, 0, "t"], + [189, 0, "i"], + [190, 0, "t"], + [190, 1], + [190, 0, "r"], + [4069, 1], + [4068, 1], + [4067, 1], + [4066, 1], + [4066, 0, "r"], + [4067, 0, "u"], + [4068, 0, "l"], + [4069, 0, "e"], + [4163, 1], + [4163, 0, "\\"], + [4164, 0, "\\"], + [4165, 0, "\n"], + [4166, 0, " "], + [4167, 0, " "], + [4168, 0, " "], + [4169, 0, " "], + [4169, 1], + [4198, 1], + [4198, 0, "\\"], + [4199, 0, "\\"], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 1], + [181, 0, "b"], + [182, 0, "u"], + [183, 0, "s"], + [184, 0, "s"], + [185, 0, "p"], + [186, 0, "r"], + [187, 0, "o"], + [188, 0, "o"], + [189, 0, "f"], + [190, 0, "s"], + [191, 0, "q"], + [191, 1], + [4044, 0, "\n"], + [4044, 1], + [4060, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "b"], + [4062, 0, "e"], + [4063, 0, "g"], + [4064, 0, "i"], + [4065, 0, "n"], + [4066, 0, "{"], + [4067, 0, "p"], + [4068, 0, "r"], + [4069, 0, "o"], + [4070, 0, "o"], + [4071, 0, "f"], + [4072, 0, "t"], + [4073, 0, "r"], + [4074, 0, "e"], + [4075, 0, "e"], + [4076, 0, "}"], + [4096, 1], + [4095, 1], + [4094, 1], + [4093, 1], + [4092, 1], + [4091, 1], + [4090, 1], + [4089, 1], + [4088, 1], + [4087, 1], + [4086, 1], + [4085, 1], + [4084, 1], + [4083, 1], + [4082, 1], + [4081, 1], + [4080, 1], + [4079, 1], + [4078, 1], + [4078, 1], + [4078, 1], + [4078, 1], + [4078, 1], + [4078, 1], + [4078, 0, " "], + [4079, 0, " "], + [4080, 0, " "], + [4081, 0, " "], + [4082, 0, "\\"], + [4083, 0, "A"], + [4084, 0, "x"], + [4085, 0, "i"], + [4086, 0, "o"], + [4087, 0, "m"], + [4088, 0, "C"], + [4089, 0, "{"], + [4090, 0, "$"], + [4171, 1], + [4170, 1], + [4169, 1], + [4169, 0, "}"], + [4175, 0, "\\"], + [4176, 0, "A"], + [4177, 0, "x"], + [4178, 0, "i"], + [4179, 0, "o"], + [4180, 0, "m"], + [4181, 0, "C"], + [4182, 0, "{"], + [4212, 1], + [4211, 1], + [4210, 1], + [4210, 0, "}"], + [4216, 0, "\\"], + [4217, 0, "A"], + [4218, 0, "x"], + [4219, 0, "i"], + [4220, 0, "o"], + [4221, 0, "m"], + [4222, 0, "C"], + [4223, 0, "{"], + [4284, 0, "}"], + [4284, 0, "$"], + [4224, 0, "$"], + [4183, 0, "$"], + [4211, 0, "$"], + [4291, 1], + [4290, 1], + [4290, 0, " "], + [4291, 0, " "], + [4292, 0, " "], + [4293, 0, " "], + [4294, 0, "\\"], + [4295, 0, "T"], + [4296, 0, "r"], + [4297, 0, "i"], + [4298, 0, "n"], + [4299, 0, "a"], + [4300, 0, "r"], + [4301, 0, "y"], + [4302, 0, "I"], + [4303, 0, "n"], + [4304, 0, "f"], + [4305, 0, "C"], + [4306, 0, "{"], + [4307, 1], + [4307, 1], + [4307, 1], + [4307, 1], + [4307, 1], + [4307, 0, "$"], + [4368, 0, "$"], + [4369, 0, "}"], + [4371, 1], + [4371, 0, "\\"], + [4372, 0, "e"], + [4373, 0, "n"], + [4374, 0, "d"], + [4375, 0, "{"], + [4376, 0, "p"], + [4377, 0, "r"], + [4378, 0, "o"], + [4379, 0, "o"], + [4380, 0, "f"], + [4381, 0, "t"], + [4382, 0, "r"], + [4383, 0, "e"], + [4384, 0, "e"], + [4385, 0, "}"], + [4169, 0, "$"], + [4128, 1], + [4127, 1], + [4126, 1], + [4125, 1], + [4124, 1], + [4123, 1], + [4122, 1], + [4121, 1], + [4120, 1], + [4119, 1], + [4118, 1], + [4117, 1], + [4117, 0, "."], + [4118, 0, "\\"], + [4119, 0, ";"], + [4281, 0, "\n"], + [4282, 0, " "], + [4283, 0, " "], + [4284, 0, " "], + [4285, 0, " "], + [4286, 0, "\\"], + [4287, 0, "L"], + [4288, 0, "e"], + [4289, 0, "f"], + [4290, 0, "t"], + [4291, 0, "L"], + [4292, 0, "a"], + [4293, 0, "b"], + [4294, 0, "e"], + [4295, 0, "l"], + [4296, 0, "{"], + [4297, 0, "\\"], + [4298, 0, "t"], + [4299, 0, "e"], + [4300, 0, "x"], + [4301, 0, "t"], + [4302, 0, "s"], + [4303, 0, "c"], + [4304, 0, "{"], + [4305, 0, "I"], + [4306, 0, "n"], + [4307, 0, "s"], + [4308, 0, "e"], + [4309, 0, "r"], + [4310, 0, "t"], + [4311, 0, "}"], + [4312, 0, "}"], + [4059, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "b"], + [4062, 0, "e"], + [4063, 0, "g"], + [4064, 0, "i"], + [4065, 0, "n"], + [4066, 0, "{"], + [4067, 0, "p"], + [4068, 0, "r"], + [4069, 0, "o"], + [4070, 0, "o"], + [4071, 0, "f"], + [4072, 0, "t"], + [4073, 0, "r"], + [4074, 0, "e"], + [4075, 0, "e"], + [4076, 0, "}"], + [4077, 0, "\n"], + [4078, 0, "}"], + [4078, 1], + [4078, 0, "\\"], + [4079, 0, "e"], + [4080, 0, "n"], + [4081, 0, "d"], + [4082, 0, "{"], + [4083, 0, "p"], + [4084, 0, "r"], + [4085, 0, "o"], + [4086, 0, "o"], + [4087, 0, "f"], + [4088, 0, "t"], + [4089, 0, "r"], + [4090, 0, "e"], + [4091, 0, "e"], + [4092, 0, "}"], + [4093, 0, "\n"], + [4077, 0, "\n"], + [4078, 0, " "], + [4079, 0, " "], + [4080, 0, " "], + [4081, 0, " "], + [4082, 0, "\\"], + [4083, 0, "A"], + [4084, 0, "x"], + [4085, 0, "i"], + [4086, 0, "o"], + [4087, 0, "m"], + [4088, 0, "C"], + [4089, 0, "{"], + [4090, 0, "$"], + [4091, 0, "\\"], + [4092, 0, "e"], + [4093, 0, "x"], + [4094, 0, "i"], + [4095, 0, "s"], + [4096, 0, "t"], + [4097, 0, "s"], + [4098, 0, " "], + [4099, 0, "v"], + [4100, 0, "_"], + [4101, 0, "p"], + [4102, 0, ","], + [4103, 0, " "], + [4104, 0, "\\"], + [4105, 0, "m"], + [4106, 0, "a"], + [4107, 0, "t"], + [4108, 0, "h"], + [4109, 0, "i"], + [4110, 0, "t"], + [4111, 0, "{"], + [4112, 0, "n"], + [4113, 0, "e"], + [4114, 0, "x"], + [4115, 0, "t"], + [4116, 0, "}"], + [4117, 0, "."], + [4118, 0, "\\"], + [4119, 0, ";"], + [4120, 0, " "], + [4121, 0, "A"], + [4122, 0, "("], + [4123, 0, "\\"], + [4124, 0, "m"], + [4125, 0, "a"], + [4126, 0, "t"], + [4127, 0, "h"], + [4128, 0, "i"], + [4129, 0, "t"], + [4130, 0, "{"], + [4131, 0, "p"], + [4132, 0, "r"], + [4133, 0, "e"], + [4134, 0, "v"], + [4135, 0, "}"], + [4136, 0, ")"], + [4137, 0, " "], + [4138, 0, "="], + [4139, 0, " "], + [4140, 0, "("], + [4141, 0, "v"], + [4142, 0, "_"], + [4143, 0, "p"], + [4144, 0, ","], + [4145, 0, " "], + [4146, 0, "\\"], + [4147, 0, "m"], + [4148, 0, "a"], + [4149, 0, "t"], + [4150, 0, "h"], + [4151, 0, "i"], + [4152, 0, "t"], + [4153, 0, "{"], + [4154, 0, "n"], + [4155, 0, "e"], + [4156, 0, "x"], + [4157, 0, "t"], + [4158, 0, "}"], + [4159, 0, ")"], + [4160, 0, "$"], + [4161, 0, "}"], + [4162, 0, "\n"], + [4163, 0, " "], + [4164, 0, " "], + [4165, 0, " "], + [4166, 0, " "], + [4167, 0, "\\"], + [4168, 0, "A"], + [4169, 0, "x"], + [4170, 0, "i"], + [4171, 0, "o"], + [4172, 0, "m"], + [4173, 0, "C"], + [4174, 0, "{"], + [4175, 0, "$"], + [4176, 0, "\\"], + [4177, 0, "m"], + [4178, 0, "a"], + [4179, 0, "t"], + [4180, 0, "h"], + [4181, 0, "i"], + [4182, 0, "t"], + [4183, 0, "{"], + [4184, 0, "n"], + [4185, 0, "e"], + [4186, 0, "x"], + [4187, 0, "t"], + [4188, 0, "}"], + [4189, 0, " "], + [4190, 0, "<"], + [4191, 0, " "], + [4192, 0, "\\"], + [4193, 0, "m"], + [4194, 0, "a"], + [4195, 0, "t"], + [4196, 0, "h"], + [4197, 0, "i"], + [4198, 0, "t"], + [4199, 0, "{"], + [4200, 0, "i"], + [4201, 0, "d"], + [4202, 0, "}"], + [4203, 0, "$"], + [4204, 0, "}"], + [4205, 0, "\n"], + [4206, 0, " "], + [4207, 0, " "], + [4208, 0, " "], + [4209, 0, " "], + [4210, 0, "\\"], + [4211, 0, "L"], + [4212, 0, "e"], + [4213, 0, "f"], + [4214, 0, "t"], + [4215, 0, "L"], + [4216, 0, "a"], + [4217, 0, "b"], + [4218, 0, "e"], + [4219, 0, "l"], + [4220, 0, "{"], + [4221, 0, "\\"], + [4221, 0, "$"], + [4223, 0, "m"], + [4224, 0, "a"], + [4225, 0, "t"], + [4226, 0, "h"], + [4227, 0, "s"], + [4228, 0, "c"], + [4229, 0, "{"], + [4230, 0, "I"], + [4231, 0, "n"], + [4232, 0, "s"], + [4233, 0, "}"], + [4234, 0, "_"], + [4235, 0, "1"], + [4236, 0, "$"], + [4237, 0, "}"], + [4238, 0, "\n"], + [4239, 0, " "], + [4240, 0, " "], + [4241, 0, " "], + [4242, 0, " "], + [4243, 0, "\\"], + [4244, 0, "B"], + [4245, 0, "i"], + [4246, 0, "n"], + [4247, 0, "a"], + [4248, 0, "r"], + [4249, 0, "y"], + [4250, 0, "I"], + [4251, 0, "n"], + [4252, 0, "f"], + [4253, 0, "C"], + [4254, 0, "{"], + [4255, 0, "$"], + [4256, 0, "A"], + [4257, 0, ","], + [4258, 0, " "], + [4259, 0, "\\"], + [4260, 0, "m"], + [4261, 0, "a"], + [4262, 0, "t"], + [4263, 0, "h"], + [4264, 0, "s"], + [4265, 0, "f"], + [4266, 0, "{"], + [4267, 0, "i"], + [4268, 0, "n"], + [4269, 0, "s"], + [4270, 0, "e"], + [4271, 0, "r"], + [4272, 0, "t"], + [4273, 0, "}"], + [4274, 0, "("], + [4275, 0, "\\"], + [4276, 0, "m"], + [4277, 0, "a"], + [4278, 0, "t"], + [4279, 0, "h"], + [4280, 0, "i"], + [4281, 0, "t"], + [4282, 0, "{"], + [4283, 0, "i"], + [4284, 0, "d"], + [4285, 0, "}"], + [4286, 0, ","], + [4287, 0, " "], + [4288, 0, "\\"], + [4289, 0, "m"], + [4290, 0, "a"], + [4291, 0, "t"], + [4292, 0, "h"], + [4293, 0, "i"], + [4294, 0, "t"], + [4295, 0, "{"], + [4296, 0, "p"], + [4297, 0, "r"], + [4298, 0, "e"], + [4299, 0, "v"], + [4300, 0, "}"], + [4301, 0, ","], + [4302, 0, " "], + [4303, 0, "v"], + [4304, 0, ")"], + [4305, 0, " "], + [4306, 0, "\\"], + [4307, 0, "e"], + [4308, 0, "v"], + [4309, 0, "a"], + [4310, 0, "l"], + [4311, 0, "t"], + [4312, 0, "o"], + [4313, 0, " "], + [4313, 1], + [4313, 0, "\n"], + [4314, 0, " "], + [4315, 0, " "], + [4316, 0, " "], + [4317, 0, " "], + [4318, 0, " "], + [4319, 0, " "], + [4320, 0, " "], + [4321, 0, " "], + [4577, 0, "$"], + [4582, 1], + [4581, 1], + [4580, 1], + [4579, 1], + [4579, 0, "m"], + [4580, 0, "a"], + [4581, 0, "t"], + [4582, 0, "h"], + [4591, 1], + [4590, 1], + [4589, 1], + [4590, 0, "_"], + [4591, 0, "2"], + [4592, 0, "$"], + [4322, 0, "A"], + [4323, 0, "["], + [4324, 0, "\\"], + [4325, 0, ","], + [4326, 0, "\\"], + [4327, 0, "m"], + [4328, 0, "a"], + [4329, 0, "t"], + [4330, 0, "h"], + [4331, 0, "i"], + [4332, 0, "t"], + [4333, 0, "{"], + [4334, 0, "p"], + [4335, 0, "r"], + [4336, 0, "e"], + [4337, 0, "v"], + [4338, 0, "}"], + [4339, 0, " "], + [4340, 0, "\\"], + [4341, 0, "m"], + [4342, 0, "a"], + [4343, 0, "p"], + [4344, 0, "s"], + [4345, 0, "t"], + [4346, 0, "o"], + [4347, 0, " "], + [4348, 0, "("], + [4349, 0, "v"], + [4350, 0, "_"], + [4351, 0, "p"], + [4352, 0, ","], + [4353, 0, " "], + [4354, 0, "\\"], + [4355, 0, "m"], + [4356, 0, "a"], + [4357, 0, "t"], + [4358, 0, "h"], + [4359, 0, "i"], + [4360, 0, "t"], + [4361, 0, "{"], + [4362, 0, "i"], + [4363, 0, "d"], + [4364, 0, "}"], + [4365, 0, ")"], + [4366, 0, ","], + [4367, 0, "\\"], + [4368, 0, ";"], + [4369, 0, " "], + [4370, 0, "\\"], + [4371, 0, "m"], + [4372, 0, "a"], + [4373, 0, "t"], + [4374, 0, "h"], + [4375, 0, "i"], + [4376, 0, "t"], + [4377, 0, "{"], + [4378, 0, "i"], + [4379, 0, "d"], + [4380, 0, "}"], + [4381, 0, " "], + [4382, 0, "\\"], + [4383, 0, "m"], + [4384, 0, "a"], + [4385, 0, "p"], + [4386, 0, "s"], + [4387, 0, "t"], + [4388, 0, "o"], + [4389, 0, " "], + [4390, 0, "("], + [4391, 0, "v"], + [4392, 0, ","], + [4393, 0, " "], + [4394, 0, "\\"], + [4395, 0, "m"], + [4396, 0, "a"], + [4397, 0, "t"], + [4398, 0, "h"], + [4399, 0, "i"], + [4400, 0, "t"], + [4401, 0, "{"], + [4402, 0, "n"], + [4403, 0, "e"], + [4404, 0, "x"], + [4405, 0, "t"], + [4406, 0, "}"], + [4407, 0, ")"], + [4408, 0, "\\"], + [4409, 0, ","], + [4410, 0, "]"], + [4411, 0, "}"], + [4226, 1], + [4225, 1], + [4224, 1], + [4223, 1], + [4223, 0, "t"], + [4224, 0, "e"], + [4225, 0, "x"], + [4226, 0, "t"], + [4672, 1], + [4671, 1], + [4670, 1], + [4669, 1], + [4669, 0, "t"], + [4670, 0, "e"], + [4671, 0, "x"], + [4672, 0, "t"], + [4411, 0, "$"], + [4491, 1], + [4490, 1], + [4489, 1], + [4488, 1], + [4487, 1], + [4486, 1], + [4485, 1], + [4484, 1], + [4483, 1], + [4482, 1], + [4481, 1], + [4480, 1], + [4479, 1], + [4478, 1], + [4477, 1], + [4476, 1], + [4475, 1], + [4474, 1], + [4473, 1], + [4472, 1], + [4471, 1], + [4470, 1], + [4469, 1], + [4468, 1], + [4467, 1], + [4466, 1], + [4465, 1], + [4464, 1], + [4463, 1], + [4462, 1], + [4120, 1], + [4119, 1], + [4118, 1], + [4117, 1], + [4116, 1], + [4115, 1], + [4114, 1], + [4113, 1], + [4112, 1], + [4111, 1], + [4110, 1], + [4109, 1], + [4108, 1], + [4107, 1], + [4106, 1], + [4105, 1], + [4104, 1], + [4103, 1], + [4102, 1], + [4101, 1], + [4100, 1], + [4099, 1], + [4098, 1], + [4097, 1], + [4096, 1], + [4095, 1], + [4094, 1], + [4093, 1], + [4092, 1], + [4091, 1], + [4200, 0, "A"], + [4201, 0, "p"], + [4202, 0, "p"], + [4203, 0, "l"], + [4204, 0, "y"], + [4205, 0, "-"], + [4623, 0, "A"], + [4624, 0, "p"], + [4625, 0, "p"], + [4626, 0, "l"], + [4627, 0, "y"], + [4628, 0, "-"], + [4734, 0, "\n"], + [4735, 0, "\n"], + [4736, 0, "\\"], + [4737, 0, "b"], + [4738, 0, "e"], + [4739, 0, "g"], + [4740, 0, "i"], + [4741, 0, "n"], + [4742, 0, "{"], + [4743, 0, "p"], + [4744, 0, "r"], + [4745, 0, "o"], + [4746, 0, "o"], + [4747, 0, "f"], + [4748, 0, "t"], + [4749, 0, "r"], + [4750, 0, "e"], + [4751, 0, "e"], + [4752, 0, "}"], + [4753, 0, "\n"], + [4754, 0, "\\"], + [4755, 0, "e"], + [4756, 0, "n"], + [4757, 0, "d"], + [4758, 0, "{"], + [4759, 0, "p"], + [4760, 0, "r"], + [4761, 0, "o"], + [4762, 0, "o"], + [4763, 0, "f"], + [4764, 0, "t"], + [4765, 0, "r"], + [4766, 0, "e"], + [4767, 0, "e"], + [4768, 0, "}"], + [4753, 0, "\n"], + [4754, 0, " "], + [4755, 0, " "], + [4756, 0, " "], + [4757, 0, " "], + [4758, 0, "\\"], + [4759, 0, "A"], + [4760, 0, "x"], + [4761, 0, "i"], + [4762, 0, "o"], + [4763, 0, "m"], + [4764, 0, "C"], + [4765, 0, "{"], + [4766, 0, "$"], + [4767, 0, "A"], + [4768, 0, "("], + [4769, 0, "\\"], + [4770, 0, "m"], + [4771, 0, "a"], + [4772, 0, "t"], + [4773, 0, "h"], + [4774, 0, "i"], + [4775, 0, "t"], + [4776, 0, "{"], + [4777, 0, "t"], + [4778, 0, "a"], + [4779, 0, "r"], + [4780, 0, "g"], + [4781, 0, "e"], + [4782, 0, "t"], + [4783, 0, "}"], + [4784, 0, ")"], + [4785, 0, " "], + [4786, 0, "="], + [4787, 0, " "], + [4788, 0, "("], + [4789, 0, "v"], + [4790, 0, ","], + [4791, 0, " "], + [4792, 0, "\\"], + [4793, 0, "m"], + [4794, 0, "a"], + [4795, 0, "t"], + [4796, 0, "h"], + [4797, 0, "i"], + [4798, 0, "t"], + [4799, 0, "{"], + [4800, 0, "n"], + [4801, 0, "e"], + [4802, 0, "x"], + [4803, 0, "t"], + [4804, 0, "}"], + [4805, 0, ")"], + [4806, 0, "$"], + [4807, 0, "}"], + [4808, 0, "\n"], + [4809, 0, " "], + [4810, 0, " "], + [4811, 0, " "], + [4812, 0, " "], + [4813, 0, "\\"], + [4814, 0, "L"], + [4815, 0, "e"], + [4816, 0, "f"], + [4817, 0, "t"], + [4818, 0, "L"], + [4819, 0, "a"], + [4820, 0, "b"], + [4821, 0, "e"], + [4822, 0, "l"], + [4823, 0, "{"], + [4824, 0, "$"], + [4825, 0, "\\"], + [4826, 0, "t"], + [4827, 0, "e"], + [4828, 0, "x"], + [4829, 0, "t"], + [4830, 0, "s"], + [4831, 0, "c"], + [4832, 0, "{"], + [4833, 0, "A"], + [4834, 0, "p"], + [4835, 0, "p"], + [4836, 0, "l"], + [4837, 0, "y"], + [4838, 0, "-"], + [4839, 0, "D"], + [4840, 0, "e"], + [4841, 0, "l"], + [4842, 0, "}"], + [4843, 0, "$"], + [4843, 1], + [4824, 1], + [4842, 0, "}"], + [4843, 0, "\n"], + [4844, 0, " "], + [4845, 0, " "], + [4846, 0, " "], + [4847, 0, " "], + [4848, 0, "\\"], + [4849, 0, "U"], + [4850, 0, "n"], + [4851, 0, "a"], + [4852, 0, "r"], + [4853, 0, "y"], + [4854, 0, "I"], + [4855, 0, "n"], + [4856, 0, "f"], + [4857, 0, "C"], + [4858, 0, "{"], + [4859, 0, "$"], + [4860, 0, "A"], + [4861, 0, ","], + [4862, 0, " "], + [4863, 0, "\\"], + [4864, 0, "a"], + [4865, 0, "m"], + [4865, 1], + [4864, 1], + [4864, 0, "m"], + [4865, 0, "a"], + [4866, 0, "t"], + [4867, 0, "h"], + [4868, 0, "s"], + [4869, 0, "f"], + [4870, 0, "{"], + [4871, 0, "d"], + [4872, 0, "e"], + [4873, 0, "l"], + [4874, 0, "e"], + [4875, 0, "t"], + [4876, 0, "e"], + [4877, 0, "}"], + [4878, 0, "("], + [4879, 0, "\\"], + [4880, 0, "m"], + [4881, 0, "a"], + [4882, 0, "t"], + [4883, 0, "h"], + [4884, 0, "i"], + [4885, 0, "d"], + [4885, 1], + [4885, 0, "t"], + [4886, 0, "{"], + [4887, 0, "i"], + [4888, 0, "d"], + [4889, 0, "}"], + [4890, 0, ","], + [4891, 0, " "], + [4892, 0, "\\"], + [4893, 0, "m"], + [4894, 0, "a"], + [4895, 0, "t"], + [4896, 0, "h"], + [4897, 0, "i"], + [4898, 0, "t"], + [4899, 0, "{"], + [4900, 0, "t"], + [4901, 0, "a"], + [4902, 0, "r"], + [4903, 0, "g"], + [4904, 0, "e"], + [4905, 0, "t"], + [4906, 0, "}"], + [4907, 0, ")"], + [4908, 0, " "], + [4909, 0, "\\"], + [4910, 0, "e"], + [4911, 0, "v"], + [4912, 0, "a"], + [4913, 0, "l"], + [4914, 0, "t"], + [4915, 0, "o"], + [4916, 0, " "], + [4916, 1], + [4916, 0, "\n"], + [4917, 0, " "], + [4918, 0, " "], + [4919, 0, " "], + [4920, 0, " "], + [4921, 0, " "], + [4922, 0, " "], + [4923, 0, " "], + [4924, 0, " "], + [4925, 0, "A"], + [4926, 0, "["], + [4927, 0, "\\"], + [4928, 0, ","], + [4929, 0, "\\"], + [4930, 0, "m"], + [4931, 0, "a"], + [4932, 0, "t"], + [4933, 0, "h"], + [4934, 0, "i"], + [4935, 0, "t"], + [4936, 0, "{"], + [4937, 0, "t"], + [4938, 0, "a"], + [4939, 0, "r"], + [4940, 0, "g"], + [4941, 0, "e"], + [4942, 0, "t"], + [4943, 0, "}"], + [4944, 0, " "], + [4945, 0, "\\"], + [4946, 0, "m"], + [4947, 0, "a"], + [4948, 0, "p"], + [4949, 0, "s"], + [4950, 0, "t"], + [4951, 0, "o"], + [4952, 0, " "], + [4953, 0, "("], + [4954, 0, "\\"], + [4955, 0, "b"], + [4956, 0, "o"], + [4957, 0, "t"], + [4958, 0, ","], + [4959, 0, " "], + [4960, 0, "\\"], + [4961, 0, "m"], + [4962, 0, "a"], + [4963, 0, "t"], + [4964, 0, "h"], + [4965, 0, "i"], + [4966, 0, "t"], + [4967, 0, "{"], + [4968, 0, "n"], + [4969, 0, "e"], + [4970, 0, "x"], + [4971, 0, "t"], + [4972, 0, "}"], + [4973, 0, ")"], + [4974, 0, "\\"], + [4975, 0, ","], + [4976, 0, "]"], + [4977, 0, "$"], + [4978, 0, "}"], + [4110, 0, "\\"], + [4111, 0, "m"], + [4112, 0, "a"], + [4113, 0, "t"], + [4114, 0, "h"], + [4115, 0, "s"], + [4116, 0, "f"], + [4117, 0, "{"], + [4118, 0, "l"], + [4119, 0, "i"], + [4120, 0, "s"], + [4121, 0, "t"], + [4122, 0, "E"], + [4123, 0, "l"], + [4124, 0, "}"], + [4339, 0, "\\"], + [4340, 0, "m"], + [4341, 0, "a"], + [4342, 0, "t"], + [4343, 0, "h"], + [4344, 0, "s"], + [4345, 0, "f"], + [4346, 0, "{"], + [4347, 0, "l"], + [4348, 0, "i"], + [4349, 0, "s"], + [4350, 0, "t"], + [4351, 0, "E"], + [4352, 0, "l"], + [4353, 0, "}"], + [4375, 1], + [4375, 0, "\n"], + [4376, 0, " "], + [4377, 0, " "], + [4378, 0, " "], + [4379, 0, " "], + [4380, 0, " "], + [4381, 0, " "], + [4382, 0, " "], + [4383, 0, " "], + [4404, 0, "\\"], + [4405, 0, "m"], + [4406, 0, "a"], + [4407, 0, "t"], + [4408, 0, "h"], + [4409, 0, "s"], + [4410, 0, "f"], + [4411, 0, "{"], + [4412, 0, "l"], + [4413, 0, "i"], + [4414, 0, "s"], + [4415, 0, "t"], + [4416, 0, "E"], + [4417, 0, "l"], + [4418, 0, "}"], + [4510, 0, "\\"], + [4511, 0, "m"], + [4512, 0, "a"], + [4513, 0, "t"], + [4514, 0, "h"], + [4515, 0, "s"], + [4516, 0, "f"], + [4517, 0, "{"], + [4518, 0, "l"], + [4519, 0, "i"], + [4520, 0, "s"], + [4521, 0, "t"], + [4522, 0, "E"], + [4523, 0, "l"], + [4524, 0, "}"], + [4856, 0, "\\"], + [4857, 0, "m"], + [4858, 0, "a"], + [4859, 0, "t"], + [4860, 0, "h"], + [4861, 0, "s"], + [4862, 0, "f"], + [4863, 0, "{"], + [4864, 0, "l"], + [4865, 0, "i"], + [4866, 0, "s"], + [4867, 0, "t"], + [4868, 0, "E"], + [4869, 0, "l"], + [4870, 0, "}"], + [5036, 0, "\\"], + [5037, 0, "m"], + [5038, 0, "a"], + [5039, 0, "t"], + [5040, 0, "h"], + [5041, 0, "s"], + [5042, 0, "f"], + [5043, 0, "{"], + [5044, 0, "l"], + [5045, 0, "i"], + [5046, 0, "s"], + [5047, 0, "t"], + [5048, 0, "E"], + [5049, 0, "l"], + [5050, 0, "}"], + [4059, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "b"], + [4062, 0, "e"], + [4063, 0, "g"], + [4064, 0, "i"], + [4065, 0, "n"], + [4065, 1], + [4064, 1], + [4063, 1], + [4062, 1], + [4061, 1], + [4060, 1], + [4060, 0, "\\"], + [4061, 0, "A"], + [4062, 0, "x"], + [4063, 0, "i"], + [4064, 0, "o"], + [4065, 0, "m"], + [4066, 0, "C"], + [4067, 0, "{"], + [4068, 0, "$"], + [4068, 1], + [4067, 1], + [4066, 1], + [4065, 1], + [4064, 1], + [4063, 1], + [4062, 1], + [4061, 1], + [4060, 1], + [4059, 1], + [4237, 1], + [4236, 1], + [4235, 1], + [4235, 0, "T"], + [4236, 0, "r"], + [4237, 0, "i"], + [4238, 0, "n"], + [4077, 0, "\n"], + [4078, 0, " "], + [4079, 0, " "], + [4080, 0, " "], + [4081, 0, " "], + [4082, 0, "\\"], + [4083, 0, "A"], + [4084, 0, "x"], + [4085, 0, "i"], + [4086, 0, "o"], + [4087, 0, "m"], + [4088, 0, "C"], + [4089, 0, "{"], + [4090, 0, "$"], + [4091, 0, "\\"], + [4092, 0, "m"], + [4093, 0, "a"], + [4094, 0, "t"], + [4095, 0, "h"], + [4096, 0, "i"], + [4097, 0, "t"], + [4098, 0, "{"], + [4099, 0, "i"], + [4100, 0, "d"], + [4101, 0, "}"], + [4102, 0, " "], + [4103, 0, "\\"], + [4104, 0, "n"], + [4105, 0, "o"], + [4106, 0, "t"], + [4107, 0, "\\"], + [4108, 0, "i"], + [4109, 0, "n"], + [4110, 0, " "], + [4111, 0, "\\"], + [4112, 0, "m"], + [4113, 0, "a"], + [4114, 0, "t"], + [4115, 0, "h"], + [4116, 0, "r"], + [4117, 0, "m"], + [4118, 0, "("], + [4118, 1], + [4118, 0, "{"], + [4119, 0, "d"], + [4120, 0, "o"], + [4121, 0, "m"], + [4122, 0, "}"], + [4123, 0, "("], + [4124, 0, "A"], + [4125, 0, ")"], + [4126, 0, "$"], + [4127, 0, "}"], + [4059, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "b"], + [4062, 0, "e"], + [4063, 0, "g"], + [4064, 0, "i"], + [4065, 0, "n"], + [4066, 0, "{"], + [4067, 0, "p"], + [4068, 0, "r"], + [4069, 0, "o"], + [4070, 0, "o"], + [4071, 0, "f"], + [4072, 0, "t"], + [4073, 0, "r"], + [4074, 0, "e"], + [4075, 0, "e"], + [4076, 0, "}"], + [4077, 0, "\n"], + [4078, 0, "\\"], + [4079, 0, "e"], + [4080, 0, "n"], + [4081, 0, "d"], + [4082, 0, "{"], + [4083, 0, "p"], + [4084, 0, "r"], + [4085, 0, "o"], + [4086, 0, "o"], + [4087, 0, "f"], + [4088, 0, "t"], + [4089, 0, "r"], + [4090, 0, "e"], + [4091, 0, "e"], + [4092, 0, "}"], + [4093, 0, "\n"], + [4077, 0, "\n"], + [4078, 0, " "], + [4079, 0, " "], + [4080, 0, " "], + [4081, 0, " "], + [4082, 0, "\\"], + [4083, 0, "L"], + [4084, 0, "e"], + [4085, 0, "f"], + [4086, 0, "t"], + [4087, 0, "L"], + [4088, 0, "a"], + [4089, 0, "b"], + [4090, 0, "e"], + [4091, 0, "l"], + [4092, 0, "{"], + [4093, 0, "\\"], + [4094, 0, "t"], + [4095, 0, "e"], + [4096, 0, "x"], + [4097, 0, "t"], + [4098, 0, "s"], + [4099, 0, "c"], + [4100, 0, "{"], + [4101, 0, "A"], + [4102, 0, "p"], + [4103, 0, "p"], + [4104, 0, "l"], + [4105, 0, "y"], + [4106, 0, "-"], + [4107, 0, "T"], + [4108, 0, "S"], + [4109, 0, "}"], + [4110, 0, "}"], + [4111, 0, "\n"], + [4112, 0, " "], + [4113, 0, " "], + [4114, 0, " "], + [4115, 0, " "], + [4116, 0, "\\"], + [4117, 0, "U"], + [4118, 0, "N"], + [4119, 0, "a"], + [4120, 0, "r"], + [4077, 0, "\n"], + [4078, 0, " "], + [4079, 0, " "], + [4080, 0, " "], + [4081, 0, " "], + [4082, 0, "\\"], + [4083, 0, "A"], + [4084, 0, "x"], + [4085, 0, "i"], + [4086, 0, "o"], + [4087, 0, "m"], + [4088, 0, "C"], + [4089, 0, "{"], + [4090, 0, "}"], + [4134, 1], + [4133, 1], + [4132, 1], + [4132, 0, "n"], + [4133, 0, "a"], + [4134, 0, "r"], + [4135, 0, "y"], + [4136, 0, "I"], + [4137, 0, "n"], + [4138, 0, "f"], + [4139, 0, "C"], + [4140, 0, "{"], + [4141, 0, "$"], + [4142, 0, "$"], + [4143, 0, "}"], + [4142, 0, "A"], + [4143, 0, ","], + [4144, 0, " "], + [4145, 0, "\\"], + [4146, 0, "m"], + [4147, 0, "a"], + [4148, 0, "t"], + [4149, 0, "h"], + [4150, 0, "s"], + [4151, 0, "f"], + [4152, 0, "{"], + [4153, 0, "t"], + [4154, 0, "s"], + [4155, 0, "}"], + [4156, 0, "("], + [4157, 0, "\\"], + [4158, 0, "m"], + [4159, 0, "a"], + [4160, 0, "t"], + [4161, 0, "h"], + [4162, 0, "i"], + [4163, 0, "t"], + [4164, 0, "{"], + [4165, 0, "i"], + [4166, 0, "d"], + [4167, 0, "}"], + [4168, 0, ")"], + [4169, 0, " "], + [4170, 0, "\\"], + [4171, 0, "e"], + [4172, 0, "v"], + [4173, 0, "a"], + [4174, 0, "l"], + [4175, 0, "t"], + [4176, 0, "o"], + [4177, 0, " "], + [4178, 0, "A"], + [4179, 0, "["], + [4180, 0, "\\"], + [4181, 0, ","], + [4182, 0, "\\"], + [4183, 0, "m"], + [4184, 0, "a"], + [4185, 0, "t"], + [4186, 0, "h"], + [4187, 0, "i"], + [4188, 0, "t"], + [4188, 1], + [4187, 1], + [4187, 0, "s"], + [4188, 0, "f"], + [4189, 0, "{"], + [4190, 0, "c"], + [4191, 0, "t"], + [4192, 0, "r"], + [4193, 0, "}"], + [4194, 0, " "], + [4195, 0, "\\"], + [4196, 0, "m"], + [4197, 0, "a"], + [4198, 0, "p"], + [4199, 0, "s"], + [4200, 0, "t"], + [4201, 0, "o"], + [4202, 0, " "], + [4203, 0, "\\"], + [4204, 0, "m"], + [4205, 0, "a"], + [4206, 0, "t"], + [4207, 0, "h"], + [4208, 0, "r"], + [4209, 0, "m"], + [4210, 0, "{"], + [4177, 1], + [4177, 0, "\n"], + [4178, 0, " "], + [4179, 0, " "], + [4180, 0, " "], + [4181, 0, " "], + [4182, 0, " "], + [4183, 0, " "], + [4184, 0, " "], + [4185, 0, " "], + [4219, 0, "m"], + [4220, 0, "a"], + [4221, 0, "x"], + [4222, 0, "}"], + [4223, 0, "("], + [4224, 0, "A"], + [4225, 0, "("], + [4226, 0, "\\"], + [4227, 0, "m"], + [4228, 0, "a"], + [4229, 0, "t"], + [4230, 0, "h"], + [4231, 0, "s"], + [4232, 0, "f"], + [4233, 0, "{"], + [4234, 0, "c"], + [4235, 0, "t"], + [4236, 0, "r"], + [4237, 0, "}"], + [4238, 0, ")"], + [4239, 0, ","], + [4240, 0, " "], + [4241, 0, "c"], + [4242, 0, ")"], + [4243, 0, "\\"], + [4244, 0, ","], + [4245, 0, "]"], + [4090, 0, "\\"], + [4091, 0, "m"], + [4092, 0, "a"], + [4093, 0, "t"], + [4094, 0, "h"], + [4095, 0, "i"], + [4096, 0, "t"], + [4097, 0, "{"], + [4098, 0, "i"], + [4099, 0, "d"], + [4090, 0, "$"], + [4102, 0, " "], + [4103, 0, "="], + [4104, 0, " "], + [4105, 0, "("], + [4106, 0, "c"], + [4107, 0, ","], + [4108, 0, " "], + [4109, 0, "p"], + [4110, 0, ")"], + [4111, 0, "$"], + [4112, 0, "}"], + [4469, 0, "\n"], + [4470, 0, " "], + [4471, 0, " "], + [4472, 0, " "], + [4473, 0, " "], + [4474, 0, "\\"], + [4475, 0, "A"], + [4476, 0, "x"], + [4477, 0, "i"], + [4478, 0, "o"], + [4479, 0, "m"], + [4480, 0, "C"], + [4481, 0, "{"], + [4482, 0, "$"], + [4483, 0, "A"], + [4484, 0, ","], + [4485, 0, " "], + [4486, 0, "\\"], + [4487, 0, "m"], + [4488, 0, "a"], + [4489, 0, "t"], + [4490, 0, "h"], + [4491, 0, "s"], + [4492, 0, "f"], + [4493, 0, "{"], + [4494, 0, "t"], + [4495, 0, "s"], + [4496, 0, "}"], + [4497, 0, "("], + [4498, 0, "\\"], + [4499, 0, "m"], + [4500, 0, "a"], + [4501, 0, "t"], + [4502, 0, "h"], + [4503, 0, "i"], + [4504, 0, "t"], + [4505, 0, "{"], + [4506, 0, "i"], + [4507, 0, "d"], + [4508, 0, "}"], + [4509, 0, ")"], + [4510, 0, " "], + [4511, 0, "\\"], + [4512, 0, "e"], + [4513, 0, "v"], + [4514, 0, "a"], + [4515, 0, "l"], + [4516, 0, "t"], + [4517, 0, "o"], + [4518, 0, " "], + [4519, 0, "A"], + [4520, 0, "'"], + [4521, 0, "$"], + [4522, 0, "}"], + [4570, 1], + [4569, 1], + [4568, 1], + [4568, 0, "Q"], + [4569, 0, "u"], + [4570, 0, "a"], + [4571, 0, "t"], + [4572, 0, "e"], + [4573, 0, "r"], + [4651, 0, "'"], + [5270, 1], + [5270, 0, "B"], + [5271, 0, "i"], + [5229, 0, "\n"], + [5230, 0, " "], + [5231, 0, " "], + [5232, 0, " "], + [5233, 0, " "], + [5234, 0, "\\"], + [5235, 0, "A"], + [5236, 0, "x"], + [5237, 0, "i"], + [5238, 0, "o"], + [5239, 0, "m"], + [5240, 0, "C"], + [5241, 0, "{"], + [5242, 0, "$"], + [5243, 0, "A"], + [5244, 0, ","], + [5245, 0, " "], + [5246, 0, "\\"], + [5247, 0, "m"], + [5248, 0, "a"], + [5249, 0, "t"], + [5250, 0, "h"], + [5251, 0, "s"], + [5252, 0, "f"], + [5253, 0, "{"], + [5254, 0, "t"], + [5255, 0, "s"], + [5256, 0, "}"], + [5257, 0, "("], + [5258, 0, "\\"], + [5259, 0, "m"], + [5260, 0, "a"], + [5261, 0, "t"], + [5262, 0, "h"], + [5263, 0, "i"], + [5264, 0, "t"], + [5265, 0, "{"], + [5266, 0, "i"], + [5267, 0, "d"], + [5268, 0, "}"], + [5269, 0, ")"], + [5270, 0, " "], + [5271, 0, "\\"], + [5272, 0, "e"], + [5273, 0, "v"], + [5274, 0, "a"], + [5275, 0, "l"], + [5276, 0, "t"], + [5277, 0, "o"], + [5278, 0, " "], + [5279, 0, "A"], + [5280, 0, "'"], + [5281, 0, "$"], + [5282, 0, "}"], + [5402, 0, "'"], + [4221, 0, "o"], + [4222, 0, "u"], + [4223, 0, "n"], + [4225, 0, "e"], + [4261, 0, "o"], + [4262, 0, "u"], + [4263, 0, "n"], + [4265, 0, "e"], + [4265, 1], + [4263, 1], + [4262, 1], + [4261, 1], + [4225, 1], + [4223, 1], + [4222, 1], + [4221, 1], + [4059, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "A"], + [4062, 0, "x"], + [4063, 0, "i"], + [4064, 0, "o"], + [4065, 0, "m"], + [4066, 0, "C"], + [4067, 0, "{"], + [4068, 0, "$"], + [4069, 0, "A"], + [4070, 0, "("], + [4071, 0, "\\"], + [4072, 0, "m"], + [4073, 0, "a"], + [4074, 0, "t"], + [4075, 0, "h"], + [4076, 0, "s"], + [4077, 0, "f"], + [4078, 0, "{"], + [4079, 0, "c"], + [4080, 0, "t"], + [4081, 0, "r"], + [4082, 0, "}"], + [4083, 0, ")"], + [4084, 0, " "], + [4085, 0, "="], + [4086, 0, " "], + [4087, 0, "c"], + [4088, 0, "$"], + [4089, 0, "}"], + [4090, 0, "\n"], + [4091, 0, "\\"], + [4092, 0, "L"], + [4093, 0, "e"], + [4094, 0, "f"], + [4095, 0, "t"], + [4096, 0, "L"], + [4097, 0, "a"], + [4098, 0, "b"], + [4099, 0, "e"], + [4100, 0, "l"], + [4101, 0, "{"], + [4102, 0, "\\"], + [4103, 0, "t"], + [4104, 0, "e"], + [4105, 0, "x"], + [4106, 0, "t"], + [4107, 0, "s"], + [4108, 0, "c"], + [4109, 0, "{"], + [4110, 0, "G"], + [4111, 0, "e"], + [4112, 0, "n"], + [4113, 0, "-"], + [4114, 0, "T"], + [4115, 0, "S"], + [4116, 0, "}"], + [4117, 0, "}"], + [4118, 0, "\n"], + [4119, 0, "\\"], + [4120, 0, "U"], + [4121, 0, "n"], + [4122, 0, "a"], + [4123, 0, "r"], + [4124, 0, "y"], + [4125, 0, "I"], + [4126, 0, "n"], + [4127, 0, "f"], + [4128, 0, "C"], + [4129, 0, "{"], + [4130, 0, "$"], + [4131, 0, "A"], + [4132, 0, ","], + [4133, 0, " "], + [4134, 0, "\\"], + [4135, 0, "m"], + [4136, 0, "a"], + [4137, 0, "t"], + [4138, 0, "h"], + [4139, 0, "S"], + [4140, 0, "F"], + [4140, 1], + [4139, 1], + [4139, 0, "s"], + [4140, 0, "f"], + [4141, 0, "{"], + [4142, 0, "n"], + [4143, 0, "e"], + [4144, 0, "w"], + [4145, 0, "I"], + [4146, 0, "D"], + [4147, 0, "}"], + [4148, 0, " "], + [4149, 0, "\\"], + [4150, 0, "e"], + [4151, 0, "v"], + [4152, 0, "a"], + [4153, 0, "l"], + [4154, 0, "t"], + [4155, 0, "o"], + [4156, 0, " "], + [4157, 0, "A"], + [4158, 0, "["], + [4159, 0, "\\"], + [4160, 0, ","], + [4161, 0, "\\"], + [4162, 0, "m"], + [4163, 0, "a"], + [4090, 0, "\n"], + [4091, 0, "\\"], + [4092, 0, "A"], + [4093, 0, "x"], + [4094, 0, "i"], + [4095, 0, "o"], + [4096, 0, "m"], + [4097, 0, "C"], + [4098, 0, "{"], + [4099, 0, "$"], + [4100, 0, "p"], + [4101, 0, " "], + [4102, 0, "="], + [4103, 0, " "], + [4104, 0, "m"], + [4105, 0, "a"], + [4106, 0, "t"], + [4107, 0, "h"], + [4108, 0, "r"], + [4104, 0, "\\"], + [4110, 0, "m"], + [4111, 0, "{"], + [4112, 0, "m"], + [4113, 0, "y"], + [4114, 0, "P"], + [4115, 0, "e"], + [4116, 0, "e"], + [4117, 0, "r"], + [4118, 0, "I"], + [4119, 0, "D"], + [4120, 0, "("], + [4121, 0, ")"], + [4122, 0, "}"], + [4123, 0, "$"], + [4124, 0, "}"], + [4155, 1], + [4155, 0, "B"], + [4156, 0, "i"], + [4200, 0, "t"], + [4201, 0, "h"], + [4202, 0, "s"], + [4203, 0, "f"], + [4204, 0, "{"], + [4205, 0, "c"], + [4206, 0, "t"], + [4207, 0, "r"], + [4208, 0, "}"], + [4209, 0, " "], + [4210, 0, "\\"], + [4211, 0, "m"], + [4212, 0, "a"], + [4213, 0, "p"], + [4214, 0, "s"], + [4215, 0, "t"], + [4216, 0, "o"], + [4217, 0, " "], + [4218, 0, "c"], + [4219, 0, "+"], + [4220, 0, "1"], + [4221, 0, "\\"], + [4222, 0, ","], + [4223, 0, "]"], + [4224, 0, ","], + [4225, 0, "\\"], + [4226, 0, ";"], + [4227, 0, "("], + [4228, 0, "c"], + [4229, 0, ","], + [4227, 0, " "], + [4231, 0, " "], + [4232, 0, "p"], + [4233, 0, ")"], + [4234, 0, "$"], + [4235, 0, "}"], + [4236, 0, "\n"], + [4237, 0, "\n"], + [4237, 1], + [4237, 0, "\\"], + [4238, 0, "D"], + [4239, 0, "i"], + [4240, 0, "s"], + [4241, 0, "p"], + [4242, 0, "l"], + [4243, 0, "a"], + [4244, 0, "y"], + [4245, 0, "P"], + [4246, 0, "r"], + [4247, 0, "o"], + [4248, 0, "o"], + [4249, 0, "f"], + [4250, 0, "\n"], + [4169, 0, "\\"], + [4170, 0, ","], + [4170, 1], + [4170, 0, ";"], + [4270, 1], + [4269, 1], + [4268, 1], + [4267, 1], + [4266, 1], + [4265, 1], + [4264, 1], + [4263, 1], + [4262, 1], + [4261, 1], + [4260, 1], + [4259, 1], + [4258, 1], + [4257, 1], + [4256, 1], + [4255, 1], + [4254, 1], + [4253, 1], + [4461, 1], + [4460, 1], + [4459, 1], + [4458, 1], + [4457, 1], + [4456, 1], + [4455, 1], + [4454, 1], + [4453, 1], + [4452, 1], + [4451, 1], + [4450, 1], + [4449, 1], + [4448, 1], + [4448, 0, "D"], + [4449, 0, "i"], + [4450, 0, "s"], + [4451, 0, "p"], + [4452, 0, "l"], + [4453, 0, "a"], + [4454, 0, "y"], + [4455, 0, "P"], + [4456, 0, "r"], + [4457, 0, "o"], + [4458, 0, "o"], + [4459, 0, "f"], + [4232, 0, "+"], + [4233, 0, "1"], + [4344, 0, "\\"], + [4345, 0, ";"], + [4663, 0, "\\"], + [4664, 0, ";"], + [4766, 0, "\\"], + [4767, 0, ";"], + [5126, 0, "\\"], + [5127, 0, ";"], + [5248, 0, "\\"], + [5249, 0, ";"], + [5431, 0, "\\"], + [5432, 0, ";"], + [5526, 0, "\\"], + [5527, 0, ";"], + [4184, 1], + [4183, 1], + [4182, 1], + [4181, 1], + [4180, 1], + [4180, 0, "n"], + [4181, 0, "e"], + [4182, 0, "w"], + [4183, 0, "I"], + [4184, 0, "D"], + [4254, 0, "\n"], + [4255, 0, "\n"], + [4256, 0, "h"], + [4257, 0, "e"], + [4258, 0, "l"], + [4259, 0, "l"], + [4260, 0, "o"], + [4472, 0, "\n"], + [4473, 0, "w"], + [4474, 0, "o"], + [4475, 0, "r"], + [4476, 0, "l"], + [4477, 0, "d"], + [4478, 0, "\n"], + [4262, 1], + [4261, 1], + [4260, 1], + [4259, 1], + [4258, 1], + [4257, 1], + [4256, 1], + [4255, 1], + [4255, 1], + [4255, 1], + [4255, 1], + [4255, 1], + [4287, 1], + [4287, 1], + [4287, 1], + [4287, 1], + [4317, 1], + [4317, 1], + [4317, 1], + [4317, 1], + [4367, 1], + [4367, 1], + [4367, 1], + [4371, 1], + [4254, 0, "\n"], + [4255, 0, "%"], + [4256, 0, "%"], + [4256, 1], + [4456, 1], + [4455, 1], + [4454, 1], + [4453, 1], + [4452, 1], + [4451, 1], + [4450, 1], + [4059, 0, "\n"], + [4060, 0, "\\"], + [4061, 0, "c"], + [4062, 0, "e"], + [4063, 0, "n"], + [4064, 0, "t"], + [4065, 0, "e"], + [4066, 0, "r"], + [4067, 0, "i"], + [4068, 0, "n"], + [4069, 0, "g"], + [4070, 0, "\n"], + [4070, 1], + [4265, 0, "\\"], + [4266, 0, "h"], + [4267, 0, "f"], + [4268, 0, "i"], + [4269, 0, "l"], + [4270, 0, "l"], + [4080, 0, "c"], + [4081, 0, " "], + [4082, 0, "="], + [4083, 0, " "], + [4102, 1], + [4101, 1], + [4100, 1], + [4099, 1], + [4466, 0, "\n"], + [4467, 0, "\n"], + [4085, 0, "_"], + [4086, 0, "p"], + [4181, 0, "_"], + [4182, 0, "p"], + [4211, 0, "_"], + [4212, 0, "p"], + [4308, 0, "_"], + [4309, 0, "\\"], + [4310, 0, "m"], + [4311, 0, "a"], + [4312, 0, "t"], + [4313, 0, "h"], + [4314, 0, "i"], + [4315, 0, "t"], + [4316, 0, "{"], + [4317, 0, "i"], + [4318, 0, "d"], + [4319, 0, "}"], + [4367, 0, "_"], + [4368, 0, "p"], + [4411, 0, "_"], + [4412, 0, "p"], + [4557, 0, "_"], + [4558, 0, "p"], + [4577, 0, "_"], + [4578, 0, "p"], + [4615, 1], + [4615, 0, "\\"], + [4616, 0, "m"], + [4617, 0, "a"], + [4618, 0, "t"], + [4619, 0, "h"], + [4620, 0, "i"], + [4621, 0, "t"], + [4622, 0, "{"], + [4623, 0, "p"], + [4624, 0, "r"], + [4625, 0, "e"], + [4626, 0, "v"], + [4627, 0, "}"], + [4704, 0, "_"], + [4705, 0, "p"], + [4809, 0, "_"], + [4810, 0, "p"], + [4744, 0, "_"], + [4745, 0, "p"], + [4881, 0, "_"], + [4882, 0, "p"], + [4927, 1], + [4927, 0, "]"], + [4927, 1], + [4927, 0, "\\"], + [4928, 0, "m"], + [4929, 0, "a"], + [4930, 0, "t"], + [4931, 0, "h"], + [4932, 0, "i"], + [4933, 0, "t"], + [4934, 0, "{"], + [4935, 0, "p"], + [4936, 0, "r"], + [4937, 0, "e"], + [4938, 0, "v"], + [4939, 0, "}"], + [5074, 0, "_"], + [5075, 0, "p"], + [5112, 1], + [5112, 0, "\\"], + [5113, 0, "m"], + [5114, 0, "a"], + [5115, 0, "t"], + [5116, 0, "h"], + [5117, 0, "i"], + [5118, 0, "t"], + [5119, 0, "{"], + [5120, 0, "p"], + [5121, 0, "r"], + [5122, 0, "e"], + [5123, 0, "v"], + [5124, 0, "}"], + [5261, 0, "_"], + [5262, 0, "p"], + [5201, 0, "_"], + [5202, 0, "p"], + [5327, 0, "_"], + [5328, 0, "p"], + [5389, 0, "_"], + [5390, 0, "p"], + [5444, 0, "_"], + [5445, 0, "p"], + [5516, 0, "_"], + [5517, 0, "p"], + [5556, 0, "_"], + [5557, 0, "p"], + [5615, 0, "_"], + [5616, 0, "p"], + [5684, 0, "_"], + [5685, 0, "p"], + [4490, 0, "\\"], + [4491, 0, "b"], + [4492, 0, "e"], + [4493, 0, "g"], + [4494, 0, "i"], + [4495, 0, "n"], + [4496, 0, "{"], + [4497, 0, "p"], + [4498, 0, "r"], + [4499, 0, "o"], + [4500, 0, "o"], + [4501, 0, "f"], + [4502, 0, "t"], + [4503, 0, "r"], + [4504, 0, "e"], + [4505, 0, "e"], + [4506, 0, "}"], + [4507, 0, "\n"], + [4508, 0, "\\"], + [4509, 0, "e"], + [4510, 0, "n"], + [4511, 0, "d"], + [4512, 0, "{"], + [4513, 0, "p"], + [4514, 0, "r"], + [4514, 1], + [4513, 1], + [4512, 1], + [4511, 1], + [4510, 1], + [4509, 1], + [4508, 1], + [4507, 1], + [4506, 1], + [4505, 1], + [4504, 1], + [4503, 1], + [4502, 1], + [4501, 1], + [4500, 1], + [4499, 1], + [4498, 1], + [4497, 1], + [4496, 1], + [4495, 1], + [4494, 1], + [4493, 1], + [4492, 1], + [4491, 1], + [4491, 0, "A"], + [4492, 0, "x"], + [4493, 0, "i"], + [4494, 0, "o"], + [4495, 0, "m"], + [4496, 0, "C"], + [4497, 0, "{"], + [4498, 0, "$"], + [4499, 0, "q"], + [4500, 0, " "], + [4501, 0, "\\"], + [4502, 0, "i"], + [4503, 0, "n"], + [4504, 0, " "], + [4505, 0, "\\"], + [4506, 0, "m"], + [4507, 0, "a"], + [4508, 0, "t"], + [4509, 0, "h"], + [4510, 0, "i"], + [4511, 0, "t"], + [4512, 0, "{"], + [4513, 0, "p"], + [4514, 0, "e"], + [4515, 0, "e"], + [4516, 0, "r"], + [4517, 0, "s"], + [4518, 0, "}"], + [4519, 0, "$"], + [4520, 0, "}"], + [4521, 0, "\n"], + [4522, 0, "\\"], + [4523, 0, "L"], + [4524, 0, "e"], + [4525, 0, "f"], + [4526, 0, "t"], + [4527, 0, "L"], + [4528, 0, "a"], + [4529, 0, "b"], + [4530, 0, "e"], + [4531, 0, "l"], + [4532, 0, "{"], + [4533, 0, "\\"], + [4534, 0, "t"], + [4535, 0, "e"], + [4536, 0, "x"], + [4537, 0, "t"], + [4538, 0, "s"], + [4539, 0, "c"], + [4540, 0, "{"], + [4541, 0, "R"], + [4542, 0, "e"], + [4543, 0, "c"], + [4544, 0, "v"], + [4545, 0, "}"], + [4546, 0, "}"], + [4547, 0, "\n"], + [4548, 0, "\\"], + [4549, 0, "U"], + [4550, 0, "n"], + [4551, 0, "a"], + [4552, 0, "r"], + [4553, 0, "y"], + [4554, 0, "I"], + [4555, 0, "n"], + [4556, 0, "f"], + [4557, 0, "C"], + [4558, 0, "{"], + [4559, 0, "$"], + [4560, 0, "A"], + [4561, 0, "_"], + [4562, 0, "p"], + [4563, 0, ","], + [4564, 0, "\\"], + [4565, 0, ";"], + [4566, 0, " "], + [4567, 0, "\\"], + [4568, 0, "m"], + [4569, 0, "a"], + [4570, 0, "t"], + [4571, 0, "h"], + [4572, 0, "s"], + [4573, 0, "f"], + [4574, 0, "{"], + [4575, 0, "y"], + [4576, 0, "i"], + [4577, 0, "e"], + [4578, 0, "l"], + [4579, 0, "d"], + [4580, 0, "|"], + [4580, 1], + [4580, 0, "}"], + [4581, 0, " "], + [4582, 0, "\\"], + [4583, 0, "e"], + [4584, 0, "v"], + [4585, 0, "a"], + [4586, 0, "l"], + [4587, 0, "t"], + [4588, 0, "o"], + [4589, 0, " "], + [4590, 0, "A"], + [4591, 0, "_"], + [4592, 0, "p"], + [4593, 0, "["], + [4594, 0, ","], + [4594, 1], + [4594, 0, "\\"], + [4595, 0, ","], + [4596, 0, "\\"], + [4597, 0, "m"], + [4598, 0, "a"], + [4599, 0, "t"], + [4600, 0, "h"], + [4601, 0, "s"], + [4602, 0, "f"], + [4603, 0, "{"], + [4604, 0, "r"], + [4605, 0, "e"], + [4606, 0, "c"], + [4607, 0, "v"], + [4608, 0, "}"], + [4609, 0, " "], + [4610, 0, "\\"], + [4611, 0, "m"], + [4612, 0, "a"], + [4613, 0, "p"], + [4614, 0, "s"], + [4615, 0, "t"], + [4616, 0, "o"], + [4617, 0, " "], + [4618, 0, "A"], + [4619, 0, "_"], + [4620, 0, "p"], + [4621, 0, "("], + [4622, 0, "\\"], + [4623, 0, "m"], + [4624, 0, "a"], + [4625, 0, "t"], + [4626, 0, "h"], + [4627, 0, "s"], + [4628, 0, "f"], + [4629, 0, "{"], + [4630, 0, "r"], + [4631, 0, "e"], + [4632, 0, "c"], + [4633, 0, "v"], + [4634, 0, "}"], + [4635, 0, ")"], + [4636, 0, " "], + [4637, 0, "\\"], + [4638, 0, "c"], + [4639, 0, "u"], + [4640, 0, "p"], + [4641, 0, " "], + [4642, 0, "A"], + [4643, 0, "_"], + [4644, 0, "q"], + [4645, 0, "("], + [4646, 0, "\\"], + [4647, 0, "m"], + [4648, 0, "a"], + [4649, 0, "t"], + [4650, 0, "h"], + [4651, 0, "s"], + [4652, 0, "f"], + [4653, 0, "{"], + [4654, 0, "s"], + [4655, 0, "e"], + [4656, 0, "n"], + [4657, 0, "d"], + [4658, 0, "}"], + [4659, 0, ")"], + [4660, 0, "\\"], + [4661, 0, ","], + [4662, 0, "]"], + [4663, 0, "$"], + [4664, 0, "}"], + [4665, 0, "\n"], + [4666, 0, "\\"], + [4667, 0, "D"], + [4668, 0, "i"], + [4669, 0, "s"], + [4670, 0, "p"], + [4671, 0, "l"], + [4672, 0, "a"], + [4673, 0, "y"], + [4674, 0, "P"], + [4675, 0, "r"], + [4676, 0, "o"], + [4677, 0, "o"], + [4678, 0, "f"], + [4678, 1], + [4677, 1], + [4676, 1], + [4675, 1], + [4674, 1], + [4673, 1], + [4672, 1], + [4671, 1], + [4670, 1], + [4669, 1], + [4668, 1], + [4667, 1], + [4667, 0, "e"], + [4668, 0, "n"], + [4669, 0, "d"], + [4670, 0, "{"], + [4671, 0, "p"], + [4672, 0, "r"], + [4673, 0, "o"], + [4674, 0, "o"], + [4675, 0, "f"], + [4676, 0, "t"], + [4677, 0, "r"], + [4678, 0, "e"], + [4679, 0, "e"], + [4680, 0, "}"], + [4489, 0, "\n"], + [4490, 0, "\\"], + [4491, 0, "b"], + [4492, 0, "e"], + [4493, 0, "g"], + [4494, 0, "i"], + [4495, 0, "n"], + [4496, 0, "{"], + [4497, 0, "p"], + [4498, 0, "r"], + [4499, 0, "o"], + [4500, 0, "o"], + [4501, 0, "f"], + [4502, 0, "t"], + [4503, 0, "r"], + [4504, 0, "e"], + [4505, 0, "e"], + [4506, 0, "}"], + [4506, 1], + [4505, 1], + [4504, 1], + [4503, 1], + [4502, 1], + [4501, 1], + [4500, 1], + [4499, 1], + [4498, 1], + [4497, 1], + [4496, 1], + [4495, 1], + [4494, 1], + [4493, 1], + [4492, 1], + [4491, 1], + [4490, 1], + [4490, 0, "\\"], + [4491, 0, "p"], + [4492, 0, "r"], + [4493, 0, "o"], + [4494, 0, "o"], + [4495, 0, "f"], + [4496, 0, "S"], + [4497, 0, "k"], + [4498, 0, "i"], + [4499, 0, "p"], + [4500, 0, "A"], + [4501, 0, "m"], + [4502, 0, "o"], + [4503, 0, "u"], + [4504, 0, "n"], + [4505, 0, "t"], + [4506, 0, " "], + [4507, 0, "\\"], + [4508, 0, "l"], + [4509, 0, "e"], + [4510, 0, "a"], + [4511, 0, "v"], + [4512, 0, "e"], + [4513, 0, "v"], + [4514, 0, "m"], + [4515, 0, "o"], + [4516, 0, "d"], + [4517, 0, "e"], + [4506, 1], + [4708, 1], + [4707, 1], + [4706, 1], + [4705, 1], + [4704, 1], + [4703, 1], + [4702, 1], + [4701, 1], + [4700, 1], + [4699, 1], + [4698, 1], + [4697, 1], + [4696, 1], + [4695, 1], + [4695, 0, "p"], + [4696, 0, "r"], + [4697, 0, "o"], + [4698, 0, "o"], + [4699, 0, "f"], + [4700, 0, "S"], + [4701, 0, "k"], + [4702, 0, "i"], + [4703, 0, "p"], + [4704, 0, "A"], + [4705, 0, "m"], + [4706, 0, "o"], + [4707, 0, "u"], + [4708, 0, "n"], + [4709, 0, "t"], + [4517, 0, "\n"], + [4518, 0, "\\"], + [4519, 0, "A"], + [4520, 0, "x"], + [4521, 0, "i"], + [4522, 0, "o"], + [4523, 0, "m"], + [4524, 0, "C"], + [4525, 0, "{"], + [4526, 0, "}"], + [4527, 0, "\n"], + [4528, 0, "\\"], + [4529, 0, "L"], + [4530, 0, "e"], + [4531, 0, "f"], + [4532, 0, "t"], + [4533, 0, "L"], + [4534, 0, "a"], + [4535, 0, "b"], + [4536, 0, "e"], + [4537, 0, "l"], + [4538, 0, "{"], + [4539, 0, "\\"], + [4540, 0, "t"], + [4541, 0, "e"], + [4542, 0, "x"], + [4543, 0, "t"], + [4544, 0, "s"], + [4545, 0, "c"], + [4546, 0, "{"], + [4547, 0, "S"], + [4548, 0, "e"], + [4549, 0, "n"], + [4550, 0, "d"], + [4551, 0, "}"], + [4552, 0, "}"], + [4553, 0, "\n"], + [4554, 0, "\\"], + [4555, 0, "U"], + [4556, 0, "n"], + [4557, 0, "a"], + [4558, 0, "r"], + [4559, 0, "y"], + [4560, 0, "I"], + [4561, 0, "n"], + [4562, 0, "f"], + [4563, 0, "C"], + [4564, 0, "{"], + [4565, 0, "$"], + [4566, 0, "A"], + [4567, 0, "_"], + [4568, 0, "p"], + [4569, 0, ","], + [4570, 0, "\\"], + [4571, 0, ";"], + [4572, 0, " "], + [4573, 0, "\\"], + [4574, 0, "m"], + [4575, 0, "a"], + [4576, 0, "t"], + [4577, 0, "h"], + [4578, 0, "s"], + [4579, 0, "f"], + [4580, 0, "{"], + [4581, 0, "y"], + [4582, 0, "i"], + [4583, 0, "e"], + [4584, 0, "l"], + [4585, 0, "d"], + [4586, 0, "}"], + [4587, 0, " "], + [4588, 0, "\\"], + [4589, 0, "e"], + [4590, 0, "v"], + [4591, 0, "a"], + [4592, 0, "l"], + [4593, 0, "t"], + [4594, 0, "o"], + [4595, 0, " "], + [4596, 0, "A"], + [4597, 0, "_"], + [4598, 0, "p"], + [4599, 0, "["], + [4600, 0, "\\"], + [4601, 0, ","], + [4602, 0, "\\"], + [4603, 0, "m"], + [4604, 0, "a"], + [4605, 0, "t"], + [4606, 0, "h"], + [4607, 0, "s"], + [4608, 0, "f"], + [4609, 0, "{"], + [4610, 0, "s"], + [4611, 0, "e"], + [4612, 0, "n"], + [4613, 0, "d"], + [4614, 0, "}"], + [4615, 0, " "], + [4616, 0, "\\"], + [4617, 0, "m"], + [4618, 0, "a"], + [4619, 0, "p"], + [4620, 0, "s"], + [4621, 0, "t"], + [4622, 0, "o"], + [4623, 0, " "], + [4624, 0, "A"], + [4625, 0, "_"], + [4626, 0, "p"], + [4627, 0, "("], + [4628, 0, "\\"], + [4629, 0, "m"], + [4630, 0, "a"], + [4631, 0, "t"], + [4632, 0, "h"], + [4633, 0, "s"], + [4634, 0, "f"], + [4635, 0, "{"], + [4636, 0, "s"], + [4637, 0, "e"], + [4638, 0, "n"], + [4639, 0, "d"], + [4640, 0, "}"], + [4641, 0, ")"], + [4642, 0, " "], + [4643, 0, "\\"], + [4644, 0, "c"], + [4645, 0, "u"], + [4646, 0, "p"], + [4647, 0, " "], + [4648, 0, "A"], + [4649, 0, "_"], + [4650, 0, "p"], + [4651, 0, "("], + [4652, 0, "\\"], + [4653, 0, "m"], + [4654, 0, "a"], + [4655, 0, "t"], + [4656, 0, "h"], + [4657, 0, "s"], + [4658, 0, "f"], + [4659, 0, "{"], + [4660, 0, "n"], + [4661, 0, "e"], + [4662, 0, "w"], + [4663, 0, "O"], + [4664, 0, "p"], + [4665, 0, "s"], + [4666, 0, "}"], + [4667, 0, ")"], + [4668, 0, "\\"], + [4669, 0, ","], + [4670, 0, "]"], + [4671, 0, "$"], + [4672, 0, "}"], + [4673, 0, "\n"], + [4674, 0, "\\"], + [4675, 0, "D"], + [4676, 0, "i"], + [4677, 0, "s"], + [4678, 0, "p"], + [4679, 0, "l"], + [4680, 0, "a"], + [4681, 0, "y"], + [4682, 0, "P"], + [4683, 0, "r"], + [4684, 0, "o"], + [4685, 0, "o"], + [4686, 0, "f"], + [4687, 0, "\\"], + [4688, 0, "h"], + [4689, 0, "f"], + [4690, 0, "i"], + [4691, 0, "l"], + [4692, 0, "l"], + [4693, 0, "\n"], + [4694, 0, "%"], + [4872, 0, "\\"], + [4873, 0, "D"], + [4874, 0, "i"], + [4875, 0, "s"], + [4876, 0, "p"], + [4877, 0, "l"], + [4878, 0, "a"], + [4879, 0, "y"], + [4880, 0, "P"], + [4881, 0, "r"], + [4882, 0, "o"], + [4883, 0, "o"], + [4884, 0, "f"], + [4516, 1], + [4515, 1], + [4514, 1], + [4513, 1], + [4512, 1], + [4511, 1], + [4510, 1], + [4509, 1], + [4508, 1], + [4507, 1], + [4506, 1], + [4505, 1], + [4504, 1], + [4503, 1], + [4502, 1], + [4501, 1], + [4500, 1], + [4499, 1], + [4498, 1], + [4497, 1], + [4496, 1], + [4495, 1], + [4494, 1], + [4493, 1], + [4492, 1], + [4491, 1], + [4491, 0, "b"], + [4492, 0, "e"], + [4493, 0, "g"], + [4494, 0, "i"], + [4495, 0, "n"], + [4496, 0, "{"], + [4497, 0, "p"], + [4498, 0, "r"], + [4499, 0, "o"], + [4500, 0, "o"], + [4501, 0, "f"], + [4502, 0, "t"], + [4503, 0, "r"], + [4504, 0, "e"], + [4505, 0, "e"], + [4506, 0, "}"], + [4683, 0, "\n"], + [4684, 0, "\\"], + [4685, 0, "e"], + [4686, 0, "n"], + [4687, 0, "d"], + [4688, 0, "{"], + [4689, 0, "p"], + [4690, 0, "r"], + [4691, 0, "o"], + [4692, 0, "o"], + [4693, 0, "f"], + [4694, 0, "t"], + [4695, 0, "r"], + [4696, 0, "e"], + [4697, 0, "e"], + [4698, 0, "}"], + [4700, 1], + [4700, 0, "\n"], + [4701, 0, "\\"], + [4702, 0, "b"], + [4703, 0, "e"], + [4704, 0, "g"], + [4705, 0, "i"], + [4706, 0, "n"], + [4707, 0, "P"], + [4707, 1], + [4707, 0, "{"], + [4708, 0, "p"], + [4709, 0, "r"], + [4710, 0, "o"], + [4711, 0, "o"], + [4712, 0, "f"], + [4713, 0, "t"], + [4714, 0, "r"], + [4715, 0, "e"], + [4716, 0, "e"], + [4717, 0, "}"], + [4923, 1], + [4922, 1], + [4921, 1], + [4920, 1], + [4919, 1], + [4918, 1], + [4917, 1], + [4916, 1], + [4915, 1], + [4914, 1], + [4913, 1], + [4912, 1], + [4911, 1], + [4910, 1], + [4909, 1], + [4908, 1], + [4907, 1], + [4906, 1], + [4905, 1], + [4904, 1], + [4903, 1], + [4902, 1], + [4901, 1], + [4900, 1], + [4899, 1], + [4898, 1], + [4897, 1], + [4896, 1], + [4896, 0, "e"], + [4897, 0, "n"], + [4898, 0, "d"], + [4899, 0, "{"], + [4900, 0, "p"], + [4901, 0, "r"], + [4902, 0, "o"], + [4903, 0, "o"], + [4904, 0, "f"], + [4905, 0, "t"], + [4906, 0, "r"], + [4907, 0, "e"], + [4908, 0, "e"], + [4909, 0, "}"], + [4682, 1], + [4681, 1], + [4680, 1], + [4679, 1], + [4678, 1], + [4677, 1], + [4676, 1], + [4675, 1], + [4674, 1], + [4673, 1], + [4672, 1], + [4671, 1], + [4670, 1], + [4669, 1], + [4668, 1], + [4667, 1], + [4666, 1], + [4665, 1], + [4664, 1], + [4663, 1], + [4890, 0, "\n"], + [4891, 0, "\n"], + [4892, 0, "\\"], + [4893, 0, "b"], + [4894, 0, "e"], + [4895, 0, "g"], + [4896, 0, "i"], + [4897, 0, "n"], + [4898, 0, "{"], + [4899, 0, "p"], + [4900, 0, "r"], + [4901, 0, "o"], + [4902, 0, "o"], + [4903, 0, "f"], + [4904, 0, "t"], + [4905, 0, "r"], + [4906, 0, "e"], + [4907, 0, "e"], + [4908, 0, "}"], + [4909, 0, "\n"], + [4910, 0, "\\"], + [4911, 0, "e"], + [4912, 0, "n"], + [4913, 0, "d"], + [4914, 0, "{"], + [4915, 0, "p"], + [4916, 0, "r"], + [4917, 0, "o"], + [4918, 0, "o"], + [4919, 0, "f"], + [4920, 0, "t"], + [4921, 0, "r"], + [4922, 0, "e"], + [4923, 0, "e"], + [4924, 0, "}"], + [4909, 0, "\n"], + [4910, 0, "\\"], + [4911, 0, "A"], + [4912, 0, "x"], + [4913, 0, "i"], + [4914, 0, "o"], + [4915, 0, "m"], + [4916, 0, "C"], + [4917, 0, "{"], + [4918, 0, "$"], + [4919, 0, "("], + [4920, 0, "\\"], + [4921, 0, "m"], + [4922, 0, "a"], + [4923, 0, "t"], + [4924, 0, "h"], + [4925, 0, "s"], + [4926, 0, "f"], + [4927, 0, "{"], + [4927, 1], + [4926, 1], + [4925, 1], + [4925, 0, "i"], + [4926, 0, "t"], + [4927, 0, "{"], + [4928, 0, "d"], + [4929, 0, "e"], + [4930, 0, "p"], + [4931, 0, "s"], + [4932, 0, "}"], + [4933, 0, ","], + [4934, 0, " "], + [4935, 0, "\\"], + [4936, 0, "m"], + [4937, 0, "a"], + [4938, 0, "t"], + [4939, 0, "h"], + [4940, 0, "i"], + [4941, 0, "t"], + [4942, 0, "{"], + [4943, 0, "i"], + [4944, 0, "p"], + [4944, 1], + [4943, 1], + [4943, 0, "o"], + [4944, 0, "p"], + [4945, 0, "}"], + [4946, 0, ")"], + [4947, 0, " "], + [4948, 0, "\\"], + [4949, 0, "i"], + [4950, 0, "n"], + [4951, 0, " "], + [4952, 0, "A"], + [4953, 0, "_"], + [4954, 0, "p"], + [4955, 0, "("], + [4956, 0, "\\"], + [4957, 0, "m"], + [4958, 0, "a"], + [4959, 0, "t"], + [4960, 0, "h"], + [4961, 0, "s"], + [4962, 0, "f"], + [4963, 0, "{"], + [4964, 0, "r"], + [4965, 0, "e"], + [4966, 0, "c"], + [4967, 0, "v"], + [4968, 0, "}"], + [4969, 0, ")"], + [4970, 0, "$"], + [4971, 0, "}"], + [4972, 0, "\n"], + [4973, 0, "\\"], + [4974, 0, "A"], + [4975, 0, "x"], + [4976, 0, "i"], + [4977, 0, "o"], + [4978, 0, "m"], + [4979, 0, "C"], + [4980, 0, "{"], + [4981, 0, "$"], + [4982, 0, " "], + [4982, 1], + [4982, 0, "\\"], + [4983, 0, "m"], + [4984, 0, "a"], + [4985, 0, "t"], + [4986, 0, "h"], + [4987, 0, "i"], + [4988, 0, "t"], + [4989, 0, "{"], + [4990, 0, "d"], + [4991, 0, "e"], + [4992, 0, "p"], + [4993, 0, "s"], + [4994, 0, "}"], + [4995, 0, " "], + [4996, 0, "\\"], + [4997, 0, "s"], + [4998, 0, "u"], + [4999, 0, "b"], + [5000, 0, "s"], + [5001, 0, "e"], + [5002, 0, "t"], + [5003, 0, "e"], + [5004, 0, "q"], + [5005, 0, " "], + [5006, 0, "A"], + [5007, 0, "_"], + [5008, 0, "p"], + [5009, 0, "("], + [5010, 0, "\\"], + [5011, 0, "m"], + [5012, 0, "a"], + [5013, 0, "t"], + [5014, 0, "h"], + [5015, 0, "s"], + [5016, 0, "f"], + [5017, 0, "{"], + [5018, 0, "o"], + [5019, 0, "p"], + [5020, 0, "s"], + [5021, 0, "}"], + [5022, 0, ")"], + [5023, 0, "$"], + [5024, 0, "}"], + [5025, 0, "\n"], + [5026, 0, "\\"], + [5027, 0, "A"], + [5028, 0, "x"], + [5029, 0, "i"], + [5030, 0, "o"], + [5031, 0, "m"], + [5032, 0, "C"], + [5033, 0, "{"], + [5034, 0, "$"], + [5035, 0, "A"], + [5036, 0, "_"], + [5037, 0, "p"], + [5038, 0, ","], + [5039, 0, " "], + [5040, 0, "\\"], + [5041, 0, "m"], + [5042, 0, "a"], + [5043, 0, "t"], + [5044, 0, "h"], + [5045, 0, "i"], + [5046, 0, "t"], + [5047, 0, "{"], + [5048, 0, "o"], + [5049, 0, "p"], + [5050, 0, "}"], + [5051, 0, " "], + [5052, 0, "\\"], + [5053, 0, "e"], + [5054, 0, "v"], + [5055, 0, "a"], + [5056, 0, "l"], + [5057, 0, "t"], + [5058, 0, "o"], + [5059, 0, " "], + [5060, 0, "A"], + [5061, 0, "_"], + [5062, 0, "p"], + [5063, 0, "'"], + [5064, 0, "$"], + [5065, 0, "}"], + [5066, 0, "\n"], + [5067, 0, "\\"], + [5068, 0, "L"], + [5069, 0, "e"], + [5070, 0, "f"], + [5071, 0, "t"], + [5072, 0, "L"], + [5073, 0, "a"], + [5074, 0, "b"], + [5075, 0, "e"], + [5076, 0, "l"], + [5077, 0, "{"], + [5078, 0, "\\"], + [5079, 0, "t"], + [5080, 0, "e"], + [5081, 0, "x"], + [5082, 0, "t"], + [5083, 0, "s"], + [5084, 0, "c"], + [5085, 0, "{"], + [5086, 0, "A"], + [5087, 0, "p"], + [5088, 0, "p"], + [5089, 0, "l"], + [5090, 0, "y"], + [5091, 0, "}"], + [5092, 0, "}"], + [5093, 0, "\n"], + [5094, 0, "\\"], + [5095, 0, "T"], + [5096, 0, "e"], + [5097, 0, "r"], + [5098, 0, "n"], + [5099, 0, "a"], + [5100, 0, "r"], + [5101, 0, "y"], + [5101, 1], + [5100, 1], + [5099, 1], + [5098, 1], + [5097, 1], + [5096, 1], + [5096, 0, "r"], + [5097, 0, "i"], + [5098, 0, "n"], + [5099, 0, "a"], + [5100, 0, "r"], + [5101, 0, "y"], + [5102, 0, "I"], + [5103, 0, "n"], + [5104, 0, "f"], + [5105, 0, "C"], + [5106, 0, "{"], + [5107, 0, "$"], + [5108, 0, "A"], + [5109, 0, "_"], + [5110, 0, "p"], + [5111, 0, ","], + [5112, 0, "\\"], + [5113, 0, ";"], + [5114, 0, " "], + [5115, 0, "\\"], + [5116, 0, "m"], + [5117, 0, "a"], + [5118, 0, "t"], + [5119, 0, "h"], + [5120, 0, "s"], + [5121, 0, "f"], + [5122, 0, "{"], + [5123, 0, "y"], + [5124, 0, "i"], + [5125, 0, "e"], + [5126, 0, "l"], + [5127, 0, "d"], + [5128, 0, "}"], + [5129, 0, " "], + [5130, 0, "\\"], + [5131, 0, "e"], + [5132, 0, "v"], + [5133, 0, "a"], + [5134, 0, "l"], + [5135, 0, "t"], + [5136, 0, "o"], + [5137, 0, " "], + [5138, 0, "A"], + [5139, 0, "_"], + [5140, 0, "p"], + [5141, 0, "'"], + [5142, 0, "["], + [5143, 0, "\\"], + [5144, 0, ","], + [5145, 0, "\\"], + [5146, 0, "m"], + [5147, 0, "a"], + [5148, 0, "t"], + [5149, 0, "h"], + [5150, 0, "s"], + [5151, 0, "f"], + [5152, 0, "{"], + [5153, 0, "o"], + [5154, 0, "p"], + [5155, 0, "s"], + [5156, 0, "}"], + [5157, 0, " "], + [5158, 0, "\\"], + [5159, 0, "m"], + [5160, 0, "a"], + [5161, 0, "p"], + [5162, 0, "s"], + [5163, 0, "t"], + [5164, 0, "o"], + [5165, 0, " "], + [5166, 0, "A"], + [5167, 0, "_"], + [5168, 0, "p"], + [5169, 0, "'"], + [5170, 0, "("], + [5171, 0, "\\"], + [5172, 0, "m"], + [5173, 0, "a"], + [5174, 0, "t"], + [5175, 0, "h"], + [5176, 0, "s"], + [5177, 0, "f"], + [5178, 0, "{"], + [5179, 0, "o"], + [5180, 0, "p"], + [5181, 0, "s"], + [5182, 0, "}"], + [5183, 0, ")"], + [5184, 0, " "], + [5185, 0, "\\"], + [5186, 0, "c"], + [5187, 0, "u"], + [5188, 0, "p"], + [5189, 0, " "], + [5190, 0, "\\"], + [5191, 0, "{"], + [5192, 0, "o"], + [5193, 0, "p"], + [5194, 0, "\\"], + [5195, 0, "}"], + [5196, 0, "\\"], + [5197, 0, ","], + [5198, 0, "]"], + [5199, 0, "$"], + [5200, 0, "}"], + [5192, 0, "\\"], + [5193, 0, "m"], + [5194, 0, "a"], + [5195, 0, "t"], + [5196, 0, "h"], + [5197, 0, "i"], + [5198, 0, "t"], + [5199, 0, "{"], + [5202, 0, "}"], + [5039, 0, "\\"], + [5040, 0, ";"], + [5228, 0, "\n"], + [5229, 0, "\\"], + [5230, 0, "c"], + [5231, 0, "a"], + [5232, 0, "p"], + [5233, 0, "t"], + [5234, 0, "i"], + [5235, 0, "o"], + [5236, 0, "n"], + [5237, 0, "{"], + [5238, 0, "R"], + [5239, 0, "u"], + [5240, 0, "l"], + [5241, 0, "e"], + [5242, 0, "s"], + [5243, 0, " "], + [5244, 0, "f"], + [5245, 0, "o"], + [5246, 0, "r"], + [5247, 0, " "], + [5248, 0, "m"], + [5249, 0, "a"], + [5250, 0, "i"], + [5251, 0, "n"], + [5252, 0, "t"], + [5253, 0, "i"], + [5253, 1], + [5252, 1], + [5251, 1], + [5250, 1], + [5249, 1], + [5248, 1], + [5248, 0, "L"], + [5249, 0, "a"], + [5250, 0, "m"], + [5251, 0, "p"], + [5252, 0, "o"], + [5253, 0, "r"], + [5254, 0, "t"], + [5255, 0, " "], + [5256, 0, "t"], + [5257, 0, "i"], + [5258, 0, "m"], + [5259, 0, "e"], + [5260, 0, "s"], + [5261, 0, "t"], + [5262, 0, "a"], + [5263, 0, "m"], + [5264, 0, "p"], + [5265, 0, "s"], + [5266, 0, ","], + [5267, 0, " "], + [5268, 0, "s"], + [5269, 0, "e"], + [5270, 0, "n"], + [5271, 0, "d"], + [5272, 0, "c"], + [5273, 0, "i"], + [5274, 0, "n"], + [5274, 1], + [5273, 1], + [5272, 1], + [5272, 0, "i"], + [5273, 0, "n"], + [5274, 0, "g"], + [5275, 0, " "], + [5276, 0, "a"], + [5277, 0, "n"], + [5278, 0, "d"], + [5279, 0, " "], + [5280, 0, "r"], + [5281, 0, "e"], + [5282, 0, "c"], + [5283, 0, "e"], + [5284, 0, "i"], + [5285, 0, "v"], + [5286, 0, "i"], + [5287, 0, "n"], + [5288, 0, "g"], + [5289, 0, " "], + [5290, 0, "o"], + [5291, 0, "p"], + [5292, 0, "e"], + [5293, 0, "r"], + [5294, 0, "a"], + [5295, 0, "t"], + [5296, 0, "i"], + [5297, 0, "o"], + [5298, 0, "n"], + [5299, 0, "s"], + [5300, 0, "}"], + [5301, 0, "\n"], + [5302, 0, "\\"], + [5303, 0, "l"], + [5304, 0, "a"], + [5305, 0, "b"], + [5306, 0, "e"], + [5307, 0, "l"], + [5308, 0, "{"], + [5309, 0, "f"], + [5310, 0, "i"], + [5311, 0, "g"], + [5312, 0, ":"], + [5313, 0, "s"], + [5314, 0, "e"], + [5315, 0, "n"], + [5316, 0, "d"], + [5317, 0, "-"], + [5318, 0, "r"], + [5319, 0, "e"], + [5320, 0, "c"], + [5321, 0, "v"], + [5322, 0, "}"], + [5323, 0, "\n"], + [5324, 0, "\\"], + [5325, 0, "e"], + [5326, 0, "n"], + [5327, 0, "d"], + [5328, 0, "{"], + [5329, 0, "f"], + [5330, 0, "i"], + [5331, 0, "g"], + [5332, 0, "u"], + [5333, 0, "r"], + [5334, 0, "e"], + [5335, 0, "*"], + [5336, 0, "}"], + [5338, 0, "\n"], + [5339, 0, "\\"], + [5340, 0, "b"], + [5341, 0, "e"], + [5342, 0, "g"], + [5343, 0, "i"], + [5344, 0, "n"], + [5345, 0, "{"], + [5346, 0, "f"], + [5347, 0, "i"], + [5348, 0, "g"], + [5349, 0, "u"], + [5350, 0, "r"], + [5351, 0, "e"], + [5352, 0, "*"], + [5353, 0, "}"], + [4697, 1], + [4696, 1], + [4695, 1], + [4694, 1], + [4693, 1], + [4692, 1], + [4691, 1], + [4690, 1], + [4689, 1], + [4688, 1], + [4687, 1], + [4686, 1], + [4685, 1], + [4684, 1], + [4683, 1], + [4682, 1], + [4682, 0, "p"], + [4683, 0, "r"], + [4684, 0, "o"], + [4685, 0, "o"], + [4686, 0, "f"], + [4687, 0, "S"], + [4688, 0, "k"], + [4689, 0, "i"], + [4690, 0, "p"], + [4691, 0, "A"], + [4692, 0, "m"], + [4693, 0, "o"], + [4694, 0, "u"], + [4695, 0, "n"], + [4696, 0, "t"], + [4697, 0, "'"], + [4698, 0, "l"], + [4699, 0, "e"], + [4700, 0, "a"], + [4701, 0, "v"], + [4702, 0, "e"], + [4703, 0, "v"], + [4704, 0, "m"], + [4705, 0, "o"], + [4706, 0, "d"], + [4707, 0, "e"], + [4697, 1], + [4697, 0, "\\"], + [4899, 1], + [4898, 1], + [4897, 1], + [4896, 1], + [4895, 1], + [4894, 1], + [4893, 1], + [4892, 1], + [4891, 1], + [4890, 1], + [4889, 1], + [4888, 1], + [4887, 1], + [4886, 1], + [4886, 0, "D"], + [4887, 0, "i"], + [4888, 0, "s"], + [4889, 0, "p"], + [4890, 0, "l"], + [4891, 0, "a"], + [4892, 0, "y"], + [4893, 0, "P"], + [4894, 0, "r"], + [4895, 0, "o"], + [4896, 0, "o"], + [4897, 0, "f"], + [4898, 0, "\\"], + [4898, 1], + [4898, 0, "\n"], + [4899, 0, "%"], + [4900, 0, "\n"], + [4901, 0, "\\"], + [4902, 0, "D"], + [4903, 0, "i"], + [4904, 0, "s"], + [4905, 0, "p"], + [4906, 0, "l"], + [4907, 0, "a"], + [4908, 0, "y"], + [4909, 0, "P"], + [4910, 0, "r"], + [4911, 0, "o"], + [4912, 0, "o"], + [4913, 0, "f"], + [4914, 0, "\\"], + [4915, 0, "p"], + [4916, 0, "r"], + [4917, 0, "o"], + [4918, 0, "o"], + [4919, 0, "f"], + [4920, 0, "S"], + [4921, 0, "k"], + [4922, 0, "i"], + [4923, 0, "p"], + [4924, 0, "A"], + [4925, 0, "m"], + [4926, 0, "o"], + [4927, 0, "u"], + [4928, 0, "n"], + [4929, 0, "t"], + [4900, 0, "\n"], + [4901, 0, "\\"], + [4902, 0, "A"], + [4903, 0, "x"], + [4904, 0, "i"], + [4905, 0, "o"], + [4906, 0, "m"], + [4907, 0, "C"], + [4908, 0, "{"], + [4909, 0, "}"], + [4910, 0, "\n"], + [4911, 0, "\\"], + [4912, 0, "L"], + [4913, 0, "e"], + [4914, 0, "f"], + [4915, 0, "t"], + [4916, 0, "L"], + [4917, 0, "a"], + [4918, 0, "b"], + [4919, 0, "e"], + [4920, 0, "l"], + [4921, 0, "{"], + [4922, 0, "\\"], + [4923, 0, "T"], + [4924, 0, "e"], + [4925, 0, "x"], + [4926, 0, "t"], + [4927, 0, "s"], + [4928, 0, "c"], + [4923, 1], + [4923, 0, "t"], + [4929, 0, "{"], + [4930, 0, "Y"], + [4931, 0, "i"], + [4932, 0, "e"], + [4933, 0, "l"], + [4934, 0, "d"], + [4935, 0, "-"], + [4936, 0, "N"], + [4937, 0, "O"], + [4938, 0, "P"], + [4939, 0, "}"], + [4940, 0, "}"], + [4941, 0, "\n"], + [4942, 0, "\\"], + [4943, 0, "U"], + [4944, 0, "n"], + [4945, 0, "a"], + [4946, 0, "r"], + [4947, 0, "y"], + [4948, 0, "I"], + [4949, 0, "n"], + [4950, 0, "f"], + [4951, 0, "C"], + [4952, 0, "{"], + [4953, 0, "$"], + [4954, 0, "A"], + [4955, 0, "_"], + [4956, 0, "p"], + [4957, 0, ","], + [4958, 0, "\\"], + [4959, 0, ";"], + [4960, 0, " "], + [4961, 0, "\\"], + [4962, 0, "m"], + [4963, 0, "a"], + [4964, 0, "t"], + [4965, 0, "h"], + [4966, 0, "s"], + [4967, 0, "f"], + [4968, 0, "{"], + [4969, 0, "y"], + [4970, 0, "i"], + [4971, 0, "e"], + [4972, 0, "l"], + [4973, 0, "d"], + [4974, 0, "}"], + [4975, 0, " "], + [4976, 0, "\\"], + [4977, 0, "e"], + [4978, 0, "v"], + [4979, 0, "a"], + [4980, 0, "l"], + [4981, 0, "t"], + [4982, 0, "o"], + [4983, 0, " "], + [4984, 0, "A"], + [4985, 0, "_"], + [4986, 0, "p"], + [4987, 0, "$"], + [4988, 0, "}"], + [4898, 0, "\\"], + [4899, 0, "h"], + [4900, 0, "s"], + [4901, 0, "p"], + [4902, 0, "a"], + [4903, 0, "c"], + [4904, 0, "e"], + [4905, 0, "{"], + [4906, 0, "3"], + [4907, 0, "0"], + [4908, 0, "p"], + [4909, 0, "t"], + [4910, 0, "}"], + [4909, 1], + [4908, 1], + [4907, 1], + [4907, 0, "e"], + [4908, 0, "m"], + [5495, 0, "\n"], + [5496, 0, "\\"], + [5497, 0, "b"], + [5498, 0, "e"], + [5499, 0, "g"], + [5500, 0, "i"], + [5501, 0, "n"], + [5502, 0, "{"], + [5503, 0, "p"], + [5504, 0, "r"], + [5505, 0, "o"], + [5506, 0, "o"], + [5507, 0, "f"], + [5508, 0, "t"], + [5509, 0, "r"], + [5510, 0, "e"], + [5511, 0, "e"], + [5512, 0, "}"], + [5513, 0, "\n"], + [5514, 0, "\\"], + [5515, 0, "e"], + [5516, 0, "n"], + [5517, 0, "d"], + [5518, 0, "{"], + [5519, 0, "P"], + [5519, 1], + [5519, 0, "p"], + [5520, 0, "r"], + [5521, 0, "o"], + [5522, 0, "o"], + [5523, 0, "f"], + [5524, 0, "t"], + [5525, 0, "r"], + [5526, 0, "e"], + [5527, 0, "e"], + [5528, 0, "}"], + [5529, 0, "\n"], + [5513, 0, "\n"], + [5514, 0, "\\"], + [5515, 0, "L"], + [5516, 0, "e"], + [5517, 0, "f"], + [5518, 0, "t"], + [5519, 0, "L"], + [5520, 0, "a"], + [5521, 0, "b"], + [5522, 0, "e"], + [5523, 0, "l"], + [5524, 0, "{"], + [5525, 0, "\\"], + [5526, 0, "t"], + [5527, 0, "e"], + [5528, 0, "x"], + [5529, 0, "t"], + [5530, 0, "s"], + [5531, 0, "c"], + [5532, 0, "{"], + [5533, 0, "I"], + [5534, 0, "n"], + [5535, 0, "s"], + [5536, 0, "e"], + [5537, 0, "r"], + [5538, 0, "t"], + [5539, 0, "}"], + [5540, 0, "}"], + [5541, 0, "\n"], + [5541, 1], + [5513, 0, "\n"], + [5514, 0, "\\"], + [5515, 0, "A"], + [5516, 0, "x"], + [5517, 0, "i"], + [5518, 0, "o"], + [5519, 0, "m"], + [5520, 0, "C"], + [5521, 0, "{"], + [5522, 0, "$"], + [5523, 0, "$"], + [5524, 0, "}"], + [5523, 0, "A"], + [5524, 0, "_"], + [5525, 0, "p"], + [5526, 0, ","], + [5527, 0, ";"], + [5527, 1], + [5527, 0, "\\"], + [5528, 0, ";"], + [5529, 0, "\\"], + [5530, 0, "m"], + [5531, 0, "a"], + [5532, 0, "t"], + [5533, 0, "h"], + [5534, 0, "s"], + [5535, 0, "f"], + [5536, 0, "{"], + [5537, 0, "n"], + [5538, 0, "e"], + [5539, 0, "w"], + [5540, 0, "I"], + [5541, 0, "D"], + [5542, 0, "}"], + [5529, 0, " "], + [5544, 0, " "], + [5545, 0, "\\"], + [5546, 0, "e"], + [5547, 0, "v"], + [5548, 0, "a"], + [5549, 0, "l"], + [5550, 0, "t"], + [5551, 0, "o"], + [5552, 0, " "], + [5553, 0, "A"], + [5554, 0, "_"], + [5555, 0, "p"], + [5556, 0, "'"], + [5557, 0, ","], + [5558, 0, "\\"], + [5559, 0, ";"], + [5560, 0, " "], + [5561, 0, "\\"], + [5562, 0, "m"], + [5563, 0, "a"], + [5564, 0, "t"], + [5565, 0, "h"], + [5566, 0, "i"], + [5567, 0, "d"], + [5568, 0, "{"], + [5569, 0, "i"], + [5570, 0, "d"], + [5571, 0, "}"], + [5567, 1], + [5567, 0, "t"], + [5602, 0, "\n"], + [5603, 0, "\\"], + [5604, 0, "T"], + [5605, 0, "r"], + [5606, 0, "i"], + [5607, 0, "n"], + [5608, 0, "a"], + [5609, 0, "r"], + [5610, 0, "y"], + [5611, 0, "I"], + [5612, 0, "n"], + [5613, 0, "f"], + [5614, 0, "C"], + [5615, 0, "{"], + [5616, 0, "$"], + [5617, 0, "A"], + [5618, 0, "_"], + [5619, 0, "p"], + [5620, 0, ","], + [5621, 0, "\\"], + [5622, 0, ";"], + [5623, 0, " "], + [5624, 0, "\\"], + [5625, 0, "m"], + [5626, 0, "a"], + [5627, 0, "t"], + [5628, 0, "h"], + [5629, 0, "s"], + [5630, 0, "f"], + [5631, 0, "{"], + [5632, 0, "i"], + [5633, 0, "n"], + [5634, 0, "s"], + [5635, 0, "e"], + [5636, 0, "r"], + [5637, 0, "t"], + [5638, 0, "L"], + [5639, 0, "o"], + [5640, 0, "c"], + [5641, 0, "a"], + [5642, 0, "l"], + [5643, 0, "}"], + [5644, 0, "("], + [5645, 0, "\\"], + [5646, 0, "m"], + [5647, 0, "a"], + [5648, 0, "t"], + [5649, 0, "h"], + [5650, 0, "i"], + [5651, 0, "t"], + [5652, 0, "{"], + [5653, 0, "p"], + [5654, 0, "r"], + [5655, 0, "e"], + [5656, 0, "v"], + [5657, 0, "}"], + [5658, 0, ")"], + [5513, 0, "\n"], + [5514, 0, "\\"], + [5515, 0, "A"], + [5516, 0, "x"], + [5517, 0, "i"], + [5518, 0, "o"], + [5519, 0, "m"], + [5520, 0, "C"], + [5521, 0, "{"], + [5522, 0, "$"], + [5523, 0, "A"], + [5523, 1], + [5523, 0, "\\"], + [5524, 0, "m"], + [5525, 0, "a"], + [5526, 0, "t"], + [5527, 0, "h"], + [5528, 0, "i"], + [5529, 0, "t"], + [5530, 0, "{"], + [5531, 0, "p"], + [5532, 0, "r"], + [5533, 0, "e"], + [5534, 0, "v"], + [5535, 0, "}"], + [5536, 0, " "], + [5537, 0, "\\"], + [5538, 0, "i"], + [5539, 0, "n"], + [5540, 0, " "], + [5541, 0, "\\"], + [5542, 0, "m"], + [5543, 0, "a"], + [5544, 0, "t"], + [5545, 0, "h"], + [5546, 0, "r"], + [5547, 0, "m"], + [5548, 0, "{"], + [5549, 0, "d"], + [5550, 0, "o"], + [5551, 0, "m"], + [5552, 0, "}"], + [5553, 0, "("], + [5554, 0, "A"], + [5555, 0, "_"], + [5556, 0, "p"], + [5557, 0, ")"], + [5558, 0, "$"], + [5559, 0, "}"], + [5705, 0, ","], + [5706, 0, " "], + [5707, 0, "v"], + [5709, 0, " "], + [5710, 0, "\\"], + [5711, 0, "e"], + [5712, 0, "v"], + [5713, 0, "a"], + [5714, 0, "l"], + [5715, 0, "t"], + [5716, 0, "o"], + [5717, 0, " "], + [5718, 0, "A"], + [5719, 0, "_"], + [5720, 0, "p"], + [5721, 0, "'"], + [5722, 0, "'"], + [5723, 0, "$"], + [5724, 0, "}"], + [5621, 0, "\n"], + [5622, 0, "\\"], + [5623, 0, "A"], + [5624, 0, "x"], + [5625, 0, "i"], + [5626, 0, "o"], + [5627, 0, "m"], + [5628, 0, "C"], + [5629, 0, "{"], + [5630, 0, "$"], + [5631, 0, "A"], + [5632, 0, "_"], + [5633, 0, "p"], + [5634, 0, "'"], + [5635, 0, ","], + [5636, 0, "\\"], + [5637, 0, ";"], + [5637, 1], + [5636, 1], + [5635, 1], + [5634, 1], + [5633, 1], + [5632, 1], + [5631, 1], + [5631, 0, "\\"], + [5632, 0, "m"], + [5633, 0, "a"], + [5634, 0, "t"], + [5635, 0, "h"], + [5636, 0, "i"], + [5637, 0, "t"], + [5638, 0, "{"], + [5639, 0, "o"], + [5640, 0, "p"], + [5641, 0, "}"], + [5738, 1], + [5738, 0, "\n"], + [5739, 0, " "], + [5740, 0, " "], + [5741, 0, " "], + [5742, 0, " "], + [5748, 0, "["], + [5749, 0, "\\"], + [5750, 0, ","], + [5751, 0, "\\"], + [5752, 0, "m"], + [5753, 0, "a"], + [5754, 0, "t"], + [5755, 0, "h"], + [5756, 0, "i"], + [5757, 0, "t"], + [5757, 1], + [5756, 1], + [5756, 0, "s"], + [5757, 0, "f"], + [5758, 0, "{"], + [5759, 0, "n"], + [5760, 0, "e"], + [5761, 0, "w"], + [5762, 0, "O"], + [5763, 0, "p"], + [5764, 0, "s"], + [5765, 0, "}"], + [5766, 0, " "], + [5767, 0, "\\"], + [5768, 0, "m"], + [5769, 0, "a"], + [5770, 0, "p"], + [5771, 0, "s"], + [5772, 0, "t"], + [5773, 0, "o"], + [5774, 0, " "], + [5775, 0, "A"], + [5776, 0, "_"], + [5777, 0, "p"], + [5778, 0, "'"], + [5779, 0, "'"], + [5780, 0, "("], + [5781, 0, "\\"], + [5782, 0, "m"], + [5783, 0, "a"], + [5784, 0, "t"], + [5785, 0, "h"], + [5786, 0, "s"], + [5787, 0, "f"], + [5788, 0, "{"], + [5789, 0, "n"], + [5790, 0, "e"], + [5791, 0, "w"], + [5792, 0, "O"], + [5793, 0, "p"], + [5794, 0, "s"], + [5795, 0, "}"], + [5796, 0, ")"], + [5797, 0, " "], + [5798, 0, "\\"], + [5799, 0, "c"], + [5800, 0, "u"], + [5801, 0, "p"], + [5802, 0, " "], + [5803, 0, "\\"], + [5804, 0, "{"], + [5805, 0, "\\"], + [5806, 0, "m"], + [5807, 0, "a"], + [5808, 0, "t"], + [5809, 0, "h"], + [5810, 0, "i"], + [5811, 0, "t"], + [5812, 0, "{"], + [5813, 0, "o"], + [5814, 0, "p"], + [5815, 0, "}"], + [5816, 0, "\\"], + [5817, 0, "}"], + [5818, 0, "\\"], + [5819, 0, ","], + [5820, 0, "]"], + [5805, 0, "\\"], + [5805, 1], + [5805, 0, "("], + [5806, 0, "A"], + [5807, 0, "_"], + [5808, 0, "p"], + [5809, 0, "'"], + [5810, 0, "'"], + [5811, 0, "("], + [5812, 0, "\\"], + [5813, 0, "m"], + [5814, 0, "a"], + [5815, 0, "t"], + [5816, 0, "h"], + [5817, 0, "i"], + [5818, 0, "t"], + [5819, 0, "{"], + [5819, 1], + [5818, 1], + [5817, 1], + [5817, 0, "s"], + [5818, 0, "f"], + [5819, 0, "{"], + [5820, 0, "o"], + [5821, 0, "p"], + [5822, 0, "s"], + [5823, 0, "}"], + [5824, 0, ")"], + [5825, 0, ","], + [5826, 0, " "], + [5838, 0, ")"], + [5642, 0, " "], + [5643, 0, "="], + [5644, 0, " "], + [5645, 0, "\\"], + [5646, 0, "m"], + [5647, 0, "a"], + [5648, 0, "t"], + [5649, 0, "h"], + [5650, 0, "s"], + [5651, 0, "f"], + [5652, 0, "{"], + [5653, 0, "i"], + [5654, 0, "n"], + [5655, 0, "s"], + [5656, 0, "e"], + [5657, 0, "r"], + [5658, 0, "t"], + [5659, 0, "}"], + [5660, 0, "("], + [5661, 0, "\\"], + [5662, 0, "m"], + [5663, 0, "a"], + [5664, 0, "t"], + [5665, 0, "h"], + [5666, 0, "i"], + [5667, 0, "t"], + [5668, 0, "{"], + [5669, 0, "i"], + [5670, 0, "d"], + [5671, 0, "}"], + [5672, 0, ","], + [5673, 0, " "], + [5674, 0, "\\"], + [5675, 0, "m"], + [5676, 0, "a"], + [5677, 0, "t"], + [5678, 0, "h"], + [5679, 0, "i"], + [5680, 0, "t"], + [5681, 0, "{"], + [5682, 0, "p"], + [5683, 0, "r"], + [5684, 0, "e"], + [5685, 0, "v"], + [5686, 0, "}"], + [5687, 0, ","], + [5688, 0, " "], + [5689, 0, "v"], + [5690, 0, ")"], + [5691, 0, "$"], + [5692, 0, "}"], + [5693, 0, "\n"], + [5694, 0, "\\"], + [5695, 0, "A"], + [5696, 0, "x"], + [5697, 0, "c"], + [5697, 1], + [5697, 0, "i"], + [5698, 0, "o"], + [5699, 0, "m"], + [5700, 0, "C"], + [5701, 0, "{"], + [5702, 0, "$"], + [5703, 0, "$"], + [5704, 0, "}"], + [5703, 0, "A"], + [5704, 0, "_"], + [5705, 0, "p"], + [5706, 0, "'"], + [5707, 0, ","], + [5708, 0, " "], + [5709, 0, "\\"], + [5710, 0, "m"], + [5711, 0, "a"], + [5712, 0, "t"], + [5713, 0, "h"], + [5714, 0, "i"], + [5715, 0, "t"], + [5716, 0, "{"], + [5717, 0, "o"], + [5718, 0, "p"], + [5719, 0, "}"], + [5720, 0, " "], + [5721, 0, "\\"], + [5722, 0, "e"], + [5723, 0, "v"], + [5724, 0, "a"], + [5725, 0, "l"], + [5726, 0, "t"], + [5727, 0, "o"], + [5728, 0, " "], + [5729, 0, "A"], + [5730, 0, "_"], + [5731, 0, "p"], + [5732, 0, "'"], + [5733, 0, "'"], + [5768, 1], + [5767, 1], + [5766, 1], + [5766, 0, "Q"], + [5767, 0, "u"], + [5768, 0, "a"], + [5769, 0, "t"], + [5770, 0, "e"], + [5771, 0, "r"], + [5938, 0, ","], + [5939, 0, "\\"], + [5940, 0, ";"], + [5941, 0, "\n"], + [5942, 0, " "], + [5943, 0, " "], + [5944, 0, " "], + [5945, 0, " "], + [5946, 0, "\\"], + [5947, 0, "m"], + [5948, 0, "a"], + [5949, 0, "t"], + [5950, 0, "h"], + [5951, 0, "s"], + [5952, 0, "f"], + [5953, 0, "{"], + [5954, 0, "o"], + [5955, 0, "p"], + [5956, 0, "s"], + [5957, 0, "}"], + [5861, 1], + [5860, 1], + [5859, 1], + [5858, 1], + [5857, 1], + [5856, 1], + [5856, 0, "q"], + [5857, 0, "u"], + [5858, 0, "e"], + [5859, 0, "u"], + [5860, 0, "e"], + [5890, 1], + [5889, 1], + [5888, 1], + [5887, 1], + [5886, 1], + [5885, 1], + [5885, 0, "q"], + [5886, 0, "u"], + [5887, 0, "e"], + [5888, 0, "u"], + [5889, 0, "e"], + [4655, 1], + [4654, 1], + [4653, 1], + [4652, 1], + [4651, 1], + [4650, 1], + [4650, 0, "q"], + [4651, 0, "u"], + [4652, 0, "e"], + [4653, 0, "u"], + [4654, 0, "e"], + [5000, 1], + [4999, 1], + [4998, 1], + [4997, 1], + [4996, 1], + [4995, 1], + [4994, 1], + [4993, 1], + [4992, 1], + [4991, 1], + [4990, 1], + [4989, 1], + [4988, 1], + [4987, 1], + [4986, 1], + [4985, 1], + [4984, 1], + [4983, 1], + [4982, 1], + [4981, 1], + [4980, 1], + [4979, 1], + [4978, 1], + [4977, 1], + [4976, 1], + [4975, 1], + [4974, 1], + [4973, 1], + [4972, 1], + [4971, 1], + [4970, 1], + [4969, 1], + [4968, 1], + [4967, 1], + [4966, 1], + [4965, 1], + [4964, 1], + [4963, 1], + [4962, 1], + [4961, 1], + [4960, 1], + [4959, 1], + [4958, 1], + [4957, 1], + [4956, 1], + [4955, 1], + [4954, 1], + [4953, 1], + [4952, 1], + [4951, 1], + [4950, 1], + [4949, 1], + [4948, 1], + [4947, 1], + [4946, 1], + [4945, 1], + [4944, 1], + [4943, 1], + [4942, 1], + [4941, 1], + [4940, 1], + [4939, 1], + [4938, 1], + [4937, 1], + [4936, 1], + [4935, 1], + [4934, 1], + [4933, 1], + [4932, 1], + [4931, 1], + [4930, 1], + [4929, 1], + [4928, 1], + [4927, 1], + [4926, 1], + [4925, 1], + [4924, 1], + [4923, 1], + [4922, 1], + [4921, 1], + [4920, 1], + [4919, 1], + [4918, 1], + [4917, 1], + [4916, 1], + [4915, 1], + [4914, 1], + [4913, 1], + [4912, 1], + [4911, 1], + [4910, 1], + [4909, 1], + [4908, 1], + [4907, 1], + [4906, 1], + [4905, 1], + [4904, 1], + [4903, 1], + [4902, 1], + [4901, 1], + [4900, 1], + [4899, 1], + [4898, 1], + [4897, 1], + [4896, 1], + [4895, 1], + [4894, 1], + [4893, 1], + [4892, 1], + [4891, 1], + [4890, 1], + [4889, 1], + [4888, 1], + [4887, 1], + [4886, 1], + [4885, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 1], + [4884, 0, "\\"], + [4885, 0, "e"], + [4886, 0, "n"], + [4887, 0, "d"], + [4888, 0, "{"], + [4889, 0, "p"], + [4890, 0, "r"], + [4891, 0, "o"], + [4892, 0, "o"], + [4893, 0, "f"], + [4894, 0, "t"], + [4895, 0, "r"], + [4896, 0, "e"], + [4897, 0, "e"], + [4898, 0, "}"], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 1], + [4680, 0, "\\"], + [4681, 0, "b"], + [4682, 0, "e"], + [4683, 0, "g"], + [4684, 0, "i"], + [4685, 0, "n"], + [4686, 0, "{"], + [4687, 0, "p"], + [4688, 0, "r"], + [4689, 0, "o"], + [4690, 0, "o"], + [4691, 0, "f"], + [4692, 0, "t"], + [4693, 0, "r"], + [4694, 0, "e"], + [4695, 0, "e"], + [4696, 0, "}"], + [5814, 0, " "], + [5815, 0, "\\"], + [5816, 0, "m"], + [5817, 0, "a"], + [5818, 0, "p"], + [5819, 0, "s"], + [5820, 0, "t"], + [5821, 0, "o"], + [5822, 0, " "], + [5823, 0, "A"], + [5824, 0, "_"], + [5825, 0, "p"], + [5826, 0, "'"], + [5827, 0, "'"], + [5828, 0, "("], + [5829, 0, "\\"], + [5830, 0, "m"], + [5831, 0, "a"], + [5832, 0, "t"], + [5833, 0, "h"], + [5834, 0, "s"], + [5835, 0, "f"], + [5836, 0, "{"], + [5837, 0, "o"], + [5838, 0, "p"], + [5839, 0, "s"], + [5840, 0, "}"], + [5841, 0, " "], + [5842, 0, "\\"], + [5842, 1], + [5841, 1], + [5840, 1], + [5840, 0, "}"], + [5841, 0, ")"], + [5842, 0, " "], + [5843, 0, "\\"], + [5844, 0, "c"], + [5845, 0, "u"], + [5846, 0, "p"], + [5847, 0, " "], + [5848, 0, "\\"], + [5849, 0, "{"], + [5850, 0, "\\"], + [5851, 0, "m"], + [5852, 0, "a"], + [5853, 0, "t"], + [5854, 0, "h"], + [5855, 0, "i"], + [5856, 0, "t"], + [5857, 0, "{"], + [5858, 0, "o"], + [5859, 0, "p"], + [5860, 0, "}"], + [5861, 0, "\\"], + [5862, 0, "}"], + [5227, 0, "\n"], + [5228, 0, "\n"], + [5229, 0, "\\"], + [5230, 0, "b"], + [5231, 0, "e"], + [5232, 0, "g"], + [5233, 0, "i"], + [5234, 0, "n"], + [5235, 0, "{"], + [5236, 0, "p"], + [5237, 0, "r"], + [5238, 0, "o"], + [5239, 0, "o"], + [5240, 0, "f"], + [5241, 0, "t"], + [5242, 0, "r"], + [5243, 0, "e"], + [5244, 0, "e"], + [5245, 0, "}"], + [5246, 0, "\n"], + [5247, 0, "\\"], + [5248, 0, "e"], + [5249, 0, "n"], + [5250, 0, "d"], + [5251, 0, "{"], + [5252, 0, "p"], + [5253, 0, "r"], + [5254, 0, "o"], + [5255, 0, "o"], + [5256, 0, "f"], + [5257, 0, "t"], + [5258, 0, "r"], + [5259, 0, "e"], + [5260, 0, "e"], + [5261, 0, "}"], + [5246, 0, "\n"], + [5247, 0, "\\"], + [5248, 0, "B"], + [5249, 0, "i"], + [5250, 0, "n"], + [5251, 0, "a"], + [5252, 0, "r"], + [5253, 0, "y"], + [5254, 0, "I"], + [5255, 0, "n"], + [5256, 0, "f"], + [5257, 0, "C"], + [5258, 0, "{"], + [5259, 0, "$"], + [5260, 0, "A"], + [5261, 0, "_"], + [5262, 0, "p"], + [5263, 0, ","], + [5264, 0, "\\"], + [5265, 0, ";"], + [5092, 0, "-"], + [5093, 0, "R"], + [5093, 1], + [5092, 1], + [5266, 0, " "], + [5267, 0, "\\"], + [5268, 0, "m"], + [5269, 0, "a"], + [5270, 0, "t"], + [5271, 0, "h"], + [5272, 0, "i"], + [5273, 0, "t"], + [5274, 0, "{"], + [5275, 0, "c"], + [5276, 0, "m"], + [5277, 0, "d"], + [5278, 0, "}"], + [5279, 0, " "], + [5280, 0, "\\"], + [5281, 0, "e"], + [5282, 0, "v"], + [5283, 0, "a"], + [5284, 0, "l"], + [5285, 0, "t"], + [5286, 0, "o"], + [5287, 0, " "], + [5288, 0, "A"], + [5289, 0, "_"], + [5290, 0, "p"], + [5291, 0, "'"], + [5292, 0, ","], + [5293, 0, "\\"], + [5294, 0, ";"], + [5295, 0, " "], + [5295, 1], + [5294, 1], + [5293, 1], + [5292, 1], + [5292, 0, "["], + [5293, 0, "\\"], + [5294, 0, ","], + [5246, 0, "\n"], + [5247, 0, "\\"], + [5248, 0, "A"], + [5249, 0, "x"], + [5250, 0, "i"], + [5251, 0, "o"], + [5252, 0, "m"], + [5253, 0, "C"], + [5254, 0, "{"], + [5255, 0, "$"], + [5256, 0, "A"], + [5257, 0, "_"], + [5258, 0, "p"], + [5259, 0, ","], + [5260, 0, "\\"], + [5261, 0, ";"], + [5262, 0, " "], + [5263, 0, "\\"], + [5264, 0, "m"], + [5265, 0, "a"], + [5266, 0, "t"], + [5267, 0, "h"], + [5268, 0, "i"], + [5269, 0, "t"], + [5270, 0, "{"], + [5271, 0, "c"], + [5272, 0, "m"], + [5273, 0, "d"], + [5274, 0, "}"], + [5275, 0, " "], + [5276, 0, "\\"], + [5277, 0, "e"], + [5278, 0, "v"], + [5279, 0, "a"], + [5280, 0, "l"], + [5281, 0, "t"], + [5282, 0, "o"], + [5283, 0, " "], + [5284, 0, "A"], + [5285, 0, "_"], + [5286, 0, "p"], + [5287, 0, "'"], + [5288, 0, ","], + [5289, 0, "\\"], + [5290, 0, ";"], + [5291, 0, "\\"], + [5292, 0, "m"], + [5293, 0, "a"], + [5291, 0, " "], + [5295, 0, "t"], + [5296, 0, "h"], + [5297, 0, "i"], + [5298, 0, "t"], + [5299, 0, "{"], + [5300, 0, "o"], + [5301, 0, "p"], + [5302, 0, "}"], + [5303, 0, "$"], + [5304, 0, "}"], + [5307, 1], + [5307, 1], + [5307, 0, "U"], + [5305, 0, "\n"], + [5306, 0, "\\"], + [5307, 0, "L"], + [5308, 0, "e"], + [5309, 0, "f"], + [5310, 0, "t"], + [5311, 0, "L"], + [5312, 0, "a"], + [5313, 0, "b"], + [5314, 0, "e"], + [5315, 0, "l"], + [5092, 0, "-"], + [5093, 0, "R"], + [5094, 0, "e"], + [5095, 0, "m"], + [5096, 0, "o"], + [5097, 0, "t"], + [5098, 0, "e"], + [5323, 0, "{"], + [5324, 0, "\\"], + [5325, 0, "t"], + [5326, 0, "e"], + [5327, 0, "x"], + [5328, 0, "t"], + [5329, 0, "s"], + [5330, 0, "c"], + [5331, 0, "{"], + [5332, 0, "A"], + [5333, 0, "p"], + [5334, 0, "p"], + [5335, 0, "l"], + [5336, 0, "y"], + [5337, 0, "-"], + [5338, 0, "L"], + [5339, 0, "o"], + [5340, 0, "c"], + [5341, 0, "a"], + [5342, 0, "l"], + [5343, 0, "}"], + [5344, 0, "}"], + [5393, 0, "\n"], + [5394, 0, " "], + [5395, 0, " "], + [5396, 0, " "], + [5397, 0, " "], + [5398, 0, "\\"], + [5399, 0, "m"], + [5400, 0, "a"], + [5401, 0, "t"], + [5402, 0, "h"], + [5403, 0, "s"], + [5404, 0, "f"], + [5405, 0, "{"], + [5406, 0, "q"], + [5407, 0, "u"], + [5408, 0, "e"], + [5409, 0, "u"], + [5410, 0, "e"], + [5411, 0, "}"], + [5412, 0, " "], + [5413, 0, "\\"], + [5414, 0, "m"], + [5415, 0, "a"], + [5416, 0, "p"], + [5417, 0, "s"], + [5418, 0, "t"], + [5419, 0, "o"], + [5420, 0, " "], + [5421, 0, "\\"], + [5421, 1], + [5421, 0, "A"], + [5422, 0, "_"], + [5423, 0, "p"], + [5424, 0, "'"], + [5425, 0, "("], + [5426, 0, "\\"], + [5427, 0, "m"], + [5428, 0, "a"], + [5429, 0, "t"], + [5430, 0, "h"], + [5431, 0, "s"], + [5432, 0, "f"], + [5433, 0, "{"], + [5434, 0, "q"], + [5435, 0, "u"], + [5436, 0, "e"], + [5437, 0, "u"], + [5438, 0, "e"], + [5439, 0, "}"], + [5440, 0, ")"], + [5441, 0, " "], + [5442, 0, "\\"], + [5443, 0, "c"], + [5444, 0, "u"], + [5445, 0, "p"], + [5446, 0, " "], + [5447, 0, "\\"], + [5448, 0, "{"], + [5449, 0, "("], + [5450, 0, "A"], + [5451, 0, "_"], + [5452, 0, "p"], + [5453, 0, "'"], + [5454, 0, "("], + [5455, 0, "\\"], + [5456, 0, "m"], + [5457, 0, "a"], + [5458, 0, "t"], + [5459, 0, "h"], + [5460, 0, "s"], + [5461, 0, "f"], + [5462, 0, "{"], + [5463, 0, "o"], + [5464, 0, "p"], + [5465, 0, "s"], + [5466, 0, "}"], + [5467, 0, ")"], + [5468, 0, ","], + [5469, 0, " "], + [5470, 0, "\\"], + [5471, 0, "m"], + [5472, 0, "a"], + [5473, 0, "t"], + [5474, 0, "h"], + [5475, 0, "i"], + [5476, 0, "t"], + [5477, 0, "{"], + [5478, 0, "o"], + [5479, 0, "p"], + [5480, 0, "}"], + [5481, 0, ")"], + [5482, 0, "\\"], + [5483, 0, "}"], + [5484, 0, ","], + [5485, 0, "\\"], + [5486, 0, ";"], + [5487, 0, "\n"], + [5488, 0, " "], + [5489, 0, " "], + [5490, 0, " "], + [5491, 0, " "], + [5492, 0, "\\"], + [5493, 0, "m"], + [5494, 0, "a"], + [5495, 0, "t"], + [5496, 0, "h"], + [5497, 0, "s"], + [5498, 0, "f"], + [5499, 0, "{"], + [5500, 0, "o"], + [5501, 0, "p"], + [5502, 0, "s"], + [5503, 0, "}"], + [5504, 0, " "], + [5505, 0, "\\"], + [5506, 0, "m"], + [5507, 0, "a"], + [5508, 0, "p"], + [5509, 0, "s"], + [5510, 0, "t"], + [5511, 0, "o"], + [5512, 0, " "], + [5513, 0, "A"], + [5514, 0, "_"], + [5515, 0, "p"], + [5516, 0, "'"], + [5517, 0, "("], + [5518, 0, "\\"], + [5519, 0, "m"], + [5520, 0, "a"], + [5521, 0, "t"], + [5522, 0, "h"], + [5523, 0, "s"], + [5524, 0, "f"], + [5525, 0, "{"], + [5526, 0, "o"], + [5527, 0, "p"], + [5528, 0, "s"], + [5529, 0, "}"], + [5530, 0, ")"], + [5531, 0, " "], + [5532, 0, "\\"], + [5533, 0, "c"], + [5534, 0, "u"], + [5535, 0, "p"], + [5536, 0, " "], + [5537, 0, "\\"], + [5538, 0, "{"], + [5539, 0, "\\"], + [5540, 0, "m"], + [5541, 0, "a"], + [5542, 0, "t"], + [5543, 0, "h"], + [5544, 0, "i"], + [5545, 0, "t"], + [5546, 0, "{"], + [5547, 0, "o"], + [5548, 0, "p"], + [5549, 0, "}"], + [5550, 0, "\\"], + [5551, 0, "}"], + [5552, 0, "\\"], + [5553, 0, ","], + [5554, 0, "]"], + [5555, 0, "$"], + [5556, 0, "}"], + [4889, 0, "\n"], + [4890, 0, "\n"], + [4891, 0, "\\"], + [4892, 0, "b"], + [4893, 0, "e"], + [4894, 0, "g"], + [4895, 0, "i"], + [4896, 0, "n"], + [4897, 0, "{"], + [4898, 0, "p"], + [4899, 0, "r"], + [4900, 0, "o"], + [4901, 0, "o"], + [4902, 0, "f"], + [4903, 0, "t"], + [4904, 0, "r"], + [4905, 0, "e"], + [4906, 0, "e"], + [4907, 0, "}"], + [4908, 0, "\n"], + [4909, 0, "\\"], + [4910, 0, "A"], + [4911, 0, "x"], + [4912, 0, "i"], + [4913, 0, "o"], + [4914, 0, "m"], + [4915, 0, "C"], + [4916, 0, "{"], + [4917, 0, "$"], + [4918, 0, "A"], + [4919, 0, "_"], + [4920, 0, "p"], + [4921, 0, ","], + [4922, 0, "\\"], + [4923, 0, ";"], + [4924, 0, " "], + [4925, 0, "\\"], + [4926, 0, "m"], + [4927, 0, "a"], + [4928, 0, "t"], + [4929, 0, "h"], + [4930, 0, "i"], + [4931, 0, "t"], + [4932, 0, "{"], + [4933, 0, "c"], + [4934, 0, "m"], + [4935, 0, "d"], + [4936, 0, "}"], + [4937, 0, " "], + [4938, 0, "\\"], + [4939, 0, "e"], + [4940, 0, "v"], + [4941, 0, "a"], + [4942, 0, "l"], + [4943, 0, "t"], + [4944, 0, "o"], + [4945, 0, " "], + [4946, 0, "A"], + [4947, 0, "_"], + [4948, 0, "p"], + [4949, 0, "'"], + [4950, 0, ","], + [4951, 0, "\\"], + [4952, 0, ";"], + [4953, 0, " "], + [4954, 0, "\\"], + [4955, 0, "m"], + [4956, 0, "a"], + [4957, 0, "t"], + [4958, 0, "h"], + [4959, 0, "i"], + [4960, 0, "t"], + [4961, 0, "{"], + [4962, 0, "o"], + [4963, 0, "p"], + [4964, 0, "}"], + [4965, 0, "$"], + [4966, 0, "}"], + [4967, 0, "\n"], + [4968, 0, "\\"], + [4969, 0, "L"], + [4970, 0, "e"], + [4971, 0, "f"], + [4972, 0, "t"], + [4973, 0, "L"], + [4974, 0, "a"], + [4975, 0, "b"], + [4976, 0, "e"], + [4977, 0, "l"], + [4978, 0, "{"], + [4979, 0, "\\"], + [4980, 0, "t"], + [4981, 0, "e"], + [4982, 0, "x"], + [4983, 0, "t"], + [4984, 0, "s"], + [4985, 0, "c"], + [4986, 0, "{"], + [4987, 0, "A"], + [4988, 0, "p"], + [4989, 0, "p"], + [4990, 0, "l"], + [4991, 0, "y"], + [4992, 0, "-"], + [4993, 0, "L"], + [4994, 0, "o"], + [4995, 0, "c"], + [4996, 0, "a"], + [4997, 0, "l"], + [4998, 0, "}"], + [4999, 0, "}"], + [5000, 0, "\n"], + [5001, 0, "\\"], + [5002, 0, "U"], + [5003, 0, "n"], + [5004, 0, "a"], + [5005, 0, "r"], + [5006, 0, "y"], + [5007, 0, "I"], + [5008, 0, "n"], + [5009, 0, "f"], + [5010, 0, "C"], + [5011, 0, "{"], + [5012, 0, "$"], + [5013, 0, "A"], + [5014, 0, "_"], + [5015, 0, "p"], + [5016, 0, ","], + [5017, 0, "\\"], + [5018, 0, ";"], + [5019, 0, " "], + [5020, 0, "\\"], + [5021, 0, "m"], + [5022, 0, "a"], + [5023, 0, "t"], + [5024, 0, "h"], + [5025, 0, "i"], + [5026, 0, "t"], + [5027, 0, "{"], + [5028, 0, "c"], + [5029, 0, "m"], + [5030, 0, "d"], + [5031, 0, "}"], + [5032, 0, " "], + [5033, 0, "\\"], + [5034, 0, "e"], + [5035, 0, "v"], + [5036, 0, "a"], + [5037, 0, "l"], + [5038, 0, "t"], + [5039, 0, "o"], + [5040, 0, " "], + [5041, 0, "A"], + [5042, 0, "_"], + [5043, 0, "p"], + [5044, 0, "'"], + [5045, 0, ","], + [5046, 0, "\\"], + [5046, 1], + [5045, 1], + [5045, 0, "["], + [5046, 0, "\\"], + [5047, 0, ","], + [5048, 0, "\n"], + [5049, 0, " "], + [5050, 0, " "], + [5051, 0, " "], + [5052, 0, " "], + [5053, 0, "\\"], + [5054, 0, "m"], + [5055, 0, "a"], + [5056, 0, "t"], + [5057, 0, "h"], + [5058, 0, "s"], + [5059, 0, "f"], + [5060, 0, "{"], + [5061, 0, "q"], + [5062, 0, "u"], + [5063, 0, "e"], + [5064, 0, "u"], + [5065, 0, "e"], + [5066, 0, "}"], + [5067, 0, " "], + [5068, 0, "\\"], + [5069, 0, "m"], + [5070, 0, "a"], + [5071, 0, "p"], + [5072, 0, "s"], + [5073, 0, "t"], + [5074, 0, "o"], + [5075, 0, " "], + [5076, 0, "A"], + [5077, 0, "_"], + [5078, 0, "p"], + [5079, 0, "'"], + [5080, 0, "("], + [5081, 0, "\\"], + [5082, 0, "m"], + [5083, 0, "a"], + [5084, 0, "t"], + [5085, 0, "h"], + [5086, 0, "s"], + [5087, 0, "f"], + [5088, 0, "{"], + [5089, 0, "q"], + [5090, 0, "u"], + [5091, 0, "e"], + [5092, 0, "u"], + [5093, 0, "e"], + [5094, 0, "}"], + [5095, 0, ")"], + [5096, 0, " "], + [5097, 0, "\\"], + [5098, 0, "c"], + [5099, 0, "u"], + [5100, 0, "p"], + [5101, 0, " "], + [5102, 0, "\\"], + [5103, 0, "{"], + [5104, 0, "("], + [5105, 0, "A"], + [5106, 0, "_"], + [5107, 0, "p"], + [5108, 0, "'"], + [5109, 0, "("], + [5110, 0, "\\"], + [5111, 0, "m"], + [5112, 0, "a"], + [5113, 0, "t"], + [5114, 0, "h"], + [5115, 0, "s"], + [5116, 0, "f"], + [5117, 0, "{"], + [5118, 0, "o"], + [5119, 0, "p"], + [5120, 0, "s"], + [5121, 0, "}"], + [5122, 0, ")"], + [5123, 0, ","], + [5124, 0, " "], + [5125, 0, "\\"], + [5126, 0, "m"], + [5127, 0, "a"], + [5128, 0, "t"], + [5129, 0, "h"], + [5130, 0, "i"], + [5131, 0, "t"], + [5132, 0, "{"], + [5133, 0, "o"], + [5134, 0, "p"], + [5135, 0, "}"], + [5136, 0, ")"], + [5137, 0, "\\"], + [5138, 0, "}"], + [5139, 0, ","], + [5140, 0, "\\"], + [5141, 0, "'"], + [5141, 1], + [5141, 0, ";"], + [5142, 0, "\n"], + [5143, 0, " "], + [5144, 0, " "], + [5145, 0, " "], + [5146, 0, " "], + [5147, 0, "\\"], + [5148, 0, "m"], + [5149, 0, "a"], + [5150, 0, "t"], + [5151, 0, "h"], + [5152, 0, "s"], + [5153, 0, "f"], + [5154, 0, "{"], + [5155, 0, "o"], + [5156, 0, "p"], + [5157, 0, "s"], + [5158, 0, "}"], + [5159, 0, " "], + [5160, 0, "\\"], + [5161, 0, "m"], + [5162, 0, "a"], + [5163, 0, "p"], + [5164, 0, "s"], + [5165, 0, "t"], + [5166, 0, "o"], + [5167, 0, " "], + [5168, 0, "\\"], + [5169, 0, "A"], + [5170, 0, "_"], + [5171, 0, "p"], + [5172, 0, "'"], + [5173, 0, "("], + [5174, 0, "\\"], + [5175, 0, "m"], + [5176, 0, "a"], + [5177, 0, "t"], + [5178, 0, "h"], + [5179, 0, "s"], + [5180, 0, "f"], + [5181, 0, "{"], + [5182, 0, "o"], + [5183, 0, "p"], + [5184, 0, "s"], + [5185, 0, "}"], + [5186, 0, ")"], + [5187, 0, " "], + [5188, 0, "\\"], + [5189, 0, "c"], + [5190, 0, "u"], + [5191, 0, "p"], + [5097, 0, "\\"], + [5098, 0, ";"], + [5103, 0, "\\"], + [5104, 0, ";"], + [5196, 0, " "], + [5197, 0, "\\"], + [5198, 0, "{"], + [5199, 0, "\\"], + [5200, 0, "m"], + [5201, 0, "a"], + [5202, 0, "t"], + [5203, 0, "h"], + [5204, 0, "i"], + [5205, 0, "t"], + [5206, 0, "{"], + [5207, 0, "o"], + [5208, 0, "p"], + [5209, 0, "}"], + [5210, 0, "\\"], + [5211, 0, "}"], + [5212, 0, "\\"], + [5213, 0, ","], + [5214, 0, "]"], + [5215, 0, "$"], + [5216, 0, "}"], + [5217, 0, "\n"], + [5218, 0, "\\"], + [5219, 0, "e"], + [5220, 0, "n"], + [5221, 0, "d"], + [5222, 0, "{"], + [5223, 0, "p"], + [5224, 0, "r"], + [5225, 0, "o"], + [5226, 0, "o"], + [5227, 0, "f"], + [5228, 0, "t"], + [5229, 0, "r"], + [5230, 0, "e"], + [5231, 0, "e"], + [5232, 0, "}"], + [5916, 1], + [5915, 1], + [5914, 1], + [5913, 1], + [5912, 1], + [5911, 1], + [5910, 1], + [5909, 1], + [5908, 1], + [5907, 1], + [5906, 1], + [5905, 1], + [5904, 1], + [5903, 1], + [5902, 1], + [5901, 1], + [5900, 1], + [5899, 1], + [5898, 1], + [5897, 1], + [5896, 1], + [5895, 1], + [5894, 1], + [5893, 1], + [5892, 1], + [5891, 1], + [5890, 1], + [5889, 1], + [5888, 1], + [5887, 1], + [5886, 1], + [5885, 1], + [5884, 1], + [5883, 1], + [5882, 1], + [5881, 1], + [5880, 1], + [5879, 1], + [5878, 1], + [5877, 1], + [5876, 1], + [5875, 1], + [5874, 1], + [5873, 1], + [5872, 1], + [5871, 1], + [5870, 1], + [5869, 1], + [5868, 1], + [5867, 1], + [5866, 1], + [5865, 1], + [5864, 1], + [5863, 1], + [5862, 1], + [5861, 1], + [5860, 1], + [5859, 1], + [5858, 1], + [5857, 1], + [5856, 1], + [5855, 1], + [5854, 1], + [5853, 1], + [5852, 1], + [5851, 1], + [5850, 1], + [5849, 1], + [5848, 1], + [5847, 1], + [5846, 1], + [5845, 1], + [5844, 1], + [5843, 1], + [5842, 1], + [5841, 1], + [5840, 1], + [5839, 1], + [5838, 1], + [5837, 1], + [5836, 1], + [5835, 1], + [5834, 1], + [5833, 1], + [5832, 1], + [5831, 1], + [5830, 1], + [5829, 1], + [5828, 1], + [5827, 1], + [5826, 1], + [5825, 1], + [5824, 1], + [5823, 1], + [5822, 1], + [5821, 1], + [5820, 1], + [5819, 1], + [5818, 1], + [5817, 1], + [5816, 1], + [5815, 1], + [5814, 1], + [5813, 1], + [5812, 1], + [5811, 1], + [5810, 1], + [5809, 1], + [5808, 1], + [5807, 1], + [5806, 1], + [5805, 1], + [5804, 1], + [5803, 1], + [5802, 1], + [5801, 1], + [5800, 1], + [5799, 1], + [5798, 1], + [5797, 1], + [5796, 1], + [5795, 1], + [5794, 1], + [5793, 1], + [5792, 1], + [5791, 1], + [5790, 1], + [5789, 1], + [5788, 1], + [5787, 1], + [5786, 1], + [5785, 1], + [5784, 1], + [5783, 1], + [5782, 1], + [5781, 1], + [5780, 1], + [5779, 1], + [5778, 1], + [5777, 1], + [5776, 1], + [5775, 1], + [5774, 1], + [5773, 1], + [5772, 1], + [5771, 1], + [5770, 1], + [5769, 1], + [5768, 1], + [5767, 1], + [5766, 1], + [5765, 1], + [5764, 1], + [5763, 1], + [5762, 1], + [5761, 1], + [5760, 1], + [5759, 1], + [5758, 1], + [5757, 1], + [5756, 1], + [5755, 1], + [5754, 1], + [5753, 1], + [5752, 1], + [5751, 1], + [5750, 1], + [5749, 1], + [5748, 1], + [5747, 1], + [5746, 1], + [5745, 1], + [5744, 1], + [5743, 1], + [5742, 1], + [5741, 1], + [5740, 1], + [5739, 1], + [5738, 1], + [5737, 1], + [5736, 1], + [5735, 1], + [5734, 1], + [5733, 1], + [5732, 1], + [5731, 1], + [5730, 1], + [5729, 1], + [5728, 1], + [5727, 1], + [5726, 1], + [5725, 1], + [5724, 1], + [5723, 1], + [5722, 1], + [5721, 1], + [5720, 1], + [5719, 1], + [5718, 1], + [5717, 1], + [5716, 1], + [5715, 1], + [5714, 1], + [5713, 1], + [5712, 1], + [5711, 1], + [5710, 1], + [5709, 1], + [5708, 1], + [5707, 1], + [5706, 1], + [5705, 1], + [5704, 1], + [5703, 1], + [5702, 1], + [5701, 1], + [5700, 1], + [5699, 1], + [5698, 1], + [5697, 1], + [5696, 1], + [5695, 1], + [5694, 1], + [5693, 1], + [5692, 1], + [5691, 1], + [5690, 1], + [5689, 1], + [5688, 1], + [5687, 1], + [5686, 1], + [5685, 1], + [5684, 1], + [5683, 1], + [5682, 1], + [5681, 1], + [5680, 1], + [5679, 1], + [5678, 1], + [5677, 1], + [5676, 1], + [5675, 1], + [5674, 1], + [5673, 1], + [5672, 1], + [5671, 1], + [5670, 1], + [5669, 1], + [5668, 1], + [5667, 1], + [5666, 1], + [5665, 1], + [5664, 1], + [5663, 1], + [5662, 1], + [5661, 1], + [5660, 1], + [5659, 1], + [5658, 1], + [5657, 1], + [5656, 1], + [5655, 1], + [5654, 1], + [5653, 1], + [5652, 1], + [5651, 1], + [5650, 1], + [5649, 1], + [5648, 1], + [5647, 1], + [5646, 1], + [5645, 1], + [5644, 1], + [5643, 1], + [5642, 1], + [5641, 1], + [5640, 1], + [5639, 1], + [5638, 1], + [5637, 1], + [5636, 1], + [5635, 1], + [5634, 1], + [5633, 1], + [5632, 1], + [5631, 1], + [5630, 1], + [5629, 1], + [5628, 1], + [5627, 1], + [5626, 1], + [5625, 1], + [5624, 1], + [5623, 1], + [5622, 1], + [5621, 1], + [5620, 1], + [5619, 1], + [5618, 1], + [5617, 1], + [5616, 1], + [5615, 1], + [5614, 1], + [5613, 1], + [5612, 1], + [5611, 1], + [5610, 1], + [5609, 1], + [5608, 1], + [5607, 1], + [5606, 1], + [5605, 1], + [5604, 1], + [5603, 1], + [5602, 1], + [5601, 1], + [5600, 1], + [5599, 1], + [5598, 1], + [5597, 1], + [5596, 1], + [5595, 1], + [5594, 1], + [5593, 1], + [5592, 1], + [5591, 1], + [5590, 1], + [5589, 1], + [5588, 1], + [5587, 1], + [5586, 1], + [5585, 1], + [5584, 1], + [5583, 1], + [5582, 1], + [5581, 1], + [5580, 1], + [5579, 1], + [5578, 1], + [5172, 1], + [5191, 0, "\\"], + [5192, 0, ";"], + [5197, 0, "\\"], + [5198, 0, ";"], + [5540, 0, "'"], + [5541, 0, ";"], + [5541, 1], + [5540, 1], + [5540, 0, "\\"], + [5541, 0, ";"], + [5546, 0, "\\"], + [5547, 0, ";"], + [5492, 0, "\n"], + [5493, 0, " "], + [5494, 0, " "], + [5495, 0, " "], + [4797, 0, "\n"], + [4798, 0, " "], + [4799, 0, " "], + [4800, 0, " "], + [4853, 0, "\\"], + [4854, 0, ";"], + [4849, 0, "\\"], + [4850, 0, ";"], + [4585, 0, "\n"], + [4586, 0, " "], + [4587, 0, " "], + [4588, 0, " "], + [4641, 0, "\\"], + [4642, 0, ";"], + [4637, 0, "\\"], + [4638, 0, ";"], + [4638, 1], + [4638, 0, ","], + [4644, 1], + [4644, 0, ","], + [4864, 1], + [4864, 0, ","], + [4858, 1], + [4858, 0, ","], + [4830, 0, "\\"], + [4831, 0, ","], + [4839, 0, "\\"], + [4840, 0, ","], + [4610, 0, "\\"], + [4611, 0, ","], + [4619, 0, "\\"], + [4620, 0, ","], + [5092, 0, "\\"], + [5093, 0, ","], + [5101, 0, "\\"], + [5102, 0, ","], + [5192, 0, "\\"], + [5193, 0, ","], + [5201, 0, "\\"], + [5202, 0, ","], + [5230, 1], + [5230, 0, ","], + [5224, 1], + [5224, 0, ","], + [5132, 1], + [5132, 0, ","], + [5126, 1], + [5126, 0, ","], + [5577, 1], + [5577, 0, ","], + [5583, 1], + [5583, 0, ","], + [5549, 0, "\\"], + [5550, 0, ","], + [5558, 0, "\\"], + [5559, 0, ","], + [6100, 1], + [6100, 0, ","], + [6101, 0, "\\"], + [6102, 0, ";"], + [6103, 0, " "], + [6104, 0, "\\"], + [6105, 0, "m"], + [6106, 0, "a"], + [6107, 0, "t"], + [6108, 0, "h"], + [6109, 0, "s"], + [6110, 0, "f"], + [6111, 0, "{"], + [6112, 0, "i"], + [6113, 0, "n"], + [6114, 0, "s"], + [6115, 0, "e"], + [6116, 0, "r"], + [6117, 0, "t"], + [6118, 0, "}"], + [6119, 0, "("], + [6120, 0, "\\"], + [6121, 0, "m"], + [6122, 0, "a"], + [6123, 0, "t"], + [6124, 0, "h"], + [6125, 0, "i"], + [6126, 0, "t"], + [6127, 0, "{"], + [6128, 0, "i"], + [6129, 0, "d"], + [6130, 0, "}"], + [6131, 0, ","], + [6132, 0, " "], + [6133, 0, "\\"], + [6134, 0, "m"], + [6135, 0, "a"], + [6136, 0, "t"], + [6137, 0, "h"], + [6138, 0, "i"], + [6139, 0, "t"], + [6140, 0, "{"], + [6141, 0, "p"], + [6142, 0, "r"], + [6143, 0, "e"], + [6144, 0, "v"], + [6145, 0, "}"], + [6146, 0, ","], + [6147, 0, " "], + [6148, 0, "v"], + [6149, 0, ")"], + [6150, 0, "$"], + [6151, 0, "}"], + [6152, 0, "\n"], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [6153, 1], + [5991, 1], + [5990, 1], + [5989, 1], + [5988, 1], + [5987, 1], + [5986, 1], + [5985, 1], + [5984, 1], + [5983, 1], + [5982, 1], + [5981, 1], + [5980, 1], + [5979, 1], + [5978, 1], + [5977, 1], + [5976, 1], + [5975, 1], + [5974, 1], + [5973, 1], + [5972, 1], + [5971, 1], + [5970, 1], + [5969, 1], + [5968, 1], + [5967, 1], + [5966, 1], + [5965, 1], + [5964, 1], + [5963, 1], + [5962, 1], + [5961, 1], + [5960, 1], + [5959, 1], + [5958, 1], + [5957, 1], + [5956, 1], + [5955, 1], + [5954, 1], + [5953, 1], + [5952, 1], + [5951, 1], + [5950, 1], + [5949, 1], + [5948, 1], + [5947, 1], + [5946, 1], + [5945, 1], + [5944, 1], + [5943, 1], + [5942, 1], + [5941, 1], + [5940, 1], + [5939, 1], + [5938, 1], + [5937, 1], + [5936, 1], + [5935, 1], + [5934, 1], + [5933, 1], + [5932, 1], + [5931, 1], + [5930, 1], + [5929, 1], + [5928, 1], + [5927, 1], + [5926, 1], + [5925, 1], + [5924, 1], + [5923, 1], + [5922, 1], + [5921, 1], + [5920, 1], + [5919, 1], + [5918, 1], + [5917, 1], + [5916, 1], + [5915, 1], + [5914, 1], + [5913, 1], + [5912, 1], + [5911, 1], + [5910, 1], + [5909, 1], + [5908, 1], + [5907, 1], + [5906, 1], + [5905, 1], + [5904, 1], + [5903, 1], + [5902, 1], + [5901, 1], + [5900, 1], + [5899, 1], + [5898, 1], + [5897, 1], + [5896, 1], + [5895, 1], + [5894, 1], + [5893, 1], + [5892, 1], + [5891, 1], + [5890, 1], + [5889, 1], + [5888, 1], + [5887, 1], + [5886, 1], + [5885, 1], + [5884, 1], + [5883, 1], + [5882, 1], + [5881, 1], + [5880, 1], + [5879, 1], + [5878, 1], + [5877, 1], + [5907, 1], + [5907, 1], + [5907, 1], + [5907, 1], + [5907, 1], + [5907, 1], + [5907, 0, "B"], + [5908, 0, "i"], + [4488, 0, "\\"], + [4489, 0, "p"], + [4490, 0, "r"], + [4491, 0, "o"], + [4492, 0, "o"], + [4493, 0, "f"], + [4494, 0, "S"], + [4495, 0, "k"], + [4496, 0, "i"], + [4497, 0, "p"], + [4498, 0, "A"], + [4499, 0, "m"], + [4500, 0, "o"], + [4501, 0, "u"], + [4502, 0, "n"], + [4503, 0, "t"], + [7250, 1], + [7250, 1], + [7250, 1], + [7250, 1], + [7172, 1], + [7172, 1], + [7172, 1], + [7172, 1], + [7137, 1], + [7137, 1], + [7137, 1], + [7137, 1], + [7077, 1], + [7077, 1], + [7077, 1], + [7077, 1], + [7005, 1], + [7005, 1], + [7005, 1], + [7005, 1], + [6883, 1], + [6883, 1], + [6883, 1], + [6883, 1], + [6844, 1], + [6844, 1], + [6844, 1], + [6844, 1], + [6762, 1], + [6762, 1], + [6762, 1], + [6762, 1], + [6719, 1], + [6719, 1], + [6719, 1], + [6719, 1], + [6635, 1], + [6635, 1], + [6635, 1], + [6635, 1], + [6533, 1], + [6533, 1], + [6533, 1], + [6533, 1], + [6447, 1], + [6447, 1], + [6447, 1], + [6447, 1], + [6364, 1], + [6364, 1], + [6364, 1], + [6364, 1], + [6325, 1], + [6325, 1], + [6325, 1], + [6325, 1], + [6265, 1], + [6265, 1], + [6265, 1], + [6265, 1], + [6222, 1], + [6222, 1], + [6222, 1], + [6222, 1], + [6138, 1], + [6138, 1], + [6138, 1], + [6138, 1], + [6085, 1], + [6085, 1], + [6085, 1], + [6085, 1], + [6065, 0, "\n"], + [6066, 0, "\n"], + [6067, 0, "\\"], + [6068, 0, "b"], + [6069, 0, "e"], + [6070, 0, "g"], + [6071, 0, "i"], + [6072, 0, "n"], + [6073, 0, "{"], + [6074, 0, "p"], + [6075, 0, "r"], + [6076, 0, "o"], + [6077, 0, "o"], + [6078, 0, "f"], + [6079, 0, "t"], + [6080, 0, "r"], + [6081, 0, "e"], + [6082, 0, "e"], + [6083, 0, "}"], + [6084, 0, "\n"], + [6085, 0, "\\"], + [6086, 0, "e"], + [6087, 0, "n"], + [6088, 0, "d"], + [6089, 0, "{"], + [6090, 0, "p"], + [6091, 0, "r"], + [6092, 0, "o"], + [6093, 0, "o"], + [6094, 0, "f"], + [6095, 0, "t"], + [6096, 0, "r"], + [6097, 0, "e"], + [6098, 0, "e"], + [6099, 0, "}"], + [6084, 0, "\n"], + [6085, 0, "\\"], + [6086, 0, "A"], + [6087, 0, "x"], + [6088, 0, "i"], + [6089, 0, "o"], + [6090, 0, "m"], + [6091, 0, "C"], + [6092, 0, "{"], + [6093, 0, "$"], + [6094, 0, "\\"], + [6095, 0, "m"], + [6096, 0, "a"], + [6097, 0, "t"], + [6098, 0, "h"], + [6099, 0, "i"], + [6100, 0, "t"], + [6101, 0, "{"], + [6102, 0, "t"], + [6103, 0, "a"], + [6104, 0, "r"], + [6105, 0, "g"], + [6106, 0, "e"], + [6107, 0, "t"], + [6108, 0, "}"], + [6109, 0, " "], + [6110, 0, "\\"], + [6111, 0, "i"], + [6112, 0, "n"], + [6113, 0, " "], + [6114, 0, "\\"], + [6115, 0, "m"], + [6116, 0, "a"], + [6117, 0, "t"], + [6118, 0, "h"], + [6119, 0, "r"], + [6120, 0, "m"], + [6121, 0, "{"], + [6122, 0, "d"], + [6123, 0, "o"], + [6124, 0, "m"], + [6125, 0, "}"], + [6126, 0, "("], + [6127, 0, "A"], + [6128, 0, "_"], + [6129, 0, "p"], + [6130, 0, ")"], + [6131, 0, "$"], + [6132, 0, "}"], + [6133, 0, "\n"], + [6134, 0, "\\"], + [6135, 0, "A"], + [6136, 0, "x"], + [6137, 0, "i"], + [6138, 0, "o"], + [6139, 0, "m"], + [6140, 0, "C"], + [6141, 0, "{"], + [6142, 0, "$"], + [6143, 0, "A"], + [6144, 0, "_"], + [6145, 0, "p"], + [6146, 0, ","], + [6147, 0, "\\"], + [6148, 0, ";"], + [6149, 0, " "], + [6150, 0, "\\"], + [6151, 0, "m"], + [6152, 0, "a"], + [6153, 0, "t"], + [6154, 0, "h"], + [6155, 0, "s"], + [6156, 0, "f"], + [6157, 0, "{"], + [6158, 0, "n"], + [6159, 0, "e"], + [6160, 0, "w"], + [6161, 0, "I"], + [6162, 0, "D"], + [6163, 0, "}"], + [6164, 0, " "], + [6165, 0, "\\"], + [6166, 0, "e"], + [6167, 0, "v"], + [6168, 0, "a"], + [6169, 0, "l"], + [6170, 0, "t"], + [6171, 0, "o"], + [6172, 0, " "], + [6173, 0, "A"], + [6174, 0, "_"], + [6175, 0, "p"], + [6176, 0, "'"], + [6177, 0, ","], + [6178, 0, "\\"], + [6179, 0, ";"], + [6180, 0, " "], + [6181, 0, "\\"], + [6182, 0, "m"], + [6183, 0, "a"], + [6184, 0, "t"], + [6185, 0, "h"], + [6186, 0, "i"], + [6187, 0, "t"], + [6188, 0, "{"], + [6189, 0, "i"], + [6190, 0, "d"], + [6191, 0, "}"], + [6192, 0, "$"], + [6193, 0, "}"], + [6194, 0, "\n"], + [6195, 0, "\\"], + [6196, 0, "L"], + [6197, 0, "e"], + [6198, 0, "f"], + [6199, 0, "t"], + [6200, 0, "L"], + [6201, 0, "a"], + [6202, 0, "b"], + [6203, 0, "e"], + [6204, 0, "l"], + [6205, 0, "{"], + [6206, 0, "\\"], + [6207, 0, "T"], + [6208, 0, "e"], + [6209, 0, "x"], + [6210, 0, "t"], + [6207, 1], + [6207, 0, "t"], + [6211, 0, "s"], + [6212, 0, "c"], + [6213, 0, "{"], + [6214, 0, "D"], + [6215, 0, "e"], + [6216, 0, "l"], + [6217, 0, "e"], + [6218, 0, "t"], + [6219, 0, "e"], + [6220, 0, "}"], + [6221, 0, "}"], + [6222, 0, "\n"], + [6223, 0, "\\"], + [6224, 0, "B"], + [6225, 0, "i"], + [6226, 0, "n"], + [6227, 0, "a"], + [6228, 0, "r"], + [6229, 0, "y"], + [6230, 0, "I"], + [6231, 0, "n"], + [6232, 0, "f"], + [6233, 0, "C"], + [6234, 0, "{"], + [6235, 0, "$"], + [6236, 0, "A"], + [6237, 0, "_"], + [6238, 0, "p"], + [6239, 0, ","], + [6240, 0, "\\"], + [6241, 0, ";"], + [6242, 0, " "], + [6243, 0, "\\"], + [6244, 0, "m"], + [6245, 0, "a"], + [6246, 0, "t"], + [6247, 0, "h"], + [6248, 0, "s"], + [6249, 0, "f"], + [6250, 0, "{"], + [6251, 0, "d"], + [6252, 0, "e"], + [6253, 0, "l"], + [6254, 0, "e"], + [6255, 0, "t"], + [6256, 0, "e"], + [6257, 0, "L"], + [6258, 0, "o"], + [6259, 0, "c"], + [6260, 0, "a"], + [6261, 0, "l"], + [6262, 0, "}"], + [6263, 0, "("], + [6264, 0, "\\"], + [6265, 0, "m"], + [6266, 0, "a"], + [6267, 0, "t"], + [6268, 0, "h"], + [6269, 0, "i"], + [6270, 0, "t"], + [6271, 0, "{"], + [6272, 0, "t"], + [6273, 0, "a"], + [6274, 0, "r"], + [6275, 0, "g"], + [6276, 0, "e"], + [6277, 0, "t"], + [6278, 0, "}"], + [6279, 0, ")"], + [6280, 0, " "], + [6281, 0, "\\"], + [6282, 0, "e"], + [6283, 0, "v"], + [6284, 0, "a"], + [6285, 0, "l"], + [6286, 0, "t"], + [6287, 0, "o"], + [6288, 0, "\n"], + [6289, 0, " "], + [6290, 0, " "], + [6291, 0, " "], + [6292, 0, " "], + [6293, 0, "A"], + [6294, 0, "_"], + [6295, 0, "p"], + [6296, 0, "'"], + [6297, 0, ","], + [6298, 0, "\\"], + [6299, 0, ";"], + [6300, 0, " "], + [6301, 0, "\\"], + [6302, 0, "m"], + [6303, 0, "a"], + [6304, 0, "t"], + [6305, 0, "h"], + [6306, 0, "s"], + [6307, 0, "f"], + [6308, 0, "{"], + [6309, 0, "d"], + [6310, 0, "e"], + [6311, 0, "l"], + [6312, 0, "e"], + [6313, 0, "t"], + [6314, 0, "e"], + [6315, 0, "}"], + [6316, 0, "("], + [6317, 0, "\\"], + [6318, 0, "m"], + [6319, 0, "a"], + [6320, 0, "t"], + [6321, 0, "h"], + [6322, 0, "i"], + [6323, 0, "t"], + [6324, 0, "{"], + [6325, 0, "i"], + [6326, 0, "d"], + [6327, 0, "}"], + [6328, 0, ","], + [6329, 0, " "], + [6330, 0, "\\"], + [6331, 0, "m"], + [6332, 0, "a"], + [6333, 0, "t"], + [6334, 0, "h"], + [6335, 0, "i"], + [6336, 0, "t"], + [6337, 0, "{"], + [6338, 0, "t"], + [6339, 0, "a"], + [6340, 0, "r"], + [6341, 0, "g"], + [6342, 0, "e"], + [6343, 0, "t"], + [6344, 0, "}"], + [6345, 0, ")"], + [6346, 0, "$"], + [6347, 0, "}"], + [6747, 0, "\\"], + [6748, 0, ","], + [6756, 0, "\\"], + [6757, 0, ","], + [6824, 0, "\\"], + [6825, 0, ","], + [6833, 0, "\\"], + [6834, 0, ","], + [7516, 0, "\\"], + [7517, 0, ","], + [7525, 0, "\\"], + [7526, 0, ","], + [5042, 1], + [5042, 0, "B"], + [5043, 0, "i"], + [5007, 0, "\n"], + [5008, 0, "\\"], + [5009, 0, "A"], + [5010, 0, "x"], + [5011, 0, "i"], + [5012, 0, "o"], + [5013, 0, "m"], + [5014, 0, "C"], + [5015, 0, "{"], + [5016, 0, "$"], + [5017, 0, "A"], + [5018, 0, "_"], + [5019, 0, "p"], + [5020, 0, "'"], + [5021, 0, ","], + [5022, 0, "\\"], + [5023, 0, ";"], + [5024, 0, " "], + [5025, 0, "\\"], + [5026, 0, "m"], + [5027, 0, "a"], + [5028, 0, "t"], + [5029, 0, "h"], + [5030, 0, "i"], + [5031, 0, "t"], + [5032, 0, "{"], + [5033, 0, "o"], + [5034, 0, "p"], + [5035, 0, "}"], + [5036, 0, " "], + [5037, 0, "\\"], + [5038, 0, "e"], + [5039, 0, "v"], + [5040, 0, "a"], + [5041, 0, "l"], + [5042, 0, "t"], + [5043, 0, "o"], + [5044, 0, " "], + [5045, 0, "A"], + [5046, 0, "_"], + [5047, 0, "p"], + [5048, 0, "'"], + [5049, 0, "'"], + [5050, 0, "$"], + [5051, 0, "}"], + [5130, 0, "'"], + [5170, 0, "'"], + [5204, 0, "'"], + [5272, 0, "'"], + [6010, 1], + [6009, 1], + [6008, 1], + [6007, 1], + [6006, 1], + [6006, 0, "C"], + [6007, 0, "m"], + [6008, 0, "d"], + [6008, 1], + [6007, 1], + [6006, 1], + [6006, 0, "L"], + [6007, 0, "o"], + [6008, 0, "c"], + [6009, 0, "a"], + [6010, 0, "l"], + [6010, 1], + [6009, 1], + [6008, 1], + [6007, 1], + [6006, 1], + [6006, 0, "C"], + [6007, 0, "m"], + [6008, 0, "d"], + [6309, 1], + [6308, 1], + [6307, 1], + [6306, 1], + [6305, 1], + [6304, 1], + [6304, 0, "e"], + [6305, 0, "C"], + [6306, 0, "m"], + [6307, 0, "d"], + [5973, 1], + [5973, 1], + [5973, 0, "T"], + [5974, 0, "r"], + [5975, 0, "i"], + [5943, 0, "\n"], + [5944, 0, "\\"], + [5945, 0, "A"], + [5946, 0, "x"], + [5947, 0, "i"], + [5948, 0, "o"], + [5949, 0, "m"], + [5950, 0, "C"], + [5951, 0, "{"], + [5952, 0, "$"], + [5953, 0, "A"], + [5954, 0, "_"], + [5955, 0, "p"], + [5956, 0, "'"], + [5957, 0, ","], + [5958, 0, "\\"], + [5959, 0, ";"], + [5960, 0, " "], + [5961, 0, "\\"], + [5962, 0, "m"], + [5963, 0, "a"], + [5964, 0, "t"], + [5965, 0, "h"], + [5966, 0, "s"], + [5967, 0, "f"], + [5968, 0, "{"], + [5969, 0, "a"], + [5970, 0, "p"], + [5971, 0, "p"], + [5972, 0, "l"], + [5973, 0, "y"], + [5974, 0, "}"], + [5975, 0, "("], + [5976, 0, "\\"], + [5977, 0, "m"], + [5978, 0, "a"], + [5979, 0, "t"], + [5980, 0, "h"], + [5981, 0, "s"], + [5982, 0, "f"], + [5983, 0, "{"], + [5984, 0, "i"], + [5985, 0, "n"], + [5986, 0, "s"], + [5987, 0, "e"], + [5988, 0, "r"], + [5989, 0, "t"], + [5990, 0, "}"], + [5991, 0, "("], + [5992, 0, "\\"], + [5993, 0, "m"], + [5994, 0, "a"], + [5995, 0, "t"], + [5996, 0, "h"], + [5997, 0, "i"], + [5998, 0, "t"], + [5999, 0, "{"], + [6000, 0, "i"], + [6001, 0, "d"], + [6002, 0, "}"], + [6003, 0, ","], + [6004, 0, " "], + [6005, 0, "\\"], + [6006, 0, "m"], + [6007, 0, "a"], + [6008, 0, "t"], + [6009, 0, "h"], + [6010, 0, "i"], + [6011, 0, "t"], + [6012, 0, "{"], + [6013, 0, "p"], + [6014, 0, "r"], + [6015, 0, "e"], + [6016, 0, "v"], + [6017, 0, "}"], + [6018, 0, ","], + [6019, 0, " "], + [6020, 0, "v"], + [6021, 0, ")"], + [6022, 0, ")"], + [6023, 0, " "], + [6024, 0, "\\"], + [6025, 0, "e"], + [6026, 0, "v"], + [6027, 0, "a"], + [6028, 0, "l"], + [6029, 0, "t"], + [6030, 0, "o"], + [6031, 0, " "], + [6032, 0, "A"], + [6033, 0, "_"], + [6034, 0, "p"], + [6035, 0, "'"], + [6036, 0, "'"], + [6037, 0, "$"], + [6038, 0, "}"], + [6133, 0, " "], + [6134, 0, "A"], + [6135, 0, "_"], + [6136, 0, "p"], + [6137, 0, "'"], + [6138, 0, "'"], + [6139, 0, ","], + [6140, 0, "\\"], + [6141, 0, ";"], + [6142, 0, " "], + [6143, 0, "\\"], + [6144, 0, "m"], + [6145, 0, "a"], + [6146, 0, "t"], + [6147, 0, "h"], + [6148, 0, "i"], + [6149, 0, "t"], + [6150, 0, "{"], + [6151, 0, "i"], + [6152, 0, "d"], + [6153, 0, "}"], + [6154, 0, "$"], + [6155, 0, "}"], + [6216, 1], + [6215, 1], + [6214, 1], + [6213, 1], + [6212, 1], + [6211, 1], + [6210, 1], + [6209, 1], + [6208, 1], + [6207, 1], + [6206, 1], + [6205, 1], + [6204, 1], + [6203, 1], + [6202, 1], + [6201, 1], + [6200, 1], + [6199, 1], + [6198, 1], + [6197, 1], + [6196, 1], + [6195, 1], + [6194, 1], + [6193, 1], + [6192, 1], + [6191, 1], + [6190, 1], + [6189, 1], + [6188, 1], + [6187, 1], + [6186, 1], + [6185, 1], + [6184, 1], + [6183, 1], + [6182, 1], + [6181, 1], + [6180, 1], + [6179, 1], + [6178, 1], + [6177, 1], + [6176, 1], + [6175, 1], + [6174, 1], + [6173, 1], + [6172, 1], + [6171, 1], + [6170, 1], + [6169, 1], + [6168, 1], + [6167, 1], + [6166, 1], + [6165, 1], + [6164, 1], + [6163, 1], + [6162, 1], + [6161, 1], + [6160, 1], + [6159, 1], + [6158, 1], + [6157, 1], + [6156, 1], + [6331, 1], + [6331, 0, "T"], + [6332, 0, "r"], + [6301, 0, "\n"], + [6302, 0, "\\"], + [6303, 0, "A"], + [6304, 0, "x"], + [6305, 0, "i"], + [6306, 0, "o"], + [6307, 0, "m"], + [6308, 0, "C"], + [6309, 0, "{"], + [6310, 0, "$"], + [6311, 0, "A"], + [6312, 0, "_"], + [6313, 0, "p"], + [6314, 0, "'"], + [6315, 0, ","], + [6316, 0, "\\"], + [6317, 0, ";"], + [6318, 0, " "], + [6319, 0, "\\"], + [6320, 0, "m"], + [6321, 0, "a"], + [6322, 0, "t"], + [6323, 0, "h"], + [6324, 0, "s"], + [6325, 0, "f"], + [6326, 0, "{"], + [6327, 0, "a"], + [6328, 0, "p"], + [6329, 0, "p"], + [6330, 0, "l"], + [6331, 0, "y"], + [6332, 0, "}"], + [6333, 0, "("], + [6334, 0, "\\"], + [6335, 0, "m"], + [6336, 0, "a"], + [6337, 0, "t"], + [6338, 0, "h"], + [6339, 0, "s"], + [6340, 0, "f"], + [6341, 0, "{"], + [6342, 0, "d"], + [6343, 0, "e"], + [6344, 0, "l"], + [6345, 0, "e"], + [6346, 0, "t"], + [6347, 0, "e"], + [6348, 0, "}"], + [6349, 0, "("], + [6350, 0, "\\"], + [6351, 0, "m"], + [6352, 0, "a"], + [6353, 0, "t"], + [6354, 0, "h"], + [6355, 0, "i"], + [6356, 0, "t"], + [6357, 0, "{"], + [6358, 0, "i"], + [6359, 0, "d"], + [6360, 0, "}"], + [6361, 0, ","], + [6362, 0, " "], + [6363, 0, "\\"], + [6364, 0, "m"], + [6365, 0, "a"], + [6366, 0, "t"], + [6367, 0, "h"], + [6368, 0, "i"], + [6369, 0, "t"], + [6370, 0, "{"], + [6371, 0, "t"], + [6372, 0, "a"], + [6373, 0, "r"], + [6374, 0, "g"], + [6375, 0, "e"], + [6376, 0, "t"], + [6377, 0, "}"], + [6378, 0, ")"], + [6379, 0, ")"], + [6380, 0, " "], + [6381, 0, "\\"], + [6382, 0, "e"], + [6383, 0, "v"], + [6384, 0, "a"], + [6385, 0, "l"], + [6386, 0, "t"], + [6387, 0, "o"], + [6388, 0, " "], + [6389, 0, "A"], + [6390, 0, "_"], + [6391, 0, "p"], + [6392, 0, "'"], + [6393, 0, "'"], + [6394, 0, "$"], + [6395, 0, "}"], + [6489, 0, " "], + [6490, 0, "A"], + [6491, 0, "_"], + [6492, 0, "p"], + [6493, 0, "'"], + [6494, 0, "'"], + [6495, 0, "$"], + [6496, 0, "}"], + [6556, 1], + [6555, 1], + [6554, 1], + [6553, 1], + [6552, 1], + [6551, 1], + [6550, 1], + [6549, 1], + [6548, 1], + [6547, 1], + [6546, 1], + [6545, 1], + [6544, 1], + [6543, 1], + [6542, 1], + [6541, 1], + [6540, 1], + [6539, 1], + [6538, 1], + [6537, 1], + [6536, 1], + [6535, 1], + [6534, 1], + [6533, 1], + [6532, 1], + [6531, 1], + [6530, 1], + [6529, 1], + [6528, 1], + [6527, 1], + [6526, 1], + [6525, 1], + [6524, 1], + [6523, 1], + [6522, 1], + [6521, 1], + [6520, 1], + [6519, 1], + [6518, 1], + [6517, 1], + [6516, 1], + [6515, 1], + [6514, 1], + [6513, 1], + [6512, 1], + [6511, 1], + [6510, 1], + [6509, 1], + [6508, 1], + [6507, 1], + [6506, 1], + [6505, 1], + [6504, 1], + [6503, 1], + [6502, 1], + [6501, 1], + [6500, 1], + [6499, 1], + [6498, 1], + [6497, 1], + [6495, 0, "\\"], + [6496, 0, ";"], + [6497, 0, " "], + [6498, 0, "\\"], + [6499, 0, "b"], + [6500, 0, "o"], + [6501, 0, "t"], + [6495, 0, ","], + [5116, 1], + [5115, 1], + [5114, 1], + [5114, 0, "o"], + [5115, 0, "p"], + [5106, 0, "\n"], + [5106, 1], + [5106, 0, "\\"], + [5107, 0, "m"], + [5108, 0, "a"], + [5109, 0, "t"], + [5110, 0, "h"], + [5111, 0, "s"], + [5112, 0, "f"], + [5113, 0, "{"], + [5114, 0, "a"], + [5115, 0, "p"], + [5116, 0, "p"], + [5117, 0, "l"], + [5118, 0, "y"], + [5119, 0, "}"], + [5120, 0, "("], + [5132, 0, ")"], + [4975, 1], + [4974, 1], + [4973, 1], + [4973, 0, "o"], + [4974, 0, "p"], + [5003, 1], + [5002, 1], + [5001, 1], + [5000, 1], + [4999, 1], + [4998, 1], + [4997, 1], + [4996, 1], + [4995, 1], + [4994, 1], + [4993, 1], + [4992, 1], + [4991, 1], + [4990, 1], + [4989, 1], + [5035, 1], + [5034, 1], + [5033, 1], + [5032, 1], + [5031, 1], + [5030, 1], + [5029, 1], + [5028, 1], + [5027, 1], + [5026, 1], + [5025, 1], + [5024, 1], + [5023, 1], + [5022, 1], + [5021, 1], + [5020, 1], + [5019, 1], + [5018, 1], + [5017, 1], + [5016, 1], + [5015, 1], + [5014, 1], + [5013, 1], + [5012, 1], + [5011, 1], + [5010, 1], + [5009, 1], + [5008, 1], + [5007, 1], + [5006, 1], + [5005, 1], + [5004, 1], + [5003, 1], + [5002, 1], + [5001, 1], + [5001, 0, "q"], + [5002, 0, " "], + [5003, 0, "="], + [5004, 0, " "], + [5005, 0, "A"], + [5006, 0, "'"], + [5006, 1], + [5006, 0, "_"], + [5007, 0, "p"], + [5008, 0, "'"], + [5009, 0, "("], + [5010, 0, "\\"], + [5011, 0, "m"], + [5012, 0, "a"], + [5013, 0, "t"], + [5014, 0, "h"], + [5015, 0, "s"], + [5016, 0, "f"], + [5017, 0, "{"], + [5018, 0, "q"], + [5019, 0, "u"], + [5020, 0, "e"], + [5021, 0, "u"], + [5022, 0, "e"], + [5023, 0, "}"], + [5024, 0, ")"], + [5025, 0, " "], + [5026, 0, "\\"], + [5027, 0, ","], + [5028, 0, "\\"], + [5029, 0, "c"], + [5030, 0, "u"], + [5031, 0, "p"], + [5032, 0, "\\"], + [5033, 0, ","], + [5034, 0, " "], + [5035, 0, "\\"], + [5036, 0, "P"], + [5037, 0, "{"], + [5037, 1], + [5036, 1], + [5036, 0, "{"], + [5037, 0, "("], + [5038, 0, "A"], + [5039, 0, "_"], + [5040, 0, "p"], + [5041, 0, "'"], + [5042, 0, "("], + [5043, 0, "\\"], + [5044, 0, "m"], + [5045, 0, "a"], + [5046, 0, "t"], + [5047, 0, "h"], + [5048, 0, "s"], + [5049, 0, "f"], + [5050, 0, "{"], + [5051, 0, "o"], + [5052, 0, "p"], + [5053, 0, "s"], + [5054, 0, "}"], + [5055, 0, ")"], + [5056, 0, ","], + [5057, 0, " "], + [5058, 0, "\\"], + [5059, 0, "m"], + [5060, 0, "a"], + [5061, 0, "t"], + [5062, 0, "h"], + [5063, 0, "i"], + [5064, 0, "t"], + [5065, 0, "{"], + [5066, 0, "o"], + [5067, 0, "p"], + [5068, 0, "}"], + [5069, 0, ")"], + [5070, 0, "\\"], + [5071, 0, "}"], + [5072, 0, "$"], + [5073, 0, "}"], + [5167, 1], + [5271, 1], + [5270, 1], + [5269, 1], + [5268, 1], + [5267, 1], + [5266, 1], + [5265, 1], + [5264, 1], + [5263, 1], + [5262, 1], + [5261, 1], + [5260, 1], + [5259, 1], + [5258, 1], + [5257, 1], + [5256, 1], + [5255, 1], + [5254, 1], + [5253, 1], + [5252, 1], + [5251, 1], + [5250, 1], + [5249, 1], + [5248, 1], + [5247, 1], + [5246, 1], + [5245, 1], + [5244, 1], + [5243, 1], + [5242, 1], + [5241, 1], + [5240, 1], + [5239, 1], + [5238, 1], + [5237, 1], + [5236, 1], + [5235, 1], + [5234, 1], + [5233, 1], + [5232, 1], + [5231, 1], + [5230, 1], + [5229, 1], + [5228, 1], + [5227, 1], + [5226, 1], + [5225, 1], + [5224, 1], + [5223, 1], + [5222, 1], + [5221, 1], + [5220, 1], + [5219, 1], + [5218, 1], + [5217, 1], + [5216, 1], + [5215, 1], + [5214, 1], + [5213, 1], + [5212, 1], + [5211, 1], + [5210, 1], + [5209, 1], + [5208, 1], + [5207, 1], + [5206, 1], + [5205, 1], + [5204, 1], + [5203, 1], + [5203, 0, "q"], + [5203, 0, "\\"], + [5204, 0, "m"], + [5205, 0, "a"], + [5206, 0, "t"], + [5207, 0, "h"], + [5208, 0, "s"], + [5209, 0, "f"], + [5209, 1], + [5208, 1], + [5208, 0, "i"], + [5209, 0, "t"], + [5210, 0, "{"], + [5212, 0, "u"], + [5213, 0, "e"], + [5214, 0, "u"], + [5215, 0, "e"], + [5216, 0, "}"], + [5001, 1], + [5001, 0, "\\"], + [5002, 0, "m"], + [5003, 0, "a"], + [5004, 0, "t"], + [5005, 0, "h"], + [5006, 0, "i"], + [5007, 0, "t"], + [5008, 0, "{"], + [5009, 0, "q"], + [5010, 0, "u"], + [5011, 0, "e"], + [5012, 0, "u"], + [5013, 0, "e"], + [5014, 0, "}"], + [5984, 0, "O"], + [5985, 0, "p"], + [6344, 0, "O"], + [6345, 0, "p"], + [6836, 0, "O"], + [6837, 0, "p"], + [7216, 0, "O"], + [7217, 0, "p"], + [7336, 0, "O"], + [7337, 0, "p"], + [7610, 0, "O"], + [7611, 0, "p"], + [5735, 1], + [5734, 1], + [5733, 1], + [5732, 1], + [5732, 0, ","], + [5743, 0, ","], + [5744, 0, " "], + [5745, 0, "a"], + [5746, 0, "n"], + [5747, 0, "d"], + [5748, 0, " "], + [5749, 0, "a"], + [5750, 0, "p"], + [5751, 0, "p"], + [5752, 0, "l"], + [5753, 0, "y"], + [5754, 0, "i"], + [5755, 0, "n"], + [5756, 0, "g"], + [5822, 0, "\n"], + [5823, 0, "\\"], + [5824, 0, "b"], + [5825, 0, "e"], + [5826, 0, "g"], + [5827, 0, "i"], + [5828, 0, "n"], + [5829, 0, "{"], + [5830, 0, "p"], + [5831, 0, "r"], + [5832, 0, "o"], + [5833, 0, "o"], + [5834, 0, "f"], + [5835, 0, "t"], + [5836, 0, "r"], + [5837, 0, "e"], + [5838, 0, "e"], + [5839, 0, "}"], + [5840, 0, "\n"], + [5841, 0, "\\"], + [5842, 0, "e"], + [5843, 0, "n"], + [5844, 0, "d"], + [5845, 0, "{"], + [5846, 0, "p"], + [5847, 0, "r"], + [5848, 0, "o"], + [5849, 0, "o"], + [5850, 0, "f"], + [5851, 0, "t"], + [5852, 0, "r"], + [5853, 0, "e"], + [5854, 0, "e"], + [5855, 0, "}"], + [5856, 0, "\n"], + [5840, 0, "\n"], + [5841, 0, "\\"], + [5842, 0, "A"], + [5843, 0, "x"], + [5844, 0, "i"], + [5845, 0, "o"], + [5846, 0, "m"], + [5847, 0, "C"], + [5848, 0, "{"], + [5849, 0, "A"], + [5850, 0, "_"], + [5851, 0, "p"], + [5852, 0, ","], + [5853, 0, "\\"], + [5854, 0, ";"], + [5855, 0, "\\"], + [5856, 0, "m"], + [5857, 0, "a"], + [5858, 0, "t"], + [5859, 0, "h"], + [5860, 0, "s"], + [5861, 0, "f"], + [5862, 0, "{"], + [5863, 0, "n"], + [5864, 0, "e"], + [5865, 0, "w"], + [5866, 0, "I"], + [5867, 0, "D"], + [5868, 0, "}"], + [5869, 0, " "], + [5870, 0, "\\"], + [5871, 0, "e"], + [5872, 0, "v"], + [5873, 0, "a"], + [5874, 0, "l"], + [5875, 0, "t"], + [5876, 0, "o"], + [5877, 0, " "], + [5878, 0, "A"], + [5879, 0, "_"], + [5880, 0, "p"], + [5881, 0, "'"], + [5882, 0, ","], + [5883, 0, "\\"], + [5884, 0, ";"], + [5885, 0, " "], + [5886, 0, "\\"], + [5887, 0, "m"], + [5888, 0, "a"], + [5889, 0, "t"], + [5890, 0, "h"], + [5891, 0, "i"], + [5892, 0, "t"], + [5893, 0, "{"], + [5894, 0, "i"], + [5895, 0, "d"], + [5896, 0, "}"], + [5897, 0, "$"], + [5898, 0, "}"], + [5899, 0, "\n"], + [5849, 0, "$"], + [5901, 0, "\\"], + [5902, 0, "A"], + [5903, 0, "x"], + [5904, 0, "i"], + [5905, 0, "o"], + [5906, 0, "m"], + [5907, 0, "C"], + [5908, 0, "{"], + [5909, 0, "$"], + [5910, 0, "A"], + [5911, 0, "_"], + [5912, 0, "p"], + [5913, 0, "'"], + [5914, 0, ","], + [5915, 0, "\\"], + [5916, 0, ";"], + [5917, 0, " "], + [5918, 0, "\\"], + [5919, 0, "m"], + [5920, 0, "a"], + [5921, 0, "t"], + [5922, 0, "h"], + [5923, 0, "s"], + [5924, 0, "f"], + [5925, 0, "{"], + [5926, 0, "a"], + [5927, 0, "p"], + [5928, 0, "p"], + [5929, 0, "l"], + [5930, 0, "y"], + [5931, 0, "}"], + [5932, 0, "("], + [5933, 0, "\\"], + [5934, 0, "m"], + [5935, 0, "a"], + [5936, 0, "t"], + [5937, 0, "h"], + [5938, 0, "s"], + [5939, 0, "f"], + [5940, 0, "{"], + [5941, 0, "l"], + [5942, 0, "i"], + [5943, 0, "s"], + [5944, 0, "t"], + [5945, 0, "O"], + [5946, 0, "p"], + [5941, 1], + [5941, 0, "l"], + [5947, 0, "}"], + [5948, 0, "("], + [5949, 0, "\\"], + [5950, 0, "m"], + [5951, 0, "a"], + [5952, 0, "t"], + [5953, 0, "h"], + [5954, 0, "i"], + [5955, 0, "t"], + [5956, 0, "{"], + [5957, 0, "i"], + [5958, 0, "d"], + [5959, 0, "}"], + [5960, 0, ")"], + [5961, 0, ")"], + [5962, 0, " "], + [5963, 0, "\\"], + [5964, 0, "e"], + [5965, 0, "v"], + [5966, 0, "a"], + [5967, 0, "l"], + [5968, 0, "t"], + [5969, 0, "o"], + [5970, 0, " "], + [5971, 0, "A"], + [5972, 0, "_"], + [5973, 0, "p"], + [5974, 0, "'"], + [5975, 0, "'"], + [5976, 0, "$"], + [5977, 0, "}"], + [5978, 0, "\n"], + [5979, 0, "\\"], + [5980, 0, "L"], + [5981, 0, "e"], + [5982, 0, "v"], + [5983, 0, "e"], + [5983, 1], + [5982, 1], + [5982, 0, "f"], + [5983, 0, "t"], + [5984, 0, "L"], + [5985, 0, "a"], + [5986, 0, "b"], + [5987, 0, "e"], + [5988, 0, "l"], + [5989, 0, "{"], + [5990, 0, "\\"], + [5991, 0, "t"], + [5992, 0, "e"], + [5993, 0, "x"], + [5994, 0, "t"], + [5995, 0, "s"], + [5996, 0, "c"], + [5997, 0, "{"], + [5998, 0, "A"], + [5999, 0, "l"], + [6000, 0, "l"], + [6001, 0, "o"], + [6002, 0, "c"], + [6003, 0, "-"], + [6004, 0, "L"], + [6005, 0, "i"], + [6006, 0, "s"], + [6007, 0, "t"], + [6008, 0, "}"], + [6009, 0, "}"], + [6010, 0, "\n"], + [6011, 0, "\\"], + [6012, 0, "B"], + [6013, 0, "i"], + [6014, 0, "n"], + [6015, 0, "a"], + [6016, 0, "r"], + [6017, 0, "y"], + [6018, 0, "I"], + [6019, 0, "n"], + [6020, 0, "f"], + [6021, 0, "C"], + [6022, 0, "{"], + [6023, 0, "$"], + [6024, 0, "A"], + [6025, 0, "_"], + [6026, 0, "p"], + [6027, 0, ","], + [6028, 0, "\\"], + [6029, 0, ";"], + [6030, 0, " "], + [6031, 0, "\\"], + [6032, 0, "m"], + [6033, 0, "a"], + [6034, 0, "t"], + [6035, 0, "h"], + [6036, 0, "s"], + [6037, 0, "f"], + [6038, 0, "{"], + [6039, 0, "a"], + [6039, 1], + [6039, 0, "l"], + [6040, 0, "i"], + [6041, 0, "s"], + [6042, 0, "t"], + [6043, 0, "C"], + [6044, 0, "m"], + [6045, 0, "d"], + [6046, 0, "}"], + [6047, 0, "("], + [6048, 0, "\\"], + [6048, 1], + [6047, 1], + [6047, 0, " "], + [6048, 0, "\\"], + [6049, 0, "e"], + [6050, 0, "v"], + [6051, 0, "a"], + [6052, 0, "l"], + [6053, 0, "t"], + [6054, 0, "o"], + [6055, 0, " "], + [6056, 0, "A"], + [6057, 0, "_"], + [6058, 0, "p"], + [6059, 0, "'"], + [6060, 0, "'"], + [6061, 0, ","], + [6062, 0, " "], + [6062, 1], + [6062, 0, "\\"], + [6063, 0, ";"], + [6064, 0, " "], + [6065, 0, "\\"], + [6066, 0, "m"], + [6067, 0, "a"], + [6068, 0, "t"], + [6069, 0, "h"], + [6070, 0, "i"], + [6071, 0, "t"], + [6072, 0, "{"], + [6073, 0, "i"], + [6074, 0, "d"], + [6075, 0, "}"], + [6076, 0, "$"], + [6077, 0, "}"], + [6803, 0, "\n"], + [6804, 0, "\n"], + [6805, 0, "\\"], + [6806, 0, "b"], + [6807, 0, "e"], + [6808, 0, "g"], + [6809, 0, "i"], + [6810, 0, "n"], + [6811, 0, "{"], + [6812, 0, "p"], + [6813, 0, "r"], + [6814, 0, "o"], + [6815, 0, "o"], + [6816, 0, "f"], + [6817, 0, "t"], + [6818, 0, "r"], + [6819, 0, "e"], + [6820, 0, "e"], + [6821, 0, "}"], + [6822, 0, "\n"], + [6823, 0, "\\"], + [6824, 0, "e"], + [6825, 0, "n"], + [6826, 0, "d"], + [6827, 0, "{"], + [6828, 0, "p"], + [6829, 0, "r"], + [6830, 0, "o"], + [6831, 0, "o"], + [6832, 0, "f"], + [6833, 0, "t"], + [6834, 0, "r"], + [6835, 0, "e"], + [6836, 0, "e"], + [6837, 0, "}"], + [6822, 0, "\n"], + [6823, 0, "\\"], + [6824, 0, "L"], + [6825, 0, "e"], + [6826, 0, "f"], + [6827, 0, "t"], + [6828, 0, "L"], + [6829, 0, "a"], + [6830, 0, "b"], + [6831, 0, "e"], + [6832, 0, "l"], + [6833, 0, "{"], + [6834, 0, "\\"], + [6835, 0, "t"], + [6836, 0, "e"], + [6837, 0, "x"], + [6838, 0, "t"], + [6839, 0, "s"], + [6840, 0, "c"], + [6841, 0, "{"], + [6842, 0, "A"], + [6843, 0, "p"], + [6844, 0, "p"], + [6845, 0, "l"], + [6846, 0, "y"], + [6847, 0, "-"], + [6848, 0, "L"], + [6849, 0, "i"], + [6850, 0, "s"], + [6851, 0, "t"], + [6852, 0, "}"], + [6853, 0, "}"], + [6822, 0, "\n"], + [6823, 0, "\\"], + [6824, 0, "A"], + [6825, 0, "x"], + [6826, 0, "i"], + [6827, 0, "o"], + [6828, 0, "m"], + [6829, 0, "C"], + [6830, 0, "{"], + [6831, 0, "$"], + [6832, 0, "\\"], + [6833, 0, "m"], + [6834, 0, "a"], + [6835, 0, "t"], + [6836, 0, "h"], + [6837, 0, "i"], + [6838, 0, "t"], + [6839, 0, "{"], + [6840, 0, "i"], + [6841, 0, "d"], + [6842, 0, "}"], + [6843, 0, " "], + [6844, 0, "\\"], + [6845, 0, "n"], + [6846, 0, "o"], + [6847, 0, "t"], + [6848, 0, "\\"], + [6849, 0, "i"], + [6850, 0, "n"], + [6851, 0, " "], + [6852, 0, "\\"], + [6853, 0, "m"], + [6854, 0, "a"], + [6855, 0, "t"], + [6856, 0, "h"], + [6857, 0, "r"], + [6858, 0, "m"], + [6859, 0, "{"], + [6860, 0, "d"], + [6861, 0, "o"], + [6862, 0, "m"], + [6863, 0, "}"], + [6864, 0, "("], + [6865, 0, "A"], + [6866, 0, "_"], + [6867, 0, "p"], + [6868, 0, "}"], + [6868, 1], + [6868, 0, ")"], + [6869, 0, "$"], + [6870, 0, "}"], + [6871, 0, "\n"], + [6872, 0, "\\"], + [6873, 0, "A"], + [6874, 0, "x"], + [6875, 0, "i"], + [6876, 0, "o"], + [6877, 0, "m"], + [6878, 0, "C"], + [6879, 0, "{"], + [6880, 0, "$"], + [6881, 0, "\\"], + [6882, 0, "m"], + [6883, 0, "a"], + [6884, 0, "t"], + [6885, 0, "h"], + [6886, 0, "i"], + [6887, 0, "t"], + [6888, 0, "{"], + [6889, 0, "i"], + [6890, 0, "d"], + [6891, 0, "}"], + [6881, 0, "A"], + [6882, 0, "_"], + [6883, 0, "p"], + [6884, 0, ","], + [6885, 0, "\\"], + [6886, 0, ";"], + [6887, 0, " "], + [6888, 0, "\\"], + [6889, 0, "m"], + [6890, 0, "a"], + [6891, 0, "t"], + [6892, 0, "h"], + [6893, 0, "s"], + [6894, 0, "f"], + [6895, 0, "{"], + [6896, 0, "t"], + [6897, 0, "s"], + [6898, 0, "}"], + [6899, 0, "("], + [6911, 0, ")"], + [6912, 0, " "], + [6913, 0, "\\"], + [6914, 0, "e"], + [6915, 0, "v"], + [6916, 0, "a"], + [6917, 0, "l"], + [6918, 0, "t"], + [6919, 0, "o"], + [6920, 0, " "], + [6921, 0, "A"], + [6922, 0, "_"], + [6923, 0, "p"], + [6924, 0, "'"], + [6925, 0, "$"], + [6926, 0, "}"], + [6959, 0, "\n"], + [6960, 0, "\\"], + [6961, 0, "B"], + [6962, 0, "i"], + [6963, 0, "n"], + [6964, 0, "a"], + [6965, 0, "r"], + [6966, 0, "y"], + [6967, 0, "I"], + [6968, 0, "n"], + [6969, 0, "f"], + [6970, 0, "C"], + [6971, 0, "{"], + [6972, 0, "$"], + [6973, 0, "$"], + [6974, 0, "}"], + [6973, 0, "A"], + [6974, 0, "_"], + [6975, 0, "p"], + [6976, 0, ","], + [6977, 0, "\\"], + [6978, 0, ";"], + [6979, 0, " "], + [6980, 0, "\\"], + [6981, 0, "m"], + [6982, 0, "a"], + [6983, 0, "t"], + [6984, 0, "h"], + [6985, 0, "s"], + [6986, 0, "f"], + [6987, 0, "{"], + [6988, 0, "l"], + [6989, 0, "i"], + [6990, 0, "s"], + [6991, 0, "t"], + [6992, 0, "O"], + [6993, 0, "p"], + [6994, 0, "}"], + [6995, 0, "("], + [6996, 0, "\\"], + [6997, 0, "m"], + [6998, 0, "a"], + [6999, 0, "t"], + [7000, 0, "h"], + [7001, 0, "i"], + [7002, 0, "t"], + [7003, 0, "{"], + [7004, 0, "i"], + [7005, 0, "d"], + [7006, 0, "}"], + [7007, 0, ")"], + [7008, 0, " "], + [7009, 0, "\\"], + [7010, 0, "e"], + [7011, 0, "v"], + [7012, 0, "a"], + [7013, 0, "l"], + [7014, 0, "t"], + [7015, 0, "o"], + [7016, 0, " "], + [7017, 0, "A"], + [7018, 0, "_"], + [7019, 0, "p"], + [7016, 0, "\n"], + [7017, 0, " "], + [7018, 0, " "], + [7019, 0, " "], + [7024, 0, "'"], + [7025, 0, "["], + [7026, 0, "\\"], + [7027, 0, ","], + [7028, 0, "\\"], + [7029, 0, "m"], + [7030, 0, "a"], + [7031, 0, "t"], + [7032, 0, "h"], + [7033, 0, "i"], + [7034, 0, "t"], + [7035, 0, "{"], + [7036, 0, "i"], + [7037, 0, "d"], + [7038, 0, "}"], + [7039, 0, " "], + [7040, 0, "\\"], + [7041, 0, "m"], + [7042, 0, "a"], + [7043, 0, "p"], + [7044, 0, "s"], + [7045, 0, "t"], + [7046, 0, "o"], + [7040, 0, "\\"], + [7041, 0, ","], + [7049, 0, "\\"], + [7050, 0, ","], + [7051, 0, " "], + [7052, 0, "\\"], + [7053, 0, "m"], + [7054, 0, "a"], + [7055, 0, "t"], + [7056, 0, "h"], + [7057, 0, "s"], + [7058, 0, "f"], + [7059, 0, "{"], + [7060, 0, "l"], + [7061, 0, "i"], + [7062, 0, "s"], + [7063, 0, "t"], + [7064, 0, "E"], + [7065, 0, "l"], + [7066, 0, "}"], + [7067, 0, "("], + [7068, 0, "\\"], + [7069, 0, "b"], + [7070, 0, "o"], + [7071, 0, "t"], + [7072, 0, ","], + [7073, 0, " "], + [7074, 0, "\\"], + [7075, 0, "m"], + [7076, 0, "a"], + [7077, 0, "t"], + [7078, 0, "h"], + [7079, 0, "s"], + [7080, 0, "f"], + [7081, 0, "{"], + [7082, 0, "t"], + [7083, 0, "a"], + [7084, 0, "i"], + [7085, 0, "l"], + [7086, 0, "}"], + [7087, 0, ")"], + [7088, 0, "\\"], + [7089, 0, ","], + [7090, 0, "]"], + [7267, 0, "\\"], + [7268, 0, "m"], + [7269, 0, "a"], + [7270, 0, "t"], + [7271, 0, "h"], + [7272, 0, "i"], + [7273, 0, "t"], + [7274, 0, "{"], + [7275, 0, "n"], + [7276, 0, "e"], + [7277, 0, "x"], + [7278, 0, "t"], + [7279, 0, "}"], + [7280, 0, " "], + [7281, 0, "="], + [7282, 0, " "], + [7283, 0, "\\"], + [7284, 0, "m"], + [7285, 0, "a"], + [7286, 0, "t"], + [7287, 0, "h"], + [7288, 0, "s"], + [7289, 0, "f"], + [7290, 0, "{"], + [7291, 0, "t"], + [7292, 0, "a"], + [7292, 1], + [7291, 1], + [7290, 1], + [7289, 1], + [7288, 1], + [7287, 1], + [7286, 1], + [7285, 1], + [7284, 1], + [7283, 1], + [7282, 1], + [7281, 1], + [7280, 1], + [7279, 1], + [7278, 1], + [7277, 1], + [7276, 1], + [7275, 1], + [7274, 1], + [7273, 1], + [7272, 1], + [7271, 1], + [7270, 1], + [7269, 1], + [7268, 1], + [7267, 1], + [7294, 0, " "], + [7295, 0, "\\"], + [7296, 0, "v"], + [7297, 0, "e"], + [7298, 0, "e"], + [7299, 0, " "], + [7300, 0, "\\"], + [7301, 0, "m"], + [7302, 0, "a"], + [7303, 0, "t"], + [7304, 0, "h"], + [7305, 0, "i"], + [7306, 0, "t"], + [7307, 0, "{"], + [7308, 0, "n"], + [7309, 0, "e"], + [7310, 0, "x"], + [7311, 0, "t"], + [7312, 0, "}"], + [7313, 0, " "], + [7314, 0, "="], + [7315, 0, " "], + [7316, 0, "\\"], + [7317, 0, "m"], + [7318, 0, "a"], + [7319, 0, "t"], + [7320, 0, "h"], + [7321, 0, "s"], + [7322, 0, "f"], + [7323, 0, "{"], + [7324, 0, "t"], + [7325, 0, "a"], + [7326, 0, "i"], + [7327, 0, "l"], + [7328, 0, "}"], + [7295, 0, "\\"], + [7296, 0, ","], + [7301, 0, "\\"], + [7302, 0, ","], + [855, 0, "\n"], + [856, 0, "\n"], + [856, 0, "%"], + [857, 0, " "], + [858, 0, "T"], + [859, 0, "O"], + [860, 0, "D"], + [861, 0, "O"], + [862, 0, " "], + [863, 0, "p"], + [864, 0, "a"], + [865, 0, "p"], + [866, 0, "e"], + [867, 0, "r"], + [868, 0, "s"], + [869, 0, " "], + [870, 0, "o"], + [871, 0, "n"], + [872, 0, " "], + [873, 0, "f"], + [874, 0, "o"], + [875, 0, "r"], + [876, 0, "m"], + [877, 0, "a"], + [878, 0, "l"], + [879, 0, " "], + [880, 0, "v"], + [881, 0, "e"], + [882, 0, "r"], + [883, 0, "i"], + [884, 0, "f"], + [885, 0, "i"], + [886, 0, "c"], + [887, 0, "a"], + [888, 0, "t"], + [889, 0, "i"], + [890, 0, "o"], + [891, 0, "n"], + [892, 0, " "], + [893, 0, "o"], + [894, 0, "f"], + [895, 0, " "], + [896, 0, "C"], + [897, 0, "R"], + [898, 0, "D"], + [899, 0, "T"], + [900, 0, "s"], + [901, 0, " "], + [902, 0, "o"], + [903, 0, "r"], + [904, 0, " "], + [905, 0, "s"], + [906, 0, "i"], + [907, 0, "m"], + [908, 0, "i"], + [909, 0, "l"], + [910, 0, "a"], + [911, 0, "r"], + [912, 0, ":"], + [913, 0, "\n"], + [914, 0, "%"], + [915, 0, " "], + [916, 0, "G"], + [917, 0, "o"], + [918, 0, "t"], + [919, 0, "s"], + [920, 0, "m"], + [921, 0, "a"], + [922, 0, "n"], + [923, 0, " "], + [924, 0, "e"], + [925, 0, "t"], + [926, 0, " "], + [927, 0, "a"], + [928, 0, "l"], + [929, 0, ","], + [930, 0, " "], + [931, 0, "\""], + [932, 0, "c"], + [933, 0, "a"], + [934, 0, "u"], + [935, 0, "s"], + [936, 0, "e"], + [937, 0, " "], + [938, 0, "I"], + [939, 0, "'"], + [940, 0, "m"], + [941, 0, " "], + [942, 0, "s"], + [943, 0, "t"], + [944, 0, "r"], + [945, 0, "o"], + [946, 0, "n"], + [947, 0, "g"], + [948, 0, " "], + [949, 0, "e"], + [950, 0, "n"], + [951, 0, "o"], + [952, 0, "u"], + [953, 0, "g"], + [954, 0, "h"], + [955, 0, "\""], + [956, 0, ","], + [957, 0, " "], + [958, 0, "P"], + [959, 0, "O"], + [960, 0, "P"], + [961, 0, "L"], + [962, 0, " "], + [963, 0, "2"], + [964, 0, "0"], + [965, 0, "1"], + [966, 0, "6"], + [967, 0, "\n"], + [968, 0, "%"], + [969, 0, " "], + [970, 0, "v"], + [971, 0, "a"], + [972, 0, "r"], + [973, 0, "i"], + [974, 0, "o"], + [975, 0, "u"], + [976, 0, "s"], + [977, 0, " "], + [978, 0, "p"], + [979, 0, "a"], + [980, 0, "p"], + [981, 0, "e"], + [982, 0, "r"], + [983, 0, "s"], + [984, 0, " "], + [985, 0, "b"], + [986, 0, "y"], + [987, 0, " "], + [988, 0, "S"], + [989, 0, "e"], + [990, 0, "b"], + [991, 0, "a"], + [992, 0, "s"], + [993, 0, "t"], + [994, 0, "i"], + [995, 0, "a"], + [996, 0, "n"], + [997, 0, " "], + [998, 0, "B"], + [999, 0, "u"], + [1000, 0, "r"], + [1001, 0, "c"], + [1002, 0, "k"], + [1003, 0, "h"], + [1004, 0, "a"], + [1005, 0, "r"], + [1006, 0, "d"], + [1007, 0, "t"], + [1008, 0, "\n"], + [1009, 0, "%"], + [1010, 0, " "], + [1011, 0, "R"], + [1012, 0, "o"], + [1013, 0, "h"], + [1014, 0, " "], + [1015, 0, "e"], + [1016, 0, "t"], + [1017, 0, " "], + [1018, 0, "a"], + [1019, 0, "l"], + [1020, 0, "'"], + [1021, 0, "s"], + [1022, 0, " "], + [1023, 0, "t"], + [1024, 0, "e"], + [1025, 0, "c"], + [1026, 0, "h"], + [1027, 0, " "], + [1028, 0, "r"], + [1029, 0, "e"], + [1030, 0, "p"], + [1031, 0, "o"], + [1032, 0, "r"], + [1033, 0, "t"], + [1034, 0, " "], + [1035, 0, "("], + [1036, 0, "l"], + [1037, 0, "e"], + [1038, 0, "m"], + [1039, 0, "m"], + [1040, 0, "a"], + [1041, 0, "s"], + [1042, 0, " "], + [1043, 0, "8"], + [1044, 0, "-"], + [1045, 0, "1"], + [1046, 0, "3"], + [1047, 0, ","], + [1048, 0, " "], + [1049, 0, "t"], + [1050, 0, "h"], + [1051, 0, "e"], + [1052, 0, "o"], + [1053, 0, "r"], + [1054, 0, "e"], + [1055, 0, "m"], + [1056, 0, " "], + [1057, 0, "4"], + [1058, 0, ")"], + [1059, 0, "\n"], + [1060, 0, "%"], + [1061, 0, " "], + [1062, 0, "Z"], + [1063, 0, "e"], + [1064, 0, "l"], + [1065, 0, "l"], + [1066, 0, "e"], + [1067, 0, "r"], + [1068, 0, " "], + [1069, 0, "&"], + [1070, 0, " "], + [1071, 0, "B"], + [1072, 0, "i"], + [1073, 0, "e"], + [1074, 0, "n"], + [1075, 0, "i"], + [1076, 0, "u"], + [1077, 0, "s"], + [1078, 0, "a"], + [4325, 1], + [4324, 1], + [4323, 1], + [4322, 1], + [4321, 1], + [4320, 1], + [4319, 1], + [4318, 1], + [4317, 1], + [4316, 1], + [4315, 1], + [4314, 1], + [4313, 1], + [4312, 1], + [4311, 1], + [4310, 1], + [4309, 1], + [4308, 1], + [4308, 0, " "], + [4309, 0, "\\"], + [4310, 0, "m"], + [4311, 0, "a"], + [4312, 0, "t"], + [4313, 0, "h"], + [4314, 0, "r"], + [4315, 0, "m"], + [4316, 0, "{"], + [4317, 0, "m"], + [4318, 0, "a"], + [4319, 0, "x"], + [4320, 0, "}"], + [4321, 0, "("], + [4322, 0, ")"], + [4322, 0, "\\"], + [4323, 0, "{"], + [4324, 0, "\\"], + [4325, 0, "}"], + [4306, 0, "_"], + [4307, 0, "\\"], + [4308, 0, "m"], + [4309, 0, "a"], + [4310, 0, "t"], + [4311, 0, "h"], + [4312, 0, "i"], + [4313, 0, "t"], + [4314, 0, "{"], + [4315, 0, "m"], + [4316, 0, "a"], + [4317, 0, "x"], + [4318, 0, "}"], + [4337, 0, "c"], + [4338, 0, " "], + [4339, 0, "\\"], + [4340, 0, "m"], + [4341, 0, "i"], + [4342, 0, "d"], + [4343, 0, " "], + [4360, 0, "_"], + [4361, 0, "\\"], + [4362, 0, "m"], + [4363, 0, "a"], + [4364, 0, "t"], + [4365, 0, "h"], + [4366, 0, "i"], + [4367, 0, "t"], + [4368, 0, "{"], + [4369, 0, "s"], + [4370, 0, "e"], + [4371, 0, "l"], + [4372, 0, "f"], + [4373, 0, "}"], + [4343, 0, " "], + [4344, 0, "\\"], + [4345, 0, "e"], + [4346, 0, "x"], + [4347, 0, "i"], + [4348, 0, "s"], + [4349, 0, "t"], + [4350, 0, "s"], + [4351, 0, " "], + [4352, 0, "p"], + [4353, 0, "."], + [4354, 0, " "], + [4358, 1], + [4357, 1], + [4356, 1], + [4355, 1], + [4354, 1], + [4353, 1], + [4352, 1], + [4351, 1], + [4350, 1], + [4349, 1], + [4348, 1], + [4347, 1], + [4346, 1], + [4345, 1], + [4344, 1], + [4343, 1], + [4342, 1], + [4341, 1], + [4340, 1], + [4339, 1], + [4338, 1], + [4337, 1], + [4336, 1], + [4335, 1], + [4334, 1], + [4333, 1], + [4332, 1], + [4331, 1], + [4330, 1], + [4329, 1], + [4328, 1], + [4327, 1], + [4326, 1], + [4325, 1], + [4324, 1], + [4323, 1], + [4322, 1], + [4321, 1], + [4320, 1], + [4319, 1], + [4318, 1], + [4317, 1], + [4316, 1], + [4315, 1], + [4314, 1], + [4313, 1], + [4312, 1], + [4311, 1], + [4310, 1], + [4309, 1], + [4308, 1], + [4307, 1], + [4306, 1], + [4306, 0, " "], + [4307, 0, "="], + [4308, 0, " "], + [4309, 0, "A"], + [4310, 0, "_"], + [4311, 0, "p"], + [4312, 0, "("], + [4313, 0, "\\"], + [4314, 0, "m"], + [4315, 0, "a"], + [4316, 0, "t"], + [4317, 0, "h"], + [4318, 0, "s"], + [4319, 0, "f"], + [4320, 0, "{"], + [4321, 0, "c"], + [4322, 0, "t"], + [4323, 0, "r"], + [4324, 0, "}"], + [4325, 0, ")"], + [4352, 1], + [4351, 1], + [4350, 1], + [4349, 1], + [4348, 1], + [4347, 1], + [4346, 1], + [4345, 1], + [4344, 1], + [4343, 1], + [4342, 1], + [4341, 1], + [4340, 1], + [4339, 1], + [4757, 0, "~"], + [4757, 1], + [8448, 1], + [8448, 0, ","], + [8357, 1], + [8357, 0, ","], + [8174, 1], + [8174, 0, ","], + [8054, 1], + [8054, 0, ","], + [7674, 1], + [7674, 0, ","], + [7575, 1], + [7575, 0, ","], + [7203, 1], + [7203, 0, ","], + [7111, 1], + [7111, 0, ","], + [6951, 1], + [6951, 0, ","], + [7004, 1], + [7004, 0, ","], + [6822, 1], + [6822, 0, ","], + [6760, 1], + [6760, 0, ","], + [6791, 1], + [6791, 0, ","], + [6646, 1], + [6646, 0, ","], + [6592, 1], + [6592, 0, ","], + [6462, 1], + [6462, 0, ","], + [6400, 1], + [6400, 0, ","], + [6431, 1], + [6431, 0, ","], + [6288, 1], + [6288, 0, ","], + [6254, 1], + [6254, 0, ","], + [6141, 1], + [6141, 0, ","], + [6080, 1], + [6080, 0, ","], + [6081, 0, " "], + [6111, 1], + [6111, 0, ","], + [5785, 1], + [5785, 0, ","], + [5703, 1], + [5703, 0, ","], + [5364, 1], + [5364, 0, ","], + [5188, 1], + [5188, 0, ","], + [5026, 1], + [5026, 0, ","], + [4802, 1], + [4802, 0, ","], + [4596, 1], + [4596, 0, ","], + [4410, 1], + [4410, 0, ","], + [4470, 1], + [4470, 0, ","], + [8603, 0, "\n"], + [8604, 0, "\n"], + [8604, 1], + [8603, 1], + [1079, 0, "\n"], + [1080, 0, "%"], + [1081, 0, "\n"], + [1082, 0, "%"], + [1083, 0, " "], + [1084, 0, "L"], + [1085, 0, "o"], + [1086, 0, "o"], + [1087, 0, "k"], + [1088, 0, " "], + [1089, 0, "a"], + [1090, 0, "t"], + [1091, 0, " "], + [1092, 0, "K"], + [1093, 0, "C"], + [1094, 0, "'"], + [1095, 0, "s"], + [1096, 0, " "], + [1097, 0, "Q"], + [1098, 0, "u"], + [1099, 0, "e"], + [1100, 0, "l"], + [1101, 0, "e"], + [1102, 0, "a"], + [1103, 0, " "], + [1104, 0, "("], + [1105, 0, "a"], + [1106, 0, "l"], + [1107, 0, "s"], + [1108, 0, "o"], + [1109, 0, " "], + [1110, 0, "i"], + [1111, 0, "n"], + [1112, 0, " "], + [1113, 0, "D"], + [1114, 0, "E"], + [1115, 0, "B"], + [1116, 0, "u"], + [1117, 0, "l"], + [1118, 0, "l"], + [1119, 0, " "], + [1120, 0, "M"], + [1121, 0, "a"], + [1122, 0, "r"], + [1123, 0, "c"], + [1124, 0, "h"], + [1125, 0, ")"], + [1125, 0, " "], + [1126, 0, "i"], + [1127, 0, "s"], + [1128, 0, "s"], + [1129, 0, "u"], + [1130, 0, "e"], + [1166, 0, "\n"], + [1167, 0, "\\"], + [1168, 0, "s"], + [1169, 0, "u"], + [1170, 0, "b"], + [1171, 0, "s"], + [1172, 0, "e"], + [1173, 0, "c"], + [1174, 0, "t"], + [1175, 0, "i"], + [1176, 0, "o"], + [1177, 0, "n"], + [1178, 0, "{"], + [1179, 0, "L"], + [1180, 0, "a"], + [1181, 0, "m"], + [1182, 0, "p"], + [1183, 0, "o"], + [1184, 0, "r"], + [1185, 0, "t"], + [1186, 0, " "], + [1187, 0, "t"], + [1188, 0, "i"], + [1189, 0, "m"], + [1190, 0, "e"], + [1191, 0, "s"], + [1192, 0, "t"], + [1193, 0, "a"], + [1194, 0, "m"], + [1195, 0, "p"], + [1196, 0, "s"], + [1197, 0, "}"], + [1198, 0, "\n"], + [1165, 0, "\n"], + [1166, 0, "\n"], + [1167, 0, "W"], + [1168, 0, "e"], + [1169, 0, " "], + [1170, 0, "g"], + [1171, 0, "o"], + [1172, 0, " "], + [1173, 0, "a"], + [1174, 0, "b"], + [1175, 0, "o"], + [1176, 0, "u"], + [1177, 0, "t"], + [1178, 0, " "], + [1179, 0, "d"], + [1180, 0, "e"], + [1181, 0, "f"], + [1182, 0, "i"], + [1183, 0, "n"], + [1184, 0, "i"], + [1185, 0, "n"], + [1186, 0, "g"], + [1187, 0, " "], + [1188, 0, "t"], + [1189, 0, "h"], + [1190, 0, "e"], + [1191, 0, " "], + [1192, 0, "s"], + [1193, 0, "e"], + [1194, 0, "m"], + [1195, 0, "a"], + [1196, 0, "n"], + [1197, 0, "t"], + [1198, 0, "i"], + [1199, 0, "c"], + [1200, 0, "s"], + [1201, 0, " "], + [1202, 0, "f"], + [1203, 0, "o"], + [1204, 0, "r"], + [1205, 0, " "], + [1206, 0, "c"], + [1207, 0, "o"], + [1208, 0, "l"], + [1209, 0, "l"], + [1210, 0, "a"], + [1211, 0, "b"], + [1212, 0, "o"], + [1213, 0, "r"], + [1214, 0, "a"], + [1215, 0, "t"], + [1216, 0, "i"], + [1217, 0, "v"], + [1218, 0, "e"], + [1219, 0, "l"], + [1220, 0, "y"], + [1221, 0, " "], + [1222, 0, "e"], + [1223, 0, "d"], + [1224, 0, "i"], + [1225, 0, "t"], + [1226, 0, "a"], + [1227, 0, "b"], + [1228, 0, "l"], + [1229, 0, "e"], + [1230, 0, " "], + [1231, 0, "d"], + [1232, 0, "a"], + [1233, 0, "t"], + [1234, 0, "a"], + [1235, 0, " "], + [1236, 0, "s"], + [1237, 0, "t"], + [1238, 0, "r"], + [1239, 0, "u"], + [1240, 0, "c"], + [1241, 0, "t"], + [1242, 0, "u"], + [1243, 0, "r"], + [1244, 0, "e"], + [1245, 0, "s"], + [1246, 0, " "], + [1247, 0, "a"], + [1248, 0, "s"], + [1249, 0, " "], + [1250, 0, "f"], + [1251, 0, "o"], + [1252, 0, "l"], + [1253, 0, "l"], + [1254, 0, "w"], + [1255, 0, "0"], + [1255, 1], + [1254, 1], + [1254, 0, "o"], + [1255, 0, "w"], + [1256, 0, "s"], + [1257, 0, "."], + [1258, 0, " "], + [1259, 0, "F"], + [1260, 0, "i"], + [1261, 0, "r"], + [1262, 0, "s"], + [1263, 0, "t"], + [1264, 0, "l"], + [1265, 0, "y"], + [1266, 0, ","], + [1267, 0, " "], + [1268, 0, "w"], + [1269, 0, "e"], + [1270, 0, " "], + [1271, 0, "d"], + [1272, 0, "e"], + [1273, 0, "f"], + [1274, 0, "i"], + [1275, 0, "n"], + [1276, 0, "e"], + [1277, 0, " "], + [1278, 0, "a"], + [1279, 0, " "], + [1280, 0, "s"], + [1281, 0, "i"], + [1282, 0, "m"], + [1283, 0, "p"], + [1284, 0, "l"], + [1285, 0, "e"], + [1286, 0, " "], + [1287, 0, "c"], + [1288, 0, "o"], + [1289, 0, "m"], + [1290, 0, "m"], + [1291, 0, "a"], + [1292, 0, "n"], + [1293, 0, "d"], + [1294, 0, " "], + [1295, 0, "l"], + [1296, 0, "a"], + [1297, 0, "n"], + [1298, 0, "g"], + [1299, 0, "u"], + [1300, 0, "a"], + [1301, 0, "g"], + [1302, 0, "e"], + [1303, 0, " "], + [1304, 0, "t"], + [1305, 0, "h"], + [1306, 0, "a"], + [1307, 0, "t"], + [1308, 0, " "], + [1309, 0, "i"], + [1310, 0, "s"], + [1311, 0, " "], + [1312, 0, "e"], + [1313, 0, "x"], + [1314, 0, "e"], + [1315, 0, "c"], + [1316, 0, "u"], + [1317, 0, "t"], + [1318, 0, "e"], + [1319, 0, "d"], + [1320, 0, " "], + [1321, 0, "l"], + [1322, 0, "o"], + [1323, 0, "c"], + [1324, 0, "a"], + [1325, 0, "l"], + [1326, 0, "l"], + [1327, 0, "y"], + [1328, 0, " "], + [1329, 0, "o"], + [1330, 0, "n"], + [1331, 0, " "], + [1332, 0, "o"], + [1333, 0, "n"], + [1334, 0, "e"], + [1335, 0, " "], + [1336, 0, "o"], + [1336, 1], + [1335, 1], + [1334, 1], + [1333, 1], + [1332, 1], + [1331, 1], + [1330, 1], + [1329, 1], + [1329, 0, "a"], + [1330, 0, "t"], + [1331, 0, " "], + [1332, 0, "a"], + [1333, 0, "n"], + [1334, 0, "y"], + [1335, 0, " "], + [1336, 0, "o"], + [1337, 0, "f"], + [1338, 0, " "], + [1339, 0, "t"], + [1340, 0, "h"], + [1341, 0, "e"], + [1342, 0, " "], + [1343, 0, "p"], + [1344, 0, "e"], + [1345, 0, "e"], + [1346, 0, "r"], + [1347, 0, "s"], + [1348, 0, ","], + [1349, 0, " "], + [1350, 0, "a"], + [1351, 0, "n"], + [1352, 0, "d"], + [1353, 0, " "], + [1354, 0, "w"], + [1355, 0, "h"], + [1356, 0, "i"], + [1357, 0, "c"], + [1358, 0, "h"], + [1359, 0, " "], + [1360, 0, "a"], + [1361, 0, "l"], + [1362, 0, "l"], + [1363, 0, "o"], + [1364, 0, "w"], + [1365, 0, "s"], + [1366, 0, " "], + [1367, 0, "t"], + [1368, 0, "h"], + [1369, 0, "e"], + [1370, 0, " "], + [1371, 0, "l"], + [1372, 0, "o"], + [1373, 0, "c"], + [1374, 0, "a"], + [1375, 0, "l"], + [1376, 0, " "], + [1377, 0, "s"], + [1378, 0, "t"], + [1379, 0, "a"], + [1380, 0, "t"], + [1381, 0, "e"], + [1382, 0, " "], + [1383, 0, "o"], + [1384, 0, "f"], + [1385, 0, " "], + [1386, 0, "t"], + [1387, 0, "h"], + [1388, 0, "a"], + [1389, 0, "t"], + [1390, 0, " "], + [1391, 0, "p"], + [1392, 0, "e"], + [1393, 0, "e"], + [1394, 0, "r"], + [1395, 0, "'"], + [1396, 0, "s"], + [1397, 0, " "], + [1398, 0, "c"], + [1399, 0, "o"], + [1400, 0, "p"], + [1401, 0, "y"], + [1402, 0, " "], + [1403, 0, "o"], + [1404, 0, "f"], + [1405, 0, " "], + [1406, 0, "t"], + [1407, 0, "h"], + [1408, 0, "e"], + [1409, 0, " "], + [1410, 0, "d"], + [1411, 0, "o"], + [1412, 0, "c"], + [1413, 0, "u"], + [1414, 0, "m"], + [1415, 0, "e"], + [1416, 0, "n"], + [1417, 0, "t"], + [1418, 0, " "], + [1419, 0, "t"], + [1420, 0, "o"], + [1421, 0, " "], + [1422, 0, "b"], + [1423, 0, "e"], + [1424, 0, " "], + [1425, 0, "q"], + [1426, 0, "u"], + [1427, 0, "e"], + [1428, 0, "r"], + [1429, 0, "i"], + [1430, 0, "e"], + [1431, 0, "d"], + [1432, 0, " "], + [1433, 0, "a"], + [1434, 0, "n"], + [1435, 0, "d"], + [1436, 0, " "], + [1437, 0, "m"], + [1438, 0, "o"], + [1439, 0, "d"], + [1440, 0, "i"], + [1441, 0, "f"], + [1442, 0, "i"], + [1443, 0, "e"], + [1444, 0, "d"], + [1445, 0, "."], + [1446, 0, " "], + [1447, 0, "P"], + [1448, 0, "e"], + [1449, 0, "r"], + [1450, 0, "f"], + [1451, 0, "o"], + [1452, 0, "r"], + [1453, 0, "m"], + [1454, 0, "i"], + [1455, 0, "n"], + [1456, 0, "g"], + [1457, 0, " "], + [1458, 0, "q"], + [1459, 0, "u"], + [1460, 0, "e"], + [1461, 0, "r"], + [1462, 0, "i"], + [1463, 0, "e"], + [1464, 0, "s"], + [1465, 0, " "], + [1465, 1], + [1464, 1], + [1463, 1], + [1462, 1], + [1461, 1], + [1460, 1], + [1459, 1], + [1458, 1], + [1458, 0, "r"], + [1459, 0, "e"], + [1460, 0, "a"], + [1461, 0, "d"], + [1462, 0, "-"], + [1463, 0, "o"], + [1464, 0, "n"], + [1465, 0, "l"], + [1466, 0, "y"], + [1467, 0, " "], + [1468, 0, "q"], + [1469, 0, "u"], + [1470, 0, "e"], + [1471, 0, "r"], + [1472, 0, "i"], + [1473, 0, "e"], + [1474, 0, "s"], + [1475, 0, " "], + [1476, 0, "h"], + [1477, 0, "a"], + [1478, 0, "s"], + [1479, 0, " "], + [1480, 0, "n"], + [1481, 0, "o"], + [1482, 0, " "], + [1483, 0, "s"], + [1484, 0, "i"], + [1485, 0, "d"], + [1486, 0, "e"], + [1487, 0, "-"], + [1488, 0, "e"], + [1489, 0, "f"], + [1490, 0, "f"], + [1491, 0, "e"], + [1492, 0, "c"], + [1493, 0, "t"], + [1494, 0, "s"], + [1495, 0, ","], + [1496, 0, " "], + [1497, 0, "b"], + [1498, 0, "u"], + [1499, 0, "t"], + [1500, 0, " "], + [1501, 0, "p"], + [1502, 0, "e"], + [1503, 0, "r"], + [1503, 1], + [1502, 1], + [1501, 1], + [1501, 0, "m"], + [1502, 0, "o"], + [1503, 0, "d"], + [1504, 0, "i"], + [1505, 0, "f"], + [1506, 0, "y"], + [1507, 0, "i"], + [1508, 0, "n"], + [1509, 0, "g"], + [1510, 0, " "], + [1511, 0, "t"], + [1512, 0, "h"], + [1513, 0, "e"], + [1514, 0, " "], + [1515, 0, "d"], + [1516, 0, "o"], + [1517, 0, "c"], + [1518, 0, "u"], + [1519, 0, "m"], + [1520, 0, "e"], + [1521, 0, "n"], + [1522, 0, "t"], + [1523, 0, " "], + [1524, 0, "h"], + [1525, 0, "a"], + [1526, 0, "s"], + [1527, 0, " "], + [1528, 0, "t"], + [1529, 0, "h"], + [1530, 0, "e"], + [1531, 0, " "], + [1532, 0, "e"], + [1533, 0, "f"], + [1534, 0, "f"], + [1535, 0, "e"], + [1536, 0, "c"], + [1537, 0, "t"], + [1538, 0, " "], + [1539, 0, "o"], + [1540, 0, "f"], + [1541, 0, " "], + [1542, 0, "p"], + [1543, 0, "r"], + [1544, 0, "o"], + [1545, 0, "d"], + [1546, 0, "u"], + [1547, 0, "c"], + [1548, 0, "i"], + [1549, 0, "n"], + [1550, 0, "g"], + [1551, 0, " "], + [1552, 0, "\\"], + [1553, 0, "e"], + [1554, 0, "m"], + [1555, 0, "p"], + [1556, 0, "h"], + [1557, 0, "{"], + [1558, 0, "o"], + [1559, 0, "p"], + [1560, 0, "e"], + [1561, 0, "r"], + [1562, 0, "a"], + [1563, 0, "t"], + [1564, 0, "i"], + [1565, 0, "o"], + [1566, 0, "n"], + [1567, 0, "s"], + [1568, 0, "}"], + [1569, 0, " "], + [1570, 0, "d"], + [1571, 0, "e"], + [1572, 0, "s"], + [1573, 0, "c"], + [1574, 0, "r"], + [1575, 0, "i"], + [1576, 0, "b"], + [1577, 0, "i"], + [1578, 0, "n"], + [1579, 0, "g"], + [1580, 0, " "], + [1581, 0, "t"], + [1582, 0, "h"], + [1583, 0, "e"], + [1584, 0, " "], + [1585, 0, "m"], + [1586, 0, "u"], + [1587, 0, "t"], + [1588, 0, "a"], + [1589, 0, "t"], + [1590, 0, "i"], + [1591, 0, "o"], + [1592, 0, "n"], + [1593, 0, "."], + [1594, 0, " "], + [1595, 0, "T"], + [1596, 0, "h"], + [1597, 0, "o"], + [1598, 0, "s"], + [1599, 0, "e"], + [1600, 0, " "], + [1601, 0, "o"], + [1602, 0, "p"], + [1603, 0, "e"], + [1604, 0, "r"], + [1605, 0, "a"], + [1606, 0, "t"], + [1607, 0, "i"], + [1608, 0, "o"], + [1609, 0, "n"], + [1610, 0, "s"], + [1611, 0, " "], + [1612, 0, "a"], + [1613, 0, "r"], + [1614, 0, "e"], + [1615, 0, " "], + [1616, 0, "a"], + [1617, 0, "p"], + [1618, 0, "p"], + [1619, 0, "l"], + [1620, 0, "i"], + [1621, 0, "e"], + [1622, 0, "d"], + [1623, 0, " "], + [1624, 0, "t"], + [1625, 0, "o"], + [1626, 0, " "], + [1627, 0, "t"], + [1628, 0, "h"], + [1629, 0, "e"], + [1630, 0, " "], + [1631, 0, "l"], + [1632, 0, "o"], + [1633, 0, "c"], + [1634, 0, "a"], + [1635, 0, "l"], + [1636, 0, " "], + [1637, 0, "c"], + [1638, 0, "o"], + [1639, 0, "p"], + [1640, 0, "y"], + [1641, 0, " "], + [1642, 0, "o"], + [1643, 0, "f"], + [1644, 0, " "], + [1645, 0, "t"], + [1646, 0, "h"], + [1647, 0, "e"], + [1648, 0, " "], + [1649, 0, "d"], + [1650, 0, "o"], + [1651, 0, "c"], + [1652, 0, "u"], + [1653, 0, "m"], + [1654, 0, "e"], + [1655, 0, "n"], + [1656, 0, "t"], + [1657, 0, " "], + [1657, 1], + [1657, 0, ","], + [1658, 0, " "], + [1659, 0, "a"], + [1660, 0, "n"], + [1661, 0, "d"], + [1662, 0, " "], + [1663, 0, "a"], + [1664, 0, "l"], + [1665, 0, "s"], + [1666, 0, "o"], + [1667, 0, " "], + [1668, 0, "e"], + [1669, 0, "n"], + [1670, 0, "q"], + [1671, 0, "u"], + [1672, 0, "e"], + [1673, 0, "u"], + [1674, 0, "e"], + [1675, 0, "d"], + [1676, 0, " "], + [1677, 0, "f"], + [1678, 0, "o"], + [1679, 0, "r"], + [1680, 0, " "], + [1681, 0, "b"], + [1682, 0, "r"], + [1683, 0, "o"], + [1684, 0, "a"], + [1685, 0, "d"], + [1686, 0, "c"], + [1687, 0, "a"], + [1688, 0, "s"], + [1689, 0, "t"], + [1690, 0, "i"], + [1691, 0, "n"], + [1692, 0, "g"], + [1693, 0, " "], + [1694, 0, "t"], + [1695, 0, "o"], + [1696, 0, " "], + [1697, 0, "o"], + [1698, 0, "t"], + [1699, 0, "h"], + [1700, 0, "e"], + [1701, 0, "r"], + [1702, 0, " "], + [1703, 0, "p"], + [1704, 0, "e"], + [1705, 0, "e"], + [1706, 0, "r"], + [1707, 0, "s"], + [1708, 0, "."], + [1709, 0, " "], + [1710, 0, "\n"], + [1711, 0, "\n"], + [1712, 0, "\\"], + [1713, 0, "b"], + [1714, 0, "e"], + [1715, 0, "g"], + [1716, 0, "i"], + [1717, 0, "n"], + [1718, 0, "{"], + [1719, 0, "f"], + [1720, 0, "i"], + [1721, 0, "g"], + [1722, 0, "u"], + [1723, 0, "r"], + [1724, 0, "e"], + [1725, 0, "}"], + [1726, 0, "\n"], + [1727, 0, "\\"], + [1728, 0, "e"], + [1729, 0, "n"], + [1730, 0, "d"], + [1731, 0, "{"], + [1732, 0, "f"], + [1733, 0, "i"], + [1734, 0, "g"], + [1735, 0, "u"], + [1736, 0, "r"], + [1737, 0, "e"], + [1738, 0, "}"], + [1726, 0, "\n"], + [1727, 0, "\\"], + [1728, 0, "c"], + [1729, 0, "a"], + [1730, 0, "p"], + [1731, 0, "t"], + [1732, 0, "i"], + [1733, 0, "o"], + [1734, 0, "n"], + [1735, 0, "{"], + [1736, 0, "S"], + [1737, 0, "y"], + [1738, 0, "n"], + [1739, 0, "t"], + [1740, 0, "a"], + [1741, 0, "x"], + [1742, 0, " "], + [1743, 0, "o"], + [1744, 0, "f"], + [1745, 0, " "], + [1746, 0, "c"], + [1747, 0, "o"], + [1748, 0, "m"], + [1749, 0, "m"], + [1750, 0, "a"], + [1751, 0, "n"], + [1752, 0, "d"], + [1753, 0, " "], + [1754, 0, "l"], + [1755, 0, "a"], + [1756, 0, "n"], + [1757, 0, "g"], + [1758, 0, "u"], + [1759, 0, "a"], + [1760, 0, "g"], + [1761, 0, "e"], + [1762, 0, " "], + [1763, 0, "f"], + [1764, 0, "o"], + [1765, 0, "r"], + [1766, 0, " "], + [1767, 0, "l"], + [1768, 0, "o"], + [1769, 0, "c"], + [1770, 0, "a"], + [1771, 0, "l"], + [1772, 0, "l"], + [1773, 0, "y"], + [1774, 0, " "], + [1774, 1], + [1773, 1], + [1772, 1], + [1771, 1], + [1770, 1], + [1769, 1], + [1768, 1], + [1767, 1], + [1767, 0, "q"], + [1768, 0, "u"], + [1769, 0, "e"], + [1770, 0, "r"], + [1771, 0, "y"], + [1772, 0, "i"], + [1773, 0, "n"], + [1774, 0, "g"], + [1775, 0, " "], + [1776, 0, "a"], + [1777, 0, "n"], + [1778, 0, "d"], + [1779, 0, " "], + [1780, 0, "m"], + [1781, 0, "o"], + [1782, 0, "d"], + [1783, 0, "i"], + [1784, 0, "f"], + [1785, 0, "y"], + [1786, 0, "i"], + [1787, 0, "n"], + [1788, 0, "g"], + [1789, 0, " "], + [1790, 0, "a"], + [1791, 0, " "], + [1792, 0, "d"], + [1793, 0, "o"], + [1794, 0, "c"], + [1795, 0, "u"], + [1796, 0, "m"], + [1797, 0, "e"], + [1798, 0, "n"], + [1799, 0, "t"], + [1800, 0, "}"], + [1801, 0, "\\"], + [1802, 0, "l"], + [1803, 0, "a"], + [1804, 0, "b"], + [1805, 0, "e"], + [1806, 0, "l"], + [1807, 0, "{"], + [1808, 0, "f"], + [1809, 0, "i"], + [1810, 0, "g"], + [1811, 0, ":"], + [1812, 0, "l"], + [1813, 0, "o"], + [1814, 0, "c"], + [1815, 0, "a"], + [1816, 0, "l"], + [1817, 0, "-"], + [1818, 0, "s"], + [1819, 0, "y"], + [1820, 0, "n"], + [1821, 0, "t"], + [1822, 0, "a"], + [1823, 0, "x"], + [1824, 0, "}"], + [1726, 0, "\n"], + [1727, 0, "\\"], + [1728, 0, "b"], + [1729, 0, "e"], + [1730, 0, "g"], + [1731, 0, "i"], + [1732, 0, "n"], + [1733, 0, "{"], + [1734, 0, "t"], + [1735, 0, "a"], + [1736, 0, "b"], + [1737, 0, "u"], + [1738, 0, "l"], + [1739, 0, "a"], + [1740, 0, "r"], + [1741, 0, "}"], + [1742, 0, "\n"], + [1743, 0, "\\"], + [1744, 0, "e"], + [1745, 0, "n"], + [1746, 0, "d"], + [1747, 0, "{"], + [1748, 0, "t"], + [1749, 0, "a"], + [1750, 0, "b"], + [1751, 0, "u"], + [1752, 0, "l"], + [1753, 0, "a"], + [1754, 0, "r"], + [1755, 0, "}"], + [1742, 0, "\n"], + [1743, 0, "C"], + [1744, 0, "M"], + [1745, 0, "D"], + [1746, 0, " "], + [1747, 0, "&"], + [1748, 0, " "], + [1749, 0, ":"], + [1750, 0, ":"], + [1751, 0, "="], + [1752, 0, " "], + [1753, 0, "&"], + [1754, 0, " "], + [1755, 0, "l"], + [1755, 1], + [1755, 0, "\\"], + [1756, 0, "m"], + [1757, 0, "a"], + [1757, 1], + [1756, 1], + [1756, 0, "t"], + [1757, 0, "e"], + [1758, 0, "x"], + [1759, 0, "t"], + [1760, 0, "s"], + [1761, 0, "f"], + [1762, 0, "{"], + [1763, 0, "l"], + [1764, 0, "e"], + [1765, 0, "t"], + [1766, 0, "}"], + [1767, 0, " "], + [1768, 0, "$"], + [1769, 0, "x"], + [1770, 0, "$"], + [1771, 0, " "], + [1772, 0, "="], + [1773, 0, " "], + [1774, 0, "E"], + [1775, 0, "X"], + [1776, 0, "P"], + [1777, 0, "R"], + [1778, 0, " "], + [1779, 0, "&"], + [1780, 0, " "], + [1781, 0, "$"], + [1782, 0, "x"], + [1783, 0, " "], + [1784, 0, "\\"], + [1785, 0, "i"], + [1786, 0, "n"], + [1787, 0, " "], + [1788, 0, "\\"], + [1789, 0, "m"], + [1790, 0, "a"], + [1791, 0, "t"], + [1792, 0, "h"], + [1793, 0, "r"], + [1794, 0, "m"], + [1795, 0, "{"], + [1796, 0, "V"], + [1797, 0, "A"], + [1798, 0, "R"], + [1799, 0, "}"], + [1800, 0, "$"], + [1742, 0, "{"], + [1743, 0, "r"], + [1744, 0, "c"], + [1745, 0, "l"], + [1746, 0, "l"], + [1747, 0, "}"], + [1807, 0, " "], + [1808, 0, "\\"], + [1809, 0, "\\"], + [1810, 0, "\n"], + [1811, 0, "&"], + [1812, 0, " "], + [1813, 0, "|"], + [1814, 0, " "], + [1815, 0, "&"], + [1816, 0, " "], + [1817, 0, "E"], + [1818, 0, "X"], + [1819, 0, "P"], + [1820, 0, "R"], + [1821, 0, " "], + [1822, 0, "="], + [1823, 0, " "], + [1824, 0, "$"], + [1825, 0, "v"], + [1826, 0, "$"], + [1827, 0, " "], + [1828, 0, "&"], + [1829, 0, " "], + [1830, 0, "$"], + [1831, 0, "v"], + [1832, 0, " "], + [1833, 0, "\\"], + [1834, 0, "i"], + [1835, 0, "n"], + [1836, 0, " "], + [1837, 0, "V"], + [1838, 0, "A"], + [1839, 0, "L"], + [1837, 0, "\\"], + [1838, 0, "m"], + [1839, 0, "a"], + [1840, 0, "t"], + [1841, 0, "h"], + [1842, 0, "r"], + [1843, 0, "m"], + [1844, 0, "{"], + [1848, 0, "}"], + [1849, 0, "$"], + [1850, 0, " "], + [1851, 0, "\\"], + [1852, 0, "\\"], + [1813, 0, "|"], + [1813, 1], + [1813, 0, "\\"], + [1813, 1], + [1813, 0, "$"], + [1815, 0, "$"], + [1855, 0, "\n"], + [1856, 0, "^"], + [1856, 1], + [1856, 0, "&"], + [1857, 0, " "], + [1858, 0, "$"], + [1859, 0, "|"], + [1860, 0, "$"], + [1861, 0, " "], + [1862, 0, "&"], + [1863, 0, " "], + [1864, 0, "C"], + [1865, 0, "M"], + [1866, 0, "D"], + [1867, 0, ";"], + [1868, 0, " "], + [1869, 0, "C"], + [1870, 0, "M"], + [1871, 0, "D"], + [1872, 0, " "], + [1873, 0, "\\"], + [1874, 0, "\\"], + [1875, 0, "\n"], + [1876, 0, "E"], + [1877, 0, "X"], + [1878, 0, "P"], + [1879, 0, "R"], + [1880, 0, " "], + [1881, 0, "&"], + [1882, 0, " "], + [1883, 0, ":"], + [1884, 0, ":"], + [1885, 0, "="], + [1886, 0, " "], + [1887, 0, "&"], + [1888, 0, " "], + [1889, 0, "\\"], + [1890, 0, "t"], + [1891, 0, "e"], + [1892, 0, "x"], + [1893, 0, "t"], + [1894, 0, "s"], + [1895, 0, "f"], + [1896, 0, "{"], + [1897, 0, "d"], + [1898, 0, "o"], + [1899, 0, "c"], + [1900, 0, "}"], + [1901, 0, " "], + [1902, 0, "\\"], + [1903, 0, "\\"], + [1904, 0, "\n"], + [1905, 0, "&"], + [1906, 0, " "], + [1907, 0, "$"], + [1908, 0, "|"], + [1909, 0, "$"], + [1910, 0, " "], + [1911, 0, "E"], + [1912, 0, "X"], + [1913, 0, "P"], + [1914, 0, "R"], + [1915, 0, "."], + [1916, 0, "\\"], + [1917, 0, "m"], + [1918, 0, "a"], + [1919, 0, "t"], + [1920, 0, "h"], + [1921, 0, "s"], + [1922, 0, "f"], + [1923, 0, "{"], + [1924, 0, "g"], + [1925, 0, "e"], + [1926, 0, "t"], + [1927, 0, "}"], + [1928, 0, "("], + [1920, 1], + [1919, 1], + [1918, 1], + [1917, 1], + [1917, 0, "t"], + [1918, 0, "e"], + [1919, 0, "x"], + [1920, 0, "t"], + [1929, 0, "\\"], + [1930, 0, "t"], + [1931, 0, "e"], + [1932, 0, "x"], + [1933, 0, "t"], + [1934, 0, "i"], + [1935, 0, "t"], + [1936, 0, "{"], + [1937, 0, "k"], + [1938, 0, "e"], + [1939, 0, "y"], + [1940, 0, "}"], + [1941, 0, ")"], + [1942, 0, " "], + [1943, 0, "&"], + [1944, 0, " "], + [1945, 0, "\\"], + [1946, 0, "\\"], + [1946, 1], + [1945, 1], + [1945, 0, "$"], + [1946, 0, "\\"], + [1947, 0, "m"], + [1948, 0, "a"], + [1949, 0, "t"], + [1950, 0, "h"], + [1951, 0, "i"], + [1952, 0, "t"], + [1953, 0, "{"], + [1954, 0, "k"], + [1955, 0, "e"], + [1956, 0, "y"], + [1957, 0, "}"], + [1958, 0, " "], + [1959, 0, "\\"], + [1960, 0, "i"], + [1961, 0, "n"], + [1962, 0, " "], + [1963, 0, "\\"], + [1964, 0, "m"], + [1965, 0, "a"], + [1966, 0, "t"], + [1967, 0, "h"], + [1968, 0, "r"], + [1969, 0, "m"], + [1970, 0, " "], + [1970, 1], + [1970, 0, "{"], + [1971, 0, "V"], + [1972, 0, "A"], + [1973, 0, "L"], + [1974, 0, "}"], + [1975, 0, "$"], + [1976, 0, " "], + [1977, 0, "\\"], + [1978, 0, "\\"], + [1979, 0, "\n"], + [1980, 0, "&"], + [1981, 0, " "], + [1982, 0, "$"], + [1983, 0, "|"], + [1984, 0, "$"], + [1985, 0, " "], + [1986, 0, "E"], + [1987, 0, "X"], + [1988, 0, "P"], + [1989, 0, "R"], + [1990, 0, "."], + [1991, 0, "\\"], + [1992, 0, "t"], + [1993, 0, "e"], + [1994, 0, "x"], + [1995, 0, "t"], + [1996, 0, "s"], + [1997, 0, "f"], + [1998, 0, "{"], + [1999, 0, "n"], + [2000, 0, "e"], + [2001, 0, "x"], + [2002, 0, "t"], + [2003, 0, "}"], + [2004, 0, " "], + [2005, 0, "\\"], + [2006, 0, "\\"], + [2007, 0, "\n"], + [2008, 0, "&"], + [2009, 0, " "], + [2010, 0, "$"], + [2011, 0, "|"], + [2012, 0, "$"], + [2013, 0, " "], + [2014, 0, "E"], + [2015, 0, "X"], + [2016, 0, "P"], + [2017, 0, "R"], + [2018, 0, "."], + [2019, 0, "\\"], + [2019, 1], + [2019, 0, "\\"], + [2020, 0, "t"], + [2021, 0, "e"], + [2022, 0, "x"], + [2023, 0, "t"], + [2024, 0, "s"], + [2025, 0, "f"], + [2026, 0, "{"], + [2027, 0, "v"], + [2028, 0, "a"], + [2029, 0, "l"], + [2030, 0, "u"], + [2031, 0, "e"], + [2032, 0, "s"], + [2033, 0, "}"], + [2034, 0, "\n"], + [2034, 1], + [1855, 0, "\n"], + [1856, 0, "^"], + [1857, 0, " "], + [1857, 1], + [1856, 1], + [1856, 0, "&"], + [1857, 0, " "], + [1858, 0, "$"], + [1859, 0, "|"], + [1860, 0, "$"], + [1861, 0, " "], + [1862, 0, "&"], + [1863, 0, " "], + [1864, 0, "\\"], + [1865, 0, "m"], + [1866, 0, "a"], + [1867, 0, "t"], + [1868, 0, "h"], + [1869, 0, "s"], + [1870, 0, "f"], + [1871, 0, "{"], + [1872, 0, "y"], + [1873, 0, "i"], + [1874, 0, "e"], + [1875, 0, "l"], + [1876, 0, "d"], + [1877, 0, "}"], + [1878, 0, " "], + [1879, 0, "\\"], + [1880, 0, "\\"], + [1868, 1], + [1867, 1], + [1866, 1], + [1865, 1], + [1865, 0, "t"], + [1866, 0, "e"], + [1867, 0, "x"], + [1868, 0, "t"], + [1937, 0, "&"], + [1938, 0, " "], + [2014, 0, "&"], + [2015, 0, " "], + [2044, 0, "&"], + [2045, 0, " "], + [1901, 0, "\\"], + [1902, 0, "v"], + [1903, 0, "s"], + [1904, 0, "p"], + [1905, 0, "a"], + [1906, 0, "c"], + [1907, 0, "e"], + [1908, 0, "{"], + [1909, 0, "1"], + [1910, 0, "0"], + [1911, 0, "p"], + [1912, 0, "t"], + [1913, 0, "}"], + [1912, 1], + [1911, 1], + [1910, 1], + [1910, 0, "e"], + [1911, 0, "m"], + [1913, 0, "\\"], + [1914, 0, "\\"], + [1900, 1], + [1899, 1], + [2019, 0, "\n"], + [2020, 0, "&"], + [2021, 0, " "], + [2022, 0, "$"], + [2023, 0, "|"], + [2024, 0, "$"], + [2025, 0, " "], + [2026, 0, "&"], + [2027, 0, " "], + [2028, 0, "E"], + [2029, 0, "X"], + [2030, 0, "P"], + [2031, 0, "R"], + [2032, 0, "."], + [2033, 0, "\\"], + [2034, 0, "t"], + [2035, 0, "e"], + [2036, 0, "x"], + [2037, 0, "t"], + [2038, 0, "s"], + [2039, 0, "f"], + [2040, 0, "{"], + [2041, 0, "d"], + [2042, 0, "e"], + [2043, 0, "l"], + [2044, 0, "K"], + [2045, 0, "e"], + [2046, 0, "y"], + [2047, 0, "}"], + [2048, 0, " "], + [2049, 0, "\\"], + [2050, 0, "\\"], + [2081, 0, "\n"], + [2082, 0, "&"], + [2083, 0, " "], + [2084, 0, "$"], + [2085, 0, "|"], + [2086, 0, "$"], + [2087, 0, " "], + [2088, 0, "&"], + [2089, 0, " "], + [2090, 0, "E"], + [2091, 0, "X"], + [2092, 0, "P"], + [2093, 0, "R"], + [2094, 0, "."], + [2095, 0, "\\"], + [2096, 0, "t"], + [2097, 0, "e"], + [2098, 0, "x"], + [2099, 0, "t"], + [2100, 0, "s"], + [2101, 0, "f"], + [2102, 0, "{"], + [2103, 0, "d"], + [2104, 0, "e"], + [2105, 0, "l"], + [2043, 1], + [2042, 1], + [2041, 1], + [2041, 0, "r"], + [2042, 0, "m"], + [2104, 1], + [2103, 1], + [2102, 1], + [2102, 0, "r"], + [2103, 0, "m"], + [2104, 0, "E"], + [2105, 0, "l"], + [2106, 0, "e"], + [2107, 0, "m"], + [2108, 0, "}"], + [2109, 0, " "], + [2110, 0, "\\"], + [2111, 0, "\\"], + [2141, 0, " "], + [2142, 0, "\\"], + [2143, 0, "\\"], + [2144, 0, "\n"], + [2145, 0, "&"], + [2146, 0, " "], + [2147, 0, "$"], + [2148, 0, "|"], + [2149, 0, "$"], + [2150, 0, " "], + [2151, 0, "&"], + [2152, 0, " "], + [2153, 0, "$"], + [2154, 0, "x"], + [2155, 0, "$"], + [2156, 0, " "], + [2157, 0, "&"], + [2158, 0, " "], + [2159, 0, "$"], + [2160, 0, "x"], + [2161, 0, " "], + [2162, 0, "\\"], + [2163, 0, "i"], + [2164, 0, "n"], + [2165, 0, " "], + [2166, 0, "\\"], + [2167, 0, "m"], + [2168, 0, "a"], + [2169, 0, "t"], + [2170, 0, "h"], + [2171, 0, "r"], + [2172, 0, "m"], + [2173, 0, "{"], + [2174, 0, "V"], + [2175, 0, "A"], + [2176, 0, "R"], + [2177, 0, "}"], + [2178, 0, "$"], + [2179, 0, " "], + [2180, 0, "\\"], + [2181, 0, "v"], + [2182, 0, "s"], + [2183, 0, "p"], + [2184, 0, "a"], + [2185, 0, "c"], + [2186, 0, "e"], + [2187, 0, "{"], + [2188, 0, "1"], + [2189, 0, "e"], + [2190, 0, "m"], + [2191, 0, "}"], + [2192, 0, "\\"], + [2193, 0, "\\"], + [2194, 0, "\n"], + [2195, 0, "V"], + [2196, 0, "A"], + [2197, 0, "R"], + [2198, 0, " "], + [2199, 0, "&"], + [2200, 0, " "], + [2201, 0, ":"], + [2202, 0, ":"], + [2203, 0, "="], + [2204, 0, " "], + [2205, 0, "&"], + [2206, 0, " "], + [2207, 0, "$"], + [2208, 0, "{"], + [2209, 0, "x"], + [2210, 0, "_"], + [2211, 0, "1"], + [2212, 0, ","], + [2213, 0, " "], + [2214, 0, "x"], + [2215, 0, "_"], + [2216, 0, "2"], + [2217, 0, ","], + [2218, 0, " "], + [2219, 0, "\\"], + [2220, 0, "d"], + [2221, 0, "o"], + [2222, 0, "t"], + [2223, 0, "s"], + [2224, 0, "}"], + [2225, 0, "$"], + [2226, 0, "\n"], + [2227, 0, "V"], + [2228, 0, "A"], + [2229, 0, "L"], + [2230, 0, " "], + [2231, 0, "&"], + [2232, 0, " "], + [2233, 0, ":"], + [2234, 0, ":"], + [2235, 0, "="], + [2236, 0, " "], + [2237, 0, "&"], + [2238, 0, " "], + [2239, 0, "\\"], + [2240, 0, "m"], + [2241, 0, "a"], + [2242, 0, "t"], + [2243, 0, "h"], + [2244, 0, "b"], + [2245, 0, "b"], + [2239, 0, "$"], + [2247, 0, "{"], + [2248, 0, "N"], + [2249, 0, "}"], + [2250, 0, " "], + [2251, 0, "\\"], + [2252, 0, "c"], + [2253, 0, "u"], + [2254, 0, "p"], + [2255, 0, " "], + [2256, 0, "\\"], + [2257, 0, "m"], + [2258, 0, "a"], + [2259, 0, "t"], + [2260, 0, "h"], + [2261, 0, "r"], + [2262, 0, "m"], + [2263, 0, "{"], + [2264, 0, "S"], + [2265, 0, "t"], + [2266, 0, "r"], + [2267, 0, "i"], + [2268, 0, "n"], + [2269, 0, "g"], + [2270, 0, "}"], + [2271, 0, "$"], + [2226, 0, " "], + [2227, 0, "\\"], + [2228, 0, "\\"], + [116, 0, "\n"], + [117, 0, "\\"], + [118, 0, "u"], + [119, 0, "s"], + [120, 0, "e"], + [121, 0, "p"], + [122, 0, "a"], + [123, 0, "c"], + [124, 0, "k"], + [125, 0, "a"], + [126, 0, "g"], + [127, 0, "e"], + [128, 0, "{"], + [129, 0, "a"], + [130, 0, "m"], + [131, 0, "s"], + [132, 0, "s"], + [133, 0, "y"], + [134, 0, "m"], + [135, 0, "b"], + [136, 0, "}"], + [137, 0, " "], + [138, 0, "%"], + [139, 0, " "], + [140, 0, "m"], + [141, 0, "a"], + [142, 0, "t"], + [143, 0, "h"], + [144, 0, "b"], + [145, 0, "b"], + [2257, 0, "\\"], + [2258, 0, "v"], + [2259, 0, "s"], + [2260, 0, "p"], + [2261, 0, "a"], + [2262, 0, "c"], + [2263, 0, "e"], + [2264, 0, "{"], + [2265, 0, "0"], + [2266, 0, "."], + [2267, 0, "5"], + [2268, 0, "e"], + [2269, 0, "m"], + [2270, 0, "}"], + [2218, 1], + [2218, 0, "0"], + [2219, 0, "."], + [2220, 0, "5"], + [1937, 1], + [1937, 0, "0"], + [1938, 0, "."], + [1939, 0, "5"], + [2302, 0, "\\"], + [2303, 0, ";"], + [2308, 0, "\\"], + [2309, 0, ";"], + [1885, 0, "\n"], + [1886, 0, "&"], + [1887, 0, " "], + [1888, 0, "$"], + [1889, 0, "|"], + [1890, 0, "$"], + [1891, 0, " "], + [1892, 0, "&"], + [1893, 0, " "], + [1894, 0, "E"], + [1895, 0, "X"], + [1896, 0, "P"], + [1897, 0, "R"], + [1898, 0, "."], + [1899, 0, "\\"], + [1900, 0, "m"], + [1901, 0, "a"], + [1901, 1], + [1900, 1], + [1900, 0, "t"], + [1901, 0, "e"], + [1902, 0, "x"], + [1903, 0, "t"], + [1904, 0, "s"], + [1905, 0, "f"], + [1906, 0, "{"], + [1907, 0, "i"], + [1908, 0, "n"], + [1909, 0, "s"], + [1910, 0, "e"], + [1911, 0, "r"], + [1912, 0, "t"], + [1913, 0, "A"], + [1914, 0, "f"], + [1915, 0, "t"], + [1916, 0, "e"], + [1917, 0, "r"], + [1918, 0, "}"], + [1919, 0, "("], + [1917, 1], + [1916, 1], + [1915, 1], + [1914, 1], + [1913, 1], + [1894, 0, "$"], + [1895, 0, "\\"], + [1896, 0, "m"], + [1897, 0, "a"], + [1898, 0, "t"], + [1899, 0, "h"], + [1900, 0, "r"], + [1901, 0, "m"], + [1902, 0, "{"], + [1907, 0, "}"], + [1910, 1], + [1910, 1], + [1910, 1], + [1910, 1], + [1910, 0, "m"], + [1911, 0, "a"], + [1912, 0, "t"], + [1913, 0, "h"], + [1925, 0, "v"], + [1926, 0, ")"], + [1927, 0, "$"], + [1928, 0, " "], + [1929, 0, "&"], + [1930, 0, " "], + [1931, 0, "$"], + [1932, 0, "v"], + [1933, 0, " "], + [1934, 0, "\\"], + [1935, 0, "i"], + [1936, 0, "n"], + [1937, 0, " "], + [1938, 0, "\\"], + [1939, 0, "m"], + [1940, 0, "a"], + [1941, 0, "t"], + [1942, 0, "h"], + [1943, 0, "r"], + [1944, 0, "m"], + [1945, 0, "{"], + [1946, 0, "V"], + [1947, 0, "A"], + [1948, 0, "L"], + [1949, 0, "}"], + [1950, 0, "$"], + [1951, 0, " "], + [1952, 0, "\\"], + [1953, 0, "\\"], + [1954, 0, "\n"], + [1955, 0, "&"], + [1956, 0, " "], + [1957, 0, "$"], + [1957, 1], + [1957, 0, "$"], + [1958, 0, "|"], + [1959, 0, "$"], + [1960, 0, " "], + [1961, 0, "&"], + [1962, 0, " "], + [1963, 0, "\\"], + [1964, 0, "m"], + [1965, 0, "a"], + [1966, 0, "t"], + [1967, 0, "h"], + [1968, 0, "r"], + [1969, 0, "m"], + [1963, 0, "%"], + [1963, 1], + [1963, 0, "$"], + [1849, 0, "$"], + [1850, 0, "\\"], + [1851, 0, "m"], + [1852, 0, "a"], + [1853, 0, "t"], + [1854, 0, "h"], + [1855, 0, "r"], + [1856, 0, "m"], + [1857, 0, "{"], + [1862, 0, "}"], + [1866, 1], + [1980, 0, "{"], + [1981, 0, "E"], + [1982, 0, "X"], + [1983, 0, "P"], + [1984, 0, "R"], + [1985, 0, "}"], + [1986, 0, "."], + [1987, 0, "\\"], + [1988, 0, "m"], + [1989, 0, "a"], + [1990, 0, "t"], + [1991, 0, "h"], + [1992, 0, "s"], + [1993, 0, "f"], + [1994, 0, "{"], + [1995, 0, "r"], + [1996, 0, "m"], + [1997, 0, "K"], + [1998, 0, "e"], + [1999, 0, "y"], + [1999, 1], + [1998, 1], + [1997, 1], + [1996, 1], + [1995, 1], + [1995, 0, "d"], + [1996, 0, "e"], + [1997, 0, "l"], + [1998, 0, "e"], + [1999, 0, "t"], + [2000, 0, "e"], + [2001, 0, "}"], + [2002, 0, " "], + [2003, 0, "\\"], + [2004, 0, "\\"], + [2002, 0, "$"], + [2202, 1], + [2201, 1], + [2200, 1], + [2199, 1], + [2198, 1], + [2197, 1], + [2196, 1], + [2195, 1], + [2194, 1], + [2193, 1], + [2192, 1], + [2191, 1], + [2190, 1], + [2189, 1], + [2188, 1], + [2187, 1], + [2186, 1], + [2185, 1], + [2184, 1], + [2183, 1], + [2182, 1], + [2181, 1], + [2180, 1], + [2179, 1], + [2178, 1], + [2177, 1], + [2176, 1], + [2175, 1], + [2174, 1], + [2173, 1], + [2172, 1], + [2171, 1], + [2171, 0, "\\"], + [2233, 1], + [2232, 1], + [2231, 1], + [2230, 1], + [2229, 1], + [2228, 1], + [2227, 1], + [2226, 1], + [2225, 1], + [2224, 1], + [2223, 1], + [2222, 1], + [2221, 1], + [2220, 1], + [2219, 1], + [2218, 1], + [2217, 1], + [2216, 1], + [2215, 1], + [2214, 1], + [2213, 1], + [2212, 1], + [2211, 1], + [2210, 1], + [2209, 1], + [2208, 1], + [2207, 1], + [2206, 1], + [2205, 1], + [2204, 1], + [2203, 1], + [2202, 1], + [2095, 0, "\n"], + [2096, 0, "&"], + [2097, 0, " "], + [2098, 0, "$"], + [2099, 0, "|"], + [2100, 0, "$"], + [2101, 0, " "], + [2102, 0, "&"], + [2103, 0, " "], + [2104, 0, "$"], + [2105, 0, "x"], + [2106, 0, "$"], + [2107, 0, " "], + [2108, 0, "&"], + [2109, 0, " "], + [2110, 0, "$"], + [2111, 0, "x"], + [2112, 0, " "], + [2113, 0, "\\"], + [2114, 0, "i"], + [2115, 0, "n"], + [2116, 0, " "], + [2117, 0, "\\"], + [2118, 0, "m"], + [2119, 0, "a"], + [2120, 0, "t"], + [2121, 0, "h"], + [2122, 0, "r"], + [2123, 0, "m"], + [2124, 0, "{"], + [2125, 0, "V"], + [2126, 0, "A"], + [2127, 0, "R"], + [2128, 0, "}"], + [2129, 0, " "], + [2130, 0, "$"], + [2130, 1], + [2129, 1], + [2129, 0, "$"], + [2130, 0, " "], + [2131, 0, "\\"], + [2132, 0, "\\"], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2273, 1], + [2270, 0, "\\"], + [2271, 0, "v"], + [2272, 0, "s"], + [2273, 0, "p"], + [2274, 0, "a"], + [2275, 0, "c"], + [2276, 0, "e"], + [2277, 0, "{"], + [2278, 0, "0"], + [2279, 0, "."], + [2280, 0, "5"], + [2281, 0, "e"], + [2282, 0, "m"], + [2283, 0, "}"], + [2204, 1], + [2203, 1], + [2202, 1], + [2202, 0, "S"], + [2203, 0, "t"], + [2204, 0, "r"], + [2205, 0, "i"], + [2206, 0, "n"], + [2207, 0, "g"], + [2006, 0, "\n"], + [2007, 0, "&"], + [2008, 0, " "], + [2009, 0, "$"], + [2010, 0, "|"], + [2011, 0, "$"], + [2012, 0, " "], + [2013, 0, "&"], + [2014, 0, " "], + [2015, 0, "$"], + [2016, 0, "\\"], + [2017, 0, "m"], + [2018, 0, "a"], + [2019, 0, "t"], + [2020, 0, "h"], + [2021, 0, "r"], + [2022, 0, "m"], + [2023, 0, "{"], + [2024, 0, "E"], + [2025, 0, "X"], + [2026, 0, "P"], + [2027, 0, "R"], + [2028, 0, "}"], + [2029, 0, "."], + [2030, 0, "\\"], + [2031, 0, "m"], + [2032, 0, "a"], + [2033, 0, "t"], + [2034, 0, "h"], + [2035, 0, "s"], + [2036, 0, "f"], + [2037, 0, "{"], + [2038, 0, "i"], + [2039, 0, "n"], + [2040, 0, "c"], + [2041, 0, "r"], + [2042, 0, "}"], + [2043, 0, "("], + [2044, 0, "n"], + [2045, 0, ")"], + [2046, 0, "$"], + [2047, 0, " "], + [2048, 0, "&"], + [2049, 0, " "], + [2050, 0, "$"], + [2051, 0, "n"], + [2052, 0, " "], + [2053, 0, "\\"], + [2054, 0, "i"], + [2055, 0, "n"], + [2056, 0, " "], + [2057, 0, "\\"], + [2058, 0, "m"], + [2059, 0, "a"], + [2060, 0, "t"], + [2061, 0, "h"], + [2062, 0, "b"], + [2063, 0, "b"], + [2064, 0, "{"], + [2065, 0, "N"], + [2066, 0, "}"], + [2067, 0, "$"], + [2068, 0, " "], + [2069, 0, "\\"], + [2070, 0, "\\"], + [2415, 0, " "], + [2416, 0, "n"], + [2417, 0, " "], + [2418, 0, "&"], + [2421, 0, "n"], + [2422, 0, " "], + [2423, 0, "\\"], + [2424, 0, " "], + [2424, 1], + [2424, 0, "i"], + [2425, 0, "n"], + [2426, 0, " "], + [2461, 1], + [2460, 1], + [2459, 1], + [2458, 1], + [2457, 1], + [2456, 1], + [2455, 1], + [2454, 1], + [2453, 1], + [2452, 1], + [2451, 1], + [2450, 1], + [2449, 1], + [2448, 1], + [2447, 1], + [2446, 1], + [2445, 1], + [2444, 1], + [2443, 1], + [2442, 1], + [2441, 1], + [2440, 1], + [2439, 1], + [2438, 1], + [2437, 1], + [2438, 0, "\n"], + [2439, 0, "&"], + [2440, 0, " "], + [2441, 0, "|"], + [2441, 1], + [2441, 0, "$"], + [2442, 0, "|"], + [2443, 0, "$"], + [2444, 0, " "], + [2445, 0, "&"], + [2446, 0, " "], + [2447, 0, "s"], + [2416, 0, "$"], + [2418, 0, "$"], + [2449, 0, "$"], + [2451, 0, "$"], + [2452, 0, " "], + [2453, 0, "&"], + [2454, 0, " "], + [2455, 0, "$"], + [2456, 0, "s"], + [2457, 0, " "], + [2458, 0, "\\"], + [2459, 0, "i"], + [2460, 0, "n"], + [2461, 0, " "], + [2462, 0, "\\"], + [2463, 0, "m"], + [2464, 0, "a"], + [2465, 0, "t"], + [2466, 0, "h"], + [2467, 0, "r"], + [2468, 0, "m"], + [2469, 0, "{"], + [2470, 0, "S"], + [2471, 0, "t"], + [2472, 0, "r"], + [2473, 0, "i"], + [2474, 0, "n"], + [2475, 0, "g"], + [2476, 0, "}"], + [2477, 0, "$"], + [2440, 0, " "], + [2441, 0, "\\"], + [2442, 0, "\\"], + [2481, 0, " "], + [2482, 0, "\\"], + [2483, 0, "\\"], + [2484, 0, "\n"], + [2485, 0, "&"], + [2486, 0, " "], + [2487, 0, "$"], + [2488, 0, "|"], + [2489, 0, "$"], + [2490, 0, " "], + [2491, 0, "&"], + [2492, 0, " "], + [2493, 0, "\\"], + [2494, 0, "m"], + [2495, 0, "a"], + [2495, 1], + [2494, 1], + [2494, 0, "t"], + [2495, 0, "e"], + [2496, 0, "x"], + [2497, 0, "t"], + [2498, 0, "s"], + [2499, 0, "f"], + [2500, 0, "{"], + [2501, 0, "\\"], + [2502, 0, "{"], + [2503, 0, "\\"], + [2504, 0, "}"], + [2505, 0, "}"], + [2506, 0, " "], + [2507, 0, "\\"], + [2508, 0, "\\"], + [2509, 0, "\n"], + [2510, 0, "&"], + [2511, 0, " "], + [2512, 0, "|"], + [2512, 1], + [2512, 0, "$"], + [2513, 0, "|"], + [2514, 0, "$"], + [2515, 0, " "], + [2516, 0, "&"], + [2517, 0, " "], + [2518, 0, "\\"], + [2519, 0, "t"], + [2520, 0, "e"], + [2521, 0, "x"], + [2522, 0, "t"], + [2523, 0, "s"], + [2524, 0, "f"], + [2525, 0, "{"], + [2526, 0, "\\"], + [2527, 0, "["], + [2528, 0, "\\"], + [2529, 0, "]"], + [2530, 0, "}"], + [2526, 1], + [2529, 1], + [2528, 1], + [2527, 1], + [2526, 1], + [2525, 1], + [2524, 1], + [2523, 1], + [2522, 1], + [2521, 1], + [2520, 1], + [2519, 1], + [2518, 1], + [2518, 0, "$"], + [2519, 0, "\\"], + [2520, 0, "m"], + [2521, 0, "a"], + [2522, 0, "t"], + [2523, 0, "h"], + [2524, 0, "s"], + [2525, 0, "f"], + [2526, 0, "{"], + [2527, 0, "["], + [2528, 0, "]"], + [2529, 0, "}"], + [2530, 0, "$"], + [2528, 0, "\\"], + [2529, 0, ","], + [2499, 1], + [2498, 1], + [2498, 0, "t"], + [2499, 0, "t"], + [2525, 1], + [2524, 1], + [2524, 0, "t"], + [2525, 0, "t"], + [2505, 1], + [2504, 1], + [2503, 1], + [2502, 1], + [2501, 1], + [2500, 1], + [2499, 1], + [2498, 1], + [2497, 1], + [2496, 1], + [2495, 1], + [2494, 1], + [2494, 0, "v"], + [2495, 0, "e"], + [2496, 0, "r"], + [2497, 0, "b"], + [2498, 0, "|"], + [2499, 0, "{"], + [2500, 0, "}"], + [2501, 0, "|"], + [2528, 1], + [2527, 1], + [2526, 1], + [2525, 1], + [2524, 1], + [2523, 1], + [2522, 1], + [2521, 1], + [2520, 1], + [2519, 1], + [2518, 1], + [2517, 1], + [2516, 1], + [2515, 1], + [2514, 1], + [2513, 1], + [2513, 0, " "], + [2514, 0, "\n"], + [2515, 0, "v"], + [2516, 0, "e"], + [2517, 0, "r"], + [2517, 1], + [2516, 1], + [2515, 1], + [2514, 1], + [2514, 0, "\\"], + [2515, 0, "v"], + [2516, 0, "e"], + [2517, 0, "r"], + [2518, 0, "b"], + [2519, 0, "|"], + [2520, 0, "["], + [2521, 0, "]"], + [2522, 0, "|"], + [2452, 0, "\\"], + [2453, 0, "v"], + [2454, 0, "e"], + [2455, 0, "r"], + [2456, 0, "b"], + [2457, 0, "|"], + [2458, 0, "\""], + [2459, 0, "|"], + [2460, 0, " "], + [2464, 0, " "], + [2465, 0, "\\"], + [2466, 0, "v"], + [2467, 0, "e"], + [2468, 0, "r"], + [2469, 0, "b"], + [2470, 0, "|"], + [2471, 0, "\""], + [2472, 0, "|"], + [2459, 0, "s"], + [2460, 0, "t"], + [2461, 0, "r"], + [2462, 0, "|"], + [2462, 1], + [2462, 0, "\""], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2465, 1], + [2468, 0, "\\"], + [2469, 0, "m"], + [2470, 0, "a"], + [2471, 0, "t"], + [2472, 0, "h"], + [2473, 0, "t"], + [2474, 0, "t"], + [2475, 0, "{"], + [2477, 0, "t"], + [2478, 0, "r"], + [2479, 0, "}"], + [2669, 0, "\n"], + [2670, 0, "\n"], + [2671, 0, "\\"], + [2672, 0, "s"], + [2673, 0, "u"], + [2674, 0, "b"], + [2675, 0, "s"], + [2676, 0, "e"], + [2677, 0, "c"], + [2678, 0, "t"], + [2679, 0, "i"], + [2680, 0, "o"], + [2681, 0, "n"], + [2682, 0, "{"], + [2683, 0, "C"], + [2684, 0, "o"], + [2685, 0, "m"], + [2686, 0, "m"], + [2687, 0, "a"], + [2688, 0, "n"], + [2689, 0, "d"], + [2690, 0, " "], + [2691, 0, "l"], + [2692, 0, "a"], + [2693, 0, "n"], + [2694, 0, "g"], + [2695, 0, "u"], + [2696, 0, "a"], + [2697, 0, "g"], + [2698, 0, "e"], + [2699, 0, "}"], + [2700, 0, "\n"], + [2701, 0, "\n"], + [2702, 0, "T"], + [2703, 0, "R"], + [2703, 1], + [2703, 0, "h"], + [2704, 0, "e"], + [2705, 0, " "], + [2706, 0, "s"], + [2707, 0, "y"], + [2708, 0, "n"], + [2709, 0, "t"], + [2710, 0, "a"], + [2711, 0, "x"], + [2712, 0, " "], + [2713, 0, "o"], + [2714, 0, "f"], + [2715, 0, " "], + [2716, 0, "t"], + [2717, 0, "h"], + [2718, 0, "e"], + [2719, 0, " "], + [2720, 0, "c"], + [2721, 0, "o"], + [2722, 0, "m"], + [2723, 0, "m"], + [2724, 0, "a"], + [2725, 0, "n"], + [2726, 0, "d"], + [2727, 0, " "], + [2728, 0, "l"], + [2729, 0, "a"], + [2730, 0, "n"], + [2731, 0, "g"], + [2732, 0, "u"], + [2733, 0, "a"], + [2734, 0, "g"], + [2735, 0, "e"], + [2736, 0, " "], + [2737, 0, "i"], + [2738, 0, "s"], + [2739, 0, " "], + [2740, 0, "g"], + [2741, 0, "i"], + [2742, 0, "v"], + [2743, 0, "e"], + [2744, 0, "n"], + [2745, 0, " "], + [2746, 0, "i"], + [2747, 0, "n"], + [2748, 0, " "], + [2749, 0, "F"], + [2750, 0, "i"], + [2751, 0, "g"], + [2752, 0, "u"], + [2753, 0, "r"], + [2754, 0, "e"], + [2755, 0, "~"], + [2756, 0, "\\"], + [2757, 0, "r"], + [2758, 0, "e"], + [2759, 0, "f"], + [2760, 0, "{"], + [2761, 0, "f"], + [2762, 0, "i"], + [2763, 0, "g"], + [2764, 0, ":"], + [2765, 0, "l"], + [2766, 0, "o"], + [2767, 0, "c"], + [2768, 0, "a"], + [2769, 0, "l"], + [2770, 0, "-"], + [2771, 0, "s"], + [2772, 0, "y"], + [2773, 0, "n"], + [2774, 0, "t"], + [2775, 0, "a"], + [2776, 0, "x"], + [2777, 0, "}"], + [2778, 0, "."], + [2779, 0, " "], + [2780, 0, "A"], + [2781, 0, " "], + [2782, 0, "p"], + [2783, 0, "r"], + [2784, 0, "o"], + [2785, 0, "g"], + [2786, 0, "r"], + [2787, 0, "a"], + [2788, 0, "m"], + [2789, 0, " "], + [2790, 0, "i"], + [2791, 0, "s"], + [2792, 0, " "], + [2793, 0, "a"], + [2794, 0, "s"], + [2795, 0, "s"], + [2796, 0, "u"], + [2797, 0, "m"], + [2798, 0, "e"], + [2799, 0, "d"], + [2800, 0, " "], + [2801, 0, "t"], + [2802, 0, "o"], + [2803, 0, " "], + [2804, 0, "b"], + [2805, 0, "e"], + [2806, 0, " "], + [2807, 0, "a"], + [2808, 0, " "], + [2809, 0, "l"], + [2810, 0, "i"], + [2811, 0, "n"], + [2812, 0, "e"], + [2813, 0, "a"], + [2814, 0, "r"], + [2815, 0, ","], + [2816, 0, " "], + [2817, 0, "p"], + [2818, 0, "o"], + [2819, 0, "s"], + [2820, 0, "s"], + [2821, 0, "i"], + [2822, 0, "b"], + [2823, 0, "l"], + [2824, 0, "y"], + [2825, 0, " "], + [2826, 0, "i"], + [2827, 0, "n"], + [2828, 0, "f"], + [2829, 0, "i"], + [2830, 0, "n"], + [2831, 0, "i"], + [2832, 0, "t"], + [2833, 0, "e"], + [2834, 0, ","], + [2835, 0, " "], + [2836, 0, "s"], + [2837, 0, "e"], + [2838, 0, "q"], + [2839, 0, "u"], + [2840, 0, "e"], + [2841, 0, "n"], + [2842, 0, "c"], + [2843, 0, "e"], + [2844, 0, " "], + [2845, 0, "o"], + [2846, 0, "f"], + [2847, 0, " "], + [2848, 0, "c"], + [2849, 0, "o"], + [2850, 0, "m"], + [2851, 0, "m"], + [2852, 0, "a"], + [2853, 0, "n"], + [2854, 0, "d"], + [2855, 0, "s"], + [2856, 0, "."], + [2857, 0, " "], + [2858, 0, "T"], + [2859, 0, "h"], + [2860, 0, "e"], + [2861, 0, " "], + [2862, 0, "l"], + [2863, 0, "a"], + [2864, 0, "n"], + [2865, 0, "g"], + [2866, 0, "u"], + [2867, 0, "a"], + [2868, 0, "g"], + [2869, 0, "e"], + [2870, 0, " "], + [2871, 0, "o"], + [2872, 0, "f"], + [2873, 0, " "], + [2874, 0, "F"], + [2875, 0, "i"], + [2876, 0, "g"], + [2877, 0, "u"], + [2878, 0, "r"], + [2879, 0, "e"], + [2880, 0, "`"], + [2881, 0, "\\"], + [2882, 0, "r"], + [2883, 0, "e"], + [2883, 1], + [2882, 1], + [2881, 1], + [2880, 1], + [2880, 0, "~"], + [2881, 0, "\\"], + [2882, 0, "r"], + [2883, 0, "e"], + [2884, 0, "f"], + [2885, 0, "{"], + [2886, 0, "f"], + [2887, 0, "i"], + [2888, 0, "g"], + [2889, 0, ":"], + [2890, 0, "l"], + [2891, 0, "o"], + [2892, 0, "c"], + [2893, 0, "a"], + [2894, 0, "l"], + [2895, 0, "-"], + [2896, 0, "s"], + [2897, 0, "y"], + [2898, 0, "n"], + [2899, 0, "t"], + [2900, 0, "a"], + [2901, 0, "x"], + [2902, 0, "}"], + [2903, 0, " "], + [2904, 0, "d"], + [2905, 0, "o"], + [2906, 0, "e"], + [2907, 0, "s"], + [2908, 0, " "], + [2909, 0, "n"], + [2910, 0, "o"], + [2911, 0, "t"], + [2912, 0, " "], + [2913, 0, "p"], + [2914, 0, "r"], + [2915, 0, "o"], + [2916, 0, "v"], + [2917, 0, "i"], + [2918, 0, "d"], + [2919, 0, "e"], + [2920, 0, " "], + [2921, 0, "l"], + [2922, 0, "o"], + [2923, 0, "o"], + [2924, 0, "p"], + [2925, 0, "s"], + [2926, 0, ","], + [2927, 0, " "], + [2928, 0, "c"], + [2929, 0, "o"], + [2930, 0, "n"], + [2931, 0, "d"], + [2932, 0, "i"], + [2933, 0, "t"], + [2933, 1], + [2932, 1], + [2931, 1], + [2930, 1], + [2929, 1], + [2928, 1], + [2927, 1], + [2926, 1], + [2925, 1], + [2924, 1], + [2923, 1], + [2922, 1], + [2921, 1], + [2860, 1], + [2859, 1], + [2858, 1], + [2858, 0, "F"], + [2859, 0, "o"], + [2860, 0, "r"], + [2861, 0, " "], + [2862, 0, "b"], + [2863, 0, "r"], + [2864, 0, "e"], + [2865, 0, "v"], + [2866, 0, "i"], + [2867, 0, "t"], + [2868, 0, "y"], + [2869, 0, ","], + [2870, 0, " "], + [2871, 0, "t"], + [2872, 0, "h"], + [2873, 0, "e"], + [2934, 0, "t"], + [2935, 0, "h"], + [2936, 0, "e"], + [2937, 0, " "], + [2938, 0, "u"], + [2939, 0, "s"], + [2940, 0, "u"], + [2941, 0, "a"], + [2942, 0, "l"], + [2943, 0, " "], + [2944, 0, "c"], + [2945, 0, "o"], + [2946, 0, "n"], + [2947, 0, "s"], + [2948, 0, "t"], + [2948, 1], + [2947, 1], + [2946, 1], + [2946, 0, "n"], + [2947, 0, "t"], + [2948, 0, "r"], + [2949, 0, "o"], + [2950, 0, "l"], + [2951, 0, " "], + [2952, 0, "s"], + [2953, 0, "t"], + [2954, 0, "r"], + [2955, 0, "u"], + [2956, 0, "c"], + [2957, 0, "t"], + [2958, 0, "u"], + [2959, 0, "r"], + [2960, 0, "e"], + [2961, 0, "s"], + [2962, 0, " "], + [2963, 0, "s"], + [2964, 0, "u"], + [2965, 0, "c"], + [2966, 0, "h"], + [2967, 0, " "], + [2968, 0, "a"], + [2969, 0, "s"], + [2970, 0, " "], + [2971, 0, "c"], + [2972, 0, "o"], + [2973, 0, "n"], + [2974, 0, "d"], + [2975, 0, "i"], + [2976, 0, "t"], + [2977, 0, "i"], + [2978, 0, "o"], + [2979, 0, "n"], + [2980, 0, "a"], + [2981, 0, "l"], + [2982, 0, "s"], + [2983, 0, ","], + [2984, 0, " "], + [2985, 0, "l"], + [2986, 0, "o"], + [2987, 0, "o"], + [2988, 0, "p"], + [2989, 0, "s"], + [2990, 0, ","], + [2991, 0, " "], + [2992, 0, "f"], + [2993, 0, "u"], + [2994, 0, "n"], + [2995, 0, "c"], + [2996, 0, "t"], + [2997, 0, "i"], + [2998, 0, "o"], + [2999, 0, "n"], + [2991, 0, " "], + [2992, 0, "o"], + [2993, 0, "r"], + [3003, 0, "s"], + [3004, 0, ","], + [3005, 0, " "], + [3006, 0, "b"], + [3007, 0, "u"], + [3008, 0, "t"], + [3009, 0, " "], + [3010, 0, "s"], + [3011, 0, "u"], + [3012, 0, "c"], + [3013, 0, "h"], + [3014, 0, " "], + [3015, 0, "f"], + [3016, 0, "a"], + [3017, 0, "c"], + [3018, 0, "i"], + [3019, 0, "l"], + [3020, 0, "i"], + [3021, 0, "t"], + [3022, 0, "i"], + [3023, 0, "e"], + [3024, 0, "s"], + [3025, 0, " "], + [3026, 0, "c"], + [3027, 0, "a"], + [3028, 0, "n"], + [3029, 0, " "], + [3030, 0, "e"], + [3031, 0, "a"], + [3032, 0, "s"], + [3033, 0, "i"], + [3034, 0, "l"], + [3035, 0, "y"], + [3036, 0, " "], + [3037, 0, "b"], + [3038, 0, "e"], + [3039, 0, " "], + [3040, 0, "p"], + [3041, 0, "r"], + [3042, 0, "o"], + [3043, 0, "v"], + [3044, 0, "i"], + [3045, 0, "d"], + [3045, 1], + [3044, 1], + [3043, 1], + [3042, 1], + [3041, 1], + [3040, 1], + [3040, 0, "i"], + [3041, 0, "m"], + [3042, 0, "p"], + [3043, 0, "l"], + [3044, 0, "e"], + [3045, 0, "m"], + [3046, 0, "e"], + [3047, 0, "n"], + [3048, 0, "t"], + [3049, 0, "e"], + [3050, 0, "d"], + [3051, 0, " "], + [3052, 0, "b"], + [3053, 0, "y"], + [3054, 0, " "], + [3055, 0, "e"], + [3056, 0, "m"], + [3057, 0, "b"], + [3058, 0, "e"], + [3059, 0, "d"], + [3060, 0, "d"], + [3061, 0, "i"], + [3062, 0, "n"], + [3063, 0, "g"], + [3064, 0, " "], + [3065, 0, "t"], + [3066, 0, "h"], + [3067, 0, "i"], + [3068, 0, "s"], + [3069, 0, " "], + [3070, 0, "c"], + [3071, 0, "o"], + [3072, 0, "m"], + [3073, 0, "m"], + [3074, 0, "a"], + [3075, 0, "n"], + [3076, 0, "d"], + [3077, 0, " "], + [3078, 0, "l"], + [3079, 0, "a"], + [3080, 0, "n"], + [3081, 0, "g"], + [3082, 0, "u"], + [3083, 0, "a"], + [3084, 0, "g"], + [3085, 0, "e"], + [3086, 0, " "], + [3087, 0, "i"], + [3088, 0, "n"], + [3089, 0, " "], + [3090, 0, "a"], + [3091, 0, " "], + [3092, 0, "g"], + [3093, 0, "e"], + [3094, 0, "n"], + [3095, 0, "e"], + [3096, 0, "r"], + [3097, 0, "a"], + [3098, 0, "l"], + [3099, 0, "-"], + [3100, 0, "p"], + [3101, 0, "u"], + [3102, 0, "r"], + [3103, 0, "p"], + [3104, 0, "o"], + [3105, 0, "s"], + [3106, 0, "e"], + [3107, 0, " "], + [3108, 0, "p"], + [3109, 0, "r"], + [3110, 0, "o"], + [3111, 0, "g"], + [3112, 0, "r"], + [3113, 0, "a"], + [3114, 0, "m"], + [3115, 0, "m"], + [3116, 0, "i"], + [3117, 0, "n"], + [3118, 0, "g"], + [3119, 0, " "], + [3120, 0, "l"], + [3121, 0, "a"], + [3122, 0, "n"], + [3123, 0, "g"], + [3124, 0, "u"], + [3125, 0, "a"], + [3126, 0, "g"], + [3127, 0, "e"], + [3128, 0, "."], + [3129, 0, "\n"], + [3130, 0, "\n"], + [3131, 0, "T"], + [3132, 0, "h"], + [3133, 0, "e"], + [3134, 0, " "], + [3135, 0, "c"], + [3136, 0, "o"], + [3137, 0, "m"], + [3138, 0, "m"], + [3139, 0, "a"], + [3140, 0, "n"], + [3141, 0, "d"], + [3142, 0, " "], + [3143, 0, "l"], + [3144, 0, "a"], + [3145, 0, "n"], + [3146, 0, "g"], + [3147, 0, "u"], + [3148, 0, "a"], + [3149, 0, "g"], + [3150, 0, "e"], + [3151, 0, " "], + [3152, 0, "h"], + [3153, 0, "a"], + [3154, 0, "s"], + [3155, 0, " "], + [3156, 0, "t"], + [3157, 0, "w"], + [3158, 0, "o"], + [3159, 0, " "], + [3160, 0, "m"], + [3161, 0, "a"], + [3162, 0, "i"], + [3163, 0, "n"], + [3164, 0, "s"], + [3165, 0, " "], + [3166, 0, "k"], + [3166, 1], + [3165, 1], + [3164, 1], + [3163, 1], + [3163, 0, " "], + [3163, 1], + [3163, 0, "n"], + [3164, 0, " "], + [3165, 0, "k"], + [3166, 0, "i"], + [3167, 0, "n"], + [3168, 0, "d"], + [3169, 0, "s"], + [3170, 0, " "], + [3171, 0, "o"], + [3172, 0, "f"], + [3173, 0, " "], + [3174, 0, "c"], + [3175, 0, "o"], + [3176, 0, "n"], + [3177, 0, "s"], + [3178, 0, "t"], + [3179, 0, "r"], + [3180, 0, "u"], + [3181, 0, "c"], + [3182, 0, "t"], + [3183, 0, ":"], + [3184, 0, " "], + [3185, 0, "a"], + [3186, 0, "n"], + [3187, 0, " "], + [3188, 0, "e"], + [3189, 0, "x"], + [3190, 0, "p"], + [3191, 0, "r"], + [3192, 0, "e"], + [3193, 0, "s"], + [3194, 0, "s"], + [3195, 0, "i"], + [3196, 0, "o"], + [3197, 0, "n"], + [3198, 0, " "], + [3199, 0, "E"], + [3200, 0, "X"], + [3201, 0, "P"], + [3202, 0, "R"], + [3203, 0, ","], + [3204, 0, " "], + [3205, 0, "w"], + [3206, 0, "h"], + [3207, 0, "i"], + [3208, 0, "c"], + [3209, 0, "h"], + [3210, 0, " "], + [3211, 0, "q"], + [3212, 0, "u"], + [3213, 0, "e"], + [3214, 0, "r"], + [3215, 0, "i"], + [3216, 0, "e"], + [3217, 0, "s"], + [3218, 0, " "], + [3219, 0, "t"], + [3220, 0, "h"], + [3221, 0, "e"], + [3222, 0, " "], + [3223, 0, "s"], + [3224, 0, "t"], + [3225, 0, "a"], + [3226, 0, "t"], + [3227, 0, "e"], + [3228, 0, " "], + [3229, 0, "o"], + [3230, 0, "f"], + [3231, 0, " "], + [3232, 0, "a"], + [3233, 0, " "], + [3234, 0, "d"], + [3235, 0, "o"], + [3236, 0, "c"], + [3237, 0, "u"], + [3238, 0, "m"], + [3239, 0, "e"], + [3240, 0, "n"], + [3241, 0, "t"], + [3242, 0, " "], + [3243, 0, "a"], + [3244, 0, "n"], + [3245, 0, "d"], + [3246, 0, " "], + [3247, 0, "i"], + [3248, 0, "d"], + [3249, 0, "e"], + [3250, 0, "n"], + [3251, 0, "t"], + [3252, 0, "i"], + [3253, 0, "f"], + [3254, 0, "i"], + [3255, 0, "e"], + [3256, 0, "s"], + [3257, 0, " "], + [3258, 0, "a"], + [3259, 0, " "], + [3260, 0, "p"], + [3261, 0, "o"], + [3262, 0, "s"], + [3263, 0, "i"], + [3264, 0, "t"], + [3265, 0, "i"], + [3266, 0, "o"], + [3267, 0, "n"], + [3268, 0, " "], + [3269, 0, "w"], + [3270, 0, "i"], + [3271, 0, "t"], + [3272, 0, "h"], + [3273, 0, "i"], + [3274, 0, "n"], + [3275, 0, " "], + [3276, 0, "a"], + [3277, 0, " "], + [3278, 0, "d"], + [3279, 0, "o"], + [3280, 0, "c"], + [3281, 0, "u"], + [3282, 0, "m"], + [3283, 0, "e"], + [3284, 0, "n"], + [3285, 0, "t"], + [3286, 0, ","], + [3287, 0, " "], + [3288, 0, "a"], + [3289, 0, "n"], + [3290, 0, "d"], + [3291, 0, " "], + [3292, 0, "a"], + [3293, 0, " "], + [3294, 0, "c"], + [3295, 0, "o"], + [3296, 0, "m"], + [3297, 0, "m"], + [3187, 1], + [3186, 1], + [3185, 1], + [3184, 1], + [3184, 0, " "], + [3195, 0, "s"], + [3215, 1], + [3214, 1], + [3213, 1], + [3213, 0, "y"], + [3252, 1], + [3251, 1], + [3250, 1], + [3249, 1], + [3249, 0, "f"], + [3250, 0, "y"], + [3183, 1], + [3182, 1], + [3181, 1], + [3180, 1], + [3179, 1], + [3178, 1], + [3177, 1], + [3176, 1], + [3175, 1], + [3174, 1], + [3173, 1], + [3172, 1], + [3171, 1], + [3170, 1], + [3169, 1], + [3168, 1], + [3167, 1], + [3166, 1], + [3165, 1], + [3164, 1], + [3163, 1], + [3162, 1], + [3161, 1], + [3160, 1], + [3159, 1], + [3158, 1], + [3157, 1], + [3156, 1], + [3155, 1], + [3154, 1], + [3153, 1], + [3152, 1], + [3151, 1], + [3150, 1], + [3149, 1], + [3148, 1], + [3147, 1], + [3146, 1], + [3145, 1], + [3144, 1], + [3143, 1], + [3142, 1], + [3141, 1], + [3140, 1], + [3139, 1], + [3138, 1], + [3137, 1], + [3136, 1], + [3135, 1], + [3134, 1], + [3145, 1], + [3145, 0, " "], + [3146, 0, "c"], + [3147, 0, "o"], + [3148, 0, "n"], + [3149, 0, "s"], + [3150, 0, "t"], + [3151, 0, "r"], + [3152, 0, "u"], + [3153, 0, "c"], + [3154, 0, "t"], + [3166, 1], + [3165, 1], + [3164, 1], + [3163, 1], + [3162, 1], + [3161, 1], + [3160, 1], + [3160, 0, " "], + [3161, 0, "i"], + [3162, 0, "s"], + [3163, 0, " "], + [3164, 0, "u"], + [3165, 0, "s"], + [3166, 0, "e"], + [3167, 0, "d"], + [3168, 0, " "], + [3169, 0, "t"], + [3170, 0, "o"], + [3201, 0, "."], + [3202, 0, " "], + [3203, 0, "A"], + [3204, 0, "n"], + [3205, 0, " "], + [3206, 0, "e"], + [3207, 0, "x"], + [3208, 0, "p"], + [3209, 0, "r"], + [3210, 0, "e"], + [3211, 0, "s"], + [3212, 0, "s"], + [3213, 0, "i"], + [3214, 0, "o"], + [3215, 0, "n"], + [3216, 0, " "], + [3217, 0, "s"], + [3218, 0, "t"], + [3219, 0, "a"], + [3220, 0, "r"], + [3221, 0, "t"], + [3222, 0, "s"], + [3223, 0, " "], + [3224, 0, "w"], + [3225, 0, "i"], + [3226, 0, "t"], + [3227, 0, "h"], + [3228, 0, " "], + [3229, 0, "e"], + [3230, 0, "i"], + [3231, 0, "t"], + [3232, 0, "h"], + [3233, 0, "e"], + [3234, 0, "r"], + [3235, 0, " "], + [3236, 0, "t"], + [3237, 0, "h"], + [3238, 0, "e"], + [3239, 0, " "], + [3240, 0, "s"], + [3241, 0, "p"], + [3242, 0, "e"], + [3243, 0, "c"], + [3244, 0, "i"], + [3245, 0, "a"], + [3246, 0, "l"], + [3247, 0, " "], + [3248, 0, "t"], + [3249, 0, "o"], + [3250, 0, "k"], + [3251, 0, "e"], + [3252, 0, "n"], + [3253, 0, " "], + [3254, 0, "\\"], + [3255, 0, "t"], + [3256, 0, "e"], + [3257, 0, "x"], + [3258, 0, "t"], + [3259, 0, "s"], + [3260, 0, "f"], + [3261, 0, "{"], + [3262, 0, "d"], + [3263, 0, "o"], + [3264, 0, "c"], + [3265, 0, "}"], + [3266, 0, ","], + [3267, 0, " "], + [3268, 0, "i"], + [3269, 0, "d"], + [3270, 0, "e"], + [3271, 0, "n"], + [3272, 0, "t"], + [3273, 0, "i"], + [3274, 0, "f"], + [3275, 0, "y"], + [3276, 0, "i"], + [3277, 0, "n"], + [3278, 0, "g"], + [3279, 0, " "], + [3280, 0, "t"], + [3281, 0, "h"], + [3282, 0, "e"], + [3283, 0, " "], + [3284, 0, "r"], + [3285, 0, "o"], + [3286, 0, "o"], + [3287, 0, "t"], + [3288, 0, " "], + [3289, 0, "o"], + [3290, 0, "f"], + [3291, 0, " "], + [3292, 0, "t"], + [3293, 0, "h"], + [3294, 0, "e"], + [3295, 0, " "], + [3296, 0, "J"], + [3297, 0, "S"], + [3298, 0, "O"], + [3299, 0, "N"], + [3300, 0, " "], + [3301, 0, "d"], + [3302, 0, "o"], + [3303, 0, "c"], + [3304, 0, "u"], + [3305, 0, "m"], + [3306, 0, "e"], + [3307, 0, "n"], + [3308, 0, "t"], + [3309, 0, " "], + [3310, 0, "t"], + [3311, 0, "r"], + [3312, 0, "e"], + [3313, 0, "e"], + [3314, 0, ","], + [3315, 0, " "], + [3316, 0, "o"], + [3317, 0, "r"], + [3318, 0, " "], + [3319, 0, "a"], + [3320, 0, " "], + [3321, 0, "v"], + [3322, 0, "a"], + [3323, 0, "r"], + [3324, 0, "i"], + [3325, 0, "a"], + [3326, 0, "b"], + [3327, 0, "l"], + [3328, 0, "e"], + [3329, 0, " "], + [3330, 0, "$"], + [3331, 0, "x"], + [3332, 0, "$"], + [3333, 0, " "], + [3334, 0, "t"], + [3335, 0, "h"], + [3336, 0, "a"], + [3337, 0, "t"], + [3338, 0, " "], + [3339, 0, "w"], + [3340, 0, "a"], + [3341, 0, "s"], + [3342, 0, " "], + [3343, 0, "p"], + [3344, 0, "r"], + [3345, 0, "e"], + [3346, 0, "v"], + [3347, 0, "i"], + [3348, 0, "o"], + [3349, 0, "u"], + [3350, 0, "s"], + [3351, 0, "l"], + [3352, 0, "y"], + [3353, 0, " "], + [3354, 0, "d"], + [3355, 0, "e"], + [3356, 0, "f"], + [3357, 0, "i"], + [3358, 0, "n"], + [3359, 0, "e"], + [3360, 0, "d"], + [3361, 0, " "], + [3362, 0, "i"], + [3363, 0, "n"], + [3364, 0, " "], + [3365, 0, "a"], + [3366, 0, " "], + [3367, 0, "]"], + [3367, 1], + [3367, 0, "\\"], + [3368, 0, "t"], + [3369, 0, "e"], + [3370, 0, "x"], + [3371, 0, "t"], + [3372, 0, "s"], + [3373, 0, "f"], + [3374, 0, "{"], + [3375, 0, "l"], + [3376, 0, "e"], + [3377, 0, "t"], + [3378, 0, "}"], + [3379, 0, " "], + [3380, 0, "e"], + [3381, 0, "x"], + [3382, 0, "p"], + [3383, 0, "r"], + [3384, 0, "e"], + [3385, 0, "s"], + [3385, 1], + [3384, 1], + [3383, 1], + [3382, 1], + [3381, 1], + [3380, 1], + [3380, 0, "c"], + [3381, 0, "o"], + [3382, 0, "m"], + [3383, 0, "m"], + [3384, 0, "a"], + [3385, 0, "n"], + [3386, 0, "d"], + [3387, 0, "."], + [3388, 0, " "], + [3389, 0, "T"], + [3390, 0, "h"], + [3391, 0, "e"], + [3392, 0, " "], + [3393, 0, "e"], + [3394, 0, "x"], + [3395, 0, "p"], + [3396, 0, "r"], + [3397, 0, "e"], + [3398, 0, "s"], + [3399, 0, "s"], + [3400, 0, "i"], + [3401, 0, "o"], + [3402, 0, "n"], + [3403, 0, " "], + [3404, 0, "t"], + [3405, 0, "h"], + [3406, 0, "e"], + [3407, 0, "n"], + [3408, 0, " "], + [3409, 0, "c"], + [3410, 0, "o"], + [3411, 0, "n"], + [3412, 0, "t"], + [3413, 0, "i"], + [3414, 0, "n"], + [3415, 0, "u"], + [3416, 0, "e"], + [3417, 0, "s"], + [3418, 0, " "], + [3419, 0, "w"], + [3420, 0, "i"], + [3421, 0, "t"], + [3422, 0, "h"], + [3423, 0, " "], + [3424, 0, "a"], + [3425, 0, " "], + [3426, 0, "s"], + [3427, 0, "e"], + [3428, 0, "q"], + [3429, 0, "u"], + [3430, 0, "e"], + [3431, 0, "n"], + [3432, 0, "c"], + [3433, 0, "e"], + [3434, 0, " "], + [3435, 0, "o"], + [3436, 0, "f"], + [3437, 0, " "], + [3438, 0, "f"], + [3439, 0, "u"], + [3440, 0, "n"], + [3441, 0, "c"], + [3442, 0, "t"], + [3443, 0, "i"], + [3444, 0, "o"], + [3445, 0, "n"], + [3446, 0, " "], + [3446, 1], + [3445, 1], + [3444, 1], + [3443, 1], + [3442, 1], + [3441, 1], + [3440, 1], + [3439, 1], + [3438, 1], + [3438, 0, "m"], + [3439, 0, "e"], + [3440, 0, "t"], + [3441, 0, "h"], + [3442, 0, "o"], + [3443, 0, "d"], + [3444, 0, " "], + [3445, 0, "c"], + [3446, 0, "a"], + [3447, 0, "l"], + [3448, 0, "l"], + [3449, 0, "s"], + [3450, 0, ":"], + [3451, 0, " "], + [3452, 0, "$"], + [3453, 0, "\\"], + [3454, 0, "m"], + [3455, 0, "a"], + [3456, 0, "t"], + [3457, 0, "h"], + [3458, 0, "s"], + [3459, 0, "f"], + [3460, 0, "{"], + [3461, 0, "g"], + [3462, 0, "e"], + [3463, 0, "t"], + [3464, 0, "}"], + [3465, 0, "("], + [3466, 0, "\\"], + [3467, 0, "m"], + [3468, 0, "a"], + [3469, 0, "t"], + [3470, 0, "h"], + [3471, 0, "i"], + [3472, 0, "t"], + [3473, 0, "{"], + [3474, 0, "k"], + [3475, 0, "e"], + [3476, 0, "y"], + [3477, 0, "}"], + [3478, 0, "_"], + [3478, 1], + [3478, 0, ")"], + [3479, 0, "$"], + [3480, 0, " "], + [3481, 0, "s"], + [3482, 0, "e"], + [3483, 0, "l"], + [3484, 0, "e"], + [3485, 0, "c"], + [3486, 0, "t"], + [3487, 0, "s"], + [3488, 0, " "], + [3489, 0, "a"], + [3490, 0, " "], + [3491, 0, "k"], + [3492, 0, "e"], + [3493, 0, "y"], + [3494, 0, " "], + [3495, 0, "w"], + [3496, 0, "i"], + [3497, 0, "t"], + [3498, 0, "h"], + [3499, 0, "i"], + [3500, 0, "n"], + [3501, 0, " "], + [3502, 0, "a"], + [3503, 0, " "], + [3504, 0, "m"], + [3505, 0, "a"], + [3506, 0, "p"], + [3507, 0, " "], + [3508, 0, "("], + [3509, 0, "a"], + [3510, 0, " "], + [3511, 0, "J"], + [3512, 0, "S"], + [3513, 0, "O"], + [3514, 0, "N"], + [3515, 0, " "], + [3516, 0, "o"], + [3517, 0, "b"], + [3518, 0, "j"], + [3519, 0, "e"], + [3520, 0, "c"], + [3521, 0, "t"], + [3522, 0, ")"], + [3523, 0, ","], + [3524, 0, " "], + [3525, 0, "$"], + [3525, 1], + [3525, 0, "\\"], + [3526, 0, "t"], + [3527, 0, "e"], + [3528, 0, "x"], + [3529, 0, "t"], + [3530, 0, "s"], + [3531, 0, "f"], + [3532, 0, "{"], + [3533, 0, "n"], + [3534, 0, "e"], + [3535, 0, "x"], + [3536, 0, "t"], + [3537, 0, "}"], + [3538, 0, " "], + [3539, 0, "m"], + [3540, 0, "o"], + [3541, 0, "v"], + [3542, 0, "e"], + [3543, 0, "s"], + [3544, 0, " "], + [3545, 0, "t"], + [3546, 0, "o"], + [3547, 0, " "], + [3548, 0, "t"], + [3549, 0, "h"], + [3550, 0, "e"], + [3551, 0, " "], + [3552, 0, "n"], + [3553, 0, "e"], + [3554, 0, "x"], + [3555, 0, "t"], + [3556, 0, " "], + [3557, 0, "e"], + [3558, 0, "l"], + [3559, 0, "e"], + [3560, 0, "m"], + [3561, 0, "e"], + [3562, 0, "n"], + [3563, 0, "t"], + [3564, 0, " "], + [3565, 0, "o"], + [3566, 0, "f"], + [3567, 0, " "], + [3568, 0, "a"], + [3569, 0, "n"], + [3570, 0, " "], + [3571, 0, "o"], + [3572, 0, "r"], + [3573, 0, "d"], + [3574, 0, "e"], + [3575, 0, "r"], + [3576, 0, "e"], + [3577, 0, "d"], + [3578, 0, " "], + [3579, 0, "l"], + [3580, 0, "i"], + [3581, 0, "s"], + [3582, 0, "t"], + [3583, 0, ","], + [3584, 0, " "], + [3585, 0, "a"], + [3586, 0, "n"], + [3587, 0, "d"], + [3588, 0, " "], + [3589, 0, "\\"], + [3590, 0, "t"], + [3591, 0, "e"], + [3592, 0, "x"], + [3593, 0, "t"], + [3594, 0, "s"], + [3595, 0, "f"], + [3596, 0, "{"], + [3597, 0, "v"], + [3598, 0, "a"], + [3599, 0, "l"], + [3600, 0, "u"], + [3601, 0, "e"], + [3602, 0, "s"], + [3603, 0, "}"], + [3604, 0, " "], + [3619, 1], + [3618, 1], + [3617, 1], + [3616, 1], + [3615, 1], + [3614, 1], + [3613, 1], + [3612, 1], + [3611, 1], + [3610, 1], + [3609, 1], + [3608, 1], + [3607, 1], + [3606, 1], + [3605, 1], + [3605, 0, "r"], + [3606, 0, "e"], + [3607, 0, "t"], + [3608, 0, "u"], + [3609, 0, "r"], + [3610, 0, "n"], + [3611, 0, "s"], + [3612, 0, " "], + [3613, 0, "t"], + [3614, 0, "h"], + [3615, 0, "e"], + [3616, 0, " "], + [3617, 0, "v"], + [3618, 0, "a"], + [3619, 0, "l"], + [3620, 0, "u"], + [3621, 0, "e"], + [3622, 0, " "], + [3623, 0, "a"], + [3624, 0, "t"], + [3625, 0, " "], + [3626, 0, "t"], + [3627, 0, "h"], + [3628, 0, "e"], + [3629, 0, " "], + [3630, 0, "c"], + [3631, 0, "u"], + [3632, 0, "r"], + [3633, 0, "r"], + [3634, 0, "e"], + [3635, 0, "n"], + [3636, 0, "t"], + [3654, 1], + [3654, 0, "t"], + [3655, 0, "h"], + [3656, 0, "e"], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3673, 1], + [3672, 1], + [3671, 1], + [3670, 1], + [3669, 1], + [3668, 1], + [3667, 1], + [3666, 1], + [3666, 0, "."], + [3131, 0, " "], + [3131, 0, "W"], + [3132, 0, "e"], + [3133, 0, " "], + [3134, 0, "f"], + [3135, 0, "i"], + [3136, 0, "r"], + [3137, 0, "s"], + [3138, 0, "t"], + [3139, 0, " "], + [3140, 0, "e"], + [3141, 0, "x"], + [3142, 0, "p"], + [3143, 0, "l"], + [3144, 0, "a"], + [3145, 0, "i"], + [3146, 0, "n"], + [3147, 0, " "], + [3148, 0, "t"], + [3149, 0, "h"], + [3150, 0, "e"], + [3151, 0, " "], + [3152, 0, "l"], + [3153, 0, "a"], + [3154, 0, "n"], + [3155, 0, "g"], + [3156, 0, "u"], + [3157, 0, "a"], + [3158, 0, "g"], + [3159, 0, "e"], + [3160, 0, " "], + [3161, 0, "i"], + [3162, 0, "n"], + [3163, 0, "f"], + [3164, 0, "o"], + [3165, 0, "r"], + [3166, 0, "m"], + [3167, 0, "a"], + [3168, 0, "l"], + [3169, 0, "l"], + [3170, 0, "y"], + [3171, 0, ","], + [3172, 0, " "], + [3173, 0, "b"], + [3174, 0, "e"], + [3175, 0, "f"], + [3176, 0, "o"], + [3177, 0, "r"], + [3178, 0, "e"], + [3179, 0, " "], + [3180, 0, "g"], + [3181, 0, "i"], + [3182, 0, "v"], + [3183, 0, "i"], + [3184, 0, "n"], + [3185, 0, "g"], + [3186, 0, " "], + [3187, 0, "i"], + [3188, 0, "t"], + [3189, 0, "s"], + [3190, 0, " "], + [3191, 0, "f"], + [3192, 0, "o"], + [3193, 0, "r"], + [3194, 0, "m"], + [3195, 0, "a"], + [3196, 0, "l"], + [3197, 0, " "], + [3198, 0, "s"], + [3199, 0, "e"], + [3200, 0, "m"], + [3201, 0, "a"], + [3202, 0, "n"], + [3203, 0, "t"], + [3204, 0, "i"], + [3205, 0, "c"], + [3206, 0, "s"], + [3207, 0, "."], + [3745, 0, "\n"], + [3746, 0, "\n"], + [2669, 0, "\n"], + [2670, 0, "\n"], + [2671, 0, "\\"], + [2672, 0, "b"], + [2673, 0, "e"], + [2674, 0, "g"], + [2675, 0, "i"], + [2676, 0, "n"], + [2677, 0, "{"], + [2678, 0, "f"], + [2679, 0, "i"], + [2680, 0, "g"], + [2681, 0, "u"], + [2682, 0, "r"], + [2683, 0, "e"], + [2684, 0, "}"], + [2685, 0, "\n"], + [2686, 0, "\\"], + [2687, 0, "c"], + [2688, 0, "e"], + [2689, 0, "n"], + [2690, 0, "t"], + [2691, 0, "e"], + [2692, 0, "r"], + [2693, 0, "i"], + [2694, 0, "n"], + [2695, 0, "g"], + [2696, 0, "\n"], + [2697, 0, "\\"], + [2698, 0, "c"], + [2699, 0, "a"], + [2700, 0, "p"], + [2701, 0, "t"], + [2702, 0, "i"], + [2703, 0, "o"], + [2704, 0, "n"], + [2705, 0, "{"], + [1756, 0, "\n"], + [1757, 0, "\\"], + [1758, 0, "c"], + [1759, 0, "e"], + [1760, 0, "n"], + [1761, 0, "t"], + [1762, 0, "e"], + [1763, 0, "r"], + [1764, 0, "i"], + [1765, 0, "n"], + [1766, 0, "g"], + [2717, 0, "E"], + [2718, 0, "x"], + [2719, 0, "a"], + [2720, 0, "m"], + [2721, 0, "p"], + [2722, 0, "l"], + [2723, 0, "e"], + [2724, 0, " "], + [2725, 0, "o"], + [2726, 0, "f"], + [2727, 0, " "], + [2728, 0, "p"], + [2729, 0, "r"], + [2730, 0, "o"], + [2731, 0, "g"], + [2732, 0, "r"], + [2733, 0, "a"], + [2734, 0, "m"], + [2735, 0, "m"], + [2736, 0, "a"], + [2737, 0, "t"], + [2738, 0, "i"], + [2739, 0, "c"], + [2740, 0, "a"], + [2741, 0, "l"], + [2742, 0, "l"], + [2743, 0, "y"], + [2744, 0, " "], + [2745, 0, "c"], + [2746, 0, "o"], + [2747, 0, "n"], + [2748, 0, "s"], + [2749, 0, "t"], + [2750, 0, "r"], + [2751, 0, "u"], + [2752, 0, "c"], + [2753, 0, "t"], + [2754, 0, "i"], + [2755, 0, "n"], + [2756, 0, "g"], + [2757, 0, " "], + [2758, 0, "a"], + [2759, 0, " "], + [2760, 0, "J"], + [2761, 0, "S"], + [2762, 0, "O"], + [2763, 0, "N"], + [2764, 0, " "], + [2765, 0, "d"], + [2766, 0, "o"], + [2767, 0, "c"], + [2768, 0, "u"], + [2769, 0, "m"], + [2770, 0, "e"], + [2771, 0, "n"], + [2772, 0, "t"], + [2773, 0, "}"], + [2774, 0, "\\"], + [2775, 0, "l"], + [2776, 0, "a"], + [2777, 0, "b"], + [2778, 0, "e"], + [2779, 0, "l"], + [2780, 0, "{"], + [2781, 0, "f"], + [2782, 0, "i"], + [2783, 0, "g"], + [2784, 0, ":"], + [2785, 0, "m"], + [2786, 0, "a"], + [2787, 0, "k"], + [2788, 0, "e"], + [2789, 0, "-"], + [2790, 0, "d"], + [2791, 0, "o"], + [2792, 0, "c"], + [2793, 0, "}"], + [2794, 0, "\n"], + [2795, 0, "\\"], + [2796, 0, "e"], + [2797, 0, "n"], + [2798, 0, "d"], + [2799, 0, "{"], + [2800, 0, "f"], + [2801, 0, "i"], + [2802, 0, "g"], + [2803, 0, "u"], + [2804, 0, "r"], + [2805, 0, "e"], + [2806, 0, "}"], + [2707, 0, "\n"], + [2708, 0, "\\"], + [2709, 0, "b"], + [2710, 0, "e"], + [2711, 0, "g"], + [2712, 0, "i"], + [2713, 0, "n"], + [2714, 0, "{"], + [2715, 0, "t"], + [2716, 0, "a"], + [2717, 0, "b"], + [2718, 0, "u"], + [2719, 0, "l"], + [2720, 0, "a"], + [2721, 0, "r"], + [2722, 0, "}"], + [2723, 0, "{"], + [2724, 0, "l"], + [2725, 0, "}"], + [2726, 0, "\n"], + [2727, 0, "\\"], + [2728, 0, "e"], + [2729, 0, "n"], + [2730, 0, "d"], + [2731, 0, "{"], + [2732, 0, "t"], + [2733, 0, "a"], + [2734, 0, "b"], + [2735, 0, "u"], + [2736, 0, "l"], + [2737, 0, "a"], + [2738, 0, "r"], + [2739, 0, "}"], + [2726, 0, "\n"], + [2727, 0, "\\"], + [2728, 0, "t"], + [2729, 0, "e"], + [2730, 0, "x"], + [2731, 0, "t"], + [2732, 0, "s"], + [2733, 0, "f"], + [2734, 0, "{"], + [2735, 0, "d"], + [2736, 0, "o"], + [2737, 0, "c"], + [2738, 0, "}"], + [2739, 0, " "], + [2740, 0, "="], + [2741, 0, " "], + [2742, 0, "\\"], + [2743, 0, "v"], + [2744, 0, "e"], + [2745, 0, "r"], + [2746, 0, "b"], + [2747, 0, "|"], + [2748, 0, "{"], + [2749, 0, "}"], + [2750, 0, "|"], + [2751, 0, ";"], + [2752, 0, "\\"], + [2753, 0, "\\"], + [2754, 0, "\n"], + [2755, 0, "\\"], + [2756, 0, "t"], + [2757, 0, "e"], + [2758, 0, "x"], + [2759, 0, "t"], + [2760, 0, "s"], + [2761, 0, "f"], + [2762, 0, "{"], + [2763, 0, "d"], + [2764, 0, "o"], + [2765, 0, "c"], + [2766, 0, "}"], + [2766, 0, "."], + [2767, 0, "g"], + [2768, 0, "e"], + [2769, 0, "t"], + [2771, 0, "("], + [2772, 0, "\\"], + [2773, 0, "m"], + [2774, 0, "a"], + [2775, 0, "t"], + [2776, 0, "h"], + [2776, 1], + [2775, 1], + [2774, 1], + [2773, 1], + [2773, 0, "t"], + [2774, 0, "e"], + [2775, 0, "x"], + [2776, 0, "t"], + [2776, 1], + [2775, 1], + [2774, 1], + [2773, 1], + [2772, 1], + [2772, 0, "\\"], + [2773, 0, "v"], + [2774, 0, "e"], + [2775, 0, "r"], + [2776, 0, "b"], + [2777, 0, "|"], + [2778, 0, "\""], + [2779, 0, "s"], + [2780, 0, "h"], + [2781, 0, "o"], + [2782, 0, "p"], + [2783, 0, "p"], + [2784, 0, "i"], + [2785, 0, "n"], + [2786, 0, "g"], + [2787, 0, "|"], + [2787, 1], + [2787, 0, "\""], + [2788, 0, "|"], + [2789, 0, ")"], + [2790, 0, " "], + [2791, 0, "="], + [2792, 0, " "], + [2793, 0, "\\"], + [2794, 0, "v"], + [2795, 0, "e"], + [2796, 0, "r"], + [2797, 0, "b"], + [2798, 0, "|"], + [2799, 0, "["], + [2800, 0, "]"], + [2801, 0, "|"], + [2802, 0, ";"], + [2803, 0, "\\"], + [2804, 0, "\\"], + [2805, 0, "\n"], + [2806, 0, "\\"], + [2807, 0, "t"], + [2808, 0, "e"], + [2809, 0, "x"], + [2810, 0, "t"], + [2811, 0, "s"], + [2812, 0, "f"], + [2813, 0, "{"], + [2814, 0, "d"], + [2815, 0, "o"], + [2816, 0, "c"], + [2817, 0, "."], + [2818, 0, "g"], + [2819, 0, "e"], + [2820, 0, "t"], + [2821, 0, "}"], + [2822, 0, "("], + [2823, 0, "\\"], + [2824, 0, "v"], + [2825, 0, "e"], + [2826, 0, "r"], + [2827, 0, "b"], + [2828, 0, "\""], + [2828, 1], + [2828, 0, "|"], + [2829, 0, "\""], + [2830, 0, "s"], + [2831, 0, "h"], + [2832, 0, "o"], + [2833, 0, "p"], + [2834, 0, "p"], + [2835, 0, "i"], + [2836, 0, "n"], + [2837, 0, "g"], + [2838, 0, "\""], + [2839, 0, "|"], + [2840, 0, ")"], + [2841, 0, "."], + [2806, 0, "\\"], + [2807, 0, "t"], + [2808, 0, "e"], + [2809, 0, "x"], + [2810, 0, "t"], + [2811, 0, "s"], + [2812, 0, "f"], + [2813, 0, " "], + [2813, 1], + [2813, 0, "{"], + [2814, 0, "l"], + [2815, 0, "e"], + [2816, 0, "t"], + [2817, 0, "}"], + [2818, 0, " "], + [2819, 0, "\\"], + [2820, 0, "t"], + [2821, 0, "e"], + [2822, 0, "x"], + [2823, 0, "t"], + [2824, 0, "i"], + [2825, 0, "t"], + [2826, 0, "{"], + [2827, 0, "s"], + [2828, 0, "h"], + [2829, 0, "o"], + [2830, 0, "p"], + [2831, 0, "p"], + [2831, 1], + [2830, 1], + [2829, 1], + [2828, 1], + [2827, 1], + [2827, 0, "l"], + [2828, 0, "i"], + [2829, 0, "s"], + [2830, 0, "t"], + [2831, 0, "}"], + [2832, 0, " "], + [2833, 0, "="], + [2834, 0, " "], + [2870, 1], + [2870, 0, ";"], + [2871, 0, "\\"], + [2872, 0, "\\"], + [2871, 0, " "], + [2803, 0, " "], + [2752, 0, " "], + [2876, 0, "\n"], + [2877, 0, "\\"], + [2878, 0, "t"], + [2879, 0, "e"], + [2880, 0, "x"], + [2881, 0, "t"], + [2882, 0, "i"], + [2883, 0, "t"], + [2884, 0, "{"], + [2885, 0, "l"], + [2886, 0, "i"], + [2887, 0, "s"], + [2888, 0, "t"], + [2889, 0, "}"], + [2890, 0, "."], + [2891, 0, "\\"], + [2892, 0, "t"], + [2893, 0, "e"], + [2894, 0, "x"], + [2895, 0, "t"], + [2896, 0, "s"], + [2897, 0, "f"], + [2898, 0, "{"], + [2899, 0, "i"], + [2900, 0, "n"], + [2901, 0, "s"], + [2902, 0, "e"], + [2903, 0, "r"], + [2904, 0, "t"], + [2905, 0, "}"], + [2906, 0, "("], + [2907, 0, "\\"], + [2908, 0, "v"], + [2909, 0, "e"], + [2910, 0, "r"], + [2911, 0, "b"], + [2912, 0, "\\"], + [2913, 0, "\""], + [2913, 1], + [2913, 0, "|"], + [2914, 0, "e"], + [2915, 0, "g"], + [2916, 0, "g"], + [2917, 0, "s"], + [2918, 0, "\\"], + [2919, 0, "\""], + [2919, 1], + [2918, 1], + [2914, 0, "\""], + [2919, 0, "\""], + [2920, 0, "|"], + [2912, 1], + [2920, 0, ")"], + [2921, 0, ";"], + [2922, 0, " "], + [2923, 0, "\\"], + [2924, 0, "\\"], + [2925, 0, "\n"], + [2926, 0, "\\"], + [2927, 0, "t"], + [2928, 0, "e"], + [2929, 0, "x"], + [2930, 0, "t"], + [2931, 0, "i"], + [2932, 0, "t"], + [2933, 0, "{"], + [2934, 0, "l"], + [2935, 0, "i"], + [2936, 0, "s"], + [2937, 0, "t"], + [2938, 0, "}"], + [2939, 0, "."], + [2940, 0, "\\"], + [2941, 0, "t"], + [2942, 0, "e"], + [2943, 0, "x"], + [2944, 0, "t"], + [2945, 0, "s"], + [2946, 0, "f"], + [2947, 0, "{"], + [2948, 0, "i"], + [2949, 0, "n"], + [2950, 0, "s"], + [2951, 0, "e"], + [2952, 0, "r"], + [2953, 0, "t"], + [2954, 0, "}"], + [2955, 0, "("], + [2956, 0, "\\"], + [2957, 0, "v"], + [2958, 0, "e"], + [2959, 0, "r"], + [2960, 0, "b"], + [2961, 0, "|"], + [2962, 0, "\""], + [2963, 0, "m"], + [2964, 0, "i"], + [2965, 0, "l"], + [2966, 0, "k"], + [2967, 0, "\""], + [2968, 0, "|"], + [2969, 0, "}"], + [2970, 0, ")"], + [2970, 1], + [2969, 1], + [2969, 0, ")"], + [2970, 0, ";"], + [2985, 0, "\n"], + [2986, 0, "F"], + [2987, 0, "i"], + [2988, 0, "n"], + [2989, 0, "a"], + [2990, 0, "l"], + [2991, 0, " "], + [2992, 0, "s"], + [2993, 0, "t"], + [2994, 0, "a"], + [2995, 0, "t"], + [2996, 0, "e"], + [2997, 0, ":"], + [2998, 0, "\n"], + [2999, 0, "\n"], + [2999, 1], + [2999, 0, "\\"], + [3000, 0, "b"], + [3001, 0, "e"], + [3002, 0, "g"], + [3003, 0, "i"], + [3004, 0, "n"], + [3005, 0, "{"], + [3006, 0, "v"], + [3007, 0, "e"], + [3008, 0, "r"], + [3009, 0, "b"], + [3010, 0, "a"], + [3011, 0, "t"], + [3012, 0, "i"], + [3013, 0, "m"], + [3014, 0, "}"], + [3015, 0, "\n"], + [3016, 0, "\\"], + [3017, 0, "e"], + [3018, 0, "n"], + [3019, 0, "d"], + [3020, 0, "{"], + [3021, 0, "v"], + [3022, 0, "e"], + [3023, 0, "r"], + [3024, 0, "b"], + [3025, 0, "a"], + [3026, 0, "t"], + [3027, 0, "i"], + [3028, 0, "m"], + [3029, 0, "}"], + [3015, 0, "\n"], + [3016, 0, "{"], + [3017, 0, "\""], + [3018, 0, "s"], + [3019, 0, "h"], + [3020, 0, "o"], + [3021, 0, "p"], + [3022, 0, "p"], + [3023, 0, "i"], + [3024, 0, "n"], + [3025, 0, "g"], + [3026, 0, "\""], + [3027, 0, ":"], + [3028, 0, " "], + [3029, 0, "["], + [3030, 0, "\""], + [3031, 0, "e"], + [3032, 0, "g"], + [3033, 0, "g"], + [3034, 0, "s"], + [3035, 0, "\""], + [3036, 0, ","], + [2877, 0, "\\"], + [2878, 0, "t"], + [2879, 0, "e"], + [2880, 0, "x"], + [2881, 0, "t"], + [2882, 0, "s"], + [2883, 0, "f"], + [2884, 0, "{"], + [2885, 0, "l"], + [2886, 0, "e"], + [2887, 0, "t"], + [2888, 0, "}"], + [2889, 0, " "], + [2901, 1], + [2900, 1], + [2899, 1], + [2898, 1], + [2898, 0, "e"], + [2899, 0, "g"], + [2900, 0, "g"], + [2901, 0, "s"], + [2903, 0, " "], + [2904, 0, "="], + [2905, 0, " "], + [2906, 0, "\\"], + [2907, 0, "t"], + [2908, 0, "e"], + [2909, 0, "x"], + [2910, 0, "t"], + [2911, 0, "s"], + [2912, 0, "f"], + [2913, 0, "{"], + [2914, 0, "d"], + [2915, 0, "o"], + [2916, 0, "c"], + [2917, 0, "."], + [2918, 0, "g"], + [2919, 0, "e"], + [2920, 0, "t"], + [2921, 0, ")"], + [2922, 0, "("], + [2922, 1], + [2921, 1], + [2921, 0, "}"], + [2922, 0, "("], + [2923, 0, "\\"], + [2924, 0, "v"], + [2925, 0, "e"], + [2926, 0, "r"], + [2927, 0, "b"], + [2928, 0, "\""], + [2928, 1], + [2928, 0, "|"], + [2929, 0, "\""], + [2930, 0, "s"], + [2931, 0, "h"], + [2932, 0, "o"], + [2933, 0, "p"], + [2934, 0, "p"], + [2935, 0, "i"], + [2936, 0, "n"], + [2937, 0, "g"], + [2938, 0, "\""], + [2939, 0, "|"], + [2940, 0, ")"], + [2875, 1], + [2874, 1], + [2873, 1], + [2872, 1], + [2871, 1], + [2870, 1], + [2869, 1], + [2868, 1], + [2867, 1], + [2866, 1], + [2865, 1], + [2864, 1], + [2863, 1], + [2862, 1], + [2861, 1], + [2860, 1], + [2859, 1], + [2858, 1], + [2857, 1], + [2856, 1], + [2855, 1], + [2854, 1], + [2853, 1], + [2852, 1], + [2851, 1], + [2850, 1], + [2849, 1], + [2848, 1], + [2847, 1], + [2846, 1], + [2845, 1], + [2844, 1], + [2843, 1], + [2842, 1], + [2841, 1], + [2840, 1], + [2839, 1], + [2838, 1], + [2837, 1], + [2836, 1], + [2835, 1], + [2834, 1], + [2833, 1], + [2832, 1], + [2831, 1], + [2830, 1], + [2829, 1], + [2828, 1], + [2827, 1], + [2826, 1], + [2825, 1], + [2824, 1], + [2823, 1], + [2822, 1], + [2821, 1], + [2820, 1], + [2819, 1], + [2818, 1], + [2817, 1], + [2816, 1], + [2815, 1], + [2814, 1], + [2813, 1], + [2812, 1], + [2811, 1], + [2810, 1], + [2809, 1], + [2808, 1], + [2807, 1], + [2919, 1], + [2918, 1], + [2917, 1], + [2916, 1], + [2916, 0, "e"], + [2917, 0, "g"], + [2918, 0, "g"], + [2919, 0, "s"], + [3019, 0, " "], + [3020, 0, "\""], + [3021, 0, "m"], + [3022, 0, "i"], + [3023, 0, "l"], + [3024, 0, "k"], + [3025, 0, "\""], + [3026, 0, "]"], + [3027, 0, "}"], + [2997, 0, "\n"], + [2998, 0, "d"], + [2999, 0, "o"], + [3000, 0, "c"], + [3001, 0, " "], + [3002, 0, "="], + [3003, 0, " "], + [3004, 0, "{"], + [3005, 0, "}"], + [3006, 0, ";"], + [3007, 0, "\n"], + [3008, 0, "d"], + [3009, 0, "o"], + [3010, 0, "c"], + [3011, 0, "."], + [3012, 0, "g"], + [3013, 0, "e"], + [3014, 0, "t"], + [3015, 0, "("], + [3016, 0, "\""], + [3017, 0, "s"], + [3018, 0, "h"], + [3019, 0, "o"], + [3020, 0, "p"], + [3021, 0, "p"], + [3022, 0, "i"], + [3023, 0, "n"], + [3024, 0, "g"], + [3025, 0, "\""], + [3026, 0, "}"], + [3026, 1], + [3026, 0, ")"], + [3027, 0, " "], + [3028, 0, "="], + [3029, 0, " "], + [3030, 0, "["], + [3031, 0, "]"], + [3032, 0, ";"], + [3033, 0, "\n"], + [3034, 0, "l"], + [3035, 0, "e"], + [3036, 0, "t"], + [3037, 0, " "], + [3038, 0, "e"], + [3039, 0, "g"], + [3040, 0, "g"], + [3041, 0, "s"], + [3042, 0, " "], + [3043, 0, "="], + [3044, 0, " "], + [3045, 0, "d"], + [3046, 0, "o"], + [3047, 0, "c"], + [3048, 0, "."], + [3049, 0, "g"], + [3050, 0, "e"], + [3051, 0, "t"], + [3052, 0, "("], + [3053, 0, "\""], + [3054, 0, "s"], + [3055, 0, "h"], + [3056, 0, "o"], + [3057, 0, "p"], + [3058, 0, "p"], + [3059, 0, "i"], + [3060, 0, "n"], + [3061, 0, "g"], + [3062, 0, "\""], + [3063, 0, ")"], + [3064, 0, "."], + [3065, 0, "i"], + [3066, 0, "n"], + [3067, 0, "s"], + [3068, 0, "e"], + [3069, 0, "r"], + [3070, 0, "t"], + [3071, 0, "("], + [3072, 0, "\""], + [3073, 0, "e"], + [3074, 0, "g"], + [3075, 0, "g"], + [3076, 0, "s"], + [3077, 0, "\""], + [3078, 0, ")"], + [3079, 0, ";"], + [3080, 0, "\n"], + [3081, 0, "e"], + [3082, 0, "g"], + [3083, 0, "g"], + [3084, 0, "s"], + [3085, 0, "."], + [3086, 0, "i"], + [3087, 0, "n"], + [3088, 0, "s"], + [3089, 0, "e"], + [3090, 0, "r"], + [3091, 0, "t"], + [3092, 0, "("], + [3093, 0, "\""], + [3094, 0, "m"], + [3095, 0, "i"], + [3096, 0, "l"], + [3097, 0, "k"], + [3098, 0, "\""], + [3099, 0, ")"], + [3100, 0, ";"], + [3101, 0, "\n"], + [3102, 0, "\n"], + [3103, 0, "/"], + [3104, 0, "/"], + [3105, 0, " "], + [3106, 0, "F"], + [3107, 0, "i"], + [3108, 0, "n"], + [3109, 0, "a"], + [3110, 0, "l"], + [3111, 0, " "], + [3112, 0, "s"], + [3113, 0, "t"], + [3114, 0, "a"], + [3115, 0, "t"], + [3116, 0, "e"], + [3117, 0, ":"], + [2979, 1], + [2978, 1], + [2977, 1], + [2976, 1], + [2975, 1], + [2974, 1], + [2973, 1], + [2972, 1], + [2971, 1], + [2970, 1], + [2969, 1], + [2968, 1], + [2967, 1], + [2966, 1], + [2965, 1], + [2964, 1], + [2963, 1], + [2962, 1], + [2961, 1], + [2960, 1], + [2959, 1], + [2958, 1], + [2957, 1], + [2956, 1], + [2955, 1], + [2954, 1], + [2953, 1], + [2952, 1], + [2951, 1], + [2950, 1], + [2949, 1], + [2948, 1], + [2947, 1], + [2946, 1], + [2945, 1], + [2944, 1], + [2943, 1], + [2942, 1], + [2941, 1], + [2940, 1], + [2939, 1], + [2938, 1], + [2937, 1], + [2936, 1], + [2935, 1], + [2934, 1], + [2933, 1], + [2932, 1], + [2931, 1], + [2930, 1], + [2929, 1], + [2928, 1], + [2927, 1], + [2926, 1], + [2925, 1], + [2924, 1], + [2923, 1], + [2922, 1], + [2921, 1], + [2920, 1], + [2919, 1], + [2918, 1], + [2917, 1], + [2916, 1], + [2915, 1], + [2914, 1], + [2913, 1], + [2912, 1], + [2911, 1], + [2910, 1], + [2909, 1], + [2908, 1], + [2907, 1], + [2906, 1], + [2905, 1], + [2904, 1], + [2903, 1], + [2902, 1], + [2901, 1], + [2900, 1], + [2899, 1], + [2898, 1], + [2897, 1], + [2896, 1], + [2895, 1], + [2894, 1], + [2893, 1], + [2892, 1], + [2891, 1], + [2890, 1], + [2889, 1], + [2888, 1], + [2887, 1], + [2886, 1], + [2885, 1], + [2884, 1], + [2883, 1], + [2882, 1], + [2881, 1], + [2880, 1], + [2879, 1], + [2878, 1], + [2877, 1], + [2876, 1], + [2875, 1], + [2874, 1], + [2873, 1], + [2872, 1], + [2871, 1], + [2870, 1], + [2869, 1], + [2868, 1], + [2867, 1], + [2866, 1], + [2865, 1], + [2864, 1], + [2863, 1], + [2862, 1], + [2861, 1], + [2860, 1], + [2859, 1], + [2858, 1], + [2857, 1], + [2856, 1], + [2855, 1], + [2854, 1], + [2853, 1], + [2852, 1], + [2851, 1], + [2850, 1], + [2849, 1], + [2848, 1], + [2847, 1], + [2846, 1], + [2845, 1], + [2844, 1], + [2843, 1], + [2842, 1], + [2841, 1], + [2840, 1], + [2839, 1], + [2838, 1], + [2837, 1], + [2836, 1], + [2835, 1], + [2834, 1], + [2833, 1], + [2832, 1], + [2831, 1], + [2830, 1], + [2829, 1], + [2828, 1], + [2827, 1], + [2826, 1], + [2825, 1], + [2824, 1], + [2823, 1], + [2822, 1], + [2821, 1], + [2820, 1], + [2819, 1], + [2818, 1], + [2817, 1], + [2816, 1], + [2815, 1], + [2814, 1], + [2813, 1], + [2812, 1], + [2811, 1], + [2810, 1], + [2809, 1], + [2808, 1], + [2807, 1], + [2806, 1], + [2805, 1], + [2804, 1], + [2803, 1], + [2802, 1], + [2801, 1], + [2800, 1], + [2799, 1], + [2798, 1], + [2797, 1], + [2796, 1], + [2795, 1], + [2794, 1], + [2793, 1], + [2792, 1], + [2791, 1], + [2790, 1], + [2789, 1], + [2788, 1], + [2787, 1], + [2786, 1], + [2785, 1], + [2784, 1], + [2783, 1], + [2782, 1], + [2781, 1], + [2780, 1], + [2779, 1], + [2778, 1], + [2777, 1], + [2776, 1], + [2775, 1], + [2774, 1], + [2773, 1], + [2772, 1], + [2771, 1], + [2770, 1], + [2769, 1], + [2768, 1], + [2767, 1], + [2766, 1], + [2765, 1], + [2764, 1], + [2763, 1], + [2762, 1], + [2761, 1], + [2760, 1], + [2759, 1], + [2758, 1], + [2757, 1], + [2756, 1], + [2755, 1], + [2754, 1], + [2753, 1], + [2752, 1], + [2751, 1], + [2750, 1], + [2749, 1], + [2748, 1], + [2747, 1], + [2746, 1], + [2745, 1], + [2744, 1], + [2743, 1], + [2742, 1], + [2741, 1], + [2740, 1], + [2739, 1], + [2738, 1], + [2737, 1], + [2736, 1], + [2735, 1], + [2734, 1], + [2733, 1], + [2732, 1], + [2731, 1], + [2730, 1], + [2729, 1], + [2728, 1], + [2727, 1], + [2726, 1], + [2725, 1], + [2724, 1], + [2723, 1], + [2722, 1], + [2721, 1], + [2720, 1], + [2719, 1], + [2718, 1], + [2717, 1], + [2716, 1], + [2715, 1], + [2714, 1], + [2713, 1], + [2712, 1], + [2711, 1], + [2710, 1], + [2709, 1], + [2708, 1], + [2707, 1], + [2735, 0, "l"], + [2736, 0, "e"], + [2737, 0, "t"], + [2738, 0, " "], + [2739, 0, "l"], + [2740, 0, "i"], + [2741, 0, "s"], + [2742, 0, "t"], + [2743, 0, " "], + [2744, 0, "="], + [2745, 0, " "], + [2765, 0, "\n"], + [2766, 0, "l"], + [2767, 0, "i"], + [2768, 0, "s"], + [2769, 0, "t"], + [2781, 0, "f"], + [2781, 1], + [2806, 1], + [2805, 1], + [2804, 1], + [2803, 1], + [2802, 1], + [2801, 1], + [2800, 1], + [2799, 1], + [2798, 1], + [2797, 1], + [2796, 1], + [2795, 1], + [2794, 1], + [2793, 1], + [2792, 1], + [2791, 1], + [2790, 1], + [2789, 1], + [2788, 1], + [2788, 0, "l"], + [2789, 0, "i"], + [2790, 0, "s"], + [2791, 0, "t"], + [1875, 0, ":"], + [2730, 0, ":"], + [2773, 0, ":"], + [2767, 0, ";"], + [4074, 0, "A"], + [4075, 0, " "], + [4076, 0, "c"], + [4077, 0, "o"], + [4078, 0, "m"], + [4079, 0, "m"], + [4080, 0, "a"], + [4081, 0, "n"], + [4082, 0, "d"], + [4083, 0, " "], + [4084, 0, "C"], + [4085, 0, "M"], + [4086, 0, "D"], + [4087, 0, " "], + [4088, 0, "e"], + [4089, 0, "i"], + [4090, 0, "t"], + [4091, 0, "h"], + [4092, 0, "e"], + [4093, 0, "r"], + [4094, 0, " "], + [4095, 0, "s"], + [4096, 0, "e"], + [4097, 0, "t"], + [4098, 0, "s"], + [4099, 0, " "], + [4100, 0, "t"], + [4101, 0, "h"], + [4102, 0, "e"], + [4103, 0, " "], + [4104, 0, "v"], + [4105, 0, "a"], + [4106, 0, "l"], + [4107, 0, "u"], + [4108, 0, "e"], + [4109, 0, " "], + [4110, 0, "o"], + [4111, 0, "f"], + [4112, 0, " "], + [4113, 0, "a"], + [4114, 0, " "], + [4115, 0, "l"], + [4116, 0, "o"], + [4117, 0, "c"], + [4118, 0, "a"], + [4119, 0, "l"], + [4120, 0, " "], + [4121, 0, "v"], + [4122, 0, "a"], + [4123, 0, "r"], + [4124, 0, "i"], + [4125, 0, "a"], + [4126, 0, "b"], + [4127, 0, "l"], + [4128, 0, "e"], + [4129, 0, " "], + [4130, 0, "("], + [4131, 0, "\\"], + [4132, 0, "m"], + [4132, 1], + [4132, 0, "t"], + [4133, 0, "e"], + [4134, 0, "x"], + [4135, 0, "t"], + [4136, 0, "s"], + [4137, 0, "f"], + [4138, 0, "{"], + [4139, 0, "l"], + [4140, 0, "e"], + [4141, 0, "t"], + [4142, 0, "}"], + [4143, 0, ")"], + [4144, 0, ","], + [4145, 0, " "], + [4146, 0, "p"], + [4147, 0, "e"], + [4148, 0, "r"], + [4149, 0, "f"], + [4150, 0, "o"], + [4151, 0, "r"], + [4152, 0, "m"], + [4153, 0, "s"], + [4154, 0, " "], + [4155, 0, "n"], + [4156, 0, "e"], + [4157, 0, "t"], + [4158, 0, "w"], + [4159, 0, "o"], + [4160, 0, "r"], + [4161, 0, "k"], + [4162, 0, " "], + [4163, 0, "c"], + [4164, 0, "o"], + [4165, 0, "m"], + [4166, 0, "m"], + [4167, 0, "u"], + [4168, 0, "n"], + [4169, 0, "i"], + [4170, 0, "c"], + [4171, 0, "a"], + [4172, 0, "t"], + [4173, 0, "i"], + [4174, 0, "o"], + [4175, 0, "n"], + [4176, 0, " "], + [4177, 0, "("], + [4178, 0, "\\"], + [4179, 0, "t"], + [4180, 0, "e"], + [4181, 0, "x"], + [4182, 0, "t"], + [4183, 0, "s"], + [4184, 0, "f"], + [4185, 0, "{"], + [4186, 0, "y"], + [4187, 0, "i"], + [4188, 0, "e"], + [4189, 0, "l"], + [4190, 0, "d"], + [4191, 0, "}"], + [4192, 0, ")"], + [4193, 0, ","], + [4194, 0, " "], + [4195, 0, "o"], + [4196, 0, "r"], + [4197, 0, " "], + [4198, 0, "m"], + [4199, 0, "o"], + [4200, 0, "d"], + [4201, 0, "i"], + [4202, 0, "f"], + [4203, 0, "i"], + [4204, 0, "e"], + [4205, 0, "s"], + [4206, 0, " "], + [4207, 0, "t"], + [4208, 0, "h"], + [4209, 0, "e"], + [4210, 0, " "], + [4211, 0, "d"], + [4212, 0, "o"], + [4213, 0, "c"], + [4214, 0, "u"], + [4215, 0, "m"], + [4216, 0, "e"], + [4217, 0, "n"], + [4218, 0, "t"], + [4219, 0, " "], + [4220, 0, "("], + [4221, 0, "\\"], + [4221, 1], + [4221, 0, ":"], + [4222, 0, "="], + [4223, 0, ","], + [4224, 0, " "], + [4225, 0, "\\"], + [4226, 0, "t"], + [4227, 0, "e"], + [4228, 0, "x"], + [4228, 1], + [4227, 1], + [4226, 1], + [4225, 1], + [4224, 1], + [4223, 1], + [4222, 1], + [4221, 1], + [4220, 1], + [4219, 1], + [4218, 1], + [4217, 1], + [4217, 0, "n"], + [4218, 0, "t"], + [4219, 0, "."], + [4220, 0, " "], + [4221, 0, "A"], + [4222, 0, " "], + [4223, 0, "d"], + [4224, 0, "o"], + [4225, 0, "c"], + [4226, 0, "u"], + [4227, 0, "m"], + [4228, 0, "e"], + [4229, 0, "n"], + [4230, 0, "t"], + [4231, 0, " "], + [4232, 0, "c"], + [4233, 0, "a"], + [4234, 0, "n"], + [4235, 0, " "], + [4236, 0, "b"], + [4237, 0, "e"], + [4238, 0, " "], + [4239, 0, "m"], + [4240, 0, "o"], + [4241, 0, "d"], + [4242, 0, "i"], + [4243, 0, "f"], + [4244, 0, "i"], + [4245, 0, "e"], + [4246, 0, "d"], + [4247, 0, " "], + [4248, 0, "b"], + [4249, 0, "y"], + [4250, 0, " "], + [4251, 0, "a"], + [4252, 0, "s"], + [4253, 0, "s"], + [4254, 0, "i"], + [4255, 0, "g"], + [4256, 0, "n"], + [4257, 0, "i"], + [4258, 0, "n"], + [4259, 0, "g"], + [4260, 0, " "], + [4261, 0, "t"], + [4262, 0, "h"], + [4263, 0, "e"], + [4264, 0, " "], + [4265, 0, "v"], + [4266, 0, "a"], + [4267, 0, "l"], + [4268, 0, "u"], + [4269, 0, "e"], + [4270, 0, " "], + [4271, 0, "o"], + [4272, 0, "f"], + [4273, 0, " "], + [4274, 0, "s"], + [4275, 0, "o"], + [4276, 0, "m"], + [4277, 0, "e"], + [4278, 0, " "], + [4279, 0, "f"], + [4280, 0, "i"], + [4281, 0, "e"], + [4282, 0, "l"], + [4283, 0, "d"], + [4284, 0, " "], + [4285, 0, "("], + [4286, 0, "u"], + [4287, 0, "s"], + [4288, 0, "i"], + [4289, 0, "n"], + [4290, 0, "g"], + [4291, 0, " "], + [2833, 0, "\n"], + [2834, 0, "l"], + [2835, 0, "i"], + [2836, 0, "s"], + [2837, 0, "t"], + [2838, 0, "."], + [2839, 0, "i"], + [2840, 0, "n"], + [2841, 0, "s"], + [2842, 0, "e"], + [2843, 0, "r"], + [2844, 0, "t"], + [2845, 0, "("], + [2846, 0, "\""], + [2847, 0, "c"], + [2848, 0, "h"], + [2849, 0, "e"], + [2850, 0, "e"], + [2851, 0, "s"], + [2852, 0, "e"], + [2853, 0, "\""], + [2854, 0, ")"], + [2855, 0, ";"], + [2888, 0, "\""], + [2889, 0, "c"], + [2890, 0, "h"], + [2891, 0, "e"], + [2892, 0, "e"], + [2893, 0, "s"], + [2894, 0, "e"], + [2895, 0, "\""], + [2896, 0, ","], + [2897, 0, " "], + [4325, 0, "t"], + [4326, 0, "h"], + [4327, 0, "e"], + [4328, 0, " "], + [4329, 0, "a"], + [4330, 0, "s"], + [4331, 0, "s"], + [4332, 0, "i"], + [4333, 0, "g"], + [4334, 0, "n"], + [4335, 0, "m"], + [4336, 0, "e"], + [4337, 0, "n"], + [4338, 0, "t"], + [4339, 0, " "], + [4340, 0, "o"], + [4341, 0, "p"], + [4342, 0, "e"], + [4343, 0, "r"], + [4344, 0, "a"], + [4345, 0, "t"], + [4346, 0, "o"], + [4347, 0, "r"], + [4348, 0, " "], + [4349, 0, ":"], + [4350, 0, "="], + [4351, 0, ")"], + [4352, 0, ","], + [4353, 0, " "], + [4354, 0, "b"], + [4355, 0, "y"], + [4356, 0, " "], + [4357, 0, "i"], + [4358, 0, "n"], + [4359, 0, "s"], + [4360, 0, "e"], + [4361, 0, "r"], + [4362, 0, "t"], + [4363, 0, "i"], + [4364, 0, "n"], + [4365, 0, "g"], + [4316, 1], + [4315, 1], + [4314, 1], + [4313, 1], + [4312, 1], + [4311, 1], + [4311, 0, " "], + [4312, 0, "o"], + [4313, 0, "b"], + [4314, 0, "j"], + [4315, 0, "e"], + [4316, 0, "c"], + [4317, 0, "t"], + [4317, 1], + [4316, 1], + [4315, 1], + [4314, 1], + [4313, 1], + [4312, 1], + [4312, 0, "f"], + [4313, 0, "i"], + [4314, 0, "e"], + [4315, 0, "l"], + [4316, 0, "d"], + [4366, 0, " "], + [4367, 0, "a"], + [4368, 0, "n"], + [4369, 0, " "], + [4370, 0, "e"], + [4371, 0, "l"], + [4372, 0, "e"], + [4373, 0, "m"], + [4374, 0, "e"], + [4375, 0, "n"], + [4376, 0, "t"], + [4377, 0, " "], + [4378, 0, "i"], + [4379, 0, "n"], + [4380, 0, "t"], + [4381, 0, "o"], + [4382, 0, " "], + [4383, 0, "a"], + [4384, 0, " "], + [4385, 0, "l"], + [4386, 0, "i"], + [4387, 0, "s"], + [4388, 0, "t"], + [4389, 0, " "], + [4390, 0, "("], + [4391, 0, "\\"], + [4392, 0, "t"], + [4393, 0, "e"], + [4394, 0, "x"], + [4395, 0, "t"], + [4396, 0, "s"], + [4397, 0, "f"], + [4398, 0, "{"], + [4399, 0, "i"], + [4400, 0, "s"], + [4401, 0, "n"], + [4402, 0, "e"], + [4403, 0, "r"], + [4404, 0, "t"], + [4405, 0, "}"], + [4406, 0, ")"], + [4400, 1], + [4401, 0, "s"], + [4407, 0, ","], + [4408, 0, " "], + [4409, 0, "b"], + [4410, 0, "y"], + [4411, 0, " "], + [4412, 0, "d"], + [4413, 0, "e"], + [4414, 0, "l"], + [4415, 0, "e"], + [4416, 0, "t"], + [4417, 0, "i"], + [4418, 0, "n"], + [4419, 0, "g"], + [4420, 0, " "], + [4421, 0, "a"], + [4422, 0, "n"], + [4423, 0, " "], + [4424, 0, "e"], + [4425, 0, "l"], + [4426, 0, "e"], + [4427, 0, "m"], + [4428, 0, "e"], + [4429, 0, "n"], + [4430, 0, "t"], + [4431, 0, " "], + [4432, 0, "f"], + [4433, 0, "r"], + [4434, 0, "o"], + [4435, 0, "m"], + [4436, 0, " "], + [4437, 0, "a"], + [4438, 0, " "], + [4439, 0, "l"], + [4440, 0, "i"], + [4441, 0, "s"], + [4442, 0, "t"], + [4443, 0, " "], + [4444, 0, "o"], + [4445, 0, "r"], + [4446, 0, " "], + [4447, 0, "a"], + [4448, 0, " "], + [4449, 0, "m"], + [4450, 0, "a"], + [4451, 0, "p"], + [4452, 0, " "], + [4453, 0, "("], + [4454, 0, "\\"], + [4455, 0, "t"], + [4456, 0, "e"], + [4457, 0, "x"], + [4458, 0, "t"], + [4459, 0, "f"], + [4459, 1], + [4459, 0, "s"], + [4460, 0, "f"], + [4461, 0, "{"], + [4462, 0, "d"], + [4463, 0, "e"], + [4464, 0, "l"], + [4465, 0, "e"], + [4466, 0, "t"], + [4467, 0, "e"], + [4468, 0, "}"], + [4469, 0, ")"], + [4470, 0, ","], + [4471, 0, " "], + [4472, 0, "o"], + [4473, 0, "r"], + [4474, 0, " "], + [4475, 0, "b"], + [4476, 0, "y"], + [4477, 0, " "], + [4478, 0, "i"], + [4479, 0, "n"], + [4480, 0, "c"], + [4481, 0, "r"], + [4482, 0, "e"], + [4483, 0, "m"], + [4484, 0, "e"], + [4485, 0, "n"], + [4486, 0, "t"], + [4487, 0, "i"], + [4488, 0, "n"], + [4489, 0, "g"], + [4490, 0, " "], + [4491, 0, "a"], + [4492, 0, " "], + [4493, 0, "c"], + [4494, 0, "o"], + [4495, 0, "u"], + [4496, 0, "n"], + [4497, 0, "t"], + [4498, 0, "e"], + [4499, 0, "r"], + [4500, 0, " "], + [4501, 0, "("], + [4502, 0, "\\"], + [4503, 0, "t"], + [4504, 0, "e"], + [4505, 0, "x"], + [4506, 0, "t"], + [4507, 0, "s"], + [4508, 0, "f"], + [4509, 0, "{"], + [4510, 0, "i"], + [4511, 0, "n"], + [4512, 0, "c"], + [4513, 0, "r"], + [4514, 0, "}"], + [4515, 0, ")"], + [4516, 0, "."], + [4517, 0, " "], + [4518, 0, "T"], + [4519, 0, "h"], + [4520, 0, "e"], + [4521, 0, " "], + [4522, 0, "p"], + [4523, 0, "a"], + [4524, 0, "r"], + [4525, 0, "t"], + [4526, 0, " "], + [4526, 1], + [4525, 1], + [4524, 1], + [4523, 1], + [4522, 1], + [4521, 1], + [4520, 1], + [4519, 1], + [4518, 1], + [4517, 1], + [4517, 0, "\n"], + [4518, 0, "\n"], + [4519, 0, "T"], + [4520, 0, "h"], + [4521, 0, "e"], + [4522, 0, " "], + [4517, 0, " "], + [4518, 0, "T"], + [4519, 0, "h"], + [4520, 0, "e"], + [4521, 0, " "], + [4522, 0, "p"], + [4523, 0, "a"], + [4524, 0, "r"], + [4525, 0, "t"], + [4526, 0, " "], + [4527, 0, "o"], + [4528, 0, "f"], + [4529, 0, " "], + [4530, 0, "t"], + [4531, 0, "h"], + [4532, 0, "e"], + [4533, 0, " "], + [4534, 0, "d"], + [4535, 0, "o"], + [4536, 0, "c"], + [4537, 0, "u"], + [4538, 0, "m"], + [4539, 0, "e"], + [4540, 0, "n"], + [4541, 0, "t"], + [4542, 0, " "], + [4543, 0, "b"], + [4544, 0, "e"], + [4545, 0, "i"], + [4546, 0, "n"], + [4547, 0, "g"], + [4548, 0, " "], + [4549, 0, "m"], + [4550, 0, "o"], + [4551, 0, "d"], + [4552, 0, "i"], + [4553, 0, "f"], + [4554, 0, "i"], + [4555, 0, "e"], + [4556, 0, "d"], + [4557, 0, " "], + [4558, 0, "i"], + [4559, 0, "s"], + [4560, 0, " "], + [4561, 0, "d"], + [4561, 1], + [4560, 1], + [4559, 1], + [4558, 1], + [4557, 1], + [4556, 1], + [4555, 1], + [4554, 1], + [4553, 1], + [4552, 1], + [4551, 1], + [4550, 1], + [4549, 1], + [4548, 1], + [4547, 1], + [4546, 1], + [4545, 1], + [4544, 1], + [4543, 1], + [4542, 1], + [4541, 1], + [4540, 1], + [4539, 1], + [4538, 1], + [4537, 1], + [4536, 1], + [4535, 1], + [4534, 1], + [4533, 1], + [4532, 1], + [4531, 1], + [4530, 1], + [4529, 1], + [4528, 1], + [4527, 1], + [4526, 1], + [4525, 1], + [4524, 1], + [4523, 1], + [4522, 1], + [4521, 1], + [4521, 0, " "], + [4522, 0, "p"], + [4523, 0, "r"], + [4524, 0, "e"], + [4525, 0, "c"], + [4526, 0, "e"], + [4527, 0, "d"], + [4528, 0, "i"], + [4529, 0, "n"], + [4530, 0, "g"], + [4531, 0, " "], + [4532, 0, "e"], + [4533, 0, "x"], + [4534, 0, "p"], + [4535, 0, "r"], + [4536, 0, "e"], + [4537, 0, "s"], + [4538, 0, "s"], + [4539, 0, "i"], + [4540, 0, "o"], + [4541, 0, "n"], + [4542, 0, " "], + [4543, 0, "E"], + [4544, 0, "X"], + [4545, 0, "P"], + [4546, 0, "R"], + [4547, 0, " "], + [4548, 0, "i"], + [4549, 0, "d"], + [4550, 0, "e"], + [4551, 0, "n"], + [4552, 0, "t"], + [4553, 0, "i"], + [4554, 0, "f"], + [4555, 0, "i"], + [4556, 0, "e"], + [4557, 0, "s"], + [4558, 0, " "], + [4559, 0, "t"], + [4560, 0, "h"], + [4561, 0, "e"], + [4562, 0, " "], + [4563, 0, "p"], + [4564, 0, "a"], + [4565, 0, "r"], + [4566, 0, "t"], + [4567, 0, " "], + [4568, 0, "o"], + [4569, 0, "f"], + [4570, 0, " "], + [4571, 0, "t"], + [4572, 0, "h"], + [4573, 0, "e"], + [4574, 0, " "], + [4575, 0, "d"], + [4576, 0, "o"], + [4577, 0, "c"], + [4578, 0, "u"], + [4579, 0, "m"], + [4580, 0, "e"], + [4581, 0, "n"], + [4582, 0, "t"], + [4583, 0, " "], + [4584, 0, "b"], + [4585, 0, "e"], + [4586, 0, "i"], + [4587, 0, "n"], + [4588, 0, "g"], + [4589, 0, " "], + [4590, 0, "m"], + [4591, 0, "o"], + [4592, 0, "d"], + [4593, 0, "i"], + [4594, 0, "f"], + [4595, 0, "i"], + [4596, 0, "e"], + [4597, 0, "d"], + [4598, 0, "."], + [4604, 1], + [4603, 1], + [4602, 1], + [4601, 1], + [4601, 0, "F"], + [4602, 0, "i"], + [4603, 0, "g"], + [4604, 0, "u"], + [4605, 0, "r"], + [4606, 0, "e"], + [4607, 0, "~"], + [4608, 0, "\\"], + [4609, 0, "r"], + [4610, 0, "e"], + [4611, 0, "f"], + [4612, 0, "{"], + [4613, 0, "f"], + [4614, 0, "i"], + [4615, 0, "g"], + [4616, 0, ":"], + [4617, 0, "m"], + [4618, 0, "a"], + [4619, 0, "k"], + [4620, 0, "e"], + [4621, 0, "-"], + [4622, 0, "d"], + [4623, 0, "o"], + [4624, 0, "c"], + [4625, 0, "}"], + [4626, 0, " "], + [4627, 0, "s"], + [4628, 0, "h"], + [4629, 0, "o"], + [4630, 0, "w"], + [4631, 0, "s"], + [4632, 0, " "], + [4633, 0, "a"], + [4634, 0, "n"], + [4635, 0, " "], + [4636, 0, "e"], + [4637, 0, "x"], + [4638, 0, "a"], + [4639, 0, "m"], + [4640, 0, "p"], + [4641, 0, "l"], + [4642, 0, "e"], + [4643, 0, " "], + [4644, 0, "o"], + [4645, 0, "f"], + [4646, 0, " "], + [4647, 0, "a"], + [4648, 0, " "], + [4649, 0, "s"], + [4650, 0, "e"], + [4651, 0, "q"], + [4652, 0, "u"], + [4653, 0, "e"], + [4654, 0, "n"], + [4655, 0, "c"], + [4656, 0, "e"], + [4657, 0, " "], + [4658, 0, "o"], + [4659, 0, "f"], + [4660, 0, " "], + [4661, 0, "c"], + [4662, 0, "o"], + [4663, 0, "m"], + [4664, 0, "m"], + [4665, 0, "a"], + [4666, 0, "n"], + [4667, 0, "d"], + [4668, 0, "s"], + [4669, 0, " "], + [4670, 0, "c"], + [4671, 0, "o"], + [4672, 0, "n"], + [4673, 0, "s"], + [4674, 0, "t"], + [4675, 0, "r"], + [4676, 0, "u"], + [4677, 0, "c"], + [4678, 0, "t"], + [4679, 0, "i"], + [4680, 0, "n"], + [4681, 0, "g"], + [4682, 0, " "], + [4683, 0, "a"], + [4684, 0, " "], + [4685, 0, "n"], + [4686, 0, "e"], + [4687, 0, "w"], + [4688, 0, " "], + [4689, 0, "d"], + [4690, 0, "o"], + [4691, 0, "c"], + [4692, 0, "u"], + [4693, 0, "m"], + [4694, 0, "e"], + [4695, 0, "n"], + [4696, 0, "t"], + [4697, 0, " "], + [4698, 0, "r"], + [4699, 0, "e"], + [4700, 0, "p"], + [4701, 0, "r"], + [4702, 0, "e"], + [4703, 0, "s"], + [4704, 0, "e"], + [4705, 0, "n"], + [4706, 0, "t"], + [4707, 0, "i"], + [4708, 0, "n"], + [4709, 0, "g"], + [4710, 0, "a"], + [4711, 0, " "], + [4711, 1], + [4710, 1], + [4710, 0, " "], + [4711, 0, "a"], + [4712, 0, " "], + [4713, 0, "s"], + [4714, 0, "h"], + [4715, 0, "o"], + [4716, 0, "p"], + [4717, 0, "p"], + [4718, 0, "i"], + [4719, 0, "n"], + [4720, 0, "g"], + [4721, 0, " "], + [4722, 0, "l"], + [4723, 0, "i"], + [4724, 0, "s"], + [4725, 0, "t"], + [4726, 0, "."], + [4727, 0, " "], + [4728, 0, "F"], + [4729, 0, "i"], + [4730, 0, "r"], + [4731, 0, "s"], + [4732, 0, "t"], + [4733, 0, " "], + [4734, 0, "\\"], + [4735, 0, "t"], + [4736, 0, "e"], + [4737, 0, "x"], + [4738, 0, "t"], + [4739, 0, "s"], + [4740, 0, "f"], + [4741, 0, "{"], + [4742, 0, "d"], + [4743, 0, "o"], + [4744, 0, "c"], + [4745, 0, "}"], + [4746, 0, " "], + [4747, 0, "i"], + [4748, 0, "s"], + [4749, 0, " "], + [4750, 0, "a"], + [4751, 0, "s"], + [4752, 0, "s"], + [4752, 1], + [4751, 1], + [4750, 1], + [4750, 0, "s"], + [4751, 0, "e"], + [4752, 0, "t"], + [4753, 0, " "], + [4754, 0, "t"], + [4755, 0, "o"], + [4756, 0, " "], + [4757, 0, "\\"], + [4758, 0, "v"], + [4759, 0, "e"], + [4760, 0, "r"], + [4761, 0, "b"], + [4762, 0, "|"], + [4763, 0, "{"], + [4764, 0, "}"], + [4765, 0, "|"], + [4766, 0, ","], + [4767, 0, " "], + [4768, 0, "t"], + [4769, 0, "h"], + [4770, 0, "e"], + [4771, 0, " "], + [4772, 0, "e"], + [4773, 0, "m"], + [4774, 0, "p"], + [4775, 0, "t"], + [4776, 0, "y"], + [4777, 0, " "], + [4778, 0, "m"], + [4779, 0, "a"], + [4780, 0, "p"], + [4781, 0, " "], + [4782, 0, "l"], + [4783, 0, "i"], + [4784, 0, "t"], + [4785, 0, "e"], + [4786, 0, "r"], + [4787, 0, "a"], + [4788, 0, "l"], + [4789, 0, "."], + [4790, 0, " "], + [4791, 0, "W"], + [4792, 0, "i"], + [4793, 0, "t"], + [4794, 0, "h"], + [4795, 0, "i"], + [4796, 0, "n"], + [4797, 0, " "], + [4798, 0, "t"], + [4799, 0, "h"], + [4800, 0, "a"], + [4801, 0, "t"], + [4802, 0, " "], + [4803, 0, "m"], + [4804, 0, "a"], + [4805, 0, "p"], + [4806, 0, ","], + [4807, 0, " "], + [4808, 0, "t"], + [4809, 0, "h"], + [4810, 0, "e"], + [4811, 0, " "], + [4812, 0, "k"], + [4813, 0, "e"], + [4814, 0, "y"], + [4815, 0, " "], + [4816, 0, "\\"], + [4817, 0, "\""], + [4817, 1], + [4816, 1], + [4816, 0, "\\"], + [4817, 0, "v"], + [4818, 0, "e"], + [4819, 0, "r"], + [4820, 0, "b"], + [4821, 0, "|"], + [4822, 0, "\""], + [4823, 0, "s"], + [4824, 0, "h"], + [4825, 0, "o"], + [4826, 0, "p"], + [4827, 0, "p"], + [4828, 0, "i"], + [4829, 0, "n"], + [4830, 0, "g"], + [4831, 0, "\""], + [4832, 0, "|"], + [4833, 0, " "], + [4834, 0, "i"], + [4835, 0, "s"], + [4836, 0, " "], + [4837, 0, "s"], + [4838, 0, "e"], + [4839, 0, "t"], + [4840, 0, " "], + [4841, 0, "t"], + [4842, 0, "o"], + [4843, 0, " "], + [4844, 0, "t"], + [4845, 0, "h"], + [4846, 0, "e"], + [4847, 0, " "], + [4848, 0, "e"], + [4849, 0, "m"], + [4850, 0, "p"], + [4851, 0, "t"], + [4852, 0, "y"], + [4853, 0, " "], + [4854, 0, "l"], + [4855, 0, "i"], + [4856, 0, "s"], + [4857, 0, "t"], + [4858, 0, " "], + [4859, 0, "\\"], + [4860, 0, "v"], + [4861, 0, "e"], + [4862, 0, "r"], + [4863, 0, "b"], + [4864, 0, "|"], + [4865, 0, "["], + [4866, 0, "]"], + [4867, 0, "|"], + [4868, 0, ","], + [4869, 0, " "], + [4870, 0, "a"], + [4871, 0, "n"], + [4872, 0, "d"], + [4873, 0, " "], + [4874, 0, "t"], + [4875, 0, "h"], + [4876, 0, "e"], + [4877, 0, "n"], + [4878, 0, " "], + [4879, 0, "t"], + [4880, 0, "h"], + [4881, 0, "r"], + [4882, 0, "e"], + [4883, 0, "e"], + [4884, 0, " "], + [4885, 0, "i"], + [4886, 0, "t"], + [4887, 0, "e"], + [4888, 0, "m"], + [4889, 0, "s"], + [4890, 0, " "], + [4891, 0, "a"], + [4892, 0, "r"], + [4893, 0, "e"], + [4894, 0, " "], + [4895, 0, "i"], + [4896, 0, "n"], + [4897, 0, "s"], + [4898, 0, "e"], + [4899, 0, "r"], + [4900, 0, "t"], + [4901, 0, "e"], + [4902, 0, "d"], + [4903, 0, " "], + [4904, 0, "i"], + [4905, 0, "n"], + [4906, 0, "t"], + [4907, 0, "o"], + [4908, 0, " "], + [4909, 0, "t"], + [4910, 0, "h"], + [4911, 0, "e"], + [4912, 0, " "], + [4913, 0, "l"], + [4914, 0, "i"], + [4915, 0, "s"], + [4916, 0, "t"], + [4917, 0, "."], + [4918, 0, " "], + [4919, 0, "T"], + [4920, 0, "h"], + [4921, 0, "e"], + [4922, 0, " "], + [4923, 0, "\\"], + [4924, 0, "t"], + [4925, 0, "e"], + [4926, 0, "x"], + [4927, 0, "t"], + [4928, 0, "s"], + [4929, 0, "f"], + [4930, 0, "{"], + [4931, 0, "i"], + [4932, 0, "n"], + [4933, 0, "s"], + [4934, 0, "e"], + [4935, 0, "r"], + [4936, 0, "t"], + [4937, 0, "}"], + [4938, 0, " "], + [4939, 0, "c"], + [4940, 0, "o"], + [4941, 0, "m"], + [4942, 0, "m"], + [4943, 0, "a"], + [4944, 0, "n"], + [4945, 0, "d"], + [4946, 0, " "], + [4547, 0, " "], + [4548, 0, "a"], + [4549, 0, "c"], + [4550, 0, "t"], + [4551, 0, "s"], + [4552, 0, " "], + [4553, 0, "a"], + [4554, 0, "s"], + [4555, 0, " "], + [4556, 0, "a"], + [4557, 0, " "], + [4558, 0, "c"], + [4559, 0, "u"], + [4560, 0, "r"], + [4561, 0, "s"], + [4562, 0, "o"], + [4563, 0, "r"], + [4564, 0, ","], + [4575, 1], + [4574, 1], + [4573, 1], + [4573, 0, "y"], + [4574, 0, "i"], + [4575, 0, "n"], + [4576, 0, "g"], + [4966, 0, "a"], + [4967, 0, "d"], + [4968, 0, "d"], + [4969, 0, "s"], + [4970, 0, " "], + [4971, 0, "a"], + [4972, 0, "n"], + [4973, 0, " "], + [4973, 1], + [4972, 1], + [4972, 0, " "], + [4973, 0, "n"], + [4974, 0, "e"], + [4975, 0, "w"], + [4976, 0, " "], + [4977, 0, "l"], + [4978, 0, "i"], + [4979, 0, "s"], + [4980, 0, "t"], + [4981, 0, " "], + [4982, 0, "a"], + [4982, 1], + [4982, 0, "e"], + [4983, 0, "l"], + [4984, 0, "e"], + [4985, 0, "m"], + [4986, 0, "e"], + [4987, 0, "n"], + [4988, 0, "t"], + [4989, 0, " "], + [4990, 0, "\\"], + [4991, 0, "e"], + [4992, 0, "m"], + [4993, 0, "p"], + [4994, 0, "h"], + [4995, 0, "{"], + [4996, 0, "a"], + [4997, 0, "f"], + [4998, 0, "t"], + [4999, 0, "e"], + [5000, 0, "r"], + [5001, 0, "}"], + [5002, 0, " "], + [5003, 0, "t"], + [5004, 0, "h"], + [5005, 0, "e"], + [5006, 0, " "], + [5007, 0, "c"], + [5008, 0, "u"], + [5009, 0, "r"], + [5010, 0, "r"], + [5011, 0, "e"], + [5012, 0, "n"], + [5013, 0, "t"], + [5014, 0, " "], + [5015, 0, "c"], + [5016, 0, "u"], + [5017, 0, "r"], + [5018, 0, "s"], + [5019, 0, "o"], + [5020, 0, "r"], + [5021, 0, " "], + [5022, 0, "p"], + [5023, 0, "o"], + [5024, 0, "s"], + [5025, 0, "i"], + [5026, 0, "t"], + [5027, 0, "i"], + [5028, 0, "o"], + [5029, 0, "n"], + [5030, 0, ","], + [5031, 0, " "], + [5032, 0, "a"], + [5033, 0, "n"], + [5034, 0, "d"], + [5035, 0, " "], + [5036, 0, "r"], + [5037, 0, "e"], + [5038, 0, "t"], + [5039, 0, "u"], + [5040, 0, "r"], + [5041, 0, "n"], + [5042, 0, "s"], + [5043, 0, " "], + [5044, 0, "t"], + [5045, 0, "h"], + [5046, 0, "e"], + [5047, 0, " "], + [5048, 0, "c"], + [5049, 0, "u"], + [5050, 0, "r"], + [5051, 0, "s"], + [5052, 0, "o"], + [5053, 0, "r"], + [5054, 0, " "], + [5055, 0, "p"], + [5056, 0, "o"], + [5057, 0, "s"], + [5058, 0, "i"], + [5059, 0, "t"], + [5060, 0, "i"], + [5061, 0, "o"], + [5062, 0, "n"], + [5063, 0, " "], + [5064, 0, "o"], + [5065, 0, "f"], + [5066, 0, " "], + [5067, 0, "t"], + [5068, 0, "h"], + [5069, 0, "e"], + [5070, 0, " "], + [5071, 0, "n"], + [5072, 0, "e"], + [5073, 0, "w"], + [5074, 0, " "], + [5074, 1], + [5074, 0, "l"], + [5075, 0, "y"], + [5076, 0, " "], + [5077, 0, "i"], + [5078, 0, "n"], + [5079, 0, "s"], + [5080, 0, "e"], + [5081, 0, "r"], + [5082, 0, "t"], + [5083, 0, "e"], + [5084, 0, "d"], + [5085, 0, " "], + [5086, 0, "e"], + [5087, 0, "l"], + [5088, 0, "e"], + [5089, 0, "m"], + [5090, 0, "e"], + [5091, 0, "n"], + [5092, 0, "t"], + [5093, 0, "."], + [5094, 0, " "], + [5095, 0, "T"], + [5096, 0, "h"], + [5097, 0, "u"], + [5098, 0, "s"], + [5099, 0, ","], + [5100, 0, " "], + [5101, 0, "\\"], + [5101, 1], + [5101, 0, "m"], + [5102, 0, "i"], + [5103, 0, "l"], + [5104, 0, "k"], + [5105, 0, " "], + [5106, 0, "i"], + [5107, 0, "s"], + [5108, 0, " "], + [5109, 0, "i"], + [5110, 0, "n"], + [5111, 0, "s"], + [5112, 0, "e"], + [5113, 0, "r"], + [5114, 0, "t"], + [5115, 0, "e"], + [5116, 0, "d"], + [5117, 0, " "], + [5118, 0, "a"], + [5119, 0, "f"], + [5120, 0, "t"], + [5121, 0, "e"], + [5122, 0, "r"], + [5123, 0, " "], + [5124, 0, "e"], + [5125, 0, "g"], + [5126, 0, "g"], + [5127, 0, "s"], + [5128, 0, ","], + [5129, 0, " "], + [5130, 0, "b"], + [5131, 0, "u"], + [5132, 0, "t"], + [5133, 0, " "], + [5134, 0, "c"], + [5135, 0, "h"], + [5136, 0, "e"], + [5137, 0, "e"], + [5138, 0, "s"], + [5139, 0, "e"], + [5140, 0, " "], + [5141, 0, "i"], + [5142, 0, "n"], + [5143, 0, "s"], + [5143, 1], + [5142, 1], + [5142, 0, "s"], + [5143, 0, " "], + [5144, 0, "i"], + [5145, 0, "n"], + [5146, 0, "s"], + [5147, 0, "e"], + [5148, 0, "r"], + [5149, 0, "t"], + [5150, 0, "e"], + [5151, 0, "d"], + [5152, 0, " "], + [5153, 0, "a"], + [5154, 0, "t"], + [5155, 0, " "], + [5094, 0, " "], + [5095, 0, "I"], + [5096, 0, "f"], + [5097, 0, " "], + [5098, 0, "t"], + [5099, 0, "h"], + [5100, 0, "e"], + [5101, 0, " "], + [5102, 0, "c"], + [5103, 0, "u"], + [5104, 0, "r"], + [5105, 0, "s"], + [5106, 0, "o"], + [5107, 0, "r"], + [5108, 0, " "], + [5109, 0, "r"], + [5110, 0, "e"], + [5111, 0, "f"], + [5112, 0, "e"], + [5113, 0, "r"], + [5114, 0, "s"], + [5115, 0, " "], + [5116, 0, "t"], + [5117, 0, "o"], + [5118, 0, " "], + [5119, 0, "t"], + [5120, 0, "h"], + [5121, 0, "e"], + [5122, 0, " "], + [5123, 0, "l"], + [5124, 0, "i"], + [5125, 0, "s"], + [5126, 0, "t"], + [5127, 0, " "], + [5128, 0, "a"], + [5129, 0, "s"], + [5130, 0, " "], + [5131, 0, "a"], + [5132, 0, " "], + [5133, 0, "w"], + [5134, 0, "h"], + [5135, 0, "o"], + [5136, 0, "l"], + [5137, 0, "e"], + [5138, 0, ","], + [5139, 0, " "], + [5140, 0, "i"], + [5141, 0, "n"], + [5142, 0, "s"], + [5143, 0, "e"], + [5144, 0, "r"], + [5145, 0, "t"], + [5146, 0, "i"], + [5147, 0, "o"], + [5148, 0, "n"], + [5149, 0, " "], + [5150, 0, "h"], + [5151, 0, "a"], + [5152, 0, "p"], + [5153, 0, "p"], + [5154, 0, "e"], + [5155, 0, "n"], + [5156, 0, "s"], + [5157, 0, " "], + [5158, 0, "a"], + [5159, 0, "t"], + [5160, 0, " "], + [5161, 0, "t"], + [5162, 0, "h"], + [5163, 0, "e"], + [5164, 0, " "], + [5165, 0, "h"], + [5166, 0, "e"], + [5167, 0, "a"], + [5168, 0, "d"], + [5169, 0, " "], + [5170, 0, "o"], + [5171, 0, "f"], + [5172, 0, " "], + [5173, 0, "t"], + [5174, 0, "h"], + [5175, 0, "e"], + [5176, 0, " "], + [5177, 0, "l"], + [5178, 0, "i"], + [5179, 0, "s"], + [5180, 0, "t"], + [5181, 0, "."], + [2767, 0, "."], + [2768, 0, "n"], + [2769, 0, "e"], + [2770, 0, "x"], + [2771, 0, "t"], + [2784, 1], + [2783, 1], + [2782, 1], + [2781, 1], + [2780, 1], + [2779, 1], + [2778, 1], + [2777, 1], + [2776, 1], + [2775, 1], + [2774, 1], + [2773, 1], + [4818, 1], + [4817, 1], + [4816, 1], + [4815, 1], + [4814, 1], + [4813, 1], + [4812, 1], + [4811, 1], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4806, 1], + [4805, 1], + [4804, 1], + [4803, 1], + [4803, 0, "T"], + [4804, 0, "h"], + [4805, 0, "e"], + [4806, 0, " "], + [4807, 0, "s"], + [4808, 0, "e"], + [4809, 0, "c"], + [4810, 0, "o"], + [4811, 0, "n"], + [4812, 0, "d"], + [4813, 0, " "], + [4814, 0, "l"], + [4815, 0, "i"], + [4816, 0, "n"], + [4817, 0, "e"], + [4818, 0, " "], + [4819, 0, "n"], + [4820, 0, "a"], + [4821, 0, "v"], + [4822, 0, "i"], + [4823, 0, "g"], + [4824, 0, "a"], + [4825, 0, "t"], + [4826, 0, "e"], + [4827, 0, "s"], + [4828, 0, " "], + [4829, 0, "t"], + [4830, 0, "o"], + [4858, 0, "("], + [4859, 0, "w"], + [4860, 0, "h"], + [4861, 0, "i"], + [4862, 0, "c"], + [4863, 0, "h"], + [4864, 0, " "], + [4865, 0, "i"], + [4866, 0, "s"], + [4867, 0, " "], + [4868, 0, "i"], + [4869, 0, "m"], + [4870, 0, "p"], + [4871, 0, "l"], + [4872, 0, "i"], + [4873, 0, "c"], + [4874, 0, "i"], + [4875, 0, "t"], + [4876, 0, "l"], + [4877, 0, "y"], + [4878, 0, " "], + [4879, 0, "c"], + [4880, 0, "r"], + [4881, 0, "e"], + [4882, 0, "a"], + [4883, 0, "t"], + [4884, 0, "e"], + [4885, 0, "d"], + [4886, 0, " "], + [4887, 0, "i"], + [4888, 0, "f"], + [4889, 0, " "], + [4890, 0, "i"], + [4891, 0, "t"], + [4892, 0, " "], + [4893, 0, "d"], + [4894, 0, "o"], + [4895, 0, "e"], + [4896, 0, "s"], + [4897, 0, " "], + [4898, 0, "n"], + [4899, 0, "o"], + [4900, 0, "t"], + [4901, 0, " "], + [4902, 0, "e"], + [4903, 0, "x"], + [4904, 0, "i"], + [4905, 0, "s"], + [4906, 0, "t"], + [4907, 0, ")"], + [4908, 0, ","], + [4909, 0, " "], + [4910, 0, "a"], + [4911, 0, "n"], + [4912, 0, "d"], + [4913, 0, " "], + [4914, 0, "c"], + [4915, 0, "a"], + [4916, 0, "l"], + [4917, 0, "l"], + [4918, 0, "s"], + [4919, 0, " "], + [4920, 0, "\\"], + [4921, 0, "t"], + [4922, 0, "e"], + [4923, 0, "x"], + [4924, 0, "t"], + [4925, 0, "s"], + [4926, 0, "f"], + [4927, 0, "{"], + [4928, 0, "n"], + [4929, 0, "e"], + [4930, 0, "x"], + [4931, 0, "t"], + [4932, 0, "}"], + [4933, 0, ","], + [4934, 0, " "], + [4935, 0, "w"], + [4936, 0, "h"], + [4937, 0, "i"], + [4938, 0, "c"], + [4939, 0, "h"], + [4940, 0, " "], + [4941, 0, "m"], + [4942, 0, "o"], + [4943, 0, "v"], + [4944, 0, "e"], + [4945, 0, "s"], + [4946, 0, " "], + [4947, 0, "t"], + [4948, 0, "o"], + [4949, 0, " "], + [4950, 0, "t"], + [4951, 0, "h"], + [4952, 0, "e"], + [4953, 0, " "], + [4953, 1], + [4952, 1], + [4951, 1], + [4950, 1], + [4949, 1], + [4948, 1], + [4947, 1], + [4946, 1], + [4945, 1], + [4944, 1], + [4943, 1], + [4942, 1], + [4941, 1], + [4941, 0, "t"], + [4942, 0, "r"], + [4943, 0, "e"], + [4944, 0, "a"], + [4945, 0, "t"], + [4946, 0, "s"], + [4947, 0, " "], + [4948, 0, "t"], + [4949, 0, "h"], + [4950, 0, "e"], + [4951, 0, " "], + [4952, 0, "v"], + [4953, 0, "a"], + [4954, 0, "l"], + [4955, 0, "u"], + [4956, 0, "e"], + [4957, 0, " "], + [4958, 0, "a"], + [4959, 0, "t"], + [4960, 0, " "], + [4961, 0, "t"], + [4962, 0, "h"], + [4963, 0, "a"], + [4964, 0, "t"], + [4965, 0, " "], + [4966, 0, "k"], + [4967, 0, "e"], + [4968, 0, "y"], + [4969, 0, " "], + [4970, 0, "a"], + [4971, 0, "s"], + [4972, 0, " "], + [4973, 0, "a"], + [4974, 0, " "], + [4975, 0, "l"], + [4976, 0, "i"], + [4977, 0, "s"], + [4978, 0, "t"], + [4979, 0, " "], + [4980, 0, "a"], + [4981, 0, "n"], + [4982, 0, "d"], + [4983, 0, " "], + [4984, 0, "s"], + [4985, 0, "e"], + [4986, 0, "l"], + [4987, 0, "e"], + [4988, 0, "c"], + [4989, 0, "t"], + [4990, 0, "s"], + [4991, 0, " "], + [4992, 0, "t"], + [4993, 0, "h"], + [4994, 0, "e"], + [4995, 0, " "], + [4996, 0, "h"], + [4997, 0, "e"], + [4998, 0, "a"], + [4999, 0, "d"], + [5000, 0, " "], + [5001, 0, "o"], + [5002, 0, "f"], + [5003, 0, " "], + [5004, 0, "t"], + [5005, 0, "h"], + [5006, 0, "e"], + [5007, 0, " "], + [5008, 0, "l"], + [5009, 0, "i"], + [5010, 0, "s"], + [5011, 0, "t"], + [5012, 0, "."], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 1], + [5013, 0, " "], + [5014, 0, "F"], + [5015, 0, "i"], + [5016, 0, "n"], + [5017, 0, "a"], + [5018, 0, "l"], + [5019, 0, "l"], + [5020, 0, "y"], + [5021, 0, ","], + [5307, 1], + [5306, 1], + [5305, 1], + [5304, 1], + [5303, 1], + [5302, 1], + [5301, 1], + [5300, 1], + [5299, 1], + [5298, 1], + [5297, 1], + [5296, 1], + [5295, 1], + [5294, 1], + [5293, 1], + [5292, 1], + [5291, 1], + [5290, 1], + [5289, 1], + [5288, 1], + [5287, 1], + [5286, 1], + [5285, 1], + [5284, 1], + [5283, 1], + [5282, 1], + [5281, 1], + [5280, 1], + [5279, 1], + [5278, 1], + [5277, 1], + [5276, 1], + [5275, 1], + [5274, 1], + [5273, 1], + [5272, 1], + [5271, 1], + [5270, 1], + [5269, 1], + [5268, 1], + [5267, 1], + [5266, 1], + [5265, 1], + [5264, 1], + [5263, 1], + [5262, 1], + [5261, 1], + [5260, 1], + [5259, 1], + [5258, 1], + [5257, 1], + [5256, 1], + [5255, 1], + [5254, 1], + [5253, 1], + [5252, 1], + [5251, 1], + [5250, 1], + [5249, 1], + [5248, 1], + [5247, 1], + [5246, 1], + [5245, 1], + [5244, 1], + [5243, 1], + [5242, 1], + [5241, 1], + [5240, 1], + [5239, 1], + [5238, 1], + [5237, 1], + [5236, 1], + [5235, 1], + [5234, 1], + [5233, 1], + [5232, 1], + [5231, 1], + [5230, 1], + [5229, 1], + [5228, 1], + [5227, 1], + [5226, 1], + [5225, 1], + [5224, 1], + [5223, 1], + [5222, 1], + [5221, 1], + [5220, 1], + [5281, 0, "t"], + [5282, 0, "h"], + [5283, 0, "e"], + [5284, 0, " "], + [5285, 0, "h"], + [5286, 0, "e"], + [5287, 0, "a"], + [5288, 0, "d"], + [5289, 0, " "], + [5290, 0, "o"], + [5291, 0, "f"], + [5292, 0, " "], + [5293, 0, "t"], + [5294, 0, "h"], + [5295, 0, "e"], + [5296, 0, " "], + [5297, 0, "l"], + [5298, 0, "i"], + [5299, 0, "s"], + [5300, 0, "t"], + [5301, 0, ","], + [5302, 0, " "], + [5303, 0, "b"], + [5304, 0, "e"], + [5305, 0, "c"], + [5306, 0, "a"], + [5307, 0, "u"], + [5308, 0, "s"], + [5309, 0, "e"], + [5310, 0, " "], + [5311, 0, "t"], + [5312, 0, "h"], + [5313, 0, "e"], + [5314, 0, " "], + [5315, 0, "v"], + [5316, 0, "a"], + [5317, 0, "r"], + [5318, 0, "i"], + [5319, 0, "a"], + [5320, 0, "b"], + [5321, 0, "l"], + [5322, 0, "e"], + [5323, 0, " "], + [5324, 0, "\\"], + [5325, 0, "v"], + [5326, 0, "e"], + [5327, 0, "r"], + [5328, 0, "b"], + [5329, 0, "|"], + [5330, 0, "l"], + [5331, 0, "i"], + [5332, 0, "s"], + [5333, 0, "t"], + [5334, 0, "|"], + [5335, 0, " "], + [5336, 0, "c"], + [5337, 0, "o"], + [5338, 0, "n"], + [5339, 0, "t"], + [5340, 0, "i"], + [5341, 0, "n"], + [5342, 0, "u"], + [5343, 0, "e"], + [5344, 0, "s"], + [5345, 0, " "], + [5346, 0, "t"], + [5347, 0, "o"], + [5348, 0, " "], + [5349, 0, "r"], + [5350, 0, "e"], + [5351, 0, "f"], + [5352, 0, "e"], + [5353, 0, "r"], + [5354, 0, " "], + [5355, 0, "t"], + [5356, 0, "o"], + [5357, 0, " "], + [5358, 0, "t"], + [5359, 0, "h"], + [5360, 0, "e"], + [5361, 0, " "], + [5362, 0, "h"], + [5363, 0, "e"], + [5364, 0, "a"], + [5365, 0, "d"], + [5366, 0, "."], + [5367, 0, "\n"], + [5368, 0, "\n"], + [5369, 0, "A"], + [5370, 0, " "], + [5371, 0, "f"], + [5372, 0, "e"], + [5373, 0, "w"], + [5374, 0, " "], + [5375, 0, "f"], + [5376, 0, "e"], + [5377, 0, "a"], + [5378, 0, "t"], + [5379, 0, "u"], + [5380, 0, "r"], + [5381, 0, "e"], + [5382, 0, "s"], + [5383, 0, " "], + [5384, 0, "o"], + [5385, 0, "f"], + [5386, 0, " "], + [5387, 0, "t"], + [5388, 0, "h"], + [5389, 0, "i"], + [5390, 0, "s"], + [5391, 0, " "], + [5392, 0, "l"], + [5393, 0, "a"], + [5394, 0, "n"], + [5395, 0, "g"], + [5396, 0, "u"], + [5397, 0, "a"], + [5398, 0, "g"], + [5399, 0, "e"], + [5400, 0, " "], + [5401, 0, "d"], + [5402, 0, "e"], + [5403, 0, "l"], + [5404, 0, "i"], + [5405, 0, "b"], + [5406, 0, "e"], + [5407, 0, "r"], + [5408, 0, "a"], + [5409, 0, "t"], + [5410, 0, "e"], + [5411, 0, "l"], + [5412, 0, "y"], + [5413, 0, " "], + [5414, 0, "d"], + [5415, 0, "i"], + [5416, 0, "f"], + [5417, 0, "f"], + [5418, 0, "e"], + [5419, 0, "r"], + [5420, 0, " "], + [5421, 0, "f"], + [5422, 0, "r"], + [5423, 0, "o"], + [5424, 0, "m"], + [5425, 0, " "], + [5426, 0, "m"], + [5427, 0, "o"], + [5428, 0, "s"], + [5429, 0, "t"], + [5430, 0, " "], + [5431, 0, "m"], + [5432, 0, "a"], + [5433, 0, "i"], + [5434, 0, "n"], + [5435, 0, "s"], + [5436, 0, "t"], + [5437, 0, "e"], + [5437, 1], + [5437, 0, "r"], + [5438, 0, "e"], + [5439, 0, "a"], + [5440, 0, "m"], + [5441, 0, " "], + [5442, 0, "p"], + [5443, 0, "r"], + [5444, 0, "o"], + [5445, 0, "g"], + [5446, 0, "r"], + [5447, 0, "a"], + [5448, 0, "m"], + [5449, 0, "m"], + [5450, 0, "i"], + [5451, 0, "n"], + [5452, 0, "g"], + [5453, 0, " "], + [5454, 0, "l"], + [5455, 0, "a"], + [5456, 0, "n"], + [5457, 0, "g"], + [5458, 0, "u"], + [5459, 0, "a"], + [5460, 0, "g"], + [5461, 0, "e"], + [5462, 0, "s"], + [5463, 0, ":"], + [5464, 0, " "], + [5465, 0, "t"], + [5466, 0, "h"], + [5466, 1], + [5465, 1], + [5465, 0, "k"], + [5466, 0, "e"], + [5467, 0, "y"], + [5468, 0, "s"], + [5469, 0, " "], + [5470, 0, "i"], + [5471, 0, "n"], + [5472, 0, " "], + [5473, 0, "m"], + [5474, 0, "a"], + [5475, 0, "p"], + [5476, 0, "s"], + [5477, 0, " "], + [5478, 0, "a"], + [5479, 0, "r"], + [5480, 0, "e"], + [5481, 0, " "], + [5482, 0, "i"], + [5483, 0, "m"], + [5484, 0, "p"], + [5485, 0, "l"], + [5486, 0, "i"], + [5487, 0, "c"], + [5488, 0, "i"], + [5489, 0, "t"], + [5490, 0, "l"], + [5491, 0, "y"], + [5492, 0, " "], + [5493, 0, "c"], + [5494, 0, "r"], + [5495, 0, "e"], + [5496, 0, "a"], + [5497, 0, "t"], + [5498, 0, "e"], + [5499, 0, "d"], + [5500, 0, " "], + [5501, 0, "w"], + [5502, 0, "h"], + [5503, 0, "e"], + [5504, 0, "n"], + [5505, 0, " "], + [5506, 0, "t"], + [5507, 0, "h"], + [5508, 0, "e"], + [5509, 0, "y"], + [5510, 0, " "], + [5511, 0, "a"], + [5512, 0, "r"], + [5513, 0, "e"], + [5514, 0, " "], + [5515, 0, "f"], + [5516, 0, "i"], + [5517, 0, "r"], + [5518, 0, "s"], + [5519, 0, "t"], + [5520, 0, " "], + [5521, 0, "a"], + [5522, 0, "c"], + [5523, 0, "c"], + [5524, 0, "e"], + [5525, 0, "s"], + [5526, 0, "s"], + [5527, 0, "e"], + [5528, 0, "d"], + [5529, 0, ";"], + [5530, 0, " "], + [5531, 0, "l"], + [5532, 0, "i"], + [5533, 0, "s"], + [5534, 0, "t"], + [5535, 0, "s"], + [5536, 0, " "], + [5537, 0, "c"], + [5538, 0, "a"], + [5539, 0, "n"], + [5540, 0, " "], + [5541, 0, "o"], + [5542, 0, "n"], + [5543, 0, "l"], + [5544, 0, "y"], + [5545, 0, " "], + [5546, 0, "n"], + [5546, 1], + [5546, 0, "b"], + [5547, 0, "e"], + [5548, 0, " "], + [5549, 0, "n"], + [5550, 0, "a"], + [5551, 0, "v"], + [5552, 0, "i"], + [5553, 0, "g"], + [5554, 0, "a"], + [5555, 0, "t"], + [5556, 0, "e"], + [5557, 0, "d"], + [5558, 0, " "], + [5559, 0, "b"], + [5560, 0, "y"], + [5561, 0, " "], + [5562, 0, "i"], + [5563, 0, "t"], + [5564, 0, "e"], + [5565, 0, "r"], + [5566, 0, "a"], + [5567, 0, "t"], + [5568, 0, "i"], + [5569, 0, "o"], + [5570, 0, "n"], + [5571, 0, " "], + [5572, 0, "("], + [5573, 0, "\\"], + [5574, 0, "t"], + [5575, 0, "e"], + [5576, 0, "x"], + [5577, 0, "t"], + [5578, 0, "s"], + [5579, 0, "f"], + [5580, 0, "{"], + [5581, 0, "n"], + [5582, 0, "e"], + [5583, 0, "x"], + [5584, 0, "t"], + [5585, 0, "}"], + [5586, 0, ")"], + [5587, 0, " "], + [5588, 0, "b"], + [5589, 0, "u"], + [5590, 0, "t"], + [5591, 0, " "], + [5592, 0, "n"], + [5593, 0, "o"], + [5594, 0, "t"], + [5595, 0, " "], + [5596, 0, "b"], + [5597, 0, "y"], + [5598, 0, " "], + [5599, 0, "i"], + [5600, 0, "n"], + [5601, 0, "d"], + [5602, 0, "e"], + [5603, 0, "x"], + [5604, 0, ";"], + [5605, 0, " "], + [5606, 0, "a"], + [5607, 0, "n"], + [5608, 0, "d"], + [5609, 0, " "], + [5610, 0, "t"], + [5611, 0, "h"], + [5612, 0, "e"], + [5613, 0, " "], + [5614, 0, "l"], + [5615, 0, "a"], + [5616, 0, "n"], + [5617, 0, "g"], + [5618, 0, "u"], + [5619, 0, "a"], + [5620, 0, "g"], + [5621, 0, "e"], + [5622, 0, " "], + [5623, 0, "h"], + [5624, 0, "a"], + [5625, 0, "s"], + [5626, 0, " "], + [5627, 0, "l"], + [5628, 0, "i"], + [5629, 0, "t"], + [5630, 0, "e"], + [5631, 0, "r"], + [5632, 0, "a"], + [5633, 0, "l"], + [5634, 0, "s"], + [5635, 0, " "], + [5636, 0, "f"], + [5637, 0, "o"], + [5638, 0, "r"], + [5639, 0, " "], + [5640, 0, "e"], + [5641, 0, "m"], + [5642, 0, "p"], + [5643, 0, "t"], + [5644, 0, "y"], + [5645, 0, " "], + [5646, 0, "m"], + [5647, 0, "a"], + [5648, 0, "p"], + [5649, 0, "s"], + [5650, 0, " "], + [5651, 0, "a"], + [5652, 0, "n"], + [5653, 0, "d"], + [5654, 0, " "], + [5655, 0, "l"], + [5656, 0, "i"], + [5657, 0, "s"], + [5658, 0, "t"], + [5659, 0, "s"], + [5660, 0, ","], + [5661, 0, " "], + [5662, 0, "b"], + [5663, 0, "u"], + [5664, 0, "t"], + [5665, 0, " "], + [5666, 0, "n"], + [5667, 0, "o"], + [5668, 0, "t"], + [5669, 0, " "], + [5670, 0, "f"], + [5671, 0, "o"], + [5672, 0, "r"], + [5673, 0, " "], + [5674, 0, "m"], + [5675, 0, "a"], + [5676, 0, "p"], + [5677, 0, "s"], + [5678, 0, " "], + [5678, 1], + [5678, 0, " "], + [5679, 0, "a"], + [5680, 0, "n"], + [5681, 0, "d"], + [5682, 0, " "], + [5683, 0, "l"], + [5684, 0, "i"], + [5685, 0, "s"], + [5686, 0, "t"], + [5687, 0, "s"], + [5688, 0, " "], + [5689, 0, "c"], + [5689, 1], + [5688, 1], + [5687, 1], + [5686, 1], + [5685, 1], + [5684, 1], + [5683, 1], + [5682, 1], + [5681, 1], + [5680, 1], + [5679, 1], + [5678, 1], + [5677, 1], + [5676, 1], + [5675, 1], + [5674, 1], + [5673, 1], + [5672, 1], + [5671, 1], + [5670, 1], + [5669, 1], + [5668, 1], + [5667, 1], + [5666, 1], + [5665, 1], + [5664, 1], + [5663, 1], + [5662, 1], + [5661, 1], + [5660, 1], + [5646, 0, "b"], + [5646, 1], + [5660, 0, ","], + [5661, 0, " "], + [5662, 0, "b"], + [5663, 0, "u"], + [5664, 0, "t"], + [5665, 0, " "], + [5666, 0, "n"], + [5667, 0, "o"], + [5668, 0, "t"], + [5669, 0, " "], + [5670, 0, "f"], + [5671, 0, "o"], + [5672, 0, "r"], + [5673, 0, " "], + [5674, 0, "n"], + [5675, 0, "o"], + [5676, 0, "n"], + [5677, 0, "-"], + [5678, 0, "e"], + [5679, 0, "m"], + [5680, 0, "p"], + [5681, 0, "t"], + [5682, 0, "y"], + [5683, 0, " "], + [5684, 0, "c"], + [5685, 0, "o"], + [5686, 0, "l"], + [5687, 0, "l"], + [5688, 0, "e"], + [5689, 0, "c"], + [5690, 0, "t"], + [5691, 0, "i"], + [5692, 0, "o"], + [5693, 0, "n"], + [5694, 0, "s"], + [5695, 0, "."], + [5696, 0, " "], + [5697, 0, "A"], + [5698, 0, "s"], + [5699, 0, " "], + [5700, 0, "w"], + [5701, 0, "e"], + [5702, 0, " "], + [5703, 0, "s"], + [5704, 0, "h"], + [5705, 0, "a"], + [5706, 0, "l"], + [5707, 0, "l"], + [5708, 0, " "], + [5709, 0, "s"], + [5710, 0, "e"], + [5711, 0, "e"], + [5712, 0, " "], + [5713, 0, "l"], + [5714, 0, "a"], + [5715, 0, "t"], + [5716, 0, "e"], + [5717, 0, "r"], + [5718, 0, ","], + [5719, 0, " "], + [5720, 0, "t"], + [5721, 0, "h"], + [5722, 0, "e"], + [5723, 0, "s"], + [5724, 0, "e"], + [5725, 0, " "], + [5726, 0, "f"], + [5727, 0, "e"], + [5728, 0, "a"], + [5729, 0, "t"], + [5730, 0, "u"], + [5731, 0, "r"], + [5732, 0, "e"], + [5733, 0, "s"], + [5734, 0, " "], + [5735, 0, "a"], + [5736, 0, "r"], + [5737, 0, "e"], + [5738, 0, " "], + [5739, 0, "h"], + [5740, 0, "e"], + [5741, 0, "l"], + [5742, 0, "p"], + [5743, 0, "f"], + [5744, 0, "u"], + [5745, 0, "l"], + [5746, 0, " "], + [5747, 0, "f"], + [5748, 0, "o"], + [5749, 0, "r"], + [5750, 0, " "], + [5750, 1], + [5749, 1], + [5748, 1], + [5747, 1], + [5746, 1], + [5745, 1], + [5744, 1], + [5743, 1], + [5742, 1], + [5741, 1], + [5740, 1], + [5739, 1], + [5738, 1], + [5737, 1], + [5736, 1], + [5736, 0, "r"], + [5737, 0, "e"], + [5738, 0, " "], + [5739, 0, "h"], + [5740, 0, "e"], + [5741, 0, "l"], + [5742, 0, "p"], + [5743, 0, "f"], + [5744, 0, "u"], + [5745, 0, "l"], + [5746, 0, " "], + [5747, 0, "f"], + [5748, 0, "o"], + [5749, 0, "r"], + [5750, 0, " "], + [5751, 0, "d"], + [5752, 0, "e"], + [5752, 1], + [5751, 1], + [5751, 0, "a"], + [5752, 0, "c"], + [5753, 0, "h"], + [5754, 0, "i"], + [5755, 0, "e"], + [5756, 0, "v"], + [5757, 0, "i"], + [5758, 0, "n"], + [5759, 0, "g"], + [5760, 0, " "], + [5761, 0, "d"], + [5762, 0, "e"], + [5763, 0, "s"], + [5764, 0, "i"], + [5765, 0, "r"], + [5766, 0, "a"], + [5767, 0, "b"], + [5768, 0, "l"], + [5769, 0, "e"], + [5770, 0, " "], + [5771, 0, "s"], + [5772, 0, "e"], + [5773, 0, "m"], + [5774, 0, "a"], + [5775, 0, "n"], + [5776, 0, "t"], + [5777, 0, "i"], + [5778, 0, "c"], + [5779, 0, "s"], + [5780, 0, " "], + [5781, 0, "i"], + [5782, 0, "n"], + [5783, 0, " "], + [5784, 0, "t"], + [5785, 0, "h"], + [5786, 0, "e"], + [5787, 0, " "], + [5788, 0, "p"], + [5789, 0, "r"], + [5790, 0, "e"], + [5791, 0, "s"], + [5792, 0, "e"], + [5793, 0, "n"], + [5794, 0, "c"], + [5795, 0, "e"], + [5796, 0, " "], + [5797, 0, "o"], + [5798, 0, "f"], + [5799, 0, " "], + [5800, 0, "c"], + [5801, 0, "o"], + [5802, 0, "n"], + [5803, 0, "c"], + [5804, 0, "u"], + [5805, 0, "r"], + [5806, 0, "r"], + [5807, 0, "e"], + [5808, 0, "n"], + [5809, 0, "t"], + [5810, 0, " "], + [5811, 0, "m"], + [5812, 0, "o"], + [5813, 0, "d"], + [5814, 0, "i"], + [5815, 0, "f"], + [5816, 0, "i"], + [5817, 0, "c"], + [5818, 0, "a"], + [5819, 0, "t"], + [5820, 0, "i"], + [5821, 0, "o"], + [5822, 0, "n"], + [5823, 0, "s"], + [5824, 0, "."], + [5639, 0, " "], + [5640, 0, "c"], + [5641, 0, "r"], + [5642, 0, "e"], + [5643, 0, "a"], + [5644, 0, "t"], + [5645, 0, "i"], + [5646, 0, "n"], + [5647, 0, "g"], + [5834, 0, "\n"], + [5835, 0, "\n"], + [5836, 0, "\\"], + [5837, 0, "s"], + [5838, 0, "u"], + [5839, 0, "b"], + [5840, 0, "s"], + [5841, 0, "u"], + [5842, 0, "b"], + [5843, 0, "s"], + [5844, 0, "e"], + [5845, 0, "c"], + [5846, 0, "t"], + [5847, 0, "i"], + [5848, 0, "o"], + [5849, 0, "n"], + [5850, 0, "{"], + [5851, 0, "O"], + [5852, 0, "p"], + [5853, 0, "e"], + [5854, 0, "r"], + [5855, 0, "a"], + [5856, 0, "t"], + [5857, 0, "i"], + [5858, 0, "o"], + [5859, 0, "n"], + [5860, 0, "a"], + [5861, 0, "l"], + [5862, 0, " "], + [5863, 0, "s"], + [5864, 0, "e"], + [5865, 0, "m"], + [5866, 0, "a"], + [5867, 0, "n"], + [5868, 0, "t"], + [5869, 0, "i"], + [5870, 0, "c"], + [5871, 0, "s"], + [5872, 0, " "], + [5873, 0, "o"], + [5874, 0, "f"], + [5875, 0, " "], + [5876, 0, "c"], + [5877, 0, "o"], + [5878, 0, "m"], + [5879, 0, "m"], + [5880, 0, "a"], + [5881, 0, "n"], + [5882, 0, "d"], + [5883, 0, " "], + [5884, 0, "l"], + [5885, 0, "a"], + [5886, 0, "n"], + [5887, 0, "g"], + [5888, 0, "u"], + [5889, 0, "a"], + [5890, 0, "g"], + [5891, 0, "e"], + [5892, 0, "}"], + [2771, 1], + [2770, 1], + [2769, 1], + [2768, 1], + [2768, 0, "i"], + [2769, 0, "t"], + [2770, 0, "e"], + [2771, 0, "r"], + [2290, 0, "\n"], + [2291, 0, "&"], + [2292, 0, " "], + [2293, 0, "$"], + [2294, 0, "|"], + [2295, 0, "$"], + [2296, 0, " "], + [2297, 0, "&"], + [2298, 0, " "], + [2299, 0, "E"], + [2300, 0, "X"], + [2301, 0, "P"], + [2302, 0, "R"], + [2303, 0, "."], + [2304, 0, "\\"], + [2305, 0, "t"], + [2306, 0, "e"], + [2307, 0, "x"], + [2308, 0, "t"], + [2309, 0, "s"], + [2310, 0, "f"], + [2311, 0, "{"], + [2312, 0, "i"], + [2313, 0, "t"], + [2314, 0, "e"], + [2315, 0, "r"], + [2316, 0, "}"], + [2317, 0, " "], + [2318, 0, "\\"], + [2319, 0, "\\"], + [3986, 0, "\\"], + [3987, 0, "t"], + [3988, 0, "e"], + [3989, 0, "x"], + [3990, 0, "t"], + [3991, 0, "s"], + [3992, 0, "f"], + [3993, 0, "{"], + [3994, 0, "i"], + [3995, 0, "t"], + [3996, 0, "e"], + [3997, 0, "r"], + [3998, 0, "}"], + [3999, 0, " "], + [4000, 0, "s"], + [4001, 0, "t"], + [4002, 0, "a"], + [4003, 0, "r"], + [4004, 0, "t"], + [4005, 0, "s"], + [4006, 0, " "], + [4007, 0, "i"], + [4008, 0, "t"], + [4009, 0, "e"], + [4010, 0, "r"], + [4011, 0, "a"], + [4012, 0, "t"], + [4013, 0, "i"], + [4014, 0, "n"], + [4015, 0, "g"], + [4016, 0, " "], + [4017, 0, "o"], + [4018, 0, "v"], + [4019, 0, "e"], + [4020, 0, "r"], + [4021, 0, " "], + [4022, 0, "a"], + [4023, 0, "n"], + [4024, 0, " "], + [4025, 0, "o"], + [4026, 0, "r"], + [4027, 0, "d"], + [4028, 0, "e"], + [4029, 0, "r"], + [4030, 0, "e"], + [4031, 0, "d"], + [4032, 0, " "], + [4033, 0, "l"], + [4034, 0, "i"], + [4035, 0, "s"], + [4036, 0, "t"], + [4037, 0, ","], + [4038, 0, " "], + [5014, 1], + [5013, 1], + [5012, 1], + [5011, 1], + [5011, 0, "i"], + [5012, 0, "t"], + [5013, 0, "e"], + [5014, 0, "r"], + [5977, 0, "\n"], + [5978, 0, "\n"], + [5978, 0, "\\"], + [5979, 0, "b"], + [5980, 0, "e"], + [5981, 0, "g"], + [5982, 0, "i"], + [5983, 0, "n"], + [5984, 0, "{"], + [5985, 0, "f"], + [5986, 0, "i"], + [5987, 0, "g"], + [5988, 0, "u"], + [5989, 0, "r"], + [5990, 0, "e"], + [5991, 0, "*"], + [5992, 0, "}"], + [5993, 0, "\n"], + [5994, 0, "\\"], + [5995, 0, "e"], + [5996, 0, "n"], + [5997, 0, "d"], + [5998, 0, "{"], + [5999, 0, "f"], + [6000, 0, "i"], + [6001, 0, "g"], + [6002, 0, "u"], + [6003, 0, "r"], + [6004, 0, "e"], + [6005, 0, "*"], + [6006, 0, "}"], + [5993, 0, "\n"], + [5994, 0, "\\"], + [5995, 0, "c"], + [5996, 0, "e"], + [5997, 0, "n"], + [5998, 0, "t"], + [5999, 0, "e"], + [6000, 0, "r"], + [6001, 0, "i"], + [6002, 0, "n"], + [6003, 0, "g"], + [6004, 0, "\n"], + [6005, 0, "\\"], + [6006, 0, "c"], + [6007, 0, "a"], + [6008, 0, "p"], + [6009, 0, "t"], + [6010, 0, "i"], + [6011, 0, "o"], + [6012, 0, "n"], + [6013, 0, "{"], + [6014, 0, "R"], + [6015, 0, "u"], + [6016, 0, "l"], + [6017, 0, "e"], + [6018, 0, "s"], + [6019, 0, " "], + [6020, 0, "f"], + [6021, 0, "o"], + [6022, 0, "r"], + [6023, 0, " "], + [6024, 0, "e"], + [6025, 0, "v"], + [6026, 0, "a"], + [6027, 0, "l"], + [6028, 0, "u"], + [6029, 0, "a"], + [6030, 0, "t"], + [6031, 0, "i"], + [6032, 0, "n"], + [6033, 0, "g"], + [6034, 0, " "], + [6035, 0, "a"], + [6036, 0, "n"], + [6037, 0, " "], + [6038, 0, "e"], + [6039, 0, "x"], + [6040, 0, "p"], + [6041, 0, "r"], + [6042, 0, "e"], + [6043, 0, "s"], + [6044, 0, "s"], + [6045, 0, "i"], + [6046, 0, "o"], + [6047, 0, "n"], + [6048, 0, " "], + [6049, 0, "t"], + [6050, 0, "o"], + [6051, 0, " "], + [6052, 0, "o"], + [6053, 0, "b"], + [6054, 0, "t"], + [6055, 0, "a"], + [6056, 0, "i"], + [6057, 0, "n"], + [6058, 0, " "], + [6059, 0, "a"], + [6060, 0, " "], + [6061, 0, "c"], + [6062, 0, "u"], + [6063, 0, "r"], + [6064, 0, "s"], + [6065, 0, "o"], + [6066, 0, "r"], + [6067, 0, "}"], + [6068, 0, "\\"], + [6069, 0, "l"], + [6070, 0, "a"], + [6071, 0, "b"], + [6072, 0, "e"], + [6073, 0, "l"], + [6074, 0, "{"], + [6075, 0, "f"], + [6076, 0, "i"], + [6077, 0, "g"], + [6078, 0, ":"], + [6079, 0, "c"], + [6079, 1], + [6079, 0, "e"], + [6080, 0, "x"], + [6081, 0, "p"], + [6082, 0, "r"], + [6083, 0, "-"], + [6084, 0, "r"], + [6085, 0, "u"], + [6086, 0, "l"], + [6087, 0, "e"], + [6088, 0, "s"], + [6089, 0, "}"], + [6004, 0, "\n"], + [6005, 0, "\\"], + [6006, 0, "A"], + [6007, 0, "x"], + [6008, 0, "i"], + [6009, 0, "o"], + [6010, 0, "m"], + [6011, 0, "C"], + [6012, 0, "{"], + [6013, 0, "$"], + [6014, 0, "\\"], + [6015, 0, "a"], + [6015, 1], + [6015, 0, "m"], + [6016, 0, "a"], + [6017, 0, "t"], + [6018, 0, "h"], + [6019, 0, "i"], + [6020, 0, "t"], + [6021, 0, "{"], + [6022, 0, "c"], + [6023, 0, "m"], + [6024, 0, "d"], + [6025, 0, "}"], + [6026, 0, "_"], + [6027, 0, "1"], + [6028, 0, " "], + [6029, 0, "\\"], + [6030, 0, "m"], + [6031, 0, "a"], + [6032, 0, "t"], + [6033, 0, "h"], + [6034, 0, "b"], + [6035, 0, "i"], + [6036, 0, "n"], + [6037, 0, "{"], + [6038, 0, ":"], + [6039, 0, "}"], + [6040, 0, " "], + [6041, 0, "\\"], + [6042, 0, "m"], + [6043, 0, "a"], + [6044, 0, "t"], + [6045, 0, "h"], + [6046, 0, "r"], + [6047, 0, "m"], + [6048, 0, "{"], + [6049, 0, "C"], + [6050, 0, "M"], + [6051, 0, "D"], + [6052, 0, "}"], + [6053, 0, "$"], + [6054, 0, "}"], + [6055, 0, "\n"], + [6056, 0, "\\"], + [6057, 0, "A"], + [6058, 0, "x"], + [6059, 0, "i"], + [6060, 0, "o"], + [6061, 0, "m"], + [6062, 0, "C"], + [6063, 0, "{"], + [6064, 0, "$"], + [6065, 0, "A"], + [6066, 0, "_"], + [6067, 0, "p"], + [6068, 0, ","], + [6069, 0, "\\"], + [6070, 0, ","], + [6071, 0, " "], + [6072, 0, "\\"], + [6073, 0, "m"], + [6074, 0, "a"], + [6075, 0, "t"], + [6076, 0, "h"], + [6077, 0, "i"], + [6078, 0, "t"], + [6079, 0, "{"], + [6080, 0, "c"], + [6081, 0, "m"], + [6082, 0, "d"], + [6083, 0, "}"], + [6084, 0, "_"], + [6085, 0, "1"], + [6072, 0, "<"], + [6072, 1], + [6072, 0, "\\"], + [6073, 0, "l"], + [6074, 0, "a"], + [6075, 0, "n"], + [6076, 0, "g"], + [6077, 0, "l"], + [6078, 0, "e"], + [6093, 0, " "], + [6094, 0, "\\"], + [6095, 0, "m"], + [6096, 0, "a"], + [6097, 0, "t"], + [6098, 0, "h"], + [6099, 0, "b"], + [6100, 0, "i"], + [6101, 0, "n"], + [6102, 0, "{"], + [6103, 0, ";"], + [6104, 0, "}"], + [6105, 0, " "], + [6106, 0, "\\"], + [6107, 0, "m"], + [6108, 0, "a"], + [6109, 0, "t"], + [6110, 0, "h"], + [6111, 0, "i"], + [6112, 0, "t"], + [6079, 0, " "], + [6114, 0, "{"], + [6115, 0, "c"], + [6116, 0, "m"], + [6117, 0, "d"], + [6118, 0, "}"], + [6119, 0, "_"], + [6120, 0, "2"], + [6121, 0, " "], + [6122, 0, "\\"], + [6123, 0, "m"], + [6124, 0, "a"], + [6125, 0, "t"], + [6126, 0, "h"], + [6127, 0, "b"], + [6128, 0, "i"], + [6129, 0, "n"], + [6130, 0, "{"], + [6131, 0, ";"], + [6132, 0, "}"], + [6133, 0, " "], + [6134, 0, "\\"], + [6135, 0, "d"], + [6136, 0, "o"], + [6137, 0, "t"], + [6138, 0, "s"], + [6139, 0, " "], + [6140, 0, "\\"], + [6141, 0, "r"], + [6142, 0, "a"], + [6143, 0, "n"], + [6144, 0, "g"], + [6145, 0, "l"], + [6146, 0, "e"], + [6062, 1], + [6061, 1], + [6060, 1], + [6059, 1], + [6058, 1], + [6057, 1], + [6057, 0, "B"], + [6058, 0, "i"], + [6059, 0, "n"], + [6060, 0, "a"], + [6061, 0, "r"], + [6062, 0, "y"], + [6063, 0, "I"], + [6064, 0, "n"], + [6065, 0, "f"], + [6066, 0, "C"], + [6055, 0, "\n"], + [6056, 0, "\\"], + [6057, 0, "L"], + [6058, 0, "e"], + [6059, 0, "f"], + [6060, 0, "t"], + [6061, 0, "L"], + [6062, 0, "a"], + [6063, 0, "b"], + [6064, 0, "e"], + [6065, 0, "l"], + [6066, 0, "{"], + [6067, 0, "\\"], + [6068, 0, "t"], + [6069, 0, "e"], + [6070, 0, "x"], + [6071, 0, "t"], + [6072, 0, "s"], + [6073, 0, "c"], + [6074, 0, "{"], + [6075, 0, "E"], + [6076, 0, "x"], + [6077, 0, "e"], + [6078, 0, "c"], + [6079, 0, "}"], + [6080, 0, "}"], + [6055, 0, "\n"], + [6056, 0, "\\"], + [6057, 0, "E"], + [6057, 1], + [6057, 0, "A"], + [6058, 0, "x"], + [6059, 0, "i"], + [6060, 0, "o"], + [6061, 0, "m"], + [6062, 0, "C"], + [6063, 0, "{"], + [6064, 0, "$"], + [6065, 0, "A"], + [6066, 0, "_"], + [6067, 0, "p"], + [6068, 0, ","], + [6069, 0, "\\"], + [6070, 0, ","], + [6071, 0, " "], + [6072, 0, "\\"], + [6073, 0, "m"], + [6074, 0, "a"], + [6075, 0, "t"], + [6076, 0, "h"], + [6077, 0, "i"], + [6078, 0, "t"], + [6079, 0, "{"], + [6080, 0, "c"], + [6081, 0, "m"], + [6082, 0, "d"], + [6083, 0, "}"], + [6084, 0, "_"], + [6085, 0, "1"], + [6086, 0, " "], + [6087, 0, "\\"], + [6088, 0, "e"], + [6089, 0, "v"], + [6090, 0, "a"], + [6091, 0, "l"], + [6092, 0, "t"], + [6093, 0, "o"], + [6094, 0, " "], + [6095, 0, "A"], + [6096, 0, "_"], + [6097, 0, "p"], + [6098, 0, "'"], + [6099, 0, "$"], + [6100, 0, "}"], + [6223, 0, "\n"], + [6224, 0, " "], + [6225, 0, " "], + [6226, 0, " "], + [6227, 0, " "], + [6228, 0, "\\"], + [6229, 0, "e"], + [6230, 0, "v"], + [6231, 0, "a"], + [6232, 0, "l"], + [6233, 0, "t"], + [6234, 0, "o"], + [6235, 0, " "], + [6236, 0, "A"], + [6237, 0, "_"], + [6238, 0, "p"], + [6239, 0, "'"], + [6240, 0, ","], + [6241, 0, " "], + [6241, 1], + [6241, 0, "\\"], + [6242, 0, ","], + [6243, 0, " "], + [6244, 0, "\\"], + [6245, 0, "l"], + [6246, 0, "a"], + [6247, 0, "n"], + [6248, 0, "g"], + [6249, 0, "l"], + [6250, 0, "e"], + [6251, 0, " "], + [6252, 0, "\\"], + [6253, 0, "m"], + [6254, 0, "a"], + [6255, 0, "t"], + [6256, 0, "h"], + [6257, 0, "i"], + [6258, 0, "t"], + [6259, 0, "{"], + [6260, 0, "c"], + [6261, 0, "m"], + [6262, 0, "d"], + [6263, 0, "}"], + [6264, 0, "_"], + [6265, 0, "2"], + [6266, 0, " "], + [6267, 0, "\\"], + [6268, 0, "m"], + [6269, 0, "a"], + [6270, 0, "t"], + [6271, 0, "h"], + [6272, 0, "b"], + [6273, 0, "i"], + [6274, 0, "n"], + [6275, 0, "{"], + [6276, 0, ";"], + [6277, 0, "}"], + [6278, 0, " "], + [6279, 0, "\\"], + [6280, 0, "d"], + [6281, 0, "o"], + [6282, 0, "t"], + [6283, 0, "s"], + [6284, 0, " "], + [6285, 0, "\\"], + [6286, 0, "r"], + [6287, 0, "a"], + [6288, 0, "n"], + [6289, 0, "g"], + [6290, 0, "l"], + [6291, 0, "e"], + [6292, 0, "$"], + [6293, 0, "}"], + [6294, 0, "\n"], + [6295, 0, "\\"], + [6296, 0, "D"], + [6297, 0, "i"], + [6298, 0, "s"], + [6299, 0, "p"], + [6300, 0, "l"], + [6301, 0, "a"], + [6302, 0, "y"], + [6303, 0, "P"], + [6304, 0, "r"], + [6305, 0, "o"], + [6306, 0, "o"], + [6307, 0, "f"], + [6308, 0, "\\"], + [6309, 0, "h"], + [6310, 0, "f"], + [6311, 0, "i"], + [6312, 0, "l"], + [6313, 0, "l"], + [6314, 0, "\n"], + [6315, 0, "%"], + [6316, 0, "\n"], + [6317, 0, "\\"], + [6318, 0, "A"], + [6319, 0, "x"], + [6320, 0, "i"], + [6321, 0, "o"], + [6322, 0, "m"], + [6323, 0, "C"], + [6324, 0, "{"], + [6325, 0, "}"], + [6326, 0, "\n"], + [6327, 0, "\\"], + [6328, 0, "L"], + [6329, 0, "e"], + [6330, 0, "f"], + [6331, 0, "t"], + [6332, 0, "L"], + [6333, 0, "a"], + [6334, 0, "b"], + [6335, 0, "e"], + [6336, 0, "l"], + [6337, 0, "{"], + [6338, 0, "\\"], + [6339, 0, "t"], + [6340, 0, "e"], + [6341, 0, "x"], + [6342, 0, "t"], + [6343, 0, "s"], + [6344, 0, "c"], + [6345, 0, "{"], + [6346, 0, "D"], + [6347, 0, "o"], + [6348, 0, "c"], + [6349, 0, "}"], + [6350, 0, "}"], + [6351, 0, "\n"], + [6352, 0, "\\"], + [6353, 0, "U"], + [6354, 0, "n"], + [6355, 0, "a"], + [6356, 0, "r"], + [6357, 0, "y"], + [6358, 0, "I"], + [6359, 0, "n"], + [6360, 0, "f"], + [6361, 0, "C"], + [6362, 0, "{"], + [6363, 0, "$"], + [6364, 0, "A"], + [6365, 0, "_"], + [6366, 0, "p"], + [6367, 0, ","], + [6368, 0, "\\"], + [6369, 0, ","], + [6370, 0, " "], + [6371, 0, "\\"], + [6372, 0, "m"], + [6373, 0, "a"], + [6374, 0, "t"], + [6375, 0, "h"], + [6376, 0, "s"], + [6377, 0, "f"], + [6378, 0, "{"], + [6379, 0, "d"], + [6380, 0, "o"], + [6381, 0, "c"], + [6382, 0, "}"], + [6383, 0, " "], + [6384, 0, "\\"], + [6385, 0, "e"], + [6386, 0, "v"], + [6387, 0, "a"], + [6388, 0, "l"], + [6389, 0, "t"], + [6390, 0, "o"], + [6391, 0, " "], + [6392, 0, "\\"], + [6393, 0, "m"], + [6394, 0, "a"], + [6395, 0, "t"], + [6396, 0, "h"], + [6397, 0, "s"], + [6398, 0, "f"], + [6399, 0, "{"], + [6400, 0, "c"], + [6401, 0, "u"], + [6402, 0, "r"], + [6403, 0, "s"], + [6404, 0, "o"], + [6405, 0, "r"], + [6406, 0, "}"], + [6407, 0, "("], + [6408, 0, "\\"], + [6409, 0, "l"], + [6410, 0, "a"], + [6411, 0, "n"], + [6412, 0, "g"], + [6413, 0, "l"], + [6414, 0, "e"], + [6415, 0, "\\"], + [6416, 0, "r"], + [6417, 0, "a"], + [6418, 0, "n"], + [6419, 0, "g"], + [6420, 0, "l"], + [6421, 0, "e"], + [6422, 0, ","], + [6423, 0, " "], + [6424, 0, "\\"], + [6425, 0, "m"], + [6426, 0, "a"], + [6427, 0, "t"], + [6428, 0, "h"], + [6429, 0, "s"], + [6430, 0, "f"], + [6431, 0, "{"], + [6432, 0, "d"], + [6433, 0, "o"], + [6434, 0, "c"], + [6435, 0, "}"], + [6436, 0, ")"], + [6437, 0, "$"], + [6438, 0, "}"], + [6439, 0, "\n"], + [6440, 0, "D"], + [6441, 0, "i"], + [6441, 1], + [6440, 1], + [6440, 0, "\\"], + [6441, 0, "D"], + [6442, 0, "i"], + [6443, 0, "s"], + [6444, 0, "p"], + [6445, 0, "l"], + [6446, 0, "a"], + [6447, 0, "y"], + [6448, 0, "P"], + [6449, 0, "r"], + [6450, 0, "o"], + [6451, 0, "o"], + [6452, 0, "f"], + [6453, 0, "\\"], + [6454, 0, "p"], + [6455, 0, "r"], + [6456, 0, "o"], + [6457, 0, "o"], + [6458, 0, "f"], + [6459, 0, "S"], + [6460, 0, "k"], + [6461, 0, "i"], + [6462, 0, "p"], + [6463, 0, "A"], + [6464, 0, "m"], + [6465, 0, "o"], + [6466, 0, "u"], + [6467, 0, "n"], + [6468, 0, "t"], + [6469, 0, "\n"], + [6470, 0, "\n"], + [6471, 0, "\\"], + [6472, 0, "A"], + [6473, 0, "x"], + [6474, 0, "i"], + [6475, 0, "o"], + [6476, 0, "m"], + [6477, 0, "C"], + [6478, 0, "{"], + [6479, 0, "$"], + [6480, 0, "\\"], + [6480, 1], + [6480, 0, "A"], + [6481, 0, "_"], + [6482, 0, "p"], + [6483, 0, ","], + [6484, 0, "\\"], + [6485, 0, ","], + [6486, 0, " "], + [6487, 0, "\\"], + [6488, 0, "m"], + [6489, 0, "a"], + [6490, 0, "t"], + [6491, 0, "h"], + [6492, 0, "i"], + [6493, 0, "t"], + [6494, 0, "{"], + [6495, 0, "e"], + [6496, 0, "x"], + [6497, 0, "p"], + [6498, 0, "r"], + [6499, 0, "}"], + [6500, 0, " "], + [6501, 0, "\\"], + [6502, 0, "e"], + [6503, 0, "v"], + [6504, 0, "a"], + [6505, 0, "l"], + [6506, 0, "t"], + [6507, 0, "o"], + [6508, 0, " "], + [6509, 0, "\\"], + [6510, 0, "m"], + [6511, 0, "a"], + [6512, 0, "t"], + [6513, 0, "h"], + [6514, 0, "i"], + [6515, 0, "t"], + [6516, 0, "{"], + [6517, 0, "c"], + [6518, 0, "u"], + [6519, 0, "r"], + [6520, 0, "}"], + [6521, 0, "$"], + [6522, 0, "}"], + [6523, 0, "\n"], + [6524, 0, "\\"], + [6525, 0, "L"], + [6526, 0, "e"], + [6527, 0, "f"], + [6528, 0, "t"], + [6529, 0, "L"], + [6530, 0, "a"], + [6531, 0, "b"], + [6532, 0, "e"], + [6533, 0, "l"], + [6534, 0, "{"], + [6535, 0, "\\"], + [6536, 0, "t"], + [6537, 0, "e"], + [6538, 0, "x"], + [6539, 0, "t"], + [6540, 0, "s"], + [6541, 0, "c"], + [6542, 0, "{"], + [6543, 0, "L"], + [6544, 0, "e"], + [6545, 0, "t"], + [6546, 0, "}"], + [6547, 0, "}"], + [6548, 0, "\n"], + [6549, 0, "\\"], + [6550, 0, "U"], + [6551, 0, "n"], + [6552, 0, "a"], + [6553, 0, "r"], + [6554, 0, "y"], + [6555, 0, "I"], + [6556, 0, "n"], + [6557, 0, "f"], + [6558, 0, "C"], + [6559, 0, "{"], + [6560, 0, "$"], + [6561, 0, "A"], + [6562, 0, "_"], + [6563, 0, "p"], + [6564, 0, ","], + [6565, 0, "\\"], + [6566, 0, ","], + [6567, 0, " "], + [6568, 0, "\\"], + [6569, 0, "m"], + [6570, 0, "a"], + [6571, 0, "t"], + [6572, 0, "h"], + [6573, 0, "s"], + [6574, 0, "f"], + [6575, 0, "{"], + [6576, 0, "l"], + [6577, 0, "e"], + [6578, 0, "t"], + [6579, 0, "}"], + [6580, 0, " "], + [6581, 0, "x"], + [6582, 0, " "], + [6583, 0, "="], + [6584, 0, " "], + [6585, 0, "\\"], + [6586, 0, "m"], + [6587, 0, "a"], + [6588, 0, "t"], + [6589, 0, "h"], + [6590, 0, "i"], + [6591, 0, "t"], + [6592, 0, "{"], + [6593, 0, "e"], + [6594, 0, "x"], + [6595, 0, "p"], + [6596, 0, "r"], + [6597, 0, "}"], + [6598, 0, " "], + [6599, 0, "\\"], + [6600, 0, "e"], + [6601, 0, "v"], + [6602, 0, "a"], + [6603, 0, "l"], + [6604, 0, "t"], + [6605, 0, "o"], + [6606, 0, " "], + [6607, 0, "A"], + [6608, 0, "_"], + [6609, 0, "p"], + [6610, 0, "["], + [6611, 0, "\\"], + [6612, 0, ","], + [6613, 0, "x"], + [6614, 0, " "], + [6615, 0, "\\"], + [6616, 0, "m"], + [6617, 0, "a"], + [6618, 0, "p"], + [6619, 0, "s"], + [6620, 0, "t"], + [6621, 0, "o"], + [6622, 0, " "], + [6615, 0, "\\"], + [6616, 0, ","], + [6624, 1], + [6624, 0, "\\"], + [6625, 0, ","], + [6626, 0, " "], + [6627, 0, "\\"], + [6628, 0, "m"], + [6629, 0, "a"], + [6630, 0, "t"], + [6631, 0, "h"], + [6632, 0, "i"], + [6633, 0, "t"], + [6634, 0, "{"], + [6635, 0, "c"], + [6636, 0, "u"], + [6637, 0, "r"], + [6638, 0, "}"], + [6639, 0, "\\"], + [6640, 0, ","], + [6641, 0, "]"], + [6642, 0, "$"], + [6643, 0, "}"], + [6644, 0, "\n"], + [6645, 0, "\\"], + [6646, 0, "D"], + [6647, 0, "i"], + [6648, 0, "s"], + [6649, 0, "p"], + [6650, 0, "l"], + [6651, 0, "a"], + [6652, 0, "y"], + [6653, 0, "P"], + [6654, 0, "r"], + [6655, 0, "o"], + [6656, 0, "o"], + [6657, 0, "f"], + [6658, 0, "\\"], + [6659, 0, "h"], + [6660, 0, "f"], + [6661, 0, "i"], + [6662, 0, "l"], + [6663, 0, "l"], + [6664, 0, "\n"], + [6665, 0, "%"], + [6666, 0, "\n"], + [6667, 0, "\\"], + [6668, 0, "A"], + [6669, 0, "x"], + [6670, 0, "i"], + [6671, 0, "o"], + [6672, 0, "m"], + [6673, 0, "C"], + [6674, 0, "{"], + [6675, 0, "$"], + [6676, 0, "x"], + [6677, 0, " "], + [6678, 0, "\\"], + [6679, 0, "i"], + [6680, 0, "n"], + [6681, 0, " "], + [6682, 0, "\\"], + [6683, 0, "m"], + [6684, 0, "a"], + [6685, 0, "t"], + [6686, 0, "h"], + [6687, 0, "r"], + [6688, 0, "m"], + [6689, 0, "{"], + [6690, 0, "d"], + [6691, 0, "o"], + [6692, 0, "m"], + [6693, 0, "}"], + [6694, 0, "("], + [6695, 0, "A"], + [6696, 0, "_"], + [6697, 0, "p"], + [6698, 0, ")"], + [6699, 0, "$"], + [6700, 0, "}"], + [6701, 0, "\n"], + [6702, 0, "\\"], + [6703, 0, "A"], + [6704, 0, "x"], + [6705, 0, "i"], + [6706, 0, "o"], + [6707, 0, "m"], + [6708, 0, "C"], + [6709, 0, "{"], + [6710, 0, "$"], + [6711, 0, "%"], + [6711, 1], + [6710, 1], + [6709, 1], + [6708, 1], + [6707, 1], + [6706, 1], + [6705, 1], + [6704, 1], + [6703, 1], + [6703, 0, "L"], + [6704, 0, "e"], + [6705, 0, "f"], + [6706, 0, "t"], + [6707, 0, "L"], + [6708, 0, "a"], + [6709, 0, "b"], + [6710, 0, "e"], + [6711, 0, "l"], + [6712, 0, "{"], + [6713, 0, "|"], + [6714, 0, "t"], + [6715, 0, "e"], + [6715, 1], + [6714, 1], + [6713, 1], + [6713, 0, "\\"], + [6714, 0, "t"], + [6715, 0, "e"], + [6716, 0, "x"], + [6717, 0, "t"], + [6718, 0, "s"], + [6719, 0, "c"], + [6720, 0, "{"], + [6721, 0, "V"], + [6722, 0, "a"], + [6723, 0, "r"], + [6724, 0, "}"], + [6725, 0, "}"], + [6726, 0, "\n"], + [6727, 0, "\\"], + [6728, 0, "U"], + [6729, 0, "n"], + [6730, 0, "a"], + [6731, 0, "r"], + [6732, 0, "y"], + [6733, 0, "I"], + [6734, 0, "n"], + [6735, 0, "f"], + [6736, 0, "C"], + [6737, 0, "{"], + [6738, 0, "$"], + [6739, 0, "A"], + [6740, 0, "_"], + [6741, 0, "p"], + [6742, 0, ","], + [6743, 0, "\\"], + [6744, 0, ","], + [6745, 0, " "], + [6746, 0, "x"], + [6747, 0, " "], + [6748, 0, "\\"], + [6749, 0, "e"], + [6750, 0, "v"], + [6751, 0, "a"], + [6752, 0, "l"], + [6753, 0, "t"], + [6754, 0, "o"], + [6755, 0, " "], + [6756, 0, "A"], + [6757, 0, "_"], + [6758, 0, "p"], + [6759, 0, "("], + [6760, 0, "x"], + [6761, 0, ")"], + [6762, 0, "$"], + [6763, 0, "}"], + [6764, 0, "\n"], + [6765, 0, "\\"], + [6766, 0, "D"], + [6767, 0, "I"], + [6768, 0, "S"], + [6769, 0, "P"], + [6770, 0, "L"], + [6771, 0, "A"], + [6772, 0, "Y"], + [6773, 0, "P"], + [6774, 0, "R"], + [6775, 0, "O"], + [6776, 0, "O"], + [6777, 0, "F"], + [6777, 1], + [6776, 1], + [6775, 1], + [6774, 1], + [6773, 1], + [6772, 1], + [6771, 1], + [6770, 1], + [6769, 1], + [6768, 1], + [6767, 1], + [6767, 0, "i"], + [6768, 0, "s"], + [6769, 0, "p"], + [6770, 0, "l"], + [6771, 0, "a"], + [6772, 0, "y"], + [6773, 0, "P"], + [6774, 0, "r"], + [6775, 0, "o"], + [6776, 0, "o"], + [6777, 0, "f"], + [6778, 0, "\\"], + [6779, 0, "h"], + [6779, 1], + [6779, 0, "p"], + [6780, 0, "r"], + [6781, 0, "o"], + [6782, 0, "o"], + [6783, 0, "f"], + [6784, 0, "S"], + [6785, 0, "k"], + [6786, 0, "i"], + [6787, 0, "p"], + [6788, 0, "A"], + [6789, 0, "M"], + [6790, 0, "o"], + [6791, 0, "u"], + [6792, 0, "n"], + [6793, 0, "t"], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6789, 0, "m"], + [6790, 0, "o"], + [6791, 0, "u"], + [6792, 0, "n"], + [6793, 0, "t"], + [6313, 1], + [6312, 1], + [6311, 1], + [6310, 1], + [6310, 0, "s"], + [6311, 0, "p"], + [6312, 0, "a"], + [6313, 0, "c"], + [6314, 0, "e"], + [6315, 0, "{"], + [6316, 0, "6"], + [6317, 0, "e"], + [6318, 0, "m"], + [6319, 0, "}"], + [6669, 1], + [6668, 1], + [6667, 1], + [6666, 1], + [6666, 0, "s"], + [6667, 0, "p"], + [6668, 0, "a"], + [6669, 0, "c"], + [6670, 0, "e"], + [6671, 0, "{"], + [6672, 0, "6"], + [6673, 0, "e"], + [6674, 0, "m"], + [6675, 0, "}"], + [6477, 0, "\\"], + [6478, 0, "p"], + [6479, 0, "r"], + [6480, 0, "o"], + [6481, 0, "o"], + [6482, 0, "f"], + [6483, 0, "S"], + [6484, 0, "k"], + [6485, 0, "i"], + [6486, 0, "p"], + [6487, 0, "A"], + [6488, 0, "m"], + [6489, 0, "o"], + [6490, 0, "u"], + [6491, 0, "n"], + [6492, 0, "t"], + [6602, 0, "\\"], + [6603, 0, ";"], + [6429, 0, "\\"], + [6430, 0, ","], + [6316, 1], + [6316, 0, "4"], + [6692, 1], + [6692, 0, "3"], + [6826, 0, "\n"], + [6827, 0, "\n"], + [6828, 0, "\\"], + [6829, 0, "b"], + [6830, 0, "e"], + [6831, 0, "g"], + [6832, 0, "i"], + [6833, 0, "n"], + [6834, 0, "{"], + [6835, 0, "r"], + [6835, 1], + [6835, 0, "p"], + [6836, 0, "r"], + [6837, 0, "o"], + [6838, 0, "o"], + [6839, 0, "f"], + [6840, 0, "t"], + [6841, 0, "r"], + [6842, 0, "e"], + [6843, 0, "e"], + [6844, 0, "}"], + [6845, 0, "\n"], + [6846, 0, "\\"], + [6847, 0, "e"], + [6848, 0, "n"], + [6849, 0, "d"], + [6850, 0, "{"], + [6851, 0, "p"], + [6852, 0, "r"], + [6853, 0, "o"], + [6854, 0, "o"], + [6855, 0, "f"], + [6856, 0, "t"], + [6857, 0, "r"], + [6858, 0, "e"], + [6859, 0, "e"], + [6860, 0, "}"], + [6860, 1], + [6859, 1], + [6858, 1], + [6857, 1], + [6856, 1], + [6855, 1], + [6854, 1], + [6853, 1], + [6852, 1], + [6851, 1], + [6850, 1], + [6849, 1], + [6848, 1], + [6847, 1], + [6846, 1], + [6845, 1], + [6844, 1], + [6843, 1], + [6842, 1], + [6841, 1], + [6840, 1], + [6839, 1], + [6838, 1], + [6837, 1], + [6836, 1], + [6835, 1], + [6834, 1], + [6833, 1], + [6832, 1], + [6831, 1], + [6830, 1], + [6829, 1], + [6828, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6479, 1], + [6812, 0, "\\"], + [6813, 0, "A"], + [6814, 0, "x"], + [6815, 0, "i"], + [6816, 0, "o"], + [6817, 0, "m"], + [6818, 0, "C"], + [6819, 0, "{"], + [6820, 0, "$"], + [6821, 0, "A"], + [6822, 0, "_"], + [6823, 0, "p"], + [6824, 0, ","], + [6825, 0, "\\"], + [6826, 0, ","], + [6827, 0, " "], + [6828, 0, "\\"], + [6829, 0, "m"], + [6830, 0, "a"], + [6831, 0, "t"], + [6832, 0, "h"], + [6833, 0, "i"], + [6834, 0, "t"], + [6835, 0, "{"], + [6836, 0, "e"], + [6837, 0, "x"], + [6838, 0, "p"], + [6839, 0, "r"], + [6840, 0, "}"], + [6841, 0, "."], + [6842, 0, "\\"], + [6843, 0, "m"], + [6844, 0, "a"], + [6845, 0, "t"], + [6846, 0, "h"], + [6847, 0, "s"], + [6848, 0, "f"], + [6849, 0, "{"], + [6850, 0, "g"], + [6851, 0, "e"], + [6852, 0, "t"], + [6853, 0, "}"], + [6854, 0, "("], + [6855, 0, "\\"], + [6856, 0, "m"], + [6857, 0, "a"], + [6858, 0, "t"], + [6859, 0, "h"], + [6860, 0, "i"], + [6861, 0, "t"], + [6862, 0, "{"], + [6863, 0, "k"], + [6864, 0, "e"], + [6865, 0, "y"], + [6866, 0, "}"], + [6867, 0, ")"], + [6868, 0, " "], + [6869, 0, "\\"], + [6870, 0, "e"], + [6871, 0, "v"], + [6872, 0, "a"], + [6873, 0, "l"], + [6874, 0, "t"], + [6875, 0, "o"], + [6820, 0, "\n"], + [6821, 0, "\\"], + [6822, 0, "U"], + [6823, 0, "n"], + [6824, 0, "a"], + [6825, 0, "r"], + [6826, 0, "y"], + [6827, 0, "I"], + [6828, 0, "n"], + [6829, 0, "f"], + [6830, 0, "C"], + [6831, 0, "{"], + [6820, 0, "$"], + [6821, 0, "A"], + [6822, 0, "_"], + [6823, 0, "p"], + [6824, 0, ","], + [6825, 0, "\\"], + [6826, 0, ","], + [6827, 0, " "], + [6828, 0, "\\"], + [6829, 0, "m"], + [6830, 0, "a"], + [6831, 0, "t"], + [6832, 0, "h"], + [6833, 0, "i"], + [6834, 0, "t"], + [6835, 0, "{"], + [6836, 0, "e"], + [6837, 0, "x"], + [6838, 0, "p"], + [6839, 0, "r"], + [6840, 0, "}"], + [6841, 0, " "], + [6842, 0, "\\"], + [6843, 0, "e"], + [6844, 0, "v"], + [6845, 0, "a"], + [6846, 0, "l"], + [6847, 0, "t"], + [6848, 0, "o"], + [6849, 0, " "], + [6850, 0, "\\"], + [6851, 0, "m"], + [6852, 0, "a"], + [6853, 0, "t"], + [6854, 0, "h"], + [6855, 0, "i"], + [6856, 0, "t"], + [6857, 0, "{"], + [6857, 1], + [6856, 1], + [6855, 1], + [6855, 0, "s"], + [6856, 0, "f"], + [6857, 0, "{"], + [6858, 0, "c"], + [6859, 0, "u"], + [6860, 0, "r"], + [6861, 0, "s"], + [6862, 0, "o"], + [6863, 0, "r"], + [6864, 0, "}"], + [6865, 0, "("], + [6866, 0, "\\"], + [6867, 0, "l"], + [6868, 0, "a"], + [6869, 0, "n"], + [6870, 0, "g"], + [6871, 0, "l"], + [6872, 0, "e"], + [6873, 0, " "], + [6874, 0, "k"], + [6875, 0, "_"], + [6876, 0, "1"], + [6877, 0, ","], + [6878, 0, " "], + [6879, 0, "\\"], + [6880, 0, "d"], + [6881, 0, "o"], + [6882, 0, "t"], + [6883, 0, "s"], + [6884, 0, ","], + [6885, 0, " "], + [6886, 0, "\\"], + [6886, 1], + [6886, 0, "k"], + [6887, 0, "_"], + [6888, 0, "{"], + [6889, 0, "n"], + [6890, 0, "-"], + [6891, 0, "1"], + [6892, 0, "}"], + [6893, 0, " "], + [6894, 0, "\\"], + [6895, 0, "r"], + [6896, 0, "a"], + [6897, 0, "n"], + [6898, 0, "g"], + [6899, 0, "l"], + [6900, 0, "e"], + [6901, 0, ","], + [6902, 0, " "], + [6902, 1], + [6902, 0, "\\"], + [6903, 0, ","], + [6904, 0, " "], + [6905, 0, "k"], + [6906, 0, "_"], + [6907, 0, "n"], + [6908, 0, ")"], + [6909, 0, "$"], + [6910, 0, "}"], + [6911, 0, "\n"], + [6912, 0, "\\"], + [6913, 0, "L"], + [6914, 0, "e"], + [6915, 0, "f"], + [6916, 0, "t"], + [6917, 0, "L"], + [6918, 0, "a"], + [6919, 0, "b"], + [6920, 0, "e"], + [6921, 0, "l"], + [6922, 0, "{"], + [6923, 0, "\\"], + [6924, 0, "t"], + [6925, 0, "e"], + [6926, 0, "x"], + [6927, 0, "t"], + [6928, 0, "s"], + [6929, 0, "c"], + [6930, 0, "{"], + [6931, 0, "G"], + [6932, 0, "e"], + [6933, 0, "t"], + [6934, 0, "}"], + [6935, 0, "}"], + [7004, 0, "\n"], + [7005, 0, " "], + [7006, 0, " "], + [7007, 0, " "], + [7008, 0, " "], + [7009, 0, "\\"], + [7010, 0, "m"], + [7011, 0, "a"], + [7012, 0, "t"], + [7013, 0, "h"], + [7014, 0, "s"], + [7015, 0, "f"], + [7016, 0, "{"], + [7017, 0, "c"], + [7018, 0, "u"], + [7019, 0, "r"], + [7020, 0, "s"], + [7021, 0, "o"], + [7022, 0, "r"], + [7023, 0, "}"], + [7024, 0, "("], + [7025, 0, "\\"], + [7026, 0, "l"], + [7027, 0, "a"], + [7028, 0, "n"], + [7029, 0, "g"], + [7030, 0, "l"], + [7031, 0, "e"], + [7032, 0, " "], + [7033, 0, "k"], + [7034, 0, "_"], + [7035, 0, "1"], + [7036, 0, ","], + [7037, 0, " "], + [7038, 0, "\\"], + [7039, 0, "d"], + [7040, 0, "o"], + [7041, 0, "t"], + [7042, 0, "s"], + [7043, 0, ","], + [7044, 0, " "], + [7045, 0, "k"], + [7046, 0, "_"], + [7047, 0, "{"], + [7048, 0, "n"], + [7049, 0, "-"], + [7050, 0, "1"], + [7051, 0, "}"], + [7052, 0, ","], + [7053, 0, " "], + [7054, 0, "\\"], + [7055, 0, "m"], + [7056, 0, "a"], + [7057, 0, "t"], + [7058, 0, "h"], + [7059, 0, "s"], + [7060, 0, "f"], + [7061, 0, "{"], + [7062, 0, "m"], + [7063, 0, "a"], + [7064, 0, "p"], + [7065, 0, "T"], + [7066, 0, "}"], + [7067, 0, "("], + [7068, 0, "k"], + [7069, 0, "_"], + [7070, 0, "n"], + [7071, 0, ")"], + [7072, 0, " "], + [7073, 0, "\\"], + [7074, 0, "r"], + [7075, 0, "a"], + [7076, 0, "n"], + [7077, 0, "g"], + [7078, 0, "l"], + [7079, 0, "e"], + [7080, 0, ","], + [7081, 0, " "], + [7082, 0, "\\"], + [7083, 0, "m"], + [7084, 0, "a"], + [7085, 0, "t"], + [7086, 0, "h"], + [7087, 0, "i"], + [7088, 0, "t"], + [7089, 0, "{"], + [7090, 0, "k"], + [7091, 0, "e"], + [7092, 0, "y"], + [7093, 0, "}"], + [7094, 0, ")"], + [7095, 0, "$"], + [7096, 0, "}"], + [7097, 0, "\n"], + [7098, 0, "\\"], + [7099, 0, "D"], + [7100, 0, "i"], + [7101, 0, "s"], + [7102, 0, "p"], + [7103, 0, "l"], + [7104, 0, "a"], + [7105, 0, "y"], + [7106, 0, "P"], + [7107, 0, "r"], + [7108, 0, "o"], + [7109, 0, "o"], + [7110, 0, "f"], + [7111, 0, "\\"], + [7112, 0, "h"], + [7113, 0, "s"], + [7114, 0, "p"], + [7115, 0, "a"], + [7116, 0, "c"], + [7117, 0, "e"], + [7118, 0, "{"], + [7119, 0, "4"], + [7120, 0, "e"], + [7121, 0, "m"], + [7122, 0, "}"], + [7123, 0, "\n"], + [7124, 0, "%"], + [7125, 0, "\n"], + [7126, 0, "\\"], + [7127, 0, "A"], + [7128, 0, "x"], + [7129, 0, "i"], + [7130, 0, "o"], + [7131, 0, "m"], + [7132, 0, "C"], + [7133, 0, "{"], + [7134, 0, "$"], + [7135, 0, "A"], + [7136, 0, "_"], + [7137, 0, "p"], + [7138, 0, ","], + [7139, 0, "\\"], + [7140, 0, ","], + [7141, 0, " "], + [7142, 0, "\\"], + [7143, 0, "m"], + [7144, 0, "a"], + [7145, 0, "t"], + [7146, 0, "h"], + [7147, 0, "i"], + [7148, 0, "t"], + [7149, 0, "{"], + [7150, 0, "e"], + [7151, 0, "x"], + [7152, 0, "p"], + [7153, 0, "r"], + [7154, 0, "}"], + [7155, 0, " "], + [7156, 0, "\\"], + [7157, 0, "e"], + [7158, 0, "v"], + [7159, 0, "a"], + [7160, 0, "l"], + [7161, 0, "t"], + [7162, 0, "o"], + [7163, 0, " "], + [7164, 0, "\\"], + [7165, 0, "m"], + [7166, 0, "a"], + [7167, 0, "t"], + [7168, 0, "h"], + [7169, 0, "s"], + [7170, 0, "f"], + [7171, 0, "{"], + [7172, 0, "c"], + [7173, 0, "u"], + [7174, 0, "r"], + [7175, 0, "s"], + [7176, 0, "o"], + [7177, 0, "r"], + [7178, 0, "}"], + [7179, 0, " "], + [7179, 1], + [7179, 0, "("], + [7180, 0, "\\"], + [7181, 0, "l"], + [7182, 0, "a"], + [7183, 0, "n"], + [7184, 0, "g"], + [7185, 0, "l"], + [7186, 0, "e"], + [7187, 0, " "], + [7188, 0, "k"], + [7189, 0, "_"], + [7190, 0, "1"], + [7191, 0, ","], + [7192, 0, " "], + [7193, 0, "\\"], + [7194, 0, "d"], + [7195, 0, "o"], + [7196, 0, "t"], + [7197, 0, "s"], + [7198, 0, ","], + [7199, 0, " "], + [7200, 0, "\\"], + [7200, 1], + [7200, 0, "k"], + [7201, 0, "_"], + [7202, 0, "{"], + [7203, 0, "n"], + [7204, 0, "-"], + [7205, 0, "1"], + [7206, 0, "}"], + [7207, 0, " "], + [7208, 0, "\\"], + [7209, 0, "r"], + [7210, 0, "a"], + [7211, 0, "n"], + [7212, 0, "g"], + [7213, 0, "l"], + [7214, 0, "e"], + [7215, 0, ","], + [7216, 0, "\\"], + [7217, 0, ","], + [7218, 0, " "], + [7219, 0, "k"], + [7220, 0, "_"], + [7221, 0, "n"], + [7222, 0, ")"], + [7223, 0, "$"], + [7224, 0, "%"], + [7225, 0, "}"], + [7225, 1], + [7224, 1], + [7224, 0, "}"], + [7225, 0, "\n"], + [7226, 0, "\\"], + [7227, 0, "L"], + [7228, 0, "e"], + [7229, 0, "f"], + [7230, 0, "t"], + [7231, 0, "L"], + [7232, 0, "a"], + [7233, 0, "b"], + [7234, 0, "e"], + [7235, 0, "l"], + [7236, 0, "{"], + [7237, 0, "\\"], + [7238, 0, "t"], + [7239, 0, "e"], + [7240, 0, "x"], + [7241, 0, "t"], + [7242, 0, "s"], + [7243, 0, "c"], + [7244, 0, "{"], + [7245, 0, "I"], + [7246, 0, "t"], + [7247, 0, "e"], + [7248, 0, "r"], + [7249, 0, "}"], + [7250, 0, "}"], + [7251, 0, "\n"], + [7252, 0, "\\"], + [7253, 0, "U"], + [7254, 0, "n"], + [7255, 0, "a"], + [7256, 0, "r"], + [7257, 0, "y"], + [7258, 0, "I"], + [7259, 0, "n"], + [7260, 0, "f"], + [7261, 0, "C"], + [7262, 0, "{"], + [7263, 0, "$"], + [7264, 0, "A"], + [7265, 0, "_"], + [7266, 0, "p"], + [7267, 0, ","], + [7268, 0, "\\"], + [7269, 0, ","], + [7270, 0, " "], + [7271, 0, "\\"], + [7272, 0, "m"], + [7273, 0, "a"], + [7274, 0, "t"], + [7275, 0, "h"], + [7276, 0, "i"], + [7277, 0, "t"], + [7278, 0, "{"], + [7279, 0, "e"], + [7280, 0, "x"], + [7281, 0, "p"], + [7282, 0, "r"], + [7283, 0, "}"], + [7284, 0, "."], + [7285, 0, "\\"], + [7286, 0, "m"], + [7287, 0, "a"], + [7288, 0, "t"], + [7289, 0, "h"], + [7290, 0, "s"], + [7291, 0, "f"], + [7292, 0, "{"], + [7293, 0, "i"], + [7294, 0, "t"], + [7295, 0, "e"], + [7296, 0, "r"], + [7297, 0, "}"], + [7298, 0, " "], + [7299, 0, "\\"], + [7300, 0, "e"], + [7301, 0, "v"], + [7302, 0, "a"], + [7303, 0, "l"], + [7304, 0, "t"], + [7305, 0, "o"], + [7306, 0, " "], + [7306, 1], + [7306, 0, "\n"], + [7307, 0, " "], + [7308, 0, " "], + [7309, 0, " "], + [7310, 0, " "], + [7311, 0, "\\"], + [7312, 0, "m"], + [7313, 0, "a"], + [7314, 0, "t"], + [7315, 0, "h"], + [7316, 0, "s"], + [7317, 0, "f"], + [7318, 0, "{"], + [7319, 0, "c"], + [7320, 0, "u"], + [7321, 0, "r"], + [7322, 0, "s"], + [7323, 0, "o"], + [7324, 0, "r"], + [7325, 0, "}"], + [7326, 0, "("], + [7327, 0, "\\"], + [7328, 0, "l"], + [7329, 0, "a"], + [7330, 0, "n"], + [7331, 0, "g"], + [7332, 0, "l"], + [7333, 0, "e"], + [7334, 0, " "], + [7335, 0, "k"], + [7336, 0, "_"], + [7337, 0, "1"], + [7338, 0, ","], + [7339, 0, " "], + [7340, 0, "\\"], + [7341, 0, "d"], + [7342, 0, "o"], + [7343, 0, "t"], + [7344, 0, "s"], + [7345, 0, ","], + [7346, 0, " "], + [7347, 0, "k"], + [7348, 0, "_"], + [7349, 0, "{"], + [7350, 0, "n"], + [7351, 0, "-"], + [7352, 0, "1"], + [7353, 0, "}"], + [7354, 0, ","], + [7355, 0, " "], + [7356, 0, "\\"], + [7357, 0, "m"], + [7358, 0, "a"], + [7359, 0, "t"], + [7360, 0, "h"], + [7361, 0, "s"], + [7362, 0, "f"], + [7363, 0, "{"], + [7364, 0, "l"], + [7365, 0, "i"], + [7366, 0, "s"], + [7367, 0, "t"], + [7368, 0, "T"], + [7369, 0, "}"], + [7370, 0, "("], + [7371, 0, "k"], + [7372, 0, "_"], + [7373, 0, "n"], + [7374, 0, ")"], + [7375, 0, " "], + [7376, 0, "\\"], + [7377, 0, "r"], + [7378, 0, "a"], + [7379, 0, "n"], + [7380, 0, "g"], + [7381, 0, "l"], + [7382, 0, "e"], + [7383, 0, ","], + [7384, 0, "\\"], + [7385, 0, ","], + [7081, 0, "\\"], + [7082, 0, ","], + [7388, 0, " "], + [7389, 0, "\\"], + [7390, 0, "m"], + [7391, 0, "a"], + [7392, 0, "t"], + [7393, 0, "h"], + [7394, 0, "s"], + [7395, 0, "f"], + [7396, 0, "{"], + [7397, 0, "h"], + [7398, 0, "e"], + [7399, 0, "a"], + [7400, 0, "d"], + [7401, 0, "}"], + [7402, 0, ")"], + [7403, 0, "$"], + [7404, 0, "}"], + [7405, 0, "\n"], + [7406, 0, "\\"], + [7407, 0, "D"], + [7408, 0, "i"], + [7409, 0, "s"], + [7410, 0, "p"], + [7411, 0, "l"], + [7412, 0, "a"], + [7413, 0, "y"], + [7414, 0, "P"], + [7415, 0, "r"], + [7416, 0, "o"], + [7417, 0, "o"], + [7418, 0, "f"], + [7419, 0, "\\"], + [7420, 0, "p"], + [7421, 0, "r"], + [7422, 0, "o"], + [7423, 0, "o"], + [7424, 0, "f"], + [7425, 0, "S"], + [7426, 0, "k"], + [7427, 0, "i"], + [7428, 0, "p"], + [7429, 0, "A"], + [7430, 0, "m"], + [7431, 0, "o"], + [7432, 0, "u"], + [7433, 0, "n"], + [7434, 0, "t"], + [7121, 1], + [7121, 0, "0"], + [6811, 0, "\n"], + [6812, 0, "\\"], + [6813, 0, "b"], + [6814, 0, "e"], + [6815, 0, "g"], + [6816, 0, "i"], + [6817, 0, "n"], + [6818, 0, "{"], + [6819, 0, "p"], + [6820, 0, "r"], + [6821, 0, "o"], + [6822, 0, "o"], + [6823, 0, "f"], + [6824, 0, "t"], + [6825, 0, "r"], + [6826, 0, "e"], + [6827, 0, "e"], + [6828, 0, "}"], + [7144, 1], + [7143, 1], + [7142, 1], + [7141, 1], + [7140, 1], + [7139, 1], + [7138, 1], + [7137, 1], + [7136, 1], + [7135, 1], + [7134, 1], + [7133, 1], + [7132, 1], + [7131, 1], + [7130, 1], + [7129, 1], + [7128, 1], + [7127, 1], + [7126, 1], + [7125, 1], + [7124, 1], + [7123, 1], + [7122, 1], + [7121, 1], + [7120, 1], + [7119, 1], + [7119, 0, "e"], + [7120, 0, "n"], + [7121, 0, "d"], + [7122, 0, "{"], + [7123, 0, "p"], + [7124, 0, "r"], + [7125, 0, "o"], + [7126, 0, "o"], + [7127, 0, "f"], + [7128, 0, "t"], + [7129, 0, "r"], + [7130, 0, "e"], + [7131, 0, "e"], + [7132, 0, "}"], + [7133, 0, "\n"], + [7134, 0, "\n"], + [7135, 0, "\\"], + [7136, 0, "b"], + [7137, 0, "e"], + [7138, 0, "g"], + [7139, 0, "i"], + [7140, 0, "n"], + [7141, 0, "{"], + [7142, 0, "P"], + [7142, 1], + [7142, 0, "p"], + [7143, 0, "r"], + [7144, 0, "o"], + [7145, 0, "o"], + [7146, 0, "f"], + [7147, 0, "t"], + [7148, 0, "r"], + [7149, 0, "e"], + [7150, 0, "e"], + [7151, 0, "}"], + [7459, 1], + [7458, 1], + [7457, 1], + [7456, 1], + [7455, 1], + [7454, 1], + [7453, 1], + [7452, 1], + [7451, 1], + [7450, 1], + [7449, 1], + [7448, 1], + [7447, 1], + [7446, 1], + [7445, 1], + [7444, 1], + [7443, 1], + [7442, 1], + [7441, 1], + [7440, 1], + [7439, 1], + [7438, 1], + [7437, 1], + [7436, 1], + [7435, 1], + [7434, 1], + [7433, 1], + [7432, 1], + [7432, 0, "e"], + [7433, 0, "n"], + [7434, 0, "d"], + [7435, 0, "{"], + [7436, 0, "p"], + [7437, 0, "r"], + [7438, 0, "o"], + [7439, 0, "o"], + [7440, 0, "f"], + [7441, 0, "t"], + [7442, 0, "r"], + [7443, 0, "e"], + [7444, 0, "e"], + [7445, 0, "}"], + [6003, 1], + [6002, 1], + [6001, 1], + [6000, 1], + [5999, 1], + [5998, 1], + [5997, 1], + [5996, 1], + [5995, 1], + [5995, 0, "b"], + [5996, 0, "e"], + [5997, 0, "g"], + [5998, 0, "i"], + [5999, 0, "n"], + [6000, 0, "{"], + [6001, 0, "c"], + [6002, 0, "e"], + [6003, 0, "n"], + [6004, 0, "t"], + [6005, 0, "e"], + [6006, 0, "r"], + [6007, 0, "}"], + [6481, 0, "\n"], + [6482, 0, "\\"], + [6483, 0, "e"], + [6484, 0, "n"], + [6485, 0, "d"], + [6486, 0, "{"], + [6487, 0, "c"], + [6488, 0, "e"], + [6489, 0, "n"], + [6490, 0, "t"], + [6491, 0, "e"], + [6492, 0, "r"], + [6493, 0, "}"], + [6495, 0, "\n"], + [6496, 0, "\\"], + [6497, 0, "b"], + [6498, 0, "e"], + [6499, 0, "g"], + [6500, 0, "i"], + [6501, 0, "n"], + [6502, 0, "{"], + [6503, 0, "c"], + [6504, 0, "e"], + [6505, 0, "n"], + [6506, 0, "t"], + [6507, 0, "e"], + [6508, 0, "r"], + [6509, 0, "}"], + [6842, 0, "\n"], + [6843, 0, "\\"], + [6844, 0, "e"], + [6845, 0, "n"], + [6846, 0, "d"], + [6847, 0, "{"], + [6848, 0, "c"], + [6849, 0, "e"], + [6850, 0, "n"], + [6851, 0, "t"], + [6852, 0, "e"], + [6853, 0, "r"], + [6854, 0, "}"], + [7491, 0, "\n"], + [7492, 0, "\n"], + [7493, 0, "\\"], + [7494, 0, "b"], + [7495, 0, "e"], + [7496, 0, "g"], + [7497, 0, "i"], + [7498, 0, "n"], + [7499, 0, "{"], + [7500, 0, "p"], + [7501, 0, "r"], + [7502, 0, "o"], + [7503, 0, "o"], + [7504, 0, "f"], + [7505, 0, "t"], + [7506, 0, "r"], + [7507, 0, "e"], + [7508, 0, "e"], + [7509, 0, "}"], + [7510, 0, "\n"], + [7511, 0, "\\"], + [7512, 0, "e"], + [7513, 0, "n"], + [7514, 0, "d"], + [7515, 0, "{"], + [7516, 0, "["], + [7517, 0, "r"], + [7518, 0, "o"], + [7519, 0, "p"], + [7520, 0, "o"], + [7521, 0, "f"], + [7521, 1], + [7520, 1], + [7519, 1], + [7518, 1], + [7517, 1], + [7516, 1], + [7516, 0, "p"], + [7517, 0, "r"], + [7518, 0, "o"], + [7519, 0, "o"], + [7520, 0, "f"], + [7521, 0, "t"], + [7522, 0, "r"], + [7523, 0, "e"], + [7524, 0, "e"], + [7525, 0, "}"], + [7510, 0, "\n"], + [7511, 0, "\\"], + [7512, 0, "A"], + [7513, 0, "x"], + [7514, 0, "i"], + [7515, 0, "o"], + [7516, 0, "m"], + [7517, 0, "C"], + [7518, 0, "{"], + [7519, 0, "$"], + [7520, 0, "A"], + [7521, 0, "_"], + [7522, 0, "p"], + [7523, 0, ","], + [7524, 0, "\\"], + [7525, 0, ","], + [7526, 0, " "], + [7527, 0, "\\"], + [7528, 0, "m"], + [7529, 0, "a"], + [7530, 0, "t"], + [7531, 0, "h"], + [7532, 0, "i"], + [7533, 0, "t"], + [7534, 0, "{"], + [7535, 0, "e"], + [7536, 0, "x"], + [7537, 0, "p"], + [7538, 0, "r"], + [7539, 0, "}"], + [7540, 0, " "], + [7541, 0, "\\"], + [7542, 0, "e"], + [7543, 0, "v"], + [7544, 0, "a"], + [7545, 0, "l"], + [7546, 0, "t"], + [7547, 0, "o"], + [7548, 0, " "], + [7549, 0, "\\"], + [7550, 0, "m"], + [7551, 0, "a"], + [7552, 0, "t"], + [7553, 0, "h"], + [7554, 0, "i"], + [7555, 0, "t"], + [7556, 0, "{"], + [7557, 0, "c"], + [7558, 0, "u"], + [7559, 0, "r"], + [7560, 0, "}"], + [7561, 0, "$"], + [7562, 0, "}"], + [7563, 0, "\n"], + [7564, 0, "\\"], + [7565, 0, "A"], + [7566, 0, "x"], + [7567, 0, "i"], + [7568, 0, "o"], + [7569, 0, "m"], + [7570, 0, "C"], + [7571, 0, "{"], + [7572, 0, "$"], + [7573, 0, "A"], + [7574, 0, "_"], + [7575, 0, "p"], + [7576, 0, ","], + [7577, 0, "\\"], + [7578, 0, ","], + [7579, 0, " "], + [7580, 0, "\\"], + [7581, 0, "m"], + [7582, 0, "a"], + [7583, 0, "t"], + [7584, 0, "h"], + [7585, 0, "i"], + [7586, 0, "t"], + [7587, 0, "{"], + [7588, 0, "c"], + [7589, 0, "u"], + [7590, 0, "r"], + [7591, 0, "}"], + [7592, 0, "."], + [7593, 0, "\\"], + [7594, 0, "m"], + [7595, 0, "a"], + [7596, 0, "t"], + [7597, 0, "h"], + [7598, 0, "s"], + [7599, 0, "f"], + [7600, 0, "{"], + [7601, 0, "n"], + [7602, 0, "e"], + [7603, 0, "x"], + [7604, 0, "t"], + [7605, 0, "}"], + [7606, 0, " "], + [7607, 0, "\\"], + [7608, 0, "e"], + [7609, 0, "v"], + [7610, 0, "a"], + [7611, 0, "l"], + [7612, 0, "t"], + [7613, 0, "o"], + [7614, 0, " "], + [7615, 0, "\\"], + [7616, 0, "m"], + [7617, 0, "a"], + [7618, 0, "t"], + [7619, 0, "h"], + [7620, 0, "i"], + [7621, 0, "t"], + [7622, 0, "{"], + [7623, 0, "c"], + [7624, 0, "u"], + [7625, 0, "r"], + [7626, 0, "}"], + [7627, 0, "'"], + [7628, 0, "$"], + [7629, 0, "}"], + [7630, 0, "\n"], + [7631, 0, "\\"], + [7632, 0, "L"], + [7633, 0, "e"], + [7634, 0, "f"], + [7635, 0, "t"], + [7636, 0, "L"], + [7637, 0, "a"], + [7638, 0, "b"], + [7639, 0, "e"], + [7640, 0, "l"], + [7641, 0, "{"], + [7642, 0, "$"], + [7643, 0, "\\"], + [7644, 0, "m"], + [7645, 0, "a"], + [7645, 1], + [7644, 1], + [7644, 0, "t"], + [7645, 0, "e"], + [7646, 0, "s"], + [7646, 1], + [7646, 0, "x"], + [7647, 0, "t"], + [7648, 0, "s"], + [7649, 0, "c"], + [7650, 0, "{"], + [7651, 0, "N"], + [7652, 0, "e"], + [7653, 0, "x"], + [7654, 0, "t"], + [7655, 0, "}"], + [7656, 0, "_"], + [7657, 0, "1"], + [7658, 0, "$"], + [7659, 0, "}"], + [7660, 0, "\n"], + [7661, 0, "A"], + [7661, 1], + [7661, 0, "\\"], + [7662, 0, "B"], + [7663, 0, "i"], + [7664, 0, "n"], + [7665, 0, "a"], + [7666, 0, "r"], + [7667, 0, "e"], + [7668, 0, "y"], + [7668, 1], + [7667, 1], + [7667, 0, "y"], + [7668, 0, "I"], + [7669, 0, "n"], + [7670, 0, "f"], + [7671, 0, "C"], + [7672, 0, "{"], + [7673, 0, "$"], + [7674, 0, "A"], + [7675, 0, "_"], + [7676, 0, "p"], + [7677, 0, ","], + [7678, 0, "\\"], + [7679, 0, ","], + [7680, 0, " "], + [7681, 0, "\\"], + [7682, 0, "m"], + [7683, 0, "a"], + [7684, 0, "t"], + [7685, 0, "h"], + [7686, 0, "i"], + [7687, 0, "t"], + [7688, 0, "{"], + [7689, 0, "e"], + [7690, 0, "x"], + [7691, 0, "p"], + [7692, 0, "r"], + [7693, 0, "}"], + [7694, 0, "."], + [7695, 0, "\\"], + [7696, 0, "m"], + [7697, 0, "a"], + [7698, 0, "t"], + [7699, 0, "h"], + [7700, 0, "s"], + [7701, 0, "f"], + [7702, 0, "{"], + [7703, 0, "n"], + [7704, 0, " "], + [7705, 0, "e"], + [7706, 0, "x"], + [7706, 1], + [7705, 1], + [7704, 1], + [7704, 0, "e"], + [7705, 0, "x"], + [7706, 0, "t"], + [7707, 0, "}"], + [7708, 0, " "], + [7709, 0, "\\"], + [7710, 0, "e"], + [7711, 0, "v"], + [7712, 0, "a"], + [7713, 0, "l"], + [7714, 0, "t"], + [7715, 0, "o"], + [7716, 0, " "], + [7717, 0, "\\"], + [7718, 0, "m"], + [7719, 0, "a"], + [7720, 0, "t"], + [7721, 0, "h"], + [7722, 0, "i"], + [7723, 0, "t"], + [7724, 0, "{"], + [7725, 0, "c"], + [7726, 0, "u"], + [7727, 0, "r"], + [7728, 0, "}"], + [7729, 0, "'"], + [7730, 0, "$"], + [7731, 0, "}"], + [7748, 0, "\n"], + [7749, 0, "\n"], + [7750, 0, "\\"], + [7751, 0, "b"], + [7752, 0, "e"], + [7753, 0, "g"], + [7754, 0, "i"], + [7755, 0, "n"], + [7756, 0, "{"], + [7757, 0, "p"], + [7758, 0, "r"], + [7759, 0, "o"], + [7760, 0, "o"], + [7761, 0, "f"], + [7762, 0, "t"], + [7763, 0, "r"], + [7764, 0, "e"], + [7765, 0, "e"], + [7766, 0, "}"], + [7767, 0, "\n"], + [7768, 0, "\\"], + [7769, 0, "e"], + [7770, 0, "n"], + [7771, 0, "d"], + [7772, 0, "P"], + [7772, 1], + [7772, 0, "{"], + [7773, 0, "p"], + [7774, 0, "r"], + [7775, 0, "o"], + [7776, 0, "o"], + [7777, 0, "f"], + [7778, 0, "t"], + [7779, 0, "r"], + [7780, 0, "e"], + [7781, 0, "e"], + [7782, 0, "}"], + [7767, 0, "\n"], + [7768, 0, "A"], + [7769, 0, "x"], + [7770, 0, "i"], + [7771, 0, "o"], + [7772, 0, "m"], + [7773, 0, "C"], + [7768, 0, "\\"], + [7775, 0, "{"], + [7776, 0, "$"], + [7777, 0, "\\"], + [7778, 0, "m"], + [7779, 0, "a"], + [7780, 0, "t"], + [7781, 0, "h"], + [7782, 0, "s"], + [7783, 0, "f"], + [7784, 0, "{"], + [7785, 0, "n"], + [7786, 0, "e"], + [7787, 0, "x"], + [7788, 0, "t"], + [7789, 0, "}"], + [7790, 0, "("], + [7791, 0, "k"], + [7792, 0, ")"], + [7793, 0, " "], + [7794, 0, "\\"], + [7795, 0, "i"], + [7796, 0, "n"], + [7797, 0, " "], + [7798, 0, "\\"], + [7799, 0, "m"], + [7800, 0, "a"], + [7801, 0, "t"], + [7802, 0, "h"], + [7803, 0, "r"], + [7804, 0, "m"], + [7805, 0, "{"], + [7806, 0, "d"], + [7807, 0, "o"], + [7808, 0, "m"], + [7809, 0, "}"], + [7810, 0, "("], + [7811, 0, "\\"], + [7812, 0, "m"], + [7813, 0, "a"], + [7814, 0, "t"], + [7815, 0, "h"], + [7816, 0, "i"], + [7817, 0, "t"], + [7818, 0, "{"], + [7819, 0, "c"], + [7820, 0, "t"], + [7821, 0, "x"], + [7822, 0, "}"], + [7823, 0, ")"], + [7824, 0, "$"], + [7825, 0, "}"], + [7826, 0, "\n"], + [7827, 0, "\\"], + [7828, 0, "A"], + [7829, 0, "x"], + [7830, 0, "i"], + [7831, 0, "o"], + [7832, 0, "m"], + [7833, 0, "C"], + [7834, 0, "{"], + [7835, 0, "$"], + [7836, 0, "\\"], + [7837, 0, "m"], + [7838, 0, "a"], + [7839, 0, "t"], + [7840, 0, "h"], + [7841, 0, "i"], + [7842, 0, "t"], + [7843, 0, "{"], + [7844, 0, "c"], + [7845, 0, "t"], + [7846, 0, "x"], + [7847, 0, "}"], + [7848, 0, "("], + [7849, 0, "\\"], + [7850, 0, "m"], + [7851, 0, "a"], + [7852, 0, "t"], + [7853, 0, "h"], + [7854, 0, "s"], + [7855, 0, "f"], + [7856, 0, "{"], + [7857, 0, "n"], + [7858, 0, "e"], + [7859, 0, "x"], + [7860, 0, "t"], + [7861, 0, "}"], + [7862, 0, "("], + [7863, 0, "k"], + [7864, 0, ")"], + [7865, 0, ")"], + [7866, 0, " "], + [7867, 0, "="], + [7868, 0, " "], + [7869, 0, "k"], + [7870, 0, "'"], + [7871, 0, "$"], + [7872, 0, "}"], + [7873, 0, "\n"], + [7874, 0, "\\"], + [7875, 0, "L"], + [7876, 0, "e"], + [7877, 0, "f"], + [7878, 0, "t"], + [7879, 0, "L"], + [7880, 0, "a"], + [7881, 0, "b"], + [7882, 0, "e"], + [7883, 0, "l"], + [7884, 0, "{"], + [7885, 0, "$"], + [7886, 0, "\\"], + [7887, 0, "t"], + [7888, 0, "e"], + [7889, 0, "x"], + [7890, 0, "t"], + [7891, 0, "s"], + [7892, 0, "c"], + [7893, 0, "{"], + [7894, 0, "N"], + [7895, 0, "e"], + [7896, 0, "x"], + [7897, 0, "t"], + [7898, 0, "}"], + [7899, 0, "_"], + [7900, 0, "2"], + [7901, 0, "$"], + [7902, 0, "}"], + [7903, 0, "\n"], + [7904, 0, "\\"], + [7905, 0, "B"], + [7906, 0, "i"], + [7907, 0, "n"], + [7908, 0, "a"], + [7909, 0, "r"], + [7910, 0, "y"], + [7911, 0, "I"], + [7912, 0, "n"], + [7913, 0, "f"], + [7914, 0, "C"], + [7915, 0, "{"], + [7916, 0, "$"], + [7917, 0, "\\"], + [7918, 0, "m"], + [7919, 0, "a"], + [7920, 0, "t"], + [7921, 0, "h"], + [7922, 0, "i"], + [7923, 0, "t"], + [7924, 0, "{"], + [7925, 0, "c"], + [7926, 0, "t"], + [7927, 0, "x"], + [7928, 0, "}"], + [7929, 0, ","], + [7930, 0, "\\"], + [7931, 0, ","], + [7932, 0, " "], + [7933, 0, "\\"], + [7934, 0, "m"], + [7935, 0, "a"], + [7936, 0, "t"], + [7937, 0, "h"], + [7938, 0, "s"], + [7939, 0, "f"], + [7940, 0, "{"], + [7941, 0, "c"], + [7942, 0, "u"], + [7943, 0, "r"], + [7944, 0, "s"], + [7945, 0, "o"], + [7946, 0, "r"], + [7947, 0, "}"], + [7948, 0, "("], + [7949, 0, "\\"], + [7950, 0, "l"], + [7951, 0, "a"], + [7952, 0, "n"], + [7953, 0, "g"], + [7954, 0, "l"], + [7955, 0, "e"], + [7956, 0, "\\"], + [7957, 0, "r"], + [7958, 0, "a"], + [7959, 0, "n"], + [7960, 0, "g"], + [7961, 0, "l"], + [7962, 0, "e"], + [7963, 0, ","], + [7964, 0, "\\"], + [7965, 0, ","], + [7966, 0, " "], + [7967, 0, "k"], + [7968, 0, ")"], + [7969, 0, "."], + [7970, 0, "\\"], + [7971, 0, "m"], + [7972, 0, "a"], + [7973, 0, "t"], + [7974, 0, "h"], + [7975, 0, "s"], + [7976, 0, "f"], + [7977, 0, "{"], + [7978, 0, "n"], + [7979, 0, "e"], + [7980, 0, "x"], + [7981, 0, "t"], + [7982, 0, "}"], + [7983, 0, " "], + [7984, 0, "\\"], + [7985, 0, "e"], + [7986, 0, "v"], + [7987, 0, "a"], + [7988, 0, "l"], + [7989, 0, "t"], + [7990, 0, "o"], + [7991, 0, " "], + [7991, 1], + [7991, 0, "\n"], + [7992, 0, " "], + [7993, 0, " "], + [7994, 0, " "], + [7995, 0, " "], + [7996, 0, "\\"], + [7997, 0, "m"], + [7998, 0, "a"], + [7999, 0, "t"], + [8000, 0, "h"], + [8001, 0, "s"], + [8002, 0, "f"], + [8003, 0, "{"], + [8004, 0, "c"], + [8005, 0, "u"], + [8006, 0, "r"], + [8007, 0, "s"], + [8008, 0, "o"], + [8009, 0, "r"], + [8010, 0, "}"], + [8011, 0, "("], + [8012, 0, "\\"], + [8013, 0, "l"], + [8014, 0, "a"], + [8015, 0, "n"], + [8016, 0, "g"], + [8017, 0, "l"], + [8018, 0, "e"], + [8019, 0, "\\"], + [8020, 0, "r"], + [8021, 0, "a"], + [8022, 0, "n"], + [8023, 0, "g"], + [8024, 0, "l"], + [8025, 0, "e"], + [8026, 0, ","], + [8027, 0, "\\"], + [8028, 0, ","], + [8029, 0, " "], + [8030, 0, "k"], + [8031, 0, "'"], + [8032, 0, ")"], + [8033, 0, "$"], + [8034, 0, "}"], + [8051, 0, "\n"], + [8052, 0, "\n"], + [8053, 0, "\\"], + [8054, 0, "b"], + [8055, 0, "e"], + [8056, 0, "g"], + [8057, 0, "i"], + [8058, 0, "n"], + [8059, 0, "{"], + [8060, 0, "p"], + [8061, 0, "r"], + [8062, 0, "o"], + [8063, 0, "o"], + [8064, 0, "f"], + [8065, 0, "t"], + [8066, 0, "r"], + [8067, 0, "e"], + [8068, 0, "e"], + [8069, 0, "}"], + [8070, 0, "\n"], + [8071, 0, "\\"], + [8072, 0, "e"], + [8073, 0, "n"], + [8074, 0, "d"], + [8075, 0, "{"], + [8076, 0, "p"], + [8077, 0, "r"], + [8078, 0, "o"], + [8079, 0, "o"], + [8080, 0, "f"], + [8081, 0, "t"], + [8082, 0, "r"], + [8083, 0, "e"], + [8084, 0, "e"], + [8085, 0, "}"], + [8070, 0, "\n"], + [8071, 0, "\\"], + [8072, 0, "A"], + [8073, 0, "x"], + [8074, 0, "i"], + [8075, 0, "o"], + [8076, 0, "m"], + [8077, 0, "C"], + [8078, 0, "{"], + [8079, 0, "$"], + [8080, 0, "k"], + [8081, 0, "_"], + [8082, 0, "1"], + [8083, 0, " "], + [8084, 0, "\\"], + [8085, 0, "i"], + [8086, 0, "n"], + [8087, 0, " "], + [8088, 0, "\\"], + [8089, 0, "m"], + [8090, 0, "a"], + [8091, 0, "t"], + [8092, 0, "h"], + [8093, 0, "r"], + [8094, 0, "m"], + [8095, 0, "{"], + [8096, 0, "d"], + [8097, 0, "o"], + [8098, 0, "m"], + [8099, 0, "}"], + [8100, 0, "("], + [8101, 0, "\\"], + [8102, 0, "m"], + [8103, 0, "a"], + [8104, 0, "t"], + [8105, 0, "h"], + [8106, 0, "i"], + [8107, 0, "t"], + [8108, 0, "{"], + [8109, 0, "c"], + [8110, 0, "t"], + [8111, 0, "x"], + [8112, 0, "}"], + [8113, 0, ")"], + [8114, 0, "$"], + [8115, 0, "}"], + [8116, 0, "\n"], + [8117, 0, "\\"], + [8118, 0, "A"], + [8119, 0, "x"], + [8120, 0, "i"], + [8121, 0, "o"], + [8122, 0, "m"], + [8123, 0, "C"], + [8124, 0, "{"], + [8125, 0, "$"], + [8126, 0, "\\"], + [8127, 0, "m"], + [8128, 0, "a"], + [8129, 0, "t"], + [8130, 0, "h"], + [8131, 0, "i"], + [8132, 0, "t"], + [8133, 0, "{"], + [8134, 0, "c"], + [8135, 0, "t"], + [8136, 0, "x"], + [8137, 0, "}"], + [8138, 0, "("], + [8139, 0, "k"], + [8140, 0, "_"], + [8141, 0, "1"], + [8142, 0, ")"], + [8143, 0, ","], + [8144, 0, "\\"], + [8145, 0, ","], + [8146, 0, " "], + [8147, 0, "\\"], + [8148, 0, "m"], + [8149, 0, "a"], + [8150, 0, "t"], + [8151, 0, "h"], + [8152, 0, "s"], + [8153, 0, "f"], + [8154, 0, "{"], + [8155, 0, "}"], + [8155, 0, "c"], + [8156, 0, "u"], + [8157, 0, "r"], + [8158, 0, "s"], + [8159, 0, "o"], + [8160, 0, "r"], + [8162, 0, "("], + [8163, 0, "\\"], + [8164, 0, "l"], + [8165, 0, "a"], + [8166, 0, "n"], + [8167, 0, "g"], + [8168, 0, "l"], + [8169, 0, "e"], + [8170, 0, " "], + [8171, 0, "k"], + [8172, 0, "_"], + [8173, 0, "2"], + [8174, 0, ","], + [8175, 0, " "], + [8176, 0, "\\"], + [8177, 0, "d"], + [8178, 0, "o"], + [8179, 0, "t"], + [8180, 0, "s"], + [8181, 0, ","], + [8182, 0, " "], + [8183, 0, "k"], + [8184, 0, "_"], + [8185, 0, "{"], + [8186, 0, "n"], + [8187, 0, "-"], + [8188, 0, "1"], + [8189, 0, "}"], + [8190, 0, " "], + [8191, 0, "\\"], + [8192, 0, "r"], + [8193, 0, "a"], + [8194, 0, "n"], + [8195, 0, "g"], + [8196, 0, "l"], + [8197, 0, "e"], + [8198, 0, ","], + [8199, 0, "\\"], + [8200, 0, ","], + [8201, 0, " "], + [8202, 0, "k"], + [8203, 0, "_"], + [8204, 0, "n"], + [8205, 0, ")"], + [8206, 0, "."], + [8207, 0, "\\"], + [8208, 0, "m"], + [8209, 0, "a"], + [8210, 0, "t"], + [8211, 0, "h"], + [8212, 0, "s"], + [8213, 0, "f"], + [8214, 0, "{"], + [8215, 0, "n"], + [8216, 0, "e"], + [8217, 0, "x"], + [8218, 0, "t"], + [8219, 0, "}"], + [8220, 0, " "], + [8221, 0, "\\"], + [8222, 0, "e"], + [8223, 0, "v"], + [8224, 0, "a"], + [8224, 1], + [8223, 1], + [8222, 1], + [8221, 1], + [8220, 1], + [8220, 0, "\n"], + [8221, 0, " "], + [8222, 0, " "], + [8223, 0, " "], + [8224, 0, " "], + [8225, 0, "'"], + [8226, 0, "e"], + [8226, 1], + [8225, 1], + [8225, 0, "\\"], + [8226, 0, "e"], + [8227, 0, "v"], + [8228, 0, "a"], + [8229, 0, "l"], + [8230, 0, "t"], + [8231, 0, "o"], + [8232, 0, " "], + [8233, 0, "\\"], + [8234, 0, "m"], + [8235, 0, "a"], + [8236, 0, "t"], + [8237, 0, "h"], + [8238, 0, "s"], + [8239, 0, "f"], + [8240, 0, "{"], + [8241, 0, "c"], + [8242, 0, "u"], + [8243, 0, "r"], + [8244, 0, "s"], + [8245, 0, "o"], + [8246, 0, "r"], + [8247, 0, "}"], + [8248, 0, "("], + [8249, 0, "\\"], + [8250, 0, "l"], + [8251, 0, "a"], + [8252, 0, "n"], + [8253, 0, "g"], + [8254, 0, "l"], + [8255, 0, "e"], + [8256, 0, " "], + [8257, 0, "k"], + [8258, 0, "_"], + [8259, 0, "2"], + [8260, 0, ","], + [8261, 0, " "], + [8262, 0, "\\"], + [8263, 0, "d"], + [8264, 0, "o"], + [8265, 0, "t"], + [8266, 0, "s"], + [8267, 0, ","], + [8268, 0, " "], + [8269, 0, "k"], + [8270, 0, "_"], + [8271, 0, "{"], + [8272, 0, "n"], + [8273, 0, "-"], + [8274, 0, "1"], + [8275, 0, "}"], + [8276, 0, " "], + [8277, 0, "\\"], + [8278, 0, "r"], + [8279, 0, "a"], + [8280, 0, "n"], + [8281, 0, "g"], + [8282, 0, "l"], + [8283, 0, "e"], + [8284, 0, ","], + [8285, 0, "\\"], + [8286, 0, ","], + [8287, 0, " "], + [8288, 0, "k"], + [8289, 0, "_"], + [8290, 0, "n"], + [8291, 0, "'"], + [8292, 0, ")"], + [8293, 0, "$"], + [8294, 0, "}"], + [8295, 0, "\n"], + [8296, 0, "\\"], + [8297, 0, "L"], + [8298, 0, "e"], + [8299, 0, "f"], + [8300, 0, "t"], + [8301, 0, "L"], + [8302, 0, "a"], + [8303, 0, "b"], + [8304, 0, "e"], + [8305, 0, "l"], + [8306, 0, "{"], + [8307, 0, "$"], + [8308, 0, "\\"], + [8309, 0, "t"], + [8310, 0, "e"], + [8311, 0, "x"], + [8312, 0, "t"], + [8313, 0, "s"], + [8314, 0, "c"], + [8315, 0, "{"], + [8316, 0, "N"], + [8317, 0, "e"], + [8318, 0, "x"], + [8319, 0, "t"], + [8320, 0, "}"], + [8321, 0, "_"], + [8322, 0, "3"], + [8323, 0, "$"], + [8324, 0, "}"], + [8325, 0, "\n"], + [8326, 0, "\\"], + [8327, 0, "B"], + [8328, 0, "i"], + [8329, 0, "n"], + [8330, 0, "a"], + [8331, 0, "r"], + [8332, 0, "y"], + [8333, 0, "I"], + [8334, 0, "n"], + [8335, 0, "f"], + [8336, 0, "C"], + [8337, 0, "{"], + [8338, 0, "%"], + [8339, 0, "$"], + [8339, 1], + [8338, 1], + [8338, 0, "%"], + [8338, 1], + [8338, 0, "$"], + [8339, 0, "\\"], + [8340, 0, "m"], + [8341, 0, "a"], + [8342, 0, "t"], + [8343, 0, "h"], + [8344, 0, "i"], + [8345, 0, "t"], + [8346, 0, "{"], + [8347, 0, "c"], + [8348, 0, "t"], + [8349, 0, "x"], + [8350, 0, "}"], + [8351, 0, ","], + [8352, 0, "\\"], + [8353, 0, ","], + [8354, 0, " "], + [8355, 0, "\\"], + [8356, 0, "m"], + [8357, 0, "a"], + [8358, 0, "t"], + [8359, 0, "h"], + [8360, 0, "s"], + [8361, 0, "f"], + [8362, 0, "{"], + [8363, 0, "c"], + [8364, 0, "u"], + [8365, 0, "r"], + [8366, 0, "s"], + [8367, 0, "o"], + [8368, 0, "r"], + [8369, 0, "}"], + [8370, 0, "("], + [8371, 0, "\\"], + [8372, 0, "l"], + [8373, 0, "a"], + [8374, 0, "n"], + [8375, 0, "g"], + [8376, 0, "l"], + [8377, 0, "e"], + [8378, 0, " "], + [8379, 0, "k"], + [8380, 0, "_"], + [8381, 0, "1"], + [8382, 0, ","], + [8383, 0, " "], + [8384, 0, "k"], + [8385, 0, "_"], + [8386, 0, "2"], + [8387, 0, ","], + [8388, 0, " "], + [8389, 0, "\\"], + [8390, 0, "d"], + [8391, 0, "o"], + [8392, 0, "t"], + [8393, 0, "s"], + [8394, 0, ","], + [8395, 0, " "], + [8396, 0, "k"], + [8397, 0, "{"], + [8397, 1], + [8397, 0, "_"], + [8398, 0, "{"], + [8399, 0, "n"], + [8400, 0, "-"], + [8401, 0, "1"], + [8402, 0, "}"], + [8403, 0, " "], + [8404, 0, "\\"], + [8405, 0, "r"], + [8406, 0, "a"], + [8407, 0, "n"], + [8408, 0, "g"], + [8409, 0, "l"], + [8410, 0, "e"], + [8411, 0, ","], + [8412, 0, "\\"], + [8413, 0, ","], + [8414, 0, " "], + [8415, 0, "k"], + [8416, 0, "_"], + [8417, 0, "n"], + [8418, 0, ")"], + [8419, 0, "\\"], + [8420, 0, "."], + [8420, 1], + [8419, 1], + [8419, 0, "."], + [8420, 0, "\\"], + [8421, 0, "m"], + [8422, 0, "a"], + [8423, 0, "t"], + [8424, 0, "h"], + [8425, 0, "s"], + [8426, 0, "f"], + [8427, 0, "{"], + [8428, 0, "n"], + [8429, 0, "e"], + [8430, 0, "x"], + [8431, 0, "t"], + [8432, 0, "}"], + [8433, 0, "\n"], + [8434, 0, " "], + [8435, 0, " "], + [8436, 0, " "], + [8437, 0, " "], + [8438, 0, "\\"], + [8439, 0, "e"], + [8440, 0, "v"], + [8441, 0, "a"], + [8442, 0, "l"], + [8443, 0, "t"], + [8444, 0, "o"], + [8445, 0, " "], + [8446, 0, "\\"], + [8447, 0, "m"], + [8448, 0, "a"], + [8449, 0, "t"], + [8450, 0, "h"], + [8451, 0, "s"], + [8452, 0, "f"], + [8453, 0, "{"], + [8454, 0, "c"], + [8455, 0, "u"], + [8456, 0, "r"], + [8457, 0, "s"], + [8458, 0, "o"], + [8459, 0, "r"], + [8460, 0, "}"], + [8461, 0, "("], + [8462, 0, "\\"], + [8463, 0, "l"], + [8464, 0, "a"], + [8465, 0, "n"], + [8466, 0, "g"], + [8467, 0, "l"], + [8468, 0, "e"], + [8469, 0, " "], + [8470, 0, "k"], + [8471, 0, "_"], + [8472, 0, "1"], + [8473, 0, ","], + [8474, 0, " "], + [8475, 0, "k"], + [8476, 0, "_"], + [8477, 0, "2"], + [8478, 0, ","], + [8479, 0, " "], + [8480, 0, "\\"], + [8481, 0, "d"], + [8482, 0, "o"], + [8483, 0, "t"], + [8484, 0, "s"], + [8485, 0, ","], + [8486, 0, " "], + [8487, 0, "k"], + [8488, 0, "_"], + [8489, 0, "{"], + [8490, 0, "n"], + [8491, 0, "-"], + [8492, 0, "1"], + [8493, 0, "}"], + [8494, 0, " "], + [8495, 0, "\\"], + [8496, 0, "r"], + [8497, 0, "a"], + [8498, 0, "n"], + [8499, 0, "g"], + [8500, 0, "l"], + [8501, 0, "e"], + [8502, 0, ","], + [8503, 0, "\\"], + [8504, 0, ","], + [8505, 0, " "], + [8506, 0, "k"], + [8507, 0, "_"], + [8508, 0, "n"], + [8509, 0, "'"], + [8510, 0, ")"], + [8511, 0, "$"], + [8512, 0, "}"], + [7508, 1], + [7507, 1], + [7506, 1], + [7505, 1], + [7504, 1], + [7503, 1], + [7502, 1], + [7501, 1], + [7500, 1], + [7500, 0, "c"], + [7501, 0, "e"], + [7502, 0, "n"], + [7503, 0, "t"], + [7504, 0, "e"], + [7505, 0, "r"], + [7730, 0, "%"], + [7747, 0, "%"], + [7749, 0, "%"], + [8050, 1], + [8049, 1], + [8048, 1], + [8047, 1], + [8046, 1], + [8045, 1], + [8044, 1], + [8043, 1], + [8042, 1], + [8041, 1], + [8041, 0, "c"], + [8042, 0, "e"], + [8043, 0, "n"], + [8044, 0, "t"], + [8045, 0, "e"], + [8046, 0, "r"], + [8047, 0, "}"], + [8035, 0, "\n"], + [8036, 0, "\\"], + [8037, 0, "D"], + [8038, 0, "i"], + [8039, 0, "s"], + [8040, 0, "p"], + [8041, 0, "l"], + [8042, 0, "a"], + [8043, 0, "y"], + [8044, 0, "P"], + [8045, 0, "r"], + [8046, 0, "o"], + [8047, 0, "o"], + [8048, 0, "f"], + [8049, 0, "\\"], + [8050, 0, "p"], + [8051, 0, "r"], + [8052, 0, "o"], + [8053, 0, "o"], + [8054, 0, "f"], + [8055, 0, "S"], + [8056, 0, "k"], + [8057, 0, "i"], + [8058, 0, "p"], + [8059, 0, "A"], + [8060, 0, "m"], + [8061, 0, "o"], + [8062, 0, "u"], + [8063, 0, "n"], + [8064, 0, "t"], + [7729, 0, "\n"], + [7730, 0, "\\"], + [7731, 0, "D"], + [7732, 0, "i"], + [7733, 0, "s"], + [7734, 0, "p"], + [7735, 0, "l"], + [7736, 0, "a"], + [7737, 0, "y"], + [7738, 0, "P"], + [7739, 0, "r"], + [7740, 0, "o"], + [7741, 0, "o"], + [7742, 0, "f"], + [7743, 0, "\\"], + [7744, 0, "q"], + [7745, 0, "u"], + [7746, 0, "a"], + [7747, 0, "d"], + [7747, 1], + [7746, 1], + [7745, 1], + [7744, 1], + [7744, 0, "h"], + [7745, 0, "s"], + [7746, 0, "p"], + [7747, 0, "a"], + [7748, 0, "c"], + [7749, 0, "e"], + [7750, 0, "{"], + [7751, 0, "2"], + [7752, 0, "e"], + [7753, 0, "m"], + [7754, 0, "}"], + [7751, 1], + [7751, 0, "1"], + [7754, 1], + [7753, 1], + [7752, 1], + [7751, 1], + [7750, 1], + [7749, 1], + [7748, 1], + [7747, 1], + [7746, 1], + [7745, 1], + [7745, 0, "f"], + [7746, 0, "i"], + [7747, 0, "l"], + [7748, 0, "l"], + [7765, 1], + [7764, 1], + [7763, 1], + [7762, 1], + [7761, 1], + [7760, 1], + [7759, 1], + [7758, 1], + [7757, 1], + [7756, 1], + [7755, 1], + [7754, 1], + [7753, 1], + [7752, 1], + [7751, 1], + [7750, 1], + [7749, 1], + [7769, 1], + [7768, 1], + [7767, 1], + [7766, 1], + [7765, 1], + [7764, 1], + [7763, 1], + [7762, 1], + [7761, 1], + [7760, 1], + [7759, 1], + [7758, 1], + [7757, 1], + [7756, 1], + [7755, 1], + [7754, 1], + [7753, 1], + [7752, 1], + [7751, 1], + [5977, 0, "\n"], + [5978, 0, "\\"], + [5979, 0, "b"], + [5980, 0, "e"], + [5981, 0, "g"], + [5982, 0, "i"], + [5983, 0, "n"], + [5984, 0, "{"], + [5985, 0, "f"], + [5986, 0, "i"], + [5987, 0, "g"], + [5988, 0, "u"], + [5989, 0, "r"], + [5990, 0, "e"], + [5991, 0, "}"], + [5992, 0, "\n"], + [5993, 0, "\\"], + [5994, 0, "e"], + [5995, 0, "n"], + [5996, 0, "d"], + [5997, 0, "{"], + [5998, 0, "f"], + [5999, 0, "i"], + [6000, 0, "g"], + [6001, 0, "u"], + [6002, 0, "r"], + [6003, 0, "e"], + [6004, 0, "}"], + [6005, 0, "\n"], + [5992, 0, "\n"], + [5993, 0, "\\"], + [5994, 0, "c"], + [5995, 0, "e"], + [5996, 0, "n"], + [5997, 0, "t"], + [5998, 0, "e"], + [5999, 0, "r"], + [6000, 0, "i"], + [6001, 0, "n"], + [6002, 0, "g"], + [6003, 0, "\n"], + [6004, 0, "\\"], + [6005, 0, "b"], + [6006, 0, "e"], + [6007, 0, "g"], + [6008, 0, "i"], + [6009, 0, "n"], + [6010, 0, "{"], + [6011, 0, "t"], + [6012, 0, "a"], + [6013, 0, "b"], + [6014, 0, "u"], + [6015, 0, "l"], + [6016, 0, "a"], + [6017, 0, "r"], + [6018, 0, "}"], + [6019, 0, "{"], + [6020, 0, "l"], + [6021, 0, "l"], + [6022, 0, "}"], + [6023, 0, "\n"], + [6024, 0, "\\"], + [6025, 0, "e"], + [6026, 0, "n"], + [6027, 0, "d"], + [6028, 0, "{"], + [6029, 0, "t"], + [6030, 0, "a"], + [6031, 0, "b"], + [6032, 0, "u"], + [6033, 0, "l"], + [6034, 0, "a"], + [6035, 0, "r"], + [6036, 0, "}"], + [6037, 0, "\n"], + [6038, 0, "\\"], + [6039, 0, "c"], + [6040, 0, "a"], + [6041, 0, "p"], + [6042, 0, "t"], + [6043, 0, "i"], + [6044, 0, "o"], + [6045, 0, "n"], + [6046, 0, "{"], + [6047, 0, "I"], + [6048, 0, "n"], + [6049, 0, "t"], + [6050, 0, "e"], + [6051, 0, "r"], + [6052, 0, "n"], + [6053, 0, "a"], + [6054, 0, "l"], + [6055, 0, " "], + [6056, 0, "r"], + [6057, 0, "e"], + [6058, 0, "p"], + [6059, 0, "r"], + [6060, 0, "e"], + [6061, 0, "s"], + [6062, 0, "e"], + [6063, 0, "n"], + [6064, 0, "t"], + [6065, 0, "a"], + [6066, 0, "t"], + [6067, 0, "i"], + [6068, 0, "o"], + [6069, 0, "n"], + [6070, 0, " "], + [6071, 0, "o"], + [6072, 0, "f"], + [6073, 0, " "], + [6074, 0, "t"], + [6075, 0, "h"], + [6076, 0, "e"], + [6077, 0, " "], + [6078, 0, "e"], + [6079, 0, "x"], + [6080, 0, "a"], + [6081, 0, "m"], + [6082, 0, "p"], + [6083, 0, "l"], + [6084, 0, "e"], + [6085, 0, " "], + [6086, 0, "o"], + [6087, 0, "f"], + [6088, 0, " "], + [6089, 0, "F"], + [6090, 0, "i"], + [6091, 0, "g"], + [6092, 0, "u"], + [6093, 0, "r"], + [6094, 0, "e"], + [6095, 0, "~"], + [6096, 0, "\\"], + [6097, 0, "r"], + [6098, 0, "e"], + [6099, 0, "f"], + [6100, 0, "{"], + [6101, 0, "f"], + [6102, 0, "i"], + [6103, 0, "g"], + [6104, 0, ":"], + [6105, 0, "m"], + [6106, 0, "a"], + [6107, 0, "k"], + [6108, 0, "e"], + [6109, 0, "-"], + [6110, 0, "d"], + [6111, 0, "o"], + [6112, 0, "c"], + [6113, 0, "}"], + [6114, 0, "."], + [6115, 0, "}"], + [6116, 0, "\\"], + [6117, 0, "l"], + [6118, 0, "a"], + [6119, 0, "b"], + [6120, 0, "e"], + [6121, 0, "l"], + [6122, 0, "{"], + [6123, 0, "f"], + [6124, 0, "i"], + [6125, 0, "g"], + [6126, 0, ":"], + [6127, 0, "s"], + [6128, 0, "t"], + [6129, 0, "a"], + [6130, 0, "t"], + [6131, 0, "e"], + [6132, 0, "-"], + [6133, 0, "e"], + [6134, 0, "x"], + [6135, 0, "a"], + [6136, 0, "m"], + [6137, 0, "p"], + [6138, 0, "l"], + [6139, 0, "e"], + [6140, 0, "}"], + [6023, 0, "\n"], + [6003, 0, "\n"], + [6003, 1], + [6003, 0, " "], + [6004, 0, "\\"], + [6005, 0, "["], + [6020, 1], + [6019, 1], + [6018, 1], + [6017, 1], + [6016, 1], + [6015, 1], + [6014, 1], + [6014, 0, "a"], + [6015, 0, "r"], + [6016, 0, "r"], + [6017, 0, "a"], + [6018, 0, "y"], + [6037, 1], + [6036, 1], + [6035, 1], + [6034, 1], + [6033, 1], + [6032, 1], + [6031, 1], + [6031, 0, "a"], + [6032, 0, "r"], + [6033, 0, "r"], + [6034, 0, "a"], + [6035, 0, "y"], + [6037, 0, " "], + [6038, 0, "\\"], + [6039, 0, "]"], + [6025, 0, "A"], + [6026, 0, "_"], + [6027, 0, "p"], + [6028, 0, " "], + [6029, 0, "="], + [6030, 0, " "], + [6031, 0, "{"], + [6032, 0, "\\"], + [6033, 0, ";"], + [6034, 0, " "], + [6035, 0, "&"], + [6036, 0, " "], + [6037, 0, "\\"], + [6038, 0, "m"], + [6039, 0, "a"], + [6040, 0, "t"], + [6041, 0, "h"], + [6042, 0, "s"], + [6043, 0, "f"], + [6044, 0, "{"], + [6045, 0, "d"], + [6046, 0, "o"], + [6046, 1], + [6045, 1], + [6045, 0, "m"], + [6046, 0, "a"], + [6047, 0, "p"], + [6048, 0, "T"], + [6049, 0, "}"], + [6050, 0, "("], + [6051, 0, "\\"], + [6052, 0, "m"], + [6053, 0, "a"], + [6054, 0, "t"], + [6055, 0, "h"], + [6056, 0, "s"], + [6057, 0, "f"], + [6058, 0, "{"], + [6059, 0, "d"], + [6060, 0, "o"], + [6061, 0, "c"], + [6062, 0, "}"], + [6063, 0, ")"], + [6064, 0, " "], + [6065, 0, "\\"], + [6066, 0, "m"], + [6067, 0, "a"], + [6068, 0, "p"], + [6069, 0, "s"], + [6070, 0, "t"], + [6071, 0, "o"], + [6072, 0, " "], + [6073, 0, "{"], + [6031, 0, "\\"], + [6074, 0, "\\"], + [6141, 1], + [6140, 1], + [6140, 0, "d"], + [6141, 0, "o"], + [6142, 0, "c"], + [6143, 0, "u"], + [6144, 0, "m"], + [6145, 0, "e"], + [6146, 0, "n"], + [6147, 0, "t"], + [6148, 0, " "], + [6149, 0, "i"], + [6150, 0, "n"], + [6150, 1], + [6149, 1], + [6149, 0, "f"], + [6150, 0, "r"], + [6151, 0, "o"], + [6152, 0, "m"], + [6076, 0, " "], + [6077, 0, "\\"], + [6078, 0, "m"], + [6079, 0, "a"], + [6080, 0, "t"], + [6081, 0, "h"], + [6082, 0, "s"], + [6083, 0, "f"], + [6084, 0, "{"], + [6085, 0, "l"], + [6086, 0, "i"], + [6087, 0, "s"], + [6088, 0, "t"], + [6089, 0, "T"], + [6090, 0, "}"], + [6091, 0, "("], + [6092, 0, "\\"], + [6093, 0, "v"], + [6094, 0, "e"], + [6095, 0, "r"], + [6096, 0, "b"], + [6097, 0, "\""], + [6097, 1], + [6097, 0, "|"], + [6098, 0, "\""], + [6099, 0, "s"], + [6100, 0, "h"], + [6101, 0, "o"], + [6102, 0, "p"], + [6103, 0, "p"], + [6104, 0, "i"], + [6105, 0, "n"], + [6106, 0, "g"], + [6107, 0, "\""], + [6108, 0, "|"], + [6109, 0, ")"], + [6110, 0, " "], + [6111, 0, "\\"], + [6112, 0, "m"], + [6113, 0, "a"], + [6114, 0, "p"], + [6115, 0, "s"], + [6116, 0, "t"], + [6117, 0, "o"], + [6118, 0, " "], + [6119, 0, "\\"], + [6120, 0, "{"], + [6121, 0, "\\"], + [6122, 0, "\\"], + [6121, 0, " "], + [6076, 0, "\\"], + [6077, 0, ";"], + [6023, 1], + [6022, 1], + [6021, 1], + [6020, 1], + [6019, 1], + [6018, 1], + [6017, 1], + [6016, 1], + [6015, 1], + [6014, 1], + [6013, 1], + [6012, 1], + [6011, 1], + [6010, 1], + [6009, 1], + [6008, 1], + [6007, 1], + [6006, 1], + [6119, 1], + [6118, 1], + [6117, 1], + [6116, 1], + [6115, 1], + [6114, 1], + [6113, 1], + [6112, 1], + [6111, 1], + [6110, 1], + [6109, 1], + [6109, 0, "\\"], + [6110, 0, "m"], + [6111, 0, "a"], + [6112, 0, "t"], + [6113, 0, "h"], + [6114, 0, "s"], + [6115, 0, "f"], + [6116, 0, "{"], + [6117, 0, "n"], + [6118, 0, "e"], + [6119, 0, "x"], + [6120, 0, "t"], + [6121, 0, "}"], + [6122, 0, "("], + [6123, 0, "\\"], + [6124, 0, "m"], + [6125, 0, "a"], + [6126, 0, "t"], + [6127, 0, "h"], + [6128, 0, "i"], + [6129, 0, "t"], + [6130, 0, "{"], + [6131, 0, "i"], + [6132, 0, "d"], + [6133, 0, "}"], + [6134, 0, "-"], + [6134, 1], + [6134, 0, "_"], + [6135, 0, "3"], + [6136, 0, ")"], + [6137, 0, " "], + [6138, 0, "\\"], + [6139, 0, "m"], + [6140, 0, "a"], + [6141, 0, "p"], + [6142, 0, "s"], + [6143, 0, "t"], + [6144, 0, "o"], + [6145, 0, " "], + [6123, 0, "\\"], + [6124, 0, "m"], + [6125, 0, "a"], + [6126, 0, "t"], + [6127, 0, "h"], + [6128, 0, "s"], + [6129, 0, "f"], + [6130, 0, "{"], + [6131, 0, "h"], + [6132, 0, "e"], + [6133, 0, "a"], + [6134, 0, "d"], + [6135, 0, "}"], + [6136, 0, ")"], + [6137, 0, " "], + [6138, 0, "\\"], + [6139, 0, "m"], + [6140, 0, "a"], + [6141, 0, "p"], + [6142, 0, "s"], + [6143, 0, "t"], + [6144, 0, "o"], + [6145, 0, " "], + [6168, 1], + [6167, 1], + [6166, 1], + [6165, 1], + [6164, 1], + [6163, 1], + [6162, 1], + [6161, 1], + [6160, 1], + [6159, 1], + [6158, 1], + [6158, 0, "3"], + [6159, 0, " "], + [6160, 0, "\\"], + [6161, 0, "\\"], + [6162, 0, "\n"], + [6163, 0, "\\"], + [6164, 0, "m"], + [6165, 0, "a"], + [6166, 0, "t"], + [6167, 0, "h"], + [6168, 0, "s"], + [6169, 0, "f"], + [6170, 0, "{"], + [6171, 0, "n"], + [6172, 0, "e"], + [6173, 0, "x"], + [6174, 0, "t"], + [6175, 0, "}"], + [6176, 0, "("], + [6177, 0, "\\"], + [6178, 0, "m"], + [6179, 0, "a"], + [6180, 0, "t"], + [6181, 0, "h"], + [6182, 0, "i"], + [6183, 0, "t"], + [6184, 0, "{"], + [6185, 0, "i"], + [6186, 0, "d"], + [6187, 0, "}"], + [6188, 0, "_"], + [6189, 0, "2"], + [6190, 0, "3"], + [6190, 1], + [6189, 1], + [6189, 0, "3"], + [6190, 0, ")"], + [6191, 0, " "], + [6192, 0, "\\"], + [6193, 0, "m"], + [6194, 0, "a"], + [6195, 0, "p"], + [6196, 0, "s"], + [6197, 0, "t"], + [6198, 0, "o"], + [6199, 0, " "], + [6200, 0, "\\"], + [6201, 0, "m"], + [6202, 0, "a"], + [6203, 0, "t"], + [6204, 0, "h"], + [6205, 0, "i"], + [6206, 0, "t"], + [6207, 0, "{"], + [6208, 0, "i"], + [6209, 0, "d"], + [6210, 0, "_"], + [6211, 0, "1"], + [6212, 0, "}"], + [6213, 0, " "], + [6214, 0, "\\"], + [6215, 0, "\\"], + [6216, 0, "\n"], + [6217, 0, "\\"], + [6218, 0, "m"], + [6219, 0, "a"], + [6220, 0, "t"], + [6221, 0, "h"], + [6222, 0, "s"], + [6223, 0, "f"], + [6224, 0, "{"], + [6225, 0, "n"], + [6226, 0, "e"], + [6227, 0, "x"], + [6228, 0, "t"], + [6229, 0, "}"], + [6230, 0, "("], + [6231, 0, "m"], + [6231, 1], + [6231, 0, "\\"], + [6232, 0, "m"], + [6233, 0, "a"], + [6234, 0, "t"], + [6235, 0, "h"], + [6236, 0, "i"], + [6237, 0, "t"], + [6238, 0, "{"], + [6239, 0, "i"], + [6240, 0, "d"], + [6241, 0, "_"], + [6242, 0, "1"], + [6243, 0, "}"], + [6243, 1], + [6241, 0, "}"], + [6244, 0, ")"], + [6245, 0, " "], + [6246, 0, "\\"], + [6247, 0, "m"], + [6248, 0, "a"], + [6249, 0, "p"], + [6250, 0, "s"], + [6251, 0, "t"], + [6252, 0, "o"], + [6253, 0, " "], + [6254, 0, "\\"], + [6255, 0, "m"], + [6256, 0, "n"], + [6257, 0, "a"], + [6257, 1], + [6256, 1], + [6256, 0, "a"], + [6257, 0, "t"], + [6258, 0, "h"], + [6259, 0, "i"], + [6260, 0, "t"], + [6261, 0, "{"], + [6262, 0, "i"], + [6263, 0, "d"], + [6264, 0, "_"], + [6265, 0, "2"], + [6266, 0, "}"], + [6267, 0, " "], + [6268, 0, "\\"], + [6269, 0, "\\"], + [6270, 0, "\n"], + [6271, 0, "\\"], + [6272, 0, "m"], + [6273, 0, "a"], + [6274, 0, "t"], + [6275, 0, "h"], + [6276, 0, "s"], + [6277, 0, "f"], + [6278, 0, "{"], + [6279, 0, "n"], + [6280, 0, "e"], + [6281, 0, "x"], + [6282, 0, "t"], + [6283, 0, "}"], + [6284, 0, "("], + [6285, 0, "\\"], + [6286, 0, "m"], + [6287, 0, "a"], + [6288, 0, "t"], + [6289, 0, "h"], + [6290, 0, "i"], + [6291, 0, "t"], + [6292, 0, "{"], + [6293, 0, "i"], + [6294, 0, "d"], + [6295, 0, "}"], + [6296, 0, "_"], + [6297, 0, "2"], + [6298, 0, ")"], + [6299, 0, " "], + [6300, 0, "\\"], + [6301, 0, "m"], + [6302, 0, "a"], + [6303, 0, "p"], + [6304, 0, "s"], + [6305, 0, "t"], + [6306, 0, "o"], + [6307, 0, " "], + [6308, 0, "\\"], + [6309, 0, "m"], + [6310, 0, "a"], + [6311, 0, "t"], + [6312, 0, "h"], + [6313, 0, "s"], + [6314, 0, "f"], + [6315, 0, "{"], + [6316, 0, "t"], + [6317, 0, "a"], + [6318, 0, "i"], + [6319, 0, "l"], + [6320, 0, "}"], + [6019, 1], + [6018, 1], + [6006, 0, " "], + [6007, 0, "\\"], + [6008, 0, "b"], + [6009, 0, "e"], + [6010, 0, "g"], + [6011, 0, "i"], + [6012, 0, "n"], + [6013, 0, "{"], + [6014, 0, "a"], + [6015, 0, "l"], + [6016, 0, "i"], + [6017, 0, "g"], + [6018, 0, "n"], + [6019, 0, "a"], + [6020, 0, "t"], + [6021, 0, "*"], + [6022, 0, "}"], + [6023, 0, "{"], + [6024, 0, "2"], + [6025, 0, "}"], + [6066, 0, "&"], + [6067, 0, " "], + [6129, 0, "&"], + [6130, 0, " "], + [6185, 0, "&"], + [6186, 0, " "], + [6241, 0, "&"], + [6242, 0, " "], + [6297, 0, "&"], + [6298, 0, " "], + [6349, 0, " "], + [6350, 0, "\\"], + [6351, 0, "e"], + [6352, 0, "n"], + [6353, 0, "d"], + [6354, 0, "{"], + [6355, 0, "a"], + [6356, 0, "l"], + [6357, 0, "i"], + [6358, 0, "g"], + [6359, 0, "n"], + [6360, 0, "a"], + [6361, 0, "t"], + [6362, 0, "*"], + [6363, 0, "}"], + [6349, 1], + [6349, 0, "\n"], + [6366, 1], + [6365, 1], + [6364, 1], + [6006, 1], + [6005, 1], + [6004, 1], + [6030, 0, "&"], + [6031, 0, " "], + [6128, 0, "&"], + [6185, 0, "&"], + [6242, 0, "&"], + [6299, 0, "&"], + [6367, 0, " "], + [6368, 0, "\\"], + [6369, 0, "]"], + [6003, 0, " "], + [6004, 0, "\\"], + [6005, 0, "["], + [6030, 0, " "], + [6031, 0, "&"], + [6035, 1], + [6035, 1], + [6005, 1], + [6005, 0, "b"], + [6006, 0, "e"], + [6007, 0, "g"], + [6008, 0, "i"], + [6009, 0, "n"], + [6010, 0, "{"], + [6011, 0, "e"], + [6012, 0, "q"], + [6013, 0, "u"], + [6014, 0, "a"], + [6015, 0, "t"], + [6016, 0, "i"], + [6017, 0, "o"], + [6018, 0, "n"], + [6019, 0, "*"], + [6020, 0, "}"], + [6021, 1], + [6386, 1], + [6385, 1], + [6384, 1], + [6383, 1], + [6383, 0, "\\"], + [6384, 0, "e"], + [6385, 0, "n"], + [6386, 0, "d"], + [6387, 0, "{"], + [6388, 0, "e"], + [6389, 0, "q"], + [6390, 0, "u"], + [6391, 0, "a"], + [6392, 0, "t"], + [6393, 0, "i"], + [6394, 0, "o"], + [6395, 0, "n"], + [6396, 0, "*"], + [6397, 0, "}"], + [6383, 0, "}"], + [6083, 0, "&"], + [6146, 0, "&"], + [6204, 0, "&"], + [6262, 0, "&"], + [6320, 0, "&"], + [6146, 0, "%"], + [6205, 0, "%"], + [6264, 0, "%"], + [6323, 0, "%"], + [6041, 0, "%"], + [6020, 1], + [6019, 1], + [6018, 1], + [6017, 1], + [6016, 1], + [6015, 1], + [6014, 1], + [6013, 1], + [6012, 1], + [6011, 1], + [6010, 1], + [6009, 1], + [6008, 1], + [6007, 1], + [6006, 1], + [6005, 1], + [6004, 1], + [6391, 1], + [6390, 1], + [6389, 1], + [6388, 1], + [6387, 1], + [6386, 1], + [6385, 1], + [6384, 1], + [6383, 1], + [6382, 1], + [6381, 1], + [6380, 1], + [6379, 1], + [6378, 1], + [6377, 1], + [6024, 1], + [6129, 1], + [6187, 1], + [6245, 1], + [6303, 1], + [6081, 0, "%"], + [6081, 0, "\\"], + [6082, 0, "\\"], + [6067, 1], + [6066, 1], + [6065, 1], + [6050, 0, "&"], + [6051, 0, "&"], + [6064, 0, "f"], + [6065, 0, "f"], + [6066, 0, "f"], + [6067, 0, "f"], + [6068, 0, "f"], + [6068, 1], + [6067, 1], + [6066, 1], + [6065, 1], + [6064, 1], + [6082, 1], + [6081, 1], + [6080, 1], + [6079, 1], + [6079, 0, " "], + [6101, 1], + [6100, 1], + [6099, 1], + [6098, 1], + [6097, 1], + [6096, 1], + [6096, 0, "m"], + [6097, 0, "a"], + [6098, 0, "t"], + [6099, 0, "h"], + [6100, 0, "s"], + [6101, 0, "f"], + [6102, 0, "{"], + [6103, 0, "`"], + [6104, 0, "`"], + [6114, 1], + [6113, 1], + [6113, 0, "'"], + [6114, 0, "'"], + [6115, 0, "}"], + [6101, 1], + [6100, 1], + [6099, 1], + [6098, 1], + [6097, 1], + [6096, 1], + [6096, 0, "t"], + [6097, 0, "e"], + [6098, 0, "x"], + [6099, 0, "t"], + [6184, 0, ","], + [6243, 0, ","], + [6302, 0, ","], + [6163, 0, "&"], + [6164, 0, " "], + [6224, 0, "&"], + [6225, 0, " "], + [6285, 0, "&"], + [6286, 0, " "], + [6346, 0, "&"], + [6347, 0, " "], + [6313, 1], + [6252, 1], + [6191, 1], + [6130, 1], + [6051, 1], + [6050, 1], + [6065, 0, "&"], + [6066, 0, "&"], + [6067, 0, " "], + [6366, 0, " "], + [6367, 0, "\\"], + [6368, 0, "\\"], + [6369, 0, "\n"], + [6370, 0, "&"], + [6371, 0, " "], + [6372, 0, "\\"], + [6373, 0, "}"], + [6374, 0, "\\"], + [6375, 0, ","], + [6375, 1], + [6375, 0, ";"], + [6376, 0, "\\"], + [6377, 0, "}"], + [6378, 0, "\\"], + [6379, 0, ";"], + [6380, 0, "\\"], + [6381, 0, "}"], + [6036, 0, " "], + [6037, 0, "&"], + [6067, 1], + [6028, 1], + [6028, 1], + [6029, 0, " "], + [6030, 0, "&"], + [6038, 1], + [6037, 1], + [6050, 0, "&"], + [6067, 1], + [6066, 1], + [6093, 0, "&"], + [6029, 0, "\\"], + [6030, 0, "l"], + [6031, 0, ";"], + [6030, 1], + [6065, 0, "f"], + [6066, 0, "f"], + [6067, 0, "f"], + [6068, 0, "f"], + [6069, 0, "f"], + [6069, 1], + [6068, 1], + [6067, 1], + [6066, 1], + [6065, 1], + [6081, 0, "&"], + [6096, 1], + [6191, 0, "\n"], + [6192, 0, "&"], + [6193, 0, "&"], + [6194, 0, " "], + [6195, 0, "\\"], + [6196, 0, "m"], + [6197, 0, "a"], + [6198, 0, "t"], + [6199, 0, "h"], + [6200, 0, "s"], + [6201, 0, "f"], + [6202, 0, "{"], + [6203, 0, "r"], + [6204, 0, "e"], + [6205, 0, "g"], + [6206, 0, "T"], + [6207, 0, "}"], + [6208, 0, "("], + [6209, 0, "\\"], + [6210, 0, "m"], + [6211, 0, "a"], + [6212, 0, "t"], + [6213, 0, "h"], + [6214, 0, "i"], + [6215, 0, "t"], + [6216, 0, "{"], + [6217, 0, "i"], + [6218, 0, "d"], + [6219, 0, "}"], + [6220, 0, "_"], + [6221, 0, "3"], + [6222, 0, ")"], + [6223, 0, " "], + [6224, 0, "&"], + [6225, 0, " "], + [6226, 0, "\\"], + [6227, 0, "m"], + [6228, 0, "a"], + [6229, 0, "p"], + [6230, 0, "s"], + [6231, 0, "t"], + [6232, 0, "o"], + [6233, 0, " "], + [6234, 0, "\\"], + [6235, 0, "{"], + [6236, 0, "\\"], + [6237, 0, ","], + [6238, 0, "\\"], + [6239, 0, "m"], + [6240, 0, "a"], + [6241, 0, "t"], + [6242, 0, "h"], + [6243, 0, "s"], + [6244, 0, "f"], + [6245, 0, "{"], + [6246, 0, "o"], + [6247, 0, "p"], + [6248, 0, "}"], + [6249, 0, "("], + [6250, 0, "\\"], + [6251, 0, "m"], + [6252, 0, "a"], + [6253, 0, "t"], + [6254, 0, "h"], + [6255, 0, "i"], + [6256, 0, "t"], + [6256, 1], + [6255, 1], + [6255, 0, "s"], + [6256, 0, "f"], + [6257, 0, "{"], + [6258, 0, "i"], + [6259, 0, "d"], + [6260, 0, "}"], + [6261, 0, ":"], + [6262, 0, " "], + [6263, 0, "\\"], + [6264, 0, "m"], + [6265, 0, "a"], + [6266, 0, "t"], + [6267, 0, "h"], + [6268, 0, "i"], + [6269, 0, "t"], + [6270, 0, "{"], + [6271, 0, "i"], + [6272, 0, "d"], + [6273, 0, "}"], + [6274, 0, "_"], + [6275, 0, "3"], + [6276, 0, ","], + [6277, 0, " "], + [6278, 0, "\\"], + [6279, 0, "m"], + [6280, 0, "a"], + [6281, 0, "t"], + [6282, 0, "h"], + [6283, 0, "s"], + [6284, 0, "f"], + [6285, 0, "{"], + [6286, 0, "v"], + [6287, 0, "a"], + [6288, 0, "l"], + [6289, 0, "u"], + [6290, 0, "e"], + [6291, 0, "}"], + [6292, 0, ":"], + [6293, 0, " "], + [6294, 0, "\\"], + [6295, 0, "t"], + [6296, 0, "e"], + [6297, 0, "x"], + [6298, 0, "t"], + [6299, 0, "{"], + [6300, 0, "`"], + [6301, 0, "`"], + [6302, 0, "c"], + [6303, 0, "h"], + [6304, 0, "e"], + [6305, 0, "e"], + [6306, 0, "s"], + [6307, 0, "e"], + [6308, 0, "'"], + [6309, 0, "'"], + [6310, 0, "}"], + [6311, 0, ")"], + [6312, 0, "\\"], + [6313, 0, ","], + [6314, 0, "\\"], + [6315, 0, "}"], + [6233, 0, "\n"], + [6234, 0, " "], + [6235, 0, " "], + [6236, 0, " "], + [6320, 0, " "], + [6321, 0, "\\"], + [6322, 0, "\\"], + [6081, 1], + [6067, 0, " "], + [6068, 0, "&"], + [6052, 1], + [6032, 0, "&"], + [6504, 1], + [6504, 1], + [6504, 0, "&"], + [6505, 0, "&"], + [6506, 0, " "], + [6506, 1], + [6505, 1], + [6504, 1], + [6282, 0, "\\"], + [6283, 0, ","], + [6386, 0, "\n"], + [6387, 0, "&"], + [6388, 0, "&"], + [6389, 0, " "], + [6390, 0, "\\"], + [6391, 0, "m"], + [6392, 0, "a"], + [6393, 0, "t"], + [6394, 0, "h"], + [6395, 0, "s"], + [6396, 0, "f"], + [6397, 0, "{"], + [6398, 0, "r"], + [6399, 0, "e"], + [6400, 0, "g"], + [6401, 0, "T"], + [6402, 0, "}"], + [6403, 0, "("], + [6404, 0, "\\"], + [6405, 0, "m"], + [6406, 0, "a"], + [6407, 0, "t"], + [6408, 0, "h"], + [6409, 0, "i"], + [6410, 0, "t"], + [6411, 0, "{"], + [6412, 0, "i"], + [6413, 0, "d"], + [6414, 0, "}"], + [6415, 0, "_"], + [6416, 0, "1"], + [6417, 0, ")"], + [6418, 0, " "], + [6419, 0, "&"], + [6420, 0, " "], + [6421, 0, "\\"], + [6422, 0, "m"], + [6423, 0, "a"], + [6424, 0, "p"], + [6425, 0, "s"], + [6426, 0, "t"], + [6427, 0, "o"], + [6428, 0, " "], + [6428, 1], + [6428, 0, "\n"], + [6429, 0, " "], + [6430, 0, " "], + [6431, 0, " "], + [6432, 0, " "], + [6433, 0, "\\"], + [6434, 0, "{"], + [6435, 0, "\\"], + [6436, 0, ","], + [6437, 0, "\\"], + [6438, 0, "m"], + [6439, 0, "a"], + [6440, 0, "t"], + [6441, 0, "h"], + [6442, 0, "s"], + [6443, 0, "f"], + [6444, 0, "{"], + [6445, 0, "o"], + [6446, 0, "p"], + [6447, 0, "}"], + [6448, 0, "("], + [6449, 0, "\\"], + [6450, 0, "m"], + [6451, 0, "a"], + [6452, 0, "t"], + [6453, 0, "h"], + [6454, 0, "s"], + [6455, 0, "f"], + [6456, 0, "{"], + [6457, 0, "i"], + [6458, 0, "d"], + [6459, 0, "}"], + [6460, 0, ":"], + [6461, 0, " "], + [6462, 0, "\\"], + [6463, 0, "m"], + [6464, 0, "a"], + [6465, 0, "t"], + [6466, 0, "h"], + [6467, 0, "i"], + [6468, 0, "t"], + [6469, 0, "{"], + [6470, 0, "i"], + [6471, 0, "d"], + [6472, 0, "}"], + [6473, 0, "_"], + [6474, 0, "1"], + [6475, 0, ","], + [6476, 0, "\\"], + [6477, 0, ","], + [6478, 0, " "], + [6479, 0, "\\"], + [6480, 0, "m"], + [6481, 0, "a"], + [6482, 0, "t"], + [6483, 0, "h"], + [6484, 0, "s"], + [6485, 0, "f"], + [6486, 0, "{"], + [6487, 0, "v"], + [6488, 0, "a"], + [6489, 0, "l"], + [6490, 0, "u"], + [6491, 0, "e"], + [6492, 0, "}"], + [6493, 0, ":"], + [6494, 0, " "], + [6495, 0, "\\"], + [6496, 0, "t"], + [6497, 0, "e"], + [6498, 0, "x"], + [6499, 0, "t"], + [6500, 0, "{"], + [6501, 0, "`"], + [6502, 0, "`"], + [6503, 0, "e"], + [6504, 0, "g"], + [6505, 0, "g"], + [6506, 0, "s"], + [6507, 0, "'"], + [6508, 0, "'"], + [6509, 0, "}"], + [6510, 0, ")"], + [6511, 0, ","], + [6512, 0, "\\"], + [6513, 0, ","], + [6514, 0, "\\"], + [6515, 0, "}"], + [6516, 0, " "], + [6517, 0, "\\"], + [6518, 0, "\\"], + [6579, 0, "\n"], + [6580, 0, "&"], + [6581, 0, "&"], + [6582, 0, " "], + [6583, 0, "\\"], + [6584, 0, "m"], + [6585, 0, "a"], + [6586, 0, "t"], + [6587, 0, "h"], + [6588, 0, "s"], + [6589, 0, "f"], + [6590, 0, "{"], + [6591, 0, "r"], + [6592, 0, "e"], + [6593, 0, "g"], + [6594, 0, "T"], + [6595, 0, "}"], + [6596, 0, "("], + [6597, 0, "\\"], + [6598, 0, "m"], + [6599, 0, "a"], + [6600, 0, "t"], + [6601, 0, "h"], + [6602, 0, "i"], + [6603, 0, "t"], + [6604, 0, "{"], + [6605, 0, "i"], + [6606, 0, "d"], + [6607, 0, "_"], + [6607, 1], + [6607, 0, "}"], + [6608, 0, "_"], + [6609, 0, "2"], + [6610, 0, ")"], + [6611, 0, " "], + [6612, 0, "&"], + [6613, 0, " "], + [6614, 0, "\\"], + [6615, 0, "m"], + [6616, 0, "a"], + [6617, 0, "p"], + [6618, 0, "s"], + [6619, 0, "t"], + [6620, 0, "o"], + [6621, 0, " "], + [6622, 0, "'"], + [6622, 1], + [6621, 1], + [6621, 0, "\n"], + [6622, 0, " "], + [6623, 0, " "], + [6624, 0, " "], + [6625, 0, " "], + [6626, 0, "\\"], + [6627, 0, "{"], + [6628, 0, "\\"], + [6629, 0, ","], + [6630, 0, "\\"], + [6631, 0, "m"], + [6632, 0, "a"], + [6633, 0, "t"], + [6634, 0, "h"], + [6635, 0, "s"], + [6636, 0, "f"], + [6637, 0, "{"], + [6638, 0, "o"], + [6639, 0, "p"], + [6640, 0, "}"], + [6641, 0, "("], + [6642, 0, "\\"], + [6643, 0, "m"], + [6644, 0, "a"], + [6645, 0, "t"], + [6646, 0, "h"], + [6647, 0, "s"], + [6648, 0, "f"], + [6649, 0, "{"], + [6650, 0, "i"], + [6651, 0, "d"], + [6652, 0, "}"], + [6653, 0, ":"], + [6654, 0, " "], + [6655, 0, "\\"], + [6656, 0, "m"], + [6657, 0, "n"], + [6658, 0, "a"], + [6658, 1], + [6657, 1], + [6657, 0, "a"], + [6658, 0, "t"], + [6659, 0, "h"], + [6660, 0, "i"], + [6661, 0, "t"], + [6662, 0, "{"], + [6663, 0, "i"], + [6664, 0, "d"], + [6665, 0, "}"], + [6666, 0, "_"], + [6667, 0, "2"], + [6668, 0, ","], + [6669, 0, "\\"], + [6670, 0, ","], + [6671, 0, " "], + [6672, 0, "\\"], + [6673, 0, "m"], + [6674, 0, "a"], + [6675, 0, "t"], + [6676, 0, "h"], + [6677, 0, "s"], + [6678, 0, "f"], + [6679, 0, "{"], + [6680, 0, "v"], + [6681, 0, "a"], + [6682, 0, "l"], + [6683, 0, "u"], + [6684, 0, "e"], + [6685, 0, "}"], + [6686, 0, ":"], + [6687, 0, " "], + [6688, 0, "\\"], + [6689, 0, "t"], + [6690, 0, "e"], + [6691, 0, "x"], + [6692, 0, "t"], + [6693, 0, "{"], + [6694, 0, "`"], + [6695, 0, "`"], + [6696, 0, "m"], + [6697, 0, "i"], + [6698, 0, "l"], + [6699, 0, "k"], + [6700, 0, "'"], + [6701, 0, "'"], + [6702, 0, "}"], + [6703, 0, ")"], + [6511, 1], + [6703, 0, "\\"], + [6704, 0, ","], + [6705, 0, "\\"], + [6706, 0, "}"], + [6707, 0, " "], + [6708, 0, "\\"], + [6709, 0, "\\"], + [6707, 0, ","], + [6515, 0, ","], + [6323, 0, ","], + [9590, 0, "\n"], + [9591, 0, "\n"], + [9592, 0, "T"], + [9593, 0, "h"], + [9594, 0, "e"], + [9595, 0, " "], + [9596, 0, "s"], + [9597, 0, "t"], + [9598, 0, "a"], + [9599, 0, "t"], + [9600, 0, "e"], + [9601, 0, " "], + [9602, 0, "o"], + [9603, 0, "f"], + [9604, 0, " "], + [9605, 0, "p"], + [9606, 0, "e"], + [9607, 0, "e"], + [9608, 0, "r"], + [9609, 0, " "], + [9610, 0, "$"], + [9611, 0, "p"], + [9612, 0, "$"], + [9613, 0, " "], + [9614, 0, "i"], + [9615, 0, "s"], + [9616, 0, " "], + [9617, 0, "d"], + [9618, 0, "e"], + [9619, 0, "s"], + [9620, 0, "c"], + [9621, 0, "r"], + [9622, 0, "i"], + [9623, 0, "b"], + [9624, 0, "e"], + [9625, 0, "d"], + [9626, 0, " "], + [9627, 0, "w"], + [9628, 0, "i"], + [9629, 0, "t"], + [9630, 0, "h"], + [9631, 0, " "], + [9632, 0, "$"], + [9633, 0, "A"], + [9634, 0, "_"], + [9635, 0, "p"], + [9636, 0, "$"], + [9637, 0, ","], + [9638, 0, " "], + [9639, 0, "a"], + [9640, 0, " "], + [9641, 0, "f"], + [9642, 0, "i"], + [9643, 0, "n"], + [9644, 0, "i"], + [9645, 0, "t"], + [9646, 0, "e"], + [9647, 0, " "], + [9648, 0, "p"], + [9649, 0, "a"], + [9650, 0, "r"], + [9651, 0, "t"], + [9652, 0, "i"], + [9653, 0, "a"], + [9654, 0, "l"], + [9655, 0, " "], + [9656, 0, "f"], + [9657, 0, "u"], + [9658, 0, "n"], + [9659, 0, "c"], + [9660, 0, "t"], + [9661, 0, "i"], + [9662, 0, "o"], + [9663, 0, "n"], + [9664, 0, "."], + [9630, 1], + [9629, 1], + [9628, 1], + [9627, 1], + [9627, 0, "b"], + [9628, 0, "y"], + [9663, 0, " "], + [9664, 0, "E"], + [9664, 1], + [9664, 0, "T"], + [9665, 0, "h"], + [9666, 0, "e"], + [9667, 0, " "], + [9668, 0, "s"], + [9669, 0, "e"], + [9670, 0, "m"], + [9671, 0, "e"], + [9671, 1], + [9671, 0, "a"], + [9672, 0, "n"], + [9673, 0, "t"], + [9674, 0, "i"], + [9675, 0, "c"], + [9676, 0, "s"], + [9677, 0, " "], + [9678, 0, "o"], + [9679, 0, "f"], + [9680, 0, " "], + [9681, 0, "t"], + [9682, 0, "h"], + [9683, 0, "e"], + [9684, 0, " "], + [9685, 0, "c"], + [9686, 0, "o"], + [9687, 0, "m"], + [9688, 0, "m"], + [9689, 0, "a"], + [9690, 0, "n"], + [9691, 0, "d"], + [9692, 0, " "], + [9693, 0, "l"], + [9694, 0, "a"], + [9695, 0, "n"], + [9696, 0, "g"], + [9697, 0, "u"], + [9698, 0, "a"], + [9699, 0, "g"], + [9700, 0, "e"], + [9701, 0, " "], + [9702, 0, "a"], + [9703, 0, "r"], + [9704, 0, "e"], + [9705, 0, " "], + [9706, 0, "d"], + [9707, 0, "e"], + [9708, 0, "f"], + [9709, 0, "i"], + [9710, 0, "n"], + [9711, 0, "e"], + [9712, 0, "d"], + [9713, 0, " "], + [9714, 0, "b"], + [9715, 0, "y"], + [9716, 0, " "], + [9717, 0, "r"], + [9718, 0, "u"], + [9719, 0, "l"], + [9720, 0, "e"], + [9721, 0, "s"], + [9722, 0, " "], + [9723, 0, "t"], + [9724, 0, "h"], + [9725, 0, "a"], + [9726, 0, "t"], + [9727, 0, " "], + [9728, 0, "i"], + [9729, 0, "n"], + [9730, 0, "s"], + [9731, 0, "p"], + [9732, 0, "e"], + [9733, 0, "c"], + [9734, 0, "t"], + [9735, 0, " "], + [9736, 0, "a"], + [9737, 0, "n"], + [9738, 0, "d"], + [9739, 0, " "], + [9740, 0, "m"], + [9741, 0, "o"], + [9742, 0, "d"], + [9743, 0, "i"], + [9744, 0, "f"], + [9745, 0, "y"], + [9746, 0, " "], + [9747, 0, "t"], + [9748, 0, "h"], + [9749, 0, "i"], + [9750, 0, "s"], + [9751, 0, " "], + [9752, 0, "l"], + [9753, 0, "o"], + [9754, 0, "c"], + [9755, 0, "a"], + [9756, 0, "l"], + [9757, 0, " "], + [9758, 0, "s"], + [9759, 0, "t"], + [9760, 0, "a"], + [9761, 0, "t"], + [9762, 0, "e"], + [9763, 0, " "], + [9764, 0, "$"], + [9765, 0, "A"], + [9766, 0, "-"], + [9767, 0, "P"], + [9767, 1], + [9766, 1], + [9765, 1], + [9765, 0, "A"], + [9766, 0, "_"], + [9767, 0, "p"], + [9768, 0, "$"], + [9769, 0, ","], + [9770, 0, " "], + [9771, 0, "a"], + [9772, 0, "n"], + [9773, 0, "d"], + [9774, 0, " "], + [9775, 0, "w"], + [9776, 0, "h"], + [9777, 0, "i"], + [9778, 0, "c"], + [9779, 0, "h"], + [9780, 0, " "], + [9781, 0, "a"], + [9782, 0, "r"], + [9783, 0, "e"], + [9784, 0, " "], + [9785, 0, "i"], + [9786, 0, "n"], + [9787, 0, "d"], + [9788, 0, "e"], + [9789, 0, "p"], + [9790, 0, "e"], + [9791, 0, "n"], + [9792, 0, "t"], + [9792, 1], + [9792, 0, "d"], + [9793, 0, "e"], + [9794, 0, "n"], + [9795, 0, "t"], + [9796, 0, " "], + [9797, 0, "o"], + [9798, 0, "f"], + [9799, 0, " "], + [9800, 0, "t"], + [9801, 0, "h"], + [9802, 0, "e"], + [9803, 0, " "], + [9804, 0, "s"], + [9805, 0, "t"], + [9806, 0, "a"], + [9807, 0, "t"], + [9808, 0, "e"], + [9809, 0, " "], + [9810, 0, "o"], + [9811, 0, "f"], + [9812, 0, " "], + [9812, 1], + [9811, 1], + [9810, 1], + [9810, 0, "$"], + [9811, 0, "A"], + [9812, 0, "_"], + [9813, 0, "{"], + [9814, 0, "p"], + [9815, 0, "'"], + [9816, 0, "}"], + [9817, 0, "$"], + [9818, 0, " "], + [9819, 0, "o"], + [9820, 0, "f"], + [9821, 0, " "], + [9822, 0, "a"], + [9823, 0, "n"], + [9824, 0, "y"], + [9825, 0, " "], + [9826, 0, "o"], + [9827, 0, "t"], + [9828, 0, "h"], + [9829, 0, "e"], + [9830, 0, "r"], + [9831, 0, " "], + [9832, 0, "p"], + [9833, 0, "e"], + [9834, 0, "e"], + [9835, 0, "r"], + [9836, 0, " "], + [9837, 0, "$"], + [9838, 0, "p"], + [9839, 0, "'"], + [9840, 0, "$"], + [9841, 0, "."], + [9842, 0, " "], + [9843, 0, "T"], + [9844, 0, "h"], + [9845, 0, "e"], + [9846, 0, " "], + [9847, 0, "o"], + [9848, 0, "n"], + [9849, 0, "l"], + [9850, 0, "y"], + [9851, 0, " "], + [9852, 0, "c"], + [9853, 0, "o"], + [9854, 0, "m"], + [9855, 0, "m"], + [9856, 0, "u"], + [9857, 0, "n"], + [9858, 0, "i"], + [9859, 0, "c"], + [9860, 0, "a"], + [9861, 0, "t"], + [9862, 0, "i"], + [9863, 0, "o"], + [9864, 0, "n"], + [9865, 0, " "], + [9866, 0, "p"], + [9867, 0, "e"], + [9867, 1], + [9866, 1], + [9866, 0, "b"], + [9867, 0, "e"], + [9868, 0, "t"], + [9869, 0, "w"], + [9870, 0, "e"], + [9871, 0, "e"], + [9872, 0, "n"], + [9873, 0, " "], + [9874, 0, "p"], + [9875, 0, "e"], + [9876, 0, "e"], + [9877, 0, "r"], + [9878, 0, "s"], + [9879, 0, " "], + [9880, 0, "o"], + [9881, 0, "c"], + [9882, 0, "c"], + [9883, 0, "u"], + [9884, 0, "r"], + [9885, 0, "s"], + [9886, 0, " "], + [9887, 0, "i"], + [9888, 0, "n"], + [9889, 0, " "], + [9890, 0, "t"], + [9891, 0, "h"], + [9892, 0, "e"], + [9893, 0, " "], + [9894, 0, "e"], + [9895, 0, "v"], + [9896, 0, "a"], + [9897, 0, "l"], + [9898, 0, "u"], + [9899, 0, "a"], + [9900, 0, "t"], + [9901, 0, "i"], + [9902, 0, "o"], + [9903, 0, "n"], + [9904, 0, " "], + [9905, 0, "o"], + [9906, 0, "f"], + [9907, 0, " "], + [9908, 0, "t"], + [9909, 0, "h"], + [9910, 0, "e"], + [9911, 0, " "], + [9912, 0, "\\"], + [9913, 0, "t"], + [9914, 0, "e"], + [9915, 0, "x"], + [9916, 0, "t"], + [9917, 0, "s"], + [9918, 0, "f"], + [9919, 0, "{"], + [9920, 0, "y"], + [9921, 0, "i"], + [9922, 0, "e"], + [9923, 0, "l"], + [9924, 0, "d"], + [9925, 0, "}"], + [9926, 0, " "], + [9927, 0, "c"], + [9928, 0, "o"], + [9929, 0, "m"], + [9930, 0, "m"], + [9931, 0, "a"], + [9932, 0, "n"], + [9933, 0, "d"], + [9934, 0, ","], + [9935, 0, " "], + [9936, 0, "w"], + [9937, 0, "h"], + [9938, 0, "i"], + [9939, 0, "c"], + [9940, 0, "h"], + [9941, 0, " "], + [9942, 0, "w"], + [9943, 0, "e"], + [9944, 0, " "], + [9945, 0, "d"], + [9946, 0, "i"], + [9947, 0, "s"], + [9948, 0, "c"], + [9949, 0, "u"], + [9950, 0, "s"], + [9951, 0, "s"], + [9952, 0, " "], + [9953, 0, "l"], + [9954, 0, "a"], + [9955, 0, "t"], + [9956, 0, "e"], + [9957, 0, "r"], + [9958, 0, "."], + [9959, 0, " "], + [9960, 0, "F"], + [9961, 0, "o"], + [9962, 0, "r"], + [9963, 0, " "], + [9964, 0, "n"], + [9965, 0, "o"], + [9966, 0, "w"], + [9967, 0, " "], + [9967, 1], + [9967, 0, ","], + [9968, 0, " "], + [9969, 0, "w"], + [9970, 0, "e"], + [9971, 0, " "], + [9972, 0, "c"], + [9973, 0, "o"], + [9974, 0, "n"], + [9975, 0, "c"], + [9976, 0, "e"], + [9977, 0, "n"], + [9978, 0, "t"], + [9979, 0, "r"], + [9980, 0, "a"], + [9981, 0, "t"], + [9982, 0, "e"], + [9983, 0, " "], + [9984, 0, "o"], + [9985, 0, "n"], + [9986, 0, " "], + [9987, 0, "t"], + [9988, 0, "h"], + [9989, 0, "e"], + [9990, 0, " "], + [9991, 0, "e"], + [9992, 0, "x"], + [9993, 0, "e"], + [9994, 0, "c"], + [9995, 0, "u"], + [9996, 0, "t"], + [9997, 0, "i"], + [9998, 0, "o"], + [9999, 0, "n"], + [10000, 0, " "], + [10001, 0, "o"], + [10002, 0, "f"], + [10003, 0, " "], + [10004, 0, "c"], + [10005, 0, "o"], + [10006, 0, "m"], + [10007, 0, "m"], + [10008, 0, "a"], + [10009, 0, "n"], + [10010, 0, "d"], + [10011, 0, "s"], + [10012, 0, " "], + [10013, 0, "a"], + [10014, 0, "t"], + [10015, 0, " "], + [10016, 0, "a"], + [10017, 0, " "], + [10018, 0, "s"], + [10019, 0, "i"], + [10020, 0, "n"], + [10021, 0, "g"], + [10022, 0, "l"], + [10023, 0, "e"], + [10024, 0, " "], + [10025, 0, "p"], + [10026, 0, "e"], + [10027, 0, "e"], + [10028, 0, "r"], + [10029, 0, " "], + [10030, 0, "$"], + [10031, 0, "p"], + [10032, 0, "$"], + [10033, 0, "."], + [10034, 0, "\n"], + [10035, 0, "\n"], + [10036, 0, "A"], + [10037, 0, "n"], + [10038, 0, " "], + [10039, 0, "i"], + [10040, 0, "l"], + [10041, 0, "l"], + [10042, 0, "u"], + [10043, 0, "s"], + [10044, 0, "t"], + [10045, 0, "r"], + [10046, 0, "a"], + [10047, 0, "t"], + [10048, 0, "i"], + [10049, 0, "v"], + [10050, 0, "e"], + [10051, 0, " "], + [10052, 0, "e"], + [10053, 0, "x"], + [10054, 0, "a"], + [10055, 0, "m"], + [10056, 0, "p"], + [10057, 0, "l"], + [10058, 0, "e"], + [10059, 0, " "], + [10060, 0, "o"], + [10061, 0, "f"], + [10062, 0, " "], + [10063, 0, "t"], + [10064, 0, "h"], + [10065, 0, "e"], + [10066, 0, " "], + [10067, 0, "p"], + [10068, 0, "e"], + [10069, 0, "e"], + [10070, 0, "r"], + [10071, 0, " "], + [10072, 0, "s"], + [10073, 0, "t"], + [10074, 0, "a"], + [10075, 0, "t"], + [10076, 0, "e"], + [10077, 0, " "], + [10078, 0, "$"], + [10079, 0, "A"], + [10080, 0, "_"], + [10081, 0, "p"], + [10082, 0, "$"], + [10083, 0, " "], + [10084, 0, "i"], + [10085, 0, "s"], + [10086, 0, " "], + [10087, 0, "g"], + [10088, 0, "i"], + [10089, 0, "v"], + [10090, 0, "e"], + [10091, 0, "n"], + [10092, 0, " "], + [10093, 0, "i"], + [10094, 0, "n"], + [10095, 0, " "], + [10096, 0, "F"], + [10097, 0, "i"], + [10098, 0, "g"], + [10099, 0, "u"], + [10100, 0, "r"], + [10101, 0, "e"], + [10102, 0, "~"], + [10103, 0, "\\"], + [10104, 0, "r"], + [10105, 0, "e"], + [10106, 0, "f"], + [10107, 0, "{"], + [10108, 0, "f"], + [10109, 0, "i"], + [10110, 0, "g"], + [10111, 0, ":"], + [10112, 0, "s"], + [10113, 0, "t"], + [10114, 0, "a"], + [10115, 0, "t"], + [10116, 0, "e"], + [10117, 0, "-"], + [10118, 0, "e"], + [10119, 0, "x"], + [10120, 0, "a"], + [10121, 0, "m"], + [10122, 0, "p"], + [10123, 0, "l"], + [10124, 0, "e"], + [10125, 0, "}"], + [10126, 0, ","], + [10127, 0, " "], + [10128, 0, "w"], + [10129, 0, "h"], + [10130, 0, "i"], + [10131, 0, "c"], + [10132, 0, "h"], + [10133, 0, " "], + [10134, 0, "c"], + [10135, 0, "o"], + [10136, 0, "r"], + [10137, 0, "r"], + [10138, 0, "e"], + [10139, 0, "s"], + [10140, 0, "p"], + [10141, 0, "o"], + [10142, 0, "n"], + [10143, 0, "d"], + [10144, 0, "s"], + [10145, 0, " "], + [10146, 0, "t"], + [10147, 0, "o"], + [10148, 0, " "], + [10149, 0, "t"], + [10150, 0, "h"], + [10151, 0, "e"], + [10152, 0, " "], + [10153, 0, "s"], + [10154, 0, "h"], + [10155, 0, "o"], + [10156, 0, "p"], + [10157, 0, "p"], + [10158, 0, "i"], + [10159, 0, "n"], + [10160, 0, "g"], + [10161, 0, " "], + [10162, 0, "l"], + [10163, 0, "i"], + [10164, 0, "s"], + [10165, 0, "t"], + [10166, 0, " "], + [10167, 0, "e"], + [10168, 0, "x"], + [10169, 0, "a"], + [10170, 0, "m"], + [10171, 0, "p"], + [10172, 0, "l"], + [10173, 0, "e"], + [10174, 0, " "], + [10175, 0, "o"], + [10176, 0, "f"], + [10177, 0, " "], + [10178, 0, "F"], + [10179, 0, "i"], + [10180, 0, "g"], + [10181, 0, "u"], + [10182, 0, "r"], + [10183, 0, "e"], + [10184, 0, "~"], + [10185, 0, "\\"], + [10186, 0, "r"], + [10187, 0, "e"], + [10188, 0, "f"], + [10189, 0, "{"], + [10190, 0, "f"], + [10191, 0, "i"], + [10192, 0, "g"], + [10193, 0, ":"], + [10194, 0, "m"], + [10195, 0, "a"], + [10196, 0, "k"], + [10197, 0, "e"], + [10198, 0, "-"], + [10199, 0, "d"], + [10200, 0, "o"], + [10201, 0, "c"], + [10202, 0, "}"], + [10203, 0, "."], + [10204, 0, " "], + [10205, 0, "I"], + [10206, 0, "n"], + [10207, 0, " "], + [10208, 0, "F"], + [10209, 0, "i"], + [10210, 0, "g"], + [10211, 0, "u"], + [10212, 0, "r"], + [10213, 0, "e"], + [10214, 0, "~"], + [10215, 0, "\\"], + [10216, 0, "r"], + [10217, 0, "e"], + [10218, 0, "f"], + [10219, 0, "{"], + [10220, 0, "s"], + [10220, 1], + [10220, 0, "f"], + [10221, 0, "i"], + [10222, 0, "g"], + [10223, 0, ":"], + [10224, 0, "s"], + [10225, 0, "t"], + [10226, 0, "a"], + [10227, 0, "t"], + [10228, 0, "e"], + [10229, 0, "-"], + [10230, 0, "e"], + [10231, 0, "x"], + [10232, 0, "a"], + [10233, 0, "m"], + [10234, 0, "p"], + [10235, 0, "l"], + [10236, 0, "e"], + [10237, 0, "}"], + [10238, 0, ","], + [10239, 0, " "], + [10240, 0, "$"], + [10241, 0, "A"], + [10242, 0, "_"], + [10243, 0, "p"], + [10244, 0, "$"], + [10245, 0, " "], + [10246, 0, "i"], + [10247, 0, "s"], + [10248, 0, " "], + [10249, 0, "a"], + [10250, 0, " "], + [10251, 0, "p"], + [10252, 0, "a"], + [10253, 0, "r"], + [10254, 0, "t"], + [10255, 0, "i"], + [10256, 0, "a"], + [10257, 0, "l"], + [10258, 0, " "], + [10259, 0, "f"], + [10260, 0, "u"], + [10261, 0, "n"], + [10262, 0, "c"], + [10263, 0, "t"], + [10264, 0, "i"], + [10265, 0, "o"], + [10266, 0, "n"], + [10267, 0, " "], + [10268, 0, "w"], + [10269, 0, "h"], + [10270, 0, "o"], + [10271, 0, "s"], + [10272, 0, "e"], + [10273, 0, " "], + [10274, 0, "d"], + [10275, 0, "o"], + [10276, 0, "m"], + [10277, 0, "a"], + [10278, 0, "i"], + [10279, 0, "n"], + [10280, 0, " "], + [10281, 0, "i"], + [10282, 0, "s"], + [10283, 0, " "], + [10284, 0, "t"], + [10285, 0, "h"], + [10286, 0, "e"], + [10287, 0, " "], + [10288, 0, "s"], + [10289, 0, "i"], + [10290, 0, "n"], + [10291, 0, "g"], + [10292, 0, "l"], + [10293, 0, "e"], + [10294, 0, " "], + [10295, 0, "a"], + [10296, 0, "t"], + [10297, 0, "o"], + [10298, 0, "m"], + [10299, 0, " "], + [10300, 0, "$"], + [10301, 0, "\\"], + [10301, 1], + [10300, 1], + [10300, 0, "\\"], + [10301, 0, "m"], + [10301, 1], + [10301, 0, "t"], + [10302, 0, "e"], + [10303, 0, "x"], + [10304, 0, "t"], + [10305, 0, "s"], + [10306, 0, "f"], + [10307, 0, "{"], + [10308, 0, "m"], + [10309, 0, "a"], + [10310, 0, "p"], + [10311, 0, "T"], + [10312, 0, "("], + [10313, 0, "d"], + [10314, 0, "o"], + [10315, 0, "c"], + [10316, 0, ")"], + [10317, 0, "}"], + [10318, 0, ","], + [10319, 0, " "], + [10320, 0, "w"], + [10321, 0, "h"], + [10322, 0, "i"], + [10323, 0, "c"], + [10324, 0, "h"], + [10325, 0, " "], + [10326, 0, "d"], + [10327, 0, "e"], + [10328, 0, "n"], + [10329, 0, "o"], + [10330, 0, "t"], + [10331, 0, "e"], + [10332, 0, "s"], + [10333, 0, " "], + [10334, 0, "t"], + [10335, 0, "h"], + [10336, 0, "a"], + [10337, 0, "t"], + [10338, 0, " "], + [10339, 0, "t"], + [10340, 0, "h"], + [10341, 0, "e"], + [10342, 0, " "], + [10343, 0, "d"], + [10344, 0, "o"], + [10345, 0, "c"], + [10346, 0, "u"], + [10347, 0, "m"], + [10348, 0, "e"], + [10349, 0, "n"], + [10350, 0, "t"], + [10351, 0, " "], + [10352, 0, "\\"], + [10353, 0, "m"], + [10353, 1], + [10353, 0, "t"], + [10354, 0, "e"], + [10355, 0, "x"], + [10356, 0, "t"], + [10357, 0, "s"], + [10358, 0, "f"], + [10359, 0, "{"], + [10360, 0, "d"], + [10361, 0, "o"], + [10362, 0, "c"], + [10363, 0, "}"], + [10364, 0, " "], + [10365, 0, "i"], + [10366, 0, "s"], + [10367, 0, " "], + [10368, 0, "o"], + [10369, 0, "f"], + [10369, 1], + [10368, 1], + [10368, 0, "o"], + [10369, 0, "f"], + [10370, 0, " "], + [10371, 0, "a"], + [10372, 0, " "], + [10373, 0, "m"], + [10374, 0, "a"], + [10375, 0, "p"], + [10376, 0, " "], + [10377, 0, "t"], + [10378, 0, "y"], + [10379, 0, "p"], + [10380, 0, "e"], + [10380, 1], + [10379, 1], + [10378, 1], + [10377, 1], + [10376, 1], + [10375, 1], + [10374, 1], + [10373, 1], + [10372, 1], + [10371, 1], + [10371, 0, "t"], + [10372, 0, "y"], + [10373, 0, "p"], + [10374, 0, "e"], + [10375, 0, " "], + [10376, 0, "m"], + [10377, 0, "a"], + [10378, 0, "p"], + [10379, 0, "."], + [10380, 0, " "], + [10381, 0, "\\"], + [10382, 0, "t"], + [10383, 0, "e"], + [10384, 0, "x"], + [10385, 0, "t"], + [10386, 0, "s"], + [10387, 0, "f"], + [10388, 0, "{"], + [10389, 0, "m"], + [10390, 0, "a"], + [10391, 0, "p"], + [10392, 0, "T"], + [10393, 0, "("], + [10394, 0, "d"], + [10395, 0, "o"], + [10396, 0, "c"], + [10397, 0, "}"], + [10398, 0, " "], + [10398, 1], + [10397, 1], + [10397, 0, ")"], + [10398, 0, "}"], + [10399, 0, " "], + [10400, 0, "m"], + [10401, 0, "a"], + [10402, 0, "p"], + [10403, 0, "s"], + [10404, 0, " "], + [10405, 0, "t"], + [10406, 0, "o"], + [10407, 0, " "], + [10408, 0, "a"], + [10409, 0, " "], + [10409, 1], + [10409, 0, "n"], + [10410, 0, "o"], + [10411, 0, "t"], + [10412, 0, "h"], + [10413, 0, "e"], + [10414, 0, "r"], + [10415, 0, " "], + [10416, 0, "p"], + [10417, 0, "a"], + [10418, 0, "r"], + [10419, 0, "t"], + [10420, 0, "i"], + [10421, 0, "a"], + [10422, 0, "l"], + [10423, 0, " "], + [10424, 0, "f"], + [10425, 0, "u"], + [10426, 0, "n"], + [10427, 0, "c"], + [10428, 0, "t"], + [10429, 0, "i"], + [10430, 0, "o"], + [10431, 0, "n"], + [10432, 0, " "], + [10433, 0, "c"], + [10434, 0, "o"], + [10435, 0, "n"], + [10436, 0, "t"], + [10437, 0, "a"], + [10438, 0, "i"], + [10439, 0, "n"], + [10440, 0, "i"], + [10441, 0, "n"], + [10442, 0, "g"], + [10443, 0, " "], + [10444, 0, "t"], + [10445, 0, "h"], + [10446, 0, "e"], + [10447, 0, " "], + [10448, 0, "k"], + [10449, 0, "e"], + [10450, 0, "y"], + [10451, 0, "-"], + [10452, 0, "v"], + [10453, 0, "a"], + [10454, 0, "l"], + [10455, 0, "u"], + [10456, 0, "e"], + [10457, 0, " "], + [10458, 0, "p"], + [10459, 0, "a"], + [10460, 0, "i"], + [10461, 0, "r"], + [10462, 0, "s"], + [10463, 0, " "], + [10464, 0, "o"], + [10465, 0, "f"], + [10466, 0, " "], + [10467, 0, "t"], + [10468, 0, "h"], + [10469, 0, "e"], + [10470, 0, " "], + [10471, 0, "m"], + [10472, 0, "a"], + [10473, 0, "p"], + [10474, 0, ";"], + [10475, 0, " "], + [10476, 0, "i"], + [10477, 0, "n"], + [10478, 0, " "], + [10479, 0, "t"], + [10479, 1], + [10478, 1], + [10477, 1], + [10476, 1], + [10476, 0, "h"], + [10477, 0, "e"], + [10478, 0, "r"], + [10479, 0, "e"], + [10480, 0, ","], + [10481, 0, " "], + [10482, 0, "t"], + [10483, 0, "h"], + [10484, 0, "e"], + [10485, 0, " "], + [10486, 0, "o"], + [10487, 0, "n"], + [10488, 0, "l"], + [10489, 0, "y"], + [10490, 0, " "], + [10491, 0, "e"], + [10492, 0, "n"], + [10493, 0, "t"], + [10494, 0, "r"], + [10495, 0, "y"], + [10496, 0, " "], + [10497, 0, "i"], + [10498, 0, "s"], + [10499, 0, " "], + [10500, 0, "t"], + [10501, 0, "h"], + [10502, 0, "e"], + [10503, 0, " "], + [10504, 0, "k"], + [10505, 0, "e"], + [10506, 0, "y"], + [10507, 0, " "], + [10508, 0, "`"], + [10509, 0, "`"], + [10510, 0, "s"], + [10511, 0, "h"], + [10512, 0, "o"], + [10513, 0, "p"], + [10514, 0, "p"], + [10515, 0, "i"], + [10516, 0, "n"], + [10517, 0, "g"], + [10518, 0, "'"], + [10519, 0, "'"], + [10520, 0, " "], + [10521, 0, "o"], + [10522, 0, "f"], + [10523, 0, " "], + [10524, 0, "t"], + [10525, 0, "y"], + [10526, 0, "p"], + [10527, 0, "e"], + [10528, 0, " "], + [10529, 0, "\\"], + [10530, 0, "t"], + [10531, 0, "e"], + [10532, 0, "x"], + [10533, 0, "t"], + [10534, 0, "s"], + [10535, 0, "f"], + [10536, 0, "{"], + [10537, 0, "l"], + [10538, 0, "i"], + [10539, 0, "s"], + [10540, 0, "t"], + [10541, 0, "T"], + [10542, 0, "}"], + [10543, 0, "."], + [10544, 0, " "], + [10545, 0, "T"], + [10546, 0, "h"], + [10547, 0, "e"], + [10548, 0, " "], + [10549, 0, "l"], + [10550, 0, "i"], + [10551, 0, "s"], + [10552, 0, "t"], + [10553, 0, " "], + [10554, 0, "i"], + [10555, 0, "s"], + [10556, 0, " "], + [10557, 0, "r"], + [10558, 0, "e"], + [10559, 0, "p"], + [10560, 0, "r"], + [10561, 0, "e"], + [10562, 0, "s"], + [10563, 0, "e"], + [10564, 0, "n"], + [10565, 0, "t"], + [10566, 0, "e"], + [10567, 0, "d"], + [10568, 0, " "], + [10569, 0, "i"], + [10570, 0, "n"], + [10571, 0, " "], + [10572, 0, "a"], + [10573, 0, " "], + [10574, 0, "m"], + [10575, 0, "a"], + [10576, 0, "n"], + [10577, 0, "n"], + [10578, 0, "e"], + [10579, 0, "r"], + [10580, 0, " "], + [10581, 0, "r"], + [10582, 0, "e"], + [10583, 0, "s"], + [10584, 0, "e"], + [10585, 0, "m"], + [10586, 0, "b"], + [10587, 0, "l"], + [10588, 0, "i"], + [10589, 0, "n"], + [10590, 0, "g"], + [10591, 0, " "], + [10592, 0, "a"], + [10593, 0, " "], + [10594, 0, "l"], + [10595, 0, "i"], + [10596, 0, "n"], + [10597, 0, "k"], + [10598, 0, "e"], + [10599, 0, "d"], + [10600, 0, " "], + [10601, 0, "l"], + [10602, 0, "i"], + [10603, 0, "s"], + [10604, 0, "t"], + [10605, 0, ","], + [10606, 0, " "], + [10607, 0, "w"], + [10608, 0, "i"], + [10609, 0, "t"], + [10610, 0, "h"], + [10611, 0, " "], + [10612, 0, "e"], + [10613, 0, "a"], + [10614, 0, "c"], + [10615, 0, "h"], + [10616, 0, " "], + [10617, 0, "l"], + [10618, 0, "i"], + [10619, 0, "s"], + [10620, 0, "t"], + [10621, 0, " "], + [10622, 0, "e"], + [10623, 0, "l"], + [10624, 0, "e"], + [10625, 0, "m"], + [10626, 0, "e"], + [10627, 0, "n"], + [10628, 0, "t"], + [10629, 0, " "], + [10630, 0, "a"], + [10631, 0, "s"], + [10632, 0, "s"], + [10633, 0, "i"], + [10634, 0, "g"], + [10635, 0, "n"], + [10636, 0, "e"], + [10637, 0, "d"], + [10638, 0, " "], + [10639, 0, "a"], + [10640, 0, " "], + [10641, 0, "u"], + [10642, 0, "n"], + [10643, 0, "i"], + [10644, 0, "q"], + [10645, 0, "u"], + [10646, 0, "e"], + [10647, 0, " "], + [10648, 0, "i"], + [10649, 0, "d"], + [10650, 0, "e"], + [10651, 0, "n"], + [10652, 0, "t"], + [10653, 0, "i"], + [10654, 0, "f"], + [10655, 0, "i"], + [10656, 0, "e"], + [10657, 0, "r"], + [10658, 0, " "], + [10659, 0, "("], + [10660, 0, "$"], + [10661, 0, "\\"], + [10662, 0, "m"], + [10663, 0, "a"], + [10664, 0, "t"], + [10665, 0, "h"], + [10666, 0, "i"], + [10667, 0, "t"], + [10668, 0, "{"], + [10669, 0, "i"], + [10670, 0, "d"], + [10671, 0, "}"], + [10672, 0, "_"], + [10673, 0, "1"], + [10674, 0, ","], + [10675, 0, " "], + [10676, 0, "\\"], + [10677, 0, "m"], + [10678, 0, "a"], + [10679, 0, "t"], + [10680, 0, "h"], + [10681, 0, "i"], + [10682, 0, "t"], + [10683, 0, "{"], + [10684, 0, "i"], + [10685, 0, "d"], + [10686, 0, "}"], + [10687, 0, "_"], + [10688, 0, "2"], + [10689, 0, ","], + [10690, 0, " "], + [10691, 0, "\\"], + [10692, 0, "m"], + [10693, 0, "a"], + [10694, 0, "t"], + [10695, 0, "h"], + [10696, 0, "i"], + [10697, 0, "t"], + [10698, 0, "{"], + [10699, 0, "3"], + [10699, 1], + [10699, 0, "i"], + [10700, 0, "d"], + [10701, 0, "}"], + [10702, 0, "_"], + [10703, 0, "3"], + [10704, 0, "$"], + [10705, 0, ")"], + [10706, 0, " "], + [10706, 1], + [10706, 0, ","], + [10707, 0, " "], + [10708, 0, "a"], + [10709, 0, "n"], + [10710, 0, "d"], + [10711, 0, " "], + [10712, 0, "s"], + [10713, 0, "p"], + [10714, 0, "e"], + [10715, 0, "c"], + [10716, 0, "i"], + [10717, 0, "a"], + [10718, 0, "l"], + [10719, 0, " "], + [10720, 0, "\\"], + [10721, 0, "t"], + [10722, 0, "e"], + [10723, 0, "x"], + [10724, 0, "t"], + [10725, 0, "s"], + [10726, 0, "f"], + [10727, 0, "{"], + [10728, 0, "h"], + [10729, 0, "e"], + [10730, 0, "a"], + [10731, 0, "d"], + [10732, 0, "}"], + [10733, 0, " "], + [10734, 0, "a"], + [10735, 0, "n"], + [10736, 0, "d"], + [10737, 0, " "], + [10738, 0, "\\"], + [10739, 0, "t"], + [10740, 0, "e"], + [10741, 0, "x"], + [10742, 0, "t"], + [10743, 0, "s"], + [10744, 0, "f"], + [10745, 0, "{"], + [10746, 0, "t"], + [10747, 0, "a"], + [10748, 0, "i"], + [10749, 0, "l"], + [10750, 0, "}"], + [10751, 0, " "], + [10752, 0, "a"], + [10753, 0, "t"], + [10754, 0, "o"], + [10755, 0, "m"], + [10756, 0, "s"], + [10757, 0, " "], + [10758, 0, "d"], + [10759, 0, "e"], + [10760, 0, "n"], + [10761, 0, "o"], + [10762, 0, "t"], + [10763, 0, "i"], + [10764, 0, "n"], + [10765, 0, "g"], + [10766, 0, " "], + [10767, 0, "t"], + [10768, 0, "h"], + [10769, 0, "e"], + [10770, 0, " "], + [10771, 0, "b"], + [10772, 0, "e"], + [10773, 0, "g"], + [10774, 0, "i"], + [10775, 0, "n"], + [10776, 0, "n"], + [10777, 0, "i"], + [10778, 0, "n"], + [10779, 0, "g"], + [10780, 0, " "], + [10781, 0, "a"], + [10782, 0, "n"], + [10783, 0, "d"], + [10784, 0, " "], + [10785, 0, "e"], + [10786, 0, "n"], + [10787, 0, "d"], + [10788, 0, " "], + [10789, 0, "o"], + [10790, 0, "f"], + [10791, 0, " "], + [10792, 0, "t"], + [10793, 0, "h"], + [10794, 0, "e"], + [10795, 0, " "], + [10796, 0, "l"], + [10797, 0, "i"], + [10798, 0, "s"], + [10799, 0, "t"], + [10800, 0, "."], + [10801, 0, "\n"], + [10802, 0, "\n"], + [10803, 0, "T"], + [10804, 0, "h"], + [10805, 0, "e"], + [10806, 0, " "], + [10807, 0, "r"], + [10808, 0, "u"], + [10809, 0, "l"], + [10810, 0, "e"], + [10811, 0, "s"], + [10812, 0, " "], + [10813, 0, "f"], + [10814, 0, "o"], + [10815, 0, "r"], + [10816, 0, " "], + [10817, 0, "e"], + [10818, 0, "v"], + [10819, 0, "a"], + [10820, 0, "l"], + [10821, 0, "u"], + [10822, 0, "a"], + [10823, 0, "t"], + [10824, 0, "i"], + [10825, 0, "n"], + [10826, 0, "g"], + [10827, 0, " "], + [10828, 0, "E"], + [10829, 0, "X"], + [10830, 0, "P"], + [10831, 0, "R"], + [10832, 0, " "], + [10833, 0, "e"], + [10834, 0, "x"], + [10835, 0, "p"], + [10836, 0, "r"], + [10837, 0, "e"], + [10838, 0, "s"], + [10839, 0, "s"], + [10840, 0, "i"], + [10841, 0, "o"], + [10842, 0, "n"], + [10843, 0, "s"], + [10844, 0, " "], + [10845, 0, "i"], + [10846, 0, "n"], + [10847, 0, " "], + [10848, 0, "t"], + [10849, 0, "h"], + [10850, 0, "e"], + [10851, 0, " "], + [10852, 0, "c"], + [10853, 0, "o"], + [10854, 0, "m"], + [10855, 0, "m"], + [10856, 0, "a"], + [10857, 0, "n"], + [10858, 0, "d"], + [10859, 0, " "], + [10860, 0, "l"], + [10861, 0, "a"], + [10862, 0, "n"], + [10863, 0, "g"], + [10864, 0, "u"], + [10865, 0, "a"], + [10866, 0, "g"], + [10867, 0, "e"], + [10803, 0, "F"], + [10804, 0, "i"], + [10805, 0, "g"], + [10806, 0, "u"], + [10807, 0, "r"], + [10808, 0, "e"], + [10809, 0, "~"], + [10810, 0, "\\"], + [10811, 0, "r"], + [10812, 0, "e"], + [10813, 0, "f"], + [10814, 0, "{"], + [10815, 0, "r"], + [10815, 1], + [10815, 0, "f"], + [10816, 0, "i"], + [10817, 0, "g"], + [10818, 0, ":"], + [10819, 0, "e"], + [10820, 0, "x"], + [10821, 0, "p"], + [10822, 0, "r"], + [10823, 0, "-"], + [10824, 0, "r"], + [10825, 0, "u"], + [10826, 0, "l"], + [10827, 0, "e"], + [10828, 0, "s"], + [10829, 0, "}"], + [10830, 0, " "], + [10831, 0, "g"], + [10832, 0, "i"], + [10833, 0, "v"], + [10834, 0, "e"], + [10835, 0, "s"], + [10836, 0, " "], + [10837, 1], + [10837, 0, "t"], + [10902, 0, ","], + [10903, 0, " "], + [10904, 0, "w"], + [10905, 0, "h"], + [10906, 0, "i"], + [10907, 0, "c"], + [10908, 0, "h"], + [10909, 0, " "], + [10910, 0, "a"], + [10911, 0, "r"], + [10912, 0, "e"], + [10913, 0, " "], + [10914, 0, "a"], + [10915, 0, "p"], + [10916, 0, "p"], + [10917, 0, "l"], + [10918, 0, "i"], + [10919, 0, "e"], + [10920, 0, "d"], + [10921, 0, " "], + [10922, 0, "i"], + [10923, 0, "n"], + [10924, 0, " "], + [10925, 0, "t"], + [10926, 0, "h"], + [10927, 0, "e"], + [10928, 0, " "], + [10929, 0, "c"], + [10930, 0, "o"], + [10931, 0, "n"], + [10932, 0, "t"], + [10933, 0, "e"], + [10934, 0, "x"], + [10935, 0, "t"], + [10936, 0, " "], + [10937, 0, "o"], + [10938, 0, "f"], + [10939, 0, " "], + [10940, 0, "t"], + [10941, 0, "h"], + [10942, 0, "e"], + [10943, 0, " "], + [10944, 0, "l"], + [10945, 0, "o"], + [10946, 0, "c"], + [10947, 0, "a"], + [10948, 0, "l"], + [10949, 0, " "], + [10950, 0, "p"], + [10951, 0, "e"], + [10952, 0, "e"], + [10953, 0, "r"], + [10954, 0, " "], + [10955, 0, "s"], + [10956, 0, "t"], + [10957, 0, "a"], + [10958, 0, "t"], + [10959, 0, "e"], + [10960, 0, " "], + [10961, 0, "$"], + [10962, 0, "A"], + [10963, 0, "_"], + [10964, 0, "p"], + [10965, 0, "$"], + [10966, 0, "."], + [10920, 1], + [10919, 1], + [10918, 1], + [10917, 1], + [10916, 1], + [10915, 1], + [10914, 1], + [10914, 0, "e"], + [10915, 0, "v"], + [10916, 0, "a"], + [10917, 0, "l"], + [10918, 0, "u"], + [10919, 0, "a"], + [10920, 0, "t"], + [10921, 0, "e"], + [10922, 0, "d"], + [10969, 0, " "], + [10970, 0, "T"], + [10971, 0, "h"], + [10972, 0, "e"], + [10973, 0, " "], + [10974, 0, "\\"], + [10975, 0, "t"], + [10976, 0, "e"], + [10977, 0, "x"], + [10978, 0, "t"], + [10979, 0, "s"], + [10980, 0, "c"], + [10981, 0, "{"], + [10982, 0, "E"], + [10983, 0, "x"], + [10984, 0, "e"], + [10985, 0, "c"], + [10986, 0, "}"], + [10987, 0, " "], + [10988, 0, "r"], + [10989, 0, "u"], + [10990, 0, "l"], + [10991, 0, "e"], + [10992, 0, " "], + [10993, 0, "d"], + [10994, 0, "e"], + [10995, 0, "f"], + [10996, 0, "i"], + [10997, 0, "n"], + [10998, 0, "e"], + [10999, 0, "s"], + [11000, 0, " "], + [11001, 0, "t"], + [11002, 0, "h"], + [11003, 0, "a"], + [11004, 0, "t"], + [11005, 0, " "], + [11006, 0, "c"], + [11007, 0, "o"], + [11008, 0, "m"], + [11009, 0, "m"], + [11010, 0, "a"], + [11011, 0, "n"], + [11012, 0, "d"], + [11013, 0, "s"], + [11014, 0, " "], + [11015, 0, "a"], + [11016, 0, "r"], + [11017, 0, "e"], + [11018, 0, " "], + [11019, 0, "e"], + [11020, 0, "x"], + [11021, 0, "e"], + [11022, 0, "c"], + [11023, 0, "u"], + [11024, 0, "t"], + [11025, 0, "e"], + [11026, 0, "d"], + [11027, 0, " "], + [11028, 0, "s"], + [11029, 0, "e"], + [11030, 0, "q"], + [11031, 0, "u"], + [11032, 0, "e"], + [11033, 0, "n"], + [11034, 0, "t"], + [11035, 0, "i"], + [11036, 0, "a"], + [11037, 0, "l"], + [11038, 0, "l"], + [11039, 0, "y"], + [11040, 0, "."], + [11041, 0, " "], + [11042, 0, "T"], + [11043, 0, "h"], + [11044, 0, "e"], + [11045, 0, " "], + [11046, 0, "\\"], + [11047, 0, "t"], + [11048, 0, "e"], + [11049, 0, "x"], + [11050, 0, "t"], + [11051, 0, "s"], + [11052, 0, "c"], + [11053, 0, "{"], + [11054, 0, "L"], + [11055, 0, "e"], + [11056, 0, "t"], + [11057, 0, "}"], + [11058, 0, " "], + [11059, 0, "r"], + [11060, 0, "u"], + [11061, 0, "l"], + [11062, 0, "e"], + [11063, 0, " "], + [11064, 0, "a"], + [11065, 0, "l"], + [11066, 0, "l"], + [11067, 0, "o"], + [11068, 0, "w"], + [11069, 0, "s"], + [11070, 0, " "], + [11071, 0, "t"], + [11072, 0, "h"], + [11073, 0, "e"], + [11074, 0, " "], + [11075, 0, "p"], + [11076, 0, "r"], + [11077, 0, "o"], + [11078, 0, "g"], + [11079, 0, "r"], + [11080, 0, "a"], + [11081, 0, "m"], + [11082, 0, " "], + [11083, 0, "t"], + [11084, 0, "o"], + [11085, 0, " "], + [11086, 0, "d"], + [11087, 0, "e"], + [11088, 0, "f"], + [11089, 0, "i"], + [11090, 0, "n"], + [11091, 0, "e"], + [11092, 0, " "], + [11093, 0, "a"], + [11094, 0, " "], + [11095, 0, "l"], + [11096, 0, "o"], + [11097, 0, "c"], + [11098, 0, "a"], + [11099, 0, "l"], + [11100, 0, " "], + [11101, 0, "v"], + [11102, 0, "a"], + [11103, 0, "r"], + [11104, 0, "i"], + [11105, 0, "a"], + [11106, 0, "b"], + [11107, 0, "l"], + [11108, 0, "e"], + [11109, 0, ","], + [11110, 0, " "], + [11111, 0, "w"], + [11112, 0, "h"], + [11113, 0, "i"], + [11114, 0, "c"], + [11115, 0, "h"], + [11116, 0, " "], + [11117, 0, "i"], + [11118, 0, "s"], + [11119, 0, " "], + [11120, 0, "a"], + [11121, 0, "d"], + [11122, 0, "d"], + [11123, 0, "e"], + [11124, 0, "d"], + [11125, 0, " "], + [11126, 0, "t"], + [11127, 0, "o"], + [11128, 0, " "], + [11129, 0, "t"], + [11130, 0, "h"], + [11131, 0, "e"], + [11132, 0, " "], + [11133, 0, "l"], + [11134, 0, "o"], + [11135, 0, "c"], + [11136, 0, "a"], + [11137, 0, "l"], + [11138, 0, " "], + [11139, 0, "s"], + [11140, 0, "t"], + [11141, 0, "a"], + [11142, 0, "t"], + [11143, 0, "e"], + [11144, 0, ","], + [11145, 0, " "], + [11146, 0, "a"], + [11147, 0, "n"], + [11148, 0, "d"], + [11149, 0, " "], + [11150, 0, "t"], + [11151, 0, "h"], + [11152, 0, "e"], + [11153, 0, " "], + [11154, 0, "c"], + [11155, 0, "o"], + [11156, 0, "r"], + [11157, 0, "r"], + [11158, 0, "e"], + [11159, 0, "s"], + [11160, 0, "p"], + [11161, 0, "o"], + [11162, 0, "n"], + [11163, 0, "d"], + [11164, 0, "i"], + [11165, 0, "n"], + [11166, 0, "g"], + [11167, 0, " "], + [11168, 0, "\\"], + [11169, 0, "t"], + [11170, 0, "e"], + [11171, 0, "x"], + [11172, 0, "t"], + [11173, 0, "s"], + [11174, 0, "c"], + [11175, 0, "{"], + [11176, 0, "V"], + [11177, 0, "a"], + [11178, 0, "r"], + [11179, 0, "}"], + [11180, 0, " "], + [11181, 0, "r"], + [11182, 0, "u"], + [11183, 0, "l"], + [11184, 0, "e"], + [11185, 0, " "], + [11186, 0, "a"], + [11187, 0, "l"], + [11188, 0, "l"], + [11189, 0, "o"], + [11190, 0, "w"], + [11191, 0, "s"], + [11192, 0, " "], + [11193, 0, "t"], + [11194, 0, "h"], + [11195, 0, "e"], + [11196, 0, " "], + [11197, 0, "p"], + [11198, 0, "r"], + [11199, 0, "o"], + [11200, 0, "g"], + [11201, 0, "r"], + [11202, 0, "a"], + [11203, 0, "m"], + [11204, 0, " "], + [11205, 0, "t"], + [11206, 0, "o"], + [11207, 0, " "], + [11208, 0, "r"], + [11209, 0, "e"], + [11210, 0, "t"], + [11211, 0, "r"], + [11212, 0, "i"], + [11213, 0, "e"], + [11214, 0, "v"], + [11215, 0, "e"], + [11216, 0, " "], + [11217, 0, "t"], + [11218, 0, "h"], + [11219, 0, "e"], + [11220, 0, " "], + [11221, 0, "v"], + [11222, 0, "a"], + [11223, 0, "l"], + [11224, 0, "u"], + [11225, 0, "e"], + [11226, 0, " "], + [11227, 0, "o"], + [11228, 0, "f"], + [11229, 0, " "], + [11230, 0, "a"], + [11231, 0, " "], + [11232, 0, "p"], + [11233, 0, "r"], + [11234, 0, "e"], + [11235, 0, "v"], + [11236, 0, "i"], + [11237, 0, "o"], + [11238, 0, "u"], + [11239, 0, "s"], + [11240, 0, "l"], + [11241, 0, "y"], + [11242, 0, " "], + [11243, 0, "d"], + [11244, 0, "e"], + [11245, 0, "f"], + [11246, 0, "i"], + [11247, 0, "n"], + [11248, 0, "e"], + [11249, 0, "d"], + [11250, 0, " "], + [11251, 0, "v"], + [11252, 0, "a"], + [11253, 0, "r"], + [11254, 0, "i"], + [11255, 0, "a"], + [11256, 0, "b"], + [11257, 0, "l"], + [11258, 0, "e"], + [11259, 0, "."], + [11260, 0, "\n"], + [11261, 0, "\n"], + [11262, 0, "T"], + [11263, 0, "h"], + [11264, 0, "e"], + [11265, 0, " "], + [11266, 0, "o"], + [11267, 0, "t"], + [11268, 0, "h"], + [11269, 0, "e"], + [11270, 0, "r"], + [11270, 1], + [11269, 1], + [11268, 1], + [11267, 1], + [11266, 1], + [11266, 0, "r"], + [11267, 0, "e"], + [11268, 0, "m"], + [11269, 0, "a"], + [11270, 0, "i"], + [11271, 0, "n"], + [11272, 0, "i"], + [11273, 0, "n"], + [11274, 0, "g"], + [11275, 0, " "], + [11276, 0, "r"], + [11277, 0, "u"], + [11278, 0, "l"], + [11279, 0, "e"], + [11280, 0, "s"], + [11281, 0, " "], + [11282, 0, "i"], + [11283, 0, "n"], + [11284, 0, " "], + [11285, 0, "f"], + [11285, 1], + [11285, 0, "F"], + [11286, 0, "i"], + [11287, 0, "g"], + [11288, 0, "u"], + [11289, 0, "r"], + [11290, 0, "e"], + [11291, 0, "~"], + [11292, 0, "\\"], + [11293, 0, "r"], + [11294, 0, "e"], + [11295, 0, "f"], + [11296, 0, "{"], + [11297, 0, "f"], + [11298, 0, "i"], + [11299, 0, "g"], + [11300, 0, ":"], + [11301, 0, "e"], + [11302, 0, "x"], + [11303, 0, "p"], + [11304, 0, "r"], + [11305, 0, "-"], + [11306, 0, "r"], + [11307, 0, "u"], + [11308, 0, "l"], + [11309, 0, "e"], + [11310, 0, "s"], + [11311, 0, "}"], + [11312, 0, " "], + [11313, 0, "o"], + [11314, 0, "p"], + [11315, 0, "e"], + [11316, 0, "r"], + [11317, 0, "a"], + [11318, 0, "t"], + [11319, 0, "o"], + [11320, 0, "r"], + [11320, 1], + [11319, 1], + [11319, 0, "e"], + [11320, 0, " "], + [11320, 1], + [11319, 1], + [11318, 1], + [11317, 1], + [11316, 1], + [11315, 1], + [11314, 1], + [11313, 1], + [11313, 0, "e"], + [11314, 0, "v"], + [11315, 0, "a"], + [11316, 0, "l"], + [11317, 0, "u"], + [11318, 0, "a"], + [11319, 0, "t"], + [11320, 0, "e"], + [11321, 0, " "], + [11322, 0, "t"], + [11323, 0, "o"], + [11324, 0, " "], + [11325, 0, "a"], + [11326, 0, " "], + [11327, 0, "\\"], + [11328, 0, "e"], + [11329, 0, "m"], + [11330, 0, "p"], + [11331, 0, "h"], + [11332, 0, "{"], + [11333, 0, "c"], + [11334, 0, "u"], + [11335, 0, "r"], + [11336, 0, "s"], + [11337, 0, "o"], + [11338, 0, "r"], + [11339, 0, "}"], + [11340, 0, " "], + [11341, 0, "a"], + [11342, 0, "t"], + [11343, 0, "o"], + [11344, 0, "m"], + [11345, 0, ","], + [11346, 0, " "], + [11274, 1], + [11273, 1], + [11272, 1], + [11271, 1], + [11270, 1], + [11269, 1], + [11268, 1], + [11267, 1], + [11266, 1], + [11265, 1], + [11281, 0, "f"], + [11281, 1], + [11302, 0, " "], + [11303, 0, "s"], + [11304, 0, "h"], + [11305, 0, "o"], + [11306, 0, "w"], + [11307, 0, " "], + [11308, 0, "h"], + [11309, 0, "o"], + [11310, 0, "w"], + [11311, 0, " "], + [11312, 0, "a"], + [11313, 0, "n"], + [11314, 0, " "], + [11315, 0, "e"], + [11316, 0, "x"], + [11317, 0, "p"], + [11318, 0, "r"], + [11319, 0, "e"], + [11320, 0, "s"], + [11321, 0, "s"], + [11322, 0, "i"], + [11323, 0, "o"], + [11324, 0, "n"], + [11325, 0, " "], + [11326, 0, "i"], + [11327, 0, "s"], + [11337, 0, "d"], + [11363, 1], + [11362, 1], + [11362, 0, "."], + [11363, 0, " "], + [11363, 1], + [11362, 1], + [11362, 0, ","], + [11363, 0, " "], + [11364, 0, "w"], + [11365, 0, "h"], + [11366, 0, "i"], + [11367, 0, "c"], + [11368, 0, "h"], + [11369, 0, " "], + [11370, 0, "i"], + [11371, 0, "s"], + [11372, 0, " "], + [11372, 1], + [11371, 1], + [11370, 1], + [11369, 1], + [11368, 1], + [11367, 1], + [11366, 1], + [11365, 1], + [11364, 1], + [11363, 1], + [11362, 1], + [11362, 0, "."], + [11363, 0, " "], + [11364, 0, "A"], + [11365, 0, " "], + [11366, 0, "c"], + [11367, 0, "u"], + [11368, 0, "r"], + [11369, 0, "s"], + [11370, 0, "o"], + [11371, 0, "r"], + [11372, 0, " "], + [11373, 0, "i"], + [11374, 0, "d"], + [11375, 0, "e"], + [11376, 0, "n"], + [11377, 0, "t"], + [11378, 0, "i"], + [11379, 0, "f"], + [11380, 0, "i"], + [11381, 0, "e"], + [11382, 0, "s"], + [11383, 0, " "], + [11384, 0, "a"], + [11385, 0, " "], + [11373, 0, "u"], + [11374, 0, "n"], + [11375, 0, "a"], + [11376, 0, "m"], + [11377, 0, "b"], + [11378, 0, "i"], + [11379, 0, "g"], + [11380, 0, "u"], + [11381, 0, "o"], + [11382, 0, "u"], + [11383, 0, "s"], + [11384, 0, "l"], + [11385, 0, "y"], + [11386, 0, " "], + [11400, 0, "p"], + [11401, 0, "a"], + [11402, 0, "r"], + [11403, 0, "t"], + [11404, 0, "i"], + [11405, 0, "c"], + [11406, 0, "u"], + [11407, 0, "l"], + [11408, 0, "a"], + [11409, 0, "r"], + [11410, 0, " "], + [11411, 0, "p"], + [11412, 0, "o"], + [11413, 0, "s"], + [11414, 0, "i"], + [11415, 0, "t"], + [11416, 0, "i"], + [11417, 0, "o"], + [11418, 0, "n"], + [11419, 0, " "], + [11420, 0, "i"], + [11421, 0, "n"], + [11422, 0, " "], + [11423, 0, "a"], + [11424, 0, " "], + [11425, 0, "J"], + [11426, 0, "S"], + [11427, 0, "O"], + [11428, 0, "N"], + [11429, 0, " "], + [11430, 0, "d"], + [11431, 0, "o"], + [11432, 0, "c"], + [11433, 0, "u"], + [11434, 0, "m"], + [11435, 0, "e"], + [11436, 0, "n"], + [11437, 0, "t"], + [11438, 0, " "], + [11439, 0, "b"], + [11440, 0, "y"], + [11441, 0, " "], + [11442, 0, "d"], + [11443, 0, "e"], + [11444, 0, "s"], + [11445, 0, "c"], + [11446, 0, "r"], + [11447, 0, "i"], + [11448, 0, "b"], + [11449, 0, "i"], + [11450, 0, "n"], + [11451, 0, "g"], + [11452, 0, " "], + [11453, 0, "a"], + [11454, 0, " "], + [11455, 0, "p"], + [11456, 0, "a"], + [11457, 0, "t"], + [11458, 0, "h"], + [11459, 0, " "], + [11460, 0, "f"], + [11461, 0, "r"], + [11462, 0, "o"], + [11463, 0, "m"], + [11464, 0, " "], + [11465, 0, "t"], + [11466, 0, "h"], + [11467, 0, "e"], + [11468, 0, " "], + [11469, 0, "r"], + [11470, 0, "o"], + [11471, 0, "o"], + [11472, 0, "t"], + [11473, 0, " "], + [11474, 0, "o"], + [11475, 0, "f"], + [11476, 0, " "], + [11477, 0, "t"], + [11478, 0, "h"], + [11479, 0, "e"], + [11480, 0, " "], + [11481, 0, "d"], + [11482, 0, "o"], + [11483, 0, "c"], + [11484, 0, "u"], + [11485, 0, "m"], + [11486, 0, "e"], + [11487, 0, "n"], + [11488, 0, "t"], + [11489, 0, " "], + [11490, 0, "t"], + [11491, 0, "r"], + [11492, 0, "e"], + [11493, 0, "e"], + [11494, 0, " "], + [11495, 0, "t"], + [11496, 0, "o"], + [11497, 0, " "], + [11498, 0, "s"], + [11499, 0, "o"], + [11500, 0, "m"], + [11501, 0, "e"], + [11502, 0, " "], + [11503, 0, "b"], + [11504, 0, "r"], + [11505, 0, "a"], + [11506, 0, "n"], + [11507, 0, "c"], + [11508, 0, "h"], + [11509, 0, " "], + [11510, 0, "o"], + [11511, 0, "r"], + [11512, 0, " "], + [11513, 0, "l"], + [11514, 0, "e"], + [11515, 0, "a"], + [11516, 0, "f"], + [11517, 0, " "], + [11518, 0, "n"], + [11519, 0, "o"], + [11520, 0, "d"], + [11521, 0, "e"], + [11522, 0, "."], + [11523, 0, " "], + [11524, 0, "S"], + [11524, 1], + [11524, 0, "A"], + [11525, 0, " "], + [11526, 0, "c"], + [11527, 0, "u"], + [11528, 0, "r"], + [11529, 0, "s"], + [11530, 0, "o"], + [11531, 0, "r"], + [11532, 0, " "], + [11533, 0, "c"], + [11534, 0, "o"], + [11535, 0, "n"], + [11536, 0, "s"], + [11537, 0, "i"], + [11538, 0, "s"], + [11539, 0, "t"], + [11540, 0, "s"], + [11541, 0, " "], + [11542, 0, "o"], + [11543, 0, "n"], + [11544, 0, "l"], + [11545, 0, "y"], + [11546, 0, " "], + [11547, 0, "o"], + [11548, 0, "f"], + [11549, 0, " "], + [11550, 0, "i"], + [11551, 0, "m"], + [11552, 0, "m"], + [11553, 0, "u"], + [11554, 0, "t"], + [11555, 0, "a"], + [11556, 0, "b"], + [11557, 0, "l"], + [11558, 0, "e"], + [11559, 0, " "], + [11560, 0, "k"], + [11561, 0, "e"], + [11562, 0, "y"], + [11563, 0, "s"], + [11564, 0, " "], + [11565, 0, "a"], + [11566, 0, "n"], + [11567, 0, "d"], + [11568, 0, " "], + [11569, 0, "i"], + [11570, 0, "d"], + [11571, 0, "e"], + [11572, 0, "n"], + [11573, 0, "t"], + [11574, 0, "i"], + [11575, 0, "f"], + [11576, 0, "i"], + [11577, 0, "e"], + [11578, 0, "r"], + [11579, 0, "s"], + [11580, 0, ","], + [11581, 0, " "], + [11582, 0, "s"], + [11583, 0, "o"], + [11584, 0, " "], + [11585, 0, "i"], + [11586, 0, "t"], + [11587, 0, " "], + [11588, 0, "c"], + [11589, 0, "a"], + [11590, 0, "n"], + [11591, 0, " "], + [11592, 0, "b"], + [11593, 0, "e"], + [11594, 0, " "], + [11595, 0, "s"], + [11596, 0, "e"], + [11597, 0, "n"], + [11598, 0, "t"], + [11599, 0, " "], + [11600, 0, "o"], + [11601, 0, "v"], + [11602, 0, "e"], + [11603, 0, "r"], + [11604, 0, " "], + [11605, 0, "t"], + [11606, 0, "h"], + [11607, 0, "e"], + [11608, 0, " "], + [11609, 0, "n"], + [11610, 0, "e"], + [11611, 0, "t"], + [11612, 0, "w"], + [11613, 0, "o"], + [11614, 0, "r"], + [11615, 0, "k"], + [11616, 0, " "], + [11617, 0, "t"], + [11618, 0, "o"], + [11619, 0, " "], + [11620, 0, "a"], + [11621, 0, "n"], + [11622, 0, "o"], + [11623, 0, "t"], + [11624, 0, "h"], + [11625, 0, "e"], + [11626, 0, "r"], + [11627, 0, " "], + [11628, 0, "p"], + [11629, 0, "e"], + [11630, 0, "e"], + [11631, 0, "r"], + [11632, 0, ","], + [11633, 0, " "], + [11634, 0, "w"], + [11635, 0, "h"], + [11636, 0, "e"], + [11637, 0, "r"], + [11638, 0, "e"], + [11639, 0, " "], + [11640, 0, "i"], + [11641, 0, "t"], + [11642, 0, " "], + [11643, 0, "c"], + [11644, 0, "a"], + [11645, 0, "n"], + [11646, 0, " "], + [11647, 0, "b"], + [11648, 0, "e"], + [11649, 0, " "], + [11650, 0, "u"], + [11651, 0, "s"], + [11652, 0, "e"], + [11653, 0, "d"], + [11654, 0, " "], + [11655, 0, "t"], + [11656, 0, "o"], + [11657, 0, " "], + [11658, 0, "l"], + [11659, 0, "o"], + [11660, 0, "c"], + [11661, 0, "a"], + [11662, 0, "t"], + [11663, 0, "e"], + [11664, 0, " "], + [11665, 0, "t"], + [11666, 0, "h"], + [11667, 0, "e"], + [11668, 0, " "], + [11669, 0, "s"], + [11670, 0, "a"], + [11671, 0, "m"], + [11672, 0, "e"], + [11673, 0, " "], + [11674, 0, "p"], + [11675, 0, "o"], + [11676, 0, "s"], + [11677, 0, "i"], + [11678, 0, "t"], + [11679, 0, "i"], + [11680, 0, "o"], + [11681, 0, "n"], + [11682, 0, " "], + [11683, 0, "i"], + [11684, 0, "n"], + [11685, 0, " "], + [11686, 0, "t"], + [11687, 0, "h"], + [11688, 0, "e"], + [11689, 0, " "], + [11690, 0, "d"], + [11691, 0, "o"], + [11692, 0, "c"], + [11693, 0, "u"], + [11694, 0, "m"], + [11695, 0, "e"], + [11696, 0, "n"], + [11697, 0, "t"], + [11698, 0, "."], + [11699, 0, "\n"], + [11700, 0, "\n"], + [11701, 0, "F"], + [11702, 0, "o"], + [11703, 0, "r"], + [11704, 0, " "], + [11705, 0, "e"], + [11706, 0, "x"], + [11707, 0, "a"], + [11708, 0, "m"], + [11709, 0, "p"], + [11710, 0, "l"], + [11711, 0, "e"], + [11712, 0, ","], + [11713, 0, " "], + [11714, 0, "$"], + [11715, 0, "\\"], + [11716, 0, "m"], + [11717, 0, "a"], + [11718, 0, "t"], + [11719, 0, "h"], + [11720, 0, "s"], + [11721, 0, "f"], + [11722, 0, "{"], + [11723, 0, "c"], + [11724, 0, "u"], + [11725, 0, "r"], + [11726, 0, "s"], + [11727, 0, "o"], + [11728, 0, "r"], + [11729, 0, "}"], + [11730, 0, "("], + [11731, 0, "\\"], + [11732, 0, "l"], + [11733, 0, "a"], + [11734, 0, "n"], + [11735, 0, "g"], + [11736, 0, "l"], + [11737, 0, "e"], + [11738, 0, " "], + [11739, 0, "\\"], + [11740, 0, "m"], + [11741, 0, "a"], + [11742, 0, "t"], + [11743, 0, "h"], + [11744, 0, "s"], + [11745, 0, "f"], + [11746, 0, "{"], + [11747, 0, "m"], + [11748, 0, "a"], + [11749, 0, "p"], + [11750, 0, "T"], + [11751, 0, "}"], + [11752, 0, "("], + [11753, 0, "\\"], + [11754, 0, "m"], + [11755, 0, "a"], + [11756, 0, "t"], + [11757, 0, "h"], + [11758, 0, "s"], + [11759, 0, "f"], + [11760, 0, "{"], + [11761, 0, "d"], + [11762, 0, "o"], + [11763, 0, "c"], + [11764, 0, "}"], + [11765, 0, ")"], + [11766, 0, ","], + [11767, 0, " "], + [11768, 0, "\\"], + [11769, 0, "m"], + [11770, 0, "a"], + [11771, 0, "t"], + [11772, 0, "h"], + [11773, 0, "s"], + [11774, 0, "f"], + [11775, 0, "{"], + [11776, 0, "l"], + [11777, 0, "i"], + [11778, 0, "s"], + [11779, 0, "t"], + [11780, 0, "T"], + [11781, 0, "}"], + [11782, 0, "("], + [11783, 0, "\\"], + [11784, 0, "t"], + [11785, 0, "e"], + [11786, 0, "x"], + [11787, 0, "t"], + [11788, 0, "{"], + [11789, 0, "`"], + [11790, 0, "`"], + [11791, 0, "s"], + [11792, 0, "h"], + [11793, 0, "o"], + [11794, 0, "p"], + [11795, 0, "p"], + [11796, 0, "i"], + [11797, 0, "n"], + [11798, 0, "g"], + [11799, 0, "'"], + [11800, 0, "'"], + [11801, 0, "}"], + [11802, 0, ")"], + [11803, 0, " "], + [11804, 0, "\\"], + [11805, 0, "r"], + [11806, 0, "a"], + [11807, 0, "n"], + [11808, 0, "g"], + [11809, 0, "l"], + [11810, 0, "e"], + [11811, 0, ","], + [11812, 0, "\\"], + [11813, 0, ","], + [11814, 0, " "], + [11815, 0, "\\"], + [11816, 0, "m"], + [11817, 0, "a"], + [11818, 0, "t"], + [11819, 0, "h"], + [11820, 0, "i"], + [11821, 0, "t"], + [11822, 0, "{"], + [11823, 0, "i"], + [11824, 0, "d"], + [11825, 0, "}"], + [11826, 0, "_"], + [11827, 0, "1"], + [11828, 0, ")"], + [11829, 0, "$"], + [11830, 0, " "], + [11831, 0, "i"], + [11832, 0, "s"], + [11833, 0, " "], + [11834, 0, "a"], + [11835, 0, " "], + [11836, 0, "c"], + [11837, 0, "u"], + [11838, 0, "r"], + [11839, 0, "s"], + [11840, 0, "o"], + [11841, 0, "r"], + [11842, 0, " "], + [11843, 0, "r"], + [11844, 0, "e"], + [11845, 0, "p"], + [11846, 0, "r"], + [11847, 0, "e"], + [11848, 0, "s"], + [11849, 0, "e"], + [11850, 0, "n"], + [11851, 0, "t"], + [11852, 0, "i"], + [11853, 0, "n"], + [11854, 0, "g"], + [11855, 0, " "], + [11856, 0, "t"], + [11857, 0, "h"], + [11858, 0, "e"], + [11859, 0, " "], + [11860, 0, "l"], + [11861, 0, "i"], + [11862, 0, "s"], + [11863, 0, "t"], + [11864, 0, " "], + [11865, 0, "e"], + [11866, 0, "l"], + [11867, 0, "e"], + [11868, 0, "m"], + [11869, 0, "e"], + [11870, 0, "n"], + [11871, 0, "t"], + [11872, 0, " "], + [11873, 0, "\\"], + [11874, 0, "v"], + [11875, 0, "e"], + [11876, 0, "r"], + [11877, 0, "b"], + [11878, 0, "|"], + [11879, 0, "\""], + [11880, 0, "e"], + [11881, 0, "g"], + [11882, 0, "g"], + [11883, 0, "s"], + [11884, 0, "\""], + [11885, 0, "|"], + [11886, 0, " "], + [11887, 0, "i"], + [11888, 0, "n"], + [11889, 0, " "], + [11890, 0, "F"], + [11891, 0, "i"], + [11892, 0, "g"], + [11893, 0, "u"], + [11894, 0, "r"], + [11895, 0, "e"], + [11896, 0, "~"], + [11897, 0, "\\"], + [11898, 0, "r"], + [11899, 0, "e"], + [11900, 0, "f"], + [11901, 0, "{"], + [11902, 0, "f"], + [11903, 0, "i"], + [11904, 0, "g"], + [11905, 0, ":"], + [11906, 0, "m"], + [11907, 0, "a"], + [11908, 0, "k"], + [11909, 0, "e"], + [11910, 0, "-"], + [11911, 0, "d"], + [11912, 0, "o"], + [11913, 0, "c"], + [11914, 0, "}"], + [11915, 0, "."], + [11916, 0, " "], + [11917, 0, "T"], + [11918, 0, "h"], + [11919, 0, "e"], + [11920, 0, " "], + [11921, 0, "c"], + [11922, 0, "u"], + [11923, 0, "r"], + [11923, 1], + [11922, 1], + [11921, 1], + [11920, 1], + [11919, 1], + [11918, 1], + [11917, 1], + [11917, 0, "I"], + [11918, 0, "t"], + [11919, 0, " "], + [11920, 0, "c"], + [11921, 0, "a"], + [11922, 0, "n"], + [11923, 0, " "], + [11924, 0, "b"], + [11925, 0, "e"], + [11926, 0, " "], + [11927, 0, "i"], + [11928, 0, "n"], + [11929, 0, "t"], + [11930, 0, "e"], + [11931, 0, "r"], + [11932, 0, "p"], + [11933, 0, "r"], + [11934, 0, "e"], + [11935, 0, "t"], + [11936, 0, "e"], + [11937, 0, "d"], + [11938, 0, " "], + [11939, 0, "a"], + [11940, 0, "s"], + [11941, 0, " "], + [11942, 0, "a"], + [11943, 0, " "], + [11944, 0, "p"], + [11945, 0, "a"], + [11946, 0, "t"], + [11947, 0, "h"], + [11948, 0, ","], + [11949, 0, " "], + [11950, 0, "r"], + [11951, 0, "e"], + [11952, 0, "a"], + [11953, 0, "d"], + [11954, 0, " "], + [11955, 0, "f"], + [11956, 0, "r"], + [11957, 0, "o"], + [11958, 0, "m"], + [11959, 0, " "], + [11960, 0, "l"], + [11961, 0, "e"], + [11962, 0, "f"], + [11963, 0, "t"], + [11964, 0, " "], + [11965, 0, "t"], + [11966, 0, "o"], + [11967, 0, " "], + [11968, 0, "r"], + [11969, 0, "i"], + [11970, 0, "g"], + [11971, 0, "h"], + [11972, 0, "t"], + [11973, 0, ":"], + [11974, 0, " "], + [11948, 0, " "], + [11949, 0, "t"], + [11950, 0, "h"], + [11951, 0, "r"], + [11952, 0, "o"], + [11953, 0, "u"], + [11954, 0, "g"], + [11955, 0, "h"], + [11956, 0, " "], + [11957, 0, "t"], + [11958, 0, "h"], + [11959, 0, "e"], + [11960, 0, " "], + [11961, 0, "s"], + [11962, 0, "t"], + [11963, 0, "r"], + [11964, 0, "u"], + [11965, 0, "c"], + [11966, 0, "t"], + [11967, 0, "u"], + [11968, 0, "r"], + [11969, 0, "e"], + [11970, 0, " "], + [11971, 0, "i"], + [11972, 0, "n"], + [11973, 0, " "], + [11974, 0, "F"], + [11975, 0, "i"], + [11976, 0, "g"], + [11977, 0, "u"], + [11978, 0, "r"], + [11979, 0, "e"], + [11980, 0, "~"], + [11981, 0, "\\"], + [11982, 0, "r"], + [11983, 0, "e"], + [11984, 0, "f"], + [11985, 0, "{"], + [11986, 0, "f"], + [11987, 0, "i"], + [11988, 0, "g"], + [11989, 0, ":"], + [11990, 0, "s"], + [11991, 0, "t"], + [11992, 0, "a"], + [11993, 0, "t"], + [11994, 0, "e"], + [11995, 0, "-"], + [11996, 0, "e"], + [11997, 0, "x"], + [11998, 0, "a"], + [11999, 0, "m"], + [12000, 0, "p"], + [12001, 0, "l"], + [12002, 0, "e"], + [12003, 0, "}"], + [12031, 0, "s"], + [12032, 0, "t"], + [12033, 0, "a"], + [12034, 0, "r"], + [12035, 0, "t"], + [12036, 0, "i"], + [12037, 0, "n"], + [12038, 0, "g"], + [12039, 0, " "], + [12040, 0, "f"], + [12041, 0, "r"], + [12042, 0, "o"], + [12043, 0, "m"], + [12044, 0, " "], + [12045, 0, "t"], + [12046, 0, "h"], + [12047, 0, "e"], + [12048, 0, " "], + [12049, 0, "\\"], + [12050, 0, "m"], + [12051, 0, "a"], + [12051, 1], + [12050, 1], + [12050, 0, "t"], + [12051, 0, "e"], + [12052, 0, "x"], + [12053, 0, "t"], + [12054, 0, "s"], + [12055, 0, "f"], + [12056, 0, "{"], + [12057, 0, "d"], + [12058, 0, "o"], + [12059, 0, "c"], + [12060, 0, "}"], + [12061, 0, " "], + [12062, 0, "m"], + [12063, 0, "a"], + [12064, 0, "p"], + [12065, 0, " "], + [12066, 0, "a"], + [12067, 0, "t"], + [12068, 0, " "], + [12069, 0, "t"], + [12070, 0, "h"], + [12071, 0, "e"], + [12072, 0, " "], + [12073, 0, "r"], + [12074, 0, "o"], + [12075, 0, "o"], + [12076, 0, "t"], + [12077, 0, ","], + [12078, 0, " "], + [12079, 0, "i"], + [12080, 0, "t"], + [12081, 0, " "], + [12082, 0, "t"], + [12083, 0, "r"], + [12084, 0, "a"], + [12085, 0, "v"], + [12086, 0, "e"], + [12087, 0, "r"], + [12088, 0, "s"], + [12089, 0, "e"], + [12090, 0, "s"], + [12091, 0, " "], + [12092, 0, "t"], + [12093, 0, "h"], + [12094, 0, "r"], + [12095, 0, "o"], + [12096, 0, "u"], + [12097, 0, "g"], + [12098, 0, "h"], + [12099, 0, " "], + [12100, 0, "t"], + [12101, 0, "h"], + [12102, 0, "e"], + [12103, 0, " "], + [12104, 0, "m"], + [12105, 0, "a"], + [12106, 0, "p"], + [12107, 0, " "], + [12108, 0, "k"], + [12109, 0, "e"], + [12110, 0, "y"], + [12111, 0, " "], + [12112, 0, "`"], + [12113, 0, "`"], + [12114, 0, "s"], + [12115, 0, "h"], + [12116, 0, "o"], + [12117, 0, "p"], + [12118, 0, "p"], + [12119, 0, "i"], + [12120, 0, "n"], + [12121, 0, "g"], + [12122, 0, "'"], + [12123, 0, "'"], + [12124, 0, " "], + [12125, 0, "o"], + [12126, 0, "f"], + [12127, 0, " "], + [12128, 0, "t"], + [12129, 0, "y"], + [12130, 0, "p"], + [12131, 0, "e"], + [12132, 0, " "], + [12133, 0, "l"], + [12134, 0, "i"], + [12135, 0, "s"], + [12136, 0, "t"], + [12110, 1], + [12109, 1], + [12108, 1], + [12108, 0, "e"], + [12109, 0, "n"], + [12110, 0, "t"], + [12111, 0, "r"], + [12112, 0, "y"], + [12135, 0, "\\"], + [12136, 0, "m"], + [12137, 0, "a"], + [12138, 0, "t"], + [12139, 0, "h"], + [12140, 0, "s"], + [12141, 0, "f"], + [12142, 0, "{"], + [12147, 0, "T"], + [12148, 0, "}"], + [12149, 0, ","], + [12150, 0, " "], + [12151, 0, "a"], + [12152, 0, "n"], + [12153, 0, "d"], + [12154, 0, " "], + [12155, 0, "e"], + [12156, 0, "n"], + [12157, 0, "d"], + [12158, 0, "s"], + [12159, 0, " "], + [12160, 0, "w"], + [12161, 0, "i"], + [12162, 0, "t"], + [12163, 0, "h"], + [12164, 0, " "], + [12165, 0, "t"], + [12166, 0, "h"], + [12167, 0, "e"], + [12168, 0, " "], + [12169, 0, "l"], + [12170, 0, "i"], + [12171, 0, "s"], + [12172, 0, "t"], + [12173, 0, " "], + [12174, 0, "e"], + [12175, 0, "l"], + [12176, 0, "e"], + [12177, 0, "m"], + [12178, 0, "e"], + [12179, 0, "n"], + [12180, 0, "t"], + [12181, 0, " "], + [12182, 0, "w"], + [12183, 0, "i"], + [12184, 0, "t"], + [12185, 0, "h"], + [12186, 0, " "], + [12187, 0, "i"], + [12188, 0, "d"], + [12189, 0, "e"], + [12190, 0, "n"], + [12191, 0, "t"], + [12192, 0, "i"], + [12193, 0, "f"], + [12194, 0, "i"], + [12195, 0, "e"], + [12196, 0, "r"], + [12197, 0, " "], + [12198, 0, "$"], + [12199, 0, "\\"], + [12200, 0, "m"], + [12201, 0, "a"], + [12202, 0, "t"], + [12203, 0, "h"], + [12204, 0, "i"], + [12205, 0, "t"], + [12206, 0, "{"], + [12207, 0, "i"], + [12208, 0, "d"], + [12209, 0, "}"], + [12210, 0, "_"], + [12211, 0, "1"], + [12212, 0, "$"], + [12213, 0, "."], + [12139, 1], + [12138, 1], + [12137, 1], + [12136, 1], + [12136, 0, "t"], + [12137, 0, "e"], + [12138, 0, "x"], + [12139, 0, "t"], + [11713, 1], + [11712, 1], + [11711, 1], + [11710, 1], + [11709, 1], + [11708, 1], + [11707, 1], + [11707, 0, "a"], + [11708, 0, "m"], + [11709, 0, "p"], + [11710, 0, "k"], + [11711, 0, "e"], + [11711, 1], + [11710, 1], + [11709, 1], + [11709, 0, "p"], + [11710, 0, "l"], + [11711, 0, "e"], + [11712, 0, ","], + [11713, 0, " "], + [11713, 1], + [11713, 0, "\n"], + [11714, 0, "$"], + [11831, 0, "$"], + [11832, 0, "\n"], + [11833, 1], + [10800, 0, ","], + [10801, 0, " "], + [10802, 0, "r"], + [10803, 0, "e"], + [10804, 0, "s"], + [10805, 0, "p"], + [10806, 0, "e"], + [10807, 0, "c"], + [10808, 0, "t"], + [10809, 0, "i"], + [10810, 0, "v"], + [10811, 0, "e"], + [10812, 0, "l"], + [10813, 0, "y"], + [12174, 1], + [12173, 1], + [12172, 1], + [12171, 1], + [12171, 0, "f"], + [12172, 0, "i"], + [12173, 0, "n"], + [12174, 0, "i"], + [12175, 0, "s"], + [12176, 0, "h"], + [12177, 0, "e"], + [12178, 0, "s"], + [12234, 0, "\n"], + [12235, 0, "\n"], + [12236, 0, "I"], + [12237, 0, "n"], + [12238, 0, " "], + [12239, 0, "g"], + [12240, 0, "e"], + [12241, 0, "n"], + [12242, 0, "e"], + [12243, 0, "r"], + [12244, 0, "a"], + [12245, 0, "l"], + [12246, 0, ","], + [12247, 0, " "], + [12248, 0, "a"], + [12249, 0, " "], + [12250, 0, "c"], + [12251, 0, "u"], + [12252, 0, "r"], + [12253, 0, "s"], + [12254, 0, "o"], + [12255, 0, "r"], + [12256, 0, " "], + [12257, 0, "c"], + [12258, 0, "o"], + [12259, 0, "n"], + [12260, 0, "t"], + [12261, 0, "a"], + [12262, 0, "i"], + [12263, 0, "n"], + [12264, 0, "s"], + [12264, 1], + [12263, 1], + [12262, 1], + [12261, 1], + [12260, 1], + [12260, 0, "s"], + [12261, 0, "i"], + [12262, 0, "s"], + [12263, 0, "t"], + [12264, 0, "s"], + [12265, 0, " "], + [12266, 0, "o"], + [12267, 0, "f"], + [12268, 0, " "], + [12268, 1], + [12267, 1], + [12266, 1], + [12265, 1], + [12264, 1], + [12263, 1], + [12262, 1], + [12261, 1], + [12260, 1], + [12259, 1], + [12258, 1], + [12257, 1], + [12256, 1], + [12255, 1], + [12254, 1], + [12253, 1], + [12252, 1], + [12251, 1], + [12250, 1], + [12249, 1], + [12248, 1], + [12248, 0, "$"], + [12249, 0, "\\"], + [12250, 0, "m"], + [12251, 0, "a"], + [12252, 0, "t"], + [12253, 0, "h"], + [12254, 0, "s"], + [12255, 0, "f"], + [12256, 0, "{"], + [12257, 0, "c"], + [12258, 0, "u"], + [12259, 0, "r"], + [12260, 0, "s"], + [12261, 0, "o"], + [12262, 0, "r"], + [12263, 0, "}"], + [12264, 0, "("], + [12265, 0, "\\"], + [12266, 0, "l"], + [12267, 0, "a"], + [12268, 0, "n"], + [12269, 0, "g"], + [12270, 0, "l"], + [12271, 0, "e"], + [12272, 0, " "], + [12273, 0, "k"], + [12274, 0, "_"], + [12275, 0, "1"], + [12276, 0, ","], + [12277, 0, " "], + [12278, 0, "\\"], + [12279, 0, "d"], + [12280, 0, "o"], + [12281, 0, "t"], + [12282, 0, "s"], + [12283, 0, ","], + [12284, 0, " "], + [12285, 0, "\\"], + [12286, 0, "k"], + [12286, 1], + [12285, 1], + [12285, 0, "k"], + [12286, 0, "_"], + [12287, 0, "{"], + [12288, 0, "n"], + [12289, 0, "-"], + [12290, 0, "1"], + [12291, 0, "}"], + [12292, 0, " "], + [12293, 0, "\\"], + [12294, 0, "r"], + [12295, 0, "a"], + [12296, 0, "n"], + [12297, 0, "g"], + [12298, 0, "l"], + [12299, 0, "e"], + [12300, 0, ","], + [12301, 0, "\\"], + [12302, 0, ","], + [12303, 0, " "], + [12304, 0, "k"], + [12305, 0, "_"], + [12306, 0, "n"], + [12307, 0, ")"], + [12308, 0, "$"], + [12309, 0, " "], + [12310, 0, "c"], + [12311, 0, "o"], + [12312, 0, "n"], + [12313, 0, "s"], + [12314, 0, "i"], + [12315, 0, "s"], + [12316, 0, "t"], + [12317, 0, "s"], + [12318, 0, " "], + [12319, 0, "o"], + [12320, 0, "f"], + [12321, 0, " "], + [12322, 0, "a"], + [12323, 0, " "], + [12324, 0, "v"], + [12325, 0, "e"], + [12326, 0, "c"], + [12327, 0, "t"], + [12328, 0, "o"], + [12329, 0, "r"], + [12330, 0, " "], + [12331, 0, "o"], + [12332, 0, "f"], + [12333, 0, " "], + [12334, 0, "k"], + [12335, 0, "e"], + [12336, 0, "y"], + [12337, 0, "s"], + [12338, 0, " "], + [12339, 0, "$"], + [12340, 0, "\\"], + [12341, 0, "l"], + [12342, 0, "a"], + [12343, 0, "n"], + [12344, 0, "g"], + [12345, 0, "l"], + [12346, 0, "e"], + [12347, 0, " "], + [12348, 0, "k"], + [12349, 0, "_"], + [12350, 0, "1"], + [12351, 0, ","], + [12352, 0, " "], + [12353, 0, "\\"], + [12354, 0, "d"], + [12355, 0, "o"], + [12356, 0, "t"], + [12357, 0, "s"], + [12323, 0, " "], + [12324, 0, "("], + [12325, 0, "p"], + [12326, 0, "o"], + [12327, 0, "s"], + [12328, 0, "s"], + [12329, 0, "i"], + [12330, 0, "b"], + [12331, 0, "l"], + [12332, 0, "y"], + [12333, 0, " "], + [12334, 0, "e"], + [12335, 0, "m"], + [12336, 0, "p"], + [12337, 0, "t"], + [12338, 0, "y"], + [12339, 0, ")"], + [12375, 0, ","], + [12376, 0, " "], + [12377, 0, "k"], + [12378, 0, "_"], + [12379, 0, "{"], + [12380, 0, "n"], + [12381, 0, "-"], + [12382, 0, "1"], + [12383, 0, "}"], + [12384, 0, " "], + [12385, 0, "\\"], + [12386, 0, "r"], + [12387, 0, "a"], + [12388, 0, "n"], + [12389, 0, "g"], + [12390, 0, "l"], + [12391, 0, "e"], + [12392, 0, "$"], + [12393, 0, ","], + [12394, 0, " "], + [12395, 0, "a"], + [12396, 0, "n"], + [12397, 0, "d"], + [12398, 0, " "], + [12399, 0, "a"], + [12400, 0, " "], + [12401, 0, "f"], + [12402, 0, "i"], + [12403, 0, "n"], + [12404, 0, "a"], + [12405, 0, "l"], + [12406, 0, " "], + [12407, 0, "k"], + [12408, 0, "e"], + [12409, 0, "y"], + [12410, 0, " "], + [12411, 0, "$"], + [12412, 0, "k"], + [12413, 0, "_"], + [12414, 0, "n"], + [12415, 0, "$"], + [12416, 0, " "], + [12417, 0, "("], + [12418, 0, "w"], + [12419, 0, "h"], + [12420, 0, "i"], + [12421, 0, "c"], + [12422, 0, "h"], + [12423, 0, " "], + [12424, 0, "i"], + [12425, 0, "s"], + [12426, 0, " "], + [12427, 0, "a"], + [12428, 0, "l"], + [12429, 0, "w"], + [12430, 0, "a"], + [12431, 0, "y"], + [12432, 0, "s"], + [12433, 0, " "], + [12434, 0, "p"], + [12435, 0, "r"], + [12436, 0, "e"], + [12437, 0, "s"], + [12438, 0, "e"], + [12439, 0, "n"], + [12440, 0, "t"], + [12441, 0, ")"], + [12442, 0, "."], + [12443, 0, " "], + [12444, 0, "$"], + [12445, 0, "k"], + [12446, 0, "_"], + [12447, 0, "n"], + [12448, 0, "$"], + [12449, 0, " "], + [12450, 0, "c"], + [12451, 0, "a"], + [12452, 0, "n"], + [12453, 0, " "], + [12454, 0, "b"], + [12455, 0, "e"], + [12456, 0, " "], + [12457, 0, "t"], + [12458, 0, "h"], + [12459, 0, "o"], + [12460, 0, "u"], + [12461, 0, "g"], + [12462, 0, "h"], + [12463, 0, "t"], + [12464, 0, " "], + [12465, 0, "o"], + [12466, 0, "f"], + [12467, 0, " "], + [12468, 0, "a"], + [12469, 0, "s"], + [12470, 0, " "], + [12471, 0, "t"], + [12472, 0, "h"], + [12473, 0, "e"], + [12474, 0, " "], + [12475, 0, "f"], + [12476, 0, "i"], + [12477, 0, "n"], + [12478, 0, "a"], + [12479, 0, "l"], + [12480, 0, " "], + [12481, 0, "e"], + [12482, 0, "l"], + [12483, 0, "e"], + [12484, 0, "m"], + [12485, 0, "e"], + [12486, 0, "n"], + [12487, 0, "t"], + [12488, 0, " "], + [12489, 0, "o"], + [12490, 0, "f"], + [12491, 0, " "], + [12492, 0, "t"], + [12493, 0, "h"], + [12494, 0, "e"], + [12495, 0, " "], + [12496, 0, "v"], + [12497, 0, "e"], + [12498, 0, "c"], + [12499, 0, "t"], + [12500, 0, "o"], + [12501, 0, "r"], + [12502, 0, ","], + [12503, 0, " "], + [12504, 0, "w"], + [12505, 0, "i"], + [12506, 0, "t"], + [12507, 0, "h"], + [12508, 0, " "], + [12509, 0, "t"], + [12510, 0, "h"], + [12511, 0, "e"], + [12512, 0, " "], + [12513, 0, "d"], + [12514, 0, "i"], + [12515, 0, "s"], + [12516, 0, "t"], + [12517, 0, "i"], + [12518, 0, "n"], + [12519, 0, "c"], + [12520, 0, "t"], + [12521, 0, "i"], + [12522, 0, "o"], + [12523, 0, "n"], + [12524, 0, " "], + [12525, 0, "t"], + [12526, 0, "h"], + [12527, 0, "a"], + [12528, 0, "t"], + [12529, 0, " "], + [12530, 0, "i"], + [12531, 0, "s"], + [12531, 1], + [12531, 0, "t"], + [12532, 0, " "], + [12533, 0, "i"], + [12534, 0, "s"], + [12535, 0, " "], + [12536, 0, "n"], + [12537, 0, "o"], + [12538, 0, "t"], + [12539, 0, " "], + [12540, 0, "t"], + [12541, 0, "a"], + [12542, 0, "g"], + [12543, 0, "g"], + [12544, 0, "e"], + [12545, 0, "d"], + [12546, 0, " "], + [12547, 0, "w"], + [12548, 0, "i"], + [12549, 0, "t"], + [12550, 0, "h"], + [12551, 0, " "], + [12552, 0, "a"], + [12553, 0, " "], + [12554, 0, "d"], + [12555, 0, "a"], + [12556, 0, "t"], + [12557, 0, "a"], + [12558, 0, "t"], + [12559, 0, "y"], + [12560, 0, "p"], + [12561, 0, "e"], + [12562, 0, ","], + [12563, 0, " "], + [12564, 0, "w"], + [12565, 0, "h"], + [12566, 0, "e"], + [12567, 0, "r"], + [12568, 0, "e"], + [12569, 0, "a"], + [12570, 0, "s"], + [12571, 0, " "], + [12572, 0, "t"], + [12573, 0, "h"], + [12574, 0, "e"], + [12575, 0, " "], + [12576, 0, "e"], + [12577, 0, "l"], + [12578, 0, "e"], + [12579, 0, "m"], + [12580, 0, "e"], + [12581, 0, "n"], + [12582, 0, "t"], + [12583, 0, "s"], + [12584, 0, " "], + [12585, 0, "o"], + [12586, 0, "f"], + [12587, 0, " "], + [12588, 0, "t"], + [12589, 0, "h"], + [12590, 0, "e"], + [12591, 0, " "], + [12592, 0, "v"], + [12593, 0, "e"], + [12594, 0, "c"], + [12595, 0, "t"], + [12596, 0, "o"], + [12597, 0, "r"], + [12598, 0, " "], + [12599, 0, "h"], + [12600, 0, "a"], + [12601, 0, "v"], + [12602, 0, "e"], + [12603, 0, " "], + [12604, 0, "a"], + [12605, 0, " "], + [12606, 0, "d"], + [12607, 0, "a"], + [12608, 0, "t"], + [12609, 0, "a"], + [12610, 0, "t"], + [12611, 0, "y"], + [12612, 0, "p"], + [12613, 0, "e"], + [12614, 0, " "], + [12615, 0, "a"], + [12616, 0, "n"], + [12617, 0, "n"], + [12617, 1], + [12616, 1], + [12615, 1], + [12615, 0, "a"], + [12616, 0, "t"], + [12617, 0, "o"], + [12618, 0, "m"], + [12619, 0, " "], + [12620, 0, "s"], + [12621, 0, "u"], + [12622, 0, "c"], + [12623, 0, "h"], + [12624, 0, " "], + [12625, 0, "a"], + [12626, 0, "s"], + [12627, 0, " "], + [12628, 0, "$"], + [12629, 0, "\\"], + [12629, 1], + [12628, 1], + [12628, 0, "\\"], + [12629, 0, "t"], + [12630, 0, "e"], + [12631, 0, "x"], + [12632, 0, "t"], + [12633, 0, "s"], + [12634, 0, "f"], + [12635, 0, "{"], + [12636, 0, "m"], + [12637, 0, "a"], + [12638, 0, "p"], + [12639, 0, "T"], + [12640, 0, "}"], + [12641, 0, " "], + [12642, 0, "o"], + [12643, 0, "r"], + [12644, 0, " "], + [12645, 0, "\\"], + [12646, 0, "t"], + [12647, 0, "e"], + [12648, 0, "x"], + [12649, 0, "t"], + [12650, 0, "s"], + [12651, 0, "f"], + [12652, 0, "{"], + [12653, 0, "l"], + [12654, 0, "i"], + [12655, 0, "s"], + [12656, 0, "t"], + [12657, 0, "T"], + [12658, 0, "}"], + [12659, 0, "."], + [12660, 0, "\n"], + [12661, 0, "\n"], + [12662, 0, "T"], + [12663, 0, "h"], + [12664, 0, "e"], + [12665, 0, " "], + [12666, 0, "\\"], + [12667, 0, "m"], + [12668, 0, "a"], + [12669, 0, "t"], + [12669, 1], + [12668, 1], + [12667, 1], + [12667, 0, "t"], + [12668, 0, "e"], + [12669, 0, "x"], + [12670, 0, "t"], + [12671, 0, "s"], + [12672, 0, "c"], + [12673, 0, "{"], + [12674, 0, "D"], + [12675, 0, "o"], + [12676, 0, "c"], + [12677, 0, "}"], + [12678, 0, " "], + [12679, 0, "r"], + [12680, 0, "u"], + [12681, 0, "l"], + [12682, 0, "e"], + [12683, 0, " "], + [12684, 0, "i"], + [12685, 0, "n"], + [12686, 0, " "], + [12687, 0, "F"], + [12688, 0, "i"], + [12689, 0, "g"], + [12690, 0, "u"], + [12691, 0, "r"], + [12692, 0, "e"], + [12693, 0, "~"], + [12694, 0, "\\"], + [12695, 0, "r"], + [12696, 0, "e"], + [12697, 0, "f"], + [12698, 0, "{"], + [12699, 0, "f"], + [12700, 0, "i"], + [12701, 0, "g"], + [12702, 0, ":"], + [12703, 0, "e"], + [12704, 0, "x"], + [12705, 0, "p"], + [12706, 0, "r"], + [12707, 0, "-"], + [12708, 0, "r"], + [12709, 0, "u"], + [12710, 0, "l"], + [12711, 0, "e"], + [12712, 0, "s"], + [12713, 0, "}"], + [12714, 0, " "], + [12715, 0, "d"], + [12716, 0, "e"], + [12717, 0, "f"], + [12718, 0, "i"], + [12719, 0, "n"], + [12720, 0, "e"], + [12721, 0, "s"], + [12722, 0, " "], + [12723, 0, "t"], + [12724, 0, "h"], + [12725, 0, "e"], + [12726, 0, " "], + [12727, 0, "s"], + [12728, 0, "i"], + [12729, 0, "m"], + [12730, 0, "p"], + [12731, 0, "l"], + [12732, 0, "e"], + [12733, 0, "s"], + [12734, 0, "t"], + [12735, 0, " "], + [12736, 0, "c"], + [12737, 0, "u"], + [12738, 0, "r"], + [12739, 0, "s"], + [12740, 0, "o"], + [12741, 0, "r"], + [12742, 0, ","], + [12743, 0, " "], + [12744, 0, "r"], + [12745, 0, "e"], + [12746, 0, "f"], + [12747, 0, "e"], + [12748, 0, "r"], + [12749, 0, "e"], + [12750, 0, "n"], + [12751, 0, "c"], + [12752, 0, "i"], + [12753, 0, "n"], + [12754, 0, "g"], + [12755, 0, " "], + [12756, 0, "t"], + [12757, 0, "h"], + [12758, 0, "e"], + [12759, 0, " "], + [12760, 0, "r"], + [12761, 0, "o"], + [12762, 0, "o"], + [12763, 0, "t"], + [12764, 0, " "], + [12765, 0, "o"], + [12766, 0, "f"], + [12767, 0, " "], + [12768, 0, "t"], + [12769, 0, "h"], + [12770, 0, "e"], + [12771, 0, " "], + [12772, 0, "d"], + [12773, 0, "o"], + [12774, 0, "c"], + [12775, 0, "u"], + [12776, 0, "m"], + [12777, 0, "e"], + [12778, 0, "n"], + [12779, 0, "t"], + [12780, 0, " "], + [12781, 0, "u"], + [12782, 0, "s"], + [12783, 0, "i"], + [12784, 0, "n"], + [12785, 0, "g"], + [12786, 0, " "], + [12787, 0, "t"], + [12788, 0, "h"], + [12789, 0, "e"], + [12790, 0, " "], + [12791, 0, "s"], + [12792, 0, "p"], + [12793, 0, "e"], + [12794, 0, "c"], + [12795, 0, "i"], + [12796, 0, "a"], + [12797, 0, "l"], + [12798, 0, " "], + [12799, 0, "a"], + [12800, 0, "t"], + [12801, 0, "o"], + [12802, 0, "m"], + [12803, 0, " "], + [12804, 0, "\\"], + [12805, 0, "m"], + [12806, 0, "a"], + [12806, 1], + [12805, 1], + [12805, 0, "t"], + [12806, 0, "e"], + [12807, 0, "x"], + [12808, 0, "t"], + [12809, 0, "s"], + [12810, 0, "f"], + [12811, 0, "{"], + [12812, 0, "d"], + [12813, 0, "o"], + [12814, 0, "c"], + [12815, 0, "}"], + [12816, 0, "."], + [12817, 0, " "], + [12818, 0, "I"], + [12819, 0, "f"], + [12820, 0, " "], + [12821, 0, "t"], + [12822, 0, "h"], + [12823, 0, "e"], + [12824, 0, " "], + [12825, 0, "r"], + [12826, 0, "o"], + [12827, 0, "o"], + [12828, 0, "t"], + [12829, 0, " "], + [12830, 0, "i"], + [12831, 0, "s"], + [12832, 0, " "], + [12833, 0, "a"], + [12834, 0, " "], + [12835, 0, "m"], + [12836, 0, "a"], + [12837, 0, "p"], + [12838, 0, " "], + [12839, 0, "("], + [12840, 0, "a"], + [12841, 0, "s"], + [12842, 0, " "], + [12843, 0, "i"], + [12844, 0, "n"], + [12845, 0, " "], + [12846, 0, "t"], + [12847, 0, "h"], + [12848, 0, "e"], + [12849, 0, " "], + [12850, 0, "e"], + [12851, 0, "x"], + [12852, 0, "a"], + [12853, 0, "m"], + [12854, 0, "p"], + [12855, 0, "l"], + [12856, 0, "e"], + [12857, 0, " "], + [12858, 0, "o"], + [12859, 0, "f"], + [12860, 0, " "], + [12860, 1], + [12859, 1], + [12858, 1], + [12857, 1], + [12856, 1], + [12855, 1], + [12854, 1], + [12853, 1], + [12852, 1], + [12851, 1], + [12850, 1], + [12849, 1], + [12848, 1], + [12847, 1], + [12846, 1], + [12845, 1], + [12844, 1], + [12843, 1], + [12842, 1], + [12841, 1], + [12840, 1], + [12839, 1], + [12838, 1], + [12837, 1], + [12836, 1], + [12835, 1], + [12834, 1], + [12833, 1], + [12832, 1], + [12831, 1], + [12830, 1], + [12829, 1], + [12828, 1], + [12827, 1], + [12826, 1], + [12825, 1], + [12824, 1], + [12823, 1], + [12822, 1], + [12821, 1], + [12820, 1], + [12819, 1], + [12818, 1], + [12818, 0, "T"], + [12819, 0, "h"], + [12820, 0, "e"], + [12821, 0, " "], + [12822, 0, "\\"], + [12823, 0, "t"], + [12824, 0, "e"], + [12825, 0, "x"], + [12826, 0, "t"], + [12827, 0, "s"], + [12828, 0, "c"], + [12829, 0, "{"], + [12830, 0, "G"], + [12831, 0, "e"], + [12832, 0, "t"], + [12833, 0, "}"], + [12834, 0, " "], + [12835, 0, "r"], + [12836, 0, "u"], + [12837, 0, "l"], + [12838, 0, "e"], + [12839, 0, " "], + [12840, 0, "n"], + [12841, 0, "a"], + [12842, 0, "v"], + [12843, 0, "i"], + [12844, 0, "g"], + [12845, 0, "a"], + [12846, 0, "t"], + [12847, 0, "e"], + [12848, 0, "s"], + [12849, 0, " "], + [12850, 0, "a"], + [12851, 0, " "], + [12852, 0, "c"], + [12853, 0, "u"], + [12854, 0, "r"], + [12855, 0, "s"], + [12856, 0, "o"], + [12857, 0, "r"], + [12858, 0, " "], + [12742, 0, " "], + [12743, 0, "$"], + [12744, 0, "\\"], + [12745, 0, "m"], + [12746, 0, "a"], + [12747, 0, "t"], + [12748, 0, "h"], + [12749, 0, "s"], + [12750, 0, "f"], + [12751, 0, "{"], + [12752, 0, "c"], + [12753, 0, "u"], + [12754, 0, "r"], + [12755, 0, "s"], + [12756, 0, "o"], + [12757, 0, "r"], + [12758, 0, "}"], + [12759, 0, "("], + [12760, 0, "\\"], + [12761, 0, "l"], + [12762, 0, "a"], + [12763, 0, "n"], + [12764, 0, "g"], + [12765, 0, "l"], + [12766, 0, "e"], + [12767, 0, "\\"], + [12768, 0, "r"], + [12769, 0, "a"], + [12770, 0, "n"], + [12771, 0, "g"], + [12772, 0, "l"], + [12773, 0, "e"], + [12774, 0, ","], + [12775, 0, "\\"], + [12776, 0, ","], + [12777, 0, " "], + [12778, 0, "\\"], + [12779, 0, "m"], + [12780, 0, "a"], + [12781, 0, "t"], + [12782, 0, "h"], + [12783, 0, "s"], + [12784, 0, "f"], + [12785, 0, "{"], + [12786, 0, "d"], + [12787, 0, "o"], + [12788, 0, "c"], + [12789, 0, "}"], + [12790, 0, ")"], + [12791, 0, "$"], + [12909, 0, "t"], + [12910, 0, "o"], + [12911, 0, " "], + [12912, 0, "a"], + [12913, 0, " "], + [12914, 0, "p"], + [12915, 0, "a"], + [12916, 0, "r"], + [12917, 0, "t"], + [12918, 0, "i"], + [12919, 0, "c"], + [12920, 0, "u"], + [12921, 0, "l"], + [12922, 0, "a"], + [12923, 0, "r"], + [12924, 0, " "], + [12925, 0, "k"], + [12926, 0, "e"], + [12927, 0, "y"], + [12928, 0, " "], + [12929, 0, "w"], + [12930, 0, "i"], + [12931, 0, "t"], + [12932, 0, "h"], + [12933, 0, "i"], + [12934, 0, "n"], + [12935, 0, " "], + [12936, 0, "a"], + [12937, 0, " "], + [12938, 0, "m"], + [12939, 0, "a"], + [12940, 0, "p"], + [12941, 0, ","], + [12942, 0, " "], + [12943, 0, "s"], + [12944, 0, "o"], + [12945, 0, " "], + [12946, 0, "t"], + [12947, 0, "h"], + [12948, 0, "e"], + [12949, 0, " "], + [12950, 0, "k"], + [12951, 0, "e"], + [12952, 0, "y"], + [12953, 0, " "], + [12954, 0, "`"], + [12955, 0, "`"], + [12956, 0, "w"], + [12957, 0, "h"], + [12957, 1], + [12956, 1], + [12956, 0, "s"], + [12957, 0, "h"], + [12958, 0, "o"], + [12959, 0, "p"], + [12960, 0, "p"], + [12961, 0, "i"], + [12962, 0, "n"], + [12963, 0, "g"], + [12964, 0, "'"], + [12965, 0, "'"], + [12966, 0, " "], + [12967, 0, "i"], + [12968, 0, "n"], + [12969, 0, " "], + [12970, 0, "t"], + [12971, 0, "h"], + [12972, 0, "e"], + [12973, 0, " "], + [12974, 0, "r"], + [12975, 0, "o"], + [12976, 0, "o"], + [12977, 0, "t"], + [12978, 0, " "], + [12979, 0, "d"], + [12980, 0, "o"], + [12981, 0, "c"], + [12982, 0, "u"], + [12983, 0, "m"], + [12984, 0, "e"], + [12985, 0, "n"], + [12986, 0, "t"], + [12987, 0, " "], + [12988, 0, "i"], + [12989, 0, "s"], + [12990, 0, " "], + [12991, 0, "r"], + [12992, 0, "e"], + [12993, 0, "p"], + [12994, 0, "r"], + [12995, 0, "e"], + [12996, 0, "s"], + [12997, 0, "e"], + [12998, 0, "n"], + [12999, 0, "t"], + [13000, 0, "e"], + [13001, 0, "d"], + [13002, 0, " "], + [13002, 1], + [13001, 1], + [13000, 1], + [12999, 1], + [12998, 1], + [12997, 1], + [12996, 1], + [12995, 1], + [12994, 1], + [12993, 1], + [12992, 1], + [12991, 1], + [12990, 1], + [12989, 1], + [12988, 1], + [12987, 1], + [12986, 1], + [12985, 1], + [12984, 1], + [12983, 1], + [12982, 1], + [12981, 1], + [12980, 1], + [12979, 1], + [12978, 1], + [12977, 1], + [12976, 1], + [12975, 1], + [12974, 1], + [12973, 1], + [12972, 1], + [12971, 1], + [12970, 1], + [12969, 1], + [12968, 1], + [12967, 1], + [12966, 1], + [12965, 1], + [12964, 1], + [12963, 1], + [12962, 1], + [12961, 1], + [12960, 1], + [12959, 1], + [12958, 1], + [12957, 1], + [12956, 1], + [12955, 1], + [12954, 1], + [12953, 1], + [12952, 1], + [12951, 1], + [12950, 1], + [12949, 1], + [12948, 1], + [12947, 1], + [12946, 1], + [12945, 1], + [12944, 1], + [12943, 1], + [12942, 1], + [12941, 1], + [12940, 1], + [12939, 1], + [12938, 1], + [12938, 0, "m"], + [12939, 0, "a"], + [12940, 0, "p"], + [12941, 0, "."], + [12942, 0, " "], + [12943, 0, "F"], + [12944, 0, "o"], + [12945, 0, "r"], + [12946, 0, " "], + [12947, 0, "e"], + [12948, 0, "x"], + [12949, 0, "a"], + [12950, 0, "m"], + [12951, 0, "p"], + [12952, 0, "l"], + [12953, 0, "e"], + [12954, 0, ","], + [12955, 0, " "], + [12956, 0, "t"], + [12957, 0, "h"], + [12958, 0, "e"], + [12959, 0, " "], + [12960, 0, "e"], + [12961, 0, "x"], + [12962, 0, "p"], + [12963, 0, "r"], + [12964, 0, "e"], + [12965, 0, "s"], + [12966, 0, "s"], + [12967, 0, "i"], + [12968, 0, "o"], + [12969, 0, "n"], + [12970, 0, " "], + [12971, 0, "$"], + [12972, 0, "\\"], + [12972, 1], + [12971, 1], + [12971, 0, "\\"], + [12972, 0, "v"], + [12973, 0, "e"], + [12974, 0, "r"], + [12975, 0, "b"], + [12976, 0, "|"], + [12977, 0, "d"], + [12978, 0, "o"], + [12979, 0, "c"], + [12980, 0, "."], + [12981, 0, "g"], + [12982, 0, "e"], + [12983, 0, "t"], + [12984, 0, "("], + [12985, 0, "\""], + [12986, 0, "s"], + [12987, 0, "h"], + [12988, 0, "o"], + [12989, 0, "p"], + [12990, 0, "p"], + [12991, 0, "i"], + [12992, 0, "n"], + [12993, 0, "g"], + [12994, 0, "\""], + [12995, 0, ")"], + [12996, 0, "|"], + [12997, 0, " "], + [12998, 0, "e"], + [12999, 0, "v"], + [13000, 0, "a"], + [13001, 0, "l"], + [13002, 0, "u"], + [13003, 0, "a"], + [13004, 0, "t"], + [13005, 0, "e"], + [13006, 0, "s"], + [13007, 0, " "], + [13008, 0, "t"], + [13009, 0, "o"], + [13010, 0, " "], + [13011, 0, "t"], + [13012, 0, "h"], + [13013, 0, "e"], + [13014, 0, " "], + [13015, 0, "c"], + [13016, 0, "u"], + [13017, 0, "r"], + [13018, 0, "s"], + [13019, 0, "o"], + [13020, 0, "r"], + [13021, 0, " "], + [13022, 0, "$"], + [13022, 1], + [13021, 1], + [13020, 1], + [13019, 1], + [13018, 1], + [13017, 1], + [13016, 1], + [13015, 1], + [13014, 1], + [13013, 1], + [13012, 1], + [13011, 1], + [13011, 0, "$"], + [13012, 0, "\\"], + [13013, 0, "m"], + [13014, 0, "a"], + [13015, 0, "t"], + [13016, 0, "h"], + [13017, 0, "s"], + [13018, 0, "f"], + [13019, 0, "{"], + [13020, 0, "c"], + [13021, 0, "u"], + [13022, 0, "r"], + [13023, 0, "s"], + [13024, 0, "o"], + [13025, 0, "r"], + [13026, 0, "}"], + [13027, 0, "("], + [13028, 0, "\\"], + [13029, 0, "l"], + [13030, 0, "a"], + [13031, 0, "n"], + [13032, 0, "g"], + [13033, 0, "l"], + [13034, 0, "e"], + [13035, 0, " "], + [13036, 0, "\\"], + [13037, 0, "m"], + [13038, 0, "a"], + [13039, 0, "t"], + [13040, 0, "h"], + [13041, 0, "s"], + [13042, 0, "f"], + [13043, 0, "{"], + [13044, 0, "m"], + [13045, 0, "a"], + [13046, 0, "p"], + [13047, 0, "T"], + [13048, 0, "}"], + [13049, 0, "("], + [13050, 0, "\\"], + [13051, 0, "m"], + [13052, 0, "a"], + [13053, 0, "t"], + [13054, 0, "h"], + [13055, 0, "s"], + [13056, 0, "f"], + [13057, 0, "{"], + [13058, 0, "d"], + [13059, 0, "o"], + [13060, 0, "c"], + [13061, 0, "}"], + [13062, 0, ")"], + [13063, 0, " "], + [13064, 0, "\\"], + [13065, 0, "r"], + [13066, 0, "a"], + [13067, 0, "n"], + [13068, 0, "g"], + [13069, 0, "l"], + [13070, 0, "e"], + [13071, 0, ","], + [13072, 0, "\\"], + [13073, 0, ","], + [13074, 0, " "], + [13075, 0, "\\"], + [13076, 0, "t"], + [13077, 0, "e"], + [13078, 0, "x"], + [13079, 0, "t"], + [13080, 0, "{"], + [13081, 0, "`"], + [13082, 0, "`"], + [13083, 0, "s"], + [13084, 0, "h"], + [13085, 0, "o"], + [13086, 0, "p"], + [13087, 0, "p"], + [13088, 0, "i"], + [13089, 0, "n"], + [13090, 0, "g"], + [13091, 0, "'"], + [13092, 0, "'"], + [13093, 0, "}"], + [13094, 0, ")"], + [13095, 0, "$"], + [13096, 0, " "], + [13097, 0, "b"], + [13098, 0, "y"], + [13099, 0, " "], + [13100, 0, "a"], + [13101, 0, "p"], + [13102, 0, "p"], + [13103, 0, "l"], + [13104, 0, "y"], + [13105, 0, "i"], + [13106, 0, "n"], + [13107, 0, "g"], + [13108, 0, " "], + [13109, 0, "t"], + [13110, 0, "h"], + [13111, 0, "e"], + [13112, 0, " "], + [13113, 0, "\\"], + [13114, 0, "t"], + [13115, 0, "e"], + [13116, 0, "x"], + [13117, 0, "t"], + [13118, 0, "s"], + [13119, 0, "c"], + [13120, 0, "{"], + [13121, 0, "D"], + [13122, 0, "o"], + [13123, 0, "c"], + [13124, 0, "}"], + [13125, 0, " "], + [13126, 0, "a"], + [13127, 0, "n"], + [13128, 0, "d"], + [13129, 0, " "], + [13130, 0, "\\"], + [13131, 0, "t"], + [13132, 0, "e"], + [13133, 0, "x"], + [13134, 0, "t"], + [13135, 0, "s"], + [13136, 0, "c"], + [13137, 0, "{"], + [13138, 0, "G"], + [13139, 0, "e"], + [13140, 0, "t"], + [13141, 0, "}"], + [13142, 0, " "], + [13143, 0, "r"], + [13144, 0, "u"], + [13145, 0, "l"], + [13146, 0, "e"], + [13147, 0, "s"], + [13148, 0, "."], + [13149, 0, "\n"], + [13150, 0, "\n"], + [13151, 0, "T"], + [13152, 0, "h"], + [13153, 0, "e"], + [13154, 0, " "], + [13155, 0, "\\"], + [13156, 0, "t"], + [13157, 0, "e"], + [13158, 0, "x"], + [13159, 0, "t"], + [13160, 0, "s"], + [13161, 0, "c"], + [13162, 0, "{"], + [13163, 0, "I"], + [13164, 0, "t"], + [13165, 0, "e"], + [13166, 0, "r"], + [13167, 0, "}"], + [13168, 0, " "], + [13169, 0, "r"], + [13170, 0, "u"], + [13171, 0, "l"], + [13172, 0, "e"], + [13173, 0, " "], + [13174, 0, "s"], + [13175, 0, "h"], + [13176, 0, "u"], + [13176, 1], + [13176, 0, "i"], + [13177, 0, "f"], + [13178, 0, "t"], + [13179, 0, "s"], + [13180, 0, " "], + [13181, 0, "t"], + [13182, 0, "h"], + [13183, 0, "e"], + [13184, 0, " "], + [13185, 0, "c"], + [13186, 0, "u"], + [13187, 0, "r"], + [13188, 0, "s"], + [13189, 0, "o"], + [13190, 0, "r"], + [13191, 0, " "], + [13192, 0, "i"], + [13193, 0, "n"], + [13194, 0, "t"], + [13195, 0, "o"], + [13196, 0, " "], + [13197, 0, "a"], + [13198, 0, " "], + [13199, 0, "l"], + [13200, 0, "i"], + [13201, 0, "s"], + [13202, 0, "t"], + [13203, 0, " "], + [13204, 0, "v"], + [13205, 0, "a"], + [13206, 0, "l"], + [13206, 1], + [13205, 1], + [13204, 1], + [13203, 1], + [13203, 0, " "], + [13204, 0, "a"], + [13205, 0, "n"], + [13206, 0, "d"], + [13207, 0, " "], + [13208, 0, "p"], + [13209, 0, "o"], + [13210, 0, "s"], + [13211, 0, "i"], + [13212, 0, "t"], + [13213, 0, "i"], + [13214, 0, "o"], + [13215, 0, "n"], + [13216, 0, "s"], + [13217, 0, " "], + [13218, 0, "t"], + [13219, 0, "h"], + [13220, 0, "e"], + [13221, 0, " "], + [13221, 1], + [13220, 1], + [13219, 1], + [13218, 1], + [13218, 0, "i"], + [13219, 0, "t"], + [13220, 0, " "], + [13221, 0, "a"], + [13222, 0, "t"], + [13223, 0, " "], + [13224, 0, "t"], + [13225, 0, "h"], + [13226, 0, "e"], + [13227, 0, " "], + [13228, 0, "\\"], + [13229, 0, "m"], + [13230, 0, "a"], + [13230, 1], + [13229, 1], + [13229, 0, "t"], + [13230, 0, "e"], + [13231, 0, "x"], + [13232, 0, "t"], + [13233, 0, "s"], + [13234, 0, "f"], + [13235, 0, "{"], + [13236, 0, "h"], + [13237, 0, "e"], + [13238, 0, "a"], + [13239, 0, "d"], + [13240, 0, "}"], + [13241, 0, " "], + [13242, 0, "o"], + [13243, 0, "f"], + [13244, 0, " "], + [13245, 0, "t"], + [13246, 0, "h"], + [13247, 0, "e"], + [13248, 0, " "], + [13249, 0, "l"], + [13250, 0, "i"], + [13251, 0, "s"], + [13252, 0, "t"], + [13253, 0, "."], + [13254, 0, " "], + [13255, 0, "T"], + [13256, 0, "h"], + [13257, 0, "i"], + [13258, 0, "s"], + [13259, 0, " "], + [13260, 0, "r"], + [13261, 0, "u"], + [13262, 0, "l"], + [13263, 0, "e"], + [13264, 0, " "], + [13265, 0, "a"], + [13266, 0, "p"], + [13267, 0, "p"], + [13268, 0, "l"], + [13269, 0, "i"], + [13270, 0, "e"], + [13271, 0, "s"], + [13272, 0, " "], + [13273, 0, "e"], + [13274, 0, "v"], + [13275, 0, "e"], + [13276, 0, "n"], + [13277, 0, " "], + [13278, 0, "i"], + [13279, 0, "f"], + [13280, 0, " "], + [13281, 0, "$"], + [13281, 1], + [13281, 0, "t"], + [13282, 0, "h"], + [13283, 0, "e"], + [13284, 0, " "], + [13285, 0, "l"], + [13286, 0, "i"], + [13287, 0, "s"], + [13288, 0, "t"], + [13289, 0, " "], + [13290, 0, "i"], + [13291, 0, "s"], + [13292, 0, " "], + [13293, 0, "e"], + [13294, 0, "m"], + [13295, 0, "p"], + [13296, 0, "t"], + [13297, 0, "y"], + [13298, 0, " "], + [13299, 0, "o"], + [13300, 0, "r"], + [13301, 0, " "], + [13302, 0, "n"], + [13303, 0, "o"], + [13304, 0, "n"], + [13305, 0, "e"], + [13306, 0, "x"], + [13307, 0, "i"], + [13308, 0, "s"], + [13309, 0, "t"], + [13310, 0, "e"], + [13311, 0, "n"], + [13312, 0, "t"], + [13313, 0, " "], + [13314, 0, "i"], + [13315, 0, "n"], + [13316, 0, " "], + [13317, 0, "$"], + [13318, 0, "A"], + [13319, 0, "_"], + [13320, 0, "p"], + [13321, 0, "$"], + [13322, 0, "."], + [13323, 0, " "], + [13324, 0, "T"], + [13325, 0, "h"], + [13326, 0, "e"], + [13327, 0, " "], + [13328, 0, "t"], + [13329, 0, "h"], + [13330, 0, "r"], + [13331, 0, "e"], + [13332, 0, "e"], + [13333, 0, " "], + [13334, 0, "r"], + [13335, 0, "u"], + [13336, 0, "l"], + [13337, 0, "e"], + [13338, 0, "s"], + [13339, 0, " "], + [13340, 0, "$"], + [13341, 0, "\\"], + [13342, 0, "t"], + [13343, 0, "e"], + [13344, 0, "x"], + [13345, 0, "t"], + [13346, 0, "s"], + [13347, 0, "c"], + [13348, 0, "{"], + [13349, 0, "N"], + [13350, 0, "e"], + [13351, 0, "x"], + [13352, 0, "t"], + [13353, 0, "}"], + [13354, 0, "_"], + [13355, 0, "1"], + [13356, 0, "$"], + [13357, 0, ","], + [13358, 0, " "], + [13359, 0, "$"], + [13360, 0, "\\"], + [13361, 0, "t"], + [13362, 0, "e"], + [13363, 0, "x"], + [13364, 0, "t"], + [13365, 0, "s"], + [13366, 0, "c"], + [13367, 0, "{"], + [13368, 0, "N"], + [13369, 0, "e"], + [13370, 0, "x"], + [13371, 0, "t"], + [13372, 0, "}"], + [13373, 0, "_"], + [13374, 0, "2"], + [13375, 0, "$"], + [13376, 0, " "], + [13377, 0, "a"], + [13378, 0, "n"], + [13379, 0, "d"], + [13380, 0, " "], + [13381, 0, "$"], + [13382, 0, "\\"], + [13383, 0, "t"], + [13384, 0, "e"], + [13385, 0, "x"], + [13386, 0, "t"], + [13387, 0, "s"], + [13388, 0, "c"], + [13389, 0, "{"], + [13390, 0, "N"], + [13391, 0, "e"], + [13392, 0, "x"], + [13393, 0, "t"], + [13394, 0, "}"], + [13395, 0, "$"], + [13396, 0, " "], + [13397, 0, "h"], + [13398, 0, "a"], + [13399, 0, "n"], + [13400, 0, "d"], + [13401, 0, "l"], + [13402, 0, "e"], + [13403, 0, " "], + [13404, 0, "i"], + [13405, 0, "t"], + [13406, 0, "e"], + [13407, 0, "r"], + [13408, 0, "a"], + [13409, 0, "t"], + [13410, 0, "i"], + [13411, 0, "o"], + [13412, 0, "n"], + [13413, 0, " "], + [13414, 0, "t"], + [13415, 0, "h"], + [13416, 0, "r"], + [13417, 0, "o"], + [13418, 0, "u"], + [13419, 0, "g"], + [13420, 0, "h"], + [13421, 0, " "], + [13422, 0, "a"], + [13423, 0, " "], + [13424, 0, "l"], + [13425, 0, "i"], + [13426, 0, "n"], + [13427, 0, "k"], + [13428, 0, "e"], + [13429, 0, "d"], + [13430, 0, " "], + [13431, 0, "l"], + [13432, 0, "i"], + [13433, 0, "s"], + [13434, 0, "t"], + [13435, 0, " "], + [13436, 0, "b"], + [13437, 0, "y"], + [13438, 0, " "], + [13439, 0, "s"], + [13440, 0, "e"], + [13441, 0, "t"], + [13442, 0, "t"], + [13443, 0, "i"], + [13444, 0, "n"], + [13445, 0, "g"], + [13446, 0, " "], + [13447, 0, "t"], + [13448, 0, "h"], + [13449, 0, "e"], + [13450, 0, " "], + [13451, 0, "f"], + [13452, 0, "i"], + [13453, 0, "n"], + [13454, 0, "a"], + [13455, 0, "l"], + [13456, 0, " "], + [13457, 0, "k"], + [13458, 0, "e"], + [13459, 0, "y"], + [13460, 0, " "], + [13461, 0, "i"], + [13462, 0, "n"], + [13463, 0, " "], + [13464, 0, "t"], + [13465, 0, "h"], + [13466, 0, "e"], + [13467, 0, " "], + [13468, 0, "c"], + [13469, 0, "u"], + [13470, 0, "r"], + [13471, 0, "s"], + [13472, 0, "o"], + [13473, 0, "r"], + [13474, 0, " "], + [13475, 0, "t"], + [13476, 0, "o"], + [13477, 0, " "], + [13478, 0, "t"], + [13479, 0, "h"], + [13480, 0, "e"], + [13481, 0, " "], + [13355, 0, "{"], + [13357, 0, ","], + [13358, 0, "2"], + [13359, 0, ","], + [13360, 0, "3"], + [13361, 0, "}"], + [13400, 1], + [13399, 1], + [13398, 1], + [13397, 1], + [13396, 1], + [13395, 1], + [13394, 1], + [13393, 1], + [13392, 1], + [13391, 1], + [13390, 1], + [13389, 1], + [13388, 1], + [13387, 1], + [13386, 1], + [13385, 1], + [13384, 1], + [13383, 1], + [13382, 1], + [13381, 1], + [13380, 1], + [13379, 1], + [13378, 1], + [13377, 1], + [13376, 1], + [13375, 1], + [13374, 1], + [13373, 1], + [13372, 1], + [13371, 1], + [13370, 1], + [13369, 1], + [13368, 1], + [13367, 1], + [13366, 1], + [13365, 1], + [13364, 1], + [13363, 1], + [13362, 1], + [13449, 0, "i"], + [13450, 0, "d"], + [13451, 0, "e"], + [13452, 0, "n"], + [13453, 0, "t"], + [13454, 0, "i"], + [13455, 0, "f"], + [13456, 0, "i"], + [13457, 0, "e"], + [13458, 0, "r"], + [13459, 0, " "], + [13460, 0, "o"], + [13461, 0, "f"], + [13462, 0, " "], + [13463, 0, "t"], + [13464, 0, "h"], + [13465, 0, "e"], + [13466, 0, " "], + [13467, 0, "n"], + [13468, 0, "e"], + [13469, 0, "x"], + [13470, 0, "t"], + [13471, 0, " "], + [13472, 0, "l"], + [13473, 0, "i"], + [13474, 0, "s"], + [13475, 0, "t"], + [13476, 0, " "], + [13477, 0, "e"], + [13478, 0, "l"], + [13479, 0, "e"], + [13480, 0, "m"], + [13481, 0, "e"], + [13482, 0, "n"], + [13483, 0, "t"], + [13484, 0, "."], + [13485, 0, " "], + [13486, 0, "T"], + [13487, 0, "h"], + [13488, 0, "e"], + [13489, 0, " "], + [13490, 0, "\\"], + [13491, 0, "t"], + [13492, 0, "e"], + [13493, 0, "x"], + [13494, 0, "t"], + [13495, 0, "s"], + [13496, 0, "c"], + [13497, 0, "{"], + [13498, 0, "N"], + [13499, 0, "e"], + [13500, 0, "x"], + [13501, 0, "t"], + [13502, 0, "}"], + [13503, 0, " "], + [13504, 0, "r"], + [13505, 0, "u"], + [13506, 0, "l"], + [13507, 0, "e"], + [13508, 0, "s"], + [13509, 0, " "], + [13510, 0, "a"], + [13511, 0, "p"], + [13512, 0, "p"], + [13513, 0, "l"], + [13514, 0, "y"], + [13515, 0, " "], + [13516, 0, "o"], + [13517, 0, "n"], + [13518, 0, "l"], + [13519, 0, "y"], + [13520, 0, " "], + [13521, 0, "i"], + [13522, 0, "f"], + [13523, 0, " "], + [13524, 0, "t"], + [13525, 0, "h"], + [13526, 0, "e"], + [13527, 0, " "], + [13528, 0, "l"], + [13529, 0, "i"], + [13530, 0, "s"], + [13531, 0, "t"], + [13532, 0, " "], + [13533, 0, "e"], + [13534, 0, "x"], + [13535, 0, "i"], + [13536, 0, "s"], + [13537, 0, "t"], + [13538, 0, "s"], + [13539, 0, " "], + [13540, 0, "i"], + [13541, 0, "n"], + [13542, 0, " "], + [13543, 0, "$"], + [13544, 0, "A"], + [13545, 0, "_"], + [13546, 0, "p"], + [13547, 0, "$"], + [13548, 0, ","], + [13549, 0, " "], + [13550, 0, "a"], + [13551, 0, "n"], + [13552, 0, "d"], + [13553, 0, " "], + [13554, 0, "t"], + [13555, 0, "h"], + [13556, 0, "e"], + [13557, 0, " "], + [13558, 0, "\\"], + [13559, 0, "t"], + [13560, 0, "e"], + [13561, 0, "x"], + [13562, 0, "t"], + [13563, 0, "s"], + [13564, 0, "c"], + [13565, 0, "{"], + [13566, 0, "N"], + [13567, 0, "e"], + [13568, 0, "x"], + [13569, 0, "t"], + [13570, 0, "}"], + [13571, 0, "+"], + [13572, 0, "_"], + [13573, 0, "3"], + [13571, 1], + [13558, 0, "$"], + [13574, 0, "$"], + [13575, 0, " "], + [13576, 0, "r"], + [13577, 0, "e"], + [13578, 0, "c"], + [13579, 0, "u"], + [13580, 0, "r"], + [13581, 0, "s"], + [13582, 0, "i"], + [13583, 0, "v"], + [13584, 0, "e"], + [13585, 0, "l"], + [13586, 0, "y"], + [13587, 0, " "], + [13588, 0, "d"], + [13589, 0, "e"], + [13590, 0, "s"], + [13591, 0, "c"], + [13592, 0, "e"], + [13593, 0, "n"], + [13594, 0, "d"], + [13595, 0, "s"], + [13596, 0, " "], + [13597, 0, "t"], + [13598, 0, "h"], + [13599, 0, "e"], + [13600, 0, " "], + [13601, 0, "l"], + [13602, 0, "o"], + [13603, 0, "c"], + [13604, 0, "a"], + [13605, 0, "l"], + [13606, 0, " "], + [13607, 0, "s"], + [13608, 0, "t"], + [13609, 0, "a"], + [13610, 0, "t"], + [13611, 0, "e"], + [13612, 0, " "], + [13613, 0, "a"], + [13614, 0, "c"], + [13615, 0, "c"], + [13616, 0, "o"], + [13617, 0, "r"], + [13618, 0, "d"], + [13619, 0, "i"], + [13620, 0, "n"], + [13621, 0, "g"], + [13622, 0, " "], + [13623, 0, "t"], + [13624, 0, "o"], + [13625, 0, " "], + [13626, 0, "t"], + [13627, 0, "h"], + [13628, 0, "e"], + [13629, 0, " "], + [13630, 0, "v"], + [13631, 0, "e"], + [13632, 0, "c"], + [13633, 0, "t"], + [13634, 0, "o"], + [13635, 0, "r"], + [13636, 0, " "], + [13637, 0, "o"], + [13638, 0, "f"], + [13639, 0, " "], + [13640, 0, "k"], + [13641, 0, "e"], + [13642, 0, "y"], + [13643, 0, "s"], + [13644, 0, " "], + [13645, 0, "i"], + [13646, 0, "n"], + [13647, 0, " "], + [13648, 0, "t"], + [13649, 0, "h"], + [13650, 0, "e"], + [13651, 0, " "], + [13652, 0, "c"], + [13653, 0, "u"], + [13654, 0, "r"], + [13655, 0, "s"], + [13656, 0, "o"], + [13657, 0, "r"], + [13658, 0, "."], + [6685, 1], + [6684, 1], + [6491, 1], + [6491, 1], + [6296, 1], + [6296, 1], + [9484, 0, "\n"], + [9485, 0, "\n"], + [9486, 0, "\\"], + [9487, 0, "b"], + [9488, 0, "e"], + [9489, 0, "g"], + [9490, 0, "i"], + [9491, 0, "n"], + [9492, 0, "{"], + [9493, 0, "p"], + [9494, 0, "r"], + [9495, 0, "o"], + [9496, 0, "o"], + [9497, 0, "f"], + [9498, 0, "t"], + [9499, 0, "r"], + [9500, 0, "e"], + [9501, 0, "e"], + [9502, 0, "}"], + [9503, 0, "\n"], + [9504, 0, "\\"], + [9505, 0, "e"], + [9506, 0, "n"], + [9507, 0, "d"], + [9508, 0, "{"], + [9509, 0, "p"], + [9510, 0, "r"], + [9511, 0, "o"], + [9512, 0, "o"], + [9513, 0, "f"], + [9514, 0, "t"], + [9515, 0, "r"], + [9516, 0, "e"], + [9517, 0, "e"], + [9518, 0, "}"], + [9503, 0, "\n"], + [9504, 0, "\\"], + [9505, 0, "A"], + [9506, 0, "x"], + [9507, 0, "i"], + [9508, 0, "o"], + [9509, 0, "m"], + [9510, 0, "C"], + [9511, 0, "{"], + [9512, 0, "$"], + [9513, 0, "A"], + [9514, 0, "_"], + [9515, 0, "p"], + [9516, 0, ","], + [9517, 0, "\\"], + [9518, 0, ","], + [9519, 0, " "], + [9520, 0, "\\"], + [9521, 0, "m"], + [9522, 0, "a"], + [9523, 0, "t"], + [9524, 0, "h"], + [9525, 0, "i"], + [9526, 0, "t"], + [9527, 0, "{"], + [9528, 0, "e"], + [9529, 0, "x"], + [9530, 0, "p"], + [9531, 0, "r"], + [9532, 0, "}"], + [9533, 0, " "], + [9534, 0, "\\"], + [9535, 0, "e"], + [9536, 0, "v"], + [9537, 0, "a"], + [9538, 0, "l"], + [9539, 0, "t"], + [9540, 0, "o"], + [9541, 0, " "], + [9542, 0, "\\"], + [9543, 0, "m"], + [9544, 0, "a"], + [9545, 0, "t"], + [9546, 0, "h"], + [9547, 0, "i"], + [9548, 0, "t"], + [9549, 0, "{"], + [9550, 0, "v"], + [9551, 0, "a"], + [9552, 0, "l"], + [9553, 0, "}"], + [9554, 0, "$"], + [9555, 0, "}"], + [9556, 0, "\n"], + [9557, 0, "\\"], + [9558, 0, "A"], + [9559, 0, "x"], + [9560, 0, "i"], + [9561, 0, "o"], + [9562, 0, "m"], + [9563, 0, "C"], + [9564, 0, "{"], + [9565, 0, "$"], + [9566, 0, "A"], + [9567, 0, "_"], + [9568, 0, "p"], + [9569, 0, ","], + [9570, 0, "\\"], + [9571, 0, ","], + [9572, 0, " "], + [9573, 0, "\\"], + [9574, 0, "m"], + [9575, 0, "a"], + [9576, 0, "t"], + [9577, 0, "h"], + [9578, 0, "i"], + [9579, 0, "t"], + [9580, 0, "{"], + [9550, 1], + [9550, 1], + [9550, 1], + [9550, 0, "c"], + [9551, 0, "u"], + [9552, 0, "r"], + [9581, 0, "c"], + [9582, 0, "u"], + [9583, 0, "r"], + [9584, 0, "}"], + [9585, 0, "."], + [9586, 0, "\\"], + [9587, 0, "m"], + [9588, 0, "a"], + [9589, 0, "t"], + [9590, 0, "h"], + [9591, 0, "s"], + [9592, 0, "f"], + [9593, 0, "{"], + [9594, 0, "v"], + [9595, 0, "a"], + [9596, 0, "l"], + [9597, 0, "u"], + [9598, 0, "e"], + [9599, 0, "s"], + [9600, 0, "}"], + [9601, 0, " "], + [9602, 0, "\\"], + [9603, 0, "e"], + [9604, 0, "v"], + [9605, 0, "a"], + [9606, 0, "l"], + [9607, 0, "t"], + [9608, 0, "o"], + [9609, 0, " "], + [9610, 0, "\\"], + [9611, 0, "m"], + [9612, 0, "a"], + [9613, 0, "t"], + [9614, 0, "h"], + [9615, 0, "i"], + [9616, 0, "t"], + [9617, 0, "{"], + [9618, 0, "c"], + [9618, 1], + [9618, 0, "v"], + [9619, 0, "a"], + [9620, 0, "l"], + [9621, 0, "}"], + [9622, 0, "$"], + [9623, 0, "}"], + [9624, 0, "\n"], + [9625, 0, "\\"], + [9626, 0, "L"], + [9627, 0, "e"], + [9628, 0, "f"], + [9629, 0, "t"], + [9630, 0, "L"], + [9631, 0, "a"], + [9632, 0, "b"], + [9633, 0, "e"], + [9634, 0, "l"], + [9635, 0, "{"], + [9636, 0, "$"], + [9637, 0, "\\"], + [9638, 0, "t"], + [9639, 0, "e"], + [9640, 0, "x"], + [9641, 0, "t"], + [9642, 0, "s"], + [9643, 0, "c"], + [9644, 0, "{"], + [9645, 0, "V"], + [9646, 0, "a"], + [9647, 0, "l"], + [9648, 0, "}"], + [9649, 0, "_"], + [9650, 0, "1"], + [9651, 0, "$"], + [9652, 0, "}"], + [9653, 0, "\n"], + [9654, 0, "\\"], + [9655, 0, "B"], + [9656, 0, "i"], + [9657, 0, "n"], + [9658, 0, "a"], + [9659, 0, "r"], + [9660, 0, "y"], + [9661, 0, "I"], + [9662, 0, "n"], + [9663, 0, "f"], + [9664, 0, "C"], + [9665, 0, "{"], + [9666, 0, "$"], + [9667, 0, "A"], + [9668, 0, "_"], + [9669, 0, "p"], + [9670, 0, ","], + [9671, 0, "\\"], + [9672, 0, ","], + [9673, 0, " "], + [9674, 0, "\\"], + [9675, 0, "m"], + [9676, 0, "a"], + [9677, 0, "t"], + [9678, 0, "h"], + [9679, 0, "i"], + [9680, 0, "t"], + [9681, 0, "{"], + [9682, 0, "e"], + [9683, 0, "x"], + [9684, 0, "p"], + [9685, 0, "r"], + [9686, 0, "}"], + [9687, 0, "."], + [9688, 0, "\\"], + [9689, 0, "m"], + [9690, 0, "a"], + [9691, 0, "t"], + [9692, 0, "h"], + [9693, 0, "s"], + [9694, 0, "f"], + [9695, 0, "{"], + [9696, 0, "v"], + [9697, 0, "a"], + [9698, 0, "l"], + [9699, 0, "u"], + [9700, 0, "e"], + [9701, 0, "s"], + [9702, 0, "}"], + [9703, 0, " "], + [9704, 0, "\\"], + [9705, 0, "e"], + [9706, 0, "v"], + [9707, 0, "a"], + [9708, 0, "l"], + [9709, 0, "t"], + [9710, 0, "o"], + [9711, 0, " "], + [9712, 0, "\\"], + [9713, 0, "m"], + [9714, 0, "a"], + [9715, 0, "t"], + [9716, 0, "h"], + [9717, 0, "i"], + [9718, 0, "t"], + [9719, 0, "{"], + [9720, 0, "v"], + [9721, 0, "a"], + [9722, 0, "l"], + [9723, 0, "}"], + [9724, 0, "$"], + [9725, 0, "}"], + [9742, 0, "\n"], + [9743, 0, "\n"], + [9744, 0, "\\"], + [9745, 0, "b"], + [9746, 0, "e"], + [9747, 0, "g"], + [9748, 0, "i"], + [9749, 0, "n"], + [9750, 0, "{"], + [9751, 0, "p"], + [9752, 0, "r"], + [9753, 0, "o"], + [9754, 0, "o"], + [9755, 0, "f"], + [9756, 0, "t"], + [9757, 0, "r"], + [9758, 0, "e"], + [9759, 0, "e"], + [9760, 0, "}"], + [9761, 0, "\n"], + [9762, 0, "\\"], + [9763, 0, "A"], + [9764, 0, "x"], + [9765, 0, "i"], + [9766, 0, "o"], + [9767, 0, "m"], + [9768, 0, "C"], + [9769, 0, "{"], + [9770, 0, "$"], + [9771, 0, "\\"], + [9772, 0, "m"], + [9773, 0, "a"], + [9774, 0, "t"], + [9775, 0, "h"], + [9776, 0, "s"], + [9777, 0, "f"], + [9778, 0, "{"], + [9779, 0, "r"], + [9780, 0, "e"], + [9781, 0, "g"], + [9782, 0, "T"], + [9783, 0, "}"], + [9784, 0, "("], + [9785, 0, "k"], + [9786, 0, ")"], + [9787, 0, " "], + [9788, 0, "\\"], + [9789, 0, "i"], + [9790, 0, "n"], + [9791, 0, " "], + [9792, 0, "\\"], + [9793, 0, "m"], + [9794, 0, "a"], + [9795, 0, "t"], + [9796, 0, "h"], + [9797, 0, "r"], + [9798, 0, "m"], + [9799, 0, "{"], + [9800, 0, "d"], + [9801, 0, "o"], + [9802, 0, "m"], + [9803, 0, "}"], + [9804, 0, "("], + [9805, 0, "\\"], + [9806, 0, "m"], + [9807, 0, "a"], + [9808, 0, "t"], + [9809, 0, "h"], + [9810, 0, "i"], + [9811, 0, "t"], + [9812, 0, "{"], + [9813, 0, "c"], + [9814, 0, "t"], + [9815, 0, "x"], + [9816, 0, "}"], + [9817, 0, ")"], + [9818, 0, "$"], + [9819, 0, "}"], + [9820, 0, "\n"], + [9821, 0, "\\"], + [9822, 0, "A"], + [9823, 0, "x"], + [9824, 0, "i"], + [9825, 0, "o"], + [9826, 0, "m"], + [9827, 0, "C"], + [9828, 0, "{"], + [9829, 0, "$"], + [9830, 0, "\\"], + [9831, 0, "m"], + [9832, 0, "a"], + [9833, 0, "t"], + [9834, 0, "h"], + [9835, 0, "i"], + [9836, 0, "t"], + [9837, 0, "{"], + [9838, 0, "v"], + [9839, 0, "a"], + [9840, 0, "l"], + [9841, 0, "}"], + [9842, 0, " "], + [9843, 0, "="], + [9844, 0, " "], + [9845, 0, "\\"], + [9846, 0, "{"], + [9847, 0, "\\"], + [9848, 0, ","], + [9849, 0, " "], + [9850, 0, "\\"], + [9851, 0, "m"], + [9852, 0, "a"], + [9853, 0, "t"], + [9854, 0, "h"], + [9855, 0, "i"], + [9856, 0, "t"], + [9857, 0, "{"], + [9858, 0, "o"], + [9859, 0, "p"], + [9860, 0, "}"], + [9861, 0, "."], + [9862, 0, "\\"], + [9863, 0, "m"], + [9864, 0, "a"], + [9865, 0, "t"], + [9866, 0, "h"], + [9867, 0, "s"], + [9868, 0, "f"], + [9869, 0, "{"], + [9870, 0, "v"], + [9871, 0, "a"], + [9872, 0, "l"], + [9873, 0, "}"], + [9874, 0, " "], + [9875, 0, "\\"], + [9876, 0, "m"], + [9877, 0, "i"], + [9878, 0, "d"], + [9879, 0, " "], + [9880, 0, "\\"], + [9881, 0, "m"], + [9882, 0, "a"], + [9883, 0, "t"], + [9884, 0, "h"], + [9885, 0, "i"], + [9886, 0, "t"], + [9887, 0, "{"], + [9888, 0, "o"], + [9889, 0, "p"], + [9890, 0, "}"], + [9891, 0, " "], + [9892, 0, "\\"], + [9893, 0, "i"], + [9894, 0, "n"], + [9895, 0, " "], + [9896, 0, "\\"], + [9897, 0, "m"], + [9898, 0, "a"], + [9899, 0, "t"], + [9900, 0, "h"], + [9901, 0, "i"], + [9902, 0, "t"], + [9903, 0, "{"], + [9904, 0, "c"], + [9905, 0, "t"], + [9906, 0, "x"], + [9907, 0, "}"], + [9908, 0, "("], + [9909, 0, "\\"], + [9910, 0, "m"], + [9911, 0, "a"], + [9912, 0, "t"], + [9913, 0, "h"], + [9914, 0, "s"], + [9915, 0, "f"], + [9916, 0, "{"], + [9917, 0, "r"], + [9918, 0, "e"], + [9919, 0, "g"], + [9920, 0, "T"], + [9921, 0, "}"], + [9922, 0, "("], + [9923, 0, "k"], + [9924, 0, ")"], + [9925, 0, ")"], + [9926, 0, " "], + [9927, 0, "\\"], + [9928, 0, ","], + [9929, 0, "\\"], + [9930, 0, "}"], + [9931, 0, "$"], + [9932, 0, "}"], + [9933, 0, "\n"], + [9934, 0, "\\"], + [9935, 0, "L"], + [9936, 0, "e"], + [9937, 0, "f"], + [9938, 0, "t"], + [9939, 0, "L"], + [9940, 0, "a"], + [9941, 0, "b"], + [9942, 0, "e"], + [9943, 0, "l"], + [9944, 0, "{"], + [9945, 0, "$"], + [9946, 0, "\\"], + [9947, 0, "t"], + [9948, 0, "e"], + [9949, 0, "x"], + [9950, 0, "t"], + [9951, 0, "s"], + [9952, 0, "c"], + [9953, 0, "{"], + [9954, 0, "V"], + [9955, 0, "a"], + [9956, 0, "l"], + [9957, 0, "}"], + [9958, 0, "_"], + [9959, 0, "2"], + [9960, 0, "$"], + [9961, 0, "}"], + [9962, 0, "\n"], + [9963, 0, "'"], + [9963, 1], + [9963, 0, "\\"], + [9964, 0, "B"], + [9965, 0, "i"], + [9966, 0, "n"], + [9967, 0, "a"], + [9968, 0, "r"], + [9969, 0, "y"], + [9970, 0, "I"], + [9971, 0, "n"], + [9972, 0, "f"], + [9973, 0, "C"], + [9974, 0, "{"], + [9975, 0, "$"], + [9976, 0, "A"], + [9977, 0, "_"], + [9978, 0, "p"], + [9979, 0, ","], + [9980, 0, "\\"], + [9981, 0, ","], + [9982, 0, " "], + [9982, 1], + [9981, 1], + [9980, 1], + [9979, 1], + [9978, 1], + [9977, 1], + [9976, 1], + [9976, 0, "\\"], + [9977, 0, "m"], + [9978, 0, "a"], + [9979, 0, "t"], + [9980, 0, "h"], + [9981, 0, "i"], + [9982, 0, "t"], + [9983, 0, "{"], + [9984, 0, "c"], + [9985, 0, "t"], + [9986, 0, "x"], + [9987, 0, "}"], + [9988, 0, ","], + [9989, 0, "\\"], + [9990, 0, ","], + [9991, 0, " "], + [9992, 0, "\\"], + [9993, 0, "m"], + [9994, 0, "a"], + [9995, 0, "t"], + [9996, 0, "h"], + [9997, 0, "s"], + [9998, 0, "f"], + [9999, 0, "{"], + [10000, 0, "c"], + [10001, 0, "u"], + [10002, 0, "r"], + [10003, 0, "s"], + [10004, 0, "o"], + [10005, 0, "r"], + [10006, 0, "}"], + [10007, 0, "("], + [10008, 0, "\\"], + [10009, 0, "l"], + [10010, 0, "a"], + [10011, 0, "n"], + [10012, 0, "g"], + [10013, 0, "l"], + [10014, 0, "e"], + [10015, 0, "\\"], + [10016, 0, "r"], + [10017, 0, "a"], + [10018, 0, "n"], + [10019, 0, "g"], + [10020, 0, "l"], + [10021, 0, "e"], + [10022, 0, ","], + [10023, 0, "\\"], + [10024, 0, ","], + [10025, 0, " "], + [10026, 0, "k"], + [10027, 0, ")"], + [10028, 0, "."], + [10029, 0, "\\"], + [10030, 0, "m"], + [10031, 0, "a"], + [10032, 0, "t"], + [10033, 0, "h"], + [10034, 0, "s"], + [10035, 0, "f"], + [10036, 0, "{"], + [10037, 0, "v"], + [10038, 0, "a"], + [10039, 0, "l"], + [10040, 0, "u"], + [10041, 0, "e"], + [10042, 0, "s"], + [10043, 0, "}"], + [10044, 0, " "], + [10045, 0, "\\"], + [10046, 0, "e"], + [10047, 0, "v"], + [10048, 0, "a"], + [10049, 0, "l"], + [10050, 0, "t"], + [10051, 0, "o"], + [10052, 0, " "], + [10053, 0, "\\"], + [10054, 0, "m"], + [10055, 0, "a"], + [10056, 0, "t"], + [10057, 0, "h"], + [10058, 0, "i"], + [10059, 0, "t"], + [10060, 0, "{"], + [10061, 0, "v"], + [10062, 0, "a"], + [10063, 0, "l"], + [10064, 0, "}"], + [10065, 0, "$"], + [10066, 0, "}"], + [10067, 0, "\n"], + [10068, 0, "\\"], + [10069, 0, "e"], + [10070, 0, "n"], + [10071, 0, "d"], + [10072, 0, "{"], + [10073, 0, "p"], + [10074, 0, "r"], + [10075, 0, "o"], + [10076, 0, "o"], + [10077, 0, "f"], + [10078, 0, "t"], + [10079, 0, "r"], + [10080, 0, "e"], + [10081, 0, "e"], + [10082, 0, "}"], + [10083, 0, "\n"], + [10084, 0, "\n"], + [10085, 0, "\\"], + [10086, 0, "b"], + [10087, 0, "e"], + [10088, 0, "g"], + [10089, 0, "i"], + [10090, 0, "n"], + [10091, 0, "{"], + [10092, 0, "p"], + [10093, 0, "r"], + [10094, 0, "o"], + [10095, 0, "o"], + [10096, 0, "f"], + [10097, 0, "t"], + [10098, 0, "r"], + [10099, 0, "e"], + [10100, 0, "e"], + [10101, 0, "}"], + [10102, 0, "\n"], + [10103, 0, "\\"], + [10104, 0, "e"], + [10105, 0, "n"], + [10106, 0, "d"], + [10107, 0, "{"], + [10108, 0, "p"], + [10109, 0, "r"], + [10110, 0, "o"], + [10111, 0, "o"], + [10112, 0, "f"], + [10113, 0, "t"], + [10114, 0, "r"], + [10115, 0, "e"], + [10116, 0, "e"], + [10117, 0, "}"], + [10102, 0, "\n"], + [10103, 0, "\\"], + [10104, 0, "A"], + [10105, 0, "x"], + [10106, 0, "i"], + [10107, 0, "o"], + [10108, 0, "m"], + [10109, 0, "C"], + [10110, 0, "{"], + [10111, 0, "$"], + [10112, 0, "k"], + [10113, 0, "_"], + [10114, 0, "1"], + [10115, 0, " "], + [10116, 0, "\\"], + [10117, 0, "i"], + [10118, 0, "n"], + [10119, 0, " "], + [10120, 0, "\\"], + [10121, 0, "m"], + [10122, 0, "a"], + [10123, 0, "t"], + [10124, 0, "h"], + [10125, 0, "r"], + [10126, 0, "m"], + [10127, 0, "{"], + [10128, 0, "d"], + [10129, 0, "o"], + [10130, 0, "m"], + [10131, 0, "}"], + [10132, 0, "("], + [10133, 0, "\\"], + [10134, 0, "m"], + [10135, 0, "a"], + [10136, 0, "t"], + [10137, 0, "h"], + [10138, 0, "i"], + [10139, 0, "t"], + [10140, 0, "{"], + [10141, 0, "c"], + [10142, 0, "t"], + [10143, 0, "x"], + [10144, 0, "}"], + [10145, 0, ")"], + [10146, 0, "$"], + [10147, 0, "}"], + [10148, 0, "\n"], + [10149, 0, "\\"], + [10150, 0, "A"], + [10151, 0, "x"], + [10152, 0, "i"], + [10153, 0, "o"], + [10154, 0, "m"], + [10155, 0, "C"], + [10156, 0, "{"], + [10157, 0, "$"], + [10158, 0, "\\"], + [10159, 0, "m"], + [10160, 0, "a"], + [10161, 0, "t"], + [10162, 0, "h"], + [10163, 0, "i"], + [10164, 0, "t"], + [10165, 0, "{"], + [10166, 0, "c"], + [10167, 0, "t"], + [10168, 0, "x"], + [10169, 0, "}"], + [10170, 0, "("], + [10171, 0, "k"], + [10172, 0, "_"], + [10173, 0, "1"], + [10174, 0, "}"], + [10174, 1], + [10174, 0, ")"], + [10175, 0, ","], + [10176, 0, "\\"], + [10177, 0, ","], + [10178, 0, " "], + [10179, 0, "\\"], + [10180, 0, "m"], + [10181, 0, "a"], + [10182, 0, "t"], + [10183, 0, "h"], + [10184, 0, "s"], + [10185, 0, "f"], + [10186, 0, "{"], + [10187, 0, "c"], + [10188, 0, "u"], + [10189, 0, "r"], + [10190, 0, "s"], + [10191, 0, "o"], + [10192, 0, "r"], + [10193, 0, "("], + [10193, 0, "}"], + [10195, 0, "\\"], + [10196, 0, "l"], + [10197, 0, "a"], + [10198, 0, "n"], + [10199, 0, "g"], + [10200, 0, "l"], + [10201, 0, "e"], + [10202, 0, " "], + [10203, 0, "k"], + [10204, 0, "_"], + [10205, 0, "2"], + [10206, 0, ","], + [10207, 0, " "], + [10208, 0, "\\"], + [10209, 0, "d"], + [10210, 0, "o"], + [10211, 0, "t"], + [10212, 0, "s"], + [10213, 0, ","], + [10214, 0, " "], + [10215, 0, "k"], + [10216, 0, "{"], + [10216, 1], + [10216, 0, "_"], + [10217, 0, "{"], + [10218, 0, "n"], + [10219, 0, "-"], + [10220, 0, "1"], + [10221, 0, "}"], + [10222, 0, " "], + [10223, 0, "\\"], + [10224, 0, "r"], + [10225, 0, "a"], + [10226, 0, "n"], + [10227, 0, "g"], + [10228, 0, "l"], + [10229, 0, "e"], + [10230, 0, ","], + [10231, 0, "\\"], + [10232, 0, ","], + [10233, 0, " "], + [10234, 0, "k"], + [10235, 0, "_"], + [10236, 0, "n"], + [10237, 0, ")"], + [10238, 0, "."], + [10239, 0, "\\"], + [10240, 0, "m"], + [10241, 0, "a"], + [10242, 0, "t"], + [10243, 0, "h"], + [10244, 0, "s"], + [10245, 0, "f"], + [10246, 0, "{"], + [10247, 0, "v"], + [10248, 0, "a"], + [10249, 0, "l"], + [10250, 0, "u"], + [10251, 0, "e"], + [10252, 0, "s"], + [10253, 0, "}"], + [10254, 0, "\n"], + [10255, 0, " "], + [10256, 0, " "], + [10257, 0, " "], + [10258, 0, " "], + [10259, 0, "\\"], + [10260, 0, "e"], + [10261, 0, "v"], + [10262, 0, "a"], + [10263, 0, "l"], + [10264, 0, "t"], + [10265, 0, "o"], + [10266, 0, " "], + [10267, 0, "\\"], + [10268, 0, "m"], + [10269, 0, "a"], + [10270, 0, "t"], + [10271, 0, "h"], + [10272, 0, "i"], + [10273, 0, "t"], + [10274, 0, "{"], + [10275, 0, "v"], + [10276, 0, "a"], + [10277, 0, "l"], + [10278, 0, "}"], + [10279, 0, "$"], + [10280, 0, "}"], + [10281, 0, "\n"], + [10282, 0, "\\"], + [10283, 0, "L"], + [10284, 0, "e"], + [10285, 0, "f"], + [10286, 0, "t"], + [10287, 0, "L"], + [10288, 0, "a"], + [10289, 0, "b"], + [10290, 0, "e"], + [10291, 0, "l"], + [10292, 0, "{"], + [10293, 0, "$"], + [10294, 0, "\\"], + [10295, 0, "t"], + [10296, 0, "e"], + [10297, 0, "x"], + [10298, 0, "t"], + [10299, 0, "s"], + [10300, 0, "c"], + [10301, 0, "{"], + [10302, 0, "V"], + [10303, 0, "a"], + [10304, 0, "l"], + [10305, 0, "}"], + [10306, 0, "_"], + [10307, 0, "3"], + [10308, 0, "$"], + [10309, 0, "}"], + [10310, 0, "\n"], + [10311, 0, "\\"], + [10312, 0, "B"], + [10313, 0, "i"], + [10314, 0, "n"], + [10315, 0, "a"], + [10316, 0, "r"], + [10317, 0, "y"], + [10318, 0, "I"], + [10319, 0, "n"], + [10320, 0, "f"], + [10321, 0, "C"], + [10322, 0, "{"], + [10323, 0, "$"], + [10324, 0, "\\"], + [10325, 0, "m"], + [10326, 0, "a"], + [10327, 0, "t"], + [10328, 0, "h"], + [10329, 0, "i"], + [10330, 0, "t"], + [10331, 0, "{"], + [10332, 0, "c"], + [10333, 0, "t"], + [10334, 0, "x"], + [10335, 0, "}"], + [10336, 0, ","], + [10337, 0, "\\"], + [10338, 0, ","], + [10339, 0, " "], + [10340, 0, "\\"], + [10341, 0, "m"], + [10342, 0, "a"], + [10343, 0, "t"], + [10344, 0, "h"], + [10345, 0, "s"], + [10346, 0, "f"], + [10347, 0, "{"], + [10348, 0, "c"], + [10349, 0, "u"], + [10350, 0, "r"], + [10351, 0, "s"], + [10352, 0, "o"], + [10353, 0, "r"], + [10354, 0, "}"], + [10355, 0, "("], + [10356, 0, "\\"], + [10357, 0, "l"], + [10358, 0, "a"], + [10359, 0, "n"], + [10360, 0, "g"], + [10361, 0, "l"], + [10362, 0, "e"], + [10363, 0, " "], + [10364, 0, "k"], + [10365, 0, "_"], + [10366, 0, "1"], + [10367, 0, ","], + [10368, 0, " "], + [10369, 0, "k"], + [10370, 0, "_"], + [10371, 0, "2"], + [10372, 0, ","], + [10373, 0, " "], + [10374, 0, "\\"], + [10375, 0, "d"], + [10376, 0, "o"], + [10377, 0, "t"], + [10378, 0, "s"], + [10379, 0, ","], + [10380, 0, " "], + [10381, 0, "k"], + [10382, 0, "_"], + [10383, 0, "{"], + [10384, 0, "n"], + [10385, 0, "-"], + [10386, 0, "1"], + [10387, 0, "}"], + [10388, 0, " "], + [10389, 0, "\\"], + [10390, 0, "r"], + [10391, 0, "a"], + [10392, 0, "n"], + [10393, 0, "g"], + [10394, 0, "l"], + [10395, 0, "e"], + [10396, 0, ","], + [10397, 0, "\\"], + [10398, 0, ","], + [10399, 0, " "], + [10400, 0, "k"], + [10401, 0, "_"], + [10402, 0, "n"], + [10403, 0, ")"], + [10404, 0, "."], + [10405, 0, "\\"], + [10406, 0, "m"], + [10407, 0, "a"], + [10408, 0, "t"], + [10409, 0, "h"], + [10410, 0, "s"], + [10411, 0, "f"], + [10412, 0, "{"], + [10413, 0, "v"], + [10414, 0, "a"], + [10415, 0, "l"], + [10416, 0, "u"], + [10417, 0, "e"], + [10418, 0, "s"], + [10419, 0, "}"], + [10420, 0, "\n"], + [10421, 0, " "], + [10422, 0, " "], + [10423, 0, " "], + [10424, 0, " "], + [10425, 0, "\\"], + [10426, 0, "e"], + [10427, 0, "v"], + [10428, 0, "a"], + [10429, 0, "l"], + [10430, 0, "t"], + [10431, 0, "o"], + [10432, 0, " "], + [10433, 0, "\\"], + [10434, 0, "m"], + [10435, 0, "a"], + [10436, 0, "t"], + [10437, 0, "h"], + [10438, 0, "i"], + [10439, 0, "t"], + [10440, 0, "{"], + [10441, 0, "v"], + [10442, 0, "a"], + [10443, 0, "l"], + [10444, 0, "}"], + [10445, 0, "$"], + [10446, 0, "}"], + [14122, 0, " "], + [14123, 0, "N"], + [14124, 0, "o"], + [14125, 0, "t"], + [14126, 0, "e"], + [14127, 0, " "], + [14128, 0, "t"], + [14129, 0, "h"], + [14130, 0, "a"], + [14131, 0, "t"], + [14132, 0, " "], + [14133, 0, "t"], + [14134, 0, "h"], + [14135, 0, "e"], + [14136, 0, " "], + [14136, 1], + [14135, 1], + [14134, 1], + [14133, 1], + [14133, 0, "t"], + [14134, 0, "h"], + [14135, 0, "e"], + [14136, 0, " "], + [14137, 0, "e"], + [14138, 0, "x"], + [14139, 0, "p"], + [14140, 0, "r"], + [14141, 0, "e"], + [14142, 0, "s"], + [14143, 0, "s"], + [14144, 0, "i"], + [14145, 0, "o"], + [14146, 0, "n"], + [14147, 0, " "], + [14148, 0, "\\"], + [14149, 0, "v"], + [14150, 0, "e"], + [14151, 0, "r"], + [14152, 0, "b"], + [14153, 0, "\""], + [14153, 1], + [14153, 0, "|"], + [14154, 0, "d"], + [14155, 0, "o"], + [14156, 0, "c"], + [14157, 0, "."], + [14158, 0, "g"], + [14159, 0, "e"], + [14160, 0, "t"], + [14161, 0, "|"], + [14162, 0, " "], + [14163, 0, "i"], + [14164, 0, "m"], + [14165, 0, "p"], + [14166, 0, "l"], + [14167, 0, "i"], + [14168, 0, "c"], + [14169, 0, "i"], + [14170, 0, "t"], + [14171, 0, "l"], + [14172, 0, "y"], + [14173, 0, " "], + [14174, 0, "a"], + [14175, 0, "s"], + [14176, 0, "s"], + [14177, 0, "e"], + [14178, 0, "r"], + [14179, 0, "t"], + [14180, 0, "s"], + [14181, 0, " "], + [14182, 0, "t"], + [14183, 0, "h"], + [14184, 0, "a"], + [14185, 0, "t"], + [14186, 0, " "], + [14187, 0, "\\"], + [14188, 0, "m"], + [14189, 0, "a"], + [14190, 0, "t"], + [14191, 0, "h"], + [14192, 0, "s"], + [14193, 0, "f"], + [14194, 0, "{"], + [14195, 0, "d"], + [14196, 0, "o"], + [14197, 0, "c"], + [14198, 0, "}"], + [14199, 0, " "], + [14200, 0, "i"], + [14201, 0, "s"], + [14202, 0, " "], + [14203, 0, "o"], + [14204, 0, "f"], + [14205, 0, " "], + [14206, 0, "t"], + [14207, 0, "y"], + [14208, 0, "p"], + [14209, 0, "e"], + [14210, 0, " "], + [14211, 0, "\\"], + [14212, 0, "m"], + [14213, 0, "a"], + [14214, 0, "p"], + [14214, 1], + [14213, 1], + [14212, 1], + [14188, 1], + [14188, 1], + [14188, 1], + [14188, 1], + [14188, 0, "t"], + [14189, 0, "e"], + [14190, 0, "x"], + [14191, 0, "t"], + [14212, 0, "t"], + [14213, 0, "e"], + [14214, 0, "x"], + [14215, 0, "t"], + [14216, 0, "s"], + [14217, 0, "f"], + [14218, 0, "{"], + [14219, 0, "m"], + [14220, 0, "a"], + [14221, 0, "p"], + [14222, 0, "T"], + [14223, 0, "}"], + [14224, 0, ","], + [14225, 0, " "], + [14226, 0, "a"], + [14227, 0, "n"], + [14228, 0, "d"], + [14229, 0, " "], + [14230, 0, "t"], + [14231, 0, "h"], + [14232, 0, "i"], + [14233, 0, "s"], + [14234, 0, " "], + [14235, 0, "a"], + [14236, 0, "s"], + [14237, 0, "s"], + [14238, 0, "e"], + [14239, 0, "r"], + [14240, 0, "t"], + [14241, 0, "i"], + [14242, 0, "o"], + [14243, 0, "n"], + [14244, 0, " "], + [14245, 0, "i"], + [14246, 0, "s"], + [14247, 0, " "], + [14248, 0, "e"], + [14249, 0, "n"], + [14250, 0, "c"], + [14251, 0, "o"], + [14252, 0, "d"], + [14253, 0, "e"], + [14254, 0, "d"], + [14255, 0, " "], + [14256, 0, "i"], + [14257, 0, "n"], + [14258, 0, " "], + [14259, 0, "t"], + [14260, 0, "h"], + [14261, 0, "e"], + [14262, 0, " "], + [14263, 0, "c"], + [14264, 0, "u"], + [14265, 0, "r"], + [14266, 0, "s"], + [14267, 0, "o"], + [14268, 0, "r"], + [14269, 0, "."], + [14780, 0, "\n"], + [14781, 0, "\n"], + [14782, 0, "F"], + [14783, 0, "i"], + [14784, 0, "n"], + [14785, 0, "a"], + [14786, 0, "l"], + [14787, 0, "l"], + [14788, 0, "y"], + [14789, 0, ","], + [14790, 0, " "], + [14791, 0, "t"], + [14792, 0, "h"], + [14793, 0, "e"], + [14794, 0, " "], + [14795, 0, "$"], + [14796, 0, "\\"], + [14797, 0, "t"], + [14798, 0, "e"], + [14799, 0, "x"], + [14800, 0, "t"], + [14801, 0, "s"], + [14802, 0, "c"], + [14803, 0, "{"], + [14804, 0, "V"], + [14805, 0, "a"], + [14806, 0, "l"], + [14807, 0, "}"], + [14808, 0, "_"], + [14809, 0, "{"], + [14810, 0, "1"], + [14811, 0, ","], + [14812, 0, "2"], + [14813, 0, ","], + [14814, 0, "3"], + [14815, 0, "}"], + [14816, 0, "$"], + [14817, 0, " "], + [14818, 0, "r"], + [14819, 0, "u"], + [14820, 0, "l"], + [14821, 0, "e"], + [14822, 0, "s"], + [14823, 0, " "], + [14824, 0, "d"], + [14824, 1], + [14824, 0, "a"], + [14825, 0, "l"], + [14826, 0, "l"], + [14827, 0, "o"], + [14828, 0, "w"], + [14829, 0, " "], + [14830, 0, "a"], + [14831, 0, " "], + [14832, 0, "p"], + [14833, 0, "r"], + [14834, 0, "o"], + [14835, 0, "g"], + [14836, 0, "r"], + [14837, 0, "a"], + [14838, 0, "m"], + [14839, 0, " "], + [14840, 0, "t"], + [14841, 0, "o"], + [14842, 0, " "], + [14843, 0, "r"], + [14844, 0, "e"], + [14845, 0, "a"], + [14846, 0, "d"], + [14847, 0, " "], + [14848, 0, "t"], + [14849, 0, "h"], + [14850, 0, "e"], + [14851, 0, " "], + [14852, 0, "v"], + [14853, 0, "a"], + [14854, 0, "l"], + [14855, 0, "u"], + [14856, 0, "e"], + [14857, 0, " "], + [14857, 1], + [14856, 1], + [14855, 1], + [14854, 1], + [14853, 1], + [14852, 1], + [14852, 0, "c"], + [14853, 0, "o"], + [14854, 0, "n"], + [14855, 0, "t"], + [14856, 0, "e"], + [14857, 0, "n"], + [14858, 0, "t"], + [14859, 0, "s"], + [14860, 0, " "], + [14861, 0, "o"], + [14862, 0, "f"], + [14863, 0, " "], + [14864, 0, "t"], + [14865, 0, "h"], + [14866, 0, "e"], + [14867, 0, " "], + [14868, 0, "d"], + [14869, 0, "o"], + [14870, 0, "c"], + [14871, 0, "u"], + [14872, 0, "m"], + [14873, 0, "e"], + [14874, 0, "n"], + [14875, 0, "t"], + [14876, 0, " "], + [14877, 0, "a"], + [14878, 0, "t"], + [14879, 0, " "], + [14880, 0, "a"], + [14881, 0, " "], + [14882, 0, "p"], + [14883, 0, "a"], + [14884, 0, "r"], + [14885, 0, "t"], + [14886, 0, "i"], + [14887, 0, "c"], + [14888, 0, "u"], + [14889, 0, "l"], + [14890, 0, "a"], + [14891, 0, "r"], + [14892, 0, " "], + [14893, 0, "c"], + [14894, 0, "u"], + [14895, 0, "r"], + [14896, 0, "s"], + [14897, 0, "o"], + [14898, 0, "r"], + [14899, 0, " "], + [14900, 0, "p"], + [14901, 0, "o"], + [14902, 0, "s"], + [14903, 0, "i"], + [14904, 0, "t"], + [14905, 0, "i"], + [14906, 0, "o"], + [14907, 0, "n"], + [14908, 0, "."], + [14909, 0, " "], + [14910, 0, "T"], + [14911, 0, "h"], + [14912, 0, "e"], + [14913, 0, " "], + [14914, 0, "l"], + [14915, 0, "e"], + [14916, 0, "a"], + [14917, 0, "v"], + [14918, 0, "e"], + [14919, 0, "s"], + [14920, 0, " "], + [14921, 0, "o"], + [14922, 0, "f"], + [14923, 0, " "], + [14924, 0, "t"], + [14925, 0, "h"], + [14926, 0, "e"], + [14927, 0, " "], + [14928, 0, "d"], + [14929, 0, "o"], + [14930, 0, "c"], + [14931, 0, "u"], + [14932, 0, "m"], + [14933, 0, "e"], + [14934, 0, "n"], + [14935, 0, "t"], + [14936, 0, " "], + [14937, 0, "t"], + [14938, 0, "r"], + [14939, 0, "e"], + [14940, 0, "e"], + [14941, 0, " "], + [14942, 0, "a"], + [14943, 0, "r"], + [14944, 0, "e"], + [14945, 0, " "], + [14946, 0, "a"], + [14947, 0, "l"], + [14948, 0, "w"], + [14949, 0, "a"], + [14950, 0, "y"], + [14951, 0, "s"], + [14952, 0, " "], + [14953, 0, "\\"], + [14954, 0, "e"], + [14955, 0, "m"], + [14956, 0, "p"], + [14957, 0, "h"], + [14958, 0, "{"], + [14959, 0, "r"], + [14960, 0, "e"], + [14961, 0, "g"], + [14962, 0, "i"], + [14963, 0, "s"], + [14964, 0, "t"], + [14965, 0, "e"], + [14966, 0, "r"], + [14967, 0, "s"], + [14968, 0, "}"], + [14969, 0, " "], + [14970, 0, "e"], + [14971, 0, "x"], + [14972, 0, "p"], + [14969, 0, ","], + [14974, 0, "p"], + [14975, 0, "r"], + [14976, 0, "e"], + [14977, 0, "s"], + [14978, 0, "s"], + [14974, 1], + [14978, 0, "e"], + [14979, 0, "d"], + [14980, 0, " "], + [14981, 0, "u"], + [14982, 0, "s"], + [14983, 0, "i"], + [14984, 0, "n"], + [14985, 0, "g"], + [14986, 0, " "], + [14987, 0, "t"], + [14988, 0, "h"], + [14989, 0, "e"], + [14990, 0, " "], + [14991, 0, "$"], + [14992, 0, "\\"], + [14992, 1], + [14991, 1], + [14991, 0, "\\"], + [14992, 0, "t"], + [14993, 0, "e"], + [14994, 0, "x"], + [14995, 0, "t"], + [14996, 0, "s"], + [14997, 0, "f"], + [14998, 0, "{"], + [14999, 0, "r"], + [15000, 0, "e"], + [15001, 0, "g"], + [15002, 0, "T"], + [15003, 0, "}"], + [15004, 0, " "], + [15005, 0, "t"], + [15006, 0, "y"], + [15007, 0, "p"], + [15008, 0, "e"], + [15009, 0, " "], + [15010, 0, "a"], + [15011, 0, "n"], + [15012, 0, "n"], + [15013, 0, "o"], + [15014, 0, "t"], + [15015, 0, "a"], + [15016, 0, "t"], + [15017, 0, "i"], + [15018, 0, "o"], + [15019, 0, "n"], + [15020, 0, " "], + [15021, 0, "i"], + [15022, 0, "n"], + [15023, 0, " "], + [15024, 0, "t"], + [15025, 0, "h"], + [15026, 0, "e"], + [15027, 0, " "], + [15028, 0, "l"], + [15029, 0, "o"], + [15030, 0, "c"], + [15031, 0, "a"], + [15032, 0, "l"], + [15033, 0, " "], + [15034, 0, "s"], + [15035, 0, "t"], + [15036, 0, "a"], + [15037, 0, "t"], + [15038, 0, "e"], + [15039, 0, "."], + [15040, 0, " "], + [15041, 0, "A"], + [15042, 0, " "], + [15043, 0, "r"], + [15044, 0, "e"], + [15045, 0, "g"], + [15046, 0, "u"], + [15046, 1], + [15046, 0, "i"], + [15047, 0, "s"], + [15048, 0, "t"], + [15049, 0, "e"], + [15050, 0, "r"], + [15051, 0, " "], + [15052, 0, "m"], + [15053, 0, "a"], + [15054, 0, "y"], + [15055, 0, " "], + [15056, 0, "h"], + [15057, 0, "a"], + [15058, 0, "v"], + [15059, 0, "e"], + [15060, 0, " "], + [15061, 0, "m"], + [15062, 0, "u"], + [15062, 1], + [15061, 1], + [15060, 1], + [15059, 1], + [15058, 1], + [15057, 1], + [15056, 1], + [15055, 1], + [15054, 1], + [15053, 1], + [15052, 1], + [15051, 1], + [15050, 1], + [15049, 1], + [15048, 1], + [15047, 1], + [15046, 1], + [15045, 1], + [15044, 1], + [15043, 1], + [15042, 1], + [15042, 0, "l"], + [15043, 0, "t"], + [15044, 0, "h"], + [15045, 0, "o"], + [15046, 0, "u"], + [15047, 0, "g"], + [15048, 0, "h"], + [15049, 0, " "], + [15050, 0, "a"], + [15051, 0, " "], + [15052, 0, "s"], + [15053, 0, "i"], + [15054, 0, "n"], + [15055, 0, "g"], + [15056, 0, "l"], + [15056, 1], + [15056, 0, "l"], + [15057, 0, "e"], + [15058, 0, " "], + [15059, 0, "p"], + [15060, 0, "e"], + [15061, 0, "e"], + [15062, 0, "r"], + [15063, 0, " "], + [15064, 0, "c"], + [15065, 0, "a"], + [15066, 0, "n"], + [15067, 0, " "], + [15068, 0, "o"], + [15069, 0, "n"], + [15070, 0, "l"], + [15071, 0, "y"], + [15072, 0, " "], + [15073, 0, "a"], + [15058, 1], + [15057, 1], + [15056, 1], + [15055, 1], + [15054, 1], + [15053, 1], + [15052, 1], + [15067, 0, "s"], + [15068, 0, "s"], + [15069, 0, "i"], + [15070, 0, "g"], + [15071, 0, "n"], + [15072, 0, " "], + [15073, 0, "a"], + [15074, 0, " "], + [15075, 0, "s"], + [15076, 0, "i"], + [15077, 0, "n"], + [15078, 0, "g"], + [15079, 0, "l"], + [15080, 0, "e"], + [15081, 0, " "], + [15082, 0, "v"], + [15083, 0, "a"], + [15084, 0, "l"], + [15085, 0, "u"], + [15086, 0, "e"], + [15087, 0, " "], + [15088, 0, "t"], + [15089, 0, "o"], + [15090, 0, " "], + [15091, 0, "a"], + [15092, 0, " "], + [15093, 0, "r"], + [15094, 0, "e"], + [15095, 0, "g"], + [15096, 0, "i"], + [15097, 0, "s"], + [15098, 0, "t"], + [15099, 0, "e"], + [15100, 0, "r"], + [15101, 0, ","], + [15102, 0, " "], + [15103, 0, "a"], + [15104, 0, " "], + [15105, 0, "r"], + [15106, 0, "e"], + [15107, 0, "g"], + [15108, 0, "i"], + [15109, 0, "s"], + [15110, 0, "t"], + [15111, 0, "e"], + [15112, 0, "r"], + [15113, 0, " "], + [15114, 0, "c"], + [15115, 0, "a"], + [15116, 0, "n"], + [15117, 0, " "], + [15118, 0, "n"], + [15119, 0, "e"], + [15120, 0, "v"], + [15121, 0, "e"], + [15122, 0, "r"], + [15123, 0, "t"], + [15124, 0, "h"], + [15125, 0, "e"], + [15126, 0, "l"], + [15127, 0, "e"], + [15128, 0, "s"], + [15129, 0, "s"], + [15130, 0, " "], + [15131, 0, "c"], + [15132, 0, "o"], + [15133, 0, "n"], + [15134, 0, "t"], + [15135, 0, "a"], + [15136, 0, "i"], + [15137, 0, "n"], + [15138, 0, " "], + [15139, 0, "m"], + [15140, 0, "u"], + [15141, 0, "l"], + [15142, 0, "t"], + [15143, 0, "i"], + [15144, 0, "p"], + [15145, 0, "l"], + [15146, 0, "e"], + [15147, 0, " "], + [15148, 0, "v"], + [15149, 0, "a"], + [15150, 0, "l"], + [15151, 0, "u"], + [15152, 0, "e"], + [15153, 0, "s"], + [15154, 0, " "], + [15155, 0, "i"], + [15156, 0, "f"], + [15157, 0, " "], + [15158, 0, "m"], + [15159, 0, "u"], + [15160, 0, "l"], + [15161, 0, "t"], + [15162, 0, "i"], + [15163, 0, "l"], + [15163, 1], + [15163, 0, "p"], + [15164, 0, "l"], + [15165, 0, "e"], + [15166, 0, " "], + [15167, 0, "p"], + [15168, 0, "e"], + [15169, 0, "e"], + [15170, 0, "r"], + [15171, 0, "s"], + [15172, 0, " "], + [15173, 0, "c"], + [15174, 0, "o"], + [15175, 0, "n"], + [15176, 0, "c"], + [15177, 0, "u"], + [15178, 0, "r"], + [15179, 0, "r"], + [15180, 0, "e"], + [15181, 0, "n"], + [15182, 0, "t"], + [15183, 0, "l"], + [15184, 0, "y"], + [15185, 0, " "], + [15186, 0, "a"], + [15187, 0, "s"], + [15188, 0, "s"], + [15189, 0, "i"], + [15190, 0, "g"], + [15191, 0, "n"], + [15192, 0, " "], + [15193, 0, "v"], + [15194, 0, "a"], + [15195, 0, "l"], + [15196, 0, "u"], + [15197, 0, "e"], + [15198, 0, "s"], + [15199, 0, " "], + [15200, 0, "t"], + [15201, 0, "o"], + [15202, 0, " "], + [15203, 0, "i"], + [15204, 0, "t"], + [15205, 0, ","], + [15206, 0, " "], + [15207, 0, "a"], + [15208, 0, "n"], + [15209, 0, " "], + [15210, 0, "i"], + [15211, 0, "s"], + [15212, 0, "s"], + [15213, 0, "u"], + [15214, 0, "e"], + [15215, 0, " "], + [15216, 0, "w"], + [15217, 0, "e"], + [15218, 0, " "], + [15219, 0, "w"], + [15220, 0, "i"], + [15221, 0, "l"], + [15222, 0, "l"], + [15223, 0, " "], + [15224, 0, "e"], + [15225, 0, "x"], + [15226, 0, "p"], + [15227, 0, "o"], + [15227, 1], + [15227, 0, "l"], + [15228, 0, ";"], + [15229, 0, "o"], + [15229, 1], + [15228, 1], + [15228, 0, "o"], + [15229, 0, "r"], + [15230, 0, "e"], + [15231, 0, " "], + [15232, 0, "i"], + [15233, 0, "n"], + [15234, 0, " "], + [15235, 0, "g"], + [15236, 0, "r"], + [15237, 0, "e"], + [15238, 0, "a"], + [15239, 0, "t"], + [15240, 0, "e"], + [15241, 0, "r"], + [15242, 0, " "], + [15243, 0, "d"], + [15244, 0, "e"], + [15245, 0, "p"], + [15246, 0, "t"], + [15247, 0, "h"], + [15248, 0, " "], + [15249, 0, "l"], + [15250, 0, "a"], + [15251, 0, "t"], + [15252, 0, "e"], + [15253, 0, "r"], + [15254, 0, "."], + [14908, 0, ","], + [14909, 0, " "], + [14910, 0, "u"], + [14911, 0, "s"], + [14912, 0, "i"], + [14913, 0, "n"], + [14914, 0, "g"], + [14915, 0, " "], + [14916, 0, "a"], + [14917, 0, " "], + [14918, 0, "s"], + [14919, 0, "i"], + [14920, 0, "m"], + [14921, 0, "i"], + [14922, 0, "l"], + [14923, 0, "a"], + [14924, 0, "r"], + [14925, 0, " "], + [14926, 0, "r"], + [14927, 0, "e"], + [14928, 0, "c"], + [14929, 0, "u"], + [14930, 0, "r"], + [14931, 0, "s"], + [14932, 0, "i"], + [14933, 0, "v"], + [14934, 0, "e"], + [14935, 0, " "], + [14936, 0, "r"], + [14937, 0, "u"], + [14938, 0, "l"], + [14939, 0, "e"], + [14940, 0, " "], + [14941, 0, "s"], + [14942, 0, "t"], + [14943, 0, "r"], + [14944, 0, "u"], + [14945, 0, "c"], + [14946, 0, "t"], + [14947, 0, "u"], + [14948, 0, "r"], + [14949, 0, "e"], + [14950, 0, " "], + [14951, 0, "a"], + [14952, 0, "s"], + [14953, 0, " "], + [14954, 0, "t"], + [14955, 0, "h"], + [14956, 0, "e"], + [14957, 0, " "], + [14958, 0, "\\"], + [14959, 0, "t"], + [14960, 0, "e"], + [14961, 0, "x"], + [14962, 0, "t"], + [14963, 0, "s"], + [14964, 0, "c"], + [14965, 0, "{"], + [14966, 0, "N"], + [14967, 0, "e"], + [14968, 0, "x"], + [14969, 0, "t"], + [14970, 0, "}"], + [14971, 0, " "], + [14972, 0, "r"], + [14973, 0, "u"], + [14974, 0, "l"], + [14975, 0, "e"], + [14976, 0, "s"], + [15324, 0, "\n"], + [15325, 0, "\n"], + [15326, 0, "\\"], + [15327, 0, "s"], + [15328, 0, "u"], + [15329, 0, "b"], + [15330, 0, "s"], + [15331, 0, "u"], + [15332, 0, "b"], + [15333, 0, "s"], + [15334, 0, "e"], + [15335, 0, "c"], + [15336, 0, "t"], + [15337, 0, "i"], + [15338, 0, "o"], + [15339, 0, "n"], + [15340, 0, "{"], + [15341, 0, "O"], + [15342, 0, "p"], + [15343, 0, "e"], + [15344, 0, "r"], + [15345, 0, "a"], + [15346, 0, "t"], + [15347, 0, "i"], + [15348, 0, "o"], + [15349, 0, "n"], + [15350, 0, "a"], + [15351, 0, "l"], + [15352, 0, " "], + [15352, 1], + [15351, 1], + [15350, 1], + [15349, 1], + [15348, 1], + [15347, 1], + [15346, 1], + [15345, 1], + [15344, 1], + [15343, 1], + [15342, 1], + [15341, 1], + [15341, 0, "S"], + [15342, 0, "e"], + [15343, 0, "m"], + [15344, 0, "a"], + [15345, 0, "n"], + [15346, 0, "t"], + [15347, 0, "i"], + [15348, 0, "c"], + [15349, 0, "s"], + [15350, 0, " "], + [15351, 0, "o"], + [15352, 0, "f"], + [15353, 0, " "], + [15354, 0, "l"], + [15355, 0, "o"], + [15356, 0, "c"], + [15357, 0, "a"], + [15358, 0, "l"], + [15359, 0, " "], + [15360, 0, "m"], + [15361, 0, "u"], + [15362, 0, "t"], + [15363, 0, "a"], + [15364, 0, "t"], + [15365, 0, "i"], + [15366, 0, "o"], + [15367, 0, "n"], + [15368, 0, "s"], + [15369, 0, "}"], + [5974, 1], + [5973, 1], + [5972, 1], + [5971, 1], + [5970, 1], + [5969, 1], + [5968, 1], + [5967, 1], + [5966, 1], + [5965, 1], + [5964, 1], + [5963, 1], + [5962, 1], + [5961, 1], + [5960, 1], + [5959, 1], + [5959, 0, "e"], + [5960, 0, "x"], + [5961, 0, "p"], + [5962, 0, "r"], + [5963, 0, "e"], + [5964, 0, "s"], + [5965, 0, "s"], + [5966, 0, "i"], + [5967, 0, "o"], + [5968, 0, "n"], + [5969, 0, " "], + [5970, 0, "e"], + [5971, 0, "v"], + [5972, 0, "a"], + [5973, 0, "l"], + [5974, 0, "u"], + [5975, 0, "a"], + [5976, 0, "t"], + [5977, 0, "i"], + [5978, 0, "o"], + [5979, 0, "n"], + [5946, 1], + [5945, 1], + [5944, 1], + [5943, 1], + [5942, 1], + [5941, 1], + [5940, 1], + [5939, 1], + [5938, 1], + [5937, 1], + [5936, 1], + [5935, 1], + [5934, 1], + [5934, 0, "S"], + [2937, 0, "\n"], + [2938, 0, "\n"], + [2939, 0, "e"], + [2940, 0, "g"], + [2941, 0, "g"], + [2942, 0, "s"], + [2943, 0, "."], + [2944, 0, "v"], + [2945, 0, "a"], + [2946, 0, "l"], + [2947, 0, "u"], + [2948, 0, "e"], + [2949, 0, "s"], + [2950, 0, " "], + [2951, 0, "/"], + [2952, 0, "/"], + [2953, 0, " "], + [2954, 0, "e"], + [2955, 0, "v"], + [2956, 0, "a"], + [2957, 0, "l"], + [2958, 0, "u"], + [2959, 0, "a"], + [2960, 0, "t"], + [2961, 0, "e"], + [2962, 0, "s"], + [2963, 0, " "], + [2964, 0, "t"], + [2965, 0, "o"], + [2966, 0, " "], + [2967, 0, "{"], + [2968, 0, "\""], + [2969, 0, "e"], + [2970, 0, "g"], + [2971, 0, "g"], + [2972, 0, "s"], + [2973, 0, "\""], + [2974, 0, "}"], + [2975, 0, "\n"], + [2976, 0, "e"], + [2977, 0, "g"], + [2978, 0, "g"], + [2979, 0, "s"], + [2980, 0, "."], + [2981, 0, "n"], + [2982, 0, "e"], + [2983, 0, "x"], + [2984, 0, "t"], + [2985, 0, "."], + [2986, 0, "v"], + [2987, 0, "a"], + [2988, 0, "l"], + [2989, 0, "u"], + [2990, 0, "e"], + [2991, 0, "s"], + [2992, 0, " "], + [2993, 0, "/"], + [2994, 0, "/"], + [2995, 0, " "], + [2996, 0, "e"], + [2997, 0, "v"], + [2998, 0, "a"], + [2999, 0, "l"], + [3000, 0, "u"], + [3001, 0, "a"], + [3002, 0, "t"], + [3003, 0, "e"], + [3004, 0, "s"], + [3005, 0, " "], + [3006, 0, "t"], + [3007, 0, "o"], + [3008, 0, " "], + [3009, 0, "{"], + [3010, 0, "\""], + [3011, 0, "m"], + [3012, 0, "i"], + [3013, 0, "l"], + [3014, 0, "k"], + [3015, 0, "}"], + [3015, 1], + [3015, 0, "\""], + [3016, 0, "}"], + [6883, 0, "f"], + [6884, 0, "f"], + [6885, 0, "f"], + [6886, 0, "f"], + [6887, 0, "f"], + [6887, 1], + [6886, 1], + [6885, 1], + [6884, 1], + [6883, 1], + [6912, 1], + [6911, 1], + [6910, 1], + [6909, 1], + [6908, 1], + [6907, 1], + [6906, 1], + [6905, 1], + [6914, 0, " "], + [6915, 0, "r"], + [6916, 0, "e"], + [6917, 0, "s"], + [6918, 0, "u"], + [6919, 0, "l"], + [6920, 0, "t"], + [6921, 0, "i"], + [6922, 0, "n"], + [6923, 0, "g"], + [6929, 0, " "], + [6930, 0, "t"], + [6931, 0, "h"], + [6932, 0, "e"], + [6933, 0, " "], + [6934, 0, "e"], + [6935, 0, "x"], + [6936, 0, "e"], + [6937, 0, "c"], + [6938, 0, "u"], + [6939, 0, "t"], + [6940, 0, "i"], + [6941, 0, "o"], + [6942, 0, "n"], + [6943, 0, " "], + [6944, 0, "o"], + [6945, 0, "f"], + [6946, 0, " "], + [6947, 0, "t"], + [6948, 0, "h"], + [6949, 0, "e"], + [6950, 0, " "], + [6951, 0, "c"], + [6952, 0, "o"], + [6953, 0, "m"], + [6954, 0, "m"], + [6955, 0, "a"], + [6956, 0, "n"], + [6957, 0, "d"], + [6958, 0, "s"], + [6959, 0, " "], + [6960, 0, "i"], + [6961, 0, "n"], + [6340, 1], + [6339, 1], + [6338, 1], + [6337, 1], + [6336, 1], + [6335, 1], + [6334, 1], + [6333, 1], + [6332, 1], + [6331, 1], + [6330, 1], + [6329, 1], + [6328, 1], + [6327, 1], + [6326, 1], + [6325, 1], + [6324, 1], + [6323, 1], + [6322, 1], + [6321, 1], + [6320, 1], + [6319, 1], + [6318, 1], + [6317, 1], + [6316, 1], + [6331, 1], + [6330, 1], + [6329, 1], + [6329, 0, " "], + [6330, 0, "\\"], + [6331, 0, "m"], + [6332, 0, "a"], + [6333, 0, "p"], + [6334, 0, "s"], + [6335, 0, "t"], + [6336, 0, "o"], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6338, 1], + [6308, 1], + [6308, 1], + [6308, 1], + [6307, 1], + [6462, 1], + [6462, 1], + [6462, 1], + [6462, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6467, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 1], + [6480, 0, " "], + [6481, 0, "\\"], + [6482, 0, "m"], + [6483, 0, "a"], + [6484, 0, "p"], + [6485, 0, "s"], + [6486, 0, "t"], + [6487, 0, "o"], + [6615, 1], + [6615, 1], + [6615, 1], + [6615, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6620, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 1], + [6633, 0, " "], + [6634, 0, "\\"], + [6635, 0, "m"], + [6636, 0, "a"], + [6637, 0, "p"], + [6638, 0, "s"], + [6639, 0, "t"], + [6640, 0, "o"], + [6814, 1], + [6813, 1], + [6812, 1], + [6811, 1], + [6810, 1], + [6809, 1], + [6808, 1], + [6807, 1], + [6806, 1], + [6805, 1], + [6804, 1], + [6803, 1], + [6802, 1], + [6801, 1], + [6800, 1], + [6799, 1], + [6798, 1], + [6797, 1], + [6796, 1], + [6795, 1], + [6794, 1], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6788, 1], + [6787, 1], + [6786, 1], + [6785, 1], + [6784, 1], + [6783, 1], + [6782, 1], + [6781, 1], + [6780, 1], + [6779, 1], + [6778, 1], + [6777, 1], + [6776, 1], + [6775, 1], + [6774, 1], + [6773, 1], + [6772, 1], + [6771, 1], + [6770, 1], + [6770, 0, "s"], + [6771, 0, "t"], + [6772, 0, "a"], + [6773, 0, "t"], + [6774, 0, "e"], + [6775, 0, " "], + [6776, 0, "$"], + [6777, 0, "A"], + [6778, 0, "_"], + [6779, 0, "p"], + [6780, 0, "$"], + [6781, 0, " "], + [6782, 0, "o"], + [6783, 0, "f"], + [6784, 0, " "], + [6785, 0, "p"], + [6786, 0, "e"], + [6787, 0, "e"], + [6788, 0, "r"], + [6789, 0, " "], + [6790, 0, "$"], + [6791, 0, "p"], + [6792, 0, "$"], + [6793, 0, " "], + [6794, 0, "a"], + [6795, 0, "f"], + [6796, 0, "t"], + [6797, 0, "e"], + [6798, 0, "r"], + [6736, 0, " "], + [6737, 0, "\\"], + [6738, 0, "\\"], + [6739, 0, "\n"], + [6740, 0, "\\"], + [6741, 0, "m"], + [6742, 0, "a"], + [6743, 0, "t"], + [6744, 0, "h"], + [6745, 0, "s"], + [6746, 0, "f"], + [6747, 0, "{"], + [6748, 0, "l"], + [6749, 0, "i"], + [6750, 0, "s"], + [6751, 0, "t"], + [6752, 0, "}"], + [6753, 0, " "], + [6754, 0, " "], + [6754, 1], + [6740, 0, "&"], + [6741, 0, "&"], + [6742, 0, " "], + [6757, 0, "&"], + [6758, 0, " "], + [6759, 0, "\\"], + [6760, 0, "m"], + [6761, 0, "a"], + [6762, 0, "p"], + [6763, 0, "s"], + [6764, 0, "t"], + [6765, 0, "o"], + [6766, 0, " "], + [6767, 0, "\\"], + [6768, 0, "m"], + [6769, 0, "a"], + [6770, 0, "t"], + [6771, 0, "h"], + [6772, 0, "s"], + [6773, 0, "f"], + [6774, 0, "{"], + [6775, 0, "c"], + [6776, 0, "u"], + [6777, 0, "r"], + [6778, 0, "s"], + [6779, 0, "o"], + [6780, 0, "r"], + [6781, 0, "}"], + [6782, 0, "("], + [6783, 0, "\\"], + [6784, 0, "l"], + [6785, 0, "a"], + [6786, 0, "n"], + [6787, 0, "g"], + [6788, 0, "l"], + [6789, 0, "e"], + [6790, 0, " "], + [6791, 0, "\\"], + [6792, 0, "m"], + [6793, 0, "a"], + [6794, 0, "t"], + [6795, 0, "h"], + [6796, 0, "s"], + [6797, 0, "f"], + [6798, 0, "{"], + [6799, 0, "m"], + [6800, 0, "a"], + [6801, 0, "p"], + [6802, 0, "T"], + [6803, 0, "}"], + [6804, 0, "("], + [6805, 0, "\\"], + [6806, 0, "m"], + [6807, 0, "a"], + [6808, 0, "t"], + [6809, 0, "h"], + [6810, 0, "s"], + [6811, 0, "f"], + [6812, 0, "{"], + [6813, 0, "d"], + [6814, 0, "o"], + [6815, 0, "c"], + [6816, 0, "}"], + [6817, 0, ")"], + [6818, 0, ","], + [6819, 0, " "], + [6820, 0, "\\"], + [6821, 0, "m"], + [6822, 0, "a"], + [6823, 0, "t"], + [6824, 0, "h"], + [6825, 0, "s"], + [6826, 0, "f"], + [6827, 0, "{"], + [6828, 0, "l"], + [6829, 0, "i"], + [6830, 0, "s"], + [6831, 0, "t"], + [6832, 0, "T"], + [6833, 0, "}"], + [6834, 0, "("], + [6835, 0, "\\"], + [6836, 0, "t"], + [6837, 0, "e"], + [6838, 0, "x"], + [6839, 0, "t"], + [6840, 0, "{"], + [6841, 0, "`"], + [6842, 0, "`"], + [6843, 0, "s"], + [6844, 0, "h"], + [6845, 0, "o"], + [6846, 0, "p"], + [6847, 0, "p"], + [6848, 0, "i"], + [6849, 0, "n"], + [6850, 0, "g"], + [6851, 0, "'"], + [6852, 0, "'"], + [6853, 0, "}"], + [6854, 0, ")"], + [6855, 0, "\\"], + [6856, 0, "r"], + [6857, 0, "a"], + [6858, 0, "n"], + [6859, 0, "g"], + [6860, 0, "l"], + [6861, 0, "e"], + [6862, 0, ","], + [6863, 0, "\\"], + [6864, 0, ","], + [6819, 0, "\n"], + [6820, 0, " "], + [6821, 0, " "], + [6822, 0, " "], + [6869, 0, " "], + [6870, 0, "\\"], + [6871, 0, "m"], + [6872, 0, "a"], + [6873, 0, "t"], + [6874, 0, "h"], + [6875, 0, "s"], + [6876, 0, "f"], + [6877, 0, "{"], + [6878, 0, "h"], + [6879, 0, "e"], + [6880, 0, "a"], + [6881, 0, "d"], + [6882, 0, "}"], + [6883, 0, ")"], + [6884, 0, ","], + [6885, 0, " "], + [6886, 0, "\\"], + [6887, 0, "\\"], + [6888, 0, "\n"], + [6889, 0, "&"], + [6890, 0, "&"], + [6891, 0, " "], + [6892, 0, "\\"], + [6893, 0, "m"], + [6894, 0, "a"], + [6895, 0, "t"], + [6896, 0, "h"], + [6897, 0, "s"], + [6898, 0, "f"], + [6899, 0, "{"], + [6900, 0, "e"], + [6901, 0, "g"], + [6902, 0, "g"], + [6903, 0, "s"], + [6904, 0, "}"], + [6905, 0, " "], + [6906, 0, "&"], + [6907, 0, " "], + [6908, 0, "\\"], + [6909, 0, "m"], + [6910, 0, "a"], + [6911, 0, "p"], + [6912, 0, "s"], + [6913, 0, "t"], + [6914, 0, "o"], + [6915, 0, " "], + [6916, 0, "\\"], + [6917, 0, "m"], + [6918, 0, "a"], + [6919, 0, "t"], + [6920, 0, "h"], + [6921, 0, "s"], + [6922, 0, "f"], + [6923, 0, "{"], + [6924, 0, "c"], + [6925, 0, "u"], + [6926, 0, "r"], + [6927, 0, "s"], + [6928, 0, "o"], + [6929, 0, "r"], + [6930, 0, "}"], + [6931, 0, "("], + [6932, 0, "\\"], + [6933, 0, "l"], + [6934, 0, "a"], + [6935, 0, "n"], + [6936, 0, "g"], + [6937, 0, "l"], + [6938, 0, "e"], + [6939, 0, " "], + [6940, 0, "\\"], + [6941, 0, "m"], + [6942, 0, "a"], + [6943, 0, "t"], + [6944, 0, "h"], + [6945, 0, "s"], + [6946, 0, "f"], + [6947, 0, "{"], + [6948, 0, "m"], + [6949, 0, "a"], + [6950, 0, "p"], + [6951, 0, "T"], + [6952, 0, "}"], + [6953, 0, "("], + [6954, 0, "\\"], + [6955, 0, "m"], + [6956, 0, "a"], + [6957, 0, "t"], + [6958, 0, "h"], + [6959, 0, "s"], + [6960, 0, "f"], + [6961, 0, "{"], + [6962, 0, "d"], + [6963, 0, "o"], + [6964, 0, "c"], + [6965, 0, "}"], + [6966, 0, ")"], + [6967, 0, ","], + [6968, 0, "\n"], + [6969, 0, " "], + [6970, 0, " "], + [6971, 0, " "], + [6972, 0, " "], + [6973, 0, "\\"], + [6974, 0, "m"], + [6975, 0, "a"], + [6976, 0, "t"], + [6977, 0, "h"], + [6978, 0, "s"], + [6979, 0, "f"], + [6980, 0, "{"], + [6981, 0, "l"], + [6982, 0, "i"], + [6983, 0, "s"], + [6984, 0, "t"], + [6985, 0, "T"], + [6986, 0, "}"], + [6987, 0, "("], + [6988, 0, "\\"], + [6989, 0, "t"], + [6990, 0, "e"], + [6991, 0, "x"], + [6992, 0, "t"], + [6993, 0, "{"], + [6994, 0, "`"], + [6995, 0, "`"], + [6996, 0, "s"], + [6997, 0, "h"], + [6998, 0, "o"], + [6999, 0, "p"], + [7000, 0, "p"], + [7001, 0, "i"], + [7002, 0, "n"], + [7003, 0, "g"], + [7004, 0, "'"], + [7005, 0, "'"], + [7006, 0, "}"], + [7007, 0, ")"], + [7008, 0, "\\"], + [7009, 0, "r"], + [7010, 0, "a"], + [7011, 0, "n"], + [7012, 0, "g"], + [7013, 0, "l"], + [7014, 0, "e"], + [7015, 0, ","], + [7016, 0, "\\"], + [7017, 0, ","], + [7018, 0, " "], + [7019, 0, "\\"], + [7020, 0, "m"], + [7021, 0, "a"], + [7022, 0, "t"], + [7023, 0, "h"], + [7024, 0, "i"], + [7025, 0, "t"], + [7026, 0, "{"], + [7027, 0, "i"], + [7028, 0, "d"], + [7029, 0, "}"], + [7030, 0, "_"], + [7031, 0, "1"], + [7032, 0, ")"], + [7033, 0, " "], + [7034, 0, "\\"], + [7035, 0, "\\"], + [7036, 0, "\n"], + [7037, 0, "\\"], + [7038, 0, "}"], + [6726, 1], + [6726, 1], + [6726, 1], + [6726, 1], + [6732, 0, ","], + [6105, 1], + [6097, 0, "&"], + [6098, 0, " "], + [7035, 0, "&"], + [7036, 0, " "], + [6094, 1], + [6094, 0, "3"], + [6157, 0, "&"], + [6157, 1], + [6172, 0, "&"], + [6173, 0, "&"], + [6209, 0, "&"], + [6210, 0, "&"], + [6271, 0, "&"], + [6272, 0, "&"], + [6368, 0, "&"], + [6369, 0, "&"], + [6430, 0, "&"], + [6431, 0, "&"], + [6525, 0, "&"], + [6526, 0, "&"], + [6587, 0, "&"], + [6588, 0, "&"], + [6682, 0, "&"], + [6683, 0, "&"], + [6743, 0, "&"], + [6744, 0, "&"], + [6745, 0, " "], + [6776, 0, "\\"], + [6777, 0, "m"], + [6778, 0, "u"], + [6779, 0, "l"], + [6780, 0, "t"], + [6781, 0, "i"], + [6782, 0, "c"], + [6783, 0, "o"], + [6784, 0, "l"], + [6785, 0, "u"], + [6786, 0, "m"], + [6787, 0, "n"], + [6788, 0, "{"], + [6789, 0, "2"], + [6790, 0, "}"], + [6791, 0, "{"], + [6792, 0, "l"], + [6793, 0, "}"], + [6794, 0, "{"], + [6921, 0, "}"], + [6970, 0, "b"], + [6971, 0, "b"], + [6972, 0, "b"], + [6973, 0, "b"], + [6974, 0, "b"], + [6975, 0, "b"], + [6976, 0, "b"], + [6977, 0, "b"], + [6970, 1], + [6970, 1], + [6970, 1], + [6970, 1], + [6970, 1], + [6970, 1], + [6970, 1], + [6970, 1], + [6945, 0, "\\"], + [6946, 0, "m"], + [6947, 0, "u"], + [6948, 0, "l"], + [6949, 0, "t"], + [6950, 0, "i"], + [6951, 0, "c"], + [6952, 0, "o"], + [6953, 0, "l"], + [6954, 0, "u"], + [6955, 0, "m"], + [6956, 0, "n"], + [6957, 0, "{"], + [6958, 0, "2"], + [6959, 0, "}"], + [6960, 0, "{"], + [6961, 0, "l"], + [6962, 0, "}"], + [6963, 0, "{"], + [7089, 0, "}"], + [7089, 1], + [6963, 1], + [6962, 1], + [6961, 1], + [6960, 1], + [6959, 1], + [6958, 1], + [6957, 1], + [6956, 1], + [6955, 1], + [6954, 1], + [6953, 1], + [6952, 1], + [6951, 1], + [6951, 0, "s"], + [6952, 0, "p"], + [6953, 0, "a"], + [6954, 0, "n"], + [6955, 0, "{"], + [6956, 0, "2"], + [6957, 0, "}"], + [6958, 0, " "], + [6794, 1], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6788, 1], + [6787, 1], + [6786, 1], + [6785, 1], + [6784, 1], + [6783, 1], + [6782, 1], + [6782, 0, "s"], + [6783, 0, "p"], + [6784, 0, "a"], + [6785, 0, "n"], + [6786, 0, "{"], + [6787, 0, "2"], + [6788, 0, "}"], + [6789, 0, " "], + [6916, 1], + [6951, 1], + [6950, 1], + [6949, 1], + [6948, 1], + [6947, 1], + [6946, 1], + [6945, 1], + [6944, 1], + [6943, 1], + [6942, 1], + [6941, 1], + [6940, 1], + [6939, 1], + [6938, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6784, 0, "\\"], + [6785, 0, "m"], + [6786, 0, "u"], + [6787, 0, "l"], + [6788, 0, "t"], + [6789, 0, "i"], + [6790, 0, "c"], + [6791, 0, "o"], + [6792, 0, "l"], + [6793, 0, "u"], + [6794, 0, "m"], + [6795, 0, "n"], + [6796, 0, "{"], + [6796, 1], + [6795, 1], + [6794, 1], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6788, 1], + [6787, 1], + [6786, 1], + [6785, 1], + [6784, 1], + [6776, 0, "\\"], + [6777, 0, "m"], + [6778, 0, "u"], + [6779, 0, "l"], + [6780, 0, "t"], + [6781, 0, "i"], + [6782, 0, "c"], + [6783, 0, "o"], + [6784, 0, "l"], + [6785, 0, "u"], + [6786, 0, "m"], + [6787, 0, "n"], + [6788, 0, "{"], + [6789, 0, "2"], + [6790, 0, "}"], + [6791, 0, "{"], + [6792, 0, "c"], + [6793, 0, "}"], + [6794, 0, "{"], + [6855, 0, "%"], + [6922, 0, "}"], + [6922, 1], + [6794, 1], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6788, 1], + [6787, 1], + [6786, 1], + [6785, 1], + [6784, 1], + [6783, 1], + [6782, 1], + [6781, 1], + [6780, 1], + [6779, 1], + [6778, 1], + [6777, 1], + [6777, 0, "h"], + [6778, 0, "d"], + [6779, 0, "o"], + [6780, 0, "t"], + [6781, 0, "s"], + [6782, 0, "f"], + [6783, 0, "o"], + [6784, 0, "r"], + [6785, 0, "{"], + [6786, 0, "1"], + [6787, 0, "}"], + [6788, 0, " "], + [7072, 0, " "], + [7073, 0, "\\"], + [7074, 0, "m"], + [7075, 0, "u"], + [7076, 0, "l"], + [7077, 0, "t"], + [7078, 0, "i"], + [7079, 0, "s"], + [7080, 0, "p"], + [7081, 0, "a"], + [7082, 0, "n"], + [7083, 0, "{"], + [7084, 0, "3"], + [7085, 0, "}"], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 1], + [6776, 0, "\\"], + [6777, 0, "m"], + [6778, 0, "u"], + [6779, 0, "l"], + [6780, 0, "t"], + [6781, 0, "i"], + [6782, 0, "a"], + [6783, 0, "l"], + [6784, 0, "i"], + [6785, 0, "g"], + [6786, 0, "n"], + [6787, 0, "{"], + [6788, 0, "3"], + [6789, 0, "}"], + [6790, 0, "{"], + [6791, 0, "["], + [6792, 0, "]"], + [6793, 0, "["], + [6793, 1], + [6792, 1], + [6791, 1], + [6791, 0, "["], + [6792, 0, "]"], + [6793, 0, "["], + [6793, 1], + [6792, 1], + [6791, 1], + [6791, 0, "{"], + [6792, 0, "}"], + [6793, 0, "{"], + [6794, 0, "="], + [6794, 1], + [6793, 1], + [6793, 0, "="], + [6921, 0, "}"], + [6786, 1], + [6785, 1], + [6784, 1], + [6783, 1], + [6782, 1], + [6782, 0, "s"], + [6783, 0, "p"], + [6784, 0, "a"], + [6785, 0, "n"], + [6789, 1], + [6789, 1], + [6789, 1], + [6789, 1], + [6789, 0, "\\"], + [6790, 0, "m"], + [6791, 0, "b"], + [6792, 0, "o"], + [6793, 0, "x"], + [6794, 0, "{"], + [6795, 0, "$"], + [6923, 0, "$"], + [6923, 1], + [6793, 1], + [6792, 1], + [6791, 1], + [6790, 1], + [6789, 1], + [6785, 1], + [6784, 1], + [6783, 1], + [6782, 1], + [6782, 0, "a"], + [6783, 0, "l"], + [6784, 0, "i"], + [6785, 0, "g"], + [6786, 0, "n"], + [6791, 1], + [6791, 0, "{"], + [6792, 0, "}"], + [6793, 0, "="], + [6050, 0, "\n"], + [6051, 0, "\\"], + [6052, 0, "n"], + [6053, 0, "e"], + [6054, 0, "w"], + [6055, 0, "c"], + [6056, 0, "o"], + [6057, 0, "m"], + [6058, 0, "m"], + [6059, 0, "a"], + [6060, 0, "n"], + [6061, 0, "d"], + [6062, 0, "{"], + [6063, 0, "\\"], + [6064, 0, "m"], + [6065, 0, "u"], + [6066, 0, "l"], + [6067, 0, "t"], + [6068, 0, "i"], + [6069, 0, "a"], + [6070, 0, "l"], + [6071, 0, "i"], + [6072, 0, "g"], + [6073, 0, "n"], + [6074, 0, "}"], + [6075, 0, "["], + [6076, 0, "2"], + [6077, 0, "]"], + [6078, 0, "{"], + [6079, 0, "%"], + [6080, 0, "\n"], + [6081, 0, " "], + [6082, 0, " "], + [6083, 0, "\\"], + [6084, 0, "m"], + [6085, 0, "u"], + [6086, 0, "l"], + [6087, 0, "t"], + [6088, 0, "i"], + [6089, 0, "s"], + [6090, 0, "p"], + [6091, 0, "a"], + [6092, 0, "n"], + [6093, 0, "{"], + [6094, 0, "#"], + [6095, 0, "1"], + [6096, 0, "}"], + [6097, 0, "\\"], + [6098, 0, "m"], + [6099, 0, "b"], + [6100, 0, "o"], + [6101, 0, "x"], + [6102, 0, "{"], + [6103, 0, "$"], + [6104, 0, "\\"], + [6105, 0, "d"], + [6106, 0, "i"], + [6107, 0, "s"], + [6108, 0, "p"], + [6109, 0, "l"], + [6110, 0, "a"], + [6111, 0, "y"], + [6112, 0, "s"], + [6113, 0, "t"], + [6114, 0, "y"], + [6115, 0, "l"], + [6116, 0, "e"], + [6117, 0, "#"], + [6118, 0, "2"], + [6119, 0, "$"], + [6120, 0, "}"], + [6121, 0, "%"], + [6122, 0, "\n"], + [6123, 0, "}"], + [7165, 1], + [7164, 1], + [7163, 1], + [7162, 1], + [7161, 1], + [7160, 1], + [7159, 1], + [7158, 1], + [7157, 1], + [7156, 1], + [7155, 1], + [7154, 1], + [7153, 1], + [7152, 1], + [6867, 1], + [7018, 0, "\\"], + [7019, 0, "m"], + [7020, 0, "u"], + [7021, 0, "l"], + [7022, 0, "t"], + [7023, 0, "i"], + [7024, 0, "a"], + [7025, 0, "l"], + [7026, 0, "i"], + [7027, 0, "g"], + [7028, 0, "n"], + [7029, 0, "{"], + [7030, 0, "3"], + [7031, 0, "}"], + [7032, 0, "{"], + [7033, 0, "{"], + [7034, 0, "}"], + [7095, 0, "%"], + [7161, 0, "}"], + [7034, 1], + [7033, 1], + [7033, 0, "{"], + [7034, 0, "}"], + [7034, 1], + [7033, 1], + [6117, 0, "{"], + [6118, 0, "}"], + [6868, 1], + [6867, 1], + [6173, 1], + [6173, 1], + [6831, 1], + [6996, 1], + [7160, 1], + [7160, 1], + [7160, 0, "&"], + [7161, 0, " "], + [6173, 0, "&"], + [6174, 0, " "], + [6834, 0, "&"], + [6999, 0, "&"], + [6184, 0, "&"], + [6219, 1], + [6219, 1], + [6818, 0, "&"], + [6175, 0, "\\"], + [6176, 0, "m"], + [6177, 0, "u"], + [6178, 0, "l"], + [6179, 0, "t"], + [6180, 0, "i"], + [6181, 0, "a"], + [6182, 0, "l"], + [6183, 0, "i"], + [6184, 0, "g"], + [6185, 0, "n"], + [6186, 0, "{"], + [6187, 0, "3"], + [6188, 0, "}"], + [6189, 0, "{"], + [6198, 1], + [6198, 1], + [6198, 1], + [6196, 1], + [6195, 1], + [6290, 0, "}"], + [6290, 0, " "], + [6173, 0, "%"], + [6173, 1], + [6257, 1], + [6257, 1], + [6241, 0, "}"], + [6242, 0, " "], + [6243, 0, "&"], + [6244, 0, "&"], + [6293, 1], + [6293, 1], + [6245, 1], + [6244, 1], + [6243, 1], + [6242, 1], + [6242, 0, "\n"], + [6243, 0, " "], + [6244, 0, " "], + [6245, 0, " "], + [6246, 0, " "], + [6294, 0, "}"], + [6295, 0, " "], + [6241, 1], + [6187, 1], + [6187, 0, "5"], + [6174, 0, " "], + [6175, 0, "_"], + [6175, 1], + [6175, 0, "A"], + [6176, 0, "_"], + [6177, 0, "p"], + [6178, 0, " "], + [6179, 0, "="], + [6180, 0, " "], + [6181, 0, "\\"], + [6182, 0, "{"], + [6183, 0, " "], + [6184, 0, "\\"], + [6185, 0, "\\"], + [6186, 0, "\n"], + [6249, 1], + [6249, 0, "\n"], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 1], + [6187, 0, "&"], + [6188, 0, "&"], + [6225, 0, " "], + [6226, 0, "\\"], + [6226, 1], + [6226, 0, "&"], + [6227, 0, " "], + [6227, 1], + [6226, 1], + [6225, 1], + [6218, 0, "&"], + [6219, 0, " "], + [6220, 0, "\\"], + [6221, 0, "m"], + [6222, 0, "u"], + [6223, 0, "l"], + [6224, 0, "t"], + [6225, 0, "i"], + [6226, 0, "a"], + [6227, 0, "l"], + [6228, 0, "i"], + [6229, 0, "g"], + [6230, 0, "n"], + [6231, 0, "{"], + [6232, 0, "3"], + [6233, 0, "4"], + [6233, 1], + [6233, 0, "}"], + [6234, 0, "{"], + [6242, 1], + [6242, 0, " "], + [6247, 1], + [6247, 1], + [6247, 1], + [6247, 1], + [6175, 0, "\\"], + [6176, 0, "m"], + [6177, 0, "u"], + [6178, 0, "l"], + [6179, 0, "t"], + [6180, 0, "i"], + [6181, 0, "a"], + [6182, 0, "l"], + [6183, 0, "i"], + [6184, 0, "g"], + [6185, 0, "n"], + [6186, 0, "{"], + [6187, 0, "3"], + [6188, 0, "}"], + [6189, 0, "{"], + [6198, 0, "}"], + [6234, 1], + [6233, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6234, 1], + [6204, 1], + [6203, 1], + [6202, 1], + [6201, 1], + [6200, 1], + [6199, 1], + [6198, 1], + [6187, 1], + [6187, 0, "5"], + [6198, 0, "\\"], + [6199, 0, ";"], + [6241, 0, "\n"], + [6242, 0, " "], + [6243, 0, " "], + [6244, 0, " "], + [10319, 1], + [10318, 1], + [10317, 1], + [10316, 1], + [10315, 1], + [10314, 1], + [10313, 1], + [10312, 1], + [10311, 1], + [10310, 1], + [10309, 1], + [10308, 1], + [10307, 1], + [10306, 1], + [10305, 1], + [10304, 1], + [10303, 1], + [10302, 1], + [10301, 1], + [10300, 1], + [10299, 1], + [10298, 1], + [10297, 1], + [10296, 1], + [10295, 1], + [10294, 1], + [10293, 1], + [10292, 1], + [10291, 1], + [10290, 1], + [10289, 1], + [10288, 1], + [10287, 1], + [10286, 1], + [10285, 1], + [10284, 1], + [10283, 1], + [10282, 1], + [10281, 1], + [10280, 1], + [10279, 1], + [10278, 1], + [10277, 1], + [10276, 1], + [10275, 1], + [10274, 1], + [10273, 1], + [10272, 1], + [10271, 1], + [10270, 1], + [10270, 0, "m"], + [10271, 0, "a"], + [10272, 0, "t"], + [10273, 0, "h"], + [10274, 0, "r"], + [10275, 0, "m"], + [10276, 0, "{"], + [10277, 0, "r"], + [10278, 0, "a"], + [10279, 0, "n"], + [10280, 0, "}"], + [10281, 0, "("], + [10312, 0, ")"], + [10313, 1], + [10313, 1], + [10313, 1], + [10313, 1], + [10313, 1], + [10280, 0, "g"], + [10281, 0, "e"], + [3242, 0, " "], + [3243, 0, "I"], + [3244, 0, "t"], + [3245, 0, " "], + [3246, 0, "i"], + [3247, 0, "s"], + [3248, 0, " "], + [3249, 0, "n"], + [3250, 0, "o"], + [3251, 0, "t"], + [3252, 0, " "], + [3253, 0, "a"], + [3254, 0, " "], + [3255, 0, "f"], + [3256, 0, "u"], + [3257, 0, "l"], + [3258, 0, "l"], + [3259, 0, " "], + [3260, 0, "p"], + [3261, 0, "r"], + [3262, 0, "o"], + [3263, 0, "g"], + [3263, 1], + [3262, 1], + [3262, 0, "="], + [3262, 1], + [3261, 1], + [3261, 0, "r"], + [3262, 0, "o"], + [3263, 0, "g"], + [3264, 0, "r"], + [3265, 0, "a"], + [3266, 0, "m"], + [3267, 0, "m"], + [3268, 0, "i"], + [3269, 0, "n"], + [3270, 0, "g"], + [3271, 0, " "], + [3272, 0, "l"], + [3273, 0, "a"], + [3274, 0, "n"], + [3275, 0, "g"], + [3276, 0, "u"], + [3277, 0, "a"], + [3278, 0, "g"], + [3279, 0, "e"], + [3280, 0, ","], + [3281, 0, " "], + [3282, 0, "b"], + [3283, 0, "u"], + [3284, 0, "t"], + [3285, 0, " "], + [3286, 0, "r"], + [3287, 0, "a"], + [3288, 0, "t"], + [3289, 0, "h"], + [3290, 0, "e"], + [3291, 0, "r"], + [3292, 0, " "], + [3293, 0, "a"], + [3294, 0, "n"], + [3295, 0, " "], + [3296, 0, "A"], + [3297, 0, "P"], + [3298, 0, "I"], + [3299, 0, " "], + [3300, 0, "t"], + [3301, 0, "h"], + [3302, 0, "r"], + [3303, 0, "o"], + [3304, 0, "u"], + [3305, 0, "g"], + [3306, 0, "h"], + [3307, 0, " "], + [3308, 0, "w"], + [3309, 0, "h"], + [3310, 0, "i"], + [3311, 0, "c"], + [3312, 0, "h"], + [3313, 0, " "], + [3314, 0, "t"], + [3315, 0, "h"], + [3316, 0, "e"], + [3317, 0, " "], + [3318, 0, "d"], + [3319, 0, "o"], + [3320, 0, "c"], + [3321, 0, "u"], + [3322, 0, "m"], + [3323, 0, "e"], + [3324, 0, "n"], + [3325, 0, "t"], + [3326, 0, " "], + [3327, 0, "s"], + [3328, 0, "t"], + [3329, 0, "a"], + [3330, 0, "t"], + [3331, 0, "e"], + [3332, 0, " "], + [3333, 0, "i"], + [3334, 0, "s"], + [3335, 0, " "], + [3336, 0, "q"], + [3337, 0, "u"], + [3338, 0, "e"], + [3339, 0, "r"], + [3340, 0, "i"], + [3341, 0, "e"], + [3342, 0, "d"], + [3343, 0, " "], + [3344, 0, "a"], + [3345, 0, "n"], + [3346, 0, "d"], + [3347, 0, " "], + [3348, 0, "m"], + [3349, 0, "o"], + [3350, 0, "d"], + [3351, 0, "i"], + [3352, 0, "f"], + [3353, 0, "i"], + [3354, 0, "e"], + [3355, 0, "d"], + [3356, 0, "."], + [3357, 0, " "], + [3358, 0, "W"], + [3359, 0, "e"], + [3360, 0, " "], + [3361, 0, "a"], + [3362, 0, "s"], + [3363, 0, "s"], + [3364, 0, "u"], + [3365, 0, "m"], + [3366, 0, "e"], + [3367, 0, " "], + [3368, 0, "t"], + [3369, 0, "h"], + [3370, 0, "a"], + [3371, 0, "t"], + [3372, 0, " "], + [3373, 0, "t"], + [3374, 0, "h"], + [3375, 0, "e"], + [3376, 0, " "], + [3377, 0, "u"], + [3378, 0, "s"], + [3379, 0, "e"], + [3380, 0, "r"], + [3381, 0, " "], + [3382, 0, "p"], + [3383, 0, "r"], + [3384, 0, "o"], + [3385, 0, "g"], + [3386, 0, "r"], + [3387, 0, "a"], + [3388, 0, "m"], + [3389, 0, " "], + [3390, 0, "i"], + [3391, 0, "s"], + [3392, 0, "s"], + [3393, 0, "u"], + [3394, 0, "e"], + [3395, 0, "s"], + [3396, 0, " "], + [3397, 0, "a"], + [3397, 1], + [3397, 0, "a"], + [3398, 0, " "], + [3399, 0, "("], + [3400, 0, "p"], + [3401, 0, "o"], + [3402, 0, "s"], + [3403, 0, "s"], + [3404, 0, "i"], + [3405, 0, "b"], + [3406, 0, "l"], + [3407, 0, "y"], + [3408, 0, " "], + [3409, 0, "i"], + [3410, 0, "n"], + [3411, 0, "f"], + [3412, 0, "i"], + [3413, 0, "n"], + [3414, 0, "i"], + [3415, 0, "t"], + [3416, 0, "e"], + [3417, 0, ")"], + [3418, 0, " "], + [3419, 0, "s"], + [3420, 0, "e"], + [3421, 0, "q"], + [3422, 0, "u"], + [3423, 0, "e"], + [3424, 0, "n"], + [3425, 0, "c"], + [3426, 0, "e"], + [3427, 0, " "], + [3428, 0, "o"], + [3429, 0, "f"], + [3430, 0, " "], + [3431, 0, "c"], + [3432, 0, "o"], + [3433, 0, "m"], + [3434, 0, "m"], + [3435, 0, "a"], + [3436, 0, "n"], + [3437, 0, "d"], + [3438, 0, "s"], + [3439, 0, ","], + [3440, 0, " "], + [3440, 1], + [3439, 1], + [3381, 1], + [3380, 1], + [3379, 1], + [3378, 1], + [3377, 1], + [3384, 0, " "], + [3385, 0, "a"], + [3386, 0, "c"], + [3387, 0, "c"], + [3388, 0, "e"], + [3389, 0, "p"], + [3390, 0, "t"], + [3391, 0, "s"], + [3392, 0, " "], + [3393, 0, "u"], + [3394, 0, "s"], + [3395, 0, "e"], + [3396, 0, "r"], + [3397, 0, " "], + [3398, 0, "i"], + [3399, 0, "n"], + [3400, 0, "p"], + [3401, 0, "u"], + [3402, 0, "t"], + [3403, 0, " "], + [3404, 0, "a"], + [3405, 0, "n"], + [3406, 0, "d"], + [3457, 0, " "], + [3458, 0, "t"], + [3459, 0, "o"], + [3460, 0, " "], + [3461, 0, "t"], + [3462, 0, "h"], + [3463, 0, "e"], + [3464, 0, " "], + [3465, 0, "A"], + [3466, 0, "P"], + [3467, 0, "I"], + [3468, 0, "."], + [3469, 0, " "], + [3470, 0, "W"], + [3471, 0, "e"], + [3472, 0, " "], + [3473, 0, "m"], + [3474, 0, "o"], + [3475, 0, "d"], + [3476, 0, "e"], + [3477, 0, "l"], + [3478, 0, " "], + [3479, 0, "o"], + [3480, 0, "n"], + [3481, 0, "l"], + [3482, 0, "y"], + [3483, 0, " "], + [3484, 0, "t"], + [3485, 0, "h"], + [3486, 0, "e"], + [3487, 0, " "], + [3488, 0, "s"], + [3489, 0, "e"], + [3490, 0, "m"], + [3491, 0, "a"], + [3492, 0, "n"], + [3493, 0, "t"], + [3494, 0, "i"], + [3495, 0, "c"], + [3496, 0, "s"], + [3497, 0, " "], + [3498, 0, "o"], + [3499, 0, "f"], + [3500, 0, " "], + [3501, 0, "t"], + [3502, 0, "h"], + [3503, 0, "o"], + [3504, 0, "s"], + [3505, 0, "e"], + [3506, 0, " "], + [3507, 0, "c"], + [3508, 0, "o"], + [3509, 0, "m"], + [3510, 0, "m"], + [3511, 0, "a"], + [3512, 0, "n"], + [3513, 0, "d"], + [3514, 0, "s"], + [3515, 0, ","], + [3516, 0, " "], + [3517, 0, "a"], + [3518, 0, "n"], + [3519, 0, "d"], + [3520, 0, " "], + [3521, 0, "a"], + [3522, 0, "s"], + [3523, 0, "s"], + [3524, 0, "u"], + [3525, 0, "m"], + [3526, 0, "e"], + [3527, 0, " "], + [3528, 0, "t"], + [3529, 0, "h"], + [3530, 0, "a"], + [3531, 0, "t"], + [3532, 0, " "], + [3521, 0, "d"], + [3522, 0, "o"], + [3523, 0, " "], + [3524, 0, "n"], + [3525, 0, "o"], + [3526, 0, "t"], + [3527, 0, " "], + [3538, 1], + [3537, 1], + [3536, 1], + [3535, 1], + [3535, 0, "a"], + [3536, 0, "n"], + [3537, 0, "y"], + [3538, 0, "t"], + [3539, 0, "h"], + [3540, 0, "i"], + [3541, 0, "n"], + [3542, 0, "g"], + [3543, 0, " "], + [3544, 0, "a"], + [3545, 0, "b"], + [3546, 0, "o"], + [3547, 0, "u"], + [3548, 0, "t"], + [3549, 0, " "], + [3550, 0, "t"], + [3551, 0, "h"], + [3552, 0, "e"], + [3553, 0, " "], + [3554, 0, "p"], + [3555, 0, "r"], + [3556, 0, "o"], + [3557, 0, "g"], + [3558, 0, "r"], + [3559, 0, "a"], + [3560, 0, "m"], + [3561, 0, " "], + [3562, 0, "i"], + [3563, 0, "n"], + [3564, 0, " "], + [3565, 0, "w"], + [3566, 0, "h"], + [3567, 0, "i"], + [3568, 0, "c"], + [3569, 0, "h"], + [3570, 0, " "], + [3571, 0, "t"], + [3572, 0, "h"], + [3573, 0, "e"], + [3574, 0, " "], + [3575, 0, "c"], + [3576, 0, "o"], + [3577, 0, "m"], + [3578, 0, "m"], + [3579, 0, "a"], + [3580, 0, "n"], + [3581, 0, "d"], + [3582, 0, " "], + [3583, 0, "l"], + [3584, 0, "a"], + [3585, 0, "n"], + [3586, 0, "g"], + [3587, 0, "u"], + [3588, 0, "a"], + [3589, 0, "g"], + [3590, 0, "e"], + [3591, 0, " "], + [3592, 0, "i"], + [3593, 0, "s"], + [3594, 0, " "], + [3595, 0, "e"], + [3596, 0, "m"], + [3597, 0, "b"], + [3598, 0, "e"], + [3599, 0, "d"], + [3600, 0, "d"], + [3601, 0, "e"], + [3602, 0, "d"], + [3603, 0, "."], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [3604, 1], + [1740, 0, "\n"], + [1741, 0, "\n"], + [1739, 1], + [1741, 0, "\\"], + [1742, 0, "s"], + [1743, 0, "u"], + [1744, 0, "b"], + [1745, 0, "s"], + [1746, 0, "e"], + [1747, 0, "c"], + [1748, 0, "t"], + [1749, 0, "i"], + [1750, 0, "o"], + [1751, 0, "n"], + [1752, 0, "{"], + [1753, 0, "D"], + [1754, 0, "a"], + [1755, 0, "t"], + [1756, 0, "a"], + [1757, 0, " "], + [1758, 0, "m"], + [1759, 0, "o"], + [1760, 0, "d"], + [1761, 0, "e"], + [1762, 0, "l"], + [1763, 0, "}"], + [1764, 0, "\n"], + [1765, 0, "\n"], + [1766, 0, "W"], + [1767, 0, "e"], + [1768, 0, " "], + [714, 0, "A"], + [715, 0, " "], + [716, 0, "c"], + [717, 0, "o"], + [718, 0, "m"], + [719, 0, "="], + [719, 1], + [718, 1], + [717, 1], + [716, 1], + [716, 0, "C"], + [717, 0, "o"], + [718, 0, "n"], + [719, 0, "f"], + [720, 0, "l"], + [721, 0, "i"], + [722, 0, "c"], + [723, 0, "t"], + [724, 0, "-"], + [725, 0, "F"], + [726, 0, "r"], + [727, 0, "e"], + [728, 0, "e"], + [729, 0, " "], + [730, 0, "R"], + [731, 0, "e"], + [732, 0, "p"], + [733, 0, "l"], + [734, 0, "i"], + [735, 0, "c"], + [736, 0, "a"], + [737, 0, "t"], + [738, 0, "e"], + [739, 0, "d"], + [740, 0, " "], + [741, 0, "J"], + [742, 0, "S"], + [743, 0, "O"], + [744, 0, "N"], + [745, 0, " "], + [746, 0, "D"], + [747, 0, "a"], + [748, 0, "t"], + [749, 0, "a"], + [750, 0, "t"], + [751, 0, "y"], + [752, 0, "p"], + [753, 0, "e"], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [754, 1], + [1748, 1], + [1747, 1], + [1746, 1], + [1746, 0, "W"], + [1747, 0, "e"], + [1748, 0, " "], + [1748, 1], + [1747, 1], + [1746, 1], + [1746, 0, "O"], + [1747, 0, "u"], + [1748, 0, "r"], + [1749, 0, " "], + [1750, 0, "d"], + [1751, 0, "a"], + [1752, 0, "t"], + [1753, 0, "a"], + [1754, 0, " "], + [1755, 0, "m"], + [1756, 0, "o"], + [1757, 0, "d"], + [1758, 0, "e"], + [1759, 0, "l"], + [1760, 0, " "], + [1761, 0, "f"], + [1762, 0, "o"], + [1763, 0, "r"], + [1764, 0, " "], + [1765, 0, "a"], + [1766, 0, " "], + [1767, 0, "d"], + [1768, 0, "o"], + [1769, 0, "c"], + [1770, 0, "u"], + [1771, 0, "m"], + [1772, 0, "e"], + [1773, 0, "n"], + [1774, 0, "t"], + [1775, 0, " "], + [1776, 0, "i"], + [1777, 0, "s"], + [1778, 0, " "], + [1779, 0, "b"], + [1780, 0, "a"], + [1781, 0, "s"], + [1782, 0, "e"], + [1783, 0, "d"], + [1784, 0, " "], + [1785, 0, "o"], + [1786, 0, "n"], + [1787, 0, " "], + [1788, 0, "J"], + [1789, 0, "S"], + [1790, 0, "O"], + [1791, 0, "N"], + [1792, 0, "."], + [1793, 0, " "], + [1793, 1], + [1792, 1], + [1792, 0, "."], + [1793, 0, " "], + [1794, 0, "I"], + [1795, 0, "t"], + [1796, 0, " "], + [1797, 0, "c"], + [1798, 0, "o"], + [1799, 0, "n"], + [1800, 0, "s"], + [1801, 0, "i"], + [1802, 0, "s"], + [1803, 0, "t"], + [1804, 0, "s"], + [1805, 0, " "], + [1806, 0, "o"], + [1807, 0, "f"], + [1808, 0, " "], + [1809, 0, "a"], + [1810, 0, " "], + [1811, 0, "t"], + [1812, 0, "r"], + [1813, 0, "e"], + [1814, 0, "e"], + [1815, 0, " "], + [1816, 0, "w"], + [1817, 0, "i"], + [1818, 0, "t"], + [1819, 0, "h"], + [1820, 0, " "], + [1821, 0, "t"], + [1822, 0, "h"], + [1823, 0, "e"], + [1824, 0, " "], + [1825, 0, "f"], + [1826, 0, "o"], + [1827, 0, "l"], + [1828, 0, "l"], + [1829, 0, "o"], + [1830, 0, "w"], + [1831, 0, "i"], + [1832, 0, "n"], + [1833, 0, "g"], + [1834, 0, " "], + [1835, 0, "t"], + [1836, 0, "y"], + [1837, 0, "p"], + [1838, 0, "e"], + [1839, 0, "s"], + [1840, 0, " "], + [1841, 0, "n"], + [1842, 0, "o"], + [1842, 1], + [1841, 1], + [1841, 0, "o"], + [1842, 0, "f"], + [1843, 0, " "], + [1844, 0, "n"], + [1845, 0, "o"], + [1846, 0, "d"], + [1847, 0, "e"], + [1848, 0, ":"], + [1849, 0, "\n"], + [1850, 0, "\n"], + [1851, 0, "\\"], + [1852, 0, "b"], + [1853, 0, "e"], + [1854, 0, "g"], + [1855, 0, "i"], + [1856, 0, "n"], + [1857, 0, "{"], + [1858, 0, "e"], + [1859, 0, "n"], + [1860, 0, "u"], + [1861, 0, "m"], + [1862, 0, "e"], + [1863, 0, "r"], + [1864, 0, "a"], + [1865, 0, "t"], + [1866, 0, "e"], + [1867, 0, "}"], + [1868, 0, "\n"], + [1869, 0, "\\"], + [1870, 0, "e"], + [1871, 0, "n"], + [1872, 0, "d"], + [1873, 0, "{"], + [1874, 0, "e"], + [1875, 0, "n"], + [1876, 0, "u"], + [1877, 0, "m"], + [1878, 0, "e"], + [1879, 0, "r"], + [1880, 0, "a"], + [1881, 0, "t"], + [1882, 0, "e"], + [1883, 0, "}"], + [1868, 0, "\n"], + [1869, 0, "\\"], + [1870, 0, "i"], + [1871, 0, "t"], + [1872, 0, "e"], + [1873, 0, "m"], + [1874, 0, " "], + [1866, 1], + [1865, 1], + [1864, 1], + [1863, 1], + [1862, 1], + [1861, 1], + [1860, 1], + [1859, 1], + [1858, 1], + [1858, 0, "d"], + [1859, 0, "e"], + [1860, 0, "s"], + [1861, 0, "c"], + [1862, 0, "r"], + [1863, 0, "i"], + [1864, 0, "p"], + [1865, 0, "t"], + [1866, 0, "i"], + [1867, 0, "o"], + [1868, 0, "n"], + [1891, 1], + [1890, 1], + [1889, 1], + [1888, 1], + [1887, 1], + [1886, 1], + [1885, 1], + [1884, 1], + [1883, 1], + [1883, 0, "d"], + [1884, 0, "e"], + [1885, 0, "s"], + [1886, 0, "c"], + [1887, 0, "r"], + [1888, 0, "i"], + [1889, 0, "p"], + [1890, 0, "t"], + [1891, 0, "i"], + [1892, 0, "o"], + [1893, 0, "n"], + [1876, 1], + [1876, 0, "["], + [1877, 0, "M"], + [1878, 0, "A"], + [1879, 0, "P"], + [1879, 1], + [1878, 1], + [1878, 0, "a"], + [1879, 0, "p"], + [1880, 0, "."], + [1881, 0, "]"], + [1882, 0, " "], + [1880, 1], + [1880, 0, ":"], + [1883, 0, "A"], + [1884, 0, " "], + [1885, 0, "b"], + [1886, 0, "r"], + [1887, 0, "a"], + [1888, 0, "n"], + [1889, 0, "c"], + [1890, 0, "h"], + [1891, 0, " "], + [1892, 0, "n"], + [1893, 0, "o"], + [1894, 0, "d"], + [1895, 0, "e"], + [1896, 0, " "], + [1897, 0, "w"], + [1898, 0, "h"], + [1899, 0, "o"], + [1900, 0, "s"], + [1901, 0, "e"], + [1902, 0, " "], + [1903, 0, "c"], + [1904, 0, "h"], + [1905, 0, "i"], + [1906, 0, "l"], + [1907, 0, "d"], + [1908, 0, "r"], + [1909, 0, "e"], + [1910, 0, "n"], + [1911, 0, " "], + [1912, 0, "a"], + [1913, 0, "r"], + [1914, 0, "e"], + [1915, 0, " "], + [1916, 0, "n"], + [1917, 0, "o"], + [1918, 0, "t"], + [1919, 0, " "], + [1920, 0, "o"], + [1921, 0, "r"], + [1922, 0, "d"], + [1923, 0, "e"], + [1924, 0, "r"], + [1925, 0, "e"], + [1926, 0, "d"], + [1927, 0, ","], + [1928, 0, " "], + [1929, 0, "a"], + [1930, 0, "n"], + [1931, 0, "d"], + [1932, 0, " "], + [1933, 0, "w"], + [1934, 0, "h"], + [1935, 0, "e"], + [1936, 0, "r"], + [1937, 0, "e"], + [1938, 0, " "], + [1939, 0, "e"], + [1940, 0, "a"], + [1941, 0, "c"], + [1942, 0, "h"], + [1943, 0, " "], + [1944, 0, "c"], + [1945, 0, "h"], + [1946, 0, "i"], + [1947, 0, "l"], + [1948, 0, "d"], + [1949, 0, "r"], + [1950, 0, "e"], + [1951, 0, "n"], + [1952, 0, " "], + [1953, 0, "i"], + [1954, 0, "s"], + [1955, 0, " "], + [1955, 1], + [1954, 1], + [1953, 1], + [1952, 1], + [1951, 1], + [1950, 1], + [1949, 1], + [1949, 0, " "], + [1950, 0, "i"], + [1951, 0, "s"], + [1952, 0, " "], + [1953, 0, "l"], + [1954, 0, "a"], + [1955, 0, "b"], + [1956, 0, "e"], + [1957, 0, "l"], + [1958, 0, "l"], + [1959, 0, "e"], + [1960, 0, "d"], + [1961, 0, " "], + [1962, 0, "w"], + [1963, 0, "i"], + [1964, 0, "t"], + [1965, 0, "h"], + [1966, 0, " "], + [1967, 0, "a"], + [1968, 0, " "], + [1969, 0, "s"], + [1970, 0, "t"], + [1971, 0, "r"], + [1972, 0, "i"], + [1973, 0, "n"], + [1974, 0, "g"], + [1975, 0, " "], + [1976, 0, "\\"], + [1977, 0, "e"], + [1978, 0, "m"], + [1979, 0, "p"], + [1980, 0, "h"], + [1981, 0, "{"], + [1982, 0, "k"], + [1983, 0, "e"], + [1984, 0, "y"], + [1985, 0, "}"], + [1986, 0, "."], + [1987, 0, " "], + [1988, 0, "A"], + [1989, 0, " "], + [1990, 0, "k"], + [1991, 0, "e"], + [1992, 0, "y"], + [1993, 0, " "], + [1994, 0, "u"], + [1995, 0, "n"], + [1996, 0, "i"], + [1997, 0, "q"], + [1998, 0, "u"], + [1999, 0, "e"], + [2000, 0, "l"], + [2001, 0, "y"], + [2002, 0, " "], + [2003, 0, "i"], + [2004, 0, "d"], + [2005, 0, "e"], + [2006, 0, "n"], + [2007, 0, "t"], + [2008, 0, "i"], + [2009, 0, "f"], + [2010, 0, "i"], + [2011, 0, "e"], + [2012, 0, "s"], + [2013, 0, " "], + [2014, 0, "o"], + [2015, 0, "n"], + [2016, 0, "e"], + [2017, 0, " "], + [2018, 0, "o"], + [2019, 0, "f"], + [2020, 0, " "], + [2021, 0, "t"], + [2022, 0, "h"], + [2023, 0, "e"], + [2024, 0, " "], + [2025, 0, "c"], + [2026, 0, "h"], + [2027, 0, "i"], + [2028, 0, "l"], + [2029, 0, "d"], + [2030, 0, "r"], + [2031, 0, "e"], + [2032, 0, "n"], + [2033, 0, "."], + [2034, 0, "\n"], + [2035, 0, "\\"], + [2036, 0, "i"], + [2037, 0, "t"], + [2038, 0, "e"], + [2039, 0, "m"], + [2040, 0, "["], + [2041, 0, "L"], + [2042, 0, "i"], + [2043, 0, "s"], + [2044, 0, "t"], + [2045, 0, ":"], + [2046, 0, "}"], + [2046, 1], + [2046, 0, "]"], + [2047, 0, " "], + [2048, 0, "A"], + [2049, 0, " "], + [2050, 0, "b"], + [2051, 0, "r"], + [2052, 0, "a"], + [2053, 0, "n"], + [2054, 0, "c"], + [2055, 0, "h"], + [2056, 0, " "], + [2057, 0, "n"], + [2058, 0, "o"], + [2059, 0, "d"], + [2060, 0, "e"], + [2061, 0, " "], + [2062, 0, "w"], + [2063, 0, "h"], + [2064, 0, "o"], + [2065, 0, "s"], + [2066, 0, "e"], + [2067, 0, " "], + [2068, 0, "c"], + [2069, 0, "h"], + [2070, 0, "i"], + [2071, 0, "l"], + [2072, 0, "d"], + [2073, 0, "r"], + [2074, 0, "e"], + [2075, 0, "n"], + [2076, 0, " "], + [2077, 0, "h"], + [2078, 0, "a"], + [2079, 0, "v"], + [2080, 0, "e"], + [2081, 0, " "], + [2082, 0, "a"], + [2083, 0, "n"], + [2084, 0, " "], + [2085, 0, "o"], + [2086, 0, "r"], + [2087, 0, "d"], + [2088, 0, "e"], + [2089, 0, "r"], + [2090, 0, " "], + [2091, 0, "d"], + [2092, 0, "e"], + [2093, 0, "f"], + [2094, 0, "i"], + [2095, 0, "n"], + [2096, 0, "e"], + [2097, 0, "d"], + [2098, 0, " "], + [2099, 0, "b"], + [2100, 0, "y"], + [2101, 0, " "], + [2102, 0, "t"], + [2103, 0, "h"], + [2104, 0, "e"], + [2105, 0, " "], + [2106, 0, "a"], + [2107, 0, "p"], + [2108, 0, "p"], + [2109, 0, "l"], + [2110, 0, "i"], + [2111, 0, "c"], + [2112, 0, "a"], + [2113, 0, "t"], + [2114, 0, "i"], + [2115, 0, "o"], + [2116, 0, "n"], + [2117, 0, "."], + [2118, 0, "\n"], + [2119, 0, "\\"], + [2120, 0, "i"], + [2121, 0, "t"], + [2122, 0, "e"], + [2123, 0, "m"], + [2124, 0, "["], + [2125, 0, "R"], + [2126, 0, "e"], + [2127, 0, "g"], + [2128, 0, "i"], + [2129, 0, "s"], + [2130, 0, "t"], + [2131, 0, "e"], + [2132, 0, "r"], + [2133, 0, ":"], + [2134, 0, "]"], + [2135, 0, " "], + [2136, 0, "A"], + [2137, 0, " "], + [2138, 0, "l"], + [2139, 0, "e"], + [2140, 0, "a"], + [2141, 0, "f"], + [2142, 0, " "], + [2143, 0, "n"], + [2144, 0, "o"], + [2145, 0, "d"], + [2146, 0, "e"], + [2147, 0, " "], + [2034, 0, " "], + [2035, 0, "A"], + [2036, 0, " "], + [2037, 0, "J"], + [2038, 0, "S"], + [2039, 0, "O"], + [2040, 0, "N"], + [2041, 0, " "], + [2042, 0, "m"], + [2043, 0, "a"], + [2044, 0, "p"], + [2045, 0, " "], + [2046, 0, "i"], + [2047, 0, "s"], + [2048, 0, " "], + [2049, 0, "a"], + [2050, 0, "l"], + [2051, 0, "s"], + [2052, 0, "o"], + [2053, 0, " "], + [2054, 0, "k"], + [2055, 0, "n"], + [2056, 0, "o"], + [2057, 0, "w"], + [2058, 0, "n"], + [2059, 0, " "], + [2060, 0, "a"], + [2061, 0, "s"], + [2062, 0, " "], + [2063, 0, "a"], + [2064, 0, "n"], + [2065, 0, " "], + [2066, 0, "\\"], + [2067, 0, "e"], + [2068, 0, "m"], + [2069, 0, "p"], + [2070, 0, "h"], + [2071, 0, "{"], + [2072, 0, "o"], + [2073, 0, "b"], + [2074, 0, "j"], + [2075, 0, "e"], + [2076, 0, "c"], + [2077, 0, "t"], + [2078, 0, "}"], + [2079, 0, "."], + [2164, 0, " "], + [2165, 0, "A"], + [2166, 0, " "], + [2167, 0, "J"], + [2168, 0, "S"], + [2169, 0, "O"], + [2170, 0, "N"], + [2171, 0, " "], + [2172, 0, "l"], + [2173, 0, "i"], + [2174, 0, "s"], + [2175, 0, "t"], + [2176, 0, " "], + [2177, 0, "i"], + [2178, 0, "s"], + [2179, 0, " "], + [2180, 0, "a"], + [2181, 0, "l"], + [2182, 0, "s"], + [2183, 0, "o"], + [2184, 0, " "], + [2185, 0, "k"], + [2186, 0, "n"], + [2187, 0, "o"], + [2188, 0, "w"], + [2189, 0, "n"], + [2190, 0, " "], + [2191, 0, "a"], + [2192, 0, "s"], + [2193, 0, " "], + [2194, 0, "a"], + [2195, 0, "n"], + [2196, 0, " "], + [2197, 0, "\\"], + [2198, 0, "e"], + [2199, 0, "m"], + [2200, 0, "p"], + [2201, 0, "h"], + [2202, 0, "{"], + [2203, 0, "a"], + [2204, 0, "r"], + [2205, 0, "r"], + [2206, 0, "a"], + [2207, 0, "y"], + [2208, 0, "}"], + [2209, 0, "."], + [2033, 0, ","], + [2034, 0, " "], + [2035, 0, "a"], + [2036, 0, "n"], + [2037, 0, "d"], + [2038, 0, " "], + [2039, 0, "k"], + [2040, 0, "e"], + [2041, 0, "y"], + [2042, 0, "s"], + [2043, 0, " "], + [2044, 0, "a"], + [2045, 0, "r"], + [2046, 0, "e"], + [2047, 0, " "], + [2048, 0, "i"], + [2049, 0, "m"], + [2050, 0, "m"], + [2051, 0, "u"], + [2052, 0, "t"], + [2053, 0, "a"], + [2054, 0, "b"], + [2055, 0, "l"], + [2056, 0, "e"], + [2057, 0, " "], + [2058, 0, "("], + [2058, 1], + [2057, 1], + [2039, 1], + [2038, 1], + [2037, 1], + [2036, 1], + [2035, 1], + [2034, 1], + [2033, 1], + [2033, 0, "."], + [2034, 0, " "], + [2035, 0, "K"], + [2053, 0, ","], + [2054, 0, " "], + [2055, 0, "b"], + [2056, 0, "u"], + [2057, 0, "t"], + [2058, 0, " "], + [2059, 0, "v"], + [2060, 0, "a"], + [2061, 0, "l"], + [2062, 0, "u"], + [2063, 0, "e"], + [2064, 0, "s"], + [2065, 0, " "], + [2066, 0, "a"], + [2067, 0, "r"], + [2068, 0, "e"], + [2069, 0, " "], + [2070, 0, "m"], + [2071, 0, "u"], + [2072, 0, "t"], + [2073, 0, "a"], + [2074, 0, "b"], + [2075, 0, "l"], + [2076, 0, "e"], + [2077, 0, ","], + [2078, 0, " "], + [2079, 0, "a"], + [2080, 0, "n"], + [2081, 0, "d"], + [2082, 0, " "], + [2083, 0, "k"], + [2084, 0, "e"], + [2085, 0, "y"], + [2086, 0, "-"], + [2087, 0, "v"], + [2088, 0, "a"], + [2089, 0, "l"], + [2090, 0, "u"], + [2091, 0, "e"], + [2092, 0, " "], + [2093, 0, "m"], + [2094, 0, "a"], + [2095, 0, "p"], + [2096, 0, "p"], + [2097, 0, "i"], + [2098, 0, "n"], + [2099, 0, "g"], + [2100, 0, "s"], + [2101, 0, " "], + [2102, 0, "c"], + [2103, 0, "a"], + [2104, 0, "n"], + [2105, 0, " "], + [2106, 0, "b"], + [2107, 0, "e"], + [2108, 0, " "], + [2109, 0, "a"], + [2110, 0, "d"], + [2111, 0, "d"], + [2112, 0, "e"], + [2113, 0, "d"], + [2114, 0, " "], + [2115, 0, "a"], + [2116, 0, "n"], + [2117, 0, "d"], + [2118, 0, " "], + [2119, 0, "r"], + [2120, 0, "e"], + [2121, 0, "m"], + [2122, 0, "o"], + [2123, 0, "v"], + [2124, 0, "e"], + [2125, 0, "d"], + [2126, 0, " "], + [2127, 0, "f"], + [2128, 0, "r"], + [2129, 0, "o"], + [2130, 0, "m"], + [2131, 0, " "], + [2132, 0, "t"], + [2133, 0, "h"], + [2134, 0, "e"], + [2135, 0, " "], + [2136, 0, "m"], + [2137, 0, "a"], + [2138, 0, "p"], + [2270, 0, " "], + [2271, 0, "T"], + [2272, 0, "h"], + [2273, 0, "e"], + [2274, 0, " "], + [2275, 0, "l"], + [2276, 0, "i"], + [2277, 0, "s"], + [2278, 0, "t"], + [2279, 0, " "], + [2280, 0, "c"], + [2281, 0, "a"], + [2282, 0, "n"], + [2283, 0, " "], + [2284, 0, "b"], + [2285, 0, "e"], + [2286, 0, " "], + [2287, 0, "m"], + [2288, 0, "u"], + [2289, 0, "t"], + [2290, 0, "a"], + [2291, 0, "t"], + [2292, 0, "e"], + [2293, 0, "d"], + [2294, 0, " "], + [2295, 0, "b"], + [2296, 0, "y"], + [2297, 0, " "], + [2298, 0, "i"], + [2299, 0, "n"], + [2300, 0, "s"], + [2301, 0, "e"], + [2302, 0, "r"], + [2303, 0, "t"], + [2304, 0, "i"], + [2305, 0, "n"], + [2306, 0, "g"], + [2307, 0, " "], + [2308, 0, "o"], + [2309, 0, "r"], + [2310, 0, " "], + [2311, 0, "d"], + [2312, 0, "e"], + [2313, 0, "l"], + [2314, 0, "e"], + [2315, 0, "t"], + [2316, 0, "i"], + [2317, 0, "n"], + [2318, 0, "g"], + [2319, 0, " "], + [2320, 0, "l"], + [2321, 0, "i"], + [2322, 0, "s"], + [2323, 0, "t"], + [2324, 0, " "], + [2325, 0, "e"], + [2326, 0, "l"], + [2327, 0, "e"], + [2328, 0, "m"], + [2329, 0, "e"], + [2330, 0, "n"], + [2331, 0, "t"], + [2332, 0, "s"], + [2333, 0, "."], + [2410, 0, "c"], + [2411, 0, "o"], + [2412, 0, "n"], + [2413, 0, "t"], + [2414, 0, "a"], + [2415, 0, "i"], + [2416, 0, "n"], + [2417, 0, "i"], + [2418, 0, "n"], + [2419, 0, "g"], + [2420, 0, " "], + [2421, 0, "a"], + [2422, 0, " "], + [2423, 0, "p"], + [2424, 0, "r"], + [2425, 0, "i"], + [2426, 0, "m"], + [2427, 0, "i"], + [2428, 0, "t"], + [2429, 0, "i"], + [2430, 0, "v"], + [2431, 0, "e"], + [2432, 0, " "], + [2433, 0, "v"], + [2434, 0, "a"], + [2435, 0, "l"], + [2436, 0, "u"], + [2437, 0, "e"], + [2438, 0, " "], + [2439, 0, "("], + [2440, 0, "s"], + [2441, 0, "t"], + [2442, 0, "r"], + [2443, 0, "i"], + [2444, 0, "n"], + [2445, 0, "g"], + [2446, 0, ","], + [2447, 0, " "], + [2448, 0, "n"], + [2449, 0, "u"], + [2450, 0, "m"], + [2451, 0, "b"], + [2452, 0, "e"], + [2453, 0, "r"], + [2454, 0, " "], + [2454, 1], + [2454, 0, ","], + [2455, 0, " "], + [2456, 0, "b"], + [2457, 0, "o"], + [2458, 0, "o"], + [2459, 0, "l"], + [2460, 0, "e"], + [2461, 0, "a"], + [2462, 0, "n"], + [2463, 0, " "], + [2464, 0, "o"], + [2465, 0, "r"], + [2466, 0, " "], + [2467, 0, "n"], + [2468, 0, "u"], + [2469, 0, "l"], + [2470, 0, "l"], + [2471, 0, ")"], + [2472, 0, "."], + [2473, 0, " "], + [2474, 0, "A"], + [2475, 0, "l"], + [2476, 0, "t"], + [2477, 0, "h"], + [2478, 0, "o"], + [2479, 0, "u"], + [2480, 0, "g"], + [2481, 0, "h"], + [2482, 0, " "], + [2483, 0, "p"], + [2484, 0, "r"], + [2485, 0, "i"], + [2486, 0, "m"], + [2487, 0, "i"], + [2488, 0, "t"], + [2489, 0, "i"], + [2490, 0, "v"], + [2491, 0, "e"], + [2492, 0, "s"], + [2493, 0, " "], + [2494, 0, "a"], + [2495, 0, "r"], + [2496, 0, "e"], + [2497, 0, " "], + [2498, 0, "t"], + [2499, 0, "h"], + [2500, 0, "e"], + [2501, 0, "m"], + [2502, 0, "s"], + [2503, 0, "e"], + [2504, 0, "l"], + [2505, 0, "v"], + [2506, 0, "e"], + [2507, 0, "s"], + [2508, 0, " "], + [2509, 0, "i"], + [2510, 0, "m"], + [2511, 0, "m"], + [2512, 0, "u"], + [2513, 0, "t"], + [2514, 0, "a"], + [2515, 0, "b"], + [2516, 0, "l"], + [2517, 0, "e"], + [2518, 0, ","], + [2519, 0, " "], + [2520, 0, "t"], + [2521, 0, "h"], + [2522, 0, "e"], + [2523, 0, " "], + [2524, 0, "v"], + [2525, 0, "a"], + [2526, 0, "l"], + [2527, 0, "u"], + [2528, 0, "e"], + [2529, 0, " "], + [2530, 0, "o"], + [2531, 0, "f"], + [2532, 0, " "], + [2533, 0, "a"], + [2534, 0, " "], + [2535, 0, "r"], + [2536, 0, "e"], + [2537, 0, "g"], + [2538, 0, "i"], + [2539, 0, "s"], + [2540, 0, "t"], + [2541, 0, "e"], + [2542, 0, "r"], + [2543, 0, " "], + [2544, 0, "c"], + [2545, 0, "a"], + [2546, 0, "n"], + [2547, 0, " "], + [2548, 0, "b"], + [2549, 0, "e"], + [2550, 0, " "], + [2551, 0, "m"], + [2552, 0, "u"], + [2553, 0, "t"], + [2554, 0, "a"], + [2555, 0, "t"], + [2556, 0, "e"], + [2557, 0, "d"], + [2558, 0, " "], + [2559, 0, "b"], + [2560, 0, "y"], + [2561, 0, " "], + [2562, 0, "s"], + [2563, 0, "e"], + [2564, 0, "t"], + [2565, 0, "t"], + [2566, 0, "i"], + [2567, 0, "n"], + [2568, 0, "g"], + [2569, 0, " "], + [2532, 1], + [2531, 1], + [2530, 1], + [2529, 1], + [2528, 1], + [2527, 1], + [2526, 1], + [2525, 1], + [2524, 1], + [2523, 1], + [2522, 1], + [2521, 1], + [2520, 1], + [2557, 0, "i"], + [2558, 0, "t"], + [2559, 0, " "], + [2560, 0, "t"], + [2561, 0, "o"], + [2562, 0, " "], + [2562, 1], + [2561, 1], + [2560, 1], + [2559, 1], + [2558, 1], + [2557, 1], + [2556, 1], + [2555, 1], + [2554, 1], + [2553, 1], + [2552, 1], + [2551, 1], + [2550, 1], + [2549, 1], + [2549, 0, "a"], + [2550, 0, "s"], + [2551, 0, "s"], + [2552, 0, "i"], + [2553, 0, "g"], + [2554, 0, "n"], + [2555, 0, "i"], + [2556, 0, "n"], + [2557, 0, "g"], + [2558, 0, " "], + [2559, 0, "a"], + [2560, 0, " "], + [2561, 0, "n"], + [2562, 0, "e"], + [2563, 0, "w"], + [2564, 0, " "], + [2565, 0, "v"], + [2566, 0, "a"], + [2567, 0, "l"], + [2568, 0, "u"], + [2569, 0, "e"], + [2570, 0, " "], + [2571, 0, "t"], + [2572, 0, "o"], + [2573, 0, " "], + [2574, 0, "i"], + [2575, 0, "t"], + [2576, 0, "."], + [2577, 0, "\n"], + [2578, 0, "\\"], + [2579, 0, "i"], + [2580, 0, "t"], + [2581, 0, "e"], + [2582, 0, "m"], + [2583, 0, "["], + [2584, 0, "C"], + [2585, 0, "o"], + [2586, 0, "u"], + [2587, 0, "n"], + [2588, 0, "t"], + [2589, 0, "e"], + [2590, 0, "r"], + [2591, 0, ":"], + [2592, 0, "]"], + [2593, 0, " "], + [2594, 0, "A"], + [2595, 0, " "], + [2596, 0, "l"], + [2597, 0, "e"], + [2598, 0, "a"], + [2599, 0, "f"], + [2600, 0, " "], + [2601, 0, "n"], + [2602, 0, "o"], + [2603, 0, "d"], + [2604, 0, "e"], + [2605, 0, " "], + [2606, 0, "c"], + [2607, 0, "o"], + [2608, 0, "n"], + [2609, 0, "t"], + [2610, 0, "a"], + [2611, 0, "i"], + [2612, 0, "n"], + [2613, 0, "i"], + [2614, 0, "n"], + [2615, 0, "g"], + [2616, 0, " "], + [2617, 0, "a"], + [2618, 0, "n"], + [2619, 0, " "], + [2619, 1], + [2618, 1], + [2618, 0, " "], + [2619, 0, "n"], + [2620, 0, "u"], + [2621, 0, "m"], + [2622, 0, "b"], + [2623, 0, "e"], + [2624, 0, "r"], + [2625, 0, "."], + [2626, 0, " "], + [2627, 0, "S"], + [2627, 1], + [2627, 0, "I"], + [2628, 0, "t"], + [2629, 0, " "], + [2630, 0, "i"], + [2631, 0, "s"], + [2632, 0, " "], + [2633, 0, "s"], + [2634, 0, "i"], + [2635, 0, "m"], + [2636, 0, "i"], + [2637, 0, "l"], + [2638, 0, "a"], + [2639, 0, "r"], + [2640, 0, " "], + [2641, 0, "t"], + [2642, 0, "o"], + [2643, 0, " "], + [2644, 0, "a"], + [2645, 0, " "], + [2646, 0, "r"], + [2647, 0, "e"], + [2648, 0, "g"], + [2649, 0, "i"], + [2650, 0, "s"], + [2651, 0, "t"], + [2652, 0, "e"], + [2653, 0, "r"], + [2654, 0, ","], + [2655, 0, " "], + [2656, 0, "b"], + [2657, 0, "u"], + [2658, 0, "t"], + [2659, 0, " "], + [2660, 0, "h"], + [2661, 0, "a"], + [2662, 0, "s"], + [2663, 0, " "], + [2664, 0, "d"], + [2665, 0, "i"], + [2666, 0, "f"], + [2667, 0, "f"], + [2668, 0, "e"], + [2669, 0, "r"], + [2670, 0, "e"], + [2671, 0, "n"], + [2672, 0, "t"], + [2673, 0, " "], + [2674, 0, "s"], + [2675, 0, "e"], + [2676, 0, "m"], + [2677, 0, "a"], + [2678, 0, "n"], + [2679, 0, "t"], + [2680, 0, "i"], + [2681, 0, "c"], + [2682, 0, "s"], + [2683, 0, " "], + [2684, 0, "u"], + [2685, 0, "n"], + [2686, 0, "d"], + [2687, 0, "e"], + [2688, 0, "r"], + [2689, 0, " "], + [2690, 0, "c"], + [2691, 0, "o"], + [2692, 0, "n"], + [2693, 0, "c"], + [2694, 0, "u"], + [2695, 0, "r"], + [2696, 0, "r"], + [2697, 0, "e"], + [2698, 0, "n"], + [2699, 0, "t"], + [2700, 0, " "], + [2701, 0, "m"], + [2702, 0, "o"], + [2703, 0, "d"], + [2704, 0, "i"], + [2705, 0, "f"], + [2706, 0, "i"], + [2707, 0, "c"], + [2708, 0, "a"], + [2709, 0, "t"], + [2710, 0, "i"], + [2711, 0, "o"], + [2712, 0, "n"], + [2713, 0, ","], + [2714, 0, " "], + [2715, 0, "a"], + [2716, 0, "s"], + [2717, 0, " "], + [2718, 0, "d"], + [2719, 0, "e"], + [2720, 0, "s"], + [2721, 0, "c"], + [2722, 0, "r"], + [2723, 0, "i"], + [2724, 0, "b"], + [2725, 0, "e"], + [2726, 0, "d"], + [2727, 0, " "], + [2728, 0, "b"], + [2729, 0, "e"], + [2730, 0, "l"], + [2731, 0, "o"], + [2732, 0, "w"], + [2733, 0, "."], + [2752, 0, "\n"], + [2753, 0, "\n"], + [2754, 0, "T"], + [2755, 0, "h"], + [2756, 0, "u"], + [2757, 0, "s"], + [2758, 0, ","], + [2759, 0, " "], + [2760, 0, "i"], + [2761, 0, "n"], + [2762, 0, " "], + [2763, 0, "t"], + [2764, 0, "h"], + [2765, 0, "e"], + [2766, 0, " "], + [2767, 0, "t"], + [2768, 0, "r"], + [2769, 0, "e"], + [2770, 0, "e"], + [2771, 0, " "], + [2772, 0, "o"], + [2773, 0, "f"], + [2774, 0, " "], + [2775, 0, "a"], + [2776, 0, " "], + [2777, 0, "J"], + [2778, 0, "S"], + [2779, 0, "O"], + [2780, 0, "N"], + [2781, 0, " "], + [2782, 0, "d"], + [2783, 0, "o"], + [2784, 0, "c"], + [2785, 0, "u"], + [2786, 0, "m"], + [2787, 0, "e"], + [2788, 0, "n"], + [2789, 0, "t"], + [2790, 0, ","], + [2791, 0, " "], + [2792, 0, "a"], + [2793, 0, "l"], + [2794, 0, "l"], + [2795, 0, " "], + [2796, 0, "t"], + [2797, 0, "h"], + [2798, 0, "e"], + [2799, 0, " "], + [2800, 0, "i"], + [2801, 0, "n"], + [2802, 0, "t"], + [2803, 0, "e"], + [2804, 0, "r"], + [2805, 0, "i"], + [2806, 0, "o"], + [2807, 0, "r"], + [2808, 0, " "], + [2809, 0, "b"], + [2810, 0, "r"], + [2811, 0, "a"], + [2812, 0, "n"], + [2813, 0, "c"], + [2814, 0, "h"], + [2815, 0, " "], + [2816, 0, "n"], + [2817, 0, "o"], + [2818, 0, "d"], + [2819, 0, "e"], + [2820, 0, "s"], + [2821, 0, " "], + [2822, 0, "a"], + [2823, 0, "r"], + [2824, 0, "e"], + [2825, 0, " "], + [2826, 0, "e"], + [2827, 0, "i"], + [2828, 0, "t"], + [2829, 0, "h"], + [2830, 0, "e"], + [2831, 0, "r"], + [2832, 0, " "], + [2833, 0, "m"], + [2834, 0, "a"], + [2835, 0, "p"], + [2836, 0, "s"], + [2837, 0, " "], + [2838, 0, "o"], + [2839, 0, "r"], + [2840, 0, " "], + [2841, 0, "l"], + [2842, 0, "i"], + [2843, 0, "s"], + [2844, 0, "t"], + [2845, 0, "s"], + [2846, 0, ","], + [2847, 0, " "], + [2848, 0, "a"], + [2849, 0, "n"], + [2850, 0, "d"], + [2851, 0, " "], + [2852, 0, "a"], + [2853, 0, "l"], + [2854, 0, "l"], + [2855, 0, " "], + [2856, 0, "t"], + [2857, 0, "h"], + [2858, 0, "e"], + [2859, 0, " "], + [2860, 0, "l"], + [2861, 0, "e"], + [2862, 0, "a"], + [2863, 0, "f"], + [2864, 0, " "], + [2865, 0, "n"], + [2866, 0, "o"], + [2867, 0, "d"], + [2868, 0, "e"], + [2869, 0, "s"], + [2870, 0, " "], + [2871, 0, "a"], + [2872, 0, "r"], + [2873, 0, "e"], + [2874, 0, " "], + [2875, 0, "e"], + [2876, 0, "i"], + [2877, 0, "t"], + [2878, 0, "h"], + [2879, 0, "e"], + [2880, 0, "r"], + [2881, 0, " "], + [2882, 0, "r"], + [2883, 0, "e"], + [2884, 0, "g"], + [2885, 0, "i"], + [2886, 0, "s"], + [2887, 0, "t"], + [2888, 0, "e"], + [2889, 0, "r"], + [2890, 0, "s"], + [2891, 0, " "], + [2892, 0, "o"], + [2893, 0, "r"], + [2894, 0, " "], + [2895, 0, "c"], + [2896, 0, "o"], + [2897, 0, "u"], + [2898, 0, "n"], + [2899, 0, "t"], + [2900, 0, "e"], + [2901, 0, "r"], + [2902, 0, "s"], + [2903, 0, "."], + [2904, 0, " "], + [2905, 0, "M"], + [2906, 0, "a"], + [2907, 0, "p"], + [2908, 0, "s"], + [2909, 0, " "], + [2910, 0, "a"], + [2911, 0, "n"], + [2912, 0, "d"], + [2913, 0, " "], + [2914, 0, "l"], + [2915, 0, "i"], + [2916, 0, "s"], + [2917, 0, "t"], + [2918, 0, "s"], + [2919, 0, " "], + [2920, 0, "m"], + [2921, 0, "a"], + [2922, 0, "y"], + [2923, 0, " "], + [2924, 0, "b"], + [2925, 0, "e"], + [2926, 0, " "], + [2927, 0, "n"], + [2928, 0, "e"], + [2929, 0, "s"], + [2930, 0, "t"], + [2931, 0, "e"], + [2932, 0, "d"], + [2933, 0, " "], + [2934, 0, "w"], + [2935, 0, "i"], + [2936, 0, "t"], + [2937, 0, "h"], + [2938, 0, "i"], + [2939, 0, "n"], + [2940, 0, " "], + [2941, 0, "e"], + [2942, 0, "a"], + [2943, 0, "c"], + [2944, 0, "h"], + [2945, 0, " "], + [2946, 0, "o"], + [2947, 0, "t"], + [2948, 0, "h"], + [2949, 0, "e"], + [2950, 0, "r"], + [2951, 0, " "], + [2952, 0, "a"], + [2953, 0, "r"], + [2954, 0, "b"], + [2955, 0, "i"], + [2956, 0, "t"], + [2957, 0, "r"], + [2958, 0, "a"], + [2959, 0, "r"], + [2960, 0, "i"], + [2961, 0, "l"], + [2962, 0, "y"], + [2963, 0, "."], + [2964, 0, " "], + [2965, 0, "W"], + [2965, 1], + [2965, 0, "F"], + [2966, 0, "o"], + [2967, 0, "r"], + [2968, 0, " "], + [2969, 0, "s"], + [2970, 0, "i"], + [2971, 0, "m"], + [2972, 0, "p"], + [2973, 0, "l"], + [2974, 0, "i"], + [2975, 0, "c"], + [2976, 0, "i"], + [2977, 0, "t"], + [2978, 0, "y"], + [2979, 0, " "], + [2980, 0, "w"], + [2981, 0, "e"], + [2982, 0, " "], + [2983, 0, "d"], + [2984, 0, "o"], + [2985, 0, " "], + [2986, 0, "n"], + [2987, 0, "o"], + [2988, 0, "t"], + [2989, 0, " "], + [2990, 0, "d"], + [2991, 0, "e"], + [2992, 0, "f"], + [2993, 0, "i"], + [2994, 0, "n"], + [2995, 0, "e"], + [2996, 0, " "], + [2997, 0, "a"], + [2998, 0, " "], + [2999, 0, "s"], + [3000, 0, "c"], + [3001, 0, "h"], + [3002, 0, "e"], + [3003, 0, "m"], + [3004, 0, "a"], + [3005, 0, " "], + [3006, 0, "l"], + [3007, 0, "a"], + [3008, 0, "n"], + [3009, 0, "g"], + [3010, 0, "u"], + [3011, 0, "a"], + [3012, 0, "g"], + [3013, 0, "e"], + [3014, 0, " "], + [3015, 0, "o"], + [3016, 0, "r"], + [3017, 0, " "], + [3018, 0, "s"], + [3019, 0, "t"], + [3020, 0, "a"], + [3021, 0, "t"], + [3022, 0, "i"], + [3023, 0, "c"], + [3024, 0, " "], + [3025, 0, "t"], + [3026, 0, "y"], + [3027, 0, "p"], + [3028, 0, "e"], + [3029, 0, "-"], + [3030, 0, "c"], + [3031, 0, "h"], + [3032, 0, "e"], + [3033, 0, "c"], + [3034, 0, "k"], + [3035, 0, "i"], + [3036, 0, "n"], + [3037, 0, "g"], + [3038, 0, " "], + [3039, 0, "r"], + [3040, 0, "u"], + [3041, 0, "l"], + [3042, 0, "e"], + [3043, 0, "s"], + [3044, 0, ","], + [3045, 0, " "], + [3046, 0, "b"], + [3047, 0, "u"], + [3048, 0, "t"], + [3049, 0, " "], + [3050, 0, "s"], + [3051, 0, "u"], + [3052, 0, "c"], + [3053, 0, "h"], + [3054, 0, " "], + [3055, 0, "r"], + [3056, 0, "e"], + [3057, 0, "s"], + [3058, 0, "t"], + [3059, 0, "r"], + [3060, 0, "i"], + [3061, 0, "c"], + [3062, 0, "t"], + [3063, 0, "i"], + [3064, 0, "o"], + [3065, 0, "n"], + [3066, 0, "s"], + [3067, 0, " "], + [3068, 0, "c"], + [3069, 0, "o"], + [3070, 0, "u"], + [3071, 0, "l"], + [3072, 0, "d"], + [3073, 0, " "], + [3074, 0, "b"], + [3075, 0, "e"], + [3076, 0, " "], + [3077, 0, "a"], + [3078, 0, "d"], + [3079, 0, "d"], + [3080, 0, "e"], + [3081, 0, "d"], + [3082, 0, " "], + [3083, 0, "e"], + [3084, 0, "a"], + [3085, 0, "s"], + [3086, 0, "i"], + [3087, 0, "l"], + [3088, 0, "y"], + [3089, 0, "."], + [5425, 1], + [5424, 1], + [5423, 1], + [5422, 1], + [5421, 1], + [5420, 1], + [5419, 1], + [5418, 1], + [5417, 1], + [5416, 1], + [5415, 1], + [5414, 1], + [5413, 1], + [5412, 1], + [5411, 1], + [5410, 1], + [5449, 1], + [5449, 0, "n"], + [5563, 0, "o"], + [5564, 0, "f"], + [5565, 0, " "], + [5566, 0, "t"], + [5567, 0, "h"], + [5568, 0, "e"], + [5569, 0, " "], + [5570, 0, "r"], + [5571, 0, "e"], + [5572, 0, "g"], + [5573, 0, "i"], + [5574, 0, "s"], + [5575, 0, "t"], + [5576, 0, "e"], + [5577, 0, "r"], + [5578, 0, " "], + [5579, 0, "o"], + [5580, 0, "r"], + [5581, 0, " "], + [5582, 0, "c"], + [5583, 0, "o"], + [5584, 0, "u"], + [5585, 0, "n"], + [5586, 0, "t"], + [5587, 0, "e"], + [5588, 0, "r"], + [5589, 0, " "], + [5634, 0, " "], + [5635, 0, "("], + [5636, 0, "\\"], + [5637, 0, "m"], + [5638, 0, "a"], + [5639, 0, "t"], + [5640, 0, "h"], + [5641, 0, "s"], + [5642, 0, "f"], + [5643, 0, "{"], + [5644, 0, "v"], + [5645, 0, "a"], + [5646, 0, "l"], + [5647, 0, "u"], + [5648, 0, "e"], + [5649, 0, "s"], + [5650, 0, "}"], + [5651, 0, " "], + [5652, 0, "i"], + [5653, 0, "s"], + [5654, 0, " "], + [5655, 0, "n"], + [5656, 0, "o"], + [5657, 0, "t"], + [5658, 0, " "], + [5659, 0, "d"], + [5660, 0, "e"], + [5661, 0, "f"], + [5662, 0, "i"], + [5663, 0, "n"], + [5664, 0, "e"], + [5665, 0, "d"], + [5666, 0, " "], + [5667, 0, "f"], + [5668, 0, "o"], + [5669, 0, "r"], + [5670, 0, " "], + [5671, 0, "m"], + [5672, 0, "a"], + [5673, 0, "p"], + [5674, 0, " "], + [5675, 0, "o"], + [5676, 0, "r"], + [5677, 0, " "], + [5678, 0, "l"], + [5679, 0, "i"], + [5680, 0, "s"], + [5681, 0, "t"], + [5682, 0, " "], + [5683, 0, "n"], + [5684, 0, "o"], + [5685, 0, "d"], + [5686, 0, "e"], + [5687, 0, "s"], + [5688, 0, "."], + [5689, 0, ")"], + [5637, 1], + [5637, 1], + [5637, 1], + [5637, 1], + [5637, 0, "t"], + [5638, 0, "e"], + [5639, 0, "x"], + [5640, 0, "t"], + [3067, 0, " "], + [3068, 0, "o"], + [3069, 0, "f"], + [3070, 0, " "], + [3071, 0, "t"], + [3072, 0, "h"], + [3073, 0, "e"], + [3074, 0, " "], + [3075, 0, "d"], + [3076, 0, "o"], + [3077, 0, "c"], + [3078, 0, "u"], + [3079, 0, "m"], + [3080, 0, "e"], + [3081, 0, "n"], + [3082, 0, "t"], + [3083, 0, " "], + [3084, 0, "s"], + [3085, 0, "t"], + [3086, 0, "r"], + [3087, 0, "u"], + [3088, 0, "c"], + [3089, 0, "t"], + [3090, 0, "u"], + [3091, 0, "r"], + [3092, 0, "e"], + [5927, 1], + [5926, 1], + [5925, 1], + [5924, 1], + [5923, 1], + [5922, 1], + [5921, 1], + [5920, 1], + [5919, 1], + [5918, 1], + [5918, 0, "a"], + [5919, 0, " "], + [5920, 0, "r"], + [5921, 0, "e"], + [5922, 0, "g"], + [5923, 0, "i"], + [5924, 0, "s"], + [5925, 0, "t"], + [5926, 0, "e"], + [5927, 0, "r"], + [6631, 0, " "], + [6632, 0, "I"], + [6633, 0, "f"], + [6634, 0, " "], + [6635, 0, "t"], + [6636, 0, "h"], + [6637, 0, "e"], + [6638, 0, " "], + [6639, 0, "k"], + [6640, 0, "e"], + [6641, 0, "y"], + [6642, 0, " "], + [6643, 0, "d"], + [6644, 0, "o"], + [6645, 0, "e"], + [6646, 0, "s"], + [6647, 0, " "], + [6648, 0, "n"], + [6649, 0, "o"], + [6650, 0, "t"], + [6651, 0, " "], + [6652, 0, "e"], + [6653, 0, "x"], + [6654, 0, "i"], + [6655, 0, "s"], + [6656, 0, "t"], + [6657, 0, ","], + [6658, 0, " "], + [6659, 0, "i"], + [6660, 0, "t"], + [6661, 0, " "], + [6662, 0, "i"], + [6663, 0, "s"], + [6664, 0, " "], + [6665, 0, "i"], + [6666, 0, "m"], + [6667, 0, "p"], + [6668, 0, "l"], + [6669, 0, "i"], + [6670, 0, "c"], + [6671, 0, "i"], + [6672, 0, "t"], + [6673, 0, "l"], + [6674, 0, "y"], + [6675, 0, " "], + [6676, 0, "c"], + [6677, 0, "r"], + [6678, 0, "e"], + [6679, 0, "a"], + [6680, 0, "t"], + [6681, 0, "e"], + [6682, 0, "d"], + [6683, 0, " "], + [6684, 0, "a"], + [6685, 0, "n"], + [6686, 0, "d"], + [6687, 0, " "], + [6688, 0, "s"], + [6689, 0, "e"], + [6690, 0, "t"], + [6691, 0, " "], + [6692, 0, "t"], + [6693, 0, "o"], + [6694, 0, " "], + [6695, 0, "t"], + [6696, 0, "h"], + [6697, 0, "e"], + [6698, 0, " "], + [6699, 0, "e"], + [6700, 0, "m"], + [6701, 0, "p"], + [6702, 0, "t"], + [6703, 0, "y"], + [6704, 0, " "], + [6705, 0, "l"], + [6706, 0, "i"], + [6707, 0, "s"], + [6708, 0, "t"], + [6709, 0, "."], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [6476, 1], + [7150, 0, "f"], + [7151, 0, "f"], + [7152, 0, "f"], + [7152, 1], + [7151, 1], + [7150, 1], + [7149, 1], + [7149, 0, "n"], + [7174, 0, ","], + [7175, 0, " "], + [7176, 0, "s"], + [7177, 0, "o"], + [7178, 0, " "], + [7179, 0, "t"], + [7180, 0, "h"], + [7181, 0, "e"], + [7182, 0, "r"], + [7183, 0, "e"], + [7184, 0, " "], + [7185, 0, "i"], + [7186, 0, "s"], + [7187, 0, " "], + [7188, 0, "n"], + [7189, 0, "o"], + [7190, 0, " "], + [7191, 0, "n"], + [7192, 0, "e"], + [7193, 0, "e"], + [7194, 0, "d"], + [7195, 0, " "], + [7196, 0, "f"], + [7197, 0, "o"], + [7198, 0, "r"], + [7199, 0, " "], + [7200, 0, "a"], + [7201, 0, " "], + [7202, 0, "c"], + [7203, 0, "o"], + [7204, 0, "m"], + [7205, 0, "m"], + [7206, 0, "a"], + [7207, 0, "n"], + [7208, 0, "d"], + [7209, 0, " "], + [7210, 0, "t"], + [7211, 0, "o"], + [7212, 0, " "], + [7213, 0, "i"], + [7214, 0, "n"], + [7215, 0, "s"], + [7216, 0, "e"], + [7217, 0, "r"], + [7218, 0, "t"], + [7219, 0, " "], + [7220, 0, "a"], + [7221, 0, " "], + [7222, 0, "n"], + [7223, 0, "e"], + [7224, 0, "w"], + [7225, 0, " "], + [7226, 0, "k"], + [7227, 0, "e"], + [7228, 0, "y"], + [7229, 0, " "], + [7230, 0, "i"], + [7231, 0, "n"], + [7232, 0, "t"], + [7233, 0, "o"], + [7234, 0, " "], + [7235, 0, "a"], + [7236, 0, " "], + [7237, 0, "m"], + [7238, 0, "a"], + [7239, 0, "p"], + [13150, 0, " "], + [13151, 0, "c"], + [13152, 0, "o"], + [13153, 0, "n"], + [13154, 0, "t"], + [13155, 0, "a"], + [13156, 0, "i"], + [13157, 0, "n"], + [13158, 0, "s"], + [13159, 0, " "], + [13160, 0, "t"], + [13161, 0, "h"], + [13162, 0, "e"], + [13163, 0, " "], + [13164, 0, "l"], + [13165, 0, "o"], + [13166, 0, "c"], + [13167, 0, "a"], + [13168, 0, "l"], + [13169, 0, " "], + [13170, 0, "v"], + [13171, 0, "a"], + [13172, 0, "r"], + [13173, 0, "i"], + [13174, 0, "a"], + [13175, 0, "b"], + [13176, 0, "l"], + [13177, 0, "e"], + [13178, 0, "s"], + [13179, 0, " "], + [13180, 0, "d"], + [13181, 0, "e"], + [13182, 0, "f"], + [13183, 0, "i"], + [13184, 0, "n"], + [13185, 0, "e"], + [13186, 0, "d"], + [13187, 0, " "], + [13188, 0, "w"], + [13189, 0, "i"], + [13190, 0, "t"], + [13191, 0, "h"], + [13192, 0, " "], + [13193, 0, "\\"], + [13194, 0, "t"], + [13195, 0, "e"], + [13196, 0, "x"], + [13197, 0, "t"], + [13198, 0, "s"], + [13199, 0, "f"], + [13200, 0, "{"], + [13201, 0, "l"], + [13202, 0, "e"], + [13203, 0, "t"], + [13204, 0, "}"], + [13205, 0, " "], + [13206, 0, "c"], + [13207, 0, "o"], + [13208, 0, "m"], + [13209, 0, "m"], + [13210, 0, "a"], + [13211, 0, "n"], + [13212, 0, "d"], + [13213, 0, "s"], + [13162, 1], + [13161, 1], + [13160, 1], + [13159, 1], + [13158, 1], + [13157, 1], + [13156, 1], + [13155, 1], + [13154, 1], + [13153, 1], + [13152, 1], + [13151, 1], + [13150, 1], + [13149, 1], + [13148, 1], + [13147, 1], + [13146, 1], + [13145, 1], + [13144, 1], + [13143, 1], + [13142, 1], + [13141, 1], + [13140, 1], + [13139, 1], + [13138, 1], + [13137, 1], + [13136, 1], + [13135, 1], + [13134, 1], + [13133, 1], + [13132, 1], + [13131, 1], + [13130, 1], + [13129, 1], + [13128, 1], + [13127, 1], + [13126, 1], + [13125, 1], + [13124, 1], + [13123, 1], + [13122, 1], + [13121, 1], + [13120, 1], + [13119, 1], + [13118, 1], + [13117, 1], + [13116, 1], + [13115, 1], + [13114, 1], + [13113, 1], + [13112, 1], + [13111, 1], + [13110, 1], + [13110, 0, "F"], + [13111, 0, "o"], + [13112, 0, "r"], + [13113, 0, " "], + [13114, 0, "e"], + [13115, 0, "a"], + [13116, 0, "c"], + [13117, 0, "h"], + [13133, 1], + [13146, 0, " "], + [13147, 0, "a"], + [13169, 1], + [13169, 0, ","], + [13170, 0, " "], + [13171, 0, "$"], + [13172, 0, "A"], + [13173, 0, "-"], + [13174, 0, "p"], + [13174, 1], + [13173, 1], + [13173, 0, "_"], + [13174, 0, "p"], + [13175, 0, "$"], + [13176, 0, " "], + [13177, 0, "m"], + [13178, 0, "a"], + [13179, 0, "p"], + [13180, 0, "s"], + [13181, 0, " "], + [13182, 0, "t"], + [13183, 0, "h"], + [13184, 0, "e"], + [13185, 0, " "], + [13186, 0, "v"], + [13187, 0, "a"], + [13188, 0, "r"], + [13189, 0, "i"], + [13190, 0, "a"], + [13191, 0, "b"], + [13192, 0, "l"], + [13193, 0, "e"], + [13194, 0, " "], + [13195, 0, "n"], + [13196, 0, "a"], + [13197, 0, "m"], + [13198, 0, "e"], + [13199, 0, " "], + [13200, 0, "t"], + [13201, 0, "o"], + [13202, 0, " "], + [13203, 0, "a"], + [13204, 0, " "], + [13205, 0, "\\"], + [13206, 0, "e"], + [13207, 0, "m"], + [13208, 0, "p"], + [13209, 0, "h"], + [13210, 0, "{"], + [13211, 0, "c"], + [13212, 0, "u"], + [13213, 0, "r"], + [13214, 0, "s"], + [13215, 0, "o"], + [13216, 0, "r"], + [13217, 0, "}"], + [13218, 0, ","], + [13219, 0, " "], + [13220, 0, "w"], + [13221, 0, "h"], + [13222, 0, "i"], + [13223, 0, "c"], + [13224, 0, "h"], + [13225, 0, " "], + [13226, 0, "i"], + [13227, 0, "d"], + [13228, 0, "e"], + [13229, 0, "n"], + [13230, 0, "t"], + [13231, 0, "i"], + [13232, 0, "f"], + [13233, 0, "i"], + [13234, 0, "e"], + [13235, 0, "s"], + [13236, 0, " "], + [13237, 0, "a"], + [13238, 0, " "], + [13239, 0, "p"], + [13240, 0, "o"], + [13241, 0, "s"], + [13242, 0, "i"], + [13243, 0, "t"], + [13244, 0, "i"], + [13245, 0, "o"], + [13246, 0, "n"], + [13247, 0, " "], + [13248, 0, "i"], + [13249, 0, "n"], + [13250, 0, " "], + [13251, 0, "t"], + [13252, 0, "h"], + [13253, 0, "e"], + [13254, 0, " "], + [13255, 0, "d"], + [13256, 0, "o"], + [13257, 0, "c"], + [13258, 0, "u"], + [13259, 0, "m"], + [13260, 0, "e"], + [13261, 0, "n"], + [13262, 0, "t"], + [13263, 0, " "], + [13264, 0, "a"], + [13265, 0, "s"], + [13266, 0, " "], + [13267, 0, "d"], + [13268, 0, "e"], + [13269, 0, "s"], + [13270, 0, "c"], + [13271, 0, "r"], + [13272, 0, "i"], + [13273, 0, "b"], + [13274, 0, "e"], + [13275, 0, "d"], + [13276, 0, " "], + [13277, 0, "b"], + [13278, 0, "e"], + [13279, 0, "l"], + [13280, 0, "o"], + [13281, 0, "w"], + [13282, 0, "."], + [13283, 0, " "], + [13284, 0, "I"], + [13285, 0, "n"], + [13286, 0, " "], + [13287, 0, "a"], + [13288, 0, "d"], + [13289, 0, "d"], + [13290, 0, "i"], + [13291, 0, "t"], + [13292, 0, "i"], + [13293, 0, "o"], + [13294, 0, "n"], + [13295, 0, ","], + [13296, 0, " "], + [13297, 0, "$"], + [13298, 0, "A"], + [13299, 0, "_"], + [13300, 0, "p"], + [13301, 0, "$"], + [13302, 0, " "], + [13303, 0, "m"], + [13304, 0, "a"], + [13305, 0, "p"], + [13306, 0, "s"], + [13307, 0, " "], + [13308, 0, "t"], + [13309, 0, "h"], + [13310, 0, "e"], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13312, 1], + [13342, 0, " "], + [13343, 0, "t"], + [13344, 0, "o"], + [13345, 0, " "], + [13346, 0, "a"], + [13347, 0, " "], + [13348, 0, "n"], + [13349, 0, "e"], + [13350, 0, "s"], + [13351, 0, "t"], + [13352, 0, "e"], + [13353, 0, "d"], + [13354, 0, " "], + [13355, 0, "p"], + [13356, 0, "a"], + [13357, 0, "r"], + [13358, 0, "t"], + [13359, 0, "i"], + [13360, 0, "a"], + [13361, 0, "l"], + [13362, 0, " "], + [13363, 0, "f"], + [13364, 0, "u"], + [13365, 0, "n"], + [13366, 0, "c"], + [13367, 0, "t"], + [13368, 0, "i"], + [13369, 0, "o"], + [13370, 0, "n"], + [13371, 0, " "], + [13372, 0, "r"], + [13373, 0, "e"], + [13374, 0, "p"], + [13375, 0, "r"], + [13376, 0, "e"], + [13377, 0, "s"], + [13378, 0, "e"], + [13379, 0, "n"], + [13380, 0, "t"], + [13381, 0, "i"], + [13382, 0, "n"], + [13383, 0, "g"], + [13384, 0, " "], + [13385, 0, "t"], + [13386, 0, "h"], + [13387, 0, "e"], + [13388, 0, " "], + [13389, 0, "c"], + [13390, 0, "o"], + [13391, 0, "n"], + [13392, 0, "t"], + [13393, 0, "e"], + [13394, 0, "n"], + [13395, 0, "t"], + [13396, 0, "s"], + [13397, 0, " "], + [13398, 0, "o"], + [13399, 0, "f"], + [13400, 0, " "], + [13401, 0, "t"], + [13402, 0, "h"], + [13403, 0, "e"], + [13404, 0, " "], + [13405, 0, "d"], + [13406, 0, "o"], + [13407, 0, "c"], + [13408, 0, "u"], + [13409, 0, "m"], + [13410, 0, "e"], + [13411, 0, "n"], + [13412, 0, "t"], + [13413, 0, "."], + [13414, 0, " "], + [13415, 0, "\\"], + [13416, 0, "t"], + [13417, 0, "e"], + [13418, 0, "x"], + [13419, 0, "t"], + [13420, 0, "s"], + [13421, 0, "f"], + [13422, 0, "{"], + [13423, 0, "m"], + [13424, 0, "a"], + [13425, 0, "p"], + [13426, 0, "T"], + [13427, 0, "}"], + [13428, 1], + [13428, 1], + [13428, 1], + [13428, 1], + [13428, 1], + [13428, 1], + [13428, 1], + [13585, 1], + [13584, 1], + [13583, 1], + [13582, 1], + [13581, 1], + [13580, 1], + [13579, 1], + [13578, 1], + [13577, 1], + [13576, 1], + [13575, 1], + [13574, 1], + [13573, 1], + [13572, 1], + [13571, 1], + [13570, 1], + [13569, 1], + [13568, 1], + [13567, 1], + [13566, 1], + [13565, 1], + [13564, 1], + [13563, 1], + [13562, 1], + [13561, 1], + [13560, 1], + [13559, 1], + [13558, 1], + [13557, 1], + [13556, 1], + [13555, 1], + [13554, 1], + [13553, 1], + [13552, 1], + [13551, 1], + [13550, 1], + [13549, 1], + [13548, 1], + [13547, 1], + [13546, 1], + [13545, 1], + [13544, 1], + [13543, 1], + [13542, 1], + [13541, 1], + [13540, 1], + [13539, 1], + [13538, 1], + [13537, 1], + [13536, 1], + [13535, 1], + [13534, 1], + [13533, 1], + [13532, 1], + [13531, 1], + [13530, 1], + [13529, 1], + [13528, 1], + [13527, 1], + [13526, 1], + [13525, 1], + [13524, 1], + [13523, 1], + [13522, 1], + [13521, 1], + [13520, 1], + [13519, 1], + [13518, 1], + [13517, 1], + [13516, 1], + [13515, 1], + [13514, 1], + [13513, 1], + [13512, 1], + [13511, 1], + [13510, 1], + [13509, 1], + [13508, 1], + [13507, 1], + [13506, 1], + [13505, 1], + [13504, 1], + [13503, 1], + [13502, 1], + [13501, 1], + [13500, 1], + [13499, 1], + [13498, 1], + [13497, 1], + [13496, 1], + [13495, 1], + [13494, 1], + [13493, 1], + [13492, 1], + [13491, 1], + [13490, 1], + [13489, 1], + [13488, 1], + [13487, 1], + [13486, 1], + [13485, 1], + [13484, 1], + [13484, 0, "T"], + [13492, 0, " "], + [13493, 0, "m"], + [13494, 0, "a"], + [13495, 0, "p"], + [14734, 1], + [14734, 1], + [14734, 0, "\\"], + [14735, 0, "["], + [14736, 0, " "], + [14852, 1], + [14851, 1], + [14851, 0, " "], + [14852, 0, "\\"], + [14853, 0, "]"], + [14019, 1], + [14018, 1], + [14017, 1], + [14016, 1], + [14015, 1], + [14014, 1], + [14013, 1], + [14013, 0, "f"], + [14014, 0, "o"], + [14015, 0, "r"], + [14016, 0, "m"], + [14017, 0, "a"], + [14018, 0, "l"], + [14019, 0, "i"], + [14020, 0, "z"], + [14021, 0, "e"], + [14022, 0, "s"], + [14023, 0, " "], + [14024, 0, "t"], + [14025, 0, "h"], + [14026, 0, "e"], + [14027, 0, " "], + [14028, 0, "a"], + [14029, 0, "s"], + [14030, 0, "s"], + [14031, 0, "u"], + [14032, 0, "m"], + [14033, 0, "p"], + [14034, 0, "t"], + [14035, 0, "i"], + [14036, 0, "o"], + [14037, 0, "n"], + [15652, 1], + [15651, 1], + [15650, 1], + [15649, 1], + [15648, 1], + [15647, 1], + [15646, 1], + [15645, 1], + [15644, 1], + [15643, 1], + [15642, 1], + [15641, 1], + [15640, 1], + [15639, 1], + [15638, 1], + [15637, 1], + [15636, 1], + [15635, 1], + [15634, 1], + [15633, 1], + [15632, 1], + [15631, 1], + [15630, 1], + [15629, 1], + [15628, 1], + [15627, 1], + [15626, 1], + [15625, 1], + [15625, 0, "a"], + [15626, 0, "r"], + [15627, 0, "e"], + [15628, 0, " "], + [15629, 0, "t"], + [15630, 0, "a"], + [15631, 0, "g"], + [15632, 0, "g"], + [15633, 0, "e"], + [15634, 0, "d"], + [15635, 0, " "], + [15636, 0, "w"], + [15637, 0, "i"], + [15638, 0, "t"], + [15639, 0, "h"], + [15640, 0, " "], + [15641, 0, "t"], + [15642, 0, "h"], + [15643, 0, "e"], + [15644, 0, " "], + [15645, 0, "d"], + [15646, 0, "a"], + [15647, 0, "t"], + [15648, 0, "a"], + [15649, 0, "t"], + [15650, 0, "y"], + [15651, 0, "p"], + [15652, 0, "e"], + [15653, 0, " "], + [15654, 0, "o"], + [15655, 0, "f"], + [15656, 0, " "], + [15657, 0, "t"], + [15658, 0, "h"], + [15659, 0, "e"], + [15660, 0, " "], + [15661, 0, "b"], + [15662, 0, "r"], + [15663, 0, "a"], + [15664, 0, "n"], + [15665, 0, "c"], + [15666, 0, "h"], + [15667, 0, " "], + [15668, 0, "n"], + [15669, 0, "o"], + [15670, 0, "d"], + [15671, 0, "e"], + [15672, 0, ","], + [15673, 0, " "], + [15674, 0, "e"], + [15675, 0, "i"], + [15676, 0, "t"], + [15677, 0, "h"], + [15678, 0, "e"], + [15679, 0, "r"], + [16958, 1], + [16957, 1], + [16956, 1], + [16955, 1], + [16954, 1], + [16953, 1], + [16952, 1], + [16951, 1], + [16950, 1], + [16949, 1], + [16948, 1], + [16947, 1], + [16946, 1], + [16945, 1], + [16944, 1], + [16944, 0, "a"], + [16945, 0, " "], + [16946, 0, "r"], + [16947, 0, "e"], + [16948, 0, "g"], + [16949, 0, "i"], + [16950, 0, "s"], + [16951, 0, "t"], + [16952, 0, "e"], + [16953, 0, "r"], + [16954, 0, " "], + [16955, 0, "a"], + [16956, 0, "t"], + [17116, 1], + [17115, 1], + [17114, 1], + [17113, 1], + [17113, 0, "r"], + [17114, 0, " "], + [17115, 0, "i"], + [17116, 0, "s"], + [17105, 1], + [17104, 1], + [17103, 1], + [17102, 1], + [17101, 1], + [17100, 1], + [17099, 1], + [17098, 1], + [17097, 1], + [17096, 1], + [17095, 1], + [17094, 1], + [17093, 1], + [17092, 1], + [17091, 1], + [17090, 1], + [17089, 1], + [17088, 1], + [17087, 1], + [17086, 1], + [17085, 1], + [17084, 1], + [17083, 1], + [17082, 1], + [17081, 1], + [17080, 1], + [17079, 1], + [17078, 1], + [17077, 1], + [17076, 1], + [17075, 1], + [17074, 1], + [17073, 1], + [17072, 1], + [17071, 1], + [17070, 1], + [17069, 1], + [17068, 1], + [17067, 1], + [17066, 1], + [17065, 1], + [17064, 1], + [17063, 1], + [17062, 1], + [17061, 1], + [17060, 1], + [17059, 1], + [17058, 1], + [17057, 1], + [17057, 0, "A"], + [17058, 0, " "], + [17139, 0, ","], + [17140, 0, " "], + [17141, 0, "a"], + [17142, 0, "n"], + [17143, 0, "d"], + [17144, 0, " "], + [17145, 0, "t"], + [17146, 0, "h"], + [17147, 0, "e"], + [17148, 0, " "], + [17149, 0, "\\"], + [17150, 0, "t"], + [17151, 0, "e"], + [17152, 0, "x"], + [17153, 0, "t"], + [17154, 0, "s"], + [17155, 0, "c"], + [17156, 0, "{"], + [17157, 0, "V"], + [17158, 0, "a"], + [17159, 0, "l"], + [17160, 0, "}"], + [17161, 0, " "], + [17162, 0, "r"], + [17163, 0, "u"], + [17164, 0, "l"], + [17165, 0, "e"], + [17166, 0, "s"], + [17167, 0, " "], + [17168, 0, "o"], + [17169, 0, "n"], + [17170, 0, "l"], + [17171, 0, "y"], + [17172, 0, " "], + [17173, 0, "a"], + [17174, 0, "p"], + [17175, 0, "p"], + [17176, 0, "l"], + [17177, 0, "y"], + [17178, 0, " "], + [17179, 0, "i"], + [17180, 0, "f"], + [17181, 0, " "], + [17182, 0, "t"], + [17183, 0, "h"], + [17184, 0, "e"], + [17185, 0, " "], + [17186, 0, "r"], + [17187, 0, "e"], + [17188, 0, "g"], + [17189, 0, "i"], + [17190, 0, "s"], + [17191, 0, "t"], + [17192, 0, "e"], + [17193, 0, "r"], + [17194, 0, " "], + [17195, 0, "e"], + [17196, 0, "x"], + [17197, 0, "i"], + [17198, 0, "s"], + [17199, 0, "t"], + [17200, 0, "s"], + [17201, 0, " "], + [17202, 0, "i"], + [17203, 0, "n"], + [17204, 0, " "], + [17205, 0, "$"], + [17206, 0, "A"], + [17207, 0, "_"], + [17208, 0, "p"], + [17209, 0, "$"], + [17194, 0, " "], + [17195, 0, "i"], + [17196, 0, "d"], + [17197, 0, "e"], + [17198, 0, "n"], + [17199, 0, "t"], + [17200, 0, "i"], + [17201, 0, "f"], + [17202, 0, "i"], + [17203, 0, "e"], + [17204, 0, "d"], + [17205, 0, " "], + [17206, 0, "b"], + [17207, 0, "y"], + [17208, 0, " "], + [17209, 0, "t"], + [17210, 0, "h"], + [17211, 0, "e"], + [17212, 0, " "], + [17213, 0, "c"], + [17214, 0, "u"], + [17215, 0, "r"], + [17216, 0, "s"], + [17217, 0, "o"], + [17218, 0, "r"], + [17401, 1], + [17401, 0, " "], + [17402, 0, "-"], + [17403, 0, "-"], + [20686, 1], + [20685, 1], + [20684, 1], + [20683, 1], + [20682, 1], + [20681, 1], + [20680, 1], + [20679, 1], + [20678, 1], + [20677, 1], + [20676, 1], + [20675, 1], + [20674, 1], + [20673, 1], + [20672, 1], + [20671, 1], + [20670, 1], + [20669, 1], + [20668, 1], + [20667, 1], + [20666, 1], + [20665, 1], + [20664, 1], + [20663, 1], + [20662, 1], + [20661, 1], + [20660, 1], + [20659, 1], + [20658, 1], + [20657, 1], + [20656, 1], + [20655, 1], + [20654, 1], + [20653, 1], + [20652, 1], + [20651, 1], + [20650, 1], + [20649, 1], + [20648, 1], + [20647, 1], + [20646, 1], + [20645, 1], + [20644, 1], + [20643, 1], + [20642, 1], + [20641, 1], + [20640, 1], + [20639, 1], + [20638, 1], + [20637, 1], + [20636, 1], + [20635, 1], + [20634, 1], + [20633, 1], + [20632, 1], + [20631, 1], + [20630, 1], + [20629, 1], + [20628, 1], + [20627, 1], + [20626, 1], + [20625, 1], + [20624, 1], + [20623, 1], + [20622, 1], + [20621, 1], + [20620, 1], + [20619, 1], + [20618, 1], + [20617, 1], + [20616, 1], + [20615, 1], + [20614, 1], + [20613, 1], + [20612, 1], + [20611, 1], + [20610, 1], + [20609, 1], + [20608, 1], + [20607, 1], + [20606, 1], + [20605, 1], + [20604, 1], + [20603, 1], + [20602, 1], + [20601, 1], + [20600, 1], + [20599, 1], + [20598, 1], + [20597, 1], + [20596, 1], + [20595, 1], + [20594, 1], + [20593, 1], + [20592, 1], + [20591, 1], + [20590, 1], + [20589, 1], + [20588, 1], + [20587, 1], + [20586, 1], + [20585, 1], + [20584, 1], + [20583, 1], + [20582, 1], + [20581, 1], + [20580, 1], + [20579, 1], + [20578, 1], + [20577, 1], + [20576, 1], + [20575, 1], + [20574, 1], + [20573, 1], + [20572, 1], + [20571, 1], + [20570, 1], + [20569, 1], + [20568, 1], + [20567, 1], + [20566, 1], + [20565, 1], + [20564, 1], + [20563, 1], + [20562, 1], + [20561, 1], + [20560, 1], + [20559, 1], + [20558, 1], + [20557, 1], + [20556, 1], + [20555, 1], + [20554, 1], + [20553, 1], + [20552, 1], + [20551, 1], + [20550, 1], + [20549, 1], + [20548, 1], + [20547, 1], + [20546, 1], + [20545, 1], + [20544, 1], + [20543, 1], + [20542, 1], + [20541, 1], + [20540, 1], + [20539, 1], + [20538, 1], + [20537, 1], + [20536, 1], + [20535, 1], + [20534, 1], + [20533, 1], + [20532, 1], + [20531, 1], + [20530, 1], + [20529, 1], + [20528, 1], + [20527, 1], + [20526, 1], + [20525, 1], + [20524, 1], + [20523, 1], + [20522, 1], + [20521, 1], + [20520, 1], + [20519, 1], + [20518, 1], + [20517, 1], + [20516, 1], + [20515, 1], + [20514, 1], + [20513, 1], + [20512, 1], + [20511, 1], + [20510, 1], + [20509, 1], + [20508, 1], + [20507, 1], + [20506, 1], + [20505, 1], + [20504, 1], + [20503, 1], + [20502, 1], + [20501, 1], + [20500, 1], + [20499, 1], + [20498, 1], + [20497, 1], + [20496, 1], + [20495, 1], + [20494, 1], + [20493, 1], + [20492, 1], + [20491, 1], + [20490, 1], + [20489, 1], + [20488, 1], + [20487, 1], + [20486, 1], + [20485, 1], + [20484, 1], + [20483, 1], + [20482, 1], + [20481, 1], + [20480, 1], + [20479, 1], + [20478, 1], + [20477, 1], + [20476, 1], + [20475, 1], + [20474, 1], + [20473, 1], + [20472, 1], + [20471, 1], + [20470, 1], + [20469, 1], + [20468, 1], + [20467, 1], + [20466, 1], + [20465, 1], + [20464, 1], + [20463, 1], + [20462, 1], + [20461, 1], + [20460, 1], + [20459, 1], + [20458, 1], + [20457, 1], + [20456, 1], + [20455, 1], + [20454, 1], + [20453, 1], + [20452, 1], + [20451, 1], + [20450, 1], + [20449, 1], + [20448, 1], + [20447, 1], + [20446, 1], + [20445, 1], + [20444, 1], + [20443, 1], + [20442, 1], + [20441, 1], + [20440, 1], + [20439, 1], + [20438, 1], + [20437, 1], + [20436, 1], + [20435, 1], + [20434, 1], + [20433, 1], + [20432, 1], + [20431, 1], + [20430, 1], + [20429, 1], + [20428, 1], + [20427, 1], + [20426, 1], + [20425, 1], + [20424, 1], + [20423, 1], + [20422, 1], + [20421, 1], + [20420, 1], + [20419, 1], + [20418, 1], + [20417, 1], + [20416, 1], + [20415, 1], + [20414, 1], + [20413, 1], + [20412, 1], + [20411, 1], + [20410, 1], + [20409, 1], + [20408, 1], + [20407, 1], + [20406, 1], + [20405, 1], + [20404, 1], + [20403, 1], + [20402, 1], + [20401, 1], + [20400, 1], + [20399, 1], + [20398, 1], + [20397, 1], + [20396, 1], + [20395, 1], + [20394, 1], + [20393, 1], + [20392, 1], + [20391, 1], + [20390, 1], + [20389, 1], + [20388, 1], + [20387, 1], + [20386, 1], + [20385, 1], + [20384, 1], + [20383, 1], + [20382, 1], + [20381, 1], + [20380, 1], + [20379, 1], + [20378, 1], + [20377, 1], + [20376, 1], + [20375, 1], + [20374, 1], + [20373, 1], + [20372, 1], + [20371, 1], + [20370, 1], + [20369, 1], + [20368, 1], + [20367, 1], + [20366, 1], + [20365, 1], + [20364, 1], + [20363, 1], + [20362, 1], + [20361, 1], + [20360, 1], + [20359, 1], + [20358, 1], + [20357, 1], + [20356, 1], + [20355, 1], + [20354, 1], + [20353, 1], + [20352, 1], + [20351, 1], + [20350, 1], + [20349, 1], + [20348, 1], + [20347, 1], + [20346, 1], + [20345, 1], + [20344, 1], + [20343, 1], + [20342, 1], + [20341, 1], + [20340, 1], + [20339, 1], + [20338, 1], + [20337, 1], + [20336, 1], + [20335, 1], + [20334, 1], + [20333, 1], + [20332, 1], + [20331, 1], + [20330, 1], + [20329, 1], + [20328, 1], + [20327, 1], + [20326, 1], + [20325, 1], + [20324, 1], + [20323, 1], + [20322, 1], + [20321, 1], + [20320, 1], + [20319, 1], + [20318, 1], + [20317, 1], + [20316, 1], + [20315, 1], + [20314, 1], + [20313, 1], + [20312, 1], + [20311, 1], + [20310, 1], + [20309, 1], + [20308, 1], + [20307, 1], + [20306, 1], + [20305, 1], + [20304, 1], + [20303, 1], + [20302, 1], + [20301, 1], + [20300, 1], + [20299, 1], + [20298, 1], + [20297, 1], + [20296, 1], + [20295, 1], + [20294, 1], + [20293, 1], + [20292, 1], + [20291, 1], + [20290, 1], + [20289, 1], + [20288, 1], + [20287, 1], + [20286, 1], + [20285, 1], + [20284, 1], + [20283, 1], + [20282, 1], + [20281, 1], + [20280, 1], + [20279, 1], + [20278, 1], + [20277, 1], + [20276, 1], + [20275, 1], + [20274, 1], + [20273, 1], + [20272, 1], + [20271, 1], + [20270, 1], + [20269, 1], + [20268, 1], + [20267, 1], + [20266, 1], + [20265, 1], + [20264, 1], + [20263, 1], + [20262, 1], + [20261, 1], + [20260, 1], + [20259, 1], + [20258, 1], + [20257, 1], + [20256, 1], + [20255, 1], + [20254, 1], + [20253, 1], + [20252, 1], + [20251, 1], + [20250, 1], + [20249, 1], + [20248, 1], + [20247, 1], + [20246, 1], + [20245, 1], + [20244, 1], + [20243, 1], + [20242, 1], + [20241, 1], + [20240, 1], + [20239, 1], + [20238, 1], + [20237, 1], + [20236, 1], + [20235, 1], + [20234, 1], + [20233, 1], + [20232, 1], + [20231, 1], + [20230, 1], + [20229, 1], + [20228, 1], + [20227, 1], + [20226, 1], + [20225, 1], + [20224, 1], + [20223, 1], + [20222, 1], + [20221, 1], + [20220, 1], + [20219, 1], + [20218, 1], + [20217, 1], + [20216, 1], + [20215, 1], + [20214, 1], + [20213, 1], + [20212, 1], + [20211, 1], + [20210, 1], + [20209, 1], + [20208, 1], + [20207, 1], + [20206, 1], + [20205, 1], + [20204, 1], + [20203, 1], + [20202, 1], + [20201, 1], + [20200, 1], + [20199, 1], + [20198, 1], + [20197, 1], + [20196, 1], + [20195, 1], + [20194, 1], + [20193, 1], + [20192, 1], + [20191, 1], + [20190, 1], + [20189, 1], + [20188, 1], + [20187, 1], + [20186, 1], + [20185, 1], + [20184, 1], + [20183, 1], + [20182, 1], + [20181, 1], + [20180, 1], + [20179, 1], + [20178, 1], + [20177, 1], + [20176, 1], + [20175, 1], + [20174, 1], + [20173, 1], + [20172, 1], + [20171, 1], + [20170, 1], + [20169, 1], + [20168, 1], + [20167, 1], + [20166, 1], + [20165, 1], + [20164, 1], + [20163, 1], + [20162, 1], + [20161, 1], + [20160, 1], + [20159, 1], + [20158, 1], + [20157, 1], + [20156, 1], + [20155, 1], + [20154, 1], + [20153, 1], + [20152, 1], + [20151, 1], + [20150, 1], + [20149, 1], + [20148, 1], + [20147, 1], + [20146, 1], + [20145, 1], + [20144, 1], + [20143, 1], + [20142, 1], + [20141, 1], + [20140, 1], + [20139, 1], + [20138, 1], + [20137, 1], + [20136, 1], + [20135, 1], + [20134, 1], + [20133, 1], + [20132, 1], + [20131, 1], + [20130, 1], + [20129, 1], + [20128, 1], + [20127, 1], + [20126, 1], + [20125, 1], + [20124, 1], + [20123, 1], + [20122, 1], + [20121, 1], + [20120, 1], + [20119, 1], + [20118, 1], + [20117, 1], + [20116, 1], + [20115, 1], + [20114, 1], + [20113, 1], + [20112, 1], + [20111, 1], + [20110, 1], + [20109, 1], + [20108, 1], + [20107, 1], + [20106, 1], + [20105, 1], + [20104, 1], + [20103, 1], + [20102, 1], + [20101, 1], + [20100, 1], + [20099, 1], + [20098, 1], + [20097, 1], + [20096, 1], + [20095, 1], + [20094, 1], + [20093, 1], + [20092, 1], + [20091, 1], + [20090, 1], + [20089, 1], + [20088, 1], + [20087, 1], + [20086, 1], + [20085, 1], + [20084, 1], + [20083, 1], + [20082, 1], + [20081, 1], + [20080, 1], + [20079, 1], + [20078, 1], + [20077, 1], + [20076, 1], + [20075, 1], + [20074, 1], + [20073, 1], + [20072, 1], + [20071, 1], + [20070, 1], + [20069, 1], + [20068, 1], + [20067, 1], + [20066, 1], + [20065, 1], + [20064, 1], + [20063, 1], + [20062, 1], + [20061, 1], + [20060, 1], + [20059, 1], + [20058, 1], + [20057, 1], + [20056, 1], + [20055, 1], + [20054, 1], + [20053, 1], + [20052, 1], + [20051, 1], + [20050, 1], + [20049, 1], + [20048, 1], + [20047, 1], + [20046, 1], + [20045, 1], + [20044, 1], + [20043, 1], + [20042, 1], + [20041, 1], + [20040, 1], + [20039, 1], + [20038, 1], + [20037, 1], + [20036, 1], + [20035, 1], + [20034, 1], + [20033, 1], + [20032, 1], + [20031, 1], + [20030, 1], + [20029, 1], + [20028, 1], + [20027, 1], + [20026, 1], + [20025, 1], + [20024, 1], + [20023, 1], + [20022, 1], + [20021, 1], + [20020, 1], + [20019, 1], + [20018, 1], + [20017, 1], + [20016, 1], + [20015, 1], + [20014, 1], + [20013, 1], + [20012, 1], + [20011, 1], + [20010, 1], + [20009, 1], + [20008, 1], + [20007, 1], + [20006, 1], + [20005, 1], + [20004, 1], + [20003, 1], + [20002, 1], + [20001, 1], + [20000, 1], + [19999, 1], + [19998, 1], + [19997, 1], + [19996, 1], + [19995, 1], + [19994, 1], + [19993, 1], + [19992, 1], + [19991, 1], + [19990, 1], + [19989, 1], + [19988, 1], + [19987, 1], + [19986, 1], + [19985, 1], + [19984, 1], + [19983, 1], + [19982, 1], + [19981, 1], + [19980, 1], + [19979, 1], + [19978, 1], + [19977, 1], + [19976, 1], + [19975, 1], + [19974, 1], + [19973, 1], + [19972, 1], + [19971, 1], + [19970, 1], + [19969, 1], + [19968, 1], + [19967, 1], + [19966, 1], + [19965, 1], + [19964, 1], + [19963, 1], + [19962, 1], + [19961, 1], + [19960, 1], + [19959, 1], + [19958, 1], + [19957, 1], + [19956, 1], + [19955, 1], + [19954, 1], + [19953, 1], + [19952, 1], + [19951, 1], + [19950, 1], + [19949, 1], + [19948, 1], + [19947, 1], + [19946, 1], + [19945, 1], + [19944, 1], + [19943, 1], + [19942, 1], + [19941, 1], + [19940, 1], + [19939, 1], + [19938, 1], + [19937, 1], + [19936, 1], + [19935, 1], + [19934, 1], + [19933, 1], + [19932, 1], + [19931, 1], + [19930, 1], + [19929, 1], + [19928, 1], + [19927, 1], + [19926, 1], + [19925, 1], + [19924, 1], + [19923, 1], + [19922, 1], + [19921, 1], + [19920, 1], + [19919, 1], + [19918, 1], + [19917, 1], + [19916, 1], + [19915, 1], + [19914, 1], + [19913, 1], + [19912, 1], + [19911, 1], + [19910, 1], + [19909, 1], + [19908, 1], + [19907, 1], + [19906, 1], + [19905, 1], + [19904, 1], + [19903, 1], + [19902, 1], + [19901, 1], + [19900, 1], + [19899, 1], + [19898, 1], + [19897, 1], + [19896, 1], + [19895, 1], + [19894, 1], + [19893, 1], + [19892, 1], + [19891, 1], + [19890, 1], + [19889, 1], + [19888, 1], + [19887, 1], + [19886, 1], + [19885, 1], + [19884, 1], + [19883, 1], + [19882, 1], + [19881, 1], + [19880, 1], + [19879, 1], + [19878, 1], + [19877, 1], + [19876, 1], + [19875, 1], + [19874, 1], + [19873, 1], + [19872, 1], + [19871, 1], + [19870, 1], + [19869, 1], + [19868, 1], + [19867, 1], + [19866, 1], + [19865, 1], + [19864, 1], + [19863, 1], + [19862, 1], + [19861, 1], + [19860, 1], + [19859, 1], + [19858, 1], + [19857, 1], + [19856, 1], + [19855, 1], + [19854, 1], + [19853, 1], + [19852, 1], + [19851, 1], + [19850, 1], + [19849, 1], + [19848, 1], + [19847, 1], + [19846, 1], + [19845, 1], + [19844, 1], + [19843, 1], + [19842, 1], + [19841, 1], + [19840, 1], + [19839, 1], + [19838, 1], + [19837, 1], + [19836, 1], + [19835, 1], + [19834, 1], + [19833, 1], + [19832, 1], + [19831, 1], + [19830, 1], + [19829, 1], + [19828, 1], + [19827, 1], + [19826, 1], + [19825, 1], + [19824, 1], + [19823, 1], + [19822, 1], + [19821, 1], + [19820, 1], + [19819, 1], + [19818, 1], + [19817, 1], + [19816, 1], + [19815, 1], + [19814, 1], + [19813, 1], + [19812, 1], + [19811, 1], + [19810, 1], + [19809, 1], + [19808, 1], + [19807, 1], + [19806, 1], + [19805, 1], + [19804, 1], + [19803, 1], + [19802, 1], + [19801, 1], + [19800, 1], + [19799, 1], + [19798, 1], + [19797, 1], + [19796, 1], + [19795, 1], + [19794, 1], + [19793, 1], + [19792, 1], + [19791, 1], + [19790, 1], + [19789, 1], + [19788, 1], + [19787, 1], + [19786, 1], + [19785, 1], + [19784, 1], + [19783, 1], + [19782, 1], + [19781, 1], + [19780, 1], + [19779, 1], + [19778, 1], + [19777, 1], + [19776, 1], + [19775, 1], + [19774, 1], + [19773, 1], + [19772, 1], + [19771, 1], + [19770, 1], + [19769, 1], + [19768, 1], + [19767, 1], + [19766, 1], + [19765, 1], + [19764, 1], + [19763, 1], + [19762, 1], + [19761, 1], + [19760, 1], + [19759, 1], + [19758, 1], + [19757, 1], + [19756, 1], + [19755, 1], + [19754, 1], + [19753, 1], + [19752, 1], + [19751, 1], + [19750, 1], + [19749, 1], + [19748, 1], + [19747, 1], + [19746, 1], + [19745, 1], + [19744, 1], + [19743, 1], + [19742, 1], + [19741, 1], + [19740, 1], + [19739, 1], + [19738, 1], + [19737, 1], + [19736, 1], + [19735, 1], + [19734, 1], + [19733, 1], + [19732, 1], + [19731, 1], + [19730, 1], + [19729, 1], + [19728, 1], + [19727, 1], + [19726, 1], + [19725, 1], + [19724, 1], + [19723, 1], + [19722, 1], + [19721, 1], + [19720, 1], + [19719, 1], + [19718, 1], + [19717, 1], + [19716, 1], + [19715, 1], + [19714, 1], + [19713, 1], + [19712, 1], + [19711, 1], + [19710, 1], + [19709, 1], + [19708, 1], + [19707, 1], + [19706, 1], + [19705, 1], + [19704, 1], + [19703, 1], + [19702, 1], + [19701, 1], + [19700, 1], + [19699, 1], + [19698, 1], + [19697, 1], + [19696, 1], + [19695, 1], + [19694, 1], + [19693, 1], + [19692, 1], + [19691, 1], + [19690, 1], + [19689, 1], + [19688, 1], + [19687, 1], + [19686, 1], + [19685, 1], + [19684, 1], + [19683, 1], + [19682, 1], + [19681, 1], + [19680, 1], + [19679, 1], + [19678, 1], + [19677, 1], + [19676, 1], + [19675, 1], + [19674, 1], + [19673, 1], + [19672, 1], + [19671, 1], + [19670, 1], + [19669, 1], + [19668, 1], + [19667, 1], + [19666, 1], + [19665, 1], + [19664, 1], + [19663, 1], + [19662, 1], + [19661, 1], + [19660, 1], + [19659, 1], + [19658, 1], + [19657, 1], + [19656, 1], + [19655, 1], + [19654, 1], + [19653, 1], + [19652, 1], + [19651, 1], + [19650, 1], + [19649, 1], + [19648, 1], + [19647, 1], + [19646, 1], + [19645, 1], + [19644, 1], + [19643, 1], + [19642, 1], + [19641, 1], + [19640, 1], + [19639, 1], + [19638, 1], + [19637, 1], + [19636, 1], + [19635, 1], + [19634, 1], + [19633, 1], + [19632, 1], + [19631, 1], + [19630, 1], + [19629, 1], + [19628, 1], + [19627, 1], + [19626, 1], + [19625, 1], + [19624, 1], + [19623, 1], + [19622, 1], + [19621, 1], + [19620, 1], + [19619, 1], + [19618, 1], + [19617, 1], + [19616, 1], + [19615, 1], + [19614, 1], + [19613, 1], + [19612, 1], + [19611, 1], + [19610, 1], + [19609, 1], + [19608, 1], + [19607, 1], + [19606, 1], + [19605, 1], + [19604, 1], + [19603, 1], + [19602, 1], + [19601, 1], + [19600, 1], + [19599, 1], + [19598, 1], + [19597, 1], + [19596, 1], + [19595, 1], + [19594, 1], + [19593, 1], + [19592, 1], + [19591, 1], + [19590, 1], + [19589, 1], + [19588, 1], + [19587, 1], + [19586, 1], + [19585, 1], + [19584, 1], + [19583, 1], + [19582, 1], + [19581, 1], + [19580, 1], + [19579, 1], + [19578, 1], + [19577, 1], + [19576, 1], + [19575, 1], + [19574, 1], + [19573, 1], + [19572, 1], + [19571, 1], + [19570, 1], + [19569, 1], + [19568, 1], + [19567, 1], + [19566, 1], + [19565, 1], + [19564, 1], + [19563, 1], + [19562, 1], + [19561, 1], + [19560, 1], + [19559, 1], + [19558, 1], + [19557, 1], + [19556, 1], + [19555, 1], + [19554, 1], + [19553, 1], + [19552, 1], + [19551, 1], + [19550, 1], + [19549, 1], + [19548, 1], + [19547, 1], + [19546, 1], + [19545, 1], + [19544, 1], + [19543, 1], + [19542, 1], + [19541, 1], + [19540, 1], + [19539, 1], + [19538, 1], + [19537, 1], + [19536, 1], + [19535, 1], + [19534, 1], + [19533, 1], + [19532, 1], + [19531, 1], + [19530, 1], + [19529, 1], + [19528, 1], + [19527, 1], + [19526, 1], + [19525, 1], + [19524, 1], + [19523, 1], + [19522, 1], + [19521, 1], + [19520, 1], + [19519, 1], + [19518, 1], + [19517, 1], + [19516, 1], + [19515, 1], + [19514, 1], + [19513, 1], + [19512, 1], + [19511, 1], + [19510, 1], + [19509, 1], + [19508, 1], + [19507, 1], + [19506, 1], + [19505, 1], + [19504, 1], + [19503, 1], + [19502, 1], + [19501, 1], + [19500, 1], + [19499, 1], + [19498, 1], + [19497, 1], + [19496, 1], + [19495, 1], + [19494, 1], + [19493, 1], + [19492, 1], + [19491, 1], + [19490, 1], + [19489, 1], + [19488, 1], + [19487, 1], + [19486, 1], + [19485, 1], + [19484, 1], + [19483, 1], + [19482, 1], + [19481, 1], + [19480, 1], + [19479, 1], + [19478, 1], + [19477, 1], + [19476, 1], + [19475, 1], + [19474, 1], + [19473, 1], + [19472, 1], + [19471, 1], + [19470, 1], + [19469, 1], + [19468, 1], + [19467, 1], + [19466, 1], + [19465, 1], + [19464, 1], + [19463, 1], + [19462, 1], + [19461, 1], + [19460, 1], + [19459, 1], + [19458, 1], + [19457, 1], + [19456, 1], + [19455, 1], + [19454, 1], + [19453, 1], + [19452, 1], + [19451, 1], + [19450, 1], + [19449, 1], + [19448, 1], + [19447, 1], + [19446, 1], + [19445, 1], + [19444, 1], + [19443, 1], + [19442, 1], + [19441, 1], + [19440, 1], + [19439, 1], + [19438, 1], + [19437, 1], + [19436, 1], + [19435, 1], + [19434, 1], + [19433, 1], + [19432, 1], + [19431, 1], + [19430, 1], + [19429, 1], + [19428, 1], + [19427, 1], + [19426, 1], + [19425, 1], + [19424, 1], + [19423, 1], + [19422, 1], + [19421, 1], + [19420, 1], + [19419, 1], + [19418, 1], + [19417, 1], + [19416, 1], + [19415, 1], + [19414, 1], + [19413, 1], + [19412, 1], + [19411, 1], + [19410, 1], + [19409, 1], + [19408, 1], + [19407, 1], + [19406, 1], + [19405, 1], + [19404, 1], + [19403, 1], + [19402, 1], + [19401, 1], + [19400, 1], + [19399, 1], + [19398, 1], + [19397, 1], + [19396, 1], + [19395, 1], + [19394, 1], + [19393, 1], + [19392, 1], + [19391, 1], + [19390, 1], + [19389, 1], + [19388, 1], + [19387, 1], + [19386, 1], + [19385, 1], + [19384, 1], + [19383, 1], + [19382, 1], + [19381, 1], + [19380, 1], + [19379, 1], + [19378, 1], + [19377, 1], + [19376, 1], + [19375, 1], + [19374, 1], + [19373, 1], + [19372, 1], + [19371, 1], + [19370, 1], + [19369, 1], + [19368, 1], + [19367, 1], + [19366, 1], + [19365, 1], + [19364, 1], + [19363, 1], + [19362, 1], + [19361, 1], + [19360, 1], + [19359, 1], + [19358, 1], + [19357, 1], + [19356, 1], + [19355, 1], + [19354, 1], + [19353, 1], + [19352, 1], + [19351, 1], + [19350, 1], + [19349, 1], + [19348, 1], + [19347, 1], + [19346, 1], + [19345, 1], + [19344, 1], + [19343, 1], + [19342, 1], + [19341, 1], + [19340, 1], + [19339, 1], + [19338, 1], + [19337, 1], + [19336, 1], + [19335, 1], + [19334, 1], + [19333, 1], + [19332, 1], + [19331, 1], + [19330, 1], + [19329, 1], + [19328, 1], + [19327, 1], + [19326, 1], + [19325, 1], + [19324, 1], + [19323, 1], + [19322, 1], + [19321, 1], + [19320, 1], + [19319, 1], + [19318, 1], + [19317, 1], + [19316, 1], + [19315, 1], + [19314, 1], + [19313, 1], + [19312, 1], + [19311, 1], + [19310, 1], + [19309, 1], + [19308, 1], + [19307, 1], + [19306, 1], + [19305, 1], + [19304, 1], + [19303, 1], + [19302, 1], + [19301, 1], + [19300, 1], + [19299, 1], + [19298, 1], + [19297, 1], + [19296, 1], + [19295, 1], + [19294, 1], + [19293, 1], + [19292, 1], + [19291, 1], + [19290, 1], + [19289, 1], + [19288, 1], + [19287, 1], + [19286, 1], + [19285, 1], + [19284, 1], + [19283, 1], + [19282, 1], + [19281, 1], + [19280, 1], + [19279, 1], + [19278, 1], + [19277, 1], + [19276, 1], + [19275, 1], + [19274, 1], + [19273, 1], + [19272, 1], + [19271, 1], + [19270, 1], + [19269, 1], + [19268, 1], + [19267, 1], + [19266, 1], + [19265, 1], + [19264, 1], + [19263, 1], + [19262, 1], + [19261, 1], + [19260, 1], + [19259, 1], + [19258, 1], + [19257, 1], + [19256, 1], + [19255, 1], + [19254, 1], + [19253, 1], + [19252, 1], + [19251, 1], + [19250, 1], + [19249, 1], + [19248, 1], + [19247, 1], + [19246, 1], + [19245, 1], + [19244, 1], + [19243, 1], + [19242, 1], + [19241, 1], + [19240, 1], + [19239, 1], + [19238, 1], + [19237, 1], + [19236, 1], + [19235, 1], + [19234, 1], + [19233, 1], + [19232, 1], + [19231, 1], + [19230, 1], + [19229, 1], + [19228, 1], + [19227, 1], + [19226, 1], + [19225, 1], + [19224, 1], + [19223, 1], + [19222, 1], + [19221, 1], + [19220, 1], + [19219, 1], + [19218, 1], + [19217, 1], + [19216, 1], + [19215, 1], + [19214, 1], + [19213, 1], + [19212, 1], + [19211, 1], + [19210, 1], + [19209, 1], + [19208, 1], + [19207, 1], + [19206, 1], + [19205, 1], + [19204, 1], + [19203, 1], + [19202, 1], + [19201, 1], + [19200, 1], + [19199, 1], + [19198, 1], + [19197, 1], + [19196, 1], + [19195, 1], + [19194, 1], + [19193, 1], + [19192, 1], + [19191, 1], + [19190, 1], + [19189, 1], + [19188, 1], + [19187, 1], + [19186, 1], + [19185, 1], + [19184, 1], + [19183, 1], + [19182, 1], + [19181, 1], + [19180, 1], + [19179, 1], + [19178, 1], + [19177, 1], + [19176, 1], + [19175, 1], + [19174, 1], + [19173, 1], + [19172, 1], + [19171, 1], + [19170, 1], + [19169, 1], + [19168, 1], + [19167, 1], + [19166, 1], + [19165, 1], + [19164, 1], + [19163, 1], + [19162, 1], + [19161, 1], + [19160, 1], + [19159, 1], + [19158, 1], + [19157, 1], + [19156, 1], + [19155, 1], + [19154, 1], + [19153, 1], + [19152, 1], + [19151, 1], + [19150, 1], + [19149, 1], + [19148, 1], + [19147, 1], + [19146, 1], + [19145, 1], + [19144, 1], + [19143, 1], + [19142, 1], + [19141, 1], + [19140, 1], + [19139, 1], + [19138, 1], + [19137, 1], + [19136, 1], + [19135, 1], + [19134, 1], + [19133, 1], + [19132, 1], + [19131, 1], + [19130, 1], + [19129, 1], + [19128, 1], + [19127, 1], + [19126, 1], + [19125, 1], + [19124, 1], + [19123, 1], + [19122, 1], + [19121, 1], + [19120, 1], + [19119, 1], + [19118, 1], + [19117, 1], + [19116, 1], + [19115, 1], + [19114, 1], + [19113, 1], + [19112, 1], + [19111, 1], + [19110, 1], + [19109, 1], + [19108, 1], + [19107, 1], + [19106, 1], + [19105, 1], + [19104, 1], + [19103, 1], + [19102, 1], + [19101, 1], + [19100, 1], + [19099, 1], + [19098, 1], + [19097, 1], + [19096, 1], + [19095, 1], + [19094, 1], + [19093, 1], + [19092, 1], + [19091, 1], + [19090, 1], + [19089, 1], + [19088, 1], + [19087, 1], + [19086, 1], + [19085, 1], + [19084, 1], + [19083, 1], + [19082, 1], + [19081, 1], + [19080, 1], + [19079, 1], + [19078, 1], + [19077, 1], + [19076, 1], + [19075, 1], + [19074, 1], + [19073, 1], + [19072, 1], + [19071, 1], + [19070, 1], + [19069, 1], + [19068, 1], + [19067, 1], + [19066, 1], + [19065, 1], + [19064, 1], + [19063, 1], + [19062, 1], + [19061, 1], + [19060, 1], + [19059, 1], + [19058, 1], + [19057, 1], + [19056, 1], + [19055, 1], + [19054, 1], + [19053, 1], + [19052, 1], + [19051, 1], + [19050, 1], + [19049, 1], + [19048, 1], + [19047, 1], + [19046, 1], + [19045, 1], + [19044, 1], + [19043, 1], + [19042, 1], + [19041, 1], + [19040, 1], + [19039, 1], + [19038, 1], + [19037, 1], + [19036, 1], + [19035, 1], + [19034, 1], + [19033, 1], + [19032, 1], + [19031, 1], + [19030, 1], + [19029, 1], + [19028, 1], + [19027, 1], + [19026, 1], + [19025, 1], + [19024, 1], + [19023, 1], + [19022, 1], + [19021, 1], + [19020, 1], + [19019, 1], + [19018, 1], + [19017, 1], + [19016, 1], + [19015, 1], + [19014, 1], + [19013, 1], + [19012, 1], + [19011, 1], + [19010, 1], + [19009, 1], + [19008, 1], + [19007, 1], + [19006, 1], + [19005, 1], + [19004, 1], + [19003, 1], + [19002, 1], + [19001, 1], + [19000, 1], + [18999, 1], + [18998, 1], + [18997, 1], + [18996, 1], + [18995, 1], + [18994, 1], + [18993, 1], + [18992, 1], + [18991, 1], + [18990, 1], + [18989, 1], + [18988, 1], + [18987, 1], + [18986, 1], + [18985, 1], + [18984, 1], + [18983, 1], + [18982, 1], + [18981, 1], + [18980, 1], + [18979, 1], + [18978, 1], + [18977, 1], + [18976, 1], + [18975, 1], + [18974, 1], + [18973, 1], + [18972, 1], + [18971, 1], + [18970, 1], + [18969, 1], + [18968, 1], + [18967, 1], + [18966, 1], + [18965, 1], + [18964, 1], + [18963, 1], + [18962, 1], + [18961, 1], + [18960, 1], + [18959, 1], + [18958, 1], + [18957, 1], + [18956, 1], + [18955, 1], + [18954, 1], + [17502, 0, "s"], + [17503, 0, "u"], + [17504, 0, "b"], + [17458, 1], + [17457, 1], + [17456, 1], + [17455, 1], + [17455, 0, "\\"], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 1], + [17467, 0, "G"], + [17468, 0, "e"], + [17469, 0, "n"], + [17470, 0, "e"], + [17471, 0, "r"], + [17472, 0, "a"], + [17473, 0, "t"], + [17474, 0, "i"], + [17475, 0, "n"], + [17476, 0, "g"], + [17477, 0, " "], + [17478, 0, "o"], + [17479, 0, "p"], + [17480, 0, "e"], + [17481, 0, "r"], + [17482, 0, "a"], + [17483, 0, "t"], + [17484, 0, "i"], + [17485, 0, "o"], + [17486, 0, "n"], + [17487, 0, "s"], + [17489, 0, "\n"], + [17490, 0, "\n"], + [17491, 0, "B"], + [17492, 0, "e"], + [17493, 0, "f"], + [17494, 0, "o"], + [17495, 0, "r"], + [17496, 0, "e"], + [17497, 0, " "], + [17497, 1], + [17496, 1], + [17495, 1], + [17494, 1], + [17493, 1], + [17492, 1], + [17491, 1], + [17491, 0, "W"], + [17492, 0, "e"], + [17493, 0, " "], + [17494, 0, "n"], + [17495, 0, "o"], + [17496, 0, "w"], + [17497, 0, " "], + [17498, 0, "t"], + [17499, 0, "u"], + [17500, 0, "r"], + [17501, 0, "n"], + [17502, 0, " "], + [17503, 0, "t"], + [17504, 0, "o"], + [17505, 0, " "], + [17506, 0, "t"], + [17507, 0, "h"], + [17508, 0, "e"], + [17509, 0, " "], + [17510, 0, "c"], + [17511, 0, "o"], + [17512, 0, "m"], + [17513, 0, "m"], + [17514, 0, "a"], + [17515, 0, "n"], + [17516, 0, "d"], + [17517, 0, "s"], + [17518, 0, " "], + [17519, 0, "f"], + [17520, 0, "o"], + [17521, 0, "r"], + [17522, 0, " "], + [17523, 0, "m"], + [17524, 0, "u"], + [17525, 0, "t"], + [17526, 0, "a"], + [17527, 0, "t"], + [17528, 0, "i"], + [17529, 0, "n"], + [17530, 0, "g"], + [17531, 0, " "], + [17532, 0, "t"], + [17533, 0, "h"], + [17534, 0, "e"], + [17535, 0, " "], + [17536, 0, "s"], + [17537, 0, "t"], + [17538, 0, "a"], + [17539, 0, "t"], + [17540, 0, "e"], + [17541, 0, " "], + [17542, 0, "o"], + [17543, 0, "f"], + [17544, 0, " "], + [17545, 0, "t"], + [17546, 0, "h"], + [17547, 0, "e"], + [17548, 0, " "], + [17549, 0, "d"], + [17550, 0, "o"], + [17551, 0, "c"], + [17552, 0, "u"], + [17553, 0, "m"], + [17554, 0, "e"], + [17555, 0, "n"], + [17556, 0, "t"], + [17557, 0, "."], + [17508, 1], + [17507, 1], + [17506, 1], + [17505, 1], + [17504, 1], + [17503, 1], + [17502, 1], + [17501, 1], + [17500, 1], + [17499, 1], + [17498, 1], + [17497, 1], + [17496, 1], + [17495, 1], + [17494, 1], + [17493, 1], + [17492, 1], + [17491, 1], + [17491, 0, "B"], + [17492, 0, "e"], + [17493, 0, "f"], + [17494, 0, "o"], + [17495, 0, "r"], + [17496, 0, "e"], + [17497, 0, " "], + [17498, 0, "w"], + [17499, 0, "e"], + [17500, 0, " "], + [17501, 0, "c"], + [17502, 0, "a"], + [17503, 0, "n"], + [17504, 0, " "], + [17505, 0, "d"], + [17506, 0, "e"], + [17507, 0, "f"], + [17508, 0, "i"], + [17509, 0, "n"], + [17510, 0, "e"], + [17511, 0, " "], + [17512, 0, "t"], + [17513, 0, "h"], + [17514, 0, "e"], + [17515, 0, " "], + [17516, 0, "f"], + [17517, 0, "o"], + [17518, 0, "r"], + [17519, 0, "m"], + [17520, 0, "a"], + [17521, 0, "l"], + [17522, 0, " "], + [17523, 0, "s"], + [17524, 0, "e"], + [17525, 0, "m"], + [17526, 0, "a"], + [17527, 0, "n"], + [17528, 0, "t"], + [17529, 0, "i"], + [17530, 0, "c"], + [17531, 0, "s"], + [17532, 0, " "], + [17533, 0, "o"], + [17534, 0, "f"], + [17535, 0, " "], + [17536, 0, "t"], + [17537, 0, "h"], + [17538, 0, "e"], + [17551, 1], + [17550, 1], + [17549, 1], + [17549, 0, "t"], + [17550, 0, "h"], + [17551, 0, "a"], + [17552, 0, "t"], + [17561, 1], + [17560, 1], + [17559, 1], + [17559, 0, "e"], + [17586, 0, " "], + [17586, 1], + [17586, 0, ","], + [17587, 0, " "], + [17588, 0, "w"], + [17589, 0, "e"], + [17590, 0, " "], + [17591, 0, "m"], + [17592, 0, "u"], + [17593, 0, "s"], + [17594, 0, "t"], + [17595, 0, " "], + [17553, 1], + [17552, 1], + [17551, 1], + [17550, 1], + [17549, 1], + [17538, 1], + [17537, 1], + [17536, 1], + [17535, 1], + [17534, 1], + [17533, 1], + [17532, 1], + [17531, 1], + [17530, 1], + [17529, 1], + [17528, 1], + [17527, 1], + [17526, 1], + [17525, 1], + [17524, 1], + [17523, 1], + [17522, 1], + [17521, 1], + [17520, 1], + [17519, 1], + [17518, 1], + [17517, 1], + [17516, 1], + [17515, 1], + [17514, 1], + [17513, 1], + [17512, 1], + [17511, 1], + [17510, 1], + [17509, 1], + [17508, 1], + [17507, 1], + [17506, 1], + [17505, 1], + [17504, 1], + [17503, 1], + [17502, 1], + [17501, 1], + [17500, 1], + [17499, 1], + [17498, 1], + [17497, 1], + [17496, 1], + [17495, 1], + [17494, 1], + [17493, 1], + [17492, 1], + [17491, 1], + [17491, 0, "W"], + [17492, 0, "h"], + [17493, 0, "e"], + [17494, 0, "n"], + [17546, 1], + [17545, 1], + [17544, 1], + [17543, 1], + [17542, 1], + [17541, 1], + [17540, 1], + [17539, 1], + [17539, 0, "t"], + [17540, 0, "h"], + [17541, 0, "e"], + [17542, 0, "y"], + [17543, 0, " "], + [17544, 0, "g"], + [17545, 0, "e"], + [17546, 0, "n"], + [17547, 0, "e"], + [17548, 0, "r"], + [17549, 0, "a"], + [17550, 0, "t"], + [17551, 0, "e"], + [17552, 0, " "], + [17553, 0, "\\"], + [17554, 0, "e"], + [17555, 0, "m"], + [17556, 0, "p"], + [17557, 0, "h"], + [17558, 0, "{"], + [17559, 0, "o"], + [17560, 0, "p"], + [17561, 0, "e"], + [17562, 0, "r"], + [17563, 0, "a"], + [17564, 0, "t"], + [17565, 0, "i"], + [17566, 0, "o"], + [17567, 0, "n"], + [17568, 0, "s"], + [17569, 0, "}"], + [17570, 0, " "], + [17571, 0, "t"], + [17572, 0, "h"], + [17573, 0, "a"], + [17574, 0, "t"], + [17575, 0, " "], + [17576, 0, "d"], + [17577, 0, "e"], + [17578, 0, "s"], + [17579, 0, "c"], + [17580, 0, "r"], + [17581, 0, "i"], + [17582, 0, "b"], + [17583, 0, "e"], + [17584, 0, " "], + [17585, 0, "t"], + [17586, 0, "h"], + [17587, 0, "e"], + [17588, 0, " "], + [17589, 0, "m"], + [17590, 0, "u"], + [17591, 0, "t"], + [17592, 0, "a"], + [17593, 0, "t"], + [17594, 0, "i"], + [17595, 0, "o"], + [17596, 0, "n"], + [17598, 0, " "], + [17599, 0, "I"], + [17600, 0, "n"], + [17601, 0, " "], + [17602, 0, "o"], + [17603, 0, "u"], + [17604, 0, "r"], + [17605, 0, " "], + [17606, 0, "s"], + [17607, 0, "e"], + [17608, 0, "m"], + [17609, 0, "a"], + [17610, 0, "n"], + [17611, 0, "t"], + [17612, 0, "i"], + [17613, 0, "c"], + [17614, 0, "s"], + [17615, 0, ","], + [17616, 0, " "], + [17617, 0, "c"], + [17618, 0, "o"], + [17619, 0, "m"], + [17620, 0, "m"], + [17621, 0, "a"], + [17622, 0, "n"], + [17623, 0, "d"], + [17624, 0, "s"], + [17625, 0, " "], + [17626, 0, "n"], + [17627, 0, "e"], + [17628, 0, "v"], + [17629, 0, "e"], + [17630, 0, "r"], + [17631, 0, " "], + [17632, 0, "d"], + [17633, 0, "i"], + [17634, 0, "r"], + [17635, 0, "e"], + [17636, 0, "c"], + [17637, 0, "t"], + [17638, 0, "l"], + [17639, 0, "y"], + [17640, 0, " "], + [17641, 0, "m"], + [17642, 0, "o"], + [17643, 0, "d"], + [17644, 0, "i"], + [17645, 0, "f"], + [17646, 0, "y"], + [17647, 0, " "], + [17648, 0, "t"], + [17649, 0, "h"], + [17650, 0, "e"], + [17651, 0, " "], + [17652, 0, "t"], + [17653, 0, "h"], + [17654, 0, "e"], + [17655, 0, " "], + [17655, 1], + [17654, 1], + [17653, 1], + [17652, 1], + [17652, 0, "l"], + [17653, 0, "o"], + [17654, 0, "c"], + [17655, 0, "a"], + [17656, 0, "l"], + [17657, 0, " "], + [17658, 0, "p"], + [17659, 0, "e"], + [17660, 0, "e"], + [17661, 0, "r"], + [17662, 0, " "], + [17663, 0, "s"], + [17664, 0, "t"], + [17665, 0, "a"], + [17666, 0, "t"], + [17667, 0, "e"], + [17668, 0, " "], + [17669, 0, "$"], + [17670, 0, "A"], + [17671, 0, "_"], + [17672, 0, "p"], + [17673, 0, "$"], + [17674, 0, ","], + [17675, 0, " "], + [17676, 0, "b"], + [17677, 0, "u"], + [17678, 0, "t"], + [17679, 0, " "], + [17680, 0, "o"], + [17681, 0, "n"], + [17682, 0, "l"], + [17683, 0, "y"], + [17684, 0, " "], + [17685, 0, "g"], + [17686, 0, "e"], + [17687, 0, "n"], + [17688, 0, "e"], + [17689, 0, "r"], + [17690, 0, "a"], + [17691, 0, "t"], + [17692, 0, "e"], + [17693, 0, " "], + [17694, 0, "a"], + [17695, 0, "n"], + [17696, 0, " "], + [17697, 0, "o"], + [17698, 0, "p"], + [17699, 0, "e"], + [17700, 0, "r"], + [17701, 0, "a"], + [17702, 0, "t"], + [17703, 0, "i"], + [17704, 0, "o"], + [17705, 0, "n"], + [17706, 0, "."], + [17617, 0, "a"], + [17618, 0, " "], + [17626, 1], + [17647, 1], + [17647, 0, "i"], + [17648, 0, "e"], + [17649, 0, "s"], + [17696, 0, "s"], + [17711, 0, " "], + [17712, 0, "T"], + [17713, 0, "h"], + [17714, 0, "a"], + [17715, 0, "t"], + [17716, 0, " "], + [17717, 0, "o"], + [17718, 0, "p"], + [17719, 0, "e"], + [17720, 0, "r"], + [17721, 0, "a"], + [17722, 0, "t"], + [17723, 0, "i"], + [17724, 0, "o"], + [17725, 0, "n"], + [17726, 0, " "], + [17727, 0, "i"], + [17728, 0, "s"], + [17729, 0, " "], + [17730, 0, "t"], + [17731, 0, "h"], + [17732, 0, "a"], + [17733, 0, "t"], + [17734, 0, " "], + [17734, 1], + [17733, 1], + [17732, 1], + [17732, 0, "e"], + [17733, 0, "n"], + [17734, 0, " "], + [17735, 0, "a"], + [17736, 0, "p"], + [17737, 0, "p"], + [17738, 0, "l"], + [17739, 0, "i"], + [17740, 0, "e"], + [17741, 0, "d"], + [17742, 0, " "], + [17743, 0, "t"], + [17744, 0, "o"], + [17745, 0, " "], + [17746, 0, "$"], + [17747, 0, "A"], + [17748, 0, "_"], + [17749, 0, "p"], + [17750, 0, "$"], + [17751, 0, " "], + [17752, 0, "i"], + [17753, 0, "n"], + [17754, 0, " "], + [17755, 0, "o"], + [17756, 0, "r"], + [17757, 0, "d"], + [17758, 0, "e"], + [17759, 0, "r"], + [17760, 0, " "], + [17761, 0, "t"], + [17762, 0, "o"], + [17763, 0, " "], + [17735, 0, "i"], + [17736, 0, "m"], + [17737, 0, "m"], + [17738, 0, "e"], + [17739, 0, "d"], + [17740, 0, "i"], + [17741, 0, "a"], + [17742, 0, "t"], + [17743, 0, "e"], + [17744, 0, "l"], + [17745, 0, "y"], + [17746, 0, " "], + [17775, 1], + [17774, 1], + [17773, 1], + [17772, 1], + [17771, 1], + [17770, 1], + [17769, 1], + [17768, 1], + [17767, 1], + [17766, 1], + [17765, 1], + [17764, 1], + [17764, 0, "s"], + [17765, 0, "o"], + [17766, 0, " "], + [17767, 0, "t"], + [17768, 0, "h"], + [17769, 0, "a"], + [17770, 0, "t"], + [17771, 0, " "], + [17772, 0, "i"], + [17773, 0, "t"], + [17774, 0, " "], + [17775, 0, "t"], + [17776, 0, "a"], + [17777, 0, "k"], + [17778, 0, "e"], + [17779, 0, "s"], + [17780, 0, " "], + [17781, 0, "e"], + [17782, 0, "f"], + [17783, 0, "f"], + [17784, 0, "e"], + [17785, 0, "c"], + [17786, 0, "t"], + [17787, 0, " "], + [17788, 0, "l"], + [17789, 0, "o"], + [17790, 0, "c"], + [17791, 0, "a"], + [17792, 0, "l"], + [17793, 0, "l"], + [17794, 0, "y"], + [17795, 0, ","], + [17796, 0, " "], + [17797, 0, "a"], + [17798, 0, "n"], + [17799, 0, "d"], + [17800, 0, " "], + [17801, 0, "a"], + [17802, 0, "s"], + [17803, 0, "y"], + [17804, 0, "n"], + [17805, 0, "c"], + [17806, 0, "h"], + [17807, 0, "r"], + [17808, 0, "o"], + [17809, 0, "n"], + [17810, 0, "o"], + [17811, 0, "u"], + [17812, 0, "s"], + [17813, 0, "l"], + [17814, 0, "y"], + [17815, 0, " "], + [17801, 0, "t"], + [17802, 0, "h"], + [17803, 0, "e"], + [17804, 0, " "], + [17805, 0, "o"], + [17806, 0, "p"], + [17807, 0, "e"], + [17808, 0, "r"], + [17809, 0, "a"], + [17810, 0, "t"], + [17811, 0, "i"], + [17812, 0, "o"], + [17813, 0, "n"], + [17814, 0, " "], + [17815, 0, "i"], + [17816, 0, "s"], + [17817, 0, " "], + [17818, 0, "a"], + [17819, 0, "l"], + [17820, 0, "s"], + [17821, 0, "o"], + [17822, 0, " "], + [17838, 0, "b"], + [17839, 0, "r"], + [17840, 0, "o"], + [17841, 0, "a"], + [17842, 0, "d"], + [17843, 0, "c"], + [17844, 0, "a"], + [17845, 0, "s"], + [17846, 0, "t"], + [17847, 0, " "], + [17848, 0, "t"], + [17849, 0, "o"], + [17850, 0, " "], + [17851, 0, "t"], + [17852, 0, "h"], + [17853, 0, "e"], + [17854, 0, " "], + [17855, 0, "o"], + [17856, 0, "t"], + [17857, 0, "h"], + [17858, 0, "e"], + [17859, 0, "r"], + [17860, 0, " "], + [17861, 0, "p"], + [17862, 0, "e"], + [17863, 0, "e"], + [17864, 0, "r"], + [17865, 0, "s"], + [17866, 0, "."], + [17867, 0, " "], + [17868, 0, "A"], + [17869, 0, " "], + [17870, 0, "p"], + [17871, 0, "e"], + [17872, 0, "e"], + [17873, 0, "r"], + [17874, 0, " "], + [17875, 0, "a"], + [17876, 0, "p"], + [17877, 0, "p"], + [17878, 0, "l"], + [17879, 0, "i"], + [17880, 0, "e"], + [17881, 0, "s"], + [17882, 0, " "], + [17882, 1], + [17881, 1], + [17881, 0, "s"], + [17882, 0, " "], + [17883, 0, "o"], + [17884, 0, "p"], + [17885, 0, "e"], + [17886, 0, "r"], + [17887, 0, "a"], + [17888, 0, "t"], + [17889, 0, "i"], + [17890, 0, "o"], + [17891, 0, "n"], + [17892, 0, "s"], + [17893, 0, " "], + [17894, 0, "r"], + [17895, 0, "e"], + [17896, 0, "c"], + [17897, 0, "e"], + [17898, 0, "i"], + [17899, 0, "v"], + [17900, 0, "e"], + [17901, 0, "d"], + [17902, 0, " "], + [17903, 0, "f"], + [17904, 0, "r"], + [17905, 0, "o"], + [17906, 0, "m"], + [17907, 0, " "], + [17908, 0, "r"], + [17909, 0, "e"], + [17910, 0, "m"], + [17911, 0, "o"], + [17912, 0, "t"], + [17913, 0, "e"], + [17914, 0, " "], + [17915, 0, "n"], + [17916, 0, "o"], + [17917, 0, "d"], + [17918, 0, "e"], + [17919, 0, "s"], + [17920, 0, " "], + [17921, 0, "w"], + [17922, 0, "h"], + [17923, 0, "e"], + [17924, 0, "n"], + [17925, 0, " "], + [17926, 0, "i"], + [17927, 0, "t"], + [17928, 0, "s"], + [17929, 0, " "], + [17930, 0, "c"], + [17931, 0, "a"], + [17932, 0, "u"], + [17933, 0, "s"], + [17934, 0, "a"], + [17935, 0, "l"], + [17936, 0, " "], + [17937, 0, "d"], + [17938, 0, "e"], + [17939, 0, "p"], + [17940, 0, "e"], + [17941, 0, "n"], + [17942, 0, "d"], + [17943, 0, "e"], + [17944, 0, "n"], + [17945, 0, "c"], + [17946, 0, "i"], + [17947, 0, "e"], + [17948, 0, "s"], + [17949, 0, " "], + [17950, 0, "a"], + [17951, 0, "r"], + [17952, 0, "e"], + [17953, 0, " "], + [17954, 0, "s"], + [17955, 0, "a"], + [17956, 0, "t"], + [17957, 0, "i"], + [17958, 0, "s"], + [17959, 0, "f"], + [17960, 0, "i"], + [17961, 0, "e"], + [17962, 0, "d"], + [17963, 0, ","], + [17964, 0, " "], + [17965, 0, "a"], + [17966, 0, "s"], + [17967, 0, " "], + [17968, 0, "d"], + [17969, 0, "e"], + [17970, 0, "t"], + [17971, 0, "a"], + [17972, 0, "i"], + [17973, 0, "l"], + [17974, 0, "e"], + [17975, 0, "d"], + [17976, 0, " "], + [17977, 0, "b"], + [17978, 0, "e"], + [17979, 0, "l"], + [17980, 0, "o"], + [17981, 0, "w"], + [17982, 0, "."], + [17983, 0, "\n"], + [17984, 0, "\n"], + [17985, 1], + [17985, 1], + [18020, 0, "\n"], + [18020, 0, "\n"], + [18021, 0, "E"], + [18022, 0, "v"], + [18023, 0, "e"], + [18024, 0, "r"], + [18025, 0, "y"], + [18026, 0, " "], + [18027, 0, "o"], + [18028, 0, "p"], + [18029, 0, "e"], + [18030, 0, "r"], + [18031, 0, "a"], + [18032, 0, "t"], + [18033, 0, "i"], + [18034, 0, "o"], + [18035, 0, "n"], + [18036, 0, " "], + [18037, 0, "i"], + [18038, 0, "n"], + [18039, 0, " "], + [18040, 0, "o"], + [18041, 0, "u"], + [18042, 0, "r"], + [18043, 0, " "], + [18044, 0, "m"], + [18045, 0, "o"], + [18046, 0, "d"], + [18047, 0, "e"], + [18048, 0, "l"], + [18049, 0, " "], + [18050, 0, "i"], + [18051, 0, "s"], + [18052, 0, " "], + [18053, 0, "g"], + [18054, 0, "i"], + [18055, 0, "v"], + [18056, 0, "e"], + [18057, 0, "n"], + [18058, 0, " "], + [18059, 0, "a"], + [18060, 0, " "], + [18061, 0, "u"], + [18062, 0, "n"], + [18063, 0, "i"], + [18064, 0, "q"], + [18065, 0, "u"], + [18066, 0, "e"], + [18067, 0, " "], + [18068, 0, "i"], + [18069, 0, "d"], + [18070, 0, "e"], + [18071, 0, "n"], + [18072, 0, "t"], + [18073, 0, "i"], + [18074, 0, "f"], + [18075, 0, "i"], + [18076, 0, "e"], + [18077, 0, "r"], + [18078, 0, ","], + [18079, 0, " "], + [18080, 0, "w"], + [18081, 0, "h"], + [18082, 0, "i"], + [18083, 0, "c"], + [18084, 0, "h"], + [18085, 0, " "], + [18086, 0, "i"], + [18087, 0, "s"], + [18088, 0, " "], + [18089, 0, "u"], + [18090, 0, "s"], + [18091, 0, "e"], + [18092, 0, "d"], + [18093, 0, " "], + [18094, 0, "a"], + [18095, 0, "s"], + [18096, 0, " "], + [18097, 0, "p"], + [18098, 0, "a"], + [18099, 0, "r"], + [18100, 0, "t"], + [18101, 0, " "], + [18102, 0, "o"], + [18103, 0, "f"], + [18104, 0, " "], + [18105, 0, "t"], + [18106, 0, "h"], + [18107, 0, "e"], + [18108, 0, " "], + [18109, 0, "l"], + [18110, 0, "o"], + [18111, 0, "c"], + [18112, 0, "a"], + [18113, 0, "l"], + [18114, 0, " "], + [18115, 0, "s"], + [18116, 0, "t"], + [18117, 0, "a"], + [18118, 0, "t"], + [18119, 0, "e"], + [18120, 0, " "], + [18121, 0, "a"], + [18122, 0, "n"], + [18123, 0, "d"], + [18124, 0, " "], + [18125, 0, "o"], + [18126, 0, "f"], + [18127, 0, " "], + [18128, 0, "c"], + [18129, 0, "u"], + [18130, 0, "r"], + [18131, 0, "s"], + [18132, 0, "o"], + [18133, 0, "r"], + [18134, 0, "s"], + [18135, 0, "."], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18096, 1], + [18095, 1], + [18094, 1], + [18094, 0, "i"], + [18095, 0, "n"], + [18118, 1], + [18117, 1], + [18117, 0, "i"], + [18118, 0, "n"], + [18128, 0, " "], + [18129, 0, "F"], + [18130, 0, "o"], + [18131, 0, "r"], + [18132, 0, " "], + [18133, 0, "e"], + [18134, 0, "x"], + [18135, 0, "a"], + [18136, 0, "m"], + [18137, 0, "p"], + [18138, 0, "l"], + [18139, 0, "e"], + [18140, 0, ","], + [18141, 0, " "], + [18142, 0, "i"], + [18143, 0, "n"], + [18144, 0, " "], + [18145, 0, "F"], + [18146, 0, "i"], + [18147, 0, "g"], + [18148, 0, "u"], + [18149, 0, "r"], + [18150, 0, "e"], + [18151, 0, "~"], + [18152, 0, "\\"], + [18153, 0, "r"], + [18154, 0, "e"], + [18155, 0, "f"], + [18156, 0, "{"], + [18157, 0, "f"], + [18158, 0, "i"], + [18159, 0, "g"], + [18160, 0, ":"], + [18161, 0, "s"], + [18162, 0, "t"], + [18163, 0, "a"], + [18164, 0, "t"], + [18165, 0, "e"], + [18166, 0, "-"], + [18167, 0, "e"], + [18168, 0, "x"], + [18169, 0, "a"], + [18170, 0, "m"], + [18171, 0, "p"], + [18172, 0, "l"], + [18173, 0, "e"], + [18174, 0, "}"], + [18175, 0, ","], + [18176, 0, " "], + [18177, 0, "$"], + [18178, 0, "\\"], + [18179, 0, "m"], + [18180, 0, "a"], + [18181, 0, "t"], + [18182, 0, "h"], + [18183, 0, "i"], + [18184, 0, "t"], + [18185, 0, "{"], + [18186, 0, "i"], + [18187, 0, "d"], + [18188, 0, "}"], + [18189, 0, "_"], + [18190, 0, "{"], + [18191, 0, "1"], + [18192, 0, ","], + [18193, 0, "2"], + [18194, 0, ","], + [18195, 0, "3"], + [18196, 0, "}"], + [18197, 0, "$"], + [18198, 0, " "], + [18199, 0, "a"], + [18200, 0, "r"], + [18201, 0, "e"], + [18202, 0, " "], + [18203, 0, "u"], + [18204, 0, "s"], + [18205, 0, "e"], + [18206, 0, "d"], + [18207, 0, " "], + [18208, 0, "t"], + [18209, 0, "o"], + [18210, 0, " "], + [18211, 0, "i"], + [18212, 0, "d"], + [18213, 0, "e"], + [18214, 0, "n"], + [18215, 0, "t"], + [18216, 0, "i"], + [18217, 0, "f"], + [18218, 0, "y"], + [18219, 0, " "], + [18220, 0, "l"], + [18221, 0, "i"], + [18222, 0, "s"], + [18223, 0, "t"], + [18224, 0, " "], + [18225, 0, "e"], + [18226, 0, "l"], + [18227, 0, "e"], + [18228, 0, "m"], + [18229, 0, "e"], + [18230, 0, "n"], + [18231, 0, "t"], + [18232, 0, "s"], + [18233, 0, " "], + [18234, 0, "a"], + [18235, 0, "n"], + [18236, 0, "d"], + [18237, 0, " "], + [18238, 0, "a"], + [18239, 0, "l"], + [18240, 0, "s"], + [18241, 0, "o"], + [18242, 0, " "], + [18243, 0, "t"], + [18244, 0, "h"], + [18245, 0, "e"], + [18246, 0, " "], + [18247, 0, "v"], + [18248, 0, "a"], + [18249, 0, "l"], + [18250, 0, "u"], + [18251, 0, "e"], + [18252, 0, "s"], + [18253, 0, " "], + [18254, 0, "o"], + [18255, 0, "f"], + [18256, 0, " "], + [18257, 0, "r"], + [18258, 0, "e"], + [18259, 0, "g"], + [18260, 0, "i"], + [18261, 0, "s"], + [18262, 0, "t"], + [18263, 0, "e"], + [18264, 0, "r"], + [18265, 0, "s"], + [18266, 0, "."], + [18267, 0, " "], + [18268, 0, "T"], + [18269, 0, "h"], + [18270, 0, "o"], + [18271, 0, "s"], + [18272, 0, "e"], + [18273, 0, " "], + [18274, 0, "i"], + [18275, 0, "d"], + [18276, 0, "e"], + [18277, 0, "n"], + [18278, 0, "t"], + [18279, 0, "i"], + [18280, 0, "f"], + [18281, 0, "i"], + [18282, 0, "e"], + [18283, 0, "r"], + [18284, 0, "s"], + [18285, 0, " "], + [18286, 0, "$"], + [18287, 0, "\\"], + [18288, 0, "m"], + [18289, 0, "a"], + [18290, 0, "t"], + [18291, 0, "h"], + [18292, 0, "i"], + [18293, 0, "t"], + [18294, 0, "{"], + [18295, 0, "i"], + [18296, 0, "d"], + [18297, 0, "}"], + [18298, 0, "_"], + [18299, 0, "{"], + [18300, 0, "1"], + [18301, 0, ","], + [18302, 0, "2"], + [18303, 0, ","], + [18304, 0, "3"], + [18305, 0, ","], + [18306, 0, "}"], + [18307, 0, "$"], + [18308, 0, " "], + [18305, 1], + [18308, 0, "a"], + [18309, 0, "r"], + [18310, 0, "e"], + [18311, 0, " "], + [18312, 0, "i"], + [18313, 0, "n"], + [18314, 0, "f"], + [18315, 0, "a"], + [18316, 0, "c"], + [18317, 0, "t"], + [18318, 0, " "], + [18319, 0, "t"], + [18320, 0, "h"], + [18321, 0, "e"], + [18322, 0, " "], + [18323, 0, "i"], + [18324, 0, "d"], + [18325, 0, "e"], + [18326, 0, "n"], + [18327, 0, "t"], + [18328, 0, "i"], + [18329, 0, "f"], + [18330, 0, "i"], + [18331, 0, "e"], + [18332, 0, "r"], + [18333, 0, "s"], + [18334, 0, " "], + [18314, 0, " "], + [18336, 0, "o"], + [18337, 0, "f"], + [18338, 0, " "], + [18339, 0, "t"], + [18340, 0, "h"], + [18341, 0, "e"], + [18342, 0, " "], + [18343, 0, "o"], + [18344, 0, "p"], + [18345, 0, "e"], + [18346, 0, "r"], + [18347, 0, "a"], + [18348, 0, "t"], + [18349, 0, "i"], + [18350, 0, "o"], + [18351, 0, "n"], + [18352, 0, "s"], + [18353, 0, " "], + [18354, 0, "t"], + [18355, 0, "h"], + [18356, 0, "a"], + [18357, 0, "t"], + [18358, 0, " "], + [18359, 0, "i"], + [18360, 0, "n"], + [18361, 0, "s"], + [18362, 0, "e"], + [18363, 0, "r"], + [18364, 0, "t"], + [18365, 0, "e"], + [18366, 0, "d"], + [18367, 0, " "], + [18368, 0, "t"], + [18369, 0, "h"], + [18370, 0, "e"], + [18371, 0, " "], + [18372, 0, "l"], + [18373, 0, "i"], + [18374, 0, "s"], + [18375, 0, "t"], + [18376, 0, " "], + [18377, 0, "e"], + [18378, 0, "l"], + [18379, 0, "e"], + [18380, 0, "m"], + [18381, 0, "e"], + [18382, 0, "n"], + [18383, 0, "t"], + [18384, 0, "s"], + [18385, 0, "."], + [18386, 0, "\n"], + [18387, 0, "\n"], + [18388, 0, "I"], + [18389, 0, "n"], + [18390, 0, " "], + [18390, 1], + [18389, 1], + [18388, 1], + [18388, 0, "W"], + [18389, 0, "e"], + [18390, 0, " "], + [18391, 0, "u"], + [18392, 0, "s"], + [18393, 0, "e"], + [18394, 0, " "], + [18395, 0, "L"], + [18396, 0, "a"], + [18397, 0, "m"], + [18398, 0, "p"], + [18399, 0, "o"], + [18400, 0, "r"], + [18401, 0, "t"], + [18402, 0, " "], + [18403, 0, "t"], + [18404, 0, "i"], + [18405, 0, "m"], + [18406, 0, "e"], + [18407, 0, "s"], + [18408, 0, "t"], + [18409, 0, "a"], + [18410, 0, "m"], + [18411, 0, "p"], + [18412, 0, "s"], + [18413, 0, "~"], + [18414, 0, "\\"], + [18415, 0, "c"], + [18416, 0, "i"], + [18417, 0, "t"], + [18418, 0, "e"], + [18419, 0, "{"], + [18420, 0, "L"], + [18421, 0, "a"], + [18422, 0, "m"], + [18423, 0, "p"], + [18424, 0, "o"], + [18425, 0, "r"], + [18426, 0, "t"], + [18427, 0, ":"], + [18428, 0, "1"], + [18429, 0, "9"], + [18430, 0, "7"], + [18431, 0, "8"], + [18432, 0, "j"], + [18433, 0, "q"], + [18434, 0, "}"], + [18435, 0, " "], + [18436, 0, "t"], + [18437, 0, "o"], + [18438, 0, " "], + [18439, 0, "g"], + [18440, 0, "e"], + [18441, 0, "n"], + [18442, 0, "e"], + [18443, 0, "r"], + [18444, 0, "a"], + [18445, 0, "t"], + [18446, 0, "e"], + [18447, 0, " "], + [18448, 0, "t"], + [18449, 0, "h"], + [18449, 1], + [18448, 1], + [18447, 1], + [18446, 1], + [18445, 1], + [18444, 1], + [18443, 1], + [18442, 1], + [18441, 1], + [18440, 1], + [18439, 1], + [18438, 1], + [18437, 1], + [18436, 1], + [18436, 0, "a"], + [18437, 0, "s"], + [18438, 0, " "], + [18439, 0, "o"], + [18440, 0, "p"], + [18441, 0, "e"], + [18442, 0, "r"], + [18443, 0, "a"], + [18444, 0, "t"], + [18445, 0, "i"], + [18446, 0, "o"], + [18447, 0, "n"], + [18448, 0, " "], + [18449, 0, "i"], + [18450, 0, "d"], + [18451, 0, "e"], + [18452, 0, "n"], + [18453, 0, "t"], + [18454, 0, "i"], + [18455, 0, "f"], + [18456, 0, "i"], + [18457, 0, "e"], + [18458, 0, "r"], + [18459, 0, "s"], + [18460, 0, ","], + [18461, 0, " "], + [18388, 0, " "], + [18388, 0, "I"], + [18389, 0, "n"], + [18390, 0, " "], + [18391, 0, "o"], + [18392, 0, "r"], + [18393, 0, "d"], + [18394, 0, "e"], + [18395, 0, "r"], + [18396, 0, " "], + [18397, 0, "t"], + [18398, 0, "o"], + [18399, 0, " "], + [18400, 0, "g"], + [18401, 0, "e"], + [18402, 0, "n"], + [18403, 0, "e"], + [18404, 0, "r"], + [18405, 0, "q"], + [18405, 1], + [18405, 0, "a"], + [18406, 0, "t"], + [18407, 0, "e"], + [18408, 0, " "], + [18409, 0, "g"], + [18410, 0, "l"], + [18411, 0, "o"], + [18412, 0, "b"], + [18413, 0, "a"], + [18414, 0, "l"], + [18415, 0, "l"], + [18416, 0, "y"], + [18417, 0, " "], + [18418, 0, "u"], + [18419, 0, "n"], + [18420, 0, "i"], + [18421, 0, "q"], + [18422, 0, "u"], + [18423, 0, "e"], + [18424, 0, " "], + [18425, 0, "o"], + [18426, 0, "p"], + [18427, 0, "e"], + [18428, 0, "r"], + [18429, 0, "a"], + [18430, 0, "t"], + [18431, 0, "i"], + [18432, 0, "o"], + [18433, 0, "n"], + [18434, 0, " "], + [18435, 0, "i"], + [18436, 0, "d"], + [18437, 0, "e"], + [18438, 0, "n"], + [18439, 0, "t"], + [18440, 0, "i"], + [18441, 0, "f"], + [18442, 0, "i"], + [18443, 0, "e"], + [18444, 0, "r"], + [18445, 0, "s"], + [18446, 0, " "], + [18447, 0, "w"], + [18448, 0, "i"], + [18449, 0, "t"], + [18450, 0, "h"], + [18451, 0, "o"], + [18452, 0, "u"], + [18453, 0, "t"], + [18454, 0, " "], + [18455, 0, "s"], + [18456, 0, "y"], + [18457, 0, "n"], + [18458, 0, "c"], + [18459, 0, "h"], + [18460, 0, "r"], + [18461, 0, "o"], + [18462, 0, "n"], + [18463, 0, "i"], + [18464, 0, "z"], + [18465, 0, "a"], + [18466, 0, "t"], + [18467, 0, "i"], + [18468, 0, "o"], + [18469, 0, "n"], + [18470, 0, " "], + [18471, 0, "b"], + [18472, 0, "e"], + [18473, 0, "t"], + [18474, 0, "w"], + [18475, 0, "e"], + [18476, 0, "e"], + [18477, 0, "n"], + [18478, 0, " "], + [18479, 0, "p"], + [18480, 0, "e"], + [18481, 0, "e"], + [18482, 0, "r"], + [18483, 0, "s"], + [18484, 0, ","], + [18469, 1], + [18468, 1], + [18467, 1], + [18466, 1], + [18465, 1], + [18464, 1], + [18463, 1], + [18462, 1], + [18462, 0, "n"], + [18463, 0, "o"], + [18464, 0, "u"], + [18465, 0, "s"], + [18466, 0, " "], + [18467, 0, "c"], + [18468, 0, "o"], + [18469, 0, "o"], + [18470, 0, "r"], + [18471, 0, "d"], + [18472, 0, "i"], + [18473, 0, "n"], + [18474, 0, "a"], + [18475, 0, "t"], + [18476, 0, "i"], + [18477, 0, "o"], + [18478, 0, "n"], + [18455, 0, "r"], + [18456, 0, "e"], + [18457, 0, "q"], + [18458, 0, "u"], + [18459, 0, "i"], + [18460, 0, "r"], + [18461, 0, "i"], + [18462, 0, "n"], + [18463, 0, "g"], + [18464, 0, " "], + [18503, 1], + [18504, 1], + [18504, 0, "w"], + [18577, 1], + [18576, 1], + [18575, 1], + [18574, 1], + [18573, 1], + [18572, 1], + [18571, 1], + [18570, 1], + [18569, 1], + [18568, 1], + [18567, 1], + [18566, 1], + [18565, 1], + [18564, 1], + [18563, 1], + [18562, 1], + [18561, 1], + [18560, 1], + [18559, 1], + [18558, 1], + [18557, 1], + [18556, 1], + [18555, 1], + [18554, 1], + [18553, 1], + [18552, 1], + [18551, 1], + [18550, 1], + [18550, 0, "}"], + [18551, 0, "."], + [18922, 0, " "], + [18923, 0, "("], + [18924, 0, "f"], + [18925, 0, "o"], + [18926, 0, "r"], + [18927, 0, " "], + [18928, 0, "e"], + [18929, 0, "x"], + [18930, 0, "a"], + [18931, 0, "m"], + [18932, 0, "p"], + [18933, 0, "l"], + [18934, 0, "e"], + [18935, 0, ","], + [18936, 0, " "], + [18937, 0, "t"], + [18938, 0, "h"], + [18939, 0, "e"], + [18940, 0, " "], + [18941, 0, "h"], + [18942, 0, "a"], + [18943, 0, "s"], + [18944, 0, "h"], + [18945, 0, " "], + [18946, 0, "o"], + [18947, 0, "f"], + [18948, 0, " "], + [18949, 0, "i"], + [18950, 0, "t"], + [18951, 0, "s"], + [18952, 0, " "], + [18953, 0, "p"], + [18954, 0, "u"], + [18955, 0, "b"], + [18956, 0, "l"], + [18957, 0, "i"], + [18958, 0, "c"], + [18959, 0, " "], + [18960, 0, "k"], + [18961, 0, "e"], + [18962, 0, "y"], + [18963, 0, ")"], + [18939, 1], + [18938, 1], + [18937, 1], + [18936, 1], + [18936, 0, " "], + [18937, 0, "a"], + [18938, 0, " "], + [18939, 0, "c"], + [18940, 0, "r"], + [18941, 0, "y"], + [18942, 0, "p"], + [18943, 0, "t"], + [18944, 0, "o"], + [18945, 0, "g"], + [18946, 0, "r"], + [18947, 0, "a"], + [18948, 0, "p"], + [18949, 0, "h"], + [18950, 0, "i"], + [18951, 0, "c"], + [18810, 1], + [18809, 1], + [18808, 1], + [18807, 1], + [18806, 1], + [18805, 1], + [18804, 1], + [18803, 1], + [18802, 1], + [18801, 1], + [18800, 1], + [18799, 1], + [18798, 1], + [18797, 1], + [18796, 1], + [18795, 1], + [18794, 1], + [18793, 1], + [18792, 1], + [18791, 1], + [18790, 1], + [18789, 1], + [18788, 1], + [18787, 1], + [18786, 1], + [18785, 1], + [18784, 1], + [18783, 1], + [18782, 1], + [18781, 1], + [18780, 1], + [18779, 1], + [18778, 1], + [18777, 1], + [18776, 1], + [18775, 1], + [18774, 1], + [18773, 1], + [18772, 1], + [18771, 1], + [18770, 1], + [18769, 1], + [18768, 1], + [18767, 1], + [18766, 1], + [18765, 1], + [18764, 1], + [18763, 1], + [18762, 1], + [18761, 1], + [18760, 1], + [18759, 1], + [18758, 1], + [18757, 1], + [18756, 1], + [18755, 1], + [18754, 1], + [18753, 1], + [18752, 1], + [18751, 1], + [18750, 1], + [18749, 1], + [18748, 1], + [18747, 1], + [18746, 1], + [18745, 1], + [18744, 1], + [18743, 1], + [18742, 1], + [18741, 1], + [18740, 1], + [18739, 1], + [18738, 1], + [18737, 1], + [18736, 1], + [18735, 1], + [18734, 1], + [18733, 1], + [18732, 1], + [18731, 1], + [18730, 1], + [18729, 1], + [18728, 1], + [18727, 1], + [18726, 1], + [18725, 1], + [18724, 1], + [18723, 1], + [18722, 1], + [18721, 1], + [18720, 1], + [18719, 1], + [18718, 1], + [18717, 1], + [18716, 1], + [18715, 1], + [18714, 1], + [18713, 1], + [18712, 1], + [18711, 1], + [18710, 1], + [18709, 1], + [18708, 1], + [18707, 1], + [18706, 1], + [18705, 1], + [18704, 1], + [18703, 1], + [18702, 1], + [18701, 1], + [18700, 1], + [18699, 1], + [18698, 1], + [18697, 1], + [18696, 1], + [18695, 1], + [18694, 1], + [18693, 1], + [18692, 1], + [18691, 1], + [18690, 1], + [18689, 1], + [18688, 1], + [18687, 1], + [18686, 1], + [18685, 1], + [18684, 1], + [18683, 1], + [18682, 1], + [18681, 1], + [18680, 1], + [18679, 1], + [18678, 1], + [18677, 1], + [18676, 1], + [18675, 1], + [18674, 1], + [18673, 1], + [18672, 1], + [18671, 1], + [18670, 1], + [18669, 1], + [18668, 1], + [18667, 1], + [18666, 1], + [18665, 1], + [18664, 1], + [18663, 1], + [18662, 1], + [18661, 1], + [18660, 1], + [18659, 1], + [18658, 1], + [18657, 1], + [18656, 1], + [18655, 1], + [18654, 1], + [18653, 1], + [18652, 1], + [18651, 1], + [18650, 1], + [18649, 1], + [18648, 1], + [18647, 1], + [18646, 1], + [18645, 1], + [18644, 1], + [18643, 1], + [18642, 1], + [18641, 1], + [18640, 1], + [18639, 1], + [18638, 1], + [18637, 1], + [18636, 1], + [18635, 1], + [18634, 1], + [18633, 1], + [18632, 1], + [18631, 1], + [18630, 1], + [18629, 1], + [18628, 1], + [18627, 1], + [18626, 1], + [18625, 1], + [18624, 1], + [18623, 1], + [18622, 1], + [18621, 1], + [18620, 1], + [18619, 1], + [18618, 1], + [18617, 1], + [18616, 1], + [18615, 1], + [18614, 1], + [18613, 1], + [18612, 1], + [18611, 1], + [18610, 1], + [18609, 1], + [18608, 1], + [18607, 1], + [18606, 1], + [18605, 1], + [18604, 1], + [18603, 1], + [18602, 1], + [18601, 1], + [18600, 1], + [18599, 1], + [18598, 1], + [18597, 1], + [18596, 1], + [18595, 1], + [18594, 1], + [18593, 1], + [18592, 1], + [18591, 1], + [18590, 1], + [18589, 1], + [18588, 1], + [18587, 1], + [18586, 1], + [18585, 1], + [18584, 1], + [18583, 1], + [18582, 1], + [18581, 1], + [18580, 1], + [18579, 1], + [18578, 1], + [18577, 1], + [18576, 1], + [18575, 1], + [18574, 1], + [18573, 1], + [18572, 1], + [18571, 1], + [18570, 1], + [18569, 1], + [18568, 1], + [18567, 1], + [18566, 1], + [18565, 1], + [18564, 1], + [18563, 1], + [18562, 1], + [18561, 1], + [18560, 1], + [18559, 1], + [18558, 1], + [18557, 1], + [18556, 1], + [18555, 1], + [18554, 1], + [18553, 1], + [18552, 1], + [18552, 0, " "], + [18718, 1], + [18718, 0, ","], + [18719, 0, " "], + [18720, 0, "a"], + [18721, 0, "n"], + [18722, 0, "d"], + [18928, 1], + [18927, 1], + [18926, 1], + [18925, 1], + [18924, 1], + [18923, 1], + [18922, 1], + [18921, 1], + [18920, 1], + [18919, 1], + [18918, 1], + [18917, 1], + [18916, 1], + [18915, 1], + [18914, 1], + [18913, 1], + [18912, 1], + [18911, 1], + [18910, 1], + [18909, 1], + [18908, 1], + [18907, 1], + [18906, 1], + [18905, 1], + [18904, 1], + [18903, 1], + [18902, 1], + [18901, 1], + [18900, 1], + [18899, 1], + [18898, 1], + [18897, 1], + [18896, 1], + [18895, 1], + [18894, 1], + [18893, 1], + [18892, 1], + [18891, 1], + [18890, 1], + [18889, 1], + [18888, 1], + [18887, 1], + [18886, 1], + [18885, 1], + [18884, 1], + [18883, 1], + [18882, 1], + [18881, 1], + [18880, 1], + [18879, 1], + [18878, 1], + [18877, 1], + [18876, 1], + [18875, 1], + [18874, 1], + [18873, 1], + [18872, 1], + [18871, 1], + [18870, 1], + [18869, 1], + [18868, 1], + [18867, 1], + [18866, 1], + [18865, 1], + [18864, 1], + [18863, 1], + [18862, 1], + [18861, 1], + [18860, 1], + [18859, 1], + [18858, 1], + [18857, 1], + [18856, 1], + [18855, 1], + [18854, 1], + [18853, 1], + [18852, 1], + [18851, 1], + [18850, 1], + [18849, 1], + [18848, 1], + [18847, 1], + [18846, 1], + [18845, 1], + [18844, 1], + [18843, 1], + [18842, 1], + [18841, 1], + [18840, 1], + [18839, 1], + [18838, 1], + [18837, 1], + [18836, 1], + [18835, 1], + [18834, 1], + [18833, 1], + [18832, 1], + [18831, 1], + [18830, 1], + [18829, 1], + [18828, 1], + [18827, 1], + [18826, 1], + [18825, 1], + [18824, 1], + [18823, 1], + [18822, 1], + [18821, 1], + [18820, 1], + [18819, 1], + [18818, 1], + [18817, 1], + [18816, 1], + [18815, 1], + [18814, 1], + [18813, 1], + [18812, 1], + [18811, 1], + [18810, 1], + [18809, 1], + [18808, 1], + [18807, 1], + [18806, 1], + [18806, 0, "S"], + [18807, 0, "i"], + [18808, 0, "n"], + [18809, 0, "c"], + [18810, 0, "e"], + [18811, 0, " "], + [18812, 0, "e"], + [18813, 0, "a"], + [18814, 0, "c"], + [18815, 0, "h"], + [18816, 0, " "], + [18817, 0, "p"], + [18818, 0, "e"], + [18819, 0, "e"], + [18820, 0, "r"], + [18821, 0, " "], + [18822, 0, "g"], + [18823, 0, "e"], + [18824, 0, "n"], + [18825, 0, "e"], + [18826, 0, "r"], + [18827, 0, "a"], + [18828, 0, "t"], + [18829, 0, "e"], + [18830, 0, "s"], + [18831, 0, " "], + [18832, 0, "a"], + [18833, 0, " "], + [18834, 0, "s"], + [18835, 0, "t"], + [18836, 0, "r"], + [18837, 0, "i"], + [18838, 0, "c"], + [18839, 0, "t"], + [18840, 0, "l"], + [18841, 0, "y"], + [18842, 0, " "], + [18843, 0, "m"], + [18844, 0, "o"], + [18845, 0, "n"], + [18846, 0, "o"], + [18847, 0, "t"], + [18848, 0, "o"], + [18849, 0, "n"], + [18850, 0, "i"], + [18851, 0, "c"], + [18852, 0, "a"], + [18853, 0, "l"], + [18854, 0, "l"], + [18855, 0, "y"], + [18856, 0, " "], + [18857, 0, "i"], + [18858, 0, "n"], + [18859, 0, "c"], + [18860, 0, "r"], + [18861, 0, "e"], + [18862, 0, "a"], + [18863, 0, "s"], + [18864, 0, "i"], + [18865, 0, "n"], + [18866, 0, "g"], + [18867, 0, " "], + [18868, 0, "s"], + [18869, 0, "e"], + [18870, 0, "q"], + [18871, 0, "u"], + [18872, 0, "e"], + [18873, 0, "n"], + [18874, 0, "c"], + [18875, 0, "e"], + [18876, 0, " "], + [18877, 0, "o"], + [18878, 0, "f"], + [18879, 0, " "], + [18880, 0, "c"], + [18881, 0, "o"], + [18882, 0, "u"], + [18883, 0, "n"], + [18884, 0, "t"], + [18885, 0, "e"], + [18886, 0, "r"], + [18887, 0, " "], + [18888, 0, "v"], + [18889, 0, "a"], + [18890, 0, "l"], + [18891, 0, "u"], + [18892, 0, "e"], + [18893, 0, "s"], + [18894, 0, " "], + [18895, 0, "$"], + [18896, 0, "c"], + [18897, 0, "$"], + [18898, 0, ","], + [18899, 0, " "], + [18900, 0, "t"], + [18901, 0, "h"], + [18902, 0, "e"], + [18903, 0, " "], + [18904, 0, "p"], + [18905, 0, "a"], + [18906, 0, "i"], + [18907, 0, "r"], + [18908, 0, " "], + [18909, 0, "$"], + [18910, 0, "("], + [18911, 0, "c"], + [18912, 0, ","], + [18913, 0, " "], + [18914, 0, "p"], + [18915, 0, ")"], + [18916, 0, "$"], + [18917, 0, " "], + [18918, 0, "i"], + [18919, 0, "s"], + [18920, 0, " "], + [18921, 0, "u"], + [18922, 0, "n"], + [18923, 0, "i"], + [18924, 0, "q"], + [18925, 0, "u"], + [18926, 0, "e"], + [18927, 0, "."], + [19452, 1], + [19452, 1], + [19452, 0, "\\"], + [19453, 0, "["], + [19454, 0, " "], + [19543, 1], + [19542, 1], + [19542, 0, " "], + [19543, 0, "\\"], + [19544, 0, "]"], + [19773, 0, " "], + [19774, 0, "T"], + [19775, 0, "h"], + [19776, 0, "i"], + [19777, 0, "s"], + [19778, 0, " "], + [19779, 0, "o"], + [19780, 0, "r"], + [19781, 0, "d"], + [19782, 0, "e"], + [19783, 0, "r"], + [19784, 0, "i"], + [19785, 0, "n"], + [19786, 0, "g"], + [19787, 0, " "], + [19788, 0, "p"], + [19789, 0, "r"], + [19790, 0, "o"], + [19791, 0, "p"], + [19792, 0, "e"], + [19793, 0, "r"], + [19794, 0, "t"], + [19795, 0, "y"], + [19796, 0, " "], + [19797, 0, "i"], + [19798, 0, "s"], + [19799, 0, " "], + [19800, 0, "i"], + [19801, 0, "m"], + [19802, 0, "p"], + [19803, 0, "o"], + [19804, 0, "r"], + [19805, 0, "t"], + [19806, 0, "a"], + [19807, 0, "n"], + [19808, 0, "t"], + [19809, 0, " "], + [19810, 0, "f"], + [19811, 0, "o"], + [19812, 0, "r"], + [19813, 0, " "], + [19814, 0, "o"], + [19815, 0, "u"], + [19816, 0, "r"], + [19817, 0, " "], + [19818, 0, "d"], + [19819, 0, "e"], + [19820, 0, "f"], + [19821, 0, "i"], + [19822, 0, "n"], + [19823, 0, "i"], + [19824, 0, "t"], + [19825, 0, "i"], + [19826, 0, "o"], + [19827, 0, "n"], + [19828, 0, " "], + [19829, 0, "o"], + [19830, 0, "f"], + [19831, 0, " "], + [19832, 0, "t"], + [19833, 0, "h"], + [19834, 0, "e"], + [19835, 0, " "], + [19836, 0, "s"], + [19837, 0, "e"], + [19838, 0, "m"], + [19839, 0, "a"], + [19840, 0, "n"], + [19841, 0, "t"], + [19842, 0, "i"], + [19843, 0, "c"], + [19844, 0, "s"], + [19845, 0, " "], + [19846, 0, "o"], + [19847, 0, "f"], + [19848, 0, " "], + [19849, 0, "o"], + [19850, 0, "r"], + [19851, 0, "d"], + [19852, 0, "e"], + [19853, 0, "r"], + [19854, 0, "e"], + [19855, 0, "d"], + [19856, 0, " "], + [19857, 0, "l"], + [19858, 0, "i"], + [19859, 0, "s"], + [19860, 0, "t"], + [19861, 0, "s"], + [19862, 0, "."], + [17919, 1], + [17918, 1], + [17917, 1], + [17916, 1], + [17915, 1], + [17915, 0, "p"], + [17916, 0, "e"], + [17917, 0, "e"], + [17918, 0, "r"], + [17919, 0, "s"], + [24283, 0, "\n"], + [24284, 0, "\\"], + [24285, 0, "i"], + [24286, 0, "f"], + [24287, 0, "p"], + [24288, 0, "r"], + [24289, 0, "o"], + [24290, 0, "o"], + [24291, 0, "f"], + [24292, 0, "d"], + [24293, 0, "r"], + [24294, 0, "a"], + [24295, 0, "f"], + [24296, 0, "t"], + [24297, 0, "\n"], + [24283, 0, "\n"], + [24284, 0, "\n"], + [37132, 0, "\n"], + [37133, 0, "\\"], + [37134, 0, "f"], + [37135, 0, "i"], + [37136, 0, " "], + [37137, 0, "%"], + [37138, 0, " "], + [37139, 0, "p"], + [37140, 0, "r"], + [37141, 0, "o"], + [37142, 0, "o"], + [37143, 0, "f"], + [37144, 0, "d"], + [37145, 0, "r"], + [37146, 0, "a"], + [37147, 0, "f"], + [37148, 0, "t"], + [37149, 0, "\n"], + [422, 0, "\n"], + [423, 0, "\n"], + [423, 0, "\\"], + [424, 0, "n"], + [425, 0, "e"], + [426, 0, "w"], + [427, 0, "i"], + [428, 0, "f"], + [429, 0, "\\"], + [430, 0, "i"], + [431, 0, "f"], + [432, 0, "p"], + [433, 0, "r"], + [434, 0, "o"], + [435, 0, "o"], + [436, 0, "f"], + [437, 0, "d"], + [438, 0, "r"], + [439, 0, "a"], + [440, 0, "f"], + [441, 0, "t"], + [442, 0, "\n"], + [443, 0, "\\"], + [444, 0, "p"], + [445, 0, "r"], + [446, 0, "o"], + [447, 0, "o"], + [448, 0, "f"], + [449, 0, "d"], + [450, 0, "r"], + [451, 0, "a"], + [452, 0, "f"], + [453, 0, "t"], + [454, 0, "f"], + [455, 0, "a"], + [456, 0, "l"], + [457, 0, "s"], + [458, 0, "e"], + [718, 0, "\n"], + [719, 0, "\n"], + [720, 0, "\\"], + [721, 0, "n"], + [722, 0, "e"], + [723, 0, "w"], + [724, 0, "c"], + [725, 0, "o"], + [726, 0, "m"], + [727, 0, "m"], + [728, 0, "a"], + [729, 0, "n"], + [730, 0, "d"], + [731, 0, "{"], + [732, 0, "\\"], + [733, 0, "m"], + [734, 0, "u"], + [735, 0, "l"], + [736, 0, "t"], + [737, 0, "i"], + [738, 0, "a"], + [739, 0, "l"], + [740, 0, "i"], + [741, 0, "g"], + [742, 0, "n"], + [743, 0, "}"], + [744, 0, "["], + [745, 0, "2"], + [746, 0, "]"], + [747, 0, "{"], + [748, 0, "%"], + [749, 0, "\n"], + [750, 0, " "], + [751, 0, " "], + [752, 0, "\\"], + [753, 0, "m"], + [754, 0, "u"], + [755, 0, "l"], + [756, 0, "t"], + [757, 0, "i"], + [758, 0, "s"], + [759, 0, "p"], + [760, 0, "a"], + [761, 0, "n"], + [762, 0, "{"], + [763, 0, "#"], + [764, 0, "1"], + [765, 0, "}"], + [766, 0, "\\"], + [767, 0, "m"], + [768, 0, "b"], + [769, 0, "o"], + [770, 0, "x"], + [771, 0, "{"], + [772, 0, "$"], + [773, 0, "\\"], + [774, 0, "d"], + [775, 0, "i"], + [776, 0, "s"], + [777, 0, "p"], + [778, 0, "l"], + [779, 0, "a"], + [780, 0, "y"], + [781, 0, "s"], + [782, 0, "t"], + [783, 0, "y"], + [784, 0, "l"], + [785, 0, "e"], + [786, 0, "{"], + [787, 0, "}"], + [788, 0, "#"], + [789, 0, "2"], + [790, 0, "$"], + [791, 0, "}"], + [792, 0, "%"], + [793, 0, "\n"], + [794, 0, "}"], + [7788, 1], + [7787, 1], + [7786, 1], + [7785, 1], + [7784, 1], + [7783, 1], + [7782, 1], + [7781, 1], + [7780, 1], + [7779, 1], + [7778, 1], + [7777, 1], + [7776, 1], + [7775, 1], + [7774, 1], + [7773, 1], + [7772, 1], + [7771, 1], + [7770, 1], + [7769, 1], + [7768, 1], + [7767, 1], + [7766, 1], + [7765, 1], + [7764, 1], + [7763, 1], + [7762, 1], + [7761, 1], + [7760, 1], + [7759, 1], + [7758, 1], + [7757, 1], + [7756, 1], + [7755, 1], + [7754, 1], + [7753, 1], + [7752, 1], + [7751, 1], + [7750, 1], + [7749, 1], + [7748, 1], + [7747, 1], + [7746, 1], + [7745, 1], + [7744, 1], + [7743, 1], + [7742, 1], + [7741, 1], + [7740, 1], + [7739, 1], + [7738, 1], + [7737, 1], + [7736, 1], + [7735, 1], + [7734, 1], + [7733, 1], + [7732, 1], + [7731, 1], + [7730, 1], + [7729, 1], + [7728, 1], + [7727, 1], + [7726, 1], + [7725, 1], + [7724, 1], + [7723, 1], + [7722, 1], + [7721, 1], + [7720, 1], + [7719, 1], + [7718, 1], + [7717, 1], + [7716, 1], + [7715, 1], + [7714, 1], + [7713, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4295, 1], + [4316, 0, "\n"], + [4316, 0, "l"], + [4317, 0, "e"], + [4318, 0, "t"], + [4319, 0, " "], + [4320, 0, "e"], + [4321, 0, "g"], + [4322, 0, "g"], + [4323, 0, "s"], + [4324, 0, " "], + [4325, 0, "="], + [4326, 0, " "], + [4327, 0, "l"], + [4328, 0, "i"], + [4329, 0, "s"], + [4330, 0, "t"], + [4331, 0, "."], + [4332, 0, "n"], + [4333, 0, "e"], + [4334, 0, "x"], + [4335, 0, "t"], + [4336, 0, ";"], + [6399, 1], + [6399, 1], + [6399, 1], + [6399, 1], + [6399, 1], + [6420, 0, " "], + [6421, 0, "t"], + [6422, 0, "h"], + [6423, 0, "a"], + [6424, 0, "t"], + [6437, 1], + [6436, 1], + [6435, 1], + [6435, 0, "s"], + [6924, 0, "."], + [6925, 0, " "], + [6925, 1], + [6924, 1], + [6925, 0, " "], + [6926, 0, "o"], + [6927, 0, "r"], + [6928, 0, " "], + [6929, 0, "a"], + [6930, 0, "t"], + [6931, 0, " "], + [6932, 0, "t"], + [6933, 0, "h"], + [6934, 0, "e"], + [6935, 0, " "], + [6936, 0, "h"], + [6937, 0, "e"], + [6938, 0, "a"], + [6939, 0, "d"], + [6940, 0, " "], + [6941, 0, "i"], + [6942, 0, "f"], + [6943, 0, " "], + [6944, 0, "t"], + [6945, 0, "h"], + [6946, 0, "e"], + [6947, 0, " "], + [6948, 0, "c"], + [6949, 0, "u"], + [6950, 0, "r"], + [6951, 0, "s"], + [6952, 0, "o"], + [6953, 0, "r"], + [6954, 0, " "], + [6955, 0, "i"], + [6956, 0, "s"], + [6957, 0, " "], + [6958, 0, "a"], + [6959, 0, "t"], + [6960, 0, " "], + [6961, 0, "t"], + [6962, 0, "h"], + [6963, 0, "e"], + [6964, 0, " "], + [6965, 0, "h"], + [6966, 0, "e"], + [6967, 0, "a"], + [6968, 0, "d"], + [6969, 0, " "], + [6970, 0, "o"], + [6971, 0, "f"], + [6972, 0, " "], + [6973, 0, "t"], + [6974, 0, "h"], + [6975, 0, "e"], + [6976, 0, " "], + [6977, 0, "l"], + [6978, 0, "i"], + [6979, 0, "s"], + [6980, 0, "t"], + [6981, 0, "."], + [6982, 0, " "], + [6983, 0, "T"], + [6984, 0, "h"], + [6985, 0, "e"], + [6986, 0, " "], + [6987, 0, "v"], + [6988, 0, "a"], + [6989, 0, "r"], + [6990, 0, "i"], + [6991, 0, "a"], + [6992, 0, "b"], + [6993, 0, "l"], + [6994, 0, "e"], + [6995, 0, " "], + [6996, 0, "\\"], + [6997, 0, "v"], + [6998, 0, "e"], + [6999, 0, "r"], + [7000, 0, "b"], + [7001, 0, "\""], + [7001, 1], + [7001, 0, "|"], + [7002, 0, "l"], + [7003, 0, "i"], + [7004, 0, "s"], + [7005, 0, "t"], + [7006, 0, "|"], + [7007, 0, " "], + [7008, 0, "r"], + [7009, 0, "e"], + [7010, 0, "f"], + [7011, 0, "e"], + [7012, 0, "r"], + [7013, 0, "s"], + [7014, 0, " "], + [7015, 0, "t"], + [7016, 0, "o"], + [7017, 0, " "], + [7018, 0, "t"], + [7019, 0, "h"], + [7020, 0, "e"], + [7021, 0, " "], + [7022, 0, "h"], + [7023, 0, "e"], + [7024, 0, "a"], + [7025, 0, "d"], + [7026, 0, ","], + [7027, 0, " "], + [7028, 0, "s"], + [7029, 0, "o"], + [7030, 0, " "], + [7031, 0, "c"], + [7032, 0, "h"], + [7033, 0, "e"], + [7034, 0, "e"], + [7035, 0, "s"], + [7036, 0, "e"], + [7037, 0, " "], + [7038, 0, "i"], + [7039, 0, "s"], + [7040, 0, " "], + [7041, 0, "i"], + [7042, 0, "n"], + [7043, 0, "s"], + [7044, 0, "e"], + [7045, 0, "r"], + [7046, 0, "t"], + [7047, 0, "e"], + [7048, 0, "d"], + [7049, 0, " "], + [7050, 0, "a"], + [7051, 0, "h"], + [7052, 0, "e"], + [7053, 0, "a"], + [7054, 0, "d"], + [7055, 0, " "], + [7056, 0, "o"], + [7057, 0, "f"], + [7058, 0, " "], + [7059, 0, "e"], + [7060, 0, "g"], + [7061, 0, "g"], + [7062, 0, "s"], + [7063, 0, ","], + [7064, 0, " "], + [7065, 0, "b"], + [7066, 0, "u"], + [7067, 0, "t"], + [7068, 0, " "], + [7069, 0, "t"], + [7070, 0, "h"], + [7071, 0, "e"], + [7072, 0, " "], + [7073, 0, "v"], + [7074, 0, "a"], + [7075, 0, "r"], + [7076, 0, "i"], + [7077, 0, "a"], + [7078, 0, "b"], + [7079, 0, "l"], + [7080, 0, "e"], + [7081, 0, " "], + [7082, 0, "\\"], + [7083, 0, "v"], + [7084, 0, "e"], + [7085, 0, "r"], + [7086, 0, "b"], + [7087, 0, "|"], + [7088, 0, "e"], + [7089, 0, "g"], + [7090, 0, "g"], + [7091, 0, "s"], + [7092, 0, "|"], + [7093, 0, " "], + [7094, 0, "r"], + [7095, 0, "e"], + [7096, 0, "f"], + [7097, 0, "e"], + [7098, 0, "r"], + [7099, 0, "s"], + [7100, 0, " "], + [7101, 0, "t"], + [7102, 0, "o"], + [7103, 0, " "], + [7104, 0, "t"], + [7105, 0, "h"], + [7106, 0, "e"], + [7107, 0, " "], + [7108, 0, "l"], + [7109, 0, "i"], + [7110, 0, "s"], + [7111, 0, "t"], + [7112, 0, " "], + [7113, 0, "e"], + [7114, 0, "l"], + [7115, 0, "e"], + [7116, 0, "m"], + [7117, 0, "e"], + [7118, 0, "n"], + [7119, 0, "t"], + [7120, 0, " "], + [7121, 0, "`"], + [7122, 0, "`"], + [7123, 0, "e"], + [7124, 0, "g"], + [7125, 0, "g"], + [7126, 0, "s"], + [7127, 0, "'"], + [7128, 0, "'"], + [7129, 0, ","], + [7130, 0, " "], + [7131, 0, "s"], + [7132, 0, "o"], + [7133, 0, " "], + [7134, 0, "m"], + [7135, 0, "i"], + [7136, 0, "l"], + [7137, 0, "k"], + [7138, 0, " "], + [7139, 0, "i"], + [7140, 0, "s"], + [7141, 0, " "], + [7142, 0, "i"], + [7143, 0, "n"], + [7144, 0, "s"], + [7145, 0, "e"], + [7146, 0, "r"], + [7147, 0, "t"], + [7148, 0, "e"], + [7149, 0, "d"], + [7150, 0, " "], + [7151, 0, "a"], + [7152, 0, "f"], + [7153, 0, "t"], + [7154, 0, "e"], + [7155, 0, "r"], + [7156, 0, " "], + [7157, 0, "e"], + [7158, 0, "g"], + [7159, 0, "g"], + [7160, 0, "s"], + [7161, 0, "."], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7162, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 1], + [7050, 0, "b"], + [7051, 0, "e"], + [7052, 0, "f"], + [7053, 0, "o"], + [7054, 0, "r"], + [7055, 0, "e"], + [3573, 1], + [3572, 1], + [3571, 1], + [3570, 1], + [3569, 1], + [3568, 1], + [3567, 1], + [3566, 1], + [3565, 1], + [3564, 1], + [3563, 1], + [3562, 1], + [3561, 1], + [3560, 1], + [3559, 1], + [3558, 1], + [3557, 1], + [3556, 1], + [3555, 1], + [3554, 1], + [3553, 1], + [3552, 1], + [3551, 1], + [3550, 1], + [3549, 1], + [3548, 1], + [3547, 1], + [3546, 1], + [3545, 1], + [3544, 1], + [3543, 1], + [3542, 1], + [3541, 1], + [3540, 1], + [3539, 1], + [3538, 1], + [3537, 1], + [3536, 1], + [3535, 1], + [3534, 1], + [3533, 1], + [3532, 1], + [3531, 1], + [3530, 1], + [3529, 1], + [3528, 1], + [3527, 1], + [3526, 1], + [3525, 1], + [3524, 1], + [3523, 1], + [3522, 1], + [3521, 1], + [3520, 1], + [3519, 1], + [3518, 1], + [3517, 1], + [3516, 1], + [3515, 1], + [3514, 1], + [3513, 1], + [3512, 1], + [3511, 1], + [3510, 1], + [3509, 1], + [2848, 1], + [2847, 1], + [2846, 1], + [2845, 1], + [2844, 1], + [2843, 1], + [2842, 1], + [2841, 1], + [2840, 1], + [2839, 1], + [2838, 1], + [2837, 1], + [2836, 1], + [2835, 1], + [2834, 1], + [2833, 1], + [2832, 1], + [2831, 1], + [2830, 1], + [2829, 1], + [2828, 1], + [2827, 1], + [2826, 1], + [2825, 1], + [2824, 1], + [2823, 1], + [2822, 1], + [2821, 1], + [2820, 1], + [2819, 1], + [2818, 1], + [2817, 1], + [2816, 1], + [2815, 1], + [2814, 1], + [2813, 1], + [2812, 1], + [2811, 1], + [2810, 1], + [2809, 1], + [2808, 1], + [2807, 1], + [2806, 1], + [2805, 1], + [2804, 1], + [2803, 1], + [2802, 1], + [2801, 1], + [2800, 1], + [2799, 1], + [2798, 1], + [2797, 1], + [2796, 1], + [2795, 1], + [2794, 1], + [2793, 1], + [2792, 1], + [2791, 1], + [2790, 1], + [2789, 1], + [2788, 1], + [2787, 1], + [2786, 1], + [2785, 1], + [2784, 1], + [2783, 1], + [2782, 1], + [2781, 1], + [2780, 1], + [2779, 1], + [2778, 1], + [2777, 1], + [2776, 1], + [2775, 1], + [2774, 1], + [2773, 1], + [2772, 1], + [2771, 1], + [2770, 1], + [2769, 1], + [2768, 1], + [2767, 1], + [2766, 1], + [2765, 1], + [2764, 1], + [2763, 1], + [2762, 1], + [2761, 1], + [2760, 1], + [2759, 1], + [2758, 1], + [2757, 1], + [2756, 1], + [2755, 1], + [2754, 1], + [2753, 1], + [2752, 1], + [2751, 1], + [2750, 1], + [2749, 1], + [2748, 1], + [2747, 1], + [2746, 1], + [2745, 1], + [2744, 1], + [2743, 1], + [2742, 1], + [2741, 1], + [2740, 1], + [2739, 1], + [2738, 1], + [2737, 1], + [2736, 1], + [2735, 1], + [2734, 1], + [2733, 1], + [2732, 1], + [2731, 1], + [2730, 1], + [2729, 1], + [2728, 1], + [2727, 1], + [2726, 1], + [2725, 1], + [2724, 1], + [2723, 1], + [2722, 1], + [2721, 1], + [2720, 1], + [2719, 1], + [2718, 1], + [2717, 1], + [2716, 1], + [2715, 1], + [2714, 1], + [2713, 1], + [2712, 1], + [2711, 1], + [2710, 1], + [2709, 1], + [2708, 1], + [2707, 1], + [2706, 1], + [2705, 1], + [2704, 1], + [2703, 1], + [2702, 1], + [2701, 1], + [2700, 1], + [2699, 1], + [2698, 1], + [2697, 1], + [2696, 1], + [2695, 1], + [2694, 1], + [2693, 1], + [2692, 1], + [2833, 1], + [2833, 1], + [2833, 1], + [2833, 1], + [2833, 1], + [2833, 1], + [2833, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [2842, 1], + [3055, 0, " "], + [3056, 0, "O"], + [3057, 0, "t"], + [3058, 0, "h"], + [3059, 0, "e"], + [3060, 0, "r"], + [3061, 0, " "], + [3062, 0, "r"], + [3063, 0, "e"], + [3064, 0, "p"], + [3065, 0, "l"], + [3066, 0, "i"], + [3067, 0, "c"], + [3068, 0, "a"], + [3069, 0, "t"], + [3070, 0, "e"], + [3071, 0, "d"], + [3072, 0, " "], + [3073, 0, "d"], + [3074, 0, "a"], + [3075, 0, "t"], + [3076, 0, "a"], + [3077, 0, "t"], + [3078, 0, "y"], + [3079, 0, "p"], + [3080, 0, "e"], + [3081, 0, "s"], + [3082, 0, " "], + [3083, 0, "s"], + [3084, 0, "u"], + [3085, 0, "c"], + [3086, 0, "h"], + [3087, 0, " "], + [3088, 0, "a"], + [3089, 0, "s"], + [3090, 0, " "], + [3091, 0, "c"], + [3092, 0, "o"], + [3093, 0, "u"], + [3094, 0, "n"], + [3095, 0, "t"], + [3096, 0, "e"], + [3097, 0, "r"], + [3098, 0, "s"], + [3099, 0, " "], + [3100, 0, "o"], + [3101, 0, "r"], + [3102, 0, " "], + [3103, 0, "s"], + [3104, 0, "e"], + [3105, 0, "t"], + [3106, 0, "s"], + [3107, 0, " "], + [3056, 0, "O"], + [3057, 0, "u"], + [3058, 0, "r"], + [3059, 0, " "], + [3060, 0, "a"], + [3061, 0, "p"], + [3062, 0, "p"], + [3063, 0, "r"], + [3064, 0, "o"], + [3065, 0, "a"], + [3066, 0, "c"], + [3067, 0, "h"], + [3068, 0, " "], + [3069, 0, "a"], + [3070, 0, "l"], + [3071, 0, "s"], + [3072, 0, "o"], + [3073, 0, " "], + [3074, 0, "g"], + [3075, 0, "e"], + [3076, 0, "n"], + [3077, 0, "e"], + [3078, 0, "r"], + [3079, 0, "a"], + [3080, 0, "l"], + [3081, 0, "i"], + [3082, 0, "z"], + [3083, 0, "e"], + [3084, 0, "s"], + [3085, 0, " "], + [3086, 0, "t"], + [3087, 0, "o"], + [3088, 0, " "], + [3089, 1], + [3089, 0, "o"], + [3073, 0, " "], + [3074, 0, "e"], + [3075, 0, "a"], + [3076, 0, "s"], + [3077, 0, "i"], + [3078, 0, "l"], + [3079, 0, "y"], + [3147, 1], + [3147, 0, ","], + [3148, 0, " "], + [3149, 0, "w"], + [3150, 0, "h"], + [3151, 0, "i"], + [3152, 0, "c"], + [3153, 0, "h"], + [3154, 0, " "], + [3155, 0, "w"], + [3156, 0, "e"], + [3157, 0, " "], + [3158, 0, "d"], + [3159, 0, "o"], + [3160, 0, " "], + [3161, 0, "n"], + [3162, 0, "o"], + [3163, 0, "t"], + [3164, 0, " "], + [3165, 0, "s"], + [3166, 0, "p"], + [3167, 0, "e"], + [3168, 0, "l"], + [3169, 0, "l"], + [3170, 0, " "], + [3171, 0, "o"], + [3172, 0, "u"], + [3173, 0, "t"], + [3174, 0, " "], + [3175, 0, "i"], + [3176, 0, "n"], + [3177, 0, " "], + [3178, 0, "d"], + [3179, 0, "e"], + [3180, 0, "t"], + [3181, 0, "a"], + [3182, 0, "i"], + [3183, 0, "l"], + [3184, 0, " "], + [3185, 0, "i"], + [3186, 0, "n"], + [3187, 0, " "], + [3188, 0, "t"], + [3189, 0, "h"], + [3190, 0, "e"], + [3191, 0, " "], + [3192, 0, "i"], + [3193, 0, "n"], + [3194, 0, "t"], + [3195, 0, "e"], + [3196, 0, "r"], + [3197, 0, "e"], + [3198, 0, "s"], + [3199, 0, "t"], + [3200, 0, "s"], + [3201, 0, " "], + [3202, 0, "o"], + [3203, 0, "f"], + [3204, 0, " "], + [3205, 0, "b"], + [3206, 0, "r"], + [3207, 0, "e"], + [3208, 0, "v"], + [3209, 0, "i"], + [3210, 0, "t"], + [3211, 0, "y"], + [3212, 0, "."], + [3200, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [5647, 1], + [6051, 0, "o"], + [6052, 0, "r"], + [6053, 0, " "], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [6115, 1], + [3884, 1], + [3883, 1], + [3883, 0, "r"], + [3884, 0, "m"], + [3886, 1], + [3886, 0, "N"], + [3887, 0, "u"], + [3888, 0, "m"], + [3889, 0, "b"], + [3890, 0, "e"], + [3891, 0, "r"], + [3958, 0, "\n"], + [3959, 0, "&"], + [3960, 0, " "], + [3961, 0, "$"], + [3962, 0, "|"], + [3963, 0, "$"], + [3964, 0, " "], + [3965, 0, "&"], + [3966, 0, " "], + [3967, 0, "\\"], + [3968, 0, "v"], + [3969, 0, "e"], + [3970, 0, "r"], + [3971, 0, "b"], + [3972, 0, "|"], + [3973, 0, "t"], + [3974, 0, "r"], + [3975, 0, "u"], + [3976, 0, "e"], + [3977, 0, "|"], + [3978, 0, " "], + [3979, 0, "$"], + [3980, 0, "|"], + [3981, 0, "$"], + [3982, 0, " "], + [3983, 0, "\\"], + [3984, 0, "v"], + [3985, 0, "e"], + [3986, 0, "r"], + [3987, 0, "b"], + [3988, 0, "|"], + [3989, 0, "f"], + [3990, 0, "a"], + [3991, 0, "l"], + [3992, 0, "s"], + [3993, 0, "e"], + [3994, 0, " "], + [3995, 0, "$"], + [3996, 0, "|"], + [3997, 0, "$"], + [3994, 0, "|"], + [3999, 0, " "], + [4000, 0, "\\"], + [4001, 0, "v"], + [4002, 0, "e"], + [4003, 0, "r"], + [4004, 0, "b"], + [4005, 0, "|"], + [4006, 0, "n"], + [4007, 0, "u"], + [4008, 0, "l"], + [4009, 0, "l"], + [4010, 0, " "], + [4011, 0, "\\"], + [4012, 0, "\\"], + [4010, 0, "|"], + [4042, 1], + [4041, 1], + [4036, 1], + [4035, 1], + [4034, 1], + [4033, 1], + [4032, 1], + [7282, 1], + [7281, 1], + [7280, 1], + [7279, 1], + [7278, 1], + [7277, 1], + [7277, 0, "p"], + [7278, 0, "u"], + [7279, 0, "t"], + [7290, 0, "-"], + [7291, 0, "v"], + [7292, 0, "a"], + [7293, 0, "l"], + [7294, 0, "u"], + [7295, 0, "e"], + [7296, 0, " "], + [7297, 0, "p"], + [7298, 0, "a"], + [7299, 0, "i"], + [7300, 0, "r"], + [20322, 1], + [20321, 1], + [20320, 1], + [20319, 1], + [20318, 1], + [20317, 1], + [20316, 1], + [20315, 1], + [20314, 1], + [20313, 1], + [20312, 1], + [20311, 1], + [20310, 1], + [20309, 1], + [20308, 1], + [20307, 1], + [20306, 1], + [20305, 1], + [20304, 1], + [20303, 1], + [20302, 1], + [20301, 1], + [20300, 1], + [20299, 1], + [20298, 1], + [20297, 1], + [20296, 1], + [20295, 1], + [20294, 1], + [20293, 1], + [20292, 1], + [20291, 1], + [20290, 1], + [20289, 1], + [20288, 1], + [20287, 1], + [20286, 1], + [20285, 1], + [20284, 1], + [20283, 1], + [20282, 1], + [20281, 1], + [20280, 1], + [20279, 1], + [20278, 1], + [20277, 1], + [20276, 1], + [20275, 1], + [20274, 1], + [20273, 1], + [20272, 1], + [20271, 1], + [20270, 1], + [20269, 1], + [20268, 1], + [20267, 1], + [20266, 1], + [20265, 1], + [20264, 1], + [20263, 1], + [20262, 1], + [20261, 1], + [20260, 1], + [20259, 1], + [20258, 1], + [20257, 1], + [20256, 1], + [20255, 1], + [20254, 1], + [20253, 1], + [20252, 1], + [20251, 1], + [20250, 1], + [20249, 1], + [20248, 1], + [20247, 1], + [20246, 1], + [20245, 1], + [20244, 1], + [20243, 1], + [20242, 1], + [20241, 1], + [20240, 1], + [20239, 1], + [20238, 1], + [20237, 1], + [20236, 1], + [20235, 1], + [20234, 1], + [20233, 1], + [20232, 1], + [20231, 1], + [20230, 1], + [20229, 1], + [20228, 1], + [20227, 1], + [20226, 1], + [20225, 1], + [20224, 1], + [20223, 1], + [20222, 1], + [20221, 1], + [20220, 1], + [20219, 1], + [20218, 1], + [20217, 1], + [20216, 1], + [20215, 1], + [20214, 1], + [20213, 1], + [20212, 1], + [20211, 1], + [20210, 1], + [20209, 1], + [20208, 1], + [20207, 1], + [20206, 1], + [20205, 1], + [20204, 1], + [20203, 1], + [20202, 1], + [20201, 1], + [20200, 1], + [20199, 1], + [20198, 1], + [20197, 1], + [20196, 1], + [20195, 1], + [20194, 1], + [20193, 1], + [20192, 1], + [20191, 1], + [20190, 1], + [20189, 1], + [20188, 1], + [20187, 1], + [20186, 1], + [20185, 1], + [20184, 1], + [20183, 1], + [20182, 1], + [20181, 1], + [20180, 1], + [20179, 1], + [20178, 1], + [20177, 1], + [20176, 1], + [20175, 1], + [20174, 1], + [20173, 1], + [20172, 1], + [20171, 1], + [20170, 1], + [20169, 1], + [20168, 1], + [20167, 1], + [20166, 1], + [20165, 1], + [20164, 1], + [20163, 1], + [20162, 1], + [20161, 1], + [20160, 1], + [20159, 1], + [20158, 1], + [20157, 1], + [20156, 1], + [20155, 1], + [20154, 1], + [20153, 1], + [20152, 1], + [20151, 1], + [20150, 1], + [20149, 1], + [20148, 1], + [20147, 1], + [20146, 1], + [20145, 1], + [20144, 1], + [20143, 1], + [20142, 1], + [20141, 1], + [20140, 1], + [20139, 1], + [20138, 1], + [20137, 1], + [20136, 1], + [20135, 1], + [20134, 1], + [20133, 1], + [20132, 1], + [20131, 1], + [20130, 1], + [20129, 1], + [20128, 1], + [20127, 1], + [20126, 1], + [20125, 1], + [20124, 1], + [20123, 1], + [20122, 1], + [20121, 1], + [20120, 1], + [20119, 1], + [20118, 1], + [20117, 1], + [20116, 1], + [20115, 1], + [20114, 1], + [20113, 1], + [20112, 1], + [20111, 1], + [20110, 1], + [20109, 1], + [20108, 1], + [20107, 1], + [20106, 1], + [20105, 1], + [20104, 1], + [20103, 1], + [20102, 1], + [20101, 1], + [20100, 1], + [20099, 1], + [20098, 1], + [20097, 1], + [20096, 1], + [20095, 1], + [20094, 1], + [20093, 1], + [20092, 1], + [20091, 1], + [20090, 1], + [20089, 1], + [20088, 1], + [20087, 1], + [20086, 1], + [20085, 1], + [20084, 1], + [20083, 1], + [20082, 1], + [20081, 1], + [20080, 1], + [20079, 1], + [20078, 1], + [20077, 1], + [20076, 1], + [20075, 1], + [20074, 1], + [20073, 1], + [20072, 1], + [20071, 1], + [20070, 1], + [20069, 1], + [20068, 1], + [20067, 1], + [20066, 1], + [20065, 1], + [20064, 1], + [20063, 1], + [20062, 1], + [20061, 1], + [20060, 1], + [20059, 1], + [20058, 1], + [20057, 1], + [20056, 1], + [20055, 1], + [20054, 1], + [20053, 1], + [20052, 1], + [20051, 1], + [20050, 1], + [20049, 1], + [20048, 1], + [20047, 1], + [20046, 1], + [20045, 1], + [20044, 1], + [20043, 1], + [20042, 1], + [20041, 1], + [20040, 1], + [20039, 1], + [20038, 1], + [20037, 1], + [20036, 1], + [20035, 1], + [20034, 1], + [20033, 1], + [20032, 1], + [20031, 1], + [20030, 1], + [20029, 1], + [20028, 1], + [20027, 1], + [20026, 1], + [20025, 1], + [20024, 1], + [20023, 1], + [20022, 1], + [20021, 1], + [20020, 1], + [20019, 1], + [20018, 1], + [20017, 1], + [20016, 1], + [20015, 1], + [20014, 1], + [20013, 1], + [20012, 1], + [20011, 1], + [20010, 1], + [20009, 1], + [20008, 1], + [20007, 1], + [20006, 1], + [20005, 1], + [20004, 1], + [20003, 1], + [20002, 1], + [20001, 1], + [20000, 1], + [19999, 1], + [19998, 1], + [19997, 1], + [19996, 1], + [19995, 1], + [19994, 1], + [19993, 1], + [19992, 1], + [19991, 1], + [19990, 1], + [19989, 1], + [19988, 1], + [19987, 1], + [19986, 1], + [19985, 1], + [19984, 1], + [19983, 1], + [19982, 1], + [19981, 1], + [19980, 1], + [19979, 1], + [19978, 1], + [19977, 1], + [19976, 1], + [19975, 1], + [19974, 1], + [19973, 1], + [19972, 1], + [19971, 1], + [19970, 1], + [19969, 1], + [19968, 1], + [19967, 1], + [19966, 1], + [19965, 1], + [19964, 1], + [19963, 1], + [19962, 1], + [19961, 1], + [19960, 1], + [19959, 1], + [19958, 1], + [19957, 1], + [19956, 1], + [19955, 1], + [19954, 1], + [19953, 1], + [19952, 1], + [19951, 1], + [19950, 1], + [19949, 1], + [19948, 1], + [19947, 1], + [19946, 1], + [19945, 1], + [19944, 1], + [19943, 1], + [19942, 1], + [19941, 1], + [19940, 1], + [19939, 1], + [19938, 1], + [19937, 1], + [19936, 1], + [19935, 1], + [19934, 1], + [19933, 1], + [19932, 1], + [19931, 1], + [19930, 1], + [19929, 1], + [19928, 1], + [19927, 1], + [19926, 1], + [19925, 1], + [19924, 1], + [19923, 1], + [19922, 1], + [19921, 1], + [19920, 1], + [19919, 1], + [19918, 1], + [19917, 1], + [19916, 1], + [19915, 1], + [19914, 1], + [19913, 1], + [19912, 1], + [19911, 1], + [19910, 1], + [19909, 1], + [19908, 1], + [19907, 1], + [19906, 1], + [19905, 1], + [19904, 1], + [19903, 1], + [19902, 1], + [19901, 1], + [19900, 1], + [19899, 1], + [19898, 1], + [19897, 1], + [19896, 1], + [19895, 1], + [19894, 1], + [19893, 1], + [19892, 1], + [19891, 1], + [19891, 0, "b"], + [19892, 0, "e"], + [19893, 0, "g"], + [19894, 0, "i"], + [19895, 0, "n"], + [19896, 0, "{"], + [19897, 0, "p"], + [19898, 0, "r"], + [19899, 0, "o"], + [19900, 0, "o"], + [19901, 0, "f"], + [19902, 0, "t"], + [19903, 0, "r"], + [19904, 0, "e"], + [19905, 0, "e"], + [19906, 0, "}"], + [19907, 0, "\n"], + [19908, 0, "\\"], + [19909, 0, "e"], + [19910, 0, "n"], + [19911, 0, "d"], + [19912, 0, "{"], + [19913, 0, "p"], + [19914, 0, "r"], + [19915, 0, "o"], + [19916, 0, "o"], + [19917, 0, "f"], + [19918, 0, "t"], + [19919, 0, "r"], + [19920, 0, "e"], + [19921, 0, "e"], + [19922, 0, "}"], + [19861, 0, "\\"], + [19862, 0, "s"], + [19863, 0, "u"], + [19864, 0, "b"], + [19865, 0, "s"], + [19866, 0, "u"], + [19867, 0, "b"], + [19868, 0, "s"], + [19869, 0, "e"], + [19870, 0, "c"], + [19871, 0, "t"], + [19872, 0, "i"], + [19873, 0, "o"], + [19874, 0, "n"], + [19875, 0, "{"], + [19876, 0, "O"], + [19877, 0, "p"], + [19878, 0, "e"], + [19879, 0, "r"], + [19880, 0, "a"], + [19881, 0, "t"], + [19882, 0, "i"], + [19883, 0, "o"], + [19884, 0, "n"], + [19885, 0, " "], + [19886, 0, "s"], + [19887, 0, "t"], + [19888, 0, "r"], + [19889, 0, "u"], + [19890, 0, "c"], + [19891, 0, "t"], + [19892, 0, "u"], + [19893, 0, "r"], + [19894, 0, "e"], + [19895, 0, "}"], + [19896, 0, "\n"], + [19897, 0, "\n"], + [19898, 0, "A"], + [19899, 0, "n"], + [19900, 0, " "], + [19901, 0, "o"], + [19902, 0, "p"], + [19903, 0, "e"], + [19904, 0, "r"], + [19905, 0, "a"], + [19906, 0, "t"], + [19907, 0, "i"], + [19908, 0, "o"], + [19909, 0, "n"], + [19910, 0, " "], + [19911, 0, "i"], + [19912, 0, "s"], + [19913, 0, " "], + [19914, 0, "a"], + [19915, 0, " "], + [19916, 0, "t"], + [19917, 0, "y"], + [19918, 0, "p"], + [19918, 1], + [19917, 1], + [19917, 0, "u"], + [19918, 0, "p"], + [19919, 0, "l"], + [19920, 0, "e"], + [19921, 0, " "], + [19922, 0, "o"], + [19923, 0, "f"], + [19924, 0, " "], + [19925, 0, "t"], + [19926, 0, "h"], + [19927, 0, "e"], + [19928, 0, " "], + [19929, 0, "f"], + [19930, 0, "o"], + [19931, 0, "r"], + [19932, 0, "m"], + [19933, 0, "\n"], + [19934, 0, "\\"], + [19935, 0, "["], + [19936, 0, " "], + [19937, 0, "\\"], + [19938, 0, "m"], + [19939, 0, "a"], + [19940, 0, "t"], + [19941, 0, "h"], + [19942, 0, "s"], + [19943, 0, "f"], + [19944, 0, "{"], + [19945, 0, "o"], + [19946, 0, "p"], + [19947, 0, "}"], + [19948, 0, "("], + [19949, 0, "\\"], + [19950, 0, "m"], + [19951, 0, "a"], + [19952, 0, "t"], + [19953, 0, "h"], + [19954, 0, "i"], + [19955, 0, "t"], + [19956, 0, "{"], + [19957, 0, "i"], + [19958, 0, "d"], + [19959, 0, "}"], + [19960, 0, ":"], + [19961, 0, " "], + [19962, 0, "\\"], + [19963, 0, "m"], + [19964, 0, "a"], + [19965, 0, "t"], + [19966, 0, "h"], + [19967, 0, "r"], + [19968, 0, "m"], + [19969, 0, "{"], + [19969, 1], + [19968, 1], + [19967, 1], + [19966, 1], + [19965, 1], + [19964, 1], + [19963, 1], + [19962, 1], + [19962, 0, "\\"], + [19963, 0, "m"], + [19964, 0, "a"], + [19965, 0, "t"], + [19966, 0, "h"], + [19967, 0, "b"], + [19968, 0, "b"], + [19969, 0, "{"], + [19970, 0, "N"], + [19971, 0, "}"], + [19972, 0, " "], + [19973, 0, "\\"], + [19974, 0, "t"], + [19975, 0, "i"], + [19976, 0, "m"], + [19977, 0, "e"], + [19978, 0, "s"], + [19979, 0, " "], + [19980, 0, "\\"], + [19981, 0, "m"], + [19982, 0, "a"], + [19983, 0, "t"], + [19984, 0, "h"], + [19985, 0, "r"], + [19986, 0, "m"], + [19987, 0, "{"], + [19988, 0, "P"], + [19989, 0, "e"], + [19990, 0, "e"], + [19991, 0, "r"], + [19992, 0, "I"], + [19993, 0, "D"], + [19994, 0, "}"], + [19949, 0, "\n"], + [19950, 0, " "], + [19951, 0, " "], + [19952, 0, " "], + [19953, 0, " "], + [20000, 0, ","], + [20001, 0, "\n"], + [20002, 0, " "], + [20003, 0, " "], + [20004, 0, " "], + [20005, 0, " "], + [20006, 0, "\\"], + [20007, 0, "m"], + [20008, 0, "a"], + [20009, 0, "t"], + [20010, 0, "h"], + [20011, 0, "i"], + [20012, 0, "t"], + [20013, 0, "{"], + [20014, 0, "d"], + [20015, 0, "e"], + [20016, 0, "p"], + [20017, 0, "s"], + [20018, 0, "}"], + [20019, 0, ":"], + [20020, 0, " "], + [20021, 0, "\\"], + [20022, 0, "m"], + [20023, 0, "a"], + [20024, 0, "t"], + [20025, 0, "h"], + [20026, 0, "c"], + [20027, 0, "a"], + [20028, 0, "l"], + [20029, 0, "{"], + [20030, 0, "P"], + [20031, 0, "}"], + [20032, 0, "("], + [20033, 0, " "], + [20033, 1], + [20033, 0, "\\"], + [20034, 0, "m"], + [20035, 0, "a"], + [20036, 0, "t"], + [20037, 0, "h"], + [20038, 0, "b"], + [20039, 0, "b"], + [20040, 0, "{"], + [20041, 0, "N"], + [20042, 0, "}"], + [20043, 0, " "], + [20044, 0, "\\"], + [20045, 0, "t"], + [20046, 0, "i"], + [20047, 0, "m"], + [20048, 0, "e"], + [20049, 0, "s"], + [20050, 0, " "], + [20051, 0, "\\"], + [20052, 0, "m"], + [20053, 0, "a"], + [20054, 0, "t"], + [20055, 0, "h"], + [20056, 0, "r"], + [20057, 0, "m"], + [20058, 0, "{"], + [20059, 0, "P"], + [20060, 0, "e"], + [20061, 0, "e"], + [20062, 0, "r"], + [20063, 0, "I"], + [20064, 0, "D"], + [20065, 0, "}"], + [20066, 0, ")"], + [20067, 0, ","], + [20068, 0, "\n"], + [20069, 0, " "], + [20070, 0, " "], + [20071, 0, " "], + [20072, 0, " "], + [20073, 0, "\\"], + [20074, 0, "m"], + [20075, 0, "a"], + [20076, 0, "t"], + [20077, 0, "h"], + [20078, 0, "i"], + [20079, 0, "t"], + [20080, 0, "{"], + [20081, 0, "c"], + [20082, 0, "u"], + [20083, 0, "r"], + [20084, 0, "}"], + [20085, 0, ":"], + [20086, 0, " "], + [20087, 0, "\\"], + [20088, 0, "m"], + [20089, 0, "a"], + [20090, 0, "t"], + [20091, 0, "h"], + [20092, 0, "s"], + [20093, 0, "f"], + [20094, 0, "{"], + [20095, 0, "c"], + [20096, 0, "u"], + [20097, 0, "r"], + [20098, 0, "s"], + [20099, 0, "o"], + [20100, 0, "r"], + [20101, 0, "}"], + [20102, 0, "("], + [20103, 0, "\\"], + [20104, 0, "l"], + [20105, 0, "a"], + [20106, 0, "n"], + [20107, 0, "g"], + [20108, 0, "l"], + [20109, 0, "e"], + [20110, 0, " "], + [20111, 0, "k"], + [20112, 0, "_"], + [20113, 0, "1"], + [20114, 0, ","], + [20115, 0, " "], + [20116, 0, "\\"], + [20117, 0, "d"], + [20118, 0, "o"], + [20119, 0, "t"], + [20120, 0, "s"], + [20121, 0, ","], + [20122, 0, " "], + [20123, 0, "k"], + [20124, 0, "_"], + [20125, 0, "{"], + [20126, 0, "n"], + [20127, 0, "-"], + [20128, 0, "1"], + [20129, 0, "}"], + [20130, 0, " "], + [20131, 0, "\\"], + [20132, 0, "r"], + [20133, 0, "a"], + [20134, 0, "n"], + [20135, 0, "g"], + [20136, 0, "l"], + [20137, 0, "e"], + [20138, 0, ","], + [20139, 0, "\\"], + [20140, 0, ","], + [20141, 0, " "], + [20142, 0, "k"], + [20143, 0, "_"], + [20144, 0, "n"], + [20145, 0, ")"], + [20146, 0, ","], + [20147, 0, "\n"], + [20148, 0, " "], + [20149, 0, " "], + [20150, 0, " "], + [20151, 0, " "], + [20152, 0, "\\"], + [20153, 0, "m"], + [20154, 0, "a"], + [20155, 0, "t"], + [20156, 0, "h"], + [20157, 0, "i"], + [20158, 0, "t"], + [20159, 0, "{"], + [20160, 0, "m"], + [20161, 0, "u"], + [20162, 0, "t"], + [20163, 0, "}"], + [19933, 0, "\n"], + [19934, 0, "\\"], + [19935, 0, "b"], + [19936, 0, "e"], + [19937, 0, "g"], + [19938, 0, "i"], + [19939, 0, "n"], + [19940, 0, "{"], + [19941, 0, "a"], + [19942, 0, "l"], + [19943, 0, "i"], + [19944, 0, "g"], + [19945, 0, "n"], + [19946, 0, "a"], + [19947, 0, "t"], + [19948, 0, "*"], + [19949, 0, "}"], + [19950, 0, "{"], + [19951, 0, "2"], + [19952, 0, "}"], + [19954, 1], + [19954, 1], + [19954, 0, "&"], + [20184, 0, "&"], + [20185, 0, " "], + [20186, 0, ")"], + [20187, 0, "\n"], + [20188, 0, "\\"], + [20189, 0, "e"], + [20190, 0, "n"], + [20191, 0, "d"], + [20192, 0, "{"], + [20193, 0, "a"], + [20194, 0, "l"], + [20195, 0, "i"], + [20196, 0, "g"], + [20197, 0, "n"], + [20198, 0, "a"], + [20199, 0, "t"], + [20200, 0, "*"], + [20201, 0, "}"], + [20202, 0, "\n"], + [19968, 0, " "], + [19969, 0, "\\"], + [19970, 0, "\\"], + [19972, 1], + [19972, 1], + [19972, 1], + [19972, 0, "&"], + [19973, 0, "&"], + [20023, 1], + [20023, 1], + [20023, 1], + [20023, 0, "&"], + [20024, 0, "&"], + [20089, 1], + [20089, 1], + [20089, 1], + [20089, 0, "&"], + [20090, 0, "&"], + [20167, 1], + [20167, 1], + [20167, 1], + [20167, 0, "&"], + [20168, 0, "&"], + [19986, 0, " "], + [19987, 0, "&"], + [20041, 0, " "], + [20042, 0, "&"], + [20108, 0, " "], + [20109, 0, "&"], + [20188, 0, " "], + [20189, 0, "&"], + [20190, 0, ":"], + [20191, 0, " "], + [20192, 0, "\\"], + [20193, 0, "m"], + [20194, 0, "a"], + [20195, 0, "t"], + [20196, 0, "h"], + [20197, 0, "s"], + [20198, 0, "f"], + [20199, 0, "{"], + [20200, 0, "i"], + [20201, 0, "n"], + [20202, 0, "s"], + [20203, 0, "e"], + [20204, 0, "r"], + [20205, 0, "t"], + [20206, 0, "}"], + [20207, 0, "("], + [20208, 0, "v"], + [20209, 0, ")"], + [20210, 0, " "], + [20211, 0, "\\"], + [20212, 0, "m"], + [20213, 0, "i"], + [20214, 0, "d"], + [20215, 0, " "], + [20216, 0, "\\"], + [20217, 0, "m"], + [20218, 0, "a"], + [20219, 0, "t"], + [20220, 0, "h"], + [20221, 0, "s"], + [20222, 0, "f"], + [20223, 0, "{"], + [20224, 0, "d"], + [20225, 0, "e"], + [20226, 0, "l"], + [20227, 0, "e"], + [20228, 0, "t"], + [20229, 0, "e"], + [20230, 0, "}"], + [20231, 0, " "], + [20232, 0, "\\"], + [20233, 0, " "], + [20233, 1], + [20233, 0, "m"], + [20234, 0, "i"], + [20235, 0, "d"], + [20236, 0, " "], + [20237, 0, "\\"], + [20238, 0, "m"], + [20239, 0, "a"], + [20240, 0, "t"], + [20241, 0, "h"], + [20242, 0, "s"], + [20243, 0, "f"], + [20244, 0, "{"], + [20245, 0, "a"], + [20246, 0, "s"], + [20247, 0, "s"], + [20248, 0, "i"], + [20249, 0, "g"], + [20250, 0, "n"], + [20251, 0, "}"], + [20252, 0, "("], + [20253, 0, "v"], + [20254, 0, ")"], + [20255, 0, " "], + [20256, 0, "\\"], + [20257, 0, "\\"], + [20172, 0, " "], + [20173, 0, "\\"], + [20174, 0, "\\"], + [20092, 0, " "], + [20093, 0, "\\"], + [20094, 0, "\\"], + [20024, 0, " "], + [20025, 0, "\\"], + [20026, 0, "\\"], + [20315, 0, "%"], + [20334, 0, "%"], + [20286, 0, "\n"], + [20287, 0, "w"], + [20288, 0, "h"], + [20289, 0, "e"], + [20290, 0, "r"], + [20291, 0, "e"], + [20292, 0, " "], + [20293, 0, "\\"], + [20294, 0, "t"], + [20294, 1], + [20293, 1], + [20293, 0, "$"], + [20294, 0, "\\"], + [20295, 0, "m"], + [20296, 0, "a"], + [20297, 0, "t"], + [20298, 0, "h"], + [20299, 0, "i"], + [20300, 0, "t"], + [20301, 0, "{"], + [20302, 0, "i"], + [20303, 0, "d"], + [20304, 0, "}"], + [20305, 0, "$"], + [20306, 0, " "], + [20307, 0, "i"], + [20308, 0, "s"], + [20309, 0, " "], + [20310, 0, "t"], + [20311, 0, "h"], + [20312, 0, "e"], + [20313, 0, " "], + [20314, 0, "L"], + [20315, 0, "a"], + [20316, 0, "m"], + [20317, 0, "p"], + [20318, 0, "o"], + [20319, 0, "r"], + [20320, 0, "t"], + [20321, 0, " "], + [20322, 0, "t"], + [20323, 0, "i"], + [20324, 0, "m"], + [20325, 0, "e"], + [20326, 0, "s"], + [20327, 0, "t"], + [20328, 0, "a"], + [20329, 0, "m"], + [20330, 0, "p"], + [20331, 0, " "], + [20332, 0, "t"], + [20333, 0, "h"], + [20334, 0, "a"], + [20335, 0, "t"], + [20336, 0, " "], + [20337, 0, "u"], + [20338, 0, "n"], + [20339, 0, "i"], + [20340, 0, "q"], + [20341, 0, "u"], + [20342, 0, "e"], + [20343, 0, "l"], + [20344, 0, "y"], + [20345, 0, " "], + [20346, 0, "i"], + [20347, 0, "d"], + [20348, 0, "e"], + [20349, 0, "n"], + [20350, 0, "t"], + [20351, 0, "i"], + [20352, 0, "f"], + [20353, 0, "i"], + [20354, 0, "e"], + [20355, 0, "s"], + [20356, 0, " "], + [20357, 0, "t"], + [20358, 0, "h"], + [20359, 0, "e"], + [20360, 0, " "], + [20361, 0, "o"], + [20362, 0, "p"], + [20363, 0, "e"], + [20364, 0, "r"], + [20365, 0, "a"], + [20366, 0, "t"], + [20367, 0, "i"], + [20368, 0, "o"], + [20369, 0, "n"], + [20370, 0, ","], + [20371, 0, " "], + [20372, 0, "$"], + [20373, 0, "\\"], + [20374, 0, "m"], + [20375, 0, "a"], + [20376, 0, "t"], + [20377, 0, "h"], + [20378, 0, "i"], + [20379, 0, "t"], + [20380, 0, "{"], + [20381, 0, "c"], + [20382, 0, "u"], + [20383, 0, "r"], + [20384, 0, "}"], + [20385, 0, "$"], + [20386, 0, " "], + [20387, 0, "i"], + [20388, 0, "s"], + [20389, 0, " "], + [20390, 0, "t"], + [20391, 0, "h"], + [20392, 0, "e"], + [20393, 0, " "], + [20394, 0, "c"], + [20395, 0, "u"], + [20396, 0, "r"], + [20397, 0, "s"], + [20398, 0, "o"], + [20399, 0, "r"], + [20400, 0, " "], + [20401, 0, "d"], + [20402, 0, "e"], + [20403, 0, "s"], + [20404, 0, "c"], + [20405, 0, "r"], + [20406, 0, "i"], + [20407, 0, "b"], + [20408, 0, "i"], + [20409, 0, "n"], + [20410, 0, "g"], + [20411, 0, " "], + [20412, 0, "t"], + [20413, 0, "h"], + [20414, 0, "e"], + [20415, 0, " "], + [20416, 0, "p"], + [20417, 0, "o"], + [20418, 0, "s"], + [20419, 0, "i"], + [20420, 0, "t"], + [20421, 0, "i"], + [20422, 0, "o"], + [20423, 0, "n"], + [20424, 0, " "], + [20425, 0, "i"], + [20426, 0, "n"], + [20427, 0, " "], + [20428, 0, "t"], + [20429, 0, "h"], + [20430, 0, "e"], + [20431, 0, " "], + [20432, 0, "d"], + [20433, 0, "o"], + [20434, 0, "c"], + [20435, 0, "u"], + [20436, 0, "m"], + [20437, 0, "e"], + [20438, 0, "n"], + [20439, 0, "t"], + [20440, 0, " "], + [20441, 0, "b"], + [20442, 0, "e"], + [20443, 0, "i"], + [20444, 0, "n"], + [20445, 0, "g"], + [20446, 0, " "], + [20447, 0, "m"], + [20448, 0, "o"], + [20449, 0, "d"], + [20450, 0, "i"], + [20451, 0, "f"], + [20452, 0, "i"], + [20453, 0, "e"], + [20454, 0, "d"], + [20455, 0, ","], + [20456, 0, " "], + [20457, 0, "a"], + [20458, 0, "n"], + [20459, 0, "d"], + [20460, 0, " "], + [20461, 0, "$"], + [20462, 0, "\\"], + [20463, 0, "m"], + [20464, 0, "a"], + [20465, 0, "t"], + [20466, 0, "h"], + [20467, 0, "i"], + [20468, 0, "t"], + [20469, 0, "{"], + [20470, 0, "m"], + [20471, 0, "u"], + [20472, 0, "t"], + [20473, 0, "}"], + [20474, 0, "$"], + [20475, 0, " "], + [20476, 0, "i"], + [20477, 0, "s"], + [20478, 0, " "], + [20479, 0, "t"], + [20480, 0, "h"], + [20481, 0, "e"], + [20482, 0, " "], + [20483, 0, "m"], + [20484, 0, "u"], + [20485, 0, "t"], + [20486, 0, "a"], + [20487, 0, "t"], + [20488, 0, "i"], + [20489, 0, "o"], + [20490, 0, "n"], + [20491, 0, " "], + [20492, 0, "t"], + [20493, 0, "h"], + [20494, 0, "a"], + [20495, 0, "t"], + [20496, 0, " "], + [20497, 0, "s"], + [20498, 0, "h"], + [20499, 0, "o"], + [20500, 0, "u"], + [20501, 0, "l"], + [20502, 0, "d"], + [20503, 0, " "], + [20504, 0, "o"], + [20505, 0, "c"], + [20506, 0, "c"], + [20507, 0, "u"], + [20508, 0, "r"], + [20509, 0, " "], + [20509, 1], + [20508, 1], + [20507, 1], + [20506, 1], + [20505, 1], + [20504, 1], + [20503, 1], + [20502, 1], + [20501, 1], + [20500, 1], + [20499, 1], + [20498, 1], + [20497, 1], + [20497, 0, "w"], + [20498, 0, "a"], + [20499, 0, "s"], + [20500, 0, " "], + [20501, 0, "r"], + [20502, 0, "e"], + [20503, 0, "q"], + [20504, 0, "u"], + [20505, 0, "e"], + [20506, 0, "s"], + [20507, 0, "t"], + [20508, 0, "e"], + [20509, 0, "d"], + [20510, 0, " "], + [20511, 0, "a"], + [20512, 0, "t"], + [20513, 0, " "], + [20514, 0, "t"], + [20515, 0, "h"], + [20516, 0, "e"], + [20517, 0, " "], + [20518, 0, "s"], + [20519, 0, "p"], + [20520, 0, "e"], + [20521, 0, "c"], + [20522, 0, "i"], + [20523, 0, "f"], + [20524, 0, "i"], + [20525, 0, "e"], + [20526, 0, "d"], + [20527, 0, " "], + [20528, 0, "p"], + [20529, 0, "o"], + [20530, 0, "s"], + [20531, 0, "i"], + [20532, 0, "t"], + [20533, 0, "i"], + [20534, 0, "o"], + [20535, 0, "n"], + [20536, 0, "."], + [20537, 0, "\n"], + [20538, 0, "\n"], + [20539, 0, "$"], + [20540, 0, "\\"], + [20541, 0, "m"], + [20542, 0, "a"], + [20543, 0, "t"], + [20544, 0, "h"], + [20545, 0, "i"], + [20546, 0, "t"], + [20547, 0, "{"], + [20548, 0, "d"], + [20549, 0, "e"], + [20550, 0, "p"], + [20551, 0, "s"], + [20552, 0, "}"], + [20553, 0, "$"], + [20554, 0, " "], + [20555, 0, "i"], + [20556, 0, "s"], + [20557, 0, " "], + [20558, 0, "t"], + [20559, 0, "h"], + [20560, 0, "e"], + [20561, 0, " "], + [20562, 0, "s"], + [20563, 0, "e"], + [20564, 0, "t"], + [20565, 0, " "], + [20566, 0, "o"], + [20567, 0, "f"], + [20568, 0, " "], + [20569, 0, "c"], + [20570, 0, "a"], + [20571, 0, "u"], + [20572, 0, "s"], + [20573, 0, "a"], + [20574, 0, "l"], + [20575, 0, " "], + [20576, 0, "d"], + [20577, 0, "e"], + [20578, 0, "p"], + [20579, 0, "e"], + [20580, 0, "n"], + [20581, 0, "d"], + [20582, 0, "e"], + [20583, 0, "n"], + [20584, 0, "c"], + [20585, 0, "i"], + [20586, 0, "e"], + [20587, 0, "s"], + [20588, 0, " "], + [20589, 0, "o"], + [20590, 0, "f"], + [20591, 0, " "], + [20592, 0, "t"], + [20593, 0, "h"], + [20594, 0, "e"], + [20595, 0, " "], + [20596, 0, "o"], + [20597, 0, "p"], + [20598, 0, "e"], + [20599, 0, "r"], + [20600, 0, "a"], + [20601, 0, "t"], + [20602, 0, "i"], + [20603, 0, "o"], + [20604, 0, "n"], + [20605, 0, ","], + [20606, 0, " "], + [20607, 0, "g"], + [20608, 0, "i"], + [20609, 0, "v"], + [20610, 0, "e"], + [20611, 0, "n"], + [20612, 0, " "], + [20613, 0, "a"], + [20614, 0, "s"], + [20615, 0, " "], + [20616, 0, "a"], + [20617, 0, " "], + [20618, 0, "s"], + [20619, 0, "e"], + [20620, 0, "t"], + [20621, 0, " "], + [20622, 0, "o"], + [20623, 0, "f"], + [20624, 0, " "], + [20625, 0, "L"], + [20626, 0, "a"], + [20627, 0, "m"], + [20628, 0, "p"], + [20629, 0, "o"], + [20630, 0, "r"], + [20631, 0, "t"], + [20632, 0, " "], + [20633, 0, "t"], + [20634, 0, "i"], + [20635, 0, "m"], + [20636, 0, "e"], + [20637, 0, "s"], + [20638, 0, "t"], + [20639, 0, "a"], + [20640, 0, "m"], + [20641, 0, "p"], + [20642, 0, "s"], + [20643, 0, "."], + [20644, 0, " "], + [20645, 0, "T"], + [20646, 0, "h"], + [20647, 0, "e"], + [20648, 0, " "], + [20649, 0, "s"], + [20650, 0, "e"], + [20651, 0, "m"], + [20652, 0, "a"], + [20653, 0, "n"], + [20654, 0, "t"], + [20655, 0, "i"], + [20656, 0, "c"], + [20657, 0, "s"], + [20658, 0, " "], + [20659, 0, "b"], + [20660, 0, "e"], + [20661, 0, "l"], + [20662, 0, "o"], + [20663, 0, "w"], + [20664, 0, " "], + [20665, 0, "d"], + [20666, 0, "e"], + [20667, 0, "f"], + [20668, 0, "i"], + [20669, 0, "n"], + [20670, 0, "e"], + [20671, 0, " "], + [20672, 0, "t"], + [20673, 0, "h"], + [20674, 0, "i"], + [20675, 0, "s"], + [20676, 0, " "], + [20677, 0, "="], + [20677, 1], + [20676, 1], + [20675, 1], + [20674, 1], + [20673, 1], + [20672, 1], + [20672, 0, "$"], + [20673, 0, "\\"], + [20674, 0, "m"], + [20675, 0, "a"], + [20676, 0, "t"], + [20677, 0, "h"], + [20678, 0, "i"], + [20679, 0, "t"], + [20680, 0, "{"], + [20681, 0, "d"], + [20682, 0, "e"], + [20683, 0, "p"], + [20684, 0, "s"], + [20685, 0, "}"], + [20686, 0, "$"], + [20687, 0, " "], + [20688, 0, "t"], + [20689, 0, "o"], + [20690, 0, " "], + [20691, 0, "b"], + [20692, 0, "e"], + [20693, 0, " "], + [20694, 0, "t"], + [20695, 0, "h"], + [20696, 0, "e"], + [20697, 0, " "], + [20698, 0, "s"], + [20699, 0, "e"], + [20700, 0, "t"], + [20701, 0, " "], + [20702, 0, "o"], + [20703, 0, "f"], + [20704, 0, " "], + [20705, 0, "o"], + [20706, 0, "p"], + [20707, 0, "e"], + [20708, 0, "r"], + [20709, 0, "a"], + [20710, 0, "t"], + [20711, 0, "i"], + [20712, 0, "o"], + [20713, 0, "n"], + [20714, 0, " "], + [20715, 0, "I"], + [20716, 0, "D"], + [20717, 0, "s"], + [20718, 0, " "], + [20704, 0, " "], + [20705, 0, "a"], + [20706, 0, "l"], + [20707, 0, "l"], + [20723, 0, "t"], + [20724, 0, "h"], + [20725, 0, "a"], + [20726, 0, "t"], + [20727, 0, " "], + [20728, 0, "h"], + [20729, 0, "a"], + [20730, 0, "d"], + [20731, 0, " "], + [20732, 0, "b"], + [20733, 0, "e"], + [20734, 0, "e"], + [20735, 0, "n"], + [20736, 0, " "], + [20737, 0, "a"], + [20738, 0, "p"], + [20739, 0, "p"], + [20740, 0, "l"], + [20741, 0, "i"], + [20742, 0, "e"], + [20743, 0, "d"], + [20744, 0, " "], + [20745, 0, "t"], + [20746, 0, "o"], + [20747, 0, " "], + [20748, 0, "t"], + [20749, 0, "h"], + [20750, 0, "e"], + [20751, 0, " "], + [20752, 0, "d"], + [20753, 0, "o"], + [20754, 0, "c"], + [20755, 0, "u"], + [20756, 0, "m"], + [20757, 0, "e"], + [20758, 0, "n"], + [20759, 0, "t"], + [20760, 0, " "], + [20761, 0, "a"], + [20762, 0, "t"], + [20763, 0, " "], + [20764, 0, "t"], + [20765, 0, "h"], + [20766, 0, "e"], + [20767, 0, " "], + [20768, 0, "t"], + [20769, 0, "i"], + [20770, 0, "m"], + [20771, 0, "e"], + [20772, 0, " "], + [20773, 0, "w"], + [20774, 0, "h"], + [20775, 0, "e"], + [20776, 0, "n"], + [20777, 0, " "], + [20778, 0, "t"], + [20779, 0, "h"], + [20780, 0, "e"], + [20781, 0, " "], + [20782, 0, "o"], + [20783, 0, "p"], + [20784, 0, "e"], + [20785, 0, "r"], + [20786, 0, "a"], + [20787, 0, "t"], + [20788, 0, "i"], + [20789, 0, "o"], + [20790, 0, "n"], + [20791, 0, " "], + [20792, 0, "w"], + [20793, 0, "a"], + [20794, 0, "s"], + [20795, 0, " "], + [20796, 0, "g"], + [20797, 0, "e"], + [20798, 0, "n"], + [20799, 0, "e"], + [20800, 0, "r"], + [20801, 0, "a"], + [20802, 0, "t"], + [20803, 0, "e"], + [20804, 0, "d"], + [20805, 0, "."], + [20806, 0, " "], + [20807, 0, "I"], + [20808, 0, "n"], + [20809, 0, " "], + [20810, 0, "a"], + [20811, 0, " "], + [20812, 0, "r"], + [20813, 0, "e"], + [20814, 0, "a"], + [20815, 0, "l"], + [20816, 0, " "], + [20817, 0, "i"], + [20818, 0, "m"], + [20819, 0, "p"], + [20820, 0, "l"], + [20821, 0, "e"], + [20822, 0, "m"], + [20823, 0, "e"], + [20824, 0, "n"], + [20825, 0, "t"], + [20826, 0, "a"], + [20827, 0, "t"], + [20828, 0, "i"], + [20829, 0, "o"], + [20830, 0, "n"], + [20831, 0, ","], + [20832, 0, " "], + [20833, 0, "t"], + [20834, 0, "h"], + [20835, 0, "i"], + [20836, 0, "s"], + [20837, 0, " "], + [20838, 0, "s"], + [20839, 0, "e"], + [20840, 0, "t"], + [20841, 0, " "], + [20842, 0, "w"], + [20843, 0, "o"], + [20844, 0, "u"], + [20845, 0, "l"], + [20846, 0, "d"], + [20847, 0, " "], + [20848, 0, "b"], + [20849, 0, "e"], + [20850, 0, "c"], + [20851, 0, "o"], + [20852, 0, "m"], + [20853, 0, "e"], + [20854, 0, " "], + [20855, 0, "i"], + [20856, 0, "m"], + [20857, 0, "p"], + [20858, 0, "r"], + [20859, 0, "a"], + [20860, 0, "c"], + [20861, 0, "t"], + [20862, 0, "i"], + [20863, 0, "c"], + [20864, 0, "a"], + [20865, 0, "b"], + [20866, 0, "l"], + [20867, 0, "y"], + [20868, 0, " "], + [20869, 0, "l"], + [20870, 0, "a"], + [20871, 0, "r"], + [20872, 0, "g"], + [20873, 0, "e"], + [20874, 0, ","], + [20875, 0, " "], + [20876, 0, "s"], + [20877, 0, "o"], + [20878, 0, " "], + [20879, 0, "a"], + [20880, 0, " "], + [20881, 0, "c"], + [20882, 0, "o"], + [20883, 0, "m"], + [20884, 0, "p"], + [20885, 0, "a"], + [20886, 0, "c"], + [20887, 0, "t"], + [20888, 0, " "], + [20889, 0, "r"], + [20890, 0, "e"], + [20891, 0, "p"], + [20892, 0, "r"], + [20893, 0, "e"], + [20894, 0, "s"], + [20895, 0, "e"], + [20896, 0, "n"], + [20897, 0, "t"], + [20898, 0, "a"], + [20899, 0, "t"], + [20900, 0, "i"], + [20901, 0, "o"], + [20902, 0, "n"], + [20903, 0, " "], + [20904, 0, "o"], + [20905, 0, "f"], + [20906, 0, " "], + [20907, 0, "c"], + [20908, 0, "a"], + [20909, 0, "u"], + [20910, 0, "s"], + [20911, 0, "a"], + [20912, 0, "l"], + [20913, 0, " "], + [20914, 0, "h"], + [20915, 0, "i"], + [20916, 0, "s"], + [20917, 0, "t"], + [20918, 0, "o"], + [20919, 0, "r"], + [20920, 0, "y"], + [20921, 0, " "], + [20922, 0, "s"], + [20923, 0, "u"], + [20924, 0, "c"], + [20925, 0, "h"], + [20926, 0, " "], + [20926, 1], + [20925, 1], + [20924, 1], + [20923, 1], + [20922, 1], + [20922, 0, "w"], + [20923, 0, "o"], + [20924, 0, "u"], + [20925, 0, "l"], + [20926, 0, "d"], + [20927, 0, " "], + [20928, 0, "b"], + [20929, 0, "e"], + [20930, 0, " "], + [20931, 0, "u"], + [20932, 0, "s"], + [20933, 0, "e"], + [20934, 0, "d"], + [20935, 0, " "], + [20936, 0, "i"], + [20937, 0, "n"], + [20938, 0, "s"], + [20939, 0, "t"], + [20940, 0, "e"], + [20941, 0, "a"], + [20942, 0, "d"], + [20943, 0, " "], + [20944, 0, "-"], + [20945, 0, "-"], + [20946, 0, " "], + [20947, 0, "f"], + [20948, 0, "o"], + [20949, 0, "r"], + [20950, 0, " "], + [20951, 0, "e"], + [20952, 0, "x"], + [20953, 0, "a"], + [20954, 0, "m"], + [20955, 0, "p"], + [20956, 0, "l"], + [20957, 0, "e"], + [20958, 0, ","], + [20959, 0, " "], + [20960, 0, "v"], + [20961, 0, "e"], + [20962, 0, "r"], + [20963, 0, "s"], + [20964, 0, "i"], + [20965, 0, "o"], + [20966, 0, "n"], + [20967, 0, " "], + [20968, 0, "v"], + [20969, 0, "e"], + [20970, 0, "c"], + [20971, 0, "t"], + [20972, 0, "o"], + [20973, 0, "r"], + [20974, 0, "s"], + [20975, 0, " "], + [20976, 0, "o"], + [20977, 0, "r"], + [20978, 0, " "], + [20979, 0, "d"], + [20980, 0, "o"], + [20981, 0, "t"], + [20982, 0, "t"], + [20983, 0, "e"], + [20984, 0, "d"], + [20985, 0, " "], + [20986, 0, "v"], + [20987, 0, "e"], + [20988, 0, "r"], + [20989, 0, "s"], + [20990, 0, "i"], + [20991, 0, "o"], + [20992, 0, "n"], + [20993, 0, " "], + [20994, 0, "v"], + [20995, 0, "e"], + [20996, 0, "c"], + [20997, 0, "t"], + [20998, 0, "o"], + [20999, 0, "r"], + [21000, 0, "s"], + [21001, 0, " "], + [21002, 0, "("], + [21003, 0, "T"], + [21004, 0, "O"], + [21005, 0, "D"], + [21006, 0, "O"], + [21007, 0, " "], + [21008, 0, "i"], + [21008, 1], + [21008, 0, "c"], + [21009, 0, "i"], + [21010, 0, "t"], + [21011, 0, "a"], + [21012, 0, "t"], + [21013, 0, "i"], + [21014, 0, "o"], + [21015, 0, "n"], + [21016, 0, "s"], + [21017, 0, ")"], + [21018, 0, "."], + [21019, 0, " "], + [21020, 0, "H"], + [21021, 0, "o"], + [21022, 0, "w"], + [21023, 0, "e"], + [21024, 0, "v"], + [21025, 0, "e"], + [21026, 0, "r"], + [21027, 0, ","], + [21028, 0, " "], + [21029, 0, "i"], + [21030, 0, "n"], + [21031, 0, " "], + [21032, 0, "o"], + [21033, 0, "u"], + [21034, 0, "r"], + [21035, 0, " "], + [21036, 0, "a"], + [21037, 0, "b"], + [21038, 0, "s"], + [21039, 0, "t"], + [21040, 0, "r"], + [21041, 0, "a"], + [21042, 0, "c"], + [21043, 0, "t"], + [21044, 0, " "], + [21045, 0, "p"], + [21046, 0, "r"], + [21047, 0, "e"], + [21048, 0, "s"], + [21049, 0, "e"], + [21050, 0, "n"], + [21051, 0, "t"], + [21052, 0, "a"], + [21053, 0, "t"], + [21054, 0, "i"], + [21055, 0, "o"], + [21056, 0, "n"], + [21057, 0, " "], + [21058, 0, "o"], + [21059, 0, "f"], + [21060, 0, " "], + [21061, 0, "t"], + [21062, 0, "h"], + [21063, 0, "e"], + [21064, 0, " "], + [21065, 0, "s"], + [21066, 0, "e"], + [21067, 0, "m"], + [21068, 0, "a"], + [21069, 0, "n"], + [21070, 0, "t"], + [21071, 0, "i"], + [21072, 0, "c"], + [21073, 0, "s"], + [21074, 0, " "], + [21075, 0, "w"], + [21076, 0, "e"], + [21077, 0, " "], + [21078, 0, "g"], + [21079, 0, "i"], + [21080, 0, "v"], + [21081, 0, "e"], + [21082, 0, " "], + [21083, 0, "t"], + [21084, 0, "h"], + [21085, 0, "e"], + [21086, 0, " "], + [21087, 0, "d"], + [21088, 0, "e"], + [21089, 0, "p"], + [21090, 0, "e"], + [21091, 0, "n"], + [21092, 0, "d"], + [21093, 0, "e"], + [21094, 0, "n"], + [21095, 0, "c"], + [21096, 0, "i"], + [21097, 0, "e"], + [21098, 0, "s"], + [21099, 0, " "], + [21100, 0, "a"], + [21101, 0, "s"], + [21102, 0, " "], + [21103, 0, "a"], + [21104, 0, " "], + [21105, 0, "s"], + [21106, 0, "e"], + [21107, 0, "t"], + [21108, 0, " "], + [21109, 0, "o"], + [21110, 0, "f"], + [21111, 0, " "], + [21112, 0, "o"], + [21113, 0, "p"], + [21114, 0, "e"], + [21115, 0, "r"], + [21116, 0, "a"], + [21117, 0, "t"], + [21118, 0, "i"], + [21119, 0, "o"], + [21120, 0, "n"], + [21121, 0, " "], + [21122, 0, "I"], + [21123, 0, "D"], + [21124, 0, "s"], + [21125, 0, " "], + [21126, 0, "s"], + [21127, 0, "i"], + [21128, 0, "n"], + [21129, 0, "c"], + [21130, 0, " "], + [21131, 0, "e"], + [21131, 1], + [21130, 1], + [21130, 0, "e"], + [21131, 0, "."], + [21131, 1], + [21130, 1], + [21129, 1], + [21128, 1], + [21127, 1], + [21126, 1], + [21125, 1], + [21124, 1], + [21124, 0, "s"], + [21125, 0, "."], + [21026, 1], + [21025, 1], + [21024, 1], + [21023, 1], + [21022, 1], + [21021, 1], + [21020, 1], + [21020, 1], + [21020, 0, "T"], + [21021, 0, "o"], + [21022, 0, " "], + [21023, 0, "a"], + [21024, 0, "v"], + [21025, 0, "o"], + [21026, 0, "i"], + [21027, 0, "d"], + [21028, 0, " "], + [21029, 0, "a"], + [21030, 0, "m"], + [21031, 0, "b"], + [21032, 0, "i"], + [21033, 0, "g"], + [21034, 0, "u"], + [21035, 0, "i"], + [21036, 0, "t"], + [21037, 0, "y"], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21046, 1], + [21020, 0, "H"], + [21021, 0, "o"], + [21022, 0, "w"], + [21023, 0, "e"], + [21024, 0, "v"], + [21025, 0, "e"], + [21026, 0, "r"], + [21027, 0, ","], + [21028, 0, " "], + [21029, 1], + [21029, 0, "t"], + [21055, 1], + [21055, 1], + [21055, 1], + [21055, 1], + [21094, 0, " "], + [21095, 0, "s"], + [21096, 0, "i"], + [21097, 0, "m"], + [21098, 0, "p"], + [21099, 0, "l"], + [21100, 0, "e"], + [21123, 0, "\n"], + [21124, 0, "\n"], + [21125, 0, "T"], + [21126, 0, "h"], + [21127, 0, "e"], + [21128, 0, " "], + [21129, 0, "p"], + [21130, 0, "u"], + [21131, 0, "r"], + [21132, 0, "p"], + [21133, 0, "o"], + [21134, 0, "s"], + [21135, 0, "e"], + [21136, 0, " "], + [21137, 0, "o"], + [21138, 0, "f"], + [21139, 0, " "], + [21140, 0, "t"], + [21141, 0, "h"], + [21142, 0, "e"], + [21143, 0, " "], + [21144, 0, "c"], + [21145, 0, "a"], + [21146, 0, "u"], + [21147, 0, "s"], + [21148, 0, "a"], + [21149, 0, "l"], + [21150, 0, " "], + [21151, 0, "d"], + [21152, 0, "e"], + [21153, 0, "p"], + [21154, 0, "e"], + [21155, 0, "n"], + [21156, 0, "d"], + [21157, 0, "e"], + [21158, 0, "n"], + [21159, 0, "c"], + [21160, 0, "i"], + [21161, 0, "e"], + [21162, 0, "s"], + [21163, 0, " "], + [21164, 0, "$"], + [21165, 0, "\\"], + [21166, 0, "m"], + [21167, 0, "a"], + [21168, 0, "t"], + [21169, 0, "h"], + [21170, 0, "i"], + [21171, 0, "t"], + [21172, 0, "{"], + [21173, 0, "d"], + [21174, 0, "e"], + [21175, 0, "p"], + [21176, 0, "s"], + [21177, 0, "}"], + [21178, 0, "$"], + [21179, 0, " "], + [21180, 0, "i"], + [21181, 0, "s"], + [21182, 0, " "], + [21183, 0, "t"], + [21184, 0, "o"], + [21185, 0, " "], + [21186, 0, "i"], + [21187, 0, "m"], + [21188, 0, "p"], + [21189, 0, "o"], + [21190, 0, "s"], + [21191, 0, "e"], + [21192, 0, " "], + [21193, 0, "a"], + [21194, 0, " "], + [21195, 0, "p"], + [21196, 0, "a"], + [21197, 0, "r"], + [21198, 0, "t"], + [21199, 0, "i"], + [21200, 0, "a"], + [21201, 0, "l"], + [21202, 0, " "], + [21203, 0, "o"], + [21204, 0, "r"], + [21205, 0, "d"], + [21206, 0, "e"], + [21207, 0, "r"], + [21208, 0, "i"], + [21209, 0, "n"], + [21210, 0, "g"], + [21211, 0, " "], + [21212, 0, "o"], + [21213, 0, "n"], + [21214, 0, " "], + [21215, 0, "o"], + [21216, 0, "p"], + [21217, 0, "e"], + [21218, 0, "r"], + [21219, 0, "a"], + [21220, 0, "t"], + [21221, 0, "i"], + [21222, 0, "o"], + [21223, 0, "n"], + [21224, 0, "s"], + [21225, 0, ":"], + [21226, 0, " "], + [21227, 0, "a"], + [21228, 0, "n"], + [21229, 0, " "], + [21230, 0, "o"], + [21231, 0, "p"], + [21232, 0, "e"], + [21233, 0, "r"], + [21234, 0, "a"], + [21235, 0, "t"], + [21236, 0, "i"], + [21237, 0, "o"], + [21238, 0, "n"], + [21239, 0, " "], + [21240, 0, "c"], + [21241, 0, "a"], + [21242, 0, "n"], + [21243, 0, " "], + [21244, 0, "o"], + [21245, 0, "n"], + [21246, 0, "l"], + [21247, 0, "y"], + [21248, 0, " "], + [21249, 0, "b"], + [21250, 0, "e"], + [21251, 0, " "], + [21252, 0, "a"], + [21253, 0, "p"], + [21254, 0, "p"], + [21255, 0, "l"], + [21256, 0, "i"], + [21257, 0, "e"], + [21258, 0, "d"], + [21259, 0, " "], + [21260, 0, "a"], + [21261, 0, "f"], + [21262, 0, "t"], + [21263, 0, "e"], + [21264, 0, "r"], + [21265, 0, " "], + [21266, 0, "a"], + [21267, 0, "l"], + [21268, 0, "l"], + [21269, 0, " "], + [21270, 0, "o"], + [21271, 0, "p"], + [21272, 0, "e"], + [21273, 0, "r"], + [21274, 0, "a"], + [21275, 0, "t"], + [21276, 0, "i"], + [21277, 0, "o"], + [21278, 0, "n"], + [21279, 0, "s"], + [21280, 0, " "], + [21281, 0, "t"], + [21282, 0, "h"], + [21283, 0, "a"], + [21284, 0, "t"], + [21285, 0, " "], + [21286, 0, "`"], + [21287, 0, "`"], + [21288, 0, "h"], + [21289, 0, "a"], + [21290, 0, "p"], + [21291, 0, "p"], + [21292, 0, "e"], + [21293, 0, "n"], + [21294, 0, "e"], + [21295, 0, "d"], + [21296, 0, " "], + [21297, 0, "b"], + [21298, 0, "e"], + [21299, 0, "f"], + [21300, 0, "o"], + [21301, 0, "r"], + [21302, 0, "e"], + [21303, 0, "'"], + [21304, 0, "'"], + [21305, 0, " "], + [21306, 0, "i"], + [21307, 0, "t"], + [21308, 0, " "], + [21309, 0, "h"], + [21310, 0, "a"], + [21311, 0, "v"], + [21312, 0, "e"], + [21313, 0, " "], + [21314, 0, "b"], + [21315, 0, "e"], + [21316, 0, "e"], + [21317, 0, "n"], + [21318, 0, " "], + [21319, 0, "a"], + [21320, 0, "p"], + [21321, 0, "p"], + [21322, 0, "l"], + [21323, 0, "i"], + [21324, 0, "e"], + [21325, 0, "d"], + [21326, 0, "."], + [21327, 0, " "], + [21328, 0, "I"], + [21329, 0, "n"], + [21330, 0, " "], + [21331, 0, "p"], + [21332, 0, "a"], + [21333, 0, "r"], + [21334, 0, "t"], + [21335, 0, "i"], + [21336, 0, "c"], + [21337, 0, "u"], + [21338, 0, "l"], + [21339, 0, "a"], + [21340, 0, "r"], + [21341, 0, ","], + [21342, 0, " "], + [21343, 0, "t"], + [21344, 0, "h"], + [21345, 0, "i"], + [21346, 0, "s"], + [21347, 0, " "], + [21348, 0, "m"], + [21349, 0, "e"], + [21350, 0, "a"], + [21351, 0, "n"], + [21352, 0, "s"], + [21353, 0, " "], + [21354, 0, "t"], + [21355, 0, "h"], + [21356, 0, "a"], + [21357, 0, "t"], + [21358, 0, " "], + [21359, 0, "t"], + [21360, 0, "h"], + [21361, 0, "e"], + [21362, 0, " "], + [21363, 0, "s"], + [21364, 0, "e"], + [21365, 0, "q"], + [21366, 0, "u"], + [21367, 0, "e"], + [21368, 0, "n"], + [21369, 0, "c"], + [21370, 0, "e"], + [21371, 0, " "], + [21372, 0, "o"], + [21373, 0, "f"], + [21374, 0, " "], + [21375, 0, "o"], + [21376, 0, "p"], + [21377, 0, "e"], + [21378, 0, "r"], + [21379, 0, "a"], + [21380, 0, "t"], + [21381, 0, "i"], + [21382, 0, "o"], + [21383, 0, "n"], + [21384, 0, "s"], + [21385, 0, " "], + [21386, 0, "g"], + [21387, 0, "e"], + [21388, 0, "n"], + [21389, 0, "e"], + [21390, 0, "r"], + [21391, 0, "a"], + [21392, 0, "t"], + [21393, 0, "e"], + [21394, 0, "d"], + [21395, 0, " "], + [21396, 0, "a"], + [21397, 0, "t"], + [21398, 0, " "], + [21399, 0, "o"], + [21400, 0, "n"], + [21401, 0, "e"], + [21402, 0, " "], + [21403, 0, "p"], + [21404, 0, "a"], + [21405, 0, "r"], + [21406, 0, "t"], + [21407, 0, "i"], + [21408, 0, "c"], + [21409, 0, "u"], + [21410, 0, "l"], + [21411, 0, "a"], + [21412, 0, "r"], + [21413, 0, " "], + [21414, 0, "p"], + [21415, 0, "e"], + [21416, 0, "e"], + [21417, 0, "r"], + [21418, 0, " "], + [21419, 0, "w"], + [21420, 0, "i"], + [21421, 0, "l"], + [21422, 0, "l"], + [21423, 0, " "], + [21424, 0, "b"], + [21425, 0, "e"], + [21426, 0, " "], + [21427, 0, "a"], + [21428, 0, "p"], + [21429, 0, "p"], + [21430, 0, "l"], + [21431, 0, "i"], + [21432, 0, "e"], + [21433, 0, "d"], + [21434, 0, " "], + [21435, 0, "i"], + [21436, 0, "n"], + [21437, 0, " "], + [21438, 0, "t"], + [21439, 0, "h"], + [21440, 0, "e"], + [21441, 0, " "], + [21442, 0, "s"], + [21443, 0, "a"], + [21444, 0, "m"], + [21445, 0, "e"], + [21446, 0, " "], + [21447, 0, "o"], + [21448, 0, "r"], + [21449, 0, "d"], + [21450, 0, "e"], + [21451, 0, "r"], + [21452, 0, " "], + [21453, 0, "a"], + [21454, 0, "t"], + [21455, 0, " "], + [21456, 0, "e"], + [21457, 0, "v"], + [21458, 0, "e"], + [21459, 0, "r"], + [21460, 0, "y"], + [21461, 0, " "], + [21462, 0, "o"], + [21463, 0, "t"], + [21464, 0, "h"], + [21465, 0, "e"], + [21466, 0, "r"], + [21467, 0, " "], + [21468, 0, "p"], + [21469, 0, "e"], + [21470, 0, "e"], + [21471, 0, "r"], + [21472, 0, "."], + [21473, 0, " "], + [21474, 0, "O"], + [21475, 0, "p"], + [21476, 0, "e"], + [21477, 0, "r"], + [21478, 0, "a"], + [21479, 0, "t"], + [21480, 0, "i"], + [21481, 0, "o"], + [21482, 0, "n"], + [21483, 0, "s"], + [21484, 0, " "], + [21485, 0, "t"], + [21486, 0, "h"], + [21487, 0, "a"], + [21488, 0, "t"], + [21489, 0, " "], + [21490, 0, "a"], + [21491, 0, "r"], + [21492, 0, "e"], + [21493, 0, " "], + [21494, 0, "c"], + [21495, 0, "o"], + [21496, 0, "n"], + [21497, 0, "c"], + [21498, 0, "u"], + [21499, 0, "r"], + [21500, 0, "r"], + [21501, 0, "e"], + [21502, 0, "n"], + [21503, 0, "t"], + [21504, 0, " "], + [21504, 1], + [21504, 0, ","], + [21505, 0, " "], + [21506, 0, "i"], + [21507, 0, "."], + [21508, 0, "e"], + [21509, 0, "."], + [21510, 0, " "], + [21511, 0, "w"], + [21512, 0, "h"], + [21513, 0, "e"], + [21514, 0, "r"], + [21515, 0, "e"], + [21516, 0, " "], + [21517, 0, "t"], + [21518, 0, "h"], + [21519, 0, "e"], + [21520, 0, "r"], + [21521, 0, "e"], + [21522, 0, " "], + [21523, 0, "i"], + [21524, 0, "s"], + [21525, 0, " "], + [21526, 0, "n"], + [21527, 0, "o"], + [21528, 0, " "], + [21529, 0, "c"], + [21530, 0, "a"], + [21531, 0, "u"], + [21532, 0, "s"], + [21533, 0, "a"], + [21534, 0, "l"], + [21535, 0, " "], + [21536, 0, "d"], + [21537, 0, "e"], + [21538, 0, "p"], + [21539, 0, "e"], + [21540, 0, "n"], + [21541, 0, "d"], + [21542, 0, "e"], + [21543, 0, "n"], + [21544, 0, "c"], + [21545, 0, "y"], + [21546, 0, ","], + [21547, 0, " "], + [21548, 0, "c"], + [21549, 0, "a"], + [21550, 0, "n"], + [21551, 0, " "], + [21552, 0, "b"], + [21553, 0, "e"], + [21554, 0, " "], + [21555, 0, "a"], + [21556, 0, "p"], + [21557, 0, "p"], + [21558, 0, "l"], + [21559, 0, "i"], + [21560, 0, "e"], + [21561, 0, "d"], + [21562, 0, " "], + [21563, 0, "i"], + [21564, 0, "n"], + [21565, 0, " "], + [21566, 0, "a"], + [21567, 0, "n"], + [21568, 0, "y"], + [21569, 0, " "], + [21570, 0, "o"], + [21571, 0, "r"], + [21572, 0, "d"], + [21573, 0, "e"], + [21574, 0, "r"], + [21575, 0, "."], + [21576, 0, "\n"], + [21577, 0, "\n"], + [21578, 0, "\\"], + [21579, 0, "s"], + [21580, 0, "u"], + [21581, 0, "b"], + [21582, 0, "s"], + [21583, 0, "u"], + [21584, 0, "b"], + [21585, 0, "s"], + [21586, 0, "e"], + [21587, 0, "c"], + [21588, 0, "t"], + [21589, 0, "i"], + [21590, 0, "o"], + [21591, 0, "n"], + [21592, 0, "{"], + [21593, 0, "S"], + [21594, 0, "e"], + [21595, 0, "m"], + [21596, 0, "a"], + [21597, 0, "n"], + [21598, 0, "t"], + [21599, 0, "i"], + [21600, 0, "c"], + [21601, 0, "s"], + [21602, 0, " "], + [21603, 0, "o"], + [21604, 0, "f"], + [21605, 0, " "], + [21606, 0, "g"], + [21607, 0, "e"], + [21608, 0, "n"], + [21609, 0, "e"], + [21610, 0, "r"], + [21611, 0, "a"], + [21612, 0, "t"], + [21613, 0, "i"], + [21614, 0, "n"], + [21615, 0, "g"], + [21616, 0, " "], + [21617, 0, "o"], + [21618, 0, "p"], + [21619, 0, "e"], + [21620, 0, "r"], + [21621, 0, "a"], + [21622, 0, "t"], + [21623, 0, "i"], + [21624, 0, "o"], + [21625, 0, "n"], + [21626, 0, "s"], + [21627, 0, "}"], + [22993, 0, "\n"], + [22994, 0, "\n"], + [22995, 0, "T"], + [22996, 0, "h"], + [22997, 0, "e"], + [22998, 0, " "], + [22999, 0, "f"], + [23000, 0, "o"], + [23001, 0, "r"], + [23002, 0, "m"], + [23003, 0, "a"], + [23004, 0, "l"], + [23005, 0, " "], + [23006, 0, "e"], + [23007, 0, "v"], + [23008, 0, "a"], + [23009, 0, "l"], + [23010, 0, "u"], + [23011, 0, "a"], + [23012, 0, "t"], + [23013, 0, "i"], + [23014, 0, "o"], + [23015, 0, "n"], + [23016, 0, " "], + [23017, 0, "r"], + [23018, 0, "u"], + [23019, 0, "l"], + [23020, 0, "e"], + [23021, 0, "s"], + [23022, 0, " "], + [23023, 0, "f"], + [23024, 0, "o"], + [23025, 0, "r"], + [23026, 0, " "], + [23027, 0, "c"], + [23028, 0, "o"], + [23029, 0, "m"], + [23030, 0, "m"], + [23031, 0, "a"], + [23032, 0, "n"], + [23033, 0, "d"], + [23034, 0, "s"], + [23035, 0, " "], + [23036, 0, "a"], + [23037, 0, "r"], + [23038, 0, "e"], + [23039, 0, " "], + [23040, 0, "g"], + [23041, 0, "i"], + [23042, 0, "v"], + [23043, 0, "e"], + [23044, 0, "n"], + [23045, 0, " "], + [23046, 0, "i"], + [23047, 0, "n"], + [23048, 0, " "], + [23049, 0, "F"], + [23050, 0, "i"], + [23051, 0, "g"], + [23052, 0, "u"], + [23053, 0, "r"], + [23054, 0, "e"], + [23055, 0, "~"], + [23056, 0, "\\"], + [23057, 0, "r"], + [23058, 0, "e"], + [23059, 0, "f"], + [23060, 0, "{"], + [23061, 0, "f"], + [23062, 0, "i"], + [23063, 0, "g"], + [23064, 0, ":"], + [23065, 0, "s"], + [23066, 0, "e"], + [23067, 0, "n"], + [23068, 0, "d"], + [23069, 0, "-"], + [23070, 0, "r"], + [23071, 0, "e"], + [23072, 0, "c"], + [23073, 0, "v"], + [23074, 0, "}"], + [23075, 0, "."], + [20671, 0, "s"], + [21658, 1], + [21676, 1], + [21675, 0, "\n"], + [21676, 0, "|"], + [21676, 1], + [21676, 0, "\\"], + [21677, 0, "A"], + [21678, 0, "x"], + [21679, 0, "i"], + [21680, 0, "o"], + [21681, 0, "m"], + [21682, 0, "C"], + [21683, 0, "{"], + [21684, 0, "A"], + [21685, 0, "_"], + [21686, 0, "p"], + [21687, 0, ","], + [21688, 0, "\\"], + [21689, 0, ","], + [21690, 0, " "], + [21691, 0, "\\"], + [21692, 0, "m"], + [21693, 0, "a"], + [21694, 0, "t"], + [21695, 0, "h"], + [21696, 0, "i"], + [21697, 0, "t"], + [21698, 0, "{"], + [21699, 0, "e"], + [21700, 0, "x"], + [21701, 0, "p"], + [21702, 0, "r"], + [21703, 0, "}"], + [21704, 0, " "], + [21705, 0, "\\"], + [21706, 0, "e"], + [21707, 0, "v"], + [21708, 0, "a"], + [21709, 0, "l"], + [21710, 0, "t"], + [21711, 0, "o"], + [21712, 0, " "], + [21713, 0, "\\"], + [21714, 0, "m"], + [21715, 0, "a"], + [21716, 0, "t"], + [21717, 0, "h"], + [21718, 0, "i"], + [21719, 0, "t"], + [21720, 0, "{"], + [21721, 0, "c"], + [21722, 0, "u"], + [21723, 0, "r"], + [21724, 0, "}"], + [21725, 0, "}"], + [21725, 0, "$"], + [21684, 0, "$"], + [21728, 0, "\n"], + [21729, 0, "\\"], + [21730, 0, "A"], + [21731, 0, "x"], + [21732, 0, "i"], + [21733, 0, "o"], + [21734, 0, "m"], + [21735, 0, "C"], + [21736, 0, "{"], + [21737, 0, "$"], + [21738, 0, "\\"], + [21739, 0, "m"], + [21740, 0, "a"], + [21741, 0, "t"], + [21742, 0, "h"], + [21743, 0, "i"], + [21744, 0, "t"], + [21745, 0, "{"], + [21746, 0, "v"], + [21747, 0, "a"], + [21748, 0, "l"], + [21749, 0, "}"], + [21750, 0, ":"], + [21751, 0, " "], + [21752, 0, "\\"], + [21753, 0, "m"], + [21754, 0, "a"], + [21755, 0, "t"], + [21756, 0, "h"], + [21757, 0, "r"], + [21758, 0, "m"], + [21759, 0, "{"], + [21760, 0, "V"], + [21761, 0, "A"], + [21762, 0, "L"], + [21763, 0, "}"], + [21764, 0, " "], + [21765, 0, "\\"], + [21766, 0, "w"], + [21767, 0, "e"], + [21768, 0, "d"], + [21769, 0, "g"], + [21770, 0, "e"], + [21771, 0, " "], + [21772, 0, "\\"], + [21773, 0, "m"], + [21774, 0, "a"], + [21775, 0, "t"], + [21776, 0, "h"], + [21777, 0, "i"], + [21778, 0, "t"], + [21779, 0, " "], + [21780, 0, "\\"], + [21781, 0, "n"], + [21782, 0, "o"], + [21783, 0, "t"], + [21784, 0, "="], + [21785, 0, " "], + [21786, 0, "\\"], + [21787, 0, "v"], + [21788, 0, "e"], + [21789, 0, "r"], + [21790, 0, "b"], + [21791, 0, "|"], + [21792, 0, "["], + [21793, 0, "]"], + [21794, 0, "|"], + [21795, 0, "$"], + [21796, 0, "}"], + [21797, 0, "\n"], + [21798, 0, "\\"], + [21799, 0, "B"], + [21800, 0, "i"], + [21801, 0, "n"], + [21802, 0, "a"], + [21803, 0, "r"], + [21804, 0, "y"], + [21805, 0, "I"], + [21806, 0, "n"], + [21807, 0, "f"], + [21808, 0, "C"], + [21809, 0, "{"], + [21810, 0, "$"], + [21810, 1], + [21810, 0, "o"], + [21811, 0, "k"], + [21812, 0, "}"], + [21794, 1], + [21794, 0, "}"], + [21791, 1], + [21790, 1], + [21789, 1], + [21788, 1], + [21787, 1], + [21787, 0, "m"], + [21788, 0, "a"], + [21789, 0, "t"], + [21790, 0, "h"], + [21791, 0, "t"], + [21792, 0, "t"], + [21793, 0, "{"], + [21797, 0, " "], + [21798, 0, "\\"], + [21799, 0, "w"], + [21800, 0, "e"], + [21801, 0, "d"], + [21802, 0, "g"], + [21803, 0, "e"], + [21804, 0, " "], + [21805, 0, "\\"], + [21779, 0, "{"], + [21780, 0, "v"], + [21781, 0, "a"], + [21782, 0, "l"], + [21783, 0, "}"], + [21810, 1], + [21801, 1], + [21801, 0, "|"], + [21798, 1], + [21797, 1], + [21796, 1], + [21795, 1], + [21794, 1], + [21793, 1], + [21792, 1], + [21792, 0, "v"], + [21793, 0, "e"], + [21794, 0, "r"], + [21795, 0, "b"], + [21796, 0, "|"], + [21791, 0, "\\"], + [21792, 0, "m"], + [21793, 0, "b"], + [21794, 0, "o"], + [21795, 0, "x"], + [21796, 0, "{"], + [21806, 0, "}"], + [21806, 1], + [21805, 1], + [21804, 1], + [21803, 1], + [21802, 1], + [21801, 1], + [21800, 1], + [21799, 1], + [21798, 1], + [21797, 1], + [21796, 1], + [21795, 1], + [21794, 1], + [21793, 1], + [21793, 0, "a"], + [21794, 0, "t"], + [21795, 0, "h"], + [21796, 0, "t"], + [21797, 0, "t"], + [21798, 0, "{"], + [21799, 0, "\\"], + [21800, 0, "l"], + [21801, 0, "b"], + [21802, 0, "r"], + [21803, 0, "a"], + [21804, 0, "c"], + [21805, 0, "k"], + [21806, 0, "\\"], + [21807, 0, "r"], + [21808, 0, "b"], + [21809, 0, "r"], + [21810, 0, "a"], + [21811, 0, "c"], + [21812, 0, "k"], + [21813, 0, "}"], + [21812, 1], + [21811, 1], + [21810, 1], + [21809, 1], + [21808, 1], + [21807, 1], + [21806, 1], + [21805, 1], + [21804, 1], + [21803, 1], + [21802, 1], + [21801, 1], + [21800, 1], + [21799, 1], + [21799, 0, "["], + [21800, 0, "]"], + [21795, 1], + [21794, 1], + [21793, 1], + [21792, 1], + [21792, 0, "t"], + [21793, 0, "e"], + [21794, 0, "x"], + [21795, 0, "t"], + [21765, 0, "\\"], + [21766, 0, ","], + [21773, 0, "\\"], + [21774, 0, ","], + [21807, 0, "\\"], + [21808, 0, ","], + [21815, 0, "\\"], + [21816, 0, ","], + [21817, 0, " "], + [21818, 0, "\\"], + [21819, 0, "m"], + [21820, 0, "a"], + [21821, 0, "t"], + [21822, 0, "h"], + [21823, 0, "i"], + [21824, 0, "t"], + [21825, 0, "{"], + [21826, 0, "v"], + [21827, 0, "a"], + [21828, 0, "l"], + [21829, 0, "}"], + [21830, 0, " "], + [21831, 0, "\\"], + [21832, 0, "n"], + [21833, 0, "o"], + [21834, 0, "t"], + [21835, 0, "="], + [21836, 0, " "], + [21837, 0, "\\"], + [21838, 0, "t"], + [21839, 0, "e"], + [21840, 0, "x"], + [21841, 0, "t"], + [21842, 0, "t"], + [21843, 0, "{"], + [21844, 0, "\\"], + [21845, 0, "{"], + [21846, 0, "\\"], + [21847, 0, "}"], + [21848, 0, "}"], + [21806, 0, "\n"], + [21807, 0, " "], + [21808, 0, " "], + [21809, 0, " "], + [21847, 0, "t"], + [21850, 0, "s"], + [21851, 0, "t"], + [21852, 0, "r"], + [21853, 0, "i"], + [21854, 0, "n"], + [21855, 0, "g"], + [21858, 0, "s"], + [21859, 0, "t"], + [21860, 0, "r"], + [21861, 0, "i"], + [21862, 0, "n"], + [21863, 0, "g"], + [21869, 0, "\n"], + [21870, 0, "\\"], + [21871, 0, "A"], + [21872, 0, "x"], + [21873, 0, "i"], + [21874, 0, "o"], + [21875, 0, "m"], + [21876, 0, "C"], + [21877, 0, "{"], + [21878, 0, "$"], + [21879, 0, "A"], + [21880, 0, "_"], + [21881, 0, "p"], + [21882, 0, ","], + [21883, 0, "\\"], + [21884, 0, ","], + [21885, 0, " "], + [21886, 0, "\\"], + [21887, 0, "m"], + [21888, 0, "a"], + [21889, 0, "t"], + [21890, 0, "h"], + [21891, 0, "s"], + [21892, 0, "f"], + [21893, 0, "{"], + [21894, 0, "m"], + [21895, 0, "a"], + [21896, 0, "k"], + [21897, 0, "e"], + [21898, 0, "O"], + [21899, 0, "p"], + [21900, 0, "}"], + [21901, 0, "("], + [21902, 0, "\\"], + [21903, 0, "m"], + [21904, 0, "a"], + [21905, 0, "t"], + [21906, 0, "h"], + [21907, 0, "i"], + [21908, 0, "t"], + [21909, 0, "{"], + [21910, 0, "c"], + [21911, 0, "u"], + [21912, 0, "r"], + [21913, 0, "}"], + [21914, 0, " "], + [21914, 1], + [21914, 0, ","], + [21915, 0, " "], + [21916, 0, "\\"], + [21917, 0, "m"], + [21918, 0, "a"], + [21919, 0, "t"], + [21920, 0, "h"], + [21921, 0, "s"], + [21922, 0, "f"], + [21923, 0, "{"], + [21924, 0, "a"], + [21925, 0, "s"], + [21926, 0, "s"], + [21927, 0, "i"], + [21928, 0, "g"], + [21929, 0, "n"], + [21930, 0, "}"], + [21931, 0, "("], + [21932, 0, "\\"], + [21933, 0, "m"], + [21934, 0, "a"], + [21935, 0, "t"], + [21936, 0, "h"], + [21937, 0, "i"], + [21938, 0, "t"], + [21939, 0, "{"], + [21940, 0, "v"], + [21941, 0, "a"], + [21942, 0, "l"], + [21943, 0, "}"], + [21944, 0, ")"], + [21945, 0, ")"], + [21946, 0, " "], + [21947, 0, "\\"], + [21948, 0, "e"], + [21949, 0, "v"], + [21950, 0, "a"], + [21951, 0, "l"], + [21952, 0, "t"], + [21953, 0, "o"], + [21954, 0, " "], + [21955, 0, "A"], + [21956, 0, "_"], + [21957, 0, "p"], + [21958, 0, "'"], + [21959, 0, "$"], + [21960, 0, "}"], + [21963, 1], + [21963, 0, "T"], + [21964, 0, "r"], + [21976, 1], + [21975, 1], + [21975, 0, "$"], + [21976, 0, "A"], + [21977, 0, "_"], + [21978, 0, "p"], + [21979, 0, ","], + [21980, 0, "\\"], + [21981, 0, ","], + [21982, 0, " "], + [21983, 0, "\\"], + [21984, 0, "m"], + [21985, 0, "a"], + [21986, 0, "t"], + [21987, 0, "h"], + [21988, 0, "i"], + [21989, 0, "t"], + [21990, 0, "{"], + [21991, 0, "e"], + [21992, 0, "x"], + [21993, 0, "p"], + [21994, 0, "r"], + [21995, 0, "}"], + [21996, 0, " "], + [21997, 0, "\\"], + [21998, 0, "e"], + [21998, 1], + [21997, 1], + [21997, 0, "\\"], + [21998, 0, "t"], + [21999, 0, "e"], + [22000, 0, "x"], + [22001, 0, "t"], + [22002, 0, "{"], + [22003, 0, ":"], + [22003, 1], + [22002, 1], + [22001, 1], + [22000, 1], + [21999, 1], + [21998, 1], + [21998, 0, "m"], + [21999, 0, "a"], + [22000, 0, "t"], + [22001, 0, "h"], + [22002, 0, "b"], + [22003, 0, "i"], + [22004, 0, "n"], + [22005, 0, "("], + [22006, 0, ":"], + [22006, 1], + [22005, 1], + [22005, 0, "{"], + [22006, 0, ":"], + [22007, 0, "="], + [22008, 0, "}"], + [22006, 0, "\\"], + [22007, 0, "t"], + [22008, 0, "e"], + [22009, 0, "x"], + [22010, 0, "t"], + [22011, 0, "{"], + [22014, 0, "}"], + [22016, 0, " "], + [22017, 0, "\\"], + [22018, 0, "m"], + [22019, 0, "a"], + [22020, 0, "t"], + [22021, 0, "h"], + [22022, 0, "i"], + [22023, 0, "t"], + [22024, 0, "{"], + [22025, 0, "v"], + [22026, 0, "a"], + [22027, 0, "l"], + [22028, 0, "}"], + [22029, 0, " "], + [22030, 0, "\\"], + [22031, 0, "e"], + [22032, 0, "v"], + [22033, 0, "a"], + [22034, 0, "l"], + [22035, 0, "t"], + [22036, 0, "o"], + [22037, 0, " "], + [22038, 0, "A"], + [22039, 0, "_"], + [22040, 0, "p"], + [22041, 0, "'"], + [22042, 0, "$"], + [21961, 0, "\n"], + [21962, 0, "\\"], + [21963, 0, "L"], + [21964, 0, "e"], + [21965, 0, "f"], + [21966, 0, "t"], + [21967, 0, "L"], + [21968, 0, "a"], + [21969, 0, "b"], + [21970, 0, "e"], + [21971, 0, "l"], + [21972, 0, "{"], + [21973, 0, "\\"], + [21974, 0, "t"], + [21975, 0, "e"], + [21976, 0, "x"], + [21977, 0, "t"], + [21978, 0, "s"], + [21979, 0, "c"], + [21980, 0, "{"], + [21981, 0, "A"], + [21982, 0, "s"], + [21983, 0, "s"], + [21984, 0, "i"], + [21985, 0, "g"], + [21986, 0, "n"], + [21987, 0, "}"], + [21988, 0, "}"], + [22033, 1], + [22032, 1], + [22031, 1], + [22030, 1], + [22029, 1], + [22028, 1], + [22027, 1], + [22026, 1], + [22025, 1], + [22031, 0, " "], + [22034, 0, " "], + [22035, 1], + [22036, 0, "\\"], + [22037, 0, ","], + [22025, 0, "\\"], + [22026, 0, ","], + [22084, 0, "\n"], + [22085, 0, "\n"], + [22086, 0, "\\"], + [22087, 0, "b"], + [22088, 0, "e"], + [22089, 0, "g"], + [22090, 0, "i"], + [22091, 0, "n"], + [22092, 0, "{"], + [22093, 0, "p"], + [22094, 0, "r"], + [22095, 0, "o"], + [22096, 0, "o"], + [22097, 0, "f"], + [22098, 0, "t"], + [22099, 0, "r"], + [22100, 0, "e"], + [22101, 0, "e"], + [22102, 0, "}"], + [22103, 0, "\n"], + [22104, 0, "\\"], + [22105, 0, "e"], + [22106, 0, "n"], + [22107, 0, "d"], + [22108, 0, "{"], + [22109, 0, "p"], + [22110, 0, "r"], + [22111, 0, "o"], + [22112, 0, "o"], + [22113, 0, "f"], + [22114, 0, "t"], + [22115, 0, "r"], + [22116, 0, "e"], + [22117, 0, "e"], + [22118, 0, "}"], + [22103, 0, "\n"], + [22104, 0, "\\"], + [22105, 0, "A"], + [22106, 0, "x"], + [22107, 0, "i"], + [22108, 0, "o"], + [22109, 0, "m"], + [22110, 0, "C"], + [22111, 0, "{"], + [22112, 0, "$"], + [22113, 0, "A"], + [22114, 0, "_"], + [22115, 0, "p"], + [22116, 0, ","], + [22117, 0, "\\"], + [22118, 0, ","], + [22119, 0, " "], + [22120, 0, "\\"], + [22121, 0, "m"], + [22122, 0, "a"], + [22123, 0, "t"], + [22124, 0, "h"], + [22125, 0, "i"], + [22126, 0, "t"], + [22127, 0, "{"], + [22128, 0, "e"], + [22129, 0, "x"], + [22130, 0, "p"], + [22131, 0, "r"], + [22132, 0, "}"], + [22133, 0, " "], + [22134, 0, "\\"], + [22135, 0, "e"], + [22136, 0, "v"], + [22137, 0, "a"], + [22138, 0, "l"], + [22139, 0, "t"], + [22140, 0, "o"], + [22141, 0, " "], + [22142, 0, "\\"], + [22143, 0, "m"], + [22144, 0, "a"], + [22145, 0, "t"], + [22146, 0, "h"], + [22147, 0, "i"], + [22148, 0, "t"], + [22149, 0, "{"], + [22150, 0, "c"], + [22151, 0, "u"], + [22152, 0, "r"], + [22153, 0, "}"], + [22154, 0, "$"], + [22155, 0, "}"], + [22156, 0, "\n"], + [22157, 0, "\\"], + [22158, 0, "A"], + [22159, 0, "x"], + [22160, 0, "i"], + [22161, 0, "o"], + [22162, 0, "m"], + [22163, 0, "C"], + [22164, 0, "{"], + [22165, 0, "$"], + [22166, 0, "\\"], + [22167, 0, "m"], + [22168, 0, "a"], + [22169, 0, "t"], + [22170, 0, "h"], + [22171, 0, "i"], + [22172, 0, "t"], + [22173, 0, "{"], + [22174, 0, "v"], + [22175, 0, "a"], + [22176, 0, "l"], + [22177, 0, "}"], + [22178, 0, ":"], + [22179, 0, " "], + [22180, 0, "\\"], + [22181, 0, "m"], + [22182, 0, "a"], + [22183, 0, "t"], + [22184, 0, "h"], + [22185, 0, "r"], + [22186, 0, "m"], + [22187, 0, "{"], + [22188, 0, "V"], + [22189, 0, "A"], + [22190, 0, "L"], + [22191, 0, "}"], + [22192, 0, "$"], + [22193, 0, "}"], + [22194, 0, "\n"], + [22195, 0, "\\"], + [22196, 0, "A"], + [22197, 0, "x"], + [22198, 0, "i"], + [22199, 0, "o"], + [22200, 0, "m"], + [22201, 0, "C"], + [22202, 0, "{"], + [22203, 0, "$"], + [22204, 0, "A"], + [22205, 0, "_"], + [22206, 0, "p"], + [22207, 0, ","], + [22208, 0, "\\"], + [22209, 0, ","], + [22210, 0, " "], + [22211, 0, "\\"], + [22212, 0, "m"], + [22213, 0, "a"], + [22214, 0, "t"], + [22215, 0, "h"], + [22216, 0, "s"], + [22217, 0, "f"], + [22218, 0, "{"], + [22219, 0, "m"], + [22220, 0, "a"], + [22221, 0, "k"], + [22222, 0, "e"], + [22223, 0, "O"], + [22224, 0, "p"], + [22225, 0, "}"], + [22226, 0, "("], + [22227, 0, "\\"], + [22228, 0, "m"], + [22229, 0, "a"], + [22230, 0, "t"], + [22231, 0, "h"], + [22232, 0, "i"], + [22233, 0, "t"], + [22234, 0, "{"], + [22235, 0, "c"], + [22236, 0, "u"], + [22237, 0, "r"], + [22238, 0, "}"], + [22239, 0, ","], + [22240, 0, " "], + [22241, 0, "\\"], + [22242, 0, "m"], + [22243, 0, "a"], + [22244, 0, "t"], + [22245, 0, "h"], + [22246, 0, "s"], + [22247, 0, "f"], + [22248, 0, "{"], + [22249, 0, "i"], + [22250, 0, "n"], + [22251, 0, "s"], + [22252, 0, "e"], + [22253, 0, "r"], + [22254, 0, "t"], + [22255, 0, "}"], + [22256, 0, "("], + [22257, 0, "\\"], + [22258, 0, "m"], + [22259, 0, "a"], + [22260, 0, "t"], + [22261, 0, "h"], + [22262, 0, "i"], + [22263, 0, "t"], + [22264, 0, "{"], + [22265, 0, "v"], + [22266, 0, "a"], + [22267, 0, "l"], + [22268, 0, "}"], + [22269, 0, ")"], + [22270, 0, ")"], + [22271, 0, " "], + [22272, 0, "\\"], + [22273, 0, "e"], + [22274, 0, "v"], + [22275, 0, "a"], + [22276, 0, "l"], + [22277, 0, "t"], + [22278, 0, "o"], + [22279, 0, " "], + [22280, 0, "\\"], + [22281, 0, "A"], + [22282, 0, "-"], + [22282, 1], + [22282, 0, "_"], + [22283, 0, "p"], + [22284, 0, "'"], + [22285, 0, "$"], + [22286, 0, "}"], + [22280, 1], + [22286, 0, "\n"], + [22287, 0, "\\"], + [22288, 0, "L"], + [22289, 0, "e"], + [22290, 0, "f"], + [22291, 0, "t"], + [22292, 0, "L"], + [22293, 0, "a"], + [22294, 0, "b"], + [22295, 0, "e"], + [22296, 0, "l"], + [22297, 0, "{"], + [22298, 0, "\\"], + [22299, 0, "t"], + [22300, 0, "e"], + [22301, 0, "x"], + [22302, 0, "t"], + [22303, 0, "s"], + [22304, 0, "c"], + [22305, 0, "{"], + [22306, 0, "I"], + [22307, 0, "n"], + [22308, 0, "s"], + [22309, 0, "e"], + [22310, 0, "r"], + [22311, 0, "t"], + [22312, 0, "}"], + [22313, 0, "}"], + [22314, 0, "\n"], + [22315, 0, "\\"], + [22316, 0, "T"], + [22317, 0, "r"], + [22318, 0, "i"], + [22319, 0, "n"], + [22320, 0, "a"], + [22321, 0, "r"], + [22322, 0, "y"], + [22323, 0, "I"], + [22324, 0, "n"], + [22325, 0, "f"], + [22326, 0, "C"], + [22327, 0, "{"], + [22328, 0, "$"], + [22329, 0, "A"], + [22330, 0, "-"], + [22330, 1], + [22330, 0, "_"], + [22331, 0, "p"], + [22332, 0, ","], + [22333, 0, "\\"], + [22334, 0, ","], + [22335, 0, " "], + [22336, 0, "\\"], + [22337, 0, "m"], + [22338, 0, "a"], + [22339, 0, "t"], + [22340, 0, "h"], + [22341, 0, "i"], + [22342, 0, "t"], + [22343, 0, "{"], + [22344, 0, "e"], + [22345, 0, "x"], + [22346, 0, "p"], + [22347, 0, "r"], + [22348, 0, "}"], + [22349, 0, "."], + [22350, 0, "\\"], + [22351, 0, "m"], + [22352, 0, "a"], + [22353, 0, "t"], + [22354, 0, "h"], + [22355, 0, "s"], + [22356, 0, "f"], + [22357, 0, "{"], + [22358, 0, "i"], + [22359, 0, "n"], + [22360, 0, "s"], + [22361, 0, "e"], + [22362, 0, "r"], + [22363, 0, "t"], + [22364, 0, "}"], + [22365, 0, "("], + [22366, 0, "\\"], + [22367, 0, "m"], + [22368, 0, "a"], + [22369, 0, "t"], + [22370, 0, "h"], + [22371, 0, "i"], + [22372, 0, "t"], + [22373, 0, "{"], + [22374, 0, "v"], + [22375, 0, "a"], + [22376, 0, "l"], + [22377, 0, "}"], + [22378, 0, ")"], + [22379, 0, " "], + [22380, 0, "\\"], + [22381, 0, "e"], + [22382, 0, "v"], + [22383, 0, "a"], + [22384, 0, "l"], + [22385, 0, "t"], + [22386, 0, "o"], + [22387, 0, " "], + [22388, 0, "A"], + [22389, 0, "_"], + [22390, 0, "p"], + [22391, 0, "'"], + [22392, 0, "$"], + [22393, 0, "}"], + [22410, 0, "\n"], + [22411, 0, "\n"], + [22412, 0, "\\"], + [22413, 0, "b"], + [22414, 0, "e"], + [22415, 0, "g"], + [22416, 0, "i"], + [22417, 0, "n"], + [22418, 0, "{"], + [22419, 0, "p"], + [22420, 0, "r"], + [22421, 0, "o"], + [22422, 0, "o"], + [22423, 0, "f"], + [22424, 0, "t"], + [22425, 0, "r"], + [22426, 0, "e"], + [22427, 0, "e"], + [22428, 0, "}"], + [22429, 0, "\n"], + [22430, 0, "\\"], + [22431, 0, "A"], + [22432, 0, "x"], + [22433, 0, "i"], + [22434, 0, "o"], + [22435, 0, "m"], + [22436, 0, "C"], + [22437, 0, "{"], + [22438, 0, "$"], + [22439, 0, "A"], + [22440, 0, "_"], + [22441, 0, "p"], + [22442, 0, ","], + [22443, 0, "\\"], + [22444, 0, ","], + [22445, 0, " "], + [22446, 0, "\\"], + [22447, 0, "m"], + [22448, 0, "a"], + [22449, 0, "t"], + [22450, 0, "h"], + [22451, 0, "i"], + [22452, 0, "t"], + [22453, 0, "{"], + [22454, 0, "e"], + [22455, 0, "x"], + [22456, 0, "p"], + [22457, 0, "r"], + [22458, 0, "}"], + [22459, 0, " "], + [22460, 0, "\\"], + [22461, 0, "e"], + [22462, 0, "v"], + [22463, 0, "a"], + [22464, 0, "l"], + [22465, 0, "t"], + [22466, 0, "o"], + [22467, 0, " "], + [22468, 0, "\\"], + [22469, 0, "m"], + [22470, 0, "a"], + [22471, 0, "t"], + [22472, 0, "h"], + [22473, 0, "i"], + [22474, 0, "t"], + [22475, 0, "{"], + [22476, 0, "c"], + [22477, 0, "u"], + [22478, 0, "r"], + [22479, 0, "}"], + [22480, 0, "$"], + [22481, 0, "}"], + [22482, 0, "\n"], + [22483, 0, "\\"], + [22484, 0, "A"], + [22485, 0, "x"], + [22486, 0, "i"], + [22487, 0, "o"], + [22488, 0, "m"], + [22489, 0, "C"], + [22490, 0, "{"], + [22491, 0, "$"], + [22492, 0, "A"], + [22493, 0, "_"], + [22494, 0, "p"], + [22495, 0, ","], + [22496, 0, "\\"], + [22497, 0, ","], + [22498, 0, " "], + [22499, 0, "\\"], + [22500, 0, "m"], + [22501, 0, "a"], + [22502, 0, "t"], + [22503, 0, "h"], + [22504, 0, "s"], + [22505, 0, "f"], + [22506, 0, "{"], + [22507, 0, "m"], + [22508, 0, "a"], + [22509, 0, "k"], + [22510, 0, "e"], + [22511, 0, "O"], + [22512, 0, "p"], + [22513, 0, "}"], + [22514, 0, "("], + [22515, 0, "\\"], + [22516, 0, "m"], + [22517, 0, "a"], + [22518, 0, "t"], + [22519, 0, "h"], + [22520, 0, "i"], + [22521, 0, "t"], + [22522, 0, "{"], + [22523, 0, "c"], + [22524, 0, "u"], + [22525, 0, "r"], + [22526, 0, "}"], + [22527, 0, ","], + [22528, 0, " "], + [22529, 0, "\\"], + [22530, 0, "m"], + [22531, 0, "a"], + [22532, 0, "t"], + [22533, 0, "h"], + [22534, 0, "s"], + [22535, 0, "f"], + [22536, 0, "{"], + [22537, 0, "d"], + [22538, 0, "e"], + [22539, 0, "l"], + [22540, 0, "e"], + [22541, 0, "t"], + [22542, 0, "e"], + [22543, 0, "}"], + [22544, 0, ")"], + [22545, 0, " "], + [22546, 0, "\\"], + [22547, 0, "e"], + [22548, 0, "v"], + [22549, 0, "a"], + [22550, 0, "l"], + [22551, 0, "t"], + [22552, 0, "o"], + [22553, 0, " "], + [22554, 0, "A"], + [22555, 0, "_"], + [22556, 0, "p"], + [22557, 0, "'"], + [22558, 0, "$"], + [22559, 0, "}"], + [22560, 0, "\n"], + [22561, 0, "\\"], + [22562, 0, "L"], + [22563, 0, "e"], + [22564, 0, "f"], + [22565, 0, "t"], + [22566, 0, "L"], + [22567, 0, "a"], + [22568, 0, "b"], + [22569, 0, "e"], + [22570, 0, "l"], + [22571, 0, "{"], + [22572, 0, "\\"], + [22573, 0, "t"], + [22574, 0, "e"], + [22575, 0, "x"], + [22576, 0, "t"], + [22577, 0, "s"], + [22578, 0, "c"], + [22579, 0, "{"], + [22580, 0, "D"], + [22581, 0, "e"], + [22582, 0, "l"], + [22583, 0, "e"], + [22584, 0, "t"], + [22585, 0, "e"], + [22586, 0, "}"], + [22587, 0, "}"], + [22588, 0, "\n"], + [22589, 0, "\\"], + [22590, 0, "B"], + [22591, 0, "i"], + [22592, 0, "n"], + [22593, 0, "a"], + [22594, 0, "r"], + [22595, 0, "y"], + [22596, 0, "I"], + [22597, 0, "n"], + [22598, 0, "f"], + [22599, 0, "C"], + [22600, 0, "{"], + [22601, 0, "$"], + [22602, 0, "A"], + [22603, 0, "_"], + [22604, 0, "p"], + [22605, 0, ","], + [22606, 0, "\\"], + [22607, 0, ","], + [22608, 0, " "], + [22609, 0, "\\"], + [22610, 0, "m"], + [22611, 0, "a"], + [22612, 0, "t"], + [22613, 0, "h"], + [22614, 0, "i"], + [22615, 0, "t"], + [22616, 0, "{"], + [22617, 0, "e"], + [22618, 0, "x"], + [22619, 0, "p"], + [22620, 0, "r"], + [22621, 0, "}"], + [22622, 0, "."], + [22623, 0, "\\"], + [22624, 0, "m"], + [22625, 0, "a"], + [22626, 0, "t"], + [22627, 0, "h"], + [22628, 0, "s"], + [22629, 0, "f"], + [22630, 0, "{"], + [22631, 0, "d"], + [22632, 0, "e"], + [22633, 0, "l"], + [22634, 0, "e"], + [22635, 0, "t"], + [22636, 0, "e"], + [22637, 0, " "], + [22637, 1], + [22637, 0, "}"], + [22638, 0, " "], + [22639, 0, "\\"], + [22640, 0, "e"], + [22641, 0, "v"], + [22642, 0, "a"], + [22643, 0, "l"], + [22644, 0, "t"], + [22645, 0, "o"], + [22646, 0, " "], + [22647, 0, "A"], + [22648, 0, "_"], + [22649, 0, "p"], + [22650, 0, "'"], + [22651, 0, "$"], + [22652, 0, "}"], + [22653, 0, "\n"], + [22654, 0, "\\"], + [22655, 0, "e"], + [22656, 0, "n"], + [22657, 0, "d"], + [22658, 0, "{"], + [22659, 0, "p"], + [22660, 0, "r"], + [22661, 0, "o"], + [22662, 0, "o"], + [22663, 0, "f"], + [22664, 0, "t"], + [22665, 0, "r"], + [22666, 0, "e"], + [22667, 0, "e"], + [22668, 0, "}"], + [22669, 0, "\n"], + [22670, 0, "\n"], + [22671, 0, "\\"], + [22672, 0, "b"], + [22673, 0, "e"], + [22674, 0, "g"], + [22675, 0, "i"], + [22676, 0, "n"], + [22677, 0, "{"], + [22678, 0, "p"], + [22679, 0, "r"], + [22680, 0, "o"], + [22681, 0, "o"], + [22682, 0, "f"], + [22683, 0, "t"], + [22684, 0, "r"], + [22685, 0, "e"], + [22686, 0, "e"], + [22687, 0, "}"], + [22688, 0, "\n"], + [22689, 0, "\\"], + [22690, 0, "e"], + [22691, 0, "n"], + [22692, 0, "d"], + [22693, 0, "{"], + [22694, 0, "p"], + [22695, 0, "r"], + [22696, 0, "o"], + [22697, 0, "o"], + [22698, 0, "f"], + [22699, 0, "t"], + [22700, 0, "r"], + [22701, 0, "e"], + [22702, 0, "e"], + [22703, 0, "}"], + [22688, 0, "\n"], + [22689, 0, "\\"], + [22690, 0, "A"], + [22691, 0, "x"], + [22692, 0, "i"], + [22693, 0, "o"], + [22694, 0, "m"], + [22695, 0, "C"], + [22696, 0, "{"], + [22697, 0, "$"], + [22698, 0, "\\"], + [22699, 0, "m"], + [22700, 0, "a"], + [22701, 0, "t"], + [22702, 0, "h"], + [22703, 0, "i"], + [22704, 0, "t"], + [22705, 0, "{"], + [22706, 0, "c"], + [22707, 0, "t"], + [22708, 0, "r"], + [22709, 0, "}"], + [22710, 0, " "], + [22711, 0, "="], + [22712, 0, " "], + [22713, 0, "\\"], + [22714, 0, "m"], + [22715, 0, "a"], + [22716, 0, "t"], + [22717, 0, "h"], + [22718, 0, "r"], + [22719, 0, "m"], + [22720, 0, "{"], + [22721, 0, "m"], + [22722, 0, "a"], + [22723, 0, "x"], + [22724, 0, "}"], + [22725, 0, "("], + [22726, 0, "\\"], + [22727, 0, "{"], + [22728, 0, "0"], + [22729, 0, "\\"], + [22730, 0, "}"], + [22731, 0, " "], + [22732, 0, "\\"], + [22733, 0, ","], + [22734, 0, "\\"], + [22735, 0, "c"], + [22736, 0, "u"], + [22737, 0, "p"], + [22738, 0, "\\"], + [22739, 0, ","], + [22740, 0, " "], + [22741, 0, "\\"], + [22742, 0, "{"], + [22743, 0, " "], + [22744, 0, "c"], + [22745, 0, "_"], + [22746, 0, "i"], + [22747, 0, " "], + [22748, 0, "\\"], + [22749, 0, "m"], + [22750, 0, "i"], + [22751, 0, "d"], + [22752, 0, " "], + [22753, 0, "("], + [22754, 0, "c"], + [22755, 0, "_"], + [22756, 0, "i"], + [22757, 0, ","], + [22758, 0, " "], + [22759, 0, "p"], + [22760, 0, "_"], + [22761, 0, "i"], + [22762, 0, ")"], + [22763, 0, " "], + [22764, 0, "\\"], + [22765, 0, "i"], + [22766, 0, "n"], + [22767, 0, " "], + [22768, 0, "A"], + [22769, 0, "_"], + [22770, 0, "p"], + [22771, 0, "("], + [22772, 0, "\\"], + [22773, 0, "m"], + [22774, 0, "a"], + [22775, 0, "t"], + [22776, 0, "h"], + [22777, 0, "s"], + [22778, 0, "f"], + [22779, 0, "{"], + [22780, 0, "o"], + [22781, 0, "p"], + [22782, 0, "s"], + [22783, 0, "}"], + [22784, 0, ")"], + [22785, 0, " "], + [22786, 0, "\\"], + [22787, 0, "}"], + [22788, 0, "#"], + [22789, 0, "}"], + [22789, 1], + [22788, 1], + [22788, 0, "$"], + [22789, 0, "}"], + [22790, 0, "\n"], + [22791, 0, "\\"], + [22792, 0, "A"], + [22793, 0, "x"], + [22794, 0, "i"], + [22795, 0, "o"], + [22796, 0, "m"], + [22797, 0, "C"], + [22798, 0, "{"], + [22799, 0, "$"], + [22800, 0, "\\"], + [22801, 0, "m"], + [22802, 0, "a"], + [22803, 0, "t"], + [22804, 0, "h"], + [22805, 0, "i"], + [22806, 0, "t"], + [22807, 0, "{"], + [22808, 0, "i"], + [22809, 0, "d"], + [22810, 0, "}"], + [22811, 0, " "], + [22812, 0, "="], + [22813, 0, " "], + [22814, 0, "("], + [22815, 0, "\\"], + [22816, 0, "m"], + [22817, 0, "a"], + [22818, 0, "t"], + [22819, 0, "h"], + [22820, 0, "i"], + [22821, 0, "t"], + [22822, 0, "{"], + [22823, 0, "c"], + [22824, 0, "t"], + [22825, 0, "r"], + [22826, 0, "}"], + [22827, 0, ","], + [22828, 0, " "], + [22829, 0, "p"], + [22830, 0, ")"], + [22827, 0, " "], + [22828, 0, "+"], + [22829, 0, " "], + [22830, 0, "1"], + [22835, 0, "$"], + [22836, 0, "}"], + [22837, 0, "\n"], + [22838, 0, "\\"], + [22839, 0, "A"], + [22840, 0, "x"], + [22841, 0, "i"], + [22842, 0, "o"], + [22843, 0, "m"], + [22844, 0, "C"], + [22845, 0, "{"], + [22846, 0, "$"], + [22847, 0, "A"], + [22848, 0, "_"], + [22849, 0, "p"], + [22850, 0, ","], + [22851, 0, "\\"], + [22852, 0, ","], + [22853, 0, " "], + [22854, 0, "\\"], + [22855, 0, "m"], + [22856, 0, "a"], + [22857, 0, "t"], + [22858, 0, "h"], + [22859, 0, "i"], + [22860, 0, "t"], + [22861, 0, "{"], + [22862, 0, "a"], + [22863, 0, "p"], + [22864, 0, "p"], + [22864, 1], + [22863, 1], + [22862, 1], + [22861, 1], + [22860, 1], + [22859, 1], + [22859, 0, "s"], + [22860, 0, "f"], + [22861, 0, "{"], + [22862, 0, "a"], + [22863, 0, "p"], + [22864, 0, "p"], + [22865, 0, "l"], + [22866, 0, "y"], + [22867, 0, "}"], + [22868, 0, "("], + [22869, 0, "\\"], + [22870, 0, "m"], + [22871, 0, "a"], + [22872, 0, "t"], + [22873, 0, "h"], + [22874, 0, "s"], + [22875, 0, "f"], + [22876, 0, "{"], + [22877, 0, "o"], + [22878, 0, "p"], + [22879, 0, "}"], + [22880, 0, "("], + [22881, 0, "\\"], + [22882, 0, "m"], + [22883, 0, "a"], + [22884, 0, "t"], + [22885, 0, "h"], + [22886, 0, "i"], + [22887, 0, "t"], + [22888, 0, "{"], + [22889, 0, "i"], + [22890, 0, "d"], + [22891, 0, "}"], + [22892, 0, ","], + [22893, 0, " "], + [22894, 0, "A"], + [22895, 0, "_"], + [22896, 0, "p"], + [22897, 0, "("], + [22898, 0, "\\"], + [22899, 0, "m"], + [22900, 0, "a"], + [22901, 0, "t"], + [22902, 0, "h"], + [22903, 0, "s"], + [22904, 0, "f"], + [22905, 0, "{"], + [22906, 0, "o"], + [22907, 0, "p"], + [22908, 0, "s"], + [22909, 0, "}"], + [22910, 0, ")"], + [22911, 0, ","], + [22912, 0, " "], + [22913, 0, "\\"], + [22914, 0, "m"], + [22915, 0, "a"], + [22916, 0, "t"], + [22917, 0, "h"], + [22918, 0, "i"], + [22919, 0, "t"], + [22920, 0, "{"], + [22921, 0, "c"], + [22922, 0, "u"], + [22923, 0, "r"], + [22924, 0, "}"], + [22925, 0, ","], + [22926, 0, " "], + [22927, 0, "\\"], + [22928, 0, "m"], + [22929, 0, "a"], + [22930, 0, "t"], + [22931, 0, "h"], + [22932, 0, "i"], + [22933, 0, "t"], + [22934, 0, "{"], + [22935, 0, "m"], + [22936, 0, "u"], + [22937, 0, "t"], + [22938, 0, "}"], + [22939, 0, ")"], + [22940, 0, " "], + [22941, 0, "\\"], + [22942, 0, "e"], + [22943, 0, "v"], + [22944, 0, "a"], + [22945, 0, "l"], + [22946, 0, "t"], + [22947, 0, "o"], + [22948, 0, " "], + [22949, 0, "A"], + [22950, 0, "_"], + [22951, 0, "p"], + [22952, 0, "'"], + [22953, 0, "$"], + [22954, 0, "}"], + [22955, 0, "\n"], + [22956, 0, "\\"], + [22957, 0, "L"], + [22958, 0, "e"], + [22959, 0, "f"], + [22960, 0, "t"], + [22961, 0, "L"], + [22962, 0, "a"], + [22963, 0, "b"], + [22964, 0, "e"], + [22965, 0, "l"], + [22966, 0, "{"], + [22967, 0, "\\"], + [22968, 0, "t"], + [22969, 0, "e"], + [22970, 0, "x"], + [22971, 0, "t"], + [22972, 0, "s"], + [22973, 0, "c"], + [22974, 0, "{"], + [22975, 0, "M"], + [22976, 0, "a"], + [22977, 0, "k"], + [22978, 0, "e"], + [22979, 0, "-"], + [22980, 0, "O"], + [22981, 0, "p"], + [22982, 0, "}"], + [22983, 0, "}"], + [22984, 0, "\n"], + [22985, 0, "\\"], + [22986, 0, "T"], + [22987, 0, "r"], + [22988, 0, "i"], + [22989, 0, "n"], + [22990, 0, "a"], + [22991, 0, "r"], + [22992, 0, "y"], + [22993, 0, "I"], + [22994, 0, "n"], + [22995, 0, "f"], + [22996, 0, "C"], + [22997, 0, "{"], + [22998, 0, "$"], + [22999, 0, "A"], + [23000, 0, "_"], + [23001, 0, "p"], + [23002, 0, ","], + [23003, 0, "\\"], + [23004, 0, ","], + [23005, 0, " "], + [23006, 0, "\\"], + [23007, 0, "m"], + [23008, 0, "a"], + [23009, 0, "t"], + [23010, 0, "h"], + [23011, 0, "s"], + [23012, 0, "f"], + [23013, 0, "{"], + [23014, 0, "m"], + [23015, 0, "a"], + [23016, 0, "k"], + [23017, 0, "e"], + [23018, 0, "O"], + [23019, 0, "p"], + [23020, 0, "}"], + [23021, 0, "("], + [23022, 0, "\\"], + [23023, 0, "m"], + [23024, 0, "a"], + [23025, 0, "t"], + [23026, 0, "h"], + [23027, 0, "i"], + [23028, 0, "t"], + [23029, 0, "{"], + [23030, 0, "c"], + [23031, 0, "u"], + [23032, 0, "r"], + [23033, 0, "}"], + [23034, 0, ","], + [23035, 0, " "], + [23036, 0, "\\"], + [23037, 0, "m"], + [23038, 0, "a"], + [23039, 0, "t"], + [23040, 0, "h"], + [23041, 0, "i"], + [23042, 0, "t"], + [23043, 0, "{"], + [23044, 0, "m"], + [23045, 0, "u"], + [23046, 0, "t"], + [23047, 0, "}"], + [23048, 0, ")"], + [23049, 0, " "], + [23050, 0, "\\"], + [23051, 0, "e"], + [23052, 0, "v"], + [23053, 0, "a"], + [23054, 0, "l"], + [23055, 0, "t"], + [23056, 0, "o"], + [23057, 0, " "], + [23058, 0, "\\"], + [23059, 0, "A"], + [23060, 0, "_"], + [23061, 0, "p"], + [23062, 0, "'"], + [23063, 0, "$"], + [23064, 0, "}"], + [23058, 1], + [22899, 0, "b"], + [22899, 1], + [22890, 1], + [22889, 1], + [22889, 0, "c"], + [22890, 0, "t"], + [22891, 0, "r"], + [22893, 0, " "], + [22894, 0, "+"], + [22895, 0, " "], + [22896, 0, "1"], + [22897, 0, ","], + [22898, 0, " "], + [22899, 0, "p"], + [22900, 0, ")"], + [22881, 0, "("], + [22922, 0, "\n"], + [22923, 0, " "], + [22924, 0, " "], + [22925, 0, " "], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22791, 1], + [22953, 1], + [22953, 1], + [22953, 0, "B"], + [23281, 1], + [23280, 1], + [23279, 1], + [23278, 1], + [23278, 0, ":"], + [23286, 1], + [23285, 1], + [23285, 0, "r"], + [23286, 0, "m"], + [23288, 1], + [23288, 0, "P"], + [23292, 1], + [23292, 0, "I"], + [23293, 0, "D"], + [22906, 0, ")"], + [23807, 1], + [23845, 0, "."], + [23846, 0, "\\"], + [23847, 0, "m"], + [23848, 0, "a"], + [23849, 0, "t"], + [23850, 0, "h"], + [23851, 0, "s"], + [23852, 0, "f"], + [23853, 0, "{"], + [23854, 0, "i"], + [23855, 0, "d"], + [23856, 0, "}"], + [23856, 1], + [23855, 1], + [23854, 1], + [23853, 1], + [23852, 1], + [23851, 1], + [23850, 1], + [23849, 1], + [23848, 1], + [23847, 1], + [23846, 1], + [23845, 1], + [23844, 0, "."], + [23845, 0, "i"], + [23846, 0, "d"], + [23763, 1], + [23762, 1], + [23762, 0, "s"], + [23763, 0, "f"], + [23757, 0, "A"], + [23758, 0, "_"], + [23759, 0, "p"], + [23760, 0, "'"], + [23761, 0, "("], + [23776, 0, ")"], + [23777, 0, " "], + [23778, 0, "\\"], + [23779, 0, ","], + [23780, 0, "\\"], + [23781, 0, "c"], + [23782, 0, "u"], + [23783, 0, "p"], + [23784, 0, "\\"], + [23785, 0, ","], + [23786, 0, " "], + [23787, 0, "\\"], + [23788, 0, "{"], + [23789, 0, "\\"], + [23790, 0, "m"], + [23791, 0, "a"], + [23792, 0, "t"], + [23793, 0, "h"], + [23794, 0, "i"], + [23795, 0, "t"], + [23796, 0, "{"], + [23797, 0, "o"], + [23798, 0, "p"], + [23799, 0, "}"], + [23800, 0, "\\"], + [23801, 0, "}"], + [23663, 1], + [23663, 1], + [23663, 0, "U"], + [23664, 0, "n"], + [23627, 1], + [23626, 1], + [23625, 1], + [23624, 1], + [23623, 1], + [23622, 1], + [23621, 1], + [23620, 1], + [23619, 1], + [23618, 1], + [23617, 1], + [23616, 1], + [23615, 1], + [23614, 1], + [23613, 1], + [23612, 1], + [23611, 1], + [23610, 1], + [23609, 1], + [23608, 1], + [23607, 1], + [23606, 1], + [23605, 1], + [23604, 1], + [23603, 1], + [23602, 1], + [23601, 1], + [23600, 1], + [23599, 1], + [23598, 1], + [23597, 1], + [23596, 1], + [23595, 1], + [23594, 1], + [23593, 1], + [23592, 1], + [23591, 1], + [23590, 1], + [23589, 1], + [23588, 1], + [23587, 1], + [23586, 1], + [23585, 1], + [23584, 1], + [23583, 1], + [23582, 1], + [23581, 1], + [23580, 1], + [23579, 1], + [23578, 1], + [23577, 1], + [23576, 1], + [23575, 1], + [23574, 1], + [23573, 1], + [23572, 1], + [23571, 1], + [23570, 1], + [23569, 1], + [23568, 1], + [23567, 1], + [23566, 1], + [23565, 1], + [23564, 1], + [23563, 1], + [23562, 1], + [23561, 1], + [23560, 1], + [23559, 1], + [23558, 1], + [23557, 1], + [23556, 1], + [23555, 1], + [23554, 1], + [23553, 1], + [23552, 1], + [23551, 1], + [23550, 1], + [23549, 1], + [23548, 1], + [23547, 1], + [23546, 1], + [23545, 1], + [23544, 1], + [23543, 1], + [23542, 1], + [23541, 1], + [23540, 1], + [23539, 1], + [23538, 1], + [23537, 1], + [23536, 1], + [23535, 1], + [23534, 1], + [23533, 1], + [23532, 1], + [23862, 1], + [23850, 1], + [23849, 1], + [23848, 1], + [23847, 1], + [23846, 1], + [23845, 1], + [23844, 1], + [23843, 1], + [23842, 1], + [23841, 1], + [23840, 1], + [23839, 1], + [23838, 1], + [23837, 1], + [23836, 1], + [23835, 1], + [23889, 0, "o"], + [23890, 0, "p"], + [23891, 0, "."], + [23871, 0, "\n"], + [23872, 0, "\\"], + [23873, 0, "A"], + [23874, 0, "x"], + [23875, 0, "i"], + [23876, 0, "o"], + [23877, 0, "m"], + [23878, 0, "C"], + [23879, 0, "{"], + [23880, 0, "$"], + [23881, 0, "\\"], + [23882, 0, "m"], + [23883, 0, "a"], + [23884, 0, "t"], + [23885, 0, "h"], + [23886, 0, "i"], + [23887, 0, "t"], + [23888, 0, "{"], + [23889, 0, "o"], + [23890, 0, "p"], + [23891, 0, "."], + [23892, 0, "i"], + [23893, 0, "d"], + [23894, 0, "}"], + [23895, 0, " "], + [23896, 0, "\\"], + [23897, 0, "n"], + [23898, 0, "o"], + [23899, 0, "t"], + [23900, 0, "\\"], + [23901, 0, "i"], + [23902, 0, "n"], + [23903, 0, " "], + [23900, 1], + [23903, 0, "A"], + [23904, 0, "_"], + [23905, 0, "p"], + [23906, 0, "\\"], + [23906, 1], + [23906, 0, "("], + [23907, 0, "\\"], + [23908, 0, "m"], + [23909, 0, "a"], + [23910, 0, "t"], + [23911, 0, "h"], + [23912, 0, "s"], + [23913, 0, "f"], + [23914, 0, "{"], + [23915, 0, "o"], + [23916, 0, "p"], + [23917, 0, "s"], + [23918, 0, "}"], + [23919, 0, ")"], + [23920, 0, "$"], + [23921, 0, "}"], + [24057, 1], + [24057, 1], + [24057, 1], + [24057, 0, "Q"], + [24058, 0, "u"], + [24059, 0, "a"], + [24060, 0, "t"], + [24061, 0, "e"], + [24062, 0, "r"], + [24179, 0, "."], + [24180, 0, "i"], + [24181, 0, "d"], + [23568, 1], + [24205, 0, "\n"], + [24206, 0, "\n"], + [24207, 0, "\\"], + [24208, 0, "b"], + [24209, 0, "e"], + [24210, 0, "g"], + [24211, 0, "i"], + [24212, 0, "n"], + [24213, 0, "{"], + [24214, 0, "p"], + [24215, 0, "r"], + [24216, 0, "o"], + [24217, 0, "o"], + [24218, 0, "f"], + [24219, 0, "t"], + [24220, 0, "r"], + [24221, 0, "e"], + [24222, 0, "e"], + [24223, 0, "}"], + [24224, 0, "\n"], + [24225, 0, "\\"], + [24226, 0, "A"], + [24227, 0, "x"], + [24228, 0, "i"], + [24229, 0, "o"], + [24230, 0, "m"], + [24231, 0, "C"], + [24232, 0, "{"], + [24233, 0, "}"], + [24234, 0, "\n"], + [24235, 0, "\\"], + [24236, 0, "L"], + [24237, 0, "e"], + [24238, 0, "f"], + [24239, 0, "t"], + [24240, 0, "L"], + [24241, 0, "a"], + [24242, 0, "b"], + [24243, 0, "e"], + [24244, 0, "l"], + [24245, 0, "{"], + [24246, 0, "\\"], + [24247, 0, "t"], + [24248, 0, "e"], + [24249, 0, "x"], + [24250, 0, "t"], + [24251, 0, "s"], + [24252, 0, "c"], + [24253, 0, "{"], + [24254, 0, "S"], + [24255, 0, "e"], + [24256, 0, "n"], + [24257, 0, "d"], + [24258, 0, "}"], + [24259, 0, "}"], + [24260, 0, "\n"], + [24261, 0, "\\"], + [24262, 0, "U"], + [24263, 0, "n"], + [24264, 0, "a"], + [24265, 0, "r"], + [24266, 0, "y"], + [24267, 0, "I"], + [24268, 0, "n"], + [24269, 0, "f"], + [24270, 0, "C"], + [24271, 0, "{"], + [24272, 0, "$"], + [24273, 0, "A"], + [24274, 0, "_"], + [24275, 0, "p"], + [24276, 0, ","], + [24277, 0, "\\"], + [24278, 0, ","], + [24279, 0, " "], + [24280, 0, "\\"], + [24281, 0, "m"], + [24282, 0, "a"], + [24283, 0, "t"], + [24284, 0, "h"], + [24285, 0, "s"], + [24286, 0, "f"], + [24287, 0, "{"], + [24288, 0, "y"], + [24289, 0, "i"], + [24290, 0, "e"], + [24291, 0, "l"], + [24292, 0, "d"], + [24293, 0, "}"], + [24294, 0, " "], + [24295, 0, "\\"], + [24296, 0, "e"], + [24297, 0, "v"], + [24298, 0, "a"], + [24299, 0, "l"], + [24300, 0, "t"], + [24301, 0, "o"], + [24302, 0, "\n"], + [24303, 0, " "], + [24304, 0, " "], + [24305, 0, " "], + [24306, 0, " "], + [24307, 0, "A"], + [24308, 0, "_"], + [24309, 0, "p"], + [24310, 0, "["], + [24311, 0, "\\"], + [24312, 0, ","], + [24313, 0, "\\"], + [24314, 0, "m"], + [24315, 0, "a"], + [24316, 0, "t"], + [24317, 0, "h"], + [24318, 0, "s"], + [24319, 0, "f"], + [24320, 0, "{"], + [24321, 0, "s"], + [24322, 0, "e"], + [24323, 0, "n"], + [24324, 0, "d"], + [24325, 0, "}"], + [24326, 0, " "], + [24327, 0, "\\"], + [24328, 0, ","], + [24329, 0, "\\"], + [24330, 0, "m"], + [24331, 0, "a"], + [24332, 0, "p"], + [24333, 0, "s"], + [24334, 0, "t"], + [24335, 0, "o"], + [24336, 0, "\\"], + [24337, 0, ","], + [24338, 0, " "], + [24339, 0, "A"], + [24340, 0, "_"], + [24341, 0, "p"], + [24342, 0, "("], + [24343, 0, "\\"], + [24344, 0, "m"], + [24345, 0, "a"], + [24346, 0, "t"], + [24347, 0, "h"], + [24348, 0, "s"], + [24349, 0, "f"], + [24350, 0, "{"], + [24351, 0, "s"], + [24352, 0, "e"], + [24353, 0, "n"], + [24354, 0, "d"], + [24355, 0, "}"], + [24356, 0, ")"], + [24357, 0, " "], + [24358, 0, "\\"], + [24359, 0, ","], + [24360, 0, "\\"], + [24361, 0, "c"], + [24362, 0, "u"], + [24363, 0, "p"], + [24364, 0, "\\"], + [24365, 0, ","], + [24366, 0, " "], + [24367, 0, "\\"], + [24367, 1], + [24367, 0, "A"], + [24368, 0, "_"], + [24369, 0, "p"], + [24370, 0, "("], + [24371, 0, "\\"], + [24372, 0, "m"], + [24373, 0, "a"], + [24374, 0, "t"], + [24375, 0, "h"], + [24376, 0, "s"], + [24377, 0, "f"], + [24378, 0, "{"], + [24379, 0, "q"], + [24380, 0, "u"], + [24381, 0, "e"], + [24382, 0, "u"], + [24383, 0, "e"], + [24384, 0, "}"], + [24385, 0, ")"], + [24386, 0, "\\"], + [24387, 0, ","], + [24388, 0, "]"], + [24389, 0, "$"], + [24390, 0, "}"], + [24391, 0, "\n"], + [24392, 0, "\\"], + [24393, 0, "e"], + [24394, 0, "n"], + [24395, 0, "d"], + [24396, 0, "{"], + [24397, 0, "p"], + [24398, 0, "r"], + [24399, 0, "o"], + [24400, 0, "o"], + [24401, 0, "f"], + [24402, 0, "t"], + [24403, 0, "r"], + [24404, 0, "e"], + [24405, 0, "e"], + [24406, 0, "}"], + [24407, 0, "\n"], + [24408, 0, "\n"], + [24409, 0, "\\"], + [24410, 0, "b"], + [24411, 0, "e"], + [24412, 0, "g"], + [24413, 0, "i"], + [24414, 0, "n"], + [24415, 0, "{"], + [24416, 0, "p"], + [24417, 0, "r"], + [24418, 0, "o"], + [24419, 0, "o"], + [24420, 0, "f"], + [24421, 0, "t"], + [24422, 0, "r"], + [24423, 0, "e"], + [24424, 0, "e"], + [24425, 0, "}"], + [24426, 0, "\n"], + [24427, 0, "\\"], + [24428, 0, "A"], + [24429, 0, "x"], + [24430, 0, "i"], + [24431, 0, "o"], + [24432, 0, "m"], + [24433, 0, "C"], + [24434, 0, "{"], + [24435, 0, "$"], + [24436, 0, "a"], + [24437, 0, ":"], + [24438, 0, " "], + [24438, 1], + [24437, 1], + [24436, 1], + [24436, 0, "q"], + [24437, 0, ":"], + [24438, 0, " "], + [24439, 0, "\\"], + [24440, 0, "m"], + [24441, 0, "a"], + [24442, 0, "t"], + [24443, 0, "h"], + [24444, 0, "r"], + [24445, 0, "m"], + [24446, 0, "{"], + [24447, 0, "P"], + [24448, 0, "e"], + [24449, 0, "e"], + [24450, 0, "r"], + [24451, 0, "I"], + [24452, 0, "D"], + [24453, 0, "}"], + [24454, 0, "$"], + [24455, 0, "}"], + [24456, 0, "\n"], + [24457, 0, "\\"], + [24458, 0, "L"], + [24459, 0, "e"], + [24460, 0, "f"], + [24461, 0, "t"], + [24462, 0, "L"], + [24463, 0, "a"], + [24464, 0, "b"], + [24465, 0, "e"], + [24466, 0, "l"], + [24467, 0, "{"], + [24468, 0, "\\"], + [24469, 0, "t"], + [24470, 0, "e"], + [24471, 0, "x"], + [24472, 0, "t"], + [24473, 0, "s"], + [24474, 0, "c"], + [24475, 0, "{"], + [24476, 0, "R"], + [24477, 0, "e"], + [24478, 0, "c"], + [24479, 0, "v"], + [24480, 0, "}"], + [24481, 0, "}"], + [24482, 0, "\n"], + [24483, 0, "\\"], + [24484, 0, "U"], + [24485, 0, "n"], + [24486, 0, "a"], + [24487, 0, "r"], + [24488, 0, "y"], + [24489, 0, "I"], + [24490, 0, "n"], + [24491, 0, "f"], + [24492, 0, "C"], + [24493, 0, "{"], + [24494, 0, "$"], + [24495, 0, "A"], + [24496, 0, "_"], + [24497, 0, "p"], + [24498, 0, ","], + [24499, 0, "\\"], + [24500, 0, ","], + [24501, 0, " "], + [24502, 0, "\\"], + [24503, 0, "m"], + [24504, 0, "a"], + [24505, 0, "t"], + [24506, 0, "h"], + [24507, 0, "s"], + [24508, 0, "f"], + [24509, 0, "{"], + [24510, 0, "y"], + [24511, 0, "i"], + [24512, 0, "e"], + [24513, 0, "l"], + [24514, 0, "d"], + [24515, 0, "}"], + [24516, 0, " "], + [24517, 0, "\\"], + [24518, 0, "e"], + [24519, 0, "v"], + [24520, 0, "a"], + [24521, 0, "l"], + [24522, 0, "t"], + [24523, 0, "o"], + [24524, 0, "\n"], + [24525, 0, " "], + [24526, 0, " "], + [24527, 0, " "], + [24528, 0, " "], + [24529, 0, "A"], + [24530, 0, "_"], + [24531, 0, "p"], + [24532, 0, "["], + [24533, 0, "\\"], + [24534, 0, ","], + [24535, 0, "\\"], + [24536, 0, "m"], + [24537, 0, "a"], + [24538, 0, "t"], + [24539, 0, "h"], + [24540, 0, "s"], + [24541, 0, "f"], + [24542, 0, "{"], + [24543, 0, "r"], + [24544, 0, "e"], + [24545, 0, "c"], + [24546, 0, "v"], + [24547, 0, "}"], + [24548, 0, " "], + [24549, 0, "\\"], + [24550, 0, ","], + [24551, 0, "\\"], + [24552, 0, "m"], + [24553, 0, "a"], + [24554, 0, "p"], + [24555, 0, "s"], + [24556, 0, "t"], + [24557, 0, "o"], + [24558, 0, "\\"], + [24559, 0, ","], + [24560, 0, " "], + [24561, 0, "A"], + [24562, 0, "_"], + [24563, 0, "p"], + [24564, 0, "("], + [24565, 0, "\\"], + [24566, 0, "m"], + [24567, 0, "a"], + [24568, 0, "t"], + [24569, 0, "h"], + [24570, 0, "s"], + [24571, 0, "f"], + [24572, 0, "{"], + [24573, 0, "r"], + [24574, 0, "e"], + [24575, 0, "c"], + [24576, 0, "v"], + [24577, 0, "}"], + [24578, 0, ")"], + [24579, 0, " "], + [24580, 0, "\\"], + [24581, 0, ","], + [24582, 0, "\\"], + [24583, 0, "c"], + [24584, 0, "u"], + [24585, 0, "p"], + [24586, 0, "\\"], + [24587, 0, ","], + [24588, 0, " "], + [24589, 0, "A"], + [24590, 0, "_"], + [24591, 0, "q"], + [24592, 0, "("], + [24593, 0, "\\"], + [24594, 0, "m"], + [24595, 0, "a"], + [24596, 0, "t"], + [24597, 0, "h"], + [24598, 0, "s"], + [24599, 0, "f"], + [24600, 0, "{"], + [24601, 0, "s"], + [24602, 0, "e"], + [24603, 0, "n"], + [24604, 0, "d"], + [24605, 0, "}"], + [24606, 0, ")"], + [24607, 0, "\\"], + [24608, 0, ","], + [24609, 0, "]"], + [24610, 0, "$"], + [24611, 0, "}"], + [24612, 0, "\n"], + [24613, 0, "\\"], + [24614, 0, "p"], + [24615, 0, "r"], + [24616, 0, "o"], + [24617, 0, "o"], + [24618, 0, "f"], + [24618, 1], + [24617, 1], + [24616, 1], + [24615, 1], + [24614, 1], + [24614, 0, "e"], + [24615, 0, "n"], + [24616, 0, "d"], + [24617, 0, "{"], + [24618, 0, "p"], + [24619, 0, "r"], + [24620, 0, "o"], + [24621, 0, "o"], + [24622, 0, "f"], + [24623, 0, "t"], + [24624, 0, "r"], + [24625, 0, "e"], + [24626, 0, "e"], + [24627, 0, "}"], + [23470, 1], + [23469, 1], + [23468, 1], + [23467, 1], + [23466, 1], + [23465, 1], + [23464, 1], + [23463, 1], + [23462, 1], + [23461, 1], + [23460, 1], + [23459, 1], + [23458, 1], + [23457, 1], + [23456, 1], + [23455, 1], + [23454, 1], + [23453, 1], + [23452, 1], + [23451, 1], + [23450, 1], + [23449, 1], + [23448, 1], + [23447, 1], + [23446, 1], + [23445, 1], + [23444, 1], + [23443, 1], + [23442, 1], + [23441, 1], + [23440, 1], + [23439, 1], + [23438, 1], + [23437, 1], + [23436, 1], + [23435, 1], + [23434, 1], + [23433, 1], + [23432, 1], + [23431, 1], + [23430, 1], + [23429, 1], + [23428, 1], + [23427, 1], + [23426, 1], + [23425, 1], + [23424, 1], + [23423, 1], + [23422, 1], + [23421, 1], + [23420, 1], + [23419, 1], + [23418, 1], + [23417, 1], + [23416, 1], + [23415, 1], + [23414, 1], + [23413, 1], + [23412, 1], + [23411, 1], + [23410, 1], + [23409, 1], + [23408, 1], + [23407, 1], + [23406, 1], + [23405, 1], + [23404, 1], + [23403, 1], + [23402, 1], + [23401, 1], + [23400, 1], + [23399, 1], + [23398, 1], + [23397, 1], + [23396, 1], + [23395, 1], + [23394, 1], + [23393, 1], + [23392, 1], + [23391, 1], + [23390, 1], + [23389, 1], + [23388, 1], + [23387, 1], + [23386, 1], + [23385, 1], + [23384, 1], + [23383, 1], + [23382, 1], + [23381, 1], + [23380, 1], + [23379, 1], + [23378, 1], + [23377, 1], + [23376, 1], + [23375, 1], + [23374, 1], + [23373, 1], + [23372, 1], + [23371, 1], + [23370, 1], + [23369, 1], + [23368, 1], + [23367, 1], + [23366, 1], + [23365, 1], + [23364, 1], + [23363, 1], + [23362, 1], + [23361, 1], + [23360, 1], + [23359, 1], + [23358, 1], + [23357, 1], + [23356, 1], + [23355, 1], + [23354, 1], + [23353, 1], + [23352, 1], + [23351, 1], + [23350, 1], + [23349, 1], + [23348, 1], + [23347, 1], + [23346, 1], + [23345, 1], + [23344, 1], + [23343, 1], + [23342, 1], + [23341, 1], + [23340, 1], + [23339, 1], + [23338, 1], + [23337, 1], + [23336, 1], + [23335, 1], + [23334, 1], + [23333, 1], + [23332, 1], + [23331, 1], + [23330, 1], + [23329, 1], + [23328, 1], + [23327, 1], + [23326, 1], + [23325, 1], + [23324, 1], + [23323, 1], + [23322, 1], + [23321, 1], + [23320, 1], + [23319, 1], + [23318, 1], + [23317, 1], + [23316, 1], + [23315, 1], + [23314, 1], + [23313, 1], + [23312, 1], + [23311, 1], + [23310, 1], + [23309, 1], + [23308, 1], + [23307, 1], + [23306, 1], + [23305, 1], + [23304, 1], + [23303, 1], + [23302, 1], + [23301, 1], + [23300, 1], + [23299, 1], + [23298, 1], + [23297, 1], + [23296, 1], + [23295, 1], + [23294, 1], + [23293, 1], + [23292, 1], + [23291, 1], + [23290, 1], + [23289, 1], + [23288, 1], + [23287, 1], + [23286, 1], + [23285, 1], + [23284, 1], + [23283, 1], + [23282, 1], + [23281, 1], + [23280, 1], + [23279, 1], + [23278, 1], + [23277, 1], + [23276, 1], + [23275, 1], + [23274, 1], + [23273, 1], + [23272, 1], + [23271, 1], + [23270, 1], + [23269, 1], + [23268, 1], + [23267, 1], + [23266, 1], + [23265, 1], + [23264, 1], + [23263, 1], + [23262, 1], + [23261, 1], + [23260, 1], + [23259, 1], + [23258, 1], + [23257, 1], + [23256, 1], + [23255, 1], + [23254, 1], + [23253, 1], + [23252, 1], + [23251, 1], + [23250, 1], + [23249, 1], + [23248, 1], + [23247, 1], + [23246, 1], + [23245, 1], + [23244, 1], + [23243, 1], + [23242, 1], + [23241, 1], + [23240, 1], + [23239, 1], + [23238, 1], + [23237, 1], + [23236, 1], + [23235, 1], + [23234, 1], + [23233, 1], + [23232, 1], + [23231, 1], + [23230, 1], + [23229, 1], + [23228, 1], + [23227, 1], + [23226, 1], + [23225, 1], + [23224, 1], + [23223, 1], + [23222, 1], + [23221, 1], + [23220, 1], + [23219, 1], + [23218, 1], + [23217, 1], + [23216, 1], + [23215, 1], + [23214, 1], + [23213, 1], + [23212, 1], + [23211, 1], + [23210, 1], + [23209, 1], + [23208, 1], + [23207, 1], + [23206, 1], + [23205, 1], + [23204, 1], + [23203, 1], + [23202, 1], + [23201, 1], + [23200, 1], + [23199, 1], + [23198, 1], + [23197, 1], + [23196, 1], + [23195, 1], + [23194, 1], + [23193, 1], + [23192, 1], + [23191, 1], + [23190, 1], + [23189, 1], + [23188, 1], + [23187, 1], + [23186, 1], + [23185, 1], + [23184, 1], + [23183, 1], + [23182, 1], + [23181, 1], + [23180, 1], + [23179, 1], + [23178, 1], + [23177, 1], + [23176, 1], + [23175, 1], + [23174, 1], + [23173, 1], + [23172, 1], + [23171, 1], + [23170, 1], + [23169, 1], + [23168, 1], + [23167, 1], + [23166, 1], + [23165, 1], + [23164, 1], + [23163, 1], + [23162, 1], + [23161, 1], + [23160, 1], + [23159, 1], + [23158, 1], + [23157, 1], + [23156, 1], + [23155, 1], + [23154, 1], + [23153, 1], + [23152, 1], + [23151, 1], + [23150, 1], + [23149, 1], + [23148, 1], + [23147, 1], + [23146, 1], + [23145, 1], + [23144, 1], + [23143, 1], + [23142, 1], + [23141, 1], + [23140, 1], + [23139, 1], + [23138, 1], + [23137, 1], + [23136, 1], + [23135, 1], + [23134, 1], + [23133, 1], + [23132, 1], + [23131, 1], + [23130, 1], + [23129, 1], + [23128, 1], + [23127, 1], + [23126, 1], + [23125, 1], + [23124, 1], + [23123, 1], + [23122, 1], + [23121, 1], + [23120, 1], + [23119, 1], + [23118, 1], + [23117, 1], + [23116, 1], + [23115, 1], + [23114, 1], + [23113, 1], + [23112, 1], + [23111, 1], + [23110, 1], + [23109, 1], + [23108, 1], + [23107, 1], + [23106, 1], + [23105, 1], + [23104, 1], + [23103, 1], + [23102, 1], + [23101, 1], + [23100, 1], + [23099, 1], + [23098, 1], + [23097, 1], + [23096, 1], + [23095, 1], + [23094, 1], + [23093, 1], + [23092, 1], + [23091, 1], + [23090, 1], + [23089, 1], + [23088, 1], + [23087, 1], + [23086, 1], + [23085, 1], + [23084, 1], + [23083, 1], + [23082, 1], + [23081, 1], + [23080, 1], + [23079, 1], + [23078, 1], + [23077, 1], + [23076, 1], + [23075, 1], + [23074, 1], + [23073, 1], + [23072, 1], + [23071, 1], + [23070, 1], + [23069, 1], + [23068, 1], + [23067, 1], + [23066, 1], + [23065, 1], + [23064, 1], + [23063, 1], + [23062, 1], + [23061, 1], + [23060, 1], + [23059, 1], + [23058, 1], + [23057, 1], + [23056, 1], + [23055, 1], + [23054, 1], + [23053, 1], + [23052, 1], + [23051, 1], + [23050, 1], + [23049, 1], + [23048, 1], + [24276, 1], + [24275, 1], + [24274, 1], + [24273, 1], + [24272, 1], + [24271, 1], + [24270, 1], + [24269, 1], + [24268, 1], + [24267, 1], + [24266, 1], + [24265, 1], + [24264, 1], + [24263, 1], + [24242, 1], + [24241, 1], + [24240, 1], + [24239, 1], + [24238, 1], + [24237, 1], + [24236, 1], + [24235, 1], + [24234, 1], + [24233, 1], + [24232, 1], + [24231, 1], + [24230, 1], + [24229, 1], + [24228, 1], + [24227, 1], + [24226, 1], + [24225, 1], + [24225, 0, "g"], + [24226, 0, "e"], + [24227, 0, "n"], + [24228, 0, "e"], + [24229, 0, "r"], + [24230, 0, "a"], + [24231, 0, "t"], + [24232, 0, "i"], + [24233, 0, "n"], + [24234, 0, "g"], + [24246, 0, "a"], + [24247, 0, "n"], + [24248, 0, "d"], + [24249, 0, " "], + [24205, 0, "\n"], + [24206, 0, "\n"], + [24207, 0, "\\"], + [24208, 0, "b"], + [24209, 0, "e"], + [24210, 0, "g"], + [24211, 0, "i"], + [24212, 0, "n"], + [24213, 0, "{"], + [24214, 0, "p"], + [24215, 0, "r"], + [24216, 0, "o"], + [24217, 0, "o"], + [24218, 0, "f"], + [24219, 0, "t"], + [24220, 0, "r"], + [24221, 0, "e"], + [24222, 0, "e"], + [24223, 0, "}"], + [24224, 0, "\n"], + [24225, 0, "\\"], + [24226, 0, "A"], + [24227, 0, "x"], + [24228, 0, "i"], + [24229, 0, "o"], + [24230, 0, "m"], + [24231, 0, "C"], + [24232, 0, "{"], + [24233, 0, "$"], + [24234, 0, "A"], + [24235, 0, "_"], + [24236, 0, "p"], + [24237, 0, ","], + [24238, 0, "\\"], + [24239, 0, ","], + [24240, 0, " "], + [24241, 0, "\\"], + [24242, 0, "m"], + [24243, 0, "a"], + [24244, 0, "t"], + [24245, 0, "h"], + [24246, 0, "s"], + [24247, 0, "f"], + [24248, 0, "{"], + [24249, 0, "y"], + [24250, 0, "i"], + [24251, 0, "e"], + [24252, 0, "l"], + [24253, 0, "d"], + [24254, 0, "}"], + [24255, 0, " "], + [24256, 0, "\\"], + [24257, 0, "e"], + [24258, 0, "v"], + [24259, 0, "a"], + [24260, 0, "l"], + [24261, 0, "t"], + [24262, 0, "o"], + [24263, 0, " "], + [24264, 0, "A"], + [24265, 0, "_"], + [24266, 0, "p"], + [24267, 0, "'"], + [24268, 0, "$"], + [24269, 0, "}"], + [24270, 0, "\n"], + [24271, 0, "\\"], + [24272, 0, "A"], + [24273, 0, "x"], + [24274, 0, "i"], + [24275, 0, "o"], + [24276, 0, "m"], + [24277, 0, "C"], + [24278, 0, "{"], + [24279, 0, "$"], + [24280, 0, "A"], + [24281, 0, "_"], + [24282, 0, "p"], + [24283, 0, ","], + [24284, 0, "\\"], + [24285, 0, ","], + [24286, 0, " "], + [24287, 0, "\\"], + [24283, 0, "'"], + [24289, 0, "m"], + [24290, 0, "a"], + [24291, 0, "t"], + [24292, 0, "h"], + [24293, 0, "s"], + [24294, 0, "f"], + [24295, 0, "{"], + [24296, 0, "y"], + [24297, 0, "i"], + [24298, 0, "e"], + [24299, 0, "l"], + [24300, 0, "d"], + [24301, 0, "}"], + [24302, 0, " "], + [24303, 0, "\\"], + [24304, 0, "e"], + [24305, 0, "v"], + [24306, 0, "a"], + [24307, 0, "l"], + [24308, 0, "t"], + [24309, 0, "o"], + [24310, 0, " "], + [24311, 0, "A"], + [24312, 0, "_"], + [24313, 0, "p"], + [24314, 0, "'"], + [24315, 0, "'"], + [24316, 0, "$"], + [24317, 0, "}"], + [24318, 0, "\n"], + [24319, 0, "\\"], + [24320, 0, "L"], + [24321, 0, "e"], + [24322, 0, "f"], + [24323, 0, "t"], + [24324, 0, "L"], + [24325, 0, "a"], + [24326, 0, "b"], + [24327, 0, "e"], + [24328, 0, "l"], + [24329, 0, "{"], + [24330, 0, "\\"], + [24331, 0, "t"], + [24332, 0, "e"], + [24333, 0, "x"], + [24334, 0, "t"], + [24335, 0, "s"], + [24336, 0, "c"], + [24337, 0, "{"], + [24338, 0, "Y"], + [24339, 0, "i"], + [24340, 0, "e"], + [24341, 0, "l"], + [24342, 0, "d"], + [24343, 0, "}"], + [24344, 0, "}"], + [24345, 0, "\n"], + [24346, 0, "\\"], + [24347, 0, "B"], + [24348, 0, "i"], + [24349, 0, "n"], + [24350, 0, "a"], + [24351, 0, "r"], + [24352, 0, "y"], + [24353, 0, "I"], + [24354, 0, "n"], + [24355, 0, "f"], + [24356, 0, "C"], + [24357, 0, "{"], + [24358, 0, "$"], + [24359, 0, "A"], + [24360, 0, "_"], + [24361, 0, "p"], + [24362, 0, ","], + [24363, 0, "\\"], + [24364, 0, ","], + [24365, 0, " "], + [24366, 0, "\\"], + [24367, 0, "m"], + [24368, 0, "a"], + [24369, 0, "t"], + [24370, 0, "h"], + [24371, 0, "s"], + [24372, 0, "f"], + [24373, 0, "{"], + [24374, 0, "y"], + [24375, 0, "i"], + [24376, 0, "e"], + [24377, 0, "l"], + [24378, 0, "d"], + [24379, 0, "}"], + [24380, 0, " "], + [24381, 0, "\\"], + [24382, 0, "e"], + [24383, 0, "v"], + [24384, 0, "a"], + [24385, 0, "l"], + [24386, 0, "t"], + [24387, 0, "o"], + [24388, 0, " "], + [24389, 0, "A"], + [24390, 0, "_"], + [24391, 0, "p"], + [24392, 0, "'"], + [24393, 0, "'"], + [24394, 0, "$"], + [24395, 0, "}"], + [24396, 0, "\n"], + [24397, 0, "\\"], + [24398, 0, "e"], + [24399, 0, "n"], + [24400, 0, "d"], + [24401, 0, "{"], + [24402, 0, "p"], + [24403, 0, "r"], + [24404, 0, "o"], + [24405, 0, "o"], + [24406, 0, "f"], + [24407, 0, "t"], + [24408, 0, "r"], + [24409, 0, "e"], + [24410, 0, "e"], + [24411, 0, "}"], + [24597, 0, " "], + [24598, 0, "T"], + [24599, 0, "h"], + [24600, 0, "e"], + [24601, 0, " "], + [24602, 0, "\\"], + [24603, 0, "t"], + [24604, 0, "e"], + [24605, 0, "x"], + [24606, 0, "t"], + [24607, 0, "s"], + [24608, 0, "c"], + [24609, 0, "{"], + [24610, 0, "A"], + [24611, 0, "s"], + [24612, 0, "s"], + [24613, 0, "i"], + [24614, 0, "g"], + [24615, 0, "n"], + [24616, 0, "}"], + [24617, 0, ","], + [24618, 0, " "], + [24619, 0, "\\"], + [24620, 0, "t"], + [24621, 0, "e"], + [24622, 0, "x"], + [24623, 0, "t"], + [24624, 0, "s"], + [24625, 0, "c"], + [24626, 0, "{"], + [24627, 0, "I"], + [24628, 0, "n"], + [24629, 0, "s"], + [24630, 0, "e"], + [24631, 0, "r"], + [24632, 0, "t"], + [24633, 0, "}"], + [24634, 0, " "], + [24635, 0, "a"], + [24636, 0, "n"], + [24637, 0, "d"], + [24638, 0, " "], + [24639, 0, "\\"], + [24640, 0, "t"], + [24641, 0, "e"], + [24642, 0, "x"], + [24643, 0, "t"], + [24644, 0, "s"], + [24645, 0, "c"], + [24646, 0, "{"], + [24647, 0, "D"], + [24648, 0, "e"], + [24649, 0, "l"], + [24650, 0, "e"], + [24651, 0, "t"], + [24652, 0, "e"], + [24653, 0, "}"], + [24654, 0, " "], + [24655, 0, "r"], + [24656, 0, "u"], + [24657, 0, "l"], + [24658, 0, "e"], + [24659, 0, "s"], + [24660, 0, " "], + [24661, 0, "s"], + [24662, 0, "h"], + [24663, 0, "o"], + [24664, 0, "w"], + [24665, 0, " "], + [24665, 1], + [24664, 1], + [24663, 1], + [24662, 1], + [24661, 1], + [24661, 0, "d"], + [24662, 0, "e"], + [24663, 0, "f"], + [24664, 0, "i"], + [24665, 0, "n"], + [24666, 0, "e"], + [24667, 0, " "], + [24668, 0, "h"], + [24669, 0, "o"], + [24670, 0, "w"], + [24671, 0, " "], + [24672, 0, "t"], + [24673, 0, "h"], + [24674, 0, "e"], + [24675, 0, "s"], + [24676, 0, "e"], + [24677, 0, " "], + [24678, 0, "r"], + [24679, 0, "e"], + [24680, 0, "s"], + [24681, 0, "p"], + [24682, 0, "e"], + [24683, 0, "c"], + [24684, 0, "t"], + [24685, 0, "i"], + [24686, 0, "v"], + [24687, 0, "e"], + [24688, 0, " "], + [24689, 0, "c"], + [24690, 0, "o"], + [24691, 0, "m"], + [24692, 0, "m"], + [24693, 0, "a"], + [24694, 0, "n"], + [24695, 0, "d"], + [24696, 0, "s"], + [24697, 0, " "], + [24698, 0, "m"], + [24699, 0, "u"], + [24700, 0, "t"], + [24701, 0, "a"], + [24702, 0, "t"], + [24703, 0, "e"], + [24704, 0, " "], + [24705, 0, "t"], + [24706, 0, "h"], + [24707, 0, "e"], + [24708, 0, " "], + [24709, 0, "d"], + [24710, 0, "o"], + [24711, 0, "c"], + [24712, 0, "u"], + [24713, 0, "m"], + [24714, 0, "e"], + [24715, 0, "n"], + [24716, 0, "t"], + [24717, 0, ":"], + [24718, 0, " "], + [24719, 0, "a"], + [24720, 0, "l"], + [24721, 0, "l"], + [24722, 0, " "], + [24723, 0, "t"], + [24724, 0, "h"], + [24725, 0, "r"], + [24726, 0, "e"], + [24727, 0, "e"], + [24728, 0, " "], + [24729, 0, "d"], + [24730, 0, "e"], + [24731, 0, "l"], + [24732, 0, "e"], + [24733, 0, "g"], + [24734, 0, "a"], + [24735, 0, "t"], + [24736, 0, "e"], + [24737, 0, " "], + [24738, 0, "t"], + [24739, 0, "h"], + [24740, 0, "e"], + [24741, 0, " "], + [24741, 1], + [24740, 1], + [24739, 1], + [24738, 1], + [24738, 0, "t"], + [24739, 0, "o"], + [24740, 0, " "], + [24741, 0, "t"], + [24742, 0, "h"], + [24743, 0, "e"], + [24744, 0, " "], + [24745, 0, "\\"], + [24746, 0, "t"], + [24747, 0, "e"], + [24748, 0, "x"], + [24749, 0, "t"], + [24750, 0, "s"], + [24751, 0, "c"], + [24752, 0, "{"], + [24753, 0, "M"], + [24754, 0, "a"], + [24755, 0, "k"], + [24756, 0, "e"], + [24757, 0, "-"], + [24758, 0, "O"], + [24759, 0, "p"], + [24760, 0, "}"], + [24761, 0, " "], + [24762, 0, "r"], + [24763, 0, "u"], + [24764, 0, "l"], + [24765, 0, "e"], + [24766, 0, " "], + [24767, 0, "f"], + [24768, 0, "o"], + [24769, 0, "r"], + [24770, 0, " "], + [24771, 0, "g"], + [24772, 0, "e"], + [24773, 0, "n"], + [24774, 0, "e"], + [24775, 0, "r"], + [24776, 0, "a"], + [24777, 0, "t"], + [24778, 0, "i"], + [24779, 0, "n"], + [24780, 0, "g"], + [24781, 0, " "], + [24769, 1], + [24768, 1], + [24767, 1], + [24767, 0, "t"], + [24768, 0, "o"], + [24780, 1], + [24779, 1], + [24778, 1], + [24777, 1], + [24777, 0, "e"], + [24778, 0, " "], + [24779, 0, "a"], + [24780, 0, "n"], + [24781, 0, "d"], + [24782, 0, " "], + [24783, 0, "a"], + [24784, 0, "p"], + [24785, 0, "p"], + [24786, 0, "l"], + [24787, 0, "y"], + [24788, 0, " "], + [24789, 0, "t"], + [24790, 0, "h"], + [24791, 0, "e"], + [24792, 0, " "], + [24793, 0, "o"], + [24794, 0, "p"], + [24795, 0, "e"], + [24796, 0, "r"], + [24797, 0, "a"], + [24798, 0, "t"], + [24799, 0, "i"], + [24800, 0, "o"], + [24801, 0, "n"], + [24802, 0, "."], + [24803, 0, " "], + [24804, 0, "\\"], + [24805, 0, "t"], + [24806, 0, "e"], + [24807, 0, "x"], + [24808, 0, "t"], + [24809, 0, "s"], + [24810, 0, "c"], + [24811, 0, "{"], + [24812, 0, "M"], + [24813, 0, "a"], + [24814, 0, "k"], + [24815, 0, "e"], + [24816, 0, "-"], + [24817, 0, "O"], + [24818, 0, "p"], + [24819, 0, "}"], + [24820, 0, " "], + [24821, 0, "e"], + [24822, 0, "n"], + [24823, 0, "c"], + [24824, 0, "a"], + [24825, 0, "p"], + [24826, 0, "s"], + [24827, 0, "u"], + [24828, 0, "l"], + [24829, 0, "a"], + [24830, 0, "t"], + [24831, 0, "e"], + [24832, 0, "s"], + [24832, 1], + [24831, 1], + [24830, 1], + [24829, 1], + [24828, 1], + [24827, 1], + [24826, 1], + [24825, 1], + [24824, 1], + [24823, 1], + [24822, 1], + [24821, 1], + [24821, 0, "g"], + [24822, 0, "e"], + [24823, 0, "n"], + [24824, 0, "e"], + [24825, 0, "r"], + [24826, 0, "a"], + [24827, 0, "t"], + [24828, 0, "e"], + [24829, 0, "s"], + [24830, 0, " "], + [24831, 0, "a"], + [24832, 0, " "], + [24833, 0, "n"], + [24834, 0, "e"], + [24835, 0, "w"], + [24836, 0, " "], + [24837, 0, "L"], + [24838, 0, "a"], + [24839, 0, "m"], + [24840, 0, "p"], + [24841, 0, "o"], + [24842, 0, "r"], + [24843, 0, "t"], + [24844, 0, " "], + [24845, 0, "t"], + [24846, 0, "i"], + [24847, 0, "m"], + [24848, 0, "e"], + [24849, 0, "s"], + [24850, 0, "t"], + [24851, 0, "a"], + [24852, 0, "m"], + [24853, 0, "p"], + [24854, 0, " "], + [24855, 0, "b"], + [24856, 0, "y"], + [24857, 0, " "], + [24858, 0, "c"], + [24859, 0, "h"], + [24860, 0, "o"], + [24861, 0, "o"], + [24862, 0, "s"], + [24863, 0, "i"], + [24864, 0, "n"], + [24865, 0, "g"], + [24866, 0, " "], + [24867, 0, "a"], + [24868, 0, " "], + [24869, 0, "c"], + [24870, 0, "o"], + [24871, 0, "u"], + [24872, 0, "n"], + [24873, 0, "t"], + [24874, 0, "e"], + [24875, 0, "r"], + [24876, 0, " "], + [24877, 0, "v"], + [24878, 0, "a"], + [24879, 0, "l"], + [24880, 0, "u"], + [24881, 0, "e"], + [24882, 0, " "], + [24883, 0, "t"], + [24884, 0, "h"], + [24885, 0, "a"], + [24886, 0, "t"], + [24887, 0, " "], + [24888, 0, "i"], + [24889, 0, "s"], + [24890, 0, " "], + [24891, 0, "1"], + [24892, 0, " "], + [24893, 0, "g"], + [24894, 0, "r"], + [24895, 0, "e"], + [24896, 0, "a"], + [24897, 0, "t"], + [24898, 0, "e"], + [24899, 0, "r"], + [24900, 0, " "], + [24901, 0, "t"], + [24902, 0, "h"], + [24903, 0, "a"], + [24904, 0, "n"], + [24905, 0, " "], + [24906, 0, "a"], + [24907, 0, "n"], + [24908, 0, "y"], + [24909, 0, " "], + [24910, 0, "e"], + [24911, 0, "x"], + [24912, 0, "i"], + [24913, 0, "s"], + [24914, 0, "t"], + [24915, 0, "i"], + [24916, 0, "n"], + [24917, 0, "g"], + [24918, 0, " "], + [24919, 0, "c"], + [24920, 0, "o"], + [24921, 0, "u"], + [24922, 0, "n"], + [24923, 0, "t"], + [24924, 0, "e"], + [24925, 0, "r"], + [24926, 0, " "], + [24927, 0, "i"], + [24928, 0, "n"], + [24929, 0, " "], + [24930, 0, "$"], + [24931, 0, "A"], + [24932, 0, "_"], + [24933, 0, "p"], + [24934, 0, "("], + [24935, 0, "\\"], + [24936, 0, "m"], + [24937, 0, "a"], + [24938, 0, "t"], + [24939, 0, "h"], + [24940, 0, "s"], + [24941, 0, "f"], + [24942, 0, "{"], + [24943, 0, "o"], + [24944, 0, "p"], + [24945, 0, "s"], + [24946, 0, "}"], + [24947, 0, ")"], + [24948, 0, "$"], + [24949, 0, " "], + [24950, 0, "t"], + [24951, 0, "h"], + [24952, 0, "e"], + [24953, 0, " "], + [24949, 0, ","], + [24955, 0, "s"], + [24956, 0, "e"], + [24957, 0, "t"], + [24958, 0, " "], + [24959, 0, "o"], + [24960, 0, "f"], + [24961, 0, " "], + [24962, 0, "a"], + [24963, 0, "l"], + [24964, 0, "l"], + [24965, 0, " "], + [24966, 0, "o"], + [24967, 0, "p"], + [24968, 0, "e"], + [24969, 0, "r"], + [24970, 0, "a"], + [24971, 0, "t"], + [24972, 0, "i"], + [24973, 0, "o"], + [24974, 0, "n"], + [24975, 0, " "], + [24976, 0, "I"], + [24977, 0, "D"], + [24978, 0, "s"], + [24979, 0, " "], + [24980, 0, "t"], + [24981, 0, "h"], + [24982, 0, "a"], + [24983, 0, "t"], + [24984, 0, " "], + [24985, 0, "h"], + [24986, 0, "a"], + [24987, 0, "v"], + [24988, 0, "e"], + [24989, 0, " "], + [24990, 0, "b"], + [24991, 0, "e"], + [24992, 0, "e"], + [24993, 0, "n"], + [24994, 0, " "], + [24995, 0, "a"], + [24996, 0, "p"], + [24997, 0, "p"], + [24998, 0, "l"], + [24999, 0, "i"], + [25000, 0, "e"], + [25001, 0, "d"], + [25002, 0, " "], + [25003, 0, "t"], + [25004, 0, "o"], + [25005, 0, " "], + [25006, 0, "t"], + [25007, 0, "h"], + [25008, 0, "e"], + [25009, 0, " "], + [25010, 0, "d"], + [25011, 0, "o"], + [25012, 0, "c"], + [25013, 0, "u"], + [25014, 0, "m"], + [25015, 0, "e"], + [25016, 0, "n"], + [25017, 0, "t"], + [25018, 0, "."], + [25019, 0, "\n"], + [25020, 0, "\n"], + [25021, 0, "\\"], + [25022, 0, "t"], + [25023, 0, "e"], + [25024, 0, "x"], + [25025, 0, "t"], + [25026, 0, "s"], + [25027, 0, "c"], + [25028, 0, "{"], + [25029, 0, "M"], + [25030, 0, "a"], + [25031, 0, "k"], + [25032, 0, "e"], + [25033, 0, "-"], + [25034, 0, "O"], + [25035, 0, "p"], + [25036, 0, "}"], + [25037, 0, " "], + [25038, 0, "c"], + [25039, 0, "o"], + [25040, 0, "n"], + [25041, 0, "s"], + [25042, 0, "t"], + [25043, 0, "r"], + [25044, 0, "u"], + [25045, 0, "c"], + [25046, 0, "t"], + [25047, 0, "s"], + [25048, 0, " "], + [25049, 0, "a"], + [25050, 0, "n"], + [25051, 0, " "], + [25052, 0, "\\"], + [25053, 0, "t"], + [25054, 0, "e"], + [25055, 0, "x"], + [25056, 0, "t"], + [25057, 0, "s"], + [25058, 0, "f"], + [25059, 0, "{"], + [25060, 0, "o"], + [25061, 0, "p"], + [25062, 0, "}"], + [25063, 0, " "], + [25062, 0, "("], + [25063, 0, ")"], + [25066, 0, "t"], + [25067, 0, "u"], + [25068, 0, "p"], + [25069, 0, "l"], + [25070, 0, "e"], + [25071, 0, " "], + [25072, 0, "o"], + [25073, 0, "f"], + [25074, 0, " "], + [25075, 0, "t"], + [25076, 0, "h"], + [25077, 0, "e"], + [25078, 0, " "], + [25079, 0, "f"], + [25080, 0, "o"], + [25081, 0, "r"], + [25082, 0, "m"], + [25083, 0, " "], + [25084, 0, "d"], + [25085, 0, "e"], + [25086, 0, "s"], + [25087, 0, "c"], + [25088, 0, "r"], + [25089, 0, "i"], + [25090, 0, "b"], + [25091, 0, "e"], + [25092, 0, "d"], + [25093, 0, " "], + [25094, 0, "a"], + [25095, 0, "b"], + [25096, 0, "o"], + [25097, 0, "v"], + [25098, 0, "e"], + [25099, 0, ","], + [25100, 0, " "], + [25101, 0, "a"], + [25102, 0, "n"], + [25103, 0, "d"], + [25104, 0, " "], + [25105, 0, "d"], + [25106, 0, "e"], + [25107, 0, "l"], + [25108, 0, "e"], + [25109, 0, "g"], + [25110, 0, "a"], + [25111, 0, "t"], + [25112, 0, "e"], + [25113, 0, "s"], + [25114, 0, " "], + [25115, 0, "t"], + [25116, 0, "o"], + [25117, 0, " "], + [25118, 0, "t"], + [25119, 0, "h"], + [25120, 0, "e"], + [25121, 0, " "], + [25122, 0, "\\"], + [25123, 0, "t"], + [25124, 0, "e"], + [25125, 0, "x"], + [25126, 0, "t"], + [25127, 0, "s"], + [25128, 0, "c"], + [25129, 0, "{"], + [25130, 0, "A"], + [25131, 0, "p"], + [25132, 0, "p"], + [25133, 0, "l"], + [25134, 0, "y"], + [25135, 0, "-"], + [25136, 0, "L"], + [25137, 0, "o"], + [25138, 0, "c"], + [25139, 0, "a"], + [25140, 0, "l"], + [25141, 0, "}"], + [25142, 0, " "], + [25143, 0, "r"], + [25144, 0, "u"], + [25145, 0, "l"], + [25146, 0, "e"], + [25147, 0, " "], + [25148, 0, "t"], + [25149, 0, "o"], + [25150, 0, " "], + [25151, 0, "p"], + [25152, 0, "r"], + [25153, 0, "o"], + [25154, 0, "c"], + [25155, 0, "e"], + [25156, 0, "s"], + [25157, 0, "s"], + [25158, 0, " "], + [25159, 0, "t"], + [25160, 0, "h"], + [25161, 0, "e"], + [25162, 0, " "], + [25163, 0, "o"], + [25164, 0, "p"], + [25165, 0, "e"], + [25166, 0, "r"], + [25167, 0, "a"], + [25168, 0, "t"], + [25169, 0, "i"], + [25170, 0, "o"], + [25171, 0, "n"], + [25172, 0, "."], + [25173, 0, " "], + [25174, 0, "\\"], + [25175, 0, "t"], + [25176, 0, "e"], + [25177, 0, "x"], + [25178, 0, "t"], + [25179, 0, "s"], + [25180, 0, "c"], + [25181, 0, "{"], + [25182, 0, "A"], + [25183, 0, "p"], + [25184, 0, "p"], + [25185, 0, "l"], + [25186, 0, "y"], + [25187, 0, "-"], + [25188, 0, "L"], + [25189, 0, "o"], + [25190, 0, "c"], + [25191, 0, "a"], + [25192, 0, "l"], + [25193, 0, "}"], + [25194, 0, " "], + [25195, 0, "d"], + [25196, 0, "o"], + [25197, 0, "e"], + [25198, 0, "s"], + [25199, 0, " "], + [25200, 0, "t"], + [25201, 0, "h"], + [25202, 0, "r"], + [25203, 0, "e"], + [25204, 0, "e"], + [25205, 0, " "], + [25206, 0, "t"], + [25207, 0, "h"], + [25208, 0, "i"], + [25209, 0, "n"], + [25210, 0, "g"], + [25211, 0, "s"], + [25212, 0, ":"], + [25213, 0, " "], + [25214, 0, "i"], + [25215, 0, "t"], + [25216, 0, " "], + [25217, 0, "e"], + [25218, 0, "v"], + [25219, 0, "a"], + [25220, 0, "l"], + [25221, 0, "u"], + [25222, 0, "a"], + [25223, 0, "t"], + [25224, 0, "e"], + [25225, 0, "s"], + [25226, 0, " "], + [25227, 0, "t"], + [25228, 0, "h"], + [25229, 0, "e"], + [25230, 0, " "], + [25231, 0, "o"], + [25232, 0, "p"], + [25233, 0, "e"], + [25234, 0, "r"], + [25235, 0, "a"], + [25236, 0, "t"], + [25237, 0, "i"], + [25238, 0, "o"], + [25239, 0, "n"], + [25240, 0, " "], + [25241, 0, "t"], + [25242, 0, "o"], + [25243, 0, " "], + [25244, 0, "p"], + [25245, 0, "r"], + [25246, 0, "o"], + [25247, 0, "d"], + [25248, 0, "u"], + [25249, 0, "c"], + [25250, 0, "e"], + [25251, 0, " "], + [25252, 0, "a"], + [25253, 0, " "], + [25254, 0, "m"], + [25255, 0, "o"], + [25256, 0, "d"], + [25257, 0, "i"], + [25258, 0, "f"], + [25259, 0, "i"], + [25260, 0, "e"], + [25261, 0, "d"], + [25262, 0, " "], + [25263, 0, "l"], + [25264, 0, "o"], + [25265, 0, "c"], + [25266, 0, "a"], + [25267, 0, "l"], + [25268, 0, " "], + [25269, 0, "s"], + [25270, 0, "t"], + [25271, 0, "a"], + [25272, 0, "t"], + [25273, 0, "e"], + [25274, 0, " "], + [25275, 0, "$"], + [25276, 0, "A"], + [25277, 0, "_"], + [25278, 0, "p"], + [25279, 0, "'"], + [25280, 0, "$"], + [25281, 0, ","], + [25282, 0, " "], + [25283, 0, "i"], + [25284, 0, "t"], + [25285, 0, " "], + [25286, 0, "a"], + [25287, 0, "d"], + [25288, 0, "d"], + [25289, 0, "s"], + [25290, 0, " "], + [25291, 0, "t"], + [25292, 0, "h"], + [25293, 0, "e"], + [25294, 0, " "], + [25295, 0, "o"], + [25296, 0, "p"], + [25297, 0, "e"], + [25298, 0, "r"], + [25299, 0, "a"], + [25300, 0, "t"], + [25301, 0, "i"], + [25302, 0, "o"], + [25303, 0, "n"], + [25304, 0, " "], + [25305, 0, "t"], + [25306, 0, "o"], + [25307, 0, " "], + [25308, 0, "t"], + [25309, 0, "h"], + [25310, 0, "e"], + [25311, 0, " "], + [25312, 0, "q"], + [25313, 0, "u"], + [25314, 0, "e"], + [25315, 0, "u"], + [25316, 0, "e"], + [25317, 0, " "], + [25318, 0, "o"], + [25319, 0, "f"], + [25320, 0, " "], + [25321, 0, "o"], + [25322, 0, "u"], + [25323, 0, "t"], + [25324, 0, "b"], + [25324, 1], + [25323, 1], + [25322, 1], + [25321, 1], + [25321, 0, "g"], + [25322, 0, "e"], + [25323, 0, "n"], + [25324, 0, "e"], + [25325, 0, "r"], + [25326, 0, "a"], + [25327, 0, "t"], + [25328, 0, "e"], + [25329, 0, "d"], + [25330, 0, " "], + [25331, 0, "o"], + [25332, 0, "p"], + [25333, 0, "e"], + [25334, 0, "r"], + [25335, 0, "a"], + [25336, 0, "t"], + [25337, 0, "i"], + [25338, 0, "o"], + [25339, 0, "n"], + [25340, 0, "s"], + [25341, 0, " "], + [25342, 0, "$"], + [25343, 0, "A"], + [25344, 0, "_"], + [25345, 0, "p"], + [25346, 0, "("], + [25347, 0, "\\"], + [25348, 0, "m"], + [25349, 0, "a"], + [25350, 0, "t"], + [25351, 0, "h"], + [25352, 0, "s"], + [25353, 0, "f"], + [25354, 0, "{"], + [25355, 0, "q"], + [25356, 0, "u"], + [25357, 0, "e"], + [25358, 0, "u"], + [25359, 0, "e"], + [25360, 0, "}"], + [25361, 0, ")"], + [25362, 0, "$"], + [25363, 0, ","], + [25364, 0, " "], + [25365, 0, "a"], + [25366, 0, "n"], + [25367, 0, "d"], + [25368, 0, " "], + [25369, 0, "i"], + [25370, 0, "t"], + [25371, 0, " "], + [25372, 0, "a"], + [25373, 0, "d"], + [25374, 0, "d"], + [25375, 0, "s"], + [25376, 0, " "], + [25377, 0, "t"], + [25378, 0, "h"], + [25379, 0, "e"], + [25380, 0, " "], + [25381, 0, "o"], + [25382, 0, "p"], + [25383, 0, "e"], + [25384, 0, "r"], + [25385, 0, "a"], + [25386, 0, "t"], + [25387, 0, "i"], + [25388, 0, "o"], + [25389, 0, "n"], + [25390, 0, " "], + [25391, 0, "I"], + [25392, 0, "D"], + [25393, 0, " "], + [25394, 0, "t"], + [25395, 0, "o"], + [25396, 0, " "], + [25397, 0, "t"], + [25398, 0, "h"], + [25399, 0, "e"], + [25400, 0, " "], + [25401, 0, "s"], + [25402, 0, "e"], + [25403, 0, "t"], + [25404, 0, " "], + [25405, 0, "o"], + [25406, 0, "f"], + [25407, 0, " "], + [25408, 0, "p"], + [25409, 0, "r"], + [25410, 0, "o"], + [25411, 0, "c"], + [25412, 0, "e"], + [25413, 0, "s"], + [25414, 0, "s"], + [25415, 0, "e"], + [25416, 0, "d"], + [25417, 0, " "], + [25418, 0, "o"], + [25419, 0, "p"], + [25420, 0, "e"], + [25421, 0, "r"], + [25422, 0, "a"], + [25423, 0, "t"], + [25424, 0, "i"], + [25425, 0, "o"], + [25426, 0, "n"], + [25427, 0, "s"], + [25428, 0, " "], + [25429, 0, "$"], + [25430, 0, "A"], + [25431, 0, "_"], + [25432, 0, "p"], + [25433, 0, "("], + [25434, 0, "\\"], + [25435, 0, "m"], + [25436, 0, "a"], + [25437, 0, "t"], + [25438, 0, "h"], + [25439, 0, "s"], + [25440, 0, "f"], + [25441, 0, "{"], + [25442, 0, "o"], + [25443, 0, "p"], + [25444, 0, "s"], + [25445, 0, "}"], + [25446, 0, ")"], + [25447, 0, "$"], + [25448, 0, "."], + [25449, 0, "\n"], + [25450, 0, "\n"], + [25451, 0, "T"], + [25452, 0, "h"], + [25453, 0, "e"], + [25454, 0, " "], + [25455, 0, "r"], + [25456, 0, "e"], + [25457, 0, "m"], + [25458, 0, "a"], + [25459, 0, "i"], + [25460, 0, "n"], + [25461, 0, "i"], + [25462, 0, "n"], + [25463, 0, "g"], + [25464, 0, " "], + [25465, 0, "r"], + [25466, 0, "u"], + [25467, 0, "l"], + [25468, 0, "e"], + [25469, 0, "s"], + [25470, 0, " "], + [25471, 0, "i"], + [25472, 0, "n"], + [25473, 0, " "], + [25474, 0, "F"], + [25475, 0, "i"], + [25476, 0, "g"], + [25477, 0, "u"], + [25478, 0, "r"], + [25479, 0, "e"], + [25480, 0, "~"], + [25481, 0, "\\"], + [25482, 0, "r"], + [25483, 0, "e"], + [25484, 0, "f"], + [25485, 0, "{"], + [25486, 0, "f"], + [25487, 0, "i"], + [25488, 0, "g"], + [25489, 0, ":"], + [25490, 0, "s"], + [25491, 0, "e"], + [25492, 0, "n"], + [25493, 0, "d"], + [25494, 0, "-"], + [25495, 0, "r"], + [25496, 0, "e"], + [25497, 0, "c"], + [25498, 0, "v"], + [25499, 0, "}"], + [25500, 0, " "], + [25500, 1], + [25500, 0, ","], + [25501, 0, " "], + [25502, 0, "\\"], + [25503, 0, "t"], + [25504, 0, "e"], + [25505, 0, "x"], + [25506, 0, "t"], + [25507, 0, "s"], + [25508, 0, "c"], + [25509, 0, "{"], + [25510, 0, "A"], + [25511, 0, "p"], + [25512, 0, "p"], + [25513, 0, "l"], + [25514, 0, "y"], + [25515, 0, "-"], + [25516, 0, "R"], + [25517, 0, "e"], + [25518, 0, "m"], + [25519, 0, "o"], + [25520, 0, "t"], + [25521, 0, "e"], + [25522, 0, "}"], + [25523, 0, ","], + [25524, 0, " "], + [25525, 0, "\\"], + [25526, 0, "t"], + [25527, 0, "e"], + [25528, 0, "x"], + [25529, 0, "t"], + [25530, 0, "s"], + [25531, 0, "c"], + [25532, 0, "{"], + [25533, 0, "S"], + [25534, 0, "e"], + [25535, 0, "n"], + [25536, 0, "d"], + [25537, 0, "}"], + [25538, 0, ","], + [25539, 0, " "], + [25540, 0, "\\"], + [25541, 0, "t"], + [25542, 0, "e"], + [25543, 0, "x"], + [25544, 0, "t"], + [25545, 0, "s"], + [25546, 0, "c"], + [25547, 0, "{"], + [25548, 0, "R"], + [25549, 0, "e"], + [25550, 0, "c"], + [25551, 0, "v"], + [25552, 0, "}"], + [25553, 0, " "], + [25554, 0, "a"], + [25555, 0, "n"], + [25556, 0, "d"], + [25557, 0, " "], + [25558, 0, "\\"], + [25559, 0, "t"], + [25560, 0, "e"], + [25561, 0, "x"], + [25562, 0, "t"], + [25563, 0, "s"], + [25564, 0, "c"], + [25565, 0, "{"], + [25566, 0, "Y"], + [25567, 0, "i"], + [25568, 0, "e"], + [25569, 0, "l"], + [25570, 0, "d"], + [25571, 0, "}"], + [25572, 0, " "], + [25573, 0, "d"], + [25574, 0, "e"], + [25575, 0, "f"], + [25576, 0, "i"], + [25577, 0, "n"], + [25578, 0, "e"], + [25579, 0, " "], + [25580, 0, "t"], + [25581, 0, "h"], + [25582, 0, "e"], + [25583, 0, " "], + [25584, 0, "s"], + [25585, 0, "e"], + [25586, 0, "m"], + [25587, 0, "a"], + [25588, 0, "n"], + [25589, 0, "t"], + [25590, 0, "i"], + [25591, 0, "c"], + [25592, 0, "s"], + [25593, 0, " "], + [25594, 0, "o"], + [25595, 0, "f"], + [25596, 0, " "], + [25597, 0, "t"], + [25598, 0, "h"], + [25599, 0, "e"], + [25600, 0, " "], + [25601, 0, "\\"], + [25602, 0, "t"], + [25603, 0, "e"], + [25604, 0, "x"], + [25605, 0, "t"], + [25606, 0, "s"], + [25607, 0, "f"], + [25608, 0, "{"], + [25609, 0, "y"], + [25610, 0, "i"], + [25611, 0, "e"], + [25612, 0, "l"], + [25613, 0, "d"], + [25614, 0, "}"], + [25615, 0, " "], + [25616, 0, "c"], + [25617, 0, "o"], + [25618, 0, "m"], + [25619, 0, "m"], + [25620, 0, "a"], + [25621, 0, "n"], + [25622, 0, "d"], + [25623, 0, "."], + [25624, 0, " "], + [25625, 0, "T"], + [25626, 0, "h"], + [25627, 0, "e"], + [25628, 0, "s"], + [25629, 0, "e"], + [25630, 0, " "], + [25630, 1], + [25629, 1], + [25628, 1], + [25627, 1], + [25627, 0, "i"], + [25628, 0, "s"], + [25629, 0, " "], + [25630, 0, "s"], + [25631, 0, "e"], + [25632, 0, "m"], + [25633, 0, "a"], + [25634, 0, "n"], + [25634, 1], + [25633, 1], + [25632, 1], + [25631, 1], + [25630, 1], + [25629, 1], + [25628, 1], + [25627, 1], + [25626, 1], + [25625, 1], + [25625, 0, "S"], + [25626, 0, "i"], + [25627, 0, "n"], + [25628, 0, "c"], + [25629, 0, "e"], + [25630, 0, " "], + [25631, 0, "a"], + [25632, 0, "n"], + [25633, 0, "y"], + [25634, 0, " "], + [25635, 0, "o"], + [25636, 0, "f"], + [25637, 0, " "], + [25638, 0, "t"], + [25639, 0, "h"], + [25640, 0, "e"], + [25641, 0, "s"], + [25642, 0, "e"], + [25643, 0, " "], + [25644, 0, "r"], + [25645, 0, "u"], + [25646, 0, "l"], + [25647, 0, "e"], + [25648, 0, "s"], + [25649, 0, " "], + [25650, 0, "c"], + [25651, 0, "a"], + [25652, 0, "n"], + [25653, 0, " "], + [25654, 0, "b"], + [25655, 0, "e"], + [25656, 0, " "], + [25657, 0, "u"], + [25658, 0, "s"], + [25659, 0, "e"], + [25660, 0, "d"], + [25661, 0, " "], + [25662, 0, "t"], + [25663, 0, "o"], + [25664, 0, " "], + [25665, 0, "e"], + [25666, 0, "v"], + [25667, 0, "a"], + [25668, 0, "l"], + [25669, 0, "u"], + [25670, 0, "a"], + [25671, 0, "t"], + [25672, 0, "e"], + [25673, 0, " "], + [25674, 0, "\\"], + [25675, 0, "t"], + [25676, 0, "e"], + [25677, 0, "x"], + [25678, 0, "t"], + [25679, 0, "s"], + [25680, 0, "f"], + [25681, 0, "{"], + [25682, 0, "y"], + [25683, 0, "i"], + [25684, 0, "e"], + [25685, 0, "l"], + [25686, 0, "d"], + [25687, 0, "}"], + [25688, 0, ","], + [25689, 0, " "], + [25690, 0, "t"], + [25691, 0, "h"], + [25692, 0, "e"], + [25693, 0, " "], + [25694, 0, "s"], + [25695, 0, "e"], + [25696, 0, "m"], + [25697, 0, "a"], + [25698, 0, "n"], + [25699, 0, "t"], + [25700, 0, "i"], + [25701, 0, "c"], + [25702, 0, "s"], + [25703, 0, " "], + [25704, 0, "i"], + [25705, 0, "s"], + [25706, 0, " "], + [25707, 0, "n"], + [25708, 0, "o"], + [25709, 0, "n"], + [25710, 0, "d"], + [25711, 0, "e"], + [25712, 0, "t"], + [25713, 0, "e"], + [25714, 0, "r"], + [25715, 0, "m"], + [25716, 0, "i"], + [25717, 0, "n"], + [25718, 0, "i"], + [25719, 0, "s"], + [25720, 0, "t"], + [25721, 0, "i"], + [25722, 0, "c"], + [25723, 0, ","], + [25724, 0, " "], + [25725, 0, "w"], + [25726, 0, "h"], + [25727, 0, "i"], + [25728, 0, "c"], + [25729, 0, "h"], + [25730, 0, " "], + [25731, 0, "m"], + [25732, 0, "o"], + [25733, 0, "d"], + [25734, 0, "e"], + [25735, 0, "l"], + [25736, 0, "s"], + [25737, 0, " "], + [25738, 0, "t"], + [25739, 0, "h"], + [25740, 0, "e"], + [25741, 0, " "], + [25742, 0, "a"], + [25743, 0, "s"], + [25744, 0, "y"], + [25745, 0, "n"], + [25746, 0, "c"], + [25747, 0, "h"], + [25748, 0, "r"], + [25749, 0, "o"], + [25750, 0, "n"], + [25751, 0, "i"], + [25752, 0, "c"], + [25753, 0, "i"], + [25754, 0, "t"], + [25755, 0, "y"], + [25756, 0, " "], + [25757, 0, "o"], + [25758, 0, "f"], + [25759, 0, " "], + [25760, 0, "n"], + [25760, 1], + [25760, 0, "t"], + [25761, 0, "h"], + [25762, 0, "e"], + [25763, 0, " "], + [25764, 0, "n"], + [25765, 0, "e"], + [25766, 0, "t"], + [25767, 0, "w"], + [25768, 0, "o"], + [25769, 0, "r"], + [25770, 0, "k"], + [25771, 0, " "], + [25772, 0, "b"], + [25773, 0, "e"], + [25774, 0, "t"], + [25775, 0, "w"], + [25776, 0, "e"], + [25777, 0, "e"], + [25778, 0, "n"], + [25779, 0, " "], + [25780, 0, "p"], + [25781, 0, "e"], + [25782, 0, "e"], + [25783, 0, "r"], + [25784, 0, "s"], + [25785, 0, ":"], + [25786, 0, " "], + [25787, 0, "a"], + [25788, 0, " "], + [25789, 0, ","], + [25790, 0, "e"], + [25791, 0, "s"], + [25792, 0, "s"], + [25793, 0, "a"], + [25794, 0, "g"], + [25789, 1], + [25789, 0, "m"], + [25795, 0, "e"], + [25796, 0, " "], + [25797, 0, "s"], + [25798, 0, "e"], + [25799, 0, "n"], + [25800, 0, "t"], + [25801, 0, " "], + [25802, 0, "b"], + [25803, 0, "y"], + [25804, 0, " "], + [25805, 0, "o"], + [25806, 0, "n"], + [25807, 0, "e"], + [25808, 0, " "], + [25809, 0, "p"], + [25810, 0, "e"], + [25811, 0, "e"], + [25812, 0, "r"], + [25813, 0, " "], + [25814, 0, "a"], + [25815, 0, "r"], + [25816, 0, "r"], + [25817, 0, "i"], + [25818, 0, "v"], + [25819, 0, "e"], + [25820, 0, "s"], + [25821, 0, " "], + [25822, 0, "a"], + [25823, 0, "t"], + [25824, 0, " "], + [25825, 0, "a"], + [25826, 0, "n"], + [25827, 0, "o"], + [25828, 0, "t"], + [25829, 0, "h"], + [25830, 0, "e"], + [25831, 0, "r"], + [25832, 0, " "], + [25833, 0, "p"], + [25834, 0, "e"], + [25835, 0, "e"], + [25836, 0, "r"], + [25837, 0, " "], + [25838, 0, "s"], + [25839, 0, "o"], + [25840, 0, "m"], + [25841, 0, "e"], + [25842, 0, " "], + [25842, 1], + [25841, 1], + [25840, 1], + [25839, 1], + [25838, 1], + [25838, 0, "s"], + [25839, 0, "o"], + [25840, 0, "m"], + [25841, 0, "e"], + [25842, 0, " "], + [25842, 1], + [25841, 1], + [25840, 1], + [25839, 1], + [25838, 1], + [25838, 0, "a"], + [25839, 0, "t"], + [25840, 0, " "], + [25841, 0, "s"], + [25842, 0, "o"], + [25843, 0, "m"], + [25844, 0, "e"], + [25845, 0, " "], + [25846, 0, "a"], + [25847, 0, "r"], + [25848, 0, "b"], + [25849, 0, "i"], + [25850, 0, "t"], + [25851, 0, "r"], + [25852, 0, "a"], + [25853, 0, "r"], + [25854, 0, "i"], + [25855, 0, "l"], + [25856, 0, "y"], + [25857, 0, " "], + [25858, 0, "l"], + [25859, 0, "a"], + [25860, 0, "t"], + [25861, 0, "e"], + [25862, 0, "r"], + [25863, 0, " "], + [25864, 0, "p"], + [25865, 0, "o"], + [25866, 0, "i"], + [25867, 0, "n"], + [25868, 0, "t"], + [25869, 0, " "], + [25870, 0, "i"], + [25871, 0, "n"], + [25872, 0, " "], + [25873, 0, "t"], + [25874, 0, "i"], + [25875, 0, "m"], + [25876, 0, "e"], + [25877, 0, "."], + [25877, 0, ","], + [25878, 0, " "], + [25879, 0, "a"], + [25880, 0, "n"], + [25881, 0, "d"], + [25882, 0, " "], + [25883, 0, "t"], + [25884, 0, "h"], + [25885, 0, "e"], + [25886, 0, "r"], + [25887, 0, "e"], + [25888, 0, " "], + [25889, 0, "i"], + [25890, 0, "s"], + [25891, 0, " "], + [25892, 0, "n"], + [25893, 0, "o"], + [25894, 0, " "], + [25895, 0, "o"], + [25896, 0, "r"], + [25897, 0, "d"], + [25898, 0, "e"], + [25899, 0, "r"], + [25900, 0, "i"], + [25901, 0, "n"], + [25902, 0, "g"], + [25903, 0, " "], + [25904, 0, "g"], + [25905, 0, "u"], + [25906, 0, "a"], + [25907, 0, "r"], + [25908, 0, "a"], + [25909, 0, "n"], + [25910, 0, "t"], + [25911, 0, "e"], + [25912, 0, "e"], + [25913, 0, " "], + [25914, 0, "i"], + [25915, 0, "n"], + [25916, 0, " "], + [25917, 0, "t"], + [25918, 0, "h"], + [25919, 0, "e"], + [25920, 0, " "], + [25921, 0, "n"], + [25922, 0, "e"], + [25923, 0, "t"], + [25924, 0, "w"], + [25925, 0, "o"], + [25926, 0, "r"], + [25927, 0, "k"], + [25895, 0, "m"], + [25896, 0, "e"], + [25897, 0, "s"], + [25898, 0, "a"], + [25899, 0, "g"], + [25900, 0, "e"], + [25901, 0, " "], + [25936, 0, "\n"], + [25937, 0, "\n"], + [25938, 0, "\\"], + [25939, 0, "t"], + [25940, 0, "e"], + [25941, 0, "x"], + [25942, 0, "t"], + [25943, 0, "s"], + [25944, 0, "c"], + [25945, 0, "{"], + [25946, 0, "S"], + [25947, 0, "e"], + [25948, 0, "n"], + [25949, 0, "d"], + [25950, 0, "}"], + [25951, 0, " "], + [25938, 0, "T"], + [25939, 0, "h"], + [25940, 0, "e"], + [25941, 0, " "], + [25956, 0, "r"], + [25957, 0, "u"], + [25958, 0, "l"], + [25959, 0, "e"], + [25960, 0, " "], + [25961, 0, "t"], + [25962, 0, "a"], + [25963, 0, "k"], + [25964, 0, "e"], + [25965, 0, "s"], + [25966, 0, " "], + [25967, 0, "a"], + [25968, 0, "n"], + [25969, 0, "y"], + [25970, 0, " "], + [25971, 0, "o"], + [25972, 0, "p"], + [25973, 0, "e"], + [25974, 0, "r"], + [25975, 0, "a"], + [25976, 0, "t"], + [25977, 0, "i"], + [25978, 0, "o"], + [25979, 0, "n"], + [25980, 0, "s"], + [25981, 0, " "], + [25982, 0, "t"], + [25983, 0, "h"], + [25984, 0, "a"], + [25985, 0, "t"], + [25986, 0, " "], + [25987, 0, "w"], + [25988, 0, "e"], + [25989, 0, "r"], + [25990, 0, "e"], + [25991, 0, " "], + [25992, 0, "p"], + [25993, 0, "l"], + [25994, 0, "a"], + [25995, 0, "c"], + [25996, 0, "e"], + [25997, 0, "d"], + [25998, 0, " "], + [25999, 0, "i"], + [26000, 0, "n"], + [26001, 0, " "], + [26002, 0, "t"], + [26003, 0, "h"], + [26003, 1], + [26002, 1], + [26001, 1], + [26001, 0, " "], + [26002, 0, "$"], + [26003, 0, "A"], + [26004, 0, "_"], + [26005, 0, "p"], + [26006, 0, "("], + [26007, 0, "\\"], + [26008, 0, "m"], + [26009, 0, "a"], + [26010, 0, "t"], + [26011, 0, "h"], + [26012, 0, "s"], + [26013, 0, "f"], + [26014, 0, "{"], + [26015, 0, "q"], + [26016, 0, "u"], + [26017, 0, "e"], + [26018, 0, "u"], + [26019, 0, "e"], + [26020, 0, "}"], + [26021, 0, ")"], + [26022, 0, "$"], + [26023, 0, " "], + [26024, 0, "b"], + [26025, 0, "y"], + [26026, 0, " "], + [26027, 0, "\\"], + [26028, 0, "t"], + [26029, 0, "e"], + [26030, 0, "x"], + [26031, 0, "t"], + [26032, 0, "s"], + [26033, 0, "c"], + [26034, 0, "{"], + [26035, 0, "A"], + [26036, 0, "p"], + [26037, 0, "p"], + [26038, 0, "l"], + [26039, 0, "y"], + [26040, 0, "-"], + [26041, 0, "L"], + [26042, 0, "o"], + [26043, 0, "c"], + [26044, 0, "a"], + [26045, 0, "l"], + [26046, 0, "}"], + [26047, 0, " "], + [26048, 0, "a"], + [26049, 0, "n"], + [26050, 0, "d"], + [26051, 0, " "], + [26052, 0, "a"], + [26053, 0, "d"], + [26054, 0, "d"], + [26055, 0, "s"], + [26056, 0, " "], + [26057, 0, "t"], + [26058, 0, "h"], + [26059, 0, "e"], + [26060, 0, "m"], + [26061, 0, " "], + [26062, 0, "t"], + [26063, 0, "o"], + [26064, 0, " "], + [26065, 0, "a"], + [26066, 0, " "], + [26067, 0, "s"], + [26068, 0, "e"], + [26069, 0, "n"], + [26070, 0, "d"], + [26071, 0, " "], + [26072, 0, "b"], + [26073, 0, "u"], + [26074, 0, "f"], + [26075, 0, "f"], + [26076, 0, "e"], + [26077, 0, "r"], + [26078, 0, " "], + [26079, 0, "$"], + [26080, 0, "A"], + [26081, 0, "_"], + [26082, 0, "p"], + [26083, 0, "("], + [26084, 0, "\\"], + [26085, 0, "m"], + [26086, 0, "a"], + [26087, 0, "t"], + [26088, 0, "h"], + [26089, 0, "s"], + [26090, 0, "f"], + [26091, 0, "{"], + [26092, 0, "s"], + [26093, 0, "e"], + [26094, 0, "n"], + [26095, 0, "d"], + [26096, 0, "}"], + [26097, 0, ")"], + [26098, 0, "$"], + [26099, 0, "."], + [26100, 0, " "], + [26101, 0, "C"], + [26102, 0, "o"], + [26103, 0, "r"], + [26104, 0, "r"], + [26105, 0, "e"], + [26106, 0, "s"], + [26107, 0, "p"], + [26108, 0, "o"], + [26109, 0, "n"], + [26110, 0, "d"], + [26111, 0, "i"], + [26112, 0, "n"], + [26113, 0, "g"], + [26114, 0, "l"], + [26115, 0, "y"], + [26116, 0, ","], + [26117, 0, " "], + [26118, 0, "t"], + [26119, 0, "h"], + [26120, 0, "e"], + [26121, 0, " "], + [26122, 0, "\\"], + [26123, 0, "t"], + [26124, 0, "e"], + [26125, 0, "x"], + [26126, 0, "t"], + [26127, 0, "s"], + [26128, 0, "c"], + [26129, 0, "{"], + [26130, 0, "R"], + [26131, 0, "e"], + [26132, 0, "c"], + [26133, 0, "v"], + [26134, 0, "}"], + [26135, 0, " "], + [26136, 0, "r"], + [26137, 0, "u"], + [26138, 0, "l"], + [26139, 0, "e"], + [26140, 0, " "], + [26141, 0, "t"], + [26142, 0, "a"], + [26143, 0, "k"], + [26144, 0, "e"], + [26145, 0, "s"], + [26146, 0, " "], + [26147, 0, "o"], + [26148, 0, "p"], + [26149, 0, "e"], + [26150, 0, "r"], + [26151, 0, "a"], + [26152, 0, "t"], + [26153, 0, "i"], + [26154, 0, "o"], + [26155, 0, "n"], + [26156, 0, "s"], + [26157, 0, " "], + [26158, 0, "i"], + [26159, 0, "n"], + [26160, 0, " "], + [26161, 0, "t"], + [26162, 0, "h"], + [26163, 0, "e"], + [26164, 0, " "], + [26165, 0, "s"], + [26166, 0, "e"], + [26167, 0, "n"], + [26168, 0, "d"], + [26169, 0, " "], + [26170, 0, "b"], + [26171, 0, "u"], + [26172, 0, "f"], + [26173, 0, "f"], + [26174, 0, "e"], + [26175, 0, "r"], + [26176, 0, " "], + [26177, 0, "o"], + [26178, 0, "f"], + [26179, 0, " "], + [26180, 0, "p"], + [26181, 0, "e"], + [26182, 0, "e"], + [26183, 0, "r"], + [26184, 0, " "], + [26185, 0, "$"], + [26186, 0, "q"], + [26187, 0, "$"], + [26188, 0, " "], + [26189, 0, "a"], + [26190, 0, "n"], + [26191, 0, "d"], + [26192, 0, " "], + [26193, 0, "a"], + [26194, 0, "d"], + [26195, 0, "d"], + [26196, 0, "s"], + [26197, 0, " "], + [26198, 0, "t"], + [26199, 0, "h"], + [26200, 0, "e"], + [26201, 0, "m"], + [26202, 0, " "], + [26203, 0, "t"], + [26204, 0, "o"], + [26205, 0, " "], + [26206, 0, "t"], + [26207, 0, "h"], + [26208, 0, "e"], + [26209, 0, " "], + [26210, 0, "r"], + [26211, 0, "e"], + [26212, 0, "c"], + [26213, 0, "e"], + [26214, 0, "i"], + [26215, 0, "v"], + [26216, 0, "e"], + [26217, 0, " "], + [26218, 0, "b"], + [26219, 0, "u"], + [26220, 0, "f"], + [26221, 0, "f"], + [26222, 0, "e"], + [26223, 0, "r"], + [26224, 0, " "], + [26225, 0, "o"], + [26225, 1], + [26225, 0, "$"], + [26226, 0, "A"], + [26227, 0, "_"], + [26228, 0, "p"], + [26229, 0, "("], + [26230, 0, "\\"], + [26231, 0, "t"], + [26232, 0, "e"], + [26233, 0, "x"], + [26234, 0, "t"], + [26235, 0, "s"], + [26236, 0, "f"], + [26237, 0, "{"], + [26238, 0, "r"], + [26239, 0, "e"], + [26240, 0, "c"], + [26241, 0, "v"], + [26242, 0, "}"], + [26243, 0, ")"], + [26244, 0, "$"], + [26245, 0, " "], + [26246, 0, "o"], + [26247, 0, "f"], + [26248, 0, " "], + [26249, 0, "p"], + [26250, 0, "e"], + [26251, 0, "e"], + [26252, 0, "r"], + [26253, 0, " "], + [26254, 0, "$"], + [26255, 0, "p"], + [26256, 0, "$"], + [26257, 0, "."], + [26258, 0, " "], + [26259, 0, "T"], + [26260, 0, "h"], + [26261, 0, "i"], + [26262, 0, "s"], + [26263, 0, " "], + [26264, 0, "i"], + [26265, 0, "s"], + [26266, 0, " "], + [26267, 0, "t"], + [26268, 0, "h"], + [26269, 0, "e"], + [26270, 0, " "], + [26271, 0, "o"], + [26272, 0, "n"], + [26273, 0, "l"], + [26274, 0, "y"], + [26275, 0, " "], + [26276, 0, "r"], + [26277, 0, "u"], + [26278, 0, "l"], + [26279, 0, "e"], + [26280, 0, " "], + [26281, 0, "t"], + [26282, 0, "h"], + [26283, 0, "a"], + [26284, 0, "t"], + [26285, 0, " "], + [26286, 0, "i"], + [26287, 0, "n"], + [26288, 0, "v"], + [26289, 0, "o"], + [26290, 0, "l"], + [26291, 0, "v"], + [26292, 0, "e"], + [26293, 0, "s"], + [26294, 0, " "], + [26295, 0, "m"], + [26296, 0, "o"], + [26297, 0, "r"], + [26298, 0, "e"], + [26299, 0, " "], + [26300, 0, "t"], + [26301, 0, "h"], + [26302, 0, "a"], + [26303, 0, "n"], + [26304, 0, " "], + [26305, 0, "o"], + [26306, 0, "n"], + [26307, 0, "e"], + [26308, 0, " "], + [26309, 0, "p"], + [26310, 0, "e"], + [26311, 0, "e"], + [26312, 0, "r"], + [26313, 0, ","], + [26314, 0, " "], + [26315, 0, "a"], + [26316, 0, "n"], + [26317, 0, "d"], + [26318, 0, " "], + [26319, 0, "i"], + [26320, 0, "t"], + [26321, 0, " "], + [26322, 0, "m"], + [26323, 0, "o"], + [26324, 0, "d"], + [26325, 0, "e"], + [26326, 0, "l"], + [26327, 0, "s"], + [26328, 0, " "], + [26329, 0, "a"], + [26330, 0, "l"], + [26331, 0, "l"], + [26332, 0, " "], + [26333, 0, "n"], + [26334, 0, "e"], + [26335, 0, "t"], + [26336, 0, "w"], + [26337, 0, "o"], + [26338, 0, "r"], + [26339, 0, "k"], + [26340, 0, " "], + [26341, 0, "c"], + [26342, 0, "o"], + [26343, 0, "m"], + [26344, 0, "m"], + [26345, 0, "u"], + [26346, 0, "n"], + [26347, 0, "i"], + [26348, 0, "c"], + [26349, 0, "a"], + [26350, 0, "t"], + [26351, 0, "i"], + [26352, 0, "o"], + [26353, 0, "n"], + [26354, 0, "."], + [26355, 0, "\n"], + [26356, 0, "\n"], + [26357, 0, "O"], + [26358, 0, "n"], + [26359, 0, "c"], + [26360, 0, "e"], + [26361, 0, " "], + [26362, 0, "a"], + [26363, 0, "n"], + [26364, 0, " "], + [26365, 0, "o"], + [26366, 0, "p"], + [26367, 0, "e"], + [26368, 0, "r"], + [26369, 0, "a"], + [26370, 0, "t"], + [26371, 0, "i"], + [26372, 0, "o"], + [26373, 0, "n"], + [26374, 0, " "], + [26375, 0, "h"], + [26375, 1], + [26375, 0, "a"], + [26376, 0, "p"], + [26377, 0, "p"], + [26378, 0, "e"], + [26379, 0, "a"], + [26380, 0, "r"], + [26381, 0, "s"], + [26382, 0, " "], + [26383, 0, "i"], + [26384, 0, "n"], + [26385, 0, " "], + [26386, 0, "t"], + [26387, 0, "h"], + [26388, 0, "e"], + [26389, 0, " "], + [26390, 0, "r"], + [26391, 0, "e"], + [26392, 0, "c"], + [26393, 0, "e"], + [26394, 0, "i"], + [26395, 0, "v"], + [26396, 0, "e"], + [26397, 0, " "], + [26398, 0, "b"], + [26399, 0, "u"], + [26400, 0, "f"], + [26401, 0, "f"], + [26402, 0, "e"], + [26403, 0, "r"], + [26404, 0, " "], + [26405, 0, "$"], + [26406, 0, "A"], + [26407, 0, "_"], + [26408, 0, "p"], + [26409, 0, "("], + [26410, 0, "\\"], + [26411, 0, "t"], + [26412, 0, "e"], + [26413, 0, "x"], + [26414, 0, "t"], + [26415, 0, "s"], + [26416, 0, "f"], + [26234, 1], + [26233, 1], + [26232, 1], + [26231, 1], + [26231, 0, "m"], + [26232, 0, "a"], + [26233, 0, "t"], + [26234, 0, "h"], + [26414, 1], + [26413, 1], + [26412, 1], + [26411, 1], + [26411, 0, "m"], + [26412, 0, "a"], + [26413, 0, "t"], + [26414, 0, "h"], + [26415, 0, "s"], + [26415, 1], + [26417, 0, "{"], + [26418, 0, "r"], + [26419, 0, "e"], + [26420, 0, "c"], + [26421, 0, "v"], + [26422, 0, "}"], + [26423, 0, ")"], + [26424, 0, "$"], + [26425, 0, ","], + [26426, 0, " "], + [26427, 0, "t"], + [26428, 0, "h"], + [26429, 0, "e"], + [26430, 0, " "], + [26431, 0, "r"], + [26432, 0, "u"], + [26433, 0, "l"], + [26434, 0, "e"], + [26435, 0, " "], + [26436, 0, "\\"], + [26437, 0, "t"], + [26438, 0, "e"], + [26439, 0, "x"], + [26440, 0, "t"], + [26441, 0, "s"], + [26442, 0, "c"], + [26443, 0, "{"], + [26444, 0, "A"], + [26445, 0, "p"], + [26446, 0, "p"], + [26447, 0, "l"], + [26448, 0, "y"], + [26449, 0, "-"], + [26450, 0, "R"], + [26451, 0, "e"], + [26452, 0, "m"], + [26453, 0, "o"], + [26454, 0, "t"], + [26455, 0, "e"], + [26456, 0, "}"], + [26457, 0, " "], + [26458, 0, "m"], + [26459, 0, "a"], + [26460, 0, "y"], + [26461, 0, " "], + [26462, 0, "a"], + [26463, 0, "p"], + [26464, 0, "p"], + [26465, 0, "l"], + [26466, 0, "y"], + [26467, 0, "."], + [26468, 0, " "], + [26469, 0, "U"], + [26470, 0, "n"], + [26471, 0, "d"], + [26472, 0, "e"], + [26473, 0, "r"], + [26474, 0, " "], + [26475, 0, "t"], + [26476, 0, "h"], + [26477, 0, "e"], + [26478, 0, " "], + [26479, 0, "p"], + [26480, 0, "r"], + [26481, 0, "e"], + [26482, 0, "c"], + [26483, 0, "o"], + [26484, 0, "n"], + [26485, 0, "d"], + [26486, 0, "i"], + [26487, 0, "t"], + [26488, 0, "i"], + [26489, 0, "o"], + [26490, 0, "n"], + [26491, 0, " "], + [26492, 0, "t"], + [26493, 0, "h"], + [26494, 0, "a"], + [26495, 0, "t"], + [26496, 0, " "], + [26497, 0, "t"], + [26498, 0, "h"], + [26499, 0, "e"], + [26500, 0, " "], + [26501, 0, "o"], + [26502, 0, "p"], + [26503, 0, "e"], + [26504, 0, "r"], + [26505, 0, "a"], + [26506, 0, "t"], + [26507, 0, "i"], + [26508, 0, "o"], + [26509, 0, "n"], + [26510, 0, " "], + [26511, 0, "h"], + [26512, 0, "a"], + [26513, 0, "s"], + [26514, 0, " "], + [26515, 0, "n"], + [26516, 0, "o"], + [26517, 0, "t"], + [26518, 0, " "], + [26519, 0, "a"], + [26520, 0, "l"], + [26521, 0, "r"], + [26522, 0, "e"], + [26523, 0, "a"], + [26524, 0, "d"], + [26525, 0, "y"], + [26526, 0, " "], + [26527, 0, "b"], + [26528, 0, "e"], + [26529, 0, "e"], + [26530, 0, "n"], + [26531, 0, " "], + [26532, 0, "p"], + [26533, 0, "r"], + [26534, 0, "o"], + [26535, 0, "c"], + [26536, 0, "e"], + [26537, 0, "s"], + [26538, 0, "s"], + [26539, 0, "e"], + [26540, 0, "d"], + [26491, 0, "s"], + [26542, 0, " "], + [26543, 0, "a"], + [26544, 0, "n"], + [26545, 0, "d"], + [26546, 0, " "], + [26547, 0, "t"], + [26548, 0, "h"], + [26549, 0, "a"], + [26550, 0, "t"], + [26551, 0, " "], + [26552, 0, "i"], + [26553, 0, "t"], + [26554, 0, "s"], + [26555, 0, " "], + [26556, 0, "c"], + [26557, 0, "a"], + [26558, 0, "u"], + [26559, 0, "s"], + [26560, 0, "a"], + [26561, 0, "l"], + [26562, 0, " "], + [26563, 0, "d"], + [26564, 0, "e"], + [26565, 0, "p"], + [26566, 0, "e"], + [26567, 0, "n"], + [26568, 0, "d"], + [26569, 0, "e"], + [26570, 0, "n"], + [26571, 0, "c"], + [26572, 0, "i"], + [26573, 0, "e"], + [26574, 0, "s"], + [26575, 0, " "], + [26576, 0, "h"], + [26577, 0, "a"], + [26578, 0, "v"], + [26578, 1], + [26577, 1], + [26576, 1], + [26576, 0, "a"], + [26577, 0, "r"], + [26578, 0, "e"], + [26579, 0, " "], + [26580, 0, "s"], + [26581, 0, "a"], + [26582, 0, "t"], + [26583, 0, "i"], + [26584, 0, "s"], + [26585, 0, "i"], + [26586, 0, "f"], + [26587, 0, "i"], + [26588, 0, "e"], + [26589, 0, "d"], + [26590, 0, ","], + [26591, 0, " "], + [26592, 0, "\\"], + [26593, 0, "t"], + [26594, 0, "e"], + [26595, 0, "x"], + [26596, 0, "t"], + [26597, 0, "s"], + [26598, 0, "c"], + [26599, 0, "{"], + [26600, 0, "A"], + [26601, 0, "p"], + [26602, 0, "p"], + [26603, 0, "l"], + [26604, 0, "y"], + [26605, 0, "-"], + [26606, 0, "R"], + [26607, 0, "e"], + [26608, 0, "m"], + [26609, 0, "o"], + [26610, 0, "t"], + [26611, 0, "e"], + [26612, 0, "}"], + [26613, 0, " "], + [26614, 0, "e"], + [26615, 0, "v"], + [26616, 0, "a"], + [26617, 0, "l"], + [26618, 0, "u"], + [26619, 0, "a"], + [26620, 0, "t"], + [26621, 0, "e"], + [26622, 0, "s"], + [26623, 0, " "], + [26624, 0, "t"], + [26625, 0, "h"], + [26626, 0, "e"], + [26627, 0, " "], + [26628, 0, "o"], + [26629, 0, "p"], + [26630, 0, "e"], + [26631, 0, "r"], + [26632, 0, "a"], + [26633, 0, "t"], + [26634, 0, "i"], + [26635, 0, "o"], + [26636, 0, "n"], + [26637, 0, " "], + [26638, 0, "i"], + [26639, 0, "n"], + [26640, 0, " "], + [26641, 0, "t"], + [26642, 0, "h"], + [26643, 0, "e"], + [26644, 0, " "], + [26645, 0, "s"], + [26646, 0, "a"], + [26647, 0, "m"], + [26648, 0, "e"], + [26649, 0, " "], + [26650, 0, "s"], + [26650, 1], + [26650, 0, "w"], + [26651, 0, "a"], + [26652, 0, "y"], + [26653, 0, " "], + [26654, 0, "a"], + [26655, 0, "s"], + [26656, 0, " "], + [26657, 0, "\\"], + [26658, 0, "t"], + [26659, 0, "e"], + [26660, 0, "x"], + [26661, 0, "t"], + [26662, 0, "s"], + [26663, 0, "c"], + [26664, 0, "{"], + [26665, 0, "A"], + [26666, 0, "p"], + [26667, 0, "p"], + [26668, 0, "l"], + [26669, 0, "y"], + [26670, 0, "-"], + [26671, 0, "L"], + [26672, 0, "o"], + [26673, 0, "c"], + [26674, 0, "a"], + [26675, 0, "l"], + [26676, 0, "}"], + [26677, 0, ","], + [26678, 0, " "], + [26679, 0, "a"], + [26680, 0, "n"], + [26681, 0, "d"], + [26682, 0, " "], + [26683, 0, "a"], + [26684, 0, "d"], + [26685, 0, "d"], + [26686, 0, "s"], + [26687, 0, " "], + [26688, 0, "t"], + [26689, 0, "h"], + [26690, 0, "e"], + [26691, 0, " "], + [26692, 0, "o"], + [26693, 0, "p"], + [26694, 0, "e"], + [26695, 0, "r"], + [26696, 0, "a"], + [26697, 0, "t"], + [26698, 0, "i"], + [26699, 0, "o"], + [26700, 0, "n"], + [26701, 0, " "], + [26702, 0, "I"], + [26703, 0, "D"], + [26704, 0, " "], + [26705, 0, "t"], + [26706, 0, "o"], + [26707, 0, " "], + [26708, 0, "t"], + [26709, 0, "h"], + [26710, 0, "e"], + [26711, 0, " "], + [26712, 0, "s"], + [26713, 0, "e"], + [26714, 0, "t"], + [26715, 0, " "], + [26716, 0, "o"], + [26717, 0, "f"], + [26718, 0, " "], + [26719, 0, "p"], + [26720, 0, "r"], + [26721, 0, "o"], + [26722, 0, "c"], + [26723, 0, "e"], + [26724, 0, "s"], + [26725, 0, "s"], + [26726, 0, "e"], + [26727, 0, "d"], + [26728, 0, " "], + [26729, 0, "o"], + [26730, 0, "p"], + [26731, 0, "e"], + [26732, 0, "r"], + [26733, 0, "a"], + [26734, 0, "t"], + [26735, 0, "i"], + [26736, 0, "o"], + [26737, 0, "n"], + [26738, 0, "s"], + [26739, 0, " "], + [26740, 0, "$"], + [26741, 0, "A"], + [26742, 0, "_"], + [26743, 0, "p"], + [26744, 0, "("], + [26745, 0, "\\"], + [26746, 0, "m"], + [26747, 0, "a"], + [26748, 0, "t"], + [26749, 0, "h"], + [26750, 0, "s"], + [26751, 0, "f"], + [26752, 0, "{"], + [26753, 0, "o"], + [26754, 0, "p"], + [26755, 0, "s"], + [26756, 0, "}"], + [26757, 0, ")"], + [26758, 0, "$"], + [26759, 0, "."], + [26760, 0, "\n"], + [26761, 0, "\n"], + [26762, 0, "T"], + [26763, 0, "h"], + [26764, 0, "e"], + [26765, 0, " "], + [26766, 0, "a"], + [26767, 0, "c"], + [26768, 0, "t"], + [26769, 0, "u"], + [26770, 0, "a"], + [26771, 0, "l"], + [26772, 0, " "], + [26773, 0, "d"], + [26774, 0, "o"], + [26775, 0, "c"], + [26776, 0, "u"], + [26777, 0, "m"], + [26778, 0, "e"], + [26779, 0, "n"], + [26780, 0, "t"], + [26781, 0, " "], + [26782, 0, "m"], + [26783, 0, "o"], + [26784, 0, "d"], + [26785, 0, "i"], + [26786, 0, "f"], + [26787, 0, "i"], + [26788, 0, "c"], + [26789, 0, "a"], + [26790, 0, "t"], + [26791, 0, "i"], + [26792, 0, "o"], + [26793, 0, "n"], + [26794, 0, "s"], + [26795, 0, " "], + [26796, 0, "a"], + [26797, 0, "r"], + [26798, 0, "e"], + [26799, 0, " "], + [26800, 0, "p"], + [26801, 0, "e"], + [26802, 0, "r"], + [26803, 0, "f"], + [26804, 0, "o"], + [26805, 0, "r"], + [26806, 0, "m"], + [26807, 0, "e"], + [26808, 0, "d"], + [26809, 0, " "], + [26810, 0, "b"], + [26811, 0, "y"], + [26812, 0, " "], + [26813, 0, "e"], + [26814, 0, "v"], + [26815, 0, "a"], + [26816, 0, "l"], + [26817, 0, "u"], + [26818, 0, "a"], + [26819, 0, "t"], + [26820, 0, "i"], + [26821, 0, "o"], + [26822, 0, "n"], + [26823, 0, "g"], + [26823, 1], + [26822, 1], + [26821, 1], + [26821, 0, "n"], + [26822, 0, "g"], + [26823, 0, " "], + [26824, 0, "t"], + [26825, 0, "h"], + [26826, 0, "e"], + [26827, 0, " "], + [26828, 0, "o"], + [26829, 0, "p"], + [26830, 0, "e"], + [26831, 0, "r"], + [26832, 0, "a"], + [26833, 0, "t"], + [26834, 0, "i"], + [26835, 0, "o"], + [26836, 0, "n"], + [26837, 0, "s"], + [26838, 0, ","], + [26839, 0, " "], + [26840, 0, "w"], + [26841, 0, "h"], + [26842, 0, "i"], + [26843, 0, "c"], + [26844, 0, "h"], + [26845, 0, " "], + [26846, 0, "w"], + [26847, 0, "e"], + [26848, 0, " "], + [26849, 0, "d"], + [26850, 0, "i"], + [26851, 0, "s"], + [26852, 0, "c"], + [26853, 0, "u"], + [26854, 0, "s"], + [26855, 0, "s"], + [26856, 0, " "], + [26857, 0, "i"], + [26858, 0, "n"], + [26859, 0, " "], + [26860, 0, "t"], + [26861, 0, "h"], + [26862, 0, "e"], + [26863, 0, " "], + [26864, 0, "n"], + [26865, 0, "e"], + [26866, 0, "t"], + [26867, 0, " "], + [26868, 0, "s"], + [26869, 0, "e"], + [26870, 0, "c"], + [26871, 0, "t"], + [26872, 0, "i"], + [26873, 0, "o"], + [26874, 0, "n"], + [26875, 0, "."], + [26866, 0, "x"], + [26877, 0, "\n"], + [26878, 0, "\n"], + [26879, 0, "\\"], + [26880, 0, "s"], + [26881, 0, "u"], + [26882, 0, "b"], + [26883, 0, "s"], + [26884, 0, "e"], + [26885, 0, "c"], + [26886, 0, "t"], + [26887, 0, "i"], + [26888, 0, "o"], + [26889, 0, "n"], + [26890, 0, "{"], + [26891, 0, "A"], + [26892, 0, "p"], + [26893, 0, "p"], + [26894, 0, "l"], + [26895, 0, "y"], + [26896, 0, "i"], + [26897, 0, "n"], + [26898, 0, "g"], + [26899, 0, " "], + [26900, 0, "o"], + [26901, 0, "p"], + [26902, 0, "e"], + [26903, 0, "r"], + [26904, 0, "a"], + [26905, 0, "t"], + [26906, 0, "i"], + [26907, 0, "o"], + [26908, 0, "n"], + [26909, 0, "s"], + [26910, 0, "}"], + [26911, 0, "%"], + [26912, 0, " "], + [26913, 0, "T"], + [26913, 1], + [26912, 1], + [26911, 1], + [26911, 0, "\n"], + [26912, 0, "\n"], + [26913, 0, "%"], + [26914, 0, " "], + [26915, 0, "T"], + [26916, 0, "O"], + [26917, 0, "D"], + [26918, 0, "O"], + [26919, 0, "\n"], + [26920, 0, "\n"], + [26921, 0, "\\"], + [26922, 0, "b"], + [26923, 0, "e"], + [26924, 0, "g"], + [26925, 0, "i"], + [26926, 0, "n"], + [26927, 0, "{"], + [26928, 0, "f"], + [26929, 0, "i"], + [26930, 0, "g"], + [26931, 0, "u"], + [26932, 0, "r"], + [26933, 0, "e"], + [26934, 0, "*"], + [26935, 0, "}"], + [26936, 0, "\n"], + [26937, 0, "\\"], + [26938, 0, "e"], + [26939, 0, "n"], + [26940, 0, "d"], + [26941, 0, "{"], + [26942, 0, "f"], + [26943, 0, "i"], + [26944, 0, "g"], + [26945, 0, "u"], + [26946, 0, "r"], + [26947, 0, "e"], + [26948, 0, "*"], + [26949, 0, "}"], + [26936, 0, "\n"], + [26937, 0, "\\"], + [26938, 0, "c"], + [26939, 0, "a"], + [26940, 0, "p"], + [26941, 0, "t"], + [26942, 0, "i"], + [26943, 0, "o"], + [26944, 0, "n"], + [26945, 0, "{"], + [26946, 0, "R"], + [26947, 0, "u"], + [26948, 0, "l"], + [26949, 0, "e"], + [26950, 0, "s"], + [26951, 0, " "], + [26952, 0, "f"], + [26953, 0, "o"], + [26954, 0, "r"], + [26955, 0, " "], + [26956, 0, "e"], + [26957, 0, "v"], + [26958, 0, "a"], + [26959, 0, "l"], + [26960, 0, "u"], + [26961, 0, "a"], + [26962, 0, "t"], + [26963, 0, "i"], + [26964, 0, "o"], + [26965, 0, "n"], + [26966, 0, "g"], + [26967, 0, " "], + [26967, 1], + [26966, 1], + [26965, 1], + [26964, 1], + [26963, 1], + [26963, 0, "i"], + [26964, 0, "n"], + [26965, 0, "g"], + [26966, 0, " "], + [26967, 0, "o"], + [26968, 0, "p"], + [26969, 0, "e"], + [26970, 0, "r"], + [26971, 0, "a"], + [26972, 0, "t"], + [26973, 0, "i"], + [26974, 0, "o"], + [26975, 0, "n"], + [26976, 0, "s"], + [26977, 0, " "], + [26978, 0, "a"], + [26979, 0, "n"], + [26980, 0, "d"], + [26981, 0, " "], + [26982, 0, "m"], + [26983, 0, "o"], + [26984, 0, "d"], + [26985, 0, "i"], + [26986, 0, "f"], + [26987, 0, "y"], + [26988, 0, "i"], + [26989, 0, "n"], + [26990, 0, "g"], + [26991, 0, " "], + [26992, 0, "d"], + [26993, 0, "o"], + [26994, 0, "c"], + [26995, 0, "u"], + [26996, 0, "m"], + [26997, 0, "e"], + [26998, 0, "n"], + [26999, 0, "t"], + [27000, 0, " "], + [27001, 0, "s"], + [27002, 0, "t"], + [27003, 0, "a"], + [27004, 0, "t"], + [27005, 0, "e"], + [27006, 0, "}"], + [27007, 0, "\\"], + [27008, 0, "f"], + [27009, 0, "i"], + [27010, 0, "g"], + [27010, 1], + [27009, 1], + [27008, 1], + [27008, 0, "l"], + [27009, 0, "a"], + [27010, 0, "b"], + [27011, 0, "e"], + [27012, 0, "l"], + [27013, 0, "{"], + [27014, 0, "f"], + [27015, 0, "i"], + [27016, 0, "g"], + [27017, 0, ":"], + [27018, 0, "o"], + [27019, 0, "p"], + [27020, 0, "e"], + [27021, 0, "r"], + [27022, 0, "a"], + [27023, 0, "t"], + [27024, 0, "i"], + [27025, 0, "o"], + [27026, 0, "n"], + [27027, 0, "-"], + [27028, 0, "r"], + [27029, 0, "u"], + [27030, 0, "l"], + [27031, 0, "e"], + [27032, 0, "s"], + [27033, 0, "}"], + [26936, 0, "\n"], + [26937, 0, "\\"], + [26938, 0, "b"], + [26939, 0, "e"], + [26940, 0, "g"], + [26941, 0, "i"], + [26942, 0, "n"], + [26943, 0, "{"], + [26944, 0, "p"], + [26945, 0, "r"], + [26946, 0, "o"], + [26947, 0, "o"], + [26948, 0, "f"], + [26949, 0, "t"], + [26950, 0, "r"], + [26951, 0, "e"], + [26952, 0, "e"], + [26953, 0, "}"], + [26954, 0, "\n"], + [26955, 0, "\\"], + [26956, 0, "e"], + [26957, 0, "n"], + [26958, 0, "d"], + [26959, 0, "{"], + [26960, 0, "p"], + [26961, 0, "r"], + [26962, 0, "o"], + [26963, 0, "o"], + [26964, 0, "f"], + [26965, 0, "t"], + [26966, 0, "r"], + [26967, 0, "e"], + [26968, 0, "e"], + [26969, 0, "}"], + [26954, 0, "\n"], + [26955, 0, "\\"], + [26956, 0, "A"], + [26957, 0, "x"], + [26958, 0, "i"], + [26959, 0, "o"], + [26960, 0, "m"], + [26961, 0, "C"], + [26962, 0, "{"], + [26963, 0, "$"], + [26964, 0, "K"], + [26964, 1], + [26964, 0, "k"], + [26965, 0, "_"], + [26966, 0, "1"], + [26967, 0, " "], + [26968, 0, "\\"], + [26969, 0, "i"], + [26970, 0, "n"], + [26971, 0, " "], + [26972, 0, "\\"], + [26973, 0, "m"], + [26974, 0, "a"], + [26975, 0, "t"], + [26976, 0, "h"], + [26977, 0, "r"], + [26978, 0, "m"], + [26979, 0, "{"], + [26980, 0, "d"], + [26981, 0, "o"], + [26982, 0, "m"], + [26983, 0, "}"], + [26984, 0, "("], + [26985, 0, "\\"], + [26986, 0, "m"], + [26987, 0, "a"], + [26988, 0, "t"], + [26989, 0, "h"], + [26990, 0, "i"], + [26991, 0, "t"], + [26992, 0, "{"], + [26993, 0, "c"], + [26994, 0, "t"], + [26995, 0, "x"], + [26996, 0, "}"], + [26997, 0, ")"], + [26998, 0, "$"], + [26999, 0, "}"], + [27000, 0, "\n"], + [27001, 0, "\\"], + [27002, 0, "A"], + [27003, 0, "x"], + [27004, 0, "i"], + [27005, 0, "o"], + [27006, 0, "m"], + [27007, 0, "C"], + [27008, 0, "{"], + [27009, 0, "$"], + [27010, 0, "\\"], + [27011, 0, "m"], + [27012, 0, "a"], + [27013, 0, "t"], + [27014, 0, "h"], + [27015, 0, "i"], + [27016, 0, "t"], + [27017, 0, "{"], + [27018, 0, "c"], + [27019, 0, "t"], + [27020, 0, "x"], + [27021, 0, "}"], + [27022, 0, "("], + [27023, 0, "k"], + [27024, 0, "_"], + [27025, 0, "1"], + [27026, 0, ")"], + [27027, 0, ","], + [27028, 0, "\\"], + [27029, 0, ","], + [27030, 0, " "], + [27031, 0, "\\"], + [27032, 0, "m"], + [27033, 0, "a"], + [27034, 0, "t"], + [27035, 0, "h"], + [27036, 0, "s"], + [27037, 0, "f"], + [27038, 0, "{"], + [27039, 0, "o"], + [27040, 0, "p"], + [27041, 0, "}"], + [27042, 0, "("], + [27043, 0, "\\"], + [27044, 0, "m"], + [27045, 0, "a"], + [27046, 0, "t"], + [27047, 0, "h"], + [27048, 0, "i"], + [27049, 0, "t"], + [27050, 0, "{"], + [27051, 0, "i"], + [27052, 0, "d"], + [27053, 0, "}"], + [27054, 0, ","], + [27055, 0, " "], + [27056, 0, "\\"], + [27057, 0, "m"], + [27058, 0, "a"], + [27059, 0, "t"], + [27060, 0, "h"], + [27061, 0, "i"], + [27062, 0, "t"], + [27063, 0, "{"], + [27064, 0, "d"], + [27065, 0, "e"], + [27066, 0, "p"], + [27067, 0, "s"], + [27068, 0, "}"], + [27069, 0, ","], + [27070, 0, " "], + [27070, 1], + [27070, 0, "\n"], + [27071, 0, " "], + [27072, 0, " "], + [27073, 0, " "], + [27074, 0, " "], + [27075, 0, "\\"], + [27076, 0, "m"], + [27077, 0, "a"], + [27078, 0, "t"], + [27079, 0, "h"], + [27080, 0, "s"], + [27081, 0, "f"], + [27082, 0, "{"], + [27083, 0, "c"], + [27084, 0, "u"], + [27085, 0, "r"], + [27086, 0, "s"], + [27087, 0, "o"], + [27088, 0, "r"], + [27089, 0, "}"], + [27090, 0, "("], + [27091, 0, "\\"], + [27092, 0, "l"], + [27093, 0, "a"], + [27094, 0, "n"], + [27095, 0, "g"], + [27096, 0, "l"], + [27097, 0, "e"], + [27098, 0, " "], + [27099, 0, "k"], + [27100, 0, "_"], + [27101, 0, "2"], + [27102, 0, ","], + [27103, 0, " "], + [27104, 0, "\\"], + [27105, 0, "d"], + [27106, 0, "o"], + [27107, 0, "t"], + [27108, 0, "s"], + [27109, 0, ","], + [27110, 0, " "], + [27111, 0, "k"], + [27112, 0, "_"], + [27113, 0, "{"], + [27114, 0, "n"], + [27115, 0, "-"], + [27116, 0, "1"], + [27117, 0, "}"], + [27118, 0, " "], + [27119, 0, "\\"], + [27120, 0, "r"], + [27121, 0, "a"], + [27122, 0, "n"], + [27123, 0, "g"], + [27124, 0, "l"], + [27125, 0, "e"], + [27126, 0, ","], + [27127, 0, "\\"], + [27128, 0, ","], + [27129, 0, " "], + [27130, 0, "k"], + [27131, 0, "_"], + [27132, 0, "n"], + [27133, 0, ")"], + [27134, 0, ","], + [27135, 0, " "], + [27136, 0, "\\"], + [27137, 0, "m"], + [27138, 0, "a"], + [27139, 0, "t"], + [27140, 0, "h"], + [27141, 0, "i"], + [27142, 0, "t"], + [27143, 0, "{"], + [27144, 0, "m"], + [27145, 0, "u"], + [27146, 0, "t"], + [27147, 0, "}"], + [27148, 0, ")"], + [27149, 0, " "], + [27150, 0, "\\"], + [27151, 0, "e"], + [27152, 0, "v"], + [27153, 0, "a"], + [27154, 0, "l"], + [27155, 0, "t"], + [27156, 0, "o"], + [27157, 0, " "], + [27158, 0, "\\"], + [27159, 0, "m"], + [27160, 0, "a"], + [27161, 0, "t"], + [27162, 0, "h"], + [27163, 0, "i"], + [27164, 0, "t"], + [27165, 0, "{"], + [27166, 0, "s"], + [27167, 0, "t"], + [27168, 0, "a"], + [27169, 0, "t"], + [27170, 0, "e"], + [27171, 0, "}"], + [27172, 0, "$"], + [27173, 0, "}"], + [27174, 0, "\n"], + [27175, 0, "\\"], + [27176, 0, "L"], + [27177, 0, "e"], + [27178, 0, "f"], + [27179, 0, "t"], + [27180, 0, "L"], + [27181, 0, "a"], + [27182, 0, "b"], + [27183, 0, "e"], + [27184, 0, "l"], + [27185, 0, "{"], + [27186, 0, "\\"], + [27187, 0, "t"], + [27188, 0, "e"], + [27189, 0, "x"], + [27190, 0, "t"], + [27191, 0, "s"], + [27192, 0, "c"], + [27193, 0, "{"], + [27194, 0, "D"], + [27195, 0, "e"], + [27196, 0, "s"], + [27197, 0, "c"], + [27198, 0, "e"], + [27199, 0, "n"], + [27200, 0, "d"], + [27201, 0, "}"], + [27202, 0, "}"], + [27203, 0, "\n"], + [27204, 0, "\\"], + [27205, 0, "B"], + [27206, 0, "i"], + [27207, 0, "n"], + [27208, 0, "a"], + [27209, 0, "r"], + [27210, 0, "y"], + [27211, 0, "I"], + [27212, 0, "n"], + [27213, 0, "f"], + [27214, 0, "C"], + [27215, 0, "{"], + [27216, 0, "$"], + [27217, 0, "$"], + [27218, 0, "}"], + [27217, 0, "\\"], + [27218, 0, "m"], + [27219, 0, "a"], + [27220, 0, "t"], + [27221, 0, "h"], + [27222, 0, "i"], + [27223, 0, "t"], + [27224, 0, "{"], + [27225, 0, "c"], + [27226, 0, "t"], + [27227, 0, "x"], + [27228, 0, "}"], + [27229, 0, ","], + [27230, 0, "\\"], + [27231, 0, ","], + [27232, 0, " "], + [27233, 0, "\\"], + [27234, 0, "m"], + [27235, 0, "a"], + [27236, 0, "t"], + [27237, 0, "h"], + [27238, 0, "s"], + [27239, 0, "f"], + [27240, 0, "{"], + [27241, 0, "o"], + [27242, 0, "p"], + [27243, 0, "}"], + [27244, 0, "("], + [27245, 0, "\\"], + [27246, 0, "m"], + [27247, 0, "a"], + [27248, 0, "t"], + [27249, 0, "h"], + [27250, 0, "i"], + [27251, 0, "t"], + [27252, 0, "{"], + [27253, 0, "i"], + [27254, 0, "d"], + [27255, 0, "}"], + [27256, 0, ","], + [27257, 0, " "], + [27258, 0, "\\"], + [27259, 0, "m"], + [27260, 0, "a"], + [27261, 0, "t"], + [27262, 0, "h"], + [27263, 0, "i"], + [27264, 0, "t"], + [27265, 0, "{"], + [27266, 0, "d"], + [27267, 0, "e"], + [27268, 0, "p"], + [27269, 0, "s"], + [27270, 0, "}"], + [27271, 0, ","], + [27272, 0, "\n"], + [27273, 0, " "], + [27274, 0, " "], + [27275, 0, " "], + [27276, 0, " "], + [27277, 0, "\\"], + [27278, 0, "m"], + [27279, 0, "a"], + [27280, 0, "t"], + [27281, 0, "h"], + [27282, 0, "s"], + [27283, 0, "f"], + [27284, 0, "{"], + [27285, 0, "c"], + [27286, 0, "u"], + [27287, 0, "r"], + [27288, 0, "s"], + [27289, 0, "o"], + [27290, 0, "r"], + [27291, 0, "}"], + [27292, 0, "("], + [27293, 0, "\\"], + [27294, 0, "l"], + [27295, 0, "a"], + [27296, 0, "n"], + [27297, 0, "g"], + [27298, 0, "l"], + [27299, 0, "e"], + [27300, 0, " "], + [27301, 0, "k"], + [27302, 0, "_"], + [27303, 0, "1"], + [27304, 0, ","], + [27305, 0, " "], + [27306, 0, "k"], + [27307, 0, "_"], + [27308, 0, "2"], + [27309, 0, ","], + [27310, 0, " "], + [27311, 0, "\\"], + [27312, 0, "d"], + [27313, 0, "o"], + [27314, 0, "t"], + [27315, 0, "s"], + [27316, 0, ","], + [27317, 0, " "], + [27318, 0, "k"], + [27319, 0, "_"], + [27320, 0, "{"], + [27321, 0, "n"], + [27322, 0, "-"], + [27323, 0, "1"], + [27324, 0, "}"], + [27325, 0, " "], + [27326, 0, "\\"], + [27327, 0, "r"], + [27328, 0, "a"], + [27329, 0, "n"], + [27330, 0, "g"], + [27331, 0, "l"], + [27332, 0, "e"], + [27333, 0, ","], + [27334, 0, "\\"], + [27335, 0, ","], + [27336, 0, " "], + [27337, 0, "k"], + [27338, 0, "_"], + [27339, 0, "n"], + [27340, 0, ")"], + [27341, 0, ","], + [27342, 0, " "], + [27343, 0, "\\"], + [27344, 0, "m"], + [27345, 0, "a"], + [27346, 0, "t"], + [27347, 0, "h"], + [27348, 0, "i"], + [27349, 0, "t"], + [27350, 0, "{"], + [27351, 0, "m"], + [27352, 0, "u"], + [27353, 0, "t"], + [27354, 0, "}"], + [27355, 0, ")"], + [27356, 0, " "], + [27357, 0, "\\"], + [27358, 0, "e"], + [27359, 0, "v"], + [27360, 0, "a"], + [27361, 0, "l"], + [27362, 0, "t"], + [27363, 0, "o"], + [27364, 0, "\n"], + [27365, 0, " "], + [27366, 0, " "], + [27367, 0, " "], + [27368, 0, " "], + [27369, 0, "\\"], + [27370, 0, "m"], + [27371, 0, "a"], + [27372, 0, "t"], + [27373, 0, "h"], + [27374, 0, "i"], + [27375, 0, "t"], + [27376, 0, "{"], + [27377, 0, "c"], + [27378, 0, "t"], + [27379, 0, "x"], + [27380, 0, "}"], + [27381, 0, "["], + [27382, 0, "\\"], + [27383, 0, ","], + [27384, 0, " "], + [27385, 0, "k"], + [27386, 0, "_"], + [27387, 0, "1"], + [27388, 0, " "], + [27389, 0, "\\"], + [27390, 0, "m"], + [27391, 0, "a"], + [27392, 0, "p"], + [27393, 0, "s"], + [27394, 0, "t"], + [27395, 0, "o"], + [27396, 0, " "], + [27397, 0, "\\"], + [27398, 0, "m"], + [27399, 0, "a"], + [27400, 0, "t"], + [27401, 0, "h"], + [27402, 0, "i"], + [27403, 0, "t"], + [27404, 0, "{"], + [27405, 0, "s"], + [27406, 0, "t"], + [27407, 0, "a"], + [27408, 0, "t"], + [27409, 0, "e"], + [27410, 0, "}"], + [27411, 0, " "], + [27412, 0, "\\"], + [27413, 0, ","], + [27414, 0, "]"], + [27389, 0, ","], + [27389, 0, "\\"], + [27398, 0, "\\"], + [27399, 0, ","], + [27437, 0, "\n"], + [27438, 0, "\n"], + [27439, 0, "\\"], + [27440, 0, "b"], + [27441, 0, "e"], + [27442, 0, "g"], + [27443, 0, "i"], + [27444, 0, "n"], + [27445, 0, "{"], + [27446, 0, "p"], + [27447, 0, "r"], + [27448, 0, "o"], + [27449, 0, "o"], + [27450, 0, "f"], + [27451, 0, "t"], + [27452, 0, "r"], + [27453, 0, "e"], + [27454, 0, "e"], + [27455, 0, "}"], + [27456, 0, "\n"], + [27457, 0, "\\"], + [27458, 0, "e"], + [27459, 0, "n"], + [27460, 0, "d"], + [27461, 0, "{"], + [27462, 0, "p"], + [27463, 0, "r"], + [27464, 0, "o"], + [27465, 0, "o"], + [27466, 0, "f"], + [27467, 0, "t"], + [27468, 0, "r"], + [27469, 0, "e"], + [27470, 0, "e"], + [27471, 0, "}"], + [27456, 0, "\n"], + [27457, 0, "\\"], + [27458, 0, "A"], + [27459, 0, "x"], + [27460, 0, "i"], + [27461, 0, "o"], + [27462, 0, "m"], + [27463, 0, "C"], + [27464, 0, "{"], + [27465, 0, "$"], + [27466, 0, "k"], + [27467, 0, "_"], + [27468, 0, "1"], + [27469, 0, " "], + [27470, 0, "\\"], + [27471, 0, "n"], + [27472, 0, "o"], + [27473, 0, "t"], + [27474, 0, "i"], + [27475, 0, "n"], + [27476, 0, " "], + [27477, 0, "\\"], + [27478, 0, "m"], + [27479, 0, "a"], + [27480, 0, "t"], + [27481, 0, "h"], + [27482, 0, "r"], + [27483, 0, "m"], + [27484, 0, "{"], + [27485, 0, "d"], + [27486, 0, "o"], + [27487, 0, "m"], + [27488, 0, "}"], + [27489, 0, "("], + [27490, 0, "\\"], + [27491, 0, "m"], + [27492, 0, "a"], + [27493, 0, "t"], + [27494, 0, "h"], + [27495, 0, "i"], + [27496, 0, "t"], + [27497, 0, "{"], + [27498, 0, "c"], + [27499, 0, "t"], + [27500, 0, "x"], + [27501, 0, "}"], + [27502, 0, ")"], + [27503, 0, "$"], + [27504, 0, "}"], + [27505, 0, "\n"], + [27506, 0, "\\"], + [27507, 0, "A"], + [27508, 0, "x"], + [27509, 0, "i"], + [27510, 0, "o"], + [27511, 0, "m"], + [27512, 0, "C"], + [27513, 0, "{"], + [27514, 0, "$"], + [27515, 0, "k"], + [27516, 0, "_"], + [27517, 0, "1"], + [27518, 0, " "], + [27519, 0, "="], + [27520, 0, " "], + [27521, 0, "\\"], + [27522, 0, "m"], + [27523, 0, "a"], + [27524, 0, "t"], + [27525, 0, "h"], + [27526, 0, "s"], + [27527, 0, "f"], + [27528, 0, "{"], + [27529, 0, "m"], + [27530, 0, "a"], + [27531, 0, "p"], + [27532, 0, "T"], + [27533, 0, "}"], + [27534, 0, "("], + [27535, 0, "k"], + [27536, 0, "_"], + [27537, 0, "\\"], + [27538, 0, "m"], + [27539, 0, "a"], + [27540, 0, "t"], + [27541, 0, "h"], + [27542, 0, "i"], + [27543, 0, "t"], + [27544, 0, "{"], + [27545, 0, "n"], + [27546, 0, "e"], + [27547, 0, "w"], + [27548, 0, "}"], + [27549, 0, ")"], + [27550, 0, "$"], + [27551, 0, "}"], + [27552, 0, "\n"], + [27553, 0, "\\"], + [27554, 0, "L"], + [27555, 0, "e"], + [27556, 0, "f"], + [27556, 1], + [27555, 1], + [27554, 1], + [27554, 0, "A"], + [27555, 0, "x"], + [27556, 0, "i"], + [27557, 0, "o"], + [27558, 0, "m"], + [27559, 0, "C"], + [27560, 0, "{"], + [27561, 0, "$"], + [27562, 0, "\\"], + [27563, 0, "{"], + [27564, 0, "\\"], + [27565, 0, "}"], + [27566, 0, ","], + [27567, 0, "\\"], + [27568, 0, ","], + [27569, 0, " "], + [27570, 0, "\\"], + [27571, 0, "m"], + [27572, 0, "a"], + [27573, 0, "t"], + [27574, 0, "h"], + [27575, 0, "s"], + [27576, 0, "f"], + [27577, 0, "{"], + [27578, 0, "o"], + [27579, 0, "p"], + [27580, 0, "}"], + [27581, 0, "{"], + [27582, 0, "\\"], + [27583, 0, "m"], + [27584, 0, "a"], + [27585, 0, "t"], + [27586, 0, "h"], + [27587, 0, "i"], + [27588, 0, "t"], + [27589, 0, "{"], + [27590, 0, "i"], + [27591, 0, "d"], + [27592, 0, "}"], + [27593, 0, ","], + [27594, 0, " "], + [27595, 0, "\\"], + [27596, 0, "m"], + [27597, 0, "a"], + [27598, 0, "t"], + [27599, 0, "h"], + [27600, 0, "i"], + [27601, 0, "t"], + [27602, 0, "{"], + [27603, 0, "d"], + [27604, 0, "e"], + [27605, 0, "p"], + [27606, 0, "s"], + [27607, 0, "}"], + [27608, 0, ","], + [27609, 0, "\n"], + [27610, 0, " "], + [27611, 0, " "], + [27612, 0, " "], + [27613, 0, " "], + [27614, 0, "\\"], + [27615, 0, "m"], + [27616, 0, "a"], + [27617, 0, "t"], + [27618, 0, "h"], + [27619, 0, "s"], + [27620, 0, "f"], + [27621, 0, "{"], + [27622, 0, "c"], + [27623, 0, "u"], + [27624, 0, "r"], + [27625, 0, "s"], + [27626, 0, "o"], + [27627, 0, "r"], + [27628, 0, "}"], + [27629, 0, "("], + [27630, 0, "\\"], + [27631, 0, "l"], + [27632, 0, "a"], + [27633, 0, "n"], + [27634, 0, "g"], + [27635, 0, "l"], + [27636, 0, "e"], + [27637, 0, " "], + [27638, 0, "k"], + [27639, 0, "_"], + [27640, 0, "2"], + [27641, 0, ","], + [27642, 0, " "], + [27643, 0, "\\"], + [27644, 0, "d"], + [27645, 0, "o"], + [27646, 0, "t"], + [27647, 0, "s"], + [27648, 0, ","], + [27649, 0, " "], + [27650, 0, "k"], + [27651, 0, "_"], + [27652, 0, "{"], + [27653, 0, "n"], + [27654, 0, "-"], + [27655, 0, "1"], + [27656, 0, "}"], + [27657, 0, " "], + [27658, 0, "\\"], + [27659, 0, "r"], + [27660, 0, "a"], + [27661, 0, "n"], + [27662, 0, "g"], + [27663, 0, "l"], + [27664, 0, "e"], + [27665, 0, ","], + [27666, 0, "\\"], + [27667, 0, ","], + [27668, 0, " "], + [27669, 0, "k"], + [27670, 0, "_"], + [27671, 0, "n"], + [27672, 0, ")"], + [27673, 0, ","], + [27674, 0, " "], + [27675, 0, "\\"], + [27676, 0, "m"], + [27677, 0, "a"], + [27678, 0, "t"], + [27679, 0, "h"], + [27680, 0, "i"], + [27681, 0, "t"], + [27682, 0, "{"], + [27683, 0, "m"], + [27684, 0, "u"], + [27685, 0, "t"], + [27686, 0, "}"], + [27687, 0, ")"], + [27688, 0, " "], + [27689, 0, "\\"], + [27690, 0, "e"], + [27691, 0, "v"], + [27692, 0, "a"], + [27693, 0, "l"], + [27694, 0, "t"], + [27695, 0, "o"], + [27696, 0, " "], + [27697, 0, "\\"], + [27698, 0, "m"], + [27699, 0, "a"], + [27700, 0, "t"], + [27701, 0, "h"], + [27702, 0, "i"], + [27703, 0, "t"], + [27704, 0, "{"], + [27705, 0, "s"], + [27706, 0, "t"], + [27707, 0, "a"], + [27708, 0, "t"], + [27709, 0, "e"], + [27710, 0, "}"], + [27711, 0, "$"], + [27712, 0, "}"], + [27713, 0, "\n"], + [27714, 0, "\\"], + [27715, 0, "L"], + [27716, 0, "e"], + [27717, 0, "f"], + [27718, 0, "t"], + [27719, 0, "L"], + [27720, 0, "a"], + [27721, 0, "b"], + [27722, 0, "e"], + [27723, 0, "l"], + [27724, 0, "{"], + [27725, 0, "\\"], + [27726, 0, "t"], + [27727, 0, "e"], + [27728, 0, "x"], + [27729, 0, "t"], + [27730, 0, "s"], + [27731, 0, "c"], + [27732, 0, "{"], + [27733, 0, "D"], + [27734, 0, "e"], + [27735, 0, "f"], + [27736, 0, "-"], + [27737, 0, "M"], + [27738, 0, "a"], + [27739, 0, "p"], + [27740, 0, "}"], + [27741, 0, "}"], + [27742, 0, "\n"], + [27743, 0, "\\"], + [27744, 0, "T"], + [27745, 0, "r"], + [27746, 0, "i"], + [27747, 0, "n"], + [27748, 0, "a"], + [27749, 0, "r"], + [27750, 0, "y"], + [27751, 0, "I"], + [27752, 0, "n"], + [27753, 0, "f"], + [27754, 0, "C"], + [27755, 0, "{"], + [27756, 0, "$"], + [27757, 0, "\\"], + [27758, 0, "m"], + [27759, 0, "a"], + [27760, 0, "t"], + [27761, 0, "h"], + [27762, 0, "i"], + [27763, 0, "t"], + [27764, 0, "{"], + [27765, 0, "c"], + [27766, 0, "t"], + [27767, 0, "x"], + [27768, 0, "}"], + [27769, 0, ","], + [27770, 0, "\\"], + [27771, 0, ","], + [27772, 0, " "], + [27773, 0, "\\"], + [27774, 0, "m"], + [27775, 0, "a"], + [27776, 0, "t"], + [27777, 0, "h"], + [27778, 0, "i"], + [27778, 1], + [27778, 0, "s"], + [27779, 0, "f"], + [27780, 0, "{"], + [27781, 0, "o"], + [27782, 0, "p"], + [27783, 0, "}"], + [27784, 0, "("], + [27785, 0, "\\"], + [27786, 0, "m"], + [27787, 0, "a"], + [27788, 0, "t"], + [27789, 0, "h"], + [27790, 0, "i"], + [27791, 0, "t"], + [27792, 0, "{"], + [27793, 0, "i"], + [27794, 0, "d"], + [27795, 0, "}"], + [27796, 0, ","], + [27797, 0, " "], + [27798, 0, "\\"], + [27799, 0, "m"], + [27800, 0, "a"], + [27801, 0, "t"], + [27802, 0, "h"], + [27803, 0, "i"], + [27804, 0, "t"], + [27805, 0, "{"], + [27806, 0, "d"], + [27807, 0, "e"], + [27808, 0, "p"], + [27809, 0, "s"], + [27810, 0, "}"], + [27811, 0, ","], + [27812, 0, "\n"], + [27813, 0, " "], + [27814, 0, " "], + [27815, 0, "\\"], + [27816, 0, "m"], + [27817, 0, "a"], + [27818, 0, "t"], + [27819, 0, "h"], + [27820, 0, "s"], + [27821, 0, "f"], + [27813, 0, " "], + [27814, 0, " "], + [27824, 0, "{"], + [27825, 0, "c"], + [27826, 0, "u"], + [27827, 0, "r"], + [27828, 0, "s"], + [27829, 0, "o"], + [27830, 0, "r"], + [27831, 0, "}"], + [27832, 0, "("], + [27833, 0, "\\"], + [27834, 0, "l"], + [27835, 0, "a"], + [27836, 0, "n"], + [27837, 0, "g"], + [27838, 0, "l"], + [27839, 0, "e"], + [27840, 0, " "], + [27841, 0, "k"], + [27842, 0, "_"], + [27843, 0, "1"], + [27844, 0, ","], + [27845, 0, " "], + [27846, 0, "k"], + [27847, 0, "_"], + [27848, 0, "2"], + [27849, 0, ","], + [27850, 0, " "], + [27851, 0, "\\"], + [27852, 0, "d"], + [27853, 0, "o"], + [27854, 0, "t"], + [27855, 0, "s"], + [27856, 0, ","], + [27857, 0, " "], + [27858, 0, "k"], + [27859, 0, "_"], + [27860, 0, "{"], + [27861, 0, "n"], + [27862, 0, "-"], + [27863, 0, "1"], + [27864, 0, "}"], + [27865, 0, " "], + [27866, 0, "\\"], + [27867, 0, "r"], + [27868, 0, "a"], + [27869, 0, "n"], + [27870, 0, "g"], + [27871, 0, "l"], + [27872, 0, "e"], + [27873, 0, ","], + [27874, 0, "\\"], + [27875, 0, ","], + [27876, 0, " "], + [27877, 0, "k"], + [27878, 0, "_"], + [27879, 0, "n"], + [27880, 0, ")"], + [27881, 0, ","], + [27882, 0, " "], + [27883, 0, "\\"], + [27884, 0, "m"], + [27885, 0, "a"], + [27886, 0, "t"], + [27887, 0, "h"], + [27888, 0, "i"], + [27889, 0, "t"], + [27890, 0, "{"], + [27891, 0, "m"], + [27892, 0, "u"], + [27893, 0, "t"], + [27894, 0, "}"], + [27895, 0, ")"], + [27896, 0, " "], + [27897, 0, "\\"], + [27898, 0, "e"], + [27899, 0, "v"], + [27900, 0, "a"], + [27901, 0, "l"], + [27902, 0, "t"], + [27903, 0, "o"], + [27904, 0, "\n"], + [27905, 0, " "], + [27906, 0, " "], + [27907, 0, " "], + [27908, 0, " "], + [27909, 0, "\\"], + [27910, 0, "m"], + [27911, 0, "a"], + [27912, 0, "t"], + [27913, 0, "h"], + [27914, 0, "i"], + [27915, 0, "t"], + [27916, 0, "{"], + [27917, 0, "c"], + [27918, 0, "t"], + [27919, 0, "x"], + [27920, 0, "}"], + [27921, 0, "["], + [27922, 0, "\\"], + [27923, 0, ","], + [27924, 0, " "], + [27925, 0, "k"], + [27926, 0, "_"], + [27927, 0, "1"], + [27928, 0, " "], + [27929, 0, "\\"], + [27930, 0, ","], + [27931, 0, "\\"], + [27932, 0, "m"], + [27933, 0, "a"], + [27934, 0, "p"], + [27935, 0, "s"], + [27936, 0, "t"], + [27937, 0, "o"], + [27938, 0, " "], + [27938, 1], + [27938, 0, "\\"], + [27939, 0, ","], + [27940, 0, " "], + [27941, 0, "\\"], + [27942, 0, "m"], + [27943, 0, "a"], + [27944, 0, "t"], + [27945, 0, "h"], + [27946, 0, "i"], + [27947, 0, "t"], + [27948, 0, "{"], + [27949, 0, "s"], + [27950, 0, "t"], + [27951, 0, "a"], + [27952, 0, "t"], + [27953, 0, "e"], + [27954, 0, "}"], + [27955, 0, " "], + [27956, 0, "\\"], + [27957, 0, ","], + [27958, 0, "]"], + [27959, 0, "$"], + [27960, 0, "}"], + [27581, 1], + [27581, 0, "("], + [27977, 0, "\n"], + [27978, 0, "\n"], + [27979, 0, "\\"], + [27980, 0, "b"], + [27981, 0, "e"], + [27982, 0, "g"], + [27983, 0, "i"], + [27984, 0, "n"], + [27985, 0, "{"], + [27986, 0, "p"], + [27987, 0, "r"], + [27988, 0, "o"], + [27989, 0, "o"], + [27990, 0, "f"], + [27991, 0, "t"], + [27992, 0, "r"], + [27993, 0, "e"], + [27994, 0, "e"], + [27995, 0, "}"], + [27996, 0, "\n"], + [27997, 0, "\\"], + [27998, 0, "A"], + [27999, 0, "x"], + [28000, 0, "i"], + [28001, 0, "o"], + [28002, 0, "m"], + [28003, 0, "C"], + [28004, 0, "{"], + [28005, 0, "$"], + [28006, 0, "k"], + [28007, 0, "_"], + [28008, 0, "1"], + [28009, 0, " "], + [28010, 0, "\\"], + [28011, 0, "n"], + [28012, 0, "o"], + [28013, 0, "t"], + [28014, 0, "i"], + [28015, 0, "n"], + [28016, 0, " "], + [28017, 0, "\\"], + [28018, 0, "m"], + [28019, 0, "a"], + [28020, 0, "t"], + [28021, 0, "h"], + [28022, 0, "r"], + [28023, 0, "m"], + [28024, 0, "{"], + [28025, 0, "d"], + [28026, 0, "o"], + [28027, 0, "m"], + [28028, 0, "}"], + [28029, 0, "("], + [28030, 0, "\\"], + [28031, 0, "m"], + [28032, 0, "a"], + [28033, 0, "t"], + [28034, 0, "h"], + [28035, 0, "i"], + [28036, 0, "t"], + [28037, 0, "{"], + [28038, 0, "c"], + [28039, 0, "t"], + [28040, 0, "x"], + [28041, 0, "}"], + [28042, 0, ")"], + [28043, 0, "$"], + [28044, 0, "}"], + [28045, 0, "\n"], + [28046, 0, "\\"], + [28047, 0, "A"], + [28048, 0, "x"], + [28049, 0, "i"], + [28050, 0, "o"], + [28051, 0, "m"], + [28052, 0, "C"], + [28053, 0, "{"], + [28054, 0, "$"], + [28055, 0, "k"], + [28056, 0, "_"], + [28057, 0, "1"], + [28058, 0, " "], + [28059, 0, "="], + [28060, 0, " "], + [28061, 0, "\\"], + [28062, 0, "m"], + [28063, 0, "a"], + [28064, 0, "t"], + [28065, 0, "h"], + [28066, 0, "s"], + [28067, 0, "f"], + [28068, 0, "{"], + [28069, 0, "l"], + [28070, 0, "i"], + [28071, 0, "s"], + [28072, 0, "t"], + [28073, 0, "T"], + [28074, 0, "}"], + [28075, 0, "("], + [28076, 0, "k"], + [28077, 0, "_"], + [28078, 0, "\\"], + [28079, 0, "m"], + [28080, 0, "a"], + [28081, 0, "t"], + [28082, 0, "h"], + [28083, 0, "i"], + [28084, 0, "t"], + [28085, 0, "{"], + [28086, 0, "n"], + [28087, 0, "e"], + [28088, 0, "w"], + [28089, 0, "}"], + [28090, 0, ")"], + [28091, 0, "$"], + [28092, 0, "}"], + [28093, 0, "\n"], + [28094, 0, "\\"], + [28095, 0, "A"], + [28096, 0, "x"], + [28097, 0, "i"], + [28098, 0, "o"], + [28099, 0, "m"], + [28100, 0, "C"], + [28101, 0, "{"], + [28102, 0, "$"], + [28103, 0, "\\"], + [28104, 0, "{"], + [28105, 0, " "], + [28106, 0, "\\"], + [28107, 0, "m"], + [28108, 0, "a"], + [28108, 1], + [28107, 1], + [28106, 1], + [28105, 1], + [28105, 0, "\\"], + [28106, 0, "m"], + [28107, 0, "a"], + [28108, 0, "t"], + [28109, 0, "h"], + [28110, 0, "s"], + [28111, 0, "f"], + [28112, 0, "{"], + [28113, 0, "n"], + [28114, 0, "e"], + [28115, 0, "x"], + [28116, 0, "t"], + [28117, 0, "}"], + [28118, 0, "("], + [28119, 0, "\\"], + [28120, 0, "m"], + [28121, 0, "a"], + [28122, 0, "t"], + [28123, 0, "h"], + [28124, 0, "s"], + [28125, 0, "f"], + [28126, 0, "{"], + [28127, 0, "h"], + [28128, 0, "e"], + [28129, 0, "a"], + [28130, 0, "d"], + [28131, 0, "}"], + [28132, 0, ")"], + [28133, 0, " "], + [28134, 0, "\\"], + [28135, 0, "m"], + [28136, 0, "a"], + [28137, 0, "p"], + [28138, 0, "s"], + [28139, 0, "t"], + [28140, 0, "o"], + [28141, 0, " "], + [28142, 0, "\\"], + [28143, 0, "m"], + [28144, 0, "a"], + [28145, 0, "t"], + [28146, 0, "h"], + [28147, 0, "s"], + [28148, 0, "f"], + [28149, 0, "{"], + [28150, 0, "t"], + [28151, 0, "a"], + [28152, 0, "i"], + [28153, 0, "l"], + [28154, 0, "}"], + [28155, 0, "\\"], + [28156, 0, "}"], + [28157, 0, ","], + [28158, 0, " "], + [28159, 0, "\\"], + [28160, 0, "m"], + [28161, 0, "a"], + [28162, 0, "t"], + [28163, 0, "h"], + [28164, 0, "s"], + [28165, 0, "f"], + [28166, 0, "{"], + [28167, 0, "o"], + [28168, 0, "p"], + [28169, 0, "}"], + [28170, 0, "("], + [28171, 0, "\\"], + [28172, 0, "m"], + [28173, 0, "a"], + [28174, 0, "t"], + [28175, 0, "h"], + [28176, 0, "i"], + [28177, 0, "t"], + [28178, 0, "{"], + [28179, 0, "i"], + [28180, 0, "d"], + [28181, 0, "}"], + [28182, 0, ","], + [28183, 0, " "], + [28184, 0, "\\"], + [28185, 0, "m"], + [28186, 0, "a"], + [28187, 0, "t"], + [28188, 0, "h"], + [28189, 0, "i"], + [28190, 0, "t"], + [28191, 0, "{"], + [28192, 0, "d"], + [28193, 0, "e"], + [28194, 0, "p"], + [28195, 0, "s"], + [28196, 0, "}"], + [28197, 0, ","], + [28198, 0, "\n"], + [28199, 0, " "], + [28200, 0, " "], + [28201, 0, " "], + [28202, 0, " "], + [28203, 0, "\\"], + [28204, 0, "m"], + [28205, 0, "a"], + [28206, 0, "t"], + [28207, 0, "h"], + [28208, 0, "s"], + [28209, 0, "f"], + [28210, 0, "{"], + [28211, 0, "c"], + [28212, 0, "u"], + [28213, 0, "r"], + [28214, 0, "s"], + [28215, 0, "o"], + [28216, 0, "r"], + [28217, 0, "}"], + [28218, 0, "("], + [28219, 0, "\\"], + [28220, 0, "l"], + [28221, 0, "a"], + [28222, 0, "n"], + [28223, 0, "g"], + [28224, 0, "l"], + [28225, 0, "e"], + [28226, 0, " "], + [28227, 0, "k"], + [28228, 0, "_"], + [28229, 0, "2"], + [28230, 0, ","], + [28231, 0, " "], + [28232, 0, "\\"], + [28233, 0, "d"], + [28234, 0, "o"], + [28235, 0, "t"], + [28236, 0, "s"], + [28237, 0, ","], + [28238, 0, " "], + [28239, 0, "k"], + [28240, 0, "_"], + [28241, 0, "{"], + [28242, 0, "n"], + [28243, 0, "-"], + [28244, 0, "1"], + [28245, 0, "}"], + [28246, 0, " "], + [28247, 0, "\\"], + [28248, 0, "r"], + [28249, 0, "a"], + [28250, 0, "n"], + [28251, 0, "g"], + [28252, 0, "l"], + [28253, 0, "e"], + [28254, 0, ","], + [28255, 0, "\\"], + [28256, 0, ","], + [28257, 0, " "], + [28258, 0, "k"], + [28259, 0, "_"], + [28260, 0, "n"], + [28261, 0, ")"], + [28262, 0, ","], + [28263, 0, " "], + [28264, 0, "\\"], + [28265, 0, "m"], + [28266, 0, "a"], + [28267, 0, "t"], + [28268, 0, "h"], + [28269, 0, "i"], + [28270, 0, "t"], + [28271, 0, "{"], + [28272, 0, "m"], + [28273, 0, "u"], + [28274, 0, "t"], + [28275, 0, "}"], + [28276, 0, ")"], + [28277, 0, " "], + [28278, 0, "\\"], + [28279, 0, "e"], + [28280, 0, "v"], + [28281, 0, "a"], + [28282, 0, "l"], + [28283, 0, "t"], + [28284, 0, "o"], + [28285, 0, " "], + [28286, 0, "\\"], + [28287, 0, "m"], + [28288, 0, "a"], + [28289, 0, "t"], + [28290, 0, "h"], + [28291, 0, "i"], + [28292, 0, "t"], + [28293, 0, "{"], + [28294, 0, "s"], + [28295, 0, "t"], + [28296, 0, "a"], + [28297, 0, "t"], + [28298, 0, "e"], + [28299, 0, "}"], + [28300, 0, "$"], + [28301, 0, "}"], + [28302, 0, "\n"], + [28303, 0, "\\"], + [28304, 0, "L"], + [28305, 0, "e"], + [28306, 0, "f"], + [28307, 0, "t"], + [28308, 0, "L"], + [28309, 0, "a"], + [28310, 0, "b"], + [28311, 0, "e"], + [28312, 0, "l"], + [28313, 0, "{"], + [28314, 0, "\\"], + [28315, 0, "t"], + [28316, 0, "e"], + [28317, 0, "x"], + [28318, 0, "t"], + [28319, 0, "s"], + [28320, 0, "c"], + [28321, 0, "{"], + [28322, 0, "D"], + [28323, 0, "e"], + [28324, 0, "f"], + [28325, 0, "-"], + [28326, 0, "L"], + [28327, 0, "i"], + [28328, 0, "s"], + [28329, 0, "t"], + [28330, 0, "}"], + [28331, 0, "}"], + [28332, 0, "\n"], + [28333, 0, "\\"], + [28334, 0, "T"], + [28335, 0, "r"], + [28336, 0, "i"], + [28337, 0, "n"], + [28338, 0, "a"], + [28339, 0, "r"], + [28340, 0, "y"], + [28341, 0, "I"], + [28342, 0, "n"], + [28343, 0, "f"], + [28344, 0, "C"], + [28345, 0, "{"], + [28346, 0, "$"], + [28347, 0, "\\"], + [28348, 0, "m"], + [28349, 0, "a"], + [28350, 0, "t"], + [28351, 0, "h"], + [28352, 0, "i"], + [28353, 0, "t"], + [28354, 0, "{"], + [28355, 0, "c"], + [28356, 0, "t"], + [28357, 0, "x"], + [28358, 0, "}"], + [28359, 0, ","], + [28360, 0, "\\"], + [28361, 0, ","], + [28362, 0, " "], + [28363, 0, "\\"], + [28364, 0, "m"], + [28365, 0, "a"], + [28366, 0, "t"], + [28367, 0, "h"], + [28368, 0, "s"], + [28369, 0, "f"], + [28370, 0, "{"], + [28371, 0, "o"], + [28372, 0, "p"], + [28373, 0, "}"], + [28374, 0, "("], + [28375, 0, "\\"], + [28376, 0, "m"], + [28377, 0, "a"], + [28378, 0, "t"], + [28379, 0, "h"], + [28380, 0, "i"], + [28381, 0, "t"], + [28382, 0, "{"], + [28383, 0, "i"], + [28384, 0, "d"], + [28385, 0, "}"], + [28386, 0, ","], + [28387, 0, " "], + [28388, 0, "\\"], + [28389, 0, "m"], + [28390, 0, "a"], + [28391, 0, "t"], + [28392, 0, "h"], + [28393, 0, "i"], + [28394, 0, "t"], + [28395, 0, "{"], + [28396, 0, "d"], + [28397, 0, "e"], + [28398, 0, "p"], + [28399, 0, "s"], + [28400, 0, "}"], + [28401, 0, ","], + [28402, 0, "\n"], + [28403, 0, " "], + [28404, 0, " "], + [28405, 0, " "], + [28406, 0, " "], + [28407, 0, "\\"], + [28408, 0, "m"], + [28409, 0, "a"], + [28410, 0, "t"], + [28411, 0, "h"], + [28412, 0, "s"], + [28413, 0, "f"], + [28414, 0, "{"], + [28415, 0, "c"], + [28416, 0, "u"], + [28417, 0, "r"], + [28418, 0, "s"], + [28419, 0, "o"], + [28420, 0, "r"], + [28421, 0, "}"], + [28422, 0, "("], + [28423, 0, "\\"], + [28424, 0, "l"], + [28425, 0, "a"], + [28426, 0, "n"], + [28427, 0, "g"], + [28428, 0, "l"], + [28429, 0, "e"], + [28430, 0, " "], + [28431, 0, "k"], + [28432, 0, "_"], + [28433, 0, "1"], + [28434, 0, ","], + [28435, 0, " "], + [28436, 0, "\\"], + [28437, 0, "k"], + [28438, 0, "_"], + [28439, 0, "2"], + [28440, 0, ","], + [28441, 0, " "], + [28442, 0, "\\"], + [28443, 0, "d"], + [28444, 0, "o"], + [28445, 0, "t"], + [28446, 0, "s"], + [28436, 1], + [28446, 0, ","], + [28447, 0, " "], + [28448, 0, "k"], + [28449, 0, "_"], + [28450, 0, "{"], + [28451, 0, "n"], + [28452, 0, "-"], + [28453, 0, "1"], + [28454, 0, "}"], + [28455, 0, " "], + [28456, 0, "\\"], + [28457, 0, "r"], + [28458, 0, "a"], + [28459, 0, "n"], + [28460, 0, "g"], + [28461, 0, "l"], + [28462, 0, "e"], + [28463, 0, ","], + [28464, 0, "\\"], + [28465, 0, ","], + [28466, 0, " "], + [28467, 0, "k"], + [28468, 0, "_"], + [28469, 0, "n"], + [28470, 0, ")"], + [28471, 0, ","], + [28472, 0, " "], + [28473, 0, "\\"], + [28474, 0, "m"], + [28475, 0, "a"], + [28476, 0, "t"], + [28477, 0, "h"], + [28478, 0, "i"], + [28479, 0, "t"], + [28480, 0, "{"], + [28481, 0, "m"], + [28482, 0, "u"], + [28483, 0, "t"], + [28484, 0, "}"], + [28485, 0, ")"], + [28486, 0, " "], + [28487, 0, "\\"], + [28488, 0, "e"], + [28489, 0, "v"], + [28490, 0, "a"], + [28491, 0, "l"], + [28492, 0, "t"], + [28493, 0, "o"], + [28494, 0, "\n"], + [28495, 0, " "], + [28496, 0, " "], + [28497, 0, " "], + [28498, 0, " "], + [28499, 0, "\\"], + [28500, 0, "m"], + [28501, 0, "a"], + [28502, 0, "t"], + [28503, 0, "h"], + [28504, 0, "s"], + [28505, 0, "f"], + [28506, 0, "{"], + [28507, 0, "c"], + [28508, 0, "t"], + [28509, 0, "x"], + [28510, 0, "}"], + [28511, 0, "["], + [28512, 0, "\\"], + [28513, 0, ","], + [28514, 0, " "], + [28515, 0, "k"], + [28516, 0, "_"], + [28517, 0, "1"], + [28518, 0, " "], + [28519, 0, "\\"], + [28520, 0, ","], + [28521, 0, "\\"], + [28522, 0, "m"], + [28523, 0, "a"], + [28524, 0, "p"], + [28525, 0, "s"], + [28526, 0, "t"], + [28527, 0, "o"], + [28528, 0, " "], + [28528, 1], + [28528, 0, "\\"], + [28529, 0, ","], + [28530, 0, " "], + [28531, 0, "\\"], + [28532, 0, "m"], + [28533, 0, "a"], + [28534, 0, "t"], + [28535, 0, "h"], + [28536, 0, "i"], + [28537, 0, "t"], + [28538, 0, "{"], + [28539, 0, "s"], + [28540, 0, "t"], + [28541, 0, "a"], + [28542, 0, "t"], + [28543, 0, "e"], + [28544, 0, "}"], + [28545, 0, " "], + [28546, 0, "\\"], + [28547, 0, ","], + [28548, 0, "]"], + [28549, 0, "$"], + [28550, 0, "}"], + [28551, 0, "\n"], + [28552, 0, "\\"], + [28553, 0, "e"], + [28554, 0, "n"], + [28555, 0, "d"], + [28556, 0, "{"], + [28557, 0, "p"], + [28558, 0, "r"], + [28559, 0, "o"], + [28560, 0, "o"], + [28561, 0, "f"], + [28562, 0, "t"], + [28563, 0, "r"], + [28564, 0, "e"], + [28565, 0, "e"], + [28566, 0, "}"], + [28103, 0, "\\"], + [28104, 0, "b"], + [28105, 0, "e"], + [28106, 0, "g"], + [28107, 0, "i"], + [28108, 0, "n"], + [28109, 0, "{"], + [28110, 0, "m"], + [28111, 0, "a"], + [28112, 0, "t"], + [28113, 0, "r"], + [28114, 0, "i"], + [28115, 0, "x"], + [28116, 0, "}"], + [28117, 0, "\n"], + [28118, 0, " "], + [28119, 0, " "], + [28120, 0, " "], + [28121, 0, " "], + [28217, 0, " "], + [28218, 0, "\\"], + [28219, 0, "\\"], + [28322, 0, "\n"], + [28323, 0, " "], + [28324, 0, " "], + [28325, 0, " "], + [28326, 0, " "], + [28327, 0, "\\"], + [28328, 0, "e"], + [28329, 0, "n"], + [28330, 0, "d"], + [28331, 0, "{"], + [28332, 0, "m"], + [28333, 0, "a"], + [28334, 0, "t"], + [28335, 0, "r"], + [28336, 0, "i"], + [28337, 0, "x"], + [28338, 0, "}"], + [28339, 0, " "], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [28737, 1], + [30046, 1], + [30045, 1], + [30044, 1], + [30043, 1], + [30042, 1], + [30041, 1], + [30040, 1], + [30039, 1], + [30038, 1], + [30037, 1], + [30036, 1], + [30035, 1], + [30034, 1], + [30033, 1], + [30032, 1], + [30031, 1], + [30030, 1], + [30029, 1], + [30028, 1], + [30027, 1], + [30026, 1], + [30025, 1], + [30024, 1], + [30023, 1], + [30023, 0, "e"], + [30024, 0, "v"], + [30025, 0, "a"], + [30026, 0, "l"], + [30027, 0, "u"], + [30028, 0, "a"], + [30029, 0, "t"], + [30030, 0, "i"], + [30031, 0, "n"], + [30032, 0, "g"], + [30033, 0, " "], + [30034, 0, "o"], + [30035, 0, "p"], + [30036, 0, "e"], + [30037, 0, "r"], + [30038, 0, "a"], + [30039, 0, "t"], + [30040, 0, "i"], + [30041, 0, "o"], + [30042, 0, "n"], + [30043, 0, "s"], + [30044, 0, " "], + [30045, 0, "a"], + [30046, 0, "n"], + [30047, 0, "d"], + [30048, 0, " "], + [30049, 0, "m"], + [30050, 0, "o"], + [30051, 0, "d"], + [30052, 0, "i"], + [30053, 0, "f"], + [30054, 0, "y"], + [30055, 0, "i"], + [30056, 0, "n"], + [30057, 0, "g"], + [30058, 0, " "], + [30059, 0, "d"], + [30060, 0, "o"], + [30061, 0, "c"], + [30062, 0, "u"], + [30063, 0, "m"], + [30064, 0, "e"], + [30065, 0, "n"], + [30066, 0, "t"], + [30067, 0, " "], + [30068, 0, "s"], + [30069, 0, "t"], + [30070, 0, "a"], + [30071, 0, "t"], + [30072, 0, "e"], + [30074, 0, "\\"], + [30075, 0, "l"], + [30076, 0, "a"], + [30077, 0, "b"], + [30078, 0, "e"], + [30079, 0, "l"], + [30080, 0, "{"], + [30081, 0, "f"], + [30082, 0, "i"], + [30083, 0, "g"], + [30084, 0, ":"], + [30085, 0, "o"], + [30086, 0, "p"], + [30087, 0, "e"], + [30088, 0, "r"], + [30089, 0, "a"], + [30090, 0, "t"], + [30091, 0, "i"], + [30092, 0, "o"], + [30093, 0, "n"], + [30094, 0, "-"], + [30095, 0, "r"], + [30096, 0, "u"], + [30097, 0, "l"], + [30098, 0, "e"], + [30099, 0, "s"], + [30100, 0, "}"], + [30122, 1], + [30121, 1], + [30120, 1], + [30119, 1], + [30118, 1], + [30117, 1], + [30116, 1], + [30115, 1], + [30114, 1], + [30113, 1], + [30112, 1], + [30111, 1], + [30110, 1], + [30109, 1], + [30108, 1], + [30107, 1], + [30106, 1], + [30105, 1], + [30104, 1], + [30103, 1], + [30102, 1], + [30101, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28721, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 1], + [28608, 0, "\n"], + [28609, 0, "\\"], + [28610, 0, "b"], + [28611, 0, "e"], + [28612, 0, "g"], + [28613, 0, "i"], + [28614, 0, "n"], + [28615, 0, "{"], + [28616, 0, "p"], + [28617, 0, "r"], + [28618, 0, "o"], + [28619, 0, "o"], + [28620, 0, "f"], + [28621, 0, "t"], + [28622, 0, "r"], + [28623, 0, "e"], + [28624, 0, "e"], + [28625, 0, "}"], + [28626, 0, "\n"], + [28627, 0, "\\"], + [28628, 0, "e"], + [28629, 0, "n"], + [28630, 0, "d"], + [28631, 0, "{"], + [28632, 0, "p"], + [28633, 0, "r"], + [28634, 0, "o"], + [28635, 0, "o"], + [28636, 0, "f"], + [28637, 0, "t"], + [28638, 0, "r"], + [28639, 0, "e"], + [28640, 0, "e"], + [28641, 0, "}"], + [28626, 0, "\n"], + [28627, 0, "\\"], + [28628, 0, "A"], + [28629, 0, "x"], + [28630, 0, "i"], + [28631, 0, "o"], + [28632, 0, "m"], + [28633, 0, "C"], + [28634, 0, "{"], + [28635, 0, "$"], + [28636, 0, "\\"], + [28637, 0, "m"], + [28638, 0, "a"], + [28639, 0, "t"], + [28640, 0, "h"], + [28641, 0, "i"], + [28642, 0, "t"], + [28643, 0, "{"], + [28644, 0, "v"], + [28645, 0, "a"], + [28646, 0, "l"], + [28647, 0, "}"], + [28648, 0, " "], + [28649, 0, "\\"], + [28650, 0, "n"], + [28651, 0, "o"], + [28652, 0, "t"], + [28653, 0, "="], + [28654, 0, " "], + [28655, 0, "\\"], + [28656, 0, "t"], + [28657, 0, "e"], + [28658, 0, "x"], + [28659, 0, "t"], + [28660, 0, "t"], + [28661, 0, "t"], + [28662, 0, "{"], + [28663, 0, "["], + [28664, 0, "]"], + [28665, 0, "}"], + [28666, 0, " "], + [28667, 0, "\\"], + [28668, 0, ","], + [28669, 0, "\\"], + [28670, 0, "w"], + [28671, 0, "e"], + [28672, 0, "d"], + [28673, 0, "g"], + [28674, 0, "e"], + [28675, 0, "\\"], + [28676, 0, ","], + [28677, 0, " "], + [28678, 0, "\\"], + [28679, 0, "m"], + [28680, 0, "a"], + [28681, 0, "t"], + [28682, 0, "h"], + [28683, 0, "i"], + [28684, 0, "t"], + [28685, 0, "{"], + [28686, 0, "v"], + [28687, 0, "a"], + [28688, 0, "l"], + [28689, 0, "}"], + [28690, 0, " "], + [28691, 0, "\\"], + [28692, 0, "n"], + [28693, 0, "o"], + [28694, 0, "t"], + [28695, 0, "="], + [28696, 0, " "], + [28697, 0, "\\"], + [28698, 0, "t"], + [28699, 0, "e"], + [28700, 0, "x"], + [28701, 0, "t"], + [28702, 0, "t"], + [28703, 0, "t"], + [28704, 0, "{"], + [28705, 0, "\\"], + [28706, 0, "s"], + [28707, 0, "t"], + [28708, 0, "r"], + [28709, 0, "i"], + [28710, 0, "n"], + [28711, 0, "g"], + [28712, 0, "\\"], + [28712, 1], + [28712, 0, "{"], + [28713, 0, "\\"], + [28714, 0, "s"], + [28715, 0, "t"], + [28716, 0, "r"], + [28717, 0, "i"], + [28718, 0, "n"], + [28719, 0, "g"], + [28720, 0, "}"], + [28721, 0, "}"], + [28722, 0, " "], + [28722, 1], + [28722, 0, "$"], + [28723, 0, "}"], + [28724, 0, "\n"], + [28725, 0, "\\"], + [28726, 0, "A"], + [28727, 0, "x"], + [28728, 0, "i"], + [28729, 0, "o"], + [28730, 0, "m"], + [28731, 0, "C"], + [28732, 0, "{"], + [28733, 0, "$"], + [28734, 0, "\\"], + [28735, 0, "m"], + [28736, 0, "a"], + [28737, 0, "t"], + [28738, 0, "h"], + [28739, 0, "s"], + [28740, 0, "f"], + [28741, 0, "{"], + [28742, 0, "r"], + [28743, 0, "e"], + [28744, 0, "g"], + [28745, 0, "T"], + [28746, 0, "}"], + [28747, 0, "("], + [28748, 0, "k"], + [28749, 0, ")"], + [28750, 0, " "], + [28751, 0, "\\"], + [28752, 0, "i"], + [28753, 0, "n"], + [28754, 0, " "], + [28755, 0, "\\"], + [28756, 0, "m"], + [28757, 0, "a"], + [28758, 0, "t"], + [28759, 0, "h"], + [28760, 0, "r"], + [28761, 0, "m"], + [28762, 0, "{"], + [28763, 0, "d"], + [28764, 0, "o"], + [28765, 0, "m"], + [28766, 0, "}"], + [28767, 0, "("], + [28768, 0, "\\"], + [28769, 0, "m"], + [28770, 0, "a"], + [28771, 0, "t"], + [28772, 0, "h"], + [28773, 0, "i"], + [28774, 0, "t"], + [28775, 0, "{"], + [28776, 0, "c"], + [28777, 0, "t"], + [28778, 0, "x"], + [28779, 0, "}"], + [28780, 0, ")"], + [28781, 0, "$"], + [28782, 0, "}"], + [28783, 0, "\n"], + [28784, 0, "\\"], + [28785, 0, "m"], + [28785, 1], + [28785, 0, "A"], + [28786, 0, "x"], + [28787, 0, "i"], + [28788, 0, "o"], + [28789, 0, "m"], + [28790, 0, "C"], + [28791, 0, "{"], + [28792, 0, "$"], + [28793, 0, "\\"], + [28794, 0, "m"], + [28795, 0, "a"], + [28796, 0, "t"], + [28797, 0, "h"], + [28798, 0, "i"], + [28799, 0, "t"], + [28800, 0, "{"], + [28801, 0, "c"], + [28802, 0, "o"], + [28803, 0, "n"], + [28804, 0, "c"], + [28805, 0, "}"], + [28806, 0, " "], + [28807, 0, "="], + [28808, 0, " "], + [28809, 0, "{"], + [28810, 0, " "], + [28810, 1], + [28809, 1], + [28809, 0, "\\"], + [28810, 0, "{"], + [28811, 0, " "], + [28812, 0, "\\"], + [28813, 0, "m"], + [28814, 0, "a"], + [28815, 0, "t"], + [28816, 0, "h"], + [28817, 0, "i"], + [28818, 0, "t"], + [28819, 0, "{"], + [28820, 0, "i"], + [28821, 0, "d"], + [28822, 0, "}"], + [28823, 0, "_"], + [28824, 0, "i"], + [28825, 0, " "], + [28826, 0, "\\"], + [28827, 0, "m"], + [28828, 0, "a"], + [28829, 0, "p"], + [28830, 0, "s"], + [28831, 0, "t"], + [28832, 0, "o"], + [28833, 0, " "], + [28834, 0, "\\"], + [28835, 0, "m"], + [28836, 0, "a"], + [28837, 0, "t"], + [28838, 0, "h"], + [28839, 0, "i"], + [28840, 0, "t"], + [28840, 1], + [28839, 1], + [28838, 1], + [28837, 1], + [28836, 1], + [28835, 1], + [28834, 1], + [28834, 0, "v"], + [28835, 0, "_"], + [28836, 0, "i"], + [28837, 0, " "], + [28838, 0, "\\"], + [28839, 0, "m"], + [28840, 0, "i"], + [28841, 0, "d"], + [28793, 0, "\\"], + [28794, 0, "b"], + [28795, 0, "e"], + [28796, 0, "g"], + [28797, 0, "i"], + [28798, 0, "n"], + [28799, 0, "{"], + [28800, 0, "m"], + [28801, 0, "a"], + [28802, 0, "t"], + [28803, 0, "r"], + [28804, 0, "i"], + [28805, 0, "x"], + [28806, 0, "}"], + [28807, 0, "\n"], + [28808, 0, " "], + [28809, 0, " "], + [28810, 0, " "], + [28811, 0, " "], + [28861, 0, " "], + [28862, 0, "("], + [28863, 0, "\\"], + [28864, 0, "m"], + [28865, 0, "a"], + [28866, 0, "t"], + [28867, 0, "h"], + [28868, 0, "i"], + [28869, 0, "t"], + [28870, 0, "{"], + [28871, 0, "i"], + [28872, 0, "d"], + [28873, 0, "}"], + [28874, 0, "_"], + [28875, 0, "i"], + [28876, 0, " "], + [28877, 0, "\\"], + [28878, 0, "m"], + [28879, 0, "a"], + [28880, 0, "p"], + [28881, 0, "s"], + [28882, 0, "t"], + [28883, 0, "o"], + [28884, 0, " "], + [28885, 0, "v"], + [28886, 0, "_"], + [28887, 0, "i"], + [28888, 0, ")"], + [28889, 0, " "], + [28890, 0, "\\"], + [28891, 0, "i"], + [28892, 0, "n"], + [28893, 0, " "], + [28894, 0, "\\"], + [28895, 0, "m"], + [28896, 0, "a"], + [28897, 0, "t"], + [28898, 0, "h"], + [28899, 0, "i"], + [28900, 0, "t"], + [28901, 0, "{"], + [28902, 0, "c"], + [28903, 0, "t"], + [28904, 0, "x"], + [28905, 0, "}"], + [28906, 0, "("], + [28907, 0, "\\"], + [28908, 0, "m"], + [28909, 0, "a"], + [28910, 0, "t"], + [28911, 0, "h"], + [28912, 0, "s"], + [28913, 0, "f"], + [28914, 0, "{"], + [28915, 0, "r"], + [28916, 0, "e"], + [28917, 0, "g"], + [28918, 0, "T"], + [28919, 0, "}"], + [28920, 0, "("], + [28921, 0, "k"], + [28922, 0, ")"], + [28923, 0, ")"], + [28924, 0, " "], + [28925, 0, "\\"], + [28926, 0, "\\"], + [28927, 0, "\n"], + [28928, 0, " "], + [28929, 0, " "], + [28930, 0, " "], + [28931, 0, " "], + [28932, 0, "\\"], + [28933, 0, "w"], + [28934, 0, "e"], + [28935, 0, "d"], + [28936, 0, "g"], + [28937, 0, "e"], + [28938, 0, " "], + [28932, 0, "\\"], + [28933, 0, ","], + [28940, 1], + [28940, 0, "\\"], + [28941, 0, ","], + [28942, 0, " "], + [28943, 0, "\\"], + [28944, 0, "m"], + [28945, 0, "a"], + [28946, 0, "t"], + [28947, 0, "h"], + [28948, 0, "i"], + [28949, 0, "t"], + [28950, 0, "{"], + [28951, 0, "i"], + [28952, 0, "d"], + [28953, 0, "}"], + [28954, 0, "_"], + [28955, 0, "i"], + [28956, 0, " "], + [28957, 0, "\\"], + [28958, 0, "n"], + [28959, 0, "o"], + [28960, 0, "t"], + [28961, 0, "i"], + [28962, 0, "n"], + [28963, 0, " "], + [28964, 0, "\\"], + [28965, 0, "m"], + [28966, 0, "a"], + [28967, 0, "t"], + [28968, 0, "h"], + [28969, 0, "i"], + [28970, 0, "t"], + [28971, 0, "{"], + [28972, 0, "d"], + [28973, 0, "e"], + [28974, 0, "p"], + [28975, 0, "s"], + [28976, 0, "}"], + [28977, 0, " "], + [28978, 0, "\\"], + [28979, 0, "}"], + [28980, 0, "\n"], + [28981, 0, " "], + [28982, 0, " "], + [28983, 0, " "], + [28984, 0, " "], + [28985, 0, "\\"], + [28986, 0, "e"], + [28987, 0, "n"], + [28988, 0, "d"], + [28989, 0, "{"], + [28990, 0, "m"], + [28991, 0, "a"], + [28992, 0, "t"], + [28993, 0, "r"], + [28994, 0, "i"], + [28995, 0, "x"], + [28996, 0, "}"], + [28997, 0, " "], + [28998, 0, "$"], + [28999, 0, "}"], + [29000, 0, "\n"], + [29001, 0, "\\"], + [29002, 0, "L"], + [29003, 0, "e"], + [29004, 0, "f"], + [29005, 0, "t"], + [29006, 0, "L"], + [29007, 0, "a"], + [29008, 0, "b"], + [29009, 0, "e"], + [29010, 0, "l"], + [29011, 0, "{"], + [29012, 0, "$"], + [29013, 0, "\\"], + [29014, 0, "m"], + [29015, 0, "a"], + [29016, 0, "t"], + [29017, 0, "h"], + [29018, 0, "s"], + [29018, 1], + [29017, 1], + [29016, 1], + [29015, 1], + [29014, 1], + [29014, 0, "t"], + [29015, 0, "e"], + [29016, 0, "s"], + [29017, 0, "c"], + [29018, 0, "s"], + [29019, 0, "c"], + [29020, 0, "{"], + [29021, 0, "A"], + [29017, 1], + [29016, 1], + [29016, 0, "x"], + [29017, 0, "t"], + [29022, 0, "s"], + [29023, 0, "s"], + [29024, 0, "i"], + [29025, 0, "g"], + [29026, 0, "n"], + [29027, 0, "}"], + [29028, 0, "_"], + [29029, 0, "1"], + [29030, 0, "$"], + [29031, 0, "}"], + [29032, 0, "\n"], + [29033, 0, "\\"], + [29034, 0, "T"], + [29035, 0, "r"], + [29036, 0, "i"], + [29037, 0, "n"], + [29038, 0, "a"], + [29039, 0, "r"], + [29040, 0, "y"], + [29041, 0, "I"], + [29042, 0, "n"], + [29043, 0, "f"], + [29044, 0, "C"], + [29045, 0, "{"], + [29046, 0, "$"], + [29047, 0, "\\"], + [29048, 0, "m"], + [29049, 0, "a"], + [29050, 0, "t"], + [29051, 0, "h"], + [29052, 0, "i"], + [29053, 0, "t"], + [29054, 0, "{"], + [29055, 0, "c"], + [29056, 0, "t"], + [29057, 0, "x"], + [29058, 0, "}"], + [29059, 0, ","], + [29060, 0, "\\"], + [29061, 0, ","], + [29062, 0, " "], + [29063, 0, "\\"], + [29064, 0, "m"], + [29065, 0, "a"], + [29066, 0, "t"], + [29067, 0, "h"], + [29068, 0, "s"], + [29069, 0, "f"], + [29070, 0, "{"], + [29071, 0, "o"], + [29072, 0, "p"], + [29073, 0, "}"], + [29074, 0, "("], + [29075, 0, "\\"], + [29076, 0, "m"], + [29077, 0, "a"], + [29078, 0, "t"], + [29079, 0, "h"], + [29080, 0, "i"], + [29081, 0, "t"], + [29082, 0, "{"], + [29083, 0, "i"], + [29084, 0, "d"], + [29085, 0, "}"], + [29086, 0, ","], + [29087, 0, " "], + [29088, 0, "\\"], + [29089, 0, "m"], + [29090, 0, "a"], + [29091, 0, "t"], + [29092, 0, "h"], + [29093, 0, "i"], + [29094, 0, "t"], + [29095, 0, "["], + [29095, 1], + [29095, 0, "{"], + [29096, 0, "D"], + [29097, 0, "E"], + [29098, 0, "P"], + [29099, 0, "S"], + [29099, 1], + [29098, 1], + [29097, 1], + [29096, 1], + [29096, 0, "d"], + [29097, 0, "e"], + [29098, 0, "p"], + [29099, 0, "s"], + [29100, 0, "}"], + [29101, 0, ","], + [29102, 0, "\n"], + [29103, 0, " "], + [29104, 0, " "], + [29105, 0, " "], + [29106, 0, " "], + [29107, 0, "\\"], + [29108, 0, "m"], + [29109, 0, "a"], + [29110, 0, "t"], + [29111, 0, "h"], + [29112, 0, "s"], + [29113, 0, "f"], + [29114, 0, "{"], + [29115, 0, "c"], + [29116, 0, "u"], + [29117, 0, "r"], + [29118, 0, "s"], + [29119, 0, "o"], + [29120, 0, "r"], + [29121, 0, "}"], + [29122, 0, "("], + [29123, 0, "\\"], + [29124, 0, "l"], + [29125, 0, "a"], + [29126, 0, "n"], + [29127, 0, "g"], + [29128, 0, "l"], + [29129, 0, "e"], + [29130, 0, " "], + [29130, 1], + [29130, 0, "\\"], + [29131, 0, "r"], + [29132, 0, "a"], + [29133, 0, "n"], + [29134, 0, "g"], + [29135, 0, "l"], + [29136, 0, "e"], + [29137, 0, ","], + [29138, 0, "\\"], + [29139, 0, ","], + [29140, 0, " "], + [29141, 0, "k"], + [29142, 0, ")"], + [29143, 0, ","], + [29144, 0, " "], + [29145, 0, "\\"], + [29146, 0, "m"], + [29147, 0, "a"], + [29148, 0, "t"], + [29149, 0, "h"], + [29150, 0, "s"], + [29151, 0, "f"], + [29152, 0, "{"], + [29153, 0, "a"], + [29154, 0, "s"], + [29155, 0, "s"], + [29156, 0, "i"], + [29157, 0, "g"], + [29158, 0, "n"], + [29159, 0, "}"], + [29160, 0, "("], + [29161, 0, "\\"], + [29162, 0, "m"], + [29163, 0, "a"], + [29164, 0, "t"], + [29165, 0, "h"], + [29166, 0, "i"], + [29167, 0, "t"], + [29168, 0, "{"], + [29169, 0, "v"], + [29170, 0, "a"], + [29171, 0, "l"], + [29172, 0, "}"], + [29173, 0, ")"], + [29174, 0, " "], + [29175, 0, "\\"], + [29176, 0, "e"], + [29177, 0, "v"], + [29178, 0, "a"], + [29179, 0, "l"], + [29180, 0, "t"], + [29181, 0, "o"], + [29182, 0, "\n"], + [29183, 0, " "], + [29184, 0, " "], + [29185, 0, " "], + [29186, 0, " "], + [29187, 0, "\\"], + [29188, 0, "m"], + [29189, 0, "a"], + [29190, 0, "t"], + [29191, 0, "h"], + [29192, 0, "s"], + [29193, 0, "f"], + [29194, 0, "{"], + [29195, 0, "c"], + [29196, 0, "t"], + [29197, 0, "x"], + [29198, 0, "}"], + [29199, 0, "["], + [29200, 0, "\\"], + [29201, 0, ","], + [29202, 0, " "], + [29203, 0, "\\"], + [29204, 0, "m"], + [29205, 0, "a"], + [29206, 0, "t"], + [29207, 0, "h"], + [29208, 0, "s"], + [29209, 0, "f"], + [29210, 0, "{"], + [29211, 0, "r"], + [29212, 0, "e"], + [29213, 0, "g"], + [29214, 0, "T"], + [29215, 0, "}"], + [29216, 0, "("], + [29217, 0, "k"], + [29218, 0, ")"], + [29219, 0, " "], + [29220, 0, "\\"], + [29221, 0, ","], + [29222, 0, "m"], + [29222, 1], + [29222, 0, "\\"], + [29223, 0, "m"], + [29224, 0, "a"], + [29225, 0, "p"], + [29226, 0, "s"], + [29227, 0, "t"], + [29228, 0, "o"], + [29229, 0, "\\"], + [29230, 0, ","], + [29231, 0, " "], + [29232, 0, "\\"], + [29233, 0, "m"], + [29234, 0, "a"], + [29235, 0, "t"], + [29236, 0, "h"], + [29237, 0, "i"], + [29238, 0, "t"], + [29239, 0, "{"], + [29240, 0, "c"], + [29241, 0, "o"], + [29242, 0, "n"], + [29243, 0, "c"], + [29244, 0, "}"], + [29245, 0, "["], + [29246, 0, "\\"], + [29247, 0, ","], + [29248, 0, " "], + [29249, 0, "\\"], + [29250, 0, "m"], + [29251, 0, "a"], + [29252, 0, "t"], + [29253, 0, "h"], + [29254, 0, "i"], + [29255, 0, "t"], + [29256, 0, "{"], + [29257, 0, "i"], + [29258, 0, "d"], + [29259, 0, "}"], + [29260, 0, " "], + [29261, 0, "\\"], + [29262, 0, ","], + [29263, 0, "\\"], + [29264, 0, "m"], + [29265, 0, "a"], + [29266, 0, "p"], + [29267, 0, "s"], + [29268, 0, "t"], + [29269, 0, "o"], + [29270, 0, "\\"], + [29271, 0, ","], + [29272, 0, " "], + [29273, 0, "\\"], + [29274, 0, "m"], + [29275, 0, "a"], + [29276, 0, "t"], + [29277, 0, "h"], + [29278, 0, "i"], + [29279, 0, "t"], + [29280, 0, "{"], + [29281, 0, "v"], + [29282, 0, "a"], + [29283, 0, "l"], + [29284, 0, "}"], + [29285, 0, " "], + [29286, 0, "\\"], + [29287, 0, ","], + [29288, 0, "]"], + [29289, 0, "\\"], + [29290, 0, ","], + [29291, 0, "]"], + [29292, 0, "$"], + [29293, 0, "}"], + [28933, 1], + [28932, 1], + [28824, 0, "u"], + [28825, 0, "r"], + [28826, 0, "r"], + [28827, 0, "e"], + [28828, 0, "n"], + [28829, 0, "t"], + [28867, 0, "\n"], + [28868, 0, " "], + [28869, 0, " "], + [28870, 0, " "], + [29239, 0, "\n"], + [29240, 0, " "], + [29241, 0, " "], + [29242, 0, " "], + [29256, 0, "u"], + [29257, 0, "r"], + [29258, 0, "r"], + [29259, 0, "e"], + [29260, 0, "n"], + [29261, 0, "t"], + [29328, 0, "\n"], + [29329, 0, "\n"], + [29330, 0, "\\"], + [29331, 0, "b"], + [29332, 0, "e"], + [29333, 0, "g"], + [29334, 0, "i"], + [29335, 0, "n"], + [29336, 0, "{"], + [29337, 0, "p"], + [29338, 0, "r"], + [29339, 0, "o"], + [29340, 0, "o"], + [29341, 0, "f"], + [29342, 0, "t"], + [29343, 0, "r"], + [29344, 0, "e"], + [29345, 0, "e"], + [29346, 0, "}"], + [29347, 0, "\n"], + [29348, 0, "\\"], + [29349, 0, "e"], + [29350, 0, "n"], + [29351, 0, "d"], + [29352, 0, "{"], + [29353, 0, "p"], + [29354, 0, "r"], + [29355, 0, "o"], + [29356, 0, "o"], + [29357, 0, "f"], + [29358, 0, "t"], + [29359, 0, "r"], + [29360, 0, "e"], + [29361, 0, "e"], + [29362, 0, "}"], + [29347, 0, "\n"], + [29348, 0, "\\"], + [29349, 0, "A"], + [29350, 0, "x"], + [29351, 0, "i"], + [29352, 0, "o"], + [29353, 0, "m"], + [29354, 0, "C"], + [29355, 0, "{"], + [29356, 0, "$"], + [29357, 0, "\\"], + [29358, 0, "m"], + [29359, 0, "a"], + [29360, 0, "t"], + [29361, 0, "h"], + [29362, 0, "i"], + [29363, 0, "t"], + [29364, 0, "{"], + [29365, 0, "v"], + [29366, 0, "a"], + [29367, 0, "l"], + [29368, 0, "}"], + [29369, 0, " "], + [29370, 0, "\\"], + [29371, 0, "n"], + [29372, 0, "o"], + [29373, 0, "t"], + [29374, 0, "="], + [29375, 0, " "], + [29376, 0, "\\"], + [29377, 0, "t"], + [29378, 0, "e"], + [29379, 0, "x"], + [29380, 0, "t"], + [29381, 0, "t"], + [29382, 0, "t"], + [29383, 0, "{"], + [29384, 0, "["], + [29385, 0, "]"], + [29386, 0, "}"], + [29387, 0, " "], + [29388, 0, "\\"], + [29389, 0, ","], + [29390, 0, "\\"], + [29391, 0, "w"], + [29392, 0, "e"], + [29393, 0, "d"], + [29394, 0, "g"], + [29395, 0, "e"], + [29396, 0, "\\"], + [29397, 0, ","], + [29398, 0, " "], + [29399, 0, "\\"], + [29400, 0, "m"], + [29401, 0, "a"], + [29402, 0, "t"], + [29403, 0, "h"], + [29404, 0, "i"], + [29405, 0, "t"], + [29406, 0, "{"], + [29407, 0, "v"], + [29408, 0, "a"], + [29409, 0, "l"], + [29410, 0, "}"], + [29411, 0, " "], + [29412, 0, "\\"], + [29413, 0, "n"], + [29414, 0, "o"], + [29415, 0, "t"], + [29416, 0, "="], + [29417, 0, " "], + [29418, 0, "\\"], + [29419, 0, "t"], + [29420, 0, "e"], + [29421, 0, "x"], + [29422, 0, "t"], + [29423, 0, "t"], + [29424, 0, "t"], + [29425, 0, "{"], + [29426, 0, "\\"], + [29427, 0, "s"], + [29428, 0, "t"], + [29429, 0, "r"], + [29430, 0, "i"], + [29431, 0, "n"], + [29432, 0, "g"], + [29433, 0, "{"], + [29434, 0, "\\"], + [29435, 0, "s"], + [29436, 0, "t"], + [29437, 0, "r"], + [29438, 0, "i"], + [29439, 0, "n"], + [29440, 0, "g"], + [29441, 0, "}"], + [29442, 0, "}"], + [29443, 0, "$"], + [29444, 0, "}"], + [29445, 0, "\n"], + [29446, 0, "\\"], + [29447, 0, "A"], + [29448, 0, "x"], + [29449, 0, "i"], + [29450, 0, "o"], + [29451, 0, "m"], + [29452, 0, "C"], + [29453, 0, "{"], + [29454, 0, "$"], + [29455, 0, "\\"], + [29456, 0, "m"], + [29457, 0, "a"], + [29458, 0, "t"], + [29459, 0, "h"], + [29460, 0, "s"], + [29461, 0, "f"], + [29462, 0, "{"], + [29463, 0, "r"], + [29464, 0, "e"], + [29465, 0, "g"], + [29466, 0, "T"], + [29467, 0, "}"], + [29468, 0, "("], + [29469, 0, "k"], + [29470, 0, ")"], + [29471, 0, " "], + [29472, 0, "\\"], + [29473, 0, "n"], + [29474, 0, "o"], + [29475, 0, "t"], + [29476, 0, "i"], + [29477, 0, "n"], + [29478, 0, " "], + [29479, 0, "\\"], + [29480, 0, "m"], + [29481, 0, "a"], + [29482, 0, "t"], + [29483, 0, "h"], + [29484, 0, "r"], + [29485, 0, "m"], + [29486, 0, "{"], + [29487, 0, "d"], + [29488, 0, "o"], + [29489, 0, "m"], + [29490, 0, "}"], + [29491, 0, "("], + [29492, 0, "\\"], + [29493, 0, "m"], + [29494, 0, "a"], + [29495, 0, "t"], + [29496, 0, "h"], + [29497, 0, "i"], + [29498, 0, "t"], + [29499, 0, "{"], + [29500, 0, "c"], + [29501, 0, "t"], + [29502, 0, "x"], + [29503, 0, "}"], + [29504, 0, ")"], + [29505, 0, "$"], + [29506, 0, "}"], + [29507, 0, "\n"], + [29508, 0, "\\"], + [29509, 0, "L"], + [29510, 0, "e"], + [29511, 0, "f"], + [29512, 0, "t"], + [29513, 0, "L"], + [29514, 0, "a"], + [29515, 0, "b"], + [29516, 0, "e"], + [29517, 0, "l"], + [29518, 0, "{"], + [29519, 0, "$"], + [29520, 0, "\\"], + [29521, 0, "t"], + [29522, 0, "e"], + [29523, 0, "x"], + [29524, 0, "t"], + [29525, 0, "s"], + [29526, 0, "c"], + [29527, 0, "{"], + [29528, 0, "A"], + [29529, 0, "s"], + [29530, 0, "s"], + [29531, 0, "i"], + [29532, 0, "g"], + [29533, 0, "n"], + [29534, 0, "}"], + [29535, 0, "_"], + [29536, 0, "2"], + [29537, 0, "$"], + [29538, 0, "}"], + [29539, 0, "\n"], + [29540, 0, "\\"], + [29541, 0, "B"], + [29542, 0, "i"], + [29543, 0, "n"], + [29544, 0, "a"], + [29545, 0, "r"], + [29546, 0, "y"], + [29547, 0, "I"], + [29548, 0, "n"], + [29549, 0, "f"], + [29550, 0, "C"], + [29551, 0, "{"], + [29552, 0, "$"], + [29553, 0, "\\"], + [29554, 0, "m"], + [29555, 0, "a"], + [29556, 0, "t"], + [29557, 0, "h"], + [29558, 0, "i"], + [29559, 0, "t"], + [29560, 0, "{"], + [29561, 0, "c"], + [29562, 0, "t"], + [29563, 0, "x"], + [29564, 0, "}"], + [29565, 0, ","], + [29566, 0, "\\"], + [29567, 0, ","], + [29568, 0, " "], + [29569, 0, "\\"], + [29570, 0, "m"], + [29571, 0, "a"], + [29572, 0, "t"], + [29573, 0, "h"], + [29574, 0, "s"], + [29575, 0, "f"], + [29576, 0, "{"], + [29577, 0, "o"], + [29578, 0, "p"], + [29579, 0, "}"], + [29580, 0, "\\"], + [29580, 1], + [29580, 0, "("], + [29581, 0, "\\"], + [29582, 0, "m"], + [29583, 0, "a"], + [29584, 0, "t"], + [29585, 0, "h"], + [29586, 0, "i"], + [29587, 0, "t"], + [29588, 0, "{"], + [29589, 0, "i"], + [29590, 0, "d"], + [29591, 0, "}"], + [29592, 0, ","], + [29593, 0, " "], + [29594, 0, "\\"], + [29595, 0, "m"], + [29596, 0, "a"], + [29597, 0, "t"], + [29598, 0, "h"], + [29599, 0, "i"], + [29600, 0, "t"], + [29601, 0, "{"], + [29602, 0, "d"], + [29603, 0, "e"], + [29604, 0, "p"], + [29605, 0, "s"], + [29606, 0, "}"], + [29607, 0, ","], + [29608, 0, "\n"], + [29609, 0, " "], + [29610, 0, " "], + [29611, 0, " "], + [29612, 0, " "], + [29613, 0, "\\"], + [29614, 0, "m"], + [29615, 0, "a"], + [29616, 0, "t"], + [29617, 0, "h"], + [29618, 0, "s"], + [29619, 0, "f"], + [29620, 0, "{"], + [29621, 0, "c"], + [29622, 0, "u"], + [29623, 0, "r"], + [29624, 0, "s"], + [29625, 0, "o"], + [29626, 0, "r"], + [29627, 0, "}"], + [29628, 0, "("], + [29629, 0, "\\"], + [29630, 0, "l"], + [29631, 0, "a"], + [29632, 0, "n"], + [29633, 0, "g"], + [29634, 0, "l"], + [29635, 0, "e"], + [29636, 0, "\\"], + [29637, 0, "r"], + [29638, 0, "a"], + [29639, 0, "n"], + [29640, 0, "g"], + [29641, 0, "l"], + [29642, 0, "e"], + [29643, 0, ","], + [29644, 0, "\\"], + [29645, 0, ","], + [29646, 0, " "], + [29647, 0, "k"], + [29648, 0, ")"], + [29649, 0, ","], + [29650, 0, " "], + [29651, 0, "\\"], + [29652, 0, "m"], + [29653, 0, "a"], + [29654, 0, "t"], + [29655, 0, "h"], + [29656, 0, "s"], + [29657, 0, "f"], + [29658, 0, "{"], + [29659, 0, "a"], + [29660, 0, "s"], + [29661, 0, "s"], + [29662, 0, "i"], + [29663, 0, "g"], + [29664, 0, "n"], + [29665, 0, "}"], + [29666, 0, "("], + [29667, 0, "\\"], + [29668, 0, "m"], + [29669, 0, "a"], + [29670, 0, "t"], + [29671, 0, "h"], + [29672, 0, "i"], + [29673, 0, "t"], + [29674, 0, "{"], + [29675, 0, "v"], + [29676, 0, "a"], + [29677, 0, "l"], + [29678, 0, "}"], + [29679, 0, ")"], + [29680, 0, " "], + [29681, 0, "\\"], + [29682, 0, "e"], + [29683, 0, "v"], + [29684, 0, "a"], + [29685, 0, "l"], + [29686, 0, "t"], + [29687, 0, "o"], + [29688, 0, "\n"], + [29689, 0, " "], + [29690, 0, " "], + [29691, 0, " "], + [29692, 0, " "], + [29693, 0, "\\"], + [29694, 0, "m"], + [29695, 0, "a"], + [29696, 0, "t"], + [29697, 0, "h"], + [29698, 0, "s"], + [29699, 0, "f"], + [29700, 0, "{"], + [29701, 0, "c"], + [29702, 0, "t"], + [29703, 0, "x"], + [29704, 0, "}"], + [29705, 0, "["], + [29706, 0, "\\"], + [29707, 0, ","], + [29708, 0, " "], + [29709, 0, "\\"], + [29710, 0, "m"], + [29711, 0, "a"], + [29712, 0, "t"], + [29713, 0, "h"], + [29714, 0, "s"], + [29715, 0, "f"], + [29716, 0, "{"], + [29717, 0, "r"], + [29718, 0, "e"], + [29719, 0, "g"], + [29720, 0, "T"], + [29721, 0, "}"], + [29722, 0, "("], + [29723, 0, "k"], + [29724, 0, ")"], + [29725, 0, " "], + [29726, 0, "\\"], + [29727, 0, ","], + [29728, 0, "\\"], + [29729, 0, "m"], + [29730, 0, "a"], + [29731, 0, "p"], + [29732, 0, "s"], + [29733, 0, "t"], + [29734, 0, "o"], + [29735, 0, "\\"], + [29736, 0, ","], + [29737, 0, " "], + [29738, 0, "\\"], + [29739, 0, "{"], + [29740, 0, "\\"], + [29741, 0, ","], + [29742, 0, " "], + [29743, 0, "\\"], + [29744, 0, "m"], + [29745, 0, "a"], + [29746, 0, "t"], + [29747, 0, "h"], + [29748, 0, "i"], + [29749, 0, "t"], + [29750, 0, "{"], + [29751, 0, "i"], + [29752, 0, "d"], + [29753, 0, "}"], + [29754, 0, " "], + [29755, 0, "\\"], + [29756, 0, ","], + [29757, 0, "\\"], + [29758, 0, "m"], + [29759, 0, "a"], + [29760, 0, "p"], + [29761, 0, "s"], + [29762, 0, "t"], + [29763, 0, "o"], + [29764, 0, "\\"], + [29765, 0, ","], + [29766, 0, " "], + [29767, 0, "\\"], + [29768, 0, "m"], + [29769, 0, "a"], + [29770, 0, "t"], + [29771, 0, "h"], + [29772, 0, "i"], + [29773, 0, "t"], + [29774, 0, "{"], + [29775, 0, "v"], + [29776, 0, "a"], + [29777, 0, "l"], + [29778, 0, "}"], + [29779, 0, " "], + [29780, 0, "\\"], + [29781, 0, ","], + [29782, 0, "\\"], + [29783, 0, "}"], + [29784, 0, "\\"], + [29785, 0, ","], + [29786, 0, "]"], + [29787, 0, "$"], + [29788, 0, "}"], + [29872, 1], + [29871, 1], + [29870, 1], + [29869, 1], + [29868, 1], + [29867, 1], + [29866, 1], + [29865, 1], + [29864, 1], + [29863, 1], + [29862, 1], + [29861, 1], + [29860, 1], + [29859, 1], + [29858, 1], + [29857, 1], + [29856, 1], + [29855, 1], + [29854, 1], + [29853, 1], + [29852, 1], + [29851, 1], + [29850, 1], + [29849, 1], + [29848, 1], + [29847, 1], + [29846, 1], + [29845, 1], + [29844, 1], + [29843, 1], + [29842, 1], + [29841, 1], + [29840, 1], + [29839, 1], + [29838, 1], + [29837, 1], + [29836, 1], + [29835, 1], + [29834, 1], + [29833, 1], + [29832, 1], + [29831, 1], + [29830, 1], + [29829, 1], + [29828, 1], + [29827, 1], + [29826, 1], + [29825, 1], + [29824, 1], + [29836, 1], + [29835, 1], + [29834, 1], + [29834, 0, "\\"], + [29835, 0, "m"], + [29836, 0, "a"], + [29837, 0, "t"], + [29838, 0, "h"], + [29839, 0, "i"], + [29840, 0, "t"], + [29841, 0, "{"], + [29842, 0, "c"], + [29843, 0, "t"], + [29844, 0, "x"], + [29845, 0, "}"], + [29847, 0, "\\"], + [29848, 0, "m"], + [29849, 0, "a"], + [29850, 0, "t"], + [29851, 0, "h"], + [29852, 0, "s"], + [29853, 0, "f"], + [29854, 0, "{"], + [29855, 0, "n"], + [29856, 0, "e"], + [29857, 0, "x"], + [29858, 0, "t"], + [29859, 0, "}"], + [29860, 0, "("], + [29874, 0, ")"], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29879, 1], + [29892, 1], + [30025, 1], + [30024, 1], + [30023, 1], + [30022, 1], + [30021, 1], + [30020, 1], + [30019, 1], + [30018, 1], + [30017, 1], + [30016, 1], + [30015, 1], + [30014, 1], + [30013, 1], + [30012, 1], + [30011, 1], + [30010, 1], + [30009, 1], + [30008, 1], + [30007, 1], + [30006, 1], + [30005, 1], + [30004, 1], + [30003, 1], + [30002, 1], + [30001, 1], + [30000, 1], + [29999, 1], + [29998, 1], + [29997, 1], + [29996, 1], + [29995, 1], + [29994, 1], + [29993, 1], + [29992, 1], + [29991, 1], + [29990, 1], + [29989, 1], + [29988, 1], + [29987, 1], + [29986, 1], + [29985, 1], + [29984, 1], + [29983, 1], + [29982, 1], + [29982, 0, "\\"], + [29983, 0, "m"], + [29984, 0, "a"], + [29985, 0, "t"], + [29986, 0, "h"], + [29987, 0, "i"], + [29988, 0, "t"], + [29989, 0, "{"], + [29990, 0, "c"], + [29991, 0, "t"], + [29992, 0, "x"], + [29993, 0, "}"], + [29994, 0, ","], + [29995, 0, "\\"], + [29996, 0, ","], + [29997, 0, " "], + [29998, 0, "\\"], + [29999, 0, "m"], + [30000, 0, "a"], + [30001, 0, "t"], + [30002, 0, "h"], + [30003, 0, "i"], + [30004, 0, "t"], + [30005, 0, "{"], + [30006, 0, "o"], + [30007, 0, "p"], + [30008, 0, "}"], + [30009, 0, "("], + [30010, 0, "\\"], + [30011, 0, "m"], + [30012, 0, "a"], + [30013, 0, "t"], + [30014, 0, "h"], + [30015, 0, "i"], + [30016, 0, "t"], + [30017, 0, "{"], + [30018, 0, "i"], + [30019, 0, "d"], + [30020, 0, "}"], + [30021, 0, ","], + [30022, 0, " "], + [30023, 0, "\\"], + [30024, 0, "m"], + [30025, 0, "a"], + [30026, 0, "t"], + [30027, 0, "h"], + [30028, 0, "i"], + [30029, 0, "t"], + [30030, 0, "{"], + [30031, 0, "d"], + [30032, 0, "e"], + [30033, 0, "p"], + [30034, 0, "s"], + [30035, 0, "}"], + [30036, 0, ","], + [29679, 0, ")"], + [29182, 0, ")"], + [30039, 0, "\n"], + [30040, 0, " "], + [30041, 0, " "], + [30042, 0, " "], + [30043, 0, " "], + [30044, 0, "\\"], + [30045, 0, "m"], + [30046, 0, "a"], + [30047, 0, "t"], + [30048, 0, "h"], + [30049, 0, "s"], + [30050, 0, "f"], + [30051, 0, "{"], + [30052, 0, "c"], + [30053, 0, "u"], + [30054, 0, "r"], + [30055, 0, "s"], + [30056, 0, "o"], + [30057, 0, "r"], + [30058, 0, "}"], + [30059, 0, "("], + [30060, 0, "\\"], + [30061, 0, "l"], + [30062, 0, "a"], + [30063, 0, "n"], + [30064, 0, "g"], + [30065, 0, "l"], + [30066, 0, "e"], + [30067, 0, "\\"], + [30068, 0, "r"], + [30069, 0, "a"], + [30070, 0, "n"], + [30071, 0, "g"], + [30072, 0, "l"], + [30073, 0, "e"], + [30074, 0, ","], + [30075, 0, "\\"], + [30076, 0, ","], + [30077, 0, " "], + [30078, 0, "\\"], + [30079, 0, "m"], + [30080, 0, "a"], + [30081, 0, "t"], + [30082, 0, "h"], + [30083, 0, "i"], + [30084, 0, "t"], + [30085, 0, "{"], + [30086, 0, "i"], + [30087, 0, "d"], + [30088, 0, "}"], + [30089, 0, ")"], + [30090, 0, ","], + [30091, 0, " "], + [30092, 0, "\\"], + [30093, 0, "m"], + [30094, 0, "a"], + [30095, 0, "t"], + [30096, 0, "h"], + [30097, 0, "s"], + [30098, 0, "f"], + [30099, 0, "{"], + [30100, 0, "a"], + [30101, 0, "s"], + [30102, 0, "s"], + [30103, 0, "i"], + [30104, 0, "g"], + [30105, 0, "n"], + [30106, 0, "}"], + [30107, 0, "("], + [30108, 0, "\\"], + [30109, 0, "m"], + [30110, 0, "a"], + [30111, 0, "t"], + [30112, 0, "h"], + [30113, 0, "i"], + [30114, 0, "t"], + [30115, 0, "{"], + [30116, 0, "v"], + [30117, 0, "a"], + [30118, 0, "l"], + [30119, 0, "}"], + [30120, 0, ")"], + [30121, 0, ")"], + [30122, 0, " "], + [30123, 0, "\\"], + [30124, 0, "e"], + [30125, 0, "v"], + [30126, 0, "a"], + [30127, 0, "l"], + [30128, 0, "t"], + [30129, 0, "o"], + [30130, 0, " "], + [30131, 0, "\\"], + [30132, 0, "m"], + [30133, 0, "a"], + [30134, 0, "t"], + [30135, 0, "h"], + [30136, 0, "i"], + [30137, 0, "t"], + [30138, 0, "{"], + [30139, 0, "c"], + [30140, 0, "t"], + [30141, 0, "x"], + [30142, 0, "}"], + [30143, 0, "'"], + [30176, 0, "e"], + [30177, 0, "r"], + [30178, 0, "t"], + [30172, 1], + [30171, 1], + [30170, 1], + [30169, 1], + [30168, 1], + [30167, 1], + [30180, 1], + [30180, 1], + [30180, 1], + [30180, 1], + [30180, 1], + [30180, 1], + [30180, 0, "T"], + [30181, 0, "r"], + [30182, 0, "i"], + [30195, 1], + [30194, 1], + [30193, 1], + [30193, 0, "\\"], + [30194, 0, "m"], + [30195, 0, "a"], + [30196, 0, "t"], + [30197, 0, "h"], + [30198, 0, "i"], + [30199, 0, "t"], + [30200, 0, "{"], + [30201, 0, "c"], + [30202, 0, "t"], + [30203, 0, "x"], + [30204, 0, "}"], + [30217, 1], + [30217, 1], + [30217, 1], + [30217, 1], + [30217, 1], + [30217, 1], + [30217, 1], + [30217, 0, "o"], + [30233, 0, " "], + [30234, 0, "\\"], + [30235, 0, "m"], + [30236, 0, "a"], + [30237, 0, "t"], + [30238, 0, "h"], + [30239, 0, "i"], + [30240, 0, "t"], + [30241, 0, "{"], + [30242, 0, "d"], + [30243, 0, "e"], + [30244, 0, "p"], + [30245, 0, "s"], + [30246, 0, "}"], + [30247, 0, ","], + [30248, 0, "\n"], + [30249, 0, " "], + [30250, 0, " "], + [30251, 0, " "], + [30252, 0, " "], + [30253, 0, "\\"], + [30254, 0, "m"], + [30255, 0, "a"], + [30256, 0, "t"], + [30257, 0, "h"], + [30258, 0, "s"], + [30259, 0, "f"], + [30260, 0, "{"], + [30261, 0, "c"], + [30262, 0, "u"], + [30263, 0, "r"], + [30264, 0, "s"], + [30265, 0, "o"], + [30266, 0, "r"], + [30267, 0, "}"], + [30268, 0, "("], + [30269, 0, "\\"], + [30270, 0, "l"], + [30271, 0, "a"], + [30272, 0, "n"], + [30273, 0, "g"], + [30274, 0, "l"], + [30275, 0, "e"], + [30276, 0, "\\"], + [30277, 0, "r"], + [30278, 0, "a"], + [30279, 0, "n"], + [30280, 0, "g"], + [30281, 0, "l"], + [30282, 0, "e"], + [30283, 0, ","], + [30284, 0, "\\"], + [30285, 0, ","], + [30300, 0, ")"], + [30303, 1], + [30303, 0, "\\"], + [30304, 0, "m"], + [30305, 0, "a"], + [30306, 0, "t"], + [30307, 0, "h"], + [30308, 0, "s"], + [30309, 0, "f"], + [30310, 0, "{"], + [30311, 0, "i"], + [30312, 0, "n"], + [30313, 0, "s"], + [30314, 0, "e"], + [30315, 0, "r"], + [30316, 0, "t"], + [30317, 0, "}"], + [30318, 0, "("], + [30319, 0, "\\"], + [30320, 0, "m"], + [30321, 0, "a"], + [30322, 0, "t"], + [30323, 0, "h"], + [30324, 0, "i"], + [30325, 0, "t"], + [30326, 0, "{"], + [30327, 0, "v"], + [30328, 0, "a"], + [30329, 0, "l"], + [30330, 0, "}"], + [30331, 0, ")"], + [30348, 1], + [30347, 1], + [30346, 1], + [30346, 0, "\\"], + [30347, 0, "m"], + [30348, 0, "a"], + [30349, 0, "t"], + [30350, 0, "h"], + [30351, 0, "i"], + [30352, 0, "t"], + [30353, 0, "{"], + [30354, 0, "c"], + [30355, 0, "t"], + [30356, 0, "x"], + [30357, 0, "}"], + [30362, 0, "\\"], + [30363, 0, "m"], + [30364, 0, "a"], + [30365, 0, "t"], + [30366, 0, "h"], + [30367, 0, "s"], + [30368, 0, "f"], + [30369, 0, "{"], + [30370, 0, "n"], + [30371, 0, "e"], + [30372, 0, "x"], + [30373, 0, "t"], + [30374, 0, "}"], + [30375, 0, "("], + [30389, 0, ")"], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30403, 1], + [30423, 0, "\\"], + [30424, 0, "m"], + [30425, 0, "a"], + [30426, 0, "t"], + [30427, 0, "h"], + [30428, 0, "s"], + [30429, 0, "f"], + [30430, 0, "{"], + [30431, 0, "n"], + [30432, 0, "e"], + [30433, 0, "x"], + [30434, 0, "t"], + [30435, 0, "}"], + [30436, 0, "("], + [30448, 0, ")"], + [30480, 1], + [30479, 1], + [30478, 1], + [30477, 1], + [30476, 1], + [30475, 1], + [30474, 1], + [30473, 1], + [30472, 1], + [30471, 1], + [30470, 1], + [30469, 1], + [30468, 1], + [30467, 1], + [30466, 1], + [30465, 1], + [30464, 1], + [30463, 1], + [30462, 1], + [30475, 1], + [30006, 1], + [30005, 1], + [30005, 0, "s"], + [30006, 0, "f"], + [30414, 1], + [30496, 0, "\n"], + [30497, 0, "%"], + [30498, 0, " "], + [30499, 0, "T"], + [30500, 0, "O"], + [30501, 0, "D"], + [30502, 0, "O"], + [30503, 0, " "], + [30504, 0, "n"], + [30505, 0, "e"], + [30506, 0, "e"], + [30507, 0, "d"], + [30508, 0, " "], + [30509, 0, "t"], + [30510, 0, "o"], + [30511, 0, " "], + [30512, 0, "u"], + [30513, 0, "p"], + [30514, 0, "d"], + [30515, 0, "a"], + [30516, 0, "t"], + [30517, 0, "e"], + [30518, 0, " "], + [30519, 0, "t"], + [30520, 0, "h"], + [30521, 0, "e"], + [30522, 0, " "], + [30523, 0, "n"], + [30524, 0, "e"], + [30525, 0, "x"], + [30526, 0, "t"], + [30527, 0, " "], + [30528, 0, "t"], + [30529, 0, "w"], + [30530, 0, "o"], + [30531, 0, " "], + [30532, 0, "r"], + [30533, 0, "u"], + [30534, 0, "l"], + [30535, 0, "e"], + [30536, 0, "s"], + [30537, 0, "\n"], + [30566, 1], + [30566, 1], + [30566, 1], + [30566, 0, "\\"], + [30567, 0, "m"], + [30568, 0, "a"], + [30569, 0, "t"], + [30570, 0, "h"], + [30571, 0, "i"], + [30572, 0, "t"], + [30573, 0, "{"], + [30574, 0, "c"], + [30575, 0, "t"], + [30576, 0, "x"], + [30577, 0, "}"], + [30578, 0, "("], + [30578, 1], + [30579, 0, "\\"], + [30580, 0, "m"], + [30581, 0, "a"], + [30582, 0, "t"], + [30583, 0, "h"], + [30584, 0, "s"], + [30585, 0, "f"], + [30586, 0, "{"], + [30587, 0, "n"], + [30588, 0, "e"], + [30589, 0, "x"], + [30590, 0, "t"], + [30591, 0, "}"], + [30592, 0, "("], + [30606, 0, ")"], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 1], + [30611, 0, "\\"], + [30624, 1], + [30677, 1], + [30676, 1], + [30675, 1], + [30675, 0, "c"], + [30676, 0, "t"], + [30677, 0, "x"], + [30696, 1], + [30695, 1], + [30694, 1], + [30693, 1], + [30692, 1], + [30691, 1], + [30690, 1], + [30690, 0, "o"], + [30706, 0, " "], + [30707, 0, "\\"], + [30708, 0, "m"], + [30709, 0, "a"], + [30710, 0, "t"], + [30711, 0, "h"], + [30712, 0, "i"], + [30713, 0, "t"], + [30714, 0, "{"], + [30715, 0, "d"], + [30716, 0, "e"], + [30717, 0, "p"], + [30718, 0, "s"], + [30719, 0, "}"], + [30720, 0, ","], + [30721, 0, "\n"], + [30722, 0, " "], + [30723, 0, " "], + [30724, 0, " "], + [30726, 0, "\\"], + [30727, 0, "m"], + [30728, 0, "a"], + [30729, 0, "t"], + [30730, 0, "h"], + [30731, 0, "s"], + [30732, 0, "f"], + [30733, 0, "{"], + [30734, 0, "c"], + [30735, 0, "u"], + [30736, 0, "r"], + [30737, 0, "s"], + [30738, 0, "o"], + [30739, 0, "r"], + [30740, 0, "}"], + [30741, 0, "("], + [30742, 0, "\\"], + [30743, 0, "l"], + [30744, 0, "a"], + [30745, 0, "n"], + [30746, 0, "g"], + [30747, 0, "l"], + [30748, 0, "e"], + [30749, 0, "\\"], + [30750, 0, "r"], + [30751, 0, "a"], + [30752, 0, "n"], + [30753, 0, "g"], + [30754, 0, "l"], + [30755, 0, "e"], + [30756, 0, ","], + [30757, 0, "\\"], + [30758, 0, ","], + [30759, 0, " "], + [30773, 0, ")"], + [30776, 0, "\\"], + [30777, 0, "m"], + [30778, 0, "a"], + [30779, 0, "t"], + [30780, 0, "h"], + [30781, 0, "s"], + [30782, 0, "f"], + [30783, 0, "{"], + [30784, 0, "a"], + [30785, 0, "s"], + [30786, 0, "s"], + [30787, 0, "i"], + [30788, 0, "g"], + [30789, 0, "n"], + [30790, 0, "}"], + [30791, 0, "("], + [30792, 0, "\\"], + [30793, 0, "m"], + [30794, 0, "a"], + [30795, 0, "t"], + [30796, 0, "h"], + [30797, 0, "i"], + [30798, 0, "t"], + [30799, 0, "{"], + [30801, 0, "a"], + [30802, 0, "l"], + [30803, 0, "}"], + [30804, 0, ")"], + [30815, 1], + [30815, 1], + [30815, 1], + [30815, 0, "\\"], + [30816, 0, "m"], + [30817, 0, "a"], + [30818, 0, "t"], + [30819, 0, "h"], + [30820, 0, "i"], + [30821, 0, "t"], + [30822, 0, "{"], + [30823, 0, "c"], + [30824, 0, "t"], + [30825, 0, "x"], + [30826, 0, "}"], + [30860, 0, "e"], + [30861, 0, "r"], + [30862, 0, "t"], + [30856, 1], + [30855, 1], + [30854, 1], + [30853, 1], + [30852, 1], + [30851, 1], + [30877, 1], + [30877, 1], + [30877, 1], + [30877, 0, "\\"], + [30878, 0, "m"], + [30879, 0, "a"], + [30880, 0, "t"], + [30881, 0, "h"], + [30882, 0, "i"], + [30883, 0, "t"], + [30884, 0, "{"], + [30885, 0, "c"], + [30886, 0, "t"], + [30887, 0, "x"], + [30888, 0, "}"], + [30907, 1], + [30906, 1], + [30905, 1], + [30904, 1], + [30903, 1], + [30902, 1], + [30901, 1], + [30901, 0, "o"], + [30917, 0, " "], + [30918, 0, "\\"], + [30919, 0, "m"], + [30920, 0, "a"], + [30921, 0, "t"], + [30922, 0, "h"], + [30923, 0, "i"], + [30924, 0, "t"], + [30925, 0, "{"], + [30926, 0, "d"], + [30927, 0, "e"], + [30928, 0, "p"], + [30929, 0, "s"], + [30930, 0, "}"], + [30931, 0, ","], + [30932, 0, "\n"], + [30933, 0, " "], + [30934, 0, " "], + [30935, 0, " "], + [30937, 0, "\\"], + [30938, 0, "m"], + [30939, 0, "a"], + [30940, 0, "t"], + [30941, 0, "h"], + [30942, 0, "s"], + [30943, 0, "f"], + [30944, 0, "{"], + [30945, 0, "c"], + [30946, 0, "u"], + [30947, 0, "r"], + [30948, 0, "s"], + [30949, 0, "o"], + [30950, 0, "r"], + [30951, 0, "}"], + [30952, 0, "("], + [30953, 0, "\\"], + [30954, 0, "l"], + [30955, 0, "a"], + [30956, 0, "n"], + [30957, 0, "g"], + [30958, 0, "l"], + [30959, 0, "e"], + [30960, 0, "\\"], + [30961, 0, "r"], + [30962, 0, "a"], + [30963, 0, "n"], + [30964, 0, "g"], + [30965, 0, "l"], + [30966, 0, "e"], + [30967, 0, ","], + [30968, 0, "\\"], + [30969, 0, ","], + [30970, 0, " "], + [30984, 0, ")"], + [30987, 0, "\\"], + [30988, 0, "m"], + [30989, 0, "a"], + [30990, 0, "t"], + [30991, 0, "h"], + [30992, 0, "s"], + [30993, 0, "f"], + [30994, 0, "{"], + [30995, 0, "i"], + [30996, 0, "n"], + [30997, 0, "s"], + [30998, 0, "e"], + [30999, 0, "r"], + [31000, 0, "t"], + [31001, 0, "}"], + [31002, 0, "("], + [31003, 0, "\\"], + [31004, 0, "m"], + [31005, 0, "a"], + [31006, 0, "t"], + [31007, 0, "h"], + [31008, 0, "i"], + [31009, 0, "t"], + [31010, 0, "{"], + [31012, 0, "a"], + [31013, 0, "l"], + [31014, 0, "}"], + [31015, 0, ")"], + [31016, 0, ")"], + [31017, 1], + [31026, 1], + [31026, 1], + [31026, 1], + [31026, 0, "\\"], + [31027, 0, "m"], + [31028, 0, "a"], + [31029, 0, "t"], + [31030, 0, "h"], + [31031, 0, "i"], + [31032, 0, "t"], + [31033, 0, "{"], + [31034, 0, "c"], + [31035, 0, "t"], + [31036, 0, "x"], + [31037, 0, "}"], + [30536, 1], + [30535, 1], + [30534, 1], + [30533, 1], + [30532, 1], + [30531, 1], + [30530, 1], + [30529, 1], + [30528, 1], + [30527, 1], + [30526, 1], + [30525, 1], + [30524, 1], + [30523, 1], + [30522, 1], + [30521, 1], + [30520, 1], + [30519, 1], + [30518, 1], + [30517, 1], + [30516, 1], + [30515, 1], + [30514, 1], + [30513, 1], + [30512, 1], + [30511, 1], + [30510, 1], + [30509, 1], + [30508, 1], + [30507, 1], + [30506, 1], + [30505, 1], + [30504, 1], + [30503, 1], + [30502, 1], + [30501, 1], + [30500, 1], + [30499, 1], + [30498, 1], + [30497, 1], + [30496, 1], + [30495, 1], + [31178, 1], + [31178, 1], + [31178, 1], + [31178, 1], + [31178, 1], + [31178, 0, "L"], + [31179, 0, "i"], + [31180, 0, "t"], + [31180, 1], + [31180, 0, "s"], + [31181, 0, "t"], + [31061, 1], + [31060, 1], + [31059, 1], + [31058, 1], + [31057, 1], + [31056, 1], + [31056, 0, "c"], + [31057, 0, "t"], + [31058, 0, "x"], + [31060, 1], + [31047, 1], + [31046, 1], + [31045, 1], + [31044, 1], + [31056, 0, "("], + [31057, 0, "k"], + [31058, 0, ")"], + [31058, 1], + [31057, 1], + [31056, 1], + [31044, 0, "\\"], + [31045, 0, "m"], + [31046, 0, "a"], + [31047, 0, "t"], + [31048, 0, "h"], + [31049, 0, "s"], + [31050, 0, "f"], + [31051, 0, "{"], + [31052, 0, "n"], + [31053, 0, "e"], + [31054, 0, "x"], + [31055, 0, "t"], + [31056, 0, "}"], + [31057, 0, "("], + [31058, 0, "\\"], + [31059, 0, "m"], + [31060, 0, "a"], + [31061, 0, "t"], + [31062, 0, "h"], + [31063, 0, "i"], + [31064, 0, "t"], + [31065, 0, "{"], + [31066, 0, "t"], + [31067, 0, "a"], + [31068, 0, "r"], + [31069, 0, "g"], + [31070, 0, "e"], + [31071, 0, "t"], + [31072, 0, "}"], + [31073, 0, ")"], + [31074, 0, " "], + [31074, 1], + [31074, 0, " "], + [31075, 0, "\\"], + [31076, 0, "i"], + [31077, 0, "n"], + [31078, 0, " "], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31091, 1], + [31148, 1], + [31147, 1], + [31146, 1], + [31145, 1], + [31144, 1], + [31143, 1], + [31142, 1], + [31141, 1], + [31140, 1], + [31139, 1], + [31138, 1], + [31137, 1], + [31136, 1], + [31135, 1], + [31134, 1], + [31133, 1], + [31132, 1], + [31131, 1], + [31130, 1], + [31129, 1], + [31128, 1], + [31127, 1], + [31126, 1], + [31125, 1], + [31124, 1], + [31123, 1], + [31122, 1], + [31121, 1], + [31120, 1], + [31119, 1], + [31118, 1], + [31117, 1], + [31116, 1], + [31115, 1], + [31114, 1], + [31113, 1], + [31112, 1], + [31111, 1], + [31110, 1], + [31109, 1], + [31108, 1], + [31107, 1], + [31106, 1], + [31105, 1], + [31104, 1], + [31103, 1], + [31102, 1], + [31101, 1], + [31100, 1], + [31099, 1], + [31098, 1], + [31097, 1], + [31096, 1], + [31095, 1], + [31094, 1], + [31093, 1], + [31139, 1], + [31138, 1], + [31137, 1], + [31137, 0, "\\"], + [31138, 0, "m"], + [31139, 0, "a"], + [31140, 0, "t"], + [31141, 0, "h"], + [31142, 0, "i"], + [31143, 0, "t"], + [31144, 0, "{"], + [31145, 0, "c"], + [31146, 0, "t"], + [31147, 0, "x"], + [31148, 0, "}"], + [31168, 1], + [31167, 1], + [31166, 1], + [31165, 1], + [31164, 1], + [31163, 1], + [31162, 1], + [31161, 1], + [31161, 0, "o"], + [31162, 0, "p"], + [31178, 0, "\\"], + [31179, 0, "m"], + [31180, 0, "a"], + [31181, 0, "t"], + [31182, 0, "h"], + [31183, 0, "i"], + [31184, 0, "t"], + [31185, 0, "{"], + [31186, 0, "d"], + [31187, 0, "e"], + [31188, 0, "p"], + [31189, 0, "s"], + [31190, 0, "}"], + [31191, 0, ","], + [31192, 0, "\n"], + [31193, 0, " "], + [31194, 0, " "], + [31195, 0, " "], + [31196, 0, " "], + [31197, 0, "\\"], + [31198, 0, "m"], + [31199, 0, "a"], + [31200, 0, "t"], + [31201, 0, "h"], + [31202, 0, "s"], + [31203, 0, "f"], + [31204, 0, "{"], + [31205, 0, "c"], + [31206, 0, "u"], + [31207, 0, "r"], + [31208, 0, "s"], + [31209, 0, "o"], + [31210, 0, "r"], + [31211, 0, "}"], + [31212, 0, "("], + [31213, 0, "\\"], + [31214, 0, "l"], + [31215, 0, "a"], + [31216, 0, "n"], + [31217, 0, "g"], + [31218, 0, "l"], + [31219, 0, "e"], + [31220, 0, "\\"], + [31221, 0, "r"], + [31222, 0, "a"], + [31223, 0, "n"], + [31224, 0, "g"], + [31225, 0, "l"], + [31226, 0, "e"], + [31227, 0, ","], + [31228, 0, "\\"], + [31229, 0, ","], + [31230, 0, " "], + [31247, 0, ","], + [31248, 0, " "], + [31249, 0, "\\"], + [31250, 0, "m"], + [31251, 0, "a"], + [31252, 0, "t"], + [31253, 0, "h"], + [31254, 0, "s"], + [31255, 0, "f"], + [31256, 0, "{"], + [31257, 0, "l"], + [31258, 0, "i"], + [31259, 0, "s"], + [31260, 0, "t"], + [31261, 0, "D"], + [31262, 0, "e"], + [31263, 0, "l"], + [31264, 0, "}"], + [31265, 0, ")"], + [31282, 1], + [31281, 1], + [31280, 1], + [31279, 1], + [31279, 0, "\\"], + [31280, 0, "m"], + [31281, 0, "a"], + [31282, 0, "t"], + [31283, 0, "h"], + [31284, 0, "i"], + [31285, 0, "t"], + [31286, 0, "{"], + [31287, 0, "c"], + [31288, 0, "t"], + [31289, 0, "x"], + [31290, 0, "}"], + [31294, 0, "\\"], + [31295, 0, "m"], + [31296, 0, "a"], + [31297, 0, "t"], + [31298, 0, "h"], + [31299, 0, "s"], + [31300, 0, "f"], + [31301, 0, "{"], + [31302, 0, "d"], + [31303, 0, "e"], + [31304, 0, "l"], + [31305, 0, "e"], + [31306, 0, "t"], + [31307, 0, "e"], + [31308, 0, "d"], + [31309, 0, "}"], + [31310, 0, "("], + [31326, 0, ")"], + [31348, 1], + [31348, 1], + [31348, 1], + [31348, 1], + [31348, 1], + [31348, 1], + [31348, 0, "t"], + [31349, 0, "r"], + [31350, 0, "u"], + [31351, 0, "e"], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31353, 1], + [31125, 1], + [31125, 1], + [31125, 0, "U"], + [31079, 0, "\\"], + [31080, 0, "m"], + [31081, 0, "a"], + [31082, 0, "t"], + [31083, 0, "h"], + [31084, 0, "r"], + [31085, 0, "m"], + [31086, 0, "{"], + [31087, 0, "d"], + [31088, 0, "o"], + [31089, 0, "m"], + [31090, 0, "}"], + [31091, 0, "("], + [31104, 0, ")"], + [31501, 0, "T"], + [31502, 0, "O"], + [31503, 0, "D"], + [31504, 0, "O"], + [31505, 0, " "], + [31506, 0, "k"], + [31507, 0, "n"], + [31508, 0, "o"], + [31509, 0, "w"], + [31510, 0, "n"], + [31511, 0, " "], + [31512, 0, "p"], + [31513, 0, "r"], + [31514, 0, "o"], + [31515, 0, "b"], + [31516, 0, "l"], + [31517, 0, "e"], + [31518, 0, "m"], + [31519, 0, "s"], + [31520, 0, ":"], + [31521, 0, "\n"], + [31522, 0, "\n"], + [31523, 0, "\\"], + [31524, 0, "b"], + [31525, 0, "e"], + [31526, 0, "g"], + [31527, 0, "i"], + [31528, 0, "n"], + [31529, 0, "{"], + [31530, 0, "e"], + [31531, 0, "n"], + [31532, 0, "u"], + [31533, 0, "m"], + [31534, 0, "e"], + [31535, 0, "r"], + [31536, 0, "a"], + [31537, 0, "t"], + [31538, 0, "e"], + [31539, 0, "}"], + [31540, 0, "\n"], + [31541, 0, "\\"], + [31542, 0, "e"], + [31543, 0, "n"], + [31544, 0, "d"], + [31545, 0, "{"], + [31546, 0, "e"], + [31547, 0, "n"], + [31548, 0, "u"], + [31549, 0, "m"], + [31550, 0, "e"], + [31551, 0, "r"], + [31552, 0, "a"], + [31553, 0, "t"], + [31554, 0, "e"], + [31555, 0, "}"], + [31540, 0, "\n"], + [31541, 0, "\\"], + [31542, 0, "i"], + [31543, 0, "t"], + [31544, 0, "e"], + [31545, 0, "m"], + [31546, 0, " "], + [31547, 0, "A"], + [31548, 0, "s"], + [31549, 0, "s"], + [31550, 0, "i"], + [31551, 0, "g"], + [31552, 0, "n"], + [31553, 0, "m"], + [31554, 0, "e"], + [31555, 0, "n"], + [31556, 0, "t"], + [31557, 0, " "], + [31558, 0, "o"], + [31559, 0, "f"], + [31560, 0, " "], + [31561, 0, "e"], + [31562, 0, "m"], + [31563, 0, "p"], + [31564, 0, "t"], + [31565, 0, "y"], + [31566, 0, " "], + [31567, 0, "l"], + [31568, 0, "i"], + [31569, 0, "s"], + [31570, 0, "t"], + [31571, 0, " "], + [31572, 0, "a"], + [31573, 0, "n"], + [31574, 0, "d"], + [31575, 0, " "], + [31576, 0, "e"], + [31577, 0, "m"], + [31578, 0, "p"], + [31579, 0, "t"], + [31580, 0, "y"], + [31581, 0, " "], + [31582, 0, "a"], + [31583, 0, "r"], + [31584, 0, "r"], + [31585, 0, "a"], + [31586, 0, "y"], + [31587, 0, " "], + [31588, 0, "i"], + [31589, 0, "s"], + [31590, 0, " "], + [31591, 0, "n"], + [31592, 0, "o"], + [31593, 0, "t"], + [31594, 0, " "], + [31595, 0, "d"], + [31596, 0, "e"], + [31597, 0, "f"], + [31598, 0, "i"], + [31599, 0, "n"], + [31600, 0, "e"], + [31601, 0, "d"], + [31602, 0, " "], + [31603, 0, "("], + [31604, 0, "n"], + [31605, 0, "e"], + [31606, 0, "e"], + [31607, 0, "d"], + [31608, 0, " "], + [31609, 0, "t"], + [31610, 0, "o"], + [31611, 0, " "], + [31612, 0, "r"], + [31613, 0, "e"], + [31614, 0, "s"], + [31615, 0, "e"], + [31616, 0, "t"], + [31617, 0, " "], + [31618, 0, "v"], + [31619, 0, "a"], + [31620, 0, "l"], + [31621, 0, "u"], + [31622, 0, "e"], + [31623, 0, " "], + [31624, 0, "b"], + [31625, 0, "u"], + [31626, 0, "t"], + [31627, 0, " "], + [31628, 0, "p"], + [31629, 0, "r"], + [31630, 0, "e"], + [31631, 0, "s"], + [31632, 0, "e"], + [31633, 0, "r"], + [31634, 0, "v"], + [31635, 0, "e"], + [31636, 0, " "], + [31637, 0, "i"], + [31638, 0, "t"], + [31639, 0, "s"], + [31640, 0, " "], + [31641, 0, "e"], + [31642, 0, "x"], + [31643, 0, "i"], + [31644, 0, "s"], + [31645, 0, "t"], + [31646, 0, "e"], + [31647, 0, "n"], + [31648, 0, "c"], + [31649, 0, "e"], + [31650, 0, ")"], + [31650, 0, "/"], + [31651, 0, "d"], + [31652, 0, "a"], + [31653, 0, "t"], + [31654, 0, "a"], + [31655, 0, "t"], + [31656, 0, "y"], + [31657, 0, "p"], + [31658, 0, "e"], + [31540, 0, "\n"], + [31541, 0, "\\"], + [31542, 0, "i"], + [31543, 0, "t"], + [31544, 0, "e"], + [31545, 0, "m"], + [31546, 0, " "], + [31547, 0, "D"], + [31548, 0, "e"], + [31549, 0, "l"], + [31550, 0, "e"], + [31551, 0, "t"], + [31552, 0, "i"], + [31553, 0, "n"], + [31554, 0, "g"], + [31555, 0, " "], + [31556, 0, "e"], + [31557, 0, "l"], + [31558, 0, "e"], + [31559, 0, "m"], + [31560, 0, "e"], + [31561, 0, "n"], + [31562, 0, "t"], + [31563, 0, " "], + [31564, 0, "f"], + [31565, 0, "r"], + [31566, 0, "o"], + [31567, 0, "m"], + [31568, 0, " "], + [31569, 0, "m"], + [31570, 0, "a"], + [31571, 0, "p"], + [31692, 0, "\n"], + [31693, 0, "\\"], + [31694, 0, "i"], + [31695, 0, "t"], + [31696, 0, "e"], + [31697, 0, "m"], + [31698, 0, " "], + [31699, 0, "\\"], + [31700, 0, "t"], + [31701, 0, "e"], + [31702, 0, "x"], + [31703, 0, "t"], + [31704, 0, "s"], + [31705, 0, "f"], + [31706, 0, "{"], + [31707, 0, "."], + [31708, 0, "n"], + [31709, 0, "e"], + [31710, 0, "x"], + [31711, 0, "t"], + [31712, 0, "}"], + [31713, 0, " "], + [31714, 0, "s"], + [31715, 0, "h"], + [31716, 0, "o"], + [31717, 0, "u"], + [31718, 0, "l"], + [31719, 0, "d"], + [31720, 0, " "], + [31721, 0, "s"], + [31722, 0, "k"], + [31723, 0, "i"], + [31724, 0, "p"], + [31725, 0, " "], + [31726, 0, "o"], + [31727, 0, "v"], + [31728, 0, "e"], + [31729, 0, "r"], + [31730, 0, " "], + [31731, 0, "t"], + [31732, 0, "o"], + [31733, 0, "m"], + [31734, 0, "b"], + [31735, 0, "s"], + [31736, 0, "t"], + [31737, 0, "o"], + [31738, 0, "n"], + [31739, 0, "e"], + [31740, 0, "s"], + [31682, 1], + [31682, 0, " "], + [31683, 0, "a"], + [31684, 0, "n"], + [31685, 0, "d"], + [31686, 0, " "], + [31655, 0, ","], + [31571, 1], + [31570, 1], + [31569, 1], + [31568, 1], + [31567, 1], + [31566, 1], + [31565, 1], + [31564, 1], + [31563, 1], + [31562, 1], + [31561, 1], + [31560, 1], + [31559, 1], + [31558, 1], + [31557, 1], + [31556, 1], + [31555, 1], + [31554, 1], + [31553, 1], + [31552, 1], + [31551, 1], + [31550, 1], + [31549, 1], + [31548, 1], + [31548, 0, "i"], + [31549, 0, "s"], + [31550, 0, "t"], + [31551, 0, "i"], + [31552, 0, "n"], + [31553, 0, "c"], + [31554, 0, "t"], + [31555, 0, "i"], + [31556, 0, "o"], + [31557, 0, "n"], + [31558, 0, " "], + [31559, 0, "b"], + [31560, 0, "e"], + [31561, 0, "t"], + [31562, 0, "w"], + [31563, 0, "e"], + [31564, 0, "e"], + [31565, 0, "n"], + [31566, 0, " "], + [31567, 0, "\\"], + [31568, 0, "t"], + [31569, 0, "e"], + [31570, 0, "x"], + [31571, 0, "t"], + [31572, 0, "s"], + [31573, 0, "f"], + [31574, 0, "{"], + [31575, 0, "l"], + [31576, 0, "i"], + [31577, 0, "s"], + [31578, 0, "t"], + [31579, 0, "D"], + [31580, 0, "e"], + [31581, 0, "l"], + [31582, 0, "}"], + [31583, 0, " "], + [31584, 0, "a"], + [31585, 0, "n"], + [31586, 0, "d"], + [31587, 0, " "], + [31588, 0, "\\"], + [31589, 0, "t"], + [31590, 0, "e"], + [31591, 0, "x"], + [31592, 0, "t"], + [31593, 0, "s"], + [31594, 0, "f"], + [31595, 0, "{"], + [31596, 0, "m"], + [31597, 0, "a"], + [31598, 0, "p"], + [31599, 0, "D"], + [31600, 0, "e"], + [31601, 0, "l"], + [31602, 0, "}"], + [31728, 0, " "], + [31729, 0, "-"], + [31730, 0, "-"], + [31731, 0, " "], + [31732, 0, "a"], + [31733, 0, "l"], + [31734, 0, "s"], + [31735, 0, "o"], + [31736, 0, " "], + [31737, 0, "n"], + [31738, 0, "e"], + [31739, 0, "e"], + [31740, 0, "d"], + [31741, 0, "e"], + [31742, 0, "d"], + [31743, 0, " "], + [31744, 0, "f"], + [31745, 0, "o"], + [31746, 0, "r"], + [31747, 0, " "], + [31748, 0, "c"], + [31749, 0, "r"], + [31750, 0, "e"], + [31751, 0, "a"], + [31752, 0, "t"], + [31753, 0, "i"], + [31754, 0, "n"], + [31755, 0, "g"], + [31756, 0, " "], + [31757, 0, "n"], + [31758, 0, "e"], + [31759, 0, "s"], + [31760, 0, "t"], + [31761, 0, "e"], + [31762, 0, "d"], + [31763, 0, " "], + [31764, 0, "l"], + [31765, 0, "i"], + [31766, 0, "s"], + [31767, 0, "t"], + [31768, 0, "s"], + [31769, 0, " "], + [31770, 0, "9"], + [31771, 0, "2"], + [31771, 1], + [31770, 1], + [31770, 0, "("], + [31771, 0, "2"], + [31772, 0, "D"], + [31773, 0, " "], + [31774, 0, "a"], + [31775, 0, "r"], + [31776, 0, "r"], + [31777, 0, "a"], + [31778, 0, "y"], + [31779, 0, "s"], + [31780, 0, ")"], + [31830, 0, "\n"], + [31831, 0, "\\"], + [31832, 0, "i"], + [31833, 0, "t"], + [31834, 0, "e"], + [31835, 0, "m"], + [31836, 0, " "], + [31837, 0, "A"], + [31838, 0, "s"], + [31839, 0, "s"], + [31840, 0, "i"], + [31841, 0, "g"], + [31842, 0, "n"], + [31843, 0, "m"], + [31844, 0, "e"], + [31845, 0, "n"], + [31846, 0, "t"], + [31847, 0, " "], + [31837, 1], + [31837, 0, "R"], + [31838, 0, "e"], + [31839, 0, "g"], + [31840, 0, "i"], + [31841, 0, "s"], + [31842, 0, "t"], + [31843, 0, "e"], + [31844, 0, "r"], + [31845, 0, " "], + [31846, 0, "a"], + [31856, 1], + [31856, 0, ":"], + [31857, 0, " "], + [31858, 0, "s"], + [31859, 0, "e"], + [31860, 0, "t"], + [31861, 0, " "], + [31862, 0, "o"], + [31863, 0, "f"], + [31864, 0, " "], + [31865, 0, "c"], + [31866, 0, "o"], + [31867, 0, "n"], + [31868, 0, "c"], + [31869, 0, "u"], + [31870, 0, "r"], + [31871, 0, "r"], + [31872, 0, "e"], + [31873, 0, "n"], + [31874, 0, "t"], + [31875, 0, " "], + [31876, 0, "v"], + [31877, 0, "a"], + [31878, 0, "l"], + [31879, 0, "u"], + [31880, 0, "e"], + [31881, 0, "s"], + [31882, 0, " "], + [31883, 0, "s"], + [31884, 0, "h"], + [31885, 0, "o"], + [31886, 0, "u"], + [31887, 0, "l"], + [31888, 0, "d"], + [31889, 0, " "], + [31890, 0, "d"], + [31891, 0, "e"], + [31892, 0, "f"], + [31893, 0, "a"], + [31894, 0, "u"], + [31895, 0, "l"], + [31896, 0, "t"], + [31897, 0, " "], + [31898, 0, "t"], + [31899, 0, "o"], + [31900, 0, " "], + [31901, 0, "e"], + [31902, 0, "m"], + [31903, 0, "p"], + [31904, 0, "t"], + [31905, 0, "y"], + [31906, 0, " "], + [31907, 0, "s"], + [31908, 0, "e"], + [31909, 0, "t"], + [31910, 0, " "], + [31911, 0, "i"], + [31912, 0, "f"], + [31913, 0, " "], + [31914, 0, "r"], + [31915, 0, "e"], + [31916, 0, "g"], + [31917, 0, "i"], + [31918, 0, "s"], + [31919, 0, "t"], + [31920, 0, "e"], + [31921, 0, "r"], + [31922, 0, " "], + [31923, 0, "i"], + [31924, 0, "s"], + [31925, 0, " "], + [31926, 0, "n"], + [31927, 0, "o"], + [31928, 0, "d"], + [31928, 1], + [31928, 0, "t"], + [31929, 0, " "], + [31930, 0, "d"], + [31931, 0, "e"], + [31932, 0, "f"], + [31933, 0, "i"], + [31934, 0, "n"], + [31935, 0, "e"], + [31936, 0, "d"], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31831, 1], + [31387, 0, "\n"], + [31388, 0, "\n"], + [31389, 0, "\\"], + [31390, 0, "b"], + [31391, 0, "e"], + [31392, 0, "g"], + [31393, 0, "i"], + [31394, 0, "n"], + [31395, 0, "{"], + [31396, 0, "p"], + [31397, 0, "r"], + [31398, 0, "o"], + [31399, 0, "o"], + [31400, 0, "f"], + [31401, 0, "t"], + [31402, 0, "r"], + [31403, 0, "e"], + [31404, 0, "e"], + [31405, 0, "}"], + [31406, 0, "\n"], + [31407, 0, "\\"], + [31408, 0, "A"], + [31409, 0, "x"], + [31410, 0, "i"], + [31411, 0, "o"], + [31412, 0, "m"], + [31413, 0, "C"], + [31414, 0, "{"], + [31415, 0, "$"], + [31416, 0, "\\"], + [31417, 0, "m"], + [31418, 0, "a"], + [31419, 0, "t"], + [31420, 0, "h"], + [31421, 0, "s"], + [31422, 0, "f"], + [31423, 0, "+"], + [31423, 1], + [31423, 0, "{"], + [31424, 0, "r"], + [31425, 0, "e"], + [31426, 0, "g"], + [31427, 0, "T"], + [31428, 0, "}"], + [31429, 0, "("], + [31430, 0, "k"], + [31431, 0, ")"], + [31432, 0, " "], + [31433, 0, "\\"], + [31434, 0, "i"], + [31435, 0, "n"], + [31436, 0, " "], + [31437, 0, "\\"], + [31438, 0, "m"], + [31439, 0, "a"], + [31440, 0, "t"], + [31441, 0, "h"], + [31442, 0, "r"], + [31443, 0, "m"], + [31444, 0, " "], + [31444, 1], + [31444, 0, "{"], + [31445, 0, "d"], + [31446, 0, "o"], + [31447, 0, "m"], + [31448, 0, "}"], + [31449, 0, "("], + [31450, 0, "\\"], + [31451, 0, "m"], + [31452, 0, "a"], + [31453, 0, "t"], + [31454, 0, "h"], + [31455, 0, "i"], + [31456, 0, "t"], + [31457, 0, "{"], + [31458, 0, "c"], + [31459, 0, "t"], + [31460, 0, "x"], + [31461, 0, "}"], + [31462, 0, ")"], + [31463, 0, "$"], + [31464, 0, "}"], + [31465, 0, "\n"], + [31466, 0, "\\"], + [31467, 0, "e"], + [31468, 0, "n"], + [31469, 0, "d"], + [31470, 0, "{"], + [31471, 0, "p"], + [31472, 0, "r"], + [31473, 0, "o"], + [31474, 0, "o"], + [31475, 0, "f"], + [31476, 0, "t"], + [31477, 0, "r"], + [31478, 0, "e"], + [31479, 0, "e"], + [31480, 0, "}"], + [31465, 0, "\n"], + [31466, 0, "\\"], + [31467, 0, "A"], + [31468, 0, "x"], + [31469, 0, "i"], + [31470, 0, "o"], + [31471, 0, "m"], + [31472, 0, "C"], + [31473, 0, "{"], + [31474, 0, "$"], + [31475, 0, "\\"], + [31476, 0, "m"], + [31477, 0, "a"], + [31478, 0, "t"], + [31479, 0, "h"], + [31480, 0, "i"], + [31481, 0, "t"], + [31482, 0, "{"], + [31483, 0, "c"], + [31484, 0, "o"], + [31485, 0, "n"], + [31486, 0, "c"], + [31487, 0, "u"], + [31488, 0, "r"], + [31489, 0, "r"], + [31490, 0, "e"], + [31491, 0, "n"], + [31492, 0, "t"], + [31493, 0, "}"], + [31494, 0, " "], + [31495, 0, "="], + [31496, 0, " "], + [31497, 0, "\\"], + [31498, 0, "{"], + [31499, 0, " "], + [31500, 0, "\\"], + [31501, 0, "m"], + [31502, 0, "a"], + [31503, 0, "t"], + [31504, 0, "h"], + [31505, 0, "i"], + [31506, 0, "t"], + [31507, 0, "{"], + [31508, 0, "i"], + [31509, 0, "d"], + [31510, 0, "}"], + [31511, 0, "i"], + [31512, 0, " "], + [31513, 0, "\\"], + [31514, 0, "m"], + [31515, 0, "a"], + [31516, 0, "p"], + [31517, 0, "s"], + [31518, 0, "o"], + [31519, 0, "t"], + [31519, 1], + [31518, 1], + [31518, 0, "t"], + [31519, 0, "o"], + [31520, 0, " "], + [31521, 0, "v"], + [31522, 0, "_"], + [31523, 0, "i"], + [31524, 0, " "], + [31525, 0, "\\"], + [31526, 0, "m"], + [31527, 0, "i"], + [31528, 0, "d"], + [31529, 0, "\n"], + [31530, 0, " "], + [31531, 0, " "], + [31532, 0, " "], + [31533, 0, " "], + [31534, 0, "("], + [31535, 0, "\\"], + [31536, 0, "m"], + [31537, 0, "a"], + [31538, 0, "t"], + [31539, 0, "h"], + [31540, 0, "i"], + [31541, 0, "t"], + [31542, 0, "{"], + [31543, 0, "i"], + [31544, 0, "d"], + [31545, 0, "}"], + [31546, 0, "_"], + [31547, 0, "i"], + [31548, 0, " "], + [31549, 0, "\\"], + [31550, 0, "m"], + [31551, 0, "a"], + [31552, 0, "p"], + [31553, 0, "s"], + [31554, 0, "t"], + [31555, 0, "o"], + [31556, 0, " "], + [31557, 0, "v"], + [31558, 0, "_"], + [31559, 0, "i"], + [31560, 0, ")"], + [31561, 0, " "], + [31562, 0, "\\"], + [31563, 0, "i"], + [31564, 0, "n"], + [31565, 0, " "], + [31566, 0, "\\"], + [31567, 0, "m"], + [31568, 0, "a"], + [31569, 0, "t"], + [31570, 0, "h"], + [31571, 0, "i"], + [31572, 0, "t"], + [31573, 0, "{"], + [31574, 0, "c"], + [31575, 0, "t"], + [31576, 0, "x"], + [31577, 0, "}"], + [31578, 0, "("], + [31579, 0, "\\"], + [31580, 0, "m"], + [31581, 0, "a"], + [31582, 0, "t"], + [31583, 0, "h"], + [31584, 0, "s"], + [31585, 0, "f"], + [31586, 0, "{"], + [31587, 0, "r"], + [31588, 0, "e"], + [31589, 0, "g"], + [31590, 0, "T"], + [31591, 0, "}"], + [31592, 0, "("], + [31593, 0, "k"], + [31594, 0, ")"], + [31595, 0, ")"], + [31596, 0, " "], + [31597, 0, "\\"], + [31597, 1], + [31596, 1], + [31596, 0, "\n"], + [31597, 0, " "], + [31598, 0, " "], + [31599, 0, " "], + [31600, 0, " "], + [31601, 0, "\\"], + [31602, 0, ","], + [31603, 0, "\\"], + [31604, 0, "w"], + [31605, 0, "e"], + [31606, 0, "d"], + [31607, 0, "g"], + [31608, 0, "e"], + [31609, 0, "\\"], + [31610, 0, ","], + [31611, 0, " "], + [31612, 0, "\\"], + [31613, 0, "m"], + [31614, 0, "a"], + [31615, 0, "t"], + [31616, 0, "h"], + [31617, 0, "i"], + [31618, 0, "t"], + [31619, 0, "{"], + [31620, 0, "i"], + [31621, 0, "d"], + [31622, 0, "}"], + [31623, 0, "_"], + [31624, 0, "i"], + [31625, 0, " "], + [31626, 0, "\\"], + [31627, 0, "n"], + [31628, 0, "o"], + [31629, 0, "t"], + [31630, 0, "i"], + [31631, 0, "n"], + [31632, 0, " "], + [31633, 0, "\\"], + [31634, 0, "m"], + [31635, 0, "a"], + [31636, 0, "t"], + [31637, 0, "h"], + [31638, 0, "i"], + [31639, 0, "t"], + [31640, 0, "{"], + [31641, 0, "d"], + [31642, 0, "e"], + [31643, 0, "p"], + [31644, 0, "s"], + [31645, 0, "}"], + [31646, 0, " "], + [31647, 0, "\\"], + [31648, 0, "}"], + [31649, 0, "$"], + [31650, 0, "}"], + [31651, 0, "\n"], + [31652, 0, "\\"], + [31653, 0, "L"], + [31654, 0, "e"], + [31655, 0, "f"], + [31656, 0, "t"], + [31657, 0, "L"], + [31658, 0, "a"], + [31659, 0, "b"], + [31660, 0, "e"], + [31661, 0, "l"], + [31662, 0, "{"], + [31663, 0, "\\"], + [31664, 0, "t"], + [31665, 0, "e"], + [31666, 0, "x"], + [31667, 0, "t"], + [31668, 0, "s"], + [31669, 0, "c"], + [31670, 0, "{"], + [31671, 0, "C"], + [31672, 0, "l"], + [31673, 0, "e"], + [31674, 0, "a"], + [31675, 0, "r"], + [31676, 0, "-"], + [31677, 0, "R"], + [31678, 0, "e"], + [31679, 0, "g"], + [31680, 0, "}"], + [31681, 0, "}"], + [31682, 0, "\n"], + [31683, 0, "\\"], + [31684, 0, "B"], + [31685, 0, "i"], + [31686, 0, "n"], + [31687, 0, "a"], + [31688, 0, "r"], + [31689, 0, "y"], + [31690, 0, "I"], + [31691, 0, "n"], + [31692, 0, "f"], + [31693, 0, "C"], + [31694, 0, "{"], + [31695, 0, "$"], + [31696, 0, "$"], + [31697, 0, "}"], + [31696, 0, "\\"], + [31697, 0, "m"], + [31698, 0, "a"], + [31699, 0, "t"], + [31700, 0, "h"], + [31701, 0, "i"], + [31702, 0, "t"], + [31703, 0, "{"], + [31704, 0, "c"], + [31705, 0, "t"], + [31706, 0, "x"], + [31707, 0, "}"], + [31708, 0, ","], + [31709, 0, "\\"], + [31710, 0, ","], + [31711, 0, " "], + [31712, 0, "\\"], + [31713, 0, "m"], + [31714, 0, "a"], + [31715, 0, "t"], + [31716, 0, "h"], + [31717, 0, "s"], + [31718, 0, "f"], + [31719, 0, "{"], + [31720, 0, "o"], + [31721, 0, "p"], + [31722, 0, "}"], + [31723, 0, "("], + [31724, 0, "\\"], + [31725, 0, "m"], + [31726, 0, "a"], + [31727, 0, "t"], + [31728, 0, "h"], + [31729, 0, "i"], + [31730, 0, "t"], + [31731, 0, "{"], + [31732, 0, "i"], + [31733, 0, "d"], + [31734, 0, "}"], + [31735, 0, ","], + [31736, 0, " "], + [31737, 0, "\\"], + [31738, 0, "m"], + [31739, 0, "a"], + [31740, 0, "t"], + [31741, 0, "h"], + [31742, 0, "i"], + [31743, 0, "t"], + [31744, 0, "{"], + [31745, 0, "d"], + [31746, 0, "e"], + [31747, 0, "p"], + [31748, 0, "s"], + [31749, 0, "}"], + [31750, 0, ","], + [31751, 0, "\n"], + [31752, 0, " "], + [31753, 0, " "], + [31754, 0, " "], + [31755, 0, " "], + [31756, 0, "\\"], + [31757, 0, "m"], + [31758, 0, "a"], + [31759, 0, "t"], + [31760, 0, "h"], + [31761, 0, "s"], + [31762, 0, "f"], + [31763, 0, "{"], + [31764, 0, "c"], + [31765, 0, "u"], + [31766, 0, "r"], + [31767, 0, "s"], + [31768, 0, "o"], + [31769, 0, "r"], + [31770, 0, "}"], + [31771, 0, "("], + [31772, 0, "\\"], + [31773, 0, "l"], + [31774, 0, "a"], + [31775, 0, "n"], + [31776, 0, "g"], + [31777, 0, "l"], + [31778, 0, "e"], + [31779, 0, "\\"], + [31780, 0, "r"], + [31781, 0, "a"], + [31782, 0, "n"], + [31783, 0, "g"], + [31784, 0, "l"], + [31785, 0, "e"], + [31786, 0, ","], + [31787, 0, "\\"], + [31788, 0, ","], + [31789, 0, " "], + [31790, 0, "k"], + [31791, 0, ")"], + [31792, 0, ","], + [31793, 0, " "], + [31794, 0, "\\"], + [31795, 0, "m"], + [31796, 0, "a"], + [31797, 0, "t"], + [31798, 0, "h"], + [31799, 0, "s"], + [31800, 0, "f"], + [31801, 0, "{"], + [31802, 0, "c"], + [31803, 0, "l"], + [31804, 0, "e"], + [31805, 0, "a"], + [31806, 0, "r"], + [31807, 0, "R"], + [31808, 0, "e"], + [31809, 0, "g"], + [31810, 0, ")"], + [31810, 1], + [31810, 0, "}"], + [31811, 0, ")"], + [31812, 0, " "], + [31813, 0, "\\"], + [31814, 0, "e"], + [31815, 0, "v"], + [31816, 0, "a"], + [31817, 0, "l"], + [31818, 0, "t"], + [31819, 0, "o"], + [31820, 0, "\n"], + [31821, 0, " "], + [31822, 0, " "], + [31823, 0, " "], + [31824, 0, " "], + [31825, 0, "\\"], + [31826, 0, "m"], + [31827, 0, "a"], + [31828, 0, "t"], + [31829, 0, "h"], + [31830, 0, "s"], + [31831, 0, "f"], + [31831, 1], + [31830, 1], + [31830, 0, "i"], + [31831, 0, "t"], + [31832, 0, "{"], + [31833, 0, "c"], + [31834, 0, "t"], + [31835, 0, "x"], + [31836, 0, "}"], + [31837, 0, "["], + [29701, 1], + [29700, 1], + [29700, 0, "i"], + [29701, 0, "t"], + [29202, 1], + [29201, 1], + [29201, 0, "i"], + [29202, 0, "t"], + [31838, 0, "\\"], + [31839, 0, ","], + [31840, 0, "\\"], + [31841, 0, "m"], + [31842, 0, "a"], + [31843, 0, "t"], + [31844, 0, "h"], + [31845, 0, "s"], + [31846, 0, "f"], + [31847, 0, "{"], + [31848, 0, "r"], + [31849, 0, "e"], + [31850, 0, "g"], + [31851, 0, "T"], + [31852, 0, "}"], + [31853, 0, "("], + [31854, 0, "k"], + [31855, 0, ")"], + [31856, 0, " "], + [31857, 0, "\\"], + [31858, 0, ","], + [31859, 0, "\\"], + [31860, 0, "m"], + [31861, 0, "a"], + [31862, 0, "p"], + [31863, 0, "s"], + [31864, 0, "t"], + [31865, 0, "o"], + [31866, 0, " "], + [31866, 1], + [31866, 0, "\\"], + [31867, 0, ","], + [31868, 0, " "], + [31869, 0, "\\"], + [31870, 0, "m"], + [31871, 0, "a"], + [31872, 0, "t"], + [31873, 0, "h"], + [31874, 0, "i"], + [31875, 0, "t"], + [31876, 0, "{"], + [31877, 0, "c"], + [31878, 0, "o"], + [31879, 0, "n"], + [31880, 0, "c"], + [31881, 0, "u"], + [31882, 0, "r"], + [31883, 0, "r"], + [31884, 0, "e"], + [31885, 0, "n"], + [31886, 0, "t"], + [31887, 0, "}"], + [31888, 0, " "], + [31889, 0, "\\"], + [31890, 0, ","], + [31891, 0, "]"], + [31840, 0, " "], + [31511, 0, "_"], + [31912, 0, "\n"], + [31913, 0, "\n"], + [31914, 0, "\\"], + [31915, 0, "b"], + [31916, 0, "e"], + [31917, 0, "g"], + [31918, 0, "i"], + [31919, 0, "n"], + [31920, 0, "{"], + [31921, 0, "p"], + [31922, 0, "r"], + [31923, 0, "o"], + [31924, 0, "o"], + [31925, 0, "f"], + [31926, 0, "t"], + [31927, 0, "r"], + [31928, 0, "e"], + [31929, 0, "e"], + [31930, 0, "}"], + [31931, 0, "\n"], + [31932, 0, "\\"], + [31933, 0, "A"], + [31934, 0, "x"], + [31935, 0, "i"], + [31936, 0, "o"], + [31937, 0, "m"], + [31938, 0, "C"], + [31939, 0, "{"], + [31940, 0, "$"], + [31941, 0, "\\"], + [31942, 0, "m"], + [31943, 0, "a"], + [31944, 0, "t"], + [31945, 0, "h"], + [31946, 0, "s"], + [31947, 0, "f"], + [31948, 0, "{"], + [31949, 0, "l"], + [31950, 0, "i"], + [31951, 0, "s"], + [31952, 0, "t"], + [31953, 0, "T"], + [31954, 0, "}"], + [31955, 0, "("], + [31956, 0, "k"], + [31957, 0, ")"], + [31958, 0, " "], + [31959, 0, "\\"], + [31960, 0, "i"], + [31961, 0, "n"], + [31962, 0, " "], + [31963, 0, "\\"], + [31964, 0, "m"], + [31965, 0, "a"], + [31966, 0, "t"], + [31967, 0, "h"], + [31968, 0, "r"], + [31969, 0, "m"], + [31970, 0, "{"], + [31971, 0, "d"], + [31972, 0, "o"], + [31973, 0, "m"], + [31974, 0, "}"], + [31975, 0, "("], + [31976, 0, "\\"], + [31977, 0, "m"], + [31978, 0, "a"], + [31979, 0, "t"], + [31980, 0, "h"], + [31981, 0, "i"], + [31982, 0, "t"], + [31983, 0, "{"], + [31984, 0, "c"], + [31985, 0, "t"], + [31986, 0, "x"], + [31987, 0, "}"], + [31988, 0, ")"], + [31989, 0, "$"], + [31990, 0, "}"], + [31991, 0, "\n"], + [31992, 0, "\\"], + [31993, 0, "A"], + [31994, 0, "x"], + [31995, 0, "i"], + [31996, 0, "o"], + [31997, 0, "m"], + [31998, 0, "C"], + [31999, 0, "{"], + [32000, 0, "$"], + [32001, 0, "\\"], + [32002, 0, "m"], + [32003, 0, "a"], + [32004, 0, "t"], + [32005, 0, "h"], + [32006, 0, "i"], + [32007, 0, "t"], + [32008, 0, "{"], + [32009, 0, "c"], + [32010, 0, "t"], + [32011, 0, "x"], + [32012, 0, "}"], + [32013, 0, "("], + [32014, 0, "\\"], + [32015, 0, "m"], + [32016, 0, "a"], + [32017, 0, "t"], + [32018, 0, "h"], + [32019, 0, "s"], + [32020, 0, "f"], + [32021, 0, "{"], + [32022, 0, "l"], + [32023, 0, "i"], + [32024, 0, "s"], + [32025, 0, "t"], + [32026, 0, "T"], + [32027, 0, "}"], + [32028, 0, "("], + [32029, 0, "k"], + [32030, 0, ")"], + [32031, 0, ")"], + [32032, 0, ","], + [32033, 0, "\\"], + [32034, 0, ","], + [32035, 0, " "], + [32036, 0, "\\"], + [32037, 0, "m"], + [32038, 0, "a"], + [32039, 0, "t"], + [32040, 0, "h"], + [32041, 0, "s"], + [32042, 0, "f"], + [32043, 0, "{"], + [32044, 0, "o"], + [32045, 0, "p"], + [32046, 0, "}"], + [32047, 0, "("], + [32048, 0, "\\"], + [32049, 0, "m"], + [32050, 0, "a"], + [32051, 0, "t"], + [32052, 0, "h"], + [32053, 0, "i"], + [32054, 0, "t"], + [32055, 0, "{"], + [32056, 0, "i"], + [32057, 0, "d"], + [32058, 0, "}"], + [32059, 0, ","], + [32060, 0, " "], + [32061, 0, "\\"], + [32062, 0, "m"], + [32063, 0, "a"], + [32064, 0, "t"], + [32065, 0, "h"], + [32066, 0, "s"], + [32066, 1], + [32066, 0, "i"], + [32067, 0, "t"], + [32068, 0, "{"], + [32069, 0, "d"], + [32070, 0, "e"], + [32071, 0, "p"], + [32072, 0, "s"], + [32073, 0, "}"], + [32074, 0, ","], + [32075, 0, "\n"], + [32076, 0, " "], + [32077, 0, " "], + [32078, 0, " "], + [32079, 0, " "], + [32080, 0, "\\"], + [32081, 0, "m"], + [32082, 0, "a"], + [32083, 0, "t"], + [32084, 0, "h"], + [32085, 0, "s"], + [32086, 0, "f"], + [32087, 0, "{"], + [32088, 0, "c"], + [32089, 0, "u"], + [32090, 0, "r"], + [32091, 0, "s"], + [32092, 0, "o"], + [32093, 0, "r"], + [32094, 0, "}"], + [32095, 0, "("], + [32096, 0, "\\"], + [32097, 0, "l"], + [32098, 0, "a"], + [32099, 0, "n"], + [32100, 0, "g"], + [32101, 0, "l"], + [32102, 0, "e"], + [32103, 0, "\\"], + [32104, 0, "r"], + [32105, 0, "a"], + [32106, 0, "n"], + [32107, 0, "g"], + [32108, 0, "l"], + [32109, 0, "e"], + [32110, 0, ","], + [32111, 0, "\\"], + [32112, 0, ","], + [32113, 0, " "], + [32114, 0, "\\"], + [32115, 0, "m"], + [32116, 0, "a"], + [32117, 0, "t"], + [32118, 0, "h"], + [32119, 0, "s"], + [32120, 0, "f"], + [32121, 0, "{"], + [32122, 0, "h"], + [32123, 0, "e"], + [32124, 0, "a"], + [32125, 0, "d"], + [32126, 0, "}"], + [32127, 0, ")"], + [32128, 0, ","], + [32129, 0, " "], + [32130, 0, "\\"], + [32131, 0, "m"], + [32132, 0, "a"], + [32133, 0, "t"], + [32134, 0, "h"], + [32135, 0, "s"], + [32136, 0, "f"], + [32137, 0, "{"], + [32138, 0, "c"], + [32139, 0, "l"], + [32140, 0, "e"], + [32141, 0, "a"], + [32142, 0, "r"], + [32143, 0, "E"], + [32144, 0, "l"], + [32145, 0, "e"], + [32146, 0, "m"], + [32147, 0, "e"], + [32147, 1], + [32147, 0, "s"], + [32148, 0, "}"], + [32149, 0, ")"], + [32150, 0, " "], + [32151, 0, "\\"], + [32152, 0, "e"], + [32153, 0, "v"], + [32154, 0, "a"], + [32155, 0, "l"], + [32156, 0, "t"], + [32157, 0, "o"], + [32158, 0, " "], + [32159, 0, "\\"], + [32160, 0, "m"], + [32161, 0, "a"], + [32162, 0, "t"], + [32163, 0, "h"], + [32164, 0, "i"], + [32165, 0, "t"], + [32166, 0, "{"], + [32167, 0, "c"], + [32168, 0, "l"], + [32169, 0, "e"], + [32170, 0, "a"], + [32171, 0, "r"], + [32172, 0, "e"], + [32173, 0, "d"], + [32174, 0, "}"], + [32175, 0, "$"], + [32176, 0, "}"], + [32177, 0, "\n"], + [32178, 0, "\\"], + [32179, 0, "L"], + [32180, 0, "e"], + [32181, 0, "f"], + [32182, 0, "t"], + [32183, 0, "L"], + [32184, 0, "a"], + [32185, 0, "b"], + [32186, 0, "e"], + [32187, 0, "l"], + [32188, 0, "{"], + [32189, 0, "\\"], + [32190, 0, "t"], + [32191, 0, "e"], + [32192, 0, "x"], + [32193, 0, "t"], + [32194, 0, "s"], + [32195, 0, "c"], + [32196, 0, "{"], + [32197, 0, "C"], + [32198, 0, "l"], + [32199, 0, "e"], + [32200, 0, "a"], + [32201, 0, "r"], + [32202, 0, "-"], + [32203, 0, "L"], + [32204, 0, "i"], + [32205, 0, "s"], + [32206, 0, "t"], + [32207, 0, "}"], + [32208, 0, "}"], + [32209, 0, "\n"], + [32210, 0, "\\"], + [32211, 0, "B"], + [32212, 0, "i"], + [32213, 0, "n"], + [32214, 0, "a"], + [32215, 0, "r"], + [32216, 0, "y"], + [32217, 0, "I"], + [32218, 0, "n"], + [32219, 0, "f"], + [32220, 0, "C"], + [32221, 0, "{"], + [32222, 0, "$"], + [32223, 0, "\\"], + [32224, 0, "m"], + [32225, 0, "a"], + [32226, 0, "t"], + [32227, 0, "h"], + [32228, 0, "i"], + [32229, 0, "t"], + [32230, 0, "{"], + [32231, 0, "c"], + [32232, 0, "t"], + [32233, 0, "x"], + [32234, 0, "}"], + [32235, 0, ","], + [32236, 0, "\\"], + [32237, 0, ","], + [32238, 0, " "], + [32239, 0, "\\"], + [32240, 0, "m"], + [32241, 0, "a"], + [32242, 0, "t"], + [32243, 0, "h"], + [32244, 0, "s"], + [32245, 0, "f"], + [32246, 0, "{"], + [32247, 0, "o"], + [32248, 0, "p"], + [32249, 0, "}"], + [32250, 0, "("], + [32251, 0, "\\"], + [32252, 0, "m"], + [32253, 0, "a"], + [32254, 0, "t"], + [32255, 0, "h"], + [32256, 0, "i"], + [32257, 0, "t"], + [32258, 0, "{"], + [32259, 0, "i"], + [32260, 0, "d"], + [32261, 0, "}"], + [32262, 0, ","], + [32263, 0, " "], + [32264, 0, "\\"], + [32265, 0, "m"], + [32266, 0, "a"], + [32267, 0, "t"], + [32268, 0, "h"], + [32269, 0, "i"], + [32270, 0, "t"], + [32271, 0, "{"], + [32272, 0, "d"], + [32273, 0, "e"], + [32274, 0, "p"], + [32275, 0, "s"], + [32276, 0, "}"], + [32277, 0, ","], + [32278, 0, "\n"], + [32279, 0, " "], + [32280, 0, " "], + [32281, 0, " "], + [32282, 0, " "], + [32283, 0, "\\"], + [32284, 0, "m"], + [32285, 0, "a"], + [32286, 0, "t"], + [32287, 0, "h"], + [32288, 0, "s"], + [32289, 0, "f"], + [32290, 0, "{"], + [32291, 0, "c"], + [32292, 0, "u"], + [32293, 0, "r"], + [32294, 0, "s"], + [32295, 0, "o"], + [32296, 0, "r"], + [32297, 0, "}"], + [32298, 0, "("], + [32299, 0, "\\"], + [32300, 0, "l"], + [32301, 0, "a"], + [32302, 0, "n"], + [32303, 0, "g"], + [32304, 0, "l"], + [32305, 0, "e"], + [32306, 0, "\\"], + [32307, 0, "r"], + [32308, 0, "a"], + [32309, 0, "n"], + [32310, 0, "g"], + [32311, 0, "l"], + [32312, 0, "e"], + [32313, 0, ","], + [32314, 0, "\\"], + [32315, 0, ","], + [32316, 0, " "], + [32317, 0, "k"], + [32318, 0, ")"], + [32319, 0, ","], + [32320, 0, " "], + [32321, 0, "\\"], + [32322, 0, "m"], + [32323, 0, "a"], + [32324, 0, "t"], + [32325, 0, "h"], + [32326, 0, "s"], + [32327, 0, "f"], + [32328, 0, "{"], + [32329, 0, "c"], + [32330, 0, "l"], + [32331, 0, "e"], + [32332, 0, "a"], + [32333, 0, "r"], + [32334, 0, "L"], + [32335, 0, "i"], + [32336, 0, "s"], + [32337, 0, "t"], + [32338, 0, "}"], + [32339, 0, ")"], + [32340, 0, " "], + [32341, 0, "\\"], + [32342, 0, "e"], + [32343, 0, "v"], + [32344, 0, "a"], + [32345, 0, "l"], + [32346, 0, "t"], + [32347, 0, "o"], + [32348, 0, "\n"], + [32349, 0, " "], + [32350, 0, " "], + [32351, 0, " "], + [32352, 0, " "], + [32353, 0, "\\"], + [32354, 0, "m"], + [32355, 0, "a"], + [32356, 0, "t"], + [32357, 0, "h"], + [32358, 0, "i"], + [32359, 0, "t"], + [32360, 0, "{"], + [32361, 0, "c"], + [32362, 0, "t"], + [32363, 0, "x"], + [32364, 0, "}"], + [32365, 0, "["], + [32366, 0, "\\"], + [32367, 0, ","], + [32368, 0, " "], + [32369, 0, "\\"], + [32370, 0, "m"], + [32371, 0, "a"], + [32372, 0, "t"], + [32373, 0, "h"], + [32374, 0, "s"], + [32375, 0, "f"], + [32376, 0, "{"], + [32377, 0, "l"], + [32378, 0, "i"], + [32379, 0, "s"], + [32380, 0, "t"], + [32381, 0, "T"], + [32382, 0, "}"], + [32383, 0, "("], + [32384, 0, "k"], + [32385, 0, ")"], + [32386, 0, " "], + [32387, 0, "\\"], + [32388, 0, ","], + [32389, 0, "\\"], + [32390, 0, "m"], + [32391, 0, "a"], + [32392, 0, "p"], + [32393, 0, "s"], + [32394, 0, "t"], + [32395, 0, "o"], + [32396, 0, "\\"], + [32397, 0, ","], + [32398, 0, " "], + [32399, 0, "\\"], + [32400, 0, "m"], + [32401, 0, "a"], + [32402, 0, "t"], + [32403, 0, "h"], + [32404, 0, "i"], + [32405, 0, "t"], + [32406, 0, "{"], + [32407, 0, "c"], + [32408, 0, "l"], + [32409, 0, "e"], + [32410, 0, "a"], + [32411, 0, "r"], + [32412, 0, "e"], + [32413, 0, "d"], + [32414, 0, "}"], + [32415, 0, " "], + [32416, 0, "\\"], + [32417, 0, ","], + [32418, 0, "]"], + [32419, 0, "$"], + [32420, 0, "}"], + [32421, 0, "\n"], + [32422, 0, "\\"], + [32423, 0, "e"], + [32424, 0, "n"], + [32425, 0, "d"], + [32426, 0, "{"], + [32427, 0, "p"], + [32428, 0, "r"], + [32429, 0, "o"], + [32430, 0, "o"], + [32431, 0, "f"], + [32432, 0, "t"], + [32433, 0, "r"], + [32434, 0, "e"], + [32435, 0, "e"], + [32436, 0, "}"], + [32437, 0, "\n"], + [32438, 0, "\n"], + [32439, 0, "\\"], + [32440, 0, "b"], + [32441, 0, "e"], + [32442, 0, "g"], + [32443, 0, "i"], + [32444, 0, "n"], + [32445, 0, "{"], + [32446, 0, "p"], + [32447, 0, "r"], + [32448, 0, "o"], + [32449, 0, "o"], + [32450, 0, "f"], + [32451, 0, "t"], + [32452, 0, "r"], + [32453, 0, "e"], + [32454, 0, "e"], + [32455, 0, "\\"], + [32455, 1], + [32455, 0, "}"], + [32456, 0, "\n"], + [32457, 0, "\\"], + [32458, 0, "A"], + [32459, 0, "x"], + [32460, 0, "i"], + [32461, 0, "o"], + [32462, 0, "m"], + [32463, 0, "C"], + [32464, 0, "{"], + [32465, 0, "$"], + [32466, 0, "\\"], + [32467, 0, "m"], + [32468, 0, "a"], + [32469, 0, "t"], + [32470, 0, "h"], + [32470, 1], + [32469, 1], + [32468, 1], + [32467, 1], + [32466, 1], + [32466, 0, "k"], + [32467, 0, " "], + [32468, 0, "\\"], + [32469, 0, "n"], + [32470, 0, "o"], + [32471, 0, "t"], + [32472, 0, "="], + [32473, 0, " "], + [32474, 0, "\\"], + [32475, 0, "m"], + [32476, 0, "a"], + [32477, 0, "t"], + [32478, 0, "h"], + [32479, 0, "s"], + [32480, 0, "f"], + [32481, 0, "{"], + [32482, 0, "t"], + [32483, 0, "a"], + [32484, 0, "i"], + [32485, 0, "l"], + [32486, 0, "}"], + [32487, 0, "$"], + [32488, 0, "}"], + [32489, 0, "\n"], + [32490, 0, "\\"], + [32491, 0, "A"], + [32492, 0, "x"], + [32493, 0, "i"], + [32494, 0, "o"], + [32495, 0, "m"], + [32496, 0, "C"], + [32497, 0, "{"], + [32498, 0, "$"], + [32499, 0, "\\"], + [32500, 0, "m"], + [32501, 0, "a"], + [32502, 0, "t"], + [32503, 0, "h"], + [32504, 0, "i"], + [32505, 0, "t"], + [32506, 0, "{"], + [32507, 0, "c"], + [32508, 0, "t"], + [32509, 0, "x"], + [32510, 0, "}"], + [32511, 0, "("], + [32512, 0, "\\"], + [32513, 0, "m"], + [32514, 0, "a"], + [32515, 0, "t"], + [32516, 0, "h"], + [32517, 0, "s"], + [32518, 0, "f"], + [32519, 0, "{"], + [32520, 0, "n"], + [32521, 0, "e"], + [32522, 0, "x"], + [32523, 0, "t"], + [32524, 0, "}"], + [32525, 0, "("], + [32526, 0, "k"], + [32527, 0, ")"], + [32528, 0, ")"], + [32529, 0, " "], + [32530, 0, "="], + [32531, 0, " "], + [32532, 0, "\\"], + [32533, 0, "m"], + [32534, 0, "a"], + [32535, 0, "t"], + [32536, 0, "h"], + [32537, 0, "i"], + [32538, 0, "t"], + [32539, 0, "{"], + [32540, 0, "n"], + [32541, 0, "e"], + [32542, 0, "x"], + [32543, 0, "t"], + [32544, 0, "}"], + [32545, 0, "$"], + [32546, 0, "}"], + [32547, 0, "\n"], + [32548, 0, "\\"], + [32549, 0, "A"], + [32550, 0, "x"], + [32551, 0, "i"], + [32552, 0, "o"], + [32553, 0, "m"], + [32554, 0, "C"], + [32555, 0, "{"], + [32556, 0, "$"], + [32489, 0, "\n"], + [32490, 0, "\\"], + [32491, 0, "A"], + [32492, 0, "x"], + [32493, 0, "i"], + [32494, 0, "o"], + [32495, 0, "m"], + [32496, 0, "C"], + [32497, 0, "{"], + [32498, 0, "$"], + [32499, 0, "k"], + [32500, 0, " "], + [32501, 0, "\\"], + [32502, 0, "i"], + [32503, 0, "n"], + [32504, 0, " "], + [32505, 0, "\\"], + [32506, 0, "m"], + [32507, 0, "a"], + [32508, 0, "t"], + [32509, 0, "h"], + [32510, 0, "i"], + [32511, 0, "t"], + [32512, 0, "{"], + [32513, 0, "d"], + [32514, 0, "e"], + [32515, 0, "p"], + [32516, 0, "s"], + [32517, 0, "}"], + [32518, 0, "$"], + [32519, 0, "}"], + [32588, 0, "\\"], + [32589, 0, "m"], + [32590, 0, "a"], + [32591, 0, "t"], + [32592, 0, "h"], + [32593, 0, "i"], + [32594, 0, "t"], + [32595, 0, "{"], + [32596, 0, "c"], + [32597, 0, "t"], + [32598, 0, "x"], + [32599, 0, "}"], + [32600, 0, ","], + [32601, 0, "\\"], + [32602, 0, ","], + [32603, 0, " "], + [32604, 0, "\\"], + [32605, 0, "m"], + [32606, 0, "a"], + [32607, 0, "t"], + [32608, 0, "h"], + [32609, 0, "s"], + [32610, 0, "f"], + [32611, 0, "{"], + [32612, 0, "o"], + [32613, 0, "p"], + [32614, 0, "}"], + [32615, 0, "("], + [32616, 0, "\\"], + [32617, 0, "m"], + [32618, 0, "a"], + [32619, 0, "t"], + [32620, 0, "h"], + [32621, 0, "i"], + [32622, 0, "t"], + [32623, 0, "{"], + [32624, 0, "i"], + [32625, 0, "d"], + [32626, 0, "}"], + [32627, 0, ","], + [32628, 0, " "], + [32629, 0, "\\"], + [32630, 0, "m"], + [32631, 0, "a"], + [32632, 0, "t"], + [32633, 0, "h"], + [32634, 0, "i"], + [32635, 0, "t"], + [32636, 0, "{"], + [32637, 0, "d"], + [32638, 0, "e"], + [32639, 0, "p"], + [32640, 0, "s"], + [32641, 0, "}"], + [32642, 0, ","], + [32643, 0, "\n"], + [32644, 0, " "], + [32645, 0, " "], + [32646, 0, " "], + [32647, 0, " "], + [32648, 0, "\\"], + [32649, 0, "m"], + [32650, 0, "a"], + [32651, 0, "t"], + [32652, 0, "h"], + [32653, 0, "s"], + [32654, 0, "f"], + [32655, 0, "{"], + [32656, 0, "c"], + [32657, 0, "u"], + [32658, 0, "r"], + [32659, 0, "s"], + [32660, 0, "o"], + [32661, 0, "r"], + [32662, 0, "}"], + [32663, 0, "("], + [32664, 0, "\\"], + [32665, 0, "l"], + [32666, 0, "a"], + [32667, 0, "n"], + [32668, 0, "g"], + [32669, 0, "l"], + [32670, 0, "e"], + [32671, 0, "\\"], + [32672, 0, "r"], + [32673, 0, "a"], + [32674, 0, "n"], + [32675, 0, "g"], + [32676, 0, "l"], + [32677, 0, "e"], + [32678, 0, ","], + [32679, 0, "\\"], + [32680, 0, ","], + [32681, 0, " "], + [32682, 0, "k"], + [32683, 0, ")"], + [32684, 0, ","], + [32685, 0, " "], + [32686, 0, "\\"], + [32687, 0, "m"], + [32688, 0, "a"], + [32689, 0, "t"], + [32690, 0, "h"], + [32691, 0, "s"], + [32692, 0, "f"], + [32693, 0, "{"], + [32694, 0, "c"], + [32695, 0, "l"], + [32696, 0, "e"], + [32697, 0, "a"], + [32698, 0, "r"], + [32699, 0, "E"], + [32700, 0, "l"], + [32701, 0, "e"], + [32702, 0, "m"], + [32703, 0, "e"], + [32703, 1], + [32703, 0, "s"], + [32704, 0, "}"], + [32705, 0, ")"], + [32706, 0, " "], + [32707, 0, "\\"], + [32708, 0, "e"], + [32709, 0, "v"], + [32710, 0, "a"], + [32711, 0, "l"], + [32712, 0, "t"], + [32713, 0, "o"], + [32714, 0, " "], + [32715, 0, "\\"], + [32716, 0, "m"], + [32717, 0, "a"], + [32718, 0, "t"], + [32719, 0, "h"], + [32720, 0, "i"], + [32721, 0, "t"], + [32722, 0, "{"], + [32723, 0, "c"], + [32724, 0, "t"], + [32725, 0, "x"], + [32726, 0, "}"], + [32727, 0, "'"], + [32728, 0, "$"], + [32729, 0, "}"], + [32730, 0, "\n"], + [32731, 0, "\\"], + [32732, 0, "L"], + [32733, 0, "e"], + [32734, 0, "f"], + [32735, 0, "t"], + [32736, 0, "L"], + [32737, 0, "a"], + [32738, 0, "b"], + [32739, 0, "e"], + [32740, 0, "l"], + [32741, 0, "{"], + [32742, 0, "\\"], + [32743, 0, "t"], + [32744, 0, "e"], + [32745, 0, "x"], + [32746, 0, "t"], + [32747, 0, "s"], + [32748, 0, "c"], + [32749, 0, "{"], + [32750, 0, "C"], + [32751, 0, "l"], + [32752, 0, "e"], + [32752, 1], + [32751, 1], + [32742, 0, "$"], + [32752, 0, "l"], + [32753, 0, "e"], + [32754, 0, "a"], + [32755, 0, "r"], + [32756, 0, "-"], + [32757, 0, "E"], + [32758, 0, "l"], + [32759, 0, "e"], + [32760, 0, "m"], + [32761, 0, "s"], + [32762, 0, "}"], + [32763, 0, "_"], + [32764, 0, "1"], + [32765, 0, "$"], + [32766, 0, "}"], + [32767, 0, "\n"], + [32768, 0, "\\"], + [32769, 0, "Q"], + [32770, 0, "u"], + [32771, 0, "a"], + [32772, 0, "t"], + [32773, 0, "e"], + [32774, 0, "r"], + [32775, 0, "n"], + [32776, 0, "a"], + [32777, 0, "r"], + [32778, 0, "y"], + [32779, 0, "I"], + [32780, 0, "n"], + [32781, 0, "f"], + [32782, 0, "C"], + [32783, 0, "{"], + [32784, 0, "$"], + [32785, 0, "\\"], + [32786, 0, "m"], + [32787, 0, "a"], + [32788, 0, "t"], + [32789, 0, "h"], + [32790, 0, "i"], + [32791, 0, "t"], + [32792, 0, "{"], + [32793, 0, "c"], + [32794, 0, "t"], + [32795, 0, "x"], + [32796, 0, "}"], + [32797, 0, ","], + [32798, 0, "\\"], + [32799, 0, ","], + [32800, 0, " "], + [32801, 0, "\\"], + [32802, 0, "m"], + [32803, 0, "a"], + [32804, 0, "t"], + [32805, 0, "h"], + [32806, 0, "s"], + [32807, 0, "f"], + [32808, 0, "{"], + [32809, 0, "o"], + [32810, 0, "p"], + [32811, 0, "}"], + [32812, 0, "("], + [32813, 0, "\\"], + [32814, 0, "m"], + [32815, 0, "a"], + [32816, 0, "t"], + [32817, 0, "h"], + [32818, 0, "i"], + [32819, 0, "t"], + [32820, 0, "{"], + [32821, 0, "i"], + [32822, 0, "d"], + [32823, 0, "}"], + [32824, 0, ","], + [32825, 0, " "], + [32826, 0, "\\"], + [32827, 0, "m"], + [32828, 0, "a"], + [32829, 0, "t"], + [32830, 0, "h"], + [32831, 0, "i"], + [32832, 0, "t"], + [32833, 0, "{"], + [32834, 0, "d"], + [32835, 0, "e"], + [32836, 0, "p"], + [32837, 0, "s"], + [32838, 0, "}"], + [32839, 0, ","], + [32840, 0, "\n"], + [32841, 0, " "], + [32842, 0, " "], + [32843, 0, " "], + [32844, 0, " "], + [32845, 0, "\\"], + [32846, 0, "m"], + [32847, 0, "a"], + [32848, 0, "t"], + [32849, 0, "h"], + [32850, 0, "s"], + [32851, 0, "f"], + [32852, 0, "{"], + [32853, 0, "c"], + [32854, 0, "u"], + [32855, 0, "r"], + [32856, 0, "s"], + [32857, 0, "o"], + [32858, 0, "r"], + [32859, 0, "}"], + [32860, 0, "("], + [32861, 0, "\\"], + [32862, 0, "l"], + [32863, 0, "a"], + [32864, 0, "n"], + [32865, 0, "g"], + [32866, 0, "l"], + [32867, 0, "e"], + [32868, 0, ","], + [32868, 1], + [32868, 0, "\\"], + [32869, 0, "r"], + [32870, 0, "a"], + [32871, 0, "n"], + [32872, 0, "g"], + [32873, 0, "l"], + [32874, 0, "e"], + [32875, 0, ","], + [32876, 0, "\\"], + [32877, 0, ","], + [32878, 0, " "], + [32879, 0, "k"], + [32880, 0, ")"], + [32881, 0, ","], + [32882, 0, " "], + [32883, 0, "\\"], + [32884, 0, "m"], + [32885, 0, "a"], + [32886, 0, "t"], + [32887, 0, "h"], + [32888, 0, "s"], + [32889, 0, "f"], + [32890, 0, "{"], + [32891, 0, "c"], + [32892, 0, "l"], + [32893, 0, "e"], + [32894, 0, "a"], + [32895, 0, "r"], + [32896, 0, "E"], + [32897, 0, "l"], + [32898, 0, "e"], + [32899, 0, "m"], + [32900, 0, "s"], + [32682, 1], + [32682, 0, "\\"], + [32683, 0, "m"], + [32684, 0, "a"], + [32685, 0, "t"], + [32686, 0, "h"], + [32687, 0, "i"], + [32688, 0, "t"], + [32689, 0, "{"], + [32690, 0, "n"], + [32691, 0, "e"], + [32692, 0, "x"], + [32693, 0, "t"], + [32694, 0, "}"], + [32913, 0, "}"], + [32914, 0, ")"], + [32915, 0, " "], + [32916, 0, "\\"], + [32917, 0, "e"], + [32918, 0, "v"], + [32919, 0, "a"], + [32920, 0, "l"], + [32921, 0, "t"], + [32922, 0, "o"], + [32923, 0, " "], + [32923, 1], + [32923, 0, "\n"], + [32924, 0, " "], + [32925, 0, " "], + [32926, 0, " "], + [32927, 0, " "], + [32928, 0, "\\"], + [32929, 0, "m"], + [32930, 0, "a"], + [32931, 0, "t"], + [32932, 0, "h"], + [32933, 0, "i"], + [32934, 0, "t"], + [32935, 0, "{"], + [32936, 0, "c"], + [32937, 0, "t"], + [32938, 0, "x"], + [32939, 0, "}"], + [32940, 0, "'"], + [32941, 0, "["], + [32942, 0, "\\"], + [32943, 0, ","], + [32944, 0, " "], + [32945, 0, "\\"], + [32946, 0, "m"], + [32947, 0, "a"], + [32948, 0, "t"], + [32949, 0, "h"], + [32944, 1], + [32949, 0, "s"], + [32950, 0, "f"], + [32951, 0, "{"], + [32952, 0, "d"], + [32953, 0, "e"], + [32954, 0, "l"], + [32955, 0, "e"], + [32956, 0, "t"], + [32957, 0, "e"], + [32958, 0, "d"], + [32959, 0, "}"], + [32960, 0, "("], + [32961, 0, "\\"], + [32962, 0, "m"], + [32963, 0, "a"], + [32964, 0, "t"], + [32965, 0, "h"], + [32966, 0, "i"], + [32967, 0, "t"], + [32968, 0, "("], + [32969, 0, "k"], + [32969, 1], + [32968, 1], + [32968, 0, "{"], + [32968, 1], + [32967, 1], + [32966, 1], + [32965, 1], + [32964, 1], + [32963, 1], + [32962, 1], + [32961, 1], + [32961, 0, "k"], + [32962, 0, ")"], + [32963, 0, " "], + [32964, 0, "\\"], + [32965, 0, ","], + [32966, 0, "\\"], + [32967, 0, "m"], + [32968, 0, "a"], + [32969, 0, "p"], + [32970, 0, "s"], + [32971, 0, "t"], + [32972, 0, "o"], + [32973, 0, "\\"], + [32974, 0, ","], + [32975, 0, " "], + [32976, 0, "\\"], + [32977, 0, "m"], + [32978, 0, "a"], + [32979, 0, "t"], + [32980, 0, "h"], + [32981, 0, "s"], + [32982, 0, "f"], + [32983, 0, "{"], + [32984, 0, "t"], + [32985, 0, "r"], + [32986, 0, "u"], + [32987, 0, "e"], + [32988, 0, "}"], + [32989, 0, "\\"], + [32990, 0, ","], + [32991, 0, "]"], + [32992, 0, "$"], + [32993, 0, "}"], + [32994, 0, "\n"], + [32995, 0, "\\"], + [32996, 0, "e"], + [32997, 0, "n"], + [32998, 0, "d"], + [32999, 0, "{"], + [33000, 0, "p"], + [33001, 0, "r"], + [33002, 0, "o"], + [33003, 0, "o"], + [33004, 0, "f"], + [33005, 0, "t"], + [33006, 0, "r"], + [33007, 0, "e"], + [33008, 0, "e"], + [33009, 0, "}"], + [32781, 1], + [32781, 1], + [32781, 1], + [32781, 1], + [32781, 1], + [32781, 1], + [32781, 0, "T"], + [32782, 0, "r"], + [32783, 0, "i"], + [32498, 1], + [32497, 1], + [32496, 1], + [32495, 1], + [32494, 1], + [32493, 1], + [32492, 1], + [32491, 1], + [32490, 1], + [32489, 1], + [32488, 1], + [32487, 1], + [32487, 0, " "], + [32488, 0, "\\"], + [32489, 0, ","], + [32490, 0, "\\"], + [32491, 0, "w"], + [32492, 0, "e"], + [32493, 0, "d"], + [32494, 0, "g"], + [32495, 0, "e"], + [32496, 0, "\\"], + [32497, 0, ","], + [32498, 0, " "], + [33007, 0, "\n"], + [33008, 0, "\n"], + [33009, 0, "\\"], + [33010, 0, "b"], + [33011, 0, "e"], + [33012, 0, "g"], + [33013, 0, "i"], + [33014, 0, "n"], + [33015, 0, "{"], + [33016, 0, "p"], + [33017, 0, "r"], + [33018, 0, "o"], + [33019, 0, "o"], + [33020, 0, "f"], + [33021, 0, "t"], + [33022, 0, "r"], + [33023, 0, "e"], + [33024, 0, "e"], + [33025, 0, "}"], + [33026, 0, "\n"], + [33027, 0, "\\"], + [33028, 0, "A"], + [33029, 0, "x"], + [33030, 0, "i"], + [33031, 0, "o"], + [33032, 0, "m"], + [33033, 0, "C"], + [33034, 0, "{"], + [33035, 0, "$"], + [33036, 0, "k"], + [33037, 0, " "], + [33038, 0, "\\"], + [33039, 0, "n"], + [33040, 0, "o"], + [33041, 0, "t"], + [33042, 0, "="], + [33043, 0, " "], + [33044, 0, "\\"], + [33045, 0, "m"], + [33046, 0, "a"], + [33047, 0, "t"], + [33048, 0, "h"], + [33049, 0, "s"], + [33050, 0, "f"], + [33051, 0, "{"], + [33052, 0, "t"], + [33053, 0, "a"], + [33054, 0, "i"], + [33055, 0, "l"], + [33056, 0, "}"], + [33057, 0, " "], + [33058, 0, "\\"], + [33059, 0, ","], + [33060, 0, "\\"], + [33061, 0, "w"], + [33062, 0, "e"], + [33063, 0, "d"], + [33064, 0, "g"], + [33065, 0, "e"], + [33066, 0, "\\"], + [33067, 0, ","], + [33068, 0, " "], + [33069, 0, "k"], + [33070, 0, " "], + [33071, 0, "\\"], + [33072, 0, "n"], + [33073, 0, "o"], + [33074, 0, "t"], + [33075, 0, "i"], + [33076, 0, "n"], + [33077, 0, " "], + [33078, 0, "\\"], + [33079, 0, "m"], + [33080, 0, "a"], + [33081, 0, "t"], + [33082, 0, "h"], + [33083, 0, "i"], + [33084, 0, "t"], + [33085, 0, "{"], + [33086, 0, "d"], + [33087, 0, "e"], + [33088, 0, "p"], + [33089, 0, "s"], + [33090, 0, "}"], + [33091, 0, "$"], + [33092, 0, "}"], + [33093, 0, "\n"], + [33094, 0, "\\"], + [33095, 0, "A"], + [33096, 0, "x"], + [33097, 0, "i"], + [33098, 0, "o"], + [33099, 0, "m"], + [33100, 0, "C"], + [33101, 0, "{"], + [33102, 0, "$"], + [33103, 0, "\\"], + [33104, 0, "m"], + [33105, 0, "a"], + [33106, 0, "t"], + [33107, 0, "h"], + [33108, 0, "i"], + [33109, 0, "t"], + [33110, 0, "{"], + [33111, 0, "c"], + [33112, 0, "t"], + [33113, 0, "x"], + [33114, 0, "}"], + [33115, 0, "("], + [33116, 0, "\\"], + [33117, 0, "m"], + [33118, 0, "a"], + [33119, 0, "t"], + [33120, 0, "h"], + [33121, 0, "s"], + [33122, 0, "f"], + [33123, 0, "{"], + [33124, 0, "n"], + [33125, 0, "e"], + [33126, 0, "x"], + [33127, 0, "t"], + [33128, 0, ")"], + [33128, 1], + [33128, 0, "}"], + [33129, 0, "("], + [33130, 0, "k"], + [33131, 0, ")"], + [33132, 0, ")"], + [33133, 0, " "], + [33134, 0, "="], + [33135, 0, " "], + [33136, 0, "\\"], + [33137, 0, "m"], + [33138, 0, "a"], + [33139, 0, "t"], + [33140, 0, "h"], + [33141, 0, "i"], + [33142, 0, "t"], + [33143, 0, "{"], + [33144, 0, "n"], + [33145, 0, "e"], + [33146, 0, "x"], + [33147, 0, "t"], + [33148, 0, "}"], + [33149, 0, "$"], + [33150, 0, "}"], + [33151, 0, "\n"], + [33152, 0, "\\"], + [33153, 0, "A"], + [33154, 0, "x"], + [33155, 0, "i"], + [33156, 0, "o"], + [33157, 0, "m"], + [33158, 0, "C"], + [33159, 0, "$"], + [33159, 1], + [33159, 0, "{"], + [33160, 0, "$"], + [33161, 0, "\\"], + [33162, 0, "m"], + [33163, 0, "a"], + [33164, 0, "t"], + [33165, 0, "h"], + [33166, 0, "i"], + [33167, 0, "t"], + [33168, 0, "{"], + [33169, 0, "c"], + [33170, 0, "t"], + [33171, 0, "x"], + [33172, 0, "}"], + [33173, 0, ","], + [33174, 0, "\\"], + [33175, 0, ","], + [33176, 0, " "], + [33177, 0, "\\"], + [33178, 0, "m"], + [33179, 0, "a"], + [33180, 0, "t"], + [33181, 0, "h"], + [33182, 0, "s"], + [33183, 0, "f"], + [33184, 0, "{"], + [33185, 0, "o"], + [33186, 0, "p"], + [33187, 0, "}"], + [33188, 0, "("], + [33189, 0, "\\"], + [33190, 0, "m"], + [33191, 0, "a"], + [33192, 0, "t"], + [33193, 0, "h"], + [33194, 0, "i"], + [33195, 0, "t"], + [33196, 0, "{"], + [33197, 0, "i"], + [33198, 0, "d"], + [33199, 0, "}"], + [33200, 0, ","], + [33201, 0, " "], + [33202, 0, "\\"], + [33203, 0, "m"], + [33204, 0, "a"], + [33205, 0, "t"], + [33206, 0, "h"], + [33207, 0, "i"], + [33208, 0, "t"], + [33209, 0, "{"], + [33210, 0, "d"], + [33211, 0, "e"], + [33212, 0, "p"], + [33213, 0, "s"], + [33214, 0, "}"], + [33215, 0, ","], + [33216, 0, "\n"], + [33217, 0, " "], + [33218, 0, " "], + [33219, 0, " "], + [33220, 0, " "], + [33221, 0, "\\"], + [33222, 0, "m"], + [33223, 0, "a"], + [33224, 0, "t"], + [33225, 0, "h"], + [33226, 0, "s"], + [33227, 0, "f"], + [33228, 0, "{"], + [33229, 0, "c"], + [33230, 0, "u"], + [33231, 0, "r"], + [33232, 0, "s"], + [33233, 0, "o"], + [33234, 0, "r"], + [33235, 0, "}"], + [33236, 0, "("], + [33237, 0, "\\"], + [33238, 0, "l"], + [33239, 0, "a"], + [33240, 0, "n"], + [33241, 0, "g"], + [33242, 0, "l"], + [33243, 0, "e"], + [33244, 0, "\\"], + [33245, 0, "r"], + [33246, 0, "a"], + [33247, 0, "n"], + [33248, 0, "g"], + [33249, 0, "l"], + [33250, 0, "e"], + [33251, 0, ","], + [33252, 0, "\\"], + [33253, 0, ","], + [33254, 0, " "], + [33255, 0, "\\"], + [33256, 0, "m"], + [33257, 0, "a"], + [33258, 0, "t"], + [33259, 0, "h"], + [33260, 0, "i"], + [33261, 0, "t"], + [33262, 0, "{"], + [33263, 0, "n"], + [33264, 0, "e"], + [33265, 0, "x"], + [33266, 0, "t"], + [33267, 0, "}"], + [33268, 0, ")"], + [33269, 0, ","], + [33270, 0, " "], + [33271, 0, "\\"], + [33272, 0, "m"], + [33273, 0, "a"], + [33274, 0, "t"], + [33275, 0, "h"], + [33276, 0, "s"], + [33277, 0, "f"], + [33278, 0, "{"], + [33279, 0, "c"], + [33280, 0, "l"], + [33281, 0, "e"], + [33282, 0, "a"], + [33283, 0, "r"], + [33284, 0, "E"], + [33285, 0, "l"], + [33286, 0, "e"], + [33287, 0, "m"], + [33288, 0, "s"], + [33289, 0, "}"], + [33290, 0, ")"], + [33291, 0, " "], + [33292, 0, "\\"], + [33293, 0, "e"], + [33294, 0, "v"], + [33295, 0, "a"], + [33296, 0, "l"], + [33297, 0, "t"], + [33298, 0, "o"], + [33299, 0, " "], + [33300, 0, "\\"], + [33301, 0, "m"], + [33302, 0, "a"], + [33303, 0, "t"], + [33304, 0, "h"], + [33305, 0, "i"], + [33306, 0, "t"], + [33307, 0, "{"], + [33308, 0, "c"], + [33309, 0, "t"], + [33310, 0, "x"], + [33311, 0, "}"], + [33312, 0, "'"], + [33313, 0, "$"], + [33314, 0, "}"], + [33315, 0, "\n"], + [33316, 0, "\\"], + [33317, 0, "L"], + [33318, 0, "e"], + [33319, 0, "f"], + [33320, 0, "t"], + [33321, 0, "L"], + [33322, 0, "a"], + [33323, 0, "b"], + [33324, 0, "e"], + [33325, 0, "l"], + [33326, 0, "{"], + [33327, 0, "$"], + [33328, 0, "\\"], + [33329, 0, "t"], + [33330, 0, "e"], + [33331, 0, "x"], + [33332, 0, "t"], + [33333, 0, "s"], + [33334, 0, "c"], + [33335, 0, "{"], + [33336, 0, "C"], + [33337, 0, "l"], + [33338, 0, "e"], + [33339, 0, "a"], + [33340, 0, "r"], + [33341, 0, "-"], + [33342, 0, "E"], + [33343, 0, "l"], + [33344, 0, "e"], + [33345, 0, "m"], + [33346, 0, "s"], + [33347, 0, "}"], + [33348, 0, "_"], + [33349, 0, "2"], + [33350, 0, "$"], + [33351, 0, "}"], + [33352, 0, "\n"], + [33353, 0, "\\"], + [33354, 0, "T"], + [33355, 0, "r"], + [33356, 0, "i"], + [33357, 0, "n"], + [33358, 0, "a"], + [33359, 0, "r"], + [33360, 0, "y"], + [33361, 0, "I"], + [33362, 0, "n"], + [33363, 0, "f"], + [33364, 0, "C"], + [33365, 0, "{"], + [33366, 0, "$"], + [33367, 0, "\\"], + [33368, 0, "m"], + [33369, 0, "a"], + [33370, 0, "t"], + [33371, 0, "h"], + [33372, 0, "i"], + [33373, 0, "t"], + [33374, 0, "{"], + [33375, 0, "c"], + [33376, 0, "t"], + [33377, 0, "x"], + [33378, 0, "}"], + [33379, 0, ","], + [33380, 0, "\\"], + [33381, 0, ","], + [33382, 0, " "], + [33383, 0, "\\"], + [33384, 0, "m"], + [33385, 0, "a"], + [33386, 0, "t"], + [33387, 0, "h"], + [33388, 0, "s"], + [33389, 0, "f"], + [33390, 0, "{"], + [33391, 0, "o"], + [33392, 0, "p"], + [33393, 0, "}"], + [33394, 0, "("], + [33395, 0, "\\"], + [33396, 0, "m"], + [33397, 0, "a"], + [33398, 0, "t"], + [33399, 0, "h"], + [33400, 0, "i"], + [33401, 0, "t"], + [33402, 0, "{"], + [33403, 0, "i"], + [33404, 0, "d"], + [33405, 0, "}"], + [33406, 0, ","], + [33407, 0, " "], + [33408, 0, "\\"], + [33409, 0, "m"], + [33410, 0, "a"], + [33411, 0, "t"], + [33412, 0, "h"], + [33413, 0, "i"], + [33414, 0, "t"], + [33415, 0, "{"], + [33416, 0, "d"], + [33417, 0, "e"], + [33418, 0, "p"], + [33419, 0, "s"], + [33420, 0, "}"], + [33421, 0, ","], + [33422, 0, "\n"], + [33423, 0, " "], + [33424, 0, " "], + [33425, 0, " "], + [33426, 0, " "], + [33427, 0, "\\"], + [33428, 0, "m"], + [33429, 0, "a"], + [33430, 0, "t"], + [33431, 0, "h"], + [33432, 0, "s"], + [33433, 0, "f"], + [33434, 0, "{"], + [33435, 0, "c"], + [33436, 0, "u"], + [33437, 0, "r"], + [33438, 0, "s"], + [33439, 0, "o"], + [33440, 0, "r"], + [33441, 0, "}"], + [33442, 0, "("], + [33443, 0, "\\"], + [33444, 0, "l"], + [33445, 0, "a"], + [33446, 0, "n"], + [33447, 0, "g"], + [33448, 0, "l"], + [33449, 0, "e"], + [33450, 0, "\\"], + [33451, 0, "r"], + [33452, 0, "a"], + [33453, 0, "n"], + [33454, 0, "g"], + [33455, 0, "l"], + [33456, 0, "e"], + [33457, 0, ","], + [33458, 0, "\\"], + [33459, 0, ","], + [33460, 0, " "], + [33461, 0, "k"], + [33462, 0, ")"], + [33463, 0, ","], + [33464, 0, " "], + [33465, 0, "\\"], + [33466, 0, "m"], + [33467, 0, "a"], + [33468, 0, "t"], + [33469, 0, "h"], + [33470, 0, "s"], + [33471, 0, "f"], + [33472, 0, "{"], + [33473, 0, "c"], + [33474, 0, "l"], + [33475, 0, "e"], + [33476, 0, "a"], + [33477, 0, "r"], + [33478, 0, "E"], + [33479, 0, "l"], + [33480, 0, "e"], + [33481, 0, "m"], + [33482, 0, "e"], + [33483, 0, "s"], + [33483, 1], + [33482, 1], + [33482, 0, "s"], + [33483, 0, "}"], + [33484, 0, ")"], + [33485, 0, " "], + [33486, 0, "\\"], + [33487, 0, "e"], + [33488, 0, "v"], + [33489, 0, "a"], + [33490, 0, "l"], + [33491, 0, "t"], + [33492, 0, "o"], + [33493, 0, "\n"], + [33493, 1], + [33493, 0, " "], + [33494, 0, "\\"], + [33495, 0, "m"], + [33496, 0, "a"], + [33497, 0, "t"], + [33498, 0, "h"], + [33499, 0, "i"], + [33500, 0, "t"], + [33501, 0, "{"], + [33502, 0, "c"], + [33503, 0, "t"], + [33504, 0, "x"], + [33505, 0, "}"], + [33506, 0, "'"], + [33507, 0, "$"], + [33508, 0, "}"], + [33509, 0, "\n"], + [33510, 0, "\\"], + [33511, 0, "e"], + [33512, 0, "n"], + [33513, 0, "d"], + [33514, 0, "{"], + [33515, 0, "["], + [33515, 1], + [33515, 0, "p"], + [33516, 0, "r"], + [33517, 0, "o"], + [33518, 0, "o"], + [33519, 0, "f"], + [33520, 0, "t"], + [33521, 0, "r"], + [33522, 0, "e"], + [33523, 0, "e"], + [33524, 0, "}"], + [33525, 0, "\n"], + [33526, 0, "\n"], + [33527, 0, "\\"], + [33528, 0, "b"], + [33529, 0, "e"], + [33530, 0, "g"], + [33531, 0, "i"], + [33532, 0, "n"], + [33533, 0, "{"], + [33534, 0, "p"], + [33535, 0, "r"], + [33536, 0, "o"], + [33537, 0, "o"], + [33538, 0, "f"], + [33539, 0, "t"], + [33540, 0, "r"], + [33541, 0, "e"], + [33542, 0, "e"], + [33543, 0, "}"], + [33544, 0, "\n"], + [33545, 0, "\\"], + [33546, 0, "e"], + [33547, 0, "n"], + [33548, 0, "d"], + [33549, 0, "{"], + [33550, 0, "p"], + [33551, 0, "r"], + [33552, 0, "o"], + [33553, 0, "o"], + [33554, 0, "f"], + [33555, 0, "t"], + [33556, 0, "r"], + [33557, 0, "e"], + [33558, 0, "e"], + [33559, 0, "}"], + [33544, 0, "\n"], + [33545, 0, "\\"], + [33546, 0, "A"], + [33547, 0, "x"], + [33548, 0, "i"], + [33549, 0, "o"], + [33550, 0, "m"], + [33551, 0, "C"], + [33552, 0, "{"], + [33553, 0, "$"], + [33554, 0, "k"], + [33555, 0, " "], + [33556, 0, "="], + [33557, 0, " "], + [33558, 0, "\\"], + [33559, 0, "m"], + [33560, 0, "a"], + [33561, 0, "t"], + [33562, 0, "h"], + [33563, 0, "s"], + [33564, 0, "f"], + [33564, 1], + [33563, 1], + [33563, 0, "s"], + [33564, 0, "f"], + [33565, 0, "{"], + [33566, 0, "t"], + [33567, 0, "a"], + [33568, 0, "i"], + [33569, 0, "l"], + [33570, 0, "}"], + [33571, 0, "$"], + [33572, 0, "}"], + [33573, 0, "\n"], + [33574, 0, "\\"], + [33575, 0, "L"], + [33576, 0, "e"], + [33577, 0, "f"], + [33578, 0, "t"], + [33579, 0, "L"], + [33580, 0, "a"], + [33581, 0, "b"], + [33582, 0, "e"], + [33583, 0, "l"], + [33584, 0, "{"], + [33585, 0, "$"], + [33586, 0, "\\"], + [33587, 0, "t"], + [33588, 0, "e"], + [33589, 0, "x"], + [33590, 0, "t"], + [33591, 0, "s"], + [33592, 0, "c"], + [33593, 0, "{"], + [33594, 0, "C"], + [33595, 0, "l"], + [33596, 0, "e"], + [33597, 0, "a"], + [33598, 0, "r"], + [33599, 0, "-"], + [33600, 0, "E"], + [33601, 0, "l"], + [33602, 0, "e"], + [33603, 0, "m"], + [33604, 0, "s"], + [33605, 0, "}"], + [33606, 0, "_"], + [33607, 0, "3"], + [33608, 0, "$"], + [33609, 0, "}"], + [33610, 0, "\n"], + [33611, 0, "\\"], + [33612, 0, "U"], + [33613, 0, "n"], + [33614, 0, "a"], + [33615, 0, "r"], + [33616, 0, "y"], + [33617, 0, "I"], + [33618, 0, "n"], + [33619, 0, "f"], + [33620, 0, "C"], + [33621, 0, "{"], + [33622, 0, "$"], + [33623, 0, "\\"], + [33624, 0, "m"], + [33625, 0, "a"], + [33626, 0, "t"], + [33627, 0, "h"], + [33628, 0, "i"], + [33629, 0, "t"], + [33630, 0, "{"], + [33631, 0, "c"], + [33632, 0, "t"], + [33633, 0, "x"], + [33634, 0, "}"], + [33635, 0, ","], + [33636, 0, "\\"], + [33637, 0, ","], + [33638, 0, " "], + [33639, 0, "\\"], + [33640, 0, "m"], + [33641, 0, "a"], + [33642, 0, "t"], + [33643, 0, "h"], + [33644, 0, "s"], + [33645, 0, "f"], + [33646, 0, "{"], + [33647, 0, "o"], + [33648, 0, "p"], + [33649, 0, "}"], + [33650, 0, "("], + [33651, 0, "\\"], + [33652, 0, "m"], + [33653, 0, "a"], + [33654, 0, "t"], + [33655, 0, "h"], + [33656, 0, "i"], + [33657, 0, "t"], + [33658, 0, "{"], + [33659, 0, "i"], + [33660, 0, "d"], + [33661, 0, "}"], + [33662, 0, ","], + [33663, 0, " "], + [33664, 0, "\\"], + [33665, 0, "m"], + [33666, 0, "a"], + [33667, 0, "t"], + [33668, 0, "h"], + [33669, 0, "i"], + [33670, 0, "t"], + [33671, 0, "{"], + [33672, 0, "d"], + [33673, 0, "e"], + [33674, 0, "p"], + [33675, 0, "s"], + [33676, 0, "}"], + [33677, 0, ","], + [33678, 0, "\n"], + [33679, 0, " "], + [33680, 0, " "], + [33681, 0, " "], + [33682, 0, " "], + [33683, 0, "\\"], + [33684, 0, "m"], + [33685, 0, "a"], + [33686, 0, "t"], + [33687, 0, "h"], + [33688, 0, "s"], + [33689, 0, "f"], + [33690, 0, "{"], + [33691, 0, "c"], + [33692, 0, "u"], + [33693, 0, "r"], + [33694, 0, "s"], + [33695, 0, "o"], + [33696, 0, "r"], + [33697, 0, "}"], + [33698, 0, "("], + [33699, 0, "\\"], + [33700, 0, "l"], + [33701, 0, "a"], + [33702, 0, "n"], + [33703, 0, "g"], + [33704, 0, "l"], + [33705, 0, "e"], + [33706, 0, "\\"], + [33707, 0, "r"], + [33708, 0, "a"], + [33709, 0, "n"], + [33710, 0, "g"], + [33711, 0, "l"], + [33712, 0, "e"], + [33713, 0, ","], + [33714, 0, "\\"], + [33715, 0, ","], + [33716, 0, " "], + [33717, 0, "k"], + [33718, 0, ")"], + [33719, 0, ","], + [33720, 0, " "], + [33721, 0, "\\"], + [33722, 0, "m"], + [33723, 0, "a"], + [33724, 0, "t"], + [33725, 0, "h"], + [33726, 0, "s"], + [33727, 0, "f"], + [33728, 0, "{"], + [33729, 0, "c"], + [33730, 0, "l"], + [33731, 0, "e"], + [33732, 0, "a"], + [33733, 0, "r"], + [33734, 0, "E"], + [33735, 0, "l"], + [33736, 0, "e"], + [33737, 0, "m"], + [33738, 0, "s"], + [33739, 0, "}"], + [33740, 0, ")"], + [33741, 0, " "], + [33742, 0, "\\"], + [33743, 0, "e"], + [33744, 0, "v"], + [33745, 0, "a"], + [33746, 0, "l"], + [33747, 0, "t"], + [33748, 0, "o"], + [33749, 0, " "], + [33750, 0, "\\"], + [33751, 0, "m"], + [33752, 0, "a"], + [33753, 0, "t"], + [33754, 0, "h"], + [33755, 0, "i"], + [33756, 0, "t"], + [33757, 0, "{"], + [33758, 0, "c"], + [33759, 0, "t"], + [33760, 0, "x"], + [33761, 0, "}"], + [33762, 0, "$"], + [33763, 0, "}"], + [33764, 0, "\n"], + [33765, 0, "\\"], + [33766, 0, "e"], + [33767, 0, "n"], + [33768, 0, "d"], + [33769, 0, "{"], + [33770, 0, "p"], + [33771, 0, "r"], + [33772, 0, "o"], + [33773, 0, "o"], + [33774, 0, "f"], + [33775, 0, "t"], + [33776, 0, "r"], + [33777, 0, "e"], + [33778, 0, "e"], + [33779, 0, "}"], + [33795, 1], + [33794, 1], + [33793, 1], + [33792, 1], + [33791, 1], + [33790, 1], + [33789, 1], + [33788, 1], + [33787, 1], + [33786, 1], + [33785, 1], + [33784, 1], + [33783, 1], + [33782, 1], + [33781, 1], + [33780, 1], + [34174, 0, "\n"], + [34175, 0, "\\"], + [34176, 0, "i"], + [34177, 0, "t"], + [34178, 0, "e"], + [34179, 0, "m"], + [34180, 0, " "], + [34181, 0, "C"], + [34181, 1], + [34181, 0, "C"], + [34182, 0, "l"], + [34183, 0, "e"], + [34184, 0, "a"], + [34185, 0, "r"], + [34186, 0, "i"], + [34187, 0, "n"], + [34188, 0, "g"], + [34189, 0, " "], + [34190, 0, "a"], + [34191, 0, " "], + [34192, 0, "s"], + [34193, 0, "t"], + [34194, 0, "r"], + [34195, 0, "u"], + [34196, 0, "c"], + [34197, 0, "t"], + [34198, 0, "u"], + [34199, 0, "r"], + [34200, 0, "e"], + [34201, 0, " "], + [34202, 0, "s"], + [34203, 0, "h"], + [34204, 0, "o"], + [34205, 0, "u"], + [34206, 0, "l"], + [34207, 0, "d"], + [34208, 0, " "], + [34209, 0, "r"], + [34210, 0, "e"], + [34211, 0, "m"], + [34212, 0, "o"], + [34213, 0, "v"], + [34214, 0, "e"], + [34215, 0, " "], + [34216, 0, "i"], + [34217, 0, "t"], + [34218, 0, " "], + [34219, 0, "i"], + [34220, 0, "f"], + [34221, 0, " "], + [34222, 0, "t"], + [34223, 0, "h"], + [34224, 0, "e"], + [34225, 0, "r"], + [34226, 0, "e"], + [34227, 0, " "], + [34228, 0, "a"], + [34229, 0, "r"], + [34230, 0, "e"], + [34231, 0, " "], + [34232, 0, "n"], + [34233, 0, "o"], + [34234, 0, " "], + [34235, 0, "c"], + [34236, 0, "o"], + [34237, 0, "n"], + [34238, 0, "c"], + [34239, 0, "u"], + [34240, 0, "r"], + [34241, 0, "r"], + [34242, 0, "e"], + [34243, 0, "n"], + [34244, 0, "t"], + [34245, 0, " "], + [34246, 0, "m"], + [34247, 0, "u"], + [34248, 0, "t"], + [34249, 0, "a"], + [34250, 0, "t"], + [34251, 0, "i"], + [34252, 0, "o"], + [34253, 0, "n"], + [34254, 0, "s"], + [34255, 0, " "], + [34256, 0, "t"], + [34257, 0, "o"], + [34258, 0, " "], + [34259, 0, "t"], + [34260, 0, "h"], + [34261, 0, "e"], + [34262, 0, " "], + [34263, 0, "s"], + [34264, 0, "t"], + [34265, 0, "r"], + [34266, 0, "u"], + [34267, 0, "c"], + [34268, 0, "t"], + [34269, 0, "u"], + [34270, 0, "r"], + [34271, 0, "e"], + [30747, 1], + [30746, 1], + [30745, 1], + [30744, 1], + [30743, 1], + [30742, 1], + [30742, 0, "i"], + [30743, 0, "n"], + [30744, 0, "s"], + [30745, 0, "e"], + [30746, 0, "r"], + [30747, 0, "t"], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 1], + [27979, 0, "\\"], + [27980, 0, "b"], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [27439, 1], + [26984, 1], + [26983, 1], + [26982, 1], + [26981, 1], + [26980, 1], + [26979, 1], + [26978, 1], + [26977, 1], + [26976, 1], + [26975, 1], + [26974, 1], + [26973, 1], + [26972, 1], + [26971, 1], + [26970, 1], + [26969, 1], + [26968, 1], + [26967, 1], + [26966, 1], + [26965, 1], + [26964, 1], + [26976, 1], + [26976, 0, ","], + [26977, 0, "\\"], + [26978, 0, ","], + [26979, 0, " "], + [26980, 0, "k"], + [26981, 0, "_"], + [26982, 0, "1"], + [26983, 0, " "], + [26984, 0, "e"], + [26984, 1], + [26984, 0, "\\"], + [26985, 0, "e"], + [26986, 0, "v"], + [26987, 0, "a"], + [26988, 0, "l"], + [26989, 0, "t"], + [26990, 0, "o"], + [26991, 0, " "], + [26992, 0, "\\"], + [26993, 0, "m"], + [26994, 0, "a"], + [26995, 0, "t"], + [26996, 0, "h"], + [26997, 0, "i"], + [26998, 0, "t"], + [26999, 0, "{"], + [27000, 0, "c"], + [27001, 0, "h"], + [27002, 0, "i"], + [27003, 0, "l"], + [27004, 0, "d"], + [27005, 0, "}"], + [27030, 1], + [27030, 1], + [27030, 1], + [27030, 1], + [27030, 1], + [27028, 1], + [27027, 1], + [27027, 0, "h"], + [27028, 0, "i"], + [27029, 0, "l"], + [27030, 0, "d"], + [27018, 0, "\\"], + [27019, 0, "b"], + [27020, 0, "e"], + [27021, 0, "g"], + [27022, 0, "i"], + [27023, 0, "n"], + [27024, 0, "{"], + [27025, 0, "m"], + [27026, 0, "a"], + [27027, 0, "t"], + [27028, 0, "r"], + [27029, 0, "i"], + [27030, 0, "x"], + [27031, 0, "}"], + [27032, 0, "\n"], + [27033, 0, " "], + [27034, 0, " "], + [27035, 0, " "], + [27036, 0, " "], + [27094, 0, " "], + [27095, 0, "\\"], + [27096, 0, "\\"], + [27197, 1], + [27196, 1], + [27195, 1], + [27194, 1], + [27193, 1], + [27193, 0, "c"], + [27194, 0, "h"], + [27195, 0, "i"], + [27196, 0, "l"], + [27197, 0, "d"], + [27199, 0, "'"], + [27200, 0, "\n"], + [27201, 0, " "], + [27202, 0, " "], + [27203, 0, " "], + [27204, 0, " "], + [27205, 0, "\\"], + [27206, 0, "e"], + [27207, 0, "n"], + [27208, 0, "d"], + [27209, 0, "{"], + [27210, 0, "m"], + [27211, 0, "a"], + [27212, 0, "t"], + [27213, 0, "r"], + [27214, 0, "i"], + [27215, 0, "x"], + [27216, 0, "}"], + [27217, 0, " "], + [27177, 0, "\\"], + [27178, 0, "\\"], + [27179, 0, "\n"], + [27180, 0, " "], + [27181, 0, " "], + [27182, 0, " "], + [27183, 0, " "], + [27183, 1], + [27182, 1], + [27181, 1], + [27180, 1], + [27179, 1], + [27178, 1], + [27177, 1], + [27220, 0, "\n"], + [27221, 0, "\\"], + [27222, 0, "A"], + [27223, 0, "x"], + [27224, 0, "i"], + [27225, 0, "o"], + [27226, 0, "m"], + [27227, 0, "C"], + [27228, 0, "{"], + [27229, 0, "$"], + [27230, 0, "\\"], + [27231, 0, "m"], + [27232, 0, "a"], + [27233, 0, "t"], + [27234, 0, "h"], + [27235, 0, "i"], + [27236, 0, "t"], + [27237, 0, "{"], + [27238, 0, "c"], + [27239, 0, "t"], + [27240, 0, "x"], + [27241, 0, "}"], + [27242, 0, ","], + [27243, 0, "\\"], + [27244, 0, ","], + [27245, 0, " "], + [27246, 0, "\\"], + [27247, 0, "m"], + [27248, 0, "a"], + [27249, 0, "t"], + [27250, 0, "h"], + [27251, 0, "s"], + [27252, 0, "f"], + [27253, 0, "{"], + [27254, 0, "a"], + [27255, 0, "d"], + [27256, 0, "d"], + [27257, 0, "I"], + [27258, 0, "d"], + [27259, 0, "}"], + [27260, 0, "("], + [27261, 0, "k"], + [27262, 0, "_"], + [27263, 0, "1"], + [27264, 0, ","], + [27265, 0, " "], + [27266, 0, "\\"], + [27267, 0, "m"], + [27268, 0, "a"], + [27269, 0, "t"], + [27270, 0, "h"], + [27271, 0, "i"], + [27272, 0, "t"], + [27273, 0, "{"], + [27274, 0, "i"], + [27275, 0, "d"], + [27276, 0, "}"], + [27277, 0, ")"], + [27278, 0, " "], + [27279, 0, "\\"], + [27280, 0, "e"], + [27281, 0, "v"], + [27282, 0, "a"], + [27283, 0, "l"], + [27284, 0, "t"], + [27285, 0, "o"], + [27286, 0, " "], + [27287, 0, "\\"], + [27288, 0, "m"], + [27289, 0, "a"], + [27290, 0, "t"], + [27291, 0, "h"], + [27292, 0, "i"], + [27293, 0, "t"], + [27294, 0, "{"], + [27295, 0, "c"], + [27296, 0, "t"], + [27297, 0, "x"], + [27298, 0, "}"], + [27299, 0, "'"], + [27300, 0, "$"], + [27301, 0, "}"], + [27333, 1], + [27333, 0, "T"], + [27334, 0, "r"], + [27510, 0, "'"], + [27543, 1], + [27542, 1], + [27541, 1], + [27540, 1], + [27539, 1], + [27539, 0, "c"], + [27540, 0, "h"], + [27541, 0, "i"], + [27542, 0, "l"], + [27543, 0, "d"], + [27545, 0, "'"], + [27511, 0, " "], + [27571, 0, "\\"], + [27572, 0, "b"], + [27573, 0, "e"], + [27574, 0, "g"], + [27575, 0, "i"], + [27576, 0, "n"], + [27577, 0, "{"], + [27578, 0, "c"], + [27579, 0, "e"], + [27580, 0, "n"], + [27581, 0, "t"], + [27582, 0, "e"], + [27583, 0, "r"], + [27584, 0, "}"], + [27585, 0, "\n"], + [27586, 0, "\\"], + [27587, 0, "e"], + [27588, 0, "n"], + [27589, 0, "d"], + [27590, 0, "{"], + [27591, 0, "c"], + [27592, 0, "e"], + [27593, 0, "n"], + [27594, 0, "t"], + [27595, 0, "e"], + [27596, 0, "r"], + [27597, 0, "}"], + [27585, 0, "\n"], + [27586, 0, "\\"], + [27587, 0, "A"], + [27588, 0, "x"], + [27589, 0, "i"], + [27590, 0, "o"], + [27591, 0, "m"], + [27592, 0, "C"], + [27593, 0, "{"], + [27594, 0, "$"], + [27595, 0, "k"], + [27596, 0, " "], + [27597, 0, "\\"], + [27598, 0, "i"], + [27599, 0, "n"], + [27600, 0, " "], + [27601, 0, "\\"], + [27602, 0, "m"], + [27603, 0, "a"], + [27604, 0, "t"], + [27605, 0, "h"], + [27606, 0, "r"], + [27607, 0, "m"], + [27608, 0, "{"], + [27609, 0, "d"], + [27610, 0, "o"], + [27611, 0, "m"], + [27612, 0, "}"], + [27613, 0, "("], + [27614, 0, "\\"], + [27615, 0, "m"], + [27616, 0, "a"], + [27617, 0, "t"], + [27618, 0, "h"], + [27619, 0, "i"], + [27620, 0, "t"], + [27621, 0, "{"], + [27622, 0, "c"], + [27623, 0, "t"], + [27624, 0, "x"], + [27625, 0, "}"], + [27626, 0, ")"], + [27627, 0, "$"], + [27628, 0, "}"], + [27629, 0, "\n"], + [27630, 0, "\\"], + [27631, 0, "L"], + [27632, 0, "e"], + [27633, 0, "f"], + [27634, 0, "t"], + [27635, 0, "L"], + [27636, 0, "a"], + [27637, 0, "b"], + [27638, 0, "e"], + [27639, 0, "l"], + [27640, 0, "{"], + [27641, 0, "\\"], + [27642, 0, "t"], + [27643, 0, "e"], + [27643, 1], + [27642, 1], + [27641, 1], + [27641, 0, "$"], + [27642, 0, "\\"], + [27643, 0, "t"], + [27644, 0, "e"], + [27645, 0, "x"], + [27646, 0, "t"], + [27647, 0, "s"], + [27648, 0, "c"], + [27649, 0, "{"], + [27650, 0, "C"], + [27651, 0, "h"], + [27652, 0, "i"], + [27653, 0, "l"], + [27654, 0, "d"], + [27655, 0, "}"], + [27656, 0, "_"], + [27657, 0, "1"], + [27658, 0, "$"], + [27659, 0, "}"], + [27660, 0, "\n"], + [27661, 0, "\\"], + [27662, 0, "U"], + [27663, 0, "n"], + [27664, 0, "a"], + [27665, 0, "r"], + [27666, 0, "y"], + [27667, 0, "I"], + [27668, 0, "n"], + [27669, 0, "f"], + [27670, 0, "C"], + [27671, 0, "{"], + [27672, 0, "$"], + [27673, 0, "\\"], + [27674, 0, "m"], + [27675, 0, "a"], + [27676, 0, "t"], + [27677, 0, "h"], + [27678, 0, "i"], + [27679, 0, "t"], + [27680, 0, "{"], + [27681, 0, "c"], + [27682, 0, "t"], + [27683, 0, "x"], + [27684, 0, "}"], + [27685, 0, ","], + [27686, 0, "\\"], + [27687, 0, ","], + [27688, 0, " "], + [27689, 0, "\\"], + [27689, 1], + [27689, 0, "k"], + [27690, 0, " "], + [27691, 0, "\\"], + [27692, 0, "e"], + [27693, 0, "v"], + [27694, 0, "a"], + [27695, 0, "l"], + [27696, 0, "t"], + [27697, 0, "o"], + [27698, 0, " "], + [27699, 0, "\\"], + [27700, 0, "m"], + [27701, 0, "a"], + [27702, 0, "t"], + [27703, 0, "h"], + [27704, 0, "i"], + [27705, 0, "t"], + [27706, 0, "{"], + [27707, 0, "c"], + [27708, 0, "t"], + [27709, 0, "x"], + [27710, 0, "}"], + [27711, 0, "("], + [27712, 0, "k"], + [27713, 0, ")"], + [27714, 0, "$"], + [27715, 0, "}"], + [27716, 0, "\n"], + [27717, 0, "\\"], + [27718, 0, "D"], + [27719, 0, "i"], + [27720, 0, "s"], + [27721, 0, "p"], + [27722, 0, "l"], + [27723, 0, "a"], + [27724, 0, "y"], + [27725, 0, "P"], + [27726, 0, "r"], + [27727, 0, "o"], + [27728, 0, "o"], + [27729, 0, "f"], + [27730, 0, "\\"], + [27731, 0, "h"], + [27732, 0, "f"], + [27733, 0, "i"], + [27734, 0, "l"], + [27735, 0, "l"], + [27735, 1], + [27734, 1], + [27733, 1], + [27732, 1], + [27732, 0, "s"], + [27733, 0, "p"], + [27734, 0, "a"], + [27735, 0, "c"], + [27736, 0, "e"], + [27737, 0, "{"], + [27738, 0, "3"], + [27739, 0, "e"], + [27740, 0, "m"], + [27741, 0, "}"], + [27742, 0, "\n"], + [27743, 0, "%"], + [27744, 0, "\n"], + [27745, 0, "\\"], + [27746, 0, "A"], + [27747, 0, "x"], + [27748, 0, "i"], + [27749, 0, "o"], + [27750, 0, "m"], + [27751, 0, "C"], + [27752, 0, "{"], + [27753, 0, "$"], + [27754, 0, "\\"], + [27755, 0, "m"], + [27756, 0, "a"], + [27757, 0, "t"], + [27758, 0, "h"], + [27759, 0, "s"], + [27760, 0, "f"], + [27761, 0, "{"], + [27762, 0, "m"], + [27763, 0, "a"], + [27764, 0, "p"], + [27765, 0, "T"], + [27766, 0, "}"], + [27767, 0, "("], + [27768, 0, "k"], + [27769, 0, ")"], + [27770, 0, " "], + [27771, 0, "\\"], + [27772, 0, "n"], + [27773, 0, "o"], + [27774, 0, "t"], + [27775, 0, "i"], + [27776, 0, "n"], + [27777, 0, " "], + [27778, 0, "\\"], + [27779, 0, "m"], + [27780, 0, "a"], + [27781, 0, "t"], + [27782, 0, "h"], + [27783, 0, "i"], + [27783, 1], + [27783, 0, "r"], + [27784, 0, "m"], + [27785, 0, "{"], + [27786, 0, "d"], + [27787, 0, "o"], + [27788, 0, "m"], + [27789, 0, "}"], + [27790, 0, "("], + [27791, 0, "\\"], + [27792, 0, "m"], + [27793, 0, "a"], + [27794, 0, "t"], + [27795, 0, "h"], + [27796, 0, "i"], + [27797, 0, "t"], + [27798, 0, "{"], + [27799, 0, "c"], + [27800, 0, "t"], + [27801, 0, "x"], + [27802, 0, "}"], + [27803, 0, ")"], + [27804, 0, "$"], + [27805, 0, "}"], + [27806, 0, "\n"], + [27807, 0, "\\"], + [27808, 0, "L"], + [27809, 0, "e"], + [27810, 0, "f"], + [27811, 0, "t"], + [27812, 0, "L"], + [27813, 0, "a"], + [27814, 0, "b"], + [27815, 0, "e"], + [27816, 0, "l"], + [27817, 0, "{"], + [27818, 0, "$"], + [27819, 0, "\\"], + [27820, 0, "t"], + [27821, 0, "e"], + [27822, 0, "x"], + [27823, 0, "t"], + [27824, 0, "s"], + [27825, 0, "c"], + [27826, 0, "{"], + [27827, 0, "C"], + [27828, 0, "h"], + [27829, 0, "i"], + [27830, 0, "l"], + [27831, 0, "d"], + [27832, 0, "_"], + [27832, 1], + [27832, 0, "}"], + [27833, 0, "_"], + [27834, 0, "2"], + [27835, 0, "$"], + [27836, 0, "}"], + [27837, 0, "\n"], + [27838, 0, "\\"], + [27839, 0, "U"], + [27840, 0, "n"], + [27841, 0, "a"], + [27842, 0, "r"], + [27843, 0, "y"], + [27844, 0, "I"], + [27845, 0, "n"], + [27846, 0, "f"], + [27847, 0, "C"], + [27848, 0, "{"], + [27849, 0, "$"], + [27850, 0, "\\"], + [27851, 0, "m"], + [27852, 0, "a"], + [27853, 0, "t"], + [27854, 0, "h"], + [27855, 0, "i"], + [27856, 0, "t"], + [27857, 0, "{"], + [27858, 0, "c"], + [27859, 0, "t"], + [27860, 0, "x"], + [27861, 0, "}"], + [27862, 0, ","], + [27863, 0, "\\"], + [27864, 0, ","], + [27865, 0, " "], + [27866, 0, "\\"], + [27867, 0, "m"], + [27868, 0, "a"], + [27869, 0, "t"], + [27870, 0, "h"], + [27871, 0, "s"], + [27872, 0, "f"], + [27873, 0, "{"], + [27874, 0, "m"], + [27875, 0, "a"], + [27876, 0, "p"], + [27877, 0, "T"], + [27878, 0, "}"], + [27879, 0, "("], + [27880, 0, "k"], + [27881, 0, ")"], + [27882, 0, " "], + [27883, 0, "e"], + [27883, 1], + [27883, 0, "\\"], + [27884, 0, "e"], + [27885, 0, "v"], + [27886, 0, "a"], + [27887, 0, "l"], + [27888, 0, "t"], + [27889, 0, "o"], + [27890, 0, " "], + [27891, 0, "\\"], + [27892, 0, "{"], + [27893, 0, "\\"], + [27894, 0, "}"], + [27895, 0, "$"], + [27896, 0, "}"], + [27897, 0, "\n"], + [27898, 0, "\\"], + [27899, 0, "D"], + [27900, 0, "i"], + [27901, 0, "s"], + [27902, 0, "p"], + [27903, 0, "l"], + [27904, 0, "a"], + [27905, 0, "y"], + [27906, 0, "P"], + [27907, 0, "r"], + [27908, 0, "o"], + [27909, 0, "o"], + [27910, 0, "f"], + [27911, 0, "\\"], + [27912, 0, "p"], + [27913, 0, "r"], + [27914, 0, "o"], + [27915, 0, "o"], + [27916, 0, "f"], + [27917, 0, "S"], + [27918, 0, "k"], + [27919, 0, "i"], + [27920, 0, "p"], + [27921, 0, "A"], + [27922, 0, "m"], + [27923, 0, "o"], + [27924, 0, "u"], + [27925, 0, "b"], + [27926, 0, "n"], + [27927, 0, "t"], + [27927, 1], + [27926, 1], + [27925, 1], + [27925, 0, "n"], + [27926, 0, "t"], + [27940, 0, "\n"], + [27941, 0, "\n"], + [27942, 0, "\\"], + [27943, 0, "b"], + [27944, 0, "e"], + [27945, 0, "g"], + [27946, 0, "i"], + [27947, 0, "n"], + [27948, 0, "{"], + [27949, 0, "c"], + [27950, 0, "e"], + [27951, 0, "n"], + [27952, 0, "t"], + [27953, 0, "e"], + [27954, 0, "r"], + [27955, 0, "}"], + [27956, 0, "\n"], + [27957, 0, "\\"], + [27958, 0, "A"], + [27959, 0, "x"], + [27960, 0, "i"], + [27961, 0, "o"], + [27962, 0, "m"], + [27963, 0, "C"], + [27964, 0, "{"], + [27965, 0, "$"], + [27966, 0, "k"], + [27967, 0, " "], + [27968, 0, "\\"], + [27969, 0, "n"], + [27970, 0, "o"], + [27971, 0, "t"], + [27972, 0, "i"], + [27973, 0, "n"], + [27974, 0, " "], + [27975, 0, "\\"], + [27976, 0, "m"], + [27977, 0, "a"], + [27978, 0, "t"], + [27979, 0, "h"], + [27980, 0, "r"], + [27981, 0, "m"], + [27982, 0, "{"], + [27983, 0, "d"], + [27984, 0, "o"], + [27985, 0, "m"], + [27986, 0, "}"], + [27987, 0, "("], + [27988, 0, "\\"], + [27989, 0, "m"], + [27990, 0, "a"], + [27991, 0, "t"], + [27992, 0, "h"], + [27993, 0, "i"], + [27994, 0, "t"], + [27995, 0, "{"], + [27996, 0, "c"], + [27997, 0, "t"], + [27998, 0, "x"], + [27999, 0, "}"], + [28000, 0, ")"], + [28001, 0, "$"], + [28002, 0, "}"], + [28003, 0, "\n"], + [28004, 0, "\\"], + [28005, 0, "L"], + [28006, 0, "e"], + [28007, 0, "f"], + [28008, 0, "t"], + [28009, 0, "L"], + [28010, 0, "a"], + [28011, 0, "b"], + [28012, 0, "e"], + [28013, 0, "l"], + [28014, 0, "{"], + [28015, 0, "$"], + [28016, 0, "\\"], + [28017, 0, "t"], + [28018, 0, "e"], + [28019, 0, "x"], + [28020, 0, "t"], + [28021, 0, "s"], + [28022, 0, "c"], + [28023, 0, "{"], + [28024, 0, "C"], + [28025, 0, "h"], + [28026, 0, "i"], + [28027, 0, "l"], + [28028, 0, "d"], + [28029, 0, "}"], + [28030, 0, "_"], + [28031, 0, "3"], + [28032, 0, "$"], + [28033, 0, "}"], + [28034, 0, "\n"], + [28035, 0, "\\"], + [28036, 0, "U"], + [28037, 0, "n"], + [28038, 0, "a"], + [28039, 0, "r"], + [28040, 0, "y"], + [28041, 0, "I"], + [28042, 0, "n"], + [28043, 0, "f"], + [28044, 0, "C"], + [28045, 0, "{"], + [28046, 0, "$"], + [28047, 0, "\\"], + [28048, 0, "m"], + [28049, 0, "a"], + [28050, 0, "t"], + [28051, 0, "h"], + [28052, 0, "i"], + [28053, 0, "t"], + [28054, 0, "{"], + [28055, 0, "c"], + [28056, 0, "t"], + [28057, 0, "x"], + [28058, 0, "}"], + [28059, 0, ","], + [28060, 0, "\\"], + [28061, 0, ","], + [28062, 0, " "], + [28063, 0, "\\"], + [28064, 0, "m"], + [28065, 0, "a"], + [28066, 0, "t"], + [28067, 0, "h"], + [28068, 0, "s"], + [28069, 0, "f"], + [28070, 0, "{"], + [28071, 0, "l"], + [28072, 0, "i"], + [28073, 0, "s"], + [28074, 0, "t"], + [28075, 0, "T"], + [28076, 0, "}"], + [28077, 0, "("], + [28078, 0, "k"], + [28079, 0, ")"], + [28080, 0, " "], + [28081, 0, "\\"], + [28082, 0, "e"], + [28083, 0, "v"], + [28084, 0, "a"], + [28085, 0, "l"], + [28086, 0, "t"], + [28087, 0, "o"], + [28088, 0, " "], + [28089, 0, "\\"], + [28090, 0, "{"], + [28091, 0, "\\"], + [28092, 0, ","], + [28093, 0, "\\"], + [28094, 0, "m"], + [28095, 0, "a"], + [28096, 0, "t"], + [28097, 0, "h"], + [28098, 0, "s"], + [28099, 0, "f"], + [28100, 0, "{"], + [28101, 0, "n"], + [28102, 0, "e"], + [28103, 0, "x"], + [28104, 0, "t"], + [28105, 0, "}"], + [28106, 0, "("], + [28107, 0, "\\"], + [28108, 0, "m"], + [28109, 0, "a"], + [28110, 0, "t"], + [28111, 0, "h"], + [28112, 0, "s"], + [28113, 0, "f"], + [28114, 0, "{"], + [28115, 0, "h"], + [28116, 0, "e"], + [28117, 0, "a"], + [28118, 0, "d"], + [28119, 0, "}"], + [28120, 0, ")"], + [28121, 0, " "], + [28122, 0, "\\"], + [28123, 0, "m"], + [28124, 0, "a"], + [28125, 0, "p"], + [28126, 0, "s"], + [28127, 0, "t"], + [28128, 0, "o"], + [28129, 0, " "], + [28122, 0, "\\"], + [28123, 0, ","], + [28131, 0, "\\"], + [28132, 0, ","], + [28088, 0, "\n"], + [28089, 0, " "], + [28090, 0, " "], + [28091, 0, " "], + [28138, 0, "\\"], + [28139, 0, "m"], + [28140, 0, "a"], + [28141, 0, "t"], + [28142, 0, "h"], + [28143, 0, "s"], + [28144, 0, "f"], + [28145, 0, "{"], + [28146, 0, "t"], + [28147, 0, "a"], + [28148, 0, "i"], + [28149, 0, "l"], + [28150, 0, "}"], + [28151, 0, " "], + [28152, 0, "\\"], + [28153, 0, ","], + [28154, 0, "\\"], + [28155, 0, "}"], + [28156, 0, "$"], + [28157, 0, "}"], + [28158, 0, "\n"], + [28159, 0, "\\"], + [28160, 0, "D"], + [28161, 0, "i"], + [28162, 0, "s"], + [28163, 0, "p"], + [28164, 0, "l"], + [28165, 0, "a"], + [28166, 0, "y"], + [28167, 0, "P"], + [28168, 0, "r"], + [28169, 0, "o"], + [28170, 0, "o"], + [28171, 0, "f"], + [28172, 0, "\\"], + [28173, 0, "h"], + [28174, 0, "s"], + [28175, 0, "p"], + [28176, 0, "a"], + [28177, 0, "c"], + [28178, 0, "e"], + [28179, 0, "{"], + [28180, 0, "3"], + [28181, 0, "e"], + [28182, 0, "m"], + [28183, 0, "}"], + [28184, 0, "\n"], + [28185, 0, "%"], + [28186, 0, "$"], + [28186, 1], + [28186, 0, "\n"], + [28187, 0, "\\"], + [28188, 0, "A"], + [28189, 0, "x"], + [28190, 0, "i"], + [28191, 0, "o"], + [28192, 0, "m"], + [28193, 0, "C"], + [28194, 0, "{"], + [28195, 0, "$"], + [28196, 0, "\\"], + [28197, 0, "m"], + [28198, 0, "a"], + [28199, 0, "t"], + [28200, 0, "h"], + [27966, 0, "\\"], + [27967, 0, "m"], + [27968, 0, "a"], + [27969, 0, "t"], + [27970, 0, "h"], + [27971, 0, "s"], + [27972, 0, "f"], + [27973, 0, "{"], + [27974, 0, "l"], + [27975, 0, "i"], + [27976, 0, "s"], + [27977, 0, "t"], + [27978, 0, "T"], + [27979, 0, "}"], + [27980, 0, "("], + [27982, 0, ")"], + [28202, 0, "\n"], + [28203, 0, "\\"], + [28204, 0, "A"], + [28205, 0, "x"], + [28206, 0, "i"], + [28207, 0, "o"], + [28208, 0, "m"], + [28209, 0, "C"], + [28210, 0, "{"], + [28211, 0, "$"], + [28212, 0, "\\"], + [28213, 0, "m"], + [28214, 0, "a"], + [28215, 0, "t"], + [28216, 0, "h"], + [28217, 0, "s"], + [28218, 0, "f"], + [28219, 0, "{"], + [28220, 0, "r"], + [28221, 0, "e"], + [28222, 0, "g"], + [28223, 0, "T"], + [28224, 0, "}"], + [28225, 0, "("], + [28226, 0, "k"], + [28227, 0, ")"], + [28228, 0, " "], + [28229, 0, "\\"], + [28230, 0, "n"], + [28231, 0, "o"], + [28232, 0, "t"], + [28233, 0, "i"], + [28234, 0, "n"], + [28235, 0, " "], + [28236, 0, "\\"], + [28237, 0, "m"], + [28238, 0, "a"], + [28239, 0, "t"], + [28240, 0, "h"], + [28241, 0, "r"], + [28242, 0, "m"], + [28243, 0, "{"], + [28244, 0, "d"], + [28245, 0, "o"], + [28246, 0, "m"], + [28247, 0, "}"], + [28248, 0, "("], + [28249, 0, "\\"], + [28250, 0, "m"], + [28251, 0, "a"], + [28252, 0, "t"], + [28253, 0, "h"], + [28254, 0, "i"], + [28255, 0, "t"], + [28256, 0, "{"], + [28257, 0, "c"], + [28258, 0, "t"], + [28259, 0, "x"], + [28260, 0, "}"], + [28261, 0, ")"], + [28262, 0, "$"], + [28263, 0, "}"], + [28264, 0, "\n"], + [28265, 0, "\\"], + [28266, 0, "L"], + [28267, 0, "e"], + [28268, 0, "f"], + [28269, 0, "t"], + [28270, 0, "L"], + [28271, 0, "a"], + [28272, 0, "b"], + [28273, 0, "e"], + [28274, 0, "l"], + [28275, 0, "{"], + [28276, 0, "\\"], + [28276, 1], + [28276, 0, "$"], + [27657, 1], + [27656, 1], + [27656, 1], + [27641, 1], + [27654, 0, "-"], + [27655, 0, "G"], + [27656, 0, "e"], + [27657, 0, "t"], + [27835, 1], + [27834, 1], + [27833, 1], + [27832, 0, "-"], + [27833, 0, "M"], + [27834, 0, "a"], + [27835, 0, "p"], + [27818, 1], + [28031, 1], + [28044, 0, "-"], + [28045, 0, "L"], + [28046, 0, "i"], + [28047, 0, "s"], + [28048, 0, "t"], + [28050, 1], + [28050, 1], + [28050, 1], + [28277, 1], + [28277, 0, "\\"], + [28278, 0, "t"], + [28279, 0, "e"], + [28280, 0, "x"], + [28281, 0, "t"], + [28282, 0, "s"], + [28283, 0, "c"], + [28284, 0, "{"], + [28285, 0, "C"], + [28286, 0, "h"], + [28287, 0, "i"], + [28288, 0, "l"], + [28289, 0, "d"], + [28290, 0, "-"], + [28291, 0, "R"], + [28292, 0, "e"], + [28293, 0, "g"], + [28294, 0, "}"], + [28295, 0, "}"], + [28296, 0, "\n"], + [28297, 0, "\\"], + [28298, 0, "U"], + [28299, 0, "n"], + [28300, 0, "a"], + [28301, 0, "r"], + [28302, 0, "y"], + [28303, 0, "I"], + [28304, 0, "n"], + [28305, 0, "f"], + [28306, 0, "C"], + [28307, 0, "{"], + [28308, 0, "$"], + [28309, 0, "\\"], + [28310, 0, "m"], + [28311, 0, "a"], + [28312, 0, "t"], + [28313, 0, "h"], + [28314, 0, "i"], + [28315, 0, "t"], + [28316, 0, "{"], + [28317, 0, "c"], + [28318, 0, "t"], + [28319, 0, "x"], + [28320, 0, "}"], + [28321, 0, ","], + [28322, 0, "\\"], + [28323, 0, ","], + [28324, 0, " "], + [28325, 0, "\\"], + [28326, 0, "m"], + [28327, 0, "a"], + [28328, 0, "t"], + [28329, 0, "h"], + [28330, 0, "s"], + [28331, 0, "f"], + [28332, 0, "{"], + [28333, 0, "r"], + [28334, 0, "e"], + [28335, 0, "g"], + [28336, 0, "T"], + [28337, 0, "}"], + [28338, 0, "("], + [28339, 0, "k"], + [28340, 0, ")"], + [28341, 0, " "], + [28342, 0, "\\"], + [28343, 0, "e"], + [28344, 0, "v"], + [28345, 0, "a"], + [28346, 0, "l"], + [28347, 0, "t"], + [28348, 0, "o"], + [28349, 0, " "], + [28350, 0, "\\"], + [28351, 0, "{"], + [28352, 0, "\\"], + [28353, 0, "}"], + [28354, 0, "$"], + [28355, 0, "}"], + [28356, 0, "\n"], + [28357, 0, "\\"], + [28358, 0, "D"], + [28359, 0, "i"], + [28360, 0, "s"], + [28361, 0, "p"], + [28362, 0, "l"], + [28363, 0, "a"], + [28364, 0, "y"], + [28365, 0, "P"], + [28366, 0, "r"], + [28367, 0, "o"], + [28368, 0, "o"], + [28369, 0, "f"], + [28370, 0, "\\"], + [28371, 0, "p"], + [28372, 0, "r"], + [28373, 0, "o"], + [28374, 0, "o"], + [28375, 0, "f"], + [28376, 0, "S"], + [28377, 0, "k"], + [28378, 0, "i"], + [28379, 0, "p"], + [28380, 0, "A"], + [28381, 0, "m"], + [28382, 0, "o"], + [28383, 0, "u"], + [28384, 0, "n"], + [28385, 0, "t"], + [28400, 1], + [28399, 1], + [28398, 1], + [28397, 1], + [28396, 1], + [28395, 1], + [28394, 1], + [28393, 1], + [28392, 1], + [28391, 1], + [28390, 1], + [28389, 1], + [28388, 1], + [28388, 0, "e"], + [28389, 0, "n"], + [28390, 0, "d"], + [28391, 0, "{"], + [28392, 0, "c"], + [28393, 0, "e"], + [28394, 0, "n"], + [28395, 0, "t"], + [28396, 0, "e"], + [28397, 0, "r"], + [28398, 0, "}"], + [28399, 0, "\n"], + [28400, 0, "\n"], + [28401, 0, "\\"], + [28402, 0, "b"], + [28403, 0, "e"], + [28404, 0, "g"], + [28405, 0, "i"], + [28406, 0, "n"], + [28407, 0, "{"], + [28408, 0, "p"], + [28409, 0, "r"], + [28410, 0, "o"], + [28411, 0, "o"], + [28412, 0, "f"], + [28413, 0, "t"], + [28414, 0, "r"], + [28415, 0, "e"], + [28416, 0, "e"], + [28417, 0, "}"], + [28418, 0, "\n"], + [28419, 0, "\\"], + [28420, 0, "e"], + [28421, 0, "n"], + [28422, 0, "d"], + [28423, 0, "{"], + [28424, 0, "p"], + [28425, 0, "r"], + [28426, 0, "o"], + [28427, 0, "o"], + [28428, 0, "f"], + [28429, 0, "t"], + [28430, 0, "r"], + [28431, 0, "e"], + [28432, 0, "e"], + [28433, 0, "}"], + [28418, 0, "\n"], + [28419, 0, "\\"], + [28420, 0, "A"], + [28421, 0, "x"], + [28422, 0, "i"], + [28423, 0, "o"], + [28424, 0, "m"], + [28425, 0, "C"], + [28426, 0, "{"], + [28427, 0, "$"], + [28428, 0, "k"], + [28429, 0, "_"], + [28430, 0, "\\"], + [28431, 0, "m"], + [28432, 0, "a"], + [28433, 0, "t"], + [28434, 0, "h"], + [28435, 0, "i"], + [28436, 0, "t"], + [28437, 0, "{"], + [28438, 0, "t"], + [28439, 0, "a"], + [28440, 0, "g"], + [28441, 0, "}"], + [28442, 0, " "], + [28443, 0, "\\"], + [28444, 0, "i"], + [28445, 0, "n"], + [28446, 0, " "], + [28447, 0, "\\"], + [28448, 0, "{"], + [28449, 0, "\\"], + [28450, 0, "m"], + [28451, 0, "a"], + [28452, 0, "t"], + [28453, 0, "h"], + [28454, 0, "s"], + [28455, 0, "f"], + [28456, 0, "{"], + [28457, 0, "m"], + [28458, 0, "a"], + [28459, 0, "p"], + [28460, 0, "T"], + [28461, 0, "}"], + [28462, 0, "("], + [28463, 0, "k"], + [28464, 0, ")"], + [28465, 0, ","], + [28466, 0, " "], + [28467, 0, "\\"], + [28468, 0, "m"], + [28469, 0, "a"], + [28470, 0, "t"], + [28471, 0, "h"], + [28472, 0, "s"], + [28473, 0, "f"], + [28474, 0, "{"], + [28475, 0, "l"], + [28476, 0, "i"], + [28477, 0, "s"], + [28478, 0, "t"], + [28479, 0, "T"], + [28480, 0, "}"], + [28481, 0, "("], + [28482, 0, "k"], + [28483, 0, ")"], + [28484, 0, ","], + [28485, 0, " "], + [28486, 0, "\\"], + [28487, 0, "m"], + [28488, 0, "a"], + [28489, 0, "t"], + [28490, 0, "h"], + [28491, 0, "s"], + [28492, 0, "f"], + [28493, 0, "("], + [28493, 1], + [28493, 0, "{"], + [28494, 0, "r"], + [28495, 0, "e"], + [28496, 0, "g"], + [28497, 0, "T"], + [28498, 0, "}"], + [28499, 0, "("], + [28500, 0, "k"], + [28501, 0, ")"], + [28502, 0, "\\"], + [28503, 0, "}"], + [28504, 0, "$"], + [28505, 0, "}"], + [28506, 0, "\n"], + [28507, 0, "\\"], + [28508, 0, "A"], + [28509, 0, "x"], + [28510, 0, "i"], + [28511, 0, "o"], + [28512, 0, "m"], + [28513, 0, "C"], + [28514, 0, "{"], + [28515, 0, "$"], + [28516, 0, "\\"], + [28517, 0, "m"], + [28518, 0, "a"], + [28519, 0, "t"], + [28520, 0, "h"], + [28521, 0, "s"], + [28522, 0, "f"], + [28523, 0, "{"], + [28524, 0, "p"], + [28525, 0, "r"], + [28526, 0, "e"], + [28527, 0, "s"], + [28528, 0, "}"], + [28529, 0, "("], + [28530, 0, "k"], + [28531, 0, ")"], + [28532, 0, " "], + [28533, 0, "\\"], + [28534, 0, "n"], + [28535, 0, "o"], + [28536, 0, "t"], + [28537, 0, "i"], + [28538, 0, "n"], + [28539, 0, " "], + [28540, 0, "\\"], + [28541, 0, "m"], + [28542, 0, "a"], + [28543, 0, "t"], + [28544, 0, "h"], + [28545, 0, "r"], + [28546, 0, "m"], + [28547, 0, "{"], + [28548, 0, "d"], + [28549, 0, "o"], + [28550, 0, "m"], + [28551, 0, "}"], + [28552, 0, "{"], + [28552, 1], + [28552, 0, "("], + [28553, 0, "\\"], + [28554, 0, "m"], + [28555, 0, "a"], + [28556, 0, "t"], + [28557, 0, "h"], + [28558, 0, "i"], + [28559, 0, "t"], + [28560, 0, "{"], + [28561, 0, "c"], + [28562, 0, "t"], + [28563, 0, "x"], + [28564, 0, "}"], + [28565, 0, ")"], + [28566, 0, "$"], + [28567, 0, "}"], + [28568, 0, "\n"], + [28569, 0, "\\"], + [28570, 0, "L"], + [28571, 0, "e"], + [28572, 0, "f"], + [28573, 0, "t"], + [28574, 0, "L"], + [28575, 0, "a"], + [28576, 0, "b"], + [28577, 0, "e"], + [28578, 0, "l"], + [28579, 0, "{"], + [28580, 0, "$"], + [28581, 0, "\\"], + [28582, 0, "t"], + [28583, 0, "e"], + [28584, 0, "x"], + [28585, 0, "t"], + [28586, 0, "s"], + [28587, 0, "c"], + [28588, 0, "{"], + [28589, 0, "A"], + [28590, 0, "d"], + [28591, 0, "d"], + [28592, 0, "-"], + [28593, 0, "I"], + [28594, 0, "D"], + [28595, 0, "-"], + [28595, 1], + [28595, 0, "}"], + [28596, 0, "_"], + [28597, 0, "1"], + [28598, 0, "$"], + [28599, 0, "}"], + [28600, 0, "\n"], + [28601, 0, "\\"], + [28602, 0, "B"], + [28603, 0, "i"], + [28604, 0, "n"], + [28605, 0, "a"], + [28606, 0, "r"], + [28607, 0, "y"], + [28608, 0, "I"], + [28609, 0, "n"], + [28610, 0, "f"], + [28611, 0, "C"], + [28612, 0, "{"], + [28613, 0, "$"], + [28614, 0, "\\"], + [28615, 0, "m"], + [28616, 0, "a"], + [28617, 0, "t"], + [28618, 0, "h"], + [28619, 0, "i"], + [28620, 0, "t"], + [28621, 0, "{"], + [28622, 0, "c"], + [28623, 0, "t"], + [28624, 0, "x"], + [28625, 0, "}"], + [28626, 0, ","], + [28627, 0, "\\"], + [28628, 0, ","], + [28629, 0, " "], + [28630, 0, "\\"], + [28631, 0, "m"], + [28632, 0, "a"], + [28633, 0, "t"], + [28634, 0, "h"], + [28635, 0, "s"], + [28636, 0, "f"], + [28637, 0, "{"], + [28638, 0, "a"], + [28639, 0, "d"], + [28640, 0, "d"], + [28641, 0, "I"], + [28642, 0, "d"], + [28643, 0, "}"], + [28644, 0, "("], + [28645, 0, "k"], + [28646, 0, "_"], + [28647, 0, "\\"], + [28648, 0, "m"], + [28649, 0, "a"], + [28650, 0, "t"], + [28651, 0, "h"], + [28652, 0, "i"], + [28653, 0, "t"], + [28654, 0, "{"], + [28655, 0, "t"], + [28656, 0, "a"], + [28657, 0, "g"], + [28658, 0, "}"], + [28659, 0, ","], + [28660, 0, " "], + [28661, 0, "\\"], + [28662, 0, "m"], + [28663, 0, "a"], + [28664, 0, "t"], + [28665, 0, "h"], + [28666, 0, "i"], + [28667, 0, "t"], + [28668, 0, "{"], + [28669, 0, "i"], + [28670, 0, "d"], + [28671, 0, "}"], + [28672, 0, ")"], + [28673, 0, " "], + [28674, 0, "\\"], + [28675, 0, "e"], + [28676, 0, "v"], + [28677, 0, "a"], + [28678, 0, "l"], + [28679, 0, "t"], + [28680, 0, "o"], + [28681, 0, "\n"], + [28682, 0, " "], + [28683, 0, " "], + [28684, 0, " "], + [28685, 0, " "], + [28686, 0, "\\"], + [28687, 0, "m"], + [28688, 0, "a"], + [28689, 0, "t"], + [28690, 0, "h"], + [28691, 0, "i"], + [28692, 0, "t"], + [28693, 0, "{"], + [28694, 0, "c"], + [28695, 0, "t"], + [28696, 0, "x"], + [28697, 0, "}"], + [28698, 0, "["], + [28699, 0, "\\"], + [28700, 0, ","], + [28701, 0, " "], + [28702, 0, "\\"], + [28703, 0, "m"], + [28704, 0, "a"], + [28705, 0, "t"], + [28706, 0, "h"], + [28707, 0, "s"], + [28708, 0, "f"], + [28709, 0, "{"], + [28710, 0, "p"], + [28711, 0, "r"], + [28712, 0, "e"], + [28713, 0, "s"], + [28714, 0, "}"], + [28715, 0, "("], + [28716, 0, "k"], + [28717, 0, ")"], + [28718, 0, " "], + [28719, 0, "\\"], + [28720, 0, ","], + [28721, 0, "\\"], + [28722, 0, "m"], + [28723, 0, "a"], + [28724, 0, "p"], + [28725, 0, "s"], + [28726, 0, "t"], + [28727, 0, "o"], + [28728, 0, "\\"], + [28729, 0, ","], + [28730, 0, " "], + [28731, 0, "\\"], + [28732, 0, "{"], + [28733, 0, "\\"], + [28734, 0, "m"], + [28735, 0, "a"], + [28736, 0, "t"], + [28737, 0, "h"], + [28738, 0, "i"], + [28739, 0, "t"], + [28740, 0, "{"], + [28741, 0, "i"], + [28742, 0, "d"], + [28743, 0, "}"], + [28744, 0, "\\"], + [28745, 0, "}"], + [28746, 0, " "], + [28747, 0, "\\"], + [28748, 0, ","], + [28749, 0, "]"], + [28750, 0, "$"], + [28751, 0, "}"], + [28768, 0, "\n"], + [28769, 0, "\n"], + [28770, 0, "\\"], + [28771, 0, "b"], + [28772, 0, "e"], + [28773, 0, "g"], + [28774, 0, "i"], + [28775, 0, "n"], + [28776, 0, "{"], + [28777, 0, "p"], + [28778, 0, "r"], + [28779, 0, "o"], + [28780, 0, "o"], + [28781, 0, "f"], + [28782, 0, "t"], + [28783, 0, "r"], + [28784, 0, "e"], + [28785, 0, "e"], + [28786, 0, "}"], + [28787, 0, "\n"], + [28788, 0, "\\"], + [28789, 0, "e"], + [28790, 0, "n"], + [28791, 0, "d"], + [28792, 0, "{"], + [28793, 0, "p"], + [28794, 0, "r"], + [28795, 0, "o"], + [28796, 0, "o"], + [28797, 0, "f"], + [28798, 0, "t"], + [28799, 0, "r"], + [28800, 0, "e"], + [28801, 0, "e"], + [28802, 0, "}"], + [28787, 0, "\n"], + [28788, 0, "\\"], + [28789, 0, "A"], + [28790, 0, "x"], + [28791, 0, "i"], + [28792, 0, "o"], + [28793, 0, "m"], + [28794, 0, "C"], + [28795, 0, "{"], + [28796, 0, "$"], + [28797, 0, "k"], + [28798, 0, "_"], + [28799, 0, "\\"], + [28800, 0, "m"], + [28801, 0, "a"], + [28802, 0, "t"], + [28803, 0, "h"], + [28804, 0, "i"], + [28805, 0, "t"], + [28806, 0, "{"], + [28807, 0, "t"], + [28808, 0, "a"], + [28809, 0, "g"], + [28810, 0, "}"], + [28811, 0, " "], + [28812, 0, "\\"], + [28813, 0, "i"], + [28814, 0, "n"], + [28815, 0, " "], + [28816, 0, "\\"], + [28817, 0, "{"], + [28818, 0, "m"], + [28818, 1], + [28818, 0, "\\"], + [28819, 0, "m"], + [28820, 0, "a"], + [28821, 0, "t"], + [28822, 0, "h"], + [28823, 0, "s"], + [28824, 0, "f"], + [28825, 0, "{"], + [28826, 0, "m"], + [28827, 0, "a"], + [28828, 0, "p"], + [28829, 0, "T"], + [28830, 0, "}"], + [28831, 0, "("], + [28832, 0, "k"], + [28833, 0, ")"], + [28834, 0, ","], + [28835, 0, " "], + [28836, 0, "\\"], + [28837, 0, "m"], + [28838, 0, "a"], + [28839, 0, "t"], + [28840, 0, "h"], + [28841, 0, "s"], + [28842, 0, "f"], + [28843, 0, "{"], + [28844, 0, "l"], + [28845, 0, "i"], + [28846, 0, "s"], + [28847, 0, "t"], + [28848, 0, "T"], + [28849, 0, "}"], + [28850, 0, "("], + [28851, 0, "k"], + [28852, 0, ")"], + [28853, 0, ","], + [28854, 0, " "], + [28855, 0, "\\"], + [28856, 0, "m"], + [28857, 0, "a"], + [28858, 0, "t"], + [28859, 0, "h"], + [28860, 0, "s"], + [28861, 0, "f"], + [28862, 0, "{"], + [28863, 0, "r"], + [28864, 0, "e"], + [28865, 0, "g"], + [28866, 0, "T"], + [28867, 0, "}"], + [28868, 0, "("], + [28869, 0, "k"], + [28870, 0, ")"], + [28871, 0, "\\"], + [28872, 0, "}"], + [28873, 0, "$"], + [28874, 0, "}"], + [28875, 0, "\n"], + [28876, 0, "\\"], + [28877, 0, "A"], + [28878, 0, "x"], + [28879, 0, "i"], + [28880, 0, "o"], + [28881, 0, "m"], + [28882, 0, "C"], + [28883, 0, "{"], + [28884, 0, "$"], + [28885, 0, "\\"], + [28886, 0, "m"], + [28887, 0, "a"], + [28888, 0, "t"], + [28889, 0, "h"], + [28890, 0, "s"], + [28891, 0, "f"], + [28892, 0, "{"], + [28893, 0, "p"], + [28894, 0, "r"], + [28895, 0, "e"], + [28896, 0, "s"], + [28897, 0, "}"], + [28898, 0, "("], + [28899, 0, "k"], + [28900, 0, ")"], + [28901, 0, " "], + [28902, 0, "\\"], + [28903, 0, "i"], + [28904, 0, "n"], + [28905, 0, " "], + [28906, 0, "\\"], + [28907, 0, "m"], + [28908, 0, "a"], + [28909, 0, "t"], + [28910, 0, "h"], + [28911, 0, "r"], + [28912, 0, "m"], + [28913, 0, "{"], + [28914, 0, "d"], + [28915, 0, "o"], + [28916, 0, "m"], + [28917, 0, "}"], + [28918, 0, "("], + [28919, 0, "\\"], + [28920, 0, "m"], + [28921, 0, "a"], + [28922, 0, "t"], + [28923, 0, "h"], + [28924, 0, "i"], + [28925, 0, "t"], + [28926, 0, "{"], + [28927, 0, "c"], + [28928, 0, "t"], + [28929, 0, "x"], + [28930, 0, "}"], + [28931, 0, "("], + [28931, 1], + [28931, 0, ")"], + [28932, 0, "$"], + [28933, 0, "}"], + [28934, 0, "\n"], + [28935, 0, "\\"], + [28936, 0, "L"], + [28937, 0, "e"], + [28938, 0, "f"], + [28939, 0, "t"], + [28940, 0, "L"], + [28941, 0, "a"], + [28942, 0, "b"], + [28943, 0, "e"], + [28944, 0, "l"], + [28945, 0, "{"], + [28946, 0, "$"], + [28947, 0, "\\"], + [28948, 0, "t"], + [28949, 0, "e"], + [28950, 0, "x"], + [28951, 0, "t"], + [28952, 0, "s"], + [28953, 0, "c"], + [28954, 0, "{"], + [28955, 0, "A"], + [28956, 0, "d"], + [28957, 0, "d"], + [28958, 0, "-"], + [28959, 0, "I"], + [28960, 0, "D"], + [28961, 0, "}"], + [28962, 0, "_"], + [28963, 0, "2"], + [28964, 0, "$"], + [28965, 0, "}"], + [28966, 0, "\n"], + [28967, 0, "\\"], + [28968, 0, "B"], + [28969, 0, "i"], + [28970, 0, "n"], + [28971, 0, "a"], + [28972, 0, "r"], + [28973, 0, "y"], + [28974, 0, "I"], + [28975, 0, "n"], + [28976, 0, "f"], + [28977, 0, "C"], + [28978, 0, "{"], + [28979, 0, "$"], + [28980, 0, "\\"], + [28981, 0, "m"], + [28982, 0, "a"], + [28983, 0, "t"], + [28984, 0, "h"], + [28985, 0, "i"], + [28986, 0, "t"], + [28987, 0, "{"], + [28988, 0, "c"], + [28989, 0, "t"], + [28990, 0, "x"], + [28991, 0, ","], + [28991, 1], + [28991, 0, "}"], + [28992, 0, ","], + [28993, 0, "\\"], + [28994, 0, ","], + [28995, 0, " "], + [28996, 0, "\\"], + [28997, 0, "m"], + [28998, 0, "a"], + [28999, 0, "t"], + [29000, 0, "h"], + [29001, 0, "i"], + [29001, 1], + [29001, 0, "s"], + [29002, 0, "f"], + [29003, 0, "{"], + [29004, 0, "a"], + [29005, 0, "d"], + [29006, 0, "d"], + [29007, 0, "I"], + [29008, 0, "d"], + [29009, 0, "}"], + [29010, 0, "("], + [29011, 0, "k"], + [29012, 0, "_"], + [29013, 0, "\\"], + [29014, 0, "m"], + [29015, 0, "a"], + [29016, 0, "t"], + [29017, 0, "h"], + [29018, 0, "i"], + [29019, 0, "t"], + [29020, 0, "{"], + [29021, 0, "t"], + [29022, 0, "a"], + [29023, 0, "g"], + [29024, 0, "}"], + [29025, 0, ","], + [29026, 0, " "], + [29027, 0, "\\"], + [29028, 0, "m"], + [29029, 0, "a"], + [29030, 0, "t"], + [29031, 0, "h"], + [29032, 0, "i"], + [29033, 0, "t"], + [29034, 0, "{"], + [29035, 0, "i"], + [29036, 0, "d"], + [29037, 0, "}"], + [29038, 0, ")"], + [29039, 0, " "], + [29040, 0, "\\"], + [29041, 0, "e"], + [29042, 0, "v"], + [29043, 0, "a"], + [29044, 0, "l"], + [29045, 0, "t"], + [29046, 0, "o"], + [29047, 0, "\n"], + [29048, 0, " "], + [29049, 0, " "], + [29050, 0, " "], + [29051, 0, " "], + [29052, 0, "\\"], + [29053, 0, "m"], + [29054, 0, "a"], + [29055, 0, "t"], + [29056, 0, "h"], + [29057, 0, "i"], + [29058, 0, "t"], + [29059, 0, "{"], + [29060, 0, "c"], + [29061, 0, "t"], + [29062, 0, "x"], + [29063, 0, "}"], + [29064, 0, "["], + [29065, 0, "\\"], + [29066, 0, ","], + [29067, 0, " "], + [29068, 0, "\\"], + [29069, 0, "m"], + [29070, 0, "a"], + [29071, 0, "t"], + [29072, 0, "h"], + [29073, 0, "s"], + [29074, 0, "f"], + [29075, 0, "{"], + [29076, 0, "p"], + [29077, 0, "r"], + [29078, 0, "e"], + [29079, 0, "s"], + [29080, 0, "}"], + [29081, 0, "("], + [29082, 0, "k"], + [29083, 0, ")"], + [29084, 0, " "], + [29085, 0, "\\"], + [29086, 0, ","], + [29087, 0, "\\"], + [29088, 0, "m"], + [29089, 0, "a"], + [29090, 0, "p"], + [29091, 0, "s"], + [29092, 0, "t"], + [29093, 0, "o"], + [29094, 0, "\\"], + [29095, 0, ","], + [29096, 0, " "], + [29097, 0, "\\"], + [29098, 0, "m"], + [29099, 0, "a"], + [29100, 0, "t"], + [29101, 0, "h"], + [29102, 0, "i"], + [29103, 0, "t"], + [29104, 0, "{"], + [29105, 0, "c"], + [29106, 0, "t"], + [29107, 0, "x"], + [29108, 0, "}"], + [29109, 0, "("], + [29110, 0, "\\"], + [29111, 0, "m"], + [29112, 0, "a"], + [29113, 0, "t"], + [29114, 0, "h"], + [29115, 0, "s"], + [29116, 0, "f"], + [29117, 0, "{"], + [29118, 0, "p"], + [29119, 0, "r"], + [29120, 0, "e"], + [29121, 0, "s"], + [29122, 0, "}"], + [29123, 0, "("], + [29124, 0, "k"], + [29125, 0, ")"], + [29126, 0, ")"], + [29127, 0, " "], + [29128, 0, "\\"], + [29129, 0, "c"], + [29130, 0, "u"], + [29131, 0, "p"], + [29132, 0, " "], + [29133, 0, "\\"], + [29134, 0, "{"], + [29135, 0, "\\"], + [29136, 0, "m"], + [29137, 0, "a"], + [29138, 0, "t"], + [29139, 0, "h"], + [29140, 0, "i"], + [29141, 0, "t"], + [29142, 0, "{"], + [29143, 0, "i"], + [29144, 0, "d"], + [29145, 0, "}"], + [29146, 0, "\\"], + [29147, 0, "}"], + [29148, 0, " "], + [29149, 0, "\\"], + [29150, 0, ","], + [29151, 0, "]"], + [29152, 0, "$"], + [29153, 0, "}"], + [29128, 0, "\\"], + [29129, 0, ","], + [29134, 0, "\\"], + [29135, 0, ","], + [29347, 1], + [29334, 1], + [29333, 1], + [29332, 1], + [29331, 1], + [29330, 1], + [29329, 1], + [29328, 1], + [29327, 1], + [29326, 1], + [29325, 1], + [29324, 1], + [29323, 1], + [29322, 1], + [29321, 1], + [29320, 1], + [29319, 1], + [29318, 1], + [29317, 1], + [29316, 1], + [29315, 1], + [29314, 1], + [29313, 1], + [29312, 1], + [29311, 1], + [29310, 1], + [29309, 1], + [29308, 1], + [29307, 1], + [29306, 1], + [29305, 1], + [29304, 1], + [29303, 1], + [29302, 1], + [29301, 1], + [29313, 0, "\\"], + [29314, 0, ","], + [29314, 1], + [29313, 1], + [29313, 0, ","], + [29314, 0, "\\"], + [29315, 0, ","], + [29316, 0, " "], + [29317, 0, "\\"], + [29318, 0, "m"], + [29319, 0, "a"], + [29320, 0, "t"], + [29321, 0, "h"], + [29322, 0, "s"], + [29323, 0, "f"], + [29324, 0, "{"], + [29325, 0, "c"], + [29326, 0, "l"], + [29327, 0, "e"], + [29328, 0, "a"], + [29329, 0, "r"], + [29330, 0, "}"], + [29331, 0, "("], + [29332, 0, "\\"], + [29333, 0, "m"], + [29334, 0, "a"], + [29335, 0, "t"], + [29336, 0, "h"], + [29337, 0, "i"], + [29338, 0, "t"], + [29339, 0, "{"], + [29340, 0, "d"], + [29341, 0, "e"], + [29342, 0, "p"], + [29343, 0, "s"], + [29344, 0, "}"], + [29345, 0, ","], + [29346, 0, " "], + [29347, 0, "\\"], + [29348, 0, "m"], + [29349, 0, "a"], + [29350, 0, "t"], + [29351, 0, "h"], + [29352, 0, "s"], + [29353, 0, "f"], + [29354, 0, "{"], + [29355, 0, "r"], + [29356, 0, "e"], + [29357, 0, "g"], + [29358, 0, "T"], + [29359, 0, "}"], + [29360, 0, "("], + [29361, 0, "k"], + [29362, 0, ")"], + [29363, 0, ")"], + [29364, 0, " "], + [29365, 0, "\\"], + [29366, 0, "e"], + [29367, 0, "v"], + [29368, 0, "a"], + [29369, 0, "l"], + [29370, 0, "t"], + [29371, 0, "o"], + [29372, 0, " "], + [29373, 0, "\\"], + [29374, 0, "m"], + [29375, 0, "a"], + [29376, 0, "t"], + [29377, 0, "h"], + [29378, 0, "i"], + [29379, 0, "t"], + [29380, 0, "{"], + [29381, 0, "c"], + [29382, 0, "t"], + [29383, 0, "x"], + [29384, 0, "}"], + [29385, 0, "'"], + [29386, 0, ","], + [29387, 0, "\\"], + [29388, 0, ","], + [29389, 0, " "], + [29390, 0, "\\"], + [29391, 0, "m"], + [29392, 0, "a"], + [29393, 0, "t"], + [29394, 0, "h"], + [29395, 0, "i"], + [29396, 0, "t"], + [29397, 0, "{"], + [29398, 0, "p"], + [29399, 0, "r"], + [29400, 0, "e"], + [29401, 0, "s"], + [29402, 0, "}"], + [29626, 1], + [29625, 1], + [29624, 1], + [29623, 1], + [29622, 1], + [29621, 1], + [29620, 1], + [29619, 1], + [29618, 1], + [29617, 1], + [29616, 1], + [29615, 1], + [29614, 1], + [29613, 1], + [29612, 1], + [29611, 1], + [29610, 1], + [29609, 1], + [29608, 1], + [29607, 1], + [29606, 1], + [29605, 1], + [29604, 1], + [29603, 1], + [29602, 1], + [29601, 1], + [29600, 1], + [29599, 1], + [29598, 1], + [29597, 1], + [29596, 1], + [29595, 1], + [29594, 1], + [29593, 1], + [29592, 1], + [29591, 1], + [29590, 1], + [29589, 1], + [29588, 1], + [29587, 1], + [29586, 1], + [29585, 1], + [29584, 1], + [29583, 1], + [29582, 1], + [29581, 1], + [29580, 1], + [29579, 1], + [29578, 1], + [29577, 1], + [29576, 1], + [29575, 1], + [29574, 1], + [29573, 1], + [29572, 1], + [29571, 1], + [29570, 1], + [29569, 1], + [29568, 1], + [29567, 1], + [29566, 1], + [29565, 1], + [29564, 1], + [29563, 1], + [29562, 1], + [29561, 1], + [29560, 1], + [29559, 1], + [29558, 1], + [29557, 1], + [29556, 1], + [29555, 1], + [29554, 1], + [29553, 1], + [29552, 1], + [29551, 1], + [29550, 1], + [29549, 1], + [29548, 1], + [29547, 1], + [29546, 1], + [29545, 1], + [29544, 1], + [29543, 1], + [29542, 1], + [29541, 1], + [29540, 1], + [29539, 1], + [29538, 1], + [29537, 1], + [29536, 1], + [29535, 1], + [29534, 1], + [29533, 1], + [29532, 1], + [29531, 1], + [29530, 1], + [29529, 1], + [29528, 1], + [29527, 1], + [29526, 1], + [29525, 1], + [29524, 1], + [29523, 1], + [29522, 1], + [29521, 1], + [29520, 1], + [29519, 1], + [29518, 1], + [29517, 1], + [29516, 1], + [29515, 1], + [29514, 1], + [29513, 1], + [29512, 1], + [29511, 1], + [29510, 1], + [29509, 1], + [29508, 1], + [29507, 1], + [29506, 1], + [29505, 1], + [29504, 1], + [29503, 1], + [29502, 1], + [29501, 1], + [29500, 1], + [29499, 1], + [29498, 1], + [29497, 1], + [29496, 1], + [29495, 1], + [29494, 1], + [29493, 1], + [29492, 1], + [29491, 1], + [29490, 1], + [29489, 1], + [29488, 1], + [29487, 1], + [29486, 1], + [29485, 1], + [29484, 1], + [29483, 1], + [29482, 1], + [29481, 1], + [29480, 1], + [29479, 1], + [29478, 1], + [29477, 1], + [29476, 1], + [29475, 1], + [29474, 1], + [29473, 1], + [29472, 1], + [29471, 1], + [29470, 1], + [29469, 1], + [29468, 1], + [29467, 1], + [29466, 1], + [29465, 1], + [29464, 1], + [29463, 1], + [29462, 1], + [29461, 1], + [29460, 1], + [29459, 1], + [29458, 1], + [29457, 1], + [29456, 1], + [29455, 1], + [29454, 1], + [29453, 1], + [29452, 1], + [29451, 1], + [29450, 1], + [29449, 1], + [29448, 1], + [29447, 1], + [29446, 1], + [29445, 1], + [29444, 1], + [29443, 1], + [29442, 1], + [29441, 1], + [29440, 1], + [29439, 1], + [29438, 1], + [29437, 1], + [29436, 1], + [29435, 1], + [29434, 1], + [29433, 1], + [29432, 1], + [29431, 1], + [29430, 1], + [29429, 1], + [29428, 1], + [29427, 1], + [29426, 1], + [29425, 1], + [29424, 1], + [29423, 1], + [29422, 1], + [29421, 1], + [29420, 1], + [29419, 1], + [29418, 1], + [29417, 1], + [29416, 1], + [29415, 1], + [29415, 1], + [29415, 0, "\\"], + [29416, 0, "m"], + [29417, 0, "a"], + [29418, 0, "t"], + [29419, 0, "h"], + [29420, 0, "i"], + [29421, 0, "t"], + [29422, 0, "{"], + [29423, 0, "c"], + [29424, 0, "t"], + [29425, 0, "x"], + [29426, 0, "}"], + [29427, 0, "'"], + [29428, 0, ","], + [29429, 0, " "], + [29430, 0, "\\"], + [29431, 0, "m"], + [29432, 0, "a"], + [29433, 0, "t"], + [29434, 0, "h"], + [29435, 0, "s"], + [29436, 0, "f"], + [29437, 0, "{"], + [29438, 0, "a"], + [29439, 0, "d"], + [29440, 0, "d"], + [29441, 0, "I"], + [29442, 0, "d"], + [29443, 0, "}"], + [29444, 0, "("], + [29445, 0, "\\"], + [29446, 0, "m"], + [29447, 0, "a"], + [29448, 0, "t"], + [29449, 0, "h"], + [29450, 0, "s"], + [29451, 0, "f"], + [29452, 0, "{"], + [29453, 0, "r"], + [29454, 0, "e"], + [29455, 0, "g"], + [29456, 0, "T"], + [29457, 0, "}"], + [29458, 0, "("], + [29459, 0, "k"], + [29460, 0, ")"], + [29461, 0, ","], + [29462, 0, " "], + [29463, 0, "\\"], + [29464, 0, "m"], + [29465, 0, "a"], + [29466, 0, "t"], + [29467, 0, "h"], + [29468, 0, "i"], + [29469, 0, "t"], + [29470, 0, "{"], + [29471, 0, "i"], + [29472, 0, "d"], + [29473, 0, "}"], + [29474, 0, ")"], + [29475, 0, " "], + [29476, 0, "\\"], + [29477, 0, "e"], + [29478, 0, "v"], + [29479, 0, "a"], + [29480, 0, "l"], + [29481, 0, "t"], + [29482, 0, "o"], + [29483, 0, " "], + [29484, 0, "\\"], + [29485, 0, "m"], + [29486, 0, "a"], + [29487, 0, "t"], + [29488, 0, "h"], + [29489, 0, "i"], + [29490, 0, "t"], + [29491, 0, "{"], + [29492, 0, "c"], + [29493, 0, "t"], + [29494, 0, "x"], + [29495, 0, "}"], + [29496, 0, "'"], + [29497, 0, "'"], + [29500, 0, "\n"], + [29501, 0, "\\"], + [29502, 0, "A"], + [29503, 0, "x"], + [29504, 0, "i"], + [29505, 0, "o"], + [29506, 0, "m"], + [29507, 0, "C"], + [29508, 0, "{"], + [29509, 0, "$"], + [29510, 0, "\\"], + [29511, 0, "m"], + [29512, 0, "a"], + [29513, 0, "t"], + [29514, 0, "h"], + [29515, 0, "i"], + [29516, 0, "t"], + [29517, 0, "{"], + [29518, 0, "c"], + [29519, 0, "t"], + [29520, 0, "x"], + [29521, 0, "}"], + [29522, 0, "'"], + [29523, 0, "'"], + [29524, 0, ","], + [29525, 0, " "], + [29526, 0, "\\"], + [29527, 0, "m"], + [29528, 0, "a"], + [29529, 0, "t"], + [29530, 0, "h"], + [29531, 0, "s"], + [29532, 0, "f"], + [29533, 0, "{"], + [29534, 0, "r"], + [29535, 0, "e"], + [29536, 0, "g"], + [29537, 0, "T"], + [29538, 0, "}"], + [29539, 0, "("], + [29540, 0, "k"], + [29541, 0, ")"], + [29542, 0, " "], + [29543, 0, "\\"], + [29544, 0, "e"], + [29545, 0, "v"], + [29546, 0, "a"], + [29547, 0, "l"], + [29548, 0, "t"], + [29549, 0, "o"], + [29550, 0, " "], + [29551, 0, "\\"], + [29552, 0, "m"], + [29553, 0, "a"], + [29554, 0, "t"], + [29555, 0, "h"], + [29556, 0, "i"], + [29557, 0, "t"], + [29558, 0, "{"], + [29559, 0, "c"], + [29560, 0, "h"], + [29561, 0, "i"], + [29562, 0, "l"], + [29563, 0, "d"], + [29564, 0, "}"], + [29565, 0, "$"], + [29566, 0, "}"], + [29597, 1], + [29596, 1], + [29595, 1], + [29579, 1], + [29763, 0, "'"], + [29764, 0, "'"], + [29819, 1], + [29818, 1], + [29817, 1], + [29816, 1], + [29815, 1], + [29814, 1], + [29813, 1], + [29812, 1], + [29811, 1], + [29811, 0, "h"], + [29812, 0, "i"], + [29813, 0, "l"], + [29814, 0, "d"], + [29597, 1], + [29597, 1], + [29597, 1], + [29597, 0, "Q"], + [29598, 0, "u"], + [29599, 0, "a"], + [29600, 0, "t"], + [29601, 0, "e"], + [29602, 0, "r"], + [34445, 1], + [34439, 0, "s"], + [34440, 0, "i"], + [34441, 0, "d"], + [34442, 0, "e"], + [34443, 0, "w"], + [34444, 0, "a"], + [34445, 0, "y"], + [34446, 0, "s"], + [26928, 0, "s"], + [26929, 0, "i"], + [26930, 0, "d"], + [26931, 0, "e"], + [26932, 0, "w"], + [26933, 0, "a"], + [26934, 0, "y"], + [26935, 0, "s"], + [26942, 1], + [253, 0, "\n"], + [254, 0, "\\"], + [255, 0, "u"], + [256, 0, "s"], + [257, 0, "e"], + [258, 0, "p"], + [259, 0, "a"], + [260, 0, "c"], + [261, 0, "k"], + [262, 0, "a"], + [263, 0, "g"], + [264, 0, "e"], + [265, 0, "{"], + [266, 0, "r"], + [267, 0, "o"], + [268, 0, "t"], + [269, 0, "a"], + [270, 0, "t"], + [271, 0, "i"], + [272, 0, "n"], + [273, 0, "g"], + [274, 0, "}"], + [275, 0, " "], + [276, 0, "$"], + [276, 1], + [276, 0, "%"], + [277, 0, " "], + [278, 0, "s"], + [279, 0, "i"], + [280, 0, "d"], + [281, 0, "e"], + [282, 0, "w"], + [283, 0, "a"], + [284, 0, "y"], + [285, 0, "s"], + [286, 0, "f"], + [287, 0, "i"], + [288, 0, "g"], + [289, 0, "u"], + [290, 0, "r"], + [291, 0, "e"], + [292, 0, " "], + [292, 1], + [497, 1], + [496, 1], + [495, 1], + [494, 1], + [493, 1], + [493, 0, "t"], + [494, 0, "r"], + [495, 0, "u"], + [496, 0, "e"], + [496, 1], + [495, 1], + [494, 1], + [493, 1], + [493, 0, "f"], + [494, 0, "a"], + [495, 0, "l"], + [496, 0, "s"], + [497, 0, "e"], + [20303, 0, " "], + [20304, 0, "&"], + [20305, 0, "&"], + [20306, 0, " "], + [20307, 0, "v"], + [20308, 0, ":"], + [20309, 0, " "], + [20310, 0, "\\"], + [20311, 0, "m"], + [20312, 0, "a"], + [20313, 0, "t"], + [20314, 0, "h"], + [20315, 0, "r"], + [20316, 0, "m"], + [20317, 0, "{"], + [20318, 0, "V"], + [20319, 0, "A"], + [20320, 0, "R"], + [20321, 0, "}"], + [19990, 1], + [19990, 0, "3"], + [20320, 1], + [20320, 0, "L"], + [20307, 0, "\\"], + [20308, 0, "u"], + [20309, 0, "q"], + [20310, 0, "d"], + [20311, 0, " "], + [20310, 1], + [20309, 1], + [20308, 1], + [20308, 0, "q"], + [20309, 0, "u"], + [20310, 0, "a"], + [20311, 0, "d"], + [18635, 0, " "], + [18636, 0, "\\"], + [18637, 0, "i"], + [18638, 0, "n"], + [18639, 0, " "], + [18640, 0, "\\"], + [18641, 0, "m"], + [18642, 0, "a"], + [18643, 0, "t"], + [18644, 0, "h"], + [18645, 0, "r"], + [18646, 0, "m"], + [18647, 0, "{"], + [18648, 0, "P"], + [18649, 0, "e"], + [18650, 0, "e"], + [18651, 0, "r"], + [18652, 0, "I"], + [18653, 0, "D"], + [18654, 0, "}"], + [18781, 0, " "], + [18782, 0, "\\"], + [18783, 0, "i"], + [18784, 0, "n"], + [18785, 0, " "], + [18786, 0, "\\"], + [18787, 0, "m"], + [18788, 0, "a"], + [18789, 0, "t"], + [18790, 0, "h"], + [18791, 0, "B"], + [18792, 0, "B"], + [18793, 0, "{"], + [18794, 0, "N"], + [18795, 0, "}"], + [18792, 1], + [18791, 1], + [18791, 0, "b"], + [18792, 0, "b"], + [27041, 0, "*"], + [34560, 0, "*"], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 1], + [34462, 0, "c"], + [34463, 0, "l"], + [34464, 0, "e"], + [34465, 0, "a"], + [34466, 0, "r"], + [34467, 0, "i"], + [34468, 0, "n"], + [34469, 0, "g"], + [34470, 0, "}"], + [34471, 0, "\\"], + [34472, 0, "l"], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 1], + [34482, 0, "c"], + [34483, 0, "l"], + [34484, 0, "e"], + [34485, 0, "a"], + [34486, 0, "r"], + [34514, 1], + [31677, 0, "\n"], + [31678, 0, "\\"], + [31679, 0, "c"], + [31680, 0, "a"], + [31681, 0, "p"], + [31682, 0, "t"], + [31683, 0, "i"], + [31684, 0, "o"], + [31685, 0, "n"], + [31686, 0, "{"], + [31687, 0, "R"], + [31688, 0, "u"], + [31689, 0, "l"], + [31690, 0, "e"], + [31691, 0, "s"], + [31692, 0, " "], + [31693, 0, "f"], + [31694, 0, "o"], + [31695, 0, "r"], + [31696, 0, " "], + [31697, 0, "e"], + [31698, 0, "v"], + [31699, 0, "a"], + [31700, 0, "l"], + [31701, 0, "u"], + [31702, 0, "a"], + [31703, 0, "t"], + [31704, 0, "i"], + [31705, 0, "n"], + [31706, 0, "g"], + [31707, 0, " "], + [31708, 0, "o"], + [31709, 0, "p"], + [31710, 0, "e"], + [31711, 0, "r"], + [31712, 0, "a"], + [31713, 0, "t"], + [31714, 0, "i"], + [31715, 0, "o"], + [31716, 0, "n"], + [31717, 0, "s"], + [31718, 0, " "], + [31719, 0, "a"], + [31720, 0, "n"], + [31721, 0, "d"], + [31722, 0, " "], + [31723, 0, "m"], + [31724, 0, "o"], + [31725, 0, "d"], + [31726, 0, "i"], + [31727, 0, "f"], + [31728, 0, "y"], + [31729, 0, "i"], + [31730, 0, "n"], + [31731, 0, "g"], + [31732, 0, " "], + [31733, 0, "d"], + [31734, 0, "o"], + [31735, 0, "c"], + [31736, 0, "u"], + [31737, 0, "m"], + [31738, 0, "e"], + [31739, 0, "n"], + [31740, 0, "t"], + [31741, 0, " "], + [31742, 0, "s"], + [31743, 0, "t"], + [31744, 0, "a"], + [31745, 0, "t"], + [31746, 0, "e"], + [31747, 0, "}"], + [31748, 0, "\\"], + [31749, 0, "l"], + [31750, 0, "a"], + [31751, 0, "b"], + [31752, 0, "e"], + [31753, 0, "l"], + [31754, 0, "{"], + [31755, 0, "f"], + [31756, 0, "i"], + [31757, 0, "g"], + [31758, 0, ":"], + [31759, 0, "o"], + [31760, 0, "p"], + [31761, 0, "e"], + [31762, 0, "r"], + [31763, 0, "a"], + [31764, 0, "t"], + [31765, 0, "i"], + [31766, 0, "o"], + [31767, 0, "n"], + [31768, 0, "-"], + [31769, 0, "r"], + [31770, 0, "u"], + [31771, 0, "l"], + [31772, 0, "e"], + [31773, 0, "s"], + [31774, 0, "}"], + [31775, 0, "\n"], + [31776, 0, "\\"], + [31777, 0, "e"], + [31778, 0, "n"], + [31779, 0, "d"], + [31780, 0, "{"], + [31781, 0, "s"], + [31782, 0, "i"], + [31783, 0, "d"], + [31784, 0, "e"], + [31785, 0, "w"], + [31786, 0, "a"], + [31787, 0, "y"], + [31788, 0, "s"], + [31789, 0, "f"], + [31790, 0, "i"], + [31791, 0, "g"], + [31792, 0, "u"], + [31793, 0, "r"], + [31794, 0, "e"], + [31795, 0, "*"], + [31796, 0, "}"], + [31798, 0, "\n"], + [31799, 0, "\\"], + [31800, 0, "b"], + [31801, 0, "e"], + [31802, 0, "g"], + [31803, 0, "i"], + [31804, 0, "n"], + [31805, 0, "{"], + [31806, 0, "f"], + [31807, 0, "i"], + [31808, 0, "g"], + [31809, 0, "u"], + [31810, 0, "r"], + [31811, 0, "e"], + [31812, 0, "*"], + [31813, 0, "}"], + [34643, 1], + [34642, 1], + [34641, 1], + [34640, 1], + [34639, 1], + [34638, 1], + [34637, 1], + [34636, 1], + [34642, 0, "*"], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27125, 1], + [27184, 1], + [27183, 1], + [27182, 1], + [27285, 0, "$"], + [27286, 0, "}"], + [27306, 1], + [27305, 1], + [27304, 1], + [27303, 1], + [27302, 1], + [27301, 1], + [27300, 1], + [27299, 1], + [27298, 1], + [27297, 1], + [27296, 1], + [27295, 1], + [27294, 1], + [27293, 1], + [27292, 1], + [27291, 1], + [27290, 1], + [27289, 1], + [27288, 1], + [27287, 1], + [27993, 1], + [27992, 1], + [27991, 1], + [27990, 1], + [27989, 1], + [27988, 1], + [27987, 1], + [27986, 1], + [27985, 1], + [27984, 1], + [27983, 1], + [27982, 1], + [27981, 1], + [27980, 1], + [27979, 1], + [27979, 0, "h"], + [27980, 0, "s"], + [27981, 0, "p"], + [27982, 0, "a"], + [27983, 0, "c"], + [27984, 0, "e"], + [27985, 0, "{"], + [27986, 0, "3"], + [27987, 0, "e"], + [27988, 0, "m"], + [27989, 0, "}"], + [28002, 1], + [28001, 1], + [28000, 1], + [27999, 1], + [27998, 1], + [27997, 1], + [27996, 1], + [27995, 1], + [27994, 1], + [27993, 1], + [27992, 1], + [27991, 1], + [27990, 1], + [27991, 0, "%"], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 1], + [27993, 0, "\n"], + [27993, 0, "\\"], + [27994, 0, "b"], + [27995, 0, "e"], + [27996, 0, "g"], + [27997, 0, "i"], + [27998, 0, "n"], + [27999, 0, "{"], + [28000, 0, "c"], + [28001, 0, "e"], + [28002, 0, "n"], + [28003, 0, "t"], + [28004, 0, "e"], + [28005, 0, "r"], + [28006, 0, "}"], + [27991, 1], + [27989, 1], + [27988, 1], + [27987, 1], + [27986, 1], + [27985, 1], + [27984, 1], + [27983, 1], + [27982, 1], + [27981, 1], + [27980, 1], + [27979, 1], + [27979, 0, "p"], + [27980, 0, "r"], + [27981, 0, "o"], + [27982, 0, "o"], + [27983, 0, "f"], + [27984, 0, "S"], + [27985, 0, "k"], + [27986, 0, "i"], + [27987, 0, "p"], + [27988, 0, "A"], + [27989, 0, "m"], + [27990, 0, "o"], + [27991, 0, "u"], + [27992, 0, "n"], + [27993, 0, "t"], + [27994, 0, "\n"], + [27995, 0, "\\"], + [27996, 0, "e"], + [27997, 0, "n"], + [27998, 0, "d"], + [27999, 0, "{"], + [28000, 0, "c"], + [28001, 0, "e"], + [28002, 0, "n"], + [28003, 0, "t"], + [28004, 0, "e"], + [28005, 0, "r"], + [28006, 0, "}"], + [28483, 1], + [28482, 1], + [28481, 1], + [28480, 1], + [28479, 1], + [28478, 1], + [28477, 1], + [28476, 1], + [28475, 1], + [28475, 0, "c"], + [28476, 0, "e"], + [28477, 0, "n"], + [28478, 0, "t"], + [28479, 0, "e"], + [28480, 0, "r"], + [28831, 1], + [28830, 1], + [28829, 1], + [28828, 1], + [28827, 1], + [28826, 1], + [28825, 1], + [28824, 1], + [28823, 1], + [28822, 1], + [28821, 1], + [28820, 1], + [28819, 1], + [28818, 1], + [28818, 0, "D"], + [28819, 0, "i"], + [28820, 0, "s"], + [28821, 0, "p"], + [28822, 0, "l"], + [28823, 0, "a"], + [28824, 0, "y"], + [28825, 0, "P"], + [28826, 0, "r"], + [28827, 0, "o"], + [28828, 0, "o"], + [28829, 0, "f"], + [28830, 0, "\\"], + [28831, 0, "h"], + [28832, 0, "s"], + [28833, 0, "p"], + [28834, 0, "a"], + [28835, 0, "c"], + [28836, 0, "e"], + [28837, 0, "{"], + [28838, 0, "3"], + [28839, 0, "e"], + [28840, 0, "m"], + [28841, 0, "}"], + [28843, 0, "%"], + [28861, 1], + [28860, 1], + [28859, 1], + [28858, 1], + [28857, 1], + [28856, 1], + [28855, 1], + [28854, 1], + [28853, 1], + [28852, 1], + [28851, 1], + [28850, 1], + [28849, 1], + [28848, 1], + [28847, 1], + [28846, 1], + [28845, 1], + [28844, 1], + [29229, 1], + [29228, 1], + [29227, 1], + [29226, 1], + [29225, 1], + [29224, 1], + [29223, 1], + [29222, 1], + [29221, 1], + [29221, 0, "c"], + [29222, 0, "e"], + [29223, 0, "n"], + [29224, 0, "t"], + [29225, 0, "e"], + [29226, 0, "r"], + [29215, 0, "\n"], + [29216, 0, "\\"], + [29217, 0, "D"], + [29218, 0, "i"], + [29219, 0, "s"], + [29220, 0, "p"], + [29221, 0, "l"], + [29222, 0, "a"], + [29223, 0, "y"], + [29224, 0, "P"], + [29225, 0, "r"], + [29226, 0, "o"], + [29227, 0, "o"], + [29228, 0, "f"], + [29229, 0, "\\"], + [29230, 0, "p"], + [29231, 0, "r"], + [29232, 0, "o"], + [29233, 0, "o"], + [29234, 0, "f"], + [29235, 0, "S"], + [29236, 0, "k"], + [29237, 0, "i"], + [29238, 0, "p"], + [29239, 0, "A"], + [29240, 0, "m"], + [29241, 0, "o"], + [29242, 0, "u"], + [29243, 0, "n"], + [29244, 0, "t"], + [28841, 1], + [28840, 1], + [28839, 1], + [28838, 1], + [28837, 1], + [28836, 1], + [28835, 1], + [28834, 1], + [28833, 1], + [28832, 1], + [28832, 0, "f"], + [28833, 0, "i"], + [28834, 0, "l"], + [28835, 0, "l"], + [29657, 0, "$"], + [29673, 0, "_"], + [29674, 0, "1"], + [29675, 0, "$"], + [29675, 1], + [29674, 1], + [29673, 1], + [29657, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 1], + [30301, 0, "\\"], + [30302, 0, "s"], + [30303, 0, "t"], + [30304, 0, "r"], + [30305, 0, "i"], + [30306, 0, "n"], + [30307, 0, "g"], + [30308, 0, "{"], + [30309, 0, "\\"], + [30310, 0, "s"], + [30311, 0, "t"], + [30312, 0, "r"], + [30313, 0, "i"], + [30314, 0, "n"], + [30315, 0, "g"], + [30316, 0, "}"], + [30317, 0, "}"], + [30301, 0, "\\"], + [30302, 0, "t"], + [30303, 0, "e"], + [30304, 0, "x"], + [30305, 0, "t"], + [30306, 0, "t"], + [30307, 0, "t"], + [30308, 0, "{"], + [30171, 1], + [30170, 1], + [30169, 1], + [30167, 1], + [30166, 1], + [30165, 1], + [30164, 1], + [30163, 1], + [30162, 1], + [30162, 0, "E"], + [30163, 0, "m"], + [30164, 0, "p"], + [30165, 0, "t"], + [30166, 0, "y"], + [30167, 0, "-"], + [30168, 0, "M"], + [30169, 0, "a"], + [30170, 0, "p"], + [30153, 1], + [30433, 1], + [30432, 1], + [30431, 1], + [30430, 1], + [30429, 1], + [30428, 1], + [30427, 1], + [30426, 1], + [30425, 1], + [30424, 1], + [30423, 1], + [30422, 1], + [30421, 1], + [30420, 1], + [30419, 1], + [30418, 1], + [30417, 1], + [30416, 1], + [30415, 1], + [30414, 1], + [30413, 1], + [30412, 1], + [30411, 1], + [30410, 1], + [30409, 1], + [30408, 1], + [30407, 1], + [30406, 1], + [30405, 1], + [30404, 1], + [30403, 1], + [30402, 1], + [30401, 1], + [30400, 1], + [30399, 1], + [30398, 1], + [30397, 1], + [30396, 1], + [30395, 1], + [30394, 1], + [30393, 1], + [30392, 1], + [30391, 1], + [30390, 1], + [30389, 1], + [30388, 1], + [30387, 1], + [30386, 1], + [30385, 1], + [30384, 1], + [30383, 1], + [30382, 1], + [30381, 1], + [30380, 1], + [30379, 1], + [30378, 1], + [30378, 0, "p"], + [30379, 0, "s"], + [30380, 0, "t"], + [30381, 0, "o"], + [30382, 0, "\\"], + [30383, 0, ","], + [30384, 0, " "], + [30367, 1], + [30366, 1], + [30365, 1], + [30364, 1], + [30364, 0, "m"], + [30365, 0, "a"], + [30366, 0, "p"], + [30367, 0, "T"], + [30385, 0, "\\"], + [30386, 0, "m"], + [30387, 0, "a"], + [30388, 0, "t"], + [30389, 0, "h"], + [30390, 0, "i"], + [30391, 0, "t"], + [30392, 0, "{"], + [30393, 0, "c"], + [30394, 0, "h"], + [30395, 0, "i"], + [30396, 0, "l"], + [30397, 0, "d"], + [30398, 0, "}"], + [30399, 0, " "], + [30400, 0, "\\"], + [30401, 0, ","], + [30402, 0, "]"], + [30352, 0, "'"], + [30353, 0, "'"], + [30032, 1], + [30031, 1], + [30030, 1], + [30029, 1], + [30028, 1], + [30027, 1], + [30026, 1], + [30025, 1], + [30024, 1], + [30023, 1], + [30022, 1], + [30021, 1], + [30020, 1], + [30019, 1], + [30018, 1], + [30017, 1], + [30016, 1], + [30015, 1], + [30014, 1], + [30013, 1], + [30012, 1], + [30011, 1], + [30010, 1], + [30009, 1], + [30008, 1], + [30007, 1], + [30006, 1], + [30005, 1], + [30004, 1], + [30003, 1], + [30002, 1], + [30001, 1], + [30000, 1], + [29999, 1], + [29998, 1], + [29997, 1], + [29996, 1], + [29995, 1], + [29994, 1], + [29993, 1], + [29992, 1], + [29991, 1], + [30007, 1], + [30006, 1], + [30005, 1], + [30004, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 1], + [30255, 0, "\\"], + [30256, 0, "m"], + [30257, 0, "a"], + [30258, 0, "t"], + [30259, 0, "h"], + [30260, 0, "i"], + [30261, 0, "t"], + [30262, 0, "{"], + [30263, 0, "v"], + [30264, 0, "a"], + [30265, 0, "l"], + [30255, 1], + [30092, 1], + [30079, 1], + [30078, 1], + [30077, 1], + [30076, 1], + [30075, 1], + [30074, 1], + [30073, 1], + [30072, 1], + [30071, 1], + [30070, 1], + [30069, 1], + [30068, 1], + [30067, 1], + [30066, 1], + [30065, 1], + [30064, 1], + [30063, 1], + [30062, 1], + [30061, 1], + [30060, 1], + [30059, 1], + [30058, 1], + [30057, 1], + [30056, 1], + [30055, 1], + [30054, 1], + [30053, 1], + [30052, 1], + [30051, 1], + [30050, 1], + [30049, 1], + [30048, 1], + [30047, 1], + [30046, 1], + [30045, 1], + [30044, 1], + [30043, 1], + [30055, 0, ","], + [30056, 0, "\\"], + [30057, 0, ","], + [30058, 0, " "], + [30059, 0, "\\"], + [30060, 0, "m"], + [30061, 0, "a"], + [30062, 0, "t"], + [30063, 0, "h"], + [30064, 0, "s"], + [30065, 0, "f"], + [30066, 0, "{"], + [30067, 0, "c"], + [30068, 0, "l"], + [30069, 0, "e"], + [30070, 0, "a"], + [30071, 0, "r"], + [30072, 0, "E"], + [30073, 0, "l"], + [30074, 0, "e"], + [30075, 0, "m"], + [30076, 0, "}"], + [30077, 0, "("], + [30078, 0, "\\"], + [30079, 0, "m"], + [30080, 0, "a"], + [30081, 0, "t"], + [30082, 0, "h"], + [30083, 0, "i"], + [30084, 0, "t"], + [30085, 0, "{"], + [30086, 0, "d"], + [30087, 0, "e"], + [30088, 0, "p"], + [30089, 0, "s"], + [30090, 0, "}"], + [30091, 0, ","], + [30092, 0, " "], + [30093, 0, "\\"], + [30094, 0, "m"], + [30095, 0, "a"], + [30096, 0, "t"], + [30096, 1], + [30095, 1], + [30094, 1], + [30093, 1], + [30092, 1], + [30092, 0, " "], + [30093, 0, "k"], + [30094, 0, ")"], + [30095, 0, " "], + [30096, 0, "\\"], + [30097, 0, "e"], + [30098, 0, "v"], + [30099, 0, "a"], + [30100, 0, "l"], + [30101, 0, "t"], + [30102, 0, "o"], + [30103, 0, " "], + [30104, 0, "\\"], + [30105, 0, "m"], + [30106, 0, "a"], + [30107, 0, "t"], + [30108, 0, "h"], + [30109, 0, "i"], + [30110, 0, "t"], + [30111, 0, "{"], + [30112, 0, "c"], + [30113, 0, "t"], + [30114, 0, "x"], + [30115, 0, "}"], + [30116, 0, "'"], + [30117, 0, ","], + [30118, 0, "\\"], + [30119, 0, ","], + [30120, 0, " "], + [30121, 0, "\\"], + [30122, 0, "m"], + [30123, 0, "a"], + [30124, 0, "t"], + [30125, 0, "h"], + [30126, 0, "i"], + [30127, 0, "t"], + [30128, 0, "{"], + [30129, 0, "p"], + [30130, 0, "r"], + [30131, 0, "e"], + [30132, 0, "s"], + [30133, 0, "}"], + [30136, 0, "\n"], + [30137, 0, "\\"], + [30138, 0, "A"], + [30139, 0, "x"], + [30140, 0, "i"], + [30141, 0, "o"], + [30142, 0, "m"], + [30143, 0, "C"], + [30144, 0, "{"], + [30145, 0, "$"], + [30146, 0, "\\"], + [30147, 0, "m"], + [30148, 0, "a"], + [30149, 0, "t"], + [30150, 0, "h"], + [30151, 0, "i"], + [30152, 0, "t"], + [30153, 0, "{"], + [30154, 0, "c"], + [30155, 0, "t"], + [30156, 0, "x"], + [30157, 0, "}"], + [30158, 0, "'"], + [30159, 0, ","], + [30160, 0, "\\"], + [30161, 0, ","], + [30162, 0, " "], + [29603, 0, "\\"], + [29604, 0, ","], + [29507, 0, "\\"], + [29508, 0, ","], + [30167, 0, "\\"], + [30168, 0, "m"], + [30169, 0, "a"], + [30170, 0, "t"], + [30171, 0, "h"], + [30172, 0, "s"], + [30173, 0, "f"], + [30174, 0, "{"], + [30175, 0, "a"], + [30176, 0, "d"], + [30177, 0, "d"], + [30178, 0, "I"], + [30179, 0, "d"], + [30180, 0, "}"], + [30181, 0, "("], + [30182, 0, "\\"], + [30183, 0, "m"], + [30184, 0, "a"], + [30185, 0, "t"], + [30186, 0, "h"], + [30187, 0, "s"], + [30188, 0, "f"], + [30189, 0, "{"], + [30190, 0, "r"], + [30191, 0, "e"], + [30192, 0, "g"], + [30192, 1], + [30191, 1], + [30190, 1], + [30190, 0, "m"], + [30191, 0, "a"], + [30192, 0, "p"], + [30193, 0, "T"], + [30194, 0, "}"], + [30195, 0, "("], + [30196, 0, "k"], + [30197, 0, ")"], + [30198, 0, ","], + [30199, 0, " "], + [30200, 0, "\\"], + [30201, 0, "m"], + [30202, 0, "a"], + [30203, 0, "t"], + [30204, 0, "h"], + [30205, 0, "i"], + [30206, 0, "t"], + [30207, 0, "{"], + [30208, 0, "i"], + [30209, 0, "d"], + [30210, 0, "}"], + [30211, 0, ")"], + [30212, 0, " "], + [30213, 0, "\\"], + [30214, 0, "e"], + [30215, 0, "v"], + [30216, 0, "a"], + [30217, 0, "l"], + [30218, 0, "t"], + [30219, 0, "o"], + [30220, 0, " "], + [30221, 0, "\\"], + [30222, 0, "m"], + [30223, 0, "a"], + [30224, 0, "t"], + [30225, 0, "h"], + [30226, 0, "i"], + [30227, 0, "t"], + [30228, 0, "{"], + [30229, 0, "c"], + [30230, 0, "t"], + [30231, 0, "x"], + [30232, 0, "}"], + [30233, 0, "'"], + [30234, 0, "'"], + [30235, 0, "$"], + [30236, 0, "}"], + [30237, 0, "\n"], + [30238, 0, "\\"], + [30239, 0, "A"], + [30240, 0, "x"], + [30241, 0, "i"], + [30242, 0, "o"], + [30243, 0, "m"], + [30244, 0, "C"], + [30245, 0, "{"], + [30246, 0, "$"], + [30247, 0, "\\"], + [30248, 0, "m"], + [30249, 0, "a"], + [30250, 0, "t"], + [30251, 0, "h"], + [30252, 0, "i"], + [30253, 0, "t"], + [30254, 0, "{"], + [30255, 0, "c"], + [30256, 0, "t"], + [30257, 0, "x"], + [30258, 0, "}"], + [30259, 0, "'"], + [30260, 0, "'"], + [30261, 0, ","], + [30262, 0, "\\"], + [30263, 0, ","], + [30264, 0, " "], + [30265, 0, "\\"], + [30266, 0, "m"], + [30267, 0, "a"], + [30268, 0, "t"], + [30269, 0, "h"], + [30270, 0, "s"], + [30271, 0, "f"], + [30272, 0, "{"], + [30273, 0, "m"], + [30274, 0, "a"], + [30275, 0, "p"], + [30276, 0, "T"], + [30277, 0, "}"], + [30278, 0, "("], + [30279, 0, "k"], + [30280, 0, ")"], + [30281, 0, " "], + [30282, 0, "\\"], + [30283, 0, "3"], + [30284, 0, "e"], + [30284, 1], + [30283, 1], + [30283, 0, "e"], + [30284, 0, "v"], + [30285, 0, "a"], + [30286, 0, "l"], + [30287, 0, "t"], + [30288, 0, "o"], + [30289, 0, " "], + [30290, 0, "\\"], + [30291, 0, "m"], + [30292, 0, "a"], + [30293, 0, "t"], + [30294, 0, "h"], + [30295, 0, "i"], + [30296, 0, "t"], + [30297, 0, "{"], + [30298, 0, "c"], + [30299, 0, "h"], + [30300, 0, "i"], + [30301, 0, "l"], + [30302, 0, "d"], + [30303, 0, "}"], + [30304, 0, "$"], + [30305, 0, "}"], + [30339, 1], + [30339, 1], + [30339, 0, "Q"], + [30340, 0, "u"], + [30341, 0, "a"], + [30342, 0, "t"], + [30343, 0, "e"], + [30344, 0, "r"], + [30579, 0, "\n"], + [30580, 0, "\n"], + [30581, 0, "%"], + [30582, 0, " "], + [30583, 0, "T"], + [30584, 0, "O"], + [30585, 0, "D"], + [30586, 0, "O"], + [30587, 0, " "], + [30588, 0, "E"], + [30589, 0, "M"], + [30590, 0, "p"], + [30591, 0, "t"], + [30592, 0, "y"], + [30593, 0, "-"], + [30594, 0, "L"], + [30595, 0, "i"], + [30596, 0, "s"], + [30597, 0, "t"], + [30598, 0, " "], + [30599, 0, "i"], + [30600, 0, "s"], + [30601, 0, " "], + [30602, 0, "i"], + [30603, 0, "m"], + [30604, 0, "s"], + [30605, 0, "i"], + [30606, 0, "l"], + [30607, 0, "a"], + [30608, 0, "r"], + [30608, 1], + [30607, 1], + [30606, 1], + [30605, 1], + [30604, 1], + [30603, 1], + [30602, 1], + [30602, 0, "s"], + [30603, 0, "i"], + [30604, 0, "m"], + [30605, 0, "i"], + [30606, 0, "l"], + [30607, 0, "a"], + [30608, 0, "r"], + [30589, 1], + [30589, 0, "m"], + [30608, 1], + [30607, 1], + [30606, 1], + [30605, 1], + [30604, 1], + [30603, 1], + [30602, 1], + [30601, 1], + [30600, 1], + [30599, 1], + [30598, 1], + [30597, 1], + [30596, 1], + [30595, 1], + [30594, 1], + [30593, 1], + [30592, 1], + [30591, 1], + [30590, 1], + [30589, 1], + [30588, 1], + [30587, 1], + [30586, 1], + [30585, 1], + [30584, 1], + [30583, 1], + [30582, 1], + [30581, 1], + [30581, 0, "\\"], + [30582, 0, "b"], + [30583, 0, "e"], + [30584, 0, "g"], + [30585, 0, "i"], + [30586, 0, "n"], + [30587, 0, "{"], + [30588, 0, "p"], + [30589, 0, "r"], + [30590, 0, "o"], + [30591, 0, "o"], + [30592, 0, "f"], + [30593, 0, "t"], + [30594, 0, "r"], + [30595, 0, "e"], + [30596, 0, "e"], + [30597, 0, "}"], + [30598, 0, "\n"], + [30599, 0, "\\"], + [30600, 0, "e"], + [30601, 0, "n"], + [30602, 0, "d"], + [30603, 0, "{"], + [30604, 0, "p"], + [30605, 0, "r"], + [30606, 0, "o"], + [30607, 0, "o"], + [30608, 0, "f"], + [30609, 0, "t"], + [30610, 0, "r"], + [30611, 0, "e"], + [30612, 0, "e"], + [30613, 0, "}"], + [30598, 0, "\n"], + [30599, 0, "\\"], + [30600, 0, "A"], + [30601, 0, "x"], + [30602, 0, "i"], + [30603, 0, "o"], + [30604, 0, "m"], + [30605, 0, "C"], + [30606, 0, "{"], + [30607, 0, "$"], + [30608, 0, "\\"], + [30609, 0, "m"], + [30610, 0, "a"], + [30611, 0, "t"], + [30612, 0, "h"], + [30613, 0, "i"], + [30614, 0, "t"], + [30615, 0, "{"], + [30616, 0, "v"], + [30617, 0, "a"], + [30618, 0, "l"], + [30619, 0, "}"], + [30620, 0, " "], + [30621, 0, "="], + [30622, 0, " "], + [30623, 0, "\\"], + [30624, 0, "t"], + [30625, 0, "e"], + [30626, 0, "x"], + [30627, 0, "t"], + [30628, 0, "t"], + [30629, 0, "t"], + [30630, 0, "{"], + [30631, 0, "["], + [30632, 0, "]"], + [30633, 0, "}"], + [30634, 0, "$"], + [30635, 0, "}"], + [30636, 0, "\n"], + [30637, 0, "\\"], + [30638, 0, "A"], + [30639, 0, "x"], + [30640, 0, "i"], + [30641, 0, "o"], + [30642, 0, "m"], + [30643, 0, "C"], + [30644, 0, "{"], + [30645, 0, "$"], + [30646, 0, "\\"], + [30647, 0, "m"], + [30648, 0, "a"], + [30649, 0, "t"], + [30650, 0, "h"], + [30651, 0, "i"], + [30652, 0, "t"], + [30653, 0, "{"], + [30654, 0, "c"], + [30655, 0, "t"], + [30656, 0, "x"], + [30657, 0, "}"], + [30658, 0, ","], + [30659, 0, "\\"], + [30660, 0, ","], + [30661, 0, " "], + [30662, 0, "\\"], + [30663, 0, "m"], + [30664, 0, "a"], + [30665, 0, "t"], + [30666, 0, "h"], + [30667, 0, "s"], + [30668, 0, "f"], + [30669, 0, "{"], + [30670, 0, "c"], + [30671, 0, "l"], + [30672, 0, "e"], + [30673, 0, "a"], + [30674, 0, "r"], + [30675, 0, "E"], + [30676, 0, "l"], + [30677, 0, "e"], + [30678, 0, "m"], + [30679, 0, "}"], + [30680, 0, "("], + [30681, 0, "\\"], + [30682, 0, "m"], + [30683, 0, "a"], + [30684, 0, "t"], + [30685, 0, "h"], + [30686, 0, "i"], + [30687, 0, "t"], + [30688, 0, "{"], + [30689, 0, "d"], + [30690, 0, "e"], + [30691, 0, "p"], + [30692, 0, "s"], + [30693, 0, "}"], + [30694, 0, ","], + [30695, 0, " "], + [30696, 0, "k"], + [30697, 0, ")"], + [30698, 0, " "], + [30699, 0, "\\"], + [30700, 0, "e"], + [30701, 0, "v"], + [30702, 0, "a"], + [30703, 0, "l"], + [30704, 0, "t"], + [30705, 0, "o"], + [30706, 0, " "], + [30707, 0, "\\"], + [30708, 0, "m"], + [30709, 0, "a"], + [30710, 0, "t"], + [30711, 0, "h"], + [30712, 0, "i"], + [30713, 0, "t"], + [30714, 0, "{"], + [30715, 0, "c"], + [30716, 0, "t"], + [30717, 0, "x"], + [30718, 0, "}"], + [30719, 0, "'"], + [30720, 0, ","], + [30721, 0, "\\"], + [30722, 0, ","], + [30723, 0, " "], + [30724, 0, "\\"], + [30725, 0, "m"], + [30726, 0, "a"], + [30727, 0, "t"], + [30728, 0, "h"], + [30729, 0, "i"], + [30730, 0, "t"], + [30731, 0, "{"], + [30732, 0, "p"], + [30733, 0, "r"], + [30734, 0, "e"], + [30735, 0, "s"], + [30736, 0, "}"], + [30737, 0, "$"], + [30738, 0, "}"], + [30739, 0, "\n"], + [30740, 0, "\\"], + [30741, 0, "m"], + [30741, 1], + [30741, 0, "A"], + [30742, 0, "x"], + [30743, 0, "i"], + [30744, 0, "o"], + [30745, 0, "m"], + [30746, 0, "C"], + [30747, 0, "{"], + [30748, 0, "$"], + [30749, 0, "\\"], + [30750, 0, "m"], + [30751, 0, "a"], + [30752, 0, "t"], + [30753, 0, "h"], + [30754, 0, "i"], + [30755, 0, "t"], + [30756, 0, "{"], + [30757, 0, "c"], + [30758, 0, "t"], + [30759, 0, "x"], + [30760, 0, "}"], + [30761, 0, "'"], + [30762, 0, ","], + [30763, 0, "\\"], + [30764, 0, ","], + [30765, 0, " "], + [30766, 0, "\\"], + [30767, 0, "m"], + [30768, 0, "a"], + [30769, 0, "t"], + [30770, 0, "h"], + [30771, 0, "s"], + [30772, 0, "f"], + [30773, 0, "{"], + [30774, 0, "a"], + [30775, 0, "d"], + [30776, 0, "d"], + [30777, 0, "I"], + [30778, 0, "d"], + [30779, 0, "}"], + [30780, 0, "("], + [30781, 0, "\\"], + [30782, 0, "m"], + [30783, 0, "a"], + [30784, 0, "t"], + [30785, 0, "h"], + [30786, 0, "s"], + [30787, 0, "f"], + [30788, 0, "{"], + [30789, 0, "l"], + [30790, 0, "i"], + [30791, 0, "s"], + [30792, 0, "t"], + [30793, 0, "T"], + [30794, 0, "}"], + [30795, 0, "("], + [30796, 0, "k"], + [30797, 0, ")"], + [30798, 0, ","], + [30799, 0, " "], + [30800, 0, "\\"], + [30801, 0, "m"], + [30802, 0, "a"], + [30803, 0, "t"], + [30804, 0, "h"], + [30805, 0, "i"], + [30806, 0, "t"], + [30807, 0, "{"], + [30808, 0, "i"], + [30809, 0, "d"], + [30810, 0, "}"], + [30811, 0, ")"], + [30812, 0, " "], + [30813, 0, "\\"], + [30814, 0, "e"], + [30815, 0, "v"], + [30816, 0, "a"], + [30817, 0, "l"], + [30818, 0, "t"], + [30819, 0, "o"], + [30820, 0, " "], + [30821, 0, "\\"], + [30822, 0, "m"], + [30823, 0, "a"], + [30824, 0, "t"], + [30825, 0, "h"], + [30826, 0, "i"], + [30827, 0, "t"], + [30828, 0, "{"], + [30829, 0, "c"], + [30830, 0, "t"], + [30831, 0, "x"], + [30832, 0, "}"], + [30833, 0, "'"], + [30834, 0, "'"], + [30835, 0, "$"], + [30836, 0, "}"], + [30837, 0, "\n"], + [30838, 0, "\\"], + [30839, 0, "A"], + [30840, 0, "x"], + [30841, 0, "i"], + [30842, 0, "o"], + [30843, 0, "m"], + [30844, 0, "C"], + [30845, 0, "{"], + [30846, 0, "$"], + [30847, 0, "\\"], + [30848, 0, "m"], + [30849, 0, "a"], + [30850, 0, "t"], + [30851, 0, "h"], + [30852, 0, "i"], + [30853, 0, "t"], + [30854, 0, "{"], + [30855, 0, "c"], + [30856, 0, "t"], + [30857, 0, "x"], + [30858, 0, "}"], + [30859, 0, "'"], + [30860, 0, "'"], + [30861, 0, ","], + [30862, 0, "\\"], + [30863, 0, ","], + [30864, 0, " "], + [30865, 0, "\\"], + [30866, 0, "m"], + [30867, 0, "a"], + [30868, 0, "t"], + [30869, 0, "h"], + [30870, 0, "s"], + [30871, 0, "f"], + [30872, 0, "{"], + [30873, 0, "l"], + [30874, 0, "i"], + [30875, 0, "s"], + [30876, 0, "t"], + [30877, 0, "T"], + [30878, 0, "}"], + [30879, 0, "("], + [30880, 0, "k"], + [30881, 0, ")"], + [30882, 0, " "], + [30883, 0, "\\"], + [30884, 0, "e"], + [30885, 0, "v"], + [30886, 0, "a"], + [30887, 0, "l"], + [30888, 0, "t"], + [30889, 0, "o"], + [30890, 0, " "], + [30891, 0, "\\"], + [30892, 0, "m"], + [30893, 0, "a"], + [30894, 0, "t"], + [30895, 0, "h"], + [30896, 0, "i"], + [30897, 0, "t"], + [30898, 0, "{"], + [30899, 0, "c"], + [30900, 0, "h"], + [30901, 0, "i"], + [30902, 0, "l"], + [30903, 0, "d"], + [30904, 0, "}"], + [30905, 0, "$"], + [30906, 0, "}"], + [30907, 0, "\n"], + [30908, 0, "\\"], + [30909, 0, "L"], + [30910, 0, "e"], + [30911, 0, "f"], + [30912, 0, "t"], + [30913, 0, "L"], + [30914, 0, "a"], + [30915, 0, "b"], + [30916, 0, "e"], + [30917, 0, "l"], + [30918, 0, "{"], + [30919, 0, "\\"], + [30920, 0, "t"], + [30921, 0, "e"], + [30922, 0, "x"], + [30923, 0, "t"], + [30924, 0, "s"], + [30925, 0, "c"], + [30926, 0, "{"], + [30927, 0, "E"], + [30928, 0, "m"], + [30929, 0, "p"], + [30930, 0, "t"], + [30931, 0, "y"], + [30932, 0, "-"], + [30933, 0, "L"], + [30934, 0, "i"], + [30935, 0, "s"], + [30936, 0, "t"], + [30937, 0, "}"], + [30938, 0, "}"], + [30939, 0, "\n"], + [30940, 0, "\\"], + [30941, 0, "Q"], + [30942, 0, "u"], + [30943, 0, "a"], + [30944, 0, "t"], + [30945, 0, "e"], + [30946, 0, "r"], + [30947, 0, "n"], + [30948, 0, "a"], + [30949, 0, "r"], + [30950, 0, "y"], + [30951, 0, "I"], + [30952, 0, "n"], + [30953, 0, "f"], + [30954, 0, "C"], + [30955, 0, "{"], + [30956, 0, "$"], + [30957, 0, "\\"], + [30958, 0, "m"], + [30959, 0, "a"], + [30960, 0, "t"], + [30961, 0, "h"], + [30962, 0, "i"], + [30963, 0, "t"], + [30964, 0, "{"], + [30965, 0, "c"], + [30966, 0, "t"], + [30967, 0, "x"], + [30968, 0, "}"], + [30969, 0, ","], + [30970, 0, "\\"], + [30971, 0, ","], + [30972, 0, " "], + [30973, 0, "\\"], + [30974, 0, "m"], + [30975, 0, "a"], + [30976, 0, "t"], + [30977, 0, "h"], + [30978, 0, "s"], + [30979, 0, "f"], + [30980, 0, "{"], + [30981, 0, "o"], + [30982, 0, "p"], + [30983, 0, "}"], + [30984, 0, "("], + [30985, 0, "\\"], + [30986, 0, "m"], + [30987, 0, "a"], + [30988, 0, "t"], + [30989, 0, "h"], + [30990, 0, "i"], + [30991, 0, "t"], + [30992, 0, "{"], + [30993, 0, "i"], + [30994, 0, "d"], + [30995, 0, "}"], + [30996, 0, ","], + [30997, 0, " "], + [30998, 0, "\\"], + [30999, 0, "m"], + [31000, 0, "a"], + [31001, 0, "t"], + [31002, 0, "h"], + [31003, 0, "i"], + [31004, 0, "t"], + [31005, 0, "{"], + [31006, 0, "d"], + [31007, 0, "e"], + [31008, 0, "p"], + [31009, 0, "s"], + [31010, 0, "}"], + [31011, 0, ","], + [31012, 0, "\n"], + [31013, 0, " "], + [31014, 0, " "], + [31015, 0, " "], + [31016, 0, " "], + [31017, 0, "\\"], + [31018, 0, "m"], + [31019, 0, "a"], + [31020, 0, "t"], + [31021, 0, "h"], + [31022, 0, "s"], + [31023, 0, "f"], + [31024, 0, "{"], + [31025, 0, "c"], + [31026, 0, "u"], + [31027, 0, "r"], + [31028, 0, "s"], + [31029, 0, "o"], + [31030, 0, "r"], + [31031, 0, "}"], + [31032, 0, "("], + [31033, 0, "\\"], + [31034, 0, "l"], + [31035, 0, "a"], + [31036, 0, "n"], + [31037, 0, "g"], + [31038, 0, "l"], + [31039, 0, "e"], + [31040, 0, "\\"], + [31041, 0, "r"], + [31042, 0, "a"], + [31043, 0, "n"], + [31044, 0, "g"], + [31045, 0, "l"], + [31046, 0, "e"], + [31047, 0, ","], + [31048, 0, "\\"], + [31049, 0, ","], + [31050, 0, " "], + [31051, 0, "k"], + [31052, 0, ")"], + [31053, 0, ","], + [31054, 0, " "], + [31055, 0, "\\"], + [31056, 0, "m"], + [31057, 0, "a"], + [31058, 0, "t"], + [31059, 0, "h"], + [31060, 0, "s"], + [31061, 0, "f"], + [31062, 0, "{"], + [31063, 0, "a"], + [31064, 0, "s"], + [31065, 0, "s"], + [31066, 0, "i"], + [31067, 0, "g"], + [31068, 0, "n"], + [31069, 0, "}"], + [31070, 0, "("], + [31071, 0, "\\"], + [31072, 0, "m"], + [31073, 0, "a"], + [31074, 0, "t"], + [31075, 0, "h"], + [31076, 0, "i"], + [31077, 0, "t"], + [31078, 0, "{"], + [31079, 0, "v"], + [31080, 0, "a"], + [31081, 0, "l"], + [31082, 0, "}"], + [31083, 0, ")"], + [31084, 0, ")"], + [31085, 0, " "], + [31086, 0, "\\"], + [31087, 0, "e"], + [31088, 0, "v"], + [31089, 0, "a"], + [31090, 0, "l"], + [31091, 0, "t"], + [31092, 0, "o"], + [31093, 0, "\n"], + [31094, 0, " "], + [31095, 0, " "], + [31096, 0, " "], + [31097, 0, " "], + [31098, 0, "\\"], + [31099, 0, "m"], + [31100, 0, "a"], + [31101, 0, "t"], + [31102, 0, "h"], + [31103, 0, "i"], + [31104, 0, "t"], + [31105, 0, "{"], + [31106, 0, "c"], + [31107, 0, "t"], + [31108, 0, "x"], + [31109, 0, "}"], + [31110, 0, "'"], + [31111, 0, "'"], + [31112, 0, "["], + [31113, 0, "\\"], + [31114, 0, ","], + [31115, 0, " "], + [31116, 0, "\\"], + [31117, 0, "m"], + [31118, 0, "a"], + [31119, 0, "t"], + [31120, 0, "h"], + [31121, 0, "s"], + [31122, 0, "f"], + [31123, 0, "{"], + [31124, 0, "l"], + [31125, 0, "i"], + [31126, 0, "s"], + [31127, 0, "t"], + [31128, 0, "T"], + [31129, 0, "}"], + [31130, 0, "("], + [31131, 0, "k"], + [31132, 0, ")"], + [31133, 0, " "], + [31134, 0, "\\"], + [31135, 0, ","], + [31136, 0, "\\"], + [31137, 0, "m"], + [31138, 0, "a"], + [31139, 0, "p"], + [31140, 0, "s"], + [31141, 0, "t"], + [31142, 0, "o"], + [31143, 0, " "], + [31143, 1], + [31143, 0, "\\"], + [31144, 0, ","], + [31145, 0, " "], + [31146, 0, "\\"], + [31147, 0, "m"], + [31148, 0, "a"], + [31149, 0, "t"], + [31150, 0, "h"], + [31151, 0, "i"], + [31152, 0, "t"], + [31153, 0, "{"], + [31154, 0, "c"], + [31155, 0, "h"], + [31156, 0, "i"], + [31157, 0, "l"], + [31158, 0, "d"], + [31159, 0, "}"], + [31160, 0, " "], + [31161, 0, "\\"], + [31162, 0, ","], + [31163, 0, "]"], + [31164, 0, "$"], + [31165, 0, "}"], + [32744, 0, "f"], + [32745, 0, "f"], + [32745, 1], + [32744, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 1], + [32755, 0, "k"], + [32773, 1], + [32772, 1], + [32771, 1], + [32770, 1], + [32769, 1], + [32768, 1], + [32767, 1], + [32767, 0, "d"], + [32768, 0, "e"], + [32769, 0, "l"], + [32770, 0, "e"], + [32771, 0, "t"], + [32772, 0, "e"], + [32864, 1], + [32863, 1], + [32862, 1], + [32861, 1], + [32860, 1], + [32859, 1], + [32858, 1], + [32857, 1], + [32856, 1], + [32855, 1], + [32854, 1], + [32853, 1], + [32852, 1], + [32851, 1], + [32850, 1], + [32849, 1], + [32848, 1], + [32847, 1], + [32846, 1], + [32845, 1], + [32844, 1], + [32843, 1], + [32842, 1], + [32841, 1], + [32840, 1], + [32839, 1], + [32838, 1], + [32837, 1], + [32836, 1], + [32835, 1], + [32834, 1], + [32833, 1], + [32832, 1], + [32831, 1], + [32830, 1], + [32829, 1], + [32828, 1], + [32827, 1], + [32826, 1], + [32825, 1], + [32824, 1], + [32823, 1], + [32822, 1], + [32821, 1], + [32820, 1], + [32819, 1], + [32818, 1], + [32817, 1], + [32816, 1], + [32815, 1], + [32814, 1], + [32813, 1], + [32812, 1], + [32811, 1], + [32810, 1], + [32809, 1], + [32808, 1], + [32807, 1], + [32806, 1], + [32805, 1], + [32804, 1], + [32803, 1], + [32802, 1], + [32801, 1], + [32800, 1], + [32800, 0, "'"], + [32787, 1], + [32786, 1], + [32785, 1], + [32784, 1], + [32783, 1], + [32783, 0, " "], + [32642, 1], + [32641, 1], + [32640, 1], + [32639, 1], + [32638, 1], + [32641, 0, "e"], + [32642, 0, "t"], + [32643, 0, "e"], + [32615, 1], + [32602, 1], + [32601, 1], + [32600, 1], + [32599, 1], + [32598, 1], + [32597, 1], + [32596, 1], + [32595, 1], + [32594, 1], + [32593, 1], + [32592, 1], + [32591, 1], + [32590, 1], + [32589, 1], + [32588, 1], + [32587, 1], + [32586, 1], + [32585, 1], + [32584, 1], + [32583, 1], + [32582, 1], + [32581, 1], + [32580, 1], + [32579, 1], + [32578, 1], + [32577, 1], + [32576, 1], + [32575, 1], + [32574, 1], + [32573, 1], + [32572, 1], + [32571, 1], + [32570, 1], + [32569, 1], + [32568, 1], + [32567, 1], + [32566, 1], + [32565, 1], + [32564, 1], + [32563, 1], + [32562, 1], + [32561, 1], + [32560, 1], + [32559, 1], + [32558, 1], + [32557, 1], + [32556, 1], + [32555, 1], + [32567, 0, " "], + [32567, 1], + [32567, 0, ","], + [32568, 0, "\\"], + [32569, 0, ","], + [32570, 0, " "], + [32571, 0, "\\"], + [32572, 0, "m"], + [32573, 0, "a"], + [32574, 0, "t"], + [32575, 0, "h"], + [32576, 0, "s"], + [32577, 0, "f"], + [32578, 0, "{"], + [32579, 0, "c"], + [32580, 0, "l"], + [32581, 0, "e"], + [32582, 0, "a"], + [32583, 0, "r"], + [32584, 0, "E"], + [32585, 0, "l"], + [32586, 0, "e"], + [32587, 0, "m"], + [32588, 0, "}"], + [32589, 0, "("], + [32590, 0, "\\"], + [32591, 0, "m"], + [32592, 0, "a"], + [32593, 0, "t"], + [32594, 0, "h"], + [32595, 0, "i"], + [32596, 0, "t"], + [32597, 0, "{"], + [32598, 0, "d"], + [32599, 0, "e"], + [32600, 0, "p"], + [32601, 0, "s"], + [32602, 0, "}"], + [32603, 0, ","], + [32604, 0, " "], + [32605, 0, "k"], + [32606, 0, ")"], + [32607, 0, " "], + [32608, 0, "\\"], + [32609, 0, "e"], + [32610, 0, "v"], + [32611, 0, "a"], + [32612, 0, "l"], + [32613, 0, "t"], + [32614, 0, "o"], + [32615, 0, " "], + [32616, 0, "\\"], + [32617, 0, "m"], + [32618, 0, "a"], + [32619, 0, "t"], + [32620, 0, "h"], + [32621, 0, "i"], + [32622, 0, "t"], + [32623, 0, "{"], + [32624, 0, "c"], + [32625, 0, "t"], + [32626, 0, "x"], + [32627, 0, "}"], + [32628, 0, "'"], + [32629, 0, ","], + [32630, 0, " "], + [32630, 1], + [32630, 0, "\\"], + [32631, 0, ","], + [32632, 0, " "], + [32633, 0, "\\"], + [32634, 0, "m"], + [32635, 0, "a"], + [32636, 0, "t"], + [32637, 0, "h"], + [32638, 0, "i"], + [32639, 0, "t"], + [32640, 0, "{"], + [32641, 0, "p"], + [32642, 0, "r"], + [32643, 0, "e"], + [32644, 0, "s"], + [32645, 0, "}"], + [32843, 0, "\n"], + [32844, 0, "\n"], + [32845, 0, "\\"], + [32846, 0, "b"], + [32847, 0, "e"], + [32848, 0, "g"], + [32849, 0, "i"], + [32850, 0, "n"], + [32851, 0, "{"], + [32852, 0, "p"], + [32853, 0, "r"], + [32854, 0, "o"], + [32855, 0, "o"], + [32856, 0, "f"], + [32857, 0, "t"], + [32858, 0, "r"], + [32859, 0, "e"], + [32860, 0, "e"], + [32861, 0, "}"], + [32862, 0, "\n"], + [32863, 0, "\\"], + [32864, 0, "e"], + [32865, 0, "n"], + [32866, 0, "d"], + [32867, 0, "{"], + [32868, 0, "p"], + [32869, 0, "r"], + [32870, 0, "o"], + [32871, 0, "o"], + [32872, 0, "f"], + [32873, 0, "t"], + [32874, 0, "r"], + [32875, 0, "e"], + [32876, 0, "e"], + [32877, 0, "}"], + [32862, 0, "\n"], + [32863, 0, "\\"], + [32864, 0, "A"], + [32865, 0, "x"], + [32866, 0, "i"], + [32867, 0, "o"], + [32868, 0, "m"], + [32869, 0, "C"], + [32870, 0, "{"], + [32871, 0, "$"], + [32872, 0, "\\"], + [32873, 0, "m"], + [32874, 0, "a"], + [32875, 0, "t"], + [32876, 0, "h"], + [32877, 0, "i"], + [32878, 0, "t"], + [32879, 0, "{"], + [32880, 0, "c"], + [32881, 0, "t"], + [32882, 0, "x"], + [32883, 0, "}"], + [32884, 0, ","], + [32885, 0, "\\"], + [32886, 0, ","], + [32887, 0, " "], + [32888, 0, "\\"], + [32889, 0, "m"], + [32890, 0, "a"], + [32891, 0, "t"], + [32892, 0, "h"], + [32893, 0, "s"], + [32894, 0, "f"], + [32895, 0, "{"], + [32896, 0, "c"], + [32897, 0, "l"], + [32898, 0, "e"], + [32899, 0, "a"], + [32900, 0, "r"], + [32901, 0, "A"], + [32902, 0, "n"], + [32903, 0, "y"], + [32904, 0, "}"], + [32905, 0, "("], + [32906, 0, "\\"], + [32907, 0, "m"], + [32908, 0, "a"], + [32909, 0, "t"], + [32910, 0, "h"], + [32911, 0, "i"], + [32912, 0, "t"], + [32913, 0, "{"], + [32914, 0, "d"], + [32915, 0, "e"], + [32916, 0, "p"], + [32917, 0, "s"], + [32918, 0, "}"], + [32919, 0, ","], + [32920, 0, " "], + [32921, 0, "k"], + [32922, 0, ")"], + [32923, 0, " "], + [32924, 0, "\\"], + [32925, 0, "e"], + [32926, 0, "v"], + [32927, 0, "a"], + [32928, 0, "l"], + [32929, 0, "t"], + [32930, 0, "o"], + [32931, 0, " "], + [32932, 0, "\\"], + [32933, 0, "m"], + [32934, 0, "a"], + [32935, 0, "t"], + [32936, 0, "h"], + [32937, 0, "i"], + [32938, 0, "t"], + [32939, 0, "{"], + [32940, 0, "c"], + [32941, 0, "t"], + [32942, 0, "x"], + [32943, 0, "}"], + [32944, 0, "'"], + [32945, 0, ","], + [32946, 0, " "], + [32947, 0, "\\"], + [32948, 0, "m"], + [32949, 0, "a"], + [32950, 0, "t"], + [32951, 0, "h"], + [32952, 0, "i"], + [32953, 0, "t"], + [32954, 0, "{"], + [32955, 0, "p"], + [32956, 0, "r"], + [32957, 0, "e"], + [32958, 0, "s"], + [32959, 0, "}"], + [32960, 0, "$"], + [32961, 0, "}"], + [32962, 0, "\n"], + [32963, 0, "\\"], + [32964, 0, "A"], + [32965, 0, "x"], + [32966, 0, "i"], + [32967, 0, "o"], + [32968, 0, "m"], + [32969, 0, "C"], + [32970, 0, "{"], + [32971, 0, "$"], + [32972, 0, "\\"], + [32973, 0, "m"], + [32974, 0, "a"], + [32975, 0, "t"], + [32976, 0, "h"], + [32977, 0, "i"], + [32978, 0, "t"], + [32979, 0, "{"], + [32980, 0, "p"], + [32981, 0, "r"], + [32982, 0, "e"], + [32983, 0, "s"], + [32984, 0, "}"], + [32985, 0, "'"], + [32986, 0, " "], + [32987, 0, "="], + [32988, 0, " "], + [32989, 0, "\\"], + [32990, 0, "m"], + [32991, 0, "a"], + [32992, 0, "t"], + [32993, 0, "h"], + [32994, 0, "i"], + [32995, 0, "t"], + [32996, 0, "{"], + [32997, 0, "p"], + [32998, 0, "r"], + [32999, 0, "e"], + [33000, 0, "s"], + [33001, 0, "}"], + [33002, 0, " "], + [33003, 0, "\\"], + [33004, 0, ","], + [33005, 0, "\\"], + [33006, 0, "c"], + [33007, 0, "u"], + [33008, 0, "p"], + [33009, 0, "\\"], + [33010, 0, ","], + [33011, 0, " "], + [33012, 0, "$"], + [33013, 0, "}"], + [28022, 1], + [28021, 1], + [28020, 1], + [28019, 1], + [28018, 1], + [28017, 1], + [28016, 1], + [28015, 1], + [28014, 1], + [28013, 1], + [28012, 1], + [28011, 1], + [28010, 1], + [28009, 1], + [28008, 1], + [28008, 0, "%"], + [28006, 1], + [28005, 1], + [28004, 1], + [28003, 1], + [28002, 1], + [28001, 1], + [28000, 1], + [27999, 1], + [27998, 1], + [27997, 1], + [27996, 1], + [27995, 1], + [27994, 1], + [27993, 1], + [27992, 1], + [27991, 1], + [27990, 1], + [27989, 1], + [27988, 1], + [27987, 1], + [27986, 1], + [27985, 1], + [27984, 1], + [27983, 1], + [27982, 1], + [27981, 1], + [27980, 1], + [27979, 1], + [27979, 0, "h"], + [27980, 0, "s"], + [27981, 0, "p"], + [27982, 0, "a"], + [27983, 0, "c"], + [27984, 0, "e"], + [27985, 0, "{"], + [27986, 0, "3"], + [27987, 0, "e"], + [27988, 0, "m"], + [27989, 0, "}"], + [28236, 1], + [28235, 1], + [28234, 1], + [28233, 1], + [28232, 1], + [28231, 1], + [28230, 1], + [28229, 1], + [28228, 1], + [28227, 1], + [28226, 1], + [28226, 0, "p"], + [28227, 0, "r"], + [28228, 0, "o"], + [28229, 0, "o"], + [28230, 0, "f"], + [28231, 0, "S"], + [28232, 0, "k"], + [28233, 0, "i"], + [28234, 0, "p"], + [28235, 0, "A"], + [28236, 0, "m"], + [28237, 0, "o"], + [28238, 0, "u"], + [28239, 0, "n"], + [28240, 0, "t"], + [28241, 0, "\n"], + [28242, 0, "\\"], + [28243, 0, "e"], + [28244, 0, "n"], + [28245, 0, "d"], + [28246, 0, "{"], + [28247, 0, "c"], + [28248, 0, "e"], + [28249, 0, "n"], + [28250, 0, "t"], + [28251, 0, "e"], + [28252, 0, "r"], + [28253, 0, "}"], + [28254, 0, "\n"], + [28256, 1], + [28256, 0, "\\"], + [28257, 0, "b"], + [28258, 0, "e"], + [28259, 0, "g"], + [28260, 0, "i"], + [28261, 0, "n"], + [28262, 0, "{"], + [28263, 0, "c"], + [28264, 0, "e"], + [28265, 0, "n"], + [28266, 0, "t"], + [28267, 0, "e"], + [28268, 0, "r"], + [28269, 0, "}"], + [32845, 0, "%"], + [32864, 0, "%"], + [32965, 0, "%"], + [33018, 0, "%"], + [28452, 1], + [28451, 1], + [28450, 1], + [28449, 1], + [28448, 1], + [28447, 1], + [28446, 1], + [28445, 1], + [28444, 1], + [28443, 1], + [28442, 1], + [28441, 1], + [28440, 1], + [28439, 1], + [28438, 1], + [28438, 0, "h"], + [28439, 0, "s"], + [28440, 0, "p"], + [28441, 0, "a"], + [28442, 0, "c"], + [28443, 0, "e"], + [28444, 0, "{"], + [28445, 0, "3"], + [28446, 0, "e"], + [28447, 0, "m"], + [28448, 0, "}"], + [28449, 0, "\n"], + [28450, 0, "%"], + [28451, 0, "\n"], + [28452, 0, "A"], + [28453, 0, "x"], + [28454, 0, "i"], + [28455, 0, "o"], + [28456, 0, "m"], + [28457, 0, "C"], + [28458, 0, "{"], + [28459, 0, "$"], + [28460, 0, "\\"], + [28461, 0, "m"], + [28462, 0, "a"], + [28463, 0, "t"], + [28464, 0, "h"], + [28465, 0, "s"], + [28466, 0, "f"], + [28467, 0, "{"], + [28468, 0, "p"], + [28469, 0, "r"], + [28470, 0, "e"], + [28471, 0, "s"], + [28472, 0, "}"], + [28473, 0, "("], + [28474, 0, "k"], + [28475, 0, ")"], + [28476, 0, " "], + [28477, 0, "\\"], + [28478, 0, "i"], + [28479, 0, "n"], + [28480, 0, " "], + [28481, 0, "\\"], + [28482, 0, "m"], + [28483, 0, "a"], + [28484, 0, "t"], + [28485, 0, "h"], + [28486, 0, "r"], + [28487, 0, "m"], + [28488, 0, "{"], + [28489, 0, "d"], + [28490, 0, "o"], + [28491, 0, "m"], + [28492, 0, "}"], + [28493, 0, "("], + [28494, 0, "\\"], + [28495, 0, "m"], + [28496, 0, "a"], + [28497, 0, "t"], + [28498, 0, "h"], + [28499, 0, "i"], + [28500, 0, "t"], + [28501, 0, "{"], + [28502, 0, "c"], + [28503, 0, "t"], + [28504, 0, "x"], + [28505, 0, "}"], + [28506, 0, ")"], + [28507, 0, "$"], + [28508, 0, "}"], + [28509, 0, "\n"], + [28452, 0, "\\"], + [28511, 0, "\\"], + [28512, 0, "L"], + [28513, 0, "e"], + [28514, 0, "f"], + [28515, 0, "t"], + [28516, 0, "L"], + [28517, 0, "a"], + [28518, 0, "b"], + [28519, 0, "e"], + [28520, 0, "l"], + [28521, 0, "{"], + [28522, 0, "\\"], + [28523, 0, "t"], + [28524, 0, "e"], + [28525, 0, "x"], + [28526, 0, "t"], + [28527, 0, "s"], + [28528, 0, "c"], + [28529, 0, "{"], + [28530, 0, "P"], + [28531, 0, "r"], + [28532, 0, "e"], + [28533, 0, "s"], + [28534, 0, "e"], + [28535, 0, "n"], + [28536, 0, "c"], + [28537, 0, "e"], + [28522, 0, "$"], + [28539, 0, "\n"], + [28539, 1], + [28539, 0, "}"], + [28540, 0, "_"], + [28541, 0, "1"], + [28542, 0, "$"], + [28543, 0, "}"], + [28544, 0, "\n"], + [28545, 0, "\\"], + [28546, 0, "U"], + [28547, 0, "n"], + [28548, 0, "a"], + [28549, 0, "r"], + [28550, 0, "y"], + [28551, 0, "I"], + [28552, 0, "n"], + [28553, 0, "f"], + [28554, 0, "C"], + [28555, 0, "{"], + [28556, 0, "$"], + [28557, 0, "\\"], + [28558, 0, "m"], + [28559, 0, "a"], + [28560, 0, "t"], + [28561, 0, "h"], + [28562, 0, "i"], + [28563, 0, "t"], + [28564, 0, "{"], + [28565, 0, "c"], + [28566, 0, "t"], + [28567, 0, "x"], + [28568, 0, "}"], + [28569, 0, ","], + [28570, 0, "\\"], + [28571, 0, ","], + [28572, 0, " "], + [28573, 0, "\\"], + [28574, 0, "m"], + [28575, 0, "a"], + [28576, 0, "t"], + [28577, 0, "h"], + [28578, 0, "s"], + [28579, 0, "f"], + [28580, 0, "{"], + [28581, 0, "p"], + [28582, 0, "r"], + [28583, 0, "e"], + [28584, 0, "s"], + [28585, 0, "}"], + [28586, 0, "("], + [28587, 0, "k"], + [28588, 0, ")"], + [28589, 0, " "], + [28590, 0, "\\"], + [28591, 0, "e"], + [28592, 0, "v"], + [28593, 0, "a"], + [28594, 0, "l"], + [28595, 0, "t"], + [28596, 0, "o"], + [28597, 0, " "], + [28598, 0, "\\"], + [28599, 0, "m"], + [28600, 0, "a"], + [28601, 0, "t"], + [28602, 0, "h"], + [28603, 0, "i"], + [28604, 0, "t"], + [28605, 0, "{"], + [28606, 0, "c"], + [28607, 0, "t"], + [28608, 0, "x"], + [28609, 0, "}"], + [28610, 0, "("], + [28611, 0, "\\"], + [28612, 0, "m"], + [28613, 0, "a"], + [28614, 0, "t"], + [28615, 0, "h"], + [28616, 0, "s"], + [28617, 0, "f"], + [28618, 0, "{"], + [28619, 0, "p"], + [28620, 0, "r"], + [28621, 0, "e"], + [28622, 0, "s"], + [28623, 0, "}"], + [28624, 0, "("], + [28625, 0, "k"], + [28626, 0, ")"], + [28627, 0, ")"], + [28628, 0, "$"], + [28629, 0, "}"], + [28630, 0, "\n"], + [28631, 0, "\\"], + [28632, 0, "D"], + [28633, 0, "i"], + [28634, 0, "s"], + [28635, 0, "p"], + [28636, 0, "l"], + [28637, 0, "a"], + [28638, 0, "y"], + [28639, 0, "P"], + [28640, 0, "r"], + [28641, 0, "o"], + [28642, 0, "o"], + [28643, 0, "f"], + [28644, 0, "\\"], + [28645, 0, "h"], + [28646, 0, "s"], + [28647, 0, "p"], + [28648, 0, "a"], + [28649, 0, "c"], + [28650, 0, "e"], + [28651, 0, "{"], + [28652, 0, "3"], + [28653, 0, "e"], + [28654, 0, "m"], + [28655, 0, "}"], + [28656, 0, "\n"], + [28657, 0, "%"], + [28658, 0, "\n"], + [28659, 0, "\\"], + [28660, 0, "A"], + [28661, 0, "x"], + [28662, 0, "i"], + [28663, 0, "o"], + [28664, 0, "m"], + [28665, 0, "C"], + [28666, 0, "{"], + [28667, 0, "$"], + [28668, 0, "\\"], + [28669, 0, "m"], + [28670, 0, "a"], + [28671, 0, "t"], + [28672, 0, "h"], + [28673, 0, "s"], + [28674, 0, "f"], + [28675, 0, "{"], + [28676, 0, "p"], + [28677, 0, "r"], + [28678, 0, "e"], + [28679, 0, "s"], + [28680, 0, "}"], + [28681, 0, "("], + [28682, 0, "k"], + [28683, 0, ")"], + [28684, 0, " "], + [28685, 0, "\\"], + [28686, 0, "n"], + [28687, 0, "o"], + [28688, 0, "t"], + [28689, 0, "i"], + [28690, 0, "n"], + [28691, 0, " "], + [28692, 0, "\\"], + [28693, 0, "m"], + [28694, 0, "a"], + [28695, 0, "t"], + [28696, 0, "h"], + [28697, 0, "r"], + [28698, 0, "m"], + [28699, 0, "{"], + [28700, 0, "d"], + [28701, 0, "o"], + [28702, 0, "m"], + [28703, 0, "}"], + [28704, 0, "("], + [28705, 0, "\\"], + [28706, 0, "m"], + [28707, 0, "a"], + [28708, 0, "t"], + [28709, 0, "h"], + [28710, 0, "i"], + [28711, 0, "t"], + [28712, 0, "{"], + [28713, 0, "c"], + [28714, 0, "t"], + [28715, 0, "x"], + [28716, 0, "}"], + [28717, 0, ")"], + [28718, 0, "$"], + [28719, 0, "}"], + [28720, 0, "\n"], + [28721, 0, "\\"], + [28722, 0, "L"], + [28723, 0, "e"], + [28724, 0, "f"], + [28725, 0, "t"], + [28726, 0, "L"], + [28727, 0, "a"], + [28728, 0, "b"], + [28729, 0, "e"], + [28730, 0, "l"], + [28731, 0, "{"], + [28732, 0, "$"], + [28733, 0, "\\"], + [28734, 0, "t"], + [28735, 0, "e"], + [28736, 0, "x"], + [28737, 0, "t"], + [28738, 0, "s"], + [28739, 0, "c"], + [28740, 0, "{"], + [28741, 0, "P"], + [28742, 0, "r"], + [28743, 0, "e"], + [28744, 0, "s"], + [28745, 0, "e"], + [28746, 0, "n"], + [28747, 0, "c"], + [28748, 0, "e"], + [28749, 0, "}"], + [28750, 0, "_"], + [28751, 0, "2"], + [28752, 0, "$"], + [28753, 0, "}"], + [28754, 0, "\n"], + [28755, 0, "\\"], + [28756, 0, "U"], + [28757, 0, "n"], + [28758, 0, "a"], + [28759, 0, "r"], + [28760, 0, "y"], + [28761, 0, "I"], + [28762, 0, "n"], + [28763, 0, "f"], + [28764, 0, "C"], + [28765, 0, "{"], + [28766, 0, "$"], + [28767, 0, "\\"], + [28768, 0, "m"], + [28769, 0, "a"], + [28770, 0, "t"], + [28771, 0, "h"], + [28772, 0, "i"], + [28773, 0, "t"], + [28774, 0, "{"], + [28775, 0, "c"], + [28776, 0, "t"], + [28777, 0, "x"], + [28778, 0, "}"], + [28779, 0, ","], + [28780, 0, "\\"], + [28781, 0, ","], + [28782, 0, " "], + [28783, 0, "\\"], + [28784, 0, "m"], + [28785, 0, "a"], + [28786, 0, "t"], + [28787, 0, "h"], + [28788, 0, "s"], + [28789, 0, "f"], + [28790, 0, "{"], + [28791, 0, "p"], + [28792, 0, "r"], + [28793, 0, "e"], + [28794, 0, "s"], + [28795, 0, "}"], + [28796, 0, "("], + [28797, 0, "k"], + [28798, 0, ")"], + [28799, 0, " "], + [28800, 0, "\\"], + [28801, 0, "e"], + [28802, 0, "v"], + [28803, 0, "a"], + [28804, 0, "l"], + [28805, 0, "t"], + [28806, 0, "o"], + [28807, 0, " "], + [28808, 0, "\\"], + [28809, 0, "m"], + [28809, 1], + [28808, 1], + [28808, 0, "\\"], + [28809, 0, "{"], + [28810, 0, "\\"], + [28811, 0, "}"], + [28812, 0, "$"], + [28813, 0, "}"], + [28814, 0, "\n"], + [28815, 0, "\\"], + [28816, 0, "D"], + [28817, 0, "i"], + [28818, 0, "s"], + [28819, 0, "p"], + [28820, 0, "l"], + [28821, 0, "a"], + [28822, 0, "y"], + [28823, 0, "P"], + [28824, 0, "r"], + [28825, 0, "o"], + [28826, 0, "o"], + [28827, 0, "f"], + [28828, 0, "\\"], + [28829, 0, "p"], + [28830, 0, "r"], + [28831, 0, "o"], + [28832, 0, "o"], + [28833, 0, "f"], + [28834, 0, "S"], + [28835, 0, "k"], + [28836, 0, "i"], + [28837, 0, "p"], + [28838, 0, "A"], + [28839, 0, "m"], + [28840, 0, "o"], + [28841, 0, "u"], + [28842, 0, "n"], + [28843, 0, "t"], + [28871, 1], + [28870, 1], + [28869, 1], + [28868, 1], + [28867, 1], + [28866, 1], + [28866, 0, "p"], + [28867, 0, "r"], + [28868, 0, "o"], + [28869, 0, "o"], + [28870, 0, "f"], + [28871, 0, "t"], + [28872, 0, "r"], + [28873, 0, "e"], + [28874, 0, "e"], + [29644, 1], + [29643, 1], + [29642, 1], + [29641, 1], + [29640, 1], + [29639, 1], + [29639, 0, "p"], + [29640, 0, "r"], + [29641, 0, "o"], + [29642, 0, "o"], + [29643, 0, "f"], + [29644, 0, "t"], + [29645, 0, "r"], + [29646, 0, "e"], + [29647, 0, "e"], + [28974, 0, "\\"], + [28975, 0, "m"], + [28976, 0, "a"], + [28977, 0, "t"], + [28978, 0, "h"], + [28979, 0, "i"], + [28980, 0, "t"], + [28981, 0, "{"], + [28982, 0, "c"], + [28983, 0, "t"], + [28984, 0, "x"], + [28985, 0, "}"], + [28986, 0, ","], + [28987, 0, "\\"], + [28988, 0, ","], + [28989, 0, " "], + [29012, 1], + [29011, 1], + [29010, 1], + [29009, 1], + [29008, 1], + [29008, 0, "e"], + [29009, 0, "v"], + [29010, 0, "a"], + [29011, 0, "l"], + [29012, 0, "t"], + [29013, 0, "o"], + [29020, 1], + [29020, 1], + [29020, 0, "i"], + [29021, 0, "t"], + [29023, 1], + [29023, 1], + [29023, 1], + [29023, 0, "p"], + [29024, 0, "r"], + [29025, 0, "e"], + [29026, 0, "s"], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29028, 1], + [29060, 1], + [29059, 1], + [29058, 1], + [29042, 1], + [29410, 1], + [29409, 1], + [29408, 1], + [29407, 1], + [29406, 1], + [29405, 1], + [29404, 1], + [29403, 1], + [29402, 1], + [29401, 1], + [29400, 1], + [29399, 1], + [29398, 1], + [29397, 1], + [29396, 1], + [29395, 1], + [29394, 1], + [29393, 1], + [29392, 1], + [29391, 1], + [29390, 1], + [29389, 1], + [29388, 1], + [29387, 1], + [29386, 1], + [29385, 1], + [29384, 1], + [29383, 1], + [29382, 1], + [29381, 1], + [29380, 1], + [29379, 1], + [29378, 1], + [29377, 1], + [29376, 1], + [29375, 1], + [29374, 1], + [29373, 1], + [29372, 1], + [29371, 1], + [29370, 1], + [29369, 1], + [29368, 1], + [29367, 1], + [29366, 1], + [29365, 1], + [29364, 1], + [29363, 1], + [29362, 1], + [29361, 1], + [29360, 1], + [29359, 1], + [29358, 1], + [29357, 1], + [29356, 1], + [29355, 1], + [29354, 1], + [29353, 1], + [29352, 1], + [29351, 1], + [29350, 1], + [29349, 1], + [29348, 1], + [29347, 1], + [29346, 1], + [29345, 1], + [29344, 1], + [29343, 1], + [29342, 1], + [29341, 1], + [29340, 1], + [29339, 1], + [29338, 1], + [29337, 1], + [29336, 1], + [29335, 1], + [29334, 1], + [29333, 1], + [29332, 1], + [29331, 1], + [29330, 1], + [29329, 1], + [29328, 1], + [29327, 1], + [29326, 1], + [29325, 1], + [29324, 1], + [29323, 1], + [29322, 1], + [29321, 1], + [29320, 1], + [29319, 1], + [29318, 1], + [29317, 1], + [29316, 1], + [29315, 1], + [29314, 1], + [29313, 1], + [29312, 1], + [29311, 1], + [29310, 1], + [29309, 1], + [29308, 1], + [29307, 1], + [29306, 1], + [29305, 1], + [29304, 1], + [29303, 1], + [29302, 1], + [29301, 1], + [29300, 1], + [29299, 1], + [29298, 1], + [29297, 1], + [29296, 1], + [29295, 1], + [29294, 1], + [29293, 1], + [29292, 1], + [29291, 1], + [29290, 1], + [29289, 1], + [29288, 1], + [29287, 1], + [29286, 1], + [29285, 1], + [29284, 1], + [29283, 1], + [29282, 1], + [29281, 1], + [29280, 1], + [29279, 1], + [29278, 1], + [29277, 1], + [29276, 1], + [29275, 1], + [29274, 1], + [29273, 1], + [29272, 1], + [29271, 1], + [29270, 1], + [29269, 1], + [29268, 1], + [29267, 1], + [29266, 1], + [29265, 1], + [29264, 1], + [29263, 1], + [29262, 1], + [29261, 1], + [29260, 1], + [29259, 1], + [29258, 1], + [29257, 1], + [29256, 1], + [29255, 1], + [29254, 1], + [29253, 1], + [29252, 1], + [29251, 1], + [29250, 1], + [29249, 1], + [29248, 1], + [29247, 1], + [29246, 1], + [29245, 1], + [29244, 1], + [29243, 1], + [29242, 1], + [29241, 1], + [29240, 1], + [29239, 1], + [29238, 1], + [29237, 1], + [29236, 1], + [29235, 1], + [29234, 1], + [29233, 1], + [29232, 1], + [29231, 1], + [29230, 1], + [29229, 1], + [29228, 1], + [29227, 1], + [29226, 1], + [29225, 1], + [29224, 1], + [29223, 1], + [29222, 1], + [29221, 1], + [29220, 1], + [29219, 1], + [29218, 1], + [29217, 1], + [29216, 1], + [29215, 1], + [29214, 1], + [29213, 1], + [29212, 1], + [29211, 1], + [29210, 1], + [29209, 1], + [29208, 1], + [29207, 1], + [29206, 1], + [29205, 1], + [29204, 1], + [29203, 1], + [29202, 1], + [29201, 1], + [29200, 1], + [29199, 1], + [29198, 1], + [29197, 1], + [29196, 1], + [29195, 1], + [29194, 1], + [29193, 1], + [29192, 1], + [29191, 1], + [29190, 1], + [29189, 1], + [29188, 1], + [29187, 1], + [29186, 1], + [29185, 1], + [29184, 1], + [29183, 1], + [29182, 1], + [29181, 1], + [29180, 1], + [29179, 1], + [29178, 1], + [29177, 1], + [29176, 1], + [29175, 1], + [29174, 1], + [29173, 1], + [29172, 1], + [29171, 1], + [29170, 1], + [29169, 1], + [29168, 1], + [29167, 1], + [29166, 1], + [29165, 1], + [29164, 1], + [29163, 1], + [29162, 1], + [29161, 1], + [29160, 1], + [29159, 1], + [29158, 1], + [29157, 1], + [29156, 1], + [29155, 1], + [29154, 1], + [29153, 1], + [29152, 1], + [29151, 1], + [29150, 1], + [29149, 1], + [29148, 1], + [29147, 1], + [29146, 1], + [29145, 1], + [29144, 1], + [29143, 1], + [29142, 1], + [29141, 1], + [29140, 1], + [29139, 1], + [29138, 1], + [29137, 1], + [29136, 1], + [29135, 1], + [29134, 1], + [29133, 1], + [29132, 1], + [29131, 1], + [29130, 1], + [29129, 1], + [29128, 1], + [29127, 1], + [29126, 1], + [29125, 1], + [29124, 1], + [29123, 1], + [29122, 1], + [29121, 1], + [29120, 1], + [29119, 1], + [29118, 1], + [29117, 1], + [29116, 1], + [29115, 1], + [29114, 1], + [29113, 1], + [29112, 1], + [29111, 1], + [29110, 1], + [29109, 1], + [29108, 1], + [29107, 1], + [29106, 1], + [29105, 1], + [29104, 1], + [29103, 1], + [29102, 1], + [29101, 1], + [29100, 1], + [29099, 1], + [29098, 1], + [29097, 1], + [29096, 1], + [29095, 1], + [29094, 1], + [29093, 1], + [29092, 1], + [29091, 1], + [29090, 1], + [29089, 1], + [29088, 1], + [29087, 1], + [29086, 1], + [29085, 1], + [29084, 1], + [29083, 1], + [29082, 1], + [29081, 1], + [29080, 1], + [29079, 1], + [29078, 1], + [29077, 1], + [29076, 1], + [29075, 1], + [29074, 1], + [29073, 1], + [29072, 1], + [29071, 1], + [29070, 1], + [29069, 1], + [29068, 1], + [29067, 1], + [29066, 1], + [29065, 1], + [29064, 1], + [29063, 1], + [29062, 1], + [29061, 1], + [29060, 1], + [29059, 1], + [29058, 1], + [29279, 1], + [29278, 1], + [29277, 1], + [29276, 1], + [29275, 1], + [29274, 1], + [29273, 1], + [29272, 1], + [29271, 1], + [29270, 1], + [29269, 1], + [29268, 1], + [29267, 1], + [29266, 1], + [29265, 1], + [29264, 1], + [29263, 1], + [29262, 1], + [29261, 1], + [29260, 1], + [29259, 1], + [29258, 1], + [29257, 1], + [29256, 1], + [29255, 1], + [29254, 1], + [29253, 1], + [29252, 1], + [29251, 1], + [29250, 1], + [29218, 1], + [29217, 1], + [29216, 1], + [29215, 1], + [29208, 1], + [29207, 1], + [29207, 0, "i"], + [29208, 0, "t"], + [29201, 1], + [29200, 1], + [29199, 1], + [29198, 1], + [29197, 1], + [29196, 1], + [29195, 1], + [29194, 1], + [29193, 1], + [29192, 1], + [29191, 1], + [29190, 1], + [29189, 1], + [32842, 1], + [32860, 1], + [32960, 1], + [33012, 1], + [32959, 0, "\n"], + [32960, 0, "\\"], + [32961, 0, "A"], + [32962, 0, "x"], + [32963, 0, "i"], + [32964, 0, "o"], + [32965, 0, "m"], + [32966, 0, "C"], + [32967, 0, "{"], + [32968, 0, "$"], + [32969, 0, "\\"], + [32970, 0, "m"], + [32971, 0, "a"], + [32972, 0, "t"], + [32973, 0, "h"], + [32974, 0, "i"], + [32975, 0, "t"], + [32976, 0, "{"], + [32977, 0, "c"], + [32978, 0, "t"], + [32979, 0, "x"], + [32980, 0, "}"], + [32981, 0, "'"], + [32982, 0, ","], + [32983, 0, "\\"], + [32984, 0, ","], + [32985, 0, " "], + [32986, 0, "\\"], + [32987, 0, "m"], + [32988, 0, "a"], + [32989, 0, "t"], + [32990, 0, "h"], + [32991, 0, "s"], + [32992, 0, "f"], + [32993, 0, "{"], + [32994, 0, "p"], + [32995, 0, "r"], + [32996, 0, "e"], + [32997, 0, "s"], + [32998, 0, "}"], + [32999, 0, "("], + [33000, 0, "k"], + [33001, 0, ")"], + [32957, 0, "\\"], + [32957, 1], + [32957, 0, "_"], + [32958, 0, "\\"], + [32959, 0, "m"], + [32960, 0, "a"], + [32961, 0, "t"], + [32962, 0, "h"], + [32963, 0, "i"], + [32964, 0, "t"], + [32965, 0, "{"], + [32966, 0, "c"], + [32967, 0, "h"], + [32968, 0, "i"], + [32969, 0, "l"], + [32970, 0, "d"], + [32971, 0, "}"], + [33017, 0, " "], + [33018, 0, "="], + [33018, 1], + [33018, 0, "\\"], + [33019, 0, "e"], + [33020, 0, "v"], + [33021, 0, "a"], + [33022, 0, "l"], + [33023, 0, "t"], + [33024, 0, "o"], + [33025, 0, " "], + [33026, 0, "\\"], + [33027, 0, "m"], + [33028, 0, "a"], + [33029, 0, "t"], + [33030, 0, "h"], + [33031, 0, "i"], + [33032, 0, "t"], + [33033, 0, "{"], + [33034, 0, "p"], + [33035, 0, "r"], + [33036, 0, "e"], + [33037, 0, "s"], + [33038, 0, "}"], + [33039, 0, "_"], + [33040, 0, "\\"], + [33041, 0, "m"], + [33042, 0, "a"], + [33043, 0, "t"], + [33044, 0, "h"], + [33045, 0, "i"], + [33046, 0, "t"], + [33047, 0, "{"], + [33048, 0, "e"], + [33049, 0, "l"], + [33050, 0, "e"], + [33051, 0, "m"], + [33052, 0, "}"], + [33053, 0, "$"], + [33054, 0, "}"], + [33095, 0, "_"], + [33096, 0, "\\"], + [33097, 0, "m"], + [33098, 0, "a"], + [33099, 0, "t"], + [33100, 0, "h"], + [33101, 0, "i"], + [33102, 0, "t"], + [33103, 0, "{"], + [33104, 0, "c"], + [33105, 0, "h"], + [33106, 0, "i"], + [33107, 0, "l"], + [33108, 0, "d"], + [33109, 0, "}"], + [33120, 0, "\\"], + [33121, 0, "m"], + [33122, 0, "a"], + [33123, 0, "t"], + [33124, 0, "h"], + [33125, 0, "i"], + [33126, 0, "t"], + [33127, 0, "{"], + [33128, 0, "p"], + [33129, 0, "r"], + [33130, 0, "e"], + [33131, 0, "s"], + [33132, 0, "}"], + [33133, 0, "_"], + [33134, 0, "\\"], + [33135, 0, "m"], + [33136, 0, "a"], + [33137, 0, "t"], + [33138, 0, "h"], + [33139, 0, "i"], + [33140, 0, "t"], + [33141, 0, "{"], + [33142, 0, "e"], + [33143, 0, "l"], + [33144, 0, "e"], + [33145, 0, "m"], + [33146, 0, "}"], + [33149, 0, "\n"], + [33150, 0, "\\"], + [33151, 0, "L"], + [33152, 0, "e"], + [33153, 0, "f"], + [33154, 0, "t"], + [33155, 0, "L"], + [33156, 0, "a"], + [33157, 0, "b"], + [33158, 0, "e"], + [33159, 0, "l"], + [33160, 0, "{"], + [33161, 0, "\\"], + [33162, 0, "t"], + [33163, 0, "e"], + [33164, 0, "x"], + [33165, 0, "t"], + [33166, 0, "s"], + [33167, 0, "c"], + [33168, 0, "{"], + [33169, 0, "C"], + [33170, 0, "l"], + [33171, 0, "e"], + [33172, 0, "a"], + [33173, 0, "r"], + [33174, 0, "_"], + [33174, 1], + [33174, 0, "-"], + [33175, 0, "E"], + [33176, 0, "l"], + [33177, 0, "e"], + [33178, 0, "m"], + [33179, 0, "}"], + [33180, 0, "}"], + [33181, 0, "\n"], + [33182, 0, "\\"], + [33183, 0, "T"], + [33184, 0, "r"], + [33185, 0, "i"], + [33186, 0, "n"], + [33187, 0, "a"], + [33188, 0, "r"], + [33189, 0, "y"], + [33190, 0, "I"], + [33191, 0, "n"], + [33192, 0, "f"], + [33193, 0, "C"], + [33194, 0, "{"], + [33195, 0, "$"], + [33196, 0, "\\"], + [33197, 0, "m"], + [33198, 0, "a"], + [33199, 0, "t"], + [33200, 0, "h"], + [33201, 0, "i"], + [33202, 0, "t"], + [33203, 0, "{"], + [33204, 0, "c"], + [33205, 0, "t"], + [33206, 0, "x"], + [33207, 0, "}"], + [33208, 0, ","], + [33209, 0, "\\"], + [33210, 0, ","], + [33211, 0, " "], + [33212, 0, "\\"], + [33213, 0, "m"], + [33214, 0, "a"], + [33215, 0, "t"], + [33216, 0, "h"], + [33217, 0, "s"], + [33218, 0, "f"], + [33219, 0, "{"], + [33220, 0, "c"], + [33221, 0, "l"], + [33222, 0, "e"], + [33223, 0, "a"], + [33224, 0, "r"], + [33225, 0, "E"], + [33226, 0, "l"], + [33227, 0, "e"], + [33228, 0, "m"], + [33229, 0, "}"], + [33230, 0, "("], + [33231, 0, "\\"], + [33232, 0, "m"], + [33233, 0, "a"], + [33234, 0, "t"], + [33235, 0, "h"], + [33236, 0, "i"], + [33237, 0, "t"], + [33238, 0, "{"], + [33239, 0, "d"], + [33240, 0, "e"], + [33241, 0, "p"], + [33242, 0, "s"], + [33243, 0, "}"], + [33244, 0, ","], + [33245, 0, " "], + [33246, 0, "k"], + [33247, 0, "}"], + [33247, 1], + [33247, 0, ")"], + [33248, 0, " "], + [33249, 0, "\\"], + [33250, 0, "e"], + [33251, 0, "v"], + [33252, 0, "a"], + [33253, 0, "l"], + [33254, 0, "t"], + [33255, 0, "o"], + [33256, 0, " "], + [33257, 0, "\\"], + [33258, 0, "m"], + [33259, 0, "a"], + [33260, 0, "t"], + [33261, 0, "h"], + [33262, 0, "i"], + [33263, 0, "t"], + [33264, 0, "{"], + [33265, 0, "c"], + [33266, 0, "t"], + [33267, 0, "x"], + [33268, 0, "}"], + [33269, 0, "'"], + [33256, 0, "\n"], + [33257, 0, " "], + [33258, 0, " "], + [33259, 0, " "], + [33274, 0, " "], + [33275, 0, "["], + [33276, 0, "\\"], + [33277, 0, ","], + [33278, 0, " "], + [33279, 0, "\\"], + [33280, 0, "m"], + [33281, 0, "a"], + [33282, 0, "t"], + [33283, 0, "h"], + [33284, 0, "s"], + [33285, 0, "f"], + [33286, 0, "{"], + [33287, 0, "p"], + [33288, 0, "r"], + [33289, 0, "e"], + [33290, 0, "s"], + [33291, 0, "}"], + [33292, 0, "("], + [33293, 0, "k"], + [33294, 0, ")"], + [33295, 0, " "], + [33296, 0, "\\"], + [33297, 0, ","], + [33298, 0, "\\"], + [33299, 0, "m"], + [33300, 0, "a"], + [33301, 0, "p"], + [33302, 0, "s"], + [33303, 0, "t"], + [33304, 0, "o"], + [33305, 0, "\\"], + [33306, 0, ","], + [33307, 0, " "], + [33308, 0, "\\"], + [33309, 0, "m"], + [33310, 0, "a"], + [33311, 0, "t"], + [33312, 0, "h"], + [33313, 0, "i"], + [33314, 0, "t"], + [33315, 0, "{"], + [33316, 0, "p"], + [33317, 0, "r"], + [33318, 0, "e"], + [33319, 0, "s"], + [33320, 0, "}"], + [33321, 0, "'"], + [33322, 0, " "], + [33323, 0, "\\"], + [33324, 0, ","], + [33325, 0, "]"], + [33326, 0, ","], + [33327, 0, "\\"], + [33328, 0, ","], + [33329, 0, " "], + [33330, 0, "\\"], + [33331, 0, "m"], + [33332, 0, "a"], + [33333, 0, "t"], + [33334, 0, "h"], + [33335, 0, "i"], + [33336, 0, "t"], + [33337, 0, "{"], + [33338, 0, "p"], + [33339, 0, "r"], + [33340, 0, "e"], + [33341, 0, "s"], + [33342, 0, "}"], + [33343, 0, "'"], + [33344, 0, "$"], + [33345, 0, "}"], + [32958, 0, "1"], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [32959, 1], + [33039, 1], + [33038, 1], + [33037, 1], + [33036, 1], + [33035, 1], + [33034, 1], + [33033, 1], + [33032, 1], + [33031, 1], + [33030, 1], + [33029, 1], + [33028, 1], + [33027, 1], + [33027, 0, "2"], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 1], + [33109, 0, "2"], + [33084, 1], + [33083, 1], + [33082, 1], + [33081, 1], + [33080, 1], + [33079, 1], + [33078, 1], + [33077, 1], + [33076, 1], + [33075, 1], + [33074, 1], + [33073, 1], + [33072, 1], + [33071, 1], + [33071, 0, "1"], + [33053, 1], + [33053, 0, "+"], + [33053, 1], + [33053, 0, "_"], + [33054, 0, "3"], + [33272, 1], + [33272, 0, "_"], + [33273, 0, "3"], + [33295, 1], + [33295, 0, "_"], + [33296, 0, "3"], + [33315, 0, "\n"], + [33316, 0, "\n"], + [33317, 0, "\\"], + [33318, 0, "b"], + [33319, 0, "e"], + [33320, 0, "g"], + [33321, 0, "i"], + [33322, 0, "n"], + [33323, 0, "{"], + [33324, 0, "p"], + [33325, 0, "r"], + [33326, 0, "o"], + [33327, 0, "o"], + [33328, 0, "f"], + [33329, 0, "t"], + [33330, 0, "r"], + [33331, 0, "e"], + [33332, 0, "e"], + [33333, 0, "}"], + [33334, 0, "\n"], + [33335, 0, "\\"], + [33336, 0, "e"], + [33337, 0, "n"], + [33338, 0, "d"], + [33339, 0, "{"], + [33340, 0, "p"], + [33341, 0, "r"], + [33342, 0, "o"], + [33343, 0, "o"], + [33344, 0, "f"], + [33345, 0, "t"], + [33346, 0, "r"], + [33347, 0, "e"], + [33348, 0, "e"], + [33349, 0, "}"], + [33334, 0, "\n"], + [33335, 0, "\\"], + [33336, 0, "A"], + [33337, 0, "x"], + [33338, 0, "i"], + [33339, 0, "o"], + [33340, 0, "m"], + [33341, 0, "C"], + [33342, 0, "{"], + [33343, 0, "$"], + [33344, 0, "\\"], + [33345, 0, "b"], + [33346, 0, "e"], + [33347, 0, "g"], + [33348, 0, "i"], + [33349, 0, "n"], + [33350, 0, "{"], + [33351, 0, "m"], + [33352, 0, "a"], + [33353, 0, "t"], + [33354, 0, "r"], + [33355, 0, "i"], + [33356, 0, "x"], + [33357, 0, "}"], + [33358, 0, "\n"], + [33359, 0, " "], + [33360, 0, " "], + [33361, 0, " "], + [33362, 0, " "], + [33363, 0, "\\"], + [33364, 0, "m"], + [33365, 0, "a"], + [33366, 0, "t"], + [33367, 0, "h"], + [33368, 0, "i"], + [33369, 0, "t"], + [33370, 0, "{"], + [33371, 0, "c"], + [33372, 0, "t"], + [33373, 0, "x"], + [33374, 0, "}"], + [33375, 0, ","], + [33376, 0, "\\"], + [33377, 0, ","], + [33378, 0, " "], + [33379, 0, "\\"], + [33380, 0, "m"], + [33381, 0, "a"], + [33382, 0, "t"], + [33383, 0, "h"], + [33384, 0, "s"], + [33385, 0, "f"], + [33386, 0, "{"], + [33387, 0, "c"], + [33388, 0, "l"], + [33389, 0, "e"], + [33390, 0, "a"], + [33391, 0, "r"], + [33392, 0, "}"], + [33393, 0, "("], + [33394, 0, "\\"], + [33395, 0, "m"], + [33396, 0, "a"], + [33397, 0, "t"], + [33398, 0, "h"], + [33399, 0, "i"], + [33400, 0, "t"], + [33401, 0, "{"], + [33402, 0, "d"], + [33403, 0, "e"], + [33404, 0, "p"], + [33405, 0, "s"], + [33406, 0, "}"], + [33407, 0, ","], + [33408, 0, " "], + [33409, 0, "\\"], + [33410, 0, "m"], + [33411, 0, "a"], + [33412, 0, "t"], + [33413, 0, "h"], + [33414, 0, "s"], + [33415, 0, "f"], + [33416, 0, "{"], + [33417, 0, "m"], + [33418, 0, "a"], + [33419, 0, "p"], + [33420, 0, "T"], + [33421, 0, "}"], + [33422, 0, "("], + [33423, 0, "k"], + [33424, 0, ")"], + [33425, 0, ")"], + [33426, 0, " "], + [33427, 0, "\\"], + [33428, 0, "\\"], + [33429, 0, "\n"], + [33430, 0, " "], + [33431, 0, " "], + [33432, 0, " "], + [33433, 0, " "], + [33434, 0, "\\"], + [33435, 0, "e"], + [33436, 0, "v"], + [33437, 0, "a"], + [33438, 0, "l"], + [33439, 0, "t"], + [33440, 0, "o"], + [33441, 0, " "], + [33442, 0, "\\"], + [33443, 0, "m"], + [33444, 0, "a"], + [33445, 0, "t"], + [33446, 0, "h"], + [33447, 0, "i"], + [33448, 0, "t"], + [33449, 0, "{"], + [33450, 0, "c"], + [33451, 0, "t"], + [33452, 0, "x"], + [33453, 0, "_"], + [33453, 1], + [33453, 0, "}"], + [33454, 0, "_"], + [33455, 0, "1"], + [33456, 0, ","], + [33457, 0, "\\"], + [33458, 0, ","], + [33459, 0, " "], + [33460, 0, "\\"], + [33461, 0, "m"], + [33462, 0, "a"], + [33463, 0, "t"], + [33464, 0, "h"], + [33465, 0, "i"], + [33466, 0, "t"], + [33467, 0, "{"], + [33468, 0, "p"], + [33469, 0, "r"], + [33470, 0, "e"], + [33471, 0, "s"], + [33472, 0, "}"], + [33473, 0, "_"], + [33474, 0, "1"], + [33475, 0, " "], + [33476, 0, "\\"], + [33477, 0, "e"], + [33478, 0, "n"], + [33479, 0, "d"], + [33480, 0, "{"], + [33481, 0, "m"], + [33482, 0, "a"], + [33483, 0, "t"], + [33484, 0, "r"], + [33485, 0, "i"], + [33486, 0, "x"], + [33487, 0, "}"], + [33488, 0, "$"], + [33489, 0, "}"], + [33490, 0, "\n"], + [33491, 0, "\\"], + [33492, 0, "A"], + [33493, 0, "x"], + [33494, 0, "i"], + [33495, 0, "o"], + [33496, 0, "m"], + [33497, 0, "C"], + [33498, 0, "{"], + [33499, 0, "$"], + [33500, 0, "\\"], + [33501, 0, "b"], + [33502, 0, "e"], + [33503, 0, "g"], + [33504, 0, "i"], + [33505, 0, "n"], + [33506, 0, "{"], + [33507, 0, "m"], + [33508, 0, "a"], + [33509, 0, "t"], + [33510, 0, "r"], + [33511, 0, "i"], + [33512, 0, "x"], + [33513, 0, "}"], + [33514, 0, "\n"], + [33515, 0, " "], + [33516, 0, " "], + [33517, 0, " "], + [33518, 0, " "], + [33519, 0, "\\"], + [33520, 0, "m"], + [33521, 0, "a"], + [33522, 0, "t"], + [33523, 0, "h"], + [33524, 0, "i"], + [33525, 0, "t"], + [33526, 0, "{"], + [33527, 0, "c"], + [33528, 0, "t"], + [33529, 0, "x"], + [33530, 0, "}"], + [33531, 0, "_"], + [33532, 0, "1"], + [33533, 0, ","], + [33534, 0, "\\"], + [33535, 0, ","], + [33536, 0, " "], + [33537, 0, "\\"], + [33538, 0, "m"], + [33539, 0, "a"], + [33540, 0, "t"], + [33541, 0, "h"], + [33542, 0, "s"], + [33543, 0, "f"], + [33544, 0, "{"], + [33545, 0, "c"], + [33546, 0, "l"], + [33547, 0, "e"], + [33548, 0, "a"], + [33549, 0, "r"], + [33550, 0, "}"], + [33551, 0, "("], + [33552, 0, "\\"], + [33553, 0, "m"], + [33554, 0, "a"], + [33555, 0, "t"], + [33556, 0, "h"], + [33557, 0, "i"], + [33558, 0, "t"], + [33559, 0, "{"], + [33560, 0, "d"], + [33561, 0, "e"], + [33562, 0, "p"], + [33563, 0, "s"], + [33564, 0, "}"], + [33565, 0, ","], + [33566, 0, " "], + [33567, 0, "\\"], + [33568, 0, "m"], + [33569, 0, "a"], + [33570, 0, "t"], + [33571, 0, "h"], + [33572, 0, "s"], + [33573, 0, "f"], + [33574, 0, "{"], + [33575, 0, "l"], + [33576, 0, "i"], + [33577, 0, "s"], + [33578, 0, "t"], + [33579, 0, "T"], + [33580, 0, "}"], + [33581, 0, "("], + [33582, 0, "k"], + [33583, 0, ")"], + [33584, 0, ")"], + [33585, 0, " "], + [33586, 0, "\\"], + [33587, 0, "\\"], + [33588, 0, "\n"], + [33589, 0, " "], + [33590, 0, " "], + [33591, 0, " "], + [33592, 0, " "], + [33593, 0, "\\"], + [33594, 0, "e"], + [33595, 0, "v"], + [33596, 0, "a"], + [33597, 0, "l"], + [33598, 0, "t"], + [33599, 0, "o"], + [33600, 0, " "], + [33601, 0, "\\"], + [33602, 0, "m"], + [33603, 0, "a"], + [33604, 0, "t"], + [33605, 0, "h"], + [33606, 0, "i"], + [33607, 0, "t"], + [33608, 0, "{"], + [33609, 0, "c"], + [33610, 0, "t"], + [33611, 0, "x"], + [33612, 0, "_"], + [33612, 1], + [33612, 0, "}"], + [33613, 0, "_"], + [33614, 0, "2"], + [33615, 0, ","], + [33616, 0, "\\"], + [33617, 0, ","], + [33618, 0, " "], + [33619, 0, "\\"], + [33620, 0, "m"], + [33621, 0, "a"], + [33622, 0, "t"], + [33623, 0, "h"], + [33624, 0, "i"], + [33625, 0, "t"], + [33626, 0, "{"], + [33627, 0, "p"], + [33628, 0, "r"], + [33629, 0, "e"], + [33630, 0, "s"], + [33631, 0, "}"], + [33632, 0, "_"], + [33633, 0, "2"], + [33634, 0, " "], + [33635, 0, "\\"], + [33636, 0, "e"], + [33637, 0, "n"], + [33638, 0, "d"], + [33639, 0, "{"], + [33640, 0, "m"], + [33641, 0, "a"], + [33642, 0, "t"], + [33643, 0, "r"], + [33644, 0, "i"], + [33645, 0, "x"], + [33646, 0, "}"], + [33647, 0, "$"], + [33648, 0, "}"], + [33649, 0, "\n"], + [33650, 0, "\\"], + [33651, 0, "A"], + [33652, 0, "x"], + [33653, 0, "i"], + [33654, 0, "o"], + [33655, 0, "m"], + [33656, 0, "C"], + [33657, 0, "{"], + [33658, 0, "$"], + [33659, 0, "\\"], + [33660, 0, "b"], + [33661, 0, "e"], + [33662, 0, "g"], + [33663, 0, "i"], + [33664, 0, "n"], + [33665, 0, "{"], + [33666, 0, "m"], + [33667, 0, "a"], + [33668, 0, "t"], + [33669, 0, "r"], + [33670, 0, "i"], + [33671, 0, "x"], + [33672, 0, "}"], + [33673, 0, "\n"], + [33674, 0, " "], + [33675, 0, " "], + [33676, 0, " "], + [33677, 0, " "], + [33678, 0, "\\"], + [33679, 0, "m"], + [33680, 0, "a"], + [33681, 0, "t"], + [33682, 0, "h"], + [33683, 0, "i"], + [33684, 0, "t"], + [33685, 0, "{"], + [33686, 0, "c"], + [33687, 0, "t"], + [33688, 0, "x"], + [33689, 0, "}"], + [33690, 0, "_"], + [33691, 0, "2"], + [33692, 0, ","], + [33693, 0, "\\"], + [33694, 0, ","], + [33695, 0, " "], + [33696, 0, "\\"], + [33697, 0, "m"], + [33698, 0, "a"], + [33699, 0, "t"], + [33700, 0, "h"], + [33701, 0, "s"], + [33702, 0, "f"], + [33703, 0, "{"], + [33704, 0, "c"], + [33705, 0, "l"], + [33706, 0, "e"], + [33707, 0, "a"], + [33708, 0, "r"], + [33709, 0, "}"], + [33710, 0, "("], + [33711, 0, "\\"], + [33712, 0, "m"], + [33713, 0, "a"], + [33714, 0, "t"], + [33715, 0, "h"], + [33716, 0, "i"], + [33717, 0, "t"], + [33718, 0, "{"], + [33719, 0, "d"], + [33720, 0, "e"], + [33721, 0, "p"], + [33722, 0, "s"], + [33723, 0, "}"], + [33724, 0, ","], + [33725, 0, " "], + [33726, 0, "\\"], + [33727, 0, "m"], + [33728, 0, "a"], + [33729, 0, "t"], + [33730, 0, "h"], + [33731, 0, "s"], + [33732, 0, "f"], + [33733, 0, "{"], + [33734, 0, "r"], + [33735, 0, "e"], + [33736, 0, "g"], + [33737, 0, "T"], + [33738, 0, "}"], + [33739, 0, "("], + [33740, 0, "k"], + [33741, 0, ")"], + [33742, 0, ")"], + [33743, 0, " "], + [33744, 0, "\\"], + [33745, 0, "\\"], + [33746, 0, "\n"], + [33747, 0, " "], + [33748, 0, " "], + [33749, 0, " "], + [33750, 0, " "], + [33751, 0, "\\"], + [33752, 0, "e"], + [33753, 0, "v"], + [33754, 0, "a"], + [33755, 0, "l"], + [33756, 0, "t"], + [33757, 0, "o"], + [33758, 0, " "], + [33759, 0, "\\"], + [33760, 0, "m"], + [33761, 0, "a"], + [33762, 0, "t"], + [33763, 0, "h"], + [33764, 0, "i"], + [33765, 0, "t"], + [33766, 0, "{"], + [33767, 0, "c"], + [33768, 0, "t"], + [33769, 0, "x"], + [33770, 0, "}"], + [33771, 0, "_"], + [33772, 0, "3"], + [33773, 0, ","], + [33774, 0, "\\"], + [33775, 0, ","], + [33776, 0, " "], + [33777, 0, "\\"], + [33778, 0, "m"], + [33779, 0, "a"], + [33780, 0, "t"], + [33781, 0, "h"], + [33782, 0, "i"], + [33783, 0, "t"], + [33784, 0, "{"], + [33785, 0, "p"], + [33786, 0, "r"], + [33787, 0, "e"], + [33788, 0, "s"], + [33789, 0, "}"], + [33790, 0, "_"], + [33791, 0, "3"], + [33792, 0, "}"], + [33793, 0, " "], + [33793, 1], + [33792, 1], + [33792, 0, " "], + [33793, 0, "\\"], + [33794, 0, "e"], + [33795, 0, "n"], + [33796, 0, "d"], + [33797, 0, "{"], + [33798, 0, "m"], + [33799, 0, "a"], + [33800, 0, "t"], + [33801, 0, "r"], + [33802, 0, "i"], + [33803, 0, "x"], + [33804, 0, "}"], + [33805, 0, "$"], + [33806, 0, "}"], + [33807, 0, "\n"], + [33808, 0, "\\"], + [33809, 0, "L"], + [33810, 0, "e"], + [33811, 0, "f"], + [33812, 0, "t"], + [33813, 0, "L"], + [33814, 0, "a"], + [33815, 0, "b"], + [33816, 0, "e"], + [33817, 0, "l"], + [33818, 0, "{"], + [33819, 0, "\\"], + [33820, 0, "t"], + [33821, 0, "e"], + [33822, 0, "x"], + [33823, 0, "t"], + [33824, 0, "s"], + [33825, 0, "c"], + [33826, 0, "{"], + [33827, 0, "C"], + [33828, 0, "l"], + [33829, 0, "e"], + [33830, 0, "a"], + [33831, 0, "r"], + [33832, 0, "-"], + [33833, 0, "A"], + [33834, 0, "n"], + [33835, 0, "y"], + [33836, 0, "}"], + [33837, 0, "}"], + [33838, 0, "\n"], + [33839, 0, "\\"], + [33840, 0, "T"], + [33841, 0, "r"], + [33842, 0, "i"], + [33843, 0, "n"], + [33844, 0, "a"], + [33845, 0, "r"], + [33846, 0, "y"], + [33847, 0, "I"], + [33848, 0, "n"], + [33849, 0, "f"], + [33850, 0, "C"], + [33851, 0, "{"], + [33852, 0, "$"], + [33853, 0, "\\"], + [33854, 0, "m"], + [33855, 0, "a"], + [33856, 0, "t"], + [33857, 0, "h"], + [33858, 0, "i"], + [33859, 0, "t"], + [33860, 0, "{"], + [33861, 0, "c"], + [33862, 0, "t"], + [33863, 0, "x"], + [33864, 0, "}"], + [33865, 0, ","], + [33866, 0, "\\"], + [33867, 0, ","], + [33868, 0, " "], + [33869, 0, "\\"], + [33870, 0, "m"], + [33871, 0, "a"], + [33872, 0, "t"], + [33873, 0, "h"], + [33874, 0, "s"], + [33875, 0, "f"], + [33876, 0, "{"], + [33877, 0, "c"], + [33878, 0, "l"], + [33879, 0, "e"], + [33880, 0, "a"], + [33881, 0, "r"], + [33882, 0, "E"], + [33883, 0, "l"], + [33884, 0, "e"], + [33885, 0, "m"], + [33885, 1], + [33884, 1], + [33883, 1], + [33882, 1], + [33882, 0, "A"], + [33883, 0, "n"], + [33884, 0, "y"], + [33885, 0, "}"], + [33886, 0, "("], + [33887, 0, "\\"], + [33888, 0, "m"], + [33889, 0, "a"], + [33890, 0, "t"], + [33891, 0, "h"], + [33892, 0, "i"], + [33893, 0, "t"], + [33894, 0, "{"], + [33895, 0, "d"], + [33896, 0, "e"], + [33897, 0, "p"], + [33898, 0, "s"], + [33899, 0, "}"], + [33900, 0, ","], + [33901, 0, " "], + [33902, 0, "k"], + [33903, 0, ")"], + [33904, 0, " "], + [33905, 0, "\\"], + [33906, 0, "e"], + [33907, 0, "v"], + [33908, 0, "a"], + [33909, 0, "l"], + [33910, 0, "t"], + [33911, 0, "o"], + [33912, 0, "\n"], + [33913, 0, " "], + [33914, 0, " "], + [33915, 0, " "], + [33916, 0, " "], + [33917, 0, "\\"], + [33918, 0, "m"], + [33919, 0, "a"], + [33920, 0, "t"], + [33921, 0, "h"], + [33922, 0, "i"], + [33923, 0, "t"], + [33924, 0, "{"], + [33925, 0, "c"], + [33926, 0, "t"], + [33927, 0, "x"], + [33928, 0, "}"], + [33929, 0, "-"], + [33929, 1], + [33929, 0, "_"], + [33930, 0, "3"], + [33931, 0, ","], + [33932, 0, "\\"], + [33933, 0, ","], + [33934, 0, " "], + [33935, 0, "\\"], + [33936, 0, "m"], + [33937, 0, "a"], + [33938, 0, "t"], + [33939, 0, "h"], + [33940, 0, "t"], + [33940, 1], + [33940, 0, "i"], + [33941, 0, "t"], + [33942, 0, "{"], + [33943, 0, "p"], + [33944, 0, "r"], + [33945, 0, "e"], + [33946, 0, "s"], + [33947, 0, "}"], + [33948, 0, "_"], + [33949, 0, "1"], + [33950, 0, " "], + [33951, 0, "\\"], + [33952, 0, ","], + [33953, 0, "\\"], + [33954, 0, "c"], + [33955, 0, "u"], + [33956, 0, "p"], + [33957, 0, "\\"], + [33958, 0, ","], + [33959, 0, " "], + [33960, 0, "\\"], + [33961, 0, "m"], + [33962, 0, "a"], + [33963, 0, "t"], + [33964, 0, "h"], + [33965, 0, "i"], + [33966, 0, "t"], + [33967, 0, "{"], + [33968, 0, "p"], + [33969, 0, "r"], + [33970, 0, "e"], + [33971, 0, "s"], + [33972, 0, "}"], + [33973, 0, "_"], + [33974, 0, "2"], + [33975, 0, " "], + [33976, 0, "\\"], + [33977, 0, "c"], + [33978, 0, "\\"], + [33978, 1], + [33977, 1], + [33977, 0, ","], + [33978, 0, "\\"], + [33979, 0, "c"], + [33980, 0, "u"], + [33981, 0, "p"], + [33982, 0, "\\"], + [33983, 0, ","], + [33984, 0, " "], + [33985, 0, "\\"], + [33986, 0, "m"], + [33987, 0, "a"], + [33988, 0, "t"], + [33989, 0, "h"], + [33990, 0, "i"], + [33991, 0, "t"], + [33992, 0, "{"], + [33993, 0, "p"], + [33994, 0, "r"], + [33995, 0, "e"], + [33996, 0, "s"], + [33997, 0, "}"], + [33998, 0, "_"], + [33999, 0, "3"], + [34000, 0, " "], + [34000, 1], + [34000, 0, "$"], + [34001, 0, "}"], + [34018, 0, "\n"], + [34019, 0, "\n"], + [34020, 0, "\\"], + [34021, 0, "b"], + [34022, 0, "e"], + [34023, 0, "g"], + [34024, 0, "i"], + [34025, 0, "n"], + [34026, 0, "{"], + [34027, 0, "p"], + [34028, 0, "r"], + [34029, 0, "o"], + [34030, 0, "o"], + [34031, 0, "f"], + [34032, 0, "t"], + [34033, 0, "r"], + [34034, 0, "e"], + [34035, 0, "e"], + [34036, 0, "}"], + [34037, 0, "\n"], + [34038, 0, "\\"], + [34039, 0, "e"], + [34040, 0, "n"], + [34041, 0, "d"], + [34042, 0, "{"], + [34043, 0, "p"], + [34044, 0, "r"], + [34045, 0, "o"], + [34046, 0, "o"], + [34047, 0, "f"], + [34048, 0, "t"], + [34049, 0, "r"], + [34050, 0, "e"], + [34051, 0, "e"], + [34052, 0, "}"], + [34037, 0, "\n"], + [34038, 0, "\\"], + [34039, 0, "A"], + [34040, 0, "x"], + [34041, 0, "i"], + [34042, 0, "o"], + [34043, 0, "m"], + [34044, 0, "C"], + [34045, 0, "{"], + [34046, 0, "$"], + [34047, 0, "k"], + [34048, 0, " "], + [34049, 0, "\\"], + [34050, 0, "n"], + [34051, 0, "o"], + [34052, 0, "t"], + [34053, 0, "i"], + [34054, 0, "n"], + [34055, 0, " "], + [34056, 0, "\\"], + [34057, 0, "m"], + [34058, 0, "a"], + [34059, 0, "t"], + [34060, 0, "h"], + [34061, 0, "r"], + [34062, 0, "m"], + [34063, 0, "{"], + [34064, 0, "d"], + [34065, 0, "o"], + [34066, 0, "m"], + [34067, 0, "}"], + [34068, 0, "("], + [34069, 0, "\\"], + [34070, 0, "m"], + [34071, 0, "a"], + [34072, 0, "t"], + [34073, 0, "h"], + [34074, 0, "i"], + [34075, 0, "t"], + [34076, 0, "{"], + [34077, 0, "c"], + [34078, 0, "t"], + [34079, 0, "x"], + [34080, 0, "}"], + [34081, 0, ")"], + [34082, 0, "$"], + [34083, 0, "}"], + [34084, 0, "\n"], + [34085, 0, "\\"], + [34086, 0, "L"], + [34087, 0, "e"], + [34088, 0, "f"], + [34089, 0, "t"], + [34090, 0, "L"], + [34091, 0, "a"], + [34092, 0, "b"], + [34093, 0, "e"], + [34094, 0, "l"], + [34095, 0, "{"], + [34096, 0, "\\"], + [34097, 0, "t"], + [34098, 0, "e"], + [34099, 0, "x"], + [34100, 0, "t"], + [34101, 0, "s"], + [34102, 0, "c"], + [34103, 0, "{"], + [34104, 0, "C"], + [34105, 0, "l"], + [34106, 0, "e"], + [34107, 0, "a"], + [34108, 0, "r"], + [34109, 0, "-"], + [34110, 0, "N"], + [34111, 0, "o"], + [34112, 0, "n"], + [34113, 0, "e"], + [34114, 0, "}"], + [34115, 0, "}"], + [34116, 0, "\n"], + [34117, 0, "\\"], + [34118, 0, "U"], + [34119, 0, "n"], + [34120, 0, "a"], + [34121, 0, "r"], + [34122, 0, "y"], + [34123, 0, "I"], + [34124, 0, "n"], + [34125, 0, "f"], + [34126, 0, "C"], + [34127, 0, "{"], + [34128, 0, "$"], + [34129, 0, "\\"], + [34130, 0, "m"], + [34131, 0, "a"], + [34132, 0, "t"], + [34133, 0, "h"], + [34134, 0, "i"], + [34135, 0, "t"], + [34136, 0, "{"], + [34137, 0, "c"], + [34138, 0, "t"], + [34139, 0, "x"], + [34140, 0, "}"], + [34141, 0, ","], + [34142, 0, "\\"], + [34143, 0, ","], + [34144, 0, " "], + [34145, 0, "\\"], + [34146, 0, "m"], + [34147, 0, "a"], + [34148, 0, "t"], + [34149, 0, "h"], + [34150, 0, "s"], + [34151, 0, "f"], + [34152, 0, "{"], + [34153, 0, "c"], + [34154, 0, "l"], + [34155, 0, "e"], + [34156, 0, "a"], + [34157, 0, "r"], + [34158, 0, "}"], + [34159, 0, "("], + [34160, 0, "\\"], + [34161, 0, "m"], + [34162, 0, "a"], + [34163, 0, "t"], + [34164, 0, "h"], + [34165, 0, "i"], + [34166, 0, "t"], + [34167, 0, "{"], + [34168, 0, "d"], + [34169, 0, "e"], + [34170, 0, "p"], + [34171, 0, "s"], + [34172, 0, "}"], + [34173, 0, ","], + [34174, 0, " "], + [34175, 0, "k"], + [34176, 0, ")"], + [34177, 0, " "], + [34178, 0, "\\"], + [34179, 0, "e"], + [34180, 0, "v"], + [34181, 0, "a"], + [34182, 0, "l"], + [34183, 0, "t"], + [34184, 0, "o"], + [34185, 0, " "], + [34186, 0, "\\"], + [34187, 0, "m"], + [34188, 0, "a"], + [34189, 0, "t"], + [34190, 0, "h"], + [34191, 0, "i"], + [34192, 0, "o"], + [34193, 0, "t"], + [34193, 1], + [34192, 1], + [34192, 0, "t"], + [34193, 0, "{"], + [34194, 0, "c"], + [34195, 0, "t"], + [34196, 0, "x"], + [34197, 0, "}"], + [34198, 0, ","], + [34199, 0, "\\"], + [34200, 0, ","], + [34201, 0, " "], + [34202, 0, "\\"], + [34203, 0, "{"], + [34204, 0, "\\"], + [34205, 0, "}"], + [34206, 0, "$"], + [34207, 0, "}"], + [34559, 1], + [34558, 1], + [34558, 0, "c"], + [34559, 0, "l"], + [34560, 0, "e"], + [34561, 0, "a"], + [34562, 0, "r"], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34565, 1], + [34579, 0, " "], + [34580, 0, "\\"], + [34581, 0, "m"], + [34582, 0, "a"], + [34583, 0, "t"], + [34584, 0, "h"], + [34585, 0, "s"], + [34586, 0, "f"], + [34587, 0, "{"], + [34588, 0, "r"], + [34589, 0, "e"], + [34590, 0, "g"], + [34591, 0, "T"], + [34592, 0, "}"], + [34593, 0, "("], + [34594, 0, "k"], + [34595, 0, ")"], + [34596, 0, ")"], + [34597, 0, " "], + [34598, 0, "\\"], + [34599, 0, "e"], + [34600, 0, "v"], + [34601, 0, "a"], + [34602, 0, "l"], + [34603, 0, "t"], + [34604, 0, "o"], + [34673, 1], + [34672, 1], + [34671, 1], + [34670, 1], + [34669, 1], + [34668, 1], + [34667, 1], + [34666, 1], + [34665, 1], + [34664, 1], + [34663, 1], + [34662, 1], + [34661, 1], + [34660, 1], + [34659, 1], + [34658, 1], + [34657, 1], + [34656, 1], + [34655, 1], + [34654, 1], + [34653, 1], + [34652, 1], + [34651, 1], + [34650, 1], + [34649, 1], + [34648, 1], + [34647, 1], + [34646, 1], + [34645, 1], + [34644, 1], + [34643, 1], + [34642, 1], + [34641, 1], + [34640, 1], + [34639, 1], + [34638, 1], + [34637, 1], + [34636, 1], + [34635, 1], + [34634, 1], + [34633, 1], + [34632, 1], + [34631, 1], + [34630, 1], + [34629, 1], + [34628, 1], + [34627, 1], + [34626, 1], + [34625, 1], + [34624, 1], + [34623, 1], + [34622, 1], + [34621, 1], + [34620, 1], + [34619, 1], + [34618, 1], + [34617, 1], + [34616, 1], + [34615, 1], + [34614, 1], + [34613, 1], + [34612, 1], + [34611, 1], + [34610, 1], + [34609, 1], + [34608, 1], + [34607, 1], + [34606, 1], + [34605, 1], + [34678, 0, ","], + [34679, 0, "\\"], + [34680, 0, ","], + [34681, 0, " "], + [34682, 0, "\\"], + [34683, 0, "m"], + [34684, 0, "a"], + [34685, 0, "t"], + [34686, 0, "h"], + [34687, 0, "i"], + [34688, 0, "t"], + [34689, 0, "{"], + [34689, 1], + [34688, 1], + [34687, 1], + [34687, 0, "r"], + [34688, 0, "m"], + [34689, 0, "{"], + [34690, 0, "d"], + [34691, 0, "o"], + [34692, 0, "m"], + [34693, 0, "}"], + [34694, 0, "("], + [34695, 0, "\\"], + [34696, 0, "m"], + [34697, 0, "a"], + [34698, 0, "t"], + [34699, 0, "h"], + [34700, 0, "i"], + [34701, 0, "t"], + [34702, 0, "{"], + [34703, 0, "c"], + [34704, 0, "o"], + [34705, 0, "n"], + [34706, 0, "c"], + [34707, 0, "u"], + [34708, 0, "r"], + [34709, 0, "r"], + [34710, 0, "e"], + [34711, 0, "n"], + [34712, 0, "t"], + [34713, 0, "}"], + [34714, 0, ")"], + [34360, 1], + [34360, 1], + [34349, 1], + [34348, 1], + [34393, 1], + [34392, 1], + [34381, 1], + [34380, 1], + [34453, 1], + [34453, 1], + [34723, 0, "\n"], + [34724, 0, "\n"], + [34725, 0, "\\"], + [34726, 0, "b"], + [34727, 0, "e"], + [34728, 0, "g"], + [34729, 0, "i"], + [34730, 0, "n"], + [34731, 0, "{"], + [34732, 0, "p"], + [34733, 0, "r"], + [34734, 0, "o"], + [34735, 0, "o"], + [34736, 0, "f"], + [34737, 0, "t"], + [34738, 0, "r"], + [34739, 0, "e"], + [34740, 0, "e"], + [34741, 0, "}"], + [34742, 0, "\n"], + [34743, 0, "\\"], + [34744, 0, "e"], + [34745, 0, "n"], + [34746, 0, "d"], + [34747, 0, "{"], + [34748, 0, "p"], + [34749, 0, "r"], + [34750, 0, "o"], + [34751, 0, "o"], + [34752, 0, "f"], + [34753, 0, "t"], + [34754, 0, "r"], + [34755, 0, "e"], + [34756, 0, "e"], + [34757, 0, "}"], + [34742, 0, "\n"], + [34743, 0, "\\"], + [34744, 0, "A"], + [34745, 0, "x"], + [34746, 0, "i"], + [34747, 0, "o"], + [34748, 0, "m"], + [34749, 0, "C"], + [34750, 0, "{"], + [34751, 0, "$"], + [34752, 0, "\\"], + [34753, 0, "m"], + [34754, 0, "a"], + [34755, 0, "t"], + [34756, 0, "h"], + [34757, 0, "s"], + [34758, 0, "f"], + [34759, 0, "{"], + [34760, 0, "m"], + [34761, 0, "a"], + [34762, 0, "p"], + [34763, 0, "T"], + [34764, 0, "}"], + [34765, 0, "("], + [34766, 0, "k"], + [34767, 0, ")"], + [34768, 0, " "], + [34769, 0, "\\"], + [34770, 0, "i"], + [34771, 0, "n"], + [34772, 0, " "], + [34773, 0, "\\"], + [34774, 0, "m"], + [34775, 0, "a"], + [34776, 0, "t"], + [34777, 0, "h"], + [34778, 0, "r"], + [34779, 0, "m"], + [34780, 0, "{"], + [34781, 0, "d"], + [34782, 0, "o"], + [34783, 0, "m"], + [34784, 0, "}"], + [34785, 0, "("], + [34786, 0, "\\"], + [34787, 0, "m"], + [34788, 0, "a"], + [34789, 0, "t"], + [34790, 0, "h"], + [34791, 0, "i"], + [34792, 0, "t"], + [34793, 0, "{"], + [34794, 0, "c"], + [34795, 0, "t"], + [34796, 0, "x"], + [34797, 0, "}"], + [34798, 0, ")"], + [34799, 0, "$"], + [34800, 0, "}"], + [34801, 0, "\n"], + [34802, 0, "\\"], + [34803, 0, "L"], + [34804, 0, "e"], + [34805, 0, "f"], + [34806, 0, "t"], + [34807, 0, "L"], + [34808, 0, "a"], + [34809, 0, "b"], + [34810, 0, "e"], + [34811, 0, "l"], + [34812, 0, "{"], + [34813, 0, "\\"], + [34814, 0, "t"], + [34815, 0, "e"], + [34816, 0, "x"], + [34817, 0, "t"], + [34818, 0, "s"], + [34819, 0, "c"], + [34820, 0, "{"], + [34821, 0, "C"], + [34822, 0, "l"], + [34823, 0, "e"], + [34824, 0, "a"], + [34825, 0, "r"], + [34826, 0, "-"], + [34827, 0, "M"], + [34828, 0, "a"], + [34829, 0, "p"], + [34830, 0, "}"], + [34831, 0, "}"], + [34832, 0, "\n"], + [34833, 0, "\\"], + [34813, 0, "$"], + [34832, 0, "_"], + [34833, 0, "1"], + [34834, 0, "$"], + [34837, 1], + [34836, 1], + [34801, 0, "\n"], + [34802, 0, "\\"], + [34803, 0, "A"], + [34804, 0, "x"], + [34805, 0, "i"], + [34806, 0, "o"], + [34807, 0, "m"], + [34808, 0, "C"], + [34809, 0, "{"], + [34810, 0, "$"], + [34811, 0, "\\"], + [34812, 0, "m"], + [34813, 0, "a"], + [34814, 0, "t"], + [34815, 0, "h"], + [34816, 0, "i"], + [34817, 0, "t"], + [34818, 0, "{"], + [34819, 0, "c"], + [34820, 0, "t"], + [34821, 0, "x"], + [34822, 0, "}"], + [34823, 0, ","], + [34824, 0, "\\"], + [34824, 1], + [34823, 1], + [34823, 0, "("], + [34824, 0, "\\"], + [34825, 0, "m"], + [34826, 0, "a"], + [34827, 0, "t"], + [34828, 0, "h"], + [34829, 0, "s"], + [34830, 0, "f"], + [34831, 0, "{"], + [34832, 0, "m"], + [34833, 0, "a"], + [34834, 0, "p"], + [34835, 0, "T"], + [34836, 0, "}"], + [34837, 0, "("], + [34838, 0, "k"], + [34839, 0, ")"], + [34840, 0, ")"], + [34841, 0, "\\"], + [34841, 1], + [34841, 0, ","], + [34842, 0, "\\"], + [34843, 0, ","], + [34844, 0, " "], + [34845, 0, "\\"], + [34846, 0, "m"], + [34847, 0, "a"], + [34848, 0, "t"], + [34849, 0, "h"], + [34850, 0, "s"], + [34851, 0, "f"], + [34852, 0, "{"], + [34853, 0, "c"], + [34854, 0, "l"], + [34855, 0, "e"], + [34856, 0, "a"], + [34857, 0, "r"], + [34858, 0, "M"], + [34859, 0, "a"], + [34860, 0, "p"], + [34861, 0, "}"], + [34862, 0, "("], + [34863, 0, "\\"], + [34864, 0, "m"], + [34865, 0, "a"], + [34866, 0, "t"], + [34867, 0, "h"], + [34868, 0, "i"], + [34869, 0, "t"], + [34870, 0, "{"], + [34871, 0, "d"], + [34872, 0, "e"], + [34873, 0, "p"], + [34874, 0, "s"], + [34875, 0, "}"], + [34876, 0, ","], + [34877, 0, " "], + [34878, 0, "\\"], + [34879, 0, "{"], + [34880, 0, "\\"], + [34881, 0, "}"], + [34882, 0, ")"], + [34883, 0, " "], + [34884, 0, "\\"], + [34885, 0, "e"], + [34886, 0, "v"], + [34887, 0, "a"], + [34888, 0, "l"], + [34889, 0, "t"], + [34890, 0, "o"], + [34891, 0, " "], + [34892, 0, "\\"], + [34893, 0, "m"], + [34894, 0, "a"], + [34895, 0, "t"], + [34896, 0, "h"], + [34891, 0, "\n"], + [34892, 0, " "], + [34893, 0, " "], + [34894, 0, " "], + [34901, 0, "i"], + [34902, 0, "t"], + [34903, 0, "{"], + [34904, 0, "c"], + [34905, 0, "l"], + [34906, 0, "e"], + [34907, 0, "a"], + [34908, 0, "r"], + [34909, 0, "e"], + [34910, 0, "d"], + [34911, 0, "}"], + [34912, 0, ","], + [34913, 0, "\\"], + [34914, 0, ","], + [34915, 0, " "], + [34916, 0, "\\"], + [34917, 0, "m"], + [34918, 0, "a"], + [34919, 0, "t"], + [34920, 0, "h"], + [34921, 0, "i"], + [34922, 0, "t"], + [34923, 0, "{"], + [34924, 0, "p"], + [34925, 0, "r"], + [34926, 0, "e"], + [34927, 0, "s"], + [34928, 0, "}"], + [34929, 0, "$"], + [34930, 0, "}"], + [34931, 0, "\n"], + [34932, 0, "\\"], + [34933, 0, "L"], + [34934, 0, "e"], + [34935, 0, "f"], + [34936, 0, "t"], + [34936, 1], + [34935, 1], + [34934, 1], + [34933, 1], + [34932, 1], + [34931, 1], + [34966, 0, "\n"], + [34967, 0, "\\"], + [34968, 0, "B"], + [34969, 0, "i"], + [34970, 0, "n"], + [34971, 0, "a"], + [34972, 0, "r"], + [34973, 0, "y"], + [34974, 0, "I"], + [34975, 0, "n"], + [34976, 0, "f"], + [34977, 0, "C"], + [34978, 0, "{"], + [34979, 0, "$"], + [34980, 0, "\\"], + [34981, 0, "m"], + [34982, 0, "a"], + [34983, 0, "t"], + [34984, 0, "h"], + [34985, 0, "i"], + [34986, 0, "t"], + [34987, 0, "{"], + [34988, 0, "c"], + [34989, 0, "t"], + [34990, 0, "x"], + [34991, 0, "}"], + [34992, 0, ","], + [34993, 0, "\\"], + [34994, 0, ","], + [34995, 0, " "], + [34996, 0, "\\"], + [34997, 0, "m"], + [34998, 0, "a"], + [34999, 0, "t"], + [35000, 0, "h"], + [35001, 0, "s"], + [35002, 0, "f"], + [35003, 0, "{"], + [35004, 0, "c"], + [35005, 0, "l"], + [35006, 0, "e"], + [35007, 0, "a"], + [35008, 0, "r"], + [35009, 0, "("], + [35009, 1], + [35009, 0, "}"], + [35010, 0, "("], + [35011, 0, "\\"], + [35012, 0, "m"], + [35013, 0, "a"], + [35014, 0, "t"], + [35015, 0, "h"], + [35016, 0, "i"], + [35017, 0, "t"], + [35018, 0, "{"], + [35019, 0, "d"], + [35020, 0, "e"], + [35021, 0, "p"], + [35022, 0, "s"], + [35023, 0, "}"], + [35024, 0, ","], + [35025, 0, " "], + [35026, 0, "\\"], + [35027, 0, "m"], + [35028, 0, "a"], + [35029, 0, "t"], + [35030, 0, "h"], + [35031, 0, "s"], + [35032, 0, "f"], + [35033, 0, "{"], + [35034, 0, "m"], + [35035, 0, "a"], + [35036, 0, "p"], + [35037, 0, "T"], + [35038, 0, "}"], + [35039, 0, "("], + [35040, 0, "k"], + [35041, 0, ")"], + [35042, 0, ")"], + [35043, 0, " "], + [35044, 0, "\\"], + [35045, 0, "e"], + [35046, 0, "v"], + [35047, 0, "a"], + [35048, 0, "l"], + [35049, 0, "t"], + [35050, 0, "o"], + [35051, 0, "\n"], + [35052, 0, " "], + [35053, 0, " "], + [35054, 0, " "], + [35055, 0, " "], + [35056, 0, "\\"], + [35057, 0, "m"], + [35058, 0, "a"], + [35059, 0, "t"], + [35060, 0, "h"], + [35061, 0, "i"], + [35062, 0, "t"], + [35063, 0, "{"], + [35064, 0, "c"], + [35065, 0, "t"], + [35066, 0, "x"], + [35067, 0, "}"], + [35068, 0, " "], + [35069, 0, "["], + [35070, 0, "\\"], + [35071, 0, ","], + [35072, 0, " "], + [35073, 0, "\\"], + [35074, 0, "m"], + [35075, 0, "a"], + [35076, 0, "t"], + [35077, 0, "h"], + [35078, 0, "s"], + [35079, 0, "f"], + [35080, 0, "{"], + [35081, 0, "m"], + [35082, 0, "a"], + [35083, 0, "p"], + [35084, 0, "T"], + [35085, 0, "}"], + [35086, 0, "("], + [35087, 0, "k"], + [35088, 0, ")"], + [35089, 0, " "], + [35090, 0, "\\"], + [35091, 0, ","], + [35092, 0, "\\"], + [35093, 0, "m"], + [35094, 0, "a"], + [35095, 0, "p"], + [35096, 0, "s"], + [35097, 0, "t"], + [35098, 0, "o"], + [35099, 0, "\\"], + [35100, 0, ","], + [35101, 0, " "], + [35102, 0, "\\"], + [35103, 0, "m"], + [35104, 0, "a"], + [35105, 0, "t"], + [35106, 0, "h"], + [35107, 0, "i"], + [35108, 0, "t"], + [35109, 0, "{"], + [35110, 0, "c"], + [35111, 0, "l"], + [35112, 0, "e"], + [35113, 0, "a"], + [35114, 0, "r"], + [35115, 0, "e"], + [35116, 0, "d"], + [35117, 0, "}"], + [35118, 0, " "], + [35119, 0, "\\"], + [35120, 0, ","], + [35121, 0, "]"], + [35122, 0, ","], + [35123, 0, "\\"], + [35124, 0, ","], + [35125, 0, " "], + [35126, 0, "\\"], + [35127, 0, "m"], + [35128, 0, "a"], + [35129, 0, "t"], + [35130, 0, "h"], + [35131, 0, "i"], + [35132, 0, "t"], + [35133, 0, "{"], + [35134, 0, "p"], + [35135, 0, "r"], + [35136, 0, "e"], + [35137, 0, "s"], + [35138, 0, "}"], + [35139, 0, "$"], + [35140, 0, "}"], + [35157, 0, "\n"], + [35158, 0, "\n"], + [35159, 0, "\\"], + [35160, 0, "b"], + [35161, 0, "e"], + [35162, 0, "g"], + [35163, 0, "i"], + [35164, 0, "n"], + [35165, 0, "{"], + [35166, 0, "p"], + [35167, 0, "r"], + [35168, 0, "o"], + [35169, 0, "o"], + [35170, 0, "f"], + [35171, 0, "t"], + [35172, 0, "r"], + [35173, 0, "e"], + [35174, 0, "e"], + [35175, 0, "}"], + [35176, 0, "\n"], + [35177, 0, "\\"], + [35178, 0, "n"], + [35179, 0, "e"], + [35179, 1], + [35178, 1], + [35178, 0, "e"], + [35179, 0, "n"], + [35180, 0, "d"], + [35181, 0, "{"], + [35182, 0, "p"], + [35183, 0, "r"], + [35184, 0, "o"], + [35185, 0, "o"], + [35186, 0, "f"], + [35187, 0, "t"], + [35188, 0, "r"], + [35189, 0, "e"], + [35190, 0, "e"], + [35191, 0, "}"], + [35176, 0, "\n"], + [35177, 0, "\\"], + [35178, 0, "A"], + [35179, 0, "x"], + [35180, 0, "i"], + [35181, 0, "o"], + [35182, 0, "m"], + [35183, 0, "C"], + [35184, 0, "{"], + [35185, 0, "$"], + [35186, 0, "k"], + [35187, 0, " "], + [35188, 0, "\\"], + [35189, 0, "i"], + [35190, 0, "n"], + [35191, 0, " "], + [35192, 0, "\\"], + [35193, 0, "m"], + [35194, 0, "a"], + [35195, 0, "t"], + [35196, 0, "h"], + [35197, 0, "r"], + [35198, 0, "m"], + [35199, 0, "{"], + [35200, 0, "k"], + [35201, 0, "e"], + [35202, 0, "y"], + [35203, 0, "s"], + [35204, 0, "}"], + [35205, 0, "("], + [35206, 0, "\\"], + [35207, 0, "m"], + [35208, 0, "a"], + [35209, 0, "t"], + [35210, 0, "h"], + [35211, 0, "i"], + [35212, 0, "t"], + [35213, 0, "{"], + [35214, 0, "c"], + [35215, 0, "t"], + [35216, 0, "x"], + [35217, 0, "}"], + [35218, 0, ")"], + [35219, 0, " "], + [35220, 0, "\\"], + [35221, 0, ","], + [35222, 0, "\\"], + [35223, 0, "w"], + [35224, 0, "e"], + [35225, 0, "d"], + [35226, 0, "g"], + [35227, 0, "e"], + [35228, 0, "\\"], + [35229, 0, ","], + [35230, 0, " "], + [35231, 0, "k"], + [35232, 0, " "], + [35233, 0, "\\"], + [35234, 0, "n"], + [35235, 0, "o"], + [35236, 0, "t"], + [35237, 0, "i"], + [35238, 0, "n"], + [35239, 0, " "], + [35240, 0, "\\"], + [35241, 0, "m"], + [35242, 0, "a"], + [35243, 0, "t"], + [35244, 0, "h"], + [35245, 0, "i"], + [35246, 0, "t"], + [35247, 0, "{"], + [35248, 0, "d"], + [35249, 0, "o"], + [35250, 0, "n"], + [35251, 0, "e"], + [35252, 0, "}"], + [35253, 0, "$"], + [35254, 0, "}"], + [35255, 0, "\n"], + [35256, 0, "\\"], + [35257, 0, "A"], + [35258, 0, "x"], + [35259, 0, "i"], + [35260, 0, "o"], + [35261, 0, "m"], + [35262, 0, "C"], + [35263, 0, "{"], + [35264, 0, "$"], + [35265, 0, "\\"], + [35266, 0, "m"], + [35267, 0, "a"], + [35268, 0, "t"], + [35269, 0, "h"], + [35270, 0, "i"], + [35271, 0, "t"], + [35272, 0, "{"], + [35273, 0, "c"], + [35274, 0, "t"], + [35275, 0, "x"], + [35276, 0, "}"], + [35277, 0, ","], + [35278, 0, "\\"], + [35279, 0, ","], + [35280, 0, " "], + [35281, 0, "\\"], + [35282, 0, "m"], + [35283, 0, "a"], + [35284, 0, "t"], + [35285, 0, "h"], + [35286, 0, "s"], + [35287, 0, "f"], + [35288, 0, "{"], + [35289, 0, "c"], + [35290, 0, "l"], + [35291, 0, "e"], + [35292, 0, "a"], + [35293, 0, "r"], + [35294, 0, "E"], + [35295, 0, "l"], + [35296, 0, "e"], + [35297, 0, "m"], + [35298, 0, "}"], + [35299, 0, "("], + [35300, 0, "\\"], + [35301, 0, "m"], + [35302, 0, "a"], + [35303, 0, "t"], + [35304, 0, "h"], + [35305, 0, "i"], + [35306, 0, "t"], + [35307, 0, "{"], + [35308, 0, "d"], + [35309, 0, "e"], + [35310, 0, "p"], + [35311, 0, "s"], + [35312, 0, "}"], + [35313, 0, ","], + [35314, 0, " "], + [35315, 0, "k"], + [35316, 0, ")"], + [35317, 0, " "], + [35318, 0, "\\"], + [35319, 0, "e"], + [35320, 0, "v"], + [35321, 0, "a"], + [35322, 0, "l"], + [35323, 0, "t"], + [35324, 0, "o"], + [35325, 0, " "], + [35326, 0, "\\"], + [35327, 0, "m"], + [35328, 0, "a"], + [35329, 0, "t"], + [35330, 0, "h"], + [35331, 0, "i"], + [35332, 0, "t"], + [35333, 0, "{"], + [35334, 0, "c"], + [35335, 0, "t"], + [35336, 0, "x"], + [35337, 0, "}"], + [35338, 0, "'"], + [35339, 0, ","], + [35340, 0, " "], + [35341, 0, "\\"], + [35342, 0, "m"], + [35343, 0, "a"], + [35344, 0, "t"], + [35345, 0, "h"], + [35346, 0, "i"], + [35347, 0, "t"], + [35348, 0, "{"], + [35349, 0, "p"], + [35350, 0, "r"], + [35351, 0, "e"], + [35352, 0, "s"], + [35353, 0, "}"], + [35354, 0, "_"], + [35355, 0, "1"], + [35356, 0, "$"], + [35357, 0, "}"], + [35358, 0, "\n"], + [35359, 0, "\\"], + [35360, 0, "A"], + [35361, 0, "x"], + [35362, 0, "i"], + [35363, 0, "o"], + [35364, 0, "m"], + [35365, 0, "C"], + [35366, 0, "{"], + [35367, 0, "$"], + [35368, 0, "\\"], + [35369, 0, "m"], + [35370, 0, "a"], + [35371, 0, "t"], + [35372, 0, "h"], + [35373, 0, "i"], + [35374, 0, "t"], + [35375, 0, "{"], + [35376, 0, "c"], + [35377, 0, "t"], + [35378, 0, "x"], + [35379, 0, "}"], + [35380, 0, "'"], + [35381, 0, ","], + [35382, 0, "'"], + [35383, 0, ","], + [35383, 1], + [35382, 1], + [35381, 1], + [35381, 0, ","], + [35382, 0, "\\"], + [35383, 0, ","], + [35384, 0, " "], + [35385, 0, "\\"], + [35386, 0, "m"], + [35387, 0, "a"], + [35388, 0, "t"], + [35389, 0, "h"], + [35390, 0, "s"], + [35391, 0, "f"], + [35392, 0, "{"], + [35393, 0, "c"], + [35394, 0, "l"], + [35395, 0, "e"], + [35396, 0, "a"], + [35397, 0, "r"], + [35398, 0, "M"], + [35399, 0, "a"], + [35400, 0, "p"], + [35401, 0, "}"], + [35402, 0, "{"], + [35402, 1], + [35402, 0, "("], + [35403, 0, "\\"], + [35404, 0, "m"], + [35405, 0, "a"], + [35406, 0, "t"], + [35407, 0, "h"], + [35408, 0, "i"], + [35409, 0, "t"], + [35410, 0, "{"], + [35411, 0, "d"], + [35412, 0, "e"], + [35413, 0, "p"], + [35414, 0, "s"], + [35415, 0, "}"], + [35416, 0, ","], + [35417, 0, " "], + [35418, 0, "\\"], + [35419, 0, "m"], + [35420, 0, "a"], + [35421, 0, "t"], + [35422, 0, "h"], + [35423, 0, "i"], + [35424, 0, "t"], + [35425, 0, "{"], + [35426, 0, "d"], + [35427, 0, "o"], + [35428, 0, "n"], + [35429, 0, "e"], + [35430, 0, "}"], + [35431, 0, " "], + [35432, 0, "\\"], + [35433, 0, "c"], + [35434, 0, "u"], + [35435, 0, "p"], + [35436, 0, " "], + [35437, 0, "\\"], + [35438, 0, "{"], + [35439, 0, "k"], + [35440, 0, "\\"], + [35441, 0, "}"], + [35442, 0, ")"], + [35443, 0, "\n"], + [35444, 0, " "], + [35445, 0, " "], + [35446, 0, " "], + [35447, 0, " "], + [35448, 0, "\\"], + [35449, 0, "e"], + [35450, 0, "v"], + [35451, 0, "a"], + [35452, 0, "l"], + [35453, 0, "t"], + [35454, 0, "o"], + [35455, 0, " "], + [35456, 0, "\\"], + [35457, 0, "m"], + [35458, 0, "a"], + [35459, 0, "t"], + [35460, 0, "h"], + [35461, 0, "i"], + [35462, 0, "t"], + [35463, 0, "{"], + [35464, 0, "c"], + [35465, 0, "t"], + [35466, 0, "x"], + [35467, 0, "}"], + [35468, 0, "'"], + [35469, 0, "'"], + [35470, 0, ","], + [35471, 0, "\\"], + [35472, 0, ","], + [35473, 0, " "], + [35474, 0, "\\"], + [35475, 0, "m"], + [35476, 0, "a"], + [35477, 0, "t"], + [35478, 0, "h"], + [35479, 0, "i"], + [35480, 0, "t"], + [35481, 0, "{"], + [35482, 0, "p"], + [35483, 0, "r"], + [35484, 0, "e"], + [35485, 0, "s"], + [35486, 0, "}"], + [35487, 0, "_"], + [35488, 0, "2"], + [35489, 0, "$"], + [35490, 0, "}"], + [35491, 0, "\n"], + [35492, 0, "\\"], + [35493, 0, "L"], + [35494, 0, "e"], + [35495, 0, "f"], + [35496, 0, "t"], + [35497, 0, "L"], + [35498, 0, "a"], + [35499, 0, "b"], + [35500, 0, "e"], + [35501, 0, "l"], + [35502, 0, "{"], + [35503, 0, "$"], + [35504, 0, "\\"], + [35505, 0, "t"], + [35506, 0, "e"], + [35507, 0, "x"], + [35508, 0, "t"], + [35509, 0, "s"], + [35510, 0, "c"], + [35511, 0, "{"], + [35512, 0, "C"], + [35513, 0, "l"], + [35514, 0, "e"], + [35515, 0, "a"], + [35516, 0, "r"], + [35517, 0, "-"], + [35518, 0, "M"], + [35519, 0, "a"], + [35520, 0, "p"], + [35521, 0, "}"], + [35522, 0, "_"], + [35523, 0, "2"], + [35524, 0, "$"], + [35525, 0, "}"], + [35526, 0, "\n"], + [35527, 0, "\\"], + [35528, 0, "T"], + [35529, 0, "r"], + [35530, 0, "i"], + [35531, 0, "n"], + [35532, 0, "a"], + [35533, 0, "r"], + [35534, 0, "y"], + [35535, 0, "I"], + [35536, 0, "n"], + [35537, 0, "f"], + [35538, 0, "C"], + [35539, 0, "{"], + [35540, 0, "$"], + [35541, 0, "\\"], + [35542, 0, "m"], + [35543, 0, "a"], + [35544, 0, "t"], + [35545, 0, "h"], + [35546, 0, "i"], + [35547, 0, "t"], + [35548, 0, "{"], + [35549, 0, "c"], + [35550, 0, "t"], + [35551, 0, "x"], + [35552, 0, "}"], + [35553, 0, ","], + [35554, 0, "\\"], + [35555, 0, ","], + [35556, 0, " "], + [35557, 0, "\\"], + [35558, 0, "m"], + [35559, 0, "a"], + [35560, 0, "t"], + [35561, 0, "h"], + [35562, 0, "s"], + [35563, 0, "f"], + [35564, 0, "{"], + [35565, 0, "c"], + [35566, 0, "l"], + [35567, 0, "e"], + [35568, 0, "a"], + [35569, 0, "r"], + [35570, 0, "M"], + [35571, 0, "a"], + [35572, 0, "p"], + [35573, 0, "}"], + [35574, 0, "("], + [35575, 0, "\\"], + [35576, 0, "m"], + [35577, 0, "a"], + [35578, 0, "t"], + [35579, 0, "h"], + [35580, 0, "i"], + [35581, 0, "t"], + [35582, 0, "{"], + [35583, 0, "d"], + [35584, 0, "e"], + [35585, 0, "p"], + [35586, 0, "s"], + [35587, 0, "}"], + [35588, 0, ","], + [35589, 0, " "], + [35590, 0, "\\"], + [35591, 0, "m"], + [35592, 0, "a"], + [35593, 0, "t"], + [35594, 0, "h"], + [35595, 0, "i"], + [35596, 0, "t"], + [35597, 0, "{"], + [35598, 0, "d"], + [35599, 0, "o"], + [35600, 0, "n"], + [35601, 0, "e"], + [35602, 0, "}"], + [35603, 0, ")"], + [35604, 0, " "], + [35605, 0, "\\"], + [35606, 0, "e"], + [35607, 0, "v"], + [35608, 0, "a"], + [35609, 0, "l"], + [35610, 0, "t"], + [35611, 0, "o"], + [35612, 0, "\n"], + [35613, 0, " "], + [35614, 0, " "], + [35615, 0, " "], + [35616, 0, " "], + [35617, 0, "\\"], + [35618, 0, "m"], + [35619, 0, "a"], + [35620, 0, "t"], + [35621, 0, "h"], + [35617, 0, "\\"], + [35618, 0, "e"], + [35619, 0, "v"], + [35620, 0, "a"], + [35621, 0, "l"], + [35622, 0, "t"], + [35623, 0, "o"], + [35624, 0, " "], + [35611, 1], + [35610, 1], + [35609, 1], + [35608, 1], + [35607, 1], + [35606, 1], + [35605, 1], + [35604, 1], + [35622, 0, "i"], + [35623, 0, "t"], + [35624, 0, "{"], + [35625, 0, "c"], + [35626, 0, "t"], + [35627, 0, "x"], + [35628, 0, "}"], + [35629, 0, "'"], + [35630, 0, "'"], + [35631, 0, ","], + [35632, 0, "\\"], + [35633, 0, ","], + [35634, 0, " "], + [35635, 0, "\\"], + [35636, 0, "m"], + [35637, 0, "a"], + [35638, 0, "t"], + [35639, 0, "h"], + [35640, 0, "i"], + [35641, 0, "t"], + [35642, 0, "{"], + [35643, 0, "p"], + [35644, 0, "r"], + [35645, 0, "e"], + [35646, 0, "s"], + [35647, 0, "}"], + [35648, 0, "_"], + [35649, 0, "1"], + [35650, 0, " "], + [35651, 0, "\\"], + [35652, 0, "c"], + [35653, 0, "u"], + [35654, 0, "p"], + [35655, 0, " "], + [35656, 0, "\\"], + [35657, 0, "m"], + [35658, 0, "a"], + [35659, 0, "t"], + [35660, 0, "h"], + [35661, 0, "i"], + [35662, 0, "t"], + [35663, 0, "{"], + [35664, 0, "p"], + [35665, 0, "r"], + [35666, 0, "e"], + [35667, 0, "s"], + [35668, 0, "{"], + [35668, 1], + [35668, 0, "}"], + [35669, 0, "_"], + [35670, 0, "2"], + [35671, 0, "$"], + [35672, 0, "}"], + [35186, 0, "\\"], + [35187, 0, "b"], + [35188, 0, "e"], + [35189, 0, "g"], + [35190, 0, "i"], + [35191, 0, "n"], + [35192, 0, "{"], + [35193, 0, "m"], + [35194, 0, "a"], + [35195, 0, "t"], + [35196, 0, "r"], + [35197, 0, "i"], + [35198, 0, "x"], + [35199, 0, "}"], + [35200, 0, " "], + [35200, 0, "\n"], + [35201, 0, " "], + [35202, 0, " "], + [35203, 0, " "], + [35240, 1], + [35240, 0, "\\"], + [35241, 0, "\n"], + [35242, 0, " "], + [35243, 0, " "], + [35244, 0, " "], + [35245, 0, " "], + [35277, 0, " "], + [35278, 0, "\\"], + [35279, 0, "e"], + [35280, 0, "n"], + [35281, 0, "d"], + [35282, 0, "{"], + [35283, 0, "m"], + [35284, 0, "a"], + [35285, 0, "t"], + [35286, 0, "r"], + [35287, 0, "i"], + [35288, 0, "x"], + [35289, 0, "}"], + [35302, 0, "\\"], + [35303, 0, "b"], + [35304, 0, "e"], + [35305, 0, "g"], + [35306, 0, "i"], + [35307, 0, "n"], + [35308, 0, "{"], + [35309, 0, "m"], + [35310, 0, "a"], + [35311, 0, "t"], + [35312, 0, "r"], + [35313, 0, "i"], + [35314, 0, "x"], + [35315, 0, "}"], + [35316, 0, "\n"], + [35317, 0, " "], + [35318, 0, " "], + [35319, 0, " "], + [35320, 0, " "], + [35373, 0, "\\"], + [35373, 1], + [35373, 0, " "], + [35374, 0, "\\"], + [35375, 0, "\\"], + [35376, 0, "\n"], + [35377, 0, " "], + [35378, 0, " "], + [35379, 0, " "], + [35419, 0, " "], + [35420, 0, "\\"], + [35421, 0, "e"], + [35422, 0, "n"], + [35423, 0, "d"], + [35424, 0, "{"], + [35425, 0, "m"], + [35426, 0, "a"], + [35427, 0, "t"], + [35428, 0, "r"], + [35429, 0, "i"], + [35430, 0, "x"], + [35431, 0, "}"], + [35444, 0, "\\"], + [35445, 0, "b"], + [35446, 0, "e"], + [35447, 0, "g"], + [35448, 0, "i"], + [35449, 0, "n"], + [35450, 0, "{"], + [35451, 0, "m"], + [35452, 0, "a"], + [35453, 0, "t"], + [35454, 0, "r"], + [35455, 0, "i"], + [35456, 0, "x"], + [35457, 0, "}"], + [35458, 0, "\n"], + [35459, 0, " "], + [35460, 0, " "], + [35461, 0, " "], + [35462, 0, " "], + [35463, 0, " "], + [35463, 1], + [35538, 0, " "], + [35539, 0, "\\"], + [35540, 0, "\\"], + [35587, 0, " "], + [35588, 0, "\\"], + [35589, 0, "e"], + [35590, 0, "n"], + [35591, 0, "d"], + [35592, 0, "{"], + [35593, 0, "m"], + [35594, 0, "a"], + [35595, 0, "t"], + [35596, 0, "r"], + [35597, 0, "i"], + [35598, 0, "x"], + [35599, 0, "}"], + [35800, 0, "\n"], + [35801, 0, "\n"], + [35802, 0, "\\"], + [35803, 0, "b"], + [35804, 0, "e"], + [35805, 0, "g"], + [35806, 0, "i"], + [35807, 0, "n"], + [35808, 0, "{"], + [35809, 0, "p"], + [35810, 0, "r"], + [35811, 0, "o"], + [35812, 0, "o"], + [35813, 0, "f"], + [35814, 0, "t"], + [35815, 0, "r"], + [35816, 0, "e"], + [35817, 0, "e"], + [35818, 0, "}"], + [35819, 0, "\n"], + [35820, 0, "\\"], + [35821, 0, "e"], + [35822, 0, "n"], + [35823, 0, "d"], + [35824, 0, "{"], + [35825, 0, "p"], + [35826, 0, "r"], + [35827, 0, "o"], + [35828, 0, "o"], + [35829, 0, "f"], + [35830, 0, "t"], + [35831, 0, "r"], + [35832, 0, "e"], + [35833, 0, "e"], + [35834, 0, "}"], + [35819, 0, "\n"], + [35820, 0, "\\"], + [35821, 0, "A"], + [35822, 0, "x"], + [35823, 0, "i"], + [35824, 0, "o"], + [35825, 0, "m"], + [35826, 0, "C"], + [35827, 0, "{"], + [35828, 0, "$"], + [35829, 0, "\\"], + [35830, 0, "m"], + [35831, 0, "a"], + [35832, 0, "t"], + [35833, 0, "h"], + [35834, 0, "i"], + [35835, 0, "t"], + [35836, 0, "{"], + [35837, 0, "d"], + [35838, 0, "o"], + [35839, 0, "n"], + [35840, 0, "e"], + [35841, 0, "}"], + [35842, 0, " "], + [35843, 0, "="], + [35844, 0, " "], + [35845, 0, "\\"], + [35846, 0, "m"], + [35847, 0, "a"], + [35848, 0, "t"], + [35849, 0, "h"], + [35850, 0, "r"], + [35851, 0, "m"], + [35852, 0, "{"], + [35853, 0, "k"], + [35854, 0, "e"], + [35855, 0, "y"], + [35856, 0, "s"], + [35857, 0, "}"], + [35858, 0, "("], + [35859, 0, "\\"], + [35860, 0, "m"], + [35861, 0, "a"], + [35862, 0, "t"], + [35863, 0, "h"], + [35864, 0, "i"], + [35865, 0, "t"], + [35866, 0, "{"], + [35867, 0, "c"], + [35868, 0, "t"], + [35869, 0, "x"], + [35870, 0, "}"], + [35871, 0, ")"], + [35872, 0, "$"], + [35873, 0, "}"], + [35874, 0, "\n"], + [35875, 0, "\\"], + [35876, 0, "L"], + [35877, 0, "e"], + [35878, 0, "f"], + [35879, 0, "t"], + [35880, 0, "L"], + [35881, 0, "a"], + [35882, 0, "b"], + [35883, 0, "e"], + [35884, 0, "l"], + [35885, 0, "{"], + [35886, 0, "$"], + [35887, 0, "\\"], + [35888, 0, "t"], + [35889, 0, "e"], + [35890, 0, "x"], + [35891, 0, "t"], + [35892, 0, "s"], + [35893, 0, "c"], + [35894, 0, "{"], + [35895, 0, "C"], + [35896, 0, "l"], + [35897, 0, "e"], + [35898, 0, "a"], + [35899, 0, "r"], + [35900, 0, "-"], + [35901, 0, "M"], + [35902, 0, "a"], + [35903, 0, "p"], + [35904, 0, "}"], + [35905, 0, "_"], + [35906, 0, "3"], + [35907, 0, "$"], + [35908, 0, "}"], + [35909, 0, "\n"], + [35910, 0, "\\"], + [35911, 0, "U"], + [35912, 0, "n"], + [35913, 0, "a"], + [35914, 0, "r"], + [35915, 0, "y"], + [35916, 0, "I"], + [35917, 0, "n"], + [35918, 0, "f"], + [35919, 0, "C"], + [35920, 0, "{"], + [35921, 0, "$"], + [35922, 0, "\\"], + [35923, 0, "m"], + [35924, 0, "a"], + [35925, 0, "t"], + [35926, 0, "h"], + [35927, 0, "i"], + [35928, 0, "t"], + [35929, 0, "{"], + [35930, 0, "c"], + [35931, 0, "t"], + [35932, 0, "x"], + [35933, 0, "}"], + [35934, 0, ","], + [35935, 0, "\\"], + [35936, 0, ","], + [35937, 0, " "], + [35938, 0, "\\"], + [35939, 0, "m"], + [35940, 0, "a"], + [35941, 0, "t"], + [35942, 0, "h"], + [35943, 0, "s"], + [35944, 0, "f"], + [35945, 0, "{"], + [35946, 0, "c"], + [35947, 0, "l"], + [35948, 0, "e"], + [35949, 0, "a"], + [35950, 0, "r"], + [35951, 0, "M"], + [35952, 0, "a"], + [35953, 0, "p"], + [35954, 0, "}"], + [35955, 0, "("], + [35956, 0, "\\"], + [35957, 0, "m"], + [35958, 0, "a"], + [35959, 0, "t"], + [35960, 0, "h"], + [35961, 0, "i"], + [35962, 0, "t"], + [35963, 0, "{"], + [35964, 0, "d"], + [35965, 0, "e"], + [35966, 0, "p"], + [35967, 0, "s"], + [35968, 0, "}"], + [35969, 0, ","], + [35970, 0, " "], + [35971, 0, "\\"], + [35972, 0, "m"], + [35973, 0, "a"], + [35974, 0, "t"], + [35975, 0, "h"], + [35976, 0, "i"], + [35977, 0, "t"], + [35978, 0, "{"], + [35979, 0, "d"], + [35980, 0, "o"], + [35981, 0, "n"], + [35982, 0, "e"], + [35983, 0, "}"], + [35984, 0, ")"], + [35985, 0, "\n"], + [35986, 0, " "], + [35987, 0, " "], + [35988, 0, " "], + [35989, 0, " "], + [35990, 0, "\\"], + [35991, 0, "e"], + [35992, 0, "v"], + [35993, 0, "a"], + [35994, 0, "l"], + [35995, 0, "t"], + [35996, 0, "o"], + [35997, 0, " "], + [35998, 0, "\\"], + [35999, 0, "m"], + [36000, 0, "a"], + [36001, 0, "t"], + [36002, 0, "h"], + [36003, 0, "i"], + [36004, 0, "t"], + [36005, 0, "{"], + [36006, 0, "c"], + [36007, 0, "t"], + [36008, 0, "x"], + [36009, 0, "}"], + [36010, 0, ","], + [36011, 0, " "], + [36012, 0, "\\"], + [36013, 0, "{"], + [36014, 0, "\\"], + [36015, 0, "}"], + [36016, 0, "$"], + [36017, 0, "}"], + [36011, 0, "\\"], + [36012, 0, ","], + [35989, 1], + [35988, 1], + [35987, 1], + [35986, 1], + [35985, 1], + [35985, 0, " "], + [36368, 1], + [36367, 1], + [36367, 0, "c"], + [36368, 0, "l"], + [36369, 0, "e"], + [36370, 0, "a"], + [36371, 0, "r"], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36374, 1], + [36388, 0, " "], + [36389, 0, "\\"], + [36390, 0, "m"], + [36391, 0, "a"], + [36392, 0, "t"], + [36393, 0, "h"], + [36394, 0, "s"], + [36395, 0, "f"], + [36396, 0, "{"], + [36397, 0, "l"], + [36398, 0, "i"], + [36399, 0, "s"], + [36400, 0, "t"], + [36401, 0, "T"], + [36402, 0, "}"], + [36403, 0, "("], + [36404, 0, "k"], + [36405, 0, ")"], + [36406, 0, ")"], + [36407, 0, " "], + [36408, 0, "\\"], + [36409, 0, "e"], + [36410, 0, "v"], + [36411, 0, "a"], + [36412, 0, "l"], + [36413, 0, "t"], + [36414, 0, "o"], + [36484, 1], + [36483, 1], + [36482, 1], + [36481, 1], + [36480, 1], + [36479, 1], + [36478, 1], + [36477, 1], + [36476, 1], + [36475, 1], + [36474, 1], + [36473, 1], + [36472, 1], + [36471, 1], + [36470, 1], + [36469, 1], + [36468, 1], + [36467, 1], + [36466, 1], + [36465, 1], + [36464, 1], + [36463, 1], + [36462, 1], + [36461, 1], + [36460, 1], + [36459, 1], + [36458, 1], + [36457, 1], + [36456, 1], + [36455, 1], + [36454, 1], + [36453, 1], + [36452, 1], + [36451, 1], + [36450, 1], + [36449, 1], + [36448, 1], + [36447, 1], + [36446, 1], + [36445, 1], + [36444, 1], + [36443, 1], + [36442, 1], + [36441, 1], + [36440, 1], + [36439, 1], + [36438, 1], + [36437, 1], + [36436, 1], + [36435, 1], + [36434, 1], + [36433, 1], + [36432, 1], + [36431, 1], + [36430, 1], + [36429, 1], + [36428, 1], + [36427, 1], + [36426, 1], + [36425, 1], + [36424, 1], + [36423, 1], + [36422, 1], + [36421, 1], + [36420, 1], + [36419, 1], + [36418, 1], + [36417, 1], + [36416, 1], + [36415, 1], + [36164, 1], + [36164, 1], + [36164, 0, "c"], + [36165, 0, "l"], + [36166, 0, "e"], + [36167, 0, "a"], + [36168, 0, "r"], + [36169, 0, "L"], + [36170, 0, "i"], + [36171, 0, "s"], + [36172, 0, "t"], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36175, 1], + [36189, 0, " "], + [36190, 0, "\\"], + [36191, 0, "m"], + [36192, 0, "a"], + [36193, 0, "t"], + [36194, 0, "h"], + [36195, 0, "s"], + [36196, 0, "f"], + [36197, 0, "{"], + [36198, 0, "h"], + [36199, 0, "e"], + [36200, 0, "a"], + [36201, 0, "d"], + [36202, 0, "}"], + [36203, 0, ")"], + [36279, 1], + [36278, 1], + [36277, 1], + [36276, 1], + [36275, 1], + [36274, 1], + [36273, 1], + [36272, 1], + [36271, 1], + [36270, 1], + [36269, 1], + [36268, 1], + [36267, 1], + [36266, 1], + [36265, 1], + [36264, 1], + [36263, 1], + [36262, 1], + [36261, 1], + [36260, 1], + [36259, 1], + [36258, 1], + [36257, 1], + [36256, 1], + [36255, 1], + [36254, 1], + [36253, 1], + [36252, 1], + [36251, 1], + [36250, 1], + [36249, 1], + [36248, 1], + [36247, 1], + [36246, 1], + [36245, 1], + [36244, 1], + [36243, 1], + [36242, 1], + [36241, 1], + [36240, 1], + [36239, 1], + [36238, 1], + [36237, 1], + [36236, 1], + [36235, 1], + [36234, 1], + [36233, 1], + [36232, 1], + [36231, 1], + [36230, 1], + [36229, 1], + [36228, 1], + [36227, 1], + [36226, 1], + [36225, 1], + [36224, 1], + [36223, 1], + [36222, 1], + [36221, 1], + [36220, 1], + [36219, 1], + [36218, 1], + [36217, 1], + [36216, 1], + [36215, 1], + [36214, 1], + [36213, 1], + [36212, 1], + [36211, 1], + [36210, 1], + [36209, 1], + [36233, 0, ","], + [36234, 0, "\\"], + [36235, 0, ","], + [36236, 0, " "], + [36237, 0, "\\"], + [36238, 0, "m"], + [36239, 0, "a"], + [36240, 0, "t"], + [36241, 0, "h"], + [36242, 0, "i"], + [36243, 0, "t"], + [36244, 0, "{"], + [36245, 0, "p"], + [36246, 0, "r"], + [36247, 0, "e"], + [36248, 0, "s"], + [36249, 0, "}"], + [36283, 0, "_"], + [36284, 0, "1"], + [36285, 0, "$"], + [36264, 0, "$"], + [36445, 0, ","], + [36446, 0, "\\"], + [36447, 0, ","], + [36448, 0, " "], + [36449, 0, "\\"], + [36450, 0, "m"], + [36451, 0, "a"], + [36452, 0, "t"], + [36453, 0, "h"], + [36454, 0, "i"], + [36455, 0, "t"], + [36456, 0, "{"], + [36457, 0, "p"], + [36458, 0, "r"], + [36459, 0, "e"], + [36460, 0, "s"], + [36461, 0, "}"], + [36819, 1], + [36819, 0, "2"], + [36816, 1], + [36815, 1], + [36814, 1], + [36813, 1], + [36812, 1], + [36812, 0, "L"], + [36813, 0, "i"], + [36814, 0, "s"], + [36815, 0, "t"], + [36860, 1], + [36860, 1], + [36860, 0, "c"], + [36861, 0, "l"], + [36862, 0, "e"], + [36863, 0, "a"], + [36864, 0, "r"], + [36865, 0, "L"], + [36866, 0, "i"], + [36867, 0, "s"], + [36868, 0, "t"], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36871, 1], + [36885, 0, " "], + [36886, 0, "k"], + [36887, 0, ")"], + [36888, 0, " "], + [36889, 0, "\\"], + [36890, 0, "e"], + [36891, 0, "v"], + [36892, 0, "a"], + [36893, 0, "l"], + [36894, 0, "t"], + [36895, 0, "o"], + [36966, 1], + [36965, 1], + [36964, 1], + [36963, 1], + [36962, 1], + [36961, 1], + [36960, 1], + [36959, 1], + [36958, 1], + [36957, 1], + [36956, 1], + [36955, 1], + [36954, 1], + [36953, 1], + [36952, 1], + [36951, 1], + [36950, 1], + [36949, 1], + [36948, 1], + [36947, 1], + [36946, 1], + [36945, 1], + [36944, 1], + [36943, 1], + [36942, 1], + [36941, 1], + [36940, 1], + [36939, 1], + [36938, 1], + [36937, 1], + [36936, 1], + [36935, 1], + [36934, 1], + [36933, 1], + [36932, 1], + [36931, 1], + [36930, 1], + [36929, 1], + [36928, 1], + [36927, 1], + [36926, 1], + [36925, 1], + [36924, 1], + [36923, 1], + [36922, 1], + [36921, 1], + [36920, 1], + [36919, 1], + [36918, 1], + [36917, 1], + [36916, 1], + [36915, 1], + [36914, 1], + [36913, 1], + [36912, 1], + [36911, 1], + [36910, 1], + [36909, 1], + [36908, 1], + [36907, 1], + [36906, 1], + [36905, 1], + [36904, 1], + [36903, 1], + [36902, 1], + [36901, 1], + [36900, 1], + [36899, 1], + [36898, 1], + [36897, 1], + [36896, 1], + [36964, 1], + [36963, 1], + [36962, 1], + [36961, 1], + [36960, 1], + [36959, 1], + [36958, 1], + [36957, 1], + [36956, 1], + [36955, 1], + [36954, 1], + [36953, 1], + [36952, 1], + [36951, 1], + [36950, 1], + [36949, 1], + [36948, 1], + [36947, 1], + [36946, 1], + [36945, 1], + [36944, 1], + [36943, 1], + [36942, 1], + [36941, 1], + [36940, 1], + [36939, 1], + [36938, 1], + [36937, 1], + [36936, 1], + [36935, 1], + [36934, 1], + [36933, 1], + [36932, 1], + [36931, 1], + [36930, 1], + [36929, 1], + [36928, 1], + [36927, 1], + [36926, 1], + [36925, 1], + [36924, 1], + [36923, 1], + [36922, 1], + [36921, 1], + [36920, 1], + [36919, 1], + [36918, 1], + [36917, 1], + [36916, 1], + [36915, 1], + [36914, 1], + [36914, 0, "'"], + [36915, 0, ","], + [36916, 0, " "], + [36917, 0, "\\"], + [36918, 0, "m"], + [36919, 0, "a"], + [36920, 0, "t"], + [36921, 0, "h"], + [36922, 0, "i"], + [36923, 0, "t"], + [36924, 0, "{"], + [36925, 0, "p"], + [36926, 0, "r"], + [36927, 0, "e"], + [36928, 0, "s"], + [36929, 0, "}"], + [36930, 0, "_"], + [36931, 0, "1"], + [36932, 0, " "], + [36933, 0, "\\"], + [36934, 0, ","], + [36935, 0, "\\"], + [36936, 0, "c"], + [36937, 0, "u"], + [36938, 0, "p"], + [36939, 0, "\\"], + [36940, 0, ","], + [36941, 0, " "], + [36942, 0, "\\"], + [36943, 0, "m"], + [36944, 0, "a"], + [36945, 0, "t"], + [36946, 0, "h"], + [36947, 0, "i"], + [36948, 0, "t"], + [36949, 0, "{"], + [36950, 0, "p"], + [36951, 0, "r"], + [36952, 0, "e"], + [36953, 0, "s"], + [36954, 0, "}"], + [36955, 0, "_"], + [36956, 0, "2"], + [35762, 0, "\\"], + [35763, 0, ","], + [35768, 0, "\\"], + [35769, 0, ","], + [36513, 0, "\\"], + [36514, 0, "b"], + [36515, 0, "e"], + [36516, 0, "g"], + [36517, 0, "i"], + [36518, 0, "n"], + [36519, 0, "{"], + [36520, 0, "m"], + [36521, 0, "a"], + [36522, 0, "t"], + [36523, 0, "r"], + [36524, 0, "i"], + [36525, 0, "x"], + [36526, 0, "}"], + [36527, 0, "\n"], + [36528, 0, " "], + [36529, 0, " "], + [36530, 0, " "], + [36531, 0, " "], + [36553, 0, " "], + [36554, 0, "\\"], + [36555, 0, "\\"], + [36556, 0, "\n"], + [36557, 0, " "], + [36558, 0, " "], + [36559, 0, " "], + [36561, 1], + [36561, 1], + [36560, 1], + [36559, 1], + [36558, 1], + [36557, 1], + [36556, 1], + [36555, 1], + [36555, 0, ","], + [36563, 1], + [36563, 0, "\\"], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36564, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 1], + [36565, 0, " "], + [36566, 0, " "], + [36567, 0, " "], + [36568, 0, " "], + [36615, 0, "\n"], + [36616, 0, " "], + [36617, 0, " "], + [36618, 0, " "], + [36619, 0, " "], + [36620, 0, "\\"], + [36621, 0, "e"], + [36622, 0, "n"], + [36623, 0, "d"], + [36624, 0, "{"], + [36625, 0, "m"], + [36626, 0, "a"], + [36627, 0, "t"], + [36628, 0, "r"], + [36629, 0, "i"], + [36630, 0, "x"], + [36631, 0, "}"], + [36632, 0, " "], + [36632, 1], + [36619, 1], + [36618, 1], + [36617, 1], + [36616, 1], + [36615, 1], + [36615, 0, " "], + [36640, 0, "\\"], + [36641, 0, "b"], + [36642, 0, "e"], + [36643, 0, "g"], + [36644, 0, "i"], + [36645, 0, "n"], + [36646, 0, "{"], + [36647, 0, "m"], + [36648, 0, "a"], + [36649, 0, "t"], + [36650, 0, "r"], + [36651, 0, "i"], + [36652, 0, "x"], + [36653, 0, "}"], + [36654, 0, "\n"], + [36655, 0, " "], + [36656, 0, " "], + [36657, 0, " "], + [36658, 0, " "], + [36684, 1], + [36683, 1], + [36683, 0, "c"], + [36684, 0, "l"], + [36685, 0, "e"], + [36686, 0, "a"], + [36687, 0, "r"], + [36688, 0, "L"], + [36688, 1], + [36688, 0, "E"], + [36689, 0, "l"], + [36690, 0, "e"], + [36691, 0, "m"], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36694, 1], + [36708, 0, " "], + [36709, 0, "k"], + [36710, 0, ")"], + [36711, 0, " "], + [36712, 0, "\\"], + [36713, 0, "\\"], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36719, 1], + [36740, 0, ","], + [36741, 0, " "], + [36742, 0, "\\"], + [36743, 0, "m"], + [36744, 0, "a"], + [36745, 0, "t"], + [36746, 0, "h"], + [36747, 0, "i"], + [36748, 0, "t"], + [36749, 0, "{"], + [36750, 0, "p"], + [36751, 0, "r"], + [36752, 0, "e"], + [36753, 0, "s"], + [36754, 0, "}"], + [36755, 0, "_"], + [36756, 0, "1"], + [36757, 0, " "], + [36758, 0, " "], + [36758, 1], + [36758, 0, "\\"], + [36759, 0, "e"], + [36760, 0, "n"], + [36761, 0, "d"], + [36762, 0, "{"], + [36763, 0, "m"], + [36764, 0, "a"], + [36765, 0, "t"], + [36766, 0, "r"], + [36767, 0, "i"], + [36768, 0, "x"], + [36769, 0, "}"], + [36772, 0, "\n"], + [36773, 0, "\\"], + [36774, 0, "A"], + [36775, 0, "x"], + [36776, 0, "i"], + [36777, 0, "o"], + [36778, 0, "m"], + [36779, 0, "C"], + [36780, 0, "{"], + [36781, 0, "$"], + [36782, 0, "\\"], + [36783, 0, "b"], + [36784, 0, "e"], + [36785, 0, "g"], + [36786, 0, "i"], + [36787, 0, "n"], + [36788, 0, "{"], + [36789, 0, "m"], + [36790, 0, "a"], + [36791, 0, "t"], + [36792, 0, "r"], + [36793, 0, "i"], + [36794, 0, "x"], + [36795, 0, "}"], + [36796, 0, "\n"], + [36797, 0, " "], + [36798, 0, " "], + [36799, 0, " "], + [36800, 0, " "], + [36801, 0, "\\"], + [36802, 0, "a"], + [36803, 0, "t"], + [36803, 1], + [36802, 1], + [36802, 0, "m"], + [36803, 0, "a"], + [36804, 0, "t"], + [36805, 0, "h"], + [36806, 0, "i"], + [36807, 0, "t"], + [36808, 0, "{"], + [36809, 0, "c"], + [36810, 0, "t"], + [36811, 0, "x"], + [36812, 0, "}"], + [36813, 0, "'"], + [36814, 0, ","], + [36815, 0, "\\"], + [36816, 0, ","], + [36817, 0, " "], + [36818, 0, "\\"], + [36819, 0, "m"], + [36820, 0, "a"], + [36821, 0, "t"], + [36822, 0, "h"], + [36823, 0, "s"], + [36824, 0, "f"], + [36825, 0, "{"], + [36826, 0, "c"], + [36827, 0, "l"], + [36828, 0, "e"], + [36829, 0, "a"], + [36830, 0, "r"], + [36831, 0, "L"], + [36832, 0, "i"], + [36833, 0, "s"], + [36834, 0, "t"], + [36835, 0, "}"], + [36836, 0, "("], + [36837, 0, "\\"], + [36838, 0, "m"], + [36839, 0, "a"], + [36840, 0, "t"], + [36841, 0, "h"], + [36842, 0, "i"], + [36843, 0, "t"], + [36844, 0, "{"], + [36845, 0, "d"], + [36846, 0, "e"], + [36847, 0, "p"], + [36848, 0, "s"], + [36849, 0, "}"], + [36850, 0, ","], + [36851, 0, " "], + [36852, 0, "\\"], + [36853, 0, "m"], + [36854, 0, "a"], + [36855, 0, "t"], + [36856, 0, "h"], + [36857, 0, "i"], + [36858, 0, "t"], + [36859, 0, "{"], + [36860, 0, "n"], + [36861, 0, "e"], + [36862, 0, "x"], + [36863, 0, "t"], + [36864, 0, "}"], + [36865, 0, ")"], + [36866, 0, " "], + [36867, 0, "\\"], + [36868, 0, "\\"], + [36869, 0, "\n"], + [36870, 0, " "], + [36871, 0, " "], + [36872, 0, " "], + [36873, 0, " "], + [36874, 0, "\\"], + [36875, 0, "e"], + [36876, 0, "v"], + [36877, 0, "a"], + [36878, 0, "l"], + [36879, 0, "t"], + [36880, 0, "o"], + [36881, 0, " "], + [36882, 0, "\\"], + [36883, 0, "m"], + [36884, 0, "a"], + [36885, 0, "t"], + [36886, 0, "h"], + [36887, 0, "i"], + [36888, 0, "t"], + [36889, 0, "{"], + [36890, 0, "c"], + [36891, 0, "t"], + [36892, 0, "x"], + [36893, 0, "}"], + [36894, 0, "'"], + [36895, 0, "'"], + [36896, 0, ","], + [36897, 0, " "], + [36898, 0, "\\"], + [36899, 0, "m"], + [36900, 0, "a"], + [36901, 0, "t"], + [36902, 0, "h"], + [36903, 0, "i"], + [36904, 0, "t"], + [36905, 0, "{"], + [36906, 0, "p"], + [36907, 0, "r"], + [36908, 0, "e"], + [36909, 0, "s"], + [36910, 0, "}"], + [36911, 0, "_"], + [36912, 0, "2"], + [36913, 0, " "], + [36914, 0, "\\"], + [36915, 0, "e"], + [36916, 0, "n"], + [36917, 0, "d"], + [36918, 0, "{"], + [36919, 0, "m"], + [36920, 0, "a"], + [36921, 0, "t"], + [36922, 0, "r"], + [36923, 0, "i"], + [36924, 0, "x"], + [36925, 0, "}"], + [36926, 0, "$"], + [36927, 0, "}"], + [37059, 0, "\\"], + [37060, 0, ","], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37122, 1], + [37195, 1], + [37195, 1], + [37195, 1], + [37195, 1], + [37195, 1], + [37195, 0, "L"], + [37196, 0, "i"], + [37197, 0, "s"], + [37198, 0, "t"], + [37242, 1], + [37241, 1], + [37241, 0, "c"], + [37242, 0, "l"], + [37243, 0, "e"], + [37244, 0, "a"], + [37245, 0, "r"], + [37246, 0, "L"], + [37247, 0, "i"], + [37248, 0, "s"], + [37249, 0, "t"], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37252, 1], + [37266, 0, " "], + [37267, 0, "k"], + [37268, 0, ")"], + [37269, 0, " "], + [37270, 0, "\\"], + [37271, 0, "e"], + [37272, 0, "v"], + [37273, 0, "a"], + [37274, 0, "l"], + [37275, 0, "t"], + [37276, 0, "o"], + [37277, 0, " "], + [37278, 0, "\\"], + [37279, 0, "m"], + [37280, 0, "a"], + [37281, 0, "t"], + [37282, 0, "h"], + [37283, 0, "i"], + [37284, 0, "t"], + [37285, 0, "{"], + [37286, 0, "c"], + [37287, 0, "t"], + [37288, 0, "x"], + [37289, 0, "}"], + [37290, 0, ","], + [37291, 0, "\\"], + [37292, 0, ","], + [37293, 0, " "], + [37294, 0, "\\"], + [37295, 0, "{"], + [37296, 0, "\\"], + [37297, 0, "}"], + [37298, 0, "$"], + [37299, 0, "}"], + [37385, 1], + [37384, 1], + [37383, 1], + [37382, 1], + [37381, 1], + [37380, 1], + [37379, 1], + [37378, 1], + [37377, 1], + [37376, 1], + [37375, 1], + [37374, 1], + [37373, 1], + [37372, 1], + [37371, 1], + [37370, 1], + [37369, 1], + [37368, 1], + [37367, 1], + [37366, 1], + [37365, 1], + [37364, 1], + [37363, 1], + [37362, 1], + [37361, 1], + [37360, 1], + [37359, 1], + [37358, 1], + [37357, 1], + [37356, 1], + [37355, 1], + [37354, 1], + [37353, 1], + [37352, 1], + [37351, 1], + [37350, 1], + [37349, 1], + [37348, 1], + [37347, 1], + [37346, 1], + [37345, 1], + [37344, 1], + [37343, 1], + [37342, 1], + [37341, 1], + [37340, 1], + [37339, 1], + [37338, 1], + [37337, 1], + [37336, 1], + [37335, 1], + [37334, 1], + [37333, 1], + [37332, 1], + [37331, 1], + [37330, 1], + [37329, 1], + [37328, 1], + [37327, 1], + [37326, 1], + [37325, 1], + [37324, 1], + [37323, 1], + [37322, 1], + [37321, 1], + [37320, 1], + [37319, 1], + [37318, 1], + [37317, 1], + [37316, 1], + [37315, 1], + [37314, 1], + [37313, 1], + [37312, 1], + [37311, 1], + [37310, 1], + [37309, 1], + [37308, 1], + [37307, 1], + [37306, 1], + [37305, 1], + [37304, 1], + [37303, 1], + [37302, 1], + [37301, 1], + [37300, 1], + [37336, 0, "d"], + [37337, 0, "e"], + [37338, 0, "l"], + [37339, 0, "e"], + [37340, 0, "t"], + [37341, 0, "i"], + [37342, 0, "n"], + [37343, 0, "g"], + [37344, 0, " "], + [37345, 0, "a"], + [37346, 0, "n"], + [37347, 0, "d"], + [37348, 0, " "], + [37357, 0, " "], + [37358, 0, "s"], + [37359, 0, "t"], + [37360, 0, "a"], + [37361, 0, "t"], + [37362, 0, "e"], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [37403, 1], + [24709, 0, "M"], + [24710, 0, "a"], + [24711, 0, "k"], + [24712, 0, "e"], + [24713, 0, "-"], + [24731, 0, "M"], + [24732, 0, "a"], + [24733, 0, "k"], + [24734, 0, "e"], + [24735, 0, "-"], + [24756, 0, "M"], + [24757, 0, "a"], + [24758, 0, "k"], + [24759, 0, "e"], + [24760, 0, "-"], + [22679, 0, "M"], + [22680, 0, "a"], + [22681, 0, "k"], + [22682, 0, "e"], + [22683, 0, "-"], + [22405, 0, "M"], + [22406, 0, "a"], + [22407, 0, "k"], + [22408, 0, "e"], + [22409, 0, "-"], + [22080, 0, "M"], + [22081, 0, "a"], + [22082, 0, "k"], + [22083, 0, "e"], + [22084, 0, "-"], + [21964, 1], + [21963, 1], + [21962, 1], + [21961, 1], + [21960, 1], + [21959, 1], + [21958, 1], + [21957, 1], + [21956, 1], + [21955, 1], + [21954, 1], + [21953, 1], + [21952, 1], + [21951, 1], + [21950, 1], + [21949, 1], + [21948, 1], + [21947, 1], + [21946, 1], + [21945, 1], + [21944, 1], + [21943, 1], + [21942, 1], + [21941, 1], + [21940, 1], + [21939, 1], + [21938, 1], + [21937, 1], + [21936, 1], + [21935, 1], + [21934, 1], + [21933, 1], + [21932, 1], + [21931, 1], + [21930, 1], + [21929, 1], + [21928, 1], + [21927, 1], + [21926, 1], + [21925, 1], + [21924, 1], + [21923, 1], + [21922, 1], + [21921, 1], + [21920, 1], + [21919, 1], + [21918, 1], + [21917, 1], + [21916, 1], + [21915, 1], + [21914, 1], + [21913, 1], + [21912, 1], + [21911, 1], + [21910, 1], + [21909, 1], + [21908, 1], + [21907, 1], + [21906, 1], + [21905, 1], + [21904, 1], + [21903, 1], + [21902, 1], + [21901, 1], + [21900, 1], + [21899, 1], + [21898, 1], + [21897, 1], + [21896, 1], + [21895, 1], + [21894, 1], + [21893, 1], + [21892, 1], + [21891, 1], + [21890, 1], + [21889, 1], + [21888, 1], + [21887, 1], + [21886, 1], + [21885, 1], + [21884, 1], + [21883, 1], + [21882, 1], + [21881, 1], + [21880, 1], + [21879, 1], + [21878, 1], + [21877, 1], + [21876, 1], + [21875, 1], + [21874, 1], + [21873, 1], + [21872, 1], + [21871, 1], + [21870, 1], + [21869, 1], + [21868, 1], + [21867, 1], + [21866, 1], + [21865, 1], + [21864, 1], + [21863, 1], + [21863, 1], + [3797, 0, "\n"], + [3797, 0, "&"], + [3798, 0, " "], + [3799, 0, "$"], + [3800, 0, "|"], + [3801, 0, "$"], + [3802, 0, " "], + [3803, 0, "&"], + [3804, 0, " "], + [3805, 0, "E"], + [3806, 0, "X"], + [3807, 0, "P"], + [3808, 0, "R"], + [3809, 0, "."], + [3810, 0, "\\"], + [3811, 0, "t"], + [3812, 0, "e"], + [3813, 0, "x"], + [3814, 0, "t"], + [3815, 0, "s"], + [3816, 0, "f"], + [3817, 0, "{"], + [3818, 0, "k"], + [3819, 0, "e"], + [3820, 0, "y"], + [3821, 0, "s"], + [3822, 0, "}"], + [3823, 0, " "], + [3824, 0, "\\"], + [3825, 0, "\\"], + [3682, 1], + [3681, 1], + [3680, 1], + [3679, 1], + [3678, 1], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3673, 1], + [3672, 1], + [3671, 1], + [3670, 1], + [3669, 1], + [3669, 0, "["], + [3682, 1], + [3682, 0, "]"], + [4302, 1], + [4301, 1], + [4300, 1], + [4299, 1], + [4298, 1], + [4298, 0, "["], + [4309, 1], + [4309, 0, "]"], + [3681, 1], + [3680, 1], + [3679, 1], + [3678, 1], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3673, 1], + [3672, 1], + [3671, 1], + [3671, 0, "v"], + [3672, 0, "e"], + [3673, 0, "r"], + [3674, 0, "b"], + [3675, 0, "|"], + [3676, 0, "\""], + [3677, 0, "s"], + [3678, 0, "t"], + [3679, 0, "r"], + [3680, 0, "\""], + [3681, 0, "|"], + [3693, 1], + [3692, 1], + [3692, 0, "t"], + [3693, 0, "t"], + [3677, 1], + [3677, 1], + [3677, 1], + [3677, 0, "k"], + [3678, 0, "e"], + [3679, 0, "y"], + [5698, 0, " "], + [5699, 0, "\\"], + [5700, 0, "t"], + [5701, 0, "e"], + [5702, 0, "x"], + [5703, 0, "t"], + [5704, 0, "s"], + [5705, 0, "f"], + [5706, 0, "{"], + [5707, 0, "k"], + [5708, 0, "e"], + [5709, 0, "y"], + [5710, 0, "s"], + [5711, 0, "}"], + [5712, 0, " "], + [5713, 0, "r"], + [5714, 0, "e"], + [5715, 0, "t"], + [5716, 0, "u"], + [5717, 0, "r"], + [5718, 0, "n"], + [5719, 0, "s"], + [5720, 0, " "], + [5721, 0, "t"], + [5722, 0, "h"], + [5723, 0, "e"], + [5724, 0, " "], + [5725, 0, "s"], + [5726, 0, "e"], + [5727, 0, "t"], + [5728, 0, " "], + [5729, 0, "o"], + [5730, 0, "f"], + [5731, 0, " "], + [5732, 0, "k"], + [5733, 0, "e"], + [5734, 0, "y"], + [5735, 0, "s"], + [5736, 0, " "], + [5737, 0, "i"], + [5738, 0, "n"], + [5739, 0, " "], + [5740, 0, "a"], + [5741, 0, " "], + [5742, 0, "m"], + [5743, 0, "a"], + [5744, 0, "p"], + [5745, 0, ","], + [10517, 1], + [10516, 1], + [10515, 1], + [10514, 1], + [10513, 1], + [10512, 1], + [10512, 0, "p"], + [10513, 0, "r"], + [10514, 0, "o"], + [10515, 0, "o"], + [10516, 0, "f"], + [10517, 0, "t"], + [10518, 0, "r"], + [10519, 0, "e"], + [10520, 0, "e"], + [10763, 1], + [10762, 1], + [10761, 1], + [10760, 1], + [10759, 1], + [10758, 1], + [10757, 1], + [10756, 1], + [10755, 1], + [10754, 1], + [10753, 1], + [10752, 1], + [10751, 1], + [10750, 1], + [10749, 1], + [10748, 1], + [10747, 1], + [10746, 1], + [10746, 0, "e"], + [10747, 0, "n"], + [10748, 0, "d"], + [10749, 0, "{"], + [10750, 0, "p"], + [10751, 0, "r"], + [10752, 0, "o"], + [10753, 0, "o"], + [10754, 0, "f"], + [10755, 0, "t"], + [10756, 0, "r"], + [10757, 0, "e"], + [10758, 0, "e"], + [10759, 0, "}"], + [10761, 1], + [10761, 0, "\n"], + [10762, 0, "\\"], + [10763, 0, "b"], + [10764, 0, "e"], + [10765, 0, "g"], + [10766, 0, "i"], + [10767, 0, "n"], + [10768, 0, "{"], + [10769, 0, "p"], + [10770, 0, "r"], + [10771, 0, "o"], + [10772, 0, "o"], + [10773, 0, "f"], + [10774, 0, "t"], + [10775, 0, "r"], + [10776, 0, "e"], + [10777, 0, "e"], + [10778, 0, "}"], + [11076, 1], + [11075, 1], + [11074, 1], + [11073, 1], + [11072, 1], + [11071, 1], + [11070, 1], + [11069, 1], + [11068, 1], + [11067, 1], + [11066, 1], + [11065, 1], + [11064, 1], + [11063, 1], + [11062, 1], + [11061, 1], + [11060, 1], + [11059, 1], + [11058, 1], + [11057, 1], + [11056, 1], + [11055, 1], + [11054, 1], + [11053, 1], + [11052, 1], + [11051, 1], + [11050, 1], + [11049, 1], + [11048, 1], + [11047, 1], + [10883, 0, " "], + [10884, 0, "\\"], + [10885, 0, ","], + [10886, 0, "\\"], + [10887, 0, "w"], + [10888, 0, "e"], + [10889, 0, "d"], + [10890, 0, "g"], + [10891, 0, "e"], + [10892, 0, "\\"], + [10893, 0, ","], + [10894, 0, " "], + [10895, 0, "k"], + [10896, 0, "'"], + [10897, 0, " "], + [10898, 0, "\\"], + [10899, 0, "n"], + [10900, 0, "o"], + [10901, 0, "t"], + [10902, 0, "="], + [10903, 0, " "], + [10904, 0, "\\"], + [10905, 0, "m"], + [10906, 0, "a"], + [10907, 0, "t"], + [10908, 0, "h"], + [10909, 0, "s"], + [10910, 0, "f"], + [10911, 0, "{"], + [10912, 0, "t"], + [10913, 0, "a"], + [10914, 0, "i"], + [10915, 0, "l"], + [10916, 0, "}"], + [10919, 0, "\n"], + [10920, 0, "\\"], + [10921, 0, "A"], + [10922, 0, "x"], + [10923, 0, "o"], + [10923, 1], + [10923, 0, "i"], + [10924, 0, "o"], + [10925, 0, "m"], + [10926, 0, "C"], + [10927, 0, "{"], + [10928, 0, "$"], + [10929, 0, "\\"], + [10930, 0, "m"], + [10931, 0, "a"], + [10932, 0, "t"], + [10933, 0, "h"], + [10934, 0, "i"], + [10935, 0, "t"], + [10936, 0, "{"], + [10937, 0, "c"], + [10938, 0, "t"], + [10939, 0, "x"], + [10940, 0, "}"], + [10941, 0, "("], + [10942, 0, "\\"], + [10943, 0, "m"], + [10944, 0, "a"], + [10945, 0, "t"], + [10946, 0, "h"], + [10947, 0, "s"], + [10948, 0, "f"], + [10949, 0, "{"], + [10950, 0, "p"], + [10951, 0, "r"], + [10952, 0, "e"], + [10953, 0, "s"], + [10954, 0, "}"], + [10955, 0, "("], + [10956, 0, "k"], + [10957, 0, ")"], + [10958, 0, ")"], + [10959, 0, " "], + [10960, 0, "\\"], + [10961, 0, "n"], + [10962, 0, "o"], + [10963, 0, "t"], + [10964, 0, "="], + [10965, 0, " "], + [10966, 0, "\\"], + [10967, 0, "{"], + [10968, 0, "\\"], + [10969, 0, "}"], + [10970, 0, "$"], + [10971, 0, "}"], + [11004, 1], + [11004, 0, "T"], + [11005, 0, "r"], + [11146, 1], + [11145, 1], + [11144, 1], + [11143, 1], + [11142, 1], + [11141, 1], + [11141, 0, "p"], + [11142, 0, "r"], + [11143, 0, "o"], + [11144, 0, "o"], + [11145, 0, "f"], + [11146, 0, "t"], + [11147, 0, "r"], + [11148, 0, "e"], + [11149, 0, "e"], + [10837, 1], + [10836, 1], + [10835, 1], + [10834, 1], + [10833, 1], + [10832, 1], + [10831, 1], + [10830, 1], + [10829, 1], + [10828, 1], + [10827, 1], + [10826, 1], + [10825, 1], + [10824, 1], + [10823, 1], + [10822, 1], + [10821, 1], + [10820, 1], + [10819, 1], + [10818, 1], + [10817, 1], + [10816, 1], + [10815, 1], + [10814, 1], + [10813, 1], + [10812, 1], + [10811, 1], + [10810, 1], + [10809, 1], + [10808, 1], + [10807, 1], + [10806, 1], + [10805, 1], + [10804, 1], + [10803, 1], + [10802, 1], + [10801, 1], + [10800, 1], + [10799, 1], + [10798, 1], + [10797, 1], + [10796, 1], + [10795, 1], + [10794, 1], + [10793, 1], + [10792, 1], + [10791, 1], + [10790, 1], + [10789, 1], + [10788, 1], + [10787, 1], + [10786, 1], + [10785, 1], + [10784, 1], + [10783, 1], + [10782, 1], + [10781, 1], + [10780, 1], + [10779, 1], + [10945, 1], + [10945, 1], + [10945, 0, "B"], + [11091, 0, "\n"], + [11092, 0, "\n"], + [11093, 0, "\\"], + [11094, 0, "b"], + [11095, 0, "e"], + [11096, 0, "g"], + [11097, 0, "i"], + [11098, 0, "n"], + [11099, 0, "{"], + [11100, 0, "p"], + [11101, 0, "r"], + [11102, 0, "o"], + [11103, 0, "o"], + [11104, 0, "f"], + [11105, 0, "t"], + [11106, 0, "r"], + [11107, 0, "e"], + [11108, 0, "e"], + [11109, 0, "\\"], + [11109, 1], + [11109, 0, "}"], + [11110, 0, "\n"], + [11111, 0, "\\"], + [11112, 0, "e"], + [11113, 0, "n"], + [11114, 0, "d"], + [11115, 0, "{"], + [11116, 0, "p"], + [11117, 0, "r"], + [11118, 0, "o"], + [11119, 0, "o"], + [11120, 0, "f"], + [11121, 0, "t"], + [11122, 0, "r"], + [11123, 0, "e"], + [11124, 0, "e"], + [11125, 0, "}"], + [11110, 0, "\n"], + [11111, 0, "\\"], + [11112, 0, "A"], + [11113, 0, "x"], + [11114, 0, "i"], + [11115, 0, "o"], + [11116, 0, "m"], + [11117, 0, "C"], + [11118, 0, "{"], + [11119, 0, "$"], + [11120, 0, "\\"], + [11121, 0, "m"], + [11122, 0, "a"], + [11123, 0, "t"], + [11124, 0, "h"], + [11125, 0, "i"], + [11126, 0, "t"], + [11127, 0, "{"], + [11128, 0, "c"], + [11129, 0, "t"], + [11130, 0, "x"], + [11131, 0, "}"], + [11132, 0, "("], + [11133, 0, "\\"], + [11134, 0, "m"], + [11135, 0, "a"], + [11136, 0, "t"], + [11137, 0, "h"], + [11138, 0, "s"], + [11139, 0, "f"], + [11140, 0, "{"], + [11141, 0, "n"], + [11142, 0, "e"], + [11143, 0, "x"], + [11144, 0, "t"], + [11145, 0, "}"], + [11146, 0, "("], + [11147, 0, "k"], + [11148, 0, ")"], + [11149, 0, ")"], + [11150, 0, " "], + [11151, 0, "="], + [11152, 0, " "], + [11153, 0, "k"], + [11154, 0, "'"], + [11155, 0, " "], + [11156, 0, "\\"], + [11157, 0, ","], + [11158, 0, "\\"], + [11159, 0, "w"], + [11160, 0, "e"], + [11161, 0, "d"], + [11162, 0, "g"], + [11163, 0, "e"], + [11164, 0, "\\"], + [11165, 0, ","], + [11166, 0, " "], + [11167, 0, "k"], + [11168, 0, "'"], + [11169, 0, " "], + [11170, 0, "\\"], + [11171, 0, "n"], + [11172, 0, "o"], + [11173, 0, "t"], + [11174, 0, "="], + [11175, 0, " "], + [11176, 0, "\\"], + [11177, 0, "m"], + [11178, 0, "a"], + [11179, 0, "t"], + [11180, 0, "h"], + [11181, 0, "s"], + [11182, 0, "f"], + [11183, 0, "{"], + [11184, 0, "t"], + [11185, 0, "a"], + [11186, 0, "i"], + [11187, 0, "l"], + [11188, 0, "}"], + [11189, 0, "$"], + [11190, 0, "}"], + [11191, 0, "\n"], + [11192, 0, "\\"], + [11193, 0, "A"], + [11194, 0, "x"], + [11195, 0, "i"], + [11196, 0, "o"], + [11197, 0, "m"], + [11198, 0, "C"], + [11199, 0, "{"], + [11200, 0, "$"], + [11201, 0, "\\"], + [11202, 0, "m"], + [11203, 0, "a"], + [11204, 0, "t"], + [11205, 0, "h"], + [11206, 0, "i"], + [11207, 0, "t"], + [11208, 0, "{"], + [11209, 0, "c"], + [11210, 0, "t"], + [11211, 0, "x"], + [11212, 0, "}"], + [11213, 0, "("], + [11214, 0, "\\"], + [11215, 0, "m"], + [11216, 0, "a"], + [11217, 0, "t"], + [11218, 0, "h"], + [11219, 0, "s"], + [11220, 0, "f"], + [11221, 0, "{"], + [11222, 0, "p"], + [11223, 0, "r"], + [11224, 0, "e"], + [11225, 0, "s"], + [11226, 0, "}"], + [11227, 0, "("], + [11228, 0, "k"], + [11229, 0, ")"], + [11230, 0, ")"], + [11231, 0, " "], + [11232, 0, "="], + [11233, 0, " "], + [11234, 0, "\\"], + [11235, 0, "{"], + [11236, 0, "\\"], + [11237, 0, "}"], + [11238, 0, "$"], + [11239, 0, "}"], + [11240, 0, "\n"], + [11241, 0, "\\"], + [11242, 0, "L"], + [11243, 0, "e"], + [11244, 0, "f"], + [11245, 0, "t"], + [11246, 0, "L"], + [11247, 0, "a"], + [11248, 0, "b"], + [11249, 0, "e"], + [11250, 0, "l"], + [11251, 0, "{"], + [11252, 0, "$"], + [11253, 0, "\\"], + [11254, 0, "t"], + [11255, 0, "e"], + [11256, 0, "x"], + [11257, 0, "t"], + [11258, 0, "s"], + [11259, 0, "c"], + [11260, 0, "{"], + [11261, 0, "N"], + [11262, 0, "e"], + [11263, 0, "x"], + [11264, 0, "t"], + [11265, 0, "}"], + [11266, 0, "_"], + [11267, 0, "3"], + [11268, 0, "#"], + [11268, 1], + [11268, 0, "$"], + [11269, 0, "}"], + [11270, 0, "\n"], + [11240, 0, "\n"], + [11241, 0, "\\"], + [11242, 0, "A"], + [11243, 0, "x"], + [11244, 0, "i"], + [11245, 0, "o"], + [11246, 0, "m"], + [11247, 0, "C"], + [11248, 0, "{"], + [11249, 0, "$"], + [11250, 0, "\\"], + [11251, 0, "m"], + [11252, 0, "a"], + [11253, 0, "t"], + [11254, 0, "h"], + [11255, 0, "i"], + [11256, 0, "t"], + [11257, 0, "{"], + [11258, 0, "c"], + [11259, 0, "t"], + [11260, 0, "x"], + [11261, 0, "}"], + [11262, 0, ","], + [11263, 0, "\\"], + [11264, 0, ","], + [11265, 0, " "], + [11266, 0, "\\"], + [11267, 0, "m"], + [11268, 0, "a"], + [11269, 0, "t"], + [11270, 0, "h"], + [11271, 0, "s"], + [11272, 0, "f"], + [11273, 0, "{"], + [11274, 0, "c"], + [11275, 0, "u"], + [11276, 0, "r"], + [11277, 0, "s"], + [11278, 0, "o"], + [11279, 0, "r"], + [11280, 0, "}"], + [11281, 0, "("], + [11282, 0, "\\"], + [11283, 0, "l"], + [11284, 0, "a"], + [11285, 0, "n"], + [11286, 0, "g"], + [11287, 0, "l"], + [11288, 0, "e"], + [11289, 0, "\\"], + [11290, 0, "r"], + [11291, 0, "a"], + [11292, 0, "n"], + [11293, 0, "g"], + [11294, 0, "l"], + [11295, 0, "e"], + [11296, 0, ","], + [11297, 0, "\\"], + [11298, 0, ","], + [11299, 0, " "], + [11300, 0, "k"], + [11301, 0, "'"], + [11302, 0, ")"], + [11303, 0, "."], + [11304, 0, "\\"], + [11305, 0, "m"], + [11306, 0, "a"], + [11307, 0, "t"], + [11308, 0, "h"], + [11309, 0, "s"], + [11310, 0, "f"], + [11311, 0, "{"], + [11312, 0, "n"], + [11313, 0, "e"], + [11314, 0, "x"], + [11315, 0, "t"], + [11316, 0, "}"], + [11317, 0, " "], + [11318, 0, "\\"], + [11319, 0, "e"], + [11320, 0, "v"], + [11321, 0, "a"], + [11322, 0, "l"], + [11323, 0, "t"], + [11324, 0, "o"], + [11325, 0, " "], + [11326, 0, "\\"], + [11327, 0, "m"], + [11328, 0, "a"], + [11329, 0, "t"], + [11330, 0, "h"], + [11331, 0, "i"], + [11332, 0, "t"], + [11333, 0, "{"], + [11334, 0, "c"], + [11335, 0, "u"], + [11336, 0, "r"], + [11337, 0, "}"], + [11338, 0, "'"], + [11339, 0, "$"], + [11340, 0, "}"], + [11372, 0, "\\"], + [11373, 0, "T"], + [11374, 0, "r"], + [11375, 0, "i"], + [11376, 0, "n"], + [11377, 0, "a"], + [11378, 0, "r"], + [11379, 0, "y"], + [11380, 0, "I"], + [11381, 0, "n"], + [11382, 0, "f"], + [11383, 0, "C"], + [11384, 0, "{"], + [11385, 0, "$"], + [11386, 0, "\\"], + [11387, 0, "m"], + [11388, 0, "a"], + [11389, 0, "t"], + [11390, 0, "h"], + [11391, 0, "i"], + [11392, 0, "t"], + [11393, 0, "{"], + [11394, 0, "c"], + [11395, 0, "t"], + [11396, 0, "x"], + [11397, 0, "}"], + [11398, 0, ","], + [11399, 0, "\\"], + [11400, 0, ","], + [11401, 0, " "], + [11402, 0, "\\"], + [11403, 0, "m"], + [11404, 0, "a"], + [11405, 0, "t"], + [11406, 0, "h"], + [11407, 0, "s"], + [11408, 0, "f"], + [11409, 0, "{"], + [11410, 0, "c"], + [11411, 0, "u"], + [11412, 0, "r"], + [11413, 0, "s"], + [11414, 0, "o"], + [11415, 0, "r"], + [11416, 0, "}"], + [11417, 0, "("], + [11418, 0, "\\"], + [11419, 0, "l"], + [11420, 0, "a"], + [11421, 0, "n"], + [11422, 0, "g"], + [11423, 0, "l"], + [11424, 0, "e"], + [11425, 0, "\\"], + [11426, 0, "r"], + [11427, 0, "a"], + [11428, 0, "n"], + [11429, 0, "g"], + [11430, 0, "l"], + [11431, 0, "e"], + [11432, 0, ","], + [11433, 0, "\\"], + [11434, 0, ","], + [11435, 0, " "], + [11436, 0, "k"], + [11437, 0, ")"], + [11438, 0, "."], + [11439, 0, "\\"], + [11440, 0, "m"], + [11441, 0, "a"], + [11442, 0, "t"], + [11443, 0, "h"], + [11444, 0, "s"], + [11445, 0, "f"], + [11446, 0, "{"], + [11447, 0, "n"], + [11448, 0, "e"], + [11449, 0, "x"], + [11450, 0, "t"], + [11451, 0, "}"], + [11452, 0, " "], + [11453, 0, "\\"], + [11454, 0, "e"], + [11455, 0, "v"], + [11456, 0, "a"], + [11457, 0, "l"], + [11458, 0, "t"], + [11459, 0, "o"], + [11460, 0, " "], + [11461, 0, "\\"], + [11462, 0, "m"], + [11463, 0, "a"], + [11464, 0, "t"], + [11465, 0, "h"], + [11466, 0, "i"], + [11467, 0, "t"], + [11468, 0, "{"], + [11469, 0, "c"], + [11470, 0, "u"], + [11471, 0, "r"], + [11472, 0, "}"], + [11473, 0, "\""], + [11473, 1], + [11473, 0, "'"], + [11474, 0, "$"], + [11475, 0, "}"], + [11763, 1], + [11763, 0, "4"], + [11229, 0, "'"], + [10898, 0, "'"], + [11972, 0, "\n"], + [11973, 0, "\n"], + [11974, 0, "\\"], + [11975, 0, "["], + [11976, 0, " "], + [11977, 0, "\\"], + [11978, 0, "m"], + [11979, 0, "a"], + [11980, 0, "t"], + [11981, 0, "h"], + [11982, 0, "r"], + [11983, 0, "m"], + [11984, 0, "{"], + [11985, 0, "k"], + [11986, 0, "e"], + [11987, 0, "y"], + [11988, 0, "s"], + [11989, 0, "}"], + [11990, 0, "("], + [11991, 0, "\\"], + [11992, 0, "m"], + [11993, 0, "a"], + [11994, 0, "t"], + [11995, 0, "h"], + [11996, 0, "i"], + [11997, 0, "t"], + [11998, 0, "{"], + [11999, 0, "c"], + [12000, 0, "t"], + [12001, 0, "x"], + [12002, 0, "}"], + [12003, 0, ")"], + [12004, 0, " "], + [12005, 0, "="], + [12006, 0, " "], + [12007, 0, "\\"], + [12008, 0, "{"], + [12009, 0, "\\"], + [12010, 0, ";"], + [12011, 0, "\n"], + [12012, 0, "\\"], + [12013, 0, ";"], + [12014, 0, "\\"], + [12015, 0, "}"], + [12016, 0, " "], + [12017, 0, "\\"], + [12018, 0, "]"], + [12011, 0, "\n"], + [12012, 0, " "], + [12013, 0, " "], + [12014, 0, " "], + [12015, 0, " "], + [12016, 0, "k"], + [12017, 0, " "], + [12018, 0, "\\"], + [12019, 0, "m"], + [12020, 0, "i"], + [12021, 0, "d"], + [12022, 0, " "], + [12023, 0, "\\"], + [12024, 0, "m"], + [12025, 0, "a"], + [12026, 0, "t"], + [12027, 0, "h"], + [12028, 0, "s"], + [12029, 0, "f"], + [12030, 0, "{"], + [12031, 0, "l"], + [12032, 0, "i"], + [12032, 1], + [12031, 1], + [12030, 1], + [12030, 0, "m"], + [12030, 1], + [12030, 0, "{"], + [12031, 0, "m"], + [12032, 0, "a"], + [12033, 0, "p"], + [12034, 0, "T"], + [12035, 0, "}"], + [12036, 0, "("], + [12037, 0, "k"], + [12038, 0, ")"], + [12039, 0, " "], + [12040, 0, "\\"], + [12041, 0, "i"], + [12042, 0, "n"], + [12043, 0, " "], + [12044, 0, "\\"], + [12045, 0, "m"], + [12046, 0, "a"], + [12047, 0, "t"], + [12048, 0, "h"], + [12049, 0, "r"], + [12050, 0, "m"], + [12051, 0, "{"], + [12052, 0, "d"], + [12053, 0, "o"], + [12054, 0, "m"], + [12055, 0, "}"], + [12056, 0, "("], + [12057, 0, "c"], + [12058, 0, "t"], + [12059, 0, "x"], + [12060, 0, ")"], + [12061, 0, " "], + [12062, 0, "\\"], + [12063, 0, ","], + [12064, 0, "\\"], + [12065, 0, "v"], + [12066, 0, "e"], + [12067, 0, "e"], + [12068, 0, "\\"], + [12069, 0, ","], + [12070, 0, " "], + [12070, 1], + [12015, 1], + [12014, 1], + [12013, 1], + [12012, 1], + [12011, 1], + [12011, 0, " "], + [12018, 0, "\n"], + [12019, 0, " "], + [12020, 0, " "], + [12021, 0, " "], + [12070, 0, "\n"], + [12071, 0, " "], + [12072, 0, " "], + [12073, 0, " "], + [12074, 0, " "], + [12075, 0, "\\"], + [12076, 0, "m"], + [12077, 0, "a"], + [12078, 0, "t"], + [12079, 0, "h"], + [12080, 0, "s"], + [12081, 0, "f"], + [12082, 0, "{"], + [12083, 0, "l"], + [12084, 0, "i"], + [12085, 0, "s"], + [12086, 0, "t"], + [12087, 0, "T"], + [12088, 0, "}"], + [12089, 0, "("], + [12090, 0, "k"], + [12091, 0, ")"], + [12092, 0, " "], + [12093, 0, "\\"], + [12094, 0, "i"], + [12095, 0, "n"], + [12096, 0, " "], + [12097, 0, "\\"], + [12098, 0, "m"], + [12099, 0, "a"], + [12100, 0, "t"], + [12101, 0, "h"], + [12102, 0, "r"], + [12103, 0, "m"], + [12104, 0, "{"], + [12105, 0, "d"], + [12106, 0, "o"], + [12107, 0, "m"], + [12108, 0, "}"], + [12109, 0, "("], + [12110, 0, "c"], + [12111, 0, "t"], + [12112, 0, "x"], + [12113, 0, ")"], + [12114, 0, " "], + [12115, 0, "\\"], + [12116, 0, ","], + [12117, 0, "\\"], + [12118, 0, "v"], + [12119, 0, "e"], + [12120, 0, "e"], + [12121, 0, "\\"], + [12122, 0, ","], + [12123, 0, "\n"], + [12124, 0, " "], + [12125, 0, " "], + [12126, 0, " "], + [12127, 0, " "], + [12128, 0, "\\"], + [12129, 0, "m"], + [12130, 0, "a"], + [12131, 0, "t"], + [12132, 0, "h"], + [12133, 0, "s"], + [12134, 0, "f"], + [12135, 0, "{"], + [12136, 0, "r"], + [12137, 0, "e"], + [12138, 0, "g"], + [12139, 0, "T"], + [12140, 0, "}"], + [12141, 0, "("], + [12142, 0, "k"], + [12143, 0, ")"], + [12144, 0, " "], + [12145, 0, "\\"], + [12146, 0, "i"], + [12147, 0, "n"], + [12148, 0, " "], + [12149, 0, "\\"], + [12150, 0, "m"], + [12151, 0, "a"], + [12152, 0, "t"], + [12153, 0, "h"], + [12154, 0, "r"], + [12155, 0, "m"], + [12156, 0, "{"], + [12157, 0, "d"], + [12158, 0, "o"], + [12159, 0, "m"], + [12160, 0, "}"], + [12161, 0, "("], + [12162, 0, "c"], + [12163, 0, "t"], + [12164, 0, "x"], + [12165, 0, ")"], + [12174, 0, "\n"], + [12175, 0, "\n"], + [12176, 0, "\\"], + [12177, 0, "m"], + [12178, 0, "a"], + [12179, 0, "t"], + [12180, 0, "h"], + [12181, 0, "s"], + [12182, 0, "f"], + [12183, 0, "{"], + [12184, 0, "o"], + [12185, 0, "r"], + [12185, 1], + [12184, 1], + [12183, 1], + [12182, 1], + [12181, 1], + [12180, 1], + [12179, 1], + [12178, 1], + [12177, 1], + [12177, 0, "b"], + [12178, 0, "e"], + [12179, 0, "g"], + [12180, 0, "i"], + [12181, 0, "n"], + [12182, 0, "{"], + [12183, 0, "p"], + [12184, 0, "r"], + [12185, 0, "o"], + [12186, 0, "o"], + [12187, 0, "f"], + [12188, 0, "t"], + [12189, 0, "r"], + [12190, 0, "e"], + [12191, 0, "e"], + [12192, 0, "\\"], + [12193, 0, "="], + [12193, 1], + [12192, 1], + [12192, 0, "}"], + [12193, 0, "\n"], + [12194, 0, "\\"], + [12195, 0, "A"], + [12196, 0, "x"], + [12197, 0, "i"], + [12198, 0, "o"], + [12199, 0, "m"], + [12200, 0, "C"], + [12201, 0, "{"], + [12202, 0, "$"], + [12203, 0, "A"], + [12204, 0, "_"], + [12205, 0, "p"], + [12206, 0, ","], + [12207, 0, "\\"], + [12208, 0, ","], + [12209, 0, " "], + [12210, 0, "\\"], + [12211, 0, "m"], + [12212, 0, "a"], + [12213, 0, "t"], + [12214, 0, "h"], + [12215, 0, "i"], + [12216, 0, "t"], + [12217, 0, "{"], + [12218, 0, "e"], + [12219, 0, "x"], + [12220, 0, "p"], + [12221, 0, "r"], + [12222, 0, "}"], + [12223, 0, " "], + [12224, 0, "\\"], + [12225, 0, "e"], + [12226, 0, "v"], + [12227, 0, "a"], + [12228, 0, "l"], + [12229, 0, "t"], + [12230, 0, "o"], + [12231, 0, " "], + [12232, 0, "\\"], + [12233, 0, "m"], + [12234, 0, "a"], + [12235, 0, "t"], + [12236, 0, "h"], + [12237, 0, "i"], + [12238, 0, "t"], + [12239, 0, "{"], + [12240, 0, "c"], + [12241, 0, "u"], + [12242, 0, "r"], + [12243, 0, "}"], + [12244, 0, "$"], + [12245, 0, "}"], + [12246, 0, "\n"], + [12247, 0, "\\"], + [12248, 0, "A"], + [12249, 0, "x"], + [12250, 0, "i"], + [12251, 0, "o"], + [12252, 0, "m"], + [12253, 0, "C"], + [12254, 0, "{"], + [12255, 0, "$"], + [12256, 0, "A"], + [12257, 0, "_"], + [12258, 0, "p"], + [12259, 0, ","], + [12260, 0, "\\"], + [12261, 0, ","], + [12262, 0, " "], + [12263, 0, "\\"], + [12264, 0, "m"], + [12265, 0, "a"], + [12266, 0, "t"], + [12267, 0, "h"], + [12268, 0, "i"], + [12269, 0, "t"], + [12270, 0, "{"], + [12271, 0, "c"], + [12272, 0, "u"], + [12273, 0, "r"], + [12274, 0, "}"], + [12275, 0, "."], + [12276, 0, "\\"], + [12277, 0, "m"], + [12278, 0, "a"], + [12279, 0, "t"], + [12280, 0, "h"], + [12281, 0, "s"], + [12282, 0, "f"], + [12283, 0, "{"], + [12284, 0, "k"], + [12285, 0, "e"], + [12286, 0, "y"], + [12287, 0, "s"], + [12288, 0, "}"], + [12289, 0, "$"], + [12290, 0, "}"], + [12289, 0, " "], + [12290, 0, "\\"], + [12291, 0, "e"], + [12292, 0, "v"], + [12293, 0, "a"], + [12294, 0, "l"], + [12295, 0, "t"], + [12296, 0, "o"], + [12297, 0, " "], + [12298, 0, "\\"], + [12299, 0, "m"], + [12300, 0, "a"], + [12301, 0, "t"], + [12302, 0, "h"], + [12303, 0, "i"], + [12304, 0, "t"], + [12305, 0, "{"], + [12306, 0, "v"], + [12307, 0, "a"], + [12308, 0, "l"], + [12308, 1], + [12307, 1], + [12306, 1], + [12306, 0, "k"], + [12307, 0, "e"], + [12308, 0, "y"], + [12309, 0, "s"], + [12310, 0, "}"], + [12313, 0, "\n"], + [12314, 0, "\\"], + [12315, 0, "L"], + [12316, 0, "e"], + [12317, 0, "f"], + [12318, 0, "t"], + [12319, 0, "L"], + [12320, 0, "a"], + [12321, 0, "b"], + [12322, 0, "e"], + [12323, 0, "l"], + [12324, 0, "{"], + [12325, 0, "$"], + [12326, 0, "\\"], + [12327, 0, "t"], + [12328, 0, "e"], + [12329, 0, "x"], + [12330, 0, "t"], + [12331, 0, "s"], + [12332, 0, "c"], + [12333, 0, "{"], + [12334, 0, "K"], + [12335, 0, "e"], + [12336, 0, "y"], + [12337, 0, "s"], + [12338, 0, "}"], + [12339, 0, "_"], + [12340, 0, "1"], + [12341, 0, "$"], + [12342, 0, "}"], + [12343, 0, "\n"], + [12344, 0, "\\"], + [12345, 0, "B"], + [12346, 0, "i"], + [12347, 0, "n"], + [12348, 0, "a"], + [12349, 0, "r"], + [12350, 0, "y"], + [12351, 0, "I"], + [12352, 0, "n"], + [12353, 0, "f"], + [12354, 0, "C"], + [12355, 0, "{"], + [12356, 0, "$"], + [12357, 0, "A"], + [12358, 0, "_"], + [12359, 0, "p"], + [12360, 0, ","], + [12361, 0, "\\"], + [12362, 0, ","], + [12363, 0, " "], + [12364, 0, "\\"], + [12365, 0, "m"], + [12366, 0, "a"], + [12367, 0, "t"], + [12368, 0, "h"], + [12369, 0, "i"], + [12370, 0, "t"], + [12371, 0, "{"], + [12372, 0, "e"], + [12373, 0, "x"], + [12374, 0, "p"], + [12375, 0, "r"], + [12376, 0, "}"], + [12377, 0, "."], + [12378, 0, "\\"], + [12379, 0, "m"], + [12380, 0, "a"], + [12381, 0, "t"], + [12382, 0, "h"], + [12383, 0, "s"], + [12384, 0, "f"], + [12385, 0, "{"], + [12386, 0, "k"], + [12387, 0, "e"], + [12388, 0, "y"], + [12389, 0, "s"], + [12390, 0, "}"], + [12391, 0, " "], + [12392, 0, "\\"], + [12393, 0, "e"], + [12394, 0, "v"], + [12395, 0, "a"], + [12396, 0, "l"], + [12397, 0, "t"], + [12398, 0, "o"], + [12399, 0, " "], + [12400, 0, "\\"], + [12401, 0, "m"], + [12402, 0, "a"], + [12403, 0, "t"], + [12404, 0, "h"], + [12405, 0, "i"], + [12406, 0, "t"], + [12407, 0, "{"], + [12408, 0, "k"], + [12409, 0, "e"], + [12410, 0, "y"], + [12411, 0, "s"], + [12412, 0, "}"], + [12413, 0, "$"], + [12414, 0, "}"], + [12415, 0, "\n"], + [12416, 0, "\\"], + [12417, 0, "e"], + [12418, 0, "n"], + [12419, 0, "d"], + [12420, 0, "{"], + [12421, 0, "P"], + [12421, 1], + [12421, 0, "p"], + [12422, 0, "r"], + [12423, 0, "o"], + [12424, 0, "o"], + [12425, 0, "f"], + [12426, 0, "t"], + [12427, 0, "r"], + [12428, 0, "e"], + [12429, 0, "e"], + [12430, 0, "}"], + [12057, 0, "\\"], + [12058, 0, "m"], + [12059, 0, "a"], + [12060, 0, "t"], + [12061, 0, "h"], + [12062, 0, "i"], + [12063, 0, "t"], + [12064, 0, "{"], + [12068, 0, "}"], + [12119, 0, "\\"], + [12120, 0, "m"], + [12121, 0, "a"], + [12122, 0, "t"], + [12123, 0, "h"], + [12124, 0, "i"], + [12125, 0, "t"], + [12126, 0, "{"], + [12130, 0, "}"], + [12180, 0, "\\"], + [12181, 0, "m"], + [12182, 0, "a"], + [12183, 0, "t"], + [12184, 0, "h"], + [12185, 0, "i"], + [12186, 0, "t"], + [12187, 0, "{"], + [12191, 0, "}"], + [12163, 0, " "], + [12040, 0, " "], + [12460, 0, "\n"], + [12461, 0, "\n"], + [12462, 0, "\\"], + [12463, 0, "b"], + [12464, 0, "e"], + [12465, 0, "g"], + [12466, 0, "i"], + [12467, 0, "n"], + [12468, 0, "{"], + [12469, 0, "p"], + [12470, 0, "r"], + [12471, 0, "o"], + [12472, 0, "o"], + [12473, 0, "f"], + [12474, 0, "t"], + [12475, 0, "r"], + [12476, 0, "e"], + [12477, 0, "e"], + [12478, 0, "}"], + [12479, 0, "\n"], + [12480, 0, "\\"], + [12481, 0, "e"], + [12482, 0, "n"], + [12483, 0, "d"], + [12484, 0, "{"], + [12485, 0, "p"], + [12486, 0, "r"], + [12487, 0, "o"], + [12488, 0, "o"], + [12489, 0, "f"], + [12490, 0, "t"], + [12491, 0, "r"], + [12492, 0, "e"], + [12493, 0, "e"], + [12494, 0, "}"], + [12479, 0, "\n"], + [12480, 0, "\\"], + [12481, 0, "A"], + [12482, 0, "x"], + [12483, 0, "i"], + [12484, 0, "o"], + [12485, 0, "m"], + [12486, 0, "C"], + [12487, 0, "{"], + [12488, 0, "$"], + [12489, 0, "\\"], + [12490, 0, "m"], + [12491, 0, "a"], + [12492, 0, "t"], + [12493, 0, "h"], + [12494, 0, "i"], + [12495, 0, "t"], + [12496, 0, "{"], + [12497, 0, "c"], + [12498, 0, "t"], + [12499, 0, "x"], + [12500, 0, "}"], + [12501, 0, "("], + [12502, 0, "\\"], + [12503, 0, "m"], + [12504, 0, "a"], + [12505, 0, "t"], + [12506, 0, "h"], + [12507, 0, "s"], + [12508, 0, "f"], + [12509, 0, "{"], + [12510, 0, "m"], + [12511, 0, "a"], + [12512, 0, "p"], + [12513, 0, "T"], + [12514, 0, "}"], + [12515, 0, "("], + [12516, 0, "k"], + [12517, 0, ")"], + [12518, 0, ")"], + [12489, 0, "\\"], + [12490, 0, "m"], + [12491, 0, "a"], + [12492, 0, "t"], + [12493, 0, "h"], + [12494, 0, "r"], + [12495, 0, "m"], + [12496, 0, "{"], + [12497, 0, "k"], + [12498, 0, "e"], + [12499, 0, "y"], + [12500, 0, "s"], + [12501, 0, "}"], + [12502, 0, "("], + [12533, 0, ")"], + [12495, 1], + [12494, 1], + [12494, 0, "i"], + [12495, 0, "t"], + [12497, 1], + [12497, 1], + [12497, 1], + [12497, 1], + [12497, 0, "m"], + [12498, 0, "a"], + [12499, 0, "p"], + [12501, 0, " "], + [12502, 0, "="], + [12503, 0, " "], + [12504, 1], + [12534, 1], + [12534, 0, "$"], + [12535, 0, "}"], + [12536, 0, "\n"], + [12537, 0, "\\"], + [12538, 0, "A"], + [12539, 0, "x"], + [12540, 0, "i"], + [12541, 0, "o"], + [12542, 0, "m"], + [12543, 0, "C"], + [12544, 0, "{"], + [12545, 0, "$"], + [12546, 0, "\\"], + [12547, 0, "m"], + [12548, 0, "a"], + [12549, 0, "t"], + [12550, 0, "h"], + [12551, 0, "i"], + [12552, 0, "t"], + [12553, 0, "{"], + [12554, 0, "k"], + [12555, 0, "e"], + [12556, 0, "y"], + [12557, 0, "s"], + [12558, 0, "}"], + [12559, 0, " "], + [12560, 0, "="], + [12561, 0, " "], + [12562, 0, "\\"], + [12563, 0, "{"], + [12564, 0, "\\"], + [12565, 0, ";"], + [12566, 0, " "], + [12567, 0, "k"], + [12568, 0, " "], + [12569, 0, "\\"], + [12570, 0, "m"], + [12571, 0, "i"], + [12572, 0, "d"], + [12573, 0, " "], + [12574, 0, "k"], + [12575, 0, " "], + [12576, 0, "\\"], + [12577, 0, "i"], + [12578, 0, "n"], + [12579, 0, " "], + [12580, 0, "\\"], + [12581, 0, "m"], + [12582, 0, "a"], + [12583, 0, "t"], + [12584, 0, "h"], + [12585, 0, "r"], + [12586, 0, "m"], + [12587, 0, "{"], + [12588, 0, "k"], + [12589, 0, "e"], + [12590, 0, "y"], + [12591, 0, "s"], + [12592, 0, "}"], + [12593, 0, "("], + [12594, 0, "\\"], + [12595, 0, "m"], + [12596, 0, "a"], + [12597, 0, "t"], + [12598, 0, "h"], + [12599, 0, "i"], + [12600, 0, "t"], + [12601, 0, "{"], + [12602, 0, "m"], + [12603, 0, "a"], + [12604, 0, "p"], + [12605, 0, "}"], + [12606, 0, ")"], + [12607, 0, " "], + [12608, 0, "\\"], + [12609, 0, ","], + [12610, 0, "\\"], + [12611, 0, "w"], + [12612, 0, "e"], + [12613, 0, "d"], + [12614, 0, "g"], + [12615, 0, "e"], + [12616, 0, "\\"], + [12617, 0, ","], + [12618, 0, "\n"], + [12619, 0, " "], + [12620, 0, " "], + [12621, 0, " "], + [12622, 0, " "], + [12623, 0, "\\"], + [12624, 0, "m"], + [12625, 0, "a"], + [12626, 0, "t"], + [12627, 0, "h"], + [12628, 0, "i"], + [12629, 0, "t"], + [12630, 0, "{"], + [12631, 0, "m"], + [12632, 0, "a"], + [12633, 0, "p"], + [12634, 0, "}"], + [12635, 0, "("], + [12636, 0, "\\"], + [12637, 0, "m"], + [12638, 0, "a"], + [12639, 0, "t"], + [12640, 0, "h"], + [12641, 0, "s"], + [12642, 0, "f"], + [12643, 0, "{"], + [12644, 0, "p"], + [12645, 0, "r"], + [12646, 0, "e"], + [12647, 0, "s"], + [12648, 0, "}"], + [12649, 0, "("], + [12650, 0, "k"], + [12651, 0, ")"], + [12652, 0, ")"], + [12653, 0, " "], + [12654, 0, "\\"], + [12655, 0, "n"], + [12656, 0, "o"], + [12657, 0, "t"], + [12658, 0, "="], + [12659, 0, " "], + [12660, 0, "\\"], + [12661, 0, "{"], + [12662, 0, "\\"], + [12663, 0, "}"], + [12664, 0, " "], + [12665, 0, "\\"], + [12666, 0, ";"], + [12667, 0, "\\"], + [12668, 0, "}"], + [12669, 0, "$"], + [12670, 0, "}"], + [12671, 0, "\n"], + [12672, 0, "\\"], + [12673, 0, "L"], + [12674, 0, "e"], + [12675, 0, "f"], + [12676, 0, "t"], + [12677, 0, "L"], + [12678, 0, "a"], + [12679, 0, "b"], + [12680, 0, "e"], + [12681, 0, "l"], + [12682, 0, "{"], + [12683, 0, "$"], + [12684, 0, "\\"], + [12685, 0, "t"], + [12686, 0, "e"], + [12687, 0, "x"], + [12688, 0, "t"], + [12689, 0, "s"], + [12690, 0, "c"], + [12691, 0, "{"], + [12692, 0, "K"], + [12693, 0, "e"], + [12694, 0, "y"], + [12695, 0, "s"], + [12696, 0, "}"], + [12697, 0, "_"], + [12698, 0, "2"], + [12699, 0, "$"], + [12700, 0, "}"], + [12701, 0, "\n"], + [12702, 0, "\\"], + [12703, 0, "B"], + [12704, 0, "i"], + [12705, 0, "n"], + [12706, 0, "a"], + [12707, 0, "r"], + [12708, 0, "y"], + [12709, 0, "I"], + [12710, 0, "n"], + [12711, 0, "f"], + [12712, 0, "C"], + [12713, 0, "{"], + [12714, 0, "$"], + [12715, 0, "A"], + [12716, 0, "_"], + [12717, 0, "p"], + [12718, 0, ","], + [12719, 0, "\\"], + [12720, 0, ","], + [12721, 0, " "], + [12722, 0, "\\"], + [12723, 0, "m"], + [12724, 0, "a"], + [12725, 0, "t"], + [12726, 0, "h"], + [12726, 1], + [12725, 1], + [12724, 1], + [12723, 1], + [12723, 0, "m"], + [12724, 0, "a"], + [12725, 0, "t"], + [12726, 0, "h"], + [12727, 0, "s"], + [12728, 0, "f"], + [12729, 0, "{"], + [12730, 0, "c"], + [12731, 0, "u"], + [12732, 0, "r"], + [12733, 0, "s"], + [12734, 0, "o"], + [12735, 0, "r"], + [12736, 0, "}"], + [12737, 0, "("], + [12738, 0, "\\"], + [12739, 0, "l"], + [12740, 0, "a"], + [12741, 0, "n"], + [12742, 0, "g"], + [12743, 0, "l"], + [12744, 0, "e"], + [12745, 0, "\\"], + [12746, 0, "r"], + [12747, 0, "a"], + [12748, 0, "n"], + [12749, 0, "g"], + [12750, 0, "l"], + [12751, 0, "e"], + [12752, 0, ","], + [12753, 0, "\\"], + [12754, 0, ","], + [12755, 0, " "], + [12756, 0, "k"], + [12757, 0, ")"], + [12758, 0, "."], + [12759, 0, "\\"], + [12760, 0, "m"], + [12761, 0, "a"], + [12762, 0, "t"], + [12763, 0, "h"], + [12764, 0, "s"], + [12765, 0, "f"], + [12766, 0, "{"], + [12767, 0, "k"], + [12768, 0, "e"], + [12769, 0, "y"], + [12770, 0, "s"], + [12771, 0, "}"], + [12772, 0, " "], + [12773, 0, "\\"], + [12774, 0, "e"], + [12775, 0, "v"], + [12776, 0, "a"], + [12777, 0, "l"], + [12778, 0, "t"], + [12779, 0, "o"], + [12780, 0, " "], + [12781, 0, "\\"], + [12782, 0, "m"], + [12783, 0, "a"], + [12784, 0, "t"], + [12785, 0, "h"], + [12786, 0, "i"], + [12787, 0, "t"], + [12788, 0, "{"], + [12789, 0, "k"], + [12790, 0, "e"], + [12791, 0, "y"], + [12792, 0, "s"], + [12793, 0, "}"], + [12794, 0, "$"], + [12795, 0, "}"], + [12812, 0, "\n"], + [12813, 0, "\n"], + [12814, 0, "\\"], + [12815, 0, "b"], + [12816, 0, "e"], + [12817, 0, "g"], + [12818, 0, "i"], + [12819, 0, "n"], + [12820, 0, "{"], + [12821, 0, "p"], + [12822, 0, "r"], + [12823, 0, "o"], + [12824, 0, "o"], + [12825, 0, "f"], + [12826, 0, "t"], + [12827, 0, "r"], + [12828, 0, "e"], + [12829, 0, "e"], + [12830, 0, "}"], + [12831, 0, "\n"], + [12832, 0, "\\"], + [12833, 0, "e"], + [12834, 0, "n"], + [12835, 0, "d"], + [12836, 0, "{"], + [12837, 0, "p"], + [12838, 0, "r"], + [12839, 0, "o"], + [12840, 0, "o"], + [12841, 0, "f"], + [12842, 0, "t"], + [12843, 0, "r"], + [12844, 0, "e"], + [12845, 0, "e"], + [12846, 0, "}"], + [12831, 0, "\n"], + [12832, 0, "\\"], + [12833, 0, "A"], + [12834, 0, "x"], + [12835, 0, "i"], + [12836, 0, "o"], + [12837, 0, "m"], + [12838, 0, "C"], + [12839, 0, "{"], + [12840, 0, "$"], + [12841, 0, "k"], + [12842, 0, "_"], + [12843, 0, "1"], + [12844, 0, " "], + [12845, 0, "\\"], + [12846, 0, "i"], + [12847, 0, "n"], + [12848, 0, " "], + [12849, 0, "\\"], + [12850, 0, "m"], + [12851, 0, "a"], + [12852, 0, "t"], + [12853, 0, "h"], + [12854, 0, "r"], + [12855, 0, "m"], + [12856, 0, "{"], + [12857, 0, "d"], + [12858, 0, "o"], + [12859, 0, "m"], + [12860, 0, "}"], + [12861, 0, "("], + [12862, 0, "\\"], + [12863, 0, "m"], + [12864, 0, "a"], + [12865, 0, "t"], + [12866, 0, "h"], + [12867, 0, "i"], + [12868, 0, "t"], + [12869, 0, "{"], + [12870, 0, "c"], + [12871, 0, "t"], + [12872, 0, "x"], + [12873, 0, "}"], + [12874, 0, ")"], + [12875, 0, "$"], + [12876, 0, "}"], + [12877, 0, "\n"], + [12878, 0, "\\"], + [12879, 0, "A"], + [12880, 0, "x"], + [12881, 0, "i"], + [12882, 0, "o"], + [12883, 0, "m"], + [12884, 0, "C"], + [12885, 0, "{"], + [12886, 0, "$"], + [12887, 0, "\\"], + [12888, 0, "m"], + [12889, 0, "a"], + [12890, 0, "t"], + [12891, 0, "h"], + [12892, 0, "i"], + [12893, 0, "t"], + [12894, 0, "{"], + [12895, 0, "c"], + [12896, 0, "t"], + [12897, 0, "x"], + [12898, 0, "}"], + [12899, 0, "("], + [12900, 0, "k"], + [12901, 0, "_"], + [12902, 0, "1"], + [12903, 0, ")"], + [12904, 0, ","], + [12905, 0, "\\"], + [12906, 0, ","], + [12907, 0, " "], + [12908, 0, "\\"], + [12909, 0, "m"], + [12910, 0, "a"], + [12911, 0, "t"], + [12912, 0, "h"], + [12913, 0, "s"], + [12914, 0, "f"], + [12915, 0, "{"], + [12916, 0, "c"], + [12917, 0, "u"], + [12918, 0, "r"], + [12919, 0, "s"], + [12920, 0, "o"], + [12921, 0, "r"], + [12922, 0, "("], + [12923, 0, "\\"], + [12924, 0, "l"], + [12925, 0, "a"], + [12926, 0, "n"], + [12927, 0, "g"], + [12928, 0, "l"], + [12929, 0, "e"], + [12930, 0, " "], + [12931, 0, "k"], + [12932, 0, "_"], + [12933, 0, "2"], + [12934, 0, ","], + [12935, 0, " "], + [12936, 0, "\\"], + [12937, 0, "d"], + [12938, 0, "o"], + [12939, 0, "t"], + [12940, 0, "s"], + [12941, 0, ","], + [12942, 0, " "], + [12943, 0, "k"], + [12944, 0, "_"], + [12945, 0, "{"], + [12946, 0, "n"], + [12947, 0, "-"], + [12948, 0, "1"], + [12949, 0, "}"], + [12950, 0, " "], + [12951, 0, "\\"], + [12952, 0, "r"], + [12953, 0, "a"], + [12954, 0, "n"], + [12955, 0, "g"], + [12956, 0, "l"], + [12957, 0, "e"], + [12958, 0, ","], + [12959, 0, "\\"], + [12960, 0, ","], + [12961, 0, " "], + [12962, 0, "k"], + [12963, 0, "_"], + [12964, 0, "n"], + [12965, 0, ")"], + [12966, 0, "."], + [12967, 0, "\\"], + [12968, 0, "m"], + [12969, 0, "a"], + [12970, 0, "t"], + [12971, 0, "h"], + [12972, 0, "s"], + [12973, 0, "f"], + [12974, 0, "{"], + [12975, 0, "k"], + [12976, 0, "e"], + [12977, 0, "y"], + [12978, 0, "s"], + [12979, 0, "}"], + [12980, 0, "\n"], + [12981, 0, " "], + [12982, 0, " "], + [12983, 0, " "], + [12984, 0, " "], + [12985, 0, "\\"], + [12986, 0, "e"], + [12987, 0, "v"], + [12988, 0, "a"], + [12989, 0, "l"], + [12990, 0, "t"], + [12991, 0, "o"], + [12992, 0, " "], + [12993, 0, "\\"], + [12994, 0, "m"], + [12995, 0, "a"], + [12996, 0, "t"], + [12997, 0, "h"], + [12998, 0, "i"], + [12999, 0, "t"], + [13000, 0, "{"], + [13001, 0, "k"], + [13002, 0, "e"], + [13003, 0, "y"], + [13004, 0, "s"], + [13005, 0, "}"], + [13006, 0, "$"], + [13007, 0, "}"], + [13008, 0, "\n"], + [13009, 0, "\\"], + [13010, 0, "L"], + [13011, 0, "e"], + [13012, 0, "f"], + [13013, 0, "t"], + [13014, 0, "L"], + [13015, 0, "a"], + [13016, 0, "b"], + [13017, 0, "e"], + [13018, 0, "l"], + [13019, 0, "{"], + [13020, 0, "$"], + [13021, 0, "\\"], + [13022, 0, "t"], + [13023, 0, "e"], + [13024, 0, "x"], + [13025, 0, "t"], + [13026, 0, "s"], + [13027, 0, "c"], + [13028, 0, "{"], + [13029, 0, "K"], + [13030, 0, "e"], + [13031, 0, "y"], + [13032, 0, "s"], + [13033, 0, "}"], + [13034, 0, "_"], + [13035, 0, "3"], + [13036, 0, "#"], + [13037, 0, "}"], + [13037, 1], + [13036, 1], + [13036, 0, "$"], + [13037, 0, "}"], + [13038, 0, "\n"], + [13039, 0, "\\"], + [13040, 0, "B"], + [13041, 0, "i"], + [13042, 0, "n"], + [13043, 0, "a"], + [13044, 0, "r"], + [13045, 0, "y"], + [13046, 0, "I"], + [13047, 0, "n"], + [13048, 0, "f"], + [13049, 0, "C"], + [13050, 0, "{"], + [13051, 0, "$"], + [13052, 0, "\\"], + [13053, 0, "m"], + [13054, 0, "a"], + [13055, 0, "t"], + [13056, 0, "h"], + [13057, 0, "i"], + [13058, 0, "t"], + [13059, 0, "{"], + [13060, 0, "c"], + [13061, 0, "t"], + [13062, 0, "x"], + [13063, 0, "}"], + [13064, 0, ","], + [13065, 0, "\\"], + [13066, 0, ","], + [13067, 0, " "], + [13068, 0, "\\"], + [13069, 0, "m"], + [13070, 0, "a"], + [13071, 0, "t"], + [13072, 0, "h"], + [13073, 0, "s"], + [13074, 0, "f"], + [13075, 0, "{"], + [13076, 0, "c"], + [13077, 0, "u"], + [13078, 0, "r"], + [13079, 0, "s"], + [13080, 0, "o"], + [13081, 0, "r"], + [13082, 0, "}"], + [13083, 0, "("], + [13084, 0, "\\"], + [13085, 0, "l"], + [13086, 0, "a"], + [13087, 0, "n"], + [13088, 0, "g"], + [13089, 0, "l"], + [13090, 0, "e"], + [13091, 0, " "], + [13092, 0, "k"], + [13093, 0, "_"], + [13094, 0, "1"], + [13095, 0, ","], + [13096, 0, " "], + [13097, 0, "k"], + [13098, 0, "_"], + [13099, 0, "2"], + [13100, 0, ","], + [13101, 0, " "], + [13102, 0, "\\"], + [13103, 0, "d"], + [13104, 0, "o"], + [13105, 0, "t"], + [13106, 0, "s"], + [13107, 0, ","], + [13108, 0, " "], + [13109, 0, "k"], + [13110, 0, "_"], + [13111, 0, "{"], + [13112, 0, "n"], + [13113, 0, "-"], + [13114, 0, "1"], + [13115, 0, "]"], + [13115, 1], + [13115, 0, "}"], + [13116, 0, " "], + [13117, 0, "\\"], + [13118, 0, "r"], + [13119, 0, "a"], + [13120, 0, "n"], + [13121, 0, "g"], + [13122, 0, "l"], + [13123, 0, "e"], + [13124, 0, "\\"], + [13124, 1], + [13124, 0, ","], + [13125, 0, "\\"], + [13126, 0, ","], + [13127, 0, " "], + [13128, 0, "k"], + [13129, 0, "_"], + [13130, 0, "n"], + [13131, 0, ")"], + [13132, 0, "."], + [13133, 0, "\\"], + [13134, 0, "m"], + [13135, 0, "a"], + [13136, 0, "t"], + [13137, 0, "h"], + [13138, 0, "s"], + [13139, 0, "f"], + [13140, 0, "{"], + [13141, 0, "k"], + [13142, 0, "e"], + [13143, 0, "y"], + [13144, 0, "s"], + [13145, 0, "}"], + [13146, 0, "\n"], + [13147, 0, " "], + [13148, 0, " "], + [13149, 0, " "], + [13150, 0, " "], + [13151, 0, "\\"], + [13152, 0, "e"], + [13153, 0, "v"], + [13154, 0, "a"], + [13155, 0, "l"], + [13156, 0, "t"], + [13157, 0, "o"], + [13158, 0, " "], + [13159, 0, "\\"], + [13160, 0, "m"], + [13161, 0, "a"], + [13162, 0, "t"], + [13163, 0, "h"], + [13164, 0, "i"], + [13165, 0, "t"], + [13166, 0, "{"], + [13167, 0, "k"], + [13168, 0, "e"], + [13169, 0, "y"], + [13170, 0, "s"], + [13171, 0, "}"], + [13172, 0, "$"], + [13173, 0, "}"], + [12922, 0, "}"], + [4881, 0, " "], + [4881, 1], + [5128, 0, " "], + [5129, 0, "T"], + [5130, 0, "h"], + [5131, 0, "e"], + [5132, 0, " "], + [5133, 0, "f"], + [5134, 0, "e"], + [5135, 0, "a"], + [5136, 0, "t"], + [5137, 0, "u"], + [5138, 0, "r"], + [5139, 0, "e"], + [5140, 0, "s"], + [5141, 0, " "], + [5142, 0, "o"], + [5143, 0, "f"], + [5144, 0, " "], + [5145, 0, "t"], + [5146, 0, "h"], + [5147, 0, "e"], + [5148, 0, " "], + [5149, 0, "A"], + [5150, 0, "P"], + [5151, 0, "I"], + [5152, 0, " "], + [5152, 1], + [5151, 1], + [5150, 1], + [5149, 1], + [5148, 1], + [5147, 1], + [5146, 1], + [5145, 1], + [5144, 1], + [5143, 1], + [5142, 1], + [5141, 1], + [5140, 1], + [5139, 1], + [5138, 1], + [5137, 1], + [5136, 1], + [5135, 1], + [5134, 1], + [5133, 1], + [5133, 0, "A"], + [5134, 0, "P"], + [5135, 0, "I"], + [5136, 0, " "], + [5137, 0, "d"], + [5138, 0, "i"], + [5139, 0, "f"], + [5140, 0, "f"], + [5141, 0, "e"], + [5142, 0, "r"], + [5143, 0, "s"], + [5144, 0, " "], + [5145, 0, "s"], + [5146, 0, "l"], + [5147, 0, "i"], + [5148, 0, "g"], + [5149, 0, "h"], + [5150, 0, "t"], + [5151, 0, "l"], + [5152, 0, "y"], + [5153, 0, " "], + [5154, 0, "f"], + [5155, 0, "r"], + [5156, 0, "o"], + [5157, 0, "m"], + [5158, 0, " "], + [5159, 0, "t"], + [5160, 0, "h"], + [5161, 0, "e"], + [5162, 0, " "], + [5163, 0, "J"], + [5164, 0, "S"], + [5165, 0, "O"], + [5166, 0, "N"], + [5167, 0, " "], + [5168, 0, "l"], + [5169, 0, "i"], + [5170, 0, "b"], + [5171, 0, "r"], + [5172, 0, "i"], + [5173, 0, "a"], + [5174, 0, "r"], + [5175, 0, "i"], + [5176, 0, "e"], + [5177, 0, "s"], + [5178, 0, " "], + [5172, 1], + [5178, 0, "f"], + [5179, 0, "o"], + [5180, 0, "u"], + [5181, 0, "n"], + [5182, 0, "d"], + [5183, 0, " "], + [5184, 0, "i"], + [5185, 0, "n"], + [5186, 0, " "], + [5187, 0, "m"], + [5188, 0, "a"], + [5189, 0, "n"], + [5190, 0, "y"], + [5191, 0, " "], + [5192, 0, "p"], + [5193, 0, "r"], + [5194, 0, "o"], + [5195, 0, "g"], + [5196, 0, "r"], + [5197, 0, "a"], + [5198, 0, "m"], + [5199, 0, "m"], + [5200, 0, "i"], + [5201, 0, "n"], + [5202, 0, "g"], + [5203, 0, " "], + [5204, 0, "l"], + [5205, 0, "a"], + [5206, 0, "n"], + [5207, 0, "g"], + [5208, 0, "u"], + [5209, 0, "a"], + [5210, 0, "g"], + [5211, 0, "e"], + [5212, 0, "s"], + [5213, 0, ","], + [5214, 0, " "], + [5215, 0, "i"], + [5216, 0, "n"], + [5217, 0, " "], + [5218, 0, "o"], + [5219, 0, "r"], + [5220, 0, "d"], + [5221, 0, "e"], + [5222, 0, "r"], + [5223, 0, " "], + [5224, 0, "t"], + [5225, 0, "o"], + [5226, 0, " "], + [5227, 0, "a"], + [5228, 0, "l"], + [5229, 0, "l"], + [5230, 0, "o"], + [5231, 0, "w"], + [5232, 0, " "], + [5233, 0, "u"], + [5234, 0, "s"], + [5235, 0, " "], + [5236, 0, "t"], + [5237, 0, "o"], + [5238, 0, " "], + [5239, 0, "d"], + [5240, 0, "e"], + [5241, 0, "f"], + [5242, 0, "i"], + [5243, 0, "n"], + [5244, 0, "e"], + [5245, 0, " "], + [5246, 0, "c"], + [5247, 0, "o"], + [5248, 0, "n"], + [5249, 0, "s"], + [5250, 0, "i"], + [5251, 0, "s"], + [5252, 0, "t"], + [5253, 0, "e"], + [5254, 0, "n"], + [5255, 0, "t"], + [5256, 0, " "], + [5257, 0, "m"], + [5258, 0, "e"], + [5259, 0, "r"], + [5260, 0, "g"], + [5261, 0, "e"], + [5262, 0, " "], + [5263, 0, "s"], + [5264, 0, "e"], + [5265, 0, "m"], + [5266, 0, "a"], + [5267, 0, "n"], + [5268, 0, "t"], + [5269, 0, "i"], + [5270, 0, "c"], + [5271, 0, "s"], + [5272, 0, "."], + [5423, 0, ","], + [5424, 0, " "], + [5425, 0, "a"], + [5426, 0, "n"], + [5427, 0, "d"], + [5428, 0, " "], + [5429, 0, "t"], + [5430, 0, "o"], + [5431, 0, " "], + [5432, 0, "c"], + [5433, 0, "o"], + [5434, 0, "n"], + [5435, 0, "s"], + [5436, 0, "t"], + [5437, 0, "r"], + [5438, 0, "u"], + [5439, 0, "c"], + [5440, 0, "t"], + [5441, 0, " "], + [5442, 0, "a"], + [5443, 0, " "], + [5444, 0, "\\"], + [5445, 0, "e"], + [5446, 0, "m"], + [5447, 0, "p"], + [5448, 0, "h"], + [5449, 0, "{"], + [5450, 0, "c"], + [5451, 0, "u"], + [5452, 0, "r"], + [5453, 0, "s"], + [5454, 0, "o"], + [5455, 0, "r"], + [5456, 0, "}"], + [5457, 0, " "], + [5458, 0, "w"], + [5459, 0, "h"], + [5460, 0, "i"], + [5461, 0, "c"], + [5462, 0, "h"], + [5463, 0, " "], + [5464, 0, "i"], + [5465, 0, "d"], + [5466, 0, "e"], + [5467, 0, "n"], + [5468, 0, "t"], + [5469, 0, "i"], + [5470, 0, "f"], + [5471, 0, "i"], + [5472, 0, "e"], + [5473, 0, "s"], + [5474, 0, " "], + [5475, 0, "a"], + [5476, 0, " "], + [5477, 0, "p"], + [5478, 0, "o"], + [5479, 0, "s"], + [5480, 0, "i"], + [5481, 0, "t"], + [5482, 0, "i"], + [5483, 0, "o"], + [5484, 0, "n"], + [5485, 0, " "], + [5486, 0, "i"], + [5487, 0, "n"], + [5488, 0, " "], + [5489, 0, "t"], + [5490, 0, "h"], + [5491, 0, "e"], + [5492, 0, " "], + [5493, 0, "d"], + [5494, 0, "o"], + [5495, 0, "c"], + [5496, 0, "u"], + [5497, 0, "m"], + [5498, 0, "e"], + [5499, 0, "n"], + [5500, 0, "t"], + [5749, 1], + [5748, 1], + [5747, 1], + [5746, 1], + [5745, 1], + [5744, 1], + [5743, 1], + [5742, 1], + [5741, 1], + [5740, 1], + [5739, 1], + [5738, 1], + [5737, 1], + [5736, 1], + [5735, 1], + [5734, 1], + [5733, 1], + [5732, 1], + [5731, 1], + [5730, 1], + [5729, 1], + [5728, 1], + [5727, 1], + [5726, 1], + [5725, 1], + [5724, 1], + [5723, 1], + [5722, 1], + [5721, 1], + [5720, 1], + [5719, 1], + [5718, 1], + [5717, 1], + [5716, 1], + [5715, 1], + [5714, 1], + [5713, 1], + [5712, 1], + [5711, 1], + [5710, 1], + [5709, 1], + [5708, 1], + [5707, 1], + [5706, 1], + [5705, 1], + [5704, 1], + [5691, 1], + [5690, 1], + [5689, 1], + [5689, 0, "M"], + [5690, 0, "o"], + [5691, 0, "v"], + [5692, 0, "i"], + [5693, 0, "n"], + [5694, 0, "g"], + [5695, 0, " "], + [5696, 0, "l"], + [5697, 0, "e"], + [5698, 0, "f"], + [5699, 0, "t"], + [5700, 0, " "], + [5701, 0, "t"], + [5702, 0, "o"], + [5703, 0, " "], + [5704, 0, "r"], + [5705, 0, "i"], + [5706, 0, "g"], + [5707, 0, "h"], + [5708, 0, "t"], + [5709, 0, " "], + [5710, 0, "t"], + [5711, 0, "h"], + [5712, 0, "r"], + [5713, 0, "o"], + [5714, 0, "u"], + [5715, 0, "g"], + [5716, 0, "h"], + [5717, 0, " "], + [5718, 0, "t"], + [5719, 0, "h"], + [5720, 0, "e"], + [5732, 0, ","], + [5733, 0, " "], + [5734, 1], + [5734, 0, "t"], + [5735, 0, "h"], + [5736, 0, "e"], + [5737, 0, " "], + [5738, 0, "c"], + [5739, 0, "u"], + [5740, 0, "r"], + [5741, 0, "s"], + [5742, 0, "o"], + [5743, 0, "r"], + [5744, 0, " "], + [5745, 0, "i"], + [5746, 0, "s"], + [5747, 0, " "], + [5748, 0, "n"], + [5749, 0, "a"], + [5750, 0, "v"], + [5751, 0, "i"], + [5752, 0, "g"], + [5753, 0, "a"], + [5754, 0, "t"], + [5755, 0, "e"], + [5756, 0, "d"], + [5757, 0, " "], + [5758, 0, "t"], + [5759, 0, "h"], + [5760, 0, "r"], + [5761, 0, "o"], + [5762, 0, "u"], + [5763, 0, "g"], + [5764, 0, "h"], + [5765, 0, " "], + [5766, 0, "t"], + [5767, 0, "h"], + [5768, 0, "e"], + [5769, 0, " "], + [5770, 0, "t"], + [5771, 0, "r"], + [5772, 0, "e"], + [5773, 0, "e"], + [5776, 0, "t"], + [5777, 0, "h"], + [5778, 0, "e"], + [5779, 0, " "], + [5780, 0, "s"], + [5781, 0, "u"], + [5782, 0, "b"], + [5783, 0, "s"], + [5784, 0, "c"], + [5785, 0, "r"], + [5786, 0, "i"], + [5787, 0, "p"], + [5788, 0, "t"], + [5789, 0, " "], + [5790, 0, "o"], + [5791, 0, "p"], + [5792, 0, "e"], + [5793, 0, "r"], + [5794, 0, "a"], + [5795, 0, "t"], + [5796, 0, "o"], + [5797, 0, "r"], + [5798, 0, " "], + [5799, 0, "\\"], + [5800, 0, "v"], + [5801, 0, "e"], + [5802, 0, "r"], + [5803, 0, "b"], + [5804, 0, "|"], + [5805, 0, "["], + [5806, 0, "\""], + [5807, 0, "k"], + [5808, 0, "e"], + [5809, 0, "y"], + [5810, 0, "\""], + [5811, 0, "]"], + [5812, 0, "|"], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5813, 1], + [5893, 1], + [5893, 0, " "], + [5894, 0, "a"], + [5895, 0, "n"], + [5896, 0, "d"], + [5956, 1], + [5956, 0, "."], + [5957, 0, "\n"], + [5958, 0, "\n"], + [5959, 0, "T"], + [5960, 0, "h"], + [5961, 0, "e"], + [5962, 0, " "], + [5963, 0, "e"], + [5964, 0, "x"], + [5965, 0, "p"], + [5966, 0, "r"], + [5967, 0, "e"], + [5968, 0, "s"], + [5969, 0, "s"], + [5970, 0, "i"], + [5971, 0, "o"], + [5972, 0, "n"], + [5973, 0, " "], + [5974, 0, "c"], + [5975, 0, "o"], + [5976, 0, "n"], + [5977, 0, "s"], + [5978, 0, "t"], + [5979, 0, "r"], + [5980, 0, "u"], + [5981, 0, "c"], + [5982, 0, "t"], + [5983, 0, " "], + [5984, 0, "E"], + [5985, 0, "X"], + [5986, 0, "P"], + [5987, 0, "R"], + [5988, 0, " "], + [5989, 0, "c"], + [5990, 0, "a"], + [5991, 0, "n"], + [5992, 0, " "], + [5993, 0, "a"], + [5994, 0, "l"], + [5995, 0, "s"], + [5996, 0, "o"], + [5997, 0, " "], + [5998, 0, "q"], + [5999, 0, "u"], + [6000, 0, "e"], + [6001, 0, "r"], + [6002, 0, "y"], + [6003, 0, " "], + [6004, 0, "t"], + [6005, 0, "h"], + [6006, 0, "e"], + [6007, 0, " "], + [6008, 0, "s"], + [6009, 0, "t"], + [6010, 0, "a"], + [6011, 0, "t"], + [6012, 0, "e"], + [6013, 0, " "], + [6014, 0, "o"], + [6015, 0, "f"], + [6016, 0, " "], + [6017, 0, "t"], + [6018, 0, "h"], + [6019, 0, "e"], + [6020, 0, " "], + [6021, 0, "d"], + [6022, 0, "o"], + [6023, 0, "c"], + [6024, 0, "u"], + [6025, 0, "m"], + [6026, 0, "e"], + [6027, 0, "n"], + [6028, 0, "t"], + [6029, 0, ":"], + [6072, 1], + [6072, 0, "t"], + [6073, 0, "h"], + [6074, 0, "e"], + [6079, 0, " "], + [6080, 0, "a"], + [6081, 0, "t"], + [6082, 0, " "], + [6083, 0, "t"], + [6084, 0, "h"], + [6085, 0, "e"], + [6086, 0, " "], + [6087, 0, "c"], + [6088, 0, "u"], + [6089, 0, "r"], + [6090, 0, "r"], + [6091, 0, "e"], + [6092, 0, "n"], + [6093, 0, "t"], + [6094, 0, " "], + [6095, 0, "c"], + [6096, 0, "u"], + [6097, 0, "r"], + [6098, 0, "s"], + [6099, 0, "o"], + [6100, 0, "r"], + [6171, 0, " "], + [6172, 0, "c"], + [6173, 0, "u"], + [6174, 0, "r"], + [6175, 0, "s"], + [6176, 0, "o"], + [6177, 0, "r"], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6178, 1], + [6214, 1], + [6213, 1], + [6212, 1], + [6212, 0, "i"], + [6213, 0, "f"], + [6214, 0, " "], + [6215, 0, "t"], + [6216, 0, "h"], + [6217, 0, "e"], + [6218, 0, " "], + [6219, 0, "c"], + [6220, 0, "u"], + [6221, 0, "r"], + [6222, 0, "s"], + [6223, 0, "o"], + [6224, 0, "r"], + [6225, 0, " "], + [6226, 0, "r"], + [6227, 0, "e"], + [6228, 0, "f"], + [6229, 0, "e"], + [6230, 0, "r"], + [6231, 0, "s"], + [6232, 0, " "], + [6233, 0, "t"], + [6234, 0, "o"], + [6235, 0, " "], + [6236, 0, "a"], + [6237, 0, " "], + [6237, 1], + [6249, 1], + [6249, 1], + [6249, 1], + [6249, 1], + [6249, 1], + [6249, 1], + [5430, 1], + [5429, 1], + [5428, 1], + [5427, 1], + [5426, 1], + [5425, 1], + [5424, 1], + [5423, 1], + [5422, 1], + [5421, 1], + [5420, 1], + [5419, 1], + [5418, 1], + [5417, 1], + [5416, 1], + [5415, 1], + [5414, 1], + [5413, 1], + [5412, 1], + [5411, 1], + [5410, 1], + [5409, 1], + [5408, 1], + [5407, 1], + [5406, 1], + [5405, 1], + [5404, 1], + [5403, 1], + [5402, 1], + [5401, 1], + [5400, 1], + [5399, 1], + [5398, 1], + [5397, 1], + [5396, 1], + [5395, 1], + [5394, 1], + [5393, 1], + [6586, 0, " "], + [6587, 0, "p"], + [6588, 0, "a"], + [6589, 0, "r"], + [6590, 0, "t"], + [6591, 0, " "], + [6592, 0, "o"], + [6593, 0, "f"], + [6594, 0, " "], + [6595, 0, "t"], + [6596, 0, "h"], + [6597, 0, "e"], + [6598, 0, " "], + [6599, 0, "d"], + [6600, 0, "o"], + [6601, 0, "c"], + [6602, 0, "u"], + [6603, 0, "m"], + [6604, 0, "e"], + [6605, 0, "n"], + [6606, 0, "t"], + [6607, 0, " "], + [6608, 0, "b"], + [6609, 0, "e"], + [6610, 0, "i"], + [6611, 0, "n"], + [6612, 0, "g"], + [6613, 0, " "], + [6614, 0, "m"], + [6615, 0, "o"], + [6616, 0, "d"], + [6617, 0, "i"], + [6618, 0, "f"], + [6619, 0, "i"], + [6620, 0, "e"], + [6621, 0, "d"], + [6622, 0, " "], + [6623, 0, "i"], + [6624, 0, "s"], + [6625, 0, " "], + [6626, 0, "i"], + [6627, 0, "d"], + [6628, 0, "e"], + [6629, 0, "n"], + [6630, 0, "t"], + [6631, 0, "i"], + [6632, 0, "f"], + [6633, 0, "i"], + [6634, 0, "e"], + [6635, 0, "d"], + [6636, 0, " "], + [6637, 0, "b"], + [6638, 0, "y"], + [6639, 0, " "], + [6639, 1], + [6638, 1], + [6637, 1], + [6636, 1], + [6635, 1], + [6634, 1], + [6633, 1], + [6632, 1], + [6631, 1], + [6630, 1], + [6629, 1], + [6628, 1], + [6627, 1], + [6626, 1], + [6625, 1], + [6624, 1], + [6623, 1], + [6622, 1], + [6621, 1], + [6620, 1], + [6619, 1], + [6618, 1], + [6617, 1], + [6616, 1], + [6615, 1], + [6614, 1], + [6613, 1], + [6612, 1], + [6611, 1], + [6610, 1], + [6609, 1], + [6608, 1], + [6607, 1], + [6606, 1], + [6605, 1], + [6604, 1], + [6603, 1], + [6602, 1], + [6601, 1], + [6600, 1], + [6599, 1], + [6598, 1], + [6597, 1], + [6596, 1], + [6595, 1], + [6594, 1], + [6593, 1], + [6592, 1], + [6591, 1], + [6590, 1], + [6589, 1], + [6588, 1], + [6587, 1], + [6586, 1], + [6621, 1], + [6620, 1], + [6619, 1], + [6618, 1], + [6617, 1], + [6616, 1], + [6615, 1], + [6614, 1], + [6613, 1], + [6613, 0, "d"], + [6614, 0, "e"], + [6615, 0, "f"], + [6616, 0, "i"], + [6617, 0, "n"], + [6618, 0, "e"], + [6619, 0, "s"], + [6620, 0, " "], + [6621, 0, "t"], + [6622, 0, "h"], + [6623, 0, "e"], + [6631, 1], + [6631, 0, " "], + [6632, 0, "t"], + [6633, 0, "h"], + [6634, 0, "a"], + [6635, 0, "t"], + [6647, 1], + [6646, 1], + [6645, 1], + [6644, 1], + [6644, 0, "i"], + [6645, 0, "e"], + [6646, 0, "s"], + [4686, 0, " "], + [4687, 0, "i"], + [4688, 0, "n"], + [4689, 0, "t"], + [4690, 0, "r"], + [4691, 0, "o"], + [4692, 0, "d"], + [4693, 0, "u"], + [4694, 0, "c"], + [4695, 0, "t"], + [4696, 0, "i"], + [4697, 0, "o"], + [4698, 0, "n"], + [8050, 1], + [8050, 1], + [8050, 1], + [8072, 1], + [8071, 1], + [8070, 1], + [8069, 1], + [8068, 1], + [8067, 1], + [8066, 1], + [8065, 1], + [8064, 1], + [8063, 1], + [8062, 1], + [8061, 1], + [8060, 1], + [8060, 0, "L"], + [8060, 1], + [8060, 0, "{"], + [8061, 0, "L"], + [8062, 0, "o"], + [8063, 0, "c"], + [8064, 0, "a"], + [8065, 0, "l"], + [8479, 0, " "], + [8480, 0, "\\"], + [8481, 0, "m"], + [8482, 0, "a"], + [8483, 0, "t"], + [8484, 0, "h"], + [8485, 0, "s"], + [8486, 0, "f"], + [8487, 0, "{"], + [8488, 0, "p"], + [8489, 0, "r"], + [8490, 0, "e"], + [8491, 0, "s"], + [8492, 0, "}"], + [8493, 0, "("], + [8494, 0, "\\"], + [8495, 0, "m"], + [8496, 0, "a"], + [8497, 0, "t"], + [8498, 0, "h"], + [8499, 0, "i"], + [8500, 0, "t"], + [8501, 0, "{"], + [8502, 0, "i"], + [8503, 0, "d"], + [8504, 0, "}"], + [8505, 0, "_"], + [8506, 0, "3"], + [8507, 0, "}"], + [8508, 0, " "], + [8509, 0, "\\"], + [8510, 0, "m"], + [8511, 0, "a"], + [8512, 0, "p"], + [8513, 0, "s"], + [8514, 0, "t"], + [8515, 0, "o"], + [8516, 0, " "], + [8517, 0, "\\"], + [8518, 0, "{"], + [8519, 0, "\\"], + [8520, 0, "m"], + [8521, 0, "a"], + [8522, 0, "t"], + [8523, 0, "h"], + [8524, 0, "i"], + [8525, 0, "t"], + [8526, 0, "{"], + [8527, 0, "i"], + [8528, 0, "d"], + [8529, 0, "}"], + [8530, 0, "_"], + [8531, 0, "3"], + [8532, 0, "\\"], + [8533, 0, "}"], + [8534, 0, ","], + [8507, 1], + [8507, 0, ")"], + [8479, 0, "\\"], + [8480, 0, ";"], + [8694, 0, "\\"], + [8695, 0, ";"], + [8696, 0, " "], + [8697, 0, "\\"], + [8698, 0, "m"], + [8699, 0, "a"], + [8700, 0, "t"], + [8701, 0, "h"], + [8702, 0, "s"], + [8703, 0, "f"], + [8704, 0, "{"], + [8705, 0, "p"], + [8706, 0, "r"], + [8707, 0, "e"], + [8708, 0, "s"], + [8709, 0, "}"], + [8710, 0, "("], + [8711, 0, "\\"], + [8712, 0, "m"], + [8713, 0, "a"], + [8714, 0, "t"], + [8715, 0, "h"], + [8716, 0, "i"], + [8717, 0, "t"], + [8718, 0, "{"], + [8719, 0, "i"], + [8720, 0, "d"], + [8721, 0, "_"], + [8721, 1], + [8721, 0, "}"], + [8722, 0, "_"], + [8723, 0, "1"], + [8724, 0, ")"], + [8725, 0, " "], + [8726, 0, "\\"], + [8727, 0, "m"], + [8728, 0, "a"], + [8729, 0, "p"], + [8730, 0, "s"], + [8731, 0, "t"], + [8732, 0, "o"], + [8733, 0, " "], + [8734, 0, "\\"], + [8735, 0, "{"], + [8736, 0, "\\"], + [8737, 0, "m"], + [8738, 0, "a"], + [8739, 0, "t"], + [8740, 0, "h"], + [8741, 0, "i"], + [8742, 0, "t"], + [8743, 0, "{"], + [8744, 0, "i"], + [8745, 0, "d"], + [8746, 0, "}"], + [8747, 0, "_"], + [8748, 0, "1"], + [8749, 0, "\\"], + [8750, 0, "}"], + [8751, 0, ","], + [8908, 0, ","], + [8909, 0, "\\"], + [8910, 0, ";"], + [8911, 0, " "], + [8912, 0, "\\"], + [8913, 0, "m"], + [8914, 0, "a"], + [8915, 0, "t"], + [8916, 0, "h"], + [8917, 0, "s"], + [8918, 0, "f"], + [8919, 0, "{"], + [8920, 0, "p"], + [8921, 0, "r"], + [8922, 0, "e"], + [8923, 0, "s"], + [8924, 0, "}"], + [8925, 0, "("], + [8926, 0, "\\"], + [8927, 0, "m"], + [8928, 0, "a"], + [8929, 0, "t"], + [8930, 0, "h"], + [8931, 0, "i"], + [8932, 0, "t"], + [8933, 0, "{"], + [8934, 0, "i"], + [8935, 0, "d"], + [8936, 0, "}"], + [8937, 0, "_"], + [8938, 0, "2"], + [8939, 0, ")"], + [8940, 0, " "], + [8941, 0, "\\"], + [8942, 0, "m"], + [8943, 0, "a"], + [8944, 0, "p"], + [8945, 0, "s"], + [8946, 0, "t"], + [8947, 0, "o"], + [8948, 0, " "], + [8949, 0, "\\"], + [8950, 0, "{"], + [8951, 0, "\\"], + [8952, 0, "m"], + [8953, 0, "a"], + [8954, 0, "t"], + [8955, 0, "h"], + [8956, 0, "i"], + [8957, 0, "t"], + [8958, 0, "{"], + [8959, 0, "i"], + [8960, 0, "d"], + [8961, 0, "}"], + [8962, 0, "_"], + [8963, 0, "2"], + [8964, 0, "\\"], + [8965, 0, "}"], + [8976, 0, ","], + [8979, 0, " "], + [8980, 0, "\\"], + [8981, 0, "m"], + [8982, 0, "a"], + [8983, 0, "t"], + [8984, 0, "h"], + [8985, 0, "s"], + [8986, 0, "f"], + [8987, 0, "{"], + [8988, 0, "p"], + [8989, 0, "r"], + [8990, 0, "e"], + [8991, 0, "s"], + [8992, 0, "}"], + [8993, 0, "("], + [8994, 0, "\\"], + [8995, 0, "m"], + [8996, 0, "a"], + [8997, 0, "t"], + [8998, 0, "h"], + [8998, 1], + [8997, 1], + [8996, 1], + [8995, 1], + [8994, 1], + [8994, 0, "\\"], + [8995, 0, "t"], + [8996, 0, "e"], + [8997, 0, "x"], + [8998, 0, "t"], + [8999, 0, "{"], + [9000, 0, "`"], + [9001, 0, "`"], + [9002, 0, "s"], + [9003, 0, "h"], + [9004, 0, "o"], + [9005, 0, "p"], + [9006, 0, "p"], + [9007, 0, "i"], + [9008, 0, "n"], + [9009, 0, "g"], + [9010, 0, "'"], + [9011, 0, "'"], + [9012, 0, "}"], + [9013, 0, ")"], + [9014, 0, " "], + [9015, 0, "\\"], + [9016, 0, "m"], + [9017, 0, "a"], + [9018, 0, "p"], + [9019, 0, "s"], + [9020, 0, "t"], + [9021, 0, "o"], + [9022, 0, " "], + [9023, 0, "\\"], + [9024, 0, "{"], + [9025, 0, "\\"], + [9026, 0, "m"], + [9027, 0, "a"], + [9028, 0, "t"], + [9029, 0, "h"], + [9030, 0, "i"], + [9031, 0, "t"], + [9032, 0, "{"], + [9033, 0, "i"], + [9034, 0, "d"], + [9035, 0, "}"], + [9036, 0, "_"], + [9037, 0, "1"], + [9038, 0, ","], + [9039, 0, " "], + [9040, 0, "\\"], + [9041, 0, "m"], + [9042, 0, "a"], + [9043, 0, "t"], + [9044, 0, "h"], + [9045, 0, "i"], + [9046, 0, "t"], + [9047, 0, "{"], + [9048, 0, "i"], + [9049, 0, "d"], + [9050, 0, "}"], + [9051, 0, "+"], + [9051, 1], + [9051, 0, "_"], + [9052, 0, "2"], + [9053, 0, ","], + [9054, 0, " "], + [9055, 0, "\\"], + [9056, 0, "m"], + [9057, 0, "a"], + [9058, 0, "t"], + [9059, 0, "h"], + [9060, 0, "i"], + [9061, 0, "t"], + [9062, 0, "{"], + [9063, 0, "i"], + [9064, 0, "d"], + [9065, 0, "}"], + [9066, 0, "_"], + [9067, 0, "3"], + [9068, 0, "\\"], + [9069, 0, ";"], + [9068, 0, " "], + [8974, 0, "\\"], + [8975, 0, "m"], + [8976, 0, "u"], + [8977, 0, "l"], + [8978, 0, "t"], + [8979, 0, "i"], + [8980, 0, "a"], + [8981, 0, "l"], + [8982, 0, "i"], + [8983, 0, "g"], + [8984, 0, "n"], + [8985, 0, "{"], + [8986, 0, "3"], + [8987, 0, "}"], + [8988, 0, "{"], + [8994, 0, "\n"], + [8995, 0, " "], + [8996, 0, " "], + [8997, 0, " "], + [9093, 0, "}"], + [9087, 0, "\\"], + [9088, 0, "}"], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15561, 1], + [15554, 1], + [15553, 1], + [15552, 1], + [15551, 1], + [15550, 1], + [15549, 1], + [15595, 1], + [15594, 1], + [15593, 1], + [15592, 1], + [15591, 1], + [15590, 1], + [15589, 1], + [15588, 1], + [15587, 1], + [15586, 1], + [15585, 1], + [15584, 1], + [15583, 1], + [15582, 1], + [15581, 1], + [15580, 1], + [16639, 1], + [16639, 1], + [16639, 1], + [16639, 1], + [16639, 1], + [16639, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 1], + [16645, 0, ","], + [16646, 0, " "], + [16647, 0, "w"], + [16648, 0, "h"], + [16649, 0, "i"], + [16650, 0, "c"], + [16651, 0, "h"], + [10660, 1], + [10659, 1], + [10659, 0, "t"], + [10660, 0, "t"], + [10664, 1], + [10663, 1], + [10662, 1], + [10662, 0, "["], + [10664, 1], + [10676, 1], + [10676, 0, "\\"], + [10677, 0, "m"], + [10678, 0, "a"], + [10679, 0, "t"], + [10680, 0, "h"], + [10681, 0, "t"], + [10682, 0, "t"], + [10683, 0, "{"], + [10684, 0, "]"], + [10685, 0, "}"], + [10680, 1], + [10679, 1], + [10678, 1], + [10677, 1], + [10677, 0, "t"], + [10678, 0, "e"], + [10679, 0, "x"], + [10680, 0, "t"], + [10658, 1], + [10657, 1], + [10656, 1], + [10655, 1], + [10655, 0, "t"], + [10656, 0, "e"], + [10657, 0, "x"], + [10658, 0, "t"], + [18285, 1], + [18284, 1], + [18283, 1], + [18282, 1], + [18281, 1], + [18281, 0, "["], + [18292, 1], + [18292, 0, "]"], + [18484, 1], + [18483, 1], + [18482, 1], + [18481, 1], + [18481, 0, "["], + [18482, 0, "."], + [18483, 0, "."], + [18484, 0, "."], + [18485, 0, "]"], + [18774, 1], + [18774, 1], + [18774, 1], + [18774, 1], + [18774, 1], + [18774, 0, "f"], + [18775, 0, "o"], + [18776, 0, "u"], + [18777, 0, "r"], + [18805, 1], + [18804, 1], + [18803, 1], + [18803, 0, "\\"], + [18804, 0, "d"], + [18805, 0, "o"], + [18806, 0, "t"], + [18807, 0, "s"], + [18808, 0, ","], + [18809, 0, "4"], + [19022, 1], + [19022, 0, "4"], + [19108, 0, " "], + [19109, 0, "$"], + [19110, 0, "\\"], + [19111, 0, "t"], + [19112, 0, "e"], + [19113, 0, "x"], + [19114, 0, "t"], + [19115, 0, "s"], + [19116, 0, "c"], + [19117, 0, "{"], + [19118, 0, "N"], + [19119, 0, "e"], + [19120, 0, "x"], + [19121, 0, "t"], + [19122, 0, "}"], + [19123, 0, "_"], + [19124, 0, "{"], + [19125, 0, "2"], + [19126, 0, ","], + [19127, 0, "3"], + [19128, 0, "}"], + [19129, 0, "$"], + [19130, 0, " "], + [19131, 0, "i"], + [19132, 0, "n"], + [19133, 0, "s"], + [19134, 0, "p"], + [19135, 0, "e"], + [19136, 0, "c"], + [19137, 0, "t"], + [19138, 0, " "], + [19138, 1], + [19137, 1], + [19136, 1], + [19135, 1], + [19134, 1], + [19133, 1], + [19132, 1], + [19131, 1], + [19131, 0, "a"], + [19132, 0, "r"], + [19133, 0, "e"], + [19134, 0, " "], + [19135, 0, "c"], + [19136, 0, "o"], + [19137, 0, "n"], + [19138, 0, "d"], + [19139, 0, "i"], + [19140, 0, "t"], + [19141, 0, "i"], + [19142, 0, "o"], + [19143, 0, "n"], + [19144, 0, "a"], + [19145, 0, "l"], + [19146, 0, " "], + [19147, 0, "o"], + [19148, 0, "n"], + [19149, 0, " "], + [19150, 0, "a"], + [19151, 0, "n"], + [19152, 0, " "], + [19153, 0, "e"], + [19154, 0, "n"], + [19155, 0, "t"], + [19156, 0, "r"], + [19157, 0, "y"], + [19158, 0, " "], + [19159, 0, "$"], + [19160, 0, "\\"], + [19161, 0, "m"], + [19162, 0, "a"], + [19163, 0, "t"], + [19164, 0, "h"], + [19165, 0, "s"], + [19166, 0, "f"], + [19167, 0, "{"], + [19168, 0, "p"], + [19169, 0, "r"], + [19170, 0, "e"], + [19171, 0, "s"], + [19172, 0, "}"], + [19173, 0, "("], + [19174, 0, "k"], + [19175, 0, "'"], + [19176, 0, ")"], + [19177, 0, "$"], + [19178, 0, " "], + [19179, 0, "i"], + [19180, 0, "n"], + [19181, 0, " "], + [19182, 0, "$"], + [19183, 0, "A"], + [19184, 0, "_"], + [19185, 0, "p"], + [19186, 0, "$"], + [19187, 0, ","], + [19188, 0, " "], + [19189, 0, "w"], + [19190, 0, "h"], + [19191, 0, "i"], + [19192, 0, "c"], + [19193, 0, "h"], + [19194, 0, " "], + [19195, 0, "e"], + [19196, 0, "n"], + [19197, 0, "c"], + [19198, 0, "o"], + [19199, 0, "d"], + [19200, 0, "e"], + [19201, 0, "s"], + [19202, 0, " "], + [19203, 0, "t"], + [19204, 0, "h"], + [19205, 0, "e"], + [19206, 0, " "], + [19207, 0, "\\"], + [19208, 0, "e"], + [19209, 0, "m"], + [19210, 0, "p"], + [19211, 0, "h"], + [19212, 0, "{"], + [19213, 0, "p"], + [19214, 0, "r"], + [19215, 0, "e"], + [19216, 0, "s"], + [19217, 0, "e"], + [19218, 0, "n"], + [19219, 0, "c"], + [19220, 0, "e"], + [19221, 0, "}"], + [19222, 0, " "], + [19223, 0, "o"], + [19224, 0, "f"], + [19225, 0, " "], + [19226, 0, "a"], + [19227, 0, "n"], + [19228, 0, " "], + [19229, 0, "e"], + [19230, 0, "l"], + [19231, 0, "e"], + [19232, 0, "m"], + [19233, 0, "e"], + [19234, 0, "n"], + [19235, 0, "t"], + [19236, 0, " "], + [19237, 0, "i"], + [19238, 0, "n"], + [19239, 0, " "], + [19240, 0, "t"], + [19241, 0, "h"], + [19242, 0, "e"], + [19243, 0, " "], + [19244, 0, "l"], + [19245, 0, "i"], + [19246, 0, "s"], + [19247, 0, "t"], + [19248, 0, ":"], + [19249, 0, " "], + [19250, 0, "i"], + [19251, 0, "f"], + [19252, 0, " "], + [19253, 0, "t"], + [19254, 0, "h"], + [19255, 0, "e"], + [19256, 0, " "], + [19257, 0, "p"], + [19258, 0, "r"], + [19259, 0, "e"], + [19260, 0, "s"], + [19261, 0, "e"], + [19262, 0, "n"], + [19263, 0, "c"], + [19264, 0, "e"], + [19265, 0, " "], + [19266, 0, "s"], + [19267, 0, "e"], + [19268, 0, "t"], + [19269, 0, " "], + [19270, 0, "i"], + [19271, 0, "s"], + [19272, 0, " "], + [19273, 0, "e"], + [19274, 0, "m"], + [19275, 0, "p"], + [19276, 0, "t"], + [19277, 0, "y"], + [19278, 0, ","], + [19279, 0, " "], + [19280, 0, "t"], + [19281, 0, "h"], + [19282, 0, "a"], + [19283, 0, "t"], + [19284, 0, " "], + [19285, 0, "m"], + [19286, 0, "e"], + [19287, 0, "a"], + [19288, 0, "n"], + [19289, 0, "s"], + [19290, 0, " "], + [19291, 0, "t"], + [19292, 0, "h"], + [19293, 0, "e"], + [19294, 0, " "], + [19295, 0, "l"], + [19296, 0, "i"], + [19297, 0, "s"], + [19298, 0, "t"], + [19299, 0, " "], + [19300, 0, "e"], + [19301, 0, "l"], + [19302, 0, "e"], + [19303, 0, "m"], + [19304, 0, "e"], + [19305, 0, "n"], + [19306, 0, "t"], + [19307, 0, " "], + [19308, 0, "w"], + [19309, 0, "a"], + [19310, 0, "s"], + [19311, 0, " "], + [19312, 0, "d"], + [19313, 0, "e"], + [19314, 0, "l"], + [19315, 0, "e"], + [19316, 0, "t"], + [19317, 0, "e"], + [19318, 0, "d"], + [19319, 0, ","], + [19320, 0, " "], + [19321, 0, "a"], + [19322, 0, "n"], + [19323, 0, "d"], + [19324, 0, " "], + [19325, 0, "s"], + [19326, 0, "o"], + [19327, 0, " "], + [19328, 0, "$"], + [19329, 0, "\\"], + [19330, 0, "t"], + [19331, 0, "e"], + [19332, 0, "x"], + [19333, 0, "t"], + [19334, 0, "s"], + [19335, 0, "c"], + [19336, 0, "{"], + [19337, 0, "N"], + [19338, 0, "e"], + [19339, 0, "x"], + [19340, 0, "t"], + [19341, 0, "}"], + [19342, 0, "_"], + [19343, 0, "3"], + [19344, 0, "$"], + [19345, 0, " "], + [19346, 0, "s"], + [19347, 0, "k"], + [19348, 0, "i"], + [19349, 0, "p"], + [19350, 0, "s"], + [19351, 0, " "], + [19352, 0, "o"], + [19353, 0, "v"], + [19354, 0, "e"], + [19355, 0, "r"], + [19356, 0, " "], + [19357, 0, "t"], + [19358, 0, "h"], + [19359, 0, "e"], + [19360, 0, " "], + [19361, 0, "e"], + [19362, 0, "l"], + [19363, 0, "e"], + [19364, 0, "m"], + [19365, 0, "e"], + [19366, 0, "n"], + [19367, 0, "t"], + [19368, 0, "."], + [19369, 0, " "], + [19370, 0, "I"], + [19371, 0, "f"], + [19372, 0, " "], + [19373, 0, "t"], + [19374, 0, "h"], + [19375, 0, "e"], + [19376, 0, " "], + [19377, 0, "p"], + [19378, 0, "r"], + [19379, 0, "e"], + [19380, 0, "s"], + [19381, 0, "e"], + [19382, 0, "n"], + [19383, 0, "c"], + [19384, 0, "e"], + [19385, 0, " "], + [19386, 0, "s"], + [19387, 0, "e"], + [19388, 0, "t"], + [19389, 0, " "], + [19390, 0, "i"], + [19391, 0, "s"], + [19392, 0, " "], + [19393, 0, "n"], + [19394, 0, "o"], + [19395, 0, "n"], + [19396, 0, "="], + [19397, 0, "-"], + [19397, 1], + [19396, 1], + [19396, 0, "-"], + [19396, 1], + [19396, 0, "e"], + [19397, 0, "m"], + [19398, 0, "p"], + [19399, 0, "t"], + [19400, 0, "y"], + [19401, 0, " "], + [19401, 1], + [19401, 0, ","], + [19402, 0, " "], + [19403, 0, "$"], + [19404, 0, "\\"], + [19405, 0, "t"], + [19406, 0, "e"], + [19407, 0, "x"], + [19408, 0, "t"], + [19409, 0, "s"], + [19410, 0, "c"], + [19411, 0, "{"], + [19412, 0, "N"], + [19413, 0, "e"], + [19414, 0, "x"], + [19415, 0, "t"], + [19416, 0, "}"], + [19417, 0, "_"], + [19418, 0, "2"], + [19419, 0, "$"], + [19420, 0, " "], + [19421, 0, "a"], + [19422, 0, "p"], + [19423, 0, "p"], + [19424, 0, "l"], + [19425, 0, "i"], + [19426, 0, "e"], + [19427, 0, "s"], + [19428, 0, "."], + [19429, 0, "\n"], + [19430, 0, "\n"], + [19431, 0, "T"], + [19432, 0, "h"], + [19433, 0, "e"], + [19434, 0, " "], + [19435, 0, "$"], + [19436, 0, "\\"], + [19437, 0, "t"], + [19438, 0, "e"], + [19439, 0, "x"], + [19440, 0, "t"], + [19441, 0, "s"], + [19442, 0, "c"], + [19443, 0, "{"], + [19444, 0, "K"], + [19445, 0, "e"], + [19446, 0, "y"], + [19447, 0, "s"], + [19448, 0, "}"], + [19449, 0, "_"], + [19450, 0, "{"], + [19451, 0, "1"], + [19452, 0, ","], + [19453, 0, "2"], + [19454, 0, ","], + [19455, 0, "3"], + [19456, 0, "}"], + [19457, 0, "$"], + [19458, 0, " "], + [19459, 0, "r"], + [19460, 0, "u"], + [19461, 0, "l"], + [19462, 0, "e"], + [19463, 0, "s"], + [19464, 0, " "], + [19465, 0, "a"], + [19466, 0, "l"], + [19467, 0, "l"], + [19468, 0, "o"], + [19469, 0, "w"], + [19470, 0, " "], + [19471, 0, "t"], + [19472, 0, "h"], + [19473, 0, "e"], + [19474, 0, " "], + [19475, 0, "a"], + [19476, 0, "p"], + [19477, 0, "p"], + [19478, 0, "l"], + [19479, 0, "i"], + [19480, 0, "c"], + [19481, 0, "a"], + [19482, 0, "t"], + [19483, 0, "i"], + [19484, 0, "o"], + [19485, 0, "n"], + [19486, 0, " "], + [19487, 0, "t"], + [19488, 0, "o"], + [19489, 0, " "], + [19490, 0, "i"], + [19491, 0, "n"], + [19492, 0, "s"], + [19493, 0, "p"], + [19494, 0, "e"], + [19495, 0, "c"], + [19496, 0, "t"], + [19497, 0, " "], + [19498, 0, "t"], + [19499, 0, "h"], + [19500, 0, "e"], + [19501, 0, " "], + [19502, 0, "s"], + [19503, 0, "e"], + [19504, 0, "t"], + [19505, 0, " "], + [19506, 0, "o"], + [19507, 0, "f"], + [19508, 0, " "], + [19509, 0, "k"], + [19510, 0, "e"], + [19511, 0, "y"], + [19512, 0, "s"], + [19513, 0, " "], + [19514, 0, "t"], + [19515, 0, "h"], + [19516, 0, "a"], + [19517, 0, "t"], + [19518, 0, " "], + [19519, 0, "a"], + [19520, 0, "r"], + [19521, 0, "e"], + [19522, 0, " "], + [19523, 0, "d"], + [19524, 0, "e"], + [19525, 0, "f"], + [19526, 0, "i"], + [19527, 0, "n"], + [19528, 0, "e"], + [19529, 0, "d"], + [19530, 0, " "], + [19531, 0, "i"], + [19532, 0, "n"], + [19533, 0, " "], + [19534, 0, "a"], + [19535, 0, " "], + [19536, 0, "m"], + [19537, 0, "a"], + [19538, 0, "p"], + [19539, 0, "."], + [19540, 0, " "], + [19541, 0, "T"], + [19542, 0, "h"], + [19543, 0, "i"], + [19544, 0, "s"], + [19545, 0, " "], + [19546, 0, "s"], + [19547, 0, "e"], + [19548, 0, "t"], + [19549, 0, " "], + [19550, 0, "i"], + [19551, 0, "s"], + [19552, 0, " "], + [19553, 0, "d"], + [19554, 0, "e"], + [19555, 0, "t"], + [19556, 0, "e"], + [19557, 0, "r"], + [19558, 0, "m"], + [19559, 0, "i"], + [19560, 0, "n"], + [19561, 0, "e"], + [19562, 0, "d"], + [19563, 0, " "], + [19564, 0, "b"], + [19565, 0, "y"], + [19566, 0, " "], + [19567, 0, "e"], + [19568, 0, "x"], + [19569, 0, "a"], + [19570, 0, "m"], + [19571, 0, "i"], + [19572, 0, "n"], + [19573, 0, "i"], + [19574, 0, "n"], + [19575, 0, "g"], + [19576, 0, " "], + [19577, 0, "t"], + [19578, 0, "h"], + [19579, 0, "e"], + [19580, 0, " "], + [19581, 0, "l"], + [19582, 0, "o"], + [19583, 0, "c"], + [19584, 0, "a"], + [19585, 0, "l"], + [19586, 0, " "], + [19587, 0, "s"], + [19588, 0, "t"], + [19589, 0, "a"], + [19590, 0, "t"], + [19591, 0, "e"], + [19592, 0, ","], + [19593, 0, " "], + [19594, 0, "a"], + [19595, 0, "n"], + [19596, 0, "d"], + [19597, 0, " "], + [19598, 0, "e"], + [19599, 0, "x"], + [19600, 0, "c"], + [19601, 0, "l"], + [19602, 0, "u"], + [19603, 0, "d"], + [19604, 0, "i"], + [19605, 0, "n"], + [19606, 0, "g"], + [19607, 0, " "], + [19608, 0, "a"], + [19609, 0, "n"], + [19610, 0, "y"], + [19611, 0, " "], + [19612, 0, "k"], + [19613, 0, "e"], + [19614, 0, "y"], + [19615, 0, "s"], + [19616, 0, " "], + [19617, 0, "f"], + [19618, 0, "o"], + [19619, 0, "r"], + [19620, 0, " "], + [19621, 0, "w"], + [19622, 0, "h"], + [19623, 0, "i"], + [19624, 0, "c"], + [19625, 0, "h"], + [19626, 0, " "], + [19627, 0, "t"], + [19628, 0, "h"], + [19629, 0, "e"], + [19630, 0, " "], + [19631, 0, "p"], + [19632, 0, "r"], + [19633, 0, "e"], + [19634, 0, "s"], + [19635, 0, "e"], + [19636, 0, "n"], + [19637, 0, "c"], + [19638, 0, "e"], + [19639, 0, " "], + [19640, 0, "s"], + [19641, 0, "e"], + [19642, 0, "t"], + [19643, 0, " "], + [19644, 0, "i"], + [19645, 0, "s"], + [19646, 0, " "], + [19647, 0, "e"], + [19648, 0, "m"], + [19649, 0, "p"], + [19650, 0, "t"], + [19651, 0, "y"], + [19652, 0, " "], + [19653, 0, "("], + [19654, 0, "i"], + [19655, 0, "n"], + [19656, 0, "d"], + [19657, 0, "i"], + [19658, 0, "c"], + [19659, 0, "a"], + [19660, 0, "t"], + [19661, 0, "i"], + [19662, 0, "n"], + [19663, 0, "g"], + [19664, 0, " "], + [19665, 0, "t"], + [19666, 0, "h"], + [19667, 0, "a"], + [19668, 0, "t"], + [19669, 0, " "], + [19670, 0, "t"], + [19671, 0, "h"], + [19672, 0, "e"], + [19673, 0, " "], + [19674, 0, "k"], + [19675, 0, "e"], + [19676, 0, "y"], + [19677, 0, " "], + [19678, 0, "h"], + [19679, 0, "a"], + [19680, 0, "s"], + [19681, 0, " "], + [19682, 0, "b"], + [19683, 0, "e"], + [19684, 0, "e"], + [19685, 0, "n"], + [19686, 0, " "], + [19687, 0, "d"], + [19688, 0, "e"], + [19689, 0, "l"], + [19690, 0, "e"], + [19691, 0, "t"], + [19692, 0, "e"], + [19693, 0, "d"], + [19694, 0, ")"], + [19695, 0, "."], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 1], + [19746, 0, "t"], + [19747, 0, "h"], + [19748, 0, "e"], + [19749, 0, " "], + [19750, 0, "a"], + [19751, 0, "p"], + [19752, 0, "p"], + [19753, 0, "l"], + [19754, 0, "i"], + [19755, 0, "c"], + [19756, 0, "a"], + [19757, 0, "t"], + [19758, 0, "i"], + [19759, 0, "o"], + [19760, 0, "n"], + [18807, 1], + [18806, 1], + [18805, 1], + [18804, 1], + [18803, 1], + [18803, 0, "2"], + [18804, 0, ","], + [18805, 0, "3"], + [19004, 1], + [19003, 1], + [19002, 1], + [19001, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [21537, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [29726, 1], + [35213, 0, "\n"], + [35214, 0, "\n"], + [35215, 0, "F"], + [35216, 0, "i"], + [35217, 0, "g"], + [35218, 0, "u"], + [35219, 0, "r"], + [35220, 0, "e"], + [35221, 0, "~"], + [35222, 0, "\\"], + [35223, 0, "r"], + [35224, 0, "e"], + [35225, 0, "f"], + [35226, 0, "{"], + [35227, 0, "f"], + [35228, 0, "i"], + [35229, 0, "g"], + [35230, 0, ":"], + [35231, 0, "o"], + [35232, 0, "p"], + [35233, 0, "e"], + [35234, 0, "r"], + [35235, 0, "a"], + [35236, 0, "t"], + [35237, 0, "i"], + [35238, 0, "o"], + [35239, 0, "n"], + [35240, 0, "-"], + [35241, 0, "r"], + [35242, 0, "u"], + [35243, 0, "l"], + [35244, 0, "e"], + [35245, 0, "s"], + [35246, 0, "}"], + [35247, 0, " "], + [35248, 0, "g"], + [35249, 0, "i"], + [35250, 0, "v"], + [35251, 0, "e"], + [35252, 0, "s"], + [35253, 0, " "], + [35254, 0, "t"], + [35255, 0, "h"], + [35256, 0, "e"], + [35257, 0, " "], + [35258, 0, "r"], + [35259, 0, "u"], + [35260, 0, "l"], + [35261, 0, "e"], + [35262, 0, "s"], + [35263, 0, " "], + [35264, 0, "t"], + [35265, 0, "h"], + [35266, 0, "a"], + [35267, 0, "t"], + [35268, 0, " "], + [35269, 0, "e"], + [35270, 0, "v"], + [35271, 0, "a"], + [35272, 0, "l"], + [35273, 0, "u"], + [35274, 0, "a"], + [35275, 0, "t"], + [35276, 0, "e"], + [35277, 0, " "], + [35278, 0, "a"], + [35279, 0, "n"], + [35280, 0, " "], + [35281, 0, "o"], + [35282, 0, "p"], + [35283, 0, "e"], + [35284, 0, "r"], + [35285, 0, "a"], + [35286, 0, "t"], + [35287, 0, "i"], + [35288, 0, "o"], + [35289, 0, "n"], + [35290, 0, " "], + [35291, 0, "$"], + [35292, 0, "\\"], + [35293, 0, "m"], + [35294, 0, "a"], + [35295, 0, "t"], + [35296, 0, "h"], + [35297, 0, "s"], + [35298, 0, "f"], + [35299, 0, "{"], + [35300, 0, "o"], + [35301, 0, "p"], + [35302, 0, "}"], + [35303, 0, "$"], + [35304, 0, " "], + [35305, 0, "w"], + [35306, 0, "i"], + [35307, 0, "t"], + [35308, 0, "h"], + [35309, 0, "i"], + [35310, 0, "n"], + [35311, 0, " "], + [35312, 0, "a"], + [35313, 0, " "], + [35314, 0, "c"], + [35315, 0, "o"], + [35316, 0, "n"], + [35317, 0, "t"], + [35318, 0, "e"], + [35319, 0, "x"], + [35320, 0, "t"], + [35321, 0, " "], + [35322, 0, "$"], + [35323, 0, "\\"], + [35324, 0, "m"], + [35325, 0, "a"], + [35326, 0, "t"], + [35327, 0, "h"], + [35328, 0, "i"], + [35329, 0, "t"], + [35330, 0, "{"], + [35331, 0, "c"], + [35332, 0, "t"], + [35333, 0, "x"], + [35334, 0, "}"], + [35335, 0, "$"], + [35336, 0, ","], + [35337, 0, " "], + [35338, 0, "a"], + [35339, 0, "n"], + [35340, 0, "d"], + [35341, 0, " "], + [35342, 0, "p"], + [35343, 0, "r"], + [35344, 0, "o"], + [35345, 0, "d"], + [35346, 0, "u"], + [35347, 0, "c"], + [35348, 0, "e"], + [35349, 0, " "], + [35350, 0, "a"], + [35351, 0, " "], + [35352, 0, "n"], + [35353, 0, "e"], + [35354, 0, "w"], + [35355, 0, " "], + [35355, 1], + [35354, 1], + [35353, 1], + [35352, 1], + [35351, 1], + [35351, 0, "n"], + [35352, 0, " "], + [35353, 0, "u"], + [35354, 0, "p"], + [35355, 0, "d"], + [35356, 0, "a"], + [35357, 0, "t"], + [35358, 0, "e"], + [35359, 0, "d"], + [35360, 0, " "], + [35361, 0, "c"], + [35362, 0, "o"], + [35363, 0, "n"], + [35364, 0, "t"], + [35365, 0, "e"], + [35366, 0, "x"], + [35367, 0, "t"], + [35368, 0, " "], + [35369, 0, "$"], + [35370, 0, "\\"], + [35371, 0, "m"], + [35372, 0, "a"], + [35373, 0, "t"], + [35374, 0, "h"], + [35375, 0, "i"], + [35376, 0, "t"], + [35377, 0, "{"], + [35378, 0, "c"], + [35379, 0, "t"], + [35380, 0, "x"], + [35381, 0, "}"], + [35382, 0, "'"], + [35383, 0, "$"], + [35384, 0, "."], + [35385, 0, " "], + [35386, 0, "T"], + [35387, 0, "h"], + [35388, 0, "e"], + [35389, 0, "s"], + [35390, 0, "e"], + [35391, 0, " "], + [35392, 0, "r"], + [35393, 0, "u"], + [35394, 0, "l"], + [35395, 0, "e"], + [35396, 0, "s"], + [35397, 0, " "], + [35398, 0, "a"], + [35399, 0, "r"], + [35400, 0, "e"], + [35401, 0, " "], + [35402, 0, "u"], + [35403, 0, "s"], + [35404, 0, "e"], + [35405, 0, "d"], + [35406, 0, " "], + [35407, 0, "b"], + [35408, 0, "y"], + [35409, 0, " "], + [35410, 0, "\\"], + [35411, 0, "t"], + [35412, 0, "e"], + [35413, 0, "x"], + [35414, 0, "t"], + [35415, 0, "s"], + [35416, 0, "c"], + [35417, 0, "{"], + [35418, 0, "A"], + [35419, 0, "p"], + [35420, 0, "p"], + [35421, 0, "l"], + [35422, 0, "y"], + [35423, 0, "-"], + [35424, 0, "L"], + [35425, 0, "o"], + [35426, 0, "c"], + [35427, 0, "a"], + [35428, 0, "l"], + [35429, 0, "}"], + [35430, 0, " "], + [35431, 0, "a"], + [35432, 0, "n"], + [35433, 0, "d"], + [35434, 0, " "], + [35435, 0, "\\"], + [35436, 0, "t"], + [35437, 0, "e"], + [35438, 0, "x"], + [35439, 0, "t"], + [35440, 0, "s"], + [35441, 0, "c"], + [35442, 0, "{"], + [35443, 0, "A"], + [35444, 0, "p"], + [35445, 0, "p"], + [35446, 0, "l"], + [35447, 0, "y"], + [35448, 0, "-"], + [35449, 0, "R"], + [35450, 0, "e"], + [35451, 0, "m"], + [35452, 0, "o"], + [35453, 0, "t"], + [35454, 0, "e"], + [35455, 0, "}"], + [35456, 0, " "], + [35457, 0, "t"], + [35458, 0, "o"], + [35459, 0, " "], + [35460, 0, "p"], + [35461, 0, "e"], + [35462, 0, "r"], + [35463, 0, "f"], + [35464, 0, "o"], + [35465, 0, "r"], + [35466, 0, "m"], + [35467, 0, " "], + [35468, 0, "t"], + [35469, 0, "h"], + [35470, 0, "e"], + [35471, 0, " "], + [35472, 0, "s"], + [35473, 0, "t"], + [35474, 0, "a"], + [35475, 0, "t"], + [35476, 0, "e"], + [35477, 0, " "], + [35478, 0, "u"], + [35479, 0, "p"], + [35480, 0, "d"], + [35481, 0, "a"], + [35482, 0, "t"], + [35483, 0, "e"], + [35484, 0, "s"], + [35485, 0, " "], + [35486, 0, "o"], + [35487, 0, "n"], + [35488, 0, " "], + [35489, 0, "a"], + [35490, 0, " "], + [35491, 0, "d"], + [35492, 0, "o"], + [35493, 0, "c"], + [35494, 0, "u"], + [35495, 0, "m"], + [35496, 0, "e"], + [35497, 0, "n"], + [35498, 0, "t"], + [35499, 0, "."], + [35500, 0, "\n"], + [35501, 0, "\n"], + [35502, 0, "W"], + [35503, 0, "h"], + [35504, 0, "e"], + [35505, 0, "n"], + [35506, 0, " "], + [35507, 0, "t"], + [35508, 0, "h"], + [35509, 0, "e"], + [35510, 0, " "], + [35511, 0, "c"], + [35512, 0, "u"], + [35513, 0, "r"], + [35514, 0, "s"], + [35515, 0, "o"], + [35516, 0, "r"], + [35517, 0, " "], + [35511, 0, "o"], + [35512, 0, "p"], + [35513, 0, "e"], + [35514, 0, "r"], + [35515, 0, "a"], + [35516, 0, "t"], + [35517, 0, "i"], + [35518, 0, "o"], + [35519, 0, "n"], + [35520, 0, "'"], + [35521, 0, "s"], + [35522, 0, " "], + [35530, 0, "r"], + [35531, 0, "e"], + [35532, 0, "f"], + [35533, 0, "e"], + [35534, 0, "r"], + [35535, 0, "s"], + [35536, 0, " "], + [35537, 0, "t"], + [35538, 0, "o"], + [35539, 0, " "], + [35540, 0, "a"], + [35541, 0, " "], + [35542, 0, "t"], + [35543, 0, "r"], + [35544, 0, "e"], + [35545, 0, "e"], + [35546, 0, " "], + [35547, 0, "n"], + [35548, 0, "o"], + [35549, 0, "d"], + [35550, 0, "e"], + [35551, 0, " "], + [35552, 0, "t"], + [35553, 0, "h"], + [35554, 0, "a"], + [35555, 0, "t"], + [35556, 0, " "], + [35557, 0, "i"], + [35558, 0, "s"], + [35559, 0, " "], + [35560, 0, "n"], + [35561, 0, "o"], + [35562, 0, "t"], + [35563, 0, " "], + [35564, 0, "t"], + [35565, 0, "h"], + [35566, 0, "e"], + [35567, 0, " "], + [35568, 0, "d"], + [35569, 0, "o"], + [35570, 0, "c"], + [35571, 0, "u"], + [35572, 0, "m"], + [35573, 0, "e"], + [35574, 0, "n"], + [35575, 0, "t"], + [35576, 0, " "], + [35577, 0, "r"], + [35578, 0, "o"], + [35579, 0, "o"], + [35580, 0, "t"], + [35581, 0, " "], + [35582, 0, "\\"], + [35582, 1], + [35582, 0, "$"], + [35583, 0, "\\"], + [35584, 0, "m"], + [35585, 0, "a"], + [35586, 0, "t"], + [35587, 0, "h"], + [35588, 0, "s"], + [35589, 0, "f"], + [35590, 0, "{"], + [35591, 0, "d"], + [35592, 0, "o"], + [35593, 0, "c"], + [35594, 0, "}"], + [35595, 0, "$"], + [35596, 0, ","], + [35597, 0, " "], + [35598, 0, "t"], + [35599, 0, "h"], + [35600, 0, "e"], + [35601, 0, " "], + [35602, 0, "\\"], + [35603, 0, "t"], + [35604, 0, "e"], + [35605, 0, "x"], + [35606, 0, "t"], + [35607, 0, "s"], + [35608, 0, "c"], + [35609, 0, "{"], + [35610, 0, "D"], + [35611, 0, "e"], + [35612, 0, "s"], + [35613, 0, "c"], + [35614, 0, "e"], + [35615, 0, "n"], + [35616, 0, "d"], + [35617, 0, "}"], + [35618, 0, " "], + [35619, 0, "r"], + [35620, 0, "u"], + [35621, 0, "l"], + [35622, 0, "e"], + [35623, 0, " "], + [35624, 0, "f"], + [35625, 0, "i"], + [35626, 0, "r"], + [35627, 0, "s"], + [35628, 0, "t"], + [35629, 0, " "], + [35630, 0, "a"], + [35631, 0, "p"], + [35632, 0, "p"], + [35633, 0, "l"], + [35634, 0, "i"], + [35635, 0, "e"], + [35636, 0, "s"], + [35637, 0, "."], + [35638, 0, " "], + [35639, 0, "I"], + [35640, 0, "t"], + [35641, 0, " "], + [35642, 0, "d"], + [35642, 1], + [35642, 0, "r"], + [35643, 0, "e"], + [35644, 0, "c"], + [35645, 0, "u"], + [35646, 0, "r"], + [35647, 0, "s"], + [35648, 0, "i"], + [35649, 0, "v"], + [35650, 0, "e"], + [35651, 0, "l"], + [35652, 0, "y"], + [35653, 0, " "], + [35654, 0, "d"], + [35655, 0, "e"], + [35656, 0, "s"], + [35657, 0, "c"], + [35658, 0, "e"], + [35659, 0, "n"], + [35660, 0, "d"], + [35661, 0, "s"], + [35662, 0, " "], + [35663, 0, "t"], + [35664, 0, "h"], + [35665, 0, "e"], + [35666, 0, " "], + [35667, 0, "d"], + [35668, 0, "o"], + [35669, 0, "c"], + [35670, 0, "u"], + [35671, 0, "m"], + [35672, 0, "e"], + [35673, 0, "n"], + [35674, 0, "t"], + [35675, 0, " "], + [35676, 0, "t"], + [35677, 0, "r"], + [35678, 0, "e"], + [35679, 0, "e"], + [35680, 0, " "], + [35681, 0, "a"], + [35682, 0, "c"], + [35683, 0, "c"], + [35684, 0, "o"], + [35685, 0, "r"], + [35686, 0, "d"], + [35687, 0, "i"], + [35688, 0, "n"], + [35689, 0, "g"], + [35690, 0, " "], + [35691, 0, "t"], + [35692, 0, "o"], + [35693, 0, " "], + [35694, 0, "t"], + [35695, 0, "h"], + [35696, 0, "e"], + [35697, 0, " "], + [35698, 0, "v"], + [35699, 0, "e"], + [35700, 0, "c"], + [35701, 0, "t"], + [35702, 0, "o"], + [35703, 0, "r"], + [35704, 0, " "], + [35705, 0, "o"], + [35706, 0, "f"], + [35707, 0, " "], + [35708, 0, "k"], + [35709, 0, "e"], + [35710, 0, "y"], + [35711, 0, "s"], + [35712, 0, " "], + [35713, 0, "g"], + [35714, 0, "i"], + [35715, 0, "v"], + [35716, 0, "e"], + [35717, 0, "n"], + [35718, 0, " "], + [35719, 0, "i"], + [35720, 0, "n"], + [35721, 0, " "], + [35722, 0, "t"], + [35723, 0, "h"], + [35724, 0, "e"], + [35725, 0, " "], + [35726, 0, "c"], + [35727, 0, "u"], + [35728, 0, "r"], + [35729, 0, "s"], + [35730, 0, "o"], + [35731, 0, "r"], + [35732, 0, "."], + [35733, 0, " "], + [35734, 0, "I"], + [35735, 0, "f"], + [35736, 0, " "], + [35737, 0, "t"], + [35738, 0, "h"], + [35739, 0, "e"], + [35740, 0, " "], + [35741, 0, "t"], + [35742, 0, "r"], + [35743, 0, "e"], + [35744, 0, "e"], + [35745, 0, " "], + [35746, 0, "n"], + [35747, 0, "o"], + [35748, 0, "d"], + [35749, 0, "e"], + [35750, 0, " "], + [35751, 0, "a"], + [35752, 0, "l"], + [35753, 0, "r"], + [35754, 0, "e"], + [35755, 0, "a"], + [35756, 0, "d"], + [35757, 0, "y"], + [35758, 0, " "], + [35759, 0, "e"], + [35760, 0, "x"], + [35761, 0, "i"], + [35762, 0, "s"], + [35763, 0, "t"], + [35764, 0, "s"], + [35765, 0, ","], + [35766, 0, " "], + [35767, 0, "\\"], + [35768, 0, "t"], + [35769, 0, "e"], + [35770, 0, "x"], + [35771, 0, "t"], + [35772, 0, "s"], + [35773, 0, "c"], + [35774, 0, "{"], + [35775, 0, "C"], + [35776, 0, "h"], + [35777, 0, "i"], + [35778, 0, "l"], + [35779, 0, "d"], + [35780, 0, "-"], + [35781, 0, "G"], + [35782, 0, "e"], + [35783, 0, "t"], + [35784, 0, "}"], + [35785, 0, " "], + [35765, 0, " "], + [35766, 0, "i"], + [35767, 0, "n"], + [35768, 0, " "], + [35769, 0, "t"], + [35770, 0, "h"], + [35771, 0, "e"], + [35772, 0, " "], + [35773, 0, "l"], + [35774, 0, "o"], + [35775, 0, "c"], + [35776, 0, "a"], + [35777, 0, "l"], + [35778, 0, " "], + [35779, 0, "p"], + [35780, 0, "e"], + [35781, 0, "e"], + [35782, 0, "r"], + [35783, 0, " "], + [35784, 0, "s"], + [35785, 0, "t"], + [35786, 0, "a"], + [35787, 0, "t"], + [35788, 0, "e"], + [35810, 0, "f"], + [35811, 0, "i"], + [35812, 0, "n"], + [35813, 0, "d"], + [35814, 0, "s"], + [35815, 0, " "], + [35816, 0, "i"], + [35817, 0, "t"], + [35818, 0, ","], + [35819, 0, " "], + [35820, 0, "o"], + [35821, 0, "t"], + [35822, 0, "h"], + [35823, 0, "e"], + [35824, 0, "r"], + [35825, 0, "w"], + [35826, 0, "i"], + [35827, 0, "s"], + [35828, 0, "e"], + [35829, 0, " "], + [35830, 0, "\\"], + [35831, 0, "t"], + [35832, 0, "e"], + [35833, 0, "x"], + [35834, 0, "t"], + [35835, 0, "s"], + [35836, 0, "c"], + [35837, 0, "{"], + [35838, 0, "C"], + [35839, 0, "h"], + [35840, 0, "i"], + [35841, 0, "l"], + [35842, 0, "d"], + [35843, 0, "-"], + [35844, 0, "M"], + [35845, 0, "a"], + [35846, 0, "p"], + [35847, 0, "}"], + [35848, 0, " "], + [35849, 0, "a"], + [35850, 0, "n"], + [35851, 0, "d"], + [35852, 0, " "], + [35853, 0, "\\"], + [35854, 0, "t"], + [35855, 0, "e"], + [35856, 0, "x"], + [35857, 0, "t"], + [35858, 0, "s"], + [35859, 0, "c"], + [35860, 0, "{"], + [35861, 0, "C"], + [35862, 0, "h"], + [35863, 0, "i"], + [35864, 0, "l"], + [35865, 0, "d"], + [35866, 0, "-"], + [35867, 0, "L"], + [35868, 0, "i"], + [35869, 0, "s"], + [35870, 0, "t"], + [35871, 0, "}"], + [35872, 0, " "], + [35873, 0, "c"], + [35873, 1], + [35873, 0, "c"], + [35874, 0, "r"], + [35875, 0, "e"], + [35876, 0, "a"], + [35877, 0, "t"], + [35878, 0, "e"], + [35879, 0, " "], + [35880, 0, "a"], + [35881, 0, "n"], + [35882, 0, " "], + [35883, 0, "e"], + [35884, 0, "m"], + [35885, 0, "p"], + [35886, 0, "t"], + [35887, 0, "y"], + [35888, 0, " "], + [35889, 0, "m"], + [35890, 0, "a"], + [35891, 0, "p"], + [35892, 0, " "], + [35893, 0, "o"], + [35894, 0, "r"], + [35895, 0, " "], + [35896, 0, "l"], + [35897, 0, "i"], + [35898, 0, "s"], + [35899, 0, "t"], + [35900, 0, " "], + [35901, 0, "r"], + [35902, 0, "e"], + [35903, 0, "s"], + [35904, 0, "p"], + [35905, 0, "e"], + [35906, 0, "c"], + [35907, 0, "t"], + [35908, 0, "i"], + [35909, 0, "v"], + [35910, 0, "e"], + [35911, 0, "l"], + [35912, 0, "y"], + [35913, 0, "."], + [35914, 0, " "], + [35914, 1], + [35914, 0, "\n"], + [35915, 0, "\n"], + [35916, 0, "\\"], + [35916, 1], + [35916, 0, "T"], + [35917, 0, "h"], + [35918, 0, "e"], + [35919, 0, " "], + [35920, 0, "\\"], + [35921, 0, "t"], + [35922, 0, "e"], + [35923, 0, "x"], + [35924, 0, "t"], + [35925, 0, "s"], + [35926, 0, "c"], + [35927, 0, "{"], + [35928, 0, "D"], + [35929, 0, "e"], + [35930, 0, "s"], + [35931, 0, "c"], + [35932, 0, "e"], + [35933, 0, "n"], + [35934, 0, "d"], + [35935, 0, "}"], + [35936, 0, " "], + [35937, 0, "r"], + [35938, 0, "u"], + [35939, 0, "l"], + [35940, 0, "e"], + [35941, 0, " "], + [35942, 0, "a"], + [35943, 0, "l"], + [35944, 0, "s"], + [35945, 0, "o"], + [35946, 0, " "], + [35947, 0, "i"], + [35948, 0, "n"], + [35949, 0, "v"], + [35950, 0, "o"], + [35951, 0, "k"], + [35952, 0, "e"], + [35953, 0, "s"], + [35954, 0, " "], + [35955, 0, "\\"], + [35956, 0, "t"], + [35957, 0, "e"], + [35958, 0, "x"], + [35959, 0, "t"], + [35960, 0, "s"], + [35961, 0, "c"], + [35962, 0, "{"], + [35963, 0, "A"], + [35964, 0, "d"], + [35965, 0, "d"], + [35966, 0, "_"], + [35966, 1], + [35966, 0, "-"], + [35967, 0, "I"], + [35968, 0, "D"], + [35969, 0, "}"], + [35970, 0, " "], + [35971, 0, "a"], + [35972, 0, "t"], + [35973, 0, " "], + [35974, 0, "e"], + [35975, 0, "a"], + [35976, 0, "c"], + [35977, 0, "h"], + [35978, 0, " "], + [35979, 0, "t"], + [35980, 0, "r"], + [35981, 0, "e"], + [35982, 0, "e"], + [35983, 0, " "], + [35984, 0, "n"], + [35985, 0, "o"], + [35986, 0, "d"], + [35987, 0, "e"], + [35988, 0, " "], + [35989, 0, "a"], + [35990, 0, "l"], + [35991, 0, "o"], + [35992, 0, "n"], + [35993, 0, "g"], + [35994, 0, " "], + [35995, 0, "t"], + [35996, 0, "h"], + [35997, 0, "e"], + [35998, 0, " "], + [35999, 0, "p"], + [36000, 0, "a"], + [36001, 0, "t"], + [36002, 0, "h"], + [36003, 0, " "], + [36004, 0, "d"], + [36005, 0, "e"], + [36006, 0, "s"], + [36007, 0, "c"], + [36008, 0, "r"], + [36009, 0, "i"], + [36010, 0, "b"], + [36011, 0, "e"], + [36012, 0, "d"], + [36013, 0, " "], + [36014, 0, "b"], + [36015, 0, "y"], + [36016, 0, " "], + [36017, 0, "t"], + [36018, 0, "h"], + [36019, 0, "e"], + [36020, 0, " "], + [36021, 0, "c"], + [36022, 0, "u"], + [36023, 0, "r"], + [36024, 0, "s"], + [36025, 0, "o"], + [36026, 0, "r"], + [36027, 0, ","], + [36028, 0, " "], + [36029, 0, "a"], + [36030, 0, "d"], + [36031, 0, "d"], + [36032, 0, "i"], + [36033, 0, "n"], + [36034, 0, "g"], + [36035, 0, " "], + [36036, 0, "t"], + [36037, 0, "h"], + [36038, 0, "e"], + [36039, 0, " "], + [36040, 0, "o"], + [36041, 0, "p"], + [36042, 0, "e"], + [36043, 0, "r"], + [36044, 0, "a"], + [36045, 0, "t"], + [36046, 0, "i"], + [36047, 0, "o"], + [36048, 0, "n"], + [36049, 0, " "], + [36050, 0, "I"], + [36051, 0, "D"], + [36052, 0, " "], + [36053, 0, "t"], + [36054, 0, "o"], + [36055, 0, " "], + [36056, 0, "t"], + [36057, 0, "h"], + [36058, 0, "e"], + [36059, 0, " "], + [36060, 0, "p"], + [36061, 0, "r"], + [36062, 0, "e"], + [36063, 0, "s"], + [36064, 0, "e"], + [36065, 0, "n"], + [36066, 0, "c"], + [36067, 0, "e"], + [36068, 0, " "], + [36069, 0, "s"], + [36070, 0, "e"], + [36071, 0, "t"], + [36072, 0, " "], + [36073, 0, "$"], + [36074, 0, "\\"], + [36075, 0, "m"], + [36076, 0, "a"], + [36077, 0, "t"], + [36078, 0, "h"], + [36079, 0, "s"], + [36080, 0, "f"], + [36081, 0, "{"], + [36082, 0, "p"], + [36083, 0, "r"], + [36084, 0, "e"], + [36085, 0, "s"], + [36086, 0, "}"], + [36087, 0, "("], + [36088, 0, "k"], + [36089, 0, ")"], + [36090, 0, "$"], + [36091, 0, " "], + [36092, 0, "t"], + [36093, 0, "o"], + [36094, 0, " "], + [36095, 0, "i"], + [36096, 0, "n"], + [36097, 0, "d"], + [36098, 0, "i"], + [36099, 0, "c"], + [36100, 0, "a"], + [36101, 0, "t"], + [36102, 0, "e"], + [36103, 0, " "], + [36104, 0, "t"], + [36105, 0, "h"], + [36106, 0, "a"], + [36107, 0, "t"], + [36108, 0, " "], + [36109, 0, "t"], + [36110, 0, "h"], + [36111, 0, "e"], + [36112, 0, " "], + [36113, 0, "s"], + [36114, 0, "u"], + [36115, 0, "b"], + [36116, 0, "t"], + [36117, 0, "r"], + [36118, 0, "e"], + [36119, 0, "e"], + [36120, 0, " "], + [36121, 0, "i"], + [36122, 0, "n"], + [36123, 0, "c"], + [36124, 0, "l"], + [36125, 0, "u"], + [36126, 0, "d"], + [36127, 0, "e"], + [36128, 0, "s"], + [36129, 0, " "], + [36130, 0, "m"], + [36131, 0, "u"], + [36132, 0, "t"], + [36132, 1], + [36131, 1], + [36130, 1], + [36130, 0, "a"], + [36131, 0, " "], + [36132, 0, "m"], + [36133, 0, "u"], + [36134, 0, "t"], + [36135, 0, "a"], + [36136, 0, "t"], + [36137, 0, "i"], + [36138, 0, "o"], + [36139, 0, "n"], + [36140, 0, " "], + [36141, 0, "m"], + [36142, 0, "a"], + [36143, 0, "d"], + [36144, 0, "e"], + [36145, 0, " "], + [36146, 0, "b"], + [36147, 0, "y"], + [36148, 0, " "], + [36149, 0, "t"], + [36150, 0, "h"], + [36151, 0, "i"], + [36152, 0, "s"], + [36153, 0, " "], + [36154, 0, "o"], + [36155, 0, "p"], + [36156, 0, "e"], + [36157, 0, "r"], + [36158, 0, "a"], + [36159, 0, "t"], + [36160, 0, "i"], + [36161, 0, "o"], + [36162, 0, "n"], + [36163, 0, "."], + [36164, 0, "\n"], + [36165, 0, "\n"], + [36166, 0, "T"], + [36167, 0, "h"], + [36168, 0, "e"], + [36169, 0, " "], + [36170, 0, "r"], + [36171, 0, "e"], + [36172, 0, "m"], + [36173, 0, "a"], + [36174, 0, "i"], + [36175, 0, "n"], + [36176, 0, "i"], + [36177, 0, "n"], + [36178, 0, "g"], + [36179, 0, " "], + [36180, 0, "r"], + [36181, 0, "u"], + [36182, 0, "l"], + [36183, 0, "e"], + [36184, 0, "s"], + [36185, 0, " "], + [36186, 0, "i"], + [36187, 0, "n"], + [36188, 0, " "], + [36189, 0, "F"], + [36190, 0, "i"], + [36191, 0, "g"], + [36192, 0, "u"], + [36193, 0, "r"], + [36194, 0, "e"], + [36195, 0, "~"], + [36196, 0, "\\"], + [36197, 0, "r"], + [36198, 0, "e"], + [36199, 0, "f"], + [36200, 0, "{"], + [36201, 0, "f"], + [36202, 0, "i"], + [36203, 0, "g"], + [36204, 0, ":"], + [36205, 0, "o"], + [36206, 0, "p"], + [36207, 0, "e"], + [36208, 0, "r"], + [36209, 0, "a"], + [36210, 0, "t"], + [36211, 0, "i"], + [36212, 0, "o"], + [36213, 0, "n"], + [36214, 0, "-"], + [36215, 0, "r"], + [36216, 0, "u"], + [36217, 0, "l"], + [36218, 0, "e"], + [36219, 0, "s"], + [36220, 0, "}"], + [36221, 0, " "], + [36222, 0, "a"], + [36223, 0, "p"], + [36224, 0, "p"], + [36225, 0, "l"], + [36226, 0, "y"], + [36227, 0, " "], + [36228, 0, "w"], + [36229, 0, "h"], + [36230, 0, "e"], + [36231, 0, "n"], + [36232, 0, " "], + [36233, 0, "t"], + [36234, 0, "h"], + [36235, 0, "e"], + [36236, 0, " "], + [36237, 0, "v"], + [36238, 0, "e"], + [36239, 0, "c"], + [36240, 0, "t"], + [36241, 0, "o"], + [36242, 0, "r"], + [36243, 0, " "], + [36244, 0, "o"], + [36245, 0, "f"], + [36246, 0, " "], + [36247, 0, "k"], + [36248, 0, "e"], + [36249, 0, "y"], + [36250, 0, "s"], + [36251, 0, " "], + [36252, 0, "i"], + [36253, 0, "n"], + [36254, 0, " "], + [36255, 0, "t"], + [36256, 0, "h"], + [36257, 0, "e"], + [36258, 0, " "], + [36259, 0, "c"], + [36260, 0, "u"], + [36261, 0, "r"], + [36262, 0, "s"], + [36263, 0, "o"], + [36264, 0, "r"], + [36265, 0, " "], + [36266, 0, "i"], + [36267, 0, "s"], + [36268, 0, " "], + [36269, 0, "e"], + [36270, 0, "m"], + [36271, 0, "p"], + [36272, 0, "t"], + [36273, 0, "y"], + [36274, 0, ","], + [36275, 0, " "], + [36276, 0, "i"], + [36277, 0, "."], + [36278, 0, "e"], + [36279, 0, "."], + [36280, 0, " "], + [36281, 0, "w"], + [36282, 0, "h"], + [36283, 0, "e"], + [36284, 0, "n"], + [36285, 0, " "], + [36286, 0, "d"], + [36287, 0, "e"], + [36288, 0, "s"], + [36289, 0, "c"], + [36290, 0, "e"], + [36291, 0, "n"], + [36292, 0, "d"], + [36293, 0, "e"], + [36294, 0, "d"], + [36295, 0, " "], + [36296, 0, "t"], + [36297, 0, "o"], + [36298, 0, " "], + [36299, 0, "t"], + [36300, 0, "h"], + [36301, 0, "e"], + [36302, 0, " "], + [36303, 0, "c"], + [36304, 0, "o"], + [36305, 0, "n"], + [36306, 0, "t"], + [36307, 0, "e"], + [36308, 0, "x"], + [36309, 0, "t"], + [36310, 0, " "], + [36311, 0, "o"], + [36312, 0, "f"], + [36313, 0, " "], + [36314, 0, "t"], + [36315, 0, "h"], + [36316, 0, "e"], + [36317, 0, " "], + [36318, 0, "t"], + [36319, 0, "r"], + [36320, 0, "e"], + [36321, 0, "e"], + [36322, 0, " "], + [36323, 0, "n"], + [36324, 0, "o"], + [36325, 0, "d"], + [36326, 0, "e"], + [36327, 0, " "], + [36328, 0, "t"], + [36329, 0, "o"], + [36330, 0, " "], + [36331, 0, "w"], + [36332, 0, "h"], + [36333, 0, "i"], + [36334, 0, "c"], + [36335, 0, "h"], + [36336, 0, " "], + [36337, 0, "t"], + [36338, 0, "h"], + [36339, 0, "e"], + [36340, 0, " "], + [36341, 0, "m"], + [36342, 0, "u"], + [36343, 0, "t"], + [36344, 0, "a"], + [36345, 0, "t"], + [36346, 0, "i"], + [36347, 0, "o"], + [36348, 0, "n"], + [36349, 0, " "], + [36350, 0, "a"], + [36351, 0, "p"], + [36352, 0, "p"], + [36353, 0, "l"], + [36354, 0, "i"], + [36355, 0, "e"], + [36356, 0, "s"], + [36357, 0, "."], + [36358, 0, " "], + [36359, 0, "\\"], + [36359, 1], + [36359, 0, "T"], + [36360, 0, "h"], + [36361, 0, "e"], + [36362, 0, " "], + [36363, 0, "\\"], + [36364, 0, "t"], + [36365, 0, "e"], + [36366, 0, "x"], + [36367, 0, "t"], + [36368, 0, "s"], + [36369, 0, "c"], + [36370, 0, "{"], + [36371, 0, "A"], + [36372, 0, "s"], + [36373, 0, "s"], + [36374, 0, "i"], + [36375, 0, "g"], + [36376, 0, "n"], + [36377, 0, "}"], + [36378, 0, ","], + [36379, 0, " "], + [36380, 0, "\\"], + [36381, 0, "t"], + [36382, 0, "e"], + [36383, 0, "x"], + [36384, 0, "t"], + [36385, 0, "s"], + [36386, 0, "c"], + [36387, 0, "{"], + [36388, 0, "E"], + [36389, 0, "m"], + [36390, 0, "p"], + [36391, 0, "t"], + [36392, 0, "y"], + [36393, 0, "-"], + [36394, 0, "M"], + [36395, 0, "a"], + [36396, 0, "p"], + [36397, 0, "}"], + [36398, 0, " "], + [36399, 0, "a"], + [36400, 0, "n"], + [36401, 0, "d"], + [36402, 0, " "], + [36403, 0, "\\"], + [36404, 0, "t"], + [36405, 0, "e"], + [36406, 0, "x"], + [36407, 0, "t"], + [36408, 0, "s"], + [36409, 0, "c"], + [36410, 0, "{"], + [36411, 0, "E"], + [36412, 0, "m"], + [36413, 0, "p"], + [36414, 0, "t"], + [36415, 0, "y"], + [36416, 0, "-"], + [36417, 0, "L"], + [36418, 0, "i"], + [36419, 0, "s"], + [36420, 0, "t"], + [36421, 0, "}"], + [36422, 0, " "], + [36423, 0, "r"], + [36424, 0, "u"], + [36425, 0, "l"], + [36426, 0, "e"], + [36427, 0, "s"], + [36428, 0, " "], + [36429, 0, "h"], + [36430, 0, "a"], + [36431, 0, "n"], + [36432, 0, "d"], + [36433, 0, "l"], + [36434, 0, "e"], + [36435, 0, " "], + [36436, 0, "e"], + [36437, 0, "v"], + [36438, 0, "a"], + [36439, 0, "l"], + [36440, 0, "u"], + [36441, 0, "a"], + [36442, 0, "t"], + [36443, 0, "i"], + [36444, 0, "o"], + [36445, 0, "n"], + [36446, 0, " "], + [36447, 0, "o"], + [36448, 0, "f"], + [36449, 0, " "], + [36450, 0, "t"], + [36451, 0, "h"], + [36452, 0, "e"], + [36453, 0, " "], + [36454, 0, "\\"], + [36454, 1], + [36454, 0, "$"], + [36455, 0, "\\"], + [36456, 0, "t"], + [36457, 0, "e"], + [36458, 0, "x"], + [36458, 1], + [36457, 1], + [36456, 1], + [36456, 0, "m"], + [36457, 0, "a"], + [36458, 0, "t"], + [36459, 0, "h"], + [36460, 0, "s"], + [36461, 0, "f"], + [36462, 0, "{"], + [36463, 0, "a"], + [36464, 0, "s"], + [36465, 0, "s"], + [36466, 0, "i"], + [36467, 0, "g"], + [36468, 0, "n"], + [36469, 0, "}"], + [36470, 0, "$"], + [36471, 0, " "], + [36378, 1], + [36378, 0, " "], + [36379, 0, "r"], + [36380, 0, "u"], + [36381, 0, "l"], + [36382, 0, "e"], + [36383, 0, " "], + [36384, 0, "h"], + [36385, 0, "a"], + [36386, 0, "n"], + [36387, 0, "d"], + [36388, 0, "l"], + [36389, 0, "e"], + [36390, 0, "s"], + [36391, 0, " "], + [36392, 0, "a"], + [36393, 0, "s"], + [36394, 0, "s"], + [36395, 0, "i"], + [36396, 0, "g"], + [36397, 0, "n"], + [36398, 0, "m"], + [36399, 0, "e"], + [36400, 0, "n"], + [36401, 0, "t"], + [36402, 0, " "], + [36403, 0, "o"], + [36404, 0, "f"], + [36405, 0, " "], + [36406, 0, "a"], + [36407, 0, " "], + [36408, 0, "r"], + [36409, 0, "e"], + [36410, 0, "g"], + [36411, 0, "i"], + [36412, 0, "s"], + [36413, 0, "t"], + [36414, 0, "e"], + [36415, 0, "r"], + [36416, 0, ","], + [36436, 0, " "], + [36437, 0, "h"], + [36438, 0, "a"], + [36439, 0, "n"], + [36440, 0, "d"], + [36441, 0, "l"], + [36442, 0, "e"], + [36443, 0, "s"], + [36444, 0, " "], + [36445, 0, "a"], + [36446, 0, "s"], + [36447, 0, "s"], + [36448, 0, "i"], + [36449, 0, "g"], + [36450, 0, "n"], + [36451, 0, "m"], + [36452, 0, "e"], + [36453, 0, "n"], + [36454, 0, "t"], + [36455, 0, " "], + [36456, 0, "w"], + [36457, 0, "h"], + [36458, 0, "e"], + [36459, 0, "r"], + [36460, 0, "e"], + [36461, 0, " "], + [36462, 0, "t"], + [36463, 0, "h"], + [36464, 0, "e"], + [36465, 0, " "], + [36466, 0, "v"], + [36467, 0, "a"], + [36468, 0, "l"], + [36469, 0, "u"], + [36470, 0, "e"], + [36471, 0, " "], + [36472, 0, "i"], + [36473, 0, "s"], + [36474, 0, " "], + [36475, 0, "t"], + [36476, 0, "h"], + [36477, 0, "e"], + [36478, 0, " "], + [36479, 0, "e"], + [36480, 0, "m"], + [36481, 0, "p"], + [36482, 0, "t"], + [36483, 0, "y"], + [36484, 0, " "], + [36485, 0, "m"], + [36486, 0, "a"], + [36487, 0, "p"], + [36488, 0, " "], + [36489, 0, "l"], + [36490, 0, "i"], + [36491, 0, "t"], + [36492, 0, "e"], + [36493, 0, "r"], + [36494, 0, "a"], + [36495, 0, "l"], + [36496, 0, " "], + [36497, 0, "\\"], + [36498, 0, "v"], + [36499, 0, "e"], + [36500, 0, "r"], + [36501, 0, "b"], + [36502, 0, "|"], + [36503, 0, "{"], + [36504, 0, "}"], + [36505, 0, "|"], + [36506, 0, ","], + [36536, 1], + [36535, 1], + [36534, 1], + [36533, 1], + [36532, 1], + [36531, 1], + [36538, 0, "s"], + [36575, 1], + [36574, 1], + [36573, 1], + [36566, 1], + [36565, 1], + [36564, 1], + [36563, 1], + [36562, 1], + [36561, 1], + [36560, 1], + [36559, 1], + [36558, 1], + [36557, 1], + [36556, 1], + [36555, 1], + [36554, 1], + [36553, 1], + [36552, 1], + [36551, 1], + [36550, 1], + [36549, 1], + [36548, 1], + [36547, 1], + [36546, 1], + [36545, 1], + [36544, 1], + [36543, 1], + [36542, 1], + [36541, 1], + [36540, 1], + [36546, 0, "m"], + [36547, 0, "e"], + [36548, 0, "n"], + [36549, 0, "t"], + [36550, 0, " "], + [36551, 0, "o"], + [36552, 0, "f"], + [36553, 0, " "], + [36554, 0, "t"], + [36555, 0, "h"], + [36556, 0, "e"], + [36557, 0, " "], + [36558, 0, "e"], + [36559, 0, "m"], + [36560, 0, "p"], + [36561, 0, "t"], + [36562, 0, "y"], + [36563, 0, " "], + [36564, 0, "l"], + [36565, 0, "i"], + [36566, 0, "s"], + [36567, 0, "t"], + [36568, 0, " "], + [36569, 0, "\\"], + [36570, 0, "v"], + [36571, 0, "e"], + [36572, 0, "r"], + [36573, 0, "b"], + [36574, 0, "|"], + [36575, 0, "["], + [36576, 0, "]"], + [36577, 0, "|"], + [36578, 0, "."], + [36579, 0, " "], + [36580, 0, "T"], + [36581, 0, "h"], + [36582, 0, "e"], + [36583, 0, "s"], + [36584, 0, "e"], + [36585, 0, " "], + [36586, 0, "a"], + [36587, 0, "s"], + [36588, 0, "s"], + [36589, 0, "i"], + [36590, 0, "g"], + [36591, 0, "n"], + [36592, 0, "m"], + [36593, 0, "e"], + [36594, 0, "n"], + [36595, 0, "t"], + [36596, 0, " "], + [36597, 0, "r"], + [36598, 0, "u"], + [36599, 0, "l"], + [36600, 0, "e"], + [36601, 0, "s"], + [36602, 0, " "], + [36586, 0, "t"], + [36587, 0, "h"], + [36588, 0, "r"], + [36589, 0, "e"], + [36590, 0, "e"], + [36591, 0, " "], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36592, 1], + [36598, 0, "f"], + [36599, 0, "o"], + [36600, 0, "r"], + [36601, 0, " "], + [36602, 0, "\\"], + [36603, 0, "t"], + [36604, 0, "e"], + [36605, 0, "x"], + [36606, 0, "t"], + [36607, 0, "s"], + [36608, 0, "f"], + [36609, 0, "{"], + [36610, 0, "a"], + [36611, 0, "s"], + [36612, 0, "s"], + [36613, 0, "i"], + [36614, 0, "g"], + [36615, 0, "n"], + [36616, 0, "}"], + [36617, 0, " "], + [36618, 0, "h"], + [36619, 0, "a"], + [36620, 0, "v"], + [36621, 0, "e"], + [36622, 0, " "], + [36623, 0, "a"], + [36624, 0, " "], + [36625, 0, "s"], + [36626, 0, "i"], + [36627, 0, "m"], + [36628, 0, "i"], + [36629, 0, "l"], + [36630, 0, "a"], + [36631, 0, "r"], + [36632, 0, " "], + [36633, 0, "s"], + [36634, 0, "t"], + [36635, 0, "r"], + [36636, 0, "u"], + [36637, 0, "c"], + [36638, 0, "t"], + [36639, 0, "u"], + [36640, 0, "r"], + [36641, 0, "e"], + [36642, 0, ":"], + [36643, 0, " "], + [36644, 0, "f"], + [36645, 0, "i"], + [36646, 0, "r"], + [36647, 0, "s"], + [36648, 0, "t"], + [36649, 0, " "], + [36650, 0, "c"], + [36651, 0, "l"], + [36652, 0, "e"], + [36653, 0, "a"], + [36654, 0, "r"], + [36655, 0, "i"], + [36656, 0, "n"], + [36657, 0, "g"], + [36658, 0, " "], + [36659, 0, "t"], + [36660, 0, "h"], + [36661, 0, "e"], + [36662, 0, " "], + [36663, 0, "p"], + [36664, 0, "r"], + [36665, 0, "i"], + [36666, 0, "o"], + [36667, 0, "r"], + [36668, 0, " "], + [36669, 0, "v"], + [36670, 0, "a"], + [36671, 0, "l"], + [36672, 0, "u"], + [36673, 0, "e"], + [36674, 0, " "], + [36675, 0, "a"], + [36676, 0, "t"], + [36677, 0, " "], + [36678, 0, "t"], + [36679, 0, "h"], + [36680, 0, "e"], + [36681, 0, " "], + [36682, 0, "c"], + [36683, 0, "u"], + [36684, 0, "r"], + [36685, 0, "s"], + [36686, 0, "o"], + [36687, 0, "r"], + [36688, 0, " "], + [36689, 0, "("], + [36690, 0, "a"], + [36691, 0, "s"], + [36692, 0, " "], + [36693, 0, "d"], + [36694, 0, "i"], + [36695, 0, "s"], + [36696, 0, "c"], + [36697, 0, "u"], + [36698, 0, "s"], + [36699, 0, "s"], + [36700, 0, "e"], + [36701, 0, "d"], + [36702, 0, " "], + [36703, 0, "i"], + [36704, 0, "n"], + [36705, 0, " "], + [36706, 0, "t"], + [36707, 0, "h"], + [36708, 0, "e"], + [36709, 0, " "], + [36710, 0, "n"], + [36711, 0, "e"], + [36712, 0, "x"], + [36713, 0, "t"], + [36714, 0, " "], + [36715, 0, "s"], + [36716, 0, "e"], + [36717, 0, "c"], + [36718, 0, "t"], + [36719, 0, "i"], + [36720, 0, "o"], + [36721, 0, "n"], + [36722, 0, ")"], + [36723, 0, ","], + [36724, 0, " "], + [36725, 0, "t"], + [36726, 0, "h"], + [36727, 0, "e"], + [36728, 0, "n"], + [36729, 0, " "], + [36730, 0, "a"], + [36731, 0, "d"], + [36732, 0, "d"], + [36733, 0, "i"], + [36734, 0, "n"], + [36735, 0, "g"], + [36736, 0, " "], + [36737, 0, "t"], + [36738, 0, "h"], + [36739, 0, "e"], + [36740, 0, " "], + [36741, 0, "o"], + [36742, 0, "p"], + [36743, 0, "e"], + [36744, 0, "r"], + [36745, 0, "a"], + [36746, 0, "t"], + [36747, 0, "i"], + [36748, 0, "o"], + [36749, 0, "n"], + [36750, 0, " "], + [36751, 0, "I"], + [36752, 0, "D"], + [36753, 0, " "], + [36754, 0, "t"], + [36755, 0, "o"], + [36756, 0, " "], + [36757, 0, "t"], + [36758, 0, "h"], + [36759, 0, "e"], + [36760, 0, " "], + [36761, 0, "p"], + [36762, 0, "r"], + [36763, 0, "e"], + [36764, 0, "s"], + [36765, 0, "e"], + [36766, 0, "n"], + [36767, 0, "c"], + [36768, 0, "e"], + [36769, 0, " "], + [36770, 0, "s"], + [36771, 0, "e"], + [36772, 0, "t"], + [36773, 0, ","], + [36774, 0, " "], + [36775, 0, "a"], + [36776, 0, "n"], + [36777, 0, "d"], + [36778, 0, " "], + [36779, 0, "f"], + [36780, 0, "i"], + [36781, 0, "n"], + [36782, 0, "a"], + [36783, 0, "l"], + [36784, 0, "l"], + [36785, 0, "y"], + [36786, 0, " "], + [36787, 0, "i"], + [36788, 0, "n"], + [36789, 0, "c"], + [36790, 0, "o"], + [36791, 0, "r"], + [36792, 0, "p"], + [36793, 0, "o"], + [36794, 0, "r"], + [36795, 0, "a"], + [36796, 0, "t"], + [36797, 0, "i"], + [36798, 0, "n"], + [36799, 0, "g"], + [36800, 0, " "], + [36801, 0, "t"], + [36802, 0, "h"], + [36803, 0, "e"], + [36804, 0, " "], + [36805, 0, "n"], + [36806, 0, "e"], + [36807, 0, "w"], + [36808, 0, " "], + [36809, 0, "v"], + [36810, 0, "a"], + [36811, 0, "l"], + [36812, 0, "u"], + [36813, 0, "e"], + [36814, 0, " "], + [36815, 0, "i"], + [36816, 0, "n"], + [36817, 0, "t"], + [36818, 0, "o"], + [36819, 0, " "], + [36820, 0, "t"], + [36821, 0, "h"], + [36822, 0, "e"], + [36823, 0, " "], + [36824, 0, "t"], + [36825, 0, "r"], + [36826, 0, "e"], + [36827, 0, "e"], + [36828, 0, " "], + [36829, 0, "o"], + [36830, 0, "f"], + [36831, 0, " "], + [36832, 0, "l"], + [36833, 0, "o"], + [36834, 0, "c"], + [36835, 0, "a"], + [36836, 0, "l"], + [36837, 0, " "], + [36838, 0, "s"], + [36839, 0, "t"], + [36840, 0, "a"], + [36841, 0, "t"], + [36842, 0, "e"], + [36843, 0, "."], + [36845, 0, "\n"], + [36846, 0, "\n"], + [36846, 0, "T"], + [36847, 0, "h"], + [36848, 0, "e"], + [36849, 0, " "], + [36850, 0, "$"], + [36851, 0, "\\"], + [36852, 0, "t"], + [36853, 0, "e"], + [36854, 0, "x"], + [36855, 0, "t"], + [36856, 0, "s"], + [36857, 0, "c"], + [36858, 0, "{"], + [36859, 0, "I"], + [36860, 0, "n"], + [36861, 0, "s"], + [36862, 0, "e"], + [36863, 0, "r"], + [36864, 0, "t"], + [36865, 0, "}"], + [36866, 0, "_"], + [36867, 0, "{"], + [36868, 0, "1"], + [36869, 0, ","], + [36870, 0, "2"], + [36871, 0, "}"], + [36872, 0, "$"], + [36873, 0, " "], + [36874, 0, "r"], + [36875, 0, "u"], + [36876, 0, "l"], + [36877, 0, "e"], + [36878, 0, "s"], + [36879, 0, " "], + [36880, 0, "h"], + [36881, 0, "a"], + [36882, 0, "n"], + [36883, 0, "d"], + [36884, 0, "l"], + [36885, 0, "e"], + [36886, 0, " "], + [36887, 0, "i"], + [36888, 0, "n"], + [36889, 0, "s"], + [36890, 0, "e"], + [36891, 0, "r"], + [36892, 0, "t"], + [36893, 0, "i"], + [36894, 0, "o"], + [36895, 0, "n"], + [36896, 0, " "], + [36897, 0, "o"], + [36898, 0, "f"], + [36899, 0, " "], + [36900, 0, "a"], + [36901, 0, " "], + [36902, 0, "n"], + [36903, 0, "e"], + [36904, 0, "w"], + [36905, 0, " "], + [36906, 0, "e"], + [36907, 0, "l"], + [36908, 0, "e"], + [36909, 0, "m"], + [36910, 0, "e"], + [36911, 0, "n"], + [36912, 0, "t"], + [36913, 0, " "], + [36914, 0, "i"], + [36915, 0, "n"], + [36916, 0, "t"], + [36917, 0, "o"], + [36918, 0, " "], + [36919, 0, "a"], + [36920, 0, "n"], + [36921, 0, " "], + [36922, 0, "o"], + [36923, 0, "r"], + [36924, 0, "d"], + [36925, 0, "e"], + [36926, 0, "r"], + [36927, 0, "e"], + [36928, 0, "d"], + [36929, 0, " "], + [36930, 0, "l"], + [36931, 0, "i"], + [36932, 0, "s"], + [36933, 0, "t"], + [36934, 0, "."], + [36935, 0, " "], + [36936, 0, "I"], + [36937, 0, "n"], + [36938, 0, " "], + [36939, 0, "t"], + [36940, 0, "h"], + [36941, 0, "i"], + [36942, 0, "s"], + [36943, 0, " "], + [36944, 0, "c"], + [36945, 0, "a"], + [36946, 0, "s"], + [36947, 0, "e"], + [36948, 0, ","], + [36949, 0, " "], + [36950, 0, "t"], + [36951, 0, "h"], + [36952, 0, "e"], + [36953, 0, " "], + [36954, 0, "c"], + [36955, 0, "u"], + [36956, 0, "r"], + [36957, 0, "s"], + [36958, 0, "o"], + [36959, 0, "r"], + [36960, 0, " "], + [36961, 0, "r"], + [36962, 0, "e"], + [36963, 0, "v"], + [36963, 1], + [36963, 0, "f"], + [36964, 0, "e"], + [36965, 0, "r"], + [36966, 0, "s"], + [36967, 0, " "], + [36968, 0, "t"], + [36969, 0, "o"], + [36970, 0, " "], + [36971, 0, "t"], + [36972, 0, "h"], + [36973, 0, "e"], + [36974, 0, " "], + [36975, 0, "l"], + [36976, 0, "i"], + [36977, 0, "s"], + [36978, 0, "t"], + [36979, 0, " "], + [36980, 0, "e"], + [36981, 0, "l"], + [36982, 0, "e"], + [36983, 0, "m"], + [36984, 0, "e"], + [36985, 0, "n"], + [36986, 0, "t"], + [36987, 0, " "], + [36988, 0, "$"], + [36989, 0, "\\"], + [36990, 0, "m"], + [36991, 0, "a"], + [36992, 0, "t"], + [36993, 0, "h"], + [36994, 0, "i"], + [36995, 0, "t"], + [36996, 0, "{"], + [36997, 0, "p"], + [36998, 0, "r"], + [36999, 0, "e"], + [37000, 0, "v"], + [37001, 0, "}"], + [37002, 0, "$"], + [37003, 0, ","], + [37004, 0, " "], + [37005, 0, "a"], + [37006, 0, "n"], + [37007, 0, "d"], + [37008, 0, " "], + [37009, 0, "t"], + [37010, 0, "h"], + [37011, 0, "e"], + [37012, 0, " "], + [37013, 0, "n"], + [37014, 0, "e"], + [37015, 0, "w"], + [37016, 0, " "], + [37017, 0, "e"], + [37018, 0, "l"], + [37019, 0, "e"], + [37020, 0, "m"], + [37021, 0, "e"], + [37022, 0, "n"], + [37023, 0, "t"], + [37024, 0, " "], + [37025, 0, "i"], + [37026, 0, "s"], + [37027, 0, " "], + [37028, 0, "i"], + [37029, 0, "n"], + [37030, 0, "s"], + [37031, 0, "e"], + [37032, 0, "r"], + [37033, 0, "t"], + [37034, 0, "e"], + [37035, 0, "d"], + [37036, 0, " "], + [37037, 0, "a"], + [37038, 0, "f"], + [37039, 0, "t"], + [37040, 0, "e"], + [37041, 0, "r"], + [37042, 0, " "], + [37043, 0, "t"], + [37044, 0, "h"], + [37045, 0, "a"], + [37046, 0, "t"], + [37047, 0, " "], + [37048, 0, "p"], + [37049, 0, "o"], + [37050, 0, "s"], + [37051, 0, "i"], + [37052, 0, "t"], + [37053, 0, "i"], + [37054, 0, "o"], + [37055, 0, "n"], + [37056, 0, " "], + [37057, 0, "i"], + [37058, 0, "n"], + [37059, 0, " "], + [37060, 0, "t"], + [37061, 0, "h"], + [37062, 0, "e"], + [37063, 0, " "], + [37064, 0, "l"], + [37065, 0, "i"], + [37066, 0, "s"], + [37067, 0, "t"], + [37068, 0, "."], + [37069, 0, " "], + [37070, 0, "T"], + [37071, 0, "h"], + [37072, 0, "e"], + [37073, 0, " "], + [37073, 1], + [37072, 1], + [37071, 1], + [37070, 1], + [37070, 0, "$"], + [37071, 0, "\\"], + [37072, 0, "t"], + [37073, 0, "e"], + [37074, 0, "x"], + [37075, 0, "t"], + [37076, 0, "s"], + [37077, 0, "c"], + [37078, 0, "{"], + [37079, 0, "I"], + [37080, 0, "n"], + [37081, 0, "s"], + [37082, 0, "e"], + [37083, 0, "r"], + [37084, 0, "t"], + [37085, 0, "}"], + [37086, 0, "_"], + [37087, 0, "1"], + [37088, 0, "$"], + [37089, 0, " "], + [37090, 0, "p"], + [37091, 0, "e"], + [37092, 0, "r"], + [37093, 0, "f"], + [37094, 0, "o"], + [37095, 0, "r"], + [37096, 0, "m"], + [37097, 0, "s"], + [37098, 0, " "], + [37099, 0, "t"], + [37100, 0, "h"], + [37101, 0, "e"], + [37102, 0, " "], + [37103, 0, "i"], + [37104, 0, "n"], + [37105, 0, "s"], + [37106, 0, "e"], + [37107, 0, "r"], + [37108, 0, "t"], + [37109, 0, "i"], + [37110, 0, "o"], + [37111, 0, "n"], + [37112, 0, " "], + [37113, 0, "b"], + [37114, 0, "y"], + [37115, 0, " "], + [37116, 0, "m"], + [37117, 0, "a"], + [37118, 0, "n"], + [37119, 0, "i"], + [37120, 0, "p"], + [37121, 0, "u"], + [37122, 0, "l"], + [37123, 0, "a"], + [37124, 0, "t"], + [37125, 0, "i"], + [37126, 0, "n"], + [37127, 0, "g"], + [37128, 0, " "], + [37129, 0, "t"], + [37130, 0, "h"], + [37131, 0, "e"], + [37132, 0, " "], + [37133, 0, "l"], + [37134, 0, "i"], + [37135, 0, "n"], + [37136, 0, "k"], + [37137, 0, "e"], + [37138, 0, "d"], + [37139, 0, " "], + [37140, 0, "l"], + [37141, 0, "i"], + [37142, 0, "s"], + [37143, 0, "t"], + [37144, 0, " "], + [37145, 0, "s"], + [37146, 0, "t"], + [37147, 0, "r"], + [37148, 0, "u"], + [37149, 0, "c"], + [37150, 0, "t"], + [37151, 0, "u"], + [37152, 0, "r"], + [37153, 0, "e"], + [37154, 0, ","], + [37155, 0, " "], + [37156, 0, "a"], + [37157, 0, "n"], + [37157, 1], + [37156, 1], + [37155, 1], + [37154, 1], + [37154, 0, "."], + [37155, 0, " "], + [37156, 0, "$"], + [37157, 0, "\\"], + [37158, 0, "t"], + [37159, 0, "e"], + [37160, 0, "x"], + [37161, 0, "t"], + [37162, 0, "s"], + [37163, 0, "c"], + [37164, 0, "{"], + [37165, 0, "I"], + [37166, 0, "n"], + [37167, 0, "s"], + [37168, 0, "e"], + [37169, 0, "r"], + [37170, 0, "t"], + [37171, 0, "}"], + [37172, 0, "_"], + [37173, 0, "2"], + [37174, 0, "$"], + [37175, 0, " "], + [37176, 0, "h"], + [37177, 0, "a"], + [37178, 0, "n"], + [37179, 0, "d"], + [37180, 0, "l"], + [37181, 0, "e"], + [37182, 0, "s"], + [37183, 0, " "], + [37184, 0, "t"], + [37185, 0, "h"], + [37186, 0, "e"], + [37187, 0, " "], + [37188, 0, "c"], + [37189, 0, "a"], + [37190, 0, "s"], + [37191, 0, "e"], + [37192, 0, " "], + [37193, 0, "o"], + [37194, 0, "f"], + [37195, 0, " "], + [37196, 0, "m"], + [37197, 0, "u"], + [37198, 0, "l"], + [37199, 0, "t"], + [37200, 0, "i"], + [37201, 0, "p"], + [37202, 0, "l"], + [37203, 0, "e"], + [37204, 0, " "], + [37205, 0, "p"], + [37206, 0, "e"], + [37207, 0, "e"], + [37208, 0, "r"], + [37209, 0, "s"], + [37210, 0, " "], + [37211, 0, "c"], + [37212, 0, "o"], + [37213, 0, "n"], + [37214, 0, "c"], + [37215, 0, "u"], + [37216, 0, "r"], + [37217, 0, "r"], + [37218, 0, "e"], + [37219, 0, "n"], + [37220, 0, "t"], + [37221, 0, "l"], + [37222, 0, "y"], + [37223, 0, " "], + [37224, 0, "i"], + [37225, 0, "n"], + [37226, 0, "s"], + [37227, 0, "e"], + [37228, 0, "r"], + [37229, 0, "t"], + [37230, 0, "i"], + [37231, 0, "n"], + [37232, 0, "g"], + [37233, 0, " "], + [37234, 0, "l"], + [37235, 0, "i"], + [37236, 0, "s"], + [37237, 0, "t"], + [37238, 0, " "], + [37239, 0, "e"], + [37240, 0, "l"], + [37241, 0, "e"], + [37242, 0, "m"], + [37243, 0, "e"], + [37244, 0, "n"], + [37245, 0, "t"], + [37246, 0, "s"], + [37247, 0, " "], + [37248, 0, "a"], + [37249, 0, "t"], + [37250, 0, " "], + [37251, 0, "t"], + [37252, 0, "h"], + [37253, 0, "e"], + [37254, 0, " "], + [37255, 0, "s"], + [37256, 0, "a"], + [37257, 0, "m"], + [37258, 0, "e"], + [37259, 0, " "], + [37260, 0, "p"], + [37261, 0, "o"], + [37262, 0, "s"], + [37263, 0, "i"], + [37264, 0, "t"], + [37265, 0, "i"], + [37266, 0, "o"], + [37267, 0, "n"], + [37268, 0, ","], + [37269, 0, " "], + [37270, 0, "a"], + [37271, 0, "n"], + [37272, 0, "d"], + [37273, 0, " "], + [37274, 0, "e"], + [37275, 0, "n"], + [37276, 0, "s"], + [37277, 0, "u"], + [37278, 0, "r"], + [37279, 0, "e"], + [37280, 0, "s"], + [37281, 0, " "], + [37282, 0, "a"], + [37283, 0, " "], + [37284, 0, "c"], + [37285, 0, "o"], + [37286, 0, "n"], + [37287, 0, "s"], + [37288, 0, "i"], + [37289, 0, "s"], + [37290, 0, "t"], + [37291, 0, "e"], + [37292, 0, "n"], + [37293, 0, "t"], + [37294, 0, " "], + [37295, 0, "o"], + [37296, 0, "r"], + [37297, 0, "d"], + [37298, 0, "e"], + [37299, 0, "r"], + [37300, 0, " "], + [37301, 0, "b"], + [37302, 0, "y"], + [37303, 0, " "], + [37304, 0, "o"], + [37304, 1], + [37304, 0, "l"], + [37305, 0, "o"], + [37306, 0, "c"], + [37307, 0, "a"], + [37308, 0, "t"], + [37309, 0, "i"], + [37310, 0, "n"], + [37311, 0, "g"], + [37312, 0, " "], + [37312, 1], + [37311, 1], + [37310, 1], + [37309, 1], + [37308, 1], + [37307, 1], + [37306, 1], + [37305, 1], + [37304, 1], + [37303, 1], + [37302, 1], + [37301, 1], + [37300, 1], + [37299, 1], + [37298, 1], + [37297, 1], + [37296, 1], + [37295, 1], + [37294, 1], + [37293, 1], + [37292, 1], + [37291, 1], + [37290, 1], + [37289, 1], + [37288, 1], + [37287, 1], + [37286, 1], + [37285, 1], + [37284, 1], + [37283, 1], + [37282, 1], + [37281, 1], + [37280, 1], + [37279, 1], + [37278, 1], + [37277, 1], + [37276, 1], + [37275, 1], + [37274, 1], + [37274, 0, "u"], + [37275, 0, "s"], + [37276, 0, "e"], + [37277, 0, "s"], + [37278, 0, " "], + [37279, 0, "t"], + [37280, 0, "h"], + [37281, 0, "e"], + [37282, 0, " "], + [37283, 0, "o"], + [37284, 0, "r"], + [37285, 0, "d"], + [37286, 0, "e"], + [37287, 0, "r"], + [37288, 0, "i"], + [37289, 0, "n"], + [37290, 0, "g"], + [37291, 0, " "], + [37292, 0, "r"], + [37293, 0, "e"], + [37294, 0, "l"], + [37295, 0, "a"], + [37296, 0, "t"], + [37297, 0, "i"], + [37298, 0, "o"], + [37299, 0, "n"], + [37300, 0, " "], + [37301, 0, "$"], + [37302, 0, "<"], + [37303, 0, "$"], + [37304, 0, " "], + [37305, 0, "o"], + [37306, 0, "n"], + [37307, 0, " "], + [37308, 0, "L"], + [37309, 0, "a"], + [37310, 0, "m"], + [37311, 0, "p"], + [37312, 0, "o"], + [37313, 0, "r"], + [37314, 0, "t"], + [37315, 0, " "], + [37316, 0, "t"], + [37317, 0, "i"], + [37318, 0, "m"], + [37319, 0, "e"], + [37320, 0, "s"], + [37321, 0, "t"], + [37322, 0, "a"], + [37323, 0, "m"], + [37324, 0, "p"], + [37325, 0, "s"], + [37326, 0, " "], + [37327, 0, "t"], + [37328, 0, "o"], + [37329, 0, " "], + [37330, 0, "d"], + [37331, 0, "e"], + [37332, 0, "t"], + [37333, 0, "e"], + [37334, 0, "r"], + [37335, 0, "m"], + [37336, 0, "i"], + [37337, 0, "n"], + [37338, 0, "e"], + [37339, 0, " "], + [37340, 0, "t"], + [37341, 0, "h"], + [37342, 0, "e"], + [37343, 0, " "], + [37344, 0, "i"], + [37345, 0, "n"], + [37346, 0, "s"], + [37347, 0, "e"], + [37348, 0, "r"], + [37349, 0, "t"], + [37350, 0, "i"], + [37351, 0, "o"], + [37352, 0, "n"], + [37353, 0, " "], + [37354, 0, "p"], + [37355, 0, "o"], + [37356, 0, "i"], + [37357, 0, "n"], + [37358, 0, "t"], + [37359, 0, "."], + [37359, 0, " "], + [37359, 1], + [37330, 0, "c"], + [37331, 0, "o"], + [37332, 0, "n"], + [37333, 0, "s"], + [37334, 0, "i"], + [37335, 0, "s"], + [37336, 0, "t"], + [37337, 0, "e"], + [37338, 0, "n"], + [37339, 0, "t"], + [37340, 0, "l"], + [37341, 0, "y"], + [37342, 0, " "], + [37373, 0, " "], + [37374, 0, "W"], + [37375, 0, "e"], + [37376, 0, " "], + [37377, 0, "s"], + [37378, 0, "h"], + [37379, 0, "o"], + [37380, 0, "w"], + [37381, 0, " "], + [37382, 0, "l"], + [37383, 0, "a"], + [37384, 0, "t"], + [37385, 0, "e"], + [37386, 0, "r"], + [37387, 0, " "], + [37388, 0, "t"], + [37389, 0, "h"], + [37390, 0, "a"], + [37391, 0, "t"], + [37392, 0, " "], + [37393, 0, "t"], + [37394, 0, "h"], + [37395, 0, "e"], + [37396, 0, "s"], + [37397, 0, "e"], + [37398, 0, " "], + [37399, 0, "r"], + [37400, 0, "u"], + [37401, 0, "l"], + [37402, 0, "e"], + [37403, 0, "s"], + [37404, 0, " "], + [37405, 0, "e"], + [37406, 0, "n"], + [37407, 0, "s"], + [37408, 0, "u"], + [37409, 0, "r"], + [37410, 0, "e"], + [37411, 0, " "], + [37412, 0, "a"], + [37413, 0, "l"], + [37414, 0, "l"], + [37415, 0, " "], + [37416, 0, "p"], + [37417, 0, "e"], + [37418, 0, "e"], + [37419, 0, "r"], + [37420, 0, "s"], + [37421, 0, " "], + [37422, 0, "c"], + [37423, 0, "o"], + [37424, 0, "n"], + [37425, 0, "v"], + [37426, 0, "e"], + [37427, 0, "r"], + [37428, 0, "g"], + [37429, 0, "e"], + [37430, 0, " "], + [37431, 0, "t"], + [37432, 0, "o"], + [37433, 0, "w"], + [37434, 0, "a"], + [37435, 0, "r"], + [37436, 0, "d"], + [37437, 0, "s"], + [37438, 0, " "], + [37439, 0, "t"], + [37440, 0, "h"], + [37441, 0, "e"], + [37442, 0, " "], + [37443, 0, "s"], + [37444, 0, "a"], + [37445, 0, "m"], + [37446, 0, "e"], + [37447, 0, " "], + [37448, 0, "s"], + [37449, 0, "t"], + [37450, 0, "a"], + [37451, 0, "t"], + [37452, 0, "e"], + [37453, 0, "."], + [37455, 0, "\n"], + [37455, 0, "\n"], + [37456, 0, "\\"], + [37457, 0, "s"], + [37458, 0, "u"], + [37459, 0, "b"], + [37460, 0, "s"], + [37461, 0, "u"], + [37462, 0, "b"], + [37463, 0, "s"], + [37464, 0, "e"], + [37465, 0, "c"], + [37466, 0, "t"], + [37467, 0, "i"], + [37468, 0, "o"], + [37469, 0, "n"], + [37470, 0, "{"], + [37471, 0, "C"], + [37472, 0, "l"], + [37473, 0, "e"], + [37474, 0, "a"], + [37475, 0, "r"], + [37476, 0, "i"], + [37477, 0, "n"], + [37478, 0, "g"], + [37479, 0, " "], + [37480, 0, "p"], + [37481, 0, "r"], + [37482, 0, "i"], + [37483, 0, "o"], + [37484, 0, "r"], + [37485, 0, " "], + [37486, 0, "s"], + [37487, 0, "t"], + [37488, 0, "a"], + [37489, 0, "t"], + [37490, 0, "e"], + [37491, 0, "}"], + [42388, 0, "A"], + [42389, 0, "s"], + [42390, 0, "s"], + [42391, 0, "i"], + [42392, 0, "g"], + [42393, 0, "n"], + [42394, 0, "m"], + [42395, 0, "e"], + [42396, 0, "n"], + [42397, 0, "t"], + [42398, 0, " "], + [42399, 0, "a"], + [42400, 0, "n"], + [42401, 0, "d"], + [42402, 0, " "], + [42403, 0, "d"], + [42404, 0, "e"], + [42405, 0, "l"], + [42406, 0, "e"], + [42407, 0, "t"], + [42408, 0, "i"], + [42409, 0, "o"], + [42410, 0, "n"], + [42411, 0, " "], + [42412, 0, "o"], + [42413, 0, "p"], + [42414, 0, "e"], + [42415, 0, "r"], + [42416, 0, "a"], + [42417, 0, "t"], + [42418, 0, "i"], + [42419, 0, "o"], + [42420, 0, "n"], + [42421, 0, "s"], + [42422, 0, " "], + [42423, 0, "r"], + [42424, 0, "e"], + [42425, 0, "q"], + [42426, 0, "u"], + [42427, 0, "i"], + [42428, 0, "r"], + [42429, 0, "e"], + [42430, 0, " "], + [42431, 0, "t"], + [42432, 0, "h"], + [42433, 0, "a"], + [42434, 0, "t"], + [42435, 0, " "], + [42436, 0, "p"], + [42437, 0, "r"], + [42438, 0, "i"], + [42439, 0, "o"], + [42440, 0, "r"], + [42441, 0, " "], + [42442, 0, "s"], + [42443, 0, "t"], + [42444, 0, "a"], + [42445, 0, "t"], + [42446, 0, "e"], + [42447, 0, " "], + [42448, 0, "("], + [42449, 0, "t"], + [42450, 0, "h"], + [42451, 0, "e"], + [42452, 0, " "], + [42453, 0, "v"], + [42454, 0, "a"], + [42455, 0, "l"], + [42456, 0, "u"], + [42457, 0, "e"], + [42458, 0, " "], + [42459, 0, "b"], + [42460, 0, "e"], + [42461, 0, "i"], + [42462, 0, "n"], + [42463, 0, "g"], + [42464, 0, " "], + [42465, 0, "o"], + [42466, 0, "v"], + [42467, 0, "e"], + [42468, 0, "r"], + [42469, 0, "w"], + [42470, 0, "r"], + [42471, 0, "i"], + [42472, 0, "t"], + [42473, 0, "t"], + [42474, 0, "e"], + [42475, 0, "n"], + [42476, 0, " "], + [42477, 0, "o"], + [42478, 0, "r"], + [42479, 0, " "], + [42480, 0, "d"], + [42481, 0, "e"], + [42482, 0, "l"], + [42483, 0, "e"], + [42484, 0, "t"], + [42485, 0, "e"], + [42486, 0, "d"], + [42487, 0, ")"], + [42488, 0, " "], + [42489, 0, "i"], + [42490, 0, "s"], + [42491, 0, " "], + [42492, 0, "c"], + [42493, 0, "l"], + [42494, 0, "e"], + [42495, 0, "a"], + [42496, 0, "r"], + [42497, 0, "e"], + [42498, 0, "d"], + [42499, 0, " "], + [42499, 1], + [42499, 0, ","], + [42500, 0, " "], + [42501, 0, "w"], + [42502, 0, "h"], + [42503, 0, "i"], + [42504, 0, "l"], + [42505, 0, "e"], + [42506, 0, " "], + [42507, 0, "a"], + [42508, 0, "l"], + [42509, 0, "s"], + [42510, 0, "o"], + [42511, 0, " "], + [42512, 0, "e"], + [42513, 0, "n"], + [42514, 0, "s"], + [42515, 0, "u"], + [42516, 0, "r"], + [42517, 0, "i"], + [42518, 0, "n"], + [42519, 0, "g"], + [42520, 0, " "], + [42521, 0, "t"], + [42522, 0, "h"], + [42523, 0, "a"], + [42524, 0, "t"], + [42525, 0, " "], + [42526, 0, "c"], + [42527, 0, "o"], + [42528, 0, "n"], + [42529, 0, "c"], + [42530, 0, "u"], + [42531, 0, "r"], + [42532, 0, "r"], + [42533, 0, "e"], + [42534, 0, "m"], + [42534, 1], + [42534, 0, "n"], + [42535, 0, "t"], + [42536, 0, " "], + [42537, 0, "m"], + [42538, 0, "o"], + [42539, 0, "d"], + [42540, 0, "i"], + [42541, 0, "f"], + [42542, 0, "i"], + [42543, 0, "c"], + [42544, 0, "a"], + [42545, 0, "t"], + [42546, 0, "i"], + [42547, 0, "o"], + [42548, 0, "n"], + [42549, 0, "s"], + [42550, 0, " "], + [42551, 0, "a"], + [42552, 0, "r"], + [42553, 0, "e"], + [42554, 0, " "], + [42555, 0, "n"], + [42556, 0, "o"], + [42557, 0, "t"], + [42558, 0, " "], + [42559, 0, "l"], + [42560, 0, "o"], + [42561, 0, "s"], + [42562, 0, "t"], + [42563, 0, "."], + [42564, 0, " "], + [42565, 0, "T"], + [42566, 0, "h"], + [42567, 0, "e"], + [42568, 0, " "], + [42569, 0, "r"], + [42570, 0, "u"], + [42571, 0, "l"], + [42572, 0, "e"], + [42573, 0, "s"], + [42574, 0, " "], + [42575, 0, "t"], + [42576, 0, "o"], + [42577, 0, " "], + [42578, 0, "h"], + [42579, 0, "a"], + [42580, 0, "n"], + [42581, 0, "d"], + [42582, 0, "l"], + [42583, 0, "e"], + [42584, 0, " "], + [42585, 0, "t"], + [42586, 0, "h"], + [42587, 0, "i"], + [42588, 0, "s"], + [42589, 0, " "], + [42590, 0, "c"], + [42591, 0, "l"], + [42592, 0, "e"], + [42593, 0, "a"], + [42594, 0, "r"], + [42595, 0, "i"], + [42596, 0, "n"], + [42597, 0, "g"], + [42598, 0, " "], + [42599, 0, "p"], + [42600, 0, "r"], + [42601, 0, "o"], + [42602, 0, "c"], + [42603, 0, "e"], + [42604, 0, "s"], + [42605, 0, "s"], + [42606, 0, " "], + [42607, 0, "a"], + [42608, 0, "r"], + [42609, 0, "e"], + [42610, 0, " "], + [42611, 0, "g"], + [42612, 0, "i"], + [42613, 0, "v"], + [42614, 0, "e"], + [42615, 0, "n"], + [42616, 0, " "], + [42617, 0, "i"], + [42618, 0, "n"], + [42619, 0, " "], + [42620, 0, "F"], + [42621, 0, "i"], + [42622, 0, "g"], + [42623, 0, "u"], + [42624, 0, "r"], + [42625, 0, "e"], + [42626, 0, "~"], + [42627, 0, "\\"], + [42628, 0, "r"], + [42629, 0, "e"], + [42630, 0, "f"], + [42631, 0, "{"], + [42632, 0, "f"], + [42633, 0, "i"], + [42634, 0, "g"], + [42635, 0, ":"], + [42636, 0, "c"], + [42637, 0, "l"], + [42638, 0, "e"], + [42639, 0, "a"], + [42640, 0, "r"], + [42641, 0, "-"], + [42642, 0, "r"], + [42643, 0, "u"], + [42644, 0, "l"], + [42645, 0, "e"], + [42646, 0, "s"], + [42647, 0, "}"], + [42648, 0, "."], + [42649, 0, " "], + [42650, 0, "I"], + [42651, 0, "n"], + [42652, 0, "t"], + [42653, 0, "u"], + [42654, 0, "i"], + [42655, 0, "t"], + [42656, 0, "i"], + [42657, 0, "v"], + [42658, 0, "e"], + [42659, 0, "l"], + [42660, 0, "y"], + [42661, 0, ","], + [42662, 0, " "], + [42663, 0, "t"], + [42664, 0, "h"], + [42665, 0, "e"], + [42666, 0, " "], + [42667, 0, "e"], + [42668, 0, "f"], + [42669, 0, "f"], + [42670, 0, "e"], + [42671, 0, "c"], + [42672, 0, "t"], + [42673, 0, " "], + [42674, 0, "o"], + [42675, 0, "f"], + [42676, 0, " "], + [42677, 0, "c"], + [42678, 0, "l"], + [42679, 0, "e"], + [42680, 0, "a"], + [42681, 0, "r"], + [42682, 0, "i"], + [42683, 0, "n"], + [42684, 0, "g"], + [42685, 0, " "], + [42686, 0, "s"], + [42687, 0, "o"], + [42688, 0, "m"], + [42689, 0, "e"], + [42690, 0, "t"], + [42691, 0, "h"], + [42692, 0, "i"], + [42693, 0, "n"], + [42694, 0, "g"], + [42695, 0, " "], + [42696, 0, "i"], + [42697, 0, "s"], + [42698, 0, " "], + [42699, 0, "t"], + [42700, 0, "o"], + [42701, 0, " "], + [42702, 0, "r"], + [42703, 0, "e"], + [42704, 0, "s"], + [42705, 0, "e"], + [42706, 0, "t"], + [42707, 0, " "], + [42708, 0, "i"], + [42709, 0, "t"], + [42710, 0, " "], + [42711, 0, "t"], + [42712, 0, "o"], + [42713, 0, " "], + [42714, 0, "i"], + [42715, 0, "t"], + [42716, 0, "s"], + [42717, 0, " "], + [42718, 0, "e"], + [42719, 0, "m"], + [42720, 0, "p"], + [42721, 0, "t"], + [42722, 0, "y"], + [42723, 0, " "], + [42724, 0, "s"], + [42725, 0, "t"], + [42726, 0, "a"], + [42727, 0, "t"], + [42728, 0, "e"], + [42729, 0, " "], + [42730, 0, "b"], + [42731, 0, "y"], + [42732, 0, " "], + [42733, 0, "u"], + [42734, 0, "n"], + [42735, 0, "d"], + [42736, 0, "o"], + [42737, 0, "i"], + [42738, 0, "n"], + [42739, 0, "g"], + [42740, 0, " "], + [42741, 0, "a"], + [42742, 0, "n"], + [42743, 0, "y"], + [42744, 0, " "], + [42745, 0, "o"], + [42746, 0, "p"], + [42747, 0, "e"], + [42748, 0, "r"], + [42749, 0, "a"], + [42750, 0, "t"], + [42751, 0, "i"], + [42752, 0, "o"], + [42753, 0, "n"], + [42754, 0, "s"], + [42755, 0, " "], + [42756, 0, "t"], + [42757, 0, "h"], + [42758, 0, "a"], + [42759, 0, "t"], + [42760, 0, " "], + [42761, 0, "c"], + [42762, 0, "a"], + [42763, 0, "u"], + [42764, 0, "s"], + [42765, 0, "a"], + [42766, 0, "l"], + [42767, 0, "l"], + [42768, 0, "y"], + [42769, 0, " "], + [42770, 0, "p"], + [42771, 0, "r"], + [42772, 0, "e"], + [42773, 0, "d"], + [42773, 1], + [42773, 0, "c"], + [42774, 0, "e"], + [42775, 0, "d"], + [42776, 0, "e"], + [42777, 0, " "], + [42778, 0, "t"], + [42779, 0, "h"], + [42780, 0, "e"], + [42781, 0, " "], + [42782, 0, "c"], + [42783, 0, "u"], + [42784, 0, "r"], + [42785, 0, "r"], + [42786, 0, "e"], + [42787, 0, "n"], + [42788, 0, "t"], + [42789, 0, " "], + [42790, 0, "o"], + [42791, 0, "p"], + [42792, 0, "e"], + [42793, 0, "r"], + [42794, 0, "a"], + [42795, 0, "t"], + [42796, 0, "i"], + [42797, 0, "o"], + [42798, 0, "n"], + [42799, 0, ","], + [42800, 0, " "], + [42801, 0, "w"], + [42802, 0, "h"], + [42803, 0, "i"], + [42804, 0, "l"], + [42805, 0, "e"], + [42806, 0, " "], + [42807, 0, "l"], + [42808, 0, "e"], + [42809, 0, "a"], + [42810, 0, "v"], + [42811, 0, "i"], + [42812, 0, "n"], + [42813, 0, "g"], + [42814, 0, " "], + [42815, 0, "a"], + [42816, 0, "n"], + [42817, 0, "y"], + [42818, 0, " "], + [42819, 0, "c"], + [42820, 0, "o"], + [42821, 0, "n"], + [42822, 0, "c"], + [42823, 0, "u"], + [42824, 0, "r"], + [42825, 0, "r"], + [42826, 0, "e"], + [42827, 0, "n"], + [42828, 0, "t"], + [42829, 0, " "], + [42830, 0, "o"], + [42831, 0, "p"], + [42832, 0, "e"], + [42833, 0, "r"], + [42834, 0, "a"], + [42835, 0, "t"], + [42836, 0, "i"], + [42837, 0, "o"], + [42838, 0, "n"], + [42839, 0, "s"], + [42815, 0, "t"], + [42816, 0, "h"], + [42817, 0, "e"], + [42818, 0, " "], + [42819, 0, "e"], + [42820, 0, "f"], + [42821, 0, "f"], + [42822, 0, "e"], + [42823, 0, "c"], + [42824, 0, "t"], + [42825, 0, " "], + [42826, 0, "o"], + [42827, 0, "f"], + [42828, 0, " "], + [42854, 0, " "], + [42855, 0, "u"], + [42856, 0, "n"], + [42857, 0, "t"], + [42858, 0, "o"], + [42859, 0, "u"], + [42860, 0, "c"], + [42861, 0, "h"], + [42862, 0, "e"], + [42863, 0, "d"], + [42864, 0, "."], + [42865, 0, "\n"], + [42866, 0, "\n"], + [42867, 0, "T"], + [42868, 0, "h"], + [42869, 0, "e"], + [42870, 0, " "], + [42871, 0, "\\"], + [42872, 0, "t"], + [42873, 0, "e"], + [42874, 0, "x"], + [42875, 0, "t"], + [42876, 0, "s"], + [42877, 0, "c"], + [42878, 0, "{"], + [42879, 0, "D"], + [42880, 0, "e"], + [42881, 0, "l"], + [42882, 0, "e"], + [42883, 0, "t"], + [42884, 0, "e"], + [42885, 0, "}"], + [42886, 0, " "], + [42887, 0, "r"], + [42888, 0, "u"], + [42889, 0, "l"], + [42890, 0, "e"], + [42891, 0, " "], + [42892, 0, "s"], + [42893, 0, "h"], + [42894, 0, "o"], + [42895, 0, "w"], + [42896, 0, "s"], + [42897, 0, " "], + [42898, 0, "h"], + [42899, 0, "o"], + [42900, 0, "w"], + [42901, 0, " "], + [42902, 0, "t"], + [42903, 0, "h"], + [42904, 0, "e"], + [42905, 0, " "], + [42906, 0, "\\"], + [42907, 0, "t"], + [42908, 0, "e"], + [42909, 0, "x"], + [42910, 0, "t"], + [42911, 0, "s"], + [42912, 0, "f"], + [42913, 0, "{"], + [42914, 0, "d"], + [42915, 0, "e"], + [42916, 0, "l"], + [42917, 0, "e"], + [42918, 0, "t"], + [42919, 0, "e"], + [42920, 0, "}"], + [42905, 1], + [42904, 1], + [42903, 1], + [42902, 1], + [42917, 0, " "], + [42918, 0, "o"], + [42919, 0, "p"], + [42920, 0, "e"], + [42921, 0, "r"], + [42922, 0, "a"], + [42923, 0, "t"], + [42924, 0, "i"], + [42925, 0, "o"], + [42926, 0, "n"], + [42927, 0, "s"], + [42928, 0, " "], + [42929, 0, "("], + [42930, 0, "w"], + [42931, 0, "h"], + [42932, 0, "i"], + [42933, 0, "c"], + [42934, 0, "h"], + [42935, 0, " "], + [42936, 0, "c"], + [42937, 0, "a"], + [42938, 0, "n"], + [42939, 0, " "], + [42940, 0, "b"], + [42941, 0, "e"], + [42942, 0, " "], + [42943, 0, "u"], + [42944, 0, "s"], + [42945, 0, "e"], + [42946, 0, "d"], + [42947, 0, " "], + [42948, 0, "t"], + [42949, 0, "o"], + [42950, 0, " "], + [42951, 0, "d"], + [42952, 0, "e"], + [42953, 0, "l"], + [42954, 0, "e"], + [42955, 0, "t"], + [42956, 0, "e"], + [42957, 0, " "], + [42958, 0, "e"], + [42959, 0, "i"], + [42960, 0, "t"], + [42961, 0, "h"], + [42962, 0, "e"], + [42963, 0, "r"], + [42964, 0, " "], + [42935, 1], + [42934, 1], + [42933, 1], + [42932, 1], + [42931, 1], + [42930, 1], + [42929, 1], + [42901, 1], + [42900, 1], + [42899, 1], + [42898, 1], + [42897, 1], + [42896, 1], + [42895, 1], + [42894, 1], + [42893, 1], + [42892, 1], + [42891, 1], + [42890, 1], + [42889, 1], + [42888, 1], + [42887, 1], + [42886, 1], + [42885, 1], + [42884, 1], + [42883, 1], + [42882, 1], + [42881, 1], + [42880, 1], + [42879, 1], + [42878, 1], + [42877, 1], + [42876, 1], + [42875, 1], + [42874, 1], + [42873, 1], + [42872, 1], + [42871, 1], + [42870, 1], + [42869, 1], + [42868, 1], + [42867, 1], + [42867, 0, "A"], + [42868, 0, " "], + [42894, 1], + [42924, 0, "a"], + [42925, 0, "n"], + [42926, 0, " "], + [42927, 0, "e"], + [42928, 0, "l"], + [42929, 0, "e"], + [42930, 0, "m"], + [42931, 0, "e"], + [42932, 0, "n"], + [42933, 0, "t"], + [42934, 0, " "], + [42935, 0, "f"], + [42936, 0, "r"], + [42937, 0, "o"], + [42938, 0, "m"], + [42939, 0, " "], + [42940, 0, "a"], + [42941, 0, "n"], + [42942, 0, " "], + [42943, 0, "o"], + [42944, 0, "r"], + [42945, 0, "d"], + [42946, 0, "e"], + [42947, 0, "r"], + [42948, 0, "e"], + [42949, 0, "d"], + [42950, 0, " "], + [42951, 0, "l"], + [42952, 0, "i"], + [42953, 0, "s"], + [42954, 0, "t"], + [42955, 0, " "], + [42956, 0, "o"], + [42957, 0, "r"], + [42958, 0, " "], + [42959, 0, "a"], + [42960, 0, " "], + [42961, 0, "k"], + [42962, 0, "e"], + [42963, 0, "y"], + [42964, 0, " "], + [42965, 0, "f"], + [42966, 0, "r"], + [42967, 0, "o"], + [42968, 0, "m"], + [42969, 0, " "], + [42970, 0, "a"], + [42971, 0, " "], + [42972, 0, "m"], + [42973, 0, "a"], + [42974, 0, "p"], + [42975, 0, ","], + [42976, 0, " "], + [42977, 0, "d"], + [42978, 0, "e"], + [42979, 0, "p"], + [42980, 0, "e"], + [42981, 0, "n"], + [42982, 0, "d"], + [42983, 0, "i"], + [42984, 0, "n"], + [42985, 0, "g"], + [42986, 0, " "], + [42987, 0, "o"], + [42988, 0, "n"], + [42989, 0, " "], + [42990, 0, "w"], + [42991, 0, "h"], + [42992, 0, "a"], + [42993, 0, "t"], + [42994, 0, " "], + [42995, 0, "t"], + [42996, 0, "h"], + [42997, 0, "e"], + [42998, 0, " "], + [42999, 0, "c"], + [43000, 0, "u"], + [43001, 0, "r"], + [43002, 0, "s"], + [43003, 0, "o"], + [43004, 0, "r"], + [43005, 0, " "], + [43006, 0, "r"], + [43007, 0, "e"], + [43008, 0, "f"], + [43009, 0, "e"], + [43010, 0, "r"], + [43011, 0, "s"], + [43012, 0, " "], + [43013, 0, "t"], + [43014, 0, "o"], + [43015, 0, "."], + [43016, 0, " "], + [43017, 0, "T"], + [43018, 0, "h"], + [43019, 0, "e"], + [43020, 0, " "], + [43021, 0, "\\"], + [43022, 0, "t"], + [43023, 0, "e"], + [43024, 0, "x"], + [43025, 0, "t"], + [43026, 0, "s"], + [43027, 0, "c"], + [43028, 0, "{"], + [43029, 0, "D"], + [43030, 0, "e"], + [43031, 0, "l"], + [43032, 0, "e"], + [43033, 0, "t"], + [43034, 0, "e"], + [43035, 0, "}"], + [43036, 0, " "], + [43037, 0, "r"], + [43038, 0, "u"], + [43039, 0, "l"], + [43040, 0, "e"], + [43041, 0, " "], + [43042, 0, "s"], + [43043, 0, "h"], + [43044, 0, "o"], + [43045, 0, "w"], + [43046, 0, "s"], + [43047, 0, " "], + [43048, 0, "h"], + [43049, 0, "o"], + [43050, 0, "w"], + [43051, 0, " "], + [43052, 0, "t"], + [43053, 0, "h"], + [43054, 0, "i"], + [43055, 0, "s"], + [43056, 0, " "], + [43057, 0, "o"], + [43058, 0, "p"], + [43059, 0, "e"], + [43060, 0, "r"], + [43061, 0, "a"], + [43062, 0, "t"], + [43063, 0, "i"], + [43064, 0, "o"], + [43065, 0, "n"], + [43066, 0, " "], + [43067, 0, "i"], + [43068, 0, "s"], + [43069, 0, " "], + [43070, 0, "e"], + [43071, 0, "v"], + [43072, 0, "a"], + [43073, 0, "l"], + [43074, 0, "u"], + [43075, 0, "a"], + [43076, 0, "t"], + [43077, 0, "e"], + [43078, 0, "d"], + [43079, 0, ","], + [43080, 0, " "], + [43081, 0, "b"], + [43082, 0, "y"], + [43083, 0, " "], + [43084, 0, "d"], + [43085, 0, "e"], + [43086, 0, "l"], + [43087, 0, "e"], + [43088, 0, "g"], + [43089, 0, "a"], + [43090, 0, "t"], + [43091, 0, "i"], + [43092, 0, "n"], + [43093, 0, "g"], + [43094, 0, " "], + [43095, 0, "t"], + [43096, 0, "o"], + [43097, 0, " "], + [43098, 0, "\\"], + [43099, 0, "t"], + [43100, 0, "e"], + [43101, 0, "x"], + [43102, 0, "t"], + [43103, 0, "s"], + [43104, 0, "f"], + [43105, 0, "{"], + [43106, 0, "c"], + [43107, 0, "l"], + [43108, 0, "e"], + [43109, 0, "a"], + [43110, 0, "r"], + [43111, 0, "E"], + [43112, 0, "l"], + [43113, 0, "e"], + [43114, 0, "m"], + [43115, 0, "}"], + [43116, 0, "."], + [43117, 0, " "], + [43118, 0, "\\"], + [43119, 0, "t"], + [43120, 0, "e"], + [43121, 0, "x"], + [43122, 0, "t"], + [43123, 0, "s"], + [43124, 0, "c"], + [43125, 0, "{"], + [43126, 0, "C"], + [43127, 0, "l"], + [43128, 0, "e"], + [43129, 0, "a"], + [43130, 0, "r"], + [43131, 0, "-"], + [43132, 0, "E"], + [43133, 0, "l"], + [43134, 0, "e"], + [43135, 0, "m"], + [43136, 0, "}"], + [43137, 0, " "], + [43138, 0, "u"], + [43139, 0, "s"], + [43140, 0, "e"], + [43141, 0, "s"], + [43142, 0, " "], + [43143, 0, "\\"], + [43144, 0, "t"], + [43145, 0, "e"], + [43146, 0, "x"], + [43147, 0, "t"], + [43148, 0, "s"], + [43149, 0, "c"], + [43150, 0, "{"], + [43151, 0, "C"], + [43152, 0, "l"], + [43153, 0, "e"], + [43154, 0, "a"], + [43155, 0, "r"], + [43156, 0, "-"], + [43157, 0, "A"], + [43158, 0, "n"], + [43159, 0, "y"], + [43160, 0, "}"], + [43161, 0, " "], + [43162, 0, "t"], + [43163, 0, "o"], + [43164, 0, " "], + [43165, 0, "r"], + [43166, 0, "e"], + [43167, 0, "c"], + [43168, 0, "u"], + [43169, 0, "r"], + [43170, 0, "s"], + [43171, 0, "i"], + [43172, 0, "v"], + [43173, 0, "e"], + [43174, 0, "l"], + [43175, 0, "y"], + [43176, 0, " "], + [43177, 0, "c"], + [43178, 0, "l"], + [43178, 1], + [43177, 1], + [43176, 1], + [43175, 1], + [43174, 1], + [43173, 1], + [43172, 1], + [43171, 1], + [43170, 1], + [43169, 1], + [43168, 1], + [43167, 1], + [43166, 1], + [43165, 1], + [43165, 0, "c"], + [43166, 0, "l"], + [43167, 0, "e"], + [43168, 0, "a"], + [43169, 0, "r"], + [43170, 0, " "], + [43171, 0, "o"], + [43172, 0, "u"], + [43173, 0, "t"], + [43174, 0, " "], + [43175, 0, "a"], + [43176, 0, "n"], + [43177, 0, "y"], + [43178, 0, " "], + [43179, 0, "d"], + [43180, 0, "a"], + [43181, 0, "t"], + [43182, 0, "a"], + [43183, 0, " "], + [43184, 0, "w"], + [43185, 0, "i"], + [43186, 0, "t"], + [43187, 0, "h"], + [43188, 0, " "], + [43189, 0, "a"], + [43190, 0, " "], + [43191, 0, "g"], + [43192, 0, "i"], + [43193, 0, "v"], + [43194, 0, "e"], + [43195, 0, "n"], + [43196, 0, " "], + [43197, 0, "k"], + [43198, 0, "e"], + [43199, 0, "y"], + [43200, 0, " "], + [43200, 1], + [43200, 0, ","], + [43201, 0, " "], + [43202, 0, "r"], + [43203, 0, "e"], + [43204, 0, "g"], + [43205, 0, "a"], + [43206, 0, "r"], + [43207, 0, "d"], + [43208, 0, "l"], + [43209, 0, "e"], + [43210, 0, "s"], + [43211, 0, "s"], + [43212, 0, " "], + [43213, 0, "o"], + [43214, 0, "f"], + [43215, 0, " "], + [43216, 0, "w"], + [43217, 0, "h"], + [43218, 0, "e"], + [43219, 0, "t"], + [43220, 0, "h"], + [43221, 0, "e"], + [43222, 0, "r"], + [43223, 0, " "], + [43224, 0, "i"], + [43225, 0, "t"], + [43226, 0, " "], + [43227, 0, "i"], + [43228, 0, "s"], + [43229, 0, " "], + [43230, 0, "o"], + [43231, 0, "f"], + [43232, 0, " "], + [43233, 0, "t"], + [43234, 0, "y"], + [43235, 0, "p"], + [43236, 0, "e"], + [43237, 0, " "], + [43238, 0, "\\"], + [43239, 0, "t"], + [43240, 0, "e"], + [43241, 0, "x"], + [43242, 0, "t"], + [43243, 0, "s"], + [43244, 0, "f"], + [43245, 0, "{"], + [43246, 0, "m"], + [43247, 0, "a"], + [43248, 0, "p"], + [43249, 0, "T"], + [43250, 0, "}"], + [43251, 0, ","], + [43252, 0, " "], + [43253, 0, "\\"], + [43254, 0, "t"], + [43255, 0, "e"], + [43256, 0, "x"], + [43257, 0, "t"], + [43258, 0, "s"], + [43259, 0, "f"], + [43260, 0, "{"], + [43261, 0, "l"], + [43262, 0, "i"], + [43263, 0, "s"], + [43264, 0, "t"], + [43265, 0, "T"], + [43266, 0, "}"], + [43267, 0, " "], + [43268, 0, "o"], + [43269, 0, "r"], + [43270, 0, " "], + [43271, 0, "\\"], + [43272, 0, "t"], + [43273, 0, "e"], + [43274, 0, "x"], + [43275, 0, "t"], + [43276, 0, "s"], + [43277, 0, "f"], + [43278, 0, "{"], + [43279, 0, "r"], + [43280, 0, "e"], + [43281, 0, "g"], + [43282, 0, "T"], + [43283, 0, "}"], + [43284, 0, ","], + [43285, 0, " "], + [43286, 0, "a"], + [43287, 0, "n"], + [43288, 0, "d"], + [43289, 0, " "], + [43290, 0, "a"], + [43291, 0, "l"], + [43292, 0, "s"], + [43293, 0, "o"], + [43294, 0, " "], + [43295, 0, "u"], + [43296, 0, "p"], + [43297, 0, "d"], + [43298, 0, "a"], + [43299, 0, "t"], + [43300, 0, "e"], + [43301, 0, "s"], + [43302, 0, " "], + [43303, 0, "t"], + [43304, 0, "h"], + [43305, 0, "e"], + [43306, 0, " "], + [43307, 0, "p"], + [43308, 0, "r"], + [43309, 0, "e"], + [43310, 0, "s"], + [43311, 0, "e"], + [43312, 0, "n"], + [43313, 0, "c"], + [43314, 0, "e"], + [43315, 0, " "], + [43316, 0, "s"], + [43317, 0, "e"], + [43318, 0, "t"], + [43319, 0, " "], + [43320, 0, "t"], + [43321, 0, "o"], + [43322, 0, " "], + [43323, 0, "i"], + [43324, 0, "n"], + [43325, 0, "c"], + [43326, 0, "l"], + [43327, 0, "u"], + [43328, 0, "d"], + [43329, 0, "e"], + [43330, 0, " "], + [43331, 0, "a"], + [43332, 0, "n"], + [43333, 0, "y"], + [43334, 0, " "], + [43335, 0, "n"], + [43336, 0, "e"], + [43337, 0, "s"], + [43338, 0, "t"], + [43339, 0, "e"], + [43340, 0, "d"], + [43341, 0, " "], + [43342, 0, "o"], + [43343, 0, "p"], + [43344, 0, "e"], + [43345, 0, "r"], + [43346, 0, "a"], + [43347, 0, "t"], + [43348, 0, "i"], + [43349, 0, "o"], + [43350, 0, "n"], + [43351, 0, " "], + [43352, 0, "I"], + [43353, 0, "D"], + [43354, 0, "s"], + [43355, 0, ","], + [43356, 0, " "], + [43357, 0, "b"], + [43358, 0, "u"], + [43359, 0, "t"], + [43360, 0, " "], + [43361, 0, "e"], + [43362, 0, "x"], + [43363, 0, "c"], + [43364, 0, "l"], + [43365, 0, "u"], + [43366, 0, "d"], + [43367, 0, "e"], + [43368, 0, " "], + [43369, 0, "a"], + [43370, 0, "n"], + [43371, 0, "y"], + [43372, 0, " "], + [43373, 0, "o"], + [43374, 0, "p"], + [43375, 0, "e"], + [43376, 0, "r"], + [43377, 0, "a"], + [43378, 0, "t"], + [43379, 0, "i"], + [43380, 0, "o"], + [43381, 0, "n"], + [43382, 0, "s"], + [43383, 0, " "], + [43384, 0, "i"], + [43385, 0, "n"], + [43386, 0, " "], + [43387, 0, "$"], + [43388, 0, "\\"], + [43389, 0, "t"], + [43390, 0, "e"], + [43391, 0, "x"], + [43392, 0, "t"], + [43393, 0, "i"], + [43394, 0, "t"], + [43395, 0, "{"], + [43396, 0, "d"], + [43397, 0, "e"], + [43398, 0, "p"], + [43399, 0, "s"], + [43400, 0, "}"], + [43401, 0, "$"], + [43402, 0, "."], + [43389, 1], + [43389, 1], + [43389, 1], + [43389, 1], + [43389, 0, "m"], + [43390, 0, "a"], + [43391, 0, "t"], + [43392, 0, "h"], + [38083, 0, " "], + [38084, 0, "\\"], + [38085, 0, "s"], + [38086, 0, "e"], + [38087, 0, "t"], + [38088, 0, "m"], + [38089, 0, "i"], + [38090, 0, "n"], + [38091, 0, "u"], + [38092, 0, "s"], + [38093, 0, " "], + [38094, 0, "\\"], + [38095, 0, "m"], + [38096, 0, "a"], + [38097, 0, "t"], + [38098, 0, "h"], + [38099, 0, "i"], + [38100, 0, "t"], + [38101, 0, "{"], + [38102, 0, "d"], + [38103, 0, "e"], + [38104, 0, "p"], + [38105, 0, "s"], + [38106, 0, "}"], + [43128, 1], + [43127, 1], + [43127, 0, "s"], + [43128, 0, "c"], + [43103, 1], + [43129, 1], + [43129, 0, "C"], + [43134, 0, "-"], + [43141, 0, " "], + [43142, 0, "I"], + [43143, 0, "n"], + [43144, 0, " "], + [43145, 0, "t"], + [43146, 0, "u"], + [43147, 0, "r"], + [43148, 0, "n"], + [43149, 0, ","], + [43437, 0, "\n"], + [43438, 0, "\n"], + [43438, 0, "T"], + [43439, 0, "h"], + [43440, 0, "e"], + [43441, 0, " "], + [43442, 0, "p"], + [43443, 0, "r"], + [43444, 0, "e"], + [43445, 0, "m"], + [43446, 0, "i"], + [43447, 0, "s"], + [43448, 0, "e"], + [43449, 0, "s"], + [43450, 0, " "], + [43451, 0, "o"], + [43452, 0, "f"], + [43453, 0, " "], + [43454, 0, "\\"], + [43455, 0, "t"], + [43456, 0, "e"], + [43457, 0, "x"], + [43458, 0, "t"], + [43459, 0, "s"], + [43460, 0, "c"], + [43461, 0, "{"], + [43462, 0, "C"], + [43463, 0, "l"], + [43464, 0, "e"], + [43465, 0, "a"], + [43466, 0, "r"], + [43467, 0, "-"], + [43468, 0, "A"], + [43469, 0, "n"], + [43470, 0, "y"], + [43471, 0, "}"], + [43472, 0, " "], + [43473, 0, "a"], + [43474, 0, "r"], + [43475, 0, "e"], + [43476, 0, " "], + [43477, 0, "s"], + [43478, 0, "a"], + [43479, 0, "t"], + [43480, 0, "i"], + [43481, 0, "s"], + [43482, 0, "f"], + [43483, 0, "i"], + [43484, 0, "e"], + [43485, 0, "d"], + [43486, 0, " "], + [43487, 0, "b"], + [43488, 0, "y"], + [43489, 0, " "], + [43490, 0, "$"], + [43491, 0, "\\"], + [43492, 0, "t"], + [43493, 0, "e"], + [43494, 0, "x"], + [43495, 0, "t"], + [43496, 0, "s"], + [43497, 0, "c"], + [43498, 0, "{"], + [43499, 0, "C"], + [43500, 0, "l"], + [43501, 0, "e"], + [43502, 0, "a"], + [43503, 0, "r"], + [43504, 0, "-"], + [43505, 0, "M"], + [43506, 0, "a"], + [43507, 0, "p"], + [43508, 0, "}"], + [43509, 0, "_"], + [43510, 0, "1"], + [43511, 0, "$"], + [43512, 0, ","], + [43513, 0, " "], + [43514, 0, "$"], + [43515, 0, "\\"], + [43516, 0, "t"], + [43517, 0, "e"], + [43518, 0, "x"], + [43519, 0, "t"], + [43520, 0, "s"], + [43521, 0, "c"], + [43522, 0, "{"], + [43523, 0, "C"], + [43524, 0, "l"], + [43525, 0, "e"], + [43526, 0, "a"], + [43527, 0, "r"], + [43528, 0, "-"], + [43529, 0, "L"], + [43530, 0, "i"], + [43531, 0, "s"], + [43532, 0, "t"], + [43533, 0, "}"], + [43534, 0, "_"], + [43535, 0, "1"], + [43536, 0, "$"], + [43537, 0, " "], + [43538, 0, "a"], + [43539, 0, "n"], + [43540, 0, "d"], + [43541, 0, " "], + [43542, 0, "\\"], + [43543, 0, "t"], + [43544, 0, "e"], + [43545, 0, "x"], + [43546, 0, "t"], + [43547, 0, "s"], + [43548, 0, "c"], + [43549, 0, "{"], + [43550, 0, "C"], + [43551, 0, "l"], + [43552, 0, "e"], + [43553, 0, "a"], + [43554, 0, "r"], + [43555, 0, "-"], + [43556, 0, "R"], + [43557, 0, "e"], + [43558, 0, "g"], + [43559, 0, "}"], + [43560, 0, " "], + [43561, 0, "i"], + [43562, 0, "f"], + [43563, 0, " "], + [43564, 0, "t"], + [43565, 0, "h"], + [43566, 0, "e"], + [43567, 0, " "], + [43568, 0, "r"], + [43569, 0, "e"], + [43570, 0, "s"], + [43571, 0, "p"], + [43572, 0, "e"], + [43573, 0, "c"], + [43574, 0, "t"], + [43575, 0, "i"], + [43576, 0, "v"], + [43577, 0, "e"], + [43578, 0, " "], + [43579, 0, "k"], + [43580, 0, "e"], + [43581, 0, "y"], + [43582, 0, " "], + [43583, 0, "a"], + [43584, 0, "p"], + [43585, 0, "p"], + [43586, 0, "e"], + [43587, 0, "a"], + [43588, 0, "r"], + [43589, 0, "s"], + [43590, 0, " "], + [43591, 0, "i"], + [43592, 0, "n"], + [43593, 0, " "], + [43594, 0, "$"], + [43595, 0, "\\"], + [43596, 0, "m"], + [43597, 0, "a"], + [43598, 0, "t"], + [43599, 0, "h"], + [43600, 0, "i"], + [43601, 0, "t"], + [43602, 0, "{"], + [43603, 0, "c"], + [43604, 0, "t"], + [43605, 0, "x"], + [43606, 0, "}"], + [43607, 0, "$"], + [43608, 0, ","], + [43609, 0, " "], + [43610, 0, "o"], + [43611, 0, "r"], + [43612, 0, " "], + [43613, 0, "b"], + [43614, 0, "y"], + [43615, 0, " "], + [43616, 0, "\\"], + [43617, 0, "t"], + [43618, 0, "e"], + [43619, 0, "x"], + [43620, 0, "t"], + [43621, 0, "s"], + [43622, 0, "c"], + [43623, 0, "{"], + [43624, 0, "C"], + [43625, 0, "l"], + [43626, 0, "e"], + [43627, 0, "a"], + [43628, 0, "r"], + [43629, 0, "-"], + [43630, 0, "N"], + [43631, 0, "o"], + [43632, 0, "n"], + [43633, 0, "e"], + [43634, 0, "}"], + [43635, 0, " "], + [43636, 0, "("], + [43637, 0, "w"], + [43638, 0, "h"], + [43639, 0, "i"], + [43640, 0, "c"], + [43641, 0, "h"], + [43642, 0, " "], + [43643, 0, "d"], + [43644, 0, "o"], + [43645, 0, "e"], + [43646, 0, "s"], + [43647, 0, " "], + [43648, 0, "n"], + [43649, 0, "o"], + [43650, 0, "t"], + [43651, 0, "h"], + [43652, 0, "i"], + [43653, 0, "n"], + [43654, 0, "g"], + [43655, 0, ")"], + [43656, 0, " "], + [43657, 0, "i"], + [43658, 0, "f"], + [43659, 0, " "], + [43660, 0, "t"], + [43661, 0, "h"], + [43662, 0, "e"], + [43663, 0, " "], + [43664, 0, "k"], + [43665, 0, "e"], + [43666, 0, "y"], + [43667, 0, " "], + [43668, 0, "i"], + [43669, 0, "s"], + [43670, 0, " "], + [43671, 0, "a"], + [43672, 0, "b"], + [43673, 0, "s"], + [43674, 0, "e"], + [43675, 0, "n"], + [43676, 0, "t"], + [43677, 0, "."], + [43678, 0, "\n"], + [43679, 0, "\n"], + [43680, 0, "\\"], + [43681, 0, "t"], + [43682, 0, "e"], + [43683, 0, "x"], + [43684, 0, "t"], + [43685, 0, "s"], + [43686, 0, "c"], + [43687, 0, "{"], + [43688, 0, "C"], + [43689, 0, "l"], + [43690, 0, "e"], + [43691, 0, "a"], + [43692, 0, "r"], + [43693, 0, "-"], + [43694, 0, "R"], + [43695, 0, "e"], + [43696, 0, "g"], + [43697, 0, "}"], + [43698, 0, " "], + [43699, 0, "r"], + [43700, 0, "e"], + [43701, 0, "m"], + [43702, 0, "o"], + [43703, 0, "v"], + [43704, 0, "e"], + [43705, 0, "s"], + [43706, 0, " "], + [43680, 0, " "], + [43680, 0, "A"], + [43681, 0, "s"], + [43682, 0, " "], + [43683, 0, "d"], + [43684, 0, "e"], + [43685, 0, "f"], + [43686, 0, "i"], + [43687, 0, "n"], + [43688, 0, "e"], + [43689, 0, "d"], + [43690, 0, " "], + [43691, 0, "b"], + [43692, 0, "y"], + [43693, 0, " "], + [43694, 0, "t"], + [43695, 0, "h"], + [43696, 0, "e"], + [43697, 0, " "], + [43698, 0, "\\"], + [43699, 0, "t"], + [43700, 0, "e"], + [43701, 0, "x"], + [43702, 0, "t"], + [43703, 0, "s"], + [43704, 0, "c"], + [43705, 0, "{"], + [43706, 0, "A"], + [43707, 0, "s"], + [43708, 0, "s"], + [43709, 0, "i"], + [43710, 0, "g"], + [43711, 0, "n"], + [43712, 0, "}"], + [43713, 0, " "], + [43714, 0, "r"], + [43715, 0, "u"], + [43716, 0, "l"], + [43717, 0, "e"], + [43718, 0, ","], + [43719, 0, " "], + [43720, 0, "a"], + [43721, 0, " "], + [43722, 0, "r"], + [43723, 0, "e"], + [43724, 0, "g"], + [43725, 0, "i"], + [43726, 0, "s"], + [43727, 0, "t"], + [43728, 0, "e"], + [43729, 0, "r"], + [43730, 0, " "], + [43731, 0, "m"], + [43732, 0, "a"], + [43733, 0, "i"], + [43734, 0, "n"], + [43735, 0, "t"], + [43736, 0, "a"], + [43737, 0, "i"], + [43738, 0, "n"], + [43739, 0, "s"], + [43740, 0, " "], + [43741, 0, "a"], + [43742, 0, " "], + [43743, 0, "m"], + [43744, 0, "a"], + [43745, 0, "p"], + [43746, 0, "p"], + [43747, 0, "i"], + [43748, 0, "n"], + [43749, 0, "g"], + [43750, 0, " "], + [43751, 0, "f"], + [43752, 0, "r"], + [43753, 0, "o"], + [43754, 0, "m"], + [43755, 0, " "], + [43756, 0, "o"], + [43757, 0, "p"], + [43758, 0, "e"], + [43759, 0, "r"], + [43760, 0, "a"], + [43761, 0, "t"], + [43762, 0, "i"], + [43763, 0, "o"], + [43764, 0, "n"], + [43765, 0, " "], + [43766, 0, "I"], + [43767, 0, "D"], + [43768, 0, "s"], + [43769, 0, " "], + [43770, 0, "t"], + [43771, 0, "o"], + [43772, 0, " "], + [43773, 0, "v"], + [43774, 0, "a"], + [43775, 0, "l"], + [43776, 0, "u"], + [43777, 0, "e"], + [43778, 0, "s"], + [43779, 0, "."], + [43800, 0, "u"], + [43801, 0, "p"], + [43802, 0, "d"], + [43803, 0, "a"], + [43804, 0, "t"], + [43805, 0, "e"], + [43806, 0, "s"], + [43807, 0, " "], + [43808, 0, "a"], + [43809, 0, " "], + [43810, 0, "r"], + [43811, 0, "e"], + [43812, 0, "g"], + [43813, 0, "i"], + [43814, 0, "s"], + [43815, 0, "t"], + [43816, 0, "e"], + [43817, 0, "r"], + [43818, 0, " "], + [43819, 0, "b"], + [43820, 0, "y"], + [43821, 0, " "], + [43829, 1], + [43828, 1], + [43827, 1], + [43827, 0, "i"], + [43828, 0, "n"], + [43829, 0, "g"], + [43830, 0, " "], + [43831, 0, "a"], + [43832, 0, "l"], + [43833, 0, "l"], + [43834, 0, " "], + [43835, 0, "o"], + [43836, 0, "p"], + [43837, 0, "e"], + [43838, 0, "r"], + [43839, 0, "a"], + [43840, 0, "t"], + [43841, 0, "i"], + [43842, 0, "o"], + [43843, 0, "n"], + [43844, 0, " "], + [43845, 0, "I"], + [43846, 0, "D"], + [43847, 0, "s"], + [43848, 0, " "], + [43849, 0, "t"], + [43850, 0, "h"], + [43851, 0, "a"], + [43852, 0, "t"], + [43853, 0, " "], + [43854, 0, "a"], + [43855, 0, "p"], + [43856, 0, "p"], + [43857, 0, "e"], + [43858, 0, "a"], + [43859, 0, "r"], + [43860, 0, " "], + [43861, 0, "i"], + [43862, 0, "n"], + [43863, 0, " "], + [43864, 0, "$"], + [43865, 0, "\\"], + [43866, 0, "t"], + [43867, 0, "e"], + [43868, 0, "x"], + [43869, 0, "t"], + [43870, 0, "i"], + [43871, 0, "t"], + [43872, 0, "{"], + [43873, 0, "d"], + [43874, 0, "e"], + [43875, 0, "p"], + [43876, 0, "s"], + [43877, 0, "}"], + [43878, 0, "$"], + [43879, 0, ","], + [43880, 0, " "], + [43881, 0, "i"], + [43882, 0, "."], + [43883, 0, "e"], + [43884, 0, "."], + [43885, 0, " "], + [43886, 0, "w"], + [43887, 0, "h"], + [43888, 0, "i"], + [43889, 0, "c"], + [43890, 0, "h"], + [43891, 0, " "], + [43892, 0, "a"], + [43893, 0, "r"], + [43894, 0, "e"], + [43895, 0, " "], + [43896, 0, "c"], + [43897, 0, "a"], + [43898, 0, "u"], + [43899, 0, "s"], + [43900, 0, "a"], + [43901, 0, "l"], + [43902, 0, "l"], + [43903, 0, "y"], + [43904, 0, " "], + [43905, 0, "p"], + [43895, 1], + [43894, 1], + [43893, 1], + [43892, 1], + [43902, 0, "r"], + [43903, 0, "e"], + [43904, 0, "c"], + [43905, 0, "e"], + [43906, 0, "d"], + [43907, 0, "e"], + [43908, 0, " "], + [43909, 0, "t"], + [43910, 0, "h"], + [43911, 0, "e"], + [43912, 0, " "], + [43913, 0, "c"], + [43914, 0, "l"], + [43915, 0, "e"], + [43916, 0, "a"], + [43917, 0, "r"], + [43918, 0, "i"], + [43919, 0, "n"], + [43920, 0, "g"], + [43921, 0, " "], + [43922, 0, "o"], + [43923, 0, "p"], + [43924, 0, "e"], + [43925, 0, "r"], + [43926, 0, "a"], + [43927, 0, "t"], + [43928, 0, "i"], + [43929, 0, "o"], + [43930, 0, "n"], + [43931, 0, ","], + [43932, 0, " "], + [43933, 0, "b"], + [43934, 0, "u"], + [43935, 0, "t"], + [43936, 0, " "], + [43937, 0, "r"], + [43938, 0, "e"], + [43939, 0, "t"], + [43940, 0, "a"], + [43941, 0, "i"], + [43942, 0, "n"], + [43943, 0, "i"], + [43944, 0, "n"], + [43945, 0, "g"], + [43946, 0, " "], + [43947, 0, "a"], + [43948, 0, "l"], + [43949, 0, "l"], + [43950, 0, " "], + [43951, 0, "o"], + [43952, 0, "p"], + [43953, 0, "e"], + [43954, 0, "r"], + [43955, 0, "a"], + [43956, 0, "t"], + [43957, 0, "i"], + [43958, 0, "o"], + [43959, 0, "n"], + [43960, 0, " "], + [43961, 0, "I"], + [43962, 0, "D"], + [43963, 0, "s"], + [43964, 0, " "], + [43879, 1], + [43880, 0, "("], + [43931, 0, ")"], + [43966, 0, "t"], + [43967, 0, "h"], + [43968, 0, "a"], + [43969, 0, "t"], + [43970, 0, " "], + [43971, 0, "d"], + [43972, 0, "o"], + [43973, 0, " "], + [43974, 0, "n"], + [43975, 0, "o"], + [43976, 0, "t"], + [43977, 0, " "], + [43978, 0, "a"], + [43979, 0, "p"], + [43980, 0, "p"], + [43981, 0, "e"], + [43982, 0, "a"], + [43983, 0, "r"], + [43984, 0, " "], + [43985, 0, "i"], + [43986, 0, "n"], + [43987, 0, " "], + [43988, 0, "$"], + [43989, 0, "\\"], + [43990, 0, "t"], + [43991, 0, "e"], + [43992, 0, "x"], + [43993, 0, "t"], + [43993, 1], + [43992, 1], + [43991, 1], + [43990, 1], + [43990, 0, "m"], + [43991, 0, "a"], + [43992, 0, "t"], + [43993, 0, "h"], + [43994, 0, "i"], + [43995, 0, "t"], + [43996, 0, "{"], + [43997, 0, "d"], + [43998, 0, "e"], + [43999, 0, "p"], + [44000, 0, "s"], + [44001, 0, "}"], + [44002, 0, "$"], + [43869, 1], + [43868, 1], + [43867, 1], + [43866, 1], + [43866, 0, "m"], + [43867, 0, "a"], + [43868, 0, "t"], + [43869, 0, "h"], + [44003, 0, " "], + [44004, 0, "("], + [44005, 0, "f"], + [44006, 0, "r"], + [44007, 0, "o"], + [44008, 0, "m"], + [44009, 0, " "], + [44010, 0, "a"], + [44011, 0, "s"], + [44012, 0, "s"], + [44013, 0, "i"], + [44014, 0, "g"], + [44015, 0, "n"], + [44016, 0, "m"], + [44017, 0, "e"], + [44018, 0, "n"], + [44019, 0, "t"], + [44020, 0, " "], + [44021, 0, "o"], + [44022, 0, "p"], + [44023, 0, "e"], + [44024, 0, "r"], + [44025, 0, "a"], + [44026, 0, "t"], + [44027, 0, "i"], + [44028, 0, "o"], + [44029, 0, "n"], + [44030, 0, "s"], + [44031, 0, " "], + [44032, 0, "t"], + [44033, 0, "h"], + [44034, 0, "a"], + [44035, 0, "t"], + [44036, 0, " "], + [44037, 0, "a"], + [44038, 0, "r"], + [44039, 0, "e"], + [44040, 0, " "], + [44041, 0, "c"], + [44042, 0, "o"], + [44043, 0, "n"], + [44044, 0, "c"], + [44045, 0, "u"], + [44046, 0, "r"], + [44047, 0, "r"], + [44048, 0, "e"], + [44049, 0, "n"], + [44050, 0, "t"], + [44051, 0, " "], + [44052, 0, "w"], + [44053, 0, "i"], + [44054, 0, "t"], + [44055, 0, "h"], + [44056, 0, " "], + [44057, 0, "t"], + [44058, 0, "h"], + [44059, 0, "e"], + [44060, 0, " "], + [44061, 0, "c"], + [44062, 0, "l"], + [44063, 0, "e"], + [44064, 0, "a"], + [44065, 0, "r"], + [44066, 0, "i"], + [44067, 0, "n"], + [44068, 0, "g"], + [44069, 0, " "], + [44070, 0, "o"], + [44071, 0, "p"], + [44072, 0, "e"], + [44073, 0, "r"], + [44074, 0, "a"], + [44075, 0, "t"], + [44076, 0, "i"], + [44077, 0, "o"], + [44078, 0, "n"], + [44079, 0, ")"], + [44080, 0, "."], + [44081, 0, "\n"], + [44082, 0, "\n"], + [44083, 0, "C"], + [44084, 0, "l"], + [44085, 0, "e"], + [44086, 0, "a"], + [44087, 0, "r"], + [44088, 0, "i"], + [44089, 0, "n"], + [44090, 0, "g"], + [44091, 0, " "], + [44092, 0, "m"], + [44093, 0, "a"], + [44094, 0, "p"], + [44095, 0, "s"], + [44096, 0, " "], + [44097, 0, "a"], + [44098, 0, "n"], + [44099, 0, "d"], + [44100, 0, " "], + [44101, 0, "l"], + [44102, 0, "i"], + [44103, 0, "s"], + [44104, 0, "t"], + [44105, 0, "s"], + [44106, 0, " "], + [44107, 0, "t"], + [44108, 0, "a"], + [44109, 0, "k"], + [44110, 0, "e"], + [44111, 0, "s"], + [44112, 0, " "], + [44113, 0, "a"], + [44114, 0, " "], + [44115, 0, "s"], + [44116, 0, "i"], + [44117, 0, "m"], + [44118, 0, "i"], + [44119, 0, "l"], + [44120, 0, "a"], + [44121, 0, "r"], + [44122, 0, " "], + [44123, 0, "a"], + [44124, 0, "p"], + [44125, 0, "p"], + [44126, 0, "r"], + [44127, 0, "o"], + [44128, 0, "a"], + [44129, 0, "c"], + [44130, 0, "h"], + [44131, 0, ":"], + [44132, 0, " "], + [44133, 0, "e"], + [44134, 0, "a"], + [44135, 0, "c"], + [44136, 0, "h"], + [44137, 0, " "], + [44138, 0, "e"], + [44139, 0, "l"], + [44140, 0, "e"], + [44141, 0, "m"], + [44142, 0, "e"], + [44143, 0, "n"], + [44144, 0, "t"], + [44145, 0, " "], + [44146, 0, "o"], + [44147, 0, "f"], + [44148, 0, " "], + [44149, 0, "t"], + [44150, 0, "h"], + [44151, 0, "e"], + [44152, 0, " "], + [44153, 0, "m"], + [44154, 0, "a"], + [44155, 0, "p"], + [44156, 0, " "], + [44157, 0, "o"], + [44158, 0, "r"], + [44159, 0, " "], + [44160, 0, "l"], + [44161, 0, "i"], + [44162, 0, "s"], + [44163, 0, "t"], + [44164, 0, " "], + [44165, 0, "i"], + [44166, 0, "s"], + [44167, 0, " "], + [44168, 0, "r"], + [44169, 0, "e"], + [44170, 0, "c"], + [44171, 0, "u"], + [44172, 0, "r"], + [44173, 0, "s"], + [44174, 0, "i"], + [44175, 0, "v"], + [44176, 0, "e"], + [44177, 0, "l"], + [44178, 0, "y"], + [44179, 0, " "], + [44180, 0, "c"], + [44181, 0, "l"], + [44182, 0, "e"], + [44183, 0, "a"], + [44184, 0, "r"], + [44185, 0, "e"], + [44186, 0, "d"], + [44187, 0, " "], + [44188, 0, "u"], + [44189, 0, "s"], + [44190, 0, "i"], + [44191, 0, "n"], + [44192, 0, "g"], + [44193, 0, " "], + [44194, 0, "$"], + [44194, 1], + [44194, 0, "\\"], + [44195, 0, "t"], + [44196, 0, "e"], + [44197, 0, "x"], + [44198, 0, "t"], + [44199, 0, "s"], + [44200, 0, "f"], + [44201, 0, "{"], + [44202, 0, "c"], + [44203, 0, "l"], + [44204, 0, "e"], + [44205, 0, "a"], + [44206, 0, "r"], + [44207, 0, "E"], + [44208, 0, "l"], + [44209, 0, "e"], + [44210, 0, "m"], + [44211, 0, "}"], + [44212, 0, ","], + [44213, 0, " "], + [44214, 0, "a"], + [44215, 0, "n"], + [44216, 0, "d"], + [44217, 0, " "], + [44218, 0, "p"], + [44219, 0, "r"], + [44220, 0, "e"], + [44221, 0, "s"], + [44222, 0, "e"], + [44223, 0, "n"], + [44224, 0, "c"], + [44225, 0, "e"], + [44226, 0, " "], + [44227, 0, "s"], + [44228, 0, "e"], + [44229, 0, "t"], + [44230, 0, "s"], + [44231, 0, " "], + [44232, 0, "a"], + [44233, 0, "r"], + [44234, 0, "e"], + [44235, 0, " "], + [44236, 0, "u"], + [44237, 0, "p"], + [44238, 0, "d"], + [44239, 0, "a"], + [44240, 0, "t"], + [44241, 0, "e"], + [44242, 0, "d"], + [44243, 0, " "], + [44244, 0, "t"], + [44245, 0, "o"], + [44246, 0, " "], + [44247, 0, "e"], + [44248, 0, "x"], + [44249, 0, "c"], + [44250, 0, "l"], + [44251, 0, "u"], + [44252, 0, "d"], + [44253, 0, "e"], + [44254, 0, " "], + [44255, 0, "$"], + [44256, 0, "\\"], + [44257, 0, "m"], + [44258, 0, "a"], + [44259, 0, "t"], + [44260, 0, "h"], + [44261, 0, "i"], + [44262, 0, "t"], + [44263, 0, "{"], + [44264, 0, "d"], + [44265, 0, "e"], + [44266, 0, "p"], + [44267, 0, "s"], + [44268, 0, "}"], + [44269, 0, "$"], + [44270, 0, "."], + [44271, 0, " "], + [44272, 0, "T"], + [44273, 0, "h"], + [44274, 0, "u"], + [44275, 0, "s"], + [44276, 0, ","], + [44277, 0, " "], + [44278, 0, "a"], + [44279, 0, "n"], + [44280, 0, "y"], + [44281, 0, " "], + [44282, 0, "l"], + [44283, 0, "i"], + [44284, 0, "s"], + [44285, 0, "t"], + [44286, 0, " "], + [44287, 0, "e"], + [44288, 0, "l"], + [44289, 0, "e"], + [44290, 0, "m"], + [44291, 0, "e"], + [44292, 0, "n"], + [44293, 0, "t"], + [44294, 0, "s"], + [44295, 0, " "], + [44296, 0, "o"], + [44297, 0, "r"], + [44298, 0, " "], + [44299, 0, "m"], + [44300, 0, "a"], + [44301, 0, "p"], + [44302, 0, " "], + [44303, 0, "e"], + [44304, 0, "n"], + [44305, 0, "t"], + [44306, 0, "r"], + [44307, 0, "i"], + [44308, 0, "e"], + [44309, 0, "s"], + [44310, 0, " "], + [44311, 0, "w"], + [44312, 0, "h"], + [44313, 0, "o"], + [44314, 0, "s"], + [44315, 0, "e"], + [44316, 0, " "], + [44317, 0, "m"], + [44318, 0, "o"], + [44319, 0, "d"], + [44320, 0, "i"], + [44321, 0, "f"], + [44322, 0, "i"], + [44323, 0, "c"], + [44324, 0, "a"], + [44325, 0, "t"], + [44326, 0, "i"], + [44327, 0, "o"], + [44328, 0, "n"], + [44329, 0, "s"], + [44330, 0, " "], + [44331, 0, "c"], + [44332, 0, "a"], + [44333, 0, "u"], + [44334, 0, "s"], + [44335, 0, "a"], + [44336, 0, "l"], + [44337, 0, "l"], + [44338, 0, "y"], + [44339, 0, " "], + [44340, 0, "p"], + [44341, 0, "r"], + [44342, 0, "e"], + [44343, 0, "c"], + [44344, 0, "e"], + [44345, 0, "d"], + [44346, 0, "e"], + [44347, 0, " "], + [44348, 0, "t"], + [44349, 0, "h"], + [44350, 0, "e"], + [44351, 0, " "], + [44352, 0, "c"], + [44353, 0, "l"], + [44354, 0, "e"], + [44355, 0, "a"], + [44356, 0, "r"], + [44357, 0, "i"], + [44358, 0, "n"], + [44359, 0, "g"], + [44360, 0, " "], + [44361, 0, "o"], + [44362, 0, "p"], + [44363, 0, "e"], + [44364, 0, "r"], + [44365, 0, "a"], + [44366, 0, "t"], + [44367, 0, "i"], + [44368, 0, "o"], + [44369, 0, "n"], + [44370, 0, " "], + [44371, 0, "w"], + [44372, 0, "i"], + [44373, 0, "l"], + [44374, 0, "l"], + [44375, 0, " "], + [44376, 0, "e"], + [44377, 0, "n"], + [44378, 0, "d"], + [44379, 0, " "], + [44380, 0, "u"], + [44381, 0, "p"], + [44382, 0, " "], + [44383, 0, "w"], + [44384, 0, "i"], + [44385, 0, "t"], + [44386, 0, "h"], + [44387, 0, " "], + [44388, 0, "e"], + [44389, 0, "m"], + [44390, 0, "p"], + [44391, 0, "t"], + [44392, 0, "y"], + [44393, 0, " "], + [44394, 0, "p"], + [44395, 0, "r"], + [44396, 0, "e"], + [44397, 0, "s"], + [44398, 0, "e"], + [44399, 0, "n"], + [44400, 0, "c"], + [44401, 0, "e"], + [44402, 0, " "], + [44403, 0, "s"], + [44404, 0, "e"], + [44405, 0, "t"], + [44406, 0, "s"], + [44407, 0, ","], + [44408, 0, " "], + [44409, 0, "a"], + [44410, 0, "n"], + [44411, 0, "d"], + [44412, 0, " "], + [44413, 0, "t"], + [44414, 0, "h"], + [44415, 0, "u"], + [44416, 0, "s"], + [44417, 0, " "], + [44418, 0, "b"], + [44419, 0, "e"], + [44420, 0, " "], + [44421, 0, "c"], + [44422, 0, "o"], + [44423, 0, "n"], + [44424, 0, "s"], + [44425, 0, "i"], + [44426, 0, "d"], + [44427, 0, "e"], + [44428, 0, "r"], + [44429, 0, "e"], + [44430, 0, "d"], + [44431, 0, " "], + [44432, 0, "d"], + [44433, 0, "e"], + [44434, 0, "l"], + [44435, 0, "e"], + [44436, 0, "t"], + [44437, 0, "e"], + [44438, 0, "d"], + [44439, 0, "."], + [44440, 0, " "], + [44441, 0, "A"], + [44442, 0, "n"], + [44443, 0, "y"], + [44444, 0, " "], + [44445, 0, "m"], + [44446, 0, "a"], + [44447, 0, "p"], + [44448, 0, " "], + [44449, 0, "o"], + [44450, 0, "r"], + [44451, 0, " "], + [44452, 0, "l"], + [44453, 0, "i"], + [44454, 0, "s"], + [44455, 0, "t"], + [44456, 0, " "], + [44457, 0, "e"], + [44458, 0, "l"], + [44459, 0, "e"], + [44460, 0, "m"], + [44461, 0, "e"], + [44462, 0, "n"], + [44463, 0, "t"], + [44464, 0, "s"], + [44465, 0, " "], + [44466, 0, "c"], + [44467, 0, "o"], + [44468, 0, "n"], + [44469, 0, "t"], + [44470, 0, "a"], + [44471, 0, "i"], + [44472, 0, "n"], + [44473, 0, "i"], + [44474, 0, "n"], + [44475, 0, "g"], + [44476, 0, " "], + [44477, 0, "o"], + [44478, 0, "p"], + [44479, 0, "e"], + [44480, 0, "r"], + [44481, 0, "a"], + [44482, 0, "t"], + [44483, 0, "i"], + [44484, 0, "o"], + [44485, 0, "n"], + [44486, 0, "s"], + [44487, 0, " "], + [44488, 0, "t"], + [44489, 0, "h"], + [44490, 0, "a"], + [44491, 0, "t"], + [44492, 0, " "], + [44493, 0, "a"], + [44494, 0, "r"], + [44495, 0, "e"], + [44496, 0, " "], + [44497, 0, "c"], + [44498, 0, "o"], + [44499, 0, "n"], + [44500, 0, "c"], + [44501, 0, "u"], + [44502, 0, "r"], + [44503, 0, "r"], + [44504, 0, "e"], + [44505, 0, "n"], + [44506, 0, "t"], + [44507, 0, " "], + [44508, 0, "w"], + [44509, 0, "i"], + [44510, 0, "t"], + [44511, 0, "h"], + [44512, 0, " "], + [44513, 0, "t"], + [44514, 0, "h"], + [44515, 0, "e"], + [44516, 0, " "], + [44517, 0, "c"], + [44518, 0, "l"], + [44519, 0, "e"], + [44520, 0, "a"], + [44521, 0, "r"], + [44522, 0, "i"], + [44523, 0, "n"], + [44524, 0, "g"], + [44525, 0, " "], + [44526, 0, "o"], + [44527, 0, "p"], + [44528, 0, "e"], + [44529, 0, "r"], + [44530, 0, "a"], + [44531, 0, "t"], + [44532, 0, "i"], + [44533, 0, "o"], + [44534, 0, "n"], + [44535, 0, " "], + [44536, 0, "w"], + [44537, 0, "i"], + [44538, 0, "l"], + [44539, 0, "l"], + [44540, 0, " "], + [44541, 0, "p"], + [44542, 0, "r"], + [44543, 0, "e"], + [44544, 0, "s"], + [44545, 0, "e"], + [44546, 0, "r"], + [44547, 0, "v"], + [44548, 0, "e"], + [44549, 0, " "], + [44550, 0, "t"], + [44551, 0, "h"], + [44552, 0, "e"], + [44553, 0, "i"], + [44554, 0, "r"], + [44555, 0, " "], + [44556, 0, "n"], + [44557, 0, "o"], + [44558, 0, "n"], + [44558, 1], + [44557, 1], + [44556, 1], + [44555, 1], + [44554, 1], + [44553, 1], + [44552, 1], + [44551, 1], + [44550, 1], + [44549, 1], + [44549, 0, "d"], + [44550, 0, "."], + [44539, 1], + [44538, 1], + [44537, 1], + [44536, 1], + [44536, 0, "a"], + [44537, 0, "r"], + [44538, 0, "e"], + [16085, 0, "\n"], + [16086, 0, "\\"], + [16087, 0, "s"], + [16088, 0, "u"], + [16089, 0, "b"], + [16090, 0, "s"], + [16091, 0, "e"], + [16092, 0, "c"], + [16093, 0, "t"], + [16094, 0, "i"], + [16095, 0, "o"], + [16096, 0, "n"], + [16097, 0, "{"], + [16098, 0, "E"], + [16099, 0, "x"], + [16100, 0, "p"], + [16101, 0, "r"], + [16102, 0, "e"], + [16103, 0, "s"], + [16104, 0, "s"], + [16105, 0, "i"], + [16106, 0, "o"], + [16107, 0, "n"], + [16108, 0, " "], + [16109, 0, "e"], + [16110, 0, "v"], + [16111, 0, "a"], + [16112, 0, "l"], + [16113, 0, "u"], + [16114, 0, "a"], + [16115, 0, "t"], + [16116, 0, "i"], + [16117, 0, "o"], + [16118, 0, "n"], + [16119, 0, "}"], + [16120, 0, "\n"], + [8050, 1], + [8050, 1], + [8050, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 1], + [8058, 0, "F"], + [8059, 0, "o"], + [8060, 0, "r"], + [8061, 0, "m"], + [8062, 0, "a"], + [8063, 0, "l"], + [8064, 0, " "], + [8065, 0, "s"], + [8066, 0, "e"], + [8067, 0, "m"], + [8068, 0, "a"], + [8069, 0, "n"], + [8070, 0, "t"], + [8071, 0, "i"], + [8072, 0, "c"], + [8073, 0, "s"], + [3669, 1], + [3675, 0, "["], + [3681, 0, "]"], + [3683, 1], + [4698, 1], + [4697, 1], + [4696, 1], + [4695, 1], + [4694, 1], + [4693, 1], + [4692, 1], + [4691, 1], + [4690, 1], + [4689, 1], + [4688, 1], + [4687, 1], + [4686, 1], + [4685, 1], + [4684, 1], + [4683, 1], + [4682, 1], + [4681, 1], + [4680, 1], + [4679, 1], + [4678, 1], + [4677, 1], + [4676, 1], + [4675, 1], + [4674, 1], + [4673, 1], + [4672, 1], + [4671, 1], + [4670, 1], + [4670, 0, "D"], + [4671, 0, "o"], + [4672, 0, "c"], + [4673, 0, "u"], + [4674, 0, "m"], + [4675, 0, "e"], + [4676, 0, "n"], + [4677, 0, "t"], + [4678, 0, " "], + [4679, 0, "e"], + [4680, 0, "d"], + [4681, 0, "i"], + [4682, 0, "t"], + [4683, 0, "i"], + [4684, 0, "n"], + [4685, 0, "g"], + [4686, 0, " "], + [4687, 0, "A"], + [4688, 0, "P"], + [4689, 0, "I"], + [4691, 0, "\n"], + [4692, 0, "\n"], + [4693, 0, "T"], + [4694, 0, "o"], + [4695, 0, " "], + [4696, 0, "d"], + [4697, 0, "e"], + [4698, 0, "f"], + [4699, 0, "i"], + [4700, 0, "n"], + [4701, 0, "e"], + [4702, 0, " "], + [4703, 0, "t"], + [4704, 0, "h"], + [4705, 0, "e"], + [4706, 0, " "], + [4707, 0, "s"], + [4708, 0, "e"], + [4709, 0, "m"], + [4710, 0, "a"], + [4711, 0, "n"], + [4712, 0, "t"], + [4713, 0, "i"], + [4714, 0, "c"], + [4715, 0, "s"], + [4716, 0, " "], + [4717, 0, "f"], + [4718, 0, "o"], + [4719, 0, "r"], + [4720, 0, " "], + [4721, 0, "c"], + [4722, 0, "o"], + [4723, 0, "l"], + [4724, 0, "l"], + [4725, 0, "a"], + [4726, 0, "b"], + [4727, 0, "o"], + [4728, 0, "r"], + [4729, 0, "a"], + [4730, 0, "t"], + [4731, 0, "i"], + [4732, 0, "v"], + [4733, 0, "e"], + [4734, 0, "l"], + [4735, 0, "y"], + [4736, 0, " "], + [4737, 0, "e"], + [4738, 0, "d"], + [4739, 0, "i"], + [4740, 0, "t"], + [4741, 0, "a"], + [4742, 0, "b"], + [4743, 0, "l"], + [4744, 0, "e"], + [4745, 0, " "], + [4746, 0, "d"], + [4747, 0, "a"], + [4748, 0, "t"], + [4749, 0, "a"], + [4750, 0, " "], + [4751, 0, "s"], + [4752, 0, "t"], + [4753, 0, "r"], + [4754, 0, "u"], + [4755, 0, "c"], + [4756, 0, "t"], + [4757, 0, "u"], + [4758, 0, "r"], + [4759, 0, "e"], + [4760, 0, "s"], + [4761, 0, ","], + [4762, 0, " "], + [4763, 0, "w"], + [4764, 0, "e"], + [4765, 0, " "], + [4766, 0, "f"], + [4767, 0, "i"], + [4768, 0, "r"], + [4769, 0, "s"], + [4770, 0, "t"], + [4771, 0, " "], + [4772, 0, "d"], + [4773, 0, "e"], + [4774, 0, "f"], + [4775, 0, "i"], + [4776, 0, "n"], + [4777, 0, "e"], + [4778, 0, " "], + [4779, 0, "a"], + [4780, 0, " "], + [4781, 0, "s"], + [4782, 0, "i"], + [4783, 0, "m"], + [4784, 0, "p"], + [4785, 0, "l"], + [4786, 0, "e"], + [4787, 0, " "], + [4788, 0, "c"], + [4789, 0, "o"], + [4790, 0, "m"], + [4791, 0, "m"], + [4792, 0, "a"], + [4793, 0, "n"], + [4794, 0, "d"], + [4795, 0, " "], + [4796, 0, "l"], + [4797, 0, "a"], + [4798, 0, "n"], + [4799, 0, "g"], + [4800, 0, "u"], + [4801, 0, "a"], + [4802, 0, "g"], + [4803, 0, "e"], + [4804, 0, " "], + [4805, 0, "t"], + [4806, 0, "h"], + [4807, 0, "a"], + [4808, 0, "t"], + [4809, 0, " "], + [4810, 0, "i"], + [4811, 0, "s"], + [4812, 0, " "], + [4813, 0, "e"], + [4814, 0, "x"], + [4815, 0, "e"], + [4816, 0, "c"], + [4817, 0, "u"], + [4818, 0, "t"], + [4819, 0, "e"], + [4820, 0, "d"], + [4821, 0, " "], + [4822, 0, "l"], + [4823, 0, "o"], + [4824, 0, "c"], + [4825, 0, "a"], + [4826, 0, "l"], + [4827, 0, "l"], + [4828, 0, "y"], + [4829, 0, " "], + [4830, 0, "a"], + [4831, 0, "t"], + [4832, 0, " "], + [4833, 0, "a"], + [4834, 0, "n"], + [4835, 0, "y"], + [4836, 0, " "], + [4837, 0, "o"], + [4838, 0, "f"], + [4839, 0, " "], + [4840, 0, "t"], + [4841, 0, "h"], + [4842, 0, "e"], + [4843, 0, " "], + [4844, 0, "p"], + [4845, 0, "e"], + [4846, 0, "e"], + [4847, 0, "r"], + [4848, 0, "s"], + [4849, 0, ","], + [4850, 0, " "], + [4851, 0, "a"], + [4852, 0, "n"], + [4853, 0, "d"], + [4854, 0, " "], + [4855, 0, "w"], + [4856, 0, "h"], + [4857, 0, "i"], + [4858, 0, "c"], + [4859, 0, "h"], + [4860, 0, " "], + [4861, 0, "a"], + [4862, 0, "l"], + [4863, 0, "l"], + [4864, 0, "o"], + [4865, 0, "w"], + [4866, 0, "s"], + [4867, 0, " "], + [4868, 0, "t"], + [4869, 0, "h"], + [4870, 0, "e"], + [4871, 0, " "], + [4872, 0, "l"], + [4873, 0, "o"], + [4874, 0, "c"], + [4875, 0, "a"], + [4876, 0, "l"], + [4877, 0, " "], + [4878, 0, "s"], + [4879, 0, "t"], + [4880, 0, "a"], + [4881, 0, "t"], + [4882, 0, "e"], + [4883, 0, " "], + [4884, 0, "o"], + [4885, 0, "f"], + [4886, 0, " "], + [4887, 0, "t"], + [4888, 0, "h"], + [4889, 0, "a"], + [4890, 0, "t"], + [4891, 0, " "], + [4891, 1], + [4890, 1], + [4889, 1], + [4888, 1], + [4887, 1], + [4886, 1], + [4885, 1], + [4884, 1], + [4883, 1], + [4882, 1], + [4881, 1], + [4880, 1], + [4879, 1], + [4878, 1], + [4877, 1], + [4876, 1], + [4875, 1], + [4874, 1], + [4873, 1], + [4872, 1], + [4871, 1], + [4870, 1], + [4870, 0, "a"], + [4871, 0, "t"], + [4872, 0, " "], + [4873, 0, "p"], + [4874, 0, "e"], + [4875, 0, "e"], + [4876, 0, "r"], + [4877, 0, "'"], + [4878, 0, "s"], + [4879, 0, " "], + [4880, 0, "l"], + [4881, 0, "o"], + [4882, 0, "c"], + [4883, 0, "a"], + [4884, 0, "l"], + [4885, 0, " "], + [4886, 0, "c"], + [4887, 0, "o"], + [4888, 0, "p"], + [4889, 0, "y"], + [4890, 0, " "], + [4891, 0, "o"], + [4892, 0, "f"], + [4893, 0, " "], + [4894, 0, "t"], + [4895, 0, "h"], + [4896, 0, "e"], + [4897, 0, " "], + [4898, 0, "d"], + [4899, 0, "o"], + [4900, 0, "c"], + [4901, 0, "u"], + [4902, 0, "m"], + [4903, 0, "e"], + [4904, 0, "n"], + [4905, 0, "t"], + [4906, 0, " "], + [4907, 0, "t"], + [4908, 0, "o"], + [4909, 0, " "], + [4910, 0, "b"], + [4911, 0, "e"], + [4912, 0, " "], + [4913, 0, "q"], + [4914, 0, "u"], + [4915, 0, "e"], + [4916, 0, "r"], + [4917, 0, "i"], + [4918, 0, "e"], + [4919, 0, "d"], + [4920, 0, " "], + [4921, 0, "a"], + [4922, 0, "n"], + [4923, 0, "d"], + [4924, 0, " "], + [4925, 0, "m"], + [4926, 0, "o"], + [4927, 0, "t"], + [4927, 1], + [4927, 0, "d"], + [4928, 0, "i"], + [4929, 0, "f"], + [4930, 0, "i"], + [4931, 0, "e"], + [4932, 0, "d"], + [4933, 0, "."], + [4934, 0, " "], + [4935, 0, "P"], + [4936, 0, "e"], + [4937, 0, "r"], + [4938, 0, "f"], + [4939, 0, "o"], + [4940, 0, "r"], + [4941, 0, "m"], + [4942, 0, "i"], + [4943, 0, "n"], + [4944, 0, "g"], + [4945, 0, " "], + [4946, 0, "r"], + [4947, 0, "e"], + [4948, 0, "a"], + [4949, 0, "d"], + [4950, 0, "-"], + [4951, 0, "o"], + [4952, 0, "n"], + [4953, 0, "l"], + [4954, 0, "y"], + [4955, 0, " "], + [4956, 0, "q"], + [4957, 0, "u"], + [4958, 0, "e"], + [4959, 0, "r"], + [4960, 0, "i"], + [4961, 0, "e"], + [4962, 0, "s"], + [4963, 0, " "], + [4964, 0, "h"], + [4965, 0, "a"], + [4966, 0, "s"], + [4967, 0, " "], + [4968, 0, "n"], + [4969, 0, "o"], + [4970, 0, " "], + [4971, 0, "s"], + [4972, 0, "i"], + [4973, 0, "d"], + [4974, 0, "e"], + [4975, 0, "-"], + [4976, 0, "e"], + [4977, 0, "f"], + [4978, 0, "f"], + [4979, 0, "e"], + [4980, 0, "c"], + [4981, 0, "t"], + [4982, 0, "s"], + [4983, 0, ","], + [4984, 0, " "], + [4985, 0, "b"], + [4986, 0, "u"], + [4987, 0, "t"], + [4988, 0, " "], + [4989, 0, "m"], + [4990, 0, "o"], + [4991, 0, "d"], + [4992, 0, "i"], + [4993, 0, "f"], + [4994, 0, "y"], + [4995, 0, "i"], + [4996, 0, "n"], + [4997, 0, "g"], + [4998, 0, " "], + [4999, 0, "t"], + [5000, 0, "h"], + [5001, 0, "e"], + [5002, 0, " "], + [5003, 0, "d"], + [5004, 0, "o"], + [5005, 0, "c"], + [5006, 0, "u"], + [5007, 0, "m"], + [5008, 0, "e"], + [5009, 0, "n"], + [5010, 0, "t"], + [5011, 0, " "], + [5012, 0, "h"], + [5013, 0, "a"], + [5014, 0, "s"], + [5015, 0, " "], + [5016, 0, "t"], + [5017, 0, "h"], + [5018, 0, "e"], + [5019, 0, " "], + [5020, 0, "e"], + [5021, 0, "f"], + [5022, 0, "f"], + [5023, 0, "e"], + [5024, 0, "c"], + [5025, 0, "t"], + [5026, 0, " "], + [5027, 0, "o"], + [5028, 0, "f"], + [5029, 0, " "], + [5030, 0, "p"], + [5031, 0, "r"], + [5032, 0, "o"], + [5033, 0, "d"], + [5034, 0, "u"], + [5035, 0, "c"], + [5036, 0, "i"], + [5037, 0, "n"], + [5038, 0, "g"], + [5039, 0, " "], + [5040, 0, "\\"], + [5041, 0, "e"], + [5042, 0, "m"], + [5043, 0, "p"], + [5044, 0, "h"], + [5045, 0, "{"], + [5046, 0, "o"], + [5047, 0, "p"], + [5048, 0, "e"], + [5049, 0, "r"], + [5050, 0, "a"], + [5051, 0, "t"], + [5052, 0, "i"], + [5053, 0, "o"], + [5054, 0, "n"], + [5055, 0, "s"], + [5056, 0, "}"], + [5057, 0, " "], + [5058, 0, "d"], + [5059, 0, "e"], + [5060, 0, "s"], + [5061, 0, "c"], + [5062, 0, "r"], + [5063, 0, "i"], + [5064, 0, "b"], + [5065, 0, "i"], + [5066, 0, "n"], + [5067, 0, "g"], + [5068, 0, " "], + [5069, 0, "t"], + [5070, 0, "h"], + [5071, 0, "e"], + [5072, 0, " "], + [5073, 0, "m"], + [5074, 0, "u"], + [5075, 0, "t"], + [5076, 0, "a"], + [5077, 0, "t"], + [5078, 0, "i"], + [5079, 0, "o"], + [5080, 0, "n"], + [5081, 0, "."], + [5082, 0, " "], + [5083, 0, "T"], + [5084, 0, "h"], + [5085, 0, "o"], + [5086, 0, "s"], + [5087, 0, "e"], + [5088, 0, " "], + [5089, 0, "o"], + [5090, 0, "p"], + [5091, 0, "e"], + [5092, 0, "r"], + [5093, 0, "a"], + [5094, 0, "t"], + [5095, 0, "i"], + [5096, 0, "o"], + [5097, 0, "n"], + [5098, 0, "s"], + [5099, 0, " "], + [5100, 0, "a"], + [5101, 0, "r"], + [5102, 0, "e"], + [5103, 0, " "], + [5104, 0, "a"], + [5105, 0, "p"], + [5106, 0, "p"], + [5107, 0, "l"], + [5108, 0, "i"], + [5109, 0, "e"], + [5110, 0, "d"], + [5111, 0, " "], + [5112, 0, "t"], + [5113, 0, "o"], + [5114, 0, " "], + [5115, 0, "t"], + [5116, 0, "h"], + [5117, 0, "e"], + [5118, 0, " "], + [5119, 0, "l"], + [5120, 0, "o"], + [5121, 0, "c"], + [5122, 0, "a"], + [5123, 0, "l"], + [5124, 0, " "], + [5125, 0, "c"], + [5126, 0, "o"], + [5127, 0, "p"], + [5128, 0, "y"], + [5129, 0, " "], + [5130, 0, "o"], + [5131, 0, "f"], + [5132, 0, " "], + [5133, 0, "t"], + [5134, 0, "h"], + [5135, 0, "e"], + [5136, 0, " "], + [5137, 0, "d"], + [5138, 0, "o"], + [5139, 0, "c"], + [5140, 0, "u"], + [5141, 0, "m"], + [5142, 0, "e"], + [5143, 0, "n"], + [5144, 0, "t"], + [5145, 0, ","], + [5146, 0, " "], + [5147, 0, "a"], + [5148, 0, "n"], + [5149, 0, "d"], + [5150, 0, " "], + [5151, 0, "a"], + [5152, 0, "l"], + [5153, 0, "s"], + [5154, 0, "o"], + [5155, 0, " "], + [5156, 0, "e"], + [5157, 0, "n"], + [5158, 0, "q"], + [5159, 0, "u"], + [5160, 0, "e"], + [5161, 0, "u"], + [5162, 0, "e"], + [5163, 0, "d"], + [5164, 0, " "], + [5165, 0, "f"], + [5166, 0, "o"], + [5167, 0, "r"], + [5168, 0, " "], + [5169, 0, "b"], + [5170, 0, "r"], + [5171, 0, "o"], + [5172, 0, "a"], + [5173, 0, "d"], + [5174, 0, "c"], + [5175, 0, "a"], + [5176, 0, "s"], + [5177, 0, "t"], + [5178, 0, "i"], + [5179, 0, "n"], + [5180, 0, "g"], + [5181, 0, " "], + [5182, 0, "t"], + [5183, 0, "o"], + [5184, 0, " "], + [5185, 0, "o"], + [5186, 0, "t"], + [5187, 0, "h"], + [5188, 0, "e"], + [5189, 0, "r"], + [5190, 0, " "], + [5191, 0, "p"], + [5192, 0, "e"], + [5193, 0, "e"], + [5194, 0, "r"], + [5195, 0, "s"], + [5196, 0, "."], + [1327, 1], + [1326, 1], + [1325, 1], + [1324, 1], + [1323, 1], + [1322, 1], + [1321, 1], + [1320, 1], + [1319, 1], + [1318, 1], + [1317, 1], + [1316, 1], + [1315, 1], + [1314, 1], + [1313, 1], + [1312, 1], + [1311, 1], + [1310, 1], + [1309, 1], + [1308, 1], + [1307, 1], + [1307, 0, "T"], + [1307, 1], + [1307, 0, "C"], + [1308, 0, "o"], + [1309, 0, "m"], + [1310, 0, "p"], + [1311, 0, "o"], + [1312, 0, "s"], + [1313, 0, "i"], + [1314, 0, "n"], + [1315, 0, "g"], + [1316, 0, " "], + [1317, 0, "c"], + [1318, 0, "o"], + [1319, 0, "l"], + [1320, 0, "l"], + [1321, 0, "a"], + [1322, 0, "b"], + [1323, 0, "o"], + [1324, 0, "r"], + [1325, 0, "a"], + [1326, 0, "t"], + [1327, 0, "i"], + [1328, 0, "v"], + [1329, 0, "e"], + [1330, 0, " "], + [1331, 0, "d"], + [1332, 0, "a"], + [1333, 0, "t"], + [1334, 0, "a"], + [1335, 0, " "], + [1336, 0, "s"], + [1337, 0, "t"], + [1338, 0, "r"], + [1339, 0, "u"], + [1340, 0, "c"], + [1341, 0, "t"], + [1342, 0, "u"], + [1343, 0, "r"], + [1344, 0, "e"], + [1345, 0, "s"], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1349, 1], + [1330, 1], + [1329, 1], + [1328, 1], + [1327, 1], + [1326, 1], + [1325, 1], + [1324, 1], + [1323, 1], + [1322, 1], + [1321, 1], + [1320, 1], + [1319, 1], + [1318, 1], + [1317, 1], + [1335, 0, "I"], + [1336, 0, "n"], + [1337, 0, " "], + [1338, 0, "t"], + [1339, 0, "h"], + [1340, 0, "i"], + [1341, 0, "s"], + [1342, 0, " "], + [1343, 0, "s"], + [1344, 0, "e"], + [1345, 0, "c"], + [1346, 0, "t"], + [1347, 0, "i"], + [1348, 0, "o"], + [1349, 0, "n"], + [1350, 0, " "], + [1351, 0, "w"], + [1352, 0, "e"], + [1353, 0, " "], + [1354, 0, "o"], + [1355, 0, "u"], + [1356, 0, "t"], + [1357, 0, "l"], + [1358, 0, "i"], + [1359, 0, "n"], + [1360, 0, "e"], + [1361, 0, " "], + [1362, 0, "o"], + [1363, 0, "u"], + [1364, 0, "r"], + [1365, 0, " "], + [1366, 0, "a"], + [1367, 0, "p"], + [1368, 0, "p"], + [1369, 0, "r"], + [1370, 0, "o"], + [1371, 0, "a"], + [1372, 0, "c"], + [1373, 0, "h"], + [1374, 0, " "], + [1375, 0, "b"], + [1376, 0, "y"], + [1377, 0, " "], + [1378, 0, "e"], + [1379, 0, "x"], + [1380, 0, "a"], + [1381, 0, "m"], + [1382, 0, "p"], + [1383, 0, "l"], + [1384, 0, "e"], + [1385, 0, ","], + [1386, 0, " "], + [1387, 0, "a"], + [1388, 0, "n"], + [1389, 0, "d"], + [1390, 0, " "], + [1391, 0, "d"], + [1392, 0, "e"], + [1393, 0, "m"], + [1394, 0, "o"], + [1395, 0, "n"], + [1396, 0, "s"], + [1397, 0, "t"], + [1398, 0, "r"], + [1399, 0, "a"], + [1400, 0, "t"], + [1401, 0, "e"], + [1402, 0, " "], + [1403, 0, "s"], + [1404, 0, "o"], + [1405, 0, "m"], + [1406, 0, "e"], + [1407, 0, " "], + [1408, 0, "o"], + [1409, 0, "f"], + [1410, 0, " "], + [1411, 0, "t"], + [1412, 0, "h"], + [1413, 0, "e"], + [1414, 0, " "], + [1415, 0, "p"], + [1416, 0, "r"], + [1417, 0, "o"], + [1418, 0, "b"], + [1419, 0, "l"], + [1420, 0, "e"], + [1421, 0, "m"], + [1422, 0, " "], + [1423, 0, "t"], + [1424, 0, "h"], + [1425, 0, "a"], + [1426, 0, "t"], + [1427, 0, " "], + [1428, 0, "o"], + [1429, 0, "c"], + [1430, 0, "c"], + [1431, 0, "u"], + [1432, 0, "r"], + [1433, 0, " "], + [1434, 0, "w"], + [1435, 0, "h"], + [1436, 0, "e"], + [1437, 0, "n"], + [1438, 0, " "], + [1439, 0, "n"], + [1440, 0, "e"], + [1441, 0, "s"], + [1442, 0, "t"], + [1443, 0, "e"], + [1444, 0, "d"], + [1445, 0, " "], + [1446, 0, "d"], + [1447, 0, "a"], + [1448, 0, "t"], + [1449, 0, "a"], + [1450, 0, " "], + [1451, 0, "s"], + [1452, 0, "t"], + [1453, 0, "r"], + [1454, 0, "u"], + [1455, 0, "c"], + [1456, 0, "t"], + [1457, 0, "u"], + [1458, 0, "r"], + [1459, 0, "e"], + [1460, 0, "s"], + [1461, 0, " "], + [1462, 0, "a"], + [1463, 0, "r"], + [1464, 0, "e"], + [1465, 0, " "], + [1466, 0, "m"], + [1467, 0, "a"], + [1468, 0, "d"], + [1469, 0, "e"], + [1470, 0, " "], + [1471, 0, "c"], + [1472, 0, "o"], + [1473, 0, "l"], + [1474, 0, "l"], + [1475, 0, "a"], + [1476, 0, "b"], + [1477, 0, "o"], + [1478, 0, "r"], + [1479, 0, "a"], + [1480, 0, "t"], + [1481, 0, "i"], + [1482, 0, "v"], + [1483, 0, "e"], + [1484, 0, "l"], + [1485, 0, "y"], + [1486, 0, " "], + [1487, 0, "e"], + [1488, 0, "d"], + [1489, 0, "i"], + [1490, 0, "t"], + [1491, 0, "a"], + [1492, 0, "b"], + [1493, 0, "l"], + [1494, 0, "e"], + [1495, 0, "."], + [1422, 0, "s"], + [1497, 0, " "], + [1498, 0, "I"], + [1499, 0, "n"], + [1500, 0, " "], + [1501, 0, "t"], + [1502, 0, "h"], + [1503, 0, "e"], + [1504, 0, " "], + [1505, 0, "n"], + [1506, 0, "e"], + [1507, 0, "x"], + [1508, 0, "t"], + [1509, 0, " "], + [1510, 0, "s"], + [1511, 0, "e"], + [1512, 0, "c"], + [1513, 0, "t"], + [1514, 0, "i"], + [1515, 0, "o"], + [1516, 0, "n"], + [1517, 0, " "], + [1518, 0, "w"], + [1519, 0, "e"], + [1520, 0, " "], + [1521, 0, "p"], + [1522, 0, "r"], + [1523, 0, "o"], + [1524, 0, "v"], + [1525, 0, "i"], + [1526, 0, "d"], + [1527, 0, "e"], + [1528, 0, " "], + [1529, 0, "f"], + [1530, 0, "o"], + [1531, 0, "r"], + [1532, 0, "m"], + [1533, 0, "a"], + [1534, 0, "l"], + [1535, 0, " "], + [1536, 0, "s"], + [1537, 0, "e"], + [1538, 0, "m"], + [1539, 0, "a"], + [1540, 0, "n"], + [1541, 0, "t"], + [1542, 0, "i"], + [1543, 0, "c"], + [1544, 0, "s"], + [1545, 0, " "], + [1546, 0, "o"], + [1547, 0, "f"], + [1548, 0, " "], + [1549, 0, "o"], + [1550, 0, "u"], + [1551, 0, "r"], + [1552, 0, " "], + [1553, 0, "c"], + [1554, 0, "o"], + [1555, 0, "l"], + [1556, 0, "l"], + [1557, 0, "a"], + [1558, 0, "b"], + [1559, 0, "o"], + [1560, 0, "r"], + [1561, 0, "e"], + [1562, 0, "a"], + [1562, 1], + [1561, 1], + [1561, 0, "a"], + [1562, 0, "t"], + [1563, 0, "i"], + [1564, 0, "v"], + [1565, 0, "e"], + [1566, 0, "l"], + [1567, 0, "y"], + [1568, 0, " "], + [1569, 0, "e"], + [1570, 0, "d"], + [1571, 0, "i"], + [1572, 0, "t"], + [1573, 0, "a"], + [1574, 0, "b"], + [1575, 0, "l"], + [1576, 0, "e"], + [1577, 0, " "], + [1505, 1], + [1505, 1], + [1505, 1], + [1505, 1], + [1505, 0, "f"], + [1506, 0, "o"], + [1507, 0, "l"], + [1508, 0, "l"], + [1509, 0, "o"], + [1510, 0, "w"], + [1511, 0, "i"], + [1512, 0, "n"], + [1513, 0, "g"], + [1583, 0, "d"], + [1584, 0, "a"], + [1585, 0, "t"], + [1586, 0, "a"], + [1587, 0, "t"], + [1588, 0, "y"], + [1589, 0, "p"], + [1590, 0, "e"], + [1591, 0, " "], + [1592, 0, "a"], + [1593, 0, "n"], + [1594, 0, "d"], + [1595, 0, " "], + [1596, 0, "p"], + [1597, 0, "r"], + [1598, 0, "o"], + [1599, 0, "v"], + [1600, 0, "e"], + [1601, 0, " "], + [1602, 0, "i"], + [1603, 0, "t"], + [1604, 0, "s"], + [1605, 0, " "], + [1606, 0, "c"], + [1607, 0, "o"], + [1608, 0, "r"], + [1609, 0, "r"], + [1610, 0, "e"], + [1611, 0, "c"], + [1612, 0, "t"], + [1613, 0, "n"], + [1614, 0, "e"], + [1615, 0, "s"], + [1616, 0, "s"], + [1617, 0, "."], + [758, 0, "\n"], + [759, 0, "%"], + [760, 0, " "], + [761, 0, "S"], + [762, 0, "p"], + [763, 0, "a"], + [764, 0, "n"], + [765, 0, " "], + [766, 0, "m"], + [767, 0, "u"], + [768, 0, "l"], + [769, 0, "t"], + [770, 0, "i"], + [771, 0, "p"], + [772, 0, "l"], + [773, 0, "e"], + [774, 0, " "], + [775, 0, "c"], + [776, 0, "o"], + [777, 0, "l"], + [778, 0, "u"], + [779, 0, "m"], + [780, 0, "n"], + [781, 0, "s"], + [782, 0, " "], + [783, 0, "w"], + [784, 0, "i"], + [785, 0, "t"], + [786, 0, "h"], + [787, 0, "i"], + [788, 0, "n"], + [789, 0, " "], + [790, 0, "a"], + [791, 0, "n"], + [792, 0, " "], + [793, 0, "a"], + [794, 0, "l"], + [795, 0, "i"], + [796, 0, "g"], + [797, 0, "n"], + [798, 0, "a"], + [799, 0, "t"], + [800, 0, " "], + [801, 0, "m"], + [802, 0, "a"], + [803, 0, "t"], + [804, 0, "h"], + [805, 0, " "], + [806, 0, "e"], + [807, 0, "n"], + [808, 0, "v"], + [809, 0, "i"], + [810, 0, "r"], + [811, 0, "o"], + [812, 0, "n"], + [813, 0, "m"], + [814, 0, "e"], + [815, 0, "n"], + [816, 0, "t"], + [292, 0, "\n"], + [293, 0, "\\"], + [294, 0, "u"], + [295, 0, "s"], + [296, 0, "e"], + [297, 0, "p"], + [298, 0, "a"], + [299, 0, "c"], + [300, 0, "k"], + [301, 0, "a"], + [302, 0, "g"], + [303, 0, "e"], + [304, 0, "{"], + [305, 0, "t"], + [306, 0, "i"], + [307, 0, "k"], + [308, 0, "z"], + [309, 0, "}"], + [3073, 0, "\n"], + [3074, 0, "\n"], + [3075, 0, "\\"], + [3076, 0, "s"], + [3077, 0, "u"], + [3078, 0, "b"], + [3079, 0, "s"], + [3080, 0, "e"], + [3081, 0, "c"], + [3082, 0, "t"], + [3083, 0, "i"], + [3084, 0, "o"], + [3085, 0, "n"], + [3086, 0, "{"], + [3087, 0, "C"], + [3088, 0, "o"], + [3089, 0, "n"], + [3090, 0, "c"], + [3091, 0, "u"], + [3092, 0, "r"], + [3093, 0, "r"], + [3094, 0, "e"], + [3095, 0, "n"], + [3096, 0, "t"], + [3097, 0, " "], + [3098, 0, "e"], + [3099, 0, "d"], + [3100, 0, "i"], + [3101, 0, "t"], + [3102, 0, "i"], + [3103, 0, "n"], + [3104, 0, "g"], + [3105, 0, " "], + [3106, 0, "e"], + [3107, 0, "x"], + [3108, 0, "a"], + [3109, 0, "m"], + [3110, 0, "p"], + [3111, 0, "l"], + [3112, 0, "e"], + [3113, 0, "s"], + [3114, 0, "}"], + [3115, 0, "\n"], + [3116, 0, "\n"], + [3117, 0, "\\"], + [3118, 0, "b"], + [3119, 0, "e"], + [3120, 0, "g"], + [3121, 0, "i"], + [3122, 0, "n"], + [3123, 0, "{"], + [3124, 0, "f"], + [3125, 0, "i"], + [3126, 0, "g"], + [3127, 0, "u"], + [3128, 0, "r"], + [3129, 0, "e"], + [3130, 0, "*"], + [3131, 0, "}"], + [3132, 0, "\n"], + [3133, 0, "\\"], + [3134, 0, "e"], + [3135, 0, "n"], + [3136, 0, "d"], + [3137, 0, "{"], + [3138, 0, "f"], + [3139, 0, "i"], + [3140, 0, "g"], + [3141, 0, "u"], + [3142, 0, "r"], + [3143, 0, "e"], + [3144, 0, "*"], + [3145, 0, "}"], + [3144, 1], + [3130, 1], + [3131, 0, "\n"], + [3132, 0, "\\"], + [3133, 0, "b"], + [3134, 0, "e"], + [3135, 0, "g"], + [3136, 0, "i"], + [3137, 0, "n"], + [3138, 0, "{"], + [3139, 0, "t"], + [3140, 0, "i"], + [3141, 0, "k"], + [3142, 0, "z"], + [3143, 0, "p"], + [3144, 0, "i"], + [3145, 0, "c"], + [3146, 0, "t"], + [3147, 0, "u"], + [3148, 0, "r"], + [3149, 0, "e"], + [3150, 0, "}"], + [3151, 0, "\n"], + [3152, 0, "\\"], + [3153, 0, "e"], + [3154, 0, "n"], + [3155, 0, "d"], + [3156, 0, "{"], + [3157, 0, "t"], + [3158, 0, "i"], + [3159, 0, "k"], + [3160, 0, "z"], + [3161, 0, "p"], + [3162, 0, "i"], + [3163, 0, "c"], + [3164, 0, "t"], + [3165, 0, "u"], + [3166, 0, "r"], + [3167, 0, "e"], + [3168, 0, "}"], + [3169, 0, " "], + [3169, 1], + [3169, 0, "\n"], + [3170, 0, "\\"], + [3171, 0, "c"], + [3172, 0, "a"], + [3173, 0, "p"], + [3174, 0, "t"], + [3175, 0, "i"], + [3176, 0, "o"], + [3177, 0, "n"], + [3178, 0, "{"], + [3179, 0, "C"], + [3180, 0, "o"], + [3181, 0, "n"], + [3182, 0, "c"], + [3183, 0, "u"], + [3184, 0, "r"], + [3185, 0, "r"], + [3186, 0, "e"], + [3187, 0, "n"], + [3188, 0, "t"], + [3189, 0, " "], + [3190, 0, "a"], + [3191, 0, "s"], + [3192, 0, "s"], + [3193, 0, "i"], + [3194, 0, "g"], + [3195, 0, "n"], + [3196, 0, "m"], + [3197, 0, "e"], + [3198, 0, "n"], + [3199, 0, "t"], + [3200, 0, " "], + [3201, 0, "t"], + [3202, 0, "o"], + [3203, 0, " "], + [3204, 0, "a"], + [3205, 0, " "], + [3206, 0, "r"], + [3207, 0, "e"], + [3208, 0, "g"], + [3209, 0, "i"], + [3210, 0, "s"], + [3211, 0, "t"], + [3212, 0, "e"], + [3213, 0, "r"], + [3214, 0, "}"], + [3215, 0, "\\"], + [3216, 0, "l"], + [3217, 0, "a"], + [3218, 0, "b"], + [3219, 0, "e"], + [3220, 0, "l"], + [3221, 0, "["], + [3221, 1], + [3221, 0, "{"], + [3222, 0, "f"], + [3223, 0, "i"], + [3224, 0, "g"], + [3225, 0, ":"], + [3226, 0, "r"], + [3227, 0, "e"], + [3228, 0, "g"], + [3229, 0, "i"], + [3230, 0, "s"], + [3231, 0, "t"], + [3232, 0, "e"], + [3233, 0, "r"], + [3234, 0, "-"], + [3235, 0, "a"], + [3236, 0, "s"], + [3237, 0, "s"], + [3238, 0, "i"], + [3239, 0, "g"], + [3240, 0, "n"], + [3241, 0, "}"], + [3151, 0, "\n"], + [3152, 0, "\\"], + [3153, 0, "d"], + [3154, 0, "r"], + [3155, 0, "a"], + [3156, 0, "w"], + [3157, 0, "("], + [3158, 0, "2"], + [3159, 0, ","], + [3160, 0, "0"], + [3161, 0, ")"], + [3162, 0, " "], + [3163, 0, "n"], + [3164, 0, "o"], + [3165, 0, "d"], + [3166, 0, "e"], + [3167, 0, " "], + [3168, 0, "{"], + [3169, 0, "H"], + [3170, 0, "e"], + [3171, 0, "l"], + [3172, 0, "l"], + [3173, 0, "o"], + [3174, 0, "}"], + [3175, 0, " "], + [3176, 0, "-"], + [3177, 0, "-"], + [3178, 0, " "], + [3179, 0, "("], + [3157, 0, " "], + [3181, 0, "0"], + [3182, 0, ","], + [3183, 0, " "], + [3184, 0, "2"], + [3183, 1], + [3184, 0, ")"], + [3185, 0, " "], + [3186, 0, "n"], + [3187, 0, "o"], + [3188, 0, "d"], + [3189, 0, "e"], + [3190, 0, " "], + [3191, 0, "{"], + [3192, 0, "W"], + [3193, 0, "o"], + [3194, 0, "r"], + [3195, 0, "l"], + [3196, 0, "d"], + [3197, 0, "}"], + [3198, 0, ";"], + [3131, 0, "\n"], + [3132, 0, "\\"], + [3133, 0, "c"], + [3134, 0, "e"], + [3135, 0, "n"], + [3136, 0, "t"], + [3137, 0, "e"], + [3138, 0, "r"], + [3139, 0, "i"], + [3140, 0, "n"], + [3141, 0, "g"], + [3172, 1], + [3172, 0, "2"], + [3194, 1], + [3194, 0, "0"], + [3185, 1], + [3184, 1], + [3183, 1], + [3182, 1], + [3181, 1], + [3181, 0, "v"], + [3181, 1], + [3181, 0, "\\"], + [3182, 0, "v"], + [3183, 0, "e"], + [3184, 0, "r"], + [3185, 0, "b"], + [3186, 0, "|"], + [3187, 0, "{"], + [3188, 0, "\""], + [3189, 0, "t"], + [3190, 0, "i"], + [3191, 0, "t"], + [3192, 0, "l"], + [3193, 0, "e"], + [3194, 0, "\""], + [3195, 0, ":"], + [3196, 0, " "], + [3197, 0, "\""], + [3198, 0, "A"], + [3199, 0, "\""], + [3200, 0, "}"], + [3201, 0, "|"], + [3203, 0, "\n"], + [3204, 0, " "], + [3205, 0, " "], + [3226, 1], + [3225, 1], + [3224, 1], + [3223, 1], + [3222, 1], + [3222, 0, "\\"], + [3223, 0, "v"], + [3224, 0, "e"], + [3225, 0, "r"], + [3226, 0, "b"], + [3227, 0, "|"], + [3228, 0, "{"], + [3229, 0, "\""], + [3230, 0, "t"], + [3231, 0, "i"], + [3232, 0, "t"], + [3233, 0, "l"], + [3234, 0, "e"], + [3235, 0, "\""], + [3236, 0, ":"], + [3237, 0, " "], + [3238, 0, ":"], + [3238, 1], + [3238, 0, "\""], + [3239, 0, "B"], + [3240, 0, "\""], + [3241, 0, "}"], + [3242, 0, "|"], + [3213, 1], + [3213, 0, "1"], + [3214, 0, " "], + [3214, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [293, 1], + [391, 0, "\n"], + [392, 0, "\n"], + [393, 0, "%"], + [394, 0, " "], + [395, 0, "D"], + [396, 0, "i"], + [397, 0, "a"], + [398, 0, "g"], + [399, 0, "r"], + [400, 0, "a"], + [401, 0, "m"], + [402, 0, "s"], + [403, 0, "\n"], + [404, 0, "\\"], + [405, 0, "u"], + [406, 0, "s"], + [407, 0, "e"], + [408, 0, "p"], + [409, 0, "a"], + [410, 0, "c"], + [411, 0, "k"], + [412, 0, "a"], + [413, 0, "g"], + [414, 0, "e"], + [415, 0, "{"], + [416, 0, "t"], + [417, 0, "i"], + [418, 0, "k"], + [419, 0, "z"], + [420, 0, "}"], + [421, 0, "\n"], + [422, 0, "\\"], + [423, 0, "u"], + [424, 0, "s"], + [425, 0, "e"], + [426, 0, "t"], + [427, 0, "i"], + [428, 0, "k"], + [429, 0, "z"], + [430, 0, "l"], + [431, 0, "i"], + [432, 0, "b"], + [433, 0, "r"], + [434, 0, "a"], + [435, 0, "r"], + [436, 0, "y"], + [437, 0, "{"], + [438, 0, "a"], + [439, 0, "r"], + [440, 0, "r"], + [441, 0, "o"], + [442, 0, "w"], + [443, 0, "s"], + [444, 0, "}"], + [445, 0, "\n"], + [3199, 0, "\n"], + [3200, 0, "\\"], + [3201, 0, "n"], + [3202, 0, "o"], + [3203, 0, "d"], + [3204, 0, "e"], + [3205, 0, "["], + [3206, 0, "s"], + [3207, 0, "t"], + [3208, 0, "a"], + [3209, 0, "r"], + [3210, 0, "t"], + [3211, 0, "]"], + [3211, 1], + [3210, 1], + [3209, 1], + [3208, 1], + [3207, 1], + [3206, 1], + [3205, 1], + [3205, 0, " "], + [3206, 0, "("], + [3207, 0, "s"], + [3208, 0, "t"], + [3209, 0, "a"], + [3210, 0, "r"], + [3211, 0, "t"], + [3212, 0, ")"], + [3213, 0, " "], + [3214, 0, "a"], + [3215, 0, "t"], + [3216, 0, " "], + [3217, 0, "("], + [3218, 0, "2"], + [3219, 0, ","], + [3220, 0, "2"], + [3221, 0, ")"], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3222, 1], + [3247, 0, "\\"], + [3248, 0, "n"], + [3249, 0, "o"], + [3250, 0, "d"], + [3251, 0, "e"], + [3252, 0, " "], + [3253, 0, "("], + [3254, 0, "l"], + [3255, 0, "e"], + [3256, 0, "f"], + [3257, 0, "t"], + [3258, 0, ")"], + [3261, 1], + [3261, 1], + [3261, 1], + [3261, 0, "a"], + [3262, 0, "t"], + [3270, 1], + [3270, 1], + [3270, 1], + [3270, 1], + [3270, 1], + [3246, 0, ";"], + [3295, 0, "\n"], + [3296, 0, "\\"], + [3297, 0, "d"], + [3298, 0, "r"], + [3299, 0, "a"], + [3300, 0, "w"], + [3301, 0, " "], + [3302, 0, "["], + [3303, 0, "-"], + [3304, 0, ">"], + [3305, 0, "]"], + [3306, 0, " "], + [3307, 0, "("], + [3308, 0, "s"], + [3309, 0, "t"], + [3310, 0, "a"], + [3311, 0, "r"], + [3312, 0, "t"], + [3313, 0, ")"], + [3314, 0, " "], + [3315, 0, "-"], + [3316, 0, "-"], + [3317, 0, " "], + [3318, 0, "("], + [3319, 0, "e"], + [3320, 0, "n"], + [3321, 0, "t"], + [3322, 0, "e"], + [3323, 0, "r"], + [3324, 0, " "], + [3325, 0, "l"], + [3326, 0, "e"], + [3327, 0, "f"], + [3328, 0, "t"], + [3329, 0, ")"], + [3330, 0, ";"], + [3324, 1], + [3323, 1], + [3322, 1], + [3321, 1], + [3320, 1], + [3319, 1], + [3295, 0, "\n"], + [3296, 0, "\\"], + [3297, 0, "n"], + [3298, 0, "o"], + [3299, 0, "d"], + [3300, 0, "e"], + [3301, 0, " "], + [3302, 0, "("], + [3303, 0, "r"], + [3304, 0, "i"], + [3305, 0, "g"], + [3306, 0, "h"], + [3307, 0, "t"], + [3308, 0, ")"], + [3309, 0, " "], + [3310, 0, "a"], + [3311, 0, "t"], + [3312, 0, " "], + [3313, 0, "("], + [3314, 0, "4"], + [3315, 0, ","], + [3316, 0, "1"], + [3317, 0, ")"], + [3318, 0, " "], + [3319, 0, "{"], + [3320, 0, "\\"], + [3321, 0, "v"], + [3322, 0, "e"], + [3323, 0, "r"], + [3324, 0, "b"], + [3325, 0, "|"], + [3326, 0, "{"], + [3327, 0, "\""], + [3328, 0, "t"], + [3329, 0, "i"], + [3330, 0, "t"], + [3331, 0, "l"], + [3332, 0, "e"], + [3333, 0, "\""], + [3334, 0, ":"], + [3335, 0, " "], + [3336, 0, "\""], + [3337, 0, "C"], + [3338, 0, "\""], + [3339, 0, "}"], + [3340, 0, "|"], + [3341, 0, "}"], + [3342, 0, ";"], + [3373, 0, "\n"], + [3374, 0, "\\"], + [3375, 0, "d"], + [3376, 0, "r"], + [3377, 0, "a"], + [3378, 0, "w"], + [3379, 0, " "], + [3380, 0, "["], + [3381, 0, "-"], + [3382, 0, ">"], + [3383, 0, "]"], + [3384, 0, " "], + [3385, 0, "("], + [3386, 0, "s"], + [3387, 0, "t"], + [3388, 0, "a"], + [3389, 0, "r"], + [3390, 0, "t"], + [3391, 0, ")"], + [3392, 0, " "], + [3393, 0, "-"], + [3394, 0, "-"], + [3395, 0, " "], + [3396, 0, "("], + [3397, 0, "r"], + [3398, 0, "i"], + [3399, 0, "g"], + [3400, 0, "h"], + [3401, 0, "t"], + [3402, 0, ")"], + [3403, 0, ";"], + [3259, 0, "1"], + [3309, 0, "1"], + [3213, 0, " "], + [3221, 1], + [3221, 0, "4"], + [3270, 1], + [3270, 0, "2"], + [3319, 1], + [3319, 0, "2"], + [3346, 0, "\n"], + [3347, 0, "\\"], + [3348, 0, "n"], + [3349, 0, "o"], + [3350, 0, "d"], + [3351, 0, "e"], + [3352, 0, " "], + [3353, 0, "("], + [3354, 0, "l"], + [3355, 0, "e"], + [3356, 0, "f"], + [3357, 0, "t"], + [3358, 0, "2"], + [3359, 0, ")"], + [3360, 0, " "], + [3361, 0, " "], + [3362, 0, "a"], + [3363, 0, "t"], + [3364, 0, " "], + [3365, 0, "("], + [3366, 0, "0"], + [3367, 0, ","], + [3368, 0, " "], + [3369, 0, "0"], + [3369, 1], + [3368, 1], + [3368, 0, ")"], + [3368, 1], + [3368, 0, "0"], + [3369, 0, ")"], + [3370, 0, " "], + [3371, 0, "{"], + [3372, 0, "\\"], + [3373, 0, "v"], + [3374, 0, "e"], + [3375, 0, "r"], + [3376, 0, "b"], + [3377, 0, "|"], + [3378, 0, "{"], + [3379, 0, "\""], + [3380, 0, "t"], + [3381, 0, "i"], + [3382, 0, "t"], + [3383, 0, "l"], + [3384, 0, "e"], + [3385, 0, "\""], + [3386, 0, ":"], + [3387, 0, ":"], + [3388, 0, " "], + [3389, 0, "{"], + [3389, 1], + [3388, 1], + [3387, 1], + [3387, 0, " "], + [3388, 0, "{"], + [3389, 0, "\""], + [3390, 0, "B"], + [3391, 0, "\""], + [3392, 0, ","], + [3393, 0, "\""], + [3394, 0, "C"], + [3395, 0, "\""], + [3396, 0, "}"], + [3397, 0, "}"], + [3398, 0, "|"], + [3399, 0, "}"], + [3400, 0, ";"], + [3401, 0, "\n"], + [3402, 0, "\\"], + [3403, 0, "n"], + [3404, 0, "o"], + [3405, 0, "d"], + [3406, 0, "e"], + [3407, 0, " "], + [3408, 0, "("], + [3409, 0, "r"], + [3410, 0, "i"], + [3411, 0, "g"], + [3412, 0, "h"], + [3413, 0, "t"], + [3414, 0, "2"], + [3415, 0, ")"], + [3416, 0, " "], + [3417, 0, "a"], + [3418, 0, "t"], + [3419, 0, " "], + [3420, 0, "("], + [3421, 0, "4"], + [3422, 0, ","], + [3423, 0, "0"], + [3424, 0, ")"], + [3425, 0, " "], + [3426, 0, "{"], + [3427, 0, "\\"], + [3428, 0, "v"], + [3429, 0, "e"], + [3430, 0, "r"], + [3431, 0, "b"], + [3432, 0, "|"], + [3433, 0, "{"], + [3434, 0, "\""], + [3435, 0, "t"], + [3436, 0, "i"], + [3437, 0, "t"], + [3438, 0, "l"], + [3439, 0, "e"], + [3440, 0, "\""], + [3441, 0, ":"], + [3442, 0, " "], + [3443, 0, "{"], + [3444, 0, "\""], + [3445, 0, "B"], + [3446, 0, "\""], + [3447, 0, ","], + [3448, 0, "\""], + [3449, 0, "C"], + [3450, 0, "\""], + [3451, 0, "}"], + [3452, 0, "}"], + [3453, 0, "|"], + [3454, 0, "}"], + [3455, 0, ";"], + [3517, 0, "\n"], + [3518, 0, "\\"], + [3519, 0, "d"], + [3520, 0, "r"], + [3521, 0, "a"], + [3522, 0, "w"], + [3523, 0, " "], + [3524, 0, "["], + [3525, 0, "-"], + [3526, 0, ">"], + [3527, 0, "]"], + [3528, 0, " "], + [3529, 0, "("], + [3484, 0, "1"], + [3516, 0, "1"], + [3532, 0, "l"], + [3533, 0, "e"], + [3534, 0, "f"], + [3535, 0, "t"], + [3536, 0, "1"], + [3537, 0, ")"], + [3538, 0, " "], + [3539, 0, "-"], + [3540, 0, "-"], + [3541, 0, " "], + [3542, 0, "("], + [3543, 0, "l"], + [3544, 0, "e"], + [3545, 0, "f"], + [3546, 0, "t"], + [3547, 0, "2"], + [3548, 0, ")"], + [3549, 0, ";"], + [3550, 0, "\n"], + [3551, 0, "\\"], + [3552, 0, "d"], + [3553, 0, "r"], + [3554, 0, "a"], + [3555, 0, "w"], + [3556, 0, " "], + [3557, 0, "["], + [3558, 0, "p"], + [3558, 1], + [3558, 0, "-"], + [3559, 0, ">"], + [3560, 0, "]"], + [3561, 0, " "], + [3562, 0, "("], + [3563, 0, "l"], + [3564, 0, "e"], + [3565, 0, "f"], + [3566, 0, "t"], + [3567, 0, "1"], + [3568, 0, ")"], + [3569, 0, " "], + [3570, 0, "-"], + [3571, 0, "-"], + [3572, 0, " "], + [3573, 0, "("], + [3573, 1], + [3573, 0, "("], + [3574, 0, "r"], + [3575, 0, "i"], + [3576, 0, "g"], + [3577, 0, "h"], + [3578, 0, "t"], + [3579, 0, "y"], + [3580, 0, "2"], + [3580, 1], + [3579, 1], + [3579, 0, "2"], + [3580, 0, ")"], + [3581, 0, ";"], + [3582, 0, "\n"], + [3583, 0, "\\"], + [3584, 0, "d"], + [3585, 0, "r"], + [3586, 0, "a"], + [3587, 0, "w"], + [3588, 0, " "], + [3589, 0, "["], + [3590, 0, "-"], + [3591, 0, ">"], + [3592, 0, "]"], + [3593, 0, " "], + [3594, 0, "("], + [3595, 0, "r"], + [3596, 0, "i"], + [3597, 0, "g"], + [3598, 0, "h"], + [3599, 0, "t"], + [3600, 0, "1"], + [3601, 0, ")"], + [3602, 0, " "], + [3603, 0, "-"], + [3604, 0, "-"], + [3605, 0, " "], + [3606, 0, "("], + [3607, 0, "l"], + [3608, 0, "e"], + [3609, 0, "f"], + [3610, 0, "t"], + [3611, 0, "2"], + [3612, 0, ")"], + [3613, 0, ";"], + [3614, 0, "\n"], + [3615, 0, "\\"], + [3616, 0, "d"], + [3617, 0, "r"], + [3618, 0, "a"], + [3619, 0, "w"], + [3620, 0, " "], + [3621, 0, "["], + [3622, 0, "-"], + [3623, 0, ">"], + [3624, 0, "]"], + [3625, 0, " "], + [3626, 0, "("], + [3627, 0, "r"], + [3628, 0, "i"], + [3629, 0, "g"], + [3630, 0, "h"], + [3631, 0, "t"], + [3632, 0, "2"], + [3632, 1], + [3632, 0, "1"], + [3633, 0, ")"], + [3634, 0, " "], + [3635, 0, "-"], + [3636, 0, "-"], + [3637, 0, " "], + [3638, 0, "("], + [3639, 0, "r"], + [3640, 0, "i"], + [3641, 0, "g"], + [3642, 0, "h"], + [3643, 0, "t"], + [3644, 0, "2"], + [3645, 0, ")"], + [3646, 0, ";"], + [3233, 1], + [3233, 1], + [3233, 1], + [3233, 1], + [3233, 1], + [3233, 0, "k"], + [3234, 0, "e"], + [3235, 0, "y"], + [3280, 1], + [3280, 1], + [3280, 1], + [3280, 1], + [3280, 1], + [3280, 0, "k"], + [3281, 0, "e"], + [3282, 0, "y"], + [3327, 1], + [3327, 1], + [3327, 1], + [3327, 1], + [3327, 1], + [3327, 0, "k"], + [3328, 0, "e"], + [3329, 0, "y"], + [3374, 1], + [3374, 1], + [3374, 1], + [3374, 1], + [3374, 1], + [3374, 0, "k"], + [3375, 0, "e"], + [3376, 0, "y"], + [3427, 1], + [3427, 1], + [3427, 1], + [3427, 1], + [3427, 1], + [3427, 0, "k"], + [3428, 0, "e"], + [3429, 0, "y"], + [3432, 1], + [3379, 1], + [3332, 1], + [3285, 1], + [3238, 1], + [3471, 1], + [3481, 1], + [3480, 1], + [3479, 1], + [3478, 1], + [3477, 1], + [3476, 1], + [3475, 1], + [3474, 1], + [3473, 1], + [3472, 1], + [3472, 0, "["], + [3473, 0, "-"], + [3474, 0, ">"], + [3475, 0, "]"], + [3471, 0, ";"], + [3473, 0, "\\"], + [3474, 0, "d"], + [3475, 0, "r"], + [3476, 0, "a"], + [3477, 0, "w"], + [3478, 0, " "], + [3462, 1], + [3461, 1], + [3461, 0, "t"], + [3462, 0, "o"], + [3493, 1], + [3492, 1], + [3492, 0, "t"], + [3493, 0, "o"], + [3463, 0, " "], + [3464, 0, "n"], + [3465, 0, "o"], + [3466, 0, "d"], + [3467, 0, "e"], + [3468, 0, " "], + [3469, 0, "{"], + [3470, 0, "x"], + [3471, 0, "}"], + [3472, 0, " "], + [3473, 0, "n"], + [3474, 0, "o"], + [3475, 0, "d"], + [3476, 0, "e"], + [3476, 1], + [3475, 1], + [3474, 1], + [3473, 1], + [3472, 1], + [3471, 1], + [3470, 1], + [3469, 1], + [3468, 1], + [3467, 1], + [3466, 1], + [3465, 1], + [3464, 1], + [3463, 1], + [3462, 1], + [3461, 1], + [3461, 0, "e"], + [3462, 0, "d"], + [3463, 0, "g"], + [3464, 0, "e"], + [3465, 0, " "], + [3466, 0, "{"], + [3467, 0, "x"], + [3468, 0, "}"], + [3464, 1], + [3463, 1], + [3462, 1], + [3461, 1], + [3460, 1], + [3460, 0, " "], + [3461, 0, "e"], + [3462, 0, "d"], + [3463, 0, "g"], + [3464, 0, "e"], + [3465, 0, " "], + [3466, 0, "n"], + [3467, 0, "o"], + [3468, 0, "d"], + [3469, 0, "e"], + [3199, 0, "["], + [3200, 0, "a"], + [3201, 0, "u"], + [3202, 0, "d"], + [3202, 1], + [3202, 0, "t"], + [3203, 0, "o"], + [3204, 0, "]"], + [3478, 1], + [3478, 0, "\\"], + [3479, 0, "t"], + [3480, 0, "e"], + [3481, 0, "x"], + [3482, 0, "t"], + [3483, 0, "s"], + [3484, 0, "f"], + [3485, 0, "{"], + [3486, 0, "d"], + [3487, 0, "o"], + [3488, 0, "c"], + [3489, 0, "["], + [3490, 0, "`"], + [3491, 0, "`"], + [3492, 0, "k"], + [3493, 0, "e"], + [3494, 0, "y"], + [3495, 0, "'"], + [3496, 0, "'"], + [3497, 0, "]"], + [3498, 0, " "], + [3499, 0, ":"], + [3500, 0, "="], + [3501, 0, " "], + [3502, 0, "`"], + [3503, 0, "`"], + [3504, 0, "B"], + [3505, 0, "'"], + [3506, 0, "'"], + [3507, 0, ";"], + [3489, 0, "\\"], + [3498, 0, "\\"], + [3511, 0, "}"], + [3478, 0, "$"], + [3480, 1], + [3480, 1], + [3480, 1], + [3480, 1], + [3480, 0, "m"], + [3481, 0, "a"], + [3482, 0, "t"], + [3483, 0, "h"], + [3490, 0, "}"], + [3491, 1], + [3492, 0, "\\"], + [3493, 0, "t"], + [3494, 0, "e"], + [3495, 0, "x"], + [3496, 0, "t"], + [3497, 0, "{"], + [3505, 1], + [3505, 0, "}"], + [3517, 1], + [3517, 0, "$"], + [3511, 0, "\\"], + [3512, 0, "t"], + [3513, 0, "e"], + [3514, 0, "x"], + [3515, 0, "t"], + [3516, 0, "{"], + [3523, 0, "}"], + [3485, 1], + [3484, 1], + [3483, 1], + [3482, 1], + [3481, 1], + [3480, 1], + [3480, 0, "t"], + [3481, 0, "e"], + [3482, 0, "x"], + [3483, 0, "t"], + [3554, 1], + [3553, 1], + [3553, 0, "e"], + [3554, 0, "d"], + [3555, 0, "g"], + [3556, 0, "e"], + [3557, 0, " "], + [3558, 0, "n"], + [3559, 0, "o"], + [3560, 0, "d"], + [3561, 0, "e"], + [3562, 0, " "], + [3563, 0, "{"], + [3564, 0, "$"], + [3565, 0, "\\"], + [3566, 0, "t"], + [3567, 0, "e"], + [3568, 0, "x"], + [3569, 0, "t"], + [3570, 0, "{"], + [3571, 0, "d"], + [3572, 0, "o"], + [3573, 0, "c"], + [3574, 0, "}"], + [3575, 0, "["], + [3576, 0, "\\"], + [3577, 0, "t"], + [3578, 0, "e"], + [3579, 0, "x"], + [3580, 0, "t"], + [3581, 0, "{"], + [3582, 0, "`"], + [3583, 0, "`"], + [3584, 0, "k"], + [3585, 0, "e"], + [3586, 0, "y"], + [3587, 0, "'"], + [3588, 0, "'"], + [3589, 0, "}"], + [3590, 0, "]"], + [3591, 0, " "], + [3592, 0, ":"], + [3593, 0, "="], + [3594, 0, " "], + [3595, 0, "\\"], + [3596, 0, "t"], + [3597, 0, "e"], + [3598, 0, "x"], + [3599, 0, "t"], + [3600, 0, "{"], + [3601, 0, "`"], + [3602, 0, "`"], + [3603, 0, "C"], + [3604, 0, "'"], + [3605, 0, "'"], + [3606, 0, ";"], + [3607, 0, "}"], + [3608, 0, "$"], + [3609, 0, "}"], + [3556, 1], + [3555, 1], + [3554, 1], + [3553, 1], + [3553, 0, "t"], + [3554, 0, "o"], + [3467, 1], + [3467, 1], + [3467, 1], + [3467, 1], + [3467, 0, "t"], + [3468, 0, "o"], + [3474, 0, " "], + [3475, 0, "["], + [3476, 0, "a"], + [3477, 0, "b"], + [3478, 0, "o"], + [3479, 0, "v"], + [3480, 0, "e"], + [3481, 0, "]"], + [3566, 0, " "], + [3567, 0, "["], + [3568, 0, "a"], + [3569, 0, "b"], + [3570, 0, "o"], + [3571, 0, "v"], + [3572, 0, "e"], + [3573, 0, "]"], + [3481, 0, ","], + [3482, 0, "s"], + [3483, 0, "l"], + [3484, 0, "o"], + [3485, 0, "p"], + [3486, 0, "e"], + [3487, 0, "d"], + [3580, 0, ","], + [3581, 0, "s"], + [3582, 0, "l"], + [3583, 0, "o"], + [3584, 0, "p"], + [3585, 0, "e"], + [3586, 0, "d"], + [3227, 1], + [3227, 0, "5"], + [3491, 0, "\\"], + [3492, 0, "f"], + [3493, 0, "o"], + [3494, 0, "o"], + [3495, 0, "t"], + [3496, 0, "n"], + [3497, 0, "o"], + [3498, 0, "t"], + [3499, 0, "e"], + [3500, 0, "s"], + [3501, 0, "i"], + [3502, 0, "z"], + [3503, 0, "e"], + [3504, 0, " "], + [3604, 0, "\\"], + [3605, 0, "f"], + [3606, 0, "o"], + [3607, 0, "o"], + [3608, 0, "t"], + [3609, 0, "n"], + [3610, 0, "o"], + [3611, 0, "t"], + [3612, 0, "e"], + [3613, 0, "s"], + [3614, 0, "i"], + [3615, 0, "z"], + [3616, 0, "e"], + [3617, 0, " "], + [3694, 1], + [3694, 1], + [3694, 0, "t"], + [3695, 0, "o"], + [3696, 0, " "], + [3697, 0, "n"], + [3698, 0, "o"], + [3699, 0, "d"], + [3700, 0, "e"], + [3701, 0, " "], + [3702, 0, "["], + [3703, 0, "l"], + [3704, 0, "e"], + [3705, 0, "f"], + [3706, 0, "t"], + [3707, 0, "]"], + [3708, 0, " "], + [3709, 0, "{"], + [3710, 0, "\\"], + [3711, 0, "f"], + [3712, 0, "o"], + [3713, 0, "o"], + [3714, 0, "t"], + [3715, 0, "n"], + [3716, 0, "o"], + [3717, 0, "t"], + [3718, 0, "e"], + [3719, 0, "s"], + [3720, 0, "i"], + [3721, 0, "z"], + [3722, 0, "e"], + [3723, 0, " "], + [3724, 0, "y"], + [3725, 0, "i"], + [3726, 0, "e"], + [3727, 0, "l"], + [3728, 0, "d"], + [3729, 0, ";"], + [3730, 0, "}"], + [3761, 1], + [3760, 1], + [3760, 0, "t"], + [3761, 0, "o"], + [3794, 1], + [3793, 1], + [3793, 0, "t"], + [3794, 0, "o"], + [3795, 0, " "], + [3796, 0, "n"], + [3797, 0, "o"], + [3798, 0, "d"], + [3799, 0, "e"], + [3800, 0, " "], + [3801, 0, "["], + [3802, 0, "r"], + [3803, 0, "i"], + [3804, 0, "g"], + [3805, 0, "h"], + [3806, 0, "t"], + [3807, 0, "]"], + [3808, 0, " "], + [3809, 0, "{"], + [3810, 0, "\\"], + [3811, 0, "f"], + [3812, 0, "o"], + [3813, 0, "o"], + [3814, 0, "t"], + [3815, 0, "n"], + [3816, 0, "o"], + [3817, 0, "t"], + [3818, 0, "e"], + [3819, 0, "s"], + [3820, 0, "i"], + [3821, 0, "z"], + [3822, 0, "e"], + [3823, 0, " "], + [3824, 0, "y"], + [3825, 0, "i"], + [3826, 0, "e"], + [3827, 0, "l"], + [3828, 0, "d"], + [3829, 0, ";"], + [3830, 0, "}"], + [3862, 1], + [3861, 1], + [3861, 0, "t"], + [3862, 0, "o"], + [3863, 0, " "], + [3864, 0, "n"], + [3865, 0, "o"], + [3866, 0, "d"], + [3867, 0, "e"], + [3868, 0, " "], + [3869, 0, "["], + [3870, 0, "r"], + [3871, 0, "i"], + [3872, 0, "g"], + [3873, 0, "h"], + [3874, 0, "t"], + [3875, 0, "]"], + [3876, 0, " "], + [3877, 0, "{"], + [3878, 0, "\\"], + [3879, 0, "f"], + [3880, 0, "o"], + [3881, 0, "o"], + [3882, 0, "t"], + [3883, 0, "n"], + [3884, 0, "o"], + [3885, 0, "t"], + [3886, 0, "e"], + [3887, 0, "s"], + [3888, 0, "i"], + [3889, 0, "z"], + [3890, 0, "e"], + [3891, 0, " "], + [3892, 0, "y"], + [3893, 0, "i"], + [3894, 0, "e"], + [3895, 0, "l"], + [3896, 0, "d"], + [3897, 0, ";"], + [3898, 0, "}"], + [3830, 1], + [3829, 1], + [3828, 1], + [3827, 1], + [3826, 1], + [3825, 1], + [3824, 1], + [3823, 1], + [3822, 1], + [3821, 1], + [3820, 1], + [3819, 1], + [3818, 1], + [3817, 1], + [3816, 1], + [3815, 1], + [3814, 1], + [3813, 1], + [3812, 1], + [3811, 1], + [3810, 1], + [3809, 1], + [3808, 1], + [3807, 1], + [3806, 1], + [3805, 1], + [3804, 1], + [3803, 1], + [3802, 1], + [3801, 1], + [3800, 1], + [3799, 1], + [3798, 1], + [3797, 1], + [3796, 1], + [3795, 1], + [3273, 1], + [3273, 0, "1"], + [3319, 1], + [3319, 0, "1"], + [3227, 1], + [3227, 0, "4"], + [3274, 0, "."], + [3275, 0, "3"], + [3275, 1], + [3274, 1], + [3274, 0, "."], + [3275, 0, "5"], + [3322, 0, "."], + [3323, 0, "5"], + [3459, 0, "t"], + [3460, 0, "i"], + [3461, 0, "c"], + [3461, 1], + [3460, 1], + [3459, 1], + [3459, 0, "h"], + [3459, 1], + [3459, 0, "t"], + [3460, 0, "h"], + [3461, 0, "i"], + [3462, 0, "c"], + [3463, 0, "k"], + [3464, 0, ","], + [3578, 0, "t"], + [3579, 0, "h"], + [3580, 0, "i"], + [3581, 0, "c"], + [3582, 0, "k"], + [3583, 0, ","], + [3698, 0, "t"], + [3699, 0, "h"], + [3700, 0, "i"], + [3701, 0, "c"], + [3702, 0, "k"], + [3703, 0, ","], + [3770, 0, "t"], + [3771, 0, "h"], + [3772, 0, "i"], + [3773, 0, "c"], + [3774, 0, "k"], + [3775, 0, ","], + [3808, 0, "t"], + [3809, 0, "h"], + [3810, 0, "i"], + [3811, 0, "c"], + [3812, 0, "k"], + [3813, 0, ","], + [3846, 0, "t"], + [3847, 0, "h"], + [3848, 0, "i"], + [3849, 0, "c"], + [3850, 0, "k"], + [3851, 0, ","], + [1411, 0, "\n"], + [1412, 0, "\n"], + [1412, 0, "O"], + [1413, 0, "u"], + [1414, 0, "r"], + [1415, 0, " "], + [1416, 0, "d"], + [1417, 0, "e"], + [1418, 0, "s"], + [1419, 0, "i"], + [1420, 0, "g"], + [1421, 0, "n"], + [1422, 0, " "], + [1423, 0, "i"], + [1424, 0, "s"], + [1425, 0, " "], + [1426, 0, "b"], + [1427, 0, "a"], + [1428, 0, "s"], + [1429, 0, "e"], + [1430, 0, "d"], + [1431, 0, " "], + [1432, 0, "o"], + [1433, 0, "n"], + [1434, 0, " "], + [1435, 0, "t"], + [1436, 0, "w"], + [1437, 0, "o"], + [1438, 0, " "], + [1439, 0, "s"], + [1440, 0, "i"], + [1441, 0, "m"], + [1442, 0, "p"], + [1443, 0, "l"], + [1444, 0, "e"], + [1445, 0, " "], + [1446, 0, "p"], + [1447, 0, "r"], + [1448, 0, "i"], + [1449, 0, "n"], + [1450, 0, "c"], + [1451, 0, "i"], + [1452, 0, "p"], + [1453, 0, "l"], + [1454, 0, "e"], + [1455, 0, "s"], + [1456, 0, ":"], + [1457, 0, " "], + [1457, 1], + [1457, 0, "\n"], + [1458, 0, "\\"], + [1459, 0, "b"], + [1460, 0, "e"], + [1461, 0, "g"], + [1462, 0, "i"], + [1463, 0, "n"], + [1464, 0, "{"], + [1465, 0, "e"], + [1466, 0, "n"], + [1467, 0, "u"], + [1468, 0, "m"], + [1469, 0, "e"], + [1470, 0, "r"], + [1471, 0, "a"], + [1472, 0, "t"], + [1473, 0, "e"], + [1474, 0, "}"], + [1475, 0, "\n"], + [1476, 0, "\\"], + [1477, 0, "i"], + [1478, 0, "t"], + [1479, 0, "e"], + [1480, 0, "m"], + [1481, 0, " "], + [1482, 0, "A"], + [1483, 0, "l"], + [1484, 0, "l"], + [1485, 0, " "], + [1486, 0, "r"], + [1487, 0, "e"], + [1488, 0, "p"], + [1489, 0, "l"], + [1490, 0, "i"], + [1491, 0, "c"], + [1492, 0, "a"], + [1493, 0, "s"], + [1494, 0, " "], + [1495, 0, "o"], + [1496, 0, "f"], + [1497, 0, " "], + [1498, 0, "t"], + [1499, 0, "h"], + [1500, 0, "e"], + [1501, 0, " "], + [1502, 0, "d"], + [1503, 0, "a"], + [1504, 0, "t"], + [1505, 0, "a"], + [1506, 0, " "], + [1507, 0, "s"], + [1508, 0, "t"], + [1509, 0, "r"], + [1510, 0, "u"], + [1511, 0, "c"], + [1512, 0, "t"], + [1513, 0, "u"], + [1514, 0, "r"], + [1515, 0, "e"], + [1516, 0, " "], + [1517, 0, "s"], + [1518, 0, "h"], + [1519, 0, "o"], + [1520, 0, "u"], + [1521, 0, "l"], + [1522, 0, "d"], + [1523, 0, " "], + [1524, 0, "c"], + [1525, 0, "o"], + [1526, 0, "n"], + [1527, 0, "v"], + [1528, 0, "e"], + [1529, 0, "r"], + [1530, 0, "g"], + [1531, 0, "e"], + [1532, 0, " "], + [1533, 0, "t"], + [1534, 0, "o"], + [1535, 0, "w"], + [1536, 0, "a"], + [1537, 0, "r"], + [1538, 0, "d"], + [1539, 0, "s"], + [1540, 0, " "], + [1541, 0, "t"], + [1542, 0, "h"], + [1543, 0, "e"], + [1544, 0, " "], + [1545, 0, "s"], + [1546, 0, "a"], + [1547, 0, "m"], + [1548, 0, "e"], + [1549, 0, " "], + [1550, 0, "s"], + [1551, 0, "a"], + [1551, 1], + [1551, 0, "t"], + [1552, 0, "a"], + [1553, 0, "t"], + [1554, 0, "e"], + [1555, 0, "."], + [1556, 0, "\n"], + [1557, 0, "\\"], + [1558, 0, "i"], + [1559, 0, "t"], + [1560, 0, "e"], + [1561, 0, "m"], + [1562, 0, " "], + [1563, 0, "N"], + [1564, 0, "o"], + [1565, 0, " "], + [1566, 0, "u"], + [1567, 0, "s"], + [1568, 0, "e"], + [1569, 0, "r"], + [1570, 0, " "], + [1571, 0, "i"], + [1572, 0, "n"], + [1573, 0, "p"], + [1574, 0, "u"], + [1575, 0, "t"], + [1576, 0, " "], + [1577, 0, "s"], + [1578, 0, "h"], + [1579, 0, "o"], + [1580, 0, "u"], + [1581, 0, "l"], + [1582, 0, "d"], + [1583, 0, " "], + [1584, 0, "b"], + [1585, 0, "e"], + [1586, 0, " "], + [1587, 0, "l"], + [1588, 0, "o"], + [1589, 0, "s"], + [1590, 0, "t"], + [1591, 0, " "], + [1592, 0, "d"], + [1593, 0, "u"], + [1594, 0, "e"], + [1595, 0, " "], + [1596, 0, "t"], + [1597, 0, "o"], + [1598, 0, " "], + [1599, 0, "c"], + [1600, 0, "o"], + [1601, 0, "n"], + [1602, 0, "c"], + [1603, 0, "u"], + [1604, 0, "r"], + [1605, 0, "r"], + [1606, 0, "e"], + [1607, 0, "n"], + [1608, 0, "t"], + [1609, 0, " "], + [1610, 0, "m"], + [1611, 0, "o"], + [1612, 0, "d"], + [1613, 0, "i"], + [1614, 0, "f"], + [1615, 0, "i"], + [1616, 0, "c"], + [1617, 0, "a"], + [1618, 0, "t"], + [1619, 0, "i"], + [1620, 0, "o"], + [1621, 0, "n"], + [1622, 0, "s"], + [1623, 0, "."], + [1437, 1], + [1436, 1], + [1435, 1], + [1434, 1], + [1552, 0, "\n"], + [1553, 0, "\\"], + [1554, 0, "i"], + [1555, 0, "t"], + [1556, 0, "e"], + [1557, 0, "m"], + [1558, 0, " "], + [1559, 0, "W"], + [1560, 0, "I"], + [1561, 0, "n"], + [1561, 1], + [1560, 1], + [1559, 1], + [1559, 0, "U"], + [1559, 1], + [1559, 0, "I"], + [1560, 0, "n"], + [1561, 0, " "], + [1562, 0, "t"], + [1563, 0, "h"], + [1564, 0, "e"], + [1565, 0, " "], + [1566, 0, "a"], + [1567, 0, "b"], + [1568, 0, "s"], + [1569, 0, "e"], + [1570, 0, "n"], + [1571, 0, "c"], + [1572, 0, "e"], + [1573, 0, " "], + [1574, 0, "o"], + [1575, 0, "f"], + [1576, 0, " "], + [1577, 0, "c"], + [1578, 0, "o"], + [1579, 0, "n"], + [1580, 0, "c"], + [1581, 0, "u"], + [1582, 0, "r"], + [1583, 0, "r"], + [1584, 0, "e"], + [1585, 0, "n"], + [1586, 0, "c"], + [1587, 0, "y"], + [1587, 1], + [1586, 1], + [1585, 1], + [1585, 0, "n"], + [1586, 0, "t"], + [1587, 0, " "], + [1588, 0, "m"], + [1589, 0, "o"], + [1590, 0, "d"], + [1591, 0, "i"], + [1592, 0, "f"], + [1593, 0, "i"], + [1594, 0, "c"], + [1595, 0, "a"], + [1596, 0, "t"], + [1597, 0, "i"], + [1598, 0, "o"], + [1599, 0, "n"], + [1600, 0, "s"], + [1601, 0, ","], + [1602, 0, " "], + [1603, 0, "t"], + [1604, 0, "h"], + [1605, 0, "e"], + [1606, 0, " "], + [1607, 0, "d"], + [1608, 0, "a"], + [1609, 0, "t"], + [1610, 0, "a"], + [1611, 0, " "], + [1612, 0, "s"], + [1613, 0, "t"], + [1614, 0, "r"], + [1615, 0, "u"], + [1616, 0, "c"], + [1617, 0, "t"], + [1618, 0, "u"], + [1619, 0, "r"], + [1620, 0, "e"], + [1621, 0, " "], + [1622, 0, "s"], + [1623, 0, "h"], + [1624, 0, "o"], + [1625, 0, "u"], + [1626, 0, "l"], + [1627, 0, "d"], + [1628, 0, " "], + [1629, 0, "b"], + [1630, 0, "e"], + [1631, 0, "h"], + [1632, 0, "a"], + [1633, 0, "v"], + [1634, 0, "e"], + [1635, 0, " "], + [1636, 0, "l"], + [1637, 0, "i"], + [1638, 0, "k"], + [1639, 0, "e"], + [1640, 0, " "], + [1641, 0, "i"], + [1642, 0, "t"], + [1643, 0, "s"], + [1644, 0, " "], + [1645, 0, "f"], + [1646, 0, "a"], + [1647, 0, "m"], + [1648, 0, "i"], + [1649, 0, "l"], + [1650, 0, "i"], + [1651, 0, "a"], + [1652, 0, "r"], + [1653, 0, ","], + [1654, 0, " "], + [1655, 0, "n"], + [1656, 0, "o"], + [1657, 0, "n"], + [1658, 0, "-"], + [1659, 0, "r"], + [1660, 0, "e"], + [1661, 0, "p"], + [1662, 0, "l"], + [1663, 0, "i"], + [1664, 0, "c"], + [1665, 0, "a"], + [1666, 0, "t"], + [1667, 0, "e"], + [1668, 0, "d"], + [1669, 0, " "], + [1670, 0, "v"], + [1671, 0, "e"], + [1672, 0, "r"], + [1673, 0, "s"], + [1674, 0, "i"], + [1675, 0, "o"], + [1676, 0, "n"], + [1677, 0, "."], + [1747, 0, "\\"], + [1748, 0, "e"], + [1749, 0, "n"], + [1750, 0, "d"], + [1751, 0, "{"], + [1752, 0, "e"], + [1753, 0, "n"], + [1754, 0, "u"], + [1755, 0, "m"], + [1756, 0, "e"], + [1757, 0, "r"], + [1758, 0, "a"], + [1759, 0, "t"], + [1760, 0, "e"], + [1761, 0, "}"], + [1762, 0, "\n"], + [1763, 0, "\n"], + [1763, 0, "\n"], + [1764, 0, "I"], + [1765, 0, "f"], + [1766, 0, " "], + [1767, 0, "t"], + [1768, 0, "h"], + [1769, 0, "e"], + [1770, 0, " "], + [1771, 0, "t"], + [1772, 0, "h"], + [1773, 0, "i"], + [1774, 0, "r"], + [1775, 0, "d"], + [1776, 0, " "], + [1777, 0, "c"], + [1777, 1], + [1776, 1], + [1776, 0, " "], + [1676, 1], + [1675, 1], + [1674, 1], + [1673, 1], + [1672, 1], + [1671, 1], + [1670, 1], + [1670, 0, "c"], + [1671, 0, "o"], + [1672, 0, "u"], + [1673, 0, "n"], + [1674, 0, "t"], + [1675, 0, "e"], + [1676, 0, "r"], + [1677, 0, "p"], + [1678, 0, "a"], + [1679, 0, "r"], + [1680, 0, "t"], + [1681, 1], + [1680, 1], + [1679, 1], + [1678, 1], + [1677, 1], + [1676, 1], + [1675, 1], + [1674, 1], + [1673, 1], + [1672, 1], + [1671, 1], + [1670, 1], + [1669, 1], + [1668, 1], + [1667, 1], + [1666, 1], + [1665, 1], + [1664, 1], + [1663, 1], + [1662, 1], + [1661, 1], + [1660, 1], + [1659, 1], + [1658, 1], + [1657, 1], + [1656, 1], + [1655, 1], + [1654, 1], + [1653, 1], + [1652, 1], + [1651, 1], + [1650, 1], + [1649, 1], + [1648, 1], + [1647, 1], + [1646, 1], + [1645, 1], + [1644, 1], + [1643, 1], + [1642, 1], + [1641, 1], + [1640, 1], + [1639, 1], + [1638, 1], + [1637, 1], + [1636, 1], + [1635, 1], + [1634, 1], + [1633, 1], + [1632, 1], + [1631, 1], + [1630, 1], + [1629, 1], + [1628, 1], + [1627, 1], + [1626, 1], + [1625, 1], + [1624, 1], + [1623, 1], + [1622, 1], + [1621, 1], + [1620, 1], + [1619, 1], + [1618, 1], + [1617, 1], + [1616, 1], + [1615, 1], + [1614, 1], + [1613, 1], + [1612, 1], + [1611, 1], + [1610, 1], + [1609, 1], + [1608, 1], + [1607, 1], + [1606, 1], + [1605, 1], + [1604, 1], + [1603, 1], + [1602, 1], + [1601, 1], + [1600, 1], + [1599, 1], + [1598, 1], + [1597, 1], + [1596, 1], + [1595, 1], + [1594, 1], + [1593, 1], + [1592, 1], + [1591, 1], + [1590, 1], + [1589, 1], + [1588, 1], + [1587, 1], + [1586, 1], + [1585, 1], + [1584, 1], + [1583, 1], + [1582, 1], + [1581, 1], + [1580, 1], + [1579, 1], + [1578, 1], + [1577, 1], + [1576, 1], + [1575, 1], + [1574, 1], + [1573, 1], + [1572, 1], + [1571, 1], + [1570, 1], + [1569, 1], + [1568, 1], + [1567, 1], + [1566, 1], + [1565, 1], + [1564, 1], + [1563, 1], + [1562, 1], + [1561, 1], + [1560, 1], + [1559, 1], + [1558, 1], + [1557, 1], + [1556, 1], + [1555, 1], + [1554, 1], + [1553, 1], + [1552, 1], + [1435, 0, "t"], + [1436, 0, "w"], + [1437, 0, "o"], + [1438, 0, " "], + [1654, 1], + [1653, 1], + [1652, 1], + [1651, 1], + [1650, 1], + [1649, 1], + [1649, 0, "s"], + [1650, 0, "e"], + [1651, 0, "c"], + [1652, 0, "o"], + [1653, 0, "n"], + [1654, 0, "d"], + [1655, 0, " "], + [1656, 0, "p"], + [1657, 0, "r"], + [1658, 0, "i"], + [1659, 0, "n"], + [1660, 0, "c"], + [1661, 0, "i"], + [1662, 0, "p"], + [1663, 0, "l"], + [1664, 0, "e"], + [1665, 0, " "], + [1666, 0, "i"], + [1667, 0, "s"], + [1668, 0, " "], + [1669, 0, "o"], + [1670, 0, "m"], + [1671, 0, "i"], + [1672, 0, "t"], + [1673, 0, "t"], + [1674, 0, "e"], + [1675, 0, "d"], + [1676, 0, ","], + [1677, 0, " "], + [1678, 0, "a"], + [1679, 0, " "], + [1680, 0, "s"], + [1681, 0, "i"], + [1682, 0, "m"], + [1683, 0, "p"], + [1684, 0, "l"], + [1685, 0, "e"], + [1686, 0, " "], + [1687, 0, "c"], + [1688, 0, "o"], + [1689, 0, "n"], + [1690, 0, "f"], + [1691, 0, "l"], + [1692, 0, "i"], + [1693, 0, "c"], + [1694, 0, "t"], + [1695, 0, " "], + [1696, 0, "r"], + [1697, 0, "e"], + [1698, 0, "s"], + [1699, 0, "o"], + [1700, 0, "l"], + [1701, 0, "u"], + [1702, 0, "t"], + [1703, 0, "i"], + [1704, 0, "o"], + [1705, 0, "n"], + [1706, 0, " "], + [1707, 0, "p"], + [1708, 0, "o"], + [1709, 0, "l"], + [1710, 0, "i"], + [1711, 0, "c"], + [1712, 0, "y"], + [1713, 0, " "], + [1687, 0, "`"], + [1688, 0, "`"], + [1689, 0, "l"], + [1690, 0, "a"], + [1691, 0, "s"], + [1692, 0, "t"], + [1693, 0, " "], + [1694, 0, "w"], + [1695, 0, "r"], + [1696, 0, "i"], + [1697, 0, "t"], + [1698, 0, "e"], + [1699, 0, "r"], + [1700, 0, " "], + [1701, 0, "w"], + [1702, 0, "i"], + [1703, 0, "n"], + [1704, 0, "s"], + [1705, 0, "'"], + [1706, 0, "'"], + [1707, 0, " "], + [1735, 0, "i"], + [1736, 0, "s"], + [1737, 0, " "], + [1738, 0, "s"], + [1739, 0, "u"], + [1740, 0, "f"], + [1741, 0, "f"], + [1742, 0, "i"], + [1743, 0, "c"], + [1744, 0, "i"], + [1745, 0, "e"], + [1746, 0, "n"], + [1747, 0, "t"], + [1748, 0, ","], + [1749, 0, " "], + [1750, 0, "i"], + [1751, 0, "n"], + [1752, 0, " "], + [1753, 0, "w"], + [1754, 0, "h"], + [1755, 0, "i"], + [1756, 0, "c"], + [1757, 0, "h"], + [1758, 0, " "], + [1759, 0, "o"], + [1760, 0, "n"], + [1761, 0, "e"], + [1762, 0, " "], + [1763, 0, "u"], + [1764, 0, "p"], + [1765, 0, "d"], + [1766, 0, "a"], + [1767, 0, "t"], + [1768, 0, "e"], + [1769, 0, " "], + [1769, 1], + [1768, 1], + [1767, 1], + [1766, 1], + [1765, 1], + [1764, 1], + [1763, 1], + [1763, 0, "v"], + [1764, 0, "e"], + [1765, 0, "r"], + [1766, 0, "s"], + [1767, 0, "i"], + [1768, 0, "o"], + [1769, 0, "n"], + [1770, 0, " "], + [1771, 0, "i"], + [1772, 0, "s"], + [1773, 0, " "], + [1774, 0, "c"], + [1775, 0, "h"], + [1776, 0, "o"], + [1777, 0, "s"], + [1778, 0, "e"], + [1779, 0, "n"], + [1780, 0, " "], + [1781, 0, "f"], + [1782, 0, "r"], + [1783, 0, "o"], + [1784, 0, "m"], + [1785, 0, " "], + [1786, 0, "a"], + [1787, 0, " "], + [1788, 0, "s"], + [1789, 0, "e"], + [1790, 0, "t"], + [1791, 0, " "], + [1792, 0, "o"], + [1793, 0, "f"], + [1794, 0, " "], + [1795, 0, "c"], + [1796, 0, "o"], + [1797, 0, "n"], + [1798, 0, "c"], + [1799, 0, "u"], + [1800, 0, "r"], + [1801, 0, "r"], + [1802, 0, "e"], + [1803, 0, "n"], + [1804, 0, "t"], + [1805, 0, " "], + [1806, 0, "m"], + [1807, 0, "o"], + [1808, 0, "d"], + [1809, 0, "i"], + [1810, 0, "f"], + [1811, 0, "i"], + [1812, 0, "c"], + [1813, 0, "a"], + [1814, 0, "t"], + [1815, 0, "i"], + [1816, 0, "o"], + [1817, 0, "n"], + [1524, 0, "a"], + [1525, 0, "u"], + [1526, 0, "t"], + [1527, 0, "o"], + [1528, 0, "m"], + [1528, 1], + [1527, 1], + [1526, 1], + [1525, 1], + [1524, 1], + [1624, 0, "\n"], + [1625, 0, "\\"], + [1626, 0, "i"], + [1627, 0, "t"], + [1628, 0, "e"], + [1629, 0, "m"], + [1630, 0, " "], + [1631, 0, "N"], + [1632, 0, "o"], + [1633, 0, " "], + [1634, 0, "a"], + [1635, 0, "p"], + [1636, 0, "p"], + [1637, 0, "l"], + [1638, 0, "i"], + [1639, 0, "c"], + [1640, 0, "a"], + [1641, 0, "t"], + [1642, 0, "i"], + [1643, 0, "o"], + [1644, 0, "n"], + [1645, 0, " "], + [1645, 1], + [1644, 1], + [1643, 1], + [1642, 1], + [1641, 1], + [1640, 1], + [1639, 1], + [1638, 1], + [1637, 1], + [1636, 1], + [1635, 1], + [1634, 1], + [1633, 1], + [1632, 1], + [1631, 1], + [1630, 1], + [1629, 1], + [1628, 1], + [1627, 1], + [1626, 1], + [1625, 1], + [1624, 1], + [1524, 0, "a"], + [1525, 0, "u"], + [1526, 0, "t"], + [1527, 0, "o"], + [1528, 0, "m"], + [1529, 0, "a"], + [1530, 0, "t"], + [1531, 0, "i"], + [1532, 0, "c"], + [1533, 0, "a"], + [1534, 0, "l"], + [1535, 0, "l"], + [1536, 0, "y"], + [1537, 0, " "], + [1832, 0, "s"], + [1833, 0, ","], + [1834, 0, " "], + [1835, 0, "a"], + [1836, 0, "n"], + [1837, 0, "d"], + [1838, 0, " "], + [1807, 1], + [1806, 1], + [1805, 1], + [1804, 1], + [1803, 1], + [1802, 1], + [1801, 1], + [1800, 1], + [1799, 1], + [1798, 1], + [1797, 1], + [1796, 1], + [1795, 1], + [1794, 1], + [1784, 0, " "], + [1785, 0, "o"], + [1786, 0, "f"], + [1787, 0, " "], + [1788, 0, "a"], + [1789, 0, " "], + [1790, 0, "d"], + [1791, 0, "o"], + [1792, 0, "c"], + [1793, 0, "u"], + [1794, 0, "m"], + [1795, 0, "e"], + [1796, 0, "n"], + [1797, 0, "t"], + [1808, 0, " "], + [1809, 0, "a"], + [1810, 0, "r"], + [1811, 0, "b"], + [1812, 0, "i"], + [1813, 0, "t"], + [1814, 0, "r"], + [1815, 0, "a"], + [1816, 0, "r"], + [1817, 0, "i"], + [1818, 0, "l"], + [1819, 0, "y"], + [1820, 0, ","], + [1821, 0, " "], + [1822, 0, "a"], + [1823, 0, "n"], + [1824, 0, "d"], + [1825, 0, " "], + [1826, 0, "a"], + [1827, 0, "n"], + [1828, 0, "y"], + [1859, 1], + [1858, 1], + [1857, 1], + [1856, 1], + [1855, 1], + [1854, 1], + [1854, 0, " "], + [1855, 0, "a"], + [1856, 0, "r"], + [1857, 0, "e"], + [1858, 0, " "], + [1859, 0, "d"], + [1860, 0, "i"], + [1861, 0, "s"], + [1862, 0, "c"], + [1863, 0, "a"], + [1864, 0, "r"], + [1865, 0, "d"], + [1866, 0, "e"], + [1867, 0, "d"], + [1868, 0, "."], + [1869, 0, " "], + [1870, 0, "H"], + [1871, 0, "o"], + [1872, 0, "w"], + [1873, 0, "e"], + [1874, 0, "v"], + [1875, 0, "e"], + [1876, 0, "r"], + [1877, 0, ","], + [1878, 0, " "], + [1879, 0, "t"], + [1880, 0, "h"], + [1881, 0, "e"], + [1882, 0, " "], + [1883, 0, "r"], + [1884, 0, "e"], + [1885, 0, "q"], + [1886, 0, "u"], + [1887, 0, "i"], + [1888, 0, "r"], + [1889, 0, "e"], + [1890, 0, "m"], + [1891, 0, "e"], + [1892, 0, "n"], + [1893, 0, "t"], + [1894, 0, " "], + [1895, 0, "t"], + [1896, 0, "o"], + [1897, 0, " "], + [1898, 0, "p"], + [1899, 0, "r"], + [1900, 0, "e"], + [1901, 0, "s"], + [1902, 0, "e"], + [1903, 0, "r"], + [1904, 0, "v"], + [1905, 0, "e"], + [1906, 0, " "], + [1907, 0, "u"], + [1908, 0, "s"], + [1909, 0, "e"], + [1910, 0, "r"], + [1911, 0, " "], + [1912, 0, "i"], + [1913, 0, "n"], + [1914, 0, "p"], + [1915, 0, "u"], + [1916, 0, "t"], + [1917, 0, " "], + [1918, 0, "r"], + [1919, 0, "e"], + [1920, 0, "q"], + [1921, 0, "u"], + [1922, 0, "i"], + [1923, 0, "r"], + [1924, 0, "e"], + [1925, 0, "s"], + [1926, 0, " "], + [1927, 0, "a"], + [1928, 0, " "], + [1929, 0, "m"], + [1930, 0, "o"], + [1931, 0, "r"], + [1932, 0, "e"], + [1933, 0, " "], + [1934, 0, "c"], + [1935, 0, "a"], + [1936, 0, "r"], + [1937, 0, "e"], + [1938, 0, "f"], + [1939, 0, "u"], + [1940, 0, "l"], + [1941, 0, " "], + [1942, 0, "a"], + [1943, 0, "p"], + [1944, 0, "p"], + [1945, 0, "r"], + [1946, 0, "o"], + [1947, 0, "a"], + [1948, 0, "c"], + [1949, 0, "h"], + [1950, 0, "."], + [4558, 0, "\n"], + [4559, 0, "\n"], + [4560, 0, "I"], + [4561, 0, "n"], + [4562, 0, " "], + [4563, 0, "t"], + [4564, 0, "h"], + [4565, 0, "i"], + [4566, 0, "s"], + [4567, 0, " "], + [4568, 0, "s"], + [4569, 0, "e"], + [4570, 0, "c"], + [4571, 0, "t"], + [4572, 0, "i"], + [4573, 0, "o"], + [4574, 0, "n"], + [4575, 0, " "], + [4576, 0, "w"], + [4577, 0, "e"], + [4578, 0, " "], + [4579, 0, "w"], + [4580, 0, "i"], + [4581, 0, "l"], + [4582, 0, "l"], + [4583, 0, " "], + [4584, 0, "e"], + [4585, 0, "x"], + [4586, 0, "a"], + [4587, 0, "m"], + [4588, 0, "i"], + [4589, 0, "n"], + [4590, 0, "e"], + [4591, 0, " "], + [4592, 0, "s"], + [4593, 0, "o"], + [4594, 0, "m"], + [4595, 0, "e"], + [4596, 0, " "], + [4597, 0, "e"], + [4598, 0, "x"], + [4599, 0, "a"], + [4600, 0, "m"], + [4601, 0, "p"], + [4602, 0, "l"], + [4603, 0, "e"], + [4604, 0, "s"], + [4605, 0, " "], + [4606, 0, "o"], + [4607, 0, "f"], + [4608, 0, " "], + [4609, 0, "c"], + [4610, 0, "o"], + [4611, 0, "n"], + [4612, 0, "c"], + [4613, 0, "u"], + [4614, 0, "r"], + [4615, 0, "r"], + [4616, 0, "e"], + [4617, 0, "n"], + [4618, 0, "t"], + [4619, 0, " "], + [4620, 0, "e"], + [4621, 0, "d"], + [4622, 0, "i"], + [4623, 0, "t"], + [4624, 0, "s"], + [4625, 0, " "], + [4626, 0, "t"], + [4627, 0, "h"], + [4628, 0, "a"], + [4629, 0, "t"], + [4630, 0, " "], + [4631, 0, "m"], + [4632, 0, "a"], + [4633, 0, "y"], + [4634, 0, " "], + [4635, 0, "o"], + [4636, 0, "c"], + [4637, 0, "c"], + [4638, 0, "u"], + [4639, 0, "r"], + [4640, 0, " "], + [4641, 0, "i"], + [4642, 0, "n"], + [4643, 0, " "], + [4644, 0, "a"], + [4645, 0, " "], + [4646, 0, "J"], + [4647, 0, "S"], + [4648, 0, "O"], + [4649, 0, "N"], + [4650, 0, " "], + [4651, 0, "d"], + [4652, 0, "o"], + [4653, 0, "c"], + [4654, 0, "u"], + [4655, 0, "m"], + [4656, 0, "e"], + [4657, 0, "n"], + [4658, 0, "t"], + [4659, 0, " "], + [4659, 1], + [4659, 0, ","], + [4660, 0, " "], + [4661, 0, "i"], + [4662, 0, "n"], + [4663, 0, " "], + [4664, 0, "o"], + [4665, 0, "r"], + [4666, 0, "d"], + [4667, 0, "e"], + [4668, 0, "r"], + [4669, 0, " "], + [4670, 0, "t"], + [4671, 0, "o"], + [4672, 0, " "], + [4673, 0, "i"], + [4674, 0, "l"], + [4675, 0, "l"], + [4676, 0, "u"], + [4677, 0, "s"], + [4678, 0, "t"], + [4679, 0, "r"], + [4680, 0, "a"], + [4681, 0, "t"], + [4682, 0, "e"], + [4683, 0, " "], + [4684, 0, "s"], + [4685, 0, "o"], + [4686, 0, "m"], + [4687, 0, "e"], + [4688, 0, " "], + [4689, 0, "o"], + [4690, 0, "f"], + [4691, 0, " "], + [4692, 0, "t"], + [4693, 0, "h"], + [4694, 0, "e"], + [4695, 0, " "], + [4696, 0, "s"], + [4697, 0, "u"], + [4698, 0, "b"], + [4699, 0, "t"], + [4700, 0, "l"], + [4701, 0, "e"], + [4702, 0, "t"], + [4703, 0, "i"], + [4704, 0, "e"], + [4705, 0, "s"], + [4706, 0, " "], + [4707, 0, "t"], + [4708, 0, "h"], + [4709, 0, "a"], + [4710, 0, "t"], + [4711, 0, " "], + [4712, 0, "a"], + [4713, 0, "r"], + [4714, 0, "i"], + [4715, 0, "s"], + [4716, 0, "e"], + [4717, 0, "."], + [4718, 0, "\n"], + [4719, 0, "\n"], + [4720, 0, "O"], + [4721, 0, "u"], + [4722, 0, "r"], + [4723, 0, " "], + [4724, 0, "f"], + [4725, 0, "i"], + [4726, 0, "r"], + [4727, 0, "s"], + [4728, 0, "t"], + [4729, 0, " "], + [4730, 0, "e"], + [4731, 0, "x"], + [4732, 0, "a"], + [4733, 0, "m"], + [4734, 0, "p"], + [4735, 0, "l"], + [4736, 0, "e"], + [4737, 0, " "], + [4738, 0, "i"], + [4739, 0, "s"], + [4740, 0, " "], + [4741, 0, "s"], + [4742, 0, "h"], + [4743, 0, "o"], + [4744, 0, "w"], + [4745, 0, "n"], + [4746, 0, " "], + [4747, 0, "i"], + [4748, 0, "n"], + [4749, 0, " "], + [4750, 0, "F"], + [4751, 0, "i"], + [4752, 0, "g"], + [4753, 0, "u"], + [4754, 0, "r"], + [4755, 0, "e"], + [4756, 0, "~"], + [4757, 0, "\\"], + [4758, 0, "r"], + [4759, 0, "e"], + [4760, 0, "f"], + [4761, 0, "{"], + [4762, 0, "f"], + [4763, 0, "i"], + [4764, 0, "g"], + [4765, 0, ":"], + [4766, 0, "r"], + [4767, 0, "e"], + [4768, 0, "g"], + [4769, 0, "i"], + [4770, 0, "s"], + [4771, 0, "t"], + [4772, 0, "e"], + [4773, 0, "r"], + [4774, 0, "-"], + [4775, 0, "a"], + [4776, 0, "s"], + [4777, 0, "s"], + [4778, 0, "i"], + [4779, 0, "g"], + [4780, 0, "n"], + [4781, 0, "}"], + [4782, 0, "."], + [4783, 0, " "], + [4784, 0, "A"], + [4785, 0, " "], + [4786, 0, "d"], + [4787, 0, "o"], + [4788, 0, "c"], + [4789, 0, "u"], + [4790, 0, "m"], + [4791, 0, "e"], + [4792, 0, "n"], + [4793, 0, "t"], + [4794, 0, " "], + [4795, 0, "t"], + [4796, 0, "h"], + [4797, 0, "a"], + [4798, 0, "t"], + [4799, 0, " "], + [4800, 0, "m"], + [4801, 0, "a"], + [4802, 0, "p"], + [4803, 0, "s"], + [4804, 0, " "], + [4784, 1], + [4784, 0, "I"], + [4785, 0, "n"], + [4786, 0, " "], + [4787, 0, "a"], + [4808, 0, "`"], + [4809, 0, "`"], + [4810, 0, "k"], + [4811, 0, "e"], + [4812, 0, "y"], + [4813, 0, "'"], + [4814, 0, "'"], + [4815, 0, " "], + [4816, 0, "t"], + [4817, 0, "o"], + [4818, 0, " "], + [4819, 0, "`"], + [4820, 0, "`"], + [4821, 0, "A"], + [4822, 0, "'"], + [4823, 0, "'"], + [4824, 0, ","], + [4825, 0, " "], + [4826, 0, "o"], + [4827, 0, "n"], + [4828, 0, "e"], + [4829, 0, " "], + [4830, 0, "r"], + [4831, 0, "e"], + [4832, 0, "p"], + [4833, 0, "l"], + [4834, 0, "i"], + [4835, 0, "c"], + [4836, 0, "a"], + [4837, 0, " "], + [4838, 0, "s"], + [4839, 0, "e"], + [4840, 0, "t"], + [4841, 0, "s"], + [4842, 0, " "], + [4843, 0, "t"], + [4844, 0, "h"], + [4845, 0, "e"], + [4846, 0, " "], + [4847, 0, "v"], + [4848, 0, "a"], + [4849, 0, "l"], + [4850, 0, "u"], + [4851, 0, "e"], + [4852, 0, " "], + [4853, 0, "o"], + [4854, 0, "f"], + [4855, 0, " "], + [4856, 0, "t"], + [4857, 0, "h"], + [4858, 0, "e"], + [4859, 0, " "], + [4860, 0, "k"], + [4861, 0, "e"], + [4862, 0, "y"], + [4863, 0, " "], + [4864, 0, "t"], + [4865, 0, "o"], + [4866, 0, " "], + [4867, 0, "`"], + [4868, 0, "`"], + [4869, 0, "B"], + [4870, 0, "'"], + [4871, 0, "'"], + [4872, 0, ","], + [4873, 0, " "], + [4874, 0, "w"], + [4875, 0, "h"], + [4876, 0, "i"], + [4877, 0, "l"], + [4878, 0, "e"], + [4879, 0, " "], + [4880, 0, "a"], + [4881, 0, "n"], + [4882, 0, "o"], + [4883, 0, "t"], + [4884, 0, "h"], + [4885, 0, "e"], + [4886, 0, "r"], + [4887, 0, " "], + [4888, 0, "c"], + [4889, 0, "o"], + [4890, 0, "n"], + [4891, 0, "c"], + [4892, 0, "u"], + [4893, 0, "r"], + [4894, 0, "r"], + [4895, 0, "e"], + [4896, 0, "n"], + [4897, 0, "t"], + [4898, 0, "l"], + [4899, 0, "y"], + [4900, 0, " "], + [4901, 0, "s"], + [4902, 0, "e"], + [4903, 0, "t"], + [4904, 0, "s"], + [4905, 0, " "], + [4906, 0, "i"], + [4907, 0, "t"], + [4908, 0, " "], + [4909, 0, "t"], + [4910, 0, "o"], + [4911, 0, " "], + [4912, 0, "`"], + [4913, 0, "`"], + [4914, 0, "C"], + [4915, 0, "'"], + [4916, 0, "'"], + [4917, 0, "."], + [4918, 0, " "], + [4919, 0, "A"], + [4920, 0, "s"], + [4921, 0, " "], + [4922, 0, "t"], + [4923, 0, "h"], + [4924, 0, "e"], + [4925, 0, " "], + [4926, 0, "r"], + [4927, 0, "e"], + [4928, 0, "p"], + [4929, 0, "l"], + [4930, 0, "i"], + [4931, 0, "c"], + [4932, 0, "a"], + [4933, 0, "s"], + [4934, 0, " "], + [4935, 0, "s"], + [4936, 0, "u"], + [4937, 0, "b"], + [4938, 0, "s"], + [4939, 0, "e"], + [4940, 0, "q"], + [4941, 0, "u"], + [4942, 0, "e"], + [4943, 0, "n"], + [4944, 0, "t"], + [4945, 0, "l"], + [4946, 0, "y"], + [4947, 0, " "], + [4948, 0, "e"], + [4949, 0, "x"], + [4950, 0, "c"], + [4951, 0, "h"], + [4952, 0, "a"], + [4953, 0, "n"], + [4954, 0, "g"], + [4955, 0, "e"], + [4956, 0, " "], + [4957, 0, "e"], + [4958, 0, "d"], + [4959, 0, "i"], + [4960, 0, "t"], + [4961, 0, "s"], + [4962, 0, ","], + [4963, 0, " "], + [4964, 0, "t"], + [4965, 0, "h"], + [4966, 0, "e"], + [4967, 0, "y"], + [4968, 0, " "], + [4862, 1], + [4861, 1], + [4860, 1], + [4860, 0, "r"], + [4861, 0, "e"], + [4862, 0, "g"], + [4863, 0, "i"], + [4864, 0, "s"], + [4865, 0, "t"], + [4866, 0, "e"], + [4867, 0, "r"], + [4974, 0, "d"], + [4975, 0, "e"], + [4976, 0, "t"], + [4977, 0, "e"], + [4978, 0, "c"], + [4979, 0, "t"], + [4980, 0, " "], + [4981, 0, "t"], + [4982, 0, "h"], + [4983, 0, "e"], + [4984, 0, " "], + [4985, 0, "c"], + [4986, 0, "o"], + [4987, 0, "n"], + [4988, 0, "f"], + [4989, 0, "l"], + [4990, 0, "i"], + [4991, 0, "c"], + [4992, 0, "t"], + [4993, 0, "."], + [4994, 0, " "], + [4995, 0, "S"], + [4996, 0, "i"], + [4997, 0, "n"], + [4998, 0, "c"], + [4999, 0, "e"], + [5000, 0, " "], + [5001, 0, "w"], + [5002, 0, "e"], + [5003, 0, " "], + [5004, 0, "r"], + [5005, 0, "u"], + [5006, 0, "l"], + [5007, 0, "e"], + [5008, 0, " "], + [5009, 0, "o"], + [5010, 0, "u"], + [5011, 0, "t"], + [5012, 0, " "], + [5013, 0, "t"], + [5014, 0, "h"], + [5015, 0, "e"], + [5016, 0, " "], + [5016, 1], + [5015, 1], + [5014, 1], + [5013, 1], + [5012, 1], + [5011, 1], + [5010, 1], + [5009, 1], + [5008, 1], + [5007, 1], + [5006, 1], + [5005, 1], + [5004, 1], + [5004, 0, "d"], + [5005, 0, "o"], + [5006, 0, " "], + [5007, 0, "n"], + [5008, 0, "o"], + [5009, 0, "t"], + [5010, 0, " "], + [5011, 0, "w"], + [5012, 0, "a"], + [5013, 0, "n"], + [5014, 0, "t"], + [5015, 0, " "], + [5016, 0, "t"], + [5017, 0, "o"], + [5018, 0, " "], + [5019, 0, "s"], + [5020, 0, "i"], + [5021, 0, "m"], + [5022, 0, "p"], + [5023, 0, "l"], + [5024, 0, "y"], + [5025, 0, " "], + [5026, 0, "d"], + [5027, 0, "i"], + [5028, 0, "s"], + [5029, 0, "c"], + [5030, 0, "a"], + [5031, 0, "r"], + [5032, 0, "d"], + [5033, 0, " "], + [5034, 0, "o"], + [5035, 0, "n"], + [5036, 0, "e"], + [5037, 0, " "], + [5038, 0, "o"], + [5039, 0, "f"], + [5040, 0, " "], + [5041, 0, "t"], + [5042, 0, "h"], + [5043, 0, "e"], + [5044, 0, " "], + [5045, 0, "e"], + [5046, 0, "d"], + [5047, 0, "i"], + [5048, 0, "t"], + [5049, 0, "s"], + [5050, 0, ","], + [5051, 0, " "], + [5052, 0, "a"], + [5053, 0, "n"], + [5054, 0, "d"], + [5055, 0, " "], + [5056, 0, "t"], + [5057, 0, "h"], + [5058, 0, "e"], + [5059, 0, " "], + [5060, 0, "s"], + [5061, 0, "t"], + [5062, 0, "r"], + [5063, 0, "i"], + [5064, 0, "n"], + [5065, 0, "g"], + [5066, 0, "s"], + [5067, 0, " "], + [5068, 0, "`"], + [5069, 0, "`"], + [5070, 0, "B"], + [5071, 0, "'"], + [5072, 0, "'"], + [5073, 0, " "], + [5074, 0, "a"], + [5075, 0, "n"], + [5076, 0, "d"], + [5077, 0, " "], + [5078, 0, "`"], + [5079, 0, "`"], + [5080, 0, "C"], + [5081, 0, "'"], + [5082, 0, "'"], + [5083, 0, " "], + [5084, 0, "c"], + [5085, 0, "a"], + [5086, 0, "n"], + [5087, 0, "n"], + [5088, 0, "o"], + [5089, 0, "t"], + [5090, 0, " "], + [5091, 0, "m"], + [5092, 0, "e"], + [5093, 0, "a"], + [5094, 0, "n"], + [5095, 0, "i"], + [5096, 0, "n"], + [5097, 0, "g"], + [5098, 0, "f"], + [5099, 0, "u"], + [5100, 0, "l"], + [5101, 0, "l"], + [5102, 0, "y"], + [5103, 0, " "], + [5104, 0, "b"], + [5105, 0, "e"], + [5106, 0, " "], + [5107, 0, "m"], + [5108, 0, "e"], + [5109, 0, "r"], + [5110, 0, "g"], + [5111, 0, "e"], + [5112, 0, "d"], + [5113, 0, ","], + [5114, 0, " "], + [5115, 0, "t"], + [5116, 0, "h"], + [5117, 0, "e"], + [5118, 0, " "], + [5119, 0, "s"], + [5120, 0, "y"], + [5121, 0, "s"], + [5122, 0, "t"], + [5123, 0, "e"], + [5124, 0, "m"], + [5125, 0, " "], + [5126, 0, "m"], + [5127, 0, "u"], + [5128, 0, "s"], + [5129, 0, "t"], + [5130, 0, " "], + [5131, 0, "p"], + [5132, 0, "r"], + [5133, 0, "e"], + [5134, 0, "s"], + [5135, 0, "e"], + [5136, 0, "r"], + [5137, 0, "v"], + [5138, 0, "e"], + [5139, 0, " "], + [5140, 0, "b"], + [5141, 0, "o"], + [5142, 0, "t"], + [5143, 0, "h"], + [5144, 0, " "], + [5145, 0, "c"], + [5146, 0, "o"], + [5147, 0, "n"], + [5148, 0, "c"], + [5149, 0, "u"], + [5150, 0, "r"], + [5151, 0, "r"], + [5152, 0, "e"], + [5153, 0, "n"], + [5154, 0, "t"], + [5155, 0, " "], + [5156, 0, "u"], + [5157, 0, "p"], + [5158, 0, "d"], + [5159, 0, "a"], + [5160, 0, "t"], + [5161, 0, "e"], + [5162, 0, "s"], + [5163, 0, "."], + [5164, 0, " "], + [5165, 0, "T"], + [5166, 0, "h"], + [5167, 0, "i"], + [5168, 0, "s"], + [5169, 0, " "], + [5170, 0, "d"], + [5171, 0, "a"], + [5172, 0, "t"], + [5173, 0, "a"], + [5174, 0, "t"], + [5175, 0, "y"], + [5176, 0, "p"], + [5177, 0, "e"], + [5178, 0, "s"], + [5178, 1], + [5178, 0, " "], + [5179, 0, "i"], + [5180, 0, "s"], + [5181, 0, " "], + [5182, 0, "k"], + [5183, 0, "n"], + [5184, 0, "o"], + [5185, 0, "w"], + [5186, 0, "n"], + [5187, 0, " "], + [5188, 0, "a"], + [5189, 0, "s"], + [5190, 0, " "], + [5191, 0, "a"], + [5192, 0, " "], + [5193, 0, "\\"], + [5194, 0, "e"], + [5195, 0, "m"], + [5196, 0, "p"], + [5197, 0, "h"], + [5198, 0, "{"], + [5199, 0, "m"], + [5200, 0, "u"], + [5201, 0, "l"], + [5202, 0, "t"], + [5203, 0, "i"], + [5204, 0, "-"], + [5205, 0, "v"], + [5206, 0, "a"], + [5207, 0, "l"], + [5208, 0, "u"], + [5209, 0, "e"], + [5210, 0, " "], + [5211, 0, "r"], + [5212, 0, "e"], + [5213, 0, "g"], + [5214, 0, "i"], + [5215, 0, "s"], + [5216, 0, "t"], + [5217, 0, "e"], + [5218, 0, "r"], + [5219, 0, "}"], + [5220, 0, ":"], + [5221, 0, " "], + [5222, 0, "a"], + [5223, 0, "l"], + [5224, 0, "t"], + [5225, 0, "h"], + [5226, 0, "o"], + [5227, 0, "u"], + [5228, 0, "g"], + [5229, 0, "h"], + [5230, 0, " "], + [5231, 0, "a"], + [5232, 0, " "], + [5233, 0, "r"], + [5234, 0, "e"], + [5235, 0, "p"], + [5236, 0, "l"], + [5237, 0, "i"], + [5238, 0, "c"], + [5239, 0, "a"], + [5240, 0, " "], + [5241, 0, "c"], + [5242, 0, "a"], + [5243, 0, "n"], + [5244, 0, " "], + [5245, 0, "o"], + [5246, 0, "n"], + [5247, 0, "l"], + [5248, 0, "y"], + [5249, 0, " "], + [5250, 0, "a"], + [5251, 0, "s"], + [5252, 0, "s"], + [5253, 0, "i"], + [5254, 0, "g"], + [5255, 0, "n"], + [5256, 0, " "], + [5257, 0, "a"], + [5258, 0, "s"], + [5258, 1], + [5258, 0, " "], + [5259, 0, "s"], + [5260, 0, "i"], + [5261, 0, "n"], + [5262, 0, "g"], + [5263, 0, "l"], + [5264, 0, "e"], + [5265, 0, " "], + [5266, 0, "v"], + [5267, 0, "a"], + [5268, 0, "l"], + [5269, 0, "u"], + [5270, 0, "e"], + [5271, 0, " "], + [5272, 0, "t"], + [5273, 0, "o"], + [5274, 0, " "], + [5275, 0, "t"], + [5276, 0, "h"], + [5277, 0, "e"], + [5278, 0, " "], + [5279, 0, "r"], + [5280, 0, "e"], + [5281, 0, "g"], + [5282, 0, "i"], + [5283, 0, "s"], + [5284, 0, "t"], + [5285, 0, "e"], + [5286, 0, "r"], + [5287, 0, ","], + [5288, 0, " "], + [5289, 0, "i"], + [5290, 0, "t"], + [5291, 0, " "], + [5292, 0, "m"], + [5293, 0, "a"], + [5294, 0, "y"], + [5295, 0, " "], + [5296, 0, "h"], + [5297, 0, "a"], + [5298, 0, "v"], + [5299, 0, "e"], + [5300, 0, " "], + [5300, 1], + [5299, 1], + [5298, 1], + [5297, 1], + [5296, 1], + [5295, 1], + [5294, 1], + [5293, 1], + [5292, 1], + [5291, 1], + [5290, 1], + [5289, 1], + [5289, 0, "r"], + [5290, 0, "e"], + [5291, 0, "a"], + [5292, 0, "d"], + [5293, 0, "i"], + [5294, 0, "n"], + [5295, 0, "g"], + [5296, 0, " "], + [5297, 0, "t"], + [5298, 0, "h"], + [5299, 0, "e"], + [5300, 0, " "], + [5301, 0, "r"], + [5302, 0, "e"], + [5303, 0, "g"], + [5304, 0, "i"], + [5305, 0, "s"], + [5306, 0, "t"], + [5307, 0, "e"], + [5308, 0, "r"], + [5309, 0, " "], + [5310, 0, "m"], + [5311, 0, "a"], + [5312, 0, "y"], + [5313, 0, " "], + [5314, 0, "r"], + [5315, 0, "e"], + [5316, 0, "t"], + [5317, 0, "u"], + [5318, 0, "r"], + [5319, 0, "n"], + [5320, 0, " "], + [5321, 0, "a"], + [5322, 0, " "], + [5323, 0, "s"], + [5324, 0, "e"], + [5325, 0, "t"], + [5326, 0, " "], + [5327, 0, "o"], + [5328, 0, "f"], + [5329, 0, " "], + [5330, 0, "c"], + [5331, 0, "o"], + [5332, 0, "n"], + [5333, 0, "c"], + [5334, 0, "u"], + [5335, 0, "r"], + [5336, 0, "r"], + [5337, 0, "e"], + [5338, 0, "n"], + [5339, 0, "t"], + [5340, 0, "l"], + [5341, 0, "y"], + [5342, 0, " "], + [5343, 0, "w"], + [5344, 0, "r"], + [5345, 0, "i"], + [5346, 0, "t"], + [5347, 0, "t"], + [5348, 0, "e"], + [5349, 0, "n"], + [5350, 0, " "], + [5351, 0, "v"], + [5352, 0, "a"], + [5353, 0, "l"], + [5354, 0, "u"], + [5355, 0, "e"], + [5356, 0, "s"], + [5357, 0, "."], + [4818, 0, " "], + [4819, 0, "a"], + [4820, 0, " "], + [4821, 0, "r"], + [4822, 0, "e"], + [4823, 0, "g"], + [4824, 0, "i"], + [4825, 0, "s"], + [4826, 0, "t"], + [4827, 0, "e"], + [4828, 0, "r"], + [4829, 0, " "], + [4830, 0, "w"], + [4831, 0, "i"], + [4832, 0, "t"], + [4833, 0, "h"], + [4834, 0, " "], + [4835, 0, "v"], + [4836, 0, "a"], + [4837, 0, "l"], + [4838, 0, "u"], + [4839, 0, "e"], + [5380, 0, "\n"], + [5381, 0, "\n"], + [5382, 0, "'"], + [5382, 1], + [5382, 0, "\\"], + [5383, 0, "b"], + [5384, 0, "e"], + [5385, 0, "g"], + [5386, 0, "i"], + [5387, 0, "n"], + [5388, 0, "{"], + [5389, 0, "f"], + [5390, 0, "i"], + [5391, 0, "g"], + [5392, 0, "u"], + [5393, 0, "r"], + [5394, 0, "e"], + [5395, 0, "*"], + [5396, 0, "}"], + [5397, 0, "\n"], + [5398, 0, "\\"], + [5399, 0, "e"], + [5400, 0, "n"], + [5401, 0, "d"], + [5402, 0, "{"], + [5403, 0, "f"], + [5404, 0, "i"], + [5405, 0, "g"], + [5406, 0, "u"], + [5407, 0, "r"], + [5408, 0, "e"], + [5409, 0, "*"], + [5410, 0, "}"], + [5397, 0, "\n"], + [5398, 0, "\\"], + [5399, 0, "c"], + [5400, 0, "e"], + [5401, 0, "n"], + [5402, 0, "t"], + [5403, 0, "e"], + [5404, 0, "r"], + [5405, 0, "i"], + [5406, 0, "n"], + [5407, 0, "g"], + [5408, 0, "\n"], + [5409, 0, "\\"], + [5410, 0, "b"], + [5411, 0, "e"], + [5412, 0, "g"], + [5413, 0, "i"], + [5414, 0, "n"], + [5415, 0, "{"], + [5416, 0, "t"], + [5417, 0, "i"], + [5418, 0, "k"], + [5419, 0, "z"], + [5420, 0, "p"], + [5421, 0, "i"], + [5422, 0, "c"], + [5423, 0, "t"], + [5424, 0, "u"], + [5425, 0, "r"], + [5426, 0, "e"], + [5427, 0, "}"], + [5428, 0, "["], + [5429, 0, "a"], + [5430, 0, "u"], + [5431, 0, "t"], + [5432, 0, "o"], + [5433, 0, "]"], + [5434, 0, "\n"], + [5435, 0, "\\"], + [5436, 0, "e"], + [5437, 0, "n"], + [5438, 0, "d"], + [5439, 0, "{"], + [5440, 0, "t"], + [5441, 0, "i"], + [5442, 0, "k"], + [5443, 0, "z"], + [5444, 0, "p"], + [5445, 0, "i"], + [5446, 0, "c"], + [5447, 0, "t"], + [5448, 0, "u"], + [5449, 0, "r"], + [5450, 0, "e"], + [5451, 0, "}"], + [5452, 0, "\n"], + [5453, 0, "\\"], + [5454, 0, "c"], + [5455, 0, "a"], + [5456, 0, "p"], + [5457, 0, "t"], + [5458, 0, "i"], + [5459, 0, "o"], + [5460, 0, "n"], + [5461, 0, "{"], + [5462, 0, "C"], + [5463, 0, "o"], + [5464, 0, "n"], + [5465, 0, "c"], + [5466, 0, "u"], + [5467, 0, "r"], + [5468, 0, "r"], + [5469, 0, "e"], + [5470, 0, "n"], + [5471, 0, "t"], + [5472, 0, " "], + [5473, 0, "m"], + [5474, 0, "o"], + [5474, 1], + [5473, 1], + [5472, 1], + [5471, 1], + [5470, 1], + [5469, 1], + [5468, 1], + [5467, 1], + [5466, 1], + [5465, 1], + [5464, 1], + [5463, 1], + [5462, 1], + [5462, 0, "M"], + [5463, 0, "o"], + [5464, 0, "d"], + [5465, 0, "i"], + [5466, 0, "f"], + [5467, 0, "y"], + [5468, 0, "i"], + [5469, 0, "n"], + [5470, 0, "g"], + [5471, 0, " "], + [5472, 0, "t"], + [5473, 0, "h"], + [5474, 0, "e"], + [5475, 0, " "], + [5476, 0, "c"], + [5477, 0, "o"], + [5478, 0, "n"], + [5479, 0, "t"], + [5480, 0, "e"], + [5481, 0, "n"], + [5482, 0, "t"], + [5483, 0, "s"], + [5484, 0, " "], + [5485, 0, "o"], + [5486, 0, "f"], + [5487, 0, " "], + [5488, 0, "a"], + [5489, 0, " "], + [5490, 0, "n"], + [5491, 0, "e"], + [5492, 0, "s"], + [5493, 0, "t"], + [5494, 0, "e"], + [5495, 0, "d"], + [5496, 0, " "], + [5497, 0, "m"], + [5498, 0, "a"], + [5499, 0, "p"], + [5500, 0, " "], + [5501, 0, "w"], + [5502, 0, "h"], + [5503, 0, "i"], + [5504, 0, "l"], + [5505, 0, "e"], + [5506, 0, " "], + [5507, 0, "c"], + [5508, 0, "o"], + [5509, 0, "n"], + [5510, 0, "c"], + [5511, 0, "u"], + [5512, 0, "r"], + [5513, 0, "r"], + [5514, 0, "e"], + [5515, 0, "n"], + [5516, 0, "t"], + [5517, 0, "l"], + [5518, 0, "y"], + [5519, 0, " "], + [5520, 0, "t"], + [5521, 0, "h"], + [5522, 0, "e"], + [5523, 0, " "], + [5524, 0, "e"], + [5525, 0, "n"], + [5526, 0, "t"], + [5527, 0, "i"], + [5528, 0, "r"], + [5529, 0, "e"], + [5530, 0, " "], + [5531, 0, "m"], + [5532, 0, "a"], + [5533, 0, "p"], + [5534, 0, " "], + [5535, 0, "i"], + [5536, 0, "s"], + [5537, 0, " "], + [5538, 0, "r"], + [5539, 0, "e"], + [5540, 0, "m"], + [5541, 0, "o"], + [5542, 0, "v"], + [5543, 0, "e"], + [5544, 0, "d"], + [5545, 0, "}"], + [5546, 0, "\\"], + [5547, 0, "l"], + [5548, 0, "a"], + [5549, 0, "b"], + [5550, 0, "e"], + [5551, 0, "l"], + [5552, 0, "{"], + [5553, 0, "f"], + [5554, 0, "i"], + [5555, 0, "g"], + [5556, 0, ":"], + [5557, 0, "m"], + [5558, 0, "a"], + [5559, 0, "p"], + [5560, 0, "-"], + [5561, 0, "r"], + [5562, 0, "e"], + [5563, 0, "m"], + [5564, 0, "o"], + [5565, 0, "v"], + [5566, 0, "e"], + [5567, 0, "}"], + [5434, 0, "\n"], + [5435, 0, "\\"], + [5436, 0, "n"], + [5437, 0, "o"], + [5438, 0, "d"], + [5439, 0, "e"], + [5440, 0, " "], + [5441, 0, "("], + [5442, 0, "s"], + [5443, 0, "t"], + [5444, 0, "a"], + [5445, 0, "r"], + [5446, 0, "t"], + [5447, 0, ")"], + [5448, 0, " "], + [5449, 0, "a"], + [5450, 0, "t"], + [5451, 0, " "], + [5452, 0, "("], + [5453, 0, "5"], + [5454, 0, ","], + [5455, 0, "4"], + [5456, 0, ")"], + [5457, 0, " "], + [5458, 0, "{"], + [5459, 0, "\\"], + [5460, 0, "v"], + [5461, 0, "e"], + [5462, 0, "r"], + [5463, 0, "b"], + [5464, 0, "|"], + [5465, 0, "{"], + [5466, 0, "\""], + [5467, 0, "c"], + [5468, 0, "o"], + [5469, 0, "l"], + [5470, 0, "o"], + [5471, 0, "r"], + [5472, 0, "s"], + [5473, 0, "\""], + [5474, 0, ":"], + [5475, 0, " "], + [5476, 0, "{"], + [5477, 0, "\""], + [5478, 0, "b"], + [5479, 0, "l"], + [5480, 0, "u"], + [5481, 0, "e"], + [5482, 0, "\""], + [5483, 0, ":"], + [5484, 0, " "], + [5485, 0, "\""], + [5486, 0, "#"], + [5487, 0, "0"], + [5488, 0, "0"], + [5489, 0, "0"], + [5490, 0, "0"], + [5491, 0, "f"], + [5492, 0, "f"], + [5493, 0, "\""], + [5494, 0, "}"], + [5495, 0, "}"], + [5496, 0, "|"], + [5497, 0, "}"], + [5498, 0, ";"], + [5499, 0, "\n"], + [5500, 0, "\\"], + [5501, 0, "n"], + [5502, 0, "o"], + [5503, 0, "d"], + [5504, 0, "e"], + [5505, 0, " "], + [5506, 0, "("], + [5507, 0, "l"], + [5508, 0, "e"], + [5509, 0, "f"], + [5510, 0, "t"], + [5511, 0, "1"], + [5512, 0, ")"], + [5513, 0, " "], + [5514, 0, " "], + [5449, 0, " "], + [5516, 0, "a"], + [5517, 0, "t"], + [5518, 0, " "], + [5519, 0, "("], + [5520, 0, "0"], + [5521, 0, ","], + [5522, 0, "2"], + [5523, 0, ")"], + [5524, 0, " "], + [5525, 0, "{"], + [5526, 0, "\\"], + [5527, 0, "v"], + [5528, 0, "e"], + [5529, 0, "r"], + [5530, 0, "b"], + [5531, 0, "|"], + [5532, 0, "{"], + [5533, 0, "\""], + [5534, 0, "c"], + [5535, 0, "o"], + [5536, 0, "l"], + [5537, 0, "o"], + [5538, 0, "r"], + [5539, 0, "s"], + [5540, 0, "\""], + [5541, 0, ":"], + [5542, 0, " "], + [5543, 0, "{"], + [5544, 0, "\""], + [5545, 0, "b"], + [5546, 0, "l"], + [5547, 0, "u"], + [5548, 0, "e"], + [5549, 0, "\""], + [5550, 0, ":"], + [5551, 0, " "], + [5552, 0, "\""], + [5553, 0, "#"], + [5554, 0, "0"], + [5555, 0, "0"], + [5556, 0, "0"], + [5557, 0, "0"], + [5558, 0, "f"], + [5559, 0, "f"], + [5560, 0, "\""], + [5561, 0, "|"], + [5562, 0, "}"], + [5563, 0, ";"], + [5561, 0, ","], + [5563, 0, " "], + [5564, 0, "\\"], + [5565, 0, "\\"], + [5566, 0, " "], + [5567, 0, "\\"], + [5568, 0, "v"], + [5569, 0, "e"], + [5570, 0, "r"], + [5571, 0, "b"], + [5572, 0, "{"], + [5573, 0, "\""], + [5574, 0, "r"], + [5575, 0, "e"], + [5576, 0, "d"], + [5577, 0, "\""], + [5578, 0, ":"], + [5579, 0, " "], + [5580, 0, "\""], + [5581, 0, "#"], + [5582, 0, "f"], + [5583, 0, "f"], + [5584, 0, "0"], + [5585, 0, "0"], + [5586, 0, "0"], + [5587, 0, "0"], + [5588, 0, "\""], + [5572, 1], + [5572, 0, "|"], + [5589, 0, "}"], + [5590, 0, "}"], + [5591, 0, "|"], + [5592, 0, "}"], + [5526, 0, "\\"], + [5527, 0, "m"], + [5528, 0, "b"], + [5529, 0, "o"], + [5530, 0, "x"], + [5531, 0, "{"], + [5531, 1], + [5530, 1], + [5529, 1], + [5528, 1], + [5527, 1], + [5526, 1], + [5506, 0, " "], + [5507, 0, "["], + [5508, 0, "m"], + [5509, 0, "a"], + [5510, 0, "t"], + [5511, 0, "r"], + [5512, 0, "i"], + [5513, 0, "x"], + [5514, 0, "]"], + [5523, 1], + [5449, 1], + [5599, 0, " "], + [5600, 0, "\\"], + [5601, 0, "\\"], + [5602, 0, " "], + [5603, 1], + [5533, 0, "\\"], + [5534, 0, "n"], + [5535, 0, "o"], + [5536, 0, "d"], + [5537, 0, "e"], + [5538, 0, " "], + [5539, 0, "{"], + [5577, 0, "}"], + [5582, 0, "\\"], + [5583, 0, "n"], + [5584, 0, "o"], + [5585, 0, "d"], + [5586, 0, "e"], + [5587, 0, "{"], + [5613, 0, "}"], + [5533, 0, "\n"], + [5534, 0, " "], + [5535, 0, " "], + [5536, 0, " "], + [5537, 0, " "], + [5586, 0, "\n"], + [5587, 0, " "], + [5588, 0, " "], + [5589, 0, " "], + [5596, 0, " "], + [5627, 1], + [5627, 0, "\n"], + [5545, 0, "a"], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5546, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 1], + [5562, 0, "b"], + [5547, 0, ";"], + [5565, 0, ";"], + [5545, 1], + [5545, 0, "\\"], + [5546, 0, "v"], + [5547, 0, "e"], + [5548, 0, "r"], + [5549, 0, "b"], + [5550, 0, "|"], + [5551, 0, "{"], + [5552, 0, "\""], + [5553, 0, "c"], + [5554, 0, "o"], + [5555, 0, "l"], + [5556, 0, "o"], + [5557, 0, "r"], + [5558, 0, "s"], + [5559, 0, "\""], + [5560, 0, ":"], + [5561, 0, " "], + [5562, 0, "{"], + [5563, 0, "\""], + [5564, 0, "r"], + [5565, 0, "e"], + [5566, 0, "d"], + [5566, 1], + [5565, 1], + [5564, 1], + [5564, 0, "b"], + [5565, 0, "l"], + [5566, 0, "u"], + [5567, 0, "e"], + [5568, 0, "\""], + [5569, 0, ":"], + [5570, 0, " "], + [5571, 0, "\""], + [5572, 0, "#"], + [5573, 0, "0"], + [5574, 0, "0"], + [5575, 0, "0"], + [5576, 0, "0"], + [5577, 0, "f"], + [5578, 0, "f"], + [5579, 0, "\""], + [5580, 0, ","], + [5581, 0, "|"], + [5599, 1], + [5599, 0, "\\"], + [5600, 0, "v"], + [5601, 0, "e"], + [5602, 0, "r"], + [5603, 0, "b"], + [5604, 0, "|"], + [5605, 0, "{"], + [5605, 1], + [5605, 0, "\""], + [5606, 0, "r"], + [5607, 0, "e"], + [5608, 0, "d"], + [5609, 0, ":"], + [5609, 1], + [5609, 0, "\""], + [5610, 0, ":"], + [5611, 0, " "], + [5612, 0, "\""], + [5613, 0, "#"], + [5614, 0, "f"], + [5615, 0, "f"], + [5616, 0, "0"], + [5617, 0, "0"], + [5618, 0, "0"], + [5619, 0, "0"], + [5620, 0, "\""], + [5621, 0, "}"], + [5622, 0, "}"], + [5623, 0, "|"], + [5632, 0, "\n"], + [5633, 0, "\\"], + [5634, 0, "n"], + [5635, 0, "o"], + [5636, 0, "d"], + [5637, 0, "e"], + [5638, 0, " "], + [5639, 0, "("], + [5640, 0, "r"], + [5641, 0, "i"], + [5642, 0, "g"], + [5643, 0, "h"], + [5644, 0, "t"], + [5645, 0, "1"], + [5646, 0, ")"], + [5647, 0, " "], + [5648, 0, "a"], + [5649, 0, "t"], + [5650, 0, " "], + [5651, 0, "("], + [5652, 0, "1"], + [5653, 0, "0"], + [5654, 0, ","], + [5655, 0, "2"], + [5655, 1], + [5655, 0, "3"], + [5656, 0, ")"], + [5657, 0, " "], + [5658, 0, "{"], + [5659, 0, "\\"], + [5660, 0, "v"], + [5661, 0, "e"], + [5662, 0, "r"], + [5663, 0, "b"], + [5664, 0, "|"], + [5665, 0, "{"], + [5666, 0, "}"], + [5667, 0, "|"], + [5668, 0, "}"], + [5669, 0, ";"], + [5670, 0, "\n"], + [5671, 0, "\\"], + [5672, 0, "n"], + [5673, 0, "o"], + [5674, 0, "d"], + [5675, 0, "e"], + [5676, 0, " "], + [5677, 0, "("], + [5678, 0, "r"], + [5679, 0, "i"], + [5680, 0, "g"], + [5681, 0, "h"], + [5682, 0, "t"], + [5683, 0, "2"], + [5684, 0, ")"], + [5685, 0, " "], + [5686, 0, "a"], + [5687, 0, "t"], + [5688, 0, " "], + [5689, 0, "("], + [5690, 0, "1"], + [5691, 0, "0"], + [5692, 0, ","], + [5693, 0, "2"], + [5694, 0, ")"], + [5695, 0, " "], + [5696, 0, "{"], + [5697, 0, "\\"], + [5698, 0, "v"], + [5699, 0, "e"], + [5700, 0, "r"], + [5701, 0, "b"], + [5702, 0, "|"], + [5703, 0, "{"], + [5704, 0, "\""], + [5705, 0, "c"], + [5706, 0, "o"], + [5707, 0, "l"], + [5708, 0, "o"], + [5709, 0, "r"], + [5710, 0, "s"], + [5711, 0, "\""], + [5712, 0, ":"], + [5713, 0, " "], + [5714, 0, "\""], + [5715, 0, "#"], + [5715, 1], + [5714, 1], + [5714, 0, "{"], + [5715, 0, "\""], + [5716, 0, "g"], + [5717, 0, "r"], + [5718, 0, "e"], + [5719, 0, "e"], + [5720, 0, "n"], + [5721, 0, "\""], + [5722, 0, ":"], + [5723, 0, " "], + [5724, 0, "\""], + [5725, 0, "#"], + [5726, 0, "0"], + [5727, 0, "0"], + [5728, 0, "f"], + [5729, 0, "f"], + [5730, 0, "0"], + [5731, 0, "0"], + [5732, 0, "\""], + [5733, 0, "}"], + [5734, 0, "}"], + [5735, 0, "|"], + [5736, 0, "}"], + [5737, 0, ";"], + [5453, 1], + [5453, 0, "4"], + [5652, 1], + [5652, 1], + [5652, 0, "8"], + [5689, 1], + [5689, 1], + [5689, 0, "8"], + [5736, 0, "\n"], + [5737, 0, "\\"], + [5738, 0, "n"], + [5739, 0, "o"], + [5740, 0, "d"], + [5741, 0, "e"], + [5742, 0, " "], + [5743, 0, "("], + [5744, 0, "l"], + [5745, 0, "e"], + [5746, 0, "f"], + [5747, 0, "t"], + [5748, 0, "2"], + [5749, 0, ")"], + [5750, 0, " "], + [5751, 0, "a"], + [5752, 0, "t"], + [5753, 0, " "], + [5754, 0, "("], + [5755, 0, "0"], + [5756, 0, ","], + [5757, 0, "0"], + [5758, 0, ")"], + [5759, 0, " "], + [5760, 0, "{"], + [5761, 0, "\\"], + [5762, 0, "v"], + [5763, 0, "e"], + [5764, 0, "r"], + [5765, 0, "b"], + [5766, 0, "|"], + [5767, 0, "{"], + [5768, 0, "\""], + [5769, 0, "c"], + [5770, 0, "o"], + [5771, 0, "l"], + [5772, 0, "o"], + [5773, 0, "r"], + [5774, 0, "s"], + [5775, 0, "\""], + [5776, 0, ":"], + [5777, 0, " "], + [5778, 0, "{"], + [5779, 0, "\""], + [5780, 0, "r"], + [5781, 0, "e"], + [5782, 0, "d"], + [5783, 0, "\""], + [5784, 0, ":"], + [5785, 0, " "], + [5786, 0, "\""], + [5787, 0, "#"], + [5788, 0, "f"], + [5789, 0, "f"], + [5790, 0, "0"], + [5791, 0, "0"], + [5792, 0, "0"], + [5793, 0, "0"], + [5794, 0, "\""], + [5795, 0, ","], + [5796, 0, " "], + [5797, 0, "\""], + [5798, 0, "g"], + [5799, 0, "r"], + [5800, 0, "e"], + [5801, 0, "e"], + [5802, 0, "n"], + [5803, 0, "\""], + [5804, 0, ":"], + [5805, 0, " "], + [5806, 0, "\""], + [5807, 0, "#"], + [5808, 0, "0"], + [5809, 0, "0"], + [5810, 0, "f"], + [5811, 0, "f"], + [5812, 0, "0"], + [5813, 0, "0"], + [5814, 0, "\""], + [5815, 0, "}"], + [5816, 0, "}"], + [5817, 0, "|"], + [5818, 0, "}"], + [5819, 0, ";"], + [5742, 0, " "], + [5743, 0, "["], + [5744, 0, "m"], + [5745, 0, "a"], + [5746, 0, "t"], + [5747, 0, "r"], + [5748, 0, "i"], + [5749, 0, "x"], + [5750, 0, "]"], + [5770, 0, "\n"], + [5771, 0, " "], + [5772, 0, " "], + [5773, 0, " "], + [5774, 0, " "], + [5775, 0, "\\"], + [5776, 0, "n"], + [5777, 0, "o"], + [5778, 0, "d"], + [5779, 0, "e"], + [5780, 0, " "], + [5781, 0, "{"], + [5817, 0, "|"], + [5818, 0, "}"], + [5819, 0, ";"], + [5820, 0, "\n"], + [5821, 0, " "], + [5822, 0, " "], + [5823, 0, " "], + [5824, 0, " "], + [5825, 0, "\\"], + [5826, 0, "n"], + [5827, 0, "o"], + [5828, 0, "d"], + [5829, 0, "e"], + [5831, 0, "{"], + [5832, 0, "\\"], + [5833, 0, "v"], + [5834, 0, "e"], + [5835, 0, "r"], + [5836, 0, "b"], + [5837, 0, "|"], + [5861, 0, "\n"], + [5862, 0, "}"], + [5863, 0, ";"], + [5864, 0, "\n"], + [5865, 0, "\\"], + [5866, 0, "n"], + [5867, 0, "o"], + [5868, 0, "d"], + [5869, 0, "e"], + [5870, 0, " "], + [5871, 0, "["], + [5872, 0, "m"], + [5873, 0, "a"], + [5874, 0, "t"], + [5875, 0, "r"], + [5876, 0, "i"], + [5877, 0, "x"], + [5878, 0, "]"], + [5879, 0, " "], + [5880, 0, "("], + [5881, 0, "r"], + [5882, 0, "i"], + [5883, 0, "g"], + [5884, 0, "h"], + [5885, 0, "t"], + [5886, 0, "3"], + [5887, 0, ")"], + [5888, 0, " "], + [5889, 0, "a"], + [5890, 0, "t"], + [5891, 0, " "], + [5892, 0, "("], + [5893, 0, "8"], + [5894, 0, ","], + [5895, 0, " "], + [5895, 1], + [5895, 0, "0"], + [5896, 0, ")"], + [5897, 0, " "], + [5898, 0, "{"], + [5899, 0, "\n"], + [5900, 0, " "], + [5901, 0, " "], + [5902, 0, " "], + [5903, 0, " "], + [5904, 0, "\\"], + [5905, 0, "n"], + [5906, 0, "o"], + [5907, 0, "d"], + [5908, 0, "e"], + [5909, 0, " "], + [5910, 0, "{"], + [5911, 0, "\\"], + [5912, 0, "v"], + [5913, 0, "e"], + [5914, 0, "r"], + [5915, 0, "b"], + [5916, 0, "|"], + [5917, 0, "{"], + [5918, 0, "\""], + [5919, 0, "c"], + [5920, 0, "o"], + [5921, 0, "l"], + [5922, 0, "o"], + [5923, 0, "r"], + [5924, 0, "s"], + [5925, 0, "\""], + [5926, 0, ":"], + [5927, 0, " "], + [5928, 0, "{"], + [5929, 0, "\""], + [5930, 0, "r"], + [5931, 0, "e"], + [5932, 0, "d"], + [5933, 0, "\""], + [5934, 0, ":"], + [5935, 0, " "], + [5936, 0, "\""], + [5937, 0, "#"], + [5938, 0, "f"], + [5939, 0, "f"], + [5940, 0, "0"], + [5941, 0, "0"], + [5942, 0, "0"], + [5943, 0, "0"], + [5944, 0, "\""], + [5945, 0, ","], + [5946, 0, "}"], + [5946, 1], + [5946, 0, "|"], + [5947, 0, "}"], + [5948, 0, ";"], + [5949, 0, "\n"], + [5950, 0, " "], + [5951, 0, " "], + [5952, 0, " "], + [5953, 0, " "], + [5954, 0, "\\"], + [5955, 0, "n"], + [5956, 0, "o"], + [5957, 0, "d"], + [5958, 0, "e"], + [5959, 0, " "], + [5960, 0, "{"], + [5961, 0, "\\"], + [5962, 0, "v"], + [5963, 0, "e"], + [5964, 0, "r"], + [5965, 0, "b"], + [5966, 0, "|"], + [5967, 0, "\""], + [5968, 0, "g"], + [5969, 0, "r"], + [5970, 0, "e"], + [5971, 0, "e"], + [5972, 0, "n"], + [5973, 0, "\""], + [5974, 0, ":"], + [5975, 0, " "], + [5976, 0, "\""], + [5977, 0, "#"], + [5978, 0, "0"], + [5979, 0, "0"], + [5980, 0, "f"], + [5981, 0, "f"], + [5982, 0, "0"], + [5983, 0, "0"], + [5984, 0, "\""], + [5985, 0, "}"], + [5986, 0, "}"], + [5987, 0, "|"], + [5988, 0, "}"], + [5989, 0, ";"], + [5990, 0, "\n"], + [5991, 0, "}"], + [5992, 0, ";"], + [5994, 0, "\n"], + [5994, 1], + [5991, 0, "%"], + [5950, 0, "%"], + [5900, 0, "%"], + [5865, 0, "%"], + [5820, 0, " "], + [5821, 0, "\\"], + [5822, 0, "\\"], + [5864, 0, " "], + [5865, 0, "\\"], + [5866, 0, "\\"], + [5871, 1], + [5906, 1], + [5956, 1], + [5997, 1], + [5996, 0, " "], + [5997, 0, "'"], + [5998, 0, "\\"], + [5998, 1], + [5997, 1], + [5997, 0, "\\"], + [5998, 0, "\\"], + [5955, 0, " "], + [5956, 0, "\\"], + [5957, 0, "\\"], + [6005, 0, "\n"], + [6006, 0, "\\"], + [6007, 0, "d"], + [6008, 0, "r"], + [6009, 0, "a"], + [6010, 0, "w"], + [6011, 0, " "], + [6012, 0, "["], + [6013, 0, "t"], + [6014, 0, "h"], + [6015, 0, "i"], + [6016, 0, "c"], + [6017, 0, "k"], + [6018, 0, ","], + [6019, 0, "-"], + [6020, 0, ">"], + [6021, 0, "]"], + [6022, 0, " "], + [6023, 0, "("], + [6024, 0, "s"], + [6025, 0, "t"], + [6026, 0, "a"], + [6027, 0, "r"], + [6028, 0, "t"], + [6029, 0, ")"], + [6030, 0, " "], + [6031, 0, "t"], + [6032, 0, "o"], + [6033, 0, " "], + [6034, 0, "n"], + [6035, 0, "o"], + [6036, 0, "d"], + [6037, 0, "e"], + [6038, 0, " "], + [6039, 0, "["], + [6040, 0, "a"], + [6041, 0, "b"], + [6042, 0, "o"], + [6043, 0, "v"], + [6044, 0, "e"], + [6045, 0, ","], + [6046, 0, "s"], + [6047, 0, "l"], + [6048, 0, "o"], + [6049, 0, "p"], + [6050, 0, "e"], + [6051, 0, "d"], + [6052, 0, "]"], + [6053, 0, " "], + [6054, 0, "{"], + [6055, 0, "\\"], + [6056, 0, "f"], + [6057, 0, "o"], + [6058, 0, "o"], + [6059, 0, "t"], + [6060, 0, "n"], + [6061, 0, "o"], + [6062, 0, "t"], + [6063, 0, "e"], + [6064, 0, "s"], + [6065, 0, "i"], + [6066, 0, "z"], + [6067, 0, "e"], + [6068, 0, " "], + [6069, 0, "$"], + [6070, 0, "\\"], + [6071, 0, "t"], + [6072, 0, "e"], + [6073, 0, "x"], + [6074, 0, "t"], + [6075, 0, "{"], + [6076, 0, "d"], + [6077, 0, "o"], + [6078, 0, "c"], + [6079, 0, "}"], + [6080, 0, "["], + [6080, 1], + [6079, 1], + [6078, 1], + [6077, 1], + [6076, 1], + [6075, 1], + [6074, 1], + [6073, 1], + [6072, 1], + [6071, 1], + [6070, 1], + [6069, 1], + [6069, 0, "d"], + [6070, 0, "o"], + [6071, 0, "c"], + [6072, 0, "["], + [6073, 0, "`"], + [6074, 0, "`"], + [6075, 0, "c"], + [6076, 0, "o"], + [6077, 0, "l"], + [6078, 0, "o"], + [6079, 0, "r"], + [6080, 0, "s"], + [6081, 0, "'"], + [6082, 0, "'"], + [6083, 0, "]"], + [6084, 0, "}"], + [6085, 0, " "], + [6086, 0, "("], + [6087, 0, "l"], + [6088, 0, "e"], + [6089, 0, "f"], + [6090, 0, "t"], + [6091, 0, "1"], + [6092, 0, ")"], + [6093, 0, ";"], + [6051, 1], + [6050, 1], + [6049, 1], + [6048, 1], + [6047, 1], + [6046, 1], + [6045, 1], + [6044, 1], + [6043, 1], + [6042, 1], + [6041, 1], + [6040, 1], + [6040, 0, "l"], + [6041, 0, "e"], + [6042, 0, "f"], + [6043, 0, "t"], + [6076, 0, "["], + [6077, 0, "`"], + [6078, 0, "`"], + [6079, 0, "r"], + [6080, 0, "e"], + [6081, 0, "d"], + [6082, 0, "'"], + [6083, 0, "'"], + [6084, 0, "]"], + [6085, 0, " "], + [6086, 0, ":"], + [6087, 0, "="], + [6088, 0, " "], + [6089, 0, "`"], + [6090, 0, "`"], + [6091, 0, "\\"], + [6092, 0, "#"], + [6093, 0, "f"], + [6094, 0, "f"], + [6095, 0, "0"], + [6096, 0, "0"], + [6097, 0, "0"], + [6098, 0, "0"], + [6099, 0, "'"], + [6100, 0, "'"], + [6101, 0, ";"], + [6102, 0, "\\"], + [6102, 1], + [6102, 0, "~"], + [6103, 0, "~"], + [6103, 1], + [6102, 1], + [6102, 0, "\\"], + [6103, 0, "h"], + [6104, 0, "s"], + [6105, 0, "p"], + [6106, 0, "a"], + [6107, 0, "c"], + [6108, 0, "e"], + [6109, 0, "{"], + [6110, 0, "1"], + [6111, 0, "e"], + [6112, 0, "m"], + [6113, 0, "}"], + [6113, 1], + [6112, 1], + [6111, 1], + [6110, 1], + [6109, 1], + [6108, 1], + [6107, 1], + [6106, 1], + [6105, 1], + [6104, 1], + [6103, 1], + [6103, 0, "q"], + [6104, 0, "u"], + [6105, 0, "a"], + [6106, 0, "d"], + [6106, 1], + [6105, 1], + [6104, 1], + [6103, 1], + [6103, 0, "h"], + [6104, 0, "s"], + [6105, 0, "p"], + [6106, 0, "a"], + [6107, 0, "c"], + [6108, 0, "e"], + [6109, 0, "{"], + [6110, 0, "1"], + [6111, 0, "e"], + [6112, 0, "m"], + [6113, 0, "}"], + [6113, 1], + [6112, 1], + [6111, 1], + [6110, 1], + [6109, 1], + [6108, 1], + [6107, 1], + [6106, 1], + [6105, 1], + [6104, 1], + [6103, 1], + [6102, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 1], + [4027, 0, "l"], + [4028, 0, "e"], + [4029, 0, "f"], + [4030, 0, "t"], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 1], + [4138, 0, "r"], + [4139, 0, "i"], + [4140, 0, "g"], + [4141, 0, "h"], + [4142, 0, "t"], + [3768, 1], + [3768, 0, "3"], + [4031, 0, ","], + [4032, 0, " "], + [4033, 0, "i"], + [4034, 0, "n"], + [4034, 1], + [4033, 1], + [4032, 1], + [4031, 1], + [4031, 0, ","], + [4032, 0, "i"], + [4033, 0, "n"], + [4034, 0, "n"], + [4035, 0, "e"], + [4036, 0, "r"], + [4037, 0, " "], + [4038, 0, "s"], + [4039, 0, "e"], + [4040, 0, "p"], + [4041, 0, "="], + [4042, 0, "5"], + [4043, 0, "p"], + [4044, 0, "t"], + [4157, 0, ","], + [4158, 0, "i"], + [4159, 0, "n"], + [4160, 0, "n"], + [4161, 0, "e"], + [4162, 0, "r"], + [4163, 0, " "], + [4164, 0, "s"], + [4165, 0, "e"], + [4166, 0, "p"], + [4167, 0, "="], + [4168, 0, "5"], + [4169, 0, "p"], + [4170, 0, "t"], + [4170, 1], + [4169, 1], + [4168, 1], + [4168, 0, "1"], + [4169, 0, "e"], + [4170, 0, "m"], + [4044, 1], + [4043, 1], + [4042, 1], + [4042, 0, "1"], + [4043, 0, "e"], + [4044, 0, "m"], + [4044, 1], + [4043, 1], + [4042, 1], + [4042, 0, "8"], + [4043, 0, "p"], + [4044, 0, "t"], + [4170, 1], + [4169, 1], + [4168, 1], + [4168, 0, "8"], + [4169, 0, "p"], + [4170, 0, "t"], + [6057, 0, ","], + [6058, 0, "i"], + [6059, 0, "n"], + [6060, 0, "n"], + [6061, 0, "e"], + [6062, 0, "r"], + [6063, 0, " "], + [6064, 0, "s"], + [6065, 0, "e"], + [6066, 0, "p"], + [6067, 0, "="], + [6068, 0, "8"], + [6069, 0, "p"], + [6070, 0, "t"], + [6068, 1], + [6068, 0, "1"], + [6069, 0, "2"], + [6131, 0, "\n"], + [6132, 0, "\\"], + [6133, 0, "d"], + [6133, 1], + [6132, 1], + [6131, 1], + [6140, 0, "\n"], + [6141, 0, "\\"], + [6142, 0, "d"], + [6143, 0, "r"], + [6144, 0, "a"], + [6145, 0, "w"], + [6146, 0, " "], + [6147, 0, "["], + [6148, 0, "t"], + [6149, 0, "h"], + [6150, 0, "i"], + [6151, 0, "c"], + [6152, 0, "k"], + [6153, 0, ","], + [6154, 0, "-"], + [6155, 0, "."], + [6155, 1], + [6155, 0, ">"], + [6156, 0, "]"], + [6157, 0, " "], + [6158, 0, "("], + [6159, 0, "s"], + [6160, 0, "t"], + [6161, 0, "a"], + [6162, 0, "r"], + [6163, 0, "t"], + [6164, 0, ")"], + [6165, 0, " "], + [6166, 0, "t"], + [6167, 0, "o"], + [6168, 0, " "], + [6169, 0, "n"], + [6170, 0, "o"], + [6171, 0, "d"], + [6172, 0, "e"], + [6173, 0, " "], + [6174, 0, "["], + [6175, 0, "r"], + [6176, 0, "i"], + [6177, 0, "g"], + [6178, 0, "h"], + [6179, 0, "t"], + [6180, 0, ","], + [6181, 0, "i"], + [6182, 0, "n"], + [6183, 0, "n"], + [6184, 0, "e"], + [6185, 0, "r"], + [6186, 0, " "], + [6187, 0, "s"], + [6188, 0, "e"], + [6189, 0, "p"], + [6190, 0, "="], + [6191, 0, "1"], + [6192, 0, "2"], + [6193, 0, "p"], + [6194, 0, "t"], + [6195, 0, "]"], + [6196, 0, " "], + [6197, 0, "{"], + [6198, 0, "\\"], + [6199, 0, "f"], + [6200, 0, "o"], + [6201, 0, "o"], + [6202, 0, "t"], + [6203, 0, "n"], + [6204, 0, "o"], + [6205, 0, "t"], + [6206, 0, "e"], + [6207, 0, "s"], + [6208, 0, "i"], + [6209, 0, "z"], + [6210, 0, "e"], + [6211, 0, " "], + [6212, 0, "d"], + [6213, 0, "o"], + [6214, 0, "c"], + [6215, 0, "["], + [6216, 0, "`"], + [6217, 0, "`"], + [6218, 0, "c"], + [6219, 0, "o"], + [6220, 0, "l"], + [6221, 0, "o"], + [6222, 0, "r"], + [6223, 0, "s"], + [6224, 0, "'"], + [6225, 0, "'"], + [6226, 0, "]"], + [6227, 0, "."], + [6228, 0, "d"], + [6229, 0, "e"], + [6230, 0, "l"], + [6231, 0, "e"], + [6232, 0, "t"], + [6233, 0, "e"], + [6234, 0, ";"], + [6235, 0, "}"], + [6236, 0, " "], + [6237, 0, "("], + [6238, 0, "r"], + [6239, 0, "i"], + [6240, 0, "g"], + [6241, 0, "h"], + [6242, 0, "t"], + [6243, 0, "1"], + [6244, 0, ")"], + [6245, 0, ";"], + [6246, 0, "\n"], + [6247, 0, "\\"], + [6248, 0, "d"], + [6249, 0, "r"], + [6250, 0, "a"], + [6251, 0, "w"], + [6252, 0, " "], + [6253, 0, "["], + [6254, 0, "t"], + [6255, 0, "h"], + [6256, 0, "i"], + [6257, 0, "c"], + [6258, 0, "k"], + [6259, 0, ","], + [6260, 0, "-"], + [6261, 0, ">"], + [6262, 0, "]"], + [6263, 0, " "], + [6264, 0, "("], + [6265, 0, "l"], + [6266, 0, "e"], + [6267, 0, "f"], + [6268, 0, "t"], + [6269, 0, "1"], + [6270, 0, ")"], + [6271, 0, " "], + [6272, 0, "t"], + [6273, 0, "o"], + [6274, 0, " "], + [6275, 0, "n"], + [6276, 0, "o"], + [6277, 0, "d"], + [6278, 0, "e"], + [6279, 0, " "], + [6280, 0, "["], + [6281, 0, "r"], + [6282, 0, "i"], + [6283, 0, "g"], + [6284, 0, "h"], + [6285, 0, "t"], + [6286, 0, "]"], + [6287, 0, " "], + [6288, 0, "{"], + [6289, 0, "\\"], + [6290, 0, "f"], + [6291, 0, "o"], + [6292, 0, "o"], + [6293, 0, "t"], + [6294, 0, "n"], + [6295, 0, "o"], + [6296, 0, "t"], + [6297, 0, "e"], + [6298, 0, "s"], + [6299, 0, "i"], + [6300, 0, "z"], + [6301, 0, "e"], + [6302, 0, " "], + [6303, 0, "d"], + [6304, 0, "o"], + [6305, 0, "c"], + [6306, 0, "["], + [6307, 0, "`"], + [6308, 0, "`"], + [6309, 0, "c"], + [6310, 0, "o"], + [6311, 0, "l"], + [6312, 0, "o"], + [6313, 0, "r"], + [6314, 0, "s"], + [6315, 0, "'"], + [6316, 0, "'"], + [6317, 0, "]"], + [6318, 0, "."], + [6318, 1], + [6318, 0, "["], + [6319, 0, "`"], + [6320, 0, "`"], + [6321, 0, "g"], + [6322, 0, "r"], + [6323, 0, "e"], + [6324, 0, "e"], + [6325, 0, "n"], + [6326, 0, "'"], + [6327, 0, "'"], + [6328, 0, "]"], + [6329, 0, " "], + [6330, 0, "="], + [6331, 0, " "], + [6331, 1], + [6330, 1], + [6330, 0, ":"], + [6331, 0, "="], + [6332, 0, " "], + [6333, 0, "`"], + [6334, 0, "`"], + [6335, 0, "\\"], + [6335, 1], + [6335, 0, "\\"], + [6336, 0, "#"], + [6337, 0, "0"], + [6338, 0, "0"], + [6339, 0, "f"], + [6340, 0, "f"], + [6341, 0, "0"], + [6342, 0, "0"], + [6343, 0, "'"], + [6344, 0, "'"], + [6345, 0, ";"], + [6346, 0, "}"], + [6347, 0, " "], + [6348, 0, "("], + [6349, 0, "r"], + [6350, 0, "i"], + [6351, 0, "g"], + [6352, 0, "h"], + [6353, 0, "t"], + [6354, 0, "2"], + [6355, 0, ")"], + [6356, 0, ";"], + [6268, 1], + [6267, 1], + [6266, 1], + [6265, 1], + [6265, 0, "r"], + [6266, 0, "i"], + [6267, 0, "g"], + [6268, 0, "h"], + [6269, 0, "t"], + [4188, 1], + [4188, 1], + [4188, 1], + [4188, 1], + [4188, 1], + [4188, 1], + [4188, 1], + [4191, 1], + [4192, 1], + [4192, 1], + [4192, 1], + [4192, 1], + [4192, 1], + [4192, 1], + [4199, 1], + [4209, 1], + [4208, 1], + [4207, 1], + [4206, 1], + [4205, 1], + [4204, 1], + [4210, 1], + [4087, 1], + [4092, 1], + [4092, 1], + [4092, 1], + [4092, 1], + [4092, 1], + [4092, 1], + [4098, 1], + [4098, 1], + [4201, 1], + [4079, 1], + [4078, 1], + [4077, 1], + [4076, 1], + [4075, 1], + [4074, 1], + [4072, 1], + [4068, 1], + [4067, 1], + [4066, 1], + [4065, 1], + [4064, 1], + [4063, 1], + [4062, 1], + [5621, 1], + [5621, 0, "2"], + [5622, 0, "."], + [5623, 0, "5"], + [5660, 1], + [5660, 0, "1"], + [5661, 0, "."], + [5662, 0, "5"], + [5623, 1], + [5622, 1], + [5621, 1], + [5621, 0, "3"], + [5422, 1], + [5422, 0, "5"], + [6314, 0, "\n"], + [6315, 0, "\\"], + [6316, 0, "d"], + [6317, 0, "r"], + [6318, 0, "a"], + [6319, 0, "w"], + [6320, 0, " "], + [6321, 0, "["], + [6322, 0, "t"], + [6323, 0, "h"], + [6324, 0, "i"], + [6325, 0, "c"], + [6326, 0, "k"], + [6327, 0, ","], + [6328, 0, "-"], + [6329, 0, ">"], + [6330, 0, "]"], + [6331, 0, " "], + [6332, 0, "("], + [6333, 0, "l"], + [6334, 0, "e"], + [6335, 0, "f"], + [6336, 0, "t"], + [6337, 0, "1"], + [6338, 0, ")"], + [6339, 0, " "], + [6340, 0, "t"], + [6341, 0, "o"], + [6342, 0, " "], + [6343, 0, "n"], + [6344, 0, "o"], + [6345, 0, "d"], + [6346, 0, "e"], + [6347, 0, " "], + [6348, 0, "["], + [6349, 0, "e"], + [6350, 0, "f"], + [6350, 1], + [6349, 1], + [6349, 0, "l"], + [6350, 0, "e"], + [6351, 0, "f"], + [6352, 0, "t"], + [6353, 0, "]"], + [6354, 0, " "], + [6355, 0, "{"], + [6356, 0, "\\"], + [6357, 0, "f"], + [6358, 0, "o"], + [6359, 0, "o"], + [6360, 0, "t"], + [6361, 0, "n"], + [6362, 0, "o"], + [6363, 0, "t"], + [6364, 0, "e"], + [6365, 0, "s"], + [6366, 0, "i"], + [6367, 0, "z"], + [6368, 0, "e"], + [6369, 0, " "], + [6370, 0, "y"], + [6371, 0, "i"], + [6372, 0, "e"], + [6373, 0, "l"], + [6374, 0, "d"], + [6375, 0, ";"], + [6376, 0, "]"], + [6376, 1], + [6376, 0, "}"], + [6377, 0, " "], + [6378, 0, "("], + [6379, 0, "l"], + [6380, 0, "e"], + [6381, 0, "f"], + [6382, 0, "t"], + [6383, 0, "2"], + [6384, 0, ")"], + [6385, 0, ";"], + [6386, 0, "\n"], + [6387, 0, "\\"], + [6388, 0, "d"], + [6389, 0, "r"], + [6390, 0, "a"], + [6391, 0, "w"], + [6392, 0, " "], + [6393, 0, "["], + [6394, 0, "t"], + [6395, 0, "h"], + [6396, 0, "i"], + [6397, 0, "c"], + [6398, 0, "k"], + [6399, 0, ","], + [6400, 0, "-"], + [6401, 0, ">"], + [6402, 0, "]"], + [6403, 0, " "], + [6404, 0, "("], + [6405, 0, "r"], + [6406, 0, "i"], + [6407, 0, "g"], + [6408, 0, "h"], + [6409, 0, "t"], + [6410, 0, "1"], + [6410, 1], + [6410, 0, "2"], + [6411, 0, ")"], + [6412, 0, " "], + [6413, 0, "t"], + [6414, 0, "o"], + [6415, 0, " "], + [6416, 0, "n"], + [6417, 0, "o"], + [6418, 0, "d"], + [6419, 0, "e"], + [6420, 0, " "], + [6421, 0, "["], + [6422, 0, "r"], + [6423, 0, "i"], + [6424, 0, "g"], + [6425, 0, "h"], + [6426, 0, "t"], + [6427, 0, "]"], + [6428, 0, " "], + [6429, 0, "{"], + [6430, 0, "\\"], + [6431, 0, "f"], + [6432, 0, "o"], + [6433, 0, "o"], + [6434, 0, "t"], + [6435, 0, "n"], + [6436, 0, "o"], + [6437, 0, "t"], + [6438, 0, "e"], + [6439, 0, "s"], + [6440, 0, "i"], + [6441, 0, "z"], + [6442, 0, "e"], + [6443, 0, " "], + [6444, 0, "y"], + [6445, 0, "i"], + [6446, 0, "e"], + [6447, 0, "l"], + [6448, 0, "d"], + [6449, 0, ";"], + [6450, 0, "]"], + [6450, 1], + [6450, 0, "\n"], + [6450, 1], + [6450, 0, "}"], + [6451, 0, " "], + [6452, 0, "("], + [6453, 0, "r"], + [6454, 0, "i"], + [6455, 0, "g"], + [6456, 0, "h"], + [6457, 0, "t"], + [6458, 0, "3"], + [6459, 0, ")"], + [6460, 0, ";"], + [6461, 0, "\n"], + [6462, 0, "\\"], + [6463, 0, "d"], + [6464, 0, "r"], + [6465, 0, "a"], + [6466, 0, "w"], + [6467, 0, " "], + [6468, 0, "["], + [6469, 0, "t"], + [6470, 0, "h"], + [6471, 0, "i"], + [6472, 0, "c"], + [6473, 0, "k"], + [6474, 0, ","], + [6475, 0, "-"], + [6476, 0, ">"], + [6477, 0, "]"], + [6478, 0, " "], + [6479, 0, "("], + [6480, 0, "l"], + [6481, 0, "e"], + [6482, 0, "f"], + [6483, 0, "t"], + [6484, 0, "1"], + [6485, 0, ")"], + [6486, 0, " "], + [6487, 0, "t"], + [6488, 0, "o"], + [6489, 0, " "], + [6490, 0, "("], + [6491, 0, "r"], + [6492, 0, "i"], + [6493, 0, "g"], + [6494, 0, "h"], + [6495, 0, "t"], + [6496, 0, "3"], + [6497, 0, ")"], + [6498, 0, ";"], + [6499, 0, "\n"], + [6500, 0, "\\"], + [6501, 0, "d"], + [6502, 0, "r"], + [6503, 0, "a"], + [6504, 0, "w"], + [6505, 0, " "], + [6506, 0, "["], + [6507, 0, "t"], + [6508, 0, "h"], + [6509, 0, "i"], + [6510, 0, "c"], + [6511, 0, "k"], + [6512, 0, ","], + [6513, 0, "-"], + [6514, 0, ">"], + [6515, 0, "]"], + [6516, 0, " "], + [6517, 0, "("], + [6518, 0, "r"], + [6519, 0, "i"], + [6520, 0, "g"], + [6521, 0, "h"], + [6522, 0, "t"], + [6523, 0, "2"], + [6524, 0, ")"], + [6525, 0, " "], + [6526, 0, "t"], + [6527, 0, "o"], + [6528, 0, " "], + [6529, 0, "("], + [6530, 0, "A"], + [6531, 0, "l"], + [6532, 0, "e"], + [6533, 0, "f"], + [6533, 1], + [6532, 1], + [6531, 1], + [6530, 1], + [6530, 0, "l"], + [6531, 0, "e"], + [6532, 0, "f"], + [6533, 0, "t"], + [6534, 0, "2"], + [6535, 0, ")"], + [6536, 0, ";"], + [5422, 1], + [5422, 0, "4"], + [6148, 1], + [6148, 0, "8"], + [6189, 1], + [6188, 1], + [6187, 1], + [6186, 1], + [6185, 1], + [6184, 1], + [6183, 1], + [6183, 0, " "], + [6184, 0, "="], + [6185, 0, " "], + [6186, 0, "\\"], + [6187, 0, "{"], + [6188, 0, "\\"], + [6189, 0, "}"], + [5632, 0, "\""], + [5633, 0, "c"], + [5634, 0, "o"], + [5635, 0, "l"], + [5636, 0, "o"], + [5637, 0, "r"], + [5638, 0, "s"], + [5639, 0, "\""], + [5640, 0, ":"], + [5641, 0, " "], + [5642, 0, "{"], + [5643, 0, "}"], + [6659, 1], + [6658, 1], + [6657, 1], + [6656, 1], + [6655, 1], + [6654, 1], + [6653, 1], + [6653, 0, "o"], + [6654, 0, "v"], + [6655, 0, "e"], + [6656, 0, "r"], + [6657, 0, "w"], + [6658, 0, "r"], + [6659, 0, "i"], + [6660, 0, "t"], + [6661, 0, "t"], + [6662, 0, "e"], + [6663, 0, "n"], + [6701, 0, "\n"], + [6702, 0, "\n"], + [6703, 0, "A"], + [6704, 0, "n"], + [6705, 0, "o"], + [6706, 0, "t"], + [6707, 0, "h"], + [6708, 0, "e"], + [6709, 0, "r"], + [6710, 0, " "], + [6711, 0, "e"], + [6712, 0, "x"], + [6713, 0, "a"], + [6714, 0, "m"], + [6715, 0, "p"], + [6716, 0, "l"], + [6717, 0, "e"], + [6718, 0, " "], + [6719, 0, "i"], + [6720, 0, "s"], + [6721, 0, " "], + [6722, 0, "g"], + [6723, 0, "i"], + [6724, 0, "v"], + [6725, 0, "e"], + [6726, 0, "n"], + [6727, 0, " "], + [6728, 0, "i"], + [6729, 0, "n"], + [6730, 0, " "], + [6731, 0, "F"], + [6732, 0, "i"], + [6733, 0, "g"], + [6734, 0, "u"], + [6735, 0, "r"], + [6736, 0, "e"], + [6737, 0, "~"], + [6738, 0, "\\"], + [6739, 0, "r"], + [6740, 0, "e"], + [6741, 0, "f"], + [6742, 0, "{"], + [6743, 0, "f"], + [6744, 0, "i"], + [6745, 0, "g"], + [6746, 0, ":"], + [6747, 0, "m"], + [6748, 0, "a"], + [6749, 0, "p"], + [6750, 0, "-"], + [6751, 0, "r"], + [6752, 0, "e"], + [6753, 0, "m"], + [6754, 0, "o"], + [6755, 0, "v"], + [6756, 0, "e"], + [6757, 0, "}"], + [6758, 0, "."], + [6759, 0, " "], + [6760, 0, "H"], + [6761, 0, "e"], + [6762, 0, "r"], + [6763, 0, "e"], + [6764, 0, ","], + [6765, 0, " "], + [6766, 0, "o"], + [6767, 0, "n"], + [6768, 0, "e"], + [6769, 0, " "], + [6770, 0, "r"], + [6771, 0, "e"], + [6772, 0, "p"], + [6773, 0, "l"], + [6774, 0, "i"], + [6775, 0, "c"], + [6776, 0, "a"], + [6777, 0, " "], + [6778, 0, "a"], + [6779, 0, "d"], + [6780, 0, "d"], + [6781, 0, "s"], + [6782, 0, " "], + [6783, 0, "`"], + [6784, 0, "`"], + [6785, 0, "r"], + [6786, 0, "e"], + [6787, 0, "d"], + [6788, 0, "'"], + [6789, 0, "'"], + [6790, 0, " "], + [6791, 0, "t"], + [6792, 0, "o"], + [6793, 0, " "], + [6794, 0, "a"], + [6795, 0, " "], + [6796, 0, "m"], + [6797, 0, "a"], + [6798, 0, "p"], + [6799, 0, " "], + [6800, 0, "o"], + [6801, 0, "f"], + [6802, 0, " "], + [6803, 0, "c"], + [6804, 0, "o"], + [6805, 0, "l"], + [6806, 0, "o"], + [6807, 0, "r"], + [6808, 0, "s"], + [6809, 0, ","], + [6810, 0, " "], + [6811, 0, "w"], + [6812, 0, "h"], + [6813, 0, "i"], + [6814, 0, "l"], + [6815, 0, "e"], + [6816, 0, " "], + [6817, 0, "c"], + [6818, 0, "o"], + [6819, 0, "n"], + [6820, 0, "c"], + [6821, 0, "u"], + [6822, 0, "r"], + [6823, 0, "r"], + [6824, 0, "e"], + [6825, 0, "n"], + [6826, 0, "t"], + [6827, 0, "l"], + [6828, 0, "y"], + [6829, 0, " "], + [6830, 0, "a"], + [6831, 0, "n"], + [6832, 0, "o"], + [6833, 0, "t"], + [6834, 0, "h"], + [6835, 0, "e"], + [6836, 0, "r"], + [6837, 0, " "], + [6838, 0, "c"], + [6839, 0, "l"], + [6840, 0, "i"], + [6841, 0, "e"], + [6842, 0, "n"], + [6843, 0, "t"], + [6844, 0, " "], + [6845, 0, "f"], + [6846, 0, "i"], + [6847, 0, "r"], + [6848, 0, "s"], + [6849, 0, "t"], + [6850, 0, " "], + [6851, 0, "b"], + [6852, 0, "l"], + [6853, 0, "a"], + [6854, 0, "n"], + [6855, 0, "k"], + [6856, 0, "s"], + [6857, 0, " "], + [6858, 0, "o"], + [6859, 0, "u"], + [6860, 0, "t"], + [6861, 0, " "], + [6862, 0, "t"], + [6863, 0, "h"], + [6864, 0, "e"], + [6865, 0, " "], + [6866, 0, "e"], + [6867, 0, "n"], + [6868, 0, "t"], + [6869, 0, "i"], + [6870, 0, "r"], + [6871, 0, "e"], + [6872, 0, " "], + [6873, 0, "m"], + [6874, 0, "a"], + [6875, 0, "p"], + [6876, 0, " "], + [6877, 0, "o"], + [6878, 0, "f"], + [6879, 0, " "], + [6880, 0, "c"], + [6881, 0, "o"], + [6882, 0, "l"], + [6883, 0, "o"], + [6884, 0, "r"], + [6885, 0, "s"], + [6886, 0, " "], + [6886, 1], + [6886, 0, ","], + [6887, 0, " "], + [6888, 0, "a"], + [6889, 0, "n"], + [6890, 0, "d"], + [6891, 0, " "], + [6892, 0, "t"], + [6893, 0, "h"], + [6894, 0, "e"], + [6895, 0, "n"], + [6896, 0, " "], + [6897, 0, "a"], + [6898, 0, "d"], + [6899, 0, "d"], + [6900, 0, "s"], + [6901, 0, " "], + [6902, 0, "`"], + [6903, 0, "`"], + [6904, 0, "g"], + [6905, 0, "r"], + [6906, 0, "e"], + [6907, 0, "e"], + [6908, 0, "n"], + [6909, 0, "'"], + [6910, 0, "'"], + [6911, 0, "."], + [6912, 0, " "], + [6913, 0, "A"], + [6914, 0, "s"], + [6915, 0, " "], + [6916, 0, "t"], + [6917, 0, "h"], + [6918, 0, "e"], + [6919, 0, " "], + [6920, 0, "r"], + [6921, 0, "e"], + [6922, 0, "p"], + [6923, 0, "l"], + [6924, 0, "i"], + [6925, 0, "c"], + [6926, 0, "a"], + [6927, 0, "s"], + [6928, 0, " "], + [6929, 0, "m"], + [6930, 0, "e"], + [6931, 0, "r"], + [6932, 0, "g"], + [6933, 0, "e"], + [6934, 0, " "], + [6935, 0, "t"], + [6936, 0, "h"], + [6937, 0, "e"], + [6938, 0, "i"], + [6939, 0, "r"], + [6940, 0, " "], + [6941, 0, "e"], + [6942, 0, "d"], + [6943, 0, "i"], + [6944, 0, "t"], + [6945, 0, "s"], + [6946, 0, ","], + [6947, 0, " "], + [6948, 0, "a"], + [6949, 0, "l"], + [6950, 0, "l"], + [6951, 0, " "], + [6952, 0, "c"], + [6953, 0, "h"], + [6954, 0, "a"], + [6955, 0, "n"], + [6956, 0, "g"], + [6957, 0, "e"], + [6958, 0, "s"], + [6959, 0, " "], + [6960, 0, "m"], + [6961, 0, "u"], + [6962, 0, "s"], + [6963, 0, "t"], + [6964, 0, " "], + [6965, 0, "b"], + [6966, 0, "e"], + [6967, 0, " "], + [6968, 0, "p"], + [6969, 0, "r"], + [6970, 0, "e"], + [6971, 0, "s"], + [6972, 0, "e"], + [6973, 0, "r"], + [6974, 0, "v"], + [6975, 0, "e"], + [6976, 0, "d"], + [6977, 0, ":"], + [6978, 0, " "], + [6979, 0, "`"], + [6980, 0, "`"], + [6981, 0, "b"], + [6982, 0, "l"], + [6983, 0, "u"], + [6984, 0, "e"], + [6985, 0, "'"], + [6986, 0, "'"], + [6987, 0, " "], + [6988, 0, "m"], + [6989, 0, "u"], + [6990, 0, "s"], + [6991, 0, "t"], + [6992, 0, " "], + [6993, 0, "b"], + [6994, 0, "e"], + [6995, 0, " "], + [6996, 0, "a"], + [6997, 0, "b"], + [6998, 0, "s"], + [6999, 0, "e"], + [7000, 0, "n"], + [7001, 0, "t"], + [7002, 0, " "], + [7003, 0, "f"], + [7004, 0, "r"], + [7005, 0, "o"], + [7006, 0, "m"], + [7007, 0, " "], + [7008, 0, "t"], + [7009, 0, "h"], + [7010, 0, "e"], + [7011, 0, " "], + [7012, 0, "f"], + [7013, 0, "i"], + [7014, 0, "n"], + [7015, 0, "a"], + [7016, 0, "l"], + [7017, 0, " "], + [7018, 0, "m"], + [7019, 0, "a"], + [7020, 0, "p"], + [7021, 0, ","], + [7022, 0, " "], + [7023, 0, "s"], + [7024, 0, "i"], + [7025, 0, "n"], + [7026, 0, "c"], + [7027, 0, "e"], + [7028, 0, " "], + [7029, 0, "i"], + [7030, 0, "t"], + [7031, 0, " "], + [7032, 0, "w"], + [7033, 0, "a"], + [7034, 0, "s"], + [7035, 0, " "], + [7036, 0, "r"], + [7037, 0, "e"], + [7038, 0, "m"], + [7039, 0, "o"], + [7040, 0, "v"], + [7041, 0, "e"], + [7042, 0, "d"], + [7043, 0, " "], + [7044, 0, "b"], + [7045, 0, "y"], + [7046, 0, " "], + [7047, 0, "b"], + [7048, 0, "l"], + [7049, 0, "a"], + [7050, 0, "n"], + [7051, 0, "k"], + [7052, 0, "i"], + [7053, 0, "n"], + [7054, 0, "g"], + [7055, 0, " "], + [7056, 0, "o"], + [7057, 0, "u"], + [7058, 0, "t"], + [7059, 0, " "], + [7060, 0, "t"], + [7061, 0, "h"], + [7062, 0, "e"], + [7063, 0, " "], + [7064, 0, "m"], + [7065, 0, "a"], + [7066, 0, "p"], + [7067, 0, ","], + [7068, 0, " "], + [7069, 0, "w"], + [7070, 0, "h"], + [7071, 0, "i"], + [7072, 0, "l"], + [7073, 0, "e"], + [7074, 0, " "], + [7075, 0, "`"], + [7076, 0, "`"], + [7077, 0, "r"], + [7078, 0, "e"], + [7079, 0, "d"], + [7080, 0, "`"], + [7081, 0, "`"], + [7081, 1], + [7080, 1], + [7080, 0, "'"], + [7081, 0, "'"], + [7082, 0, " "], + [7083, 0, "a"], + [7084, 0, "n"], + [7085, 0, "d"], + [7086, 0, " "], + [7087, 0, "`"], + [7088, 0, "`"], + [7089, 0, "g"], + [7090, 0, "r"], + [7091, 0, "e"], + [7092, 0, "e"], + [7093, 0, "n"], + [7094, 0, "'"], + [7095, 0, "'"], + [7096, 0, " "], + [7097, 0, "m"], + [7098, 0, "u"], + [7099, 0, "s"], + [7100, 0, "t"], + [7101, 0, " "], + [7102, 0, "b"], + [7103, 0, "e"], + [7104, 0, " "], + [7105, 0, "p"], + [7106, 0, "r"], + [7107, 0, "e"], + [7108, 0, "s"], + [7109, 0, "e"], + [7110, 0, "n"], + [7111, 0, "t"], + [7112, 0, ","], + [7113, 0, " "], + [7114, 0, "s"], + [7115, 0, "i"], + [7116, 0, "n"], + [7117, 0, "c"], + [7118, 0, "e"], + [7119, 0, " "], + [7120, 0, "t"], + [7121, 0, "h"], + [7122, 0, "e"], + [7123, 0, "y"], + [7124, 0, " "], + [7125, 0, "w"], + [7126, 0, "e"], + [7127, 0, "r"], + [7128, 0, "e"], + [7129, 0, " "], + [7130, 0, "e"], + [7131, 0, "x"], + [7132, 0, "p"], + [7133, 0, "l"], + [7134, 0, "i"], + [7135, 0, "c"], + [7136, 0, "i"], + [7137, 0, "t"], + [7138, 0, "l"], + [7139, 0, "y"], + [7140, 0, " "], + [7141, 0, "a"], + [7142, 0, "d"], + [7143, 0, "d"], + [7144, 0, "e"], + [7145, 0, "d"], + [7146, 0, "."], + [7147, 0, "\n"], + [7148, 0, "\n"], + [7149, 0, "A"], + [7150, 0, " "], + [7151, 0, "n"], + [7152, 0, "a"], + [7153, 0, "i"], + [7154, 0, "v"], + [7155, 0, "e"], + [7156, 0, " "], + [7157, 0, "i"], + [7158, 0, "m"], + [7159, 0, "p"], + [7160, 0, "l"], + [7161, 0, "e"], + [7162, 0, "m"], + [7163, 0, "e"], + [7164, 0, "n"], + [7165, 0, "t"], + [7166, 0, "a"], + [7167, 0, "t"], + [7168, 0, "i"], + [7169, 0, "o"], + [7170, 0, "n"], + [7171, 0, " "], + [7171, 1], + [7170, 1], + [7169, 1], + [7168, 1], + [7167, 1], + [7166, 1], + [7165, 1], + [7164, 1], + [7163, 1], + [7162, 1], + [7161, 1], + [7160, 1], + [7159, 1], + [7158, 1], + [7157, 1], + [7156, 1], + [7155, 1], + [7154, 1], + [7153, 1], + [7152, 1], + [7151, 1], + [7150, 1], + [7149, 1], + [7148, 1], + [7147, 1], + [5345, 1], + [5344, 1], + [5343, 1], + [5342, 1], + [5341, 1], + [5340, 1], + [5339, 1], + [5319, 0, "m"], + [5320, 0, "u"], + [5321, 0, "l"], + [5322, 0, "t"], + [5323, 0, "i"], + [5324, 0, "p"], + [5325, 0, "l"], + [5326, 0, "e"], + [5327, 0, " "], + [5328, 0, "v"], + [5329, 0, "a"], + [5330, 0, "l"], + [5331, 0, "u"], + [5332, 0, "e"], + [5333, 0, "s"], + [5334, 0, " "], + [5335, 0, "t"], + [5336, 0, "h"], + [5337, 0, "a"], + [5338, 0, "t"], + [5339, 0, " "], + [5340, 0, "w"], + [5341, 0, "e"], + [5342, 0, "r"], + [5343, 0, "e"], + [5344, 0, " "], + [7167, 0, "\n"], + [7168, 0, "\n"], + [7168, 0, "\\"], + [7169, 0, "b"], + [7170, 0, "e"], + [7171, 0, "g"], + [7172, 0, "i"], + [7173, 0, "n"], + [7174, 0, "{"], + [7175, 0, "f"], + [7176, 0, "i"], + [7177, 0, "g"], + [7178, 0, "u"], + [7179, 0, "r"], + [7180, 0, "e"], + [7181, 0, "*"], + [7182, 0, "}"], + [7183, 0, "\n"], + [7184, 0, "\\"], + [7185, 0, "c"], + [7186, 0, "e"], + [7187, 0, "n"], + [7188, 0, "t"], + [7189, 0, "e"], + [7190, 0, "r"], + [7191, 0, "i"], + [7192, 0, "n"], + [7193, 0, "g"], + [7194, 0, "\n"], + [7195, 0, "\\"], + [7196, 0, "b"], + [7197, 0, "e"], + [7198, 0, "g"], + [7199, 0, "i"], + [7200, 0, "n"], + [7201, 0, "{"], + [7202, 0, "t"], + [7203, 0, "i"], + [7204, 0, "k"], + [7205, 0, "z"], + [7206, 0, "p"], + [7207, 0, "i"], + [7208, 0, "c"], + [7209, 0, "t"], + [7210, 0, "u"], + [7211, 0, "r"], + [7212, 0, "e"], + [7213, 0, "}"], + [7214, 0, "["], + [7215, 0, "a"], + [7216, 0, "u"], + [7217, 0, "t"], + [7218, 0, "o"], + [7219, 0, "]"], + [7220, 0, "\n"], + [7221, 0, "\\"], + [7222, 0, "e"], + [7223, 0, "n"], + [7224, 0, "d"], + [7225, 0, "{"], + [7226, 0, "t"], + [7227, 0, "i"], + [7228, 0, "k"], + [7229, 0, "z"], + [7230, 0, "p"], + [7231, 0, "i"], + [7232, 0, "c"], + [7233, 0, "t"], + [7234, 0, "u"], + [7235, 0, "r"], + [7236, 0, "e"], + [7237, 0, "}"], + [7238, 0, "\n"], + [7239, 0, "\\"], + [7240, 0, "c"], + [7241, 0, "a"], + [7242, 0, "p"], + [7243, 0, "t"], + [7244, 0, "i"], + [7245, 0, "o"], + [7246, 0, "n"], + [7247, 0, "{"], + [7248, 0, "T"], + [7249, 0, "w"], + [7250, 0, "o"], + [7251, 0, " "], + [7252, 0, "r"], + [7253, 0, "e"], + [7254, 0, "p"], + [7255, 0, "l"], + [7256, 0, "i"], + [7257, 0, "c"], + [7258, 0, "a"], + [7259, 0, "s"], + [7260, 0, " "], + [7261, 0, "c"], + [7262, 0, "o"], + [7263, 0, "n"], + [7264, 0, "c"], + [7265, 0, "u"], + [7266, 0, "r"], + [7267, 0, "r"], + [7268, 0, "e"], + [7269, 0, "n"], + [7270, 0, "t"], + [7271, 0, "l"], + [7272, 0, "y"], + [7273, 0, " "], + [7274, 0, "c"], + [7275, 0, "r"], + [7276, 0, "e"], + [7277, 0, "a"], + [7278, 0, "t"], + [7279, 0, "e"], + [7280, 0, " "], + [7281, 0, "a"], + [7282, 0, "n"], + [7283, 0, " "], + [7283, 1], + [7282, 1], + [7281, 1], + [7281, 0, "o"], + [7282, 0, "r"], + [7283, 0, "d"], + [7284, 0, "e"], + [7285, 0, "r"], + [7286, 0, "e"], + [7287, 0, "d"], + [7288, 0, " "], + [7289, 0, "l"], + [7290, 0, "i"], + [7291, 0, "s"], + [7292, 0, "t"], + [7293, 0, "s"], + [7294, 0, " "], + [7295, 0, "u"], + [7296, 0, "n"], + [7297, 0, "d"], + [7298, 0, "e"], + [7299, 0, "r"], + [7300, 0, " "], + [7301, 0, "t"], + [7302, 0, "h"], + [7303, 0, "e"], + [7304, 0, " "], + [7305, 0, "s"], + [7306, 0, "a"], + [7307, 0, "m"], + [7308, 0, "e"], + [7309, 0, " "], + [7310, 0, "m"], + [7311, 0, "a"], + [7312, 0, "p"], + [7313, 0, " "], + [7314, 0, "k"], + [7315, 0, "e"], + [7316, 0, "y"], + [7317, 0, "}"], + [7318, 0, "\\"], + [7319, 0, "l"], + [7320, 0, "a"], + [7321, 0, "b"], + [7322, 0, "e"], + [7323, 0, "l"], + [7324, 0, "{"], + [7325, 0, "f"], + [7326, 0, "i"], + [7327, 0, "g"], + [7328, 0, ":"], + [7329, 0, "t"], + [7330, 0, "w"], + [7331, 0, "o"], + [7332, 0, "-"], + [7333, 0, "l"], + [7334, 0, "i"], + [7335, 0, "s"], + [7336, 0, "t"], + [7337, 0, "s"], + [7338, 0, "}"], + [7339, 0, "\n"], + [7340, 0, "\\"], + [7341, 0, "e"], + [7342, 0, "n"], + [7343, 0, "d"], + [7344, 0, "{"], + [7345, 0, "f"], + [7346, 0, "i"], + [7347, 0, "g"], + [7348, 0, "u"], + [7349, 0, "r"], + [7350, 0, "e"], + [7351, 0, "*"], + [7352, 0, "}"], + [7220, 0, "\n"], + [7221, 0, "\\"], + [7222, 0, "n"], + [7223, 0, "o"], + [7224, 0, "d"], + [7225, 0, "e"], + [7226, 0, " "], + [7227, 0, "("], + [7228, 0, "s"], + [7229, 0, "t"], + [7230, 0, "a"], + [7231, 0, "r"], + [7232, 0, "t"], + [7233, 0, ")"], + [7234, 0, " "], + [7235, 0, "a"], + [7236, 0, "t"], + [7237, 0, " "], + [7238, 0, "("], + [7239, 0, "4"], + [7240, 0, ","], + [7241, 0, "4"], + [7242, 0, ")"], + [7243, 0, " "], + [7244, 0, "{"], + [7245, 0, "\\"], + [7246, 0, "v"], + [7247, 0, "e"], + [7248, 0, "r"], + [7249, 0, "b"], + [7250, 0, "|"], + [7251, 0, "{"], + [7252, 0, "}"], + [7253, 0, "|"], + [7254, 0, "}"], + [7255, 0, ";"], + [7256, 0, "\n"], + [7257, 0, "\\"], + [7258, 0, "n"], + [7259, 0, "o"], + [7260, 0, "d"], + [7261, 0, "e"], + [7262, 0, " "], + [7263, 0, "("], + [7264, 0, "l"], + [7265, 0, "e"], + [7266, 0, "f"], + [7267, 0, "t"], + [7268, 0, "1"], + [7269, 0, ")"], + [7270, 0, " "], + [7271, 0, "a"], + [7272, 0, "t"], + [7273, 0, " "], + [7274, 0, "("], + [7275, 0, "0"], + [7276, 0, ","], + [7277, 0, "3"], + [7278, 0, ")"], + [7279, 0, " "], + [7280, 0, "{"], + [7281, 0, "\\"], + [7282, 0, "v"], + [7283, 0, "e"], + [7284, 0, "r"], + [7285, 0, "b"], + [7286, 0, "|"], + [7287, 0, "{"], + [7288, 0, "\""], + [7289, 0, "f"], + [7290, 0, "o"], + [7291, 0, "o"], + [7292, 0, "d"], + [7293, 0, "\""], + [7294, 0, ":"], + [7295, 0, "["], + [7296, 0, "]"], + [7297, 0, "}"], + [7298, 0, "\""], + [7298, 1], + [7298, 0, "|"], + [7299, 0, "}"], + [7300, 0, ";"], + [7301, 0, "\n"], + [7302, 0, "\\"], + [7303, 0, "n"], + [7304, 0, "o"], + [7305, 0, "d"], + [7306, 0, "e"], + [7307, 0, " "], + [7308, 0, "("], + [7309, 0, "r"], + [7310, 0, "i"], + [7311, 0, "g"], + [7312, 0, "h"], + [7313, 0, "t"], + [7314, 0, "1"], + [7315, 0, ")"], + [7271, 0, " "], + [7235, 0, " "], + [7318, 0, " "], + [7319, 0, "a"], + [7320, 0, "t"], + [7321, 0, " "], + [7322, 0, "("], + [7323, 0, "8"], + [7324, 0, ","], + [7325, 0, "3"], + [7326, 0, ")"], + [7327, 0, " "], + [7328, 0, "{"], + [7329, 0, "\\"], + [7330, 0, "v"], + [7331, 0, "e"], + [7332, 0, "r"], + [7333, 0, "b"], + [7334, 0, "|"], + [7335, 0, "{"], + [7336, 0, "\""], + [7337, 0, "f"], + [7338, 0, "o"], + [7339, 0, "o"], + [7340, 0, "d"], + [7341, 0, "\""], + [7342, 0, ":"], + [7343, 0, "p"], + [7343, 1], + [7343, 0, "["], + [7344, 0, "]"], + [7345, 0, "}"], + [7346, 0, "|"], + [7347, 0, "}"], + [7348, 0, ";"], + [7349, 0, "\n"], + [7350, 0, "\\"], + [7351, 0, "n"], + [7352, 0, "o"], + [7353, 0, "d"], + [7354, 0, "e"], + [7355, 0, " "], + [7356, 0, "("], + [7357, 0, "l"], + [7358, 0, "e"], + [7359, 0, "f"], + [7360, 0, "t"], + [7361, 0, "2"], + [7362, 0, ")"], + [7363, 0, " "], + [7364, 0, " "], + [7365, 0, "a"], + [7366, 0, "t"], + [7367, 0, " "], + [7368, 0, "("], + [7369, 0, "0"], + [7370, 0, ","], + [7371, 0, "2"], + [7372, 0, ")"], + [7373, 0, " "], + [7374, 0, "{"], + [7375, 0, "\\"], + [7376, 0, "v"], + [7377, 0, "e"], + [7378, 0, "r"], + [7379, 0, "b"], + [7380, 0, "|"], + [7381, 0, "{"], + [7382, 0, "\""], + [7383, 0, "f"], + [7384, 0, "o"], + [7385, 0, "o"], + [7386, 0, "d"], + [7387, 0, "\""], + [7388, 0, ":"], + [7389, 0, "["], + [7390, 0, "\""], + [7391, 0, "e"], + [7392, 0, "g"], + [7393, 0, "g"], + [7394, 0, "s"], + [7395, 0, "\""], + [7396, 0, "]"], + [7397, 0, "}"], + [7398, 0, "|"], + [7399, 0, "}"], + [7400, 0, ";"], + [7401, 0, "\n"], + [7402, 0, "\\"], + [7403, 0, "n"], + [7404, 0, "o"], + [7405, 0, "d"], + [7406, 0, "e"], + [7407, 0, " "], + [7408, 0, "("], + [7409, 0, "l"], + [7410, 0, "e"], + [7411, 0, "f"], + [7412, 0, "t"], + [7413, 0, "3"], + [7414, 0, ")"], + [7415, 0, " "], + [7416, 0, " "], + [7417, 0, "a"], + [7418, 0, "t"], + [7419, 0, " "], + [7420, 0, "("], + [7421, 0, "0"], + [7422, 0, ","], + [7423, 0, "1"], + [7424, 0, ")"], + [7425, 0, " "], + [7426, 0, "{"], + [7427, 0, "\\"], + [7428, 0, "v"], + [7429, 0, "e"], + [7430, 0, "r"], + [7431, 0, "b"], + [7432, 0, "|"], + [7433, 0, "{"], + [7434, 0, "\""], + [7435, 0, "f"], + [7436, 0, "o"], + [7437, 0, "o"], + [7438, 0, "d"], + [7439, 0, "\""], + [7440, 0, ":"], + [7441, 0, "["], + [7442, 0, "\""], + [7443, 0, "e"], + [7444, 0, "g"], + [7445, 0, "g"], + [7446, 0, "s"], + [7447, 0, "\""], + [7448, 0, ","], + [7449, 0, "\""], + [7450, 0, "m"], + [7451, 0, "i"], + [7452, 0, "l"], + [7453, 0, "k"], + [7454, 0, "\""], + [7455, 0, "]"], + [7456, 0, "}"], + [7457, 0, "|"], + [7458, 0, "}"], + [7459, 0, ";"], + [7291, 1], + [7291, 1], + [7291, 1], + [7291, 1], + [7291, 0, "b"], + [7292, 0, "u"], + [7293, 0, "y"], + [7339, 1], + [7338, 1], + [7337, 1], + [7336, 1], + [7336, 0, "b"], + [7337, 0, "u"], + [7338, 0, "y"], + [7384, 1], + [7383, 1], + [7382, 1], + [7381, 1], + [7381, 0, "b"], + [7382, 0, "u"], + [7383, 0, "y"], + [7435, 1], + [7434, 1], + [7433, 1], + [7432, 1], + [7432, 0, "b"], + [7433, 0, "u"], + [7434, 0, "y"], + [7456, 0, "\n"], + [7457, 0, "\\"], + [7458, 0, "n"], + [7459, 0, "o"], + [7460, 0, "d"], + [7461, 0, "e"], + [7462, 0, " "], + [7463, 0, "("], + [7464, 0, "r"], + [7465, 0, "i"], + [7466, 0, "g"], + [7467, 0, "h"], + [7468, 0, "t"], + [7469, 0, "2"], + [7470, 0, ")"], + [7471, 0, " "], + [7472, 0, "a"], + [7473, 0, "t"], + [7474, 0, " "], + [7475, 0, "8"], + [7476, 0, ","], + [7477, 0, "2"], + [7478, 0, ")"], + [7475, 0, "("], + [7480, 0, " "], + [7481, 0, "{"], + [7482, 0, "\\"], + [7483, 0, "v"], + [7484, 0, "e"], + [7485, 0, "r"], + [7486, 0, "b"], + [7487, 0, "|"], + [7488, 0, "{"], + [7489, 0, "\""], + [7490, 0, "b"], + [7491, 0, "u"], + [7492, 0, "y"], + [7493, 0, "\""], + [7494, 0, ":"], + [7495, 0, "["], + [7496, 0, "\""], + [7497, 0, "h"], + [7498, 0, "a"], + [7499, 0, "m"], + [7500, 0, "\""], + [7501, 0, "]"], + [7502, 0, "}"], + [7446, 1], + [7446, 1], + [7446, 1], + [7446, 1], + [7446, 0, "h"], + [7447, 0, "a"], + [7448, 0, "m"], + [7498, 1], + [7497, 1], + [7496, 1], + [7496, 0, "m"], + [7497, 0, "i"], + [7498, 0, "l"], + [7499, 0, "k"], + [7503, 0, "|"], + [7504, 0, "}"], + [7505, 0, ";"], + [7506, 0, "\n"], + [7507, 0, "\\"], + [7508, 0, "n"], + [7509, 0, "o"], + [7510, 0, "d"], + [7511, 0, "e"], + [7512, 0, " "], + [7513, 0, "("], + [7514, 0, "r"], + [7515, 0, "i"], + [7516, 0, "g"], + [7517, 0, "h"], + [7518, 0, "t"], + [7519, 0, "3"], + [7520, 0, ")"], + [7521, 0, " "], + [7522, 0, "a"], + [7523, 0, "t"], + [7524, 0, " "], + [7525, 0, "("], + [7526, 0, "8"], + [7527, 0, ","], + [7528, 0, "1"], + [7529, 0, ")"], + [7530, 0, " "], + [7531, 0, "{"], + [7532, 0, "\\"], + [7533, 0, "v"], + [7534, 0, "e"], + [7535, 0, "r"], + [7536, 0, "b"], + [7537, 0, "|"], + [7538, 0, "{"], + [7539, 0, "\""], + [7540, 0, "b"], + [7541, 0, "u"], + [7542, 0, "y"], + [7543, 0, "\""], + [7544, 0, ":"], + [7545, 0, "["], + [7546, 0, "\""], + [7547, 0, "m"], + [7548, 0, "i"], + [7549, 0, "l"], + [7550, 0, "k"], + [7551, 0, "\""], + [7552, 0, ","], + [7553, 0, "\""], + [7554, 0, "f"], + [7555, 0, "l"], + [7556, 0, "o"], + [7557, 0, "u"], + [7558, 0, "r"], + [7559, 0, "\""], + [7560, 0, "]"], + [7561, 0, "}"], + [7562, 0, "|"], + [7563, 0, "}"], + [7564, 0, ";"], + [7565, 0, "\n"], + [7566, 0, "\\"], + [7567, 0, "n"], + [7568, 0, "o"], + [7569, 0, "d"], + [7570, 0, "e"], + [7571, 0, " "], + [7572, 0, "["], + [7573, 0, "m"], + [7574, 0, "a"], + [7575, 0, "t"], + [7576, 0, "r"], + [7577, 0, "x"], + [7577, 1], + [7577, 0, "i"], + [7578, 0, "x"], + [7579, 0, "]"], + [7580, 0, " "], + [7581, 0, "("], + [7582, 0, "l"], + [7583, 0, "e"], + [7584, 0, "f"], + [7585, 0, "t"], + [7586, 0, "4"], + [7587, 0, ")"], + [7588, 0, " "], + [7589, 0, "a"], + [7590, 0, "t"], + [7591, 0, " "], + [7592, 0, "("], + [7593, 0, "0"], + [7594, 0, ","], + [7595, 0, "0"], + [7596, 0, ")"], + [7597, 0, " "], + [7598, 0, "{"], + [7599, 0, "\n"], + [7600, 0, " "], + [7601, 0, " "], + [7602, 0, " "], + [7603, 0, " "], + [7604, 0, "\\"], + [7605, 0, "n"], + [7606, 0, "o"], + [7607, 0, "d"], + [7608, 0, "e"], + [7609, 0, " "], + [7609, 1], + [7608, 1], + [7607, 1], + [7606, 1], + [7605, 1], + [7604, 1], + [7603, 1], + [7602, 1], + [7601, 1], + [7600, 1], + [7599, 1], + [7598, 1], + [7580, 1], + [7579, 1], + [7578, 1], + [7577, 1], + [7576, 1], + [7575, 1], + [7574, 1], + [7573, 1], + [7572, 1], + [7589, 0, " "], + [7589, 1], + [7589, 0, "{"], + [7590, 0, "\\"], + [7591, 0, "v"], + [7592, 0, "e"], + [7593, 0, "r"], + [7594, 0, "b"], + [7595, 0, "|"], + [7596, 0, "{"], + [7597, 0, "\""], + [7598, 0, "b"], + [7599, 0, "u"], + [7600, 0, "y"], + [7601, 0, "\""], + [7602, 0, ":"], + [7603, 0, "["], + [7604, 0, "\""], + [7605, 0, "e"], + [7606, 0, "g"], + [7607, 0, "g"], + [7608, 0, "s"], + [7609, 0, "\""], + [7610, 0, ","], + [7611, 0, "\""], + [7612, 0, "h"], + [7613, 0, "a"], + [7614, 0, "m"], + [7615, 0, "\""], + [7616, 0, ","], + [7617, 0, "\""], + [7618, 0, "m"], + [7619, 0, "i"], + [7620, 0, "l"], + [7621, 0, "k"], + [7622, 0, "\""], + [7623, 0, ","], + [7624, 0, "\""], + [7625, 0, "f"], + [7626, 0, "l"], + [7627, 0, "o"], + [7628, 0, "u"], + [7629, 0, "r"], + [7630, 0, "\""], + [7631, 0, "]"], + [7632, 0, "}"], + [7633, 0, "|"], + [7634, 0, "}"], + [7635, 0, ";"], + [7636, 0, "\n"], + [7637, 0, "\\"], + [7638, 0, "n"], + [7639, 0, "o"], + [7640, 0, "d"], + [7641, 0, "e"], + [7642, 0, " "], + [7643, 0, "("], + [7644, 0, "r"], + [7645, 0, "i"], + [7646, 0, "g"], + [7647, 0, "h"], + [7648, 0, "t"], + [7649, 0, "4"], + [7650, 0, ")"], + [7651, 0, " "], + [7652, 0, "a"], + [7653, 0, "t"], + [7654, 0, " "], + [7655, 0, "("], + [7656, 0, "8"], + [7657, 0, ","], + [7658, 0, "0"], + [7659, 0, ")"], + [7660, 0, " "], + [7661, 0, "{"], + [7662, 0, "\\"], + [7663, 0, "v"], + [7664, 0, "e"], + [7665, 0, "r"], + [7666, 0, "b"], + [7667, 0, "|"], + [7668, 0, "{"], + [7669, 0, "\""], + [7670, 0, "b"], + [7671, 0, "u"], + [7672, 0, "y"], + [7673, 0, "\""], + [7674, 0, ":"], + [7675, 0, "["], + [7676, 0, "\""], + [7677, 0, "e"], + [7678, 0, "g"], + [7679, 0, "g"], + [7680, 0, "s"], + [7681, 0, "\""], + [7682, 0, ","], + [7683, 0, "\""], + [7684, 0, "h"], + [7685, 0, "a"], + [7686, 0, "m"], + [7687, 0, "\""], + [7688, 0, ","], + [7689, 0, "\""], + [7690, 0, "m"], + [7691, 0, "i"], + [7692, 0, "l"], + [7693, 0, "k"], + [7694, 0, "\""], + [7695, 0, ","], + [7696, 0, "\""], + [7697, 0, "f"], + [7698, 0, "l"], + [7699, 0, "o"], + [7700, 0, "u"], + [7701, 0, "r"], + [7702, 0, "\""], + [7703, 0, "]"], + [7704, 0, "}"], + [7705, 0, "|"], + [7706, 0, "}"], + [7707, 0, ";"], + [7708, 0, "\n"], + [7709, 0, "\\"], + [7710, 0, "d"], + [7711, 0, "r"], + [7712, 0, "a"], + [7713, 0, "w"], + [7714, 0, " "], + [7715, 0, "["], + [7716, 0, "t"], + [7717, 0, "h"], + [7718, 0, "i"], + [7719, 0, "c"], + [7720, 0, "k"], + [7721, 0, ","], + [7722, 0, "-"], + [7723, 0, ">"], + [7724, 0, "]"], + [7725, 0, " "], + [7726, 0, "("], + [7727, 0, "s"], + [7728, 0, "t"], + [7729, 0, "a"], + [7730, 0, "r"], + [7731, 0, "t"], + [7732, 0, ")"], + [7733, 0, " "], + [7734, 0, "t"], + [7735, 0, "o"], + [7736, 0, " "], + [7737, 0, "n"], + [7738, 0, "o"], + [7739, 0, "d"], + [7740, 0, "e"], + [7741, 0, " "], + [7742, 0, "["], + [7743, 0, "l"], + [7744, 0, "e"], + [7745, 0, "f"], + [7746, 0, "t"], + [7747, 0, ","], + [7748, 0, "i"], + [7749, 0, "n"], + [7750, 0, "n"], + [7751, 0, "e"], + [7752, 0, "r"], + [7753, 0, " "], + [7754, 0, "s"], + [7755, 0, "e"], + [7756, 0, "p"], + [7757, 0, "="], + [7758, 0, "1"], + [7759, 0, "2"], + [7760, 0, "p"], + [7761, 0, "t"], + [7762, 0, "]"], + [7763, 0, " "], + [7764, 0, "{"], + [7765, 0, "\\"], + [7766, 0, "f"], + [7767, 0, "o"], + [7768, 0, "o"], + [7769, 0, "t"], + [7770, 0, "n"], + [7771, 0, "o"], + [7772, 0, "t"], + [7773, 0, "e"], + [7774, 0, "s"], + [7775, 0, "i"], + [7776, 0, "z"], + [7777, 0, "e"], + [7778, 0, " "], + [7779, 0, "d"], + [7780, 0, "o"], + [7781, 0, "c"], + [7782, 0, "["], + [7783, 0, "`"], + [7784, 0, "`"], + [7785, 0, "b"], + [7786, 0, "u"], + [7787, 0, "y"], + [7788, 0, "'"], + [7789, 0, "'"], + [7790, 0, "]"], + [7791, 0, " "], + [7792, 0, ":"], + [7793, 0, "="], + [7794, 0, " "], + [7795, 0, "["], + [7796, 0, "]"], + [7797, 0, ";"], + [7798, 0, "}"], + [7799, 0, " "], + [7800, 0, "("], + [7801, 0, "l"], + [7802, 0, "e"], + [7803, 0, "f"], + [7804, 0, "t"], + [7805, 0, "1"], + [7806, 0, ")"], + [7807, 0, ";"], + [7808, 0, "\n"], + [7809, 0, "\\"], + [7810, 0, "d"], + [7811, 0, "r"], + [7812, 0, "a"], + [7813, 0, "w"], + [7814, 0, " "], + [7815, 0, "["], + [7816, 0, "t"], + [7817, 0, "h"], + [7818, 0, "i"], + [7819, 0, "c"], + [7820, 0, "k"], + [7821, 0, ","], + [7822, 0, "-"], + [7823, 0, ">"], + [7824, 0, "]"], + [7825, 0, " "], + [7826, 0, "("], + [7827, 0, "s"], + [7828, 0, "t"], + [7829, 0, "a"], + [7830, 0, "r"], + [7831, 0, "t"], + [7832, 0, ")"], + [7833, 0, " "], + [7834, 0, "t"], + [7835, 0, "o"], + [7836, 0, " "], + [7837, 0, "n"], + [7838, 0, "o"], + [7839, 0, "d"], + [7840, 0, "e"], + [7841, 0, " "], + [7842, 0, "["], + [7843, 0, "r"], + [7844, 0, "i"], + [7845, 0, "g"], + [7846, 0, "h"], + [7847, 0, "t"], + [7848, 0, ","], + [7849, 0, " "], + [7849, 1], + [7849, 0, "i"], + [7850, 0, "n"], + [7851, 0, "n"], + [7852, 0, "e"], + [7853, 0, "r"], + [7854, 0, " "], + [7855, 0, "s"], + [7856, 0, "e"], + [7857, 0, "p"], + [7858, 0, "="], + [7859, 0, "1"], + [7860, 0, "2"], + [7861, 0, "p"], + [7862, 0, "t"], + [7863, 0, "]"], + [7864, 0, " "], + [7865, 0, "{"], + [7866, 0, "\\"], + [7867, 0, "f"], + [7868, 0, "o"], + [7869, 0, "o"], + [7870, 0, "t"], + [7871, 0, "n"], + [7872, 0, "o"], + [7873, 0, "t"], + [7874, 0, "e"], + [7875, 0, "s"], + [7876, 0, "i"], + [7877, 0, "z"], + [7878, 0, "e"], + [7879, 0, " "], + [7880, 0, "d"], + [7881, 0, "o"], + [7882, 0, "c"], + [7883, 0, "["], + [7884, 0, "`"], + [7885, 0, "`"], + [7886, 0, "b"], + [7887, 0, "u"], + [7888, 0, "y"], + [7889, 0, "'"], + [7890, 0, "'"], + [7891, 0, "]"], + [7892, 0, " "], + [7893, 0, ":"], + [7894, 0, "="], + [7895, 0, " "], + [7896, 0, "["], + [7897, 0, "]"], + [7898, 0, ";"], + [7899, 0, "}"], + [7900, 0, " "], + [7901, 0, "("], + [7902, 0, "r"], + [7903, 0, "i"], + [7904, 0, "g"], + [7905, 0, "h"], + [7906, 0, "t"], + [7907, 0, "1"], + [7908, 0, ")"], + [7909, 0, ";"], + [7855, 0, "x"], + [7754, 0, "x"], + [6174, 0, "x"], + [6051, 0, "x"], + [7762, 1], + [7762, 0, "8"], + [7864, 1], + [7864, 0, "8"], + [7914, 0, "\n"], + [7915, 0, "\\"], + [7916, 0, "d"], + [7917, 0, "r"], + [7918, 0, "a"], + [7919, 0, "w"], + [7920, 0, " "], + [7921, 0, "["], + [7922, 0, "t"], + [7923, 0, "h"], + [7924, 0, "i"], + [7925, 0, "c"], + [7926, 0, "k"], + [7927, 0, ","], + [7928, 0, "-"], + [7929, 0, ">"], + [7930, 0, " "], + [7930, 1], + [7930, 0, "]"], + [7931, 0, " "], + [7932, 0, "("], + [7933, 0, "l"], + [7934, 0, "e"], + [7935, 0, "f"], + [7936, 0, "t"], + [7937, 0, "1"], + [7938, 0, ")"], + [7939, 0, " "], + [7940, 0, "t"], + [7941, 0, "o"], + [7942, 0, " "], + [7943, 0, "n"], + [7944, 0, "o"], + [7945, 0, "d"], + [7946, 0, "e"], + [7947, 0, " "], + [7948, 0, "["], + [7949, 0, "l"], + [7950, 0, "e"], + [7951, 0, "f"], + [7952, 0, "t"], + [7953, 0, "]"], + [7954, 0, " "], + [7955, 0, "{"], + [7956, 0, "\\"], + [7957, 0, "f"], + [7958, 0, "o"], + [7959, 0, "o"], + [7960, 0, "t"], + [7961, 0, "n"], + [7962, 0, "o"], + [7963, 0, "t"], + [7964, 0, "e"], + [7965, 0, "s"], + [7966, 0, "i"], + [7967, 0, "z"], + [7968, 0, "e"], + [7969, 0, " "], + [7970, 0, "d"], + [7971, 0, "o"], + [7972, 0, "c"], + [7973, 0, "["], + [7974, 0, "`"], + [7975, 0, "`"], + [7976, 0, "b"], + [7977, 0, "u"], + [7978, 0, "y"], + [7979, 0, "'"], + [7980, 0, "'"], + [7981, 0, "]"], + [7982, 0, "."], + [7983, 0, "i"], + [7984, 0, "t"], + [7985, 0, "e"], + [7986, 0, "r"], + [7987, 0, "."], + [7988, 0, "i"], + [7989, 0, "n"], + [7990, 0, "s"], + [7991, 0, "e"], + [7992, 0, "r"], + [7993, 0, "t"], + [7994, 0, "("], + [7995, 0, "`"], + [7996, 0, "`"], + [7997, 0, "e"], + [7998, 0, "g"], + [7999, 0, "g"], + [8000, 0, "s"], + [8001, 0, "'"], + [8002, 0, "'"], + [8003, 0, ")"], + [8004, 0, ";"], + [8005, 0, "}"], + [8006, 0, " "], + [8007, 0, "("], + [8008, 0, "l"], + [8009, 0, "e"], + [8010, 0, "f"], + [8011, 0, "t"], + [8012, 0, "2"], + [8013, 0, ")"], + [8014, 0, ";"], + [8015, 0, "\n"], + [8016, 0, "\\"], + [8017, 0, "d"], + [8018, 0, "r"], + [8019, 0, "a"], + [8020, 0, "w"], + [8021, 0, " "], + [8022, 0, "["], + [8023, 0, "t"], + [8024, 0, "h"], + [8025, 0, "i"], + [8026, 0, "c"], + [8027, 0, "k"], + [8028, 0, ","], + [8029, 0, "-"], + [8030, 0, ">"], + [8031, 0, "]"], + [8032, 0, " "], + [8033, 0, "("], + [8034, 0, "r"], + [8035, 0, "i"], + [8036, 0, "g"], + [8037, 0, "h"], + [8038, 0, "t"], + [8039, 0, "1"], + [8040, 0, ")"], + [8041, 0, " "], + [8042, 0, "t"], + [8043, 0, "o"], + [8044, 0, " "], + [8045, 0, "n"], + [8046, 0, "o"], + [8047, 0, "d"], + [8048, 0, "e"], + [8049, 0, " "], + [8050, 0, "["], + [8051, 0, "r"], + [8052, 0, "i"], + [8053, 0, "g"], + [8054, 0, "h"], + [8055, 0, "t"], + [8056, 0, "]"], + [8057, 0, " "], + [8058, 0, "{"], + [8059, 0, "\\"], + [8060, 0, "f"], + [8061, 0, "o"], + [8062, 0, "o"], + [8063, 0, "t"], + [8064, 0, "n"], + [8065, 0, "o"], + [8066, 0, "t"], + [8067, 0, "e"], + [8068, 0, "s"], + [8069, 0, "i"], + [8070, 0, "z"], + [8071, 0, "e"], + [8072, 0, " "], + [8073, 0, "d"], + [8074, 0, "o"], + [8075, 0, "c"], + [8076, 0, "["], + [8077, 0, "`"], + [8078, 0, "`"], + [8079, 0, "b"], + [8080, 0, "u"], + [8081, 0, "y"], + [8082, 0, "'"], + [8083, 0, "'"], + [8084, 0, "]"], + [8085, 0, "."], + [8086, 0, "i"], + [8087, 0, "t"], + [8088, 0, "e"], + [8089, 0, "r"], + [8090, 0, "."], + [8091, 0, "i"], + [8092, 0, "n"], + [8093, 0, "s"], + [8094, 0, "e"], + [8095, 0, "r"], + [8096, 0, "t"], + [8097, 0, "("], + [8098, 0, "`"], + [8099, 0, "`"], + [8100, 0, "m"], + [8101, 0, "i"], + [8102, 0, "l"], + [8103, 0, "k"], + [8104, 0, "'"], + [8105, 0, "'"], + [8106, 0, ")"], + [8107, 0, ";"], + [8108, 0, "}"], + [8109, 0, " "], + [8110, 0, "("], + [8111, 0, "r"], + [8112, 0, "i"], + [8113, 0, "g"], + [8114, 0, "h"], + [8115, 0, "t"], + [8116, 0, "2"], + [8117, 0, ")"], + [8118, 0, ";"], + [8119, 0, "\n"], + [8120, 0, "\\"], + [8121, 0, "d"], + [8122, 0, "r"], + [8123, 0, "a"], + [8124, 0, "w"], + [8125, 0, " "], + [8126, 0, "["], + [8127, 0, "t"], + [8128, 0, "h"], + [8129, 0, "i"], + [8130, 0, "c"], + [8131, 0, "k"], + [8132, 0, ","], + [8133, 0, "-"], + [8134, 0, ">"], + [8135, 0, "]"], + [8136, 0, " "], + [8137, 0, "("], + [8138, 0, "l"], + [8139, 0, "e"], + [8140, 0, "f"], + [8141, 0, "t"], + [8142, 0, "2"], + [8143, 0, ")"], + [8144, 0, " "], + [8145, 0, "t"], + [8146, 0, "o"], + [8147, 0, " "], + [8148, 0, "n"], + [8149, 0, "o"], + [8150, 0, "d"], + [8151, 0, "e"], + [8152, 0, " "], + [8153, 0, "["], + [8154, 0, "l"], + [8155, 0, "e"], + [8156, 0, "f"], + [8157, 0, "t"], + [8158, 0, "]"], + [8159, 0, " "], + [8160, 0, "{"], + [8161, 0, "\\"], + [8162, 0, "f"], + [8163, 0, "o"], + [8164, 0, "o"], + [8165, 0, "t"], + [8166, 0, "n"], + [8167, 0, "o"], + [8168, 0, "t"], + [8169, 0, "e"], + [8170, 0, "s"], + [8171, 0, "i"], + [8172, 0, "z"], + [8173, 0, "e"], + [8174, 0, " "], + [8175, 0, "e"], + [8176, 0, "g"], + [8177, 0, "g"], + [8178, 0, "s"], + [8179, 0, "."], + [8180, 0, "i"], + [8181, 0, "n"], + [8182, 0, "s"], + [8183, 0, "e"], + [8184, 0, "r"], + [8185, 0, "t"], + [8186, 0, "("], + [8187, 0, "`"], + [8188, 0, "`"], + [8189, 0, "h"], + [8190, 0, "a"], + [8191, 0, "m"], + [8192, 0, "'"], + [8193, 0, "'"], + [8194, 0, ")"], + [8195, 0, ";"], + [8196, 0, "}"], + [8197, 0, " "], + [8198, 0, "("], + [8199, 0, "l"], + [8200, 0, "e"], + [8201, 0, "f"], + [8202, 0, "t"], + [8203, 0, "3"], + [8204, 0, ")"], + [8205, 0, ";"], + [8206, 0, "\n"], + [8207, 0, "\\"], + [8208, 0, "d"], + [8209, 0, "r"], + [8210, 0, "a"], + [8211, 0, "w"], + [8212, 0, " "], + [8213, 0, "["], + [8214, 0, "t"], + [8215, 0, "h"], + [8216, 0, "i"], + [8217, 0, "c"], + [8218, 0, "k"], + [8219, 0, ","], + [8220, 0, "-"], + [8221, 0, ">"], + [8222, 0, "]"], + [8223, 0, " "], + [8224, 0, "("], + [8225, 0, "r"], + [8226, 0, "i"], + [8227, 0, "g"], + [8228, 0, "h"], + [8229, 0, "t"], + [8230, 0, "2"], + [8231, 0, ")"], + [8232, 0, " "], + [8233, 0, "t"], + [8234, 0, "o"], + [8235, 0, " "], + [8236, 0, "n"], + [8237, 0, "o"], + [8238, 0, "d"], + [8239, 0, "e"], + [8240, 0, " "], + [8241, 0, "["], + [8242, 0, "r"], + [8243, 0, "i"], + [8244, 0, "g"], + [8245, 0, "h"], + [8246, 0, "t"], + [8247, 0, "]"], + [8248, 0, " "], + [8249, 0, "{"], + [8250, 0, "\\"], + [8251, 0, "f"], + [8252, 0, "o"], + [8253, 0, "o"], + [8254, 0, "t"], + [8255, 0, "n"], + [8256, 0, "o"], + [8257, 0, "t"], + [8258, 0, "e"], + [8259, 0, "s"], + [8260, 0, "i"], + [8261, 0, "z"], + [8262, 0, "e"], + [8263, 0, " "], + [8264, 0, "m"], + [8265, 0, "i"], + [8266, 0, "l"], + [8267, 0, "k"], + [8268, 0, "."], + [8269, 0, "i"], + [8270, 0, "n"], + [8271, 0, "s"], + [8272, 0, "e"], + [8273, 0, "r"], + [8274, 0, "t"], + [8275, 0, "("], + [8276, 0, "`"], + [8277, 0, "`"], + [8278, 0, "f"], + [8279, 0, "l"], + [8280, 0, "o"], + [8281, 0, "u"], + [8282, 0, "r"], + [8283, 0, "'"], + [8284, 0, "'"], + [8285, 0, ")"], + [8286, 0, ";"], + [8287, 0, "}"], + [8288, 0, " "], + [8289, 0, "("], + [8290, 0, "r"], + [8291, 0, "i"], + [8292, 0, "g"], + [8293, 0, "h"], + [8294, 0, "t"], + [8295, 0, "3"], + [8296, 0, ")"], + [8297, 0, ";"], + [8298, 0, "\n"], + [8299, 0, "\\"], + [8300, 0, "d"], + [8301, 0, "r"], + [8302, 0, "a"], + [8303, 0, "w"], + [8304, 0, " "], + [8305, 0, "["], + [8306, 0, "t"], + [8307, 0, "h"], + [8308, 0, "i"], + [8309, 0, "c"], + [8310, 0, "k"], + [8311, 0, ","], + [8312, 0, "-"], + [8313, 0, ">"], + [8314, 0, "]"], + [8315, 0, " "], + [8316, 0, "("], + [8317, 0, "l"], + [8318, 0, "e"], + [8319, 0, "f"], + [8320, 0, "t"], + [8321, 0, "3"], + [8322, 0, ")"], + [8323, 0, " "], + [8324, 0, "t"], + [8325, 0, "o"], + [8326, 0, " "], + [8327, 0, "n"], + [8328, 0, "o"], + [8329, 0, "d"], + [8330, 0, "e"], + [8331, 0, " "], + [8332, 0, "["], + [8333, 0, "l"], + [8334, 0, "e"], + [8335, 0, "f"], + [8336, 0, "t"], + [8337, 0, "]"], + [8338, 0, " "], + [8339, 0, "{"], + [8340, 0, "\\"], + [8341, 0, "f"], + [8342, 0, "o"], + [8343, 0, "o"], + [8344, 0, "t"], + [8345, 0, "n"], + [8346, 0, "o"], + [8347, 0, "t"], + [8348, 0, "e"], + [8349, 0, "s"], + [8350, 0, "i"], + [8351, 0, "z"], + [8352, 0, "e"], + [8353, 0, " "], + [8354, 0, "y"], + [8355, 0, "i"], + [8356, 0, "e"], + [8357, 0, "l"], + [8358, 0, "d"], + [8359, 0, ";"], + [8360, 0, "]"], + [8360, 1], + [8360, 0, "}"], + [8361, 0, " "], + [8362, 0, "("], + [8363, 0, "l"], + [8364, 0, "e"], + [8365, 0, "f"], + [8366, 0, "t"], + [8367, 0, "5"], + [8367, 1], + [8367, 0, "4"], + [8368, 0, ")"], + [8369, 0, ";"], + [8370, 0, "\n"], + [8371, 0, "\\"], + [8372, 0, "d"], + [8373, 0, "r"], + [8374, 0, "a"], + [8375, 0, "w"], + [8376, 0, " "], + [8377, 0, "["], + [8378, 0, "t"], + [8379, 0, "h"], + [8380, 0, "i"], + [8381, 0, "c"], + [8382, 0, "k"], + [8383, 0, ","], + [8384, 0, "-"], + [8385, 0, ">"], + [8386, 0, "]"], + [8387, 0, " "], + [8388, 0, "("], + [8389, 0, "r"], + [8390, 0, "i"], + [8391, 0, "g"], + [8392, 0, "h"], + [8393, 0, "t"], + [8394, 0, "3"], + [8395, 0, ")"], + [8396, 0, " "], + [8397, 0, "t"], + [8398, 0, "o"], + [8399, 0, " "], + [8400, 0, "n"], + [8401, 0, "o"], + [8402, 0, "d"], + [8403, 0, "e"], + [8404, 0, " "], + [8405, 0, "["], + [8406, 0, "r"], + [8407, 0, "i"], + [8408, 0, "g"], + [8409, 0, "h"], + [8410, 0, "t"], + [8411, 0, "]"], + [8412, 0, " "], + [8413, 0, "{"], + [8414, 0, "\\"], + [8415, 0, "f"], + [8416, 0, "o"], + [8417, 0, "o"], + [8418, 0, "t"], + [8419, 0, "n"], + [8420, 0, "o"], + [8421, 0, "t"], + [8422, 0, "e"], + [8423, 0, "s"], + [8424, 0, "i"], + [8425, 0, "z"], + [8426, 0, "e"], + [8427, 0, " "], + [8428, 0, "y"], + [8429, 0, "i"], + [8430, 0, "e"], + [8431, 0, "l"], + [8432, 0, "d"], + [8433, 0, ";"], + [8434, 0, "}"], + [8435, 0, " "], + [8436, 0, "("], + [8437, 0, "r"], + [8438, 0, "i"], + [8439, 0, "g"], + [8440, 0, "h"], + [8441, 0, "t"], + [8442, 0, "4"], + [8443, 0, ")"], + [8444, 0, ";"], + [8445, 0, "\n"], + [8446, 0, "\\"], + [8447, 0, "d"], + [8448, 0, "r"], + [8449, 0, "a"], + [8450, 0, "w"], + [8451, 0, " "], + [8452, 0, "["], + [8453, 0, "t"], + [8454, 0, "h"], + [8455, 0, "i"], + [8456, 0, "c"], + [8457, 0, "k"], + [8458, 0, ","], + [8459, 0, "-"], + [8460, 0, ">"], + [8461, 0, "]"], + [8462, 0, " "], + [8463, 0, "("], + [8464, 0, "l"], + [8465, 0, "e"], + [8466, 0, "f"], + [8467, 0, "t"], + [8468, 0, "3"], + [8469, 0, ")"], + [8470, 0, " "], + [8471, 0, "t"], + [8472, 0, "o"], + [8473, 0, " "], + [8474, 0, "("], + [8475, 0, "r"], + [8476, 0, "i"], + [8477, 0, "g"], + [8478, 0, "h"], + [8479, 0, "t"], + [8480, 0, "5"], + [8480, 1], + [8480, 0, "4"], + [8481, 0, ")"], + [8482, 0, ";"], + [8483, 0, "\n"], + [8484, 0, "\\"], + [8485, 0, "d"], + [8486, 0, "r"], + [8487, 0, "a"], + [8488, 0, "w"], + [8489, 0, " "], + [8490, 0, "["], + [8491, 0, "t"], + [8492, 0, "h"], + [8493, 0, "i"], + [8494, 0, "c"], + [8495, 0, "k"], + [8496, 0, ","], + [8497, 0, "-"], + [8498, 0, ">"], + [8499, 0, " "], + [8499, 1], + [8499, 0, "]"], + [8500, 0, " "], + [8501, 0, "("], + [8502, 0, "r"], + [8503, 0, "i"], + [8504, 0, "g"], + [8505, 0, "h"], + [8506, 0, "t"], + [8507, 0, "3"], + [8508, 0, " "], + [8508, 1], + [8508, 0, ")"], + [8509, 0, " "], + [8510, 0, "t"], + [8511, 0, "o"], + [8512, 0, " "], + [8513, 0, "("], + [8514, 0, "l"], + [8515, 0, "e"], + [8516, 0, "f"], + [8517, 0, "t"], + [8518, 0, "3"], + [8519, 0, "4"], + [8519, 1], + [8518, 1], + [8518, 0, "4"], + [8519, 0, ")"], + [8520, 0, ";"], + [7582, 0, " "], + [7737, 0, " "], + [7839, 0, " "], + [7943, 0, " "], + [8149, 0, " "], + [8329, 0, " "], + [8477, 0, " "], + [8345, 0, " "], + [8165, 0, " "], + [7959, 0, " "], + [7752, 0, " "], + [7531, 0, "."], + [7532, 0, "5"], + [7592, 0, "."], + [7593, 0, "0"], + [7666, 0, "."], + [7667, 0, "0"], + [7479, 1], + [7479, 0, "3"], + [7480, 0, "."], + [7481, 0, "0"], + [7423, 0, "."], + [7424, 0, "5"], + [7371, 1], + [7371, 0, "3"], + [7372, 0, "."], + [7373, 0, "0"], + [7326, 1], + [7326, 0, "4"], + [7327, 0, "."], + [7328, 0, "5"], + [7281, 1], + [7281, 0, "4"], + [7282, 0, "."], + [7283, 0, "5"], + [7244, 1], + [7244, 0, "6"], + [7245, 0, "."], + [7246, 0, "0"], + [6520, 0, " "], + [6373, 0, " "], + [6154, 0, " "], + [6031, 0, " "], + [6046, 0, " "], + [6392, 0, " "], + [8689, 0, "\n"], + [8690, 0, "\n"], + [8691, 0, "\\"], + [8692, 0, "b"], + [8693, 0, "e"], + [8694, 0, "g"], + [8695, 0, "i"], + [8696, 0, "n"], + [8697, 0, "{"], + [8698, 0, "f"], + [8699, 0, "i"], + [8700, 0, "g"], + [8701, 0, "u"], + [8702, 0, "r"], + [8703, 0, "e"], + [8704, 0, "*"], + [8705, 0, "}"], + [8706, 0, "\n"], + [8707, 0, "\\"], + [8708, 0, "e"], + [8709, 0, "n"], + [8710, 0, "d"], + [8711, 0, "{"], + [8712, 0, "f"], + [8713, 0, "i"], + [8714, 0, "g"], + [8715, 0, "u"], + [8716, 0, "r"], + [8717, 0, "e"], + [8718, 0, "*"], + [8719, 0, "]"], + [8719, 1], + [8719, 0, "}"], + [8706, 0, "\n"], + [8707, 0, "\\"], + [8708, 0, "c"], + [8709, 0, "e"], + [8710, 0, "n"], + [8711, 0, "t"], + [8712, 0, "e"], + [8713, 0, "r"], + [8714, 0, "i"], + [8715, 0, "n"], + [8716, 0, "g"], + [8717, 0, "\n"], + [8718, 0, "\\"], + [8719, 0, "b"], + [8720, 0, "e"], + [8721, 0, "g"], + [8722, 0, "i"], + [8723, 0, "n"], + [8724, 0, "{"], + [8725, 0, "t"], + [8726, 0, "i"], + [8727, 0, "k"], + [8728, 0, "z"], + [8729, 0, "p"], + [8730, 0, "i"], + [8731, 0, "c"], + [8732, 0, "t"], + [8733, 0, "u"], + [8734, 0, "r"], + [8735, 0, "e"], + [8736, 0, "}"], + [8737, 0, "["], + [8738, 0, "a"], + [8739, 0, "u"], + [8740, 0, "t"], + [8741, 0, "o"], + [8742, 0, "]"], + [8743, 0, "\n"], + [8744, 0, "\\"], + [8745, 0, "e"], + [8746, 0, "n"], + [8747, 0, "d"], + [8748, 0, "{"], + [8749, 0, "t"], + [8750, 0, "i"], + [8751, 0, "k"], + [8752, 0, "z"], + [8753, 0, "p"], + [8754, 0, "i"], + [8755, 0, "c"], + [8756, 0, "t"], + [8757, 0, "u"], + [8758, 0, "r"], + [8759, 0, "e"], + [8760, 0, "}"], + [8761, 0, "\n"], + [8762, 0, "\\"], + [8763, 0, "c"], + [8764, 0, "a"], + [8765, 0, "p"], + [8766, 0, "t"], + [8767, 0, "u"], + [8767, 1], + [8767, 0, "i"], + [8768, 0, "o"], + [8769, 0, "n"], + [8770, 0, "{"], + [8771, 0, "O"], + [8772, 0, "n"], + [8773, 0, "e"], + [8774, 0, " "], + [8775, 0, "r"], + [8776, 0, "e"], + [8777, 0, "p"], + [8778, 0, "l"], + [8779, 0, "i"], + [8780, 0, "c"], + [8781, 0, "a"], + [8782, 0, " "], + [8783, 0, "r"], + [8784, 0, "e"], + [8785, 0, "m"], + [8786, 0, "o"], + [8787, 0, "v"], + [8788, 0, "e"], + [8789, 0, "s"], + [8790, 0, " "], + [8791, 0, "a"], + [8792, 0, " "], + [8793, 0, "l"], + [8794, 0, "i"], + [8795, 0, "s"], + [8796, 0, "t"], + [8797, 0, " "], + [8798, 0, "e"], + [8799, 0, "l"], + [8800, 0, "e"], + [8801, 0, "m"], + [8802, 0, "e"], + [8803, 0, "n"], + [8804, 0, "t"], + [8805, 0, ","], + [8806, 0, " "], + [8807, 0, "w"], + [8808, 0, "h"], + [8809, 0, "i"], + [8810, 0, "l"], + [8811, 0, "e"], + [8812, 0, " "], + [8813, 0, "a"], + [8814, 0, "n"], + [8815, 0, "o"], + [8816, 0, "t"], + [8817, 0, "h"], + [8818, 0, "e"], + [8819, 0, "r"], + [8820, 0, " "], + [8821, 0, "c"], + [8822, 0, "o"], + [8823, 0, "n"], + [8824, 0, "c"], + [8825, 0, "u"], + [8826, 0, "r"], + [8827, 0, "r"], + [8828, 0, "e"], + [8829, 0, "n"], + [8830, 0, "t"], + [8831, 0, "l"], + [8832, 0, "y"], + [8833, 0, " "], + [8834, 0, "u"], + [8835, 0, "p"], + [8836, 0, "d"], + [8837, 0, "a"], + [8838, 0, "t"], + [8839, 0, "e"], + [8840, 0, "s"], + [8841, 0, " "], + [8842, 0, "i"], + [8843, 0, "t"], + [8844, 0, "s"], + [8845, 0, " "], + [8846, 0, "c"], + [8847, 0, "o"], + [8848, 0, "n"], + [8849, 0, "t"], + [8850, 0, "e"], + [8851, 0, "n"], + [8852, 0, "t"], + [8853, 0, "s"], + [8854, 0, "}"], + [8855, 0, "\\"], + [8856, 0, "l"], + [8857, 0, "a"], + [8858, 0, "b"], + [8859, 0, "e"], + [8860, 0, "l"], + [8861, 0, "{"], + [8862, 0, "f"], + [8863, 0, "i"], + [8864, 0, "g"], + [8865, 0, ":"], + [8866, 0, "t"], + [8867, 0, "o"], + [8868, 0, "d"], + [8869, 0, "o"], + [8870, 0, "-"], + [8871, 0, "i"], + [8872, 0, "t"], + [8873, 0, "e"], + [8874, 0, "m"], + [8875, 0, "}"], + [8743, 0, "\n"], + [8744, 0, "\\"], + [8745, 0, "n"], + [8746, 0, "o"], + [8747, 0, "d"], + [8748, 0, "e"], + [8749, 0, " "], + [8750, 0, "("], + [8751, 0, "s"], + [8752, 0, "t"], + [8753, 0, "a"], + [8754, 0, "r"], + [8755, 0, "t"], + [8756, 0, ")"], + [8757, 0, " "], + [8758, 0, " "], + [8759, 0, "a"], + [8760, 0, "t"], + [8761, 0, " "], + [8762, 0, "("], + [8763, 0, "4"], + [8764, 0, ","], + [8765, 0, "5"], + [8766, 0, ")"], + [8767, 0, " "], + [8768, 0, "{"], + [8769, 0, "\\"], + [8770, 0, "v"], + [8771, 0, "e"], + [8772, 0, "r"], + [8773, 0, "b"], + [8774, 0, "|"], + [8775, 0, "|"], + [8776, 0, "}"], + [8777, 0, ";"], + [8775, 0, "{"], + [8776, 0, "\""], + [8777, 0, "t"], + [8778, 0, "o"], + [8779, 0, "d"], + [8780, 0, "o"], + [8781, 0, "\""], + [8782, 0, ":"], + [8783, 0, "["], + [8784, 0, "{"], + [8785, 0, "\""], + [8786, 0, "t"], + [8787, 0, "e"], + [8788, 0, "x"], + [8789, 0, "t"], + [8789, 1], + [8788, 1], + [8787, 1], + [8787, 0, "i"], + [8788, 0, "t"], + [8789, 0, "l"], + [8790, 0, "e"], + [8791, 0, "\""], + [8792, 0, ":"], + [8793, 0, "\""], + [8794, 0, "b"], + [8795, 0, "u"], + [8796, 0, "y"], + [8797, 0, " "], + [8798, 0, "m"], + [8799, 0, "i"], + [8800, 0, "l"], + [8801, 0, "k"], + [8802, 0, "\""], + [8803, 0, ","], + [8804, 0, " "], + [8805, 0, "\""], + [8806, 0, "d"], + [8807, 0, "o"], + [8808, 0, "n"], + [8809, 0, "e"], + [8810, 0, ":"], + [8810, 1], + [8810, 0, "\""], + [8811, 0, ":"], + [8812, 0, " "], + [8813, 0, "f"], + [8814, 0, "a"], + [8815, 0, "l"], + [8816, 0, "s"], + [8817, 0, "e"], + [8818, 0, "}"], + [8819, 0, "]"], + [8820, 0, "}"], + [8793, 0, " "], + [8783, 0, " "], + [8765, 1], + [8765, 0, "4"], + [8826, 0, "\n"], + [8827, 0, "\\"], + [8828, 0, "n"], + [8829, 0, "o"], + [8830, 0, "d"], + [8831, 0, "e"], + [8832, 0, " "], + [8833, 0, "("], + [8834, 0, "l"], + [8835, 0, "e"], + [8836, 0, "f"], + [8837, 0, "t"], + [8838, 0, "1"], + [8839, 0, ")"], + [8840, 0, " "], + [8841, 0, " "], + [8842, 0, "a"], + [8843, 0, "t"], + [8844, 0, " "], + [8845, 0, "("], + [8846, 0, "0"], + [8847, 0, ","], + [8848, 0, "2"], + [8849, 0, ")"], + [8850, 0, " "], + [8851, 0, "{"], + [8852, 0, "\\"], + [8853, 0, "v"], + [8854, 0, "e"], + [8855, 0, "r"], + [8856, 0, "b"], + [8857, 0, "|"], + [8858, 0, "{"], + [8859, 0, "\""], + [8860, 0, "t"], + [8861, 0, "o"], + [8862, 0, "d"], + [8863, 0, "o"], + [8864, 0, "\""], + [8865, 0, ":"], + [8866, 0, " "], + [8867, 0, "["], + [8868, 0, "]"], + [8869, 0, "}"], + [8870, 0, "|"], + [8871, 0, "}"], + [8872, 0, ";"], + [8873, 0, "\n"], + [8874, 0, "\\"], + [8875, 0, "n"], + [8876, 0, "o"], + [8877, 0, "d"], + [8878, 0, "e"], + [8879, 0, " "], + [8880, 0, "("], + [8881, 0, "r"], + [8882, 0, "i"], + [8883, 0, "g"], + [8884, 0, "h"], + [8885, 0, "t"], + [8886, 0, "1"], + [8887, 0, ")"], + [8888, 0, " "], + [8889, 0, "a"], + [8890, 0, "t"], + [8891, 0, " "], + [8892, 0, "("], + [8893, 0, "8"], + [8894, 0, ","], + [8895, 0, "2"], + [8896, 0, ")"], + [8897, 0, " "], + [8898, 0, "{"], + [8899, 0, "\\"], + [8900, 0, "v"], + [8901, 0, "e"], + [8902, 0, "r"], + [8903, 0, "b"], + [8904, 0, "|"], + [8905, 0, "{"], + [8906, 0, "\""], + [8907, 0, "t"], + [8908, 0, "o"], + [8909, 0, "d"], + [8910, 0, "o"], + [8911, 0, "\""], + [8912, 0, ":"], + [8913, 0, " "], + [8914, 0, "["], + [8915, 0, "{"], + [8916, 0, "\""], + [8917, 0, "t"], + [8918, 0, "i"], + [8919, 0, "t"], + [8920, 0, "l"], + [8921, 0, "e"], + [8922, 0, "\""], + [8923, 0, ":"], + [8924, 0, " "], + [8925, 0, "\""], + [8926, 0, "b"], + [8927, 0, "u"], + [8928, 0, "y"], + [8929, 0, " "], + [8930, 0, "m"], + [8931, 0, "i"], + [8932, 0, "l"], + [8933, 0, "k"], + [8934, 0, "\""], + [8935, 0, ","], + [8936, 0, " "], + [8937, 0, "\""], + [8938, 0, "d"], + [8939, 0, "o"], + [8940, 0, "n"], + [8941, 0, "e"], + [8942, 0, "\""], + [8943, 0, ":"], + [8944, 0, " "], + [8945, 0, "t"], + [8946, 0, "r"], + [8947, 0, "u"], + [8948, 0, "e"], + [8949, 0, "}"], + [8950, 0, "]"], + [8951, 0, "}"], + [8952, 0, "|"], + [8953, 0, "}"], + [8954, 0, ";"], + [8955, 0, "\n"], + [8956, 0, "\\"], + [8957, 0, "n"], + [8958, 0, "o"], + [8959, 0, "d"], + [8960, 0, "e"], + [8961, 0, " "], + [8962, 0, "("], + [8963, 0, "l"], + [8964, 0, "e"], + [8965, 0, "f"], + [8966, 0, "t"], + [8967, 0, "2"], + [8968, 0, ")"], + [8969, 0, " "], + [8970, 0, " "], + [8971, 0, "a"], + [8972, 0, "t"], + [8973, 0, " "], + [8974, 0, "("], + [8975, 0, "0"], + [8976, 0, ","], + [8977, 0, "0"], + [8978, 0, ")"], + [8979, 0, " "], + [8980, 0, "{"], + [8981, 0, "\\"], + [8982, 0, "v"], + [8983, 0, "e"], + [8984, 0, "r"], + [8985, 0, "b"], + [8986, 0, "|"], + [8987, 0, "["], + [8988, 0, "\""], + [8988, 1], + [8987, 1], + [8987, 0, "{"], + [8988, 0, "\""], + [8989, 0, "t"], + [8990, 0, "o"], + [8991, 0, "d"], + [8992, 0, "o"], + [8993, 0, "\""], + [8994, 0, ":"], + [8995, 0, " "], + [8996, 0, "["], + [8997, 0, "{"], + [8998, 0, "\""], + [8999, 0, "d"], + [9000, 0, "o"], + [9001, 0, "n"], + [9002, 0, "e"], + [9003, 0, "\""], + [9004, 0, ":"], + [9005, 0, " "], + [9006, 0, "t"], + [9007, 0, "r"], + [9008, 0, "u"], + [9009, 0, "e"], + [9010, 0, "}"], + [9011, 0, "]"], + [9012, 0, "}"], + [9013, 0, "|"], + [9014, 0, "}"], + [9015, 0, ";"], + [9016, 0, "\n"], + [9017, 0, "\\"], + [9018, 0, "n"], + [9019, 0, "o"], + [9020, 0, "d"], + [9021, 0, "e"], + [9022, 0, " "], + [9023, 0, "("], + [9024, 0, "r"], + [9025, 0, "i"], + [9026, 0, "g"], + [9027, 0, "h"], + [9028, 0, "t"], + [9029, 0, "2"], + [9030, 0, ")"], + [9031, 0, " "], + [9032, 0, "a"], + [9033, 0, "t"], + [9034, 0, " "], + [9035, 0, "("], + [9036, 0, "8"], + [9037, 0, ","], + [9038, 0, "0"], + [9039, 0, ")"], + [9040, 0, " "], + [9041, 0, "{"], + [9042, 0, "\\"], + [9043, 0, "v"], + [9044, 0, "e"], + [9045, 0, "r"], + [9046, 0, "b"], + [9047, 0, "|"], + [9048, 0, "{"], + [9049, 0, "\""], + [9050, 0, "t"], + [9051, 0, "o"], + [9052, 0, "d"], + [9053, 0, "o"], + [9054, 0, "\""], + [9055, 0, ":"], + [9056, 0, " "], + [9057, 0, "["], + [9058, 0, "\""], + [9058, 1], + [9058, 0, "{"], + [9059, 0, "\""], + [9060, 0, "d"], + [9061, 0, "o"], + [9062, 0, "n"], + [9063, 0, "e"], + [9064, 0, "\""], + [9065, 0, ":"], + [9066, 0, " "], + [9067, 0, "t"], + [9068, 0, "r"], + [9069, 0, "u"], + [9070, 0, "e"], + [9071, 0, "}"], + [9072, 0, "]"], + [9073, 0, "}"], + [9074, 0, "|"], + [9075, 0, "}"], + [9076, 0, ";"], + [8895, 1], + [8895, 0, "1"], + [8896, 0, "."], + [8897, 0, "5"], + [8848, 1], + [8848, 0, "1"], + [8849, 0, "."], + [8850, 0, "5"], + [8765, 1], + [8765, 0, "3"], + [8766, 0, "."], + [8767, 0, "0"], + [8984, 0, "."], + [8985, 0, "0"], + [9047, 0, "."], + [9048, 0, "0"], + [9087, 0, "\n"], + [9088, 0, "\\"], + [9089, 0, "d"], + [9090, 0, "r"], + [9091, 0, "a"], + [9092, 0, "w"], + [9093, 0, " "], + [9094, 0, "["], + [9095, 0, "t"], + [9096, 0, "h"], + [9097, 0, "i"], + [9098, 0, "c"], + [9099, 0, "k"], + [9100, 0, ","], + [9101, 0, "-"], + [9102, 0, ">"], + [9103, 0, "]"], + [9104, 0, " "], + [9105, 0, "("], + [9106, 0, "s"], + [9107, 0, "t"], + [9108, 0, "a"], + [9109, 0, "r"], + [9110, 0, "t"], + [9111, 0, ")"], + [9112, 0, " "], + [9113, 0, " "], + [9114, 0, "t"], + [9115, 0, "o"], + [9116, 0, " "], + [9117, 0, "n"], + [9118, 0, "o"], + [9119, 0, "d"], + [9120, 0, "e"], + [9121, 0, " "], + [9122, 0, "["], + [9123, 0, "l"], + [9124, 0, "e"], + [9125, 0, "f"], + [9126, 0, "t"], + [9127, 0, ","], + [9128, 0, " "], + [9129, 0, "i"], + [9130, 0, "n"], + [9131, 0, "n"], + [9132, 0, "e"], + [9133, 0, "r"], + [9134, 0, " "], + [9135, 0, "x"], + [9136, 0, "s"], + [9137, 0, "e"], + [9138, 0, "p"], + [9139, 0, "="], + [9140, 0, "1"], + [9141, 0, "2"], + [9142, 0, "p"], + [9143, 0, "t"], + [9144, 0, "]"], + [9145, 0, " "], + [9146, 0, "{"], + [9147, 0, "\\"], + [9148, 0, "f"], + [9149, 0, "o"], + [9150, 0, "o"], + [9151, 0, "t"], + [9152, 0, "n"], + [9153, 0, "o"], + [9154, 0, "t"], + [9155, 0, "e"], + [9156, 0, "s"], + [9157, 0, "i"], + [9158, 0, "z"], + [9159, 0, "e"], + [9160, 0, " "], + [9161, 0, "d"], + [9162, 0, "o"], + [9163, 0, "c"], + [9164, 0, "["], + [9165, 0, "`"], + [9166, 0, "`"], + [9167, 0, "t"], + [9168, 0, "o"], + [9169, 0, "d"], + [9170, 0, "o"], + [9171, 0, "'"], + [9172, 0, "'"], + [9173, 0, "]"], + [9174, 0, "."], + [9175, 0, "i"], + [9176, 0, "t"], + [9177, 0, "e"], + [9178, 0, "r"], + [9179, 0, "."], + [9180, 0, "n"], + [9181, 0, "e"], + [9182, 0, "x"], + [9183, 0, "t"], + [9184, 0, "."], + [9185, 0, "d"], + [9186, 0, "e"], + [9187, 0, "l"], + [9188, 0, "e"], + [9189, 0, "t"], + [9190, 0, "e"], + [9191, 0, ";"], + [9192, 0, "}"], + [9193, 0, " "], + [9194, 0, "("], + [9195, 0, "l"], + [9196, 0, "e"], + [9197, 0, "f"], + [9198, 0, "t"], + [9199, 0, "1"], + [9200, 0, ")"], + [9201, 0, ";"], + [9202, 0, "\n"], + [9203, 0, "\\"], + [9204, 0, "d"], + [9205, 0, "r"], + [9206, 0, "a"], + [9207, 0, "w"], + [9208, 0, " "], + [9209, 0, "["], + [9210, 0, "t"], + [9211, 0, "h"], + [9212, 0, "i"], + [9213, 0, "c"], + [9214, 0, "k"], + [9215, 0, ","], + [9216, 0, "-"], + [9217, 0, ">"], + [9218, 0, "]"], + [9219, 0, " "], + [9220, 0, "("], + [9221, 0, "s"], + [9222, 0, "t"], + [9223, 0, "a"], + [9224, 0, "r"], + [9225, 0, "t"], + [9226, 0, ")"], + [9227, 0, " "], + [9228, 0, " "], + [9229, 0, "t"], + [9230, 0, "o"], + [9231, 0, " "], + [9232, 0, "n"], + [9233, 0, "o"], + [9234, 0, "d"], + [9235, 0, "e"], + [9236, 0, " "], + [9237, 0, "["], + [9238, 0, "r"], + [9239, 0, "i"], + [9240, 0, "g"], + [9241, 0, "h"], + [9242, 0, "t"], + [9243, 0, ","], + [9244, 0, "i"], + [9245, 0, "n"], + [9246, 0, "n"], + [9247, 0, "e"], + [9248, 0, "r"], + [9249, 0, " "], + [9250, 0, "x"], + [9251, 0, "s"], + [9252, 0, "e"], + [9253, 0, "p"], + [9254, 0, "="], + [9255, 0, "1"], + [9256, 0, "2"], + [9257, 0, "p"], + [9258, 0, "t"], + [9259, 0, "]"], + [9260, 0, " "], + [9261, 0, "{"], + [9262, 0, "\\"], + [9263, 0, "f"], + [9264, 0, "o"], + [9265, 0, "o"], + [9266, 0, "t"], + [9267, 0, "n"], + [9268, 0, "o"], + [9269, 0, "t"], + [9270, 0, "e"], + [9271, 0, "s"], + [9272, 0, "i"], + [9273, 0, "z"], + [9274, 0, "e"], + [9275, 0, " "], + [9276, 0, "d"], + [9277, 0, "o"], + [9278, 0, "c"], + [9279, 0, "["], + [9280, 0, "`"], + [9281, 0, "`"], + [9282, 0, "t"], + [9283, 0, "o"], + [9284, 0, "d"], + [9285, 0, "o"], + [9286, 0, "'"], + [9287, 0, "'"], + [9288, 0, "]"], + [9289, 0, "]"], + [9289, 1], + [9289, 0, "."], + [9290, 0, "i"], + [9291, 0, "t"], + [9292, 0, "e"], + [9293, 0, "r"], + [9294, 0, "."], + [9295, 0, "n"], + [9296, 0, "e"], + [9297, 0, "x"], + [9298, 0, "t"], + [9299, 0, "["], + [9300, 0, "`"], + [9301, 0, "`"], + [9302, 0, "d"], + [9303, 0, "o"], + [9304, 0, "n"], + [9305, 0, "e"], + [9306, 0, "'"], + [9307, 0, "'"], + [9308, 0, "]"], + [9309, 0, " "], + [9310, 0, ":"], + [9311, 0, "="], + [9312, 0, " "], + [9313, 0, "t"], + [9314, 0, "r"], + [9315, 0, "u"], + [9316, 0, "e"], + [9317, 0, ";"], + [9318, 0, "}"], + [9319, 0, " "], + [9320, 0, "("], + [9321, 0, "r"], + [9322, 0, "i"], + [9323, 0, "g"], + [9324, 0, "h"], + [9325, 0, "t"], + [9326, 0, "2"], + [9326, 1], + [9326, 0, "1"], + [9327, 0, ")"], + [9328, 0, ";"], + [9329, 0, "\n"], + [9330, 0, "\\"], + [9331, 0, "d"], + [9332, 0, "r"], + [9333, 0, "a"], + [9334, 0, "w"], + [9335, 0, " "], + [9336, 0, "["], + [9337, 0, "t"], + [9338, 0, "h"], + [9339, 0, "i"], + [9340, 0, "c"], + [9341, 0, "k"], + [9342, 0, ","], + [9343, 0, "-"], + [9344, 0, ">"], + [9345, 0, "]"], + [9346, 0, " "], + [9347, 0, "("], + [9348, 0, "l"], + [9349, 0, "e"], + [9350, 0, "f"], + [9351, 0, "t"], + [9352, 0, "1"], + [9353, 0, ")"], + [9354, 0, " "], + [9355, 0, " "], + [9356, 0, "t"], + [9357, 0, "o"], + [9358, 0, " "], + [9359, 0, "n"], + [9360, 0, "o"], + [9361, 0, "d"], + [9362, 0, "e"], + [9363, 0, " "], + [9364, 0, "["], + [9365, 0, "l"], + [9366, 0, "e"], + [9367, 0, "f"], + [9368, 0, "t"], + [9369, 0, "]"], + [9370, 0, " "], + [9371, 0, " "], + [9372, 0, "{"], + [9373, 0, "\\"], + [9374, 0, "f"], + [9375, 0, "o"], + [9376, 0, "o"], + [9377, 0, "t"], + [9378, 0, "n"], + [9379, 0, "o"], + [9380, 0, "t"], + [9381, 0, "e"], + [9382, 0, "s"], + [9383, 0, "i"], + [9384, 0, "z"], + [9385, 0, "e"], + [9386, 0, " "], + [9387, 0, "y"], + [9388, 0, "i"], + [9389, 0, "e"], + [9390, 0, "l"], + [9391, 0, "d"], + [9392, 0, ";"], + [9393, 0, "}"], + [9394, 0, " "], + [9395, 0, "["], + [9395, 1], + [9395, 0, "("], + [9396, 0, "l"], + [9397, 0, "e"], + [9398, 0, "f"], + [9399, 0, "t"], + [9400, 0, "2"], + [9401, 0, ")"], + [9402, 0, ";"], + [9403, 0, "\n"], + [9404, 0, "\\"], + [9405, 0, "d"], + [9406, 0, "r"], + [9407, 0, "a"], + [9408, 0, "w"], + [9409, 0, " "], + [9410, 0, "["], + [9411, 0, "t"], + [9412, 0, "h"], + [9413, 0, "i"], + [9414, 0, "c"], + [9415, 0, "k"], + [9416, 0, ","], + [9417, 0, "-"], + [9418, 0, ">"], + [9419, 0, "]"], + [9420, 0, " "], + [9421, 0, "("], + [9422, 0, "r"], + [9423, 0, "i"], + [9424, 0, "g"], + [9425, 0, "h"], + [9426, 0, "t"], + [9427, 0, "1"], + [9428, 0, ")"], + [9429, 0, " "], + [9430, 0, "t"], + [9431, 0, "o"], + [9432, 0, " "], + [9433, 0, "n"], + [9434, 0, "o"], + [9435, 0, "d"], + [9436, 0, "e"], + [9437, 0, " "], + [9438, 0, "["], + [9439, 0, "r"], + [9440, 0, "i"], + [9441, 0, "g"], + [9442, 0, "h"], + [9443, 0, "t"], + [9444, 0, "]"], + [9445, 0, " "], + [9446, 0, "{"], + [9447, 0, "\\"], + [9448, 0, "f"], + [9449, 0, "o"], + [9450, 0, "o"], + [9451, 0, "t"], + [9452, 0, "n"], + [9453, 0, "o"], + [9454, 0, "t"], + [9455, 0, "e"], + [9456, 0, "s"], + [9457, 0, "i"], + [9458, 0, "z"], + [9459, 0, "e"], + [9460, 0, " "], + [9461, 0, "y"], + [9462, 0, "i"], + [9463, 0, "e"], + [9464, 0, "l"], + [9465, 0, "d"], + [9466, 0, ";"], + [9467, 0, "}"], + [9468, 0, " "], + [9469, 0, "("], + [9470, 0, "r"], + [9471, 0, "i"], + [9472, 0, "g"], + [9473, 0, "h"], + [9474, 0, "t"], + [9475, 0, "2"], + [9476, 0, ")"], + [9477, 0, ";"], + [9478, 0, "\n"], + [9479, 0, "\\"], + [9480, 0, "d"], + [9481, 0, "r"], + [9482, 0, "a"], + [9483, 0, "w"], + [9484, 0, " "], + [9485, 0, "["], + [9486, 0, "t"], + [9487, 0, "h"], + [9488, 0, "i"], + [9489, 0, "c"], + [9490, 0, "k"], + [9491, 0, ","], + [9492, 0, "-"], + [9493, 0, ">"], + [9494, 0, "]"], + [9495, 0, " "], + [9496, 0, "("], + [9497, 0, "l"], + [9498, 0, "e"], + [9499, 0, "f"], + [9500, 0, "t"], + [9501, 0, "1"], + [9502, 0, ")"], + [9503, 0, " "], + [9504, 0, " "], + [9505, 0, "t"], + [9506, 0, "o"], + [9507, 0, " "], + [9508, 0, "("], + [9509, 0, "r"], + [9510, 0, "i"], + [9511, 0, "g"], + [9512, 0, "h"], + [9513, 0, "t"], + [9514, 0, "2"], + [9515, 0, ")"], + [9516, 0, ";"], + [9517, 0, "\n"], + [9518, 0, "\\"], + [9519, 0, "d"], + [9520, 0, "r"], + [9521, 0, "a"], + [9522, 0, "w"], + [9523, 0, " "], + [9524, 0, "["], + [9525, 0, "t"], + [9526, 0, "h"], + [9527, 0, "i"], + [9528, 0, "c"], + [9529, 0, "k"], + [9530, 0, ","], + [9531, 0, "-"], + [9532, 0, ">"], + [9533, 0, "]"], + [9534, 0, " "], + [9535, 0, "("], + [9536, 0, "r"], + [9537, 0, "i"], + [9538, 0, "g"], + [9539, 0, "h"], + [9540, 0, "t"], + [9541, 0, "1"], + [9542, 0, ")"], + [9543, 0, " "], + [9544, 0, "t"], + [9545, 0, "o"], + [9546, 0, " "], + [9547, 0, "("], + [9548, 0, "l"], + [9549, 0, "e"], + [9550, 0, "f"], + [9551, 0, "t"], + [9552, 0, "2"], + [9553, 0, ")"], + [9554, 0, ";"], + [8689, 0, "\n"], + [8690, 0, "\n"], + [8691, 0, "T"], + [8692, 0, "h"], + [8693, 0, "e"], + [8694, 0, " "], + [8695, 0, "e"], + [8696, 0, "x"], + [8697, 0, "a"], + [8698, 0, "m"], + [8699, 0, "p"], + [8700, 0, "l"], + [8701, 0, "e"], + [8702, 0, " "], + [8703, 0, "i"], + [8704, 0, "n"], + [8705, 0, " "], + [8706, 0, "F"], + [8707, 0, "i"], + [8708, 0, "g"], + [8709, 0, "u"], + [8710, 0, "r"], + [8711, 0, "e"], + [8712, 0, "~"], + [8713, 0, "\\"], + [8714, 0, "r"], + [8715, 0, "e"], + [8716, 0, "f"], + [8717, 0, "{"], + [8718, 0, "f"], + [8719, 0, "i"], + [8720, 0, "g"], + [8721, 0, ":"], + [8722, 0, "t"], + [8723, 0, "w"], + [8724, 0, "o"], + [8725, 0, "-"], + [8726, 0, "l"], + [8727, 0, "i"], + [8728, 0, "s"], + [8729, 0, "t"], + [8730, 0, "s"], + [8731, 0, "}"], + [8732, 0, " "], + [8733, 0, "s"], + [8734, 0, "h"], + [8735, 0, "o"], + [8736, 0, "w"], + [8737, 0, "s"], + [8738, 0, " "], + [8739, 0, "t"], + [8740, 0, "w"], + [8741, 0, "o"], + [8742, 0, " "], + [8743, 0, "r"], + [8744, 0, "e"], + [8745, 0, "p"], + [8746, 0, "l"], + [8747, 0, "i"], + [8748, 0, "c"], + [8749, 0, "a"], + [8750, 0, "s"], + [8751, 0, " "], + [8752, 0, "c"], + [8753, 0, "o"], + [8754, 0, "n"], + [8755, 0, "c"], + [8756, 0, "u"], + [8757, 0, "r"], + [8758, 0, "r"], + [8759, 0, "e"], + [8760, 0, "n"], + [8761, 0, "t"], + [8762, 0, "l"], + [8763, 0, "y"], + [8764, 0, " "], + [8765, 0, "c"], + [8766, 0, "r"], + [8767, 0, "e"], + [8768, 0, "a"], + [8769, 0, "t"], + [8770, 0, "i"], + [8771, 0, "n"], + [8772, 0, "g"], + [8773, 0, " "], + [8774, 0, "a"], + [8775, 0, " "], + [8776, 0, "n"], + [8777, 0, "e"], + [8778, 0, "w"], + [8779, 0, " "], + [8780, 0, "l"], + [8781, 0, "i"], + [8782, 0, "s"], + [8783, 0, "t"], + [8784, 0, " "], + [8785, 0, "u"], + [8786, 0, "n"], + [8787, 0, "d"], + [8788, 0, "e"], + [8789, 0, "r"], + [8790, 0, " "], + [8791, 0, "t"], + [8792, 0, "h"], + [8793, 0, "e"], + [8794, 0, " "], + [8795, 0, "s"], + [8796, 0, "a"], + [8797, 0, "m"], + [8798, 0, "e"], + [8799, 0, " "], + [8800, 0, "m"], + [8801, 0, "a"], + [8802, 0, "p"], + [8803, 0, " "], + [8780, 0, "o"], + [8781, 0, "r"], + [8782, 0, "d"], + [8783, 0, "e"], + [8784, 0, "r"], + [8785, 0, "e"], + [8786, 0, "d"], + [8787, 0, " "], + [8786, 1], + [8785, 1], + [8784, 1], + [8783, 1], + [8782, 1], + [8781, 1], + [8780, 1], + [8780, 0, "s"], + [8781, 0, "h"], + [8782, 0, "o"], + [8783, 0, "p"], + [8784, 0, "p"], + [8785, 0, "i"], + [8786, 0, "n"], + [8787, 0, "g"], + [8813, 0, "k"], + [8814, 0, "e"], + [8815, 0, "y"], + [8816, 0, " "], + [8817, 0, "`"], + [8818, 0, "`"], + [8819, 0, "b"], + [8820, 0, "u"], + [8821, 0, "y"], + [8822, 0, "'"], + [8823, 0, "'"], + [8824, 0, ","], + [8825, 0, " "], + [8826, 0, "a"], + [8827, 0, "n"], + [8828, 0, "d"], + [8829, 0, " "], + [8830, 0, "a"], + [8831, 0, "d"], + [8832, 0, "d"], + [8833, 0, "i"], + [8834, 0, "n"], + [8835, 0, "g"], + [8836, 0, " "], + [8837, 0, "i"], + [8838, 0, "t"], + [8839, 0, "e"], + [8840, 0, "m"], + [8841, 0, "s"], + [8842, 0, " "], + [8843, 0, "t"], + [8844, 0, "o"], + [8845, 0, " "], + [8846, 0, "t"], + [8847, 0, "h"], + [8848, 0, "e"], + [8849, 0, " "], + [8850, 0, "l"], + [8851, 0, "i"], + [8852, 0, "s"], + [8853, 0, "t"], + [8854, 0, "."], + [8855, 0, " "], + [8856, 0, "W"], + [8857, 0, "h"], + [8858, 0, "e"], + [8859, 0, "n"], + [8860, 0, " "], + [8861, 0, "t"], + [8862, 0, "h"], + [8863, 0, "e"], + [8864, 0, " "], + [8865, 0, "r"], + [8866, 0, "e"], + [8867, 0, "p"], + [8868, 0, "l"], + [8869, 0, "i"], + [8870, 0, "c"], + [8871, 0, "a"], + [8872, 0, "s"], + [8873, 0, " "], + [8874, 0, "a"], + [8875, 0, "r"], + [8876, 0, "e"], + [8877, 0, " "], + [8878, 0, "m"], + [8879, 0, "e"], + [8880, 0, "r"], + [8881, 0, "g"], + [8882, 0, "e"], + [8883, 0, "d"], + [8884, 0, ","], + [8885, 0, " "], + [8886, 0, "t"], + [8887, 0, "h"], + [8888, 0, "e"], + [8889, 0, " "], + [8890, 0, "l"], + [8891, 0, "i"], + [8892, 0, "s"], + [8893, 0, "t"], + [8894, 0, "s"], + [8895, 0, " "], + [8896, 0, "n"], + [8897, 0, "e"], + [8898, 0, "e"], + [8899, 0, "d"], + [8900, 0, " "], + [8901, 0, "t"], + [8902, 0, "o"], + [8903, 0, " "], + [8904, 0, "b"], + [8905, 0, "e"], + [8906, 0, " "], + [8907, 0, "m"], + [8908, 0, "e"], + [8909, 0, "r"], + [8910, 0, "g"], + [8911, 0, "e"], + [8912, 0, "d"], + [8913, 0, " "], + [8913, 1], + [8913, 0, " "], + [8914, 0, "a"], + [8915, 0, "l"], + [8916, 0, "s"], + [8917, 0, "o"], + [8918, 0, "."], + [8919, 0, " "], + [8920, 0, "W"], + [8921, 0, "e"], + [8922, 0, " "], + [8923, 0, "p"], + [8924, 0, "r"], + [8925, 0, "e"], + [8926, 0, "s"], + [8927, 0, "e"], + [8928, 0, "r"], + [8929, 0, "v"], + [8930, 0, "e"], + [8931, 0, " "], + [8932, 0, "t"], + [8933, 0, "h"], + [8934, 0, "e"], + [8935, 0, " "], + [8936, 0, "o"], + [8937, 0, "r"], + [8938, 0, "d"], + [8939, 0, "e"], + [8940, 0, "r"], + [8941, 0, "i"], + [8942, 0, "n"], + [8943, 0, "g"], + [8944, 0, " "], + [8945, 0, "o"], + [8946, 0, "f"], + [8947, 0, " "], + [8948, 0, "a"], + [8949, 0, "d"], + [8950, 0, "j"], + [8951, 0, "a"], + [8951, 1], + [8950, 1], + [8949, 1], + [8948, 1], + [8947, 1], + [8946, 1], + [8945, 1], + [8945, 0, "a"], + [8946, 0, "n"], + [8947, 0, "d"], + [8948, 0, " "], + [8949, 0, "a"], + [8950, 0, "d"], + [8951, 0, "j"], + [8952, 0, "a"], + [8953, 0, "c"], + [8954, 0, "e"], + [8955, 0, "n"], + [8956, 0, "c"], + [8957, 0, "y"], + [8958, 0, " "], + [8959, 0, "o"], + [8960, 0, "f"], + [8961, 0, " "], + [8962, 0, "i"], + [8963, 0, "t"], + [8964, 0, "e"], + [8965, 0, "m"], + [8966, 0, "s"], + [8967, 0, " "], + [8968, 0, "i"], + [8969, 0, "n"], + [8970, 0, "s"], + [8971, 0, "e"], + [8972, 0, "r"], + [8973, 0, "t"], + [8974, 0, "e"], + [8975, 0, "d"], + [8976, 0, " "], + [8977, 0, "a"], + [8978, 0, "t"], + [8979, 0, " "], + [8980, 0, "e"], + [8981, 0, "a"], + [8982, 0, "c"], + [8983, 0, "h"], + [8984, 0, " "], + [8985, 0, "r"], + [8986, 0, "e"], + [8987, 0, "p"], + [8988, 0, "l"], + [8989, 0, "i"], + [8990, 0, "c"], + [8991, 0, "a"], + [8992, 0, ","], + [8993, 0, " "], + [8994, 0, "s"], + [8995, 0, "o"], + [8996, 0, " "], + [8997, 0, "`"], + [8998, 0, "`"], + [8999, 0, "h"], + [9000, 0, "a"], + [9001, 0, "m"], + [9002, 0, " "], + [9002, 1], + [9002, 0, "'"], + [9003, 0, "'"], + [9004, 0, " "], + [9005, 0, "a"], + [9006, 0, "p"], + [9007, 0, "p"], + [9008, 0, "e"], + [9009, 0, "a"], + [9010, 0, "r"], + [9011, 0, "s"], + [9012, 0, " "], + [9013, 0, "a"], + [9014, 0, "f"], + [9015, 0, "t"], + [9016, 0, "e"], + [9017, 0, "r"], + [9018, 0, " "], + [9019, 0, "`"], + [9020, 0, "`"], + [9021, 0, "e"], + [9022, 0, "g"], + [9023, 0, "g"], + [9024, 0, "s"], + [9025, 0, "'"], + [9026, 0, "'"], + [9027, 0, ","], + [9028, 0, " "], + [9029, 0, "a"], + [9030, 0, "n"], + [9031, 0, "d"], + [9032, 0, " "], + [9033, 0, "`"], + [9034, 0, "`"], + [9035, 0, "f"], + [9036, 0, "l"], + [9037, 0, "o"], + [9038, 0, "u"], + [9039, 0, "r"], + [9040, 0, "`"], + [9040, 1], + [9040, 0, "'"], + [9041, 0, "'"], + [9042, 0, " "], + [9043, 0, "a"], + [9044, 0, "p"], + [9045, 0, "p"], + [9046, 0, "e"], + [9047, 0, "a"], + [9048, 0, "r"], + [9049, 0, "s"], + [9050, 0, " "], + [9051, 0, "a"], + [9052, 0, "f"], + [9053, 0, "t"], + [9054, 0, "e"], + [9055, 0, "r"], + [9056, 0, " "], + [9057, 0, "`"], + [9058, 0, "`"], + [9059, 0, "m"], + [9060, 0, "i"], + [9061, 0, "l"], + [9062, 0, "k"], + [9063, 0, "'"], + [9064, 0, "'"], + [9065, 0, " "], + [9066, 0, "i"], + [9067, 0, "n"], + [9068, 0, " "], + [9069, 0, "t"], + [9070, 0, "h"], + [9071, 0, "e"], + [9072, 0, " "], + [9073, 0, "m"], + [9074, 0, "e"], + [9075, 0, "r"], + [9076, 0, "g"], + [9077, 0, "e"], + [9078, 0, "d"], + [9079, 0, " "], + [9080, 0, "r"], + [9081, 0, "e"], + [9082, 0, "s"], + [9083, 0, "u"], + [9084, 0, "l"], + [9085, 0, "t"], + [9086, 0, "."], + [9087, 0, " "], + [9088, 0, "W"], + [9089, 0, "h"], + [9090, 0, "e"], + [9091, 0, "t"], + [9092, 0, "h"], + [9093, 0, "e"], + [9094, 0, "r"], + [9095, 0, " "], + [9095, 1], + [9094, 1], + [9093, 1], + [9092, 1], + [9091, 1], + [9090, 1], + [9089, 1], + [9088, 1], + [9088, 0, "T"], + [9089, 0, "h"], + [9090, 0, "e"], + [9091, 0, "r"], + [9092, 0, "e"], + [9093, 0, " "], + [9094, 0, "i"], + [9095, 0, "s"], + [9096, 0, " "], + [9097, 0, "n"], + [9098, 0, "o"], + [9099, 0, " "], + [9100, 0, "i"], + [9101, 0, "n"], + [9102, 0, "f"], + [9103, 0, "o"], + [9104, 0, "r"], + [9105, 0, "m"], + [9106, 0, "a"], + [9107, 0, "t"], + [9108, 0, "i"], + [9109, 0, "o"], + [9110, 0, "n"], + [9111, 0, " "], + [9112, 0, "o"], + [9113, 0, "n"], + [9114, 0, " "], + [9115, 0, "w"], + [9116, 0, "h"], + [9117, 0, "e"], + [9118, 0, "t"], + [9119, 0, "h"], + [9120, 0, "e"], + [9121, 0, "r"], + [9122, 0, " "], + [9122, 1], + [9121, 1], + [9120, 1], + [9119, 1], + [9118, 1], + [9117, 1], + [9116, 1], + [9116, 0, "i"], + [9116, 1], + [9116, 0, "h"], + [9117, 0, "i"], + [9118, 0, "c"], + [9119, 0, "h"], + [9120, 0, " "], + [9121, 0, "r"], + [9122, 0, "e"], + [9123, 0, "p"], + [9124, 0, "l"], + [9125, 0, "i"], + [9126, 0, "c"], + [9127, 0, "a"], + [9128, 0, "'"], + [9129, 0, "s"], + [9130, 0, " "], + [9131, 0, "i"], + [9132, 0, "t"], + [9133, 0, "e"], + [9134, 0, "m"], + [9135, 0, "s"], + [9136, 0, " "], + [9137, 0, "s"], + [9138, 0, "h"], + [9139, 0, "o"], + [9140, 0, "u"], + [9141, 0, "l"], + [9142, 0, "d"], + [9143, 0, " "], + [9144, 0, "a"], + [9145, 0, "p"], + [9146, 0, "p"], + [9147, 0, "e"], + [9148, 0, "a"], + [9149, 0, "r"], + [9150, 0, " "], + [9151, 0, "f"], + [9152, 0, "i"], + [9153, 0, "r"], + [9154, 0, "s"], + [9155, 0, "t"], + [9156, 0, " "], + [9157, 0, "i"], + [9158, 0, "n"], + [9159, 0, " "], + [9160, 0, "t"], + [9161, 0, "h"], + [9162, 0, "e"], + [9163, 0, " "], + [9164, 0, "m"], + [9165, 0, "e"], + [9166, 0, "r"], + [9167, 0, "g"], + [9168, 0, "e"], + [9169, 0, "d"], + [9170, 0, " "], + [9171, 0, "r"], + [9172, 0, "e"], + [9173, 0, "s"], + [9174, 0, "u"], + [9175, 0, "l"], + [9176, 0, "t"], + [9177, 0, ","], + [9178, 0, " "], + [9179, 0, "s"], + [9180, 0, "o"], + [9181, 0, " "], + [9182, 0, "t"], + [9183, 0, "h"], + [9184, 0, "e"], + [9185, 0, "r"], + [9186, 0, "e"], + [9187, 0, " "], + [9187, 1], + [9186, 1], + [9185, 1], + [9185, 0, " "], + [9186, 0, "a"], + [9187, 0, "l"], + [9188, 0, "g"], + [9189, 0, "o"], + [9190, 0, "r"], + [9191, 0, "i"], + [9192, 0, "t"], + [9193, 0, "h"], + [9194, 0, "m"], + [9195, 0, " "], + [9196, 0, "c"], + [9197, 0, "a"], + [9198, 0, "n"], + [9199, 0, " "], + [9200, 0, "m"], + [9201, 0, "a"], + [9202, 0, "k"], + [9203, 0, "e"], + [9204, 0, " "], + [9205, 0, "a"], + [9206, 0, "n"], + [9207, 0, " "], + [9208, 0, "a"], + [9209, 0, "r"], + [9210, 0, "b"], + [9211, 0, "i"], + [9212, 0, "t"], + [9213, 0, "r"], + [9214, 0, "a"], + [9215, 0, "r"], + [9216, 0, "y"], + [9217, 0, " "], + [9218, 0, "n"], + [9219, 0, "o"], + [9219, 1], + [9218, 1], + [9218, 0, "c"], + [9219, 0, "h"], + [9220, 0, "o"], + [9221, 0, "i"], + [9222, 0, "c"], + [9223, 0, "e"], + [9224, 0, " "], + [9225, 0, "b"], + [9226, 0, "e"], + [9227, 0, "t"], + [9228, 0, "w"], + [9229, 0, "e"], + [9230, 0, "e"], + [9231, 0, "n"], + [9232, 0, " "], + [9233, 0, "`"], + [9234, 0, "`"], + [9235, 0, "e"], + [9236, 0, "g"], + [9237, 0, "g"], + [9238, 0, "s"], + [9239, 0, ","], + [9240, 0, " "], + [9241, 0, "h"], + [9242, 0, "j"], + [9243, 0, "a"], + [9243, 1], + [9242, 1], + [9242, 0, "a"], + [9243, 0, "m"], + [9244, 0, ","], + [9245, 0, " "], + [9246, 0, "m"], + [9247, 0, "i"], + [9248, 0, "l"], + [9249, 0, "k"], + [9250, 0, ","], + [9251, 0, " "], + [9252, 0, "f"], + [9253, 0, "l"], + [9254, 0, "o"], + [9255, 0, "u"], + [9256, 0, "r"], + [9257, 0, "'"], + [9258, 0, "'"], + [9259, 0, " "], + [9260, 0, "a"], + [9261, 0, "n"], + [9262, 0, "d"], + [9263, 0, " "], + [9264, 0, "`"], + [9265, 0, "`"], + [9266, 0, "m"], + [9267, 0, "i"], + [9268, 0, "l"], + [9269, 0, "k"], + [9270, 0, ","], + [9271, 0, " "], + [9272, 0, "f"], + [9273, 0, "l"], + [9274, 0, "o"], + [9275, 0, "u"], + [9276, 0, "r"], + [9277, 0, ","], + [9278, 0, " "], + [9279, 0, "e"], + [9280, 0, "g"], + [9281, 0, "g"], + [9282, 0, "s"], + [9283, 0, ","], + [9284, 0, " "], + [9285, 0, "h"], + [9286, 0, "a"], + [9287, 0, "m"], + [9288, 0, "'"], + [9289, 0, "'"], + [9290, 0, ","], + [9291, 0, " "], + [9292, 0, "p"], + [9293, 0, "r"], + [9294, 0, "o"], + [9295, 0, "v"], + [9296, 0, "i"], + [9297, 0, "d"], + [9298, 0, "e"], + [9299, 0, "d"], + [9300, 0, " "], + [9301, 0, "t"], + [9302, 0, "h"], + [9303, 0, "a"], + [9304, 0, "t"], + [9305, 0, " "], + [9306, 0, "a"], + [9307, 0, "l"], + [9308, 0, "l"], + [9309, 0, " "], + [9310, 0, "r"], + [9311, 0, "e"], + [9312, 0, "p"], + [9313, 0, "l"], + [9314, 0, "i"], + [9315, 0, "c"], + [9316, 0, "a"], + [9317, 0, "s"], + [9318, 0, " "], + [9319, 0, "c"], + [9320, 0, "o"], + [9321, 0, "n"], + [9322, 0, "v"], + [9322, 1], + [9321, 1], + [9320, 1], + [9319, 1], + [9319, 0, "e"], + [9320, 0, "n"], + [9321, 0, "d"], + [9322, 0, " "], + [9323, 0, "u"], + [9324, 0, "p"], + [9325, 0, " "], + [9326, 0, "w"], + [9327, 0, "i"], + [9328, 0, "t"], + [9329, 0, "h"], + [9330, 0, " "], + [9331, 0, "t"], + [9332, 0, "h"], + [9333, 0, "e"], + [9334, 0, " "], + [9335, 0, "s"], + [9336, 0, "a"], + [9337, 0, "m"], + [9338, 0, "e"], + [9339, 0, " "], + [9340, 0, "o"], + [9341, 0, "r"], + [9342, 0, "d"], + [9343, 0, "e"], + [9344, 0, "r"], + [9345, 0, "."], + [10359, 0, "\n"], + [10360, 0, "\n"], + [10361, 0, "O"], + [10362, 0, "u"], + [10363, 0, "r"], + [10364, 0, " "], + [10365, 0, "f"], + [10366, 0, "i"], + [10367, 0, "n"], + [10368, 0, "a"], + [10369, 0, "l"], + [10370, 0, " "], + [10371, 0, "e"], + [10372, 0, "x"], + [10373, 0, "a"], + [10374, 0, "m"], + [10375, 0, "p"], + [10376, 0, "l"], + [10377, 0, "e"], + [10378, 0, " "], + [10379, 0, "i"], + [10380, 0, "n"], + [10381, 0, " "], + [10382, 0, "F"], + [10383, 0, "i"], + [10384, 0, "g"], + [10385, 0, "u"], + [10386, 0, "r"], + [10387, 0, "e"], + [10388, 0, "~"], + [10389, 0, "\\"], + [10390, 0, "r"], + [10391, 0, "e"], + [10392, 0, "f"], + [10393, 0, "{"], + [10394, 0, "f"], + [10395, 0, "i"], + [10396, 0, "g"], + [10397, 0, ":"], + [10398, 0, "t"], + [10399, 0, "o"], + [10400, 0, "d"], + [10401, 0, "o"], + [10402, 0, "-"], + [10403, 0, "i"], + [10404, 0, "t"], + [10405, 0, "e"], + [10406, 0, "m"], + [10407, 0, "}"], + [10408, 0, " "], + [10409, 0, "s"], + [10410, 0, "h"], + [10411, 0, "o"], + [10412, 0, "w"], + [10413, 0, "s"], + [10414, 0, " "], + [10415, 0, "a"], + [10416, 0, " "], + [10417, 0, "l"], + [10418, 0, "i"], + [10419, 0, "m"], + [10420, 0, "i"], + [10421, 0, "t"], + [10422, 0, "a"], + [10423, 0, "t"], + [10424, 0, "i"], + [10425, 0, "o"], + [10426, 0, "n"], + [10427, 0, " "], + [10428, 0, "o"], + [10429, 0, "f"], + [10430, 0, " "], + [10431, 0, "t"], + [10432, 0, "h"], + [10433, 0, "e"], + [10434, 0, " "], + [10435, 0, "p"], + [10436, 0, "r"], + [10437, 0, "i"], + [10438, 0, "n"], + [10439, 0, "c"], + [10440, 0, "i"], + [10441, 0, "p"], + [10442, 0, "l"], + [10443, 0, "e"], + [10444, 0, " "], + [10445, 0, "o"], + [10446, 0, "f"], + [10447, 0, " "], + [10448, 0, "p"], + [10449, 0, "r"], + [10450, 0, "e"], + [10451, 0, "s"], + [10452, 0, "e"], + [10453, 0, "r"], + [10454, 0, "v"], + [10455, 0, "i"], + [10456, 0, "n"], + [10457, 0, "g"], + [10458, 0, " "], + [10459, 0, "a"], + [10460, 0, "l"], + [10461, 0, "l"], + [10462, 0, " "], + [10463, 0, "u"], + [10464, 0, "s"], + [10465, 0, "e"], + [10466, 0, "r"], + [10467, 0, " "], + [10468, 0, "i"], + [10469, 0, "n"], + [10470, 0, "p"], + [10471, 0, "u"], + [10472, 0, "t"], + [10473, 0, "."], + [10474, 0, " "], + [10475, 0, "I"], + [10476, 0, "n"], + [10477, 0, " "], + [10478, 0, "a"], + [10479, 0, " "], + [10480, 0, "T"], + [10481, 0, "o"], + [10482, 0, " "], + [10482, 1], + [10481, 1], + [10480, 1], + [10479, 1], + [10479, 0, "t"], + [10480, 0, "o"], + [10481, 0, " "], + [10481, 1], + [10480, 1], + [10479, 1], + [10478, 1], + [10478, 0, "a"], + [10479, 0, " "], + [10480, 0, "t"], + [10481, 0, "o"], + [10482, 0, "-"], + [10483, 0, "d"], + [10484, 0, "o"], + [10485, 0, " "], + [10486, 0, "l"], + [10487, 0, "i"], + [10488, 0, "s"], + [10489, 0, "t"], + [10490, 0, " "], + [10491, 0, "a"], + [10492, 0, "p"], + [10493, 0, "p"], + [10494, 0, "l"], + [10495, 0, "i"], + [10496, 0, "c"], + [10497, 0, "a"], + [10498, 0, "t"], + [10499, 0, "i"], + [10500, 0, "o"], + [10501, 0, "n"], + [10502, 0, ","], + [10503, 0, " "], + [10504, 0, "o"], + [10505, 0, "n"], + [10506, 0, "e"], + [10507, 0, " "], + [10508, 0, "r"], + [10509, 0, "e"], + [10510, 0, "p"], + [10511, 0, "l"], + [10512, 0, "i"], + [10513, 0, "c"], + [10514, 0, "a"], + [10515, 0, " "], + [10516, 0, "r"], + [10517, 0, "e"], + [10518, 0, "m"], + [10519, 0, "o"], + [10520, 0, "v"], + [10521, 0, "e"], + [10522, 0, "s"], + [10523, 0, " "], + [10524, 0, "a"], + [10525, 0, " "], + [10526, 0, "t"], + [10527, 0, "o"], + [10528, 0, "-"], + [10529, 0, "d"], + [10530, 0, "o"], + [10531, 0, " "], + [10532, 0, "i"], + [10533, 0, "t"], + [10534, 0, "e"], + [10535, 0, "m"], + [10536, 0, " "], + [10537, 0, "f"], + [10538, 0, "r"], + [10539, 0, "o"], + [10540, 0, "m"], + [10541, 0, " "], + [10542, 0, "t"], + [10543, 0, "h"], + [10544, 0, "e"], + [10545, 0, " "], + [10546, 0, "l"], + [10547, 0, "i"], + [10548, 0, "s"], + [10549, 0, "t"], + [10550, 0, ","], + [10551, 0, " "], + [10552, 0, "w"], + [10553, 0, "h"], + [10554, 0, "i"], + [10555, 0, "l"], + [10556, 0, "e"], + [10557, 0, " "], + [10558, 0, "a"], + [10559, 0, "n"], + [10560, 0, "o"], + [10561, 0, "t"], + [10562, 0, "h"], + [10563, 0, "e"], + [10564, 0, "r"], + [10565, 0, " "], + [10566, 0, "r"], + [10567, 0, "e"], + [10568, 0, "p"], + [10569, 0, "l"], + [10570, 0, "i"], + [10571, 0, "c"], + [10572, 0, "a"], + [10573, 0, " "], + [10574, 0, "c"], + [10575, 0, "o"], + [10576, 0, "n"], + [10577, 0, "c"], + [10578, 0, "u"], + [10579, 0, "r"], + [10580, 0, "r"], + [10581, 0, "e"], + [10582, 0, "n"], + [10583, 0, "t"], + [10584, 0, "l"], + [10585, 0, "y"], + [10586, 0, " "], + [10587, 0, "m"], + [10588, 0, "a"], + [10589, 0, "r"], + [10590, 0, "k"], + [10591, 0, "s"], + [10592, 0, " "], + [10593, 0, "t"], + [10594, 0, "h"], + [10595, 0, "e"], + [10596, 0, " "], + [10597, 0, "s"], + [10598, 0, "a"], + [10599, 0, "m"], + [10600, 0, "e"], + [10601, 0, " "], + [10602, 0, "i"], + [10603, 0, "t"], + [10604, 0, "e"], + [10605, 0, "m"], + [10606, 0, " "], + [10607, 0, "a"], + [10608, 0, "s"], + [10609, 0, " "], + [10610, 0, "d"], + [10611, 0, "o"], + [10612, 0, "n"], + [10613, 0, "e"], + [10614, 0, "."], + [10615, 0, " "], + [10616, 0, "A"], + [10617, 0, "s"], + [10618, 0, " "], + [10619, 0, "t"], + [10620, 0, "h"], + [10621, 0, "e"], + [10622, 0, " "], + [10623, 0, "c"], + [10624, 0, "h"], + [10625, 0, "a"], + [10626, 0, "n"], + [10627, 0, "g"], + [10628, 0, "e"], + [10629, 0, "s"], + [10630, 0, " "], + [10631, 0, "a"], + [10632, 0, "r"], + [10633, 0, "e"], + [10634, 0, " "], + [10635, 0, "m"], + [10636, 0, "e"], + [10637, 0, "r"], + [10638, 0, "g"], + [10639, 0, "e"], + [10640, 0, "d"], + [10641, 0, ","], + [10642, 0, " "], + [10643, 0, "t"], + [10644, 0, "h"], + [10645, 0, "e"], + [10646, 0, " "], + [10647, 0, "u"], + [10648, 0, "p"], + [10649, 0, "d"], + [10650, 0, "a"], + [10651, 0, "t"], + [10652, 0, "e"], + [10653, 0, " "], + [10654, 0, "o"], + [10655, 0, "f"], + [10656, 0, " "], + [10657, 0, "t"], + [10658, 0, "h"], + [10659, 0, "e"], + [10660, 0, " "], + [10661, 0, "m"], + [10662, 0, "a"], + [10663, 0, "p"], + [10664, 0, " "], + [10665, 0, "k"], + [10666, 0, "e"], + [10667, 0, "y"], + [10668, 0, " "], + [10669, 0, "`"], + [10670, 0, "`"], + [10671, 0, "d"], + [10672, 0, "o"], + [10673, 0, "n"], + [10674, 0, "e"], + [10675, 0, "'"], + [10676, 0, "'"], + [10677, 0, " "], + [10678, 0, "e"], + [10679, 0, "f"], + [10680, 0, "f"], + [10681, 0, "e"], + [10682, 0, "c"], + [10683, 0, "t"], + [10684, 0, "i"], + [10685, 0, "v"], + [10686, 0, "e"], + [10687, 0, "l"], + [10688, 0, "y"], + [10689, 0, " "], + [10690, 0, "c"], + [10691, 0, "a"], + [10692, 0, "u"], + [10693, 0, "s"], + [10694, 0, "e"], + [10695, 0, "s"], + [10696, 0, " "], + [10697, 0, "t"], + [10698, 0, "h"], + [10699, 0, "e"], + [10700, 0, " "], + [10701, 0, "l"], + [10702, 0, "i"], + [10703, 0, "s"], + [10704, 0, "t"], + [10705, 0, " "], + [10706, 0, "i"], + [10707, 0, "t"], + [10708, 0, "e"], + [10709, 0, "m"], + [10710, 0, " "], + [10711, 0, "t"], + [10712, 0, "o"], + [10713, 0, " "], + [10714, 0, "b"], + [10715, 0, "e"], + [10716, 0, " "], + [10717, 0, "r"], + [10718, 0, "e"], + [10719, 0, "s"], + [10720, 0, "u"], + [10721, 0, "r"], + [10722, 0, "r"], + [10723, 0, "e"], + [10724, 0, "c"], + [10725, 0, "t"], + [10726, 0, "e"], + [10727, 0, "d"], + [10728, 0, " "], + [10729, 0, "o"], + [10730, 0, "n"], + [10731, 0, " "], + [10732, 0, "t"], + [10733, 0, "h"], + [10734, 0, "e"], + [10735, 0, " "], + [10736, 0, "l"], + [10737, 0, "e"], + [10738, 0, "f"], + [10739, 0, "t"], + [10740, 0, " "], + [10741, 0, "r"], + [10742, 0, "e"], + [10743, 0, "p"], + [10744, 0, "l"], + [10745, 0, "i"], + [10746, 0, "c"], + [10747, 0, "a"], + [10748, 0, "."], + [10749, 0, " "], + [10749, 1], + [10748, 1], + [10748, 0, ","], + [10749, 0, " "], + [10750, 0, "l"], + [10751, 0, "e"], + [10752, 0, "a"], + [10753, 0, "d"], + [10754, 0, "i"], + [10755, 0, "n"], + [10756, 0, "g"], + [10757, 0, " "], + [10758, 0, "t"], + [10759, 0, "o"], + [10760, 0, " "], + [10761, 0, "a"], + [10762, 0, " "], + [10763, 0, "t"], + [10764, 0, "o"], + [10765, 0, "-"], + [10766, 0, "d"], + [10767, 0, "o"], + [10768, 0, "-"], + [10768, 1], + [10768, 0, " "], + [10769, 0, "i"], + [10770, 0, "t"], + [10771, 0, "e"], + [10772, 0, "m"], + [10773, 0, " "], + [10774, 0, "w"], + [10775, 0, "i"], + [10776, 0, "t"], + [10777, 0, "h"], + [10778, 0, "o"], + [10779, 0, "u"], + [10780, 0, "t"], + [10781, 0, " "], + [10782, 0, "a"], + [10783, 0, " "], + [10784, 0, "t"], + [10785, 0, "i"], + [10786, 0, "t"], + [10787, 0, "l"], + [10788, 0, "e"], + [10789, 0, " "], + [10790, 0, "("], + [10791, 0, "s"], + [10792, 0, "i"], + [10793, 0, "n"], + [10794, 0, "c"], + [10795, 0, "e"], + [10796, 0, " "], + [10797, 0, "t"], + [10798, 0, "h"], + [10799, 0, "e"], + [10800, 0, " "], + [10801, 0, "t"], + [10802, 0, "i"], + [10803, 0, "t"], + [10804, 0, "l"], + [10805, 0, "e"], + [10806, 0, " "], + [10807, 0, "w"], + [10808, 0, "a"], + [10809, 0, "s"], + [10810, 0, " "], + [10811, 0, "d"], + [10812, 0, "e"], + [10813, 0, "l"], + [10814, 0, "e"], + [10815, 0, "t"], + [10816, 0, "e"], + [10817, 0, "d"], + [10818, 0, " "], + [10819, 0, "a"], + [10820, 0, "s"], + [10821, 0, " "], + [10822, 0, "p"], + [10823, 0, "a"], + [10824, 0, "r"], + [10825, 0, "t"], + [10826, 0, " "], + [10827, 0, "o"], + [10828, 0, "f"], + [10829, 0, " "], + [10830, 0, "d"], + [10831, 0, "e"], + [10832, 0, "l"], + [10833, 0, "e"], + [10834, 0, "t"], + [10835, 0, "i"], + [10836, 0, "n"], + [10837, 0, "g"], + [10838, 0, " "], + [10839, 0, "t"], + [10840, 0, "h"], + [10841, 0, "e"], + [10842, 0, " "], + [10843, 0, "l"], + [10844, 0, "i"], + [10845, 0, "s"], + [10846, 0, "t"], + [10847, 0, " "], + [10848, 0, "i"], + [10849, 0, "t"], + [10850, 0, "e"], + [10851, 0, "m"], + [10852, 0, ")"], + [10853, 0, "."], + [10854, 0, " "], + [10855, 0, "T"], + [10856, 0, "h"], + [10857, 0, "i"], + [10858, 0, "s"], + [10859, 0, " "], + [10860, 0, "b"], + [10861, 0, "e"], + [10862, 0, "h"], + [10863, 0, "a"], + [10864, 0, "v"], + [10865, 0, "i"], + [10866, 0, "o"], + [10867, 0, "r"], + [10868, 0, " "], + [10869, 0, "i"], + [10870, 0, "s"], + [10871, 0, " "], + [10872, 0, "c"], + [10873, 0, "o"], + [10874, 0, "n"], + [10875, 0, "s"], + [10876, 0, "i"], + [10877, 0, "s"], + [10878, 0, "t"], + [10879, 0, "e"], + [10880, 0, "n"], + [10881, 0, "t"], + [10882, 0, " "], + [10883, 0, "w"], + [10884, 0, "i"], + [10885, 0, "t"], + [10886, 0, "h"], + [10887, 0, " "], + [10888, 0, "t"], + [10889, 0, "h"], + [10890, 0, "e"], + [10891, 0, " "], + [10892, 0, "e"], + [10893, 0, "x"], + [10894, 0, "a"], + [10895, 0, "m"], + [10896, 0, "p"], + [10897, 0, "l"], + [10898, 0, "e"], + [10899, 0, " "], + [10900, 0, "i"], + [10901, 0, "n"], + [10902, 0, " "], + [10903, 0, "F"], + [10904, 0, "i"], + [10905, 0, "g"], + [10906, 0, "u"], + [10907, 0, "r"], + [10908, 0, "e"], + [10909, 0, "~"], + [10910, 0, "\\"], + [10911, 0, "l"], + [10911, 1], + [10911, 0, "r"], + [10912, 0, "e"], + [10913, 0, "f"], + [10914, 0, "{"], + [10915, 0, "f"], + [10916, 0, "i"], + [10917, 0, "g"], + [10918, 0, ":"], + [10919, 0, "m"], + [10920, 0, "a"], + [10921, 0, "p"], + [10922, 0, "-"], + [10923, 0, "r"], + [10924, 0, "e"], + [10925, 0, "m"], + [10926, 0, "o"], + [10927, 0, "v"], + [10928, 0, "e"], + [10929, 0, "}"], + [10930, 0, ","], + [10931, 0, " "], + [10932, 0, "b"], + [10933, 0, "u"], + [10934, 0, "t"], + [10935, 0, " "], + [10936, 0, "i"], + [10937, 0, "t"], + [10938, 0, " "], + [10939, 0, "i"], + [10940, 0, "s"], + [10941, 0, " "], + [10942, 0, "p"], + [10943, 0, "e"], + [10944, 0, "r"], + [10945, 0, "h"], + [10946, 0, "a"], + [10947, 0, "p"], + [10948, 0, "s"], + [10949, 0, " "], + [10950, 0, "s"], + [10951, 0, "u"], + [10952, 0, "r"], + [10953, 0, "p"], + [10954, 0, "r"], + [10955, 0, "i"], + [10956, 0, "s"], + [10957, 0, "i"], + [10958, 0, "n"], + [10959, 0, "g"], + [10960, 0, " "], + [10961, 0, "t"], + [10962, 0, "o"], + [10963, 0, " "], + [10964, 0, "u"], + [10965, 0, "s"], + [10966, 0, "e"], + [10967, 0, "r"], + [10968, 0, "s"], + [10969, 0, "."], + [10970, 0, " "], + [10971, 0, "I"], + [10972, 0, "n"], + [10973, 0, " "], + [10974, 0, "t"], + [10975, 0, "h"], + [10976, 0, "i"], + [10977, 0, "s"], + [10978, 0, " "], + [10979, 0, "e"], + [10980, 0, "x"], + [10981, 0, "a"], + [10982, 0, "m"], + [10983, 0, "p"], + [10984, 0, "l"], + [10985, 0, "e"], + [10986, 0, " "], + [10987, 0, "i"], + [10988, 0, "t"], + [10989, 0, " "], + [10990, 0, "m"], + [10991, 0, "a"], + [10992, 0, "y"], + [10993, 0, " "], + [10994, 0, "b"], + [10995, 0, "e"], + [10996, 0, " "], + [10997, 0, "m"], + [10998, 0, "o"], + [10999, 0, "r"], + [11000, 0, "e"], + [11001, 0, " "], + [11002, 0, "d"], + [11003, 0, "e"], + [11004, 0, "s"], + [11005, 0, "i"], + [11006, 0, "r"], + [11007, 0, "a"], + [11008, 0, "b"], + [11009, 0, "l"], + [11010, 0, "e"], + [11011, 0, " "], + [11012, 0, "t"], + [11013, 0, "o"], + [11014, 0, " "], + [11015, 0, "d"], + [11016, 0, "i"], + [11017, 0, "s"], + [11018, 0, "c"], + [11019, 0, "a"], + [11020, 0, "r"], + [11021, 0, "d"], + [11022, 0, " "], + [11023, 0, "o"], + [11024, 0, "n"], + [11025, 0, "e"], + [11026, 0, " "], + [11027, 0, "o"], + [11028, 0, "f"], + [11029, 0, " "], + [11030, 0, "t"], + [11031, 0, "h"], + [11032, 0, "e"], + [11033, 0, " "], + [11034, 0, "c"], + [11035, 0, "o"], + [11036, 0, "n"], + [11037, 0, "c"], + [11038, 0, "u"], + [11039, 0, "r"], + [11040, 0, "r"], + [11041, 0, "e"], + [11042, 0, "n"], + [11043, 0, "t"], + [11044, 0, " "], + [11045, 0, "u"], + [11046, 0, "p"], + [11047, 0, "d"], + [11048, 0, "a"], + [11049, 0, "t"], + [11050, 0, "e"], + [11051, 0, "s"], + [11052, 0, ","], + [11053, 0, " "], + [11054, 0, "a"], + [11055, 0, "n"], + [11056, 0, "d"], + [11057, 0, " "], + [11058, 0, "t"], + [11059, 0, "h"], + [11060, 0, "u"], + [11061, 0, "s"], + [11062, 0, " "], + [11063, 0, "p"], + [11064, 0, "r"], + [11065, 0, "e"], + [11066, 0, "s"], + [11067, 0, "e"], + [11068, 0, "r"], + [11069, 0, "v"], + [11070, 0, "e"], + [11071, 0, " "], + [11072, 0, "t"], + [11073, 0, "h"], + [11074, 0, "e"], + [11075, 0, " "], + [11076, 0, "i"], + [11077, 0, "m"], + [11078, 0, "p"], + [11079, 0, "l"], + [11080, 0, "i"], + [11081, 0, "c"], + [11082, 0, "i"], + [11083, 0, "t"], + [11084, 0, " "], + [11085, 0, "s"], + [11086, 0, "c"], + [11087, 0, "h"], + [11088, 0, "e"], + [11089, 0, "m"], + [11090, 0, "a"], + [11091, 0, " "], + [11092, 0, "t"], + [11093, 0, "h"], + [11094, 0, "a"], + [11095, 0, "t"], + [11096, 0, " "], + [11097, 0, "a"], + [11098, 0, " "], + [11099, 0, "t"], + [11100, 0, "o"], + [11101, 0, "-"], + [11102, 0, "d"], + [11103, 0, "o"], + [11104, 0, " "], + [11105, 0, "i"], + [11106, 0, "t"], + [11107, 0, "e"], + [11108, 0, "m"], + [11109, 0, " "], + [11110, 0, "h"], + [11111, 0, "a"], + [11112, 0, "s"], + [11113, 0, " "], + [11114, 0, "b"], + [11115, 0, "o"], + [11116, 0, "t"], + [11117, 0, "h"], + [11118, 0, " "], + [11119, 0, "a"], + [11120, 0, " "], + [11121, 0, "`"], + [11122, 0, "`"], + [11123, 0, "t"], + [11124, 0, "i"], + [11125, 0, "t"], + [11126, 0, "l"], + [11127, 0, "e"], + [11128, 0, "'"], + [11129, 0, "'"], + [11130, 0, " "], + [11131, 0, "a"], + [11132, 0, "n"], + [11133, 0, "d"], + [11134, 0, " "], + [11135, 0, "a"], + [11136, 0, " "], + [11137, 0, "`"], + [11138, 0, "`"], + [11139, 0, "d"], + [11140, 0, "o"], + [11141, 0, "n"], + [11142, 0, "e"], + [11143, 0, "'"], + [11144, 0, "'"], + [11145, 0, " "], + [11146, 0, "f"], + [11147, 0, "i"], + [11148, 0, "e"], + [11149, 0, "l"], + [11150, 0, "d"], + [11151, 0, "."], + [11152, 0, "\n"], + [11153, 0, "\n"], + [11154, 0, "S"], + [11154, 1], + [11154, 0, "T"], + [11155, 0, "h"], + [11156, 0, "e"], + [11157, 0, " "], + [11158, 0, "a"], + [11159, 0, "l"], + [11160, 0, "g"], + [11161, 0, "o"], + [11162, 0, "r"], + [11163, 0, "i"], + [11164, 0, "t"], + [11165, 0, "h"], + [11166, 0, "m"], + [11167, 0, " "], + [11168, 0, "i"], + [11169, 0, "n"], + [11170, 0, " "], + [11171, 0, "t"], + [11172, 0, "h"], + [11173, 0, "i"], + [11174, 0, "s"], + [11175, 0, " "], + [11176, 0, "p"], + [11177, 0, "a"], + [11178, 0, "p"], + [11179, 0, "e"], + [11180, 0, "r"], + [11181, 0, " "], + [11182, 0, "p"], + [11183, 0, "r"], + [11184, 0, "e"], + [11185, 0, "s"], + [11186, 0, "e"], + [11187, 0, "r"], + [11188, 0, "v"], + [11189, 0, "e"], + [11190, 0, "s"], + [11191, 0, " "], + [11192, 0, "a"], + [11193, 0, "l"], + [11194, 0, "l"], + [11195, 0, " "], + [11196, 0, "o"], + [11196, 1], + [11196, 0, "u"], + [11197, 0, "s"], + [11198, 0, "e"], + [11199, 0, "r"], + [11200, 0, " "], + [11201, 0, "i"], + [11202, 0, "n"], + [11203, 0, "p"], + [11204, 0, "u"], + [11205, 0, "t"], + [11206, 0, ","], + [11207, 0, " "], + [11208, 0, "a"], + [11209, 0, "n"], + [11210, 0, "d"], + [11211, 0, " "], + [11212, 0, "s"], + [11213, 0, "o"], + [11214, 0, " "], + [11215, 0, "i"], + [11216, 0, "t"], + [11217, 0, " "], + [11218, 0, "e"], + [11219, 0, "x"], + [11220, 0, "h"], + [11221, 0, "i"], + [11222, 0, "b"], + [11223, 0, "i"], + [11224, 0, "t"], + [11225, 0, "s"], + [11226, 0, " "], + [11227, 0, "t"], + [11228, 0, "h"], + [11229, 0, "e"], + [11230, 0, " "], + [11231, 0, "b"], + [11232, 0, "e"], + [11233, 0, "h"], + [11234, 0, "a"], + [11235, 0, "v"], + [11236, 0, "i"], + [11237, 0, "o"], + [11238, 0, "r"], + [11239, 0, " "], + [11240, 0, "i"], + [11241, 0, "n"], + [11242, 0, " "], + [11242, 1], + [11241, 1], + [11240, 1], + [11240, 0, "s"], + [11241, 0, "h"], + [11242, 0, "o"], + [11243, 0, "w"], + [11244, 0, "n"], + [11245, 0, " "], + [11246, 0, "i"], + [11247, 0, "n"], + [11248, 0, " "], + [11249, 0, "F"], + [11250, 0, "i"], + [11251, 0, "g"], + [11252, 0, "u"], + [11253, 0, "r"], + [11254, 0, "e"], + [11255, 0, "~"], + [11256, 0, "\\"], + [11257, 0, "r"], + [11258, 0, "e"], + [11259, 0, "f"], + [11260, 0, "{"], + [11261, 0, "f"], + [11262, 0, "i"], + [11263, 0, "g"], + [11264, 0, ":"], + [11265, 0, "t"], + [11266, 0, "o"], + [11267, 0, "d"], + [11268, 0, "o"], + [11269, 0, "-"], + [11270, 0, "i"], + [11271, 0, "t"], + [11272, 0, "e"], + [11273, 0, "m"], + [11274, 0, "}"], + [11275, 0, "."], + [11276, 0, " "], + [11277, 0, "F"], + [11278, 0, "u"], + [11279, 0, "r"], + [11280, 0, "t"], + [11281, 0, "h"], + [11282, 0, "e"], + [11283, 0, "r"], + [11284, 0, " "], + [11285, 0, "s"], + [11286, 0, "t"], + [11287, 0, "u"], + [11288, 0, "d"], + [11289, 0, "y"], + [11290, 0, " "], + [11291, 0, "w"], + [11292, 0, "i"], + [11293, 0, "l"], + [11294, 0, "l"], + [11295, 0, " "], + [11296, 0, "b"], + [11297, 0, "e"], + [11298, 0, " "], + [11299, 0, "r"], + [11300, 0, "e"], + [11301, 0, "q"], + [11302, 0, "u"], + [11303, 0, "i"], + [11304, 0, "r"], + [11305, 0, "e"], + [11306, 0, "d"], + [11307, 0, " "], + [11308, 0, "t"], + [11309, 0, "o"], + [11310, 0, " "], + [11311, 0, "d"], + [11312, 0, "e"], + [11313, 0, "t"], + [11314, 0, "e"], + [11315, 0, "r"], + [11316, 0, "m"], + [11317, 0, "i"], + [11318, 0, "n"], + [11319, 0, "e"], + [11320, 0, " "], + [11321, 0, "t"], + [11322, 0, "o"], + [11323, 0, " "], + [11324, 0, "w"], + [11325, 0, "h"], + [11326, 0, "a"], + [11327, 0, "t"], + [11328, 0, " "], + [11329, 0, "d"], + [11330, 0, "e"], + [11331, 0, "g"], + [11332, 0, "r"], + [11333, 0, "e"], + [11334, 0, "e"], + [11335, 0, " "], + [11336, 0, "t"], + [11337, 0, "h"], + [11338, 0, "i"], + [11339, 0, "s"], + [11340, 0, " "], + [11341, 0, "b"], + [11342, 0, "e"], + [11343, 0, "h"], + [11344, 0, "a"], + [11345, 0, "v"], + [11346, 0, "i"], + [11347, 0, "o"], + [11348, 0, "r"], + [11349, 0, " "], + [11350, 0, "m"], + [11351, 0, "a"], + [11352, 0, "t"], + [11353, 0, "c"], + [11354, 0, "h"], + [11355, 0, "e"], + [11356, 0, "s"], + [11357, 0, " "], + [11358, 0, "t"], + [11359, 0, "h"], + [11360, 0, "e"], + [11361, 0, " "], + [11362, 0, "e"], + [11363, 0, "x"], + [11364, 0, "p"], + [11365, 0, "e"], + [11366, 0, "c"], + [11367, 0, "t"], + [11368, 0, "a"], + [11369, 0, "t"], + [11370, 0, "i"], + [11371, 0, "o"], + [11372, 0, "n"], + [11373, 0, "s"], + [11374, 0, " "], + [11375, 0, "o"], + [11376, 0, "f"], + [11377, 0, " "], + [11378, 0, "a"], + [11379, 0, "p"], + [11380, 0, "p"], + [11381, 0, "l"], + [11382, 0, "i"], + [11383, 0, "c"], + [11384, 0, "a"], + [11385, 0, "t"], + [11386, 0, "i"], + [11387, 0, "o"], + [11388, 0, "n"], + [11389, 0, " "], + [11390, 0, "d"], + [11391, 0, "e"], + [11392, 0, "v"], + [11393, 0, "e"], + [11394, 0, "l"], + [11395, 0, "o"], + [11396, 0, "p"], + [11397, 0, "e"], + [11398, 0, "r"], + [11399, 0, "s"], + [11400, 0, " "], + [11401, 0, "a"], + [11402, 0, "n"], + [11403, 0, "d"], + [11404, 0, " "], + [11405, 0, "u"], + [11406, 0, "s"], + [11407, 0, "e"], + [11408, 0, "r"], + [11409, 0, "s"], + [11410, 0, "."], + [5366, 0, " "], + [5367, 0, "A"], + [5368, 0, "n"], + [5369, 0, " "], + [5370, 0, "i"], + [5371, 0, "m"], + [5372, 0, "p"], + [5373, 0, "l"], + [5374, 0, "e"], + [5375, 0, "m"], + [5376, 0, "e"], + [5377, 0, "n"], + [5378, 0, "t"], + [5379, 0, "a"], + [5380, 0, "t"], + [5381, 0, "i"], + [5382, 0, "o"], + [5383, 0, "n"], + [5384, 0, " "], + [5385, 0, "m"], + [5386, 0, "a"], + [5387, 0, "y"], + [5388, 0, " "], + [5389, 0, "k"], + [5390, 0, "e"], + [5391, 0, "e"], + [5392, 0, "p"], + [5393, 0, " "], + [5394, 0, "m"], + [5395, 0, "e"], + [5396, 0, "t"], + [5397, 0, "a"], + [5398, 0, "d"], + [5399, 0, "a"], + [5400, 0, "t"], + [5401, 0, "a"], + [5402, 0, " "], + [5403, 0, "a"], + [5404, 0, "b"], + [5405, 0, "o"], + [5406, 0, "u"], + [5407, 0, "t"], + [5408, 0, " "], + [5409, 0, "t"], + [5410, 0, "h"], + [5411, 0, "e"], + [5412, 0, " "], + [5413, 0, "p"], + [5414, 0, "r"], + [5415, 0, "o"], + [5416, 0, "v"], + [5417, 0, "e"], + [5418, 0, "n"], + [5419, 0, "a"], + [5420, 0, "n"], + [5421, 0, "c"], + [5422, 0, "e"], + [5423, 0, " "], + [5424, 0, "o"], + [5425, 0, "f"], + [5426, 0, " "], + [5427, 0, "e"], + [5428, 0, "a"], + [5429, 0, "c"], + [5430, 0, "h"], + [5431, 0, " "], + [5432, 0, "v"], + [5433, 0, "a"], + [5434, 0, "l"], + [5435, 0, "u"], + [5436, 0, "e"], + [5437, 0, " "], + [5438, 0, "("], + [5439, 0, "w"], + [5440, 0, "h"], + [5441, 0, "o"], + [5442, 0, " "], + [5443, 0, "m"], + [5444, 0, "a"], + [5445, 0, "d"], + [5446, 0, "e"], + [5447, 0, " "], + [5448, 0, "t"], + [5449, 0, "h"], + [5450, 0, "e"], + [5451, 0, " "], + [5452, 0, "c"], + [5453, 0, "h"], + [5454, 0, "a"], + [5455, 0, "n"], + [5456, 0, "g"], + [5457, 0, "e"], + [5458, 0, ","], + [5459, 0, " "], + [5460, 0, "o"], + [5461, 0, "n"], + [5462, 0, " "], + [5463, 0, "w"], + [5464, 0, "h"], + [5465, 0, "i"], + [5466, 0, "c"], + [5467, 0, "h"], + [5468, 0, " "], + [5469, 0, "d"], + [5470, 0, "e"], + [5471, 0, "v"], + [5472, 0, "i"], + [5473, 0, "c"], + [5474, 0, "e"], + [5475, 0, " "], + [5476, 0, "a"], + [5477, 0, "t"], + [5478, 0, " "], + [5479, 0, "w"], + [5480, 0, "h"], + [5481, 0, "a"], + [5482, 0, "t"], + [5483, 0, " "], + [5484, 0, "t"], + [5485, 0, "i"], + [5486, 0, "m"], + [5487, 0, "e"], + [5488, 0, ")"], + [5475, 0, ","], + [5490, 0, " "], + [5491, 0, "t"], + [5492, 0, "o"], + [5493, 0, " "], + [5494, 0, "a"], + [5495, 0, "s"], + [5496, 0, "s"], + [5497, 0, "i"], + [5498, 0, "s"], + [5499, 0, "t"], + [5500, 0, " "], + [5501, 0, "u"], + [5502, 0, "s"], + [5503, 0, "e"], + [5504, 0, "r"], + [5505, 0, "s"], + [5506, 0, " "], + [5507, 0, "w"], + [5508, 0, "i"], + [5509, 0, "t"], + [5510, 0, "h"], + [5511, 0, " "], + [5512, 0, "r"], + [5513, 0, "e"], + [5514, 0, "s"], + [5515, 0, "o"], + [5516, 0, "l"], + [5517, 0, "v"], + [5518, 0, "i"], + [5519, 0, "n"], + [5520, 0, "g"], + [5521, 0, " "], + [5522, 0, "t"], + [5523, 0, "h"], + [5524, 0, "e"], + [5525, 0, " "], + [5526, 0, "c"], + [5527, 0, "o"], + [5528, 0, "n"], + [5529, 0, "f"], + [5530, 0, "l"], + [5531, 0, "i"], + [5532, 0, "c"], + [5533, 0, "t"], + [5534, 0, "."], + [5512, 0, "m"], + [5513, 0, "a"], + [5514, 0, "n"], + [5515, 0, "u"], + [5516, 0, "a"], + [5517, 0, "l"], + [5518, 0, "l"], + [5519, 0, "y"], + [5520, 0, " "], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [12996, 1], + [11590, 0, "\n"], + [11591, 0, "\n"], + [11592, 0, "\\"], + [11593, 0, "s"], + [11594, 0, "u"], + [11595, 0, "b"], + [11596, 0, "s"], + [11597, 0, "e"], + [11598, 0, "c"], + [11599, 0, "t"], + [11600, 0, "i"], + [11601, 0, "o"], + [11602, 0, "n"], + [11603, 0, "{"], + [11604, 0, "D"], + [11605, 0, "o"], + [11606, 0, "c"], + [11607, 0, "u"], + [11608, 0, "m"], + [11609, 0, "e"], + [11610, 0, "n"], + [11611, 0, "t"], + [11612, 0, " "], + [11613, 0, "e"], + [11614, 0, "d"], + [11615, 0, "i"], + [11616, 0, "t"], + [11617, 0, "i"], + [11618, 0, "n"], + [11619, 0, "g"], + [11620, 0, " "], + [11621, 0, "A"], + [11622, 0, "P"], + [11623, 0, "I"], + [11624, 0, "}"], + [11625, 0, "\n"], + [11590, 0, "\n"], + [11591, 0, "\\"], + [11592, 0, "s"], + [11593, 0, "u"], + [11594, 0, "b"], + [11595, 0, "s"], + [11596, 0, "e"], + [11597, 0, "c"], + [11598, 0, "t"], + [11599, 0, "i"], + [11600, 0, "o"], + [11601, 0, "n"], + [11602, 0, "{"], + [11603, 0, "J"], + [11604, 0, "S"], + [11605, 0, "O"], + [11606, 0, "N"], + [11607, 0, " "], + [11608, 0, "v"], + [11609, 0, "e"], + [11610, 0, "r"], + [11611, 0, "s"], + [11612, 0, "u"], + [11613, 0, "s"], + [11614, 0, " "], + [11615, 0, "o"], + [11616, 0, "t"], + [11617, 0, "h"], + [11618, 0, "e"], + [11619, 0, "r"], + [11620, 0, " "], + [11621, 0, "m"], + [11622, 0, "o"], + [11623, 0, "d"], + [11624, 0, "e"], + [11625, 0, "l"], + [11626, 0, "s"], + [11627, 0, "}"], + [11628, 0, "\n"], + [11629, 0, "\n"], + [11630, 0, "T"], + [11631, 0, "h"], + [11632, 0, "e"], + [11633, 0, " "], + [11634, 0, "m"], + [11635, 0, "o"], + [11636, 0, "s"], + [11637, 0, "t"], + [11638, 0, " "], + [11639, 0, "c"], + [11640, 0, "o"], + [11641, 0, "m"], + [11642, 0, "m"], + [11643, 0, "o"], + [11644, 0, "n"], + [11645, 0, " "], + [11646, 0, "a"], + [11647, 0, "l"], + [11648, 0, "t"], + [11649, 0, "e"], + [11650, 0, "r"], + [11651, 0, "n"], + [11652, 0, "a"], + [11653, 0, "t"], + [11654, 0, "i"], + [11655, 0, "v"], + [11656, 0, "e"], + [11657, 0, " "], + [11658, 0, "t"], + [11659, 0, "o"], + [11660, 0, " "], + [11661, 0, "J"], + [11662, 0, "S"], + [11663, 0, "O"], + [11664, 0, "N"], + [11665, 0, " "], + [11666, 0, "i"], + [11667, 0, "s"], + [11668, 0, " "], + [11669, 0, "X"], + [11670, 0, "M"], + [11671, 0, "L"], + [11672, 0, ","], + [11673, 0, " "], + [11674, 0, "a"], + [11675, 0, "n"], + [11676, 0, "d"], + [11677, 0, " "], + [11678, 0, "c"], + [11679, 0, "o"], + [11680, 0, "l"], + [11681, 0, "l"], + [11682, 0, "a"], + [11683, 0, "b"], + [11684, 0, "o"], + [11685, 0, "r"], + [11686, 0, "a"], + [11687, 0, "t"], + [11688, 0, "i"], + [11689, 0, "v"], + [11690, 0, "e"], + [11691, 0, " "], + [11692, 0, "e"], + [11693, 0, "d"], + [11694, 0, "i"], + [11695, 0, "t"], + [11696, 0, "i"], + [11697, 0, "n"], + [11698, 0, "g"], + [11699, 0, " "], + [11700, 0, "o"], + [11701, 0, "f"], + [11702, 0, " "], + [11703, 0, "X"], + [11704, 0, "M"], + [11705, 0, "L"], + [11706, 0, " "], + [11707, 0, "d"], + [11708, 0, "o"], + [11709, 0, "c"], + [11710, 0, "u"], + [11711, 0, "m"], + [11712, 0, "e"], + [11713, 0, "n"], + [11714, 0, "t"], + [11715, 0, "s"], + [11716, 0, " "], + [11717, 0, "h"], + [11718, 0, "a"], + [11719, 0, "s"], + [11720, 0, " "], + [11721, 0, "b"], + [11722, 0, "e"], + [11723, 0, "e"], + [11724, 0, "n"], + [11725, 0, " "], + [11726, 0, "e"], + [11727, 0, "x"], + [11728, 0, "t"], + [11729, 0, "e"], + [11730, 0, "n"], + [11731, 0, "s"], + [11732, 0, "i"], + [11733, 0, "v"], + [11734, 0, "e"], + [11735, 0, "l"], + [11736, 0, "y"], + [11737, 0, " "], + [11738, 0, "s"], + [11739, 0, "t"], + [11740, 0, "u"], + [11741, 0, "d"], + [11742, 0, "i"], + [11743, 0, "e"], + [11744, 0, "d"], + [11745, 0, "."], + [11746, 0, " "], + [11746, 1], + [11745, 1], + [11745, 0, " "], + [11746, 0, "("], + [11747, 0, "I"], + [11748, 0, "g"], + [11749, 0, "n"], + [11750, 0, "a"], + [11751, 0, "t"], + [11752, 0, " "], + [11753, 0, "a"], + [11754, 0, "n"], + [11755, 0, "d"], + [11756, 0, " "], + [11757, 0, "N"], + [11758, 0, "o"], + [11759, 0, "r"], + [11760, 0, "r"], + [11761, 0, "i"], + [11762, 0, "e"], + [11763, 0, ","], + [11764, 0, " "], + [11765, 0, "2"], + [11766, 0, "0"], + [11767, 0, "3"], + [11768, 0, ")"], + [11769, 0, "."], + [11767, 0, "0"], + [11736, 1], + [11735, 1], + [11734, 1], + [11733, 1], + [11732, 1], + [11731, 1], + [11730, 1], + [11729, 1], + [11728, 1], + [11727, 1], + [11726, 1], + [11726, 0, "p"], + [11727, 0, "r"], + [11728, 0, "e"], + [11729, 0, "v"], + [11730, 0, "i"], + [11731, 0, "o"], + [11732, 0, "u"], + [11733, 0, "s"], + [11734, 0, "l"], + [11735, 0, "y"], + [11770, 0, " "], + [11615, 0, "X"], + [11616, 0, "M"], + [11617, 0, "L"], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11618, 1], + [11762, 0, "A"], + [11763, 0, "l"], + [11764, 0, "t"], + [11765, 0, "h"], + [11766, 0, "o"], + [11767, 0, "u"], + [11768, 0, "g"], + [11769, 0, "h"], + [11770, 0, " "], + [11771, 0, "t"], + [11772, 0, "h"], + [11773, 0, "e"], + [11774, 0, " "], + [11775, 0, "t"], + [11776, 0, "r"], + [11777, 0, "e"], + [11778, 0, "e"], + [11779, 0, " "], + [11780, 0, "s"], + [11781, 0, "t"], + [11782, 0, "r"], + [11783, 0, "u"], + [11784, 0, "c"], + [11785, 0, "t"], + [11786, 0, "u"], + [11787, 0, "r"], + [11788, 0, "e"], + [11762, 0, "B"], + [11763, 0, "e"], + [11764, 0, "s"], + [11765, 0, "i"], + [11766, 0, "d"], + [11767, 0, "e"], + [11768, 0, "s"], + [11769, 0, " "], + [11770, 0, "t"], + [11771, 0, "h"], + [11772, 0, "e"], + [11773, 0, " "], + [11774, 0, "s"], + [11775, 0, "u"], + [11776, 0, "p"], + [11777, 0, "e"], + [11778, 0, "r"], + [11779, 0, "f"], + [11780, 0, "i"], + [11781, 0, "c"], + [11782, 0, "i"], + [11783, 0, "a"], + [11784, 0, "l"], + [11785, 0, " "], + [11786, 0, "s"], + [11787, 0, "y"], + [11788, 0, "n"], + [11789, 0, "t"], + [11790, 0, "a"], + [11791, 0, "t"], + [11791, 1], + [11791, 0, "c"], + [11792, 0, "t"], + [11793, 0, "i"], + [11794, 0, "c"], + [11795, 0, "a"], + [11796, 0, "l"], + [11797, 0, " "], + [11798, 0, "d"], + [11799, 0, "i"], + [11800, 0, "f"], + [11801, 0, "f"], + [11802, 0, "e"], + [11803, 0, "r"], + [11804, 0, "e"], + [11805, 0, "n"], + [11806, 0, "c"], + [11807, 0, "e"], + [11808, 0, "s"], + [11809, 0, ","], + [11810, 0, " "], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11811, 1], + [11829, 0, " "], + [11830, 0, "o"], + [11831, 0, "f"], + [11832, 0, " "], + [11833, 0, "X"], + [11834, 0, "M"], + [11835, 0, "L"], + [11836, 0, " "], + [11837, 0, "a"], + [11838, 0, "n"], + [11839, 0, "d"], + [11840, 0, " "], + [11841, 0, "J"], + [11842, 0, "S"], + [11843, 0, "O"], + [11844, 0, "N"], + [11845, 0, " "], + [11846, 0, "a"], + [11847, 0, "p"], + [11848, 0, "p"], + [11849, 0, "e"], + [11850, 0, "a"], + [11851, 0, "r"], + [11852, 0, "s"], + [11853, 0, " "], + [11854, 0, "q"], + [11855, 0, "u"], + [11856, 0, "i"], + [11857, 0, "t"], + [11858, 0, "e"], + [11859, 0, " "], + [11860, 0, "s"], + [11861, 0, "i"], + [11862, 0, "m"], + [11863, 0, "i"], + [11864, 0, "l"], + [11865, 0, "a"], + [11866, 0, "r"], + [11867, 0, "."], + [11868, 0, " "], + [11869, 0, "H"], + [11870, 0, "o"], + [11871, 0, "w"], + [11872, 0, "e"], + [11873, 0, "v"], + [11874, 0, "e"], + [11875, 0, "r"], + [11876, 0, ","], + [11877, 0, " "], + [11878, 0, "t"], + [11879, 0, "h"], + [11880, 0, "e"], + [11881, 0, "r"], + [11882, 0, "e"], + [11883, 0, " "], + [11884, 0, "i"], + [11885, 0, "s"], + [11886, 0, " "], + [11887, 0, "a"], + [11888, 0, "n"], + [11889, 0, " "], + [11890, 0, "i"], + [11891, 0, "m"], + [11892, 0, "p"], + [11893, 0, "o"], + [11894, 0, "r"], + [11895, 0, "t"], + [11896, 0, "a"], + [11897, 0, "n"], + [11898, 0, "t"], + [11899, 0, " "], + [11900, 0, "d"], + [11901, 0, "i"], + [11902, 0, "f"], + [11903, 0, "f"], + [11904, 0, "e"], + [11905, 0, "r"], + [11906, 0, "e"], + [11907, 0, "n"], + [11908, 0, "c"], + [11909, 0, "e"], + [11910, 0, " "], + [11911, 0, "t"], + [11912, 0, "h"], + [11913, 0, "a"], + [11914, 0, "t"], + [11915, 0, " "], + [11916, 0, "w"], + [11917, 0, "e"], + [11918, 0, " "], + [11919, 0, "s"], + [11920, 0, "h"], + [11921, 0, "o"], + [11922, 0, "u"], + [11923, 0, "l"], + [11924, 0, "d"], + [11925, 0, " "], + [11926, 0, "h"], + [11927, 0, "i"], + [11928, 0, "g"], + [11929, 0, "h"], + [11930, 0, "l"], + [11931, 0, "i"], + [11932, 0, "g"], + [11933, 0, "h"], + [11934, 0, "t"], + [11935, 0, "."], + [11936, 0, "\n"], + [11937, 0, "\n"], + [11938, 0, "J"], + [11939, 0, "S"], + [11940, 0, "O"], + [11941, 0, "N"], + [11942, 0, " "], + [11943, 0, "h"], + [11944, 0, "a"], + [11945, 0, "s"], + [11946, 0, " "], + [11947, 0, "t"], + [11948, 0, "w"], + [11949, 0, "o"], + [11950, 0, " "], + [11951, 0, "c"], + [11952, 0, "o"], + [11953, 0, "l"], + [11954, 0, "l"], + [11955, 0, "e"], + [11956, 0, "c"], + [11957, 0, "t"], + [11958, 0, "i"], + [11959, 0, "o"], + [11960, 0, "n"], + [11961, 0, " "], + [11962, 0, "c"], + [11963, 0, "o"], + [11964, 0, "n"], + [11965, 0, "s"], + [11966, 0, "t"], + [11967, 0, "r"], + [11968, 0, "u"], + [11969, 0, "c"], + [11970, 0, "t"], + [11971, 0, "s"], + [11972, 0, ":"], + [11973, 0, " "], + [11974, 0, "m"], + [11975, 0, "a"], + [11976, 0, "p"], + [11977, 0, "s"], + [11978, 0, " "], + [11979, 0, "f"], + [11980, 0, "o"], + [11981, 0, "r"], + [11982, 0, " "], + [11983, 0, "u"], + [11984, 0, "n"], + [11985, 0, "o"], + [11986, 0, "r"], + [11987, 0, "d"], + [11988, 0, "e"], + [11989, 0, "r"], + [11990, 0, "e"], + [11991, 0, "d"], + [11992, 0, " "], + [11993, 0, "k"], + [11994, 0, "e"], + [11995, 0, "y"], + [11996, 0, "-"], + [11997, 0, "v"], + [11998, 0, "a"], + [11999, 0, "l"], + [12000, 0, "u"], + [12001, 0, "e"], + [12002, 0, " "], + [12003, 0, "p"], + [12004, 0, "a"], + [12005, 0, "i"], + [12006, 0, "r"], + [12007, 0, "s"], + [12008, 0, ","], + [12009, 0, " "], + [12010, 0, "a"], + [12011, 0, "n"], + [12012, 0, "d"], + [12013, 0, " "], + [12014, 0, "l"], + [12015, 0, "i"], + [12016, 0, "s"], + [12017, 0, "t"], + [12018, 0, "s"], + [12019, 0, " "], + [12020, 0, "f"], + [12021, 0, "o"], + [12022, 0, "r"], + [12023, 0, " "], + [12024, 0, "o"], + [12025, 0, "r"], + [12026, 0, "d"], + [12027, 0, "e"], + [12028, 0, "r"], + [12029, 0, "e"], + [12030, 0, "d"], + [12031, 0, " "], + [12032, 0, "s"], + [12033, 0, "e"], + [12034, 0, "q"], + [12035, 0, "u"], + [12036, 0, "e"], + [12037, 0, "n"], + [12038, 0, "c"], + [12039, 0, "e"], + [12040, 0, "s"], + [12041, 0, "."], + [12042, 0, " "], + [11972, 0, " "], + [11973, 0, "t"], + [11974, 0, "h"], + [11975, 0, "a"], + [11976, 0, "t"], + [11977, 0, " "], + [11978, 0, "c"], + [11979, 0, "a"], + [11980, 0, "n"], + [11981, 0, " "], + [11982, 0, "b"], + [11983, 0, "e"], + [11984, 0, " "], + [11985, 0, "a"], + [11986, 0, "r"], + [11987, 0, "b"], + [11988, 0, "i"], + [11989, 0, "t"], + [11990, 0, "r"], + [11991, 0, "a"], + [11992, 0, "r"], + [11993, 0, "i"], + [11994, 0, "l"], + [11995, 0, "y"], + [11996, 0, " "], + [11997, 0, "n"], + [11998, 0, "e"], + [11999, 0, "s"], + [12000, 0, "t"], + [12001, 0, "e"], + [12002, 0, "d"], + [12074, 0, "X"], + [12075, 0, "M"], + [12076, 0, "L"], + [12077, 0, " "], + [12078, 0, "i"], + [12079, 0, "s"], + [12080, 0, " "], + [12081, 0, "m"], + [12082, 0, "o"], + [12083, 0, "r"], + [12084, 0, "e"], + [12085, 0, " "], + [12086, 0, "r"], + [12087, 0, "e"], + [12088, 0, "s"], + [12089, 0, "t"], + [12090, 0, "r"], + [12091, 0, "i"], + [12092, 0, "c"], + [12093, 0, "t"], + [12094, 0, "e"], + [12095, 0, "d"], + [12096, 0, " "], + [12097, 0, "i"], + [12098, 0, "n"], + [12099, 0, " "], + [12100, 0, "t"], + [12101, 0, "h"], + [12102, 0, "i"], + [12103, 0, "s"], + [12104, 0, " "], + [12105, 0, "r"], + [12106, 0, "e"], + [12107, 0, "g"], + [12108, 0, "a"], + [12109, 0, "r"], + [12110, 0, "d"], + [12111, 0, ":"], + [12112, 0, " "], + [12113, 0, "t"], + [12114, 0, "h"], + [12115, 0, "e"], + [12116, 0, " "], + [12117, 0, "c"], + [12118, 0, "h"], + [12119, 0, "i"], + [12120, 0, "l"], + [12121, 0, "d"], + [12122, 0, "r"], + [12123, 0, "e"], + [12124, 0, "n"], + [12125, 0, " "], + [12126, 0, "o"], + [12127, 0, "f"], + [12128, 0, " "], + [12129, 0, "a"], + [12130, 0, "n"], + [12131, 0, " "], + [12132, 0, "e"], + [12133, 0, "l"], + [12134, 0, "e"], + [12135, 0, "m"], + [12136, 0, "e"], + [12137, 0, "n"], + [12138, 0, "t"], + [12139, 0, " "], + [12140, 0, "a"], + [12141, 0, "r"], + [12142, 0, "e"], + [12143, 0, " "], + [12144, 0, "a"], + [12144, 1], + [12143, 1], + [12142, 1], + [12141, 1], + [12140, 1], + [12140, 0, "f"], + [12141, 0, "o"], + [12142, 0, "r"], + [12143, 0, "m"], + [12144, 0, " "], + [12145, 0, "a"], + [12146, 0, "n"], + [12147, 0, " "], + [12148, 0, "o"], + [12149, 0, "r"], + [12150, 0, "d"], + [12151, 0, "e"], + [12152, 0, "r"], + [12153, 0, "e"], + [12154, 0, "d"], + [12155, 0, " "], + [12156, 0, "s"], + [12157, 0, "e"], + [12158, 0, "q"], + [12159, 0, "u"], + [12160, 0, "e"], + [12161, 0, "n"], + [12162, 0, "c"], + [12163, 0, "e"], + [12148, 0, "b"], + [12149, 0, "b"], + [12150, 0, "b"], + [12151, 0, "b"], + [12152, 0, "b"], + [12153, 0, "b"], + [12153, 1], + [12152, 1], + [12151, 1], + [12150, 1], + [12149, 1], + [12148, 1], + [12111, 1], + [12110, 1], + [12109, 1], + [12108, 1], + [12107, 1], + [12106, 1], + [12105, 1], + [12104, 1], + [12103, 1], + [12102, 1], + [12101, 1], + [12100, 1], + [12099, 1], + [12098, 1], + [12097, 1], + [12096, 1], + [12095, 1], + [12094, 1], + [12093, 1], + [12092, 1], + [12091, 1], + [12090, 1], + [12089, 1], + [12088, 1], + [12087, 1], + [12086, 1], + [12085, 1], + [12084, 1], + [12083, 1], + [12082, 1], + [12081, 1], + [12080, 1], + [12079, 1], + [12078, 1], + [12077, 1], + [12076, 1], + [12076, 0, "L"], + [12077, 0, ","], + [12074, 0, "I"], + [12075, 0, "n"], + [12076, 0, " "], + [12133, 0, ","], + [12134, 0, " "], + [12135, 0, "w"], + [12136, 0, "h"], + [12137, 0, "i"], + [12138, 0, "l"], + [12139, 0, "e"], + [12140, 0, " "], + [12141, 0, "t"], + [12142, 0, "h"], + [12143, 0, "e"], + [12144, 0, " "], + [12145, 0, "a"], + [12146, 0, "t"], + [12147, 0, "t"], + [12148, 0, "r"], + [12149, 0, "i"], + [12150, 0, "b"], + [12151, 0, "u"], + [12152, 0, "t"], + [12153, 0, "e"], + [12154, 0, "s"], + [12155, 0, " "], + [12156, 0, "o"], + [12157, 0, "f"], + [12158, 0, " "], + [12159, 0, "a"], + [12160, 0, "n"], + [12161, 0, " "], + [12162, 0, "e"], + [12163, 0, "l"], + [12164, 0, "e"], + [12165, 0, "m"], + [12166, 0, "e"], + [12167, 0, "n"], + [12168, 0, "t"], + [12169, 0, " "], + [12170, 0, "a"], + [12171, 0, "r"], + [12172, 0, "e"], + [12173, 0, " "], + [12174, 0, "u"], + [12175, 0, "n"], + [12176, 0, "o"], + [12177, 0, "r"], + [12178, 0, "d"], + [12179, 0, "e"], + [12180, 0, "r"], + [12181, 0, "e"], + [12182, 0, "d"], + [12183, 0, " "], + [12184, 0, "k"], + [12185, 0, "e"], + [12186, 0, "y"], + [12187, 0, "-"], + [12188, 0, "v"], + [12189, 0, "a"], + [12190, 0, "l"], + [12191, 0, "u"], + [12192, 0, "e"], + [12193, 0, " "], + [12194, 0, "p"], + [12195, 0, "a"], + [12196, 0, "i"], + [12197, 0, "r"], + [12198, 0, "s"], + [12199, 0, "."], + [12200, 0, " "], + [12201, 0, "H"], + [12202, 0, "o"], + [12203, 0, "w"], + [12204, 0, "e"], + [12205, 0, "v"], + [12206, 0, "e"], + [12207, 0, "r"], + [12208, 0, ","], + [12209, 0, " "], + [12210, 0, "i"], + [12211, 0, "n"], + [12212, 0, " "], + [12213, 0, "X"], + [12214, 0, "M"], + [12215, 0, "L"], + [12215, 1], + [12214, 1], + [12213, 1], + [12212, 1], + [12211, 1], + [12210, 1], + [12210, 0, "X"], + [12211, 0, "M"], + [12212, 0, "L"], + [12213, 0, " "], + [12214, 0, "d"], + [12215, 0, "o"], + [12216, 0, "e"], + [12217, 0, "s"], + [12218, 0, " "], + [12219, 0, "n"], + [12220, 0, "o"], + [12221, 0, "t"], + [12222, 0, " "], + [12223, 0, "a"], + [12224, 0, "l"], + [12225, 0, "l"], + [12226, 0, "o"], + [12227, 0, "w"], + [12228, 0, " "], + [12229, 0, "n"], + [12230, 0, "e"], + [12231, 0, "s"], + [12232, 0, "t"], + [12233, 0, "e"], + [12234, 0, "d"], + [12235, 0, " "], + [12236, 0, "c"], + [12237, 0, "h"], + [12237, 1], + [12236, 1], + [12236, 0, "e"], + [12237, 0, "l"], + [12238, 0, "e"], + [12239, 0, "m"], + [12240, 0, "e"], + [12241, 0, "n"], + [12242, 0, "t"], + [12243, 0, "s"], + [12244, 0, " "], + [12245, 0, "i"], + [12246, 0, "n"], + [12247, 0, "s"], + [12248, 0, "i"], + [12249, 0, "d"], + [12250, 0, "e"], + [12251, 0, " "], + [12252, 0, "a"], + [12253, 0, "t"], + [12254, 0, "t"], + [12255, 0, "r"], + [12256, 0, "i"], + [12257, 0, "b"], + [12258, 0, "u"], + [12259, 0, "t"], + [12260, 0, "e"], + [12261, 0, "s"], + [12262, 0, " "], + [12263, 0, "-"], + [12264, 0, "-"], + [12265, 0, " "], + [12266, 0, "t"], + [12267, 0, "h"], + [12268, 0, "e"], + [12269, 0, " "], + [12270, 0, "v"], + [12271, 0, "a"], + [12272, 0, "l"], + [12273, 0, "u"], + [12274, 0, "e"], + [12275, 0, " "], + [12276, 0, "o"], + [12277, 0, "f"], + [12278, 0, " "], + [12279, 0, "a"], + [12280, 0, "n"], + [12281, 0, " "], + [12282, 0, "a"], + [12283, 0, "t"], + [12284, 0, "t"], + [12285, 0, "r"], + [12286, 0, "i"], + [12287, 0, "b"], + [12288, 0, "u"], + [12289, 0, "t"], + [12290, 0, "e"], + [12291, 0, " "], + [12292, 0, "c"], + [12293, 0, "a"], + [12294, 0, "n"], + [12295, 0, " "], + [12296, 0, "o"], + [12297, 0, "n"], + [12298, 0, "l"], + [12299, 0, "y"], + [12300, 0, " "], + [12301, 0, "b"], + [12302, 0, "e"], + [12303, 0, " "], + [12304, 0, "a"], + [12305, 0, " "], + [12306, 0, "p"], + [12307, 0, "r"], + [12308, 0, "i"], + [12309, 0, "m"], + [12310, 0, "i"], + [12311, 0, "t"], + [12312, 0, "i"], + [12313, 0, "v"], + [12314, 0, "e"], + [12315, 0, " "], + [12316, 0, "d"], + [12317, 0, "a"], + [12318, 0, "t"], + [12319, 0, "a"], + [12320, 0, "t"], + [12321, 0, "y"], + [12322, 0, "p"], + [12323, 0, "e"], + [12324, 0, "."], + [12325, 0, " "], + [12326, 0, "T"], + [12327, 0, "h"], + [12328, 0, "u"], + [12329, 0, "s"], + [12330, 0, ","], + [12331, 0, " "], + [12332, 0, "X"], + [12333, 0, "M"], + [12334, 0, "l"], + [12335, 0, " "], + [12336, 0, "s"], + [12337, 0, "u"], + [12338, 0, "p"], + [12339, 0, "p"], + [12340, 0, "o"], + [12341, 0, "r"], + [12342, 0, "t"], + [12343, 0, "s"], + [12344, 0, " "], + [12334, 1], + [12334, 0, "L"], + [12345, 0, "m"], + [12346, 0, "a"], + [12347, 0, "p"], + [12348, 0, "s"], + [12349, 0, " "], + [12350, 0, "w"], + [12351, 0, "i"], + [12352, 0, "t"], + [12353, 0, "h"], + [12354, 0, "i"], + [12355, 0, "n"], + [12356, 0, " "], + [12357, 0, "l"], + [12358, 0, "i"], + [12359, 0, "s"], + [12360, 0, "t"], + [12361, 0, "s"], + [12362, 0, ","], + [12363, 0, " "], + [12364, 0, "b"], + [12365, 0, "u"], + [12366, 0, "t"], + [12367, 0, " "], + [12368, 0, "n"], + [12369, 0, "o"], + [12370, 0, "t"], + [12371, 0, " "], + [12372, 0, "l"], + [12373, 0, "i"], + [12374, 0, "s"], + [12375, 0, "t"], + [12376, 0, "s"], + [12377, 0, " "], + [12378, 0, "w"], + [12379, 0, "i"], + [12380, 0, "t"], + [12381, 0, "h"], + [12382, 0, "i"], + [12383, 0, "n"], + [12384, 0, " "], + [12385, 0, "m"], + [12386, 0, "a"], + [12387, 0, "p"], + [12388, 0, "s"], + [12389, 0, "."], + [12390, 0, "\n"], + [12391, 0, "\n"], + [12392, 0, "S"], + [12377, 0, " "], + [12378, 0, "o"], + [12379, 0, "r"], + [12380, 0, " "], + [12381, 0, "m"], + [12382, 0, "a"], + [12383, 0, "p"], + [12384, 0, "s"], + [12392, 0, " "], + [12393, 0, "o"], + [12394, 0, "t"], + [12395, 0, "h"], + [12396, 0, "e"], + [12397, 0, "r"], + [12404, 0, " "], + [12405, 0, "T"], + [12406, 0, "h"], + [12407, 0, "e"], + [12408, 0, " "], + [12409, 0, "e"], + [12410, 0, "x"], + [12411, 0, "a"], + [12412, 0, "m"], + [12413, 0, "p"], + [12414, 0, "l"], + [12415, 0, "e"], + [12416, 0, " "], + [12417, 0, "i"], + [12418, 0, "n"], + [12419, 0, " "], + [12420, 0, "F"], + [12421, 0, "i"], + [12422, 0, "g"], + [12423, 0, "u"], + [12424, 0, "r"], + [12425, 0, "e"], + [12426, 0, "~"], + [12427, 0, "\\"], + [12428, 0, "r"], + [12429, 0, "e"], + [12430, 0, "f"], + [12431, 0, "{"], + [12432, 0, "f"], + [12433, 0, "i"], + [12434, 0, "g"], + [12435, 0, ":"], + [12436, 0, "t"], + [12437, 0, "w"], + [12438, 0, "o"], + [12439, 0, "-"], + [12440, 0, "l"], + [12441, 0, "i"], + [12442, 0, "s"], + [12443, 0, "t"], + [12444, 0, "s"], + [12445, 0, "}"], + [12446, 0, " "], + [12447, 0, "c"], + [12448, 0, "a"], + [12449, 0, "n"], + [12450, 0, "n"], + [12451, 0, "o"], + [12452, 0, "t"], + [12453, 0, " "], + [12454, 0, "o"], + [12455, 0, "c"], + [12456, 0, "c"], + [12457, 0, "u"], + [12458, 0, "r"], + [12459, 0, " "], + [12460, 0, "i"], + [12461, 0, "n"], + [12462, 0, " "], + [12463, 0, "X"], + [12464, 0, "M"], + [12465, 0, "L"], + [12466, 0, " "], + [12467, 0, "f"], + [12468, 0, "o"], + [12469, 0, "r"], + [12470, 0, " "], + [12471, 0, "t"], + [12472, 0, "h"], + [12473, 0, "i"], + [12474, 0, "s"], + [12475, 0, " "], + [12476, 0, "r"], + [12477, 0, "e"], + [12478, 0, "a"], + [12479, 0, "s"], + [12480, 0, "o"], + [12481, 0, "n"], + [12405, 0, "T"], + [12406, 0, "h"], + [12407, 0, "i"], + [12408, 0, "s"], + [12409, 0, " "], + [12409, 1], + [12408, 1], + [12407, 1], + [12406, 1], + [12405, 1], + [12404, 1], + [12404, 0, " "], + [12405, 0, "I"], + [12406, 0, "n"], + [12407, 0, " "], + [12408, 0, "t"], + [12409, 0, "h"], + [12410, 0, "i"], + [12411, 0, "s"], + [12412, 0, " "], + [12413, 0, "r"], + [12414, 0, "e"], + [12415, 0, "g"], + [12416, 0, "a"], + [12417, 0, "r"], + [12418, 0, "d"], + [12419, 0, ","], + [12420, 0, " "], + [12421, 0, "X"], + [12422, 0, "M"], + [12423, 0, "L"], + [12424, 0, " "], + [12425, 0, "i"], + [12426, 0, "s"], + [12427, 0, " "], + [12428, 0, "m"], + [12429, 0, "o"], + [12430, 0, "r"], + [12431, 0, "e"], + [12432, 0, " "], + [12433, 0, "r"], + [12434, 0, "e"], + [12435, 0, "s"], + [12436, 0, "t"], + [12437, 0, "r"], + [12438, 0, "i"], + [12438, 1], + [12437, 1], + [12436, 1], + [12435, 1], + [12434, 1], + [12433, 1], + [12432, 1], + [12431, 1], + [12430, 1], + [12429, 1], + [12428, 1], + [12428, 0, "l"], + [12429, 0, "e"], + [12430, 0, "s"], + [12431, 0, "s"], + [12432, 0, " "], + [12433, 0, "e"], + [12434, 0, "x"], + [12435, 0, "p"], + [12436, 0, "r"], + [12437, 0, "e"], + [12438, 0, "s"], + [12439, 0, "s"], + [12440, 0, "i"], + [12441, 0, "v"], + [12442, 0, "e"], + [12443, 0, " "], + [12444, 0, "t"], + [12445, 0, "h"], + [12446, 0, "a"], + [12447, 0, "n"], + [12448, 0, " "], + [12449, 0, "J"], + [12450, 0, "S"], + [12451, 0, "O"], + [12452, 0, "N"], + [12453, 0, ":"], + [12454, 0, " "], + [12455, 1], + [12455, 0, "t"], + [12516, 0, "."], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12517, 1], + [12520, 0, "o"], + [12521, 0, "m"], + [12522, 0, "e"], + [12523, 0, " "], + [12524, 0, "a"], + [12525, 0, "p"], + [12526, 0, "p"], + [12527, 0, "l"], + [12528, 0, "i"], + [12529, 0, "c"], + [12530, 0, "a"], + [12531, 0, "t"], + [12532, 0, "i"], + [12533, 0, "o"], + [12534, 0, "n"], + [12535, 0, "s"], + [12536, 0, " "], + [12537, 0, "m"], + [12538, 0, "a"], + [12539, 0, "y"], + [12540, 0, " "], + [12541, 0, "a"], + [12542, 0, "t"], + [12543, 0, "t"], + [12544, 0, "a"], + [12545, 0, "c"], + [12546, 0, "h"], + [12547, 0, " "], + [12548, 0, "m"], + [12549, 0, "a"], + [12550, 0, "p"], + [12551, 0, "-"], + [12552, 0, "l"], + [12553, 0, "i"], + [12554, 0, "k"], + [12555, 0, "e"], + [12556, 0, " "], + [12557, 0, "s"], + [12558, 0, "e"], + [12559, 0, "m"], + [12560, 0, "a"], + [12561, 0, "n"], + [12562, 0, "t"], + [12563, 0, "i"], + [12564, 0, "c"], + [12565, 0, "s"], + [12566, 0, " "], + [12567, 0, "t"], + [12568, 0, "o"], + [12569, 0, " "], + [12570, 0, "t"], + [12571, 0, "h"], + [12572, 0, "e"], + [12573, 0, " "], + [12574, 0, "c"], + [12575, 0, "h"], + [12576, 0, "i"], + [12577, 0, "l"], + [12578, 0, "d"], + [12579, 0, "r"], + [12580, 0, "e"], + [12581, 0, "n"], + [12582, 0, " "], + [12583, 0, "o"], + [12584, 0, "f"], + [12585, 0, " "], + [12586, 0, "a"], + [12587, 0, "n"], + [12588, 0, " "], + [12589, 0, "X"], + [12590, 0, "M"], + [12591, 0, "L"], + [12592, 0, " "], + [12593, 0, "d"], + [12594, 0, "o"], + [12595, 0, "c"], + [12596, 0, "u"], + [12597, 0, "m"], + [12598, 0, "e"], + [12599, 0, "n"], + [12600, 0, "t"], + [12516, 0, ","], + [12517, 0, " "], + [12518, 0, "a"], + [12519, 0, "s"], + [12520, 0, " "], + [12521, 0, "i"], + [12522, 0, "t"], + [12523, 0, " "], + [12524, 0, "w"], + [12525, 0, "o"], + [12526, 0, "u"], + [12527, 0, "l"], + [12528, 0, "d"], + [12529, 0, " "], + [12530, 0, "r"], + [12531, 0, "e"], + [12532, 0, "s"], + [12533, 0, "u"], + [12534, 0, "l"], + [12535, 0, "t"], + [12536, 0, " "], + [12537, 0, "i"], + [12538, 0, "n"], + [12539, 0, " "], + [12540, 0, "t"], + [12541, 0, "w"], + [12542, 0, "o"], + [12543, 0, " "], + [12544, 0, "s"], + [12545, 0, "e"], + [12546, 0, "p"], + [12547, 0, "a"], + [12548, 0, "r"], + [12549, 0, "a"], + [12550, 0, "t"], + [12551, 0, "e"], + [12552, 0, " "], + [12553, 0, "l"], + [12554, 0, "i"], + [12555, 0, "s"], + [12556, 0, "t"], + [12557, 0, "s"], + [12558, 0, " "], + [12559, 0, "r"], + [12560, 0, "a"], + [12561, 0, "t"], + [12562, 0, "h"], + [12563, 0, "e"], + [12564, 0, "r"], + [12565, 0, " "], + [12566, 0, "t"], + [12567, 0, "h"], + [12568, 0, "a"], + [12569, 0, "n"], + [12570, 0, " "], + [12571, 0, "o"], + [12572, 0, "n"], + [12573, 0, "e"], + [12574, 0, " "], + [12575, 0, "m"], + [12576, 0, "e"], + [12577, 0, "r"], + [12578, 0, "g"], + [12579, 0, "e"], + [12580, 0, "d"], + [12581, 0, " "], + [12582, 0, "l"], + [12583, 0, "i"], + [12584, 0, "s"], + [12585, 0, "t"], + [12398, 1], + [12397, 1], + [12396, 1], + [12395, 1], + [12394, 1], + [12393, 1], + [12385, 1], + [12384, 1], + [12383, 1], + [12382, 1], + [12381, 1], + [12380, 1], + [12379, 1], + [12378, 1], + [12657, 0, ","], + [12658, 0, " "], + [12659, 0, "f"], + [12660, 0, "o"], + [12661, 0, "r"], + [12662, 0, " "], + [12663, 0, "e"], + [12664, 0, "x"], + [12665, 0, "a"], + [12666, 0, "m"], + [12667, 0, "p"], + [12668, 0, "l"], + [12669, 0, "e"], + [12670, 0, " "], + [12671, 0, "b"], + [12672, 0, "y"], + [12673, 0, " "], + [12674, 0, "u"], + [12675, 0, "s"], + [12676, 0, "i"], + [12677, 0, "n"], + [12678, 0, "g"], + [12679, 0, " "], + [12680, 0, "t"], + [12681, 0, "h"], + [12682, 0, "e"], + [12683, 0, " "], + [12684, 0, "e"], + [12685, 0, "l"], + [12686, 0, "e"], + [12687, 0, "m"], + [12688, 0, "e"], + [12689, 0, "n"], + [12690, 0, "t"], + [12691, 0, " "], + [12692, 0, "n"], + [12693, 0, "a"], + [12694, 0, "m"], + [12695, 0, "e"], + [12696, 0, " "], + [12697, 0, "o"], + [12698, 0, "r"], + [12699, 0, " "], + [12700, 0, "a"], + [12701, 0, "n"], + [12702, 0, " "], + [12703, 0, "a"], + [12704, 0, "t"], + [12705, 0, "t"], + [12706, 0, "r"], + [12707, 0, "i"], + [12708, 0, "b"], + [12709, 0, "u"], + [12710, 0, "t"], + [12711, 0, "e"], + [12684, 0, "c"], + [12685, 0, "h"], + [12686, 0, "i"], + [12687, 0, "l"], + [12688, 0, "d"], + [12689, 0, " "], + [12678, 1], + [12677, 1], + [12676, 1], + [12675, 1], + [12674, 1], + [12674, 0, "i"], + [12675, 0, "n"], + [12676, 0, "t"], + [12677, 0, "e"], + [12678, 0, "r"], + [12679, 0, "p"], + [12680, 0, "r"], + [12681, 0, "e"], + [12682, 0, "t"], + [12683, 0, "i"], + [12684, 0, "n"], + [12685, 0, "g"], + [12725, 0, " "], + [12725, 1], + [12724, 1], + [12723, 1], + [12722, 1], + [12721, 1], + [12720, 1], + [12719, 1], + [12718, 1], + [12717, 1], + [12716, 1], + [12715, 1], + [12714, 1], + [12713, 1], + [12712, 1], + [12711, 1], + [12710, 1], + [12710, 0, "a"], + [12711, 0, "s"], + [12712, 0, " "], + [12713, 0, "k"], + [12714, 0, "e"], + [12715, 0, "y"], + [12716, 0, "."], + [12717, 0, " "], + [12718, 0, "H"], + [12719, 0, "o"], + [12720, 0, "w"], + [12721, 0, "e"], + [12722, 0, "v"], + [12723, 0, "e"], + [12724, 0, "r"], + [12725, 0, ","], + [12726, 0, " "], + [12727, 0, "t"], + [12728, 0, "h"], + [12729, 0, "e"], + [12730, 0, "s"], + [12731, 0, "e"], + [12732, 0, " "], + [12733, 0, "s"], + [12734, 0, "e"], + [12735, 0, "m"], + [12736, 0, "a"], + [12737, 0, "n"], + [12738, 0, "t"], + [12739, 0, "i"], + [12740, 0, "c"], + [12741, 0, "s"], + [12742, 0, " "], + [12743, 0, "a"], + [12744, 0, "r"], + [12745, 0, "e"], + [12746, 0, " "], + [12747, 0, "n"], + [12748, 0, "o"], + [12749, 0, "t"], + [12750, 0, " "], + [12751, 0, "p"], + [12752, 0, "a"], + [12753, 0, "r"], + [12754, 0, "t"], + [12755, 0, " "], + [12756, 0, "o"], + [12757, 0, "f"], + [12758, 0, " "], + [12759, 0, "X"], + [12760, 0, "M"], + [12761, 0, "L"], + [12762, 0, " "], + [12763, 0, "i"], + [12764, 0, "t"], + [12765, 0, "s"], + [12766, 0, "e"], + [12767, 0, "l"], + [12768, 0, "f"], + [12769, 0, " "], + [12770, 0, "a"], + [12771, 0, "n"], + [12772, 0, "d"], + [12773, 0, " "], + [12774, 0, "w"], + [12775, 0, "o"], + [12776, 0, "u"], + [12777, 0, "l"], + [12778, 0, "d"], + [12779, 0, " "], + [12780, 0, "n"], + [12781, 0, "o"], + [12782, 0, "t"], + [12783, 0, " "], + [12784, 0, "b"], + [12785, 0, "e"], + [12786, 0, " "], + [12787, 0, "e"], + [12788, 0, "n"], + [12789, 0, "f"], + [12790, 0, "o"], + [12791, 0, "r"], + [12792, 0, "c"], + [12793, 0, "e"], + [12794, 0, "d"], + [12795, 0, " "], + [12796, 0, "b"], + [12797, 0, "y"], + [12798, 0, " "], + [12799, 0, "a"], + [12800, 0, " "], + [12801, 0, "c"], + [12802, 0, "o"], + [12803, 0, "l"], + [12804, 0, "l"], + [12805, 0, "a"], + [12806, 0, "b"], + [12807, 0, "o"], + [12808, 0, "r"], + [12809, 0, "a"], + [12810, 0, "t"], + [12811, 0, "i"], + [12812, 0, "v"], + [12813, 0, "e"], + [12814, 0, " "], + [12815, 0, "X"], + [12816, 0, "M"], + [12817, 0, "L"], + [12818, 0, " "], + [12819, 0, "e"], + [12820, 0, "d"], + [12821, 0, "i"], + [12822, 0, "t"], + [12823, 0, "o"], + [12824, 0, "r"], + [12825, 0, " "], + [12825, 1], + [12824, 1], + [12823, 1], + [12822, 1], + [12821, 1], + [12820, 1], + [12819, 1], + [12818, 1], + [12817, 1], + [12816, 1], + [12815, 1], + [12814, 1], + [12813, 1], + [12812, 1], + [12811, 1], + [12810, 1], + [12809, 1], + [12808, 1], + [12807, 1], + [12806, 1], + [12805, 1], + [12804, 1], + [12803, 1], + [12802, 1], + [12801, 1], + [12800, 1], + [12799, 1], + [12798, 1], + [12797, 1], + [12796, 1], + [12795, 1], + [12795, 0, ":"], + [12796, 0, " "], + [12797, 0, "a"], + [12798, 0, " "], + [12799, 0, "c"], + [12800, 0, "o"], + [12800, 1], + [12799, 1], + [12798, 1], + [12797, 1], + [12797, 0, "e"], + [12798, 0, "x"], + [12799, 0, "i"], + [12800, 0, "s"], + [12801, 0, "t"], + [12802, 0, "i"], + [12803, 0, "n"], + [12804, 0, "g"], + [12805, 0, " "], + [12806, 0, "c"], + [12807, 0, "o"], + [12808, 0, "l"], + [12809, 0, "l"], + [12810, 0, "a"], + [12811, 0, "b"], + [12812, 0, "o"], + [12813, 0, "r"], + [12814, 0, "a"], + [12815, 0, "t"], + [12816, 0, "i"], + [12817, 0, "v"], + [12818, 0, "e"], + [12819, 0, " "], + [12820, 0, "e"], + [12821, 0, "d"], + [12822, 0, "i"], + [12823, 0, "t"], + [12824, 0, "i"], + [12825, 0, "n"], + [12826, 0, "g"], + [12827, 0, " "], + [12828, 0, "a"], + [12829, 0, "l"], + [12830, 0, "g"], + [12831, 0, "o"], + [12832, 0, "r"], + [12833, 0, "i"], + [12834, 0, "t"], + [12835, 0, "h"], + [12836, 0, "m"], + [12837, 0, "s"], + [12838, 0, " "], + [12839, 0, "f"], + [12840, 0, "o"], + [12841, 0, "r"], + [12842, 0, " "], + [12843, 0, "X"], + [12844, 0, "M"], + [12845, 0, "L"], + [12846, 0, " "], + [12847, 0, "w"], + [12848, 0, "o"], + [12849, 0, "u"], + [12850, 0, "l"], + [12851, 0, "d"], + [12852, 0, " "], + [12853, 0, "c"], + [12854, 0, "r"], + [12855, 0, "e"], + [12856, 0, "a"], + [12857, 0, "t"], + [12858, 0, "e"], + [12859, 0, " "], + [12860, 0, "d"], + [12861, 0, "u"], + [12862, 0, "p"], + [12863, 0, "l"], + [12864, 0, "i"], + [12865, 0, "c"], + [12866, 0, "a"], + [12867, 0, "t"], + [12868, 0, "e"], + [12869, 0, " "], + [12870, 0, "w"], + [12871, 0, "h"], + [12872, 0, "i"], + [12873, 0, "l"], + [12874, 0, "d"], + [12875, 0, "r"], + [12876, 0, "e"], + [12877, 0, "n"], + [12878, 0, " "], + [12879, 0, "w"], + [12880, 0, "i"], + [12881, 0, "t"], + [12882, 0, "h"], + [12883, 0, " "], + [12884, 0, "t"], + [12885, 0, "h"], + [12886, 0, "e"], + [12887, 0, " "], + [12888, 0, "s"], + [12889, 0, "a"], + [12890, 0, "m"], + [12891, 0, "e"], + [12892, 0, " "], + [12893, 0, "k"], + [12894, 0, "e"], + [12895, 0, "y"], + [12896, 0, " "], + [12897, 0, "r"], + [12898, 0, "a"], + [12899, 0, "t"], + [12900, 0, "h"], + [12901, 0, "e"], + [12902, 0, "r"], + [12903, 0, " "], + [12904, 0, "t"], + [12905, 0, "h"], + [12906, 0, "a"], + [12907, 0, "n"], + [12908, 0, " "], + [12909, 0, "m"], + [12796, 0, " "], + [12797, 0, "i"], + [12798, 0, "f"], + [12799, 0, " "], + [12800, 0, "m"], + [12801, 0, "u"], + [12802, 0, "l"], + [12803, 0, "t"], + [12804, 0, "i"], + [12805, 0, "p"], + [12806, 0, "l"], + [12807, 0, "e"], + [12808, 0, " "], + [12809, 0, "n"], + [12810, 0, "o"], + [12810, 1], + [12809, 1], + [12808, 1], + [12807, 1], + [12806, 1], + [12805, 1], + [12804, 1], + [12803, 1], + [12802, 1], + [12801, 1], + [12800, 1], + [12800, 0, "n"], + [12801, 0, "e"], + [12795, 0, " "], + [12796, 0, "b"], + [12797, 0, "y"], + [12798, 0, " "], + [12799, 0, "e"], + [12800, 0, "x"], + [12801, 0, "i"], + [12802, 0, "s"], + [12803, 0, "t"], + [12804, 0, "i"], + [12805, 0, "n"], + [12806, 0, "g"], + [12807, 0, " "], + [12808, 0, "c"], + [12809, 0, "o"], + [12810, 0, "l"], + [12811, 0, "l"], + [12812, 0, "a"], + [12813, 0, "b"], + [12814, 0, "o"], + [12815, 0, "r"], + [12816, 0, "a"], + [12817, 0, "t"], + [12818, 0, "i"], + [12819, 0, "v"], + [12820, 0, "e"], + [12821, 0, " "], + [12822, 0, "e"], + [12823, 0, "d"], + [12824, 0, "i"], + [12825, 0, "t"], + [12826, 0, "i"], + [12827, 0, "n"], + [12828, 0, "g"], + [12829, 0, " "], + [12830, 0, "a"], + [12831, 0, "l"], + [12832, 0, "g"], + [12833, 0, "o"], + [12834, 0, "r"], + [12835, 0, "i"], + [12836, 0, "t"], + [12837, 0, "h"], + [12838, 0, "m"], + [12839, 0, "s"], + [12840, 0, " "], + [12841, 0, "f"], + [12842, 0, "o"], + [12843, 0, "r"], + [12844, 0, " "], + [12845, 0, "X"], + [12846, 0, "M"], + [12847, 0, "L"], + [12848, 0, "."], + [12849, 1], + [12850, 1], + [12850, 0, "I"], + [12854, 1], + [12853, 1], + [12853, 0, "m"], + [12854, 0, "u"], + [12855, 0, "l"], + [12856, 0, "t"], + [12857, 0, "i"], + [12858, 0, "p"], + [12859, 0, "l"], + [12860, 0, "e"], + [12861, 0, " "], + [12862, 0, "c"], + [12863, 0, "h"], + [12864, 0, "i"], + [12865, 0, "l"], + [12866, 0, "d"], + [12867, 0, "r"], + [12868, 0, "e"], + [12869, 0, "n"], + [12870, 0, " "], + [12871, 0, "w"], + [12872, 0, "i"], + [12873, 0, "t"], + [12874, 0, "h"], + [12875, 0, " "], + [12876, 0, "t"], + [12877, 0, "h"], + [12878, 0, "e"], + [12879, 0, " "], + [12880, 0, "s"], + [12881, 0, "a"], + [12882, 0, "m"], + [12883, 0, "e"], + [12884, 0, " "], + [12885, 0, "k"], + [12886, 0, "e"], + [12887, 0, "y"], + [12888, 0, " "], + [12889, 0, "a"], + [12890, 0, "r"], + [12891, 0, "e"], + [12892, 0, " "], + [12893, 0, "c"], + [12894, 0, "o"], + [12895, 0, "n"], + [12896, 0, "c"], + [12897, 0, "u"], + [12898, 0, "r"], + [12899, 0, "r"], + [12900, 0, "e"], + [12901, 0, "n"], + [12902, 0, "t"], + [12903, 0, "l"], + [12904, 0, "y"], + [12905, 0, " "], + [12906, 0, "c"], + [12907, 0, "r"], + [12908, 0, "e"], + [12909, 0, "a"], + [12910, 0, "t"], + [12911, 0, "e"], + [12912, 0, "d"], + [12913, 0, ","], + [12914, 0, " "], + [12915, 0, "e"], + [12916, 0, "x"], + [12917, 0, "i"], + [12918, 0, "s"], + [12919, 0, "t"], + [12920, 0, "i"], + [12921, 0, "n"], + [12922, 0, "g"], + [12923, 0, " "], + [12924, 0, "a"], + [12925, 0, "l"], + [12926, 0, "g"], + [12927, 0, "o"], + [12928, 0, "r"], + [12929, 0, "i"], + [12930, 0, "t"], + [12931, 0, "h"], + [12932, 0, "s"], + [12932, 1], + [12932, 0, "m"], + [12933, 0, "s"], + [12934, 0, " "], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12935, 1], + [12958, 1], + [12958, 0, "c"], + [12571, 1], + [12570, 1], + [12569, 1], + [12568, 1], + [12567, 1], + [12566, 1], + [12565, 1], + [12564, 1], + [12563, 1], + [12562, 1], + [12561, 1], + [12560, 1], + [12559, 1], + [12558, 1], + [12557, 1], + [12556, 1], + [12555, 1], + [12554, 1], + [12553, 1], + [12552, 1], + [12551, 1], + [12550, 1], + [12549, 1], + [12548, 1], + [12547, 1], + [12546, 1], + [12545, 1], + [12544, 1], + [12543, 1], + [12542, 1], + [12541, 1], + [12540, 1], + [12539, 1], + [12538, 1], + [12537, 1], + [12536, 1], + [12535, 1], + [12534, 1], + [12533, 1], + [12532, 1], + [12531, 1], + [12530, 1], + [12529, 1], + [12528, 1], + [12527, 1], + [12526, 1], + [12525, 1], + [12524, 1], + [12523, 1], + [12522, 1], + [12521, 1], + [12520, 1], + [12519, 1], + [12518, 1], + [12517, 1], + [12516, 1], + [12515, 1], + [12514, 1], + [12513, 1], + [12512, 1], + [12511, 1], + [12510, 1], + [12509, 1], + [12508, 1], + [12507, 1], + [12506, 1], + [12505, 1], + [12504, 1], + [12503, 1], + [12502, 1], + [12928, 0, "e"], + [12929, 0, "r"], + [12930, 0, "g"], + [12931, 0, "i"], + [12932, 0, "n"], + [12933, 0, "g"], + [12934, 0, " "], + [12935, 0, "t"], + [12936, 0, "h"], + [12937, 0, "e"], + [12938, 0, "m"], + [12939, 0, " "], + [12940, 0, "l"], + [12941, 0, "i"], + [12942, 0, "k"], + [12943, 0, "e"], + [12944, 0, " "], + [12945, 0, "i"], + [12946, 0, "n"], + [12947, 0, " "], + [12948, 0, "F"], + [12949, 0, "i"], + [12950, 0, "g"], + [12951, 0, "u"], + [12952, 0, "r"], + [12953, 0, "e"], + [12954, 0, "~"], + [12955, 0, "\\"], + [12956, 0, "r"], + [12957, 0, "e"], + [12958, 0, "f"], + [12959, 0, "{"], + [12960, 0, "f"], + [12961, 0, "i"], + [12962, 0, "g"], + [12963, 0, ":"], + [12964, 0, "t"], + [12965, 0, "w"], + [12966, 0, "o"], + [12967, 0, "-"], + [12968, 0, "l"], + [12969, 0, "i"], + [12970, 0, "s"], + [12971, 0, "t"], + [12972, 0, "s"], + [12973, 0, "}"], + [12974, 0, "."], + [34107, 1], + [34106, 1], + [34105, 1], + [34105, 0, ","], + [34106, 0, " "], + [34107, 0, "s"], + [34108, 0, "t"], + [34109, 0, "a"], + [34110, 0, "t"], + [34111, 0, "e"], + [34112, 0, " "], + [34113, 0, "v"], + [34114, 0, "e"], + [34115, 0, "c"], + [34116, 0, "t"], + [34117, 0, "o"], + [34118, 0, "r"], + [34119, 0, "s"], + [34120, 0, "~"], + [34121, 0, "\\"], + [34122, 0, "c"], + [34123, 0, "i"], + [34124, 0, "t"], + [34125, 0, "e"], + [34126, 0, "{"], + [34127, 0, "E"], + [34128, 0, "l"], + [34129, 0, "l"], + [34130, 0, "i"], + [34131, 0, "s"], + [34132, 0, ":"], + [34133, 0, "1"], + [34134, 0, "9"], + [34135, 0, "8"], + [34136, 0, "9"], + [34137, 0, "u"], + [34138, 0, "e"], + [34139, 0, "}"], + [34140, 0, ","], + [34141, 0, " "], + [34142, 0, "o"], + [34143, 0, "r"], + [34105, 0, "~"], + [34106, 0, "\\"], + [34107, 0, "c"], + [34108, 0, "i"], + [34109, 0, "t"], + [34110, 0, "e"], + [34111, 0, "{"], + [34112, 0, "P"], + [34113, 0, "a"], + [34114, 0, "r"], + [34115, 0, "k"], + [34116, 0, "e"], + [34117, 0, "r"], + [34118, 0, "J"], + [34119, 0, "R"], + [34120, 0, ":"], + [34120, 1], + [34119, 1], + [34119, 0, "r"], + [34120, 0, ":"], + [34121, 0, "1"], + [34122, 0, "9"], + [34123, 0, "8"], + [34124, 0, "3"], + [34125, 0, "j"], + [34126, 0, "b"], + [34127, 0, "}"], + [34206, 1], + [34205, 1], + [34204, 1], + [34203, 1], + [34202, 1], + [34201, 1], + [34200, 1], + [34199, 1], + [34198, 1], + [34197, 1], + [34196, 1], + [34195, 1], + [34194, 1], + [34193, 1], + [34192, 1], + [34191, 1], + [34190, 1], + [34190, 0, "~"], + [34191, 0, "\\"], + [34192, 0, "c"], + [34193, 0, "i"], + [34194, 0, "t"], + [34195, 0, "e"], + [34196, 0, "{"], + [34197, 0, "P"], + [34198, 0, "r"], + [34199, 0, "e"], + [34200, 0, "g"], + [34201, 0, "u"], + [34202, 0, "i"], + [34203, 0, "c"], + [34204, 0, "a"], + [34205, 0, ":"], + [34206, 0, "2"], + [34207, 0, "0"], + [34208, 0, "1"], + [34209, 0, "2"], + [34210, 0, "f"], + [34211, 0, "x"], + [34212, 0, "}"], + [67723, 0, "\n"], + [67724, 0, "\n"], + [67725, 0, "\\"], + [67726, 0, "s"], + [67727, 0, "e"], + [67728, 0, "c"], + [67729, 0, "t"], + [67730, 0, "i"], + [67731, 0, "o"], + [67732, 0, "n"], + [67733, 0, "{"], + [67734, 0, "R"], + [67735, 0, "e"], + [67736, 0, "l"], + [67737, 0, "a"], + [67738, 0, "t"], + [67739, 0, "e"], + [67740, 0, "d"], + [67741, 0, " "], + [67742, 0, "W"], + [67742, 1], + [67742, 0, "w"], + [67743, 0, "o"], + [67744, 0, "r"], + [67745, 0, "k"], + [67746, 0, "}"], + [67747, 0, "\n"], + [67748, 0, "\n"], + [67749, 0, "A"], + [67750, 0, "l"], + [67751, 0, "g"], + [67752, 0, "o"], + [67753, 0, "r"], + [67754, 0, "i"], + [67755, 0, "t"], + [67756, 0, "h"], + [67757, 0, "m"], + [67758, 0, "s"], + [67759, 0, " "], + [67760, 0, "b"], + [67761, 0, "a"], + [67762, 0, "s"], + [67763, 0, "e"], + [67764, 0, "d"], + [67765, 0, " "], + [67766, 0, "o"], + [67767, 0, "n"], + [67768, 0, " "], + [67769, 0, "_"], + [67769, 1], + [67769, 0, "\\"], + [67770, 0, "e"], + [67771, 0, "m"], + [67772, 0, "p"], + [67773, 0, "h"], + [67774, 0, "{"], + [67775, 0, "o"], + [67776, 0, "p"], + [67777, 0, "e"], + [67778, 0, "r"], + [67779, 0, "a"], + [67780, 0, "t"], + [67781, 0, "i"], + [67782, 0, "o"], + [67783, 0, "n"], + [67784, 0, "a"], + [67785, 0, "l"], + [67786, 0, " "], + [67787, 0, "t"], + [67788, 0, "r"], + [67789, 0, "a"], + [67790, 0, "n"], + [67791, 0, "s"], + [67792, 0, "f"], + [67793, 0, "o"], + [67794, 0, "r"], + [67795, 0, "m"], + [67796, 0, "a"], + [67797, 0, "t"], + [67798, 0, "i"], + [67799, 0, "o"], + [67800, 0, "n"], + [67801, 0, "}"], + [67802, 0, " "], + [67803, 0, "("], + [67804, 0, "O"], + [67805, 0, "T"], + [67806, 0, ")"], + [67807, 0, " "], + [67808, 0, "h"], + [67809, 0, "a"], + [67810, 0, "v"], + [67811, 0, "e"], + [67812, 0, " "], + [67813, 0, "l"], + [67814, 0, "o"], + [67815, 0, "n"], + [67816, 0, "g"], + [67817, 0, " "], + [67818, 0, "b"], + [67819, 0, "e"], + [67820, 0, "e"], + [67821, 0, "n"], + [67822, 0, " "], + [67823, 0, "u"], + [67824, 0, "s"], + [67825, 0, "e"], + [67826, 0, "d"], + [67827, 0, " "], + [67828, 0, "f"], + [67829, 0, "o"], + [67830, 0, "r"], + [67831, 0, " "], + [67832, 0, "c"], + [67833, 0, "o"], + [67834, 0, "l"], + [67835, 0, "l"], + [67836, 0, "a"], + [67837, 0, "b"], + [67838, 0, "o"], + [67839, 0, "r"], + [67840, 0, "a"], + [67841, 0, "t"], + [67842, 0, "i"], + [67843, 0, "v"], + [67844, 0, "e"], + [67845, 0, " "], + [67846, 0, "e"], + [67847, 0, "d"], + [67848, 0, "i"], + [67849, 0, "t"], + [67850, 0, "i"], + [67851, 0, "n"], + [67852, 0, "g"], + [67853, 0, " "], + [67854, 0, "a"], + [67855, 0, "p"], + [67856, 0, "p"], + [67857, 0, "l"], + [67858, 0, "i"], + [67859, 0, "c"], + [67860, 0, "a"], + [67861, 0, "t"], + [67862, 0, "i"], + [67863, 0, "o"], + [67864, 0, "n"], + [67865, 0, "s"], + [67866, 0, "~"], + [67867, 0, "\\"], + [67868, 0, "c"], + [67869, 0, "i"], + [67870, 0, "t"], + [67871, 0, "e"], + [67872, 0, "{"], + [67873, 0, "E"], + [67874, 0, "l"], + [67875, 0, "l"], + [67876, 0, "i"], + [67877, 0, "s"], + [67878, 0, ":"], + [67879, 0, "1"], + [67880, 0, "9"], + [67881, 0, "8"], + [67882, 0, "9"], + [67883, 0, "u"], + [67884, 0, "e"], + [67885, 0, ","], + [67886, 0, "R"], + [67887, 0, "e"], + [67888, 0, "s"], + [67889, 0, "s"], + [67890, 0, "e"], + [67891, 0, "l"], + [67892, 0, ":"], + [67893, 0, "1"], + [67894, 0, "9"], + [67895, 0, "9"], + [67896, 0, "6"], + [67897, 0, "w"], + [67898, 0, "x"], + [67899, 0, ","], + [67900, 0, "S"], + [67901, 0, "u"], + [67902, 0, "n"], + [67903, 0, ":"], + [67904, 0, "1"], + [67905, 0, "9"], + [67906, 0, "9"], + [67907, 0, "8"], + [67908, 0, "v"], + [67909, 0, "f"], + [67910, 0, ","], + [67911, 0, "N"], + [67912, 0, "i"], + [67913, 0, "c"], + [67914, 0, "h"], + [67915, 0, "o"], + [67916, 0, "l"], + [67917, 0, "s"], + [67918, 0, ":"], + [67919, 0, "1"], + [67920, 0, "9"], + [67921, 0, "9"], + [67922, 0, "5"], + [67923, 0, "f"], + [67924, 0, "d"], + [67925, 0, "}"], + [67926, 0, "."], + [67927, 0, " "], + [67928, 0, "M"], + [67929, 0, "o"], + [67930, 0, "s"], + [67931, 0, "t"], + [67932, 0, " "], + [67933, 0, "o"], + [67934, 0, "f"], + [67935, 0, " "], + [67936, 0, "t"], + [67937, 0, "h"], + [67938, 0, "e"], + [67939, 0, "m"], + [67940, 0, " "], + [67941, 0, "t"], + [67942, 0, "r"], + [67943, 0, "e"], + [67944, 0, "a"], + [67945, 0, "t"], + [67946, 0, " "], + [67947, 0, "a"], + [67948, 0, " "], + [67949, 0, "d"], + [67950, 0, "o"], + [67951, 0, "c"], + [67952, 0, "u"], + [67953, 0, "m"], + [67954, 0, "e"], + [67955, 0, "n"], + [67956, 0, "t"], + [67957, 0, " "], + [67958, 0, "a"], + [67959, 0, "s"], + [67960, 0, " "], + [67961, 0, "a"], + [67962, 0, " "], + [67963, 0, "f"], + [67964, 0, "l"], + [67965, 0, "a"], + [67966, 0, "t"], + [67967, 0, " "], + [67968, 0, "s"], + [67969, 0, "e"], + [67970, 0, "q"], + [67971, 0, "u"], + [67972, 0, "e"], + [67973, 0, "n"], + [67974, 0, "c"], + [67975, 0, "e"], + [67976, 0, " "], + [67977, 0, "("], + [67978, 0, "o"], + [67979, 0, "f"], + [67980, 0, " "], + [67981, 0, "c"], + [67982, 0, "h"], + [67983, 0, "a"], + [67984, 0, "r"], + [67985, 0, "a"], + [67986, 0, "c"], + [67987, 0, "t"], + [67988, 0, "e"], + [67989, 0, "r"], + [67990, 0, "s"], + [67991, 0, ","], + [67992, 0, " "], + [67993, 0, "f"], + [67994, 0, "o"], + [67995, 0, "r"], + [67996, 0, " "], + [67997, 0, "e"], + [67998, 0, "x"], + [67999, 0, "a"], + [68000, 0, "m"], + [68001, 0, "p"], + [68002, 0, "l"], + [68003, 0, "e"], + [68004, 0, ")"], + [68005, 0, " "], + [68006, 0, "a"], + [68007, 0, "n"], + [68008, 0, "d"], + [68009, 0, " "], + [68010, 0, "d"], + [68011, 0, "o"], + [68012, 0, " "], + [68013, 0, "n"], + [68014, 0, "o"], + [68015, 0, "t"], + [68016, 0, " "], + [68017, 0, "s"], + [68018, 0, "u"], + [68019, 0, "p"], + [68020, 0, "p"], + [68021, 0, "o"], + [68022, 0, "r"], + [68023, 0, "t"], + [68024, 0, " "], + [68025, 0, "t"], + [68026, 0, "h"], + [68027, 0, "e"], + [68028, 0, " "], + [68029, 0, "n"], + [68030, 0, "e"], + [68031, 0, "s"], + [68032, 0, "t"], + [68033, 0, "e"], + [68034, 0, "d"], + [68035, 0, " "], + [68036, 0, "t"], + [68037, 0, "r"], + [68038, 0, "e"], + [68039, 0, "e"], + [68040, 0, " "], + [68041, 0, "s"], + [68042, 0, "t"], + [68043, 0, "r"], + [68044, 0, "u"], + [68045, 0, "c"], + [68046, 0, "t"], + [68047, 0, "u"], + [68048, 0, "r"], + [68049, 0, "e"], + [68050, 0, "s"], + [68051, 0, " "], + [68052, 0, "t"], + [68053, 0, "h"], + [68054, 0, "a"], + [68055, 0, "t"], + [68056, 0, " "], + [68057, 0, "a"], + [68058, 0, "r"], + [68059, 0, "e"], + [68060, 0, " "], + [68061, 0, "r"], + [68062, 0, "e"], + [68063, 0, "q"], + [68064, 0, "u"], + [68065, 0, "i"], + [68066, 0, "r"], + [68067, 0, "e"], + [68068, 0, "d"], + [68069, 0, " "], + [67975, 1], + [67974, 1], + [67973, 1], + [67972, 1], + [67971, 1], + [67970, 1], + [67969, 1], + [67968, 1], + [67967, 1], + [67966, 1], + [67965, 1], + [67964, 1], + [67963, 1], + [67962, 1], + [67962, 0, "s"], + [67963, 0, "i"], + [67964, 0, "n"], + [67965, 0, "g"], + [67966, 0, "l"], + [67962, 0, " "], + [67968, 0, "e"], + [67969, 0, " "], + [67970, 0, "o"], + [67971, 0, "r"], + [67972, 0, "d"], + [67973, 0, "e"], + [67974, 0, "r"], + [67975, 0, "e"], + [67976, 0, "d"], + [67977, 0, " "], + [67978, 0, "l"], + [67979, 0, "i"], + [67980, 0, "s"], + [67981, 0, "t"], + [68076, 0, "f"], + [68077, 0, "o"], + [68078, 0, "r"], + [68079, 0, " "], + [68080, 0, "m"], + [68081, 0, "a"], + [68082, 0, "n"], + [68083, 0, "y"], + [68084, 0, " "], + [68085, 0, "a"], + [68086, 0, "p"], + [68087, 0, "p"], + [68088, 0, "l"], + [68089, 0, "i"], + [68090, 0, "c"], + [68091, 0, "a"], + [68092, 0, "t"], + [68093, 0, "i"], + [68094, 0, "o"], + [68095, 0, "n"], + [68096, 0, "s"], + [68097, 0, "."], + [68098, 0, " "], + [68099, 0, "S"], + [68100, 0, "o"], + [68101, 0, "m"], + [68102, 0, "e"], + [68103, 0, " "], + [68104, 0, "a"], + [68105, 0, "l"], + [68106, 0, "g"], + [68107, 0, "o"], + [68108, 0, "r"], + [68109, 0, "i"], + [68110, 0, "t"], + [68111, 0, "h"], + [68112, 0, "m"], + [68113, 0, "s"], + [68114, 0, " "], + [68115, 0, "g"], + [68116, 0, "e"], + [68117, 0, "n"], + [68118, 0, "e"], + [68119, 0, "r"], + [68120, 0, "a"], + [68121, 0, "l"], + [68122, 0, "i"], + [68123, 0, "z"], + [68124, 0, "e"], + [68125, 0, " "], + [68126, 0, "O"], + [68127, 0, "T"], + [68128, 0, " "], + [68129, 0, "t"], + [68130, 0, "o"], + [68131, 0, " "], + [68132, 0, "e"], + [68133, 0, "d"], + [68134, 0, "i"], + [68135, 0, "t"], + [68136, 0, "i"], + [68137, 0, "n"], + [68138, 0, "g"], + [68139, 0, " "], + [68140, 0, "X"], + [68141, 0, "M"], + [68142, 0, "L"], + [68143, 0, " "], + [68144, 0, "d"], + [68145, 0, "o"], + [68146, 0, "c"], + [68147, 0, "u"], + [68148, 0, "m"], + [68149, 0, "e"], + [68150, 0, "n"], + [68151, 0, "t"], + [68152, 0, "s"], + [68153, 0, "~"], + [68154, 0, "\\"], + [68155, 0, "c"], + [68156, 0, "i"], + [68157, 0, "t"], + [68158, 0, "e"], + [68159, 0, "{"], + [68160, 0, "D"], + [68161, 0, "a"], + [68162, 0, "v"], + [68163, 0, "i"], + [68164, 0, "s"], + [68165, 0, ":"], + [68166, 0, "2"], + [68167, 0, "0"], + [68168, 0, "0"], + [68169, 0, "2"], + [68170, 0, "i"], + [68171, 0, "v"], + [68172, 0, ","], + [68173, 0, "I"], + [68174, 0, "g"], + [68175, 0, "n"], + [68176, 0, "a"], + [68177, 0, "t"], + [68178, 0, ":"], + [68179, 0, "2"], + [68180, 0, "0"], + [68181, 0, "0"], + [68182, 0, "3"], + [68183, 0, "j"], + [68184, 0, "y"], + [68185, 0, ","], + [68185, 0, "}"], + [68187, 0, " "], + [68185, 0, ","], + [68186, 0, "W"], + [68187, 0, "a"], + [68188, 0, "n"], + [68189, 0, "g"], + [68190, 0, ":"], + [68191, 0, "2"], + [68192, 0, "0"], + [68193, 0, "1"], + [68194, 0, "5"], + [68195, 0, "v"], + [68196, 0, "o"], + [68200, 0, "w"], + [68201, 0, "h"], + [68202, 0, "i"], + [68203, 0, "c"], + [68204, 0, "h"], + [68205, 0, " "], + [68206, 0, "p"], + [68207, 0, "r"], + [68208, 0, "o"], + [68209, 0, "v"], + [68210, 0, "i"], + [68211, 0, "d"], + [68212, 0, "e"], + [68213, 0, "s"], + [68214, 0, " "], + [68215, 0, "n"], + [68216, 0, "e"], + [68217, 0, "s"], + [68218, 0, "t"], + [68219, 0, "i"], + [68220, 0, "n"], + [68221, 0, "g"], + [68222, 0, " "], + [68223, 0, "o"], + [68224, 0, "f"], + [68225, 0, " "], + [68226, 0, "o"], + [68227, 0, "r"], + [68228, 0, "d"], + [68229, 0, "e"], + [68230, 0, "r"], + [68231, 0, "e"], + [68232, 0, "d"], + [68233, 0, " "], + [68234, 0, "l"], + [68235, 0, "i"], + [68236, 0, "s"], + [68237, 0, "t"], + [68238, 0, "s"], + [68239, 0, ","], + [68240, 0, " "], + [68241, 0, "b"], + [68242, 0, "u"], + [68243, 0, "t"], + [68244, 0, " "], + [68245, 0, "t"], + [68246, 0, "h"], + [68247, 0, "e"], + [68248, 0, "s"], + [68249, 0, "e"], + [68250, 0, " "], + [68251, 0, "a"], + [68252, 0, "l"], + [68253, 0, "g"], + [68254, 0, "o"], + [68255, 0, "r"], + [68256, 0, "i"], + [68257, 0, "t"], + [68258, 0, "h"], + [68259, 0, "m"], + [68260, 0, "s"], + [68261, 0, " "], + [68262, 0, "d"], + [68263, 0, "o"], + [68264, 0, " "], + [68265, 0, "n"], + [68266, 0, "o"], + [68267, 0, "t"], + [68268, 0, " "], + [68269, 0, "s"], + [68270, 0, "u"], + [68271, 0, "p"], + [68272, 0, "p"], + [68273, 0, "o"], + [68274, 0, "r"], + [68275, 0, "t"], + [68276, 0, " "], + [68277, 0, "k"], + [68278, 0, "e"], + [68279, 0, "y"], + [68280, 0, "-"], + [68281, 0, "v"], + [68282, 0, "a"], + [68283, 0, "l"], + [68284, 0, "u"], + [68285, 0, "e"], + [68286, 0, " "], + [68287, 0, "m"], + [68288, 0, "a"], + [68289, 0, "p"], + [68290, 0, "s"], + [68291, 0, " "], + [68292, 0, "a"], + [68293, 0, "s"], + [68294, 0, " "], + [68295, 0, "d"], + [68296, 0, "e"], + [68297, 0, "f"], + [68298, 0, "i"], + [68299, 0, "n"], + [68300, 0, "e"], + [68301, 0, "d"], + [68302, 0, " "], + [68303, 0, "i"], + [68304, 0, "n"], + [68305, 0, " "], + [68306, 0, "t"], + [68307, 0, "h"], + [68308, 0, "i"], + [68309, 0, "s"], + [68310, 0, " "], + [68311, 0, "p"], + [68312, 0, "a"], + [68313, 0, "p"], + [68314, 0, "e"], + [68315, 0, "r"], + [68316, 0, "."], + [68317, 0, "\n"], + [68318, 0, "\n"], + [68319, 0, "M"], + [68320, 0, "o"], + [68321, 0, "s"], + [68322, 0, "t"], + [68323, 0, " "], + [68324, 0, "d"], + [68325, 0, "e"], + [68326, 0, "p"], + [68327, 0, "l"], + [68328, 0, "o"], + [68329, 0, "y"], + [68330, 0, "e"], + [68331, 0, "d"], + [68332, 0, " "], + [68333, 0, "O"], + [68334, 0, "T"], + [68335, 0, " "], + [68336, 0, "s"], + [68337, 0, "y"], + [68338, 0, "s"], + [68339, 0, "t"], + [68340, 0, "e"], + [68341, 0, "m"], + [68342, 0, "s"], + [68343, 0, ","], + [68344, 0, " "], + [68345, 0, "i"], + [68346, 0, "n"], + [68347, 0, "c"], + [68348, 0, "l"], + [68349, 0, "u"], + [68350, 0, "d"], + [68351, 0, "i"], + [68352, 0, "n"], + [68353, 0, "g"], + [68354, 0, " "], + [68355, 0, "\\"], + [68355, 1], + [68355, 0, "G"], + [68356, 0, "o"], + [68357, 0, "o"], + [68358, 0, "g"], + [68359, 0, "l"], + [68360, 0, "e"], + [68361, 0, " "], + [68362, 0, "D"], + [68363, 0, "o"], + [68364, 0, "c"], + [68365, 0, "s"], + [68366, 0, "~"], + [68367, 0, "\\"], + [68368, 0, "c"], + [68369, 0, "i"], + [68370, 0, "t"], + [68371, 0, "e"], + [68372, 0, "{"], + [68373, 0, "D"], + [68374, 0, "a"], + [68375, 0, "y"], + [68376, 0, "R"], + [68377, 0, "i"], + [68378, 0, "c"], + [68379, 0, "h"], + [68380, 0, "t"], + [68381, 0, "e"], + [68382, 0, "r"], + [68383, 0, ":"], + [68384, 0, "2"], + [68385, 0, "0"], + [68386, 0, "1"], + [68387, 0, "0"], + [68388, 0, "t"], + [68389, 0, "t"], + [68390, 0, "}"], + [68391, 0, ","], + [68392, 0, " "], + [68393, 0, "E"], + [68394, 0, "t"], + [68395, 0, "h"], + [68396, 0, "e"], + [68397, 0, "r"], + [68398, 0, "p"], + [68399, 0, "a"], + [68400, 0, "d"], + [68401, 0, "~"], + [68402, 0, "\\"], + [68403, 0, "c"], + [68404, 0, "i"], + [68405, 0, "t"], + [68406, 0, "e"], + [68407, 0, "{"], + [68408, 0, "E"], + [68409, 0, "t"], + [68410, 0, "h"], + [68411, 0, "e"], + [68412, 0, "r"], + [68413, 0, "p"], + [68414, 0, "a"], + [68415, 0, "d"], + [68416, 0, ":"], + [68417, 0, "2"], + [68418, 0, "0"], + [68419, 0, "1"], + [68420, 0, "1"], + [68421, 0, "u"], + [68422, 0, "m"], + [68423, 0, "}"], + [68424, 0, ","], + [68425, 0, " "], + [68426, 0, "N"], + [68427, 0, "o"], + [68428, 0, "v"], + [68429, 0, "e"], + [68430, 0, "l"], + [68431, 0, "l"], + [68432, 0, " "], + [68433, 0, "V"], + [68434, 0, "i"], + [68435, 0, "b"], + [68436, 0, "e"], + [68437, 0, "~"], + [68438, 0, "\\"], + [68439, 0, "c"], + [68440, 0, "i"], + [68441, 0, "t"], + [68442, 0, "e"], + [68443, 0, "{"], + [68444, 0, "S"], + [68445, 0, "p"], + [68446, 0, "i"], + [68447, 0, "e"], + [68448, 0, "w"], + [68449, 0, "a"], + [68450, 0, "k"], + [68451, 0, ":"], + [68452, 0, "2"], + [68453, 0, "0"], + [68454, 0, "1"], + [68455, 0, "0"], + [68456, 0, "v"], + [68457, 0, "w"], + [68458, 0, "}"], + [68459, 0, " "], + [68460, 0, "a"], + [68461, 0, "n"], + [68462, 0, "d"], + [68463, 0, " "], + [68464, 0, "A"], + [68465, 0, "p"], + [68466, 0, "a"], + [68467, 0, "c"], + [68468, 0, "h"], + [68469, 0, "e"], + [68470, 0, " "], + [68471, 0, "W"], + [68472, 0, "a"], + [68473, 0, "v"], + [68474, 0, "e"], + [68475, 0, " "], + [68476, 0, "("], + [68477, 0, "f"], + [68478, 0, "o"], + [68479, 0, "r"], + [68480, 0, "m"], + [68481, 0, "e"], + [68482, 0, "r"], + [68483, 0, "l"], + [68484, 0, "y"], + [68485, 0, " "], + [68486, 0, "G"], + [68487, 0, "o"], + [68488, 0, "o"], + [68489, 0, "g"], + [68490, 0, "l"], + [68491, 0, "e"], + [68492, 0, " "], + [68493, 0, "W"], + [68494, 0, "a"], + [68495, 0, "v"], + [68496, 0, "e"], + [68497, 0, "~"], + [68498, 0, "\\"], + [68499, 0, "c"], + [68500, 0, "i"], + [68501, 0, "t"], + [68502, 0, "e"], + [68503, 0, "{"], + [68504, 0, "W"], + [68505, 0, "a"], + [68506, 0, "n"], + [68507, 0, "g"], + [68508, 0, ":"], + [68509, 0, "2"], + [68510, 0, "0"], + [68511, 0, "1"], + [68512, 0, "5"], + [68513, 0, "v"], + [68514, 0, "o"], + [68515, 0, "}"], + [68516, 0, ")"], + [68517, 0, ","], + [68518, 0, " "], + [68519, 0, "r"], + [68520, 0, "e"], + [68521, 0, "l"], + [68522, 0, "y"], + [68523, 0, " "], + [68524, 0, "o"], + [68525, 0, "n"], + [68526, 0, " "], + [68527, 0, "a"], + [68528, 0, " "], + [68335, 0, " "], + [68336, 0, "c"], + [68337, 0, "o"], + [68338, 0, "l"], + [68339, 0, "l"], + [68340, 0, "a"], + [68341, 0, "b"], + [68342, 0, "o"], + [68343, 0, "r"], + [68344, 0, "a"], + [68345, 0, "t"], + [68346, 0, "i"], + [68347, 0, "o"], + [68348, 0, "n"], + [68543, 0, "s"], + [68544, 0, "i"], + [68545, 0, "n"], + [68546, 0, "g"], + [68547, 0, "l"], + [68548, 0, "e"], + [68549, 0, " "], + [68550, 0, "s"], + [68551, 0, "e"], + [68552, 0, "r"], + [68553, 0, "v"], + [68554, 0, "e"], + [68555, 0, "r"], + [68556, 0, " "], + [68557, 0, "t"], + [68558, 0, "o"], + [68559, 0, " "], + [68560, 0, "d"], + [68561, 0, "e"], + [68562, 0, "c"], + [68563, 0, "i"], + [68564, 0, "d"], + [68565, 0, "e"], + [68566, 0, " "], + [68567, 0, "o"], + [68568, 0, "n"], + [68569, 0, " "], + [68570, 0, "a"], + [68571, 0, " "], + [68572, 0, "t"], + [68573, 0, "o"], + [68574, 0, "t"], + [68575, 0, "a"], + [68576, 0, "l"], + [68577, 0, " "], + [68578, 0, "o"], + [68579, 0, "r"], + [68580, 0, "d"], + [68581, 0, "e"], + [68582, 0, "r"], + [68583, 0, "i"], + [68584, 0, "n"], + [68585, 0, "g"], + [68586, 0, " "], + [68587, 0, "o"], + [68588, 0, "f"], + [68589, 0, " "], + [68590, 0, "o"], + [68591, 0, "p"], + [68592, 0, "e"], + [68593, 0, "r"], + [68594, 0, "a"], + [68595, 0, "t"], + [68596, 0, "i"], + [68597, 0, "o"], + [68598, 0, "n"], + [68599, 0, "s"], + [68600, 0, "."], + [68601, 0, " "], + [68602, 0, "T"], + [68603, 0, "h"], + [68604, 0, "i"], + [68605, 0, "s"], + [68606, 0, " "], + [68607, 0, "h"], + [68608, 0, "a"], + [68609, 0, "s"], + [68610, 0, " "], + [68611, 0, "t"], + [68612, 0, "h"], + [68613, 0, "e"], + [68614, 0, " "], + [68615, 0, "a"], + [68616, 0, "d"], + [68617, 0, "v"], + [68618, 0, "a"], + [68619, 0, "n"], + [68620, 0, "t"], + [68621, 0, "a"], + [68622, 0, "g"], + [68623, 0, "e"], + [68624, 0, " "], + [68625, 0, "o"], + [68626, 0, "f"], + [68627, 0, " "], + [68628, 0, "s"], + [68629, 0, "i"], + [68630, 0, "m"], + [68631, 0, "p"], + [68632, 0, "l"], + [68633, 0, "i"], + [68634, 0, "f"], + [68635, 0, "y"], + [68636, 0, "i"], + [68637, 0, "n"], + [68638, 0, "g"], + [68639, 0, " "], + [68640, 0, "t"], + [68641, 0, "h"], + [68642, 0, "e"], + [68643, 0, " "], + [68644, 0, "t"], + [68645, 0, "r"], + [68646, 0, "a"], + [68647, 0, "n"], + [68648, 0, "s"], + [68649, 0, "f"], + [68650, 0, "o"], + [68651, 0, "r"], + [68652, 0, "m"], + [68653, 0, "a"], + [68654, 0, "t"], + [68655, 0, "i"], + [68656, 0, "o"], + [68657, 0, "n"], + [68658, 0, " "], + [68638, 1], + [68637, 1], + [68636, 1], + [68635, 1], + [68634, 1], + [68633, 1], + [68632, 1], + [68631, 1], + [68630, 1], + [68629, 1], + [68628, 1], + [68627, 1], + [68627, 0, " "], + [68628, 0, "m"], + [68629, 0, "a"], + [68630, 0, "k"], + [68631, 0, "i"], + [68632, 0, "n"], + [68633, 0, "g"], + [68654, 0, "f"], + [68655, 0, "u"], + [68656, 0, "n"], + [68657, 0, "c"], + [68658, 0, "t"], + [68659, 0, "i"], + [68660, 0, "o"], + [68661, 0, "n"], + [68662, 0, "s"], + [68663, 0, " "], + [68664, 0, "s"], + [68665, 0, "i"], + [68666, 0, "m"], + [68667, 0, "p"], + [68668, 0, "l"], + [68669, 0, "e"], + [68670, 0, "r"], + [68671, 0, " "], + [68672, 0, "a"], + [68673, 0, "n"], + [68674, 0, "d"], + [68675, 0, " "], + [68676, 0, "l"], + [68677, 0, "e"], + [68678, 0, "s"], + [68679, 0, "s"], + [68680, 0, " "], + [68681, 0, "e"], + [68682, 0, "r"], + [68683, 0, "r"], + [68684, 0, "o"], + [68685, 0, "r"], + [68686, 0, "-"], + [68687, 0, "p"], + [68688, 0, "r"], + [68689, 0, "o"], + [68690, 0, "n"], + [68691, 0, "e"], + [68692, 0, "~"], + [68693, 0, "\\"], + [68694, 0, "c"], + [68695, 0, "i"], + [68696, 0, "t"], + [68697, 0, "e"], + [68698, 0, "{"], + [68699, 0, "I"], + [68700, 0, "m"], + [68701, 0, "i"], + [68702, 0, "n"], + [68703, 0, "e"], + [68704, 0, ":"], + [68705, 0, "2"], + [68706, 0, "0"], + [68707, 0, "0"], + [68708, 0, "3"], + [68709, 0, "k"], + [68710, 0, "s"], + [68711, 0, "}"], + [68712, 0, ","], + [68713, 0, " "], + [68714, 0, "b"], + [68715, 0, "u"], + [68716, 0, "t"], + [68717, 0, " "], + [68718, 0, "i"], + [68719, 0, "t"], + [68720, 0, " "], + [68721, 0, "i"], + [68722, 0, "s"], + [68723, 0, " "], + [68724, 0, "n"], + [68725, 0, "o"], + [68726, 0, "t"], + [68727, 0, " "], + [68728, 0, "a"], + [68729, 0, "c"], + [68730, 0, "c"], + [68731, 0, "e"], + [68732, 0, "p"], + [68733, 0, "t"], + [68734, 0, "a"], + [68735, 0, "b"], + [68736, 0, "l"], + [68737, 0, "e"], + [68738, 0, " "], + [68600, 0, ","], + [68601, 0, " "], + [68602, 0, "a"], + [68603, 0, " "], + [68604, 0, "d"], + [68605, 0, "e"], + [68606, 0, "s"], + [68607, 0, "i"], + [68608, 0, "g"], + [68609, 0, "n"], + [68610, 0, " "], + [68611, 0, "d"], + [68612, 0, "e"], + [68613, 0, "c"], + [68614, 0, "i"], + [68615, 0, "s"], + [68616, 0, "i"], + [68617, 0, "o"], + [68618, 0, "n"], + [68619, 0, " "], + [68620, 0, "i"], + [68621, 0, "n"], + [68622, 0, "h"], + [68623, 0, "e"], + [68624, 0, "r"], + [68625, 0, "i"], + [68626, 0, "t"], + [68627, 0, "e"], + [68628, 0, "d"], + [68629, 0, " "], + [68630, 0, "f"], + [68631, 0, "r"], + [68632, 0, "o"], + [68633, 0, "m"], + [68634, 0, " "], + [68635, 0, "t"], + [68636, 0, "h"], + [68637, 0, "e"], + [68638, 0, " "], + [68639, 0, "J"], + [68640, 0, "u"], + [68641, 0, "p"], + [68642, 0, "i"], + [68643, 0, "t"], + [68644, 0, "e"], + [68645, 0, "r"], + [68646, 0, " "], + [68647, 0, "s"], + [68648, 0, "y"], + [68649, 0, "s"], + [68650, 0, "t"], + [68651, 0, "e"], + [68652, 0, "m"], + [68653, 0, "~"], + [68654, 0, "\\"], + [68655, 0, "c"], + [68656, 0, "i"], + [68657, 0, "t"], + [68658, 0, "e"], + [68659, 0, "{"], + [68660, 0, "N"], + [68661, 0, "i"], + [68662, 0, "c"], + [68663, 0, "h"], + [68664, 0, "o"], + [68665, 0, "l"], + [68666, 0, "s"], + [68667, 0, ":"], + [68668, 0, "1"], + [68669, 0, "9"], + [68670, 0, "9"], + [68671, 0, "5"], + [68672, 0, "f"], + [68673, 0, "d"], + [68674, 0, "}"], + [68813, 1], + [68812, 1], + [68811, 1], + [68810, 1], + [68809, 1], + [68808, 1], + [68807, 1], + [68806, 1], + [68805, 1], + [68804, 1], + [68803, 1], + [68802, 1], + [68801, 1], + [68800, 1], + [68799, 1], + [68798, 1], + [68797, 1], + [68796, 1], + [68795, 1], + [68794, 1], + [68793, 1], + [68682, 0, "a"], + [68683, 0, "p"], + [68684, 0, "p"], + [68685, 0, "r"], + [68686, 0, "o"], + [68687, 0, "a"], + [68688, 0, "c"], + [68689, 0, "h"], + [68690, 0, " "], + [68802, 0, "i"], + [68803, 0, "t"], + [68804, 0, " "], + [68805, 0, "d"], + [68806, 0, "o"], + [68807, 0, "e"], + [68808, 0, "s"], + [68809, 0, " "], + [68810, 0, "n"], + [68811, 0, "o"], + [68812, 0, "t"], + [68813, 0, " "], + [68814, 0, "m"], + [68815, 0, "e"], + [68816, 0, "e"], + [68817, 0, "t"], + [68818, 0, " "], + [68819, 0, "o"], + [68820, 0, "u"], + [68821, 0, "r"], + [68822, 0, " "], + [68823, 0, "r"], + [68824, 0, "e"], + [68825, 0, "q"], + [68826, 0, "u"], + [68827, 0, "i"], + [68828, 0, "r"], + [68829, 0, "e"], + [68830, 0, "m"], + [68831, 0, "e"], + [68832, 0, "n"], + [68833, 0, "t"], + [68834, 0, "s"], + [68835, 0, " "], + [68835, 1], + [68835, 0, ","], + [68836, 0, " "], + [68837, 0, "s"], + [68838, 0, "i"], + [68839, 0, "n"], + [68840, 0, "c"], + [68841, 0, "e"], + [68842, 0, " "], + [68843, 0, "w"], + [68844, 0, "e"], + [68845, 0, " "], + [68846, 0, "w"], + [68847, 0, "a"], + [68848, 0, "n"], + [68849, 0, "t"], + [68850, 0, " "], + [68851, 0, "t"], + [68852, 0, "o"], + [68853, 0, " "], + [68854, 0, "s"], + [68855, 0, "u"], + [68856, 0, "p"], + [68857, 0, "p"], + [68858, 0, "o"], + [68859, 0, "r"], + [68860, 0, "t"], + [68861, 0, " "], + [68862, 0, "c"], + [68863, 0, "o"], + [68864, 0, "l"], + [68865, 0, "l"], + [68866, 0, "a"], + [68867, 0, "b"], + [68868, 0, "o"], + [68869, 0, "r"], + [68870, 0, "a"], + [68871, 0, "t"], + [68872, 0, "i"], + [68873, 0, "o"], + [68874, 0, "n"], + [68875, 0, " "], + [68876, 0, "w"], + [68877, 0, "i"], + [68878, 0, "t"], + [68879, 0, "h"], + [68880, 0, "o"], + [68881, 0, "u"], + [68882, 0, "t"], + [68883, 0, " "], + [68861, 0, " "], + [68862, 0, "p"], + [68863, 0, "e"], + [68864, 0, "e"], + [68865, 0, "r"], + [68866, 0, "-"], + [68867, 0, "t"], + [68868, 0, "o"], + [68869, 0, "-"], + [68870, 0, "p"], + [68871, 0, "e"], + [68872, 0, "e"], + [68873, 0, "r"], + [68897, 0, "r"], + [68898, 0, "e"], + [68899, 0, "l"], + [68900, 0, "y"], + [68901, 0, "i"], + [68902, 0, "n"], + [68903, 0, "g"], + [68904, 0, " "], + [68904, 1], + [68903, 1], + [68902, 1], + [68901, 1], + [68900, 1], + [68899, 1], + [68899, 0, "q"], + [68900, 0, "u"], + [68901, 0, "i"], + [68902, 0, "r"], + [68903, 0, "i"], + [68904, 0, "n"], + [68905, 0, "g"], + [68906, 0, " "], + [68907, 0, "a"], + [68908, 0, " "], + [68909, 0, "s"], + [68910, 0, "i"], + [68911, 0, "n"], + [68912, 0, "g"], + [68913, 0, "l"], + [68914, 0, "e"], + [68915, 0, " "], + [68916, 0, "s"], + [68917, 0, "e"], + [68918, 0, "r"], + [68919, 0, "v"], + [68920, 0, "e"], + [68921, 0, "r"], + [68922, 0, "."], + [68923, 0, " "], + [68924, 0, "D"], + [68925, 0, "e"], + [68926, 0, "c"], + [68927, 0, "i"], + [68928, 0, "d"], + [68929, 0, "i"], + [68930, 0, "n"], + [68931, 0, "g"], + [68932, 0, " "], + [68933, 0, "o"], + [68934, 0, "n"], + [68935, 0, " "], + [68924, 1], + [68924, 0, "A"], + [68925, 0, "l"], + [68926, 0, "t"], + [68927, 0, "h"], + [68928, 0, "o"], + [68929, 0, "u"], + [68930, 0, "g"], + [68931, 0, "h"], + [68932, 0, " "], + [68933, 0, "i"], + [68934, 0, "t"], + [68935, 0, " "], + [68936, 0, "p"], + [68936, 1], + [68936, 0, "i"], + [68937, 0, "s"], + [68938, 0, " "], + [68939, 0, "p"], + [68940, 0, "o"], + [68941, 0, "s"], + [68942, 0, "s"], + [68943, 0, "i"], + [68944, 0, "b"], + [68945, 0, "l"], + [68946, 0, "e"], + [68947, 0, " "], + [68948, 0, "t"], + [68949, 0, "o"], + [68950, 0, " "], + [68951, 0, "d"], + [68958, 1], + [68957, 1], + [68956, 1], + [68956, 0, "e"], + [68961, 0, "a"], + [68962, 0, " "], + [68963, 0, "t"], + [68964, 0, "o"], + [68965, 0, "t"], + [68966, 0, "a"], + [68967, 0, "l"], + [68968, 0, " "], + [68969, 0, "o"], + [68970, 0, "r"], + [68971, 0, "d"], + [68972, 0, "e"], + [68973, 0, "r"], + [68974, 0, "i"], + [68975, 0, "n"], + [68976, 0, "g"], + [68977, 0, " "], + [68978, 0, "o"], + [68979, 0, "f"], + [68980, 0, " "], + [68981, 0, "o"], + [68982, 0, "p"], + [68983, 0, "e"], + [68984, 0, "r"], + [68985, 0, "a"], + [68986, 0, "t"], + [68987, 0, "i"], + [68988, 0, "o"], + [68989, 0, "n"], + [68990, 0, "s"], + [68991, 0, " "], + [68992, 0, "b"], + [68993, 0, "y"], + [68994, 0, " "], + [68995, 0, "u"], + [68996, 0, "s"], + [68997, 0, "i"], + [68998, 0, "n"], + [68999, 0, "g"], + [69000, 0, " "], + [69001, 0, "a"], + [69002, 0, "n"], + [69003, 0, " "], + [69004, 0, "a"], + [69005, 0, "t"], + [69006, 0, "o"], + [69007, 0, "m"], + [69008, 0, "i"], + [69009, 0, "c"], + [69010, 0, " "], + [69011, 0, "b"], + [69012, 0, "r"], + [69013, 0, "o"], + [69014, 0, "a"], + [69015, 0, "d"], + [69016, 0, "c"], + [69017, 0, "a"], + [69018, 0, "s"], + [69019, 0, "t"], + [69020, 0, " "], + [69021, 0, "p"], + [69022, 0, "r"], + [69023, 0, "o"], + [69024, 0, "t"], + [69025, 0, "o"], + [69026, 0, "c"], + [69027, 0, "o"], + [69028, 0, "l"], + [69029, 0, "~"], + [69030, 0, "\\"], + [69031, 0, "c"], + [69032, 0, "i"], + [69033, 0, "t"], + [69034, 0, "e"], + [69035, 0, "{"], + [69036, 0, "D"], + [69037, 0, "e"], + [69038, 0, "f"], + [69039, 0, "a"], + [69040, 0, "g"], + [69041, 0, "o"], + [69042, 0, ":"], + [69043, 0, "2"], + [69044, 0, "0"], + [69045, 0, "0"], + [69046, 0, "4"], + [69047, 0, "j"], + [69048, 0, "i"], + [69049, 0, "}"], + [69050, 0, ","], + [69051, 0, " "], + [69052, 0, "s"], + [69053, 0, "u"], + [69054, 0, "c"], + [69055, 0, "h"], + [69056, 0, " "], + [69057, 0, "p"], + [69058, 0, "r"], + [69059, 0, "o"], + [69060, 0, "t"], + [69061, 0, "o"], + [69062, 0, "c"], + [69063, 0, "o"], + [69064, 0, "l"], + [69065, 0, "s"], + [69066, 0, " "], + [69067, 0, "a"], + [69068, 0, "r"], + [69069, 0, "e"], + [69070, 0, " "], + [69071, 0, "e"], + [69072, 0, "q"], + [69073, 0, "u"], + [69074, 0, "i"], + [69075, 0, "v"], + [69076, 0, "a"], + [69077, 0, "l"], + [69078, 0, "e"], + [69079, 0, "n"], + [69080, 0, "t"], + [69081, 0, " "], + [69082, 0, "t"], + [69083, 0, "o"], + [69084, 0, " "], + [69085, 0, "c"], + [69086, 0, "o"], + [69087, 0, "n"], + [69088, 0, "s"], + [69089, 0, "e"], + [69090, 0, "n"], + [69091, 0, "s"], + [69092, 0, "u"], + [69093, 0, "s"], + [69094, 0, "~"], + [69095, 0, "\\"], + [69096, 0, "c"], + [69097, 0, "i"], + [69098, 0, "t"], + [69099, 0, "e"], + [69100, 0, "{"], + [69101, 0, "C"], + [69102, 0, "h"], + [69103, 0, "a"], + [69104, 0, "n"], + [69105, 0, "d"], + [69106, 0, "r"], + [69107, 0, "a"], + [69108, 0, ":"], + [69109, 0, "1"], + [69110, 0, "9"], + [69111, 0, "9"], + [69112, 0, "6"], + [69113, 0, "c"], + [69114, 0, "p"], + [69115, 0, "}"], + [69116, 0, ","], + [69117, 0, " "], + [69118, 0, "s"], + [69119, 0, "o"], + [69120, 0, " "], + [69121, 0, "t"], + [69122, 0, "h"], + [69123, 0, "e"], + [69124, 0, "y"], + [69125, 0, " "], + [69126, 0, "c"], + [69127, 0, "a"], + [69128, 0, "n"], + [69129, 0, " "], + [69130, 0, "o"], + [69131, 0, "n"], + [69132, 0, "l"], + [69133, 0, "y"], + [69134, 0, " "], + [69135, 0, "m"], + [69136, 0, "a"], + [69137, 0, "k"], + [69138, 0, "e"], + [69139, 0, " "], + [69140, 0, "p"], + [69141, 0, "r"], + [69142, 0, "o"], + [69143, 0, "g"], + [69144, 0, "r"], + [69145, 0, "e"], + [69146, 0, "s"], + [69147, 0, "s"], + [69135, 0, "s"], + [69136, 0, "a"], + [69137, 0, "f"], + [69138, 0, "e"], + [69139, 0, "l"], + [69140, 0, "y"], + [69141, 0, " "], + [69155, 0, " "], + [69156, 0, "i"], + [69157, 0, "f"], + [69158, 0, " "], + [69159, 0, "a"], + [69160, 0, " "], + [69161, 0, "m"], + [69162, 0, "a"], + [69163, 0, "j"], + [69164, 0, "o"], + [69165, 0, "r"], + [69166, 0, "i"], + [69167, 0, "t"], + [69168, 0, "y"], + [69169, 0, " "], + [69170, 0, "o"], + [69171, 0, "f"], + [69172, 0, " "], + [69173, 0, "p"], + [69174, 0, "a"], + [69175, 0, "r"], + [69176, 0, "t"], + [69177, 0, "i"], + [69178, 0, "c"], + [69179, 0, "i"], + [69180, 0, "p"], + [69181, 0, "a"], + [69182, 0, "n"], + [69183, 0, "t"], + [69184, 0, "s"], + [69185, 0, " "], + [69186, 0, "a"], + [69187, 0, "r"], + [69188, 0, "e"], + [69189, 0, " "], + [69190, 0, "o"], + [69191, 0, "n"], + [69192, 0, "l"], + [69193, 0, "i"], + [69194, 0, "n"], + [69195, 0, "e"], + [69196, 0, " "], + [69197, 0, "a"], + [69198, 0, "n"], + [69199, 0, "d"], + [69200, 0, " "], + [69201, 0, "r"], + [69202, 0, "e"], + [69203, 0, "a"], + [69204, 0, "c"], + [69205, 0, "h"], + [69206, 0, "a"], + [69207, 0, "b"], + [69208, 0, "l"], + [69209, 0, "e"], + [69210, 0, "."], + [69211, 0, " "], + [69212, 0, "W"], + [69213, 0, "e"], + [69214, 0, " "], + [69215, 0, "e"], + [69216, 0, "x"], + [69217, 0, "p"], + [69218, 0, "e"], + [69219, 0, "c"], + [69220, 0, "t"], + [69221, 0, " "], + [69222, 0, "t"], + [69223, 0, "h"], + [69224, 0, "a"], + [69225, 0, "t"], + [69226, 0, " "], + [69227, 0, "i"], + [69228, 0, "n"], + [69229, 0, " "], + [69230, 0, "p"], + [69231, 0, "e"], + [69232, 0, "e"], + [69233, 0, "r"], + [69234, 0, "-"], + [69235, 0, "t"], + [69236, 0, "o"], + [69237, 0, "-"], + [69238, 0, "p"], + [69239, 0, "e"], + [69240, 0, "e"], + [69241, 0, "r"], + [69242, 0, " "], + [69243, 0, "s"], + [69244, 0, "y"], + [69245, 0, "s"], + [69246, 0, "t"], + [69247, 0, "e"], + [69248, 0, "m"], + [69249, 0, "s"], + [69250, 0, " "], + [69251, 0, "w"], + [69252, 0, "i"], + [69253, 0, "t"], + [69254, 0, "h"], + [69051, 0, " "], + [69052, 0, "w"], + [69053, 0, "h"], + [69054, 0, "i"], + [69055, 0, "c"], + [69056, 0, "h"], + [69057, 0, " "], + [69058, 0, "a"], + [69059, 0, "v"], + [69060, 0, "o"], + [69061, 0, "i"], + [69062, 0, "d"], + [69063, 0, "s"], + [69064, 0, " "], + [69065, 0, "r"], + [69066, 0, "e"], + [69067, 0, "l"], + [69068, 0, "y"], + [69069, 0, "i"], + [69070, 0, "n"], + [69071, 0, "g"], + [69072, 0, " "], + [69073, 0, "o"], + [69074, 0, "n"], + [69075, 0, " "], + [69076, 0, "a"], + [69077, 0, " "], + [69078, 0, "s"], + [69079, 0, "i"], + [69080, 0, "n"], + [69081, 0, "g"], + [69082, 0, "l"], + [69083, 0, "e"], + [69084, 0, " "], + [69085, 0, "s"], + [69086, 0, "e"], + [69087, 0, "r"], + [69088, 0, "v"], + [69089, 0, "e"], + [69090, 0, "r"], + [69091, 0, ","], + [68923, 1], + [68923, 0, "\n"], + [68924, 0, "\n"], + [69296, 1], + [69295, 1], + [69294, 1], + [69293, 1], + [69293, 0, "o"], + [69294, 0, "f"], + [69295, 0, " "], + [69296, 0, "m"], + [69297, 0, "o"], + [69298, 0, "b"], + [69299, 0, "i"], + [69300, 0, "l"], + [69301, 0, "e"], + [69302, 0, " "], + [69303, 0, "d"], + [69304, 0, "e"], + [69305, 0, "v"], + [69306, 0, "i"], + [69307, 0, "c"], + [69308, 0, "e"], + [69309, 0, "s"], + [69310, 0, " "], + [69311, 0, "i"], + [69312, 0, "t"], + [69313, 0, " "], + [69314, 0, "w"], + [69315, 0, "i"], + [69316, 0, "l"], + [69317, 0, "l"], + [69318, 0, " "], + [69319, 0, "f"], + [69320, 0, "r"], + [69321, 0, "e"], + [69322, 0, "q"], + [69323, 0, "u"], + [69324, 0, "e"], + [69325, 0, "n"], + [69326, 0, "t"], + [69327, 0, "l"], + [69328, 0, "y"], + [69329, 0, " "], + [69330, 0, "b"], + [69331, 0, "e"], + [69332, 0, " "], + [69333, 0, "t"], + [69334, 0, "h"], + [69335, 0, "e"], + [69336, 0, " "], + [69337, 0, "c"], + [69338, 0, "a"], + [69339, 0, "s"], + [69340, 0, "e"], + [69341, 0, " "], + [69342, 0, "t"], + [69343, 0, "h"], + [69344, 0, "a"], + [69345, 0, "t"], + [69346, 0, " "], + [69347, 0, "o"], + [69348, 0, "n"], + [69349, 0, "l"], + [69350, 0, "y"], + [69351, 0, " "], + [69352, 0, "a"], + [69353, 0, " "], + [69354, 0, "m"], + [69355, 0, "i"], + [69356, 0, "n"], + [69357, 0, "o"], + [69358, 0, "r"], + [69359, 0, "i"], + [69360, 0, "t"], + [69361, 0, "y"], + [69362, 0, " "], + [69363, 0, "o"], + [69364, 0, "f"], + [69365, 0, " "], + [69366, 0, "p"], + [69367, 0, "a"], + [69368, 0, "r"], + [69369, 0, "t"], + [69370, 0, "i"], + [69371, 0, "c"], + [69372, 0, "i"], + [69373, 0, "p"], + [69374, 0, "a"], + [69375, 0, "n"], + [69376, 0, "t"], + [69377, 0, "s"], + [69378, 0, " "], + [69379, 0, "a"], + [69380, 0, "r"], + [69381, 0, "e"], + [69382, 0, " "], + [69383, 0, "o"], + [69384, 0, "n"], + [69385, 0, "l"], + [69386, 0, "i"], + [69387, 0, "n"], + [69388, 0, "e"], + [69389, 0, " "], + [69390, 0, "a"], + [69391, 0, "t"], + [69392, 0, " "], + [69393, 0, "t"], + [69394, 0, "h"], + [69395, 0, "e"], + [69396, 0, " "], + [69397, 0, "s"], + [69398, 0, "a"], + [69399, 0, "m"], + [69400, 0, "e"], + [69401, 0, " "], + [69402, 0, "t"], + [69403, 0, "i"], + [69404, 0, "m"], + [69405, 0, "e"], + [69406, 0, ","], + [69407, 0, " "], + [69408, 0, "a"], + [69409, 0, "n"], + [69410, 0, "d"], + [69411, 0, " "], + [69412, 0, "s"], + [69413, 0, "o"], + [69414, 0, " "], + [69415, 0, "a"], + [69416, 0, "n"], + [69417, 0, "y"], + [69418, 0, " "], + [69419, 0, "a"], + [69420, 0, "l"], + [69421, 0, "g"], + [69422, 0, "o"], + [69423, 0, "r"], + [69424, 0, "i"], + [69425, 0, "t"], + [69426, 0, "h"], + [69427, 0, "m"], + [69428, 0, " "], + [69429, 0, "t"], + [69430, 0, "h"], + [69431, 0, "a"], + [69432, 0, "t"], + [69433, 0, " "], + [69434, 0, "r"], + [69435, 0, "e"], + [69436, 0, "l"], + [69437, 0, "i"], + [69438, 0, "e"], + [69439, 0, "s"], + [69440, 0, " "], + [69440, 1], + [69439, 1], + [69438, 1], + [69437, 1], + [69436, 1], + [69435, 1], + [69434, 1], + [69433, 1], + [69432, 1], + [69431, 1], + [69430, 1], + [69429, 1], + [69428, 1], + [69427, 1], + [69426, 1], + [69425, 1], + [69424, 1], + [69423, 1], + [69422, 1], + [69421, 1], + [69420, 1], + [69419, 1], + [69418, 1], + [69417, 1], + [69416, 1], + [69415, 1], + [69414, 1], + [69414, 0, " "], + [69415, 0, "t"], + [69416, 0, "h"], + [69417, 0, "e"], + [69418, 0, " "], + [69419, 0, "s"], + [69420, 0, "y"], + [69421, 0, "s"], + [69422, 0, "t"], + [69423, 0, "e"], + [69424, 0, "m"], + [69425, 0, " "], + [69426, 0, "w"], + [69427, 0, "i"], + [69428, 0, "l"], + [69429, 0, "l"], + [69430, 0, " "], + [69431, 0, "n"], + [69432, 0, "o"], + [69433, 0, "t"], + [69434, 0, " "], + [69435, 0, "b"], + [69436, 0, "e"], + [69437, 0, " "], + [69438, 0, "a"], + [69439, 0, "b"], + [69440, 0, "l"], + [69441, 0, "e"], + [69442, 0, " "], + [69442, 1], + [69441, 1], + [69440, 1], + [69439, 1], + [69438, 1], + [69437, 1], + [69436, 1], + [69435, 1], + [69434, 1], + [69433, 1], + [69432, 1], + [69431, 1], + [69430, 1], + [69429, 1], + [69428, 1], + [69427, 1], + [69426, 1], + [69425, 1], + [69424, 1], + [69423, 1], + [69422, 1], + [69421, 1], + [69420, 1], + [69419, 1], + [69418, 1], + [69417, 1], + [69416, 1], + [69415, 1], + [69415, 0, "a"], + [69416, 0, "n"], + [69417, 0, "y"], + [69418, 0, " "], + [69419, 0, "a"], + [69420, 0, "l"], + [69421, 0, "g"], + [69422, 0, "o"], + [69423, 0, "r"], + [69424, 0, "i"], + [69425, 0, "t"], + [69426, 0, "h"], + [69427, 0, "m"], + [69428, 0, " "], + [69429, 0, "r"], + [69430, 0, "e"], + [69431, 0, "q"], + [69432, 0, "u"], + [69433, 0, "i"], + [69434, 0, "r"], + [69435, 0, "i"], + [69436, 0, "n"], + [69437, 0, "g"], + [69438, 0, " "], + [69439, 0, "a"], + [69440, 0, "t"], + [69441, 0, "o"], + [69442, 0, "m"], + [69443, 0, "i"], + [69444, 0, "c"], + [69445, 0, " "], + [69446, 0, "b"], + [69447, 0, "r"], + [69448, 0, "o"], + [69449, 0, "a"], + [69450, 0, "d"], + [69451, 0, "c"], + [69452, 0, "a"], + [69453, 0, "s"], + [69454, 0, "t"], + [69455, 0, " "], + [69456, 0, "w"], + [69457, 0, "o"], + [69458, 0, "u"], + [69459, 0, "l"], + [69460, 0, "d"], + [69461, 0, " "], + [69462, 0, "b"], + [69463, 0, "e"], + [69464, 0, "c"], + [69465, 0, "o"], + [69466, 0, "m"], + [69467, 0, "e"], + [69468, 0, " "], + [69469, 0, "u"], + [69470, 0, "n"], + [69471, 0, "a"], + [69472, 0, "v"], + [69473, 0, "a"], + [69474, 0, "i"], + [69475, 0, "l"], + [69476, 0, "a"], + [69477, 0, "b"], + [69478, 0, "l"], + [69479, 0, "e"], + [69480, 0, "."], + [69481, 0, " "], + [69482, 0, "T"], + [69483, 0, "h"], + [69484, 0, "e"], + [69485, 0, " "], + [69486, 0, "s"], + [69487, 0, "t"], + [69488, 0, "r"], + [69489, 0, "o"], + [69490, 0, "n"], + [69491, 0, "g"], + [69492, 0, "e"], + [69493, 0, "s"], + [69494, 0, "t"], + [69495, 0, " "], + [69496, 0, "g"], + [69497, 0, "u"], + [69498, 0, "a"], + [69499, 0, "r"], + [69500, 0, "a"], + [69501, 0, "r"], + [69502, 0, "a"], + [69503, 0, "n"], + [69504, 0, "t"], + [69505, 0, "e"], + [69506, 0, "e"], + [69507, 0, " "], + [69508, 0, "s"], + [69509, 0, "u"], + [69510, 0, "c"], + [69511, 0, "h"], + [69512, 0, " "], + [69513, 0, "a"], + [69514, 0, " "], + [69515, 0, "s"], + [69516, 0, "y"], + [69517, 0, "s"], + [69518, 0, "t"], + [69519, 0, "e"], + [69520, 0, "m"], + [69521, 0, " "], + [69522, 0, "c"], + [69523, 0, "a"], + [69524, 0, "n"], + [69525, 0, " "], + [69526, 0, "g"], + [69527, 0, "i"], + [69528, 0, "v"], + [69529, 0, "e"], + [69530, 0, " "], + [69531, 0, "i"], + [69532, 0, "s"], + [69533, 0, " "], + [69534, 0, "c"], + [69535, 0, "a"], + [69536, 0, "u"], + [69537, 0, "s"], + [69538, 0, "a"], + [69539, 0, "l"], + [69540, 0, " "], + [69541, 0, "o"], + [69542, 0, "r"], + [69543, 0, "d"], + [69544, 0, "e"], + [69545, 0, "r"], + [69546, 0, "i"], + [69547, 0, "n"], + [69548, 0, "g"], + [69549, 0, "~"], + [69550, 0, "\\"], + [69551, 0, "c"], + [69552, 0, "i"], + [69553, 0, "t"], + [69554, 0, "e"], + [69555, 0, "{"], + [69556, 0, "A"], + [69557, 0, "t"], + [69558, 0, "t"], + [69559, 0, "i"], + [69560, 0, "y"], + [69561, 0, "a"], + [69562, 0, ":"], + [69563, 0, "2"], + [69564, 0, "0"], + [69565, 0, "1"], + [69566, 0, "5"], + [69567, 0, "d"], + [69568, 0, "m"], + [69569, 0, "}"], + [69570, 0, "."], + [69571, 0, "\n"], + [69572, 0, "\n"], + [69573, 0, "T"], + [69574, 0, "h"], + [69575, 0, "e"], + [69576, 0, " "], + [69577, 0, "C"], + [69578, 0, "R"], + [69579, 0, "D"], + [69580, 0, "T"], + [69581, 0, " "], + [69582, 0, "f"], + [69583, 0, "a"], + [69584, 0, "m"], + [69585, 0, "i"], + [69586, 0, "l"], + [69587, 0, "y"], + [69588, 0, " "], + [69589, 0, "o"], + [69590, 0, "f"], + [69591, 0, " "], + [69592, 0, "d"], + [69593, 0, "a"], + [69594, 0, "t"], + [69595, 0, "a"], + [69596, 0, " "], + [69597, 0, "s"], + [69598, 0, "t"], + [69599, 0, "r"], + [69600, 0, "u"], + [69601, 0, "c"], + [69602, 0, "t"], + [69603, 0, "u"], + [69604, 0, "r"], + [69605, 0, "e"], + [69606, 0, "s"], + [69607, 0, " "], + [69573, 0, "F"], + [69574, 0, "o"], + [69575, 0, "r"], + [69576, 0, " "], + [69577, 1], + [69577, 0, "t"], + [69611, 1], + [69611, 0, ","], + [69612, 0, " "], + [69613, 0, "c"], + [69614, 0, "a"], + [69615, 0, "u"], + [69616, 0, "s"], + [69617, 0, "a"], + [69618, 0, "l"], + [69619, 0, " "], + [69620, 0, "o"], + [69621, 0, "r"], + [69622, 0, "d"], + [69623, 0, "e"], + [69624, 0, "r"], + [69625, 0, "i"], + [69626, 0, "n"], + [69627, 0, "g"], + [69628, 0, " "], + [69629, 0, "i"], + [69630, 0, "s"], + [69631, 0, " "], + [69632, 0, "s"], + [69633, 0, "u"], + [69634, 0, "f"], + [69635, 0, "f"], + [69636, 0, "i"], + [69637, 0, "c"], + [69638, 0, "i"], + [69639, 0, "e"], + [69640, 0, "n"], + [69641, 0, "t"], + [69642, 0, " "], + [69643, 0, "t"], + [69644, 0, "o"], + [69645, 0, " "], + [69646, 0, "a"], + [69647, 0, "c"], + [69648, 0, "h"], + [69649, 0, "i"], + [69650, 0, "e"], + [69651, 0, "v"], + [69652, 0, "e"], + [69653, 0, " "], + [69654, 0, "c"], + [69655, 0, "o"], + [69656, 0, "n"], + [69657, 0, "v"], + [69658, 0, "e"], + [69659, 0, "r"], + [69660, 0, "g"], + [69661, 0, "e"], + [69662, 0, "n"], + [69663, 0, "c"], + [69664, 0, "e"], + [69665, 0, "."], + [69572, 1], + [69571, 1], + [69570, 1], + [69570, 0, ","], + [69571, 0, " "], + [69572, 0, "a"], + [69573, 0, "n"], + [69574, 0, "d"], + [69575, 0, " "], + [69576, 1], + [69576, 0, "f"], + [68925, 0, " "], + [68925, 0, "M"], + [68926, 0, "a"], + [68927, 0, "n"], + [68928, 0, "y"], + [68929, 0, " "], + [68930, 0, "s"], + [68931, 0, "e"], + [68932, 0, "c"], + [68933, 0, "u"], + [68934, 0, "r"], + [68935, 0, "e"], + [68936, 0, " "], + [68937, 0, "m"], + [68938, 0, "e"], + [68939, 0, "s"], + [68940, 0, "s"], + [68941, 0, "a"], + [68942, 0, "g"], + [68943, 0, "i"], + [68944, 0, "n"], + [68945, 0, "g"], + [68946, 0, " "], + [68947, 0, "p"], + [68948, 0, "r"], + [68949, 0, "o"], + [68950, 0, "t"], + [68951, 0, "o"], + [68952, 0, "c"], + [68953, 0, "o"], + [68954, 0, "l"], + [68955, 0, "s"], + [68956, 0, ","], + [68957, 0, " "], + [68958, 0, "w"], + [68959, 0, "h"], + [68960, 0, "i"], + [68961, 0, "c"], + [68962, 0, "h"], + [68963, 0, " "], + [68964, 0, "w"], + [68965, 0, "e"], + [68966, 0, " "], + [68967, 0, "p"], + [68968, 0, "l"], + [68969, 0, "a"], + [68970, 0, "n"], + [68971, 0, " "], + [68972, 0, "t"], + [68973, 0, "o"], + [68974, 0, " "], + [68975, 0, "u"], + [68976, 0, "s"], + [68977, 0, "e"], + [68978, 0, " "], + [68979, 0, "f"], + [68980, 0, "o"], + [68981, 0, "r"], + [68982, 0, " "], + [68983, 0, "e"], + [68984, 0, "n"], + [68985, 0, "c"], + [68986, 0, "r"], + [68987, 0, "y"], + [68988, 0, "p"], + [68989, 0, "t"], + [68990, 0, "e"], + [68991, 0, "d"], + [68992, 0, " "], + [68993, 0, "d"], + [68993, 1], + [68993, 0, "c"], + [68994, 0, "o"], + [68995, 0, "l"], + [68996, 0, "l"], + [68997, 0, "a"], + [68998, 0, "b"], + [68999, 0, "o"], + [69000, 0, "r"], + [69001, 0, "a"], + [69002, 0, "t"], + [69003, 0, "i"], + [69004, 0, "o"], + [69005, 0, "n"], + [69006, 0, ","], + [69007, 0, " "], + [69008, 0, "d"], + [69009, 0, "o"], + [69010, 0, " "], + [69011, 0, "n"], + [69012, 0, "o"], + [69013, 0, "t"], + [69014, 0, " "], + [69015, 0, "g"], + [69016, 0, "u"], + [69017, 0, "a"], + [69018, 0, "r"], + [69019, 0, "a"], + [69020, 0, "n"], + [69021, 0, "t"], + [69022, 0, "e"], + [69023, 0, "e"], + [69024, 0, " "], + [69025, 0, "t"], + [69026, 0, "h"], + [69027, 0, "a"], + [69028, 0, "t"], + [69029, 0, " "], + [69030, 0, "d"], + [69031, 0, "i"], + [69032, 0, "f"], + [69033, 0, "f"], + [69034, 0, "e"], + [69035, 0, "r"], + [69036, 0, "e"], + [69037, 0, "n"], + [69038, 0, "t"], + [69039, 0, " "], + [69040, 0, "r"], + [69041, 0, "e"], + [69042, 0, "c"], + [69043, 0, "i"], + [69044, 0, "p"], + [69045, 0, "i"], + [69046, 0, "e"], + [69047, 0, "n"], + [69048, 0, "t"], + [69049, 0, "s"], + [69050, 0, " "], + [69051, 0, "w"], + [69052, 0, "i"], + [69053, 0, "l"], + [69054, 0, "l"], + [69055, 0, " "], + [69056, 0, "s"], + [69057, 0, "e"], + [69058, 0, "e"], + [69059, 0, " "], + [69060, 0, "m"], + [69061, 0, "e"], + [69062, 0, "s"], + [69063, 0, "s"], + [69064, 0, "a"], + [69065, 0, "g"], + [69066, 0, "e"], + [69067, 0, "s"], + [69068, 0, " "], + [69068, 1], + [69067, 1], + [69066, 1], + [69065, 1], + [69065, 0, "g"], + [69066, 0, "e"], + [69067, 0, "s"], + [69068, 0, " "], + [69069, 0, "i"], + [69070, 0, "n"], + [69071, 0, " "], + [69072, 0, "t"], + [69073, 0, "h"], + [69074, 0, "e"], + [69075, 0, " "], + [69076, 0, "s"], + [69077, 0, "a"], + [69078, 0, "m"], + [69079, 0, "e"], + [69080, 0, " "], + [69081, 0, "o"], + [69082, 0, "r"], + [69083, 0, "d"], + [69084, 0, "e"], + [69085, 0, "r"], + [69086, 0, "~"], + [69087, 0, "\\"], + [69088, 0, "c"], + [69089, 0, "i"], + [69090, 0, "t"], + [69091, 0, "e"], + [69092, 0, "{"], + [69093, 0, "U"], + [69094, 0, "n"], + [69095, 0, "g"], + [69096, 0, "e"], + [69097, 0, "r"], + [69098, 0, ":"], + [69099, 0, "2"], + [69100, 0, "0"], + [69101, 0, "1"], + [69102, 0, "5"], + [69103, 0, "k"], + [69104, 0, "g"], + [69105, 0, "}"], + [69106, 0, "."], + [67748, 0, "\n"], + [67749, 0, "\\"], + [67750, 0, "s"], + [67751, 0, "u"], + [67752, 0, "b"], + [67753, 0, "s"], + [67754, 0, "e"], + [67755, 0, "c"], + [67756, 0, "t"], + [67757, 0, "i"], + [67758, 0, "o"], + [67759, 0, "n"], + [67760, 0, "{"], + [67761, 0, "O"], + [67762, 0, "p"], + [67763, 0, "e"], + [67764, 0, "r"], + [67765, 0, "a"], + [67766, 0, "t"], + [67767, 0, "i"], + [67768, 0, "o"], + [67769, 0, "n"], + [67770, 0, "a"], + [67771, 0, "l"], + [67772, 0, " "], + [67773, 0, "t"], + [67774, 0, "r"], + [67775, 0, "a"], + [67776, 0, "n"], + [67777, 0, "s"], + [67778, 0, "f"], + [67779, 0, "o"], + [67780, 0, "r"], + [67781, 0, "m"], + [67782, 0, "a"], + [67783, 0, "t"], + [67784, 0, "i"], + [67785, 0, "o"], + [67786, 0, "n"], + [67787, 0, "}"], + [67788, 0, "\n"], + [69893, 0, "\n"], + [69894, 0, "\n"], + [69895, 0, "\\"], + [69896, 0, "s"], + [69897, 0, "u"], + [69898, 0, "b"], + [69899, 0, "s"], + [69900, 0, "e"], + [69901, 0, "c"], + [69902, 0, "t"], + [69903, 0, "i"], + [69904, 0, "o"], + [69905, 0, "n"], + [69906, 0, "{"], + [69907, 0, "C"], + [69908, 0, "R"], + [69909, 0, "D"], + [69910, 0, "T"], + [69911, 0, "s"], + [69912, 0, "}"], + [69891, 1], + [69890, 1], + [69889, 1], + [69888, 1], + [69887, 1], + [69886, 1], + [69885, 1], + [69884, 1], + [69883, 1], + [69882, 1], + [69881, 1], + [69880, 1], + [69879, 1], + [69878, 1], + [69877, 1], + [69876, 1], + [69875, 1], + [69874, 1], + [69873, 1], + [69872, 1], + [69871, 1], + [69870, 1], + [69869, 1], + [69868, 1], + [69867, 1], + [69866, 1], + [69865, 1], + [69864, 1], + [69863, 1], + [69862, 1], + [69861, 1], + [69860, 1], + [69859, 1], + [69858, 1], + [69857, 1], + [69856, 1], + [69855, 1], + [69854, 1], + [69853, 1], + [69852, 1], + [69851, 1], + [69850, 1], + [69849, 1], + [69848, 1], + [69847, 1], + [69846, 1], + [69845, 1], + [69844, 1], + [69843, 1], + [69842, 1], + [69841, 1], + [69840, 1], + [69839, 1], + [69838, 1], + [69837, 1], + [69836, 1], + [69835, 1], + [69834, 1], + [69833, 1], + [69832, 1], + [69831, 1], + [69830, 1], + [69829, 1], + [69828, 1], + [69827, 1], + [69826, 1], + [69825, 1], + [69824, 1], + [69823, 1], + [69822, 1], + [69821, 1], + [69820, 1], + [69819, 1], + [69818, 1], + [69817, 1], + [69816, 1], + [69815, 1], + [69814, 1], + [69813, 1], + [69812, 1], + [69811, 1], + [69810, 1], + [69809, 1], + [69808, 1], + [69807, 1], + [69806, 1], + [69805, 1], + [69804, 1], + [69803, 1], + [69802, 1], + [69801, 1], + [69800, 1], + [69799, 1], + [69798, 1], + [69797, 1], + [69796, 1], + [69795, 1], + [69794, 1], + [69795, 0, "\n"], + [69796, 0, "\n"], + [69797, 0, "T"], + [69798, 0, "h"], + [69799, 0, "e"], + [69800, 0, " "], + [69801, 0, "G"], + [69802, 0, "o"], + [69803, 0, "o"], + [69804, 0, "g"], + [69805, 0, "l"], + [69806, 0, "e"], + [69807, 0, " "], + [69808, 0, "R"], + [69809, 0, "e"], + [69810, 0, "a"], + [69811, 0, "l"], + [69812, 0, "t"], + [69813, 0, "i"], + [69814, 0, "m"], + [69815, 0, "e"], + [69816, 0, " "], + [69817, 0, "A"], + [69818, 0, "P"], + [69819, 0, "I"], + [69820, 0, "~"], + [69821, 0, "\\"], + [69822, 0, "c"], + [69823, 0, "i"], + [69824, 0, "t"], + [69825, 0, "e"], + [69826, 0, "{"], + [69827, 0, "G"], + [69828, 0, "o"], + [69829, 0, "o"], + [69830, 0, "g"], + [69831, 0, "l"], + [69832, 0, "e"], + [69833, 0, ":"], + [69834, 0, "2"], + [69835, 0, "0"], + [69836, 0, "1"], + [69837, 0, "5"], + [69838, 0, "v"], + [69839, 0, "k"], + [69840, 0, "}"], + [69841, 0, " "], + [69842, 0, "i"], + [69843, 0, "s"], + [69844, 0, " "], + [69845, 0, "t"], + [69846, 0, "h"], + [69847, 0, "e"], + [69848, 0, " "], + [69849, 0, "o"], + [69850, 0, "n"], + [69851, 0, "l"], + [69852, 0, "y"], + [69853, 0, " "], + [69854, 0, "i"], + [69855, 0, "m"], + [69856, 0, "p"], + [69857, 0, "l"], + [69858, 0, "e"], + [69859, 0, "m"], + [69860, 0, "e"], + [69861, 0, "n"], + [69862, 0, "t"], + [69863, 0, "a"], + [69864, 0, "t"], + [69865, 0, "i"], + [69866, 0, "o"], + [69867, 0, "n"], + [69868, 0, " "], + [69869, 0, "o"], + [69870, 0, "f"], + [69871, 0, " "], + [69872, 0, "O"], + [69873, 0, "T"], + [69874, 0, " "], + [69875, 0, "o"], + [69876, 0, "f"], + [69877, 0, " "], + [69878, 0, "w"], + [69879, 0, "h"], + [69880, 0, "i"], + [69881, 0, "c"], + [69882, 0, "h"], + [69883, 0, " "], + [69884, 0, "w"], + [69885, 0, "e"], + [69886, 0, " "], + [69887, 0, "a"], + [69888, 0, "w"], + [69889, 0, "a"], + [69890, 0, "r"], + [69891, 0, "e"], + [69892, 0, " "], + [69893, 0, "t"], + [69894, 0, "h"], + [69895, 0, "a"], + [69896, 0, "t"], + [69897, 0, " "], + [69898, 0, "s"], + [69899, 0, "u"], + [69900, 0, "p"], + [69901, 0, "p"], + [69902, 0, "o"], + [69903, 0, "r"], + [69904, 0, "t"], + [69905, 0, "s"], + [69906, 0, " "], + [69907, 0, "a"], + [69908, 0, "r"], + [69909, 0, "b"], + [69910, 0, "i"], + [69911, 0, "t"], + [69912, 0, "r"], + [69913, 0, "a"], + [69914, 0, "r"], + [69915, 0, "y"], + [69916, 0, " "], + [69917, 0, "n"], + [69918, 0, "e"], + [69919, 0, "s"], + [69920, 0, "t"], + [69921, 0, "i"], + [69922, 0, "n"], + [69923, 0, "g"], + [69924, 0, " "], + [69925, 0, "o"], + [69926, 0, "f"], + [69927, 0, " "], + [69928, 0, "l"], + [69929, 0, "i"], + [69930, 0, "s"], + [69931, 0, "t"], + [69932, 0, "s"], + [69933, 0, " "], + [69934, 0, "a"], + [69935, 0, "n"], + [69936, 0, "d"], + [69937, 0, " "], + [69938, 0, "m"], + [69939, 0, "a"], + [69940, 0, "p"], + [69941, 0, "s"], + [69942, 0, "."], + [69943, 0, " "], + [69944, 0, "H"], + [69945, 0, "o"], + [69946, 0, "w"], + [69947, 0, "e"], + [69948, 0, "v"], + [69949, 0, "e"], + [69950, 0, "r"], + [69951, 0, ","], + [69952, 0, " "], + [69953, 0, "i"], + [69954, 0, "t"], + [69955, 0, " "], + [69956, 0, "i"], + [69957, 0, "s"], + [69958, 0, " "], + [69958, 1], + [69957, 1], + [69956, 1], + [69956, 0, "a"], + [69957, 0, "l"], + [69958, 0, "s"], + [69959, 0, "o"], + [69960, 0, " "], + [69960, 1], + [69959, 1], + [69958, 1], + [69957, 1], + [69956, 1], + [69955, 1], + [69954, 1], + [69953, 1], + [69952, 1], + [69951, 1], + [69950, 1], + [69949, 1], + [69948, 1], + [69947, 1], + [69946, 1], + [69945, 1], + [69944, 1], + [69944, 0, "L"], + [69945, 0, "i"], + [69946, 0, "k"], + [69947, 0, "e"], + [69948, 0, " "], + [69949, 0, "G"], + [69950, 0, "o"], + [69951, 0, "o"], + [69952, 0, "g"], + [69953, 0, "l"], + [69954, 0, "e"], + [69955, 0, " "], + [69956, 0, "D"], + [69957, 0, "o"], + [69958, 0, "c"], + [69959, 0, "s"], + [69960, 0, ","], + [69961, 0, " "], + [69962, 0, "i"], + [69963, 0, "t"], + [69964, 0, " "], + [69965, 0, "a"], + [69966, 0, "p"], + [69967, 0, "p"], + [69968, 0, "e"], + [69969, 0, "a"], + [69970, 0, "r"], + [69971, 0, "s"], + [69972, 0, " "], + [69973, 0, "t"], + [69974, 0, "o"], + [69975, 0, " "], + [68641, 0, "~"], + [68642, 0, "\\"], + [68643, 0, "c"], + [68644, 0, "i"], + [68645, 0, "t"], + [68646, 0, "e"], + [68647, 0, "{"], + [68648, 0, "L"], + [68649, 0, "e"], + [68650, 0, "m"], + [68651, 0, "o"], + [68652, 0, "n"], + [68653, 0, "i"], + [68654, 0, "k"], + [68655, 0, ":"], + [68656, 0, "2"], + [68657, 0, "0"], + [68658, 0, "1"], + [68659, 0, "6"], + [68660, 0, "w"], + [68661, 0, "h"], + [68662, 0, "}"], + [69997, 1], + [69996, 1], + [69995, 1], + [69994, 1], + [69993, 1], + [69992, 1], + [69991, 1], + [69990, 1], + [69989, 1], + [69988, 1], + [69987, 1], + [69987, 0, "r"], + [69988, 0, "e"], + [69989, 0, "l"], + [69990, 0, "i"], + [69991, 0, "e"], + [69992, 0, "s"], + [69993, 0, " "], + [69994, 0, "o"], + [69995, 0, "n"], + [69996, 0, " "], + [69997, 0, "a"], + [69998, 0, " "], + [69999, 0, "s"], + [70000, 0, "i"], + [70001, 0, "n"], + [70002, 0, "g"], + [70003, 0, "l"], + [70004, 0, "e"], + [70005, 0, " "], + [70006, 0, "s"], + [70007, 0, "e"], + [70008, 0, "r"], + [70009, 0, "v"], + [70010, 0, "e"], + [70011, 0, "r"], + [70012, 0, "~"], + [70013, 0, "\\"], + [70014, 0, "c"], + [70015, 0, "i"], + [70016, 0, "t"], + [70017, 0, "e"], + [70018, 0, "{"], + [70019, 0, "L"], + [70020, 0, "e"], + [70021, 0, "m"], + [70022, 0, "o"], + [70023, 0, "n"], + [70024, 0, "i"], + [70025, 0, "k"], + [70026, 0, ":"], + [70027, 0, "2"], + [70028, 0, "0"], + [70029, 0, "1"], + [70030, 0, "6"], + [70031, 0, "w"], + [70032, 0, "h"], + [70033, 0, "}"], + [70034, 0, "."], + [70035, 0, " "], + [70036, 0, "A"], + [70037, 0, "s"], + [70038, 0, " "], + [70039, 0, "a"], + [70040, 0, " "], + [70041, 0, "p"], + [70042, 0, "r"], + [70043, 0, "o"], + [70044, 0, "p"], + [70045, 0, "r"], + [70046, 0, "i"], + [70047, 0, "e"], + [70048, 0, "t"], + [70049, 0, "a"], + [70050, 0, "r"], + [70051, 0, "y"], + [70052, 0, " "], + [70053, 0, "p"], + [70054, 0, "r"], + [70055, 0, "o"], + [70056, 0, "d"], + [70057, 0, "u"], + [70058, 0, "c"], + [70059, 0, "t"], + [70060, 0, ","], + [70061, 0, " "], + [70062, 0, "d"], + [70063, 0, "e"], + [70064, 0, "t"], + [70065, 0, "a"], + [70066, 0, "i"], + [70067, 0, "l"], + [70068, 0, "s"], + [70069, 0, " "], + [70070, 0, "o"], + [70071, 0, "f"], + [70072, 0, " "], + [70073, 0, "i"], + [70074, 0, "t"], + [70075, 0, "s"], + [70076, 0, " "], + [70077, 0, "a"], + [70078, 0, "l"], + [70079, 0, "g"], + [70080, 0, "o"], + [70081, 0, "r"], + [70082, 0, "i"], + [70083, 0, "t"], + [70084, 0, "h"], + [70085, 0, "m"], + [70086, 0, "s"], + [70087, 0, " "], + [70088, 0, "h"], + [70089, 0, "a"], + [70090, 0, "v"], + [70091, 0, "e"], + [70092, 0, " "], + [70093, 0, "n"], + [70094, 0, "o"], + [70095, 0, "t"], + [70096, 0, " "], + [70097, 0, "b"], + [70098, 0, "e"], + [70099, 0, "e"], + [70100, 0, "n"], + [70101, 0, " "], + [70102, 0, "p"], + [70103, 0, "u"], + [70104, 0, "b"], + [70105, 0, "l"], + [70106, 0, "s"], + [70107, 0, "i"], + [70107, 1], + [70106, 1], + [70106, 0, "i"], + [70107, 0, "s"], + [70108, 0, "h"], + [70109, 0, "e"], + [70110, 0, "d"], + [70111, 0, "."], + [70132, 0, "\n"], + [70133, 0, "\n"], + [70134, 0, "C"], + [70135, 0, "R"], + [70136, 0, "D"], + [70137, 0, "T"], + [70138, 0, "s"], + [70139, 0, " "], + [70140, 0, "f"], + [70141, 0, "o"], + [70142, 0, "r"], + [70143, 0, " "], + [70144, 0, "r"], + [70145, 0, "e"], + [70146, 0, "g"], + [70147, 0, "i"], + [70148, 0, "s"], + [70149, 0, "t"], + [70150, 0, "e"], + [70151, 0, "r"], + [70152, 0, "s"], + [70153, 0, ","], + [70154, 0, " "], + [70155, 0, "m"], + [70155, 1], + [70155, 0, "c"], + [70156, 0, "o"], + [70157, 0, "u"], + [70158, 0, "n"], + [70159, 0, "t"], + [70160, 0, "e"], + [70161, 0, "r"], + [70162, 0, "s"], + [70163, 0, ","], + [70164, 0, " "], + [70165, 0, "m"], + [70166, 0, "a"], + [70167, 0, "p"], + [70168, 0, "s"], + [70169, 0, " "], + [70170, 0, "a"], + [70171, 0, "n"], + [70172, 0, "d"], + [70173, 0, " "], + [70174, 0, "s"], + [70175, 0, "e"], + [70176, 0, "t"], + [70177, 0, "s"], + [70178, 0, " "], + [70179, 0, "a"], + [70180, 0, "r"], + [70181, 0, "e"], + [70182, 0, " "], + [70183, 0, "w"], + [70184, 0, "i"], + [70185, 0, "d"], + [70186, 0, "e"], + [70187, 0, "l"], + [70188, 0, "y"], + [70189, 0, " "], + [70190, 0, "k"], + [70191, 0, "n"], + [70192, 0, "o"], + [70193, 0, "w"], + [70194, 0, "n"], + [70195, 0, ","], + [70196, 0, " "], + [70197, 0, "a"], + [70198, 0, "n"], + [70199, 0, "d"], + [70200, 0, " "], + [70201, 0, "t"], + [70202, 0, "h"], + [70203, 0, "e"], + [70204, 0, "y"], + [70205, 0, " "], + [70206, 0, "a"], + [70207, 0, "r"], + [70208, 0, "e"], + [70209, 0, " "], + [70210, 0, "q"], + [70211, 0, "u"], + [70212, 0, "i"], + [70213, 0, "t"], + [70214, 0, "e"], + [70215, 0, " "], + [70215, 1], + [70214, 1], + [70213, 1], + [70212, 1], + [70211, 1], + [70210, 1], + [70209, 1], + [70208, 1], + [70207, 1], + [70206, 1], + [70205, 1], + [70204, 1], + [70203, 1], + [70202, 1], + [70201, 1], + [70200, 1], + [70199, 1], + [70198, 1], + [70197, 1], + [70196, 1], + [70195, 1], + [70195, 0, "~"], + [70196, 0, "\\"], + [70197, 0, "c"], + [70198, 0, "i"], + [70199, 0, "t"], + [70200, 0, "e"], + [70201, 0, "{"], + [70202, 0, "S"], + [70203, 0, "h"], + [70204, 0, "a"], + [70205, 0, "p"], + [70206, 0, "i"], + [70207, 0, "r"], + [70208, 0, "o"], + [70209, 0, ":"], + [70210, 0, "2"], + [70211, 0, "0"], + [70212, 0, "1"], + [70213, 0, "1"], + [70214, 0, "w"], + [70215, 0, "y"], + [70216, 0, "}"], + [70217, 0, ","], + [70218, 0, " "], + [70219, 0, "a"], + [70220, 0, "n"], + [70221, 0, "d"], + [70222, 0, " "], + [70223, 0, "h"], + [70224, 0, "a"], + [70225, 0, "v"], + [70226, 0, "e"], + [70227, 0, " "], + [70228, 0, "b"], + [70229, 0, "e"], + [70230, 0, "e"], + [70231, 0, "n"], + [70232, 0, " "], + [70233, 0, "i"], + [70234, 0, "m"], + [70235, 0, "p"], + [70236, 0, "l"], + [70237, 0, "e"], + [70238, 0, "m"], + [70239, 0, "e"], + [70240, 0, "n"], + [70241, 0, "t"], + [70242, 0, "e"], + [70243, 0, "d"], + [70244, 0, " "], + [70245, 0, "i"], + [70246, 0, "n"], + [70247, 0, " "], + [70248, 0, "v"], + [70249, 0, "a"], + [70250, 0, "r"], + [70251, 0, "i"], + [70252, 0, "o"], + [70253, 0, "u"], + [70254, 0, "s"], + [70255, 0, " "], + [70256, 0, "d"], + [70257, 0, "e"], + [70258, 0, "p"], + [70259, 0, "l"], + [70260, 0, "o"], + [70261, 0, "y"], + [70262, 0, "e"], + [70263, 0, "d"], + [70264, 0, " "], + [70265, 0, "s"], + [70266, 0, "y"], + [70267, 0, "s"], + [70268, 0, "t"], + [70269, 0, "e"], + [70270, 0, "m"], + [70271, 0, "s"], + [70272, 0, " "], + [70273, 0, "s"], + [70274, 0, "u"], + [70275, 0, "c"], + [70276, 0, "h"], + [70277, 0, " "], + [70278, 0, "a"], + [70279, 0, "s"], + [70280, 0, " "], + [70281, 0, "R"], + [70282, 0, "i"], + [70283, 0, "a"], + [70284, 0, "k"], + [70285, 0, "."], + [70286, 0, " "], + [70287, 0, "F"], + [70288, 0, "o"], + [70289, 0, "r"], + [70290, 0, " "], + [70291, 0, "o"], + [70292, 0, "r"], + [70293, 0, "d"], + [70294, 0, "e"], + [70295, 0, "r"], + [70296, 0, "e"], + [70297, 0, "d"], + [70298, 0, " "], + [70299, 0, "l"], + [70300, 0, "i"], + [70301, 0, "s"], + [70302, 0, "t"], + [70303, 0, "s"], + [70304, 0, ","], + [70305, 0, " "], + [70306, 0, "v"], + [70307, 0, "a"], + [70308, 0, "r"], + [70309, 0, "i"], + [70310, 0, "o"], + [70311, 0, "u"], + [70312, 0, "s"], + [70313, 0, " "], + [70314, 0, "a"], + [70315, 0, "l"], + [70316, 0, "g"], + [70317, 0, "o"], + [70318, 0, "r"], + [70319, 0, "i"], + [70320, 0, "t"], + [70321, 0, "h"], + [70322, 0, "m"], + [70323, 0, "s"], + [70324, 0, " "], + [70325, 0, "h"], + [70326, 0, "a"], + [70327, 0, "v"], + [70328, 0, "e"], + [70329, 0, " "], + [70330, 0, "b"], + [70331, 0, "e"], + [70332, 0, "e"], + [70333, 0, "n"], + [70334, 0, " "], + [70335, 0, "p"], + [70336, 0, "r"], + [70337, 0, "o"], + [70338, 0, "p"], + [70339, 0, "o"], + [70340, 0, "s"], + [70341, 0, "e"], + [70342, 0, "d"], + [70343, 0, ","], + [70344, 0, " "], + [70345, 0, "i"], + [70346, 0, "n"], + [70347, 0, "c"], + [70348, 0, "l"], + [70349, 0, "u"], + [70350, 0, "d"], + [70351, 0, "i"], + [70352, 0, "n"], + [70353, 0, "g"], + [70354, 0, " "], + [70355, 0, "W"], + [70356, 0, "O"], + [70357, 0, "O"], + [70358, 0, "T"], + [70359, 0, "~"], + [70360, 0, "\\"], + [70361, 0, "c"], + [70362, 0, "i"], + [70363, 0, "t"], + [70364, 0, "e"], + [70365, 0, "{"], + [70366, 0, "o"], + [70366, 1], + [70366, 0, "O"], + [70367, 0, "s"], + [70368, 0, "t"], + [70369, 0, "e"], + [70370, 0, "r"], + [70371, 0, ":"], + [70372, 0, "2"], + [70373, 0, "0"], + [70374, 0, "0"], + [70375, 0, "6"], + [70376, 0, "w"], + [70377, 0, "j"], + [70378, 0, "}"], + [70379, 0, ","], + [70380, 0, " "], + [70381, 0, "R"], + [70382, 0, "G"], + [70383, 0, "A"], + [70384, 0, "~"], + [70385, 0, "\\"], + [70386, 0, "c"], + [70387, 0, "i"], + [70388, 0, "t"], + [70389, 0, "e"], + [70390, 0, "{"], + [70391, 0, "R"], + [70392, 0, "o"], + [70393, 0, "h"], + [70394, 0, ":"], + [70395, 0, "2"], + [70396, 0, "0"], + [70397, 0, "1"], + [70398, 0, "1"], + [70399, 0, "d"], + [70400, 0, "w"], + [70401, 0, "}"], + [70402, 0, ","], + [70403, 0, " "], + [70404, 0, "L"], + [70405, 0, "o"], + [70406, 0, "g"], + [70407, 0, "o"], + [70408, 0, "o"], + [70409, 0, "t"], + [70409, 1], + [70408, 1], + [70407, 1], + [70406, 1], + [70405, 1], + [70404, 1], + [70404, 0, "T"], + [70405, 0, "r"], + [70406, 0, "e"], + [70407, 0, "e"], + [70408, 0, "d"], + [70409, 0, "o"], + [70410, 0, "c"], + [70411, 0, "~"], + [70412, 0, "\\"], + [70413, 0, "c"], + [70414, 0, "i"], + [70415, 0, "t"], + [70416, 0, "e"], + [70417, 0, "{"], + [70418, 0, "P"], + [70419, 0, "r"], + [70420, 0, "e"], + [70421, 0, "g"], + [70422, 0, "u"], + [70423, 0, "i"], + [70424, 0, "c"], + [70425, 0, "a"], + [70426, 0, ":"], + [70427, 0, "2"], + [70428, 0, "0"], + [70429, 0, "0"], + [70430, 0, "9"], + [70431, 0, "f"], + [70432, 0, "z"], + [70433, 0, "}"], + [70434, 0, ","], + [70435, 0, " "], + [70436, 0, "L"], + [70437, 0, "o"], + [70438, 0, "g"], + [70439, 0, "o"], + [70440, 0, "o"], + [70441, 0, "t"], + [70442, 0, "~"], + [70443, 0, "\\"], + [70444, 0, "c"], + [70445, 0, "i"], + [70446, 0, "t"], + [70447, 0, "e"], + [70448, 0, "{"], + [70449, 0, "W"], + [70450, 0, "e"], + [70451, 0, "i"], + [70452, 0, "s"], + [70453, 0, "s"], + [70454, 0, ":"], + [70455, 0, "2"], + [70456, 0, "0"], + [70457, 0, "1"], + [70458, 0, "0"], + [70459, 0, "h"], + [70460, 0, "x"], + [70461, 0, "}"], + [70462, 0, " "], + [70463, 0, "a"], + [70464, 0, "n"], + [70465, 0, "d"], + [70466, 0, " "], + [70467, 0, "L"], + [70468, 0, "S"], + [70469, 0, "E"], + [70470, 0, "Q"], + [70471, 0, "~"], + [70472, 0, "\\"], + [70473, 0, "c"], + [70474, 0, "i"], + [70475, 0, "t"], + [70476, 0, "e"], + [70477, 0, "{"], + [70478, 0, "N"], + [70479, 0, "e"], + [70480, 0, "d"], + [70481, 0, "e"], + [70482, 0, "l"], + [70483, 0, "e"], + [70484, 0, "c"], + [70485, 0, ":"], + [70486, 0, "2"], + [70487, 0, "0"], + [70488, 0, "1"], + [70489, 0, "3"], + [70490, 0, "k"], + [70491, 0, "y"], + [70492, 0, "}"], + [70493, 0, "."], + [70494, 0, " "], + [70495, 0, "H"], + [70496, 0, "o"], + [70497, 0, "w"], + [70498, 0, "e"], + [70499, 0, "v"], + [70500, 0, "e"], + [70501, 0, "r"], + [70502, 0, ","], + [70503, 0, " "], + [70504, 0, "n"], + [70505, 0, "o"], + [70506, 0, "n"], + [70507, 0, "e"], + [70508, 0, " "], + [70509, 0, "o"], + [70510, 0, "f"], + [70511, 0, " "], + [70512, 0, "t"], + [70513, 0, "h"], + [70514, 0, "e"], + [70515, 0, "m"], + [70516, 0, " "], + [70517, 0, "s"], + [70518, 0, "u"], + [70519, 0, "p"], + [70520, 0, "p"], + [70521, 0, "o"], + [70522, 0, "r"], + [70523, 0, "t"], + [70524, 0, " "], + [70525, 0, "n"], + [70526, 0, "e"], + [70527, 0, "s"], + [70528, 0, "t"], + [70529, 0, "i"], + [70530, 0, "n"], + [70531, 0, "g"], + [70532, 0, ":"], + [70533, 0, " "], + [70534, 0, "t"], + [70535, 0, "h"], + [70536, 0, "e"], + [70537, 0, " "], + [70538, 0, "e"], + [70539, 0, "l"], + [70540, 0, "e"], + [70541, 0, "m"], + [70542, 0, "e"], + [70543, 0, "n"], + [70544, 0, "t"], + [70545, 0, "s"], + [70546, 0, " "], + [70537, 0, "y"], + [70538, 0, " "], + [70539, 0, "a"], + [70540, 0, "s"], + [70541, 0, "s"], + [70542, 0, "u"], + [70543, 0, "m"], + [70544, 0, "e"], + [70545, 0, " "], + [70546, 0, "t"], + [70547, 0, "h"], + [70548, 0, "a"], + [70549, 0, "t"], + [70550, 0, " "], + [70551, 0, "t"], + [70552, 0, "h"], + [70553, 0, "e"], + [70564, 0, "o"], + [70565, 0, "f"], + [70566, 0, " "], + [70567, 0, "t"], + [70568, 0, "h"], + [70569, 0, "e"], + [70570, 0, " "], + [70571, 0, "C"], + [70572, 0, "R"], + [70573, 0, "D"], + [70574, 0, "T"], + [70575, 0, " "], + [70576, 0, "m"], + [70577, 0, "a"], + [70578, 0, "p"], + [70579, 0, " "], + [70580, 0, "o"], + [70581, 0, "r"], + [70582, 0, " "], + [70583, 0, "l"], + [70584, 0, "i"], + [70585, 0, "s"], + [70586, 0, "t"], + [70587, 0, " "], + [70588, 0, "a"], + [70589, 0, "r"], + [70590, 0, "e"], + [70591, 0, " "], + [70592, 0, "a"], + [70593, 0, "t"], + [70594, 0, "o"], + [70595, 0, "m"], + [70596, 0, "i"], + [70597, 0, "c"], + [70598, 0, " "], + [70599, 0, "v"], + [70600, 0, "a"], + [70601, 0, "l"], + [70602, 0, "u"], + [70603, 0, "e"], + [70604, 0, "s"], + [70598, 0, ","], + [70599, 0, " "], + [70600, 0, "i"], + [70601, 0, "m"], + [70602, 0, "m"], + [70603, 0, "u"], + [70604, 0, "t"], + [70605, 0, "a"], + [70606, 0, "b"], + [70607, 0, "l"], + [70608, 0, "e"], + [70608, 1], + [70607, 1], + [70606, 1], + [70605, 1], + [70604, 1], + [70603, 1], + [70602, 1], + [70601, 1], + [70600, 1], + [70599, 1], + [70598, 1], + [70605, 0, "."], + [70605, 0, ","], + [70606, 0, " "], + [70607, 0, "n"], + [70608, 0, "o"], + [70609, 0, "t"], + [70610, 0, " "], + [70611, 0, "a"], + [70612, 0, "n"], + [70613, 0, "o"], + [70614, 0, "t"], + [70615, 0, "h"], + [70616, 0, "e"], + [70617, 0, "r"], + [70618, 0, " "], + [70619, 0, "C"], + [70620, 0, "R"], + [70621, 0, "D"], + [70622, 0, "T"], + [70624, 0, "\n"], + [70625, 0, "\n"], + [70626, 0, "T"], + [70627, 0, "h"], + [70628, 0, "e"], + [70629, 0, " "], + [70630, 0, "p"], + [70631, 0, "r"], + [70632, 0, "o"], + [70633, 0, "b"], + [70634, 0, "l"], + [70635, 0, "e"], + [70636, 0, "m"], + [70637, 0, " "], + [70638, 0, "o"], + [70639, 0, "f"], + [70640, 0, " "], + [70641, 0, "n"], + [70642, 0, "e"], + [70643, 0, "s"], + [70644, 0, "t"], + [70645, 0, "i"], + [70646, 0, "n"], + [70647, 0, "g"], + [70648, 0, " "], + [70649, 0, "o"], + [70650, 0, "n"], + [70651, 0, "e"], + [70652, 0, " "], + [70653, 0, "C"], + [70654, 0, "R"], + [70655, 0, "D"], + [70656, 0, "T"], + [70657, 0, " "], + [70658, 0, "i"], + [70659, 0, "n"], + [70660, 0, "s"], + [70661, 0, "i"], + [70662, 0, "d"], + [70663, 0, "e"], + [70664, 0, " "], + [70665, 0, "a"], + [70666, 0, "n"], + [70667, 0, "o"], + [70668, 0, "t"], + [70669, 0, "h"], + [70670, 0, "e"], + [70671, 0, "r"], + [70672, 0, " "], + [70673, 0, "("], + [70674, 0, "a"], + [70675, 0, "l"], + [70676, 0, "s"], + [70677, 0, "o"], + [70678, 0, " "], + [70679, 0, "k"], + [70680, 0, "n"], + [70681, 0, "o"], + [70682, 0, "w"], + [70683, 0, "n"], + [70684, 0, " "], + [70685, 0, "a"], + [70686, 0, "s"], + [70687, 0, " "], + [70688, 0, "\\"], + [70689, 0, "e"], + [70690, 0, "m"], + [70691, 0, "p"], + [70692, 0, "h"], + [70693, 0, "{"], + [70694, 0, "e"], + [70695, 0, "m"], + [70696, 0, "b"], + [70697, 0, "e"], + [70698, 0, "d"], + [70699, 0, "d"], + [70700, 0, "i"], + [70701, 0, "n"], + [70702, 0, "g"], + [70703, 0, "}"], + [70704, 0, ")"], + [70705, 0, " "], + [70706, 0, "h"], + [70707, 0, "a"], + [70708, 0, "s"], + [70709, 0, " "], + [70710, 0, "o"], + [70711, 0, "n"], + [70712, 0, "l"], + [70713, 0, "y"], + [70714, 0, " "], + [70715, 0, "b"], + [70716, 0, "e"], + [70717, 0, "e"], + [70718, 0, "n"], + [70719, 0, " "], + [70720, 0, "s"], + [70721, 0, "t"], + [70722, 0, "u"], + [70723, 0, "d"], + [70724, 0, "i"], + [70725, 0, "e"], + [70726, 0, "d"], + [70727, 0, " "], + [70728, 0, "m"], + [70729, 0, "o"], + [70730, 0, "r"], + [70731, 0, "e"], + [70732, 0, " "], + [70733, 0, "r"], + [70734, 0, "e"], + [70735, 0, "c"], + [70736, 0, "e"], + [70737, 0, "n"], + [70738, 0, "t"], + [70739, 0, "l"], + [70740, 0, "y"], + [70741, 0, "."], + [70202, 0, "S"], + [70203, 0, "h"], + [70204, 0, "a"], + [70205, 0, "p"], + [70206, 0, "i"], + [70207, 0, "r"], + [70208, 0, "o"], + [70209, 0, ":"], + [70210, 0, "2"], + [70211, 0, "0"], + [70212, 0, "1"], + [70213, 0, "1"], + [70214, 0, "u"], + [70215, 0, "n"], + [70216, 0, ","], + [70300, 0, "~"], + [70301, 0, "\\"], + [70302, 0, "c"], + [70303, 0, "i"], + [70304, 0, "t"], + [70305, 0, "e"], + [70306, 0, "{"], + [70307, 0, "B"], + [70308, 0, "r"], + [70309, 0, "o"], + [70310, 0, "w"], + [70311, 0, "n"], + [70312, 0, ":"], + [70313, 0, "2"], + [70314, 0, "0"], + [70315, 0, "1"], + [70316, 0, "4"], + [70317, 0, "h"], + [70318, 0, "s"], + [70319, 0, "}"], + [70778, 0, "\n"], + [70779, 0, "\n"], + [70779, 0, "\\"], + [70780, 0, "s"], + [70781, 0, "u"], + [70782, 0, "b"], + [70783, 0, "s"], + [70784, 0, "e"], + [70785, 0, "c"], + [70786, 0, "t"], + [70787, 0, "i"], + [70788, 0, "o"], + [70789, 0, "n"], + [70790, 0, "{"], + [70791, 0, "O"], + [70792, 0, "t"], + [70793, 0, "h"], + [70794, 0, "e"], + [70795, 0, "r"], + [70796, 0, " "], + [70797, 0, "a"], + [70798, 0, "p"], + [70799, 0, "p"], + [70800, 0, "r"], + [70801, 0, "o"], + [70802, 0, "a"], + [70803, 0, "c"], + [70804, 0, "h"], + [70805, 0, "e"], + [70806, 0, "s"], + [70807, 0, "}"], + [70808, 0, "\n"], + [70809, 0, "\n"], + [70810, 0, "M"], + [70811, 0, "a"], + [70812, 0, "n"], + [70813, 0, "y"], + [70814, 0, " "], + [70815, 0, "r"], + [70816, 0, "e"], + [70817, 0, "p"], + [70818, 0, "l"], + [70819, 0, "i"], + [70820, 0, "c"], + [70821, 0, "a"], + [70822, 0, "t"], + [70823, 0, "e"], + [70824, 0, "d"], + [70825, 0, " "], + [70826, 0, "d"], + [70827, 0, "a"], + [70828, 0, "t"], + [70829, 0, "a"], + [70830, 0, " "], + [70831, 0, "s"], + [70832, 0, "y"], + [70833, 0, "s"], + [70834, 0, "t"], + [70835, 0, "e"], + [70836, 0, "m"], + [70837, 0, "s"], + [70838, 0, " "], + [70839, 0, "n"], + [70840, 0, "e"], + [70841, 0, "e"], + [70842, 0, "d"], + [70843, 0, " "], + [70844, 0, "t"], + [70845, 0, "o"], + [70846, 0, " "], + [70847, 0, "d"], + [70848, 0, "e"], + [70849, 0, "a"], + [70850, 0, "l"], + [70851, 0, " "], + [70852, 0, "w"], + [70853, 0, "i"], + [70854, 0, "t"], + [70855, 0, "h"], + [70856, 0, " "], + [70857, 0, "t"], + [70858, 0, "h"], + [70859, 0, "e"], + [70860, 0, " "], + [70861, 0, "p"], + [70862, 0, "r"], + [70863, 0, "o"], + [70864, 0, "b"], + [70865, 0, "l"], + [70866, 0, "e"], + [70867, 0, "m"], + [70868, 0, " "], + [70869, 0, "o"], + [70870, 0, "f"], + [70871, 0, " "], + [70872, 0, "c"], + [70873, 0, "o"], + [70874, 0, "n"], + [70875, 0, "c"], + [70876, 0, "u"], + [70877, 0, "r"], + [70878, 0, "r"], + [70879, 0, "e"], + [70880, 0, "n"], + [70881, 0, "t"], + [70882, 0, ","], + [70883, 0, " "], + [70884, 0, "c"], + [70885, 0, "o"], + [70886, 0, "n"], + [70887, 0, "f"], + [70888, 0, "l"], + [70889, 0, "i"], + [70890, 0, "c"], + [70891, 0, "t"], + [70892, 0, "i"], + [70893, 0, "n"], + [70894, 0, "g"], + [70895, 0, " "], + [70896, 0, "m"], + [70897, 0, "o"], + [70898, 0, "o"], + [70899, 0, "d"], + [70900, 0, "i"], + [70901, 0, "f"], + [70902, 0, "i"], + [70903, 0, "c"], + [70904, 0, "a"], + [70905, 0, "t"], + [70906, 0, "i"], + [70907, 0, "o"], + [70908, 0, "n"], + [70909, 0, "s"], + [70898, 1], + [70909, 0, ","], + [70910, 0, " "], + [70911, 0, "b"], + [70912, 0, "u"], + [70913, 0, "t"], + [70914, 0, " "], + [70915, 0, "t"], + [70916, 0, "h"], + [70917, 0, "e"], + [70918, 0, " "], + [70919, 0, "s"], + [70920, 0, "o"], + [70921, 0, "l"], + [70922, 0, "u"], + [70923, 0, "t"], + [70924, 0, "i"], + [70925, 0, "o"], + [70926, 0, "n"], + [70927, 0, "s"], + [70928, 0, " "], + [70929, 0, "a"], + [70930, 0, "r"], + [70931, 0, "e"], + [70932, 0, " "], + [70933, 0, "o"], + [70934, 0, "f"], + [70935, 0, "t"], + [70936, 0, "e"], + [70937, 0, "n"], + [70938, 0, " "], + [70939, 0, "a"], + [70940, 0, "d"], + [70941, 0, "-"], + [70942, 0, "h"], + [70943, 0, "o"], + [70944, 0, "c"], + [70945, 0, " "], + [70946, 0, "a"], + [70947, 0, "n"], + [70948, 0, "d"], + [70949, 0, " "], + [70949, 1], + [70948, 1], + [70947, 1], + [70946, 1], + [70945, 1], + [70945, 0, "."], + [70946, 0, " "], + [70947, 0, "I"], + [70948, 0, "n"], + [70949, 0, " "], + [70950, 0, "D"], + [70951, 0, "y"], + [70952, 0, "n"], + [70953, 0, "a"], + [70954, 0, "m"], + [70955, 0, "o"], + [70956, 0, "~"], + [70957, 0, "\\"], + [70958, 0, "c"], + [70959, 0, "i"], + [70960, 0, "t"], + [70961, 0, "4"], + [70962, 0, "e"], + [70963, 0, "{"], + [70963, 1], + [70962, 1], + [70961, 1], + [70961, 0, "e"], + [70962, 0, "{"], + [70963, 0, "D"], + [70964, 0, "e"], + [70965, 0, "C"], + [70966, 0, "a"], + [70967, 0, "n"], + [70968, 0, "d"], + [70969, 0, "i"], + [70970, 0, "a"], + [70971, 0, ":"], + [70972, 0, "2"], + [70973, 0, "0"], + [70974, 0, "0"], + [70975, 0, "7"], + [70976, 0, "u"], + [70977, 0, "i"], + [70978, 0, "}"], + [70979, 0, " "], + [70980, 0, "a"], + [70981, 0, "n"], + [70982, 0, "d"], + [70983, 0, " "], + [70984, 0, "p"], + [70984, 1], + [70984, 0, "l"], + [70984, 1], + [70984, 0, "p"], + [70985, 0, "r"], + [70986, 0, "o"], + [70987, 0, "j"], + [70988, 0, "e"], + [70989, 0, "c"], + [70990, 0, "t"], + [70991, 0, "s"], + [70992, 0, " "], + [70993, 0, "i"], + [70994, 0, "t"], + [70995, 0, " "], + [70996, 0, "i"], + [70997, 0, "n"], + [70998, 0, "s"], + [70999, 0, "p"], + [71000, 0, "i"], + [71001, 0, "r"], + [71002, 0, "e"], + [71003, 0, "d"], + [70984, 0, "r"], + [70985, 0, "e"], + [70986, 0, "l"], + [70987, 0, "a"], + [70988, 0, "t"], + [70989, 0, "e"], + [70990, 0, "d"], + [70991, 0, " "], + [71011, 1], + [71010, 1], + [71009, 1], + [71008, 1], + [71007, 1], + [71006, 1], + [71005, 1], + [71004, 1], + [71003, 1], + [71002, 1], + [71001, 1], + [71000, 1], + [71000, 0, ","], + [71001, 0, " "], + [71002, 0, "t"], + [71003, 0, "h"], + [71004, 0, "e"], + [71005, 0, " "], + [71006, 0, "d"], + [71007, 0, "a"], + [71008, 0, "t"], + [71009, 0, "a"], + [71010, 0, "b"], + [71011, 0, "a"], + [71012, 0, "s"], + [71013, 0, "e"], + [71014, 0, " "], + [70947, 0, "F"], + [70948, 0, "o"], + [70949, 0, "r"], + [70950, 0, " "], + [70951, 0, "e"], + [70952, 0, "x"], + [70953, 0, "a"], + [70954, 0, "m"], + [70955, 0, "p"], + [70956, 0, "l"], + [70957, 0, "e"], + [70958, 0, ","], + [70959, 0, " "], + [70960, 1], + [70960, 0, "i"], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [70992, 1], + [71006, 1], + [71005, 1], + [71004, 1], + [71003, 1], + [71002, 1], + [71001, 1], + [71000, 1], + [70999, 1], + [70998, 1], + [70997, 1], + [70996, 1], + [70995, 1], + [70994, 1], + [70994, 0, "c"], + [70995, 0, "o"], + [70996, 0, "n"], + [70997, 0, "c"], + [70998, 0, "u"], + [70998, 1], + [70997, 1], + [70996, 1], + [70995, 1], + [70994, 1], + [70994, 0, "i"], + [70995, 0, "f"], + [70996, 0, " "], + [70997, 0, "s"], + [70998, 0, "e"], + [70999, 0, "v"], + [71000, 0, "e"], + [71001, 0, "r"], + [71002, 0, "a"], + [71003, 0, "l"], + [71004, 0, " "], + [71005, 0, "v"], + [71006, 0, "a"], + [71007, 0, "l"], + [71008, 0, "u"], + [71009, 0, "e"], + [71010, 0, "s"], + [71011, 0, " "], + [71012, 0, "a"], + [71013, 0, "r"], + [71014, 0, "e"], + [71015, 0, " "], + [71016, 0, "c"], + [71017, 0, "o"], + [71018, 0, "n"], + [71019, 0, "c"], + [71020, 0, "u"], + [71021, 0, "r"], + [71022, 0, "r"], + [71023, 0, "e"], + [71024, 0, "n"], + [71025, 0, "t"], + [71026, 0, "l"], + [71027, 0, "y"], + [71028, 0, " "], + [71029, 0, "w"], + [71030, 0, "r"], + [71031, 0, "i"], + [71032, 0, "t"], + [71033, 0, "t"], + [71034, 0, "e"], + [71035, 0, "n"], + [71036, 0, " "], + [71037, 0, "t"], + [71038, 0, "o"], + [71039, 0, " "], + [71040, 0, "t"], + [71041, 0, "h"], + [71042, 0, "e"], + [71043, 0, " "], + [71044, 0, "s"], + [71045, 0, "a"], + [71046, 0, "m"], + [71047, 0, "e"], + [71048, 0, " "], + [71049, 0, "k"], + [71050, 0, "e"], + [71051, 0, "y"], + [71052, 0, ","], + [71053, 0, " "], + [71054, 0, "t"], + [71055, 0, "h"], + [71056, 0, "e"], + [71057, 0, " "], + [71058, 0, "d"], + [71059, 0, "a"], + [71060, 0, "t"], + [71061, 0, "a"], + [71062, 0, "b"], + [71063, 0, "a"], + [71064, 0, "s"], + [71065, 0, "e"], + [71066, 0, " "], + [71067, 0, "p"], + [71068, 0, "r"], + [71069, 0, "e"], + [71070, 0, "s"], + [71071, 0, "e"], + [71072, 0, "r"], + [71073, 0, "v"], + [71074, 0, "e"], + [71075, 0, "s"], + [71076, 0, " "], + [71077, 0, "t"], + [71078, 0, "h"], + [71079, 0, "o"], + [71080, 0, "s"], + [71081, 0, "e"], + [71082, 0, " "], + [71083, 0, "v"], + [71084, 0, "a"], + [71085, 0, "l"], + [71086, 0, "u"], + [71087, 0, "e"], + [71088, 0, "s"], + [71089, 0, " "], + [71090, 0, "a"], + [71091, 0, "n"], + [71092, 0, "d"], + [71093, 0, " "], + [71094, 0, "p"], + [71095, 0, "r"], + [71096, 0, "e"], + [71097, 0, "s"], + [71098, 0, "e"], + [71099, 0, "n"], + [71100, 0, "t"], + [71101, 0, "s"], + [71102, 0, " "], + [71079, 1], + [71079, 0, "e"], + [71077, 0, "a"], + [71078, 0, "l"], + [71079, 0, "l"], + [71080, 0, " "], + [71081, 0, "o"], + [71082, 0, "f"], + [71083, 0, " "], + [71109, 1], + [71108, 1], + [71107, 1], + [71106, 1], + [71105, 1], + [71104, 1], + [71103, 1], + [71102, 1], + [71101, 1], + [71101, 0, "r"], + [71102, 0, "e"], + [71103, 0, "q"], + [71104, 0, "u"], + [71105, 0, "i"], + [71106, 0, "r"], + [71107, 0, "e"], + [71108, 0, "s"], + [71109, 0, " "], + [71110, 0, "a"], + [71111, 0, "p"], + [71112, 0, "p"], + [71113, 0, "l"], + [71114, 0, "i"], + [71115, 0, "c"], + [71116, 0, "a"], + [71117, 0, "t"], + [71118, 0, "i"], + [71119, 0, "o"], + [71120, 0, "n"], + [71121, 0, " "], + [71122, 0, "c"], + [71123, 0, "o"], + [71124, 0, "d"], + [71125, 0, "e"], + [71126, 0, " "], + [71127, 0, "t"], + [71128, 0, "o"], + [71129, 0, " "], + [71130, 0, "r"], + [71131, 0, "e"], + [71132, 0, "s"], + [71133, 0, "o"], + [71134, 0, "l"], + [71135, 0, "v"], + [71136, 0, "e"], + [71137, 0, " "], + [71138, 0, "t"], + [71139, 0, "h"], + [71140, 0, "e"], + [71141, 0, " "], + [71142, 0, "c"], + [71143, 0, "o"], + [71144, 0, "n"], + [71145, 0, "f"], + [71146, 0, "l"], + [71147, 0, "i"], + [71148, 0, "c"], + [71149, 0, "t"], + [71150, 0, "."], + [71096, 0, ","], + [71101, 0, " "], + [71102, 0, "l"], + [71103, 0, "e"], + [71104, 0, "a"], + [71105, 0, "v"], + [71106, 0, "e"], + [71107, 0, "s"], + [71108, 0, " "], + [71109, 0, "c"], + [71110, 0, "o"], + [71111, 0, "n"], + [71112, 0, "f"], + [71113, 0, "l"], + [71114, 0, "i"], + [71115, 0, "c"], + [71116, 0, "t"], + [71117, 0, " "], + [71118, 0, "r"], + [71119, 0, "e"], + [71120, 0, "s"], + [71121, 0, "o"], + [71122, 0, "l"], + [71123, 0, "u"], + [71124, 0, "t"], + [71125, 0, "i"], + [71126, 0, "o"], + [71127, 0, "n"], + [71128, 0, " "], + [71129, 0, "t"], + [71130, 0, "o"], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71131, 1], + [71171, 1], + [71170, 1], + [71169, 1], + [71168, 1], + [71167, 1], + [71166, 1], + [71165, 1], + [71164, 1], + [71163, 1], + [71162, 1], + [71161, 1], + [71160, 1], + [71159, 1], + [71158, 1], + [71157, 1], + [71156, 1], + [71155, 1], + [71154, 1], + [71153, 1], + [71152, 1], + [71151, 1], + [71150, 1], + [71149, 1], + [71148, 1], + [71149, 0, " "], + [71150, 0, "S"], + [71151, 0, "i"], + [71152, 0, "m"], + [71153, 0, "p"], + [71153, 1], + [71152, 1], + [71151, 1], + [71150, 1], + [71150, 0, "N"], + [71151, 0, "a"], + [71152, 0, "i"], + [71153, 0, "v"], + [71154, 0, "e"], + [71155, 0, "l"], + [71156, 0, "y"], + [71157, 0, " "], + [71158, 0, "c"], + [71159, 0, "h"], + [71160, 0, "o"], + [71161, 0, "s"], + [71162, 0, "e"], + [71163, 0, "n"], + [71164, 0, " "], + [71165, 0, "m"], + [71166, 0, "e"], + [71167, 0, "r"], + [71168, 0, "g"], + [71169, 0, "e"], + [71170, 0, " "], + [71171, 0, "f"], + [71172, 0, "u"], + [71173, 0, "n"], + [71174, 0, "c"], + [71175, 0, "t"], + [71176, 0, "i"], + [71177, 0, "o"], + [71178, 0, "n"], + [71179, 0, "s"], + [71180, 0, " "], + [71181, 0, "o"], + [71182, 0, "f"], + [71183, 0, "t"], + [71184, 0, "e"], + [71185, 0, "n"], + [71186, 0, " "], + [71187, 0, "e"], + [71188, 0, "x"], + [71189, 0, "h"], + [71190, 0, "i"], + [71191, 0, "b"], + [71192, 0, "i"], + [71193, 0, "t"], + [71194, 0, " "], + [71195, 0, "a"], + [71196, 0, "n"], + [71197, 0, "o"], + [71198, 0, "m"], + [71199, 0, "a"], + [71200, 0, "l"], + [71201, 0, "i"], + [71202, 0, "e"], + [71203, 0, "s"], + [71204, 0, ","], + [71205, 0, " "], + [71206, 0, "s"], + [71207, 0, "u"], + [71208, 0, "c"], + [71209, 0, "h"], + [71210, 0, " "], + [71211, 0, "a"], + [71212, 0, "s"], + [71213, 0, " "], + [71214, 0, "d"], + [71215, 0, "e"], + [71216, 0, "l"], + [71217, 0, "e"], + [71218, 0, "t"], + [71219, 0, "e"], + [71220, 0, "d"], + [71221, 0, " "], + [71222, 0, "i"], + [71223, 0, "t"], + [71224, 0, "e"], + [71225, 0, "m"], + [71226, 0, "s"], + [71227, 0, " "], + [71228, 0, "r"], + [71229, 0, "e"], + [71230, 0, "a"], + [71231, 0, "p"], + [71232, 0, "p"], + [71233, 0, "e"], + [71234, 0, "a"], + [71235, 0, "r"], + [71236, 0, "i"], + [71237, 0, "n"], + [71238, 0, "g"], + [71239, 0, "~"], + [71240, 0, "\\"], + [71241, 0, "c"], + [71242, 0, "i"], + [71243, 0, "t"], + [71244, 0, "e"], + [71245, 0, "{"], + [71246, 0, "D"], + [71247, 0, "e"], + [71248, 0, "C"], + [71249, 0, "a"], + [71250, 0, "n"], + [71251, 0, "d"], + [71252, 0, "i"], + [71253, 0, "a"], + [71254, 0, ":"], + [71255, 0, "2"], + [71256, 0, "0"], + [71257, 0, "0"], + [71258, 0, "7"], + [71259, 0, "u"], + [71260, 0, "i"], + [71261, 0, "}"], + [71262, 0, "."], + [71263, 0, "\n"], + [71264, 0, "\n"], + [71265, 0, "A"], + [71266, 0, "n"], + [71267, 0, "o"], + [71268, 0, "t"], + [71269, 0, "h"], + [71270, 0, "e"], + [71271, 0, "r"], + [71272, 0, " "], + [71273, 0, "f"], + [71274, 0, "r"], + [71275, 0, "e"], + [71276, 0, "q"], + [71277, 0, "u"], + [71278, 0, "e"], + [71279, 0, "n"], + [71280, 0, "t"], + [71281, 0, "l"], + [71282, 0, "y"], + [71283, 0, "-"], + [71284, 0, "u"], + [71285, 0, "s"], + [71286, 0, "e"], + [71287, 0, "d"], + [71288, 0, " "], + [71289, 0, "a"], + [71290, 0, "p"], + [71291, 0, "p"], + [71292, 0, "r"], + [71293, 0, "o"], + [71294, 0, "a"], + [71295, 0, "c"], + [71296, 0, "h"], + [71297, 0, " "], + [71298, 0, "t"], + [71299, 0, "o"], + [71300, 0, " "], + [71301, 0, "c"], + [71302, 0, "o"], + [71303, 0, "n"], + [71304, 0, "f"], + [71305, 0, "l"], + [71306, 0, "i"], + [71307, 0, "c"], + [71308, 0, "t"], + [71309, 0, " "], + [71310, 0, "r"], + [71311, 0, "e"], + [71312, 0, "s"], + [71313, 0, "o"], + [71314, 0, "l"], + [71315, 0, "u"], + [71316, 0, "t"], + [71317, 0, "i"], + [71318, 0, "o"], + [71319, 0, "n"], + [71320, 0, " "], + [71321, 0, "i"], + [71322, 0, "s"], + [71323, 0, " "], + [71324, 0, "\\"], + [71325, 0, "e"], + [71326, 0, "m"], + [71327, 0, "p"], + [71328, 0, "h"], + [71329, 0, "{"], + [71330, 0, "l"], + [71331, 0, "a"], + [71332, 0, "s"], + [71333, 0, "t"], + [71334, 0, " "], + [71335, 0, "w"], + [71336, 0, "r"], + [71337, 0, "i"], + [71338, 0, "t"], + [71339, 0, "e"], + [71340, 0, "r"], + [71341, 0, " "], + [71342, 0, "w"], + [71343, 0, "i"], + [71344, 0, "n"], + [71345, 0, "s"], + [71346, 0, "}"], + [71347, 0, ","], + [71348, 0, " "], + [71349, 0, "w"], + [71350, 0, "h"], + [71351, 0, "i"], + [71352, 0, "c"], + [71353, 0, "h"], + [71354, 0, " "], + [71355, 0, "a"], + [71356, 0, "r"], + [71357, 0, "b"], + [71358, 0, "i"], + [71359, 0, "t"], + [71360, 0, "r"], + [71361, 0, "a"], + [71362, 0, "r"], + [71363, 0, "i"], + [71364, 0, "l"], + [71365, 0, "y"], + [71366, 0, " "], + [71367, 0, "c"], + [71368, 0, "h"], + [71369, 0, "o"], + [71370, 0, "o"], + [71371, 0, "s"], + [71372, 0, "e"], + [71373, 0, "s"], + [71374, 0, " "], + [71375, 0, "o"], + [71376, 0, "n"], + [71377, 0, "e"], + [71378, 0, " "], + [71379, 0, "a"], + [71380, 0, "m"], + [71381, 0, "o"], + [71382, 0, "n"], + [71383, 0, "g"], + [71384, 0, " "], + [71385, 0, "s"], + [71386, 0, "e"], + [71387, 0, "v"], + [71388, 0, "e"], + [71389, 0, "r"], + [71390, 0, "a"], + [71391, 0, "l"], + [71392, 0, " "], + [71393, 0, "c"], + [71394, 0, "o"], + [71395, 0, "n"], + [71396, 0, "c"], + [71397, 0, "u"], + [71398, 0, "r"], + [71399, 0, "r"], + [71400, 0, "e"], + [71401, 0, "n"], + [71402, 0, "t"], + [71403, 0, " "], + [71404, 0, "w"], + [71405, 0, "r"], + [71406, 0, "i"], + [71407, 0, "t"], + [71408, 0, "e"], + [71409, 0, "s"], + [71410, 0, " "], + [71411, 0, "a"], + [71412, 0, "s"], + [71413, 0, " "], + [71414, 0, "`"], + [71415, 0, "`"], + [71416, 0, "w"], + [71417, 0, "i"], + [71418, 0, "n"], + [71419, 0, "n"], + [71420, 0, "e"], + [71421, 0, "r"], + [71422, 0, "'"], + [71423, 0, "'"], + [71424, 0, " "], + [71425, 0, "a"], + [71426, 0, "n"], + [71427, 0, "d"], + [71428, 0, " "], + [71429, 0, "d"], + [71430, 0, "i"], + [71431, 0, "s"], + [71432, 0, "c"], + [71433, 0, "a"], + [71434, 0, "r"], + [71435, 0, "d"], + [71436, 0, "s"], + [71437, 0, " "], + [71438, 0, "t"], + [71439, 0, "h"], + [71440, 0, "e"], + [71441, 0, " "], + [71442, 0, "o"], + [71443, 0, "t"], + [71444, 0, "h"], + [71445, 0, "e"], + [71446, 0, "r"], + [71447, 0, "s"], + [71448, 0, "."], + [71449, 0, " "], + [71450, 0, "p"], + [71450, 1], + [71450, 0, "T"], + [71451, 0, "h"], + [71452, 0, "i"], + [71453, 0, "s"], + [71454, 0, " "], + [71454, 1], + [71453, 1], + [71452, 1], + [71452, 0, "e"], + [71453, 0, " "], + [71454, 0, "l"], + [71347, 0, " "], + [71348, 0, "("], + [71349, 0, "L"], + [71350, 0, "W"], + [71351, 0, "W"], + [71352, 0, ")"], + [71460, 1], + [71459, 1], + [71458, 1], + [71457, 1], + [71456, 1], + [71456, 0, "L"], + [71457, 0, "W"], + [71458, 0, "W"], + [71459, 0, " "], + [71460, 0, "d"], + [71461, 0, "o"], + [71462, 0, "e"], + [71463, 0, "s"], + [71464, 0, " "], + [71465, 0, "n"], + [71466, 0, "o"], + [71467, 0, "t"], + [71468, 0, " "], + [71469, 0, "m"], + [71470, 0, "e"], + [71471, 0, "e"], + [71472, 0, "t"], + [71473, 0, " "], + [71474, 0, "o"], + [71475, 0, "u"], + [71476, 0, "r"], + [71477, 0, " "], + [71478, 0, "r"], + [71479, 0, "e"], + [71480, 0, "q"], + [71481, 0, "u"], + [71482, 0, "i"], + [71483, 0, "r"], + [71484, 0, "e"], + [71485, 0, "m"], + [71486, 0, "e"], + [71487, 0, "n"], + [71488, 0, "t"], + [71489, 0, "s"], + [71490, 0, ","], + [71491, 0, " "], + [71492, 0, "s"], + [71493, 0, "i"], + [71494, 0, "n"], + [71495, 0, "c"], + [71496, 0, "e"], + [71497, 0, " "], + [71498, 0, "w"], + [71499, 0, "e"], + [71500, 0, " "], + [71501, 0, "w"], + [71502, 0, "a"], + [71503, 0, "n"], + [71504, 0, "t"], + [71505, 0, " "], + [71506, 0, "n"], + [71507, 0, "o"], + [71508, 0, " "], + [71509, 0, "u"], + [71510, 0, "s"], + [71511, 0, "e"], + [71512, 0, "r"], + [71513, 0, " "], + [71514, 0, "i"], + [71515, 0, "n"], + [71516, 0, "p"], + [71517, 0, "u"], + [71518, 0, "t"], + [71519, 0, " "], + [71520, 0, "t"], + [71521, 0, "o"], + [71522, 0, " "], + [71523, 0, "b"], + [71524, 0, "e"], + [71525, 0, " "], + [71526, 0, "l"], + [71527, 0, "o"], + [71528, 0, "s"], + [71529, 0, "t"], + [71530, 0, " "], + [71531, 0, "d"], + [71532, 0, "u"], + [71533, 0, "e"], + [71534, 0, " "], + [71535, 0, "t"], + [71536, 0, "o"], + [71537, 0, " "], + [71538, 0, "c"], + [71539, 0, "o"], + [71540, 0, "n"], + [71541, 0, "c"], + [71542, 0, "u"], + [71543, 0, "r"], + [71544, 0, "r"], + [71545, 0, "e"], + [71546, 0, "n"], + [71547, 0, "t"], + [71548, 0, " "], + [71549, 0, "m"], + [71550, 0, "o"], + [71551, 0, "d"], + [71552, 0, "i"], + [71553, 0, "f"], + [71554, 0, "i"], + [71555, 0, "c"], + [71556, 0, "a"], + [71557, 0, "t"], + [71558, 0, "i"], + [71559, 0, "o"], + [71560, 0, "n"], + [71561, 0, "s"], + [71562, 0, "."], + [71455, 0, " "], + [71456, 0, "T"], + [71457, 0, "h"], + [71458, 0, "i"], + [71459, 0, "s"], + [71460, 0, " "], + [71461, 0, "a"], + [71462, 0, "p"], + [71463, 0, "p"], + [71464, 0, "r"], + [71465, 0, "o"], + [71466, 0, "a"], + [71467, 0, "c"], + [71468, 0, "h"], + [71469, 0, " "], + [71470, 0, "i"], + [71471, 0, "s"], + [71472, 0, " "], + [71473, 0, "u"], + [71474, 0, "s"], + [71475, 0, "e"], + [71476, 0, "d"], + [71477, 0, " "], + [71478, 0, "i"], + [71479, 0, "n"], + [71480, 0, " "], + [71481, 0, "A"], + [71482, 0, "p"], + [71483, 0, "a"], + [71484, 0, "c"], + [71485, 0, "h"], + [71486, 0, "e"], + [71487, 0, " "], + [71488, 0, "C"], + [71489, 0, "a"], + [71490, 0, "s"], + [71491, 0, "s"], + [71492, 0, "a"], + [71493, 0, "n"], + [71494, 0, "d"], + [71495, 0, "r"], + [71496, 0, "a"], + [71497, 0, ","], + [71498, 0, " "], + [71499, 0, "a"], + [71500, 0, "n"], + [71501, 0, "d"], + [71502, 0, " "], + [71503, 0, "i"], + [71504, 0, "t"], + [71505, 0, " "], + [71506, 0, "i"], + [71507, 0, "s"], + [71508, 0, " "], + [71509, 0, "a"], + [71510, 0, " "], + [71510, 1], + [71510, 0, "n"], + [71511, 0, " "], + [71512, 0, "o"], + [71513, 0, "p"], + [71514, 0, "t"], + [71515, 0, "i"], + [71516, 0, "o"], + [71517, 0, "n"], + [71518, 0, " "], + [71519, 0, "i"], + [71520, 0, "n"], + [71521, 0, " "], + [71522, 0, "m"], + [71523, 0, "a"], + [71524, 0, "n"], + [71525, 0, "y"], + [71526, 0, " "], + [71527, 0, "o"], + [71528, 0, "t"], + [71529, 0, "h"], + [71530, 0, "e"], + [71531, 0, "r"], + [71532, 0, " "], + [71533, 0, "s"], + [71534, 0, "y"], + [71535, 0, "s"], + [71536, 0, "t"], + [71537, 0, "e"], + [71538, 0, "m"], + [71539, 0, "s"], + [71540, 0, " "], + [71541, 0, "i"], + [71542, 0, "n"], + [71543, 0, "c"], + [71544, 0, "l"], + [71545, 0, "u"], + [71546, 0, "d"], + [71547, 0, "i"], + [71548, 0, "n"], + [71549, 0, "g"], + [71550, 0, " "], + [71551, 0, "R"], + [71552, 0, "i"], + [71553, 0, "a"], + [71554, 0, "k"], + [71555, 0, ","], + [71556, 0, " "], + [71556, 1], + [71555, 1], + [71555, 0, " "], + [71556, 0, "a"], + [71557, 0, "n"], + [71558, 0, "d"], + [71559, 0, " "], + [71560, 0, "C"], + [71561, 0, "o"], + [71562, 0, "u"], + [71563, 0, "c"], + [71564, 0, "h"], + [71565, 0, "D"], + [71566, 0, "B"], + [71567, 0, "."], + [70808, 0, "\\"], + [70809, 0, "l"], + [70810, 0, "a"], + [70811, 0, "b"], + [70812, 0, "e"], + [70813, 0, "l"], + [70814, 0, "{"], + [70815, 0, "s"], + [70816, 0, "e"], + [70817, 0, "c"], + [70818, 0, ":"], + [70819, 0, "r"], + [70820, 0, "e"], + [70821, 0, "l"], + [70822, 0, "a"], + [70823, 0, "t"], + [70824, 0, "e"], + [70825, 0, "d"], + [70826, 0, "-"], + [70827, 0, "o"], + [70828, 0, "t"], + [70829, 0, "h"], + [70830, 0, "e"], + [70831, 0, "r"], + [70832, 0, "}"], + [70132, 0, "\\"], + [70133, 0, "l"], + [70134, 0, "a"], + [70135, 0, "b"], + [70136, 0, "e"], + [70137, 0, "l"], + [70138, 0, "{"], + [70139, 0, "s"], + [70140, 0, "e"], + [70141, 0, "c"], + [70142, 0, ":"], + [70143, 0, "r"], + [70144, 0, "e"], + [70145, 0, "l"], + [70146, 0, "a"], + [70147, 0, "t"], + [70148, 0, "e"], + [70149, 0, "d"], + [70150, 0, "-"], + [70151, 0, "c"], + [70152, 0, "r"], + [70153, 0, "d"], + [70154, 0, "t"], + [70155, 0, "s"], + [70156, 0, "}"], + [67788, 0, "\\"], + [67789, 0, "l"], + [67790, 0, "a"], + [67791, 0, "b"], + [67792, 0, "e"], + [67793, 0, "l"], + [67794, 0, "{"], + [67795, 0, "s"], + [67796, 0, "e"], + [67797, 0, "c"], + [67798, 0, ":"], + [67799, 0, "r"], + [67800, 0, "e"], + [67801, 0, "l"], + [67802, 0, "a"], + [67803, 0, "t"], + [67804, 0, "e"], + [67805, 0, "d"], + [67806, 0, "-"], + [67807, 0, "o"], + [67808, 0, "t"], + [67809, 0, "}"], + [71748, 0, "\n"], + [71749, 0, "\n"], + [71750, 0, "F"], + [71751, 0, "i"], + [71752, 0, "n"], + [71753, 0, "a"], + [71754, 0, "l"], + [71755, 0, "l"], + [71756, 0, "y"], + [71757, 0, ","], + [71758, 0, " "], + [71759, 0, "m"], + [71760, 0, "a"], + [71761, 0, "n"], + [71762, 0, "y"], + [71763, 0, " "], + [71764, 0, "s"], + [71765, 0, "y"], + [71766, 0, "s"], + [71767, 0, "t"], + [71768, 0, "e"], + [71769, 0, "m"], + [71770, 0, "s"], + [71771, 0, " "], + [71762, 1], + [71761, 1], + [71760, 1], + [71759, 1], + [71758, 1], + [71767, 0, "s"], + [71768, 0, "u"], + [71769, 0, "c"], + [71770, 0, "h"], + [71771, 0, " "], + [71772, 0, "a"], + [71773, 0, "s"], + [71774, 0, " "], + [71775, 0, "B"], + [71776, 0, "a"], + [71777, 0, "y"], + [71778, 0, "o"], + [71779, 0, "u"], + [71780, 0, "~"], + [71781, 0, "\\"], + [71782, 0, "c"], + [71783, 0, "i"], + [71784, 0, "t"], + [71785, 0, "e"], + [71786, 0, "{"], + [71787, 0, "T"], + [71788, 0, "e"], + [71789, 0, "r"], + [71790, 0, "r"], + [71791, 0, "y"], + [71792, 0, ":"], + [71793, 0, "1"], + [71794, 0, "9"], + [71795, 0, "9"], + [71796, 0, "5"], + [71797, 0, "d"], + [71798, 0, "n"], + [71799, 0, "}"], + [71800, 0, " "], + [71801, 0, "a"], + [71802, 0, "l"], + [71803, 0, "l"], + [71804, 0, "o"], + [71805, 0, "w"], + [71806, 0, " "], + [71807, 0, "o"], + [71808, 0, "f"], + [71809, 0, "f"], + [71810, 0, "l"], + [71811, 0, "i"], + [71812, 0, "n"], + [71813, 0, "e"], + [71814, 0, " "], + [71815, 0, "n"], + [71816, 0, "o"], + [71817, 0, "d"], + [71818, 0, "e"], + [71819, 0, "s"], + [71820, 0, " "], + [71821, 0, "t"], + [71822, 0, "o"], + [71823, 0, " "], + [71824, 0, "e"], + [71825, 0, "x"], + [71826, 0, "e"], + [71827, 0, "c"], + [71828, 0, "u"], + [71829, 0, "t"], + [71830, 0, "e"], + [71831, 0, " "], + [71832, 0, "t"], + [71833, 0, "r"], + [71834, 0, "a"], + [71835, 0, "n"], + [71836, 0, "s"], + [71837, 0, "a"], + [71838, 0, "c"], + [71839, 0, "t"], + [71840, 0, "i"], + [71841, 0, "o"], + [71842, 0, "n"], + [71843, 0, "s"], + [71844, 0, " "], + [71845, 0, "t"], + [71846, 0, "e"], + [71847, 0, "n"], + [71848, 0, "t"], + [71849, 0, "a"], + [71850, 0, "t"], + [71851, 0, "i"], + [71852, 0, "v"], + [71853, 0, "e"], + [71854, 0, "l"], + [71855, 0, "y"], + [71856, 0, ","], + [71857, 0, " "], + [71858, 0, "a"], + [71859, 0, "n"], + [71860, 0, "d"], + [71861, 0, " "], + [71862, 0, "c"], + [71863, 0, "o"], + [71864, 0, "n"], + [71865, 0, "f"], + [71866, 0, "i"], + [71867, 0, "r"], + [71868, 0, "m"], + [71869, 0, " "], + [71870, 0, "t"], + [71871, 0, "h"], + [71872, 0, "e"], + [71873, 0, "m"], + [71874, 0, " "], + [71875, 0, "w"], + [71876, 0, "h"], + [71877, 0, "e"], + [71878, 0, "n"], + [71879, 0, " "], + [71880, 0, "t"], + [71881, 0, "h"], + [71882, 0, "e"], + [71883, 0, "y"], + [71884, 0, " "], + [71885, 0, "a"], + [71886, 0, "r"], + [71887, 0, "e"], + [71888, 0, " "], + [71889, 0, "n"], + [71890, 0, "e"], + [71891, 0, "x"], + [71892, 0, "t"], + [71893, 0, " "], + [71894, 0, "o"], + [71895, 0, "n"], + [71896, 0, "l"], + [71897, 0, "i"], + [71898, 0, "n"], + [71899, 0, "e"], + [71900, 0, "."], + [71901, 0, " "], + [71902, 0, "T"], + [71902, 1], + [71902, 0, "A"], + [71903, 0, "s"], + [71904, 0, " "], + [71905, 0, "d"], + [71906, 0, "i"], + [71907, 0, "s"], + [71908, 0, "c"], + [71909, 0, "u"], + [71910, 0, "s"], + [71911, 0, "s"], + [71912, 0, "e"], + [71913, 0, "d"], + [71914, 0, " "], + [71915, 0, "i"], + [71916, 0, "n"], + [71917, 0, " "], + [71918, 0, "s"], + [71919, 0, "e"], + [71920, 0, "c"], + [71921, 0, "t"], + [71922, 0, "i"], + [71923, 0, "o"], + [71924, 0, "n"], + [71925, 0, "~"], + [71926, 0, "\\"], + [71927, 0, "r"], + [71928, 0, "e"], + [71929, 0, "f"], + [71930, 0, "{"], + [71931, 0, "s"], + [71932, 0, "e"], + [71933, 0, "c"], + [71934, 0, ":"], + [71935, 0, "r"], + [71936, 0, "e"], + [71937, 0, "l"], + [71938, 0, "a"], + [71939, 0, "t"], + [71940, 0, "e"], + [71941, 0, "d"], + [71942, 0, "-"], + [71943, 0, "o"], + [71944, 0, "t"], + [71945, 0, "}"], + [71946, 0, ","], + [71947, 0, " "], + [71948, 0, "s"], + [71949, 0, "u"], + [71950, 0, "c"], + [71951, 0, "h"], + [71952, 0, " "], + [71953, 0, "t"], + [71954, 0, "o"], + [71955, 0, "t"], + [71956, 0, "a"], + [71957, 0, "l"], + [71958, 0, " "], + [71959, 0, "o"], + [71960, 0, "r"], + [71961, 0, "d"], + [71962, 0, "e"], + [71963, 0, "r"], + [71964, 0, " "], + [71965, 0, "r"], + [71966, 0, "e"], + [71967, 0, "q"], + [71968, 0, "u"], + [71969, 0, "i"], + [71970, 0, "r"], + [71971, 0, "e"], + [71972, 0, "m"], + [71973, 0, "e"], + [71974, 0, "n"], + [71975, 0, "t"], + [71976, 0, "s"], + [71977, 0, " "], + [71978, 0, "a"], + [71979, 0, "r"], + [71980, 0, "e"], + [71981, 0, " "], + [71982, 0, "p"], + [71983, 0, "r"], + [71984, 0, "o"], + [71985, 0, "h"], + [71986, 0, "i"], + [71987, 0, "b"], + [71988, 0, "i"], + [71989, 0, "t"], + [71990, 0, "i"], + [71991, 0, "v"], + [71992, 0, "e"], + [71993, 0, " "], + [71994, 0, "i"], + [71995, 0, "n"], + [71996, 0, " "], + [71997, 0, "a"], + [71998, 0, " "], + [71999, 0, "p"], + [72000, 0, "e"], + [72001, 0, "e"], + [72002, 0, "r"], + [72003, 0, "-"], + [72004, 0, "t"], + [72005, 0, "o"], + [72006, 0, "-"], + [72007, 0, "p"], + [72008, 0, "e"], + [72009, 0, "e"], + [72010, 0, "r"], + [72011, 0, " "], + [72012, 0, "s"], + [72013, 0, "y"], + [72014, 0, "s"], + [72015, 0, "t"], + [72016, 0, "e"], + [72017, 0, "m"], + [72018, 0, " "], + [72019, 0, "o"], + [72020, 0, "f"], + [72021, 0, " "], + [72022, 0, "m"], + [72023, 0, "o"], + [72024, 0, "b"], + [72025, 0, "i"], + [72026, 0, "l"], + [72027, 0, "e"], + [72028, 0, " "], + [72029, 0, "d"], + [72030, 0, "e"], + [72031, 0, "v"], + [72032, 0, "i"], + [72033, 0, "c"], + [72034, 0, "e"], + [72035, 0, "s"], + [72036, 0, "."], + [71964, 0, "i"], + [71965, 0, "n"], + [71966, 0, "g"], + [71901, 0, " "], + [71902, 0, "T"], + [71903, 0, "h"], + [71904, 0, "i"], + [71905, 0, "s"], + [71906, 0, " "], + [71907, 0, "a"], + [71908, 0, "p"], + [71909, 0, "p"], + [71910, 0, "r"], + [71911, 0, "o"], + [71912, 0, "a"], + [71913, 0, "c"], + [71914, 0, "h"], + [71915, 0, " "], + [71916, 0, "r"], + [71917, 0, "e"], + [71918, 0, "l"], + [71919, 0, "i"], + [71920, 0, "e"], + [71921, 0, "s"], + [71922, 0, " "], + [71923, 0, "o"], + [71924, 0, "n"], + [71925, 0, " "], + [71926, 0, "a"], + [71927, 0, " "], + [71928, 0, "c"], + [71929, 0, "e"], + [71930, 0, "n"], + [71931, 0, "t"], + [71932, 0, "r"], + [71933, 0, "a"], + [71934, 0, "l"], + [71935, 0, " "], + [71936, 0, "s"], + [71937, 0, "e"], + [71938, 0, "r"], + [71939, 0, "v"], + [71940, 0, "e"], + [71941, 0, "r"], + [71942, 0, " "], + [71943, 0, "t"], + [71944, 0, "o"], + [71945, 0, " "], + [71946, 0, "e"], + [71947, 0, "x"], + [71948, 0, "e"], + [71949, 0, "c"], + [71950, 0, "u"], + [71951, 0, "t"], + [71952, 0, "e"], + [71953, 0, " "], + [71954, 0, "t"], + [71955, 0, "r"], + [71956, 0, "a"], + [71957, 0, "n"], + [71958, 0, "s"], + [71959, 0, "a"], + [71960, 0, "c"], + [71961, 0, "t"], + [71962, 0, "i"], + [71963, 0, "o"], + [71964, 0, "n"], + [71965, 0, "s"], + [71966, 0, " "], + [71967, 0, "i"], + [71968, 0, "n"], + [71969, 0, " "], + [71970, 0, "a"], + [71971, 0, " "], + [71972, 0, "t"], + [71973, 0, "o"], + [71974, 0, "t"], + [71975, 0, "a"], + [71976, 0, "l"], + [71977, 0, " "], + [71978, 0, "o"], + [71979, 0, "r"], + [71980, 0, "d"], + [71981, 0, "e"], + [71982, 0, "r"], + [71976, 1], + [71975, 1], + [71974, 1], + [71973, 1], + [71972, 1], + [71972, 0, "s"], + [71973, 0, "e"], + [71974, 0, "r"], + [71975, 0, "i"], + [71976, 0, "a"], + [71977, 0, "l"], + [72085, 0, "b"], + [72086, 0, "b"], + [72087, 0, "b"], + [72087, 1], + [72086, 1], + [72085, 1], + [72040, 1], + [72039, 1], + [72038, 1], + [72037, 1], + [72036, 1], + [72036, 0, "s"], + [72037, 0, "e"], + [72038, 0, "r"], + [72039, 0, "i"], + [72040, 0, "a"], + [72041, 0, "l"], + [71984, 0, ","], + [71985, 0, " "], + [71986, 0, "a"], + [71987, 0, "n"], + [71988, 0, "d"], + [71989, 0, " "], + [71990, 0, "d"], + [71991, 0, "e"], + [71992, 0, "c"], + [71993, 0, "i"], + [71994, 0, "d"], + [71995, 0, "e"], + [71996, 0, " "], + [71997, 0, "w"], + [71998, 0, "h"], + [71999, 0, "e"], + [72000, 0, "t"], + [72001, 0, "h"], + [72002, 0, "e"], + [72003, 0, "r"], + [72004, 0, " "], + [72005, 0, "a"], + [72006, 0, " "], + [72007, 0, "t"], + [72008, 0, "r"], + [72009, 0, "a"], + [72010, 0, "n"], + [72011, 0, "s"], + [72012, 0, "a"], + [72013, 0, "c"], + [72014, 0, "t"], + [72015, 0, "i"], + [72016, 0, "o"], + [72017, 0, "n"], + [72018, 0, " "], + [72019, 0, "w"], + [72020, 0, "a"], + [72021, 0, "s"], + [72022, 0, " "], + [72023, 0, "s"], + [72024, 0, "u"], + [72025, 0, "c"], + [72026, 0, "c"], + [72027, 0, "e"], + [72028, 0, "s"], + [72029, 0, "s"], + [72030, 0, "f"], + [72031, 0, "u"], + [72032, 0, "l"], + [72033, 0, " "], + [72034, 0, "d"], + [72035, 0, "e"], + [72036, 0, "p"], + [72037, 0, "e"], + [72038, 0, "n"], + [72039, 0, "d"], + [72040, 0, "i"], + [72041, 0, "n"], + [72042, 0, "g"], + [72043, 0, " "], + [72044, 0, "o"], + [72045, 0, "n"], + [72046, 0, " "], + [72047, 0, "i"], + [72048, 0, "t"], + [72049, 0, "s"], + [72050, 0, " "], + [72051, 0, "p"], + [72052, 0, "r"], + [72053, 0, "e"], + [72054, 0, "d"], + [72054, 1], + [72054, 0, "c"], + [72055, 0, "o"], + [72056, 0, "n"], + [72057, 0, "d"], + [72058, 0, "i"], + [72059, 0, "t"], + [72060, 0, "i"], + [72061, 0, "o"], + [72062, 0, "n"], + [72063, 0, "s"], + [72064, 0, "."], + [71335, 0, " "], + [71336, 0, "A"], + [71337, 0, "s"], + [71338, 0, " "], + [71339, 0, "t"], + [71340, 0, "h"], + [71341, 0, "e"], + [71342, 0, " "], + [71343, 0, "c"], + [71344, 0, "o"], + [71345, 0, "m"], + [71346, 0, "p"], + [71347, 0, "l"], + [71348, 0, "e"], + [71349, 0, "x"], + [71350, 0, "i"], + [71351, 0, "t"], + [71352, 0, "y"], + [71353, 0, " "], + [71354, 0, "o"], + [71355, 0, "f"], + [71356, 0, " "], + [71357, 0, "t"], + [71358, 0, "h"], + [71359, 0, "i"], + [71360, 0, "s"], + [71361, 0, " "], + [71362, 0, "p"], + [71363, 0, "a"], + [71364, 0, "p"], + [71365, 0, "e"], + [71366, 0, "r"], + [71367, 0, " "], + [71368, 0, "d"], + [71369, 0, "e"], + [71370, 0, "m"], + [71371, 0, "o"], + [71372, 0, "n"], + [71373, 0, "s"], + [71374, 0, "t"], + [71375, 0, "r"], + [71376, 0, "a"], + [71377, 0, "t"], + [71378, 0, "e"], + [71379, 0, "s"], + [71380, 0, ","], + [71381, 0, " "], + [71382, 0, "c"], + [71382, 1], + [71382, 0, "i"], + [71383, 0, "t"], + [71384, 0, "s"], + [71385, 0, " "], + [71385, 1], + [71384, 1], + [71383, 1], + [71382, 1], + [71382, 0, "c"], + [71383, 0, "o"], + [71384, 0, "n"], + [71385, 0, "f"], + [71386, 0, "l"], + [71387, 0, "i"], + [71388, 0, "c"], + [71389, 0, "t"], + [71390, 0, " "], + [71391, 0, "r"], + [71392, 0, "e"], + [71393, 0, "s"], + [71394, 0, "o"], + [71395, 0, "l"], + [71396, 0, "u"], + [71397, 0, "t"], + [71398, 0, "i"], + [71399, 0, "o"], + [71400, 0, "n"], + [71401, 0, " "], + [71402, 0, "i"], + [71403, 0, "s"], + [71404, 0, " "], + [71405, 0, "n"], + [71406, 0, "o"], + [71407, 0, "t"], + [71408, 0, " "], + [71409, 0, "a"], + [71410, 0, " "], + [71411, 0, "s"], + [71412, 0, "i"], + [71413, 0, "m"], + [71414, 0, "p"], + [71415, 0, "l"], + [71416, 0, "e"], + [71417, 0, " "], + [71418, 0, "m"], + [71419, 0, "a"], + [71420, 0, "t"], + [71421, 0, "t"], + [71422, 0, "e"], + [71423, 0, "r"], + [71424, 0, " "], + [71425, 0, "t"], + [71426, 0, "h"], + [71427, 0, "a"], + [71428, 0, "t"], + [71429, 0, " "], + [71430, 0, "s"], + [71431, 0, "h"], + [71432, 0, "o"], + [71433, 0, "u"], + [71434, 0, "l"], + [71435, 0, "d"], + [71436, 0, " "], + [71437, 0, "b"], + [71438, 0, "e"], + [71439, 0, " "], + [71440, 0, "l"], + [71441, 0, "e"], + [71442, 0, "f"], + [71443, 0, "t"], + [71444, 0, " "], + [71445, 0, "t"], + [71446, 0, "o"], + [71447, 0, " "], + [71448, 0, "a"], + [71449, 0, "p"], + [71450, 0, "p"], + [71451, 0, "l"], + [71452, 0, "i"], + [71453, 0, "c"], + [71454, 0, "a"], + [71455, 0, "t"], + [71456, 0, "i"], + [71457, 0, "o"], + [71458, 0, "n"], + [71459, 0, " "], + [71460, 0, "p"], + [71461, 0, "r"], + [71462, 0, "o"], + [71463, 0, "g"], + [71464, 0, "r"], + [71465, 0, "a"], + [71466, 0, "m"], + [71467, 0, "m"], + [71468, 0, "e"], + [71469, 0, "r"], + [71470, 0, "s"], + [71471, 0, "."], + [71435, 1], + [71434, 1], + [71433, 1], + [71432, 1], + [71431, 1], + [71430, 1], + [71430, 0, "c"], + [71431, 0, "a"], + [71432, 0, "n"], + [71433, 0, " "], + [71434, 0, "r"], + [71435, 0, "e"], + [71436, 0, "a"], + [71437, 0, "s"], + [71438, 0, "o"], + [71439, 0, "n"], + [71440, 0, "a"], + [71441, 0, "b"], + [71442, 0, "l"], + [71443, 0, "y"], + [72097, 1], + [72097, 0, "i"], + [72098, 0, "n"], + [72099, 0, "g"], + [72089, 1], + [72088, 1], + [72087, 1], + [72087, 0, "s"], + [72079, 1], + [72078, 1], + [72077, 1], + [72076, 1], + [72075, 1], + [72074, 1], + [72073, 1], + [72072, 1], + [72072, 0, "l"], + [72073, 0, "l"], + [72109, 1], + [72109, 0, "t"], + [72110, 0, "h"], + [72111, 0, "e"], + [72112, 0, " "], + [72113, 0, "s"], + [72114, 0, "a"], + [72115, 0, "m"], + [72116, 0, "e"], + [72141, 1], + [72141, 0, "i"], + [72142, 0, "n"], + [72143, 0, "g"], + [70366, 0, ","], + [70367, 0, "B"], + [70368, 0, "r"], + [70369, 0, "o"], + [70370, 0, "w"], + [70371, 0, "n"], + [70372, 0, ":"], + [70373, 0, "2"], + [70374, 0, "0"], + [70375, 0, "1"], + [70376, 0, "3"], + [70377, 0, "w"], + [70378, 0, "y"], + [70782, 0, " "], + [70783, 0, "\\"], + [70784, 0, "e"], + [70785, 0, "m"], + [70786, 0, "p"], + [70787, 0, "h"], + [70788, 0, "{"], + [70789, 0, "c"], + [70790, 0, "o"], + [70791, 0, "m"], + [70792, 0, "p"], + [70793, 0, "o"], + [70794, 0, "s"], + [70795, 0, "i"], + [70796, 0, "t"], + [70797, 0, "i"], + [70798, 0, "o"], + [70799, 0, "n"], + [70800, 0, "}"], + [70801, 0, " "], + [70802, 0, "o"], + [70803, 0, "r"], + [70859, 0, " "], + [70860, 0, "B"], + [70861, 0, "a"], + [70862, 0, "q"], + [70863, 0, "u"], + [70864, 0, "e"], + [70865, 0, "r"], + [70866, 0, "o"], + [70867, 0, " "], + [70868, 0, "e"], + [70869, 0, "t"], + [70870, 0, " "], + [70871, 0, "a"], + [70872, 0, "l"], + [70873, 0, "."], + [70874, 0, "~"], + [70875, 0, "\\"], + [70876, 0, "c"], + [70877, 0, "i"], + [70878, 0, "t"], + [70879, 0, "e"], + [70880, 0, "{"], + [70881, 0, "B"], + [70882, 0, "a"], + [70883, 0, "q"], + [70884, 0, "u"], + [70885, 0, "e"], + [70886, 0, "r"], + [70887, 0, "o"], + [70888, 0, ":"], + [70889, 0, "2"], + [70890, 0, "0"], + [70891, 0, "1"], + [70892, 0, "5"], + [70893, 0, "t"], + [70894, 0, "m"], + [70895, 0, "}"], + [70896, 0, " "], + [70897, 0, "p"], + [70898, 0, "r"], + [70899, 0, "e"], + [70900, 0, "s"], + [70901, 0, "e"], + [70902, 0, "n"], + [70903, 0, "t"], + [70904, 0, " "], + [70904, 1], + [70903, 1], + [70902, 1], + [70901, 1], + [70900, 1], + [70899, 1], + [70898, 1], + [70897, 1], + [70897, 0, "="], + [70897, 1], + [70897, 0, "d"], + [70898, 0, "e"], + [70899, 0, "f"], + [70900, 0, "i"], + [70901, 0, "n"], + [70902, 0, "e"], + [70903, 0, " "], + [70904, 0, "a"], + [70905, 0, " "], + [70906, 0, "t"], + [70907, 0, "h"], + [70908, 0, "e"], + [70909, 0, "o"], + [70910, 0, "r"], + [70911, 0, "e"], + [70912, 0, "t"], + [70913, 0, "i"], + [70914, 0, "c"], + [70915, 0, "a"], + [70916, 0, "l"], + [70917, 0, " "], + [70918, 0, "b"], + [70919, 0, "a"], + [70920, 0, "s"], + [70921, 0, "i"], + [70922, 0, "s"], + [70923, 0, " "], + [70924, 0, "f"], + [70925, 0, "o"], + [70926, 0, "r"], + [70927, 0, " "], + [70928, 0, "C"], + [70928, 1], + [70928, 0, "c"], + [70929, 0, "o"], + [70930, 0, "m"], + [70931, 0, "p"], + [70932, 0, "o"], + [70933, 0, "s"], + [70934, 0, "i"], + [70935, 0, "t"], + [70936, 0, "i"], + [70937, 0, "o"], + [70938, 0, "n"], + [70939, 0, " "], + [70940, 0, "o"], + [70941, 0, "f"], + [70942, 0, " "], + [70943, 0, "s"], + [70944, 0, "t"], + [70945, 0, "a"], + [70946, 0, "t"], + [70947, 0, "e"], + [70948, 0, "-"], + [70949, 0, "b"], + [70950, 0, "a"], + [70951, 0, "s"], + [70952, 0, "e"], + [70953, 0, "d"], + [70954, 0, " "], + [70955, 0, "C"], + [70956, 0, "R"], + [70957, 0, "D"], + [70958, 0, "T"], + [70959, 0, "s"], + [70960, 0, ","], + [70961, 0, " "], + [70962, 0, "b"], + [70963, 0, "a"], + [70964, 0, "s"], + [70965, 0, "e"], + [70966, 0, "d"], + [70967, 0, " "], + [70968, 0, "o"], + [70969, 0, "n"], + [70970, 0, " "], + [70971, 0, "l"], + [70972, 0, "a"], + [70973, 0, "t"], + [70974, 0, "t"], + [70975, 0, "i"], + [70976, 0, "c"], + [70977, 0, "e"], + [70978, 0, "s"], + [70979, 0, "."], + [70859, 0, " "], + [70860, 0, "R"], + [70861, 0, "i"], + [70862, 0, "a"], + [70863, 0, "k"], + [70864, 0, " "], + [70865, 0, "a"], + [70866, 0, "l"], + [70867, 0, "l"], + [70868, 0, "o"], + [70869, 0, "w"], + [70870, 0, "s"], + [70871, 0, " "], + [70872, 0, "m"], + [70873, 0, "u"], + [70874, 0, "l"], + [70875, 0, "t"], + [70876, 0, "i"], + [70877, 0, "p"], + [70878, 0, "l"], + [70879, 0, "e"], + [70880, 0, " "], + [70881, 0, "l"], + [70882, 0, "e"], + [70883, 0, "v"], + [70884, 0, "e"], + [70885, 0, "l"], + [70886, 0, "s"], + [70887, 0, " "], + [70888, 0, "o"], + [70889, 0, "f"], + [70890, 0, " "], + [70890, 1], + [70889, 1], + [70888, 1], + [70887, 1], + [70886, 1], + [70885, 1], + [70884, 1], + [70883, 1], + [70882, 1], + [70881, 1], + [70880, 1], + [70879, 1], + [70878, 1], + [70877, 1], + [70876, 1], + [70875, 1], + [70874, 1], + [70873, 1], + [70872, 1], + [70872, 0, "n"], + [70873, 0, "e"], + [70874, 0, "s"], + [70875, 0, "t"], + [70876, 0, "i"], + [70877, 0, "n"], + [70878, 0, "g"], + [70879, 0, " "], + [70880, 0, "o"], + [70881, 0, "f"], + [70882, 0, " "], + [70883, 0, "c"], + [70884, 0, "o"], + [70885, 0, "u"], + [70886, 0, "n"], + [70887, 0, "t"], + [70888, 0, "e"], + [70889, 0, "r"], + [70890, 0, "s"], + [70891, 0, " "], + [70892, 0, "a"], + [70893, 0, "n"], + [70894, 0, "d"], + [70895, 0, " "], + [70896, 0, "r"], + [70897, 0, "e"], + [70898, 0, "g"], + [70899, 0, "i"], + [70900, 0, "s"], + [70901, 0, "t"], + [70902, 0, "e"], + [70903, 0, "r"], + [70904, 0, "s"], + [70905, 0, " "], + [70906, 0, "i"], + [70907, 0, "n"], + [70908, 0, "s"], + [70909, 0, "i"], + [70910, 0, "d"], + [70911, 0, "e"], + [70912, 0, " "], + [70913, 0, "m"], + [70914, 0, "a"], + [70915, 0, "p"], + [70916, 0, "s"], + [70917, 0, ","], + [70918, 0, " "], + [70919, 0, "a"], + [70920, 0, "n"], + [70921, 0, "d"], + [70922, 0, " "], + [70923, 0, "o"], + [70924, 0, "f"], + [70925, 0, " "], + [70926, 0, "m"], + [70927, 0, "a"], + [70928, 0, "p"], + [70929, 0, "s"], + [70930, 0, " "], + [70931, 0, "w"], + [70932, 0, "i"], + [70933, 0, "t"], + [70934, 0, "h"], + [70935, 0, "i"], + [70936, 0, "n"], + [70937, 0, " "], + [70938, 0, "o"], + [70939, 0, "t"], + [70940, 0, "h"], + [70941, 0, "e"], + [70942, 0, "r"], + [70943, 0, " "], + [70944, 0, "m"], + [70945, 0, "a"], + [70946, 0, "p"], + [70947, 0, "s"], + [70948, 0, ","], + [70949, 0, " "], + [70950, 0, "b"], + [70951, 0, "u"], + [70952, 0, "t"], + [70953, 0, " "], + [70954, 0, "d"], + [70955, 0, "o"], + [70956, 0, "e"], + [70957, 0, "s"], + [70958, 0, " "], + [70959, 0, "n"], + [70960, 0, "o"], + [70961, 0, "t"], + [70962, 0, " "], + [70963, 0, "s"], + [70964, 0, "u"], + [70965, 0, "p"], + [70966, 0, "p"], + [70967, 0, "o"], + [70968, 0, "r"], + [70969, 0, "t"], + [70970, 0, " "], + [70971, 0, "o"], + [70972, 0, "r"], + [70973, 0, "d"], + [70974, 0, "e"], + [70975, 0, "r"], + [70976, 0, "e"], + [70977, 0, "d"], + [70978, 0, " "], + [70979, 0, "l"], + [70980, 0, "i"], + [70981, 0, "s"], + [70982, 0, "t"], + [70983, 0, "s"], + [70984, 0, "~"], + [70985, 0, "\\"], + [70986, 0, "c"], + [70987, 0, "i"], + [70988, 0, "t"], + [70989, 0, "e"], + [70990, 0, "{"], + [70991, 0, "B"], + [70992, 0, "r"], + [70993, 0, "o"], + [70994, 0, "w"], + [70995, 0, "n"], + [70996, 0, ":"], + [70997, 0, "2"], + [70998, 0, "0"], + [70999, 0, "1"], + [71000, 0, "4"], + [71001, 0, "h"], + [71002, 0, "s"], + [71003, 0, ","], + [71004, 0, "B"], + [71005, 0, "r"], + [71006, 0, "o"], + [71007, 0, "w"], + [71008, 0, "n"], + [71009, 0, ":"], + [71010, 0, "2"], + [71011, 0, "0"], + [71012, 0, "1"], + [71013, 0, "3"], + [71014, 0, "w"], + [71015, 0, "y"], + [71016, 0, "}"], + [71017, 0, "."], + [71018, 0, " "], + [71019, 0, "E"], + [71020, 0, "m"], + [71021, 0, "b"], + [71022, 0, "e"], + [71023, 0, "d"], + [71024, 0, "d"], + [71025, 0, "i"], + [71026, 0, "n"], + [71027, 0, "g"], + [71028, 0, " "], + [71029, 0, "c"], + [71030, 0, "o"], + [71031, 0, "u"], + [71032, 0, "n"], + [71033, 0, "t"], + [71034, 0, "e"], + [71035, 0, "r"], + [71036, 0, "s"], + [71037, 0, " "], + [71038, 0, "i"], + [71039, 0, "n"], + [71040, 0, "s"], + [71041, 0, "i"], + [71042, 0, "d"], + [71043, 0, "e"], + [71044, 0, " "], + [71045, 0, "m"], + [71046, 0, "a"], + [71047, 0, "p"], + [71048, 0, "s"], + [71049, 0, " "], + [71050, 0, "r"], + [71051, 0, "a"], + [71052, 0, "i"], + [71053, 0, "s"], + [71054, 0, "e"], + [71055, 0, "s"], + [71056, 0, " "], + [71057, 0, "d"], + [71058, 0, "i"], + [71058, 1], + [71057, 1], + [71057, 0, "q"], + [71058, 0, "u"], + [71059, 0, "e"], + [71060, 0, "s"], + [71061, 0, "t"], + [71062, 0, "i"], + [71063, 0, "o"], + [71064, 0, "n"], + [71065, 0, "s"], + [71066, 0, " "], + [71067, 0, "o"], + [71068, 0, "f"], + [71069, 0, " "], + [71070, 0, "s"], + [71071, 0, "e"], + [71072, 0, "m"], + [71073, 0, "a"], + [71074, 0, "n"], + [71075, 0, "t"], + [71076, 0, "i"], + [71077, 0, "c"], + [71078, 0, "s"], + [71079, 0, ","], + [71080, 0, " "], + [71081, 0, "w"], + [71082, 0, "h"], + [71083, 0, "i"], + [71084, 0, "c"], + [71085, 0, "h"], + [71086, 0, " "], + [71087, 0, "h"], + [71088, 0, "a"], + [71089, 0, "v"], + [71090, 0, "e"], + [71091, 0, " "], + [71092, 0, "b"], + [71093, 0, "e"], + [71094, 0, "e"], + [71095, 0, "n"], + [71096, 0, " "], + [71097, 0, "s"], + [71098, 0, "t"], + [71099, 0, "u"], + [71100, 0, "d"], + [71101, 0, "i"], + [71102, 0, "e"], + [71103, 0, "d"], + [71104, 0, " "], + [71105, 0, "b"], + [71106, 0, "y"], + [71107, 0, " "], + [71108, 0, "A"], + [71108, 1], + [71108, 0, "B"], + [71109, 0, "a"], + [71110, 0, "q"], + [71111, 0, "u"], + [71112, 0, "e"], + [71113, 0, "r"], + [71114, 0, "o"], + [71115, 0, ","], + [71116, 0, " "], + [71117, 0, "A"], + [71118, 0, "l"], + [71119, 0, "m"], + [71120, 0, "e"], + [71121, 0, "i"], + [71122, 0, "d"], + [71123, 0, "a"], + [71124, 0, " "], + [71125, 0, "a"], + [71126, 0, "n"], + [71127, 0, "d"], + [71128, 0, " "], + [71129, 0, "L"], + [71130, 0, "e"], + [71131, 0, "r"], + [71132, 0, "c"], + [71133, 0, "h"], + [71134, 0, "e"], + [71135, 0, "~"], + [71136, 0, "\\"], + [71137, 0, "c"], + [71138, 0, "i"], + [71139, 0, "t"], + [71140, 0, "e"], + [71141, 0, "{"], + [71142, 0, "B"], + [71143, 0, "a"], + [71144, 0, "q"], + [71145, 0, "u"], + [71146, 0, "e"], + [71147, 0, "r"], + [71148, 0, "o"], + [71149, 0, ":"], + [71150, 0, "2"], + [71151, 0, "0"], + [71152, 0, "1"], + [71153, 0, "6"], + [71154, 0, "i"], + [71155, 0, "v"], + [71156, 0, "}"], + [71157, 0, "."], + [71195, 0, " "], + [71196, 0, "a"], + [71197, 0, "l"], + [71198, 0, "s"], + [71199, 0, "o"], + [71226, 1], + [71225, 1], + [71224, 1], + [71223, 1], + [71222, 1], + [71222, 0, "f"], + [71223, 0, "r"], + [71224, 0, "a"], + [71225, 0, "m"], + [71226, 0, "e"], + [71227, 0, "w"], + [71228, 0, "o"], + [71229, 0, "r"], + [71230, 0, "k"], + [71289, 0, "\n"], + [71290, 0, "\n"], + [71290, 0, "B"], + [71291, 0, "u"], + [71292, 0, "r"], + [71293, 0, "c"], + [71294, 0, "k"], + [71295, 0, "h"], + [71296, 0, "a"], + [71297, 0, "r"], + [71298, 0, "d"], + [71299, 0, "t"], + [71300, 0, " "], + [71301, 0, "e"], + [71302, 0, "t"], + [71303, 0, " "], + [71304, 0, "a"], + [71305, 0, "l"], + [71306, 0, "."], + [71307, 0, "~"], + [71308, 0, "\\"], + [71309, 0, "c"], + [71310, 0, "i"], + [71311, 0, "t"], + [71312, 0, "e"], + [71313, 0, "{"], + [71314, 0, "B"], + [71315, 0, "u"], + [71316, 0, "r"], + [71317, 0, "c"], + [71318, 0, "k"], + [71319, 0, "h"], + [71320, 0, "a"], + [71321, 0, "r"], + [71322, 0, "d"], + [71323, 0, "t"], + [71324, 0, ":"], + [71325, 0, "2"], + [71326, 0, "0"], + [71327, 0, "1"], + [71328, 0, "2"], + [71329, 0, "j"], + [71330, 0, "y"], + [71331, 0, "}"], + [71332, 0, " "], + [71333, 0, "d"], + [71334, 0, "e"], + [71335, 0, "f"], + [71336, 0, "i"], + [71337, 0, "n"], + [71338, 0, "e"], + [71339, 0, " "], + [71340, 0, "\\"], + [71341, 0, "e"], + [71342, 0, "m"], + [71343, 0, "p"], + [71344, 0, "h"], + [71345, 0, "{"], + [71346, 0, "c"], + [71347, 0, "l"], + [71348, 0, "o"], + [71349, 0, "u"], + [71350, 0, "d"], + [71351, 0, " "], + [71352, 0, "t"], + [71353, 0, "y"], + [71354, 0, "p"], + [71355, 0, "e"], + [71356, 0, "s"], + [71357, 0, "}"], + [71358, 0, ","], + [71359, 0, " "], + [71360, 0, "w"], + [71361, 0, "h"], + [71362, 0, "i"], + [71363, 0, "c"], + [71364, 0, "h"], + [71365, 0, " "], + [71366, 0, "a"], + [71367, 0, "r"], + [71368, 0, "e"], + [71369, 0, " "], + [71370, 0, "s"], + [71371, 0, "i"], + [71372, 0, "m"], + [71373, 0, "i"], + [71374, 0, "l"], + [71375, 0, "a"], + [71376, 0, "r"], + [71377, 0, " "], + [71378, 0, "t"], + [71379, 0, "o"], + [71380, 0, " "], + [71381, 0, "C"], + [71382, 0, "R"], + [71383, 0, "D"], + [71384, 0, "T"], + [71385, 0, " "], + [71386, 0, "b"], + [71387, 0, "u"], + [71388, 0, "t"], + [71389, 0, " "], + [71389, 1], + [71388, 1], + [71387, 1], + [71386, 1], + [71385, 1], + [71385, 0, "s"], + [71386, 0, " "], + [71387, 0, "a"], + [71388, 0, "n"], + [71389, 0, "d"], + [71390, 0, " "], + [71391, 0, "c"], + [71392, 0, "a"], + [71393, 0, "n"], + [71394, 0, " "], + [71395, 0, "b"], + [71396, 0, "e"], + [71397, 0, " "], + [71398, 0, "c"], + [71399, 0, "o"], + [71400, 0, "m"], + [71401, 0, "p"], + [71402, 0, "o"], + [71403, 0, "s"], + [71404, 0, "e"], + [71405, 0, "d"], + [71406, 0, "."], + [71407, 0, " "], + [71408, 0, "O"], + [71409, 0, "u"], + [71410, 0, "r"], + [71411, 0, " "], + [71412, 0, "\\"], + [71413, 0, "t"], + [71414, 0, "e"], + [71415, 0, "x"], + [71416, 0, "t"], + [71417, 0, "s"], + [71418, 0, "f"], + [71419, 0, "{"], + [71420, 0, "y"], + [71421, 0, "i"], + [71422, 0, "e"], + [71423, 0, "l"], + [71424, 0, "d"], + [71425, 0, "}"], + [71426, 0, " "], + [71427, 0, "s"], + [71428, 0, "t"], + [71429, 0, "a"], + [71430, 0, "t"], + [71431, 0, "e"], + [71432, 0, "m"], + [71433, 0, "e"], + [71434, 0, "n"], + [71435, 0, "t"], + [71436, 0, " "], + [71437, 0, "i"], + [71438, 0, "s"], + [71439, 0, " "], + [71440, 0, "i"], + [71441, 0, "n"], + [71442, 0, "s"], + [71443, 0, "p"], + [71444, 0, "i"], + [71445, 0, "r"], + [71446, 0, "e"], + [71447, 0, "d"], + [71448, 0, " "], + [71449, 0, "b"], + [71450, 0, "y"], + [71451, 0, " "], + [71452, 0, "B"], + [71453, 0, "u"], + [71454, 0, "r"], + [71455, 0, "c"], + [71456, 0, "k"], + [71457, 0, "h"], + [71458, 0, "a"], + [71459, 0, "r"], + [71460, 0, "d"], + [71461, 0, "t"], + [71462, 0, " "], + [71463, 0, "e"], + [71464, 0, "t"], + [71465, 0, " "], + [71466, 0, "a"], + [71467, 0, "l"], + [71468, 0, "."], + [71407, 0, " "], + [71408, 0, "T"], + [71409, 0, "h"], + [71410, 0, "e"], + [71411, 0, " "], + [71412, 0, "o"], + [71413, 0, "n"], + [71414, 0, "l"], + [71415, 0, "y"], + [71416, 0, " "], + [71417, 0, "d"], + [71418, 0, "e"], + [71419, 0, "f"], + [71420, 0, "i"], + [71421, 0, "n"], + [71422, 0, "e"], + [71423, 0, "d"], + [71424, 0, " "], + [71425, 0, "c"], + [71426, 0, "o"], + [71427, 0, "l"], + [71428, 0, "l"], + [71429, 0, "e"], + [71430, 0, "c"], + [71431, 0, "t"], + [71432, 0, "i"], + [71433, 0, "o"], + [71434, 0, "n"], + [71435, 0, " "], + [71436, 0, "t"], + [71437, 0, "y"], + [71438, 0, "p"], + [71439, 0, "e"], + [71440, 0, " "], + [71441, 0, "i"], + [71442, 0, "s"], + [71443, 0, " "], + [71444, 0, "t"], + [71445, 0, "h"], + [71446, 0, "e"], + [71447, 0, " "], + [71448, 0, "\\"], + [71449, 0, "e"], + [71450, 0, "m"], + [71451, 0, "p"], + [71452, 0, "h"], + [71453, 0, "{"], + [71454, 0, "c"], + [71455, 0, "l"], + [71456, 0, "o"], + [71457, 0, "u"], + [71458, 0, "d"], + [71459, 0, " "], + [71460, 0, "a"], + [71461, 0, "r"], + [71462, 0, "r"], + [71463, 0, "a"], + [71464, 0, "y"], + [71465, 0, "}"], + [71466, 0, ","], + [71467, 0, " "], + [71468, 0, "w"], + [71469, 0, "h"], + [71470, 0, "i"], + [71471, 0, "c"], + [71472, 0, "h"], + [71473, 0, " "], + [71474, 0, "i"], + [71475, 0, "s"], + [71476, 0, " "], + [71477, 0, "s"], + [71478, 0, "i"], + [71479, 0, "m"], + [71480, 0, "i"], + [71481, 0, "l"], + [71482, 0, "a"], + [71483, 0, "r"], + [71484, 0, " "], + [71485, 0, "t"], + [71486, 0, "o"], + [71487, 0, " "], + [71488, 0, "o"], + [71489, 0, "u"], + [71490, 0, "r"], + [71491, 0, " "], + [71492, 0, "m"], + [71493, 0, "a"], + [71494, 0, "p"], + [71495, 0, " "], + [71496, 0, "d"], + [71497, 0, "a"], + [71498, 0, "t"], + [71499, 0, "a"], + [71500, 0, "t"], + [71501, 0, "y"], + [71502, 0, "p"], + [71503, 0, "e"], + [71504, 0, ";"], + [71505, 0, " "], + [71506, 0, "o"], + [71507, 0, "r"], + [71508, 0, "d"], + [71509, 0, "e"], + [71510, 0, "r"], + [71511, 0, "e"], + [71512, 0, "d"], + [71513, 0, " "], + [71514, 0, "l"], + [71515, 0, "i"], + [71516, 0, "s"], + [71517, 0, "t"], + [71518, 0, "s"], + [71519, 0, " "], + [71520, 0, "a"], + [71521, 0, "r"], + [71522, 0, "e"], + [71523, 0, " "], + [71524, 0, "n"], + [71525, 0, "o"], + [71526, 0, "t"], + [71527, 0, " "], + [71528, 0, "s"], + [71529, 0, "u"], + [71530, 0, "p"], + [71531, 0, "p"], + [71532, 0, "o"], + [71533, 0, "r"], + [71534, 0, "t"], + [71535, 0, "e"], + [71536, 0, "d"], + [71537, 0, "."], + [71600, 0, "\n"], + [71601, 0, "\n"], + [71602, 0, "I"], + [71603, 0, "n"], + [71604, 0, " "], + [71605, 0, "g"], + [71606, 0, "e"], + [71607, 0, "n"], + [71608, 0, "e"], + [71609, 0, "r"], + [71610, 0, "a"], + [71611, 0, "l"], + [71612, 0, ","], + [71613, 0, " "], + [71614, 0, "w"], + [71615, 0, "e"], + [71616, 0, " "], + [71617, 0, "a"], + [71618, 0, "r"], + [71619, 0, "e"], + [71620, 0, " "], + [71621, 0, "n"], + [71622, 0, "o"], + [71623, 0, "t"], + [71624, 0, " "], + [71625, 0, "a"], + [71626, 0, "w"], + [71627, 0, "a"], + [71628, 0, "r"], + [71629, 0, "e"], + [71630, 0, " "], + [71631, 0, "o"], + [71632, 0, "f"], + [71633, 0, " "], + [71634, 0, "a"], + [71635, 0, "n"], + [71636, 0, "y"], + [71637, 0, " "], + [71611, 1], + [71610, 1], + [71609, 1], + [71608, 1], + [71607, 1], + [71606, 1], + [71605, 1], + [71604, 1], + [71603, 1], + [71602, 1], + [71602, 0, "A"], + [71603, 0, "l"], + [71604, 0, "t"], + [71605, 0, "h"], + [71606, 0, "o"], + [71607, 0, "u"], + [71608, 0, "g"], + [71609, 0, "h"], + [71610, 0, " "], + [71611, 0, "l"], + [71612, 0, "i"], + [71612, 1], + [71611, 1], + [71611, 0, "C"], + [71612, 0, "R"], + [71613, 0, "D"], + [71614, 0, "T"], + [71615, 0, "s"], + [71616, 0, " "], + [71617, 0, "f"], + [71618, 0, "o"], + [71619, 0, "r"], + [71620, 0, " "], + [71621, 0, "r"], + [71622, 0, "e"], + [71623, 0, "g"], + [71624, 0, "i"], + [71625, 0, "s"], + [71626, 0, "t"], + [71627, 0, "e"], + [71628, 0, "r"], + [71629, 0, "s"], + [71630, 0, ","], + [71631, 0, " "], + [71632, 0, "m"], + [71633, 0, "a"], + [71634, 0, "p"], + [71635, 0, "s"], + [71636, 0, " "], + [71637, 0, "a"], + [71638, 0, "n"], + [71639, 0, "d"], + [71640, 0, " "], + [71641, 0, "o"], + [71642, 0, "r"], + [71643, 0, "d"], + [71644, 0, "e"], + [71645, 0, "r"], + [71646, 0, "e"], + [71647, 0, "d"], + [71648, 0, " "], + [71649, 0, "l"], + [71650, 0, "i"], + [71651, 0, "s"], + [71652, 0, "t"], + [71653, 0, "s"], + [71654, 0, " "], + [71655, 0, "h"], + [71656, 0, "a"], + [71657, 0, "v"], + [71658, 0, "e"], + [71659, 0, " "], + [71660, 0, "e"], + [71661, 0, "x"], + [71662, 0, "i"], + [71663, 0, "s"], + [71664, 0, "t"], + [71665, 0, "e"], + [71666, 0, "d"], + [71667, 0, " "], + [71668, 0, "i"], + [71669, 0, "n"], + [71670, 0, " "], + [71671, 0, "i"], + [71672, 0, "s"], + [71673, 0, "o"], + [71674, 0, "l"], + [71675, 0, "a"], + [71676, 0, "t"], + [71677, 0, "i"], + [71678, 0, "o"], + [71679, 0, "n"], + [71680, 0, " "], + [71681, 0, "f"], + [71682, 0, "o"], + [71683, 0, "r"], + [71684, 0, " "], + [71685, 0, "y"], + [71686, 0, "e"], + [71687, 0, "a"], + [71688, 0, "r"], + [71689, 0, "s"], + [71716, 0, "p"], + [71717, 0, "r"], + [71718, 0, "i"], + [71719, 0, "o"], + [71720, 0, "r"], + [71721, 0, " "], + [71722, 0, "w"], + [71723, 0, "o"], + [71724, 0, "r"], + [71725, 0, "k"], + [71726, 0, " "], + [71727, 0, "t"], + [71728, 0, "h"], + [71729, 0, "a"], + [71730, 0, "t"], + [71731, 0, " "], + [71732, 0, "a"], + [71733, 0, "l"], + [71734, 0, "l"], + [71735, 0, "o"], + [71736, 0, "w"], + [71737, 0, "s"], + [71738, 0, " "], + [71739, 0, "t"], + [71740, 0, "h"], + [71741, 0, "e"], + [71742, 0, "m"], + [71743, 0, " "], + [71744, 0, "t"], + [71745, 0, "o"], + [71746, 0, " "], + [71747, 0, "b"], + [71748, 0, "e"], + [71749, 0, " "], + [71750, 0, "c"], + [71751, 0, "o"], + [71752, 0, "m"], + [71753, 0, "p"], + [71754, 0, "o"], + [71755, 0, "s"], + [71756, 0, "e"], + [71757, 0, "d"], + [71758, 0, " "], + [71759, 0, "i"], + [71760, 0, "n"], + [71761, 0, "t"], + [71762, 0, "o"], + [71763, 0, " "], + [71764, 0, "a"], + [71765, 0, " "], + [71766, 0, "c"], + [71767, 0, "o"], + [71768, 0, "m"], + [71769, 0, "p"], + [71770, 0, "o"], + [71771, 0, "u"], + [71772, 0, "n"], + [71773, 0, "d"], + [71774, 0, " "], + [71775, 0, "C"], + [71776, 0, "R"], + [71777, 0, "D"], + [71778, 0, "T"], + [71779, 0, " "], + [71780, 0, "w"], + [71781, 0, "i"], + [71782, 0, "t"], + [71783, 0, "h"], + [71784, 0, " "], + [71785, 0, "a"], + [71786, 0, " "], + [71787, 0, "J"], + [71788, 0, "S"], + [71789, 0, "O"], + [71790, 0, "N"], + [71791, 0, "-"], + [71792, 0, "l"], + [71793, 0, "i"], + [71794, 0, "k"], + [71795, 0, "e"], + [71796, 0, " "], + [71797, 0, "s"], + [71798, 0, "t"], + [71799, 0, "r"], + [71800, 0, "u"], + [71801, 0, "c"], + [71802, 0, "t"], + [71803, 0, "u"], + [71804, 0, "r"], + [71805, 0, "e"], + [71806, 0, "."], + [71773, 1], + [71772, 1], + [71771, 1], + [71770, 1], + [71769, 1], + [71768, 1], + [71767, 1], + [71766, 1], + [71765, 1], + [71765, 0, "n"], + [71766, 0, " "], + [71767, 0, "a"], + [71768, 0, "r"], + [71769, 0, "b"], + [71770, 0, "i"], + [71771, 0, "t"], + [71772, 0, "r"], + [71773, 0, "a"], + [71774, 0, "r"], + [71775, 0, "i"], + [71776, 0, "l"], + [71777, 0, "y"], + [71667, 0, " "], + [71668, 0, "f"], + [71669, 0, "o"], + [71670, 0, "r"], + [71671, 0, " "], + [71672, 0, "y"], + [71673, 0, "e"], + [71674, 0, "a"], + [71675, 0, "r"], + [71676, 0, "s"], + [71677, 0, "f"], + [71676, 1], + [71676, 1], + [71676, 0, "s"], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71690, 1], + [71743, 0, " "], + [71744, 0, "a"], + [71745, 0, "l"], + [71746, 0, "l"], + [71782, 0, " "], + [71783, 0, "n"], + [71784, 0, "e"], + [71785, 0, "s"], + [71786, 0, "t"], + [71787, 0, "e"], + [71788, 0, "d"], + [71447, 1], + [71446, 1], + [71445, 1], + [71444, 1], + [71443, 1], + [71442, 1], + [71441, 1], + [71440, 1], + [71439, 1], + [71438, 1], + [71437, 1], + [71436, 1], + [71435, 1], + [71434, 1], + [71433, 1], + [71432, 1], + [71431, 1], + [71430, 1], + [71429, 1], + [71428, 1], + [71427, 1], + [71426, 1], + [71425, 1], + [71424, 1], + [71423, 1], + [71422, 1], + [71421, 1], + [71420, 1], + [71419, 1], + [71418, 1], + [71417, 1], + [71416, 1], + [71415, 1], + [71414, 1], + [71413, 1], + [71412, 1], + [71411, 1], + [71410, 1], + [71409, 1], + [71408, 1], + [71408, 0, "A"], + [71409, 0, " "], + [71434, 1], + [71433, 1], + [71432, 1], + [71431, 1], + [71430, 1], + [71429, 1], + [71428, 1], + [71408, 1], + [71408, 0, "T"], + [71409, 0, "h"], + [71410, 0, "i"], + [71411, 0, "s"], + [71412, 0, " "], + [71413, 0, "m"], + [71414, 0, "o"], + [71415, 0, "d"], + [71416, 0, "e"], + [71417, 0, "l"], + [71418, 0, " "], + [71419, 0, "d"], + [71420, 0, "e"], + [71421, 0, "f"], + [71422, 0, "i"], + [71423, 0, "n"], + [71424, 0, "e"], + [71425, 0, "s"], + [71444, 0, "s"], + [71448, 1], + [71447, 1], + [71446, 1], + [71445, 1], + [71445, 0, "}"], + [71446, 0, ","], + [71447, 0, " "], + [71448, 0, "w"], + [71449, 0, "h"], + [71450, 0, "i"], + [71451, 0, "c"], + [71452, 0, "h"], + [71481, 0, ","], + [71482, 0, " "], + [71483, 0, "a"], + [71484, 0, "n"], + [71485, 0, "d"], + [71486, 0, " "], + [71487, 0, "\\"], + [71488, 0, "e"], + [71489, 0, "m"], + [71490, 0, "p"], + [71491, 0, "h"], + [71492, 0, "{"], + [71493, 0, "e"], + [71494, 0, "n"], + [71495, 0, "t"], + [71496, 0, "i"], + [71497, 0, "t"], + [71498, 0, "y"], + [71498, 1], + [71498, 0, "i"], + [71499, 0, "e"], + [71500, 0, "s"], + [71501, 0, "}"], + [71502, 0, ","], + [71503, 0, " "], + [71504, 0, "w"], + [71505, 0, "h"], + [71506, 0, "i"], + [71507, 0, "c"], + [71508, 0, "h"], + [71509, 0, " "], + [71510, 0, "a"], + [71511, 0, "r"], + [71512, 0, "e"], + [71513, 0, " "], + [71514, 0, "l"], + [71515, 0, "i"], + [71516, 0, "k"], + [71517, 0, "e"], + [71518, 0, " "], + [71519, 0, "t"], + [71520, 0, "u"], + [71521, 0, "p"], + [71522, 0, "l"], + [71523, 0, "e"], + [71524, 0, "s"], + [71525, 0, " "], + [71526, 0, "i"], + [71527, 0, "n"], + [71528, 0, " "], + [71529, 0, "t"], + [71530, 0, "h"], + [71531, 0, "e"], + [71532, 0, " "], + [71533, 0, "r"], + [71534, 0, "e"], + [71535, 0, "l"], + [71536, 0, "a"], + [71537, 0, "t"], + [71538, 0, "i"], + [71539, 0, "o"], + [71540, 0, "n"], + [71541, 0, "a"], + [71542, 0, "l"], + [71543, 0, " "], + [71544, 0, "m"], + [71545, 0, "o"], + [71546, 0, "d"], + [71547, 0, "e"], + [71548, 0, "l"], + [71549, 0, "."], + [71550, 1], + [71551, 1], + [71551, 0, "O"], + [71581, 1], + [71580, 1], + [71579, 1], + [71578, 1], + [71577, 1], + [71576, 1], + [71575, 1], + [71574, 1], + [71573, 1], + [71573, 0, "d"], + [71574, 0, "e"], + [71575, 0, "f"], + [71576, 0, "i"], + [71577, 0, "n"], + [71578, 0, "e"], + [71579, 0, "d"], + [71580, 0, " "], + [71581, 0, "i"], + [71582, 0, "n"], + [71583, 0, " "], + [71584, 0, "t"], + [71585, 0, "h"], + [71586, 0, "i"], + [71587, 0, "s"], + [71588, 0, " "], + [71589, 0, "f"], + [71590, 0, "r"], + [71591, 0, "a"], + [71592, 0, "m"], + [71593, 0, "e"], + [71594, 0, "w"], + [71595, 0, "o"], + [71596, 0, "r"], + [71597, 0, "k"], + [71446, 0, " "], + [71447, 0, "a"], + [71448, 0, "n"], + [71449, 0, "d"], + [71450, 0, " "], + [71451, 0, "\\"], + [71452, 0, "e"], + [71453, 0, "m"], + [71454, 0, "p"], + [71455, 0, "h"], + [71456, 0, "{"], + [71457, 0, "e"], + [71458, 0, "n"], + [71459, 0, "t"], + [71460, 0, "i"], + [71461, 0, "t"], + [71462, 0, "i"], + [71463, 0, "e"], + [71464, 0, "s"], + [71465, 0, "}"], + [71473, 0, " "], + [71474, 0, "b"], + [71475, 0, "e"], + [71476, 0, "h"], + [71477, 0, "a"], + [71478, 0, "v"], + [71479, 0, "e"], + [71488, 0, "l"], + [71489, 0, "y"], + [71577, 1], + [71576, 1], + [71575, 1], + [71574, 1], + [71573, 1], + [71572, 1], + [71571, 1], + [71570, 1], + [71569, 1], + [71568, 1], + [71567, 1], + [71566, 1], + [71565, 1], + [71564, 1], + [71563, 1], + [71562, 1], + [71561, 1], + [71560, 1], + [71559, 1], + [71558, 1], + [71557, 1], + [71556, 1], + [71555, 1], + [71554, 1], + [71553, 1], + [71552, 1], + [71551, 1], + [71550, 1], + [71549, 1], + [71548, 1], + [71547, 1], + [71546, 1], + [71545, 1], + [71544, 1], + [71543, 1], + [71542, 1], + [71541, 1], + [71540, 1], + [71539, 1], + [71538, 1], + [71537, 1], + [71536, 1], + [71535, 1], + [71534, 1], + [71533, 1], + [71532, 1], + [71531, 1], + [71530, 1], + [71529, 1], + [71528, 1], + [71527, 1], + [71526, 1], + [71525, 1], + [71524, 1], + [71523, 1], + [71522, 1], + [71521, 1], + [71520, 1], + [71519, 1], + [71518, 1], + [71517, 1], + [71516, 1], + [71515, 1], + [71514, 1], + [71513, 1], + [71512, 1], + [71511, 1], + [71510, 1], + [71510, 0, ";"], + [71511, 1], + [71512, 1], + [71512, 0, "o"], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 1], + [71408, 0, "T"], + [71409, 0, "h"], + [71410, 0, "e"], + [71411, 0, "y"], + [71419, 1], + [71458, 1], + [71457, 1], + [71456, 1], + [71455, 1], + [71454, 1], + [71453, 1], + [71452, 1], + [71451, 1], + [71450, 1], + [71449, 1], + [71448, 1], + [71447, 1], + [71446, 1], + [71445, 1], + [71444, 1], + [71443, 1], + [71442, 1], + [71441, 1], + [71440, 1], + [71439, 1], + [71483, 0, ","], + [71484, 0, " "], + [71485, 0, "a"], + [71486, 0, "n"], + [71487, 0, "d"], + [71488, 0, " "], + [71489, 0, "\\"], + [71490, 0, "e"], + [71491, 0, "m"], + [71492, 0, "p"], + [71493, 0, "h"], + [71494, 0, "{"], + [71495, 0, "e"], + [71496, 0, "n"], + [71497, 0, "t"], + [71498, 0, "i"], + [71499, 0, "t"], + [71500, 0, "i"], + [71501, 0, "e"], + [71502, 0, "s"], + [71503, 0, "}"], + [71504, 0, ","], + [71505, 0, " "], + [71506, 0, "w"], + [71507, 0, "h"], + [71508, 0, "i"], + [71509, 0, "c"], + [71510, 0, "h"], + [71511, 0, " "], + [71512, 0, "a"], + [71513, 0, "r"], + [71514, 0, "e"], + [71515, 0, " "], + [71516, 0, "l"], + [71517, 0, "i"], + [71518, 0, "k"], + [71519, 0, "e"], + [71520, 0, " "], + [71521, 0, "u"], + [71522, 0, "n"], + [71523, 0, "o"], + [71524, 0, "r"], + [71525, 0, "d"], + [71526, 0, "e"], + [71527, 0, "r"], + [71528, 0, "e"], + [71529, 0, "d"], + [71530, 0, " "], + [71531, 0, "s"], + [71532, 0, "e"], + [71533, 0, "t"], + [71534, 0, "s"], + [71535, 0, " "], + [71536, 0, "o"], + [71537, 0, "r"], + [71538, 0, " "], + [71539, 0, "r"], + [71540, 0, "e"], + [71541, 0, "l"], + [71542, 0, "a"], + [71543, 0, "t"], + [71544, 0, "i"], + [71545, 0, "o"], + [71546, 0, "n"], + [71547, 0, "s"], + [71157, 0, ","], + [71158, 0, " "], + [71158, 1], + [71157, 1], + [71158, 0, " "], + [71159, 0, "A"], + [71160, 0, "l"], + [71161, 0, "m"], + [71162, 0, "e"], + [71163, 0, "i"], + [71164, 0, "d"], + [71165, 0, "a"], + [71166, 0, " "], + [71167, 0, "e"], + [71168, 0, "t"], + [71169, 0, " "], + [71170, 0, "a"], + [71171, 0, "l"], + [71172, 0, "."], + [71173, 0, "~"], + [71174, 0, "\\"], + [71175, 0, "c"], + [71176, 0, "i"], + [71177, 0, "t"], + [71178, 0, "e"], + [71179, 0, "{"], + [71180, 0, "A"], + [71181, 0, "l"], + [71182, 0, "m"], + [71183, 0, "e"], + [71184, 0, "i"], + [71185, 0, "d"], + [71186, 0, "a"], + [71187, 0, ":"], + [71188, 0, "2"], + [71189, 0, "0"], + [71190, 0, "1"], + [71191, 0, "6"], + [71192, 0, "t"], + [71193, 0, "k"], + [71194, 0, "}"], + [71195, 0, " "], + [71196, 0, "a"], + [71197, 0, "l"], + [71198, 0, "s"], + [71199, 0, "o"], + [71200, 0, " "], + [71201, 0, "d"], + [71202, 0, "e"], + [71203, 0, "f"], + [71204, 0, "i"], + [71205, 0, "n"], + [71206, 0, "e"], + [71207, 0, " "], + [71208, 0, "d"], + [71209, 0, "e"], + [71210, 0, "l"], + [71211, 0, "t"], + [71212, 0, "a"], + [71213, 0, " "], + [71214, 0, "m"], + [71215, 0, "u"], + [71216, 0, "t"], + [71217, 0, "a"], + [71218, 0, "t"], + [71219, 0, "i"], + [71220, 0, "o"], + [71221, 0, "n"], + [71222, 0, " "], + [71222, 1], + [71222, 0, "s"], + [71223, 0, " "], + [71224, 0, "f"], + [71225, 0, "o"], + [71226, 0, "r"], + [71227, 0, " "], + [71228, 0, "n"], + [71229, 0, "e"], + [71230, 0, "s"], + [71231, 0, "t"], + [71232, 0, "e"], + [71233, 0, "d"], + [71234, 0, " "], + [71235, 0, "m"], + [71236, 0, "a"], + [71237, 0, "p"], + [71238, 0, "s"], + [71239, 0, ","], + [71240, 0, " "], + [71241, 0, "a"], + [71242, 0, "n"], + [71243, 0, "d"], + [71285, 1], + [71284, 1], + [71283, 1], + [71282, 1], + [71281, 1], + [71369, 0, " "], + [71370, 0, "A"], + [71371, 0, "l"], + [71372, 0, "t"], + [71373, 0, "h"], + [71374, 0, "o"], + [71375, 0, "u"], + [71376, 0, "g"], + [71377, 0, "h"], + [71378, 0, " "], + [70983, 1], + [70982, 1], + [70981, 1], + [70980, 1], + [70979, 1], + [70978, 1], + [70977, 1], + [70976, 1], + [70975, 1], + [70974, 1], + [70973, 1], + [70972, 1], + [70971, 1], + [70970, 1], + [70969, 1], + [70968, 1], + [70967, 1], + [70966, 1], + [70965, 1], + [70964, 1], + [70963, 1], + [70962, 1], + [70961, 1], + [70960, 1], + [70959, 1], + [70958, 1], + [70957, 1], + [70956, 1], + [70955, 1], + [70954, 1], + [70953, 1], + [70952, 1], + [70951, 1], + [70950, 1], + [70949, 1], + [70948, 1], + [71342, 1], + [71341, 1], + [71340, 1], + [71339, 1], + [71338, 1], + [71337, 1], + [71336, 1], + [71335, 1], + [71334, 1], + [71334, 0, "N"], + [71335, 0, "o"], + [71336, 0, "n"], + [71337, 0, "e"], + [71338, 0, " "], + [71339, 0, "o"], + [71340, 0, "f"], + [71341, 0, " "], + [71342, 0, "t"], + [71343, 0, "h"], + [71344, 0, "i"], + [71345, 0, "s"], + [71346, 0, " "], + [71347, 0, "w"], + [71348, 0, "o"], + [71349, 0, "r"], + [71350, 0, "k"], + [71351, 0, " "], + [71352, 0, "i"], + [71353, 0, "n"], + [71354, 0, "t"], + [71355, 0, "e"], + [71356, 0, "g"], + [71357, 0, "r"], + [71358, 0, "a"], + [71359, 0, "t"], + [71360, 0, "e"], + [71361, 0, "s"], + [71362, 0, " "], + [71363, 0, "C"], + [71364, 0, "R"], + [71365, 0, "D"], + [71366, 0, "T"], + [71367, 0, "s"], + [71368, 0, " "], + [71369, 0, "f"], + [71370, 0, "o"], + [71371, 0, "r"], + [71372, 0, " "], + [71373, 0, "o"], + [71374, 0, "r"], + [71375, 0, "d"], + [71376, 0, "e"], + [71377, 0, "r"], + [71378, 0, "e"], + [71379, 0, "d"], + [71380, 0, " "], + [71381, 0, "l"], + [71382, 0, "i"], + [71383, 0, "s"], + [71384, 0, "t"], + [71385, 0, "s"], + [71386, 0, ","], + [71387, 0, " "], + [71388, 0, "b"], + [71389, 0, "u"], + [71390, 0, "t"], + [71391, 0, " "], + [71392, 0, "t"], + [71393, 0, "h"], + [71394, 0, "e"], + [71395, 0, " "], + [71396, 0, "t"], + [71397, 0, "r"], + [71398, 0, "e"], + [71399, 0, "a"], + [71400, 0, "t"], + [71401, 0, "m"], + [71402, 0, "e"], + [71403, 0, "n"], + [71404, 0, "t"], + [71405, 0, " "], + [71406, 0, "o"], + [71407, 0, "f"], + [71408, 0, " "], + [71409, 0, "c"], + [71410, 0, "a"], + [71411, 0, "u"], + [71412, 0, "s"], + [71413, 0, "a"], + [71414, 0, "l"], + [71415, 0, "i"], + [71416, 0, "t"], + [71417, 0, "y"], + [71418, 0, " "], + [71419, 0, "i"], + [71420, 0, "n"], + [71421, 0, " "], + [71422, 0, "t"], + [71423, 0, "h"], + [71424, 0, "e"], + [71425, 0, "s"], + [71426, 0, "e"], + [71427, 0, " "], + [71428, 0, "d"], + [71429, 0, "a"], + [71430, 0, "t"], + [71431, 0, "a"], + [71432, 0, "t"], + [71433, 0, "y"], + [71434, 0, "p"], + [71435, 0, "e"], + [71436, 0, "s"], + [71437, 0, " "], + [71438, 0, "i"], + [71439, 0, "s"], + [71440, 0, " "], + [71441, 0, "t"], + [71442, 0, "h"], + [71443, 0, "e"], + [71444, 0, " "], + [71444, 1], + [71443, 1], + [71442, 1], + [71441, 1], + [71441, 0, "a"], + [71442, 0, " "], + [71443, 0, "b"], + [71444, 0, "a"], + [71445, 0, "s"], + [71446, 0, "i"], + [71447, 0, "s"], + [71448, 0, " "], + [71449, 0, "f"], + [71450, 0, "o"], + [71451, 0, "r"], + [71452, 0, " "], + [71453, 0, "t"], + [71454, 0, "h"], + [71455, 0, "e"], + [71456, 0, " "], + [71457, 0, "s"], + [71458, 0, "e"], + [71459, 0, "m"], + [71460, 0, "a"], + [71461, 0, "n"], + [71462, 0, "t"], + [71463, 0, "i"], + [71464, 0, "c"], + [71465, 0, "s"], + [71466, 0, " "], + [71467, 0, "i"], + [71468, 0, "n"], + [71469, 0, " "], + [71470, 0, "t"], + [71471, 0, "h"], + [71472, 0, "s"], + [71473, 0, "i"], + [71473, 1], + [71472, 1], + [71472, 0, "i"], + [71473, 0, "s"], + [71474, 0, " "], + [71475, 0, "a"], + [71476, 0, "p"], + [71476, 1], + [71475, 1], + [71475, 0, "p"], + [71476, 0, "a"], + [71477, 0, "p"], + [71478, 0, "e"], + [71479, 0, "r"], + [71480, 0, "."], + [71438, 1], + [71438, 1], + [71438, 0, "f"], + [71439, 0, "o"], + [71440, 0, "r"], + [71441, 0, "m"], + [71442, 0, "s"], + [71469, 0, " "], + [71470, 0, "d"], + [71471, 0, "e"], + [71472, 0, "v"], + [71473, 0, "e"], + [71474, 0, "l"], + [71475, 0, "o"], + [71476, 0, "p"], + [71477, 0, "e"], + [71478, 0, "d"], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73619, 1], + [73675, 1], + [73645, 1], + [73644, 1], + [73643, 1], + [73642, 1], + [73641, 1], + [73640, 1], + [73639, 1], + [73638, 1], + [73638, 0, "I"], + [73639, 0, "E"], + [73640, 0, "E"], + [73641, 0, "E"], + [73642, 0, "t"], + [73643, 0, "r"], + [73644, 0, "a"], + [73645, 0, "n"], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11736, 1], + [11735, 1], + [11735, 0, "~"], + [11736, 0, "\\"], + [11737, 0, "c"], + [11738, 0, "i"], + [11739, 0, "t"], + [11740, 0, "e"], + [11741, 0, "{"], + [11742, 0, "D"], + [11743, 0, "a"], + [11744, 0, "v"], + [11745, 0, "i"], + [11746, 0, "s"], + [11747, 0, ":"], + [11748, 0, "2"], + [11749, 0, "0"], + [11750, 0, "0"], + [11751, 0, "2"], + [11752, 0, "i"], + [11753, 0, "v"], + [11754, 0, ","], + [11755, 0, "I"], + [11756, 0, "g"], + [11757, 0, "n"], + [11758, 0, "a"], + [11759, 0, "t"], + [11760, 0, ":"], + [11761, 0, "2"], + [11762, 0, "0"], + [11763, 0, "0"], + [11764, 0, "3"], + [11765, 0, "j"], + [11766, 0, "y"], + [11767, 0, ","], + [11768, 0, "W"], + [11769, 0, "a"], + [11770, 0, "n"], + [11771, 0, "g"], + [11772, 0, ":"], + [11773, 0, "2"], + [11774, 0, "0"], + [11775, 0, "1"], + [11776, 0, "5"], + [11777, 0, "v"], + [11778, 0, "a"], + [11779, 0, "}"], + [12995, 0, "\n"], + [12996, 0, "\n"], + [12997, 0, "W"], + [12998, 0, "e"], + [12999, 0, " "], + [13000, 0, "d"], + [13001, 0, "i"], + [13002, 0, "s"], + [13003, 0, "c"], + [13004, 0, "u"], + [13005, 0, "s"], + [13006, 0, "s"], + [13007, 0, " "], + [13008, 0, "r"], + [13009, 0, "e"], + [13010, 0, "l"], + [13011, 0, "a"], + [13012, 0, "t"], + [13013, 0, "e"], + [13014, 0, "d"], + [13015, 0, " "], + [13016, 0, "w"], + [13017, 0, "o"], + [13018, 0, "r"], + [13019, 0, "k"], + [13020, 0, " "], + [13020, 1], + [13019, 1], + [13018, 1], + [13017, 1], + [13016, 1], + [13015, 1], + [13014, 1], + [13013, 1], + [13012, 1], + [13011, 1], + [13010, 1], + [13009, 1], + [13008, 1], + [13008, 0, "e"], + [13009, 0, "x"], + [13010, 0, "i"], + [13011, 0, "s"], + [13012, 0, "t"], + [13013, 0, "i"], + [13014, 0, "n"], + [13015, 0, "g"], + [13016, 0, " "], + [13017, 0, "a"], + [13018, 0, "l"], + [13019, 0, "g"], + [13020, 0, "o"], + [13021, 0, "r"], + [13022, 0, "i"], + [13023, 0, "t"], + [13024, 0, "h"], + [13025, 0, "m"], + [13026, 0, "s"], + [13027, 0, " "], + [13028, 0, "f"], + [13029, 0, "o"], + [13030, 0, "r"], + [13031, 0, " "], + [13032, 0, "c"], + [13033, 0, "o"], + [13034, 0, "l"], + [13035, 0, "l"], + [13036, 0, "a"], + [13037, 0, "b"], + [13038, 0, "o"], + [13039, 0, "r"], + [13040, 0, "a"], + [13041, 0, "t"], + [13042, 0, "i"], + [13043, 0, "v"], + [13044, 0, "e"], + [13045, 0, " "], + [13046, 0, "e"], + [13047, 0, "d"], + [13048, 0, "i"], + [13049, 0, "t"], + [13050, 0, "i"], + [13051, 0, "n"], + [13052, 0, "g"], + [13053, 0, " "], + [13054, 0, "i"], + [13055, 0, "n"], + [13056, 0, " "], + [13057, 0, "s"], + [13058, 0, "e"], + [13059, 0, "c"], + [13060, 0, "t"], + [13061, 0, "i"], + [13062, 0, "o"], + [13063, 0, "n"], + [13064, 0, "~"], + [13065, 0, "\\"], + [13066, 0, "r"], + [13067, 0, "e"], + [13068, 0, "f"], + [13069, 0, "{"], + [13070, 0, "s"], + [13071, 0, "e"], + [13072, 0, "c"], + [13073, 0, ":"], + [13074, 0, "r"], + [13075, 0, "e"], + [13076, 0, "l"], + [13077, 0, "a"], + [13078, 0, "t"], + [13079, 0, "e"], + [13080, 0, "d"], + [13081, 0, "-"], + [13082, 0, "o"], + [13083, 0, "t"], + [13084, 0, "}"], + [13085, 0, "."], + [11778, 1], + [11778, 0, "o"], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1094, 1], + [1070, 0, "\\"], + [1071, 0, "I"], + [1072, 0, "E"], + [1073, 0, "E"], + [1074, 0, "E"], + [1075, 0, "r"], + [1076, 0, "a"], + [1077, 0, "i"], + [1078, 0, "s"], + [1079, 0, "e"], + [1080, 0, "s"], + [1081, 0, "e"], + [1082, 0, "c"], + [1083, 0, "t"], + [1084, 0, "i"], + [1085, 0, "o"], + [1086, 0, "n"], + [1087, 0, "h"], + [1088, 0, "e"], + [1089, 0, "a"], + [1090, 0, "d"], + [1091, 0, "i"], + [1092, 0, "n"], + [1093, 0, "g"], + [1094, 0, "{"], + [1117, 0, "\\"], + [1118, 0, "l"], + [1119, 0, "a"], + [1120, 0, "b"], + [1121, 0, "e"], + [1122, 0, "l"], + [1123, 0, "{"], + [1124, 0, "s"], + [1125, 0, "e"], + [1126, 0, "c"], + [1127, 0, ":"], + [1128, 0, "i"], + [1129, 0, "n"], + [1130, 0, "t"], + [1131, 0, "r"], + [1132, 0, "o"], + [1133, 0, "d"], + [1134, 0, "u"], + [1135, 0, "c"], + [1136, 0, "t"], + [1137, 0, "i"], + [1138, 0, "o"], + [1139, 0, "n"], + [1140, 0, "}"], + [1141, 0, "}"], + [1143, 0, "\n"], + [1144, 0, "\\"], + [1145, 0, "I"], + [1146, 0, "E"], + [1147, 0, "E"], + [1148, 0, "E"], + [1149, 0, "P"], + [1150, 0, "A"], + [1151, 0, "R"], + [1152, 0, "s"], + [1153, 0, "t"], + [1154, 0, "a"], + [1155, 0, "r"], + [1156, 0, "t"], + [1157, 0, "{"], + [1158, 0, "T"], + [1159, 0, "}"], + [1160, 0, "{"], + [1161, 0, "t"], + [1162, 0, "h"], + [1163, 0, "i"], + [1164, 0, "s"], + [1165, 0, "}"], + [1166, 0, " "], + [1167, 0, "i"], + [1168, 0, "s"], + [1169, 0, " "], + [1170, 0, "w"], + [1171, 0, "h"], + [1172, 0, "e"], + [1173, 0, "r"], + [1174, 0, "e"], + [1175, 0, " "], + [1176, 0, "t"], + [1177, 0, "h"], + [1178, 0, "e"], + [1179, 0, " "], + [1180, 0, "i"], + [1181, 0, "n"], + [1182, 0, "t"], + [1183, 0, "r"], + [1184, 0, "o"], + [1185, 0, "d"], + [1186, 0, "u"], + [1187, 0, "c"], + [1188, 0, "t"], + [1189, 0, "i"], + [1190, 0, "o"], + [1191, 0, "n"], + [1192, 0, " "], + [1193, 0, "s"], + [1194, 0, "h"], + [1195, 0, "o"], + [1196, 0, "u"], + [1197, 0, "l"], + [1198, 0, "d"], + [1199, 0, " "], + [1200, 0, "g"], + [1201, 0, "o"], + [1202, 0, " "], + [1203, 0, "("], + [1204, 0, "T"], + [1205, 0, "O"], + [1206, 0, "D"], + [1207, 0, "O"], + [1208, 0, ")"], + [1209, 0, "."], + [1210, 0, " "], + [1211, 0, "L"], + [1212, 0, "o"], + [1213, 0, "r"], + [1214, 0, "e"], + [1215, 0, "m"], + [1216, 0, " "], + [1217, 0, "i"], + [1218, 0, "p"], + [1219, 0, "s"], + [1220, 0, "u"], + [1221, 0, "m"], + [1222, 0, " "], + [1223, 0, "d"], + [1224, 0, "o"], + [1225, 0, "l"], + [1226, 0, "o"], + [1227, 0, "r"], + [1228, 0, " "], + [1229, 0, "s"], + [1230, 0, "i"], + [1231, 0, "t"], + [1232, 0, " "], + [1233, 0, "a"], + [1234, 0, "m"], + [1235, 0, "e"], + [1236, 0, "t"], + [1237, 0, ","], + [1238, 0, " "], + [1239, 0, "c"], + [1240, 0, "o"], + [1241, 0, "n"], + [1242, 0, "s"], + [1243, 0, "e"], + [1244, 0, "c"], + [1245, 0, "t"], + [1246, 0, "e"], + [1247, 0, "t"], + [1248, 0, "u"], + [1249, 0, "r"], + [1250, 0, " "], + [1251, 0, "a"], + [1252, 0, "d"], + [1253, 0, "i"], + [1254, 0, "p"], + [1255, 0, "i"], + [1256, 0, "s"], + [1257, 0, "c"], + [1258, 0, "i"], + [1259, 0, "n"], + [1260, 0, "g"], + [1261, 0, " "], + [1262, 0, "e"], + [1263, 0, "l"], + [1264, 0, "i"], + [1265, 0, "t"], + [1266, 0, "."], + [1267, 0, " "], + [1268, 0, "S"], + [1269, 0, "u"], + [1270, 0, "s"], + [1271, 0, "p"], + [1272, 0, "e"], + [1273, 0, "n"], + [1274, 0, "d"], + [1275, 0, "i"], + [1276, 0, "s"], + [1277, 0, "s"], + [1278, 0, "e"], + [1279, 0, " "], + [1280, 0, "m"], + [1281, 0, "a"], + [1282, 0, "t"], + [1283, 0, "t"], + [1284, 0, "i"], + [1285, 0, "s"], + [1286, 0, " "], + [1287, 0, "l"], + [1288, 0, "e"], + [1289, 0, "o"], + [1290, 0, " "], + [1291, 0, "c"], + [1292, 0, "u"], + [1293, 0, "r"], + [1294, 0, "s"], + [1295, 0, "u"], + [1296, 0, "s"], + [1297, 0, " "], + [1298, 0, "t"], + [1299, 0, "o"], + [1300, 0, "r"], + [1301, 0, "t"], + [1302, 0, "o"], + [1303, 0, "r"], + [1304, 0, " "], + [1305, 0, "m"], + [1306, 0, "a"], + [1307, 0, "t"], + [1308, 0, "t"], + [1309, 0, "i"], + [1310, 0, "s"], + [1311, 0, " "], + [1312, 0, "t"], + [1313, 0, "i"], + [1314, 0, "n"], + [1315, 0, "c"], + [1316, 0, "i"], + [1317, 0, "d"], + [1318, 0, "u"], + [1319, 0, "n"], + [1320, 0, "t"], + [1321, 0, "."], + [1322, 0, " "], + [1323, 0, "D"], + [1324, 0, "o"], + [1325, 0, "n"], + [1326, 0, "e"], + [1327, 0, "c"], + [1328, 0, " "], + [1329, 0, "s"], + [1330, 0, "e"], + [1331, 0, "d"], + [1332, 0, " "], + [1333, 0, "b"], + [1334, 0, "i"], + [1335, 0, "b"], + [1336, 0, "e"], + [1337, 0, "n"], + [1338, 0, "d"], + [1339, 0, "u"], + [1340, 0, "m"], + [1341, 0, " "], + [1342, 0, "p"], + [1343, 0, "u"], + [1344, 0, "r"], + [1345, 0, "u"], + [1346, 0, "s"], + [1347, 0, ","], + [1348, 0, " "], + [1349, 0, "v"], + [1350, 0, "e"], + [1351, 0, "l"], + [1352, 0, " "], + [1353, 0, "b"], + [1354, 0, "l"], + [1355, 0, "a"], + [1356, 0, "n"], + [1357, 0, "d"], + [1358, 0, "i"], + [1359, 0, "t"], + [1360, 0, " "], + [1361, 0, "e"], + [1362, 0, "r"], + [1363, 0, "a"], + [1364, 0, "t"], + [1365, 0, "."], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1046, 1], + [1033, 0, "\n"], + [1034, 0, "\n"], + [1035, 0, "\\"], + [1036, 0, "I"], + [1037, 0, "E"], + [1038, 0, "E"], + [1039, 0, "E"], + [1040, 0, "t"], + [1041, 0, "i"], + [1042, 0, "t"], + [1043, 0, "l"], + [1044, 0, "e"], + [1045, 0, "a"], + [1046, 0, "b"], + [1047, 0, "s"], + [1048, 0, "t"], + [1049, 0, "r"], + [1050, 0, "a"], + [1051, 0, "c"], + [1052, 0, "t"], + [1053, 0, "i"], + [1054, 0, "n"], + [1055, 0, "d"], + [1056, 0, "e"], + [1057, 0, "x"], + [1058, 0, "t"], + [1059, 0, "e"], + [1060, 0, "x"], + [1061, 0, "t"], + [1062, 0, "{"], + [1063, 0, "%"], + [1064, 0, "\n"], + [1065, 0, "\\"], + [1066, 0, "b"], + [1067, 0, "e"], + [1068, 0, "g"], + [1069, 0, "i"], + [1070, 0, "n"], + [1071, 0, "{"], + [1072, 0, "a"], + [1073, 0, "b"], + [1074, 0, "s"], + [1075, 0, "t"], + [1076, 0, "r"], + [1077, 0, "a"], + [1078, 0, "c"], + [1079, 0, "t"], + [1080, 0, "}"], + [1081, 0, "\n"], + [1082, 0, "T"], + [1083, 0, "O"], + [1084, 0, "D"], + [1085, 0, "\\"], + [1086, 0, "e"], + [1087, 0, "n"], + [1088, 0, "d"], + [1089, 0, "{"], + [1090, 0, "a"], + [1091, 0, "b"], + [1092, 0, "s"], + [1093, 0, "t"], + [1094, 0, "r"], + [1095, 0, "a"], + [1096, 0, "c"], + [1097, 0, "t"], + [1098, 0, "}"], + [1085, 0, "O"], + [1086, 0, "\n"], + [1101, 0, "\n"], + [1102, 0, "\n"], + [1103, 0, "\\"], + [1104, 0, "b"], + [1105, 0, "e"], + [1106, 0, "g"], + [1107, 0, "i"], + [1108, 0, "n"], + [1109, 0, "{"], + [1110, 0, "I"], + [1111, 0, "E"], + [1112, 0, "E"], + [1113, 0, "E"], + [1114, 0, "k"], + [1115, 0, "e"], + [1116, 0, "y"], + [1117, 0, "w"], + [1118, 0, "o"], + [1119, 0, "r"], + [1120, 0, "d"], + [1121, 0, "s"], + [1122, 0, "}"], + [1123, 0, "\n"], + [1124, 0, "C"], + [1125, 0, "R"], + [1126, 0, "D"], + [1127, 0, "T"], + [1128, 0, "s"], + [1129, 0, ","], + [1130, 0, " "], + [1131, 0, "C"], + [1132, 0, "o"], + [1133, 0, "l"], + [1134, 0, "l"], + [1135, 0, "a"], + [1136, 0, "b"], + [1137, 0, "o"], + [1138, 0, "r"], + [1139, 0, "a"], + [1140, 0, "t"], + [1141, 0, "i"], + [1142, 0, "v"], + [1143, 0, "e"], + [1144, 0, " "], + [1145, 0, "E"], + [1146, 0, "d"], + [1147, 0, "i"], + [1148, 0, "t"], + [1149, 0, "i"], + [1150, 0, "n"], + [1151, 0, "g"], + [1152, 0, ","], + [1153, 0, " "], + [1154, 0, "P"], + [1155, 0, "2"], + [1156, 0, "P"], + [1157, 0, ","], + [1158, 0, " "], + [1159, 0, "J"], + [1160, 0, "S"], + [1161, 0, "O"], + [1162, 0, "N"], + [1163, 0, ","], + [1164, 0, " "], + [1165, 0, "O"], + [1166, 0, "p"], + [1167, 0, "t"], + [1168, 0, "i"], + [1169, 0, "m"], + [1170, 0, "i"], + [1171, 0, "s"], + [1172, 0, "t"], + [1173, 0, "i"], + [1174, 0, "c"], + [1175, 0, " "], + [1176, 0, "R"], + [1177, 0, "e"], + [1178, 0, "p"], + [1179, 0, "l"], + [1180, 0, "i"], + [1181, 0, "c"], + [1182, 0, "a"], + [1183, 0, "t"], + [1184, 0, "i"], + [1185, 0, "o"], + [1186, 0, "n"], + [1187, 0, ","], + [1188, 0, " "], + [1189, 0, "S"], + [1190, 0, "e"], + [1191, 0, "m"], + [1192, 0, "a"], + [1193, 0, "n"], + [1194, 0, "t"], + [1195, 0, "i"], + [1196, 0, "c"], + [1197, 0, "s"], + [1198, 0, ","], + [1199, 0, " "], + [1200, 0, "E"], + [1201, 0, "v"], + [1202, 0, "e"], + [1203, 0, "n"], + [1204, 0, "t"], + [1205, 0, "u"], + [1206, 0, "a"], + [1207, 0, "l"], + [1208, 0, " "], + [1209, 0, "C"], + [1210, 0, "o"], + [1211, 0, "n"], + [1212, 0, "s"], + [1213, 0, "i"], + [1214, 0, "s"], + [1215, 0, "t"], + [1216, 0, "e"], + [1217, 0, "n"], + [1218, 0, "c"], + [1219, 0, "y"], + [1220, 0, "."], + [1221, 0, "\n"], + [1222, 0, "\\"], + [1223, 0, "e"], + [1224, 0, "n"], + [1225, 0, "d"], + [1226, 0, "{"], + [1227, 0, "I"], + [1228, 0, "E"], + [1229, 0, "E"], + [1230, 0, "E"], + [1231, 0, "k"], + [1232, 0, "e"], + [1233, 0, "y"], + [1234, 0, "w"], + [1235, 0, "o"], + [1236, 0, "r"], + [1237, 0, "d"], + [1238, 0, "s"], + [1239, 0, "}"], + [1240, 0, "}"], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [15, 1], + [19, 0, ","], + [20, 0, "j"], + [21, 0, "o"], + [22, 0, "u"], + [23, 0, "r"], + [24, 0, "n"], + [25, 0, "a"], + [26, 0, "l"], + [27, 0, ","], + [28, 0, "c"], + [29, 0, "o"], + [30, 0, "m"], + [31, 0, "p"], + [32, 0, "s"], + [33, 0, "o"], + [34, 0, "c"], + [37, 1], + [37, 1], + [37, 1], + [37, 1], + [37, 1], + [37, 1], + [37, 1], + [37, 0, "I"], + [38, 0, "E"], + [39, 0, "E"], + [40, 0, "E"], + [41, 0, "t"], + [42, 0, "r"], + [43, 0, "a"], + [44, 0, "n"], + [388, 1], + [387, 1], + [386, 1], + [385, 1], + [384, 1], + [383, 1], + [383, 0, "c"], + [384, 0, "i"], + [385, 0, "t"], + [386, 0, "e"], + [380, 1], + [379, 1], + [378, 1], + [377, 1], + [376, 1], + [375, 1], + [374, 1], + [373, 1], + [372, 1], + [371, 1], + [370, 1], + [370, 0, "o"], + [371, 0, "c"], + [372, 0, "o"], + [373, 0, "m"], + [374, 0, "p"], + [375, 0, "r"], + [376, 0, "e"], + [377, 0, "s"], + [378, 0, "s"], + [333, 1], + [332, 1], + [331, 1], + [330, 1], + [329, 1], + [328, 1], + [327, 1], + [326, 1], + [325, 1], + [324, 1], + [323, 1], + [322, 1], + [321, 1], + [320, 1], + [319, 1], + [318, 1], + [317, 1], + [146, 0, "%"], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [146, 1], + [266, 0, "%"], + [266, 1], + [415, 0, "n"], + [416, 0, "e"], + [417, 0, "t"], + [418, 0, "-"], + [419, 0, "w"], + [420, 0, "o"], + [421, 0, "r"], + [422, 0, "k"], + [423, 0, "s"], + [424, 0, " "], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [437, 1], + [953, 0, "A"], + [954, 0, "u"], + [955, 0, "t"], + [956, 0, "h"], + [957, 0, "o"], + [958, 0, "r"], + [959, 0, " "], + [960, 0, "1"], + [961, 0, " "], + [962, 0, "a"], + [963, 0, "n"], + [964, 0, "d"], + [965, 0, " "], + [966, 0, "A"], + [967, 0, "u"], + [968, 0, "t"], + [969, 0, "h"], + [970, 0, "o"], + [971, 0, "r"], + [972, 0, " "], + [973, 0, "2"], + [974, 0, "\n"], + [975, 0, "\\"], + [976, 0, "I"], + [977, 0, "E"], + [978, 0, "E"], + [979, 0, "E"], + [980, 0, "c"], + [981, 0, "o"], + [982, 0, "m"], + [983, 0, "p"], + [984, 0, "s"], + [985, 0, "o"], + [986, 0, "c"], + [987, 0, "i"], + [987, 1], + [986, 1], + [985, 1], + [984, 1], + [983, 1], + [982, 1], + [981, 1], + [980, 1], + [979, 1], + [978, 1], + [977, 1], + [976, 1], + [976, 0, "t"], + [977, 0, "h"], + [978, 0, "a"], + [979, 0, "n"], + [980, 0, "k"], + [981, 0, "s"], + [982, 0, "{"], + [983, 0, "A"], + [984, 0, "u"], + [985, 0, "t"], + [986, 0, "h"], + [987, 0, "o"], + [988, 0, "r"], + [989, 0, " "], + [990, 0, "a"], + [991, 0, "f"], + [992, 0, "f"], + [993, 0, "i"], + [994, 0, "l"], + [995, 0, "i"], + [996, 0, "a"], + [997, 0, "t"], + [998, 0, "i"], + [999, 0, "o"], + [1000, 0, "n"], + [1001, 0, " "], + [1002, 0, "g"], + [1003, 0, "o"], + [1004, 0, "e"], + [1005, 0, "s"], + [1006, 0, " "], + [1007, 0, "h"], + [1008, 0, "e"], + [1009, 0, "r"], + [1010, 0, "e"], + [1011, 0, "."], + [1012, 0, "}"], + [473, 1], + [472, 1], + [471, 1], + [470, 1], + [469, 1], + [469, 0, "t"], + [470, 0, "r"], + [471, 0, "u"], + [472, 0, "e"], + [1322, 1], + [1322, 0, "U"], + [1328, 1], + [1327, 1], + [1326, 1], + [1325, 1], + [1325, 0, "s"], + [1326, 0, "e"], + [1327, 0, "r"], + [1328, 0, "s"], + [1331, 0, "o"], + [1332, 0, "f"], + [1333, 0, " "], + [1334, 0, "a"], + [1335, 0, "p"], + [1336, 0, "p"], + [1337, 0, "l"], + [1338, 0, "i"], + [1339, 0, "c"], + [1340, 0, "a"], + [1341, 0, "t"], + [1342, 0, "i"], + [1343, 0, "o"], + [1344, 0, "n"], + [1345, 0, "s"], + [1346, 0, " "], + [1347, 0, "o"], + [1348, 0, "n"], + [1349, 0, " "], + [1350, 0, "m"], + [1351, 0, "o"], + [1352, 0, "b"], + [1353, 0, "i"], + [1354, 0, "l"], + [1355, 0, "e"], + [1356, 0, " "], + [1357, 0, "d"], + [1358, 0, "e"], + [1359, 0, "v"], + [1360, 0, "i"], + [1361, 0, "c"], + [1362, 0, "e"], + [1363, 0, "s"], + [1364, 0, " "], + [1365, 0, "e"], + [1366, 0, "x"], + [1367, 0, "p"], + [1368, 0, "e"], + [1369, 0, "c"], + [1370, 0, "t"], + [1371, 0, " "], + [1372, 0, "t"], + [1373, 0, "h"], + [1374, 0, "e"], + [1375, 0, " "], + [1376, 0, "a"], + [1377, 0, "p"], + [1378, 0, "p"], + [1379, 0, "l"], + [1380, 0, "i"], + [1381, 0, "c"], + [1382, 0, "a"], + [1383, 0, "t"], + [1384, 0, "i"], + [1385, 0, "o"], + [1386, 0, "n"], + [1387, 0, "s"], + [1388, 0, " "], + [1389, 0, "s"], + [1390, 0, "t"], + [1391, 0, "i"], + [1392, 0, "l"], + [1393, 0, "l"], + [1394, 0, " "], + [1395, 0, "t"], + [1396, 0, "o"], + [1397, 0, " "], + [1398, 0, "w"], + [1399, 0, "o"], + [1400, 0, "r"], + [1401, 0, "k"], + [1402, 0, " "], + [1403, 0, "w"], + [1404, 0, "h"], + [1405, 0, "i"], + [1406, 0, "l"], + [1407, 0, "e"], + [1408, 0, " "], + [1409, 0, "t"], + [1410, 0, "h"], + [1411, 0, "e"], + [1412, 0, " "], + [1413, 0, "d"], + [1414, 0, "e"], + [1415, 0, "v"], + [1416, 0, "i"], + [1417, 0, "c"], + [1418, 0, "e"], + [1419, 0, " "], + [1420, 0, "i"], + [1421, 0, "s"], + [1422, 0, " "], + [1423, 0, "o"], + [1424, 0, "f"], + [1425, 0, "f"], + [1426, 0, "l"], + [1427, 0, "i"], + [1428, 0, "n"], + [1429, 0, "e"], + [1430, 0, " "], + [1431, 0, "o"], + [1432, 0, "r"], + [1433, 0, " "], + [1434, 0, "h"], + [1435, 0, "a"], + [1436, 0, "s"], + [1437, 0, " "], + [1438, 0, "p"], + [1439, 0, "o"], + [1440, 0, "o"], + [1441, 0, "r"], + [1442, 0, " "], + [1443, 0, "n"], + [1444, 0, "e"], + [1445, 0, "t"], + [1446, 0, "w"], + [1447, 0, "o"], + [1448, 0, "r"], + [1449, 0, "k"], + [1450, 0, " "], + [1451, 0, "c"], + [1452, 0, "o"], + [1453, 0, "n"], + [1454, 0, "n"], + [1455, 0, "e"], + [1456, 0, "c"], + [1457, 0, "t"], + [1458, 0, "i"], + [1459, 0, "v"], + [1460, 0, "i"], + [1461, 0, "t"], + [1462, 0, "y"], + [1463, 0, "."], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1464, 1], + [1463, 0, ","], + [1464, 0, " "], + [1465, 0, "a"], + [1466, 0, "n"], + [1467, 0, "d"], + [1468, 0, " "], + [1469, 0, "t"], + [1470, 0, "o"], + [1471, 0, " "], + [1472, 0, "s"], + [1473, 0, "y"], + [1474, 0, "n"], + [1475, 0, "c"], + [1476, 0, "h"], + [1477, 0, "r"], + [1478, 0, "o"], + [1479, 0, "n"], + [1480, 0, "i"], + [1481, 0, "z"], + [1482, 0, "e"], + [1483, 0, " "], + [1484, 0, "i"], + [1485, 0, "t"], + [1486, 0, "s"], + [1487, 0, " "], + [1488, 0, "s"], + [1489, 0, "t"], + [1490, 0, "a"], + [1491, 0, "t"], + [1492, 0, "e"], + [1493, 0, " "], + [1494, 0, "w"], + [1495, 0, "i"], + [1496, 0, "t"], + [1497, 0, "h"], + [1498, 0, " "], + [1499, 0, "o"], + [1500, 0, "t"], + [1501, 0, "h"], + [1502, 0, "e"], + [1503, 0, "r"], + [1504, 0, " "], + [1505, 0, "d"], + [1506, 0, "e"], + [1507, 0, "v"], + [1508, 0, "i"], + [1509, 0, "c"], + [1510, 0, "e"], + [1511, 0, "s"], + [1512, 0, " "], + [1513, 0, "w"], + [1514, 0, "h"], + [1515, 0, "e"], + [1516, 0, "n"], + [1517, 0, " "], + [1518, 0, "t"], + [1519, 0, "h"], + [1520, 0, "e"], + [1521, 0, " "], + [1522, 0, "n"], + [1523, 0, "e"], + [1524, 0, "t"], + [1525, 0, "w"], + [1526, 0, "o"], + [1527, 0, "r"], + [1528, 0, "k"], + [1529, 0, " "], + [1530, 0, "i"], + [1531, 0, "s"], + [1532, 0, " "], + [1533, 0, "a"], + [1534, 0, "v"], + [1535, 0, "a"], + [1536, 0, "i"], + [1537, 0, "l"], + [1538, 0, "a"], + [1539, 0, "b"], + [1540, 0, "l"], + [1541, 0, "e"], + [1543, 0, " "], + [1544, 0, "E"], + [1545, 0, "x"], + [1546, 0, "a"], + [1547, 0, "m"], + [1548, 0, "p"], + [1549, 0, "l"], + [1550, 0, "e"], + [1551, 0, "s"], + [1552, 0, " "], + [1553, 0, "o"], + [1554, 0, "f"], + [1555, 0, " "], + [1556, 0, "s"], + [1557, 0, "u"], + [1558, 0, "c"], + [1559, 0, "h"], + [1560, 0, " "], + [1561, 0, "a"], + [1562, 0, "p"], + [1563, 0, "p"], + [1564, 0, "l"], + [1565, 0, "i"], + [1566, 0, "c"], + [1567, 0, "a"], + [1568, 0, "t"], + [1569, 0, "i"], + [1570, 0, "o"], + [1571, 0, "n"], + [1572, 0, "s"], + [1573, 0, " "], + [1574, 0, "i"], + [1575, 0, "n"], + [1576, 0, "c"], + [1577, 0, "l"], + [1578, 0, "u"], + [1579, 0, "d"], + [1580, 0, "e"], + [1581, 0, " "], + [1582, 0, "a"], + [1583, 0, "d"], + [1584, 0, "d"], + [1585, 0, "r"], + [1586, 0, "e"], + [1587, 0, "s"], + [1588, 0, "s"], + [1589, 0, " "], + [1590, 0, "b"], + [1591, 0, "o"], + [1592, 0, "o"], + [1593, 0, "k"], + [1594, 0, "s"], + [1595, 0, ","], + [1596, 0, " "], + [1597, 0, "c"], + [1598, 0, "a"], + [1582, 0, "c"], + [1583, 0, "a"], + [1584, 0, "l"], + [1585, 0, "e"], + [1586, 0, "n"], + [1587, 0, "d"], + [1588, 0, "a"], + [1589, 0, "r"], + [1590, 0, "i"], + [1591, 0, "n"], + [1592, 0, "g"], + [1593, 0, ","], + [1594, 0, " "], + [1592, 1], + [1591, 1], + [1590, 1], + [1590, 0, "s"], + [1609, 1], + [1608, 1], + [1608, 0, "n"], + [1609, 0, "o"], + [1610, 0, "t"], + [1611, 0, "e"], + [1612, 0, "-"], + [1613, 0, "t"], + [1614, 0, "a"], + [1615, 0, "k"], + [1616, 0, "i"], + [1617, 0, "n"], + [1618, 0, "g"], + [1619, 0, ","], + [1620, 0, " "], + [1621, 0, "p"], + [1622, 0, "a"], + [1623, 0, "s"], + [1624, 0, "s"], + [1625, 0, "w"], + [1626, 0, "o"], + [1627, 0, "r"], + [1628, 0, "d"], + [1629, 0, " "], + [1630, 0, "m"], + [1631, 0, "a"], + [1632, 0, "n"], + [1633, 0, "a"], + [1634, 0, "g"], + [1635, 0, "e"], + [1636, 0, "r"], + [1637, 0, "s"], + [1499, 0, "t"], + [1500, 0, "h"], + [1501, 0, "e"], + [1502, 0, " "], + [1503, 0, "u"], + [1504, 0, "s"], + [1505, 0, "e"], + [1506, 0, "r"], + [1507, 0, "'"], + [1508, 0, "s"], + [1509, 0, " "], + [1631, 0, " "], + [1632, 0, "a"], + [1633, 0, "n"], + [1634, 0, "d"], + [1653, 0, "."], + [1654, 0, " "], + [1655, 0, "M"], + [1656, 0, "o"], + [1657, 0, "r"], + [1658, 0, "e"], + [1659, 0, "o"], + [1660, 0, "v"], + [1661, 0, "e"], + [1662, 0, "r"], + [1663, 0, ","], + [1664, 0, " "], + [1665, 0, "m"], + [1666, 0, "\n"], + [1667, 0, "\n"], + [1668, 0, "T"], + [1669, 0, "O"], + [1670, 0, "D"], + [1671, 0, "O"], + [1672, 0, " "], + [1673, 0, "m"], + [1674, 0, "o"], + [1675, 0, "r"], + [1676, 0, "e"], + [1677, 0, " "], + [1678, 0, "i"], + [1679, 0, "n"], + [1680, 0, "t"], + [1681, 0, "r"], + [1682, 0, "u"], + [1683, 0, "d"], + [1684, 0, "o"], + [1684, 1], + [1683, 1], + [1682, 1], + [1682, 0, "o"], + [1683, 0, "d"], + [1684, 0, "u"], + [1685, 0, "c"], + [1686, 0, "t"], + [1687, 0, "i"], + [1688, 0, "o"], + [1689, 0, "n"], + [1690, 0, "."], + [1666, 0, "a"], + [1667, 0, "n"], + [1668, 0, "y"], + [1669, 0, " "], + [1670, 0, "p"], + [1671, 0, "e"], + [1672, 0, "o"], + [1673, 0, "p"], + [1674, 0, "l"], + [1675, 0, "e"], + [1676, 0, " "], + [1677, 0, "w"], + [1678, 0, "a"], + [1679, 0, "n"], + [1680, 0, "t"], + [1681, 0, " "], + [1682, 0, "t"], + [1683, 0, "o"], + [1684, 0, " "], + [1685, 0, "c"], + [1686, 0, "o"], + [1687, 0, "l"], + [1688, 0, "l"], + [1689, 0, "a"], + [1690, 0, "b"], + [1691, 0, "o"], + [1692, 0, "r"], + [1693, 0, "a"], + [1694, 0, "t"], + [1695, 0, "e"], + [1696, 0, " "], + [1697, 0, "w"], + [1698, 0, "i"], + [1699, 0, "t"], + [1700, 0, "h"], + [1701, 0, " "], + [1702, 0, "o"], + [1703, 0, "t"], + [1704, 0, "h"], + [1705, 0, "e"], + [1706, 0, "r"], + [1707, 0, "s"], + [1708, 0, " "], + [1709, 0, "o"], + [1710, 0, "n"], + [1711, 0, " "], + [1712, 0, "d"], + [1713, 0, "o"], + [1714, 0, "c"], + [1715, 0, "u"], + [1716, 0, "m"], + [1717, 0, "e"], + [1718, 0, "n"], + [1719, 0, "t"], + [1720, 0, "s"], + [1721, 0, " "], + [1712, 0, "t"], + [1713, 0, "e"], + [1714, 0, "x"], + [1715, 0, "t"], + [1716, 0, " "], + [1726, 1], + [1726, 0, " "], + [1726, 1], + [1726, 0, ","], + [1727, 0, " "], + [1728, 0, "s"], + [1729, 0, "p"], + [1730, 0, "r"], + [1731, 0, "e"], + [1732, 0, "a"], + [1733, 0, "d"], + [1734, 0, "s"], + [1735, 0, "h"], + [1736, 0, "e"], + [1737, 0, "e"], + [1738, 0, "t"], + [1739, 0, "s"], + [1740, 0, ","], + [1741, 0, " "], + [1742, 0, "p"], + [1743, 0, "r"], + [1744, 0, "e"], + [1745, 0, "s"], + [1746, 0, "e"], + [1747, 0, "n"], + [1748, 0, "t"], + [1749, 0, "a"], + [1750, 0, "t"], + [1751, 0, "i"], + [1752, 0, "o"], + [1753, 0, "n"], + [1754, 0, "s"], + [1755, 0, ","], + [1756, 0, " "], + [1757, 0, "g"], + [1758, 0, "r"], + [1759, 0, "a"], + [1760, 0, "p"], + [1761, 0, "h"], + [1762, 0, "i"], + [1763, 0, "c"], + [1764, 0, "s"], + [1765, 0, ","], + [1766, 0, " "], + [1767, 0, "a"], + [1768, 0, "n"], + [1769, 0, "d"], + [1770, 0, " "], + [1771, 0, "s"], + [1772, 0, "i"], + [1773, 0, "m"], + [1774, 0, "i"], + [1775, 0, "l"], + [1776, 0, "a"], + [1777, 0, "r"], + [1778, 0, " "], + [1779, 0, "d"], + [1780, 0, "o"], + [1781, 0, "c"], + [1782, 0, "u"], + [1783, 0, "m"], + [1784, 0, "e"], + [1785, 0, "n"], + [1786, 0, "t"], + [1787, 0, "s"], + [1788, 0, "."], + [1777, 1], + [1776, 1], + [1775, 1], + [1774, 1], + [1773, 1], + [1772, 1], + [1771, 1], + [1771, 0, "o"], + [1772, 0, "t"], + [1773, 0, "h"], + [1774, 0, "e"], + [1775, 0, "r"], + [1776, 0, " "], + [1777, 0, "k"], + [1778, 0, "i"], + [1779, 0, "n"], + [1780, 0, "d"], + [1781, 0, "s"], + [1782, 0, " "], + [1783, 0, "o"], + [1784, 0, "f"], + [1794, 1], + [1795, 0, "\n"], + [1796, 0, "\n"], + [1797, 0, "W"], + [1798, 0, "h"], + [1799, 0, "a"], + [1800, 0, "t"], + [1801, 0, " "], + [1802, 0, "t"], + [1803, 0, "h"], + [1804, 0, "e"], + [1805, 0, "s"], + [1806, 0, "e"], + [1807, 0, " "], + [1808, 0, "d"], + [1808, 1], + [1808, 0, "a"], + [1809, 0, "p"], + [1810, 0, "p"], + [1811, 0, "l"], + [1812, 0, "i"], + [1813, 0, "c"], + [1814, 0, "a"], + [1815, 0, "t"], + [1816, 0, "i"], + [1817, 0, "o"], + [1818, 0, "n"], + [1819, 0, "s"], + [1820, 0, " "], + [1821, 0, "h"], + [1822, 0, "a"], + [1823, 0, "v"], + [1824, 0, "e"], + [1825, 0, " "], + [1826, 0, "i"], + [1827, 0, "n"], + [1828, 0, " "], + [1829, 0, "c"], + [1830, 0, "o"], + [1831, 0, "m"], + [1832, 0, "m"], + [1833, 0, "o"], + [1834, 0, "n"], + [1835, 0, " "], + [1836, 0, "i"], + [1837, 0, "s"], + [1838, 0, " "], + [1839, 0, "t"], + [1840, 0, "h"], + [1841, 0, "a"], + [1842, 0, "t"], + [1843, 0, " "], + [1844, 0, "t"], + [1845, 0, "h"], + [1846, 0, "e"], + [1847, 0, " "], + [1848, 0, "s"], + [1849, 0, "a"], + [1850, 0, "m"], + [1851, 0, "e"], + [1852, 0, " "], + [1853, 0, "a"], + [1854, 0, "p"], + [1855, 0, "p"], + [1856, 0, "l"], + [1857, 0, "i"], + [1858, 0, "c"], + [1859, 0, "a"], + [1860, 0, "t"], + [1861, 0, "i"], + [1862, 0, "o"], + [1863, 0, "n"], + [1864, 0, " "], + [1865, 0, "s"], + [1866, 0, "t"], + [1867, 0, "a"], + [1868, 0, "t"], + [1869, 0, "e"], + [1870, 0, " "], + [1871, 0, "n"], + [1872, 0, "e"], + [1873, 0, "e"], + [1874, 0, "d"], + [1875, 0, "s"], + [1876, 0, " "], + [1877, 0, "t"], + [1878, 0, "o"], + [1879, 0, " "], + [1880, 0, "b"], + [1881, 0, "e"], + [1882, 0, " "], + [1883, 0, "r"], + [1884, 0, "e"], + [1885, 0, "p"], + [1886, 0, "l"], + [1887, 0, "i"], + [1888, 0, "c"], + [1889, 0, "a"], + [1890, 0, "t"], + [1891, 0, "e"], + [1892, 0, "d"], + [1893, 0, " "], + [1894, 0, "t"], + [1895, 0, "o"], + [1896, 0, " "], + [1897, 0, "s"], + [1898, 0, "e"], + [1899, 0, "v"], + [1900, 0, "e"], + [1901, 0, "r"], + [1902, 0, "a"], + [1903, 0, "l"], + [1904, 0, " "], + [1905, 0, "d"], + [1906, 0, "e"], + [1907, 0, "v"], + [1908, 0, "i"], + [1909, 0, "c"], + [1910, 0, "e"], + [1911, 0, "s"], + [1912, 0, ","], + [1913, 0, " "], + [1914, 0, "e"], + [1915, 0, "a"], + [1916, 0, "c"], + [1917, 0, "h"], + [1918, 0, " "], + [1919, 0, "o"], + [1920, 0, "f"], + [1921, 0, " "], + [1922, 0, "w"], + [1923, 0, "h"], + [1924, 0, "i"], + [1925, 0, "c"], + [1926, 0, "h"], + [1927, 0, " "], + [1928, 0, "m"], + [1929, 0, "a"], + [1930, 0, "y"], + [1931, 0, " "], + [1932, 0, "m"], + [1933, 0, "o"], + [1934, 0, "d"], + [1935, 0, "i"], + [1936, 0, "f"], + [1937, 0, "y"], + [1938, 0, " "], + [1939, 0, "t"], + [1940, 0, "h"], + [1941, 0, "e"], + [1942, 0, " "], + [1943, 0, "s"], + [1944, 0, "t"], + [1945, 0, "a"], + [1946, 0, "t"], + [1947, 0, "e"], + [1948, 0, " "], + [1949, 0, "l"], + [1950, 0, "o"], + [1951, 0, "c"], + [1952, 0, "a"], + [1953, 0, "l"], + [1954, 0, "l"], + [1955, 0, "y"], + [1956, 0, "."], + [1957, 0, " "], + [1958, 0, "S"], + [1959, 0, "t"], + [1959, 1], + [1958, 1], + [1958, 0, "M"], + [1959, 0, "o"], + [1960, 0, "d"], + [1961, 0, "i"], + [1962, 0, "f"], + [1963, 0, "i"], + [1964, 0, "c"], + [1965, 0, "a"], + [1966, 0, "t"], + [1967, 0, "i"], + [1968, 0, "o"], + [1969, 0, "n"], + [1970, 0, "s"], + [1971, 0, " "], + [1972, 0, "m"], + [1973, 0, "a"], + [1974, 0, "y"], + [1975, 0, " "], + [1976, 0, "h"], + [1977, 0, "a"], + [1978, 0, "p"], + [1979, 0, "p"], + [1980, 0, "e"], + [1981, 0, "n"], + [1982, 0, " "], + [1983, 0, "c"], + [1984, 0, "o"], + [1985, 0, "n"], + [1986, 0, "c"], + [1987, 0, "u"], + [1988, 0, "r"], + [1989, 0, "r"], + [1990, 0, "e"], + [1991, 0, "n"], + [1992, 0, "t"], + [1993, 0, "l"], + [1994, 0, "y"], + [1995, 0, ","], + [1996, 0, " "], + [1997, 0, "a"], + [1998, 0, "n"], + [1999, 0, "d"], + [2000, 0, " "], + [2001, 0, "t"], + [2002, 0, "r"], + [2003, 0, "a"], + [2004, 0, "d"], + [2005, 0, "i"], + [2006, 0, "t"], + [2007, 0, "i"], + [2008, 0, "o"], + [2009, 0, "n"], + [2010, 0, "a"], + [2011, 0, "l"], + [2012, 0, " "], + [2013, 0, "c"], + [2014, 0, "o"], + [2015, 0, "n"], + [2016, 0, "c"], + [2017, 0, "u"], + [2018, 0, "r"], + [2019, 0, "r"], + [2020, 0, "e"], + [2021, 0, "n"], + [2022, 0, "c"], + [2023, 0, "y"], + [2024, 0, " "], + [2025, 0, "c"], + [2026, 0, "o"], + [2027, 0, "n"], + [2028, 0, "t"], + [2029, 0, "r"], + [2030, 0, "o"], + [2031, 0, "l"], + [2032, 0, " "], + [2033, 0, "m"], + [2034, 0, "e"], + [2035, 0, "t"], + [2036, 0, "h"], + [2037, 0, "o"], + [2038, 0, "d"], + [2039, 0, "s"], + [2040, 0, " "], + [2041, 0, "s"], + [2041, 1], + [2040, 1], + [2039, 1], + [2038, 1], + [2037, 1], + [2036, 1], + [2035, 1], + [2034, 1], + [2033, 1], + [2033, 0, "a"], + [2034, 0, "p"], + [2035, 0, "p"], + [2036, 0, "r"], + [2037, 0, "o"], + [2038, 0, "a"], + [2039, 0, "c"], + [2040, 0, "h"], + [2041, 0, "e"], + [2042, 0, "s"], + [2043, 0, " "], + [2044, 0, "s"], + [2045, 0, "u"], + [2046, 0, "c"], + [2047, 0, "h"], + [2048, 0, " "], + [2049, 0, "a"], + [2050, 0, "s"], + [2051, 0, " "], + [2052, 0, "s"], + [2053, 0, "e"], + [2054, 0, "r"], + [2055, 0, "i"], + [2056, 0, "a"], + [2057, 0, "l"], + [2058, 0, "i"], + [2059, 0, "z"], + [2060, 0, "a"], + [2061, 0, "b"], + [2062, 0, "i"], + [2063, 0, "l"], + [2064, 0, "i"], + [2065, 0, "t"], + [2066, 0, "y"], + [2067, 0, " "], + [2001, 1], + [2000, 1], + [1999, 1], + [1998, 1], + [1997, 1], + [1996, 1], + [1995, 1], + [1994, 1], + [1993, 1], + [1992, 1], + [1991, 1], + [1990, 1], + [1989, 1], + [1988, 1], + [1987, 1], + [1986, 1], + [1985, 1], + [1984, 1], + [1983, 1], + [1982, 1], + [1981, 1], + [1980, 1], + [1979, 1], + [1978, 1], + [1977, 1], + [1976, 1], + [1975, 1], + [1974, 1], + [1973, 1], + [1972, 1], + [1971, 1], + [1970, 1], + [1969, 1], + [1968, 1], + [1967, 1], + [1966, 1], + [1965, 1], + [1964, 1], + [1963, 1], + [1962, 1], + [1961, 1], + [1960, 1], + [1959, 1], + [1958, 1], + [1958, 0, "T"], + [2025, 0, "w"], + [2026, 0, "o"], + [2027, 0, "u"], + [2028, 0, "l"], + [2029, 0, "d"], + [2030, 0, " "], + [2031, 0, "c"], + [2032, 0, "a"], + [2033, 0, "u"], + [2034, 0, "s"], + [2035, 0, "e"], + [2036, 0, " "], + [2037, 0, "t"], + [2038, 0, "h"], + [2039, 0, "e"], + [2040, 0, " "], + [2041, 0, "a"], + [2042, 0, "p"], + [2043, 0, "p"], + [2044, 0, "l"], + [2045, 0, "i"], + [2046, 0, "c"], + [2047, 0, "a"], + [2048, 0, "t"], + [2049, 0, "i"], + [2050, 0, "o"], + [2051, 0, "n"], + [2052, 0, " "], + [2053, 0, "t"], + [2054, 0, "o"], + [2055, 0, " "], + [2056, 0, "b"], + [2057, 0, "e"], + [2058, 0, "c"], + [2059, 0, "o"], + [2060, 0, "m"], + [2061, 0, "e"], + [2062, 0, " "], + [2063, 0, "u"], + [2064, 0, "n"], + [2065, 0, "u"], + [2066, 0, "s"], + [2067, 0, "a"], + [2068, 0, "b"], + [2069, 0, "l"], + [2070, 0, "e"], + [2071, 0, " "], + [2072, 0, "a"], + [2073, 0, "t"], + [2074, 0, " "], + [2075, 0, "t"], + [2076, 0, "i"], + [2077, 0, "m"], + [2078, 0, "e"], + [2079, 0, "s"], + [2080, 0, " "], + [2081, 0, "o"], + [2082, 0, "f"], + [2083, 0, " "], + [2084, 0, "p"], + [2085, 0, "o"], + [2086, 0, "o"], + [2087, 0, "r"], + [2088, 0, " "], + [2089, 0, "n"], + [2090, 0, "e"], + [2091, 0, "t"], + [2092, 0, "w"], + [2093, 0, "o"], + [2094, 0, "r"], + [2095, 0, "k"], + [2096, 0, " "], + [2097, 0, "c"], + [2098, 0, "o"], + [2099, 0, "n"], + [2100, 0, "n"], + [2101, 0, "e"], + [2102, 0, "c"], + [2103, 0, "t"], + [2104, 0, "i"], + [2105, 0, "v"], + [2106, 0, "i"], + [2107, 0, "t"], + [2108, 0, "y"], + [2109, 0, ","], + [2110, 0, " "], + [2111, 0, "s"], + [2112, 0, "o"], + [2113, 0, " "], + [2114, 0, "w"], + [2115, 0, "e"], + [2116, 0, " "], + [2117, 0, "m"], + [2118, 0, "u"], + [2119, 0, "s"], + [2120, 0, "t"], + [2121, 0, " "], + [2122, 0, "a"], + [2123, 0, "s"], + [2124, 0, "s"], + [2125, 0, "u"], + [2126, 0, "m"], + [2127, 0, "e"], + [2128, 0, " "], + [2129, 0, "t"], + [2130, 0, "h"], + [2131, 0, "a"], + [2132, 0, "t"], + [2133, 0, " "], + [2134, 0, "u"], + [2135, 0, "s"], + [2136, 0, "e"], + [2137, 0, "r"], + [2138, 0, "s"], + [2139, 0, " "], + [2140, 0, "c"], + [2141, 0, "a"], + [2142, 0, "n"], + [2143, 0, " "], + [2144, 0, "m"], + [2145, 0, "a"], + [2146, 0, "k"], + [2147, 0, "e"], + [2148, 0, " "], + [2149, 0, "a"], + [2150, 0, "r"], + [2151, 0, "b"], + [2152, 0, "i"], + [2153, 0, "t"], + [2154, 0, "r"], + [2155, 0, "a"], + [2156, 0, "r"], + [2157, 0, "y"], + [2158, 0, " "], + [2159, 0, "m"], + [2160, 0, "o"], + [2161, 0, "d"], + [2162, 0, "i"], + [2163, 0, "f"], + [2164, 0, "i"], + [2165, 0, "c"], + [2166, 0, "a"], + [2167, 0, "t"], + [2168, 0, "i"], + [2169, 0, "o"], + [2170, 0, "n"], + [2171, 0, "s"], + [2172, 0, " "], + [2173, 0, "c"], + [2174, 0, "o"], + [2175, 0, "n"], + [2176, 0, "c"], + [2177, 0, "u"], + [2178, 0, "r"], + [2179, 0, "r"], + [2180, 0, "e"], + [2181, 0, "n"], + [2182, 0, "t"], + [2183, 0, "l"], + [2184, 0, "y"], + [2185, 0, " "], + [2186, 0, "o"], + [2187, 0, "n"], + [2188, 0, " "], + [2189, 0, "d"], + [2190, 0, "i"], + [2191, 0, "f"], + [2192, 0, "f"], + [2193, 0, "e"], + [2194, 0, "r"], + [2195, 0, "e"], + [2196, 0, "n"], + [2197, 0, "t"], + [2198, 0, " "], + [2199, 0, "d"], + [2200, 0, "e"], + [2201, 0, "v"], + [2202, 0, "i"], + [2203, 0, "c"], + [2204, 0, "e"], + [2205, 0, "s"], + [2206, 0, ","], + [2207, 0, " "], + [2208, 0, "a"], + [2209, 0, "n"], + [2210, 0, "d"], + [2211, 0, " "], + [2212, 0, "a"], + [2213, 0, "n"], + [2214, 0, "y"], + [2215, 0, " "], + [2216, 0, "r"], + [2217, 0, "e"], + [2218, 0, "s"], + [2219, 0, "u"], + [2220, 0, "l"], + [2221, 0, "t"], + [2222, 0, "i"], + [2223, 0, "n"], + [2224, 0, "g"], + [2225, 0, " "], + [2226, 0, "c"], + [2227, 0, "o"], + [2228, 0, "n"], + [2229, 0, "f"], + [2230, 0, "l"], + [2231, 0, "i"], + [2232, 0, "c"], + [2233, 0, "t"], + [2234, 0, "s"], + [2235, 0, " "], + [2236, 0, "m"], + [2237, 0, "u"], + [2238, 0, "s"], + [2239, 0, "t"], + [2240, 0, " "], + [2241, 0, "b"], + [2242, 0, "e"], + [2243, 0, " "], + [2244, 0, "r"], + [2245, 0, "e"], + [2246, 0, "s"], + [2247, 0, "o"], + [2248, 0, "l"], + [2249, 0, "v"], + [2250, 0, "e"], + [2251, 0, "d"], + [2252, 0, "."], + [2253, 0, "\n"], + [2254, 0, "\n"], + [2255, 0, "T"], + [2256, 0, "h"], + [2257, 0, "e"], + [2258, 0, " "], + [2259, 0, "s"], + [2260, 0, "i"], + [2261, 0, "m"], + [2262, 0, "p"], + [2263, 0, "l"], + [2264, 0, "e"], + [2265, 0, "s"], + [2266, 0, "t"], + [2267, 0, " "], + [2268, 0, "w"], + [2269, 0, "a"], + [2270, 0, "y"], + [2271, 0, " "], + [2272, 0, "o"], + [2273, 0, "f"], + [2274, 0, " "], + [2275, 0, "r"], + [2276, 0, "e"], + [2277, 0, "s"], + [2278, 0, "e"], + [2279, 0, "o"], + [2280, 0, "l"], + [2281, 0, "v"], + [2281, 1], + [2280, 1], + [2279, 1], + [2278, 1], + [2278, 0, "o"], + [2279, 0, "l"], + [2280, 0, "v"], + [2281, 0, "i"], + [2282, 0, "n"], + [2283, 0, "g"], + [2284, 0, " "], + [2285, 0, "c"], + [2286, 0, "o"], + [2287, 0, "n"], + [2288, 0, "f"], + [2289, 0, "l"], + [2290, 0, "c"], + [2291, 0, "i"], + [2292, 0, "t"], + [2293, 0, "s"], + [2293, 1], + [2292, 1], + [2291, 1], + [2290, 1], + [2290, 0, "i"], + [2291, 0, "c"], + [2292, 0, "t"], + [2293, 0, "s"], + [2294, 0, " "], + [2295, 0, "i"], + [2296, 0, "s"], + [2297, 0, " "], + [2298, 0, "t"], + [2299, 0, "o"], + [2300, 0, " "], + [2301, 0, "d"], + [2302, 0, "i"], + [2303, 0, "s"], + [2304, 0, "c"], + [2305, 0, "a"], + [2306, 0, "r"], + [2307, 0, "d"], + [2308, 0, " "], + [2309, 0, "s"], + [2310, 0, "o"], + [2311, 0, "m"], + [2312, 0, "e"], + [2313, 0, " "], + [2314, 0, "d"], + [2315, 0, "o"], + [2316, 0, "c"], + [2317, 0, "u"], + [2318, 0, "m"], + [2319, 0, "e"], + [2320, 0, "n"], + [2321, 0, "t"], + [2322, 0, " "], + [2323, 0, "m"], + [2324, 0, "o"], + [2325, 0, "d"], + [2326, 0, "i"], + [2327, 0, "f"], + [2328, 0, "i"], + [2329, 0, "c"], + [2330, 0, "a"], + [2331, 0, "t"], + [2332, 0, "i"], + [2333, 0, "o"], + [2334, 0, "n"], + [2335, 0, "s"], + [2336, 0, " "], + [2337, 0, "i"], + [2338, 0, "f"], + [2339, 0, " "], + [2340, 0, "c"], + [2341, 0, "o"], + [2342, 0, "n"], + [2343, 0, "c"], + [2344, 0, "u"], + [2345, 0, "r"], + [2346, 0, "r"], + [2347, 0, "e"], + [2348, 0, "n"], + [2349, 0, "t"], + [2350, 0, ","], + [2351, 0, " "], + [2352, 0, "c"], + [2353, 0, "o"], + [2354, 0, "n"], + [2355, 0, "f"], + [2356, 0, "l"], + [2356, 1], + [2355, 1], + [2354, 1], + [2353, 1], + [2352, 1], + [2351, 1], + [2350, 1], + [2349, 1], + [2348, 1], + [2347, 1], + [2346, 1], + [2345, 1], + [2344, 1], + [2343, 1], + [2342, 1], + [2341, 1], + [2340, 1], + [2340, 0, "c"], + [2341, 0, "o"], + [2342, 0, "n"], + [2343, 0, "f"], + [2344, 0, "l"], + [2345, 0, "i"], + [2346, 0, "c"], + [2347, 0, "t"], + [2348, 0, "s"], + [2349, 0, " "], + [2350, 0, "o"], + [2351, 0, "c"], + [2352, 0, "c"], + [2353, 0, "u"], + [2354, 0, "r"], + [2355, 0, "r"], + [2356, 0, "e"], + [2357, 0, "d"], + [2358, 0, ","], + [2359, 0, " "], + [2360, 0, "a"], + [2361, 0, " "], + [2362, 0, "p"], + [2363, 0, "o"], + [2364, 0, "l"], + [2365, 0, "i"], + [2366, 0, "c"], + [2367, 0, "y"], + [2368, 0, " "], + [2369, 0, "s"], + [2370, 0, "o"], + [2371, 0, "m"], + [2372, 0, "e"], + [2373, 0, "t"], + [2374, 0, "i"], + [2375, 0, "m"], + [2376, 0, "e"], + [2377, 0, "s"], + [2378, 0, " "], + [2379, 0, "k"], + [2380, 0, "n"], + [2381, 0, "o"], + [2382, 0, "w"], + [2383, 0, "n"], + [2384, 0, " "], + [2385, 0, "a"], + [2386, 0, "s"], + [2387, 0, " "], + [2388, 0, "`"], + [2389, 0, "`"], + [2390, 0, "l"], + [2391, 0, "a"], + [2392, 0, "s"], + [2393, 0, "t"], + [2394, 0, " "], + [2395, 0, "w"], + [2396, 0, "r"], + [2397, 0, "i"], + [2398, 0, "t"], + [2399, 0, "e"], + [2400, 0, "r"], + [2401, 0, " "], + [2402, 0, "w"], + [2403, 0, "i"], + [2404, 0, "n"], + [2405, 0, "s"], + [2406, 0, "'"], + [2407, 0, "'"], + [2408, 0, "."], + [2340, 0, "a"], + [2341, 0, " "], + [2350, 1], + [2387, 1], + [2386, 1], + [2385, 1], + [2384, 1], + [2383, 1], + [2382, 1], + [2381, 1], + [2380, 1], + [2379, 1], + [2378, 1], + [2377, 1], + [2376, 1], + [2375, 1], + [2374, 1], + [2373, 1], + [2372, 1], + [2371, 1], + [2370, 1], + [2369, 1], + [2368, 1], + [2367, 1], + [2366, 1], + [2365, 1], + [2364, 1], + [2363, 1], + [2362, 1], + [2361, 1], + [2361, 0, "f"], + [2362, 0, "o"], + [2363, 0, "r"], + [2364, 0, " "], + [2365, 0, "e"], + [2366, 0, "x"], + [2367, 0, "a"], + [2368, 0, "m"], + [2369, 0, "p"], + [2370, 0, "l"], + [2371, 0, "e"], + [2372, 0, " "], + [2373, 0, "u"], + [2374, 0, "s"], + [2375, 0, "i"], + [2376, 0, "n"], + [2377, 0, "g"], + [2378, 0, " "], + [2379, 0, "a"], + [2401, 0, " "], + [2402, 0, "p"], + [2403, 0, "o"], + [2404, 0, "l"], + [2405, 0, "i"], + [2406, 0, "c"], + [2407, 0, "y"], + [2409, 0, " "], + [2410, 0, "H"], + [2411, 0, "o"], + [2412, 0, "w"], + [2413, 0, "e"], + [2414, 0, "v"], + [2415, 0, "e"], + [2416, 0, "r"], + [2417, 0, ","], + [2418, 0, " "], + [2419, 0, "t"], + [2420, 0, "h"], + [2421, 0, "i"], + [2422, 0, "s"], + [2423, 0, " "], + [2424, 0, "a"], + [2425, 0, "p"], + [2426, 0, "p"], + [2427, 0, "r"], + [2428, 0, "o"], + [2429, 0, "a"], + [2430, 0, "c"], + [2431, 0, "h"], + [2432, 0, " "], + [2433, 0, "i"], + [2434, 0, "s"], + [2435, 0, " "], + [2436, 0, "u"], + [2437, 0, "n"], + [2438, 0, "d"], + [2439, 0, "e"], + [2440, 0, "r"], + [2440, 1], + [2440, 0, "s"], + [2441, 0, "i"], + [2442, 0, "r"], + [2443, 0, "a"], + [2444, 0, "b"], + [2445, 0, "l"], + [2446, 0, "e"], + [2447, 0, " "], + [2448, 0, "a"], + [2449, 0, "s"], + [2450, 0, " "], + [2451, 0, "i"], + [2452, 0, "t"], + [2453, 0, " "], + [2454, 0, "i"], + [2455, 0, "n"], + [2456, 0, "c"], + [2457, 0, "u"], + [2458, 0, "r"], + [2459, 0, "s"], + [2460, 0, " "], + [2461, 0, "d"], + [2462, 0, "a"], + [2463, 0, "t"], + [2464, 0, "a"], + [2465, 0, " "], + [2466, 0, "l"], + [2467, 0, "o"], + [2468, 0, "s"], + [2469, 0, "s"], + [2470, 0, "."], + [2471, 0, " "], + [2472, 0, "A"], + [2473, 0, "n"], + [2474, 0, " "], + [2475, 0, "a"], + [2476, 0, "l"], + [2477, 0, "t"], + [2478, 0, "e"], + [2479, 0, "r"], + [2480, 0, "n"], + [2481, 0, "a"], + [2482, 0, "t"], + [2483, 0, "i"], + [2484, 0, "v"], + [2485, 0, "e"], + [2486, 0, " "], + [2487, 0, "i"], + [2488, 0, "s"], + [2489, 0, " "], + [2490, 0, "t"], + [2491, 0, "o"], + [2492, 0, " "], + [2493, 0, "l"], + [2494, 0, "e"], + [2495, 0, "t"], + [2496, 0, " "], + [2497, 0, "t"], + [2498, 0, "h"], + [2499, 0, "e"], + [2500, 0, " "], + [2501, 0, "u"], + [2502, 0, "s"], + [2503, 0, "e"], + [2504, 0, "r"], + [2505, 0, " "], + [2506, 0, "m"], + [2507, 0, "a"], + [2508, 0, "n"], + [2509, 0, "u"], + [2510, 0, "a"], + [2511, 0, "l"], + [2512, 0, "l"], + [2513, 0, "y"], + [2514, 0, " "], + [2515, 0, "r"], + [2516, 0, "e"], + [2517, 0, "s"], + [2518, 0, "o"], + [2519, 0, "l"], + [2520, 0, "v"], + [2521, 0, "e"], + [2522, 0, " "], + [2523, 0, "t"], + [2524, 0, "h"], + [2525, 0, "e"], + [2526, 0, " "], + [2527, 0, "c"], + [2528, 0, "o"], + [2529, 0, "n"], + [2530, 0, "f"], + [2531, 0, "l"], + [2532, 0, "i"], + [2533, 0, "c"], + [2534, 0, "t"], + [2535, 0, ","], + [2536, 0, " "], + [2537, 0, "w"], + [2538, 0, "h"], + [2539, 0, "i"], + [2540, 0, "c"], + [2541, 0, "h"], + [2542, 0, " "], + [2543, 0, "i"], + [2544, 0, "s"], + [2545, 0, " "], + [2546, 0, "t"], + [2547, 0, "e"], + [2548, 0, "d"], + [2549, 0, "i"], + [2550, 0, "o"], + [2551, 0, "u"], + [2552, 0, "s"], + [2553, 0, " "], + [2554, 0, "i"], + [2555, 0, "n"], + [2556, 0, " "], + [2557, 0, "c"], + [2558, 0, "a"], + [2559, 0, "s"], + [2560, 0, "e"], + [2561, 0, " "], + [2562, 0, "o"], + [2563, 0, "f"], + [2564, 0, " "], + [2565, 0, "m"], + [2566, 0, "o"], + [2567, 0, "d"], + [2568, 0, "i"], + [2569, 0, "f"], + [2570, 0, "i"], + [2571, 0, "c"], + [2572, 0, "a"], + [2573, 0, "t"], + [2574, 0, "i"], + [2575, 0, "o"], + [2576, 0, "n"], + [2577, 0, "s"], + [2578, 0, " "], + [2579, 0, "t"], + [2580, 0, "h"], + [2581, 0, "a"], + [2582, 0, "t"], + [2583, 0, " "], + [2584, 0, "c"], + [2585, 0, "o"], + [2586, 0, "u"], + [2587, 0, "l"], + [2588, 0, "d"], + [2589, 0, " "], + [2590, 0, "b"], + [2591, 0, "e"], + [2592, 0, " "], + [2593, 0, "m"], + [2594, 0, "e"], + [2595, 0, "r"], + [2596, 0, "g"], + [2597, 0, "e"], + [2598, 0, "d"], + [2599, 0, " "], + [2600, 0, "a"], + [2601, 0, "u"], + [2602, 0, "t"], + [2603, 0, "o"], + [2604, 0, "m"], + [2605, 0, "a"], + [2606, 0, "t"], + [2607, 0, "i"], + [2608, 0, "c"], + [2609, 0, "a"], + [2610, 0, "l"], + [2611, 0, "l"], + [2612, 0, "y"], + [2613, 0, "."], + [75236, 0, "i"], + [75237, 0, "\n"], + [75238, 0, "\n"], + [75236, 1], + [75236, 0, "\n"], + [75237, 0, "\\"], + [75238, 0, "s"], + [75239, 0, "e"], + [75240, 0, "c"], + [75241, 0, "t"], + [75242, 0, "i"], + [75243, 0, "o"], + [75244, 0, "n"], + [75245, 0, "*"], + [75246, 0, "{"], + [75247, 0, "A"], + [75248, 0, "c"], + [75249, 0, "k"], + [75250, 0, "n"], + [75251, 0, "o"], + [75252, 0, "w"], + [75253, 0, "l"], + [75254, 0, "e"], + [75255, 0, "d"], + [75256, 0, "g"], + [75257, 0, "e"], + [75258, 0, "m"], + [75259, 0, "e"], + [75260, 0, "n"], + [75261, 0, "t"], + [75262, 0, "s"], + [75263, 0, "}"], + [75264, 0, "\n"], + [75265, 0, "\n"], + [75266, 0, "i"], + [75266, 1], + [75266, 0, "T"], + [75267, 0, "h"], + [75268, 0, "i"], + [75269, 0, "s"], + [75270, 0, " "], + [75271, 0, "r"], + [75272, 0, "e"], + [75273, 0, "s"], + [75274, 0, "e"], + [75275, 0, "a"], + [75276, 0, "r"], + [75277, 0, "c"], + [75278, 0, "h"], + [75279, 0, " "], + [75280, 0, "w"], + [75281, 0, "a"], + [75282, 0, "s"], + [75283, 0, " "], + [75284, 0, "s"], + [75285, 0, "u"], + [75286, 0, "p"], + [75287, 0, "p"], + [75288, 0, "o"], + [75289, 0, "r"], + [75290, 0, "t"], + [75291, 0, "e"], + [75292, 0, "d"], + [75293, 0, " "], + [75294, 0, "b"], + [75295, 0, "y"], + [75296, 0, " "], + [75297, 0, "a"], + [75298, 0, " "], + [75299, 0, "g"], + [75300, 0, "r"], + [75301, 0, "a"], + [75302, 0, "n"], + [75303, 0, "t"], + [75304, 0, " "], + [75305, 0, "f"], + [75306, 0, "r"], + [75307, 0, "o"], + [75308, 0, "m"], + [75309, 0, " "], + [75310, 0, "T"], + [75311, 0, "h"], + [75312, 0, "e"], + [75313, 0, " "], + [75314, 0, "B"], + [75315, 0, "o"], + [75316, 0, "e"], + [75317, 0, "i"], + [75318, 0, "n"], + [75319, 0, "g"], + [75320, 0, " "], + [75321, 0, "C"], + [75322, 0, "o"], + [75323, 0, "m"], + [75324, 0, "p"], + [75325, 0, "a"], + [75326, 0, "n"], + [75327, 0, "y"], + [75328, 0, "."], + [75329, 0, ":"], + [75330, 0, "w"], + [75331, 0, "q"], + [75331, 1], + [75330, 1], + [75329, 1], + [3459, 0, "\n"], + [3460, 0, "\n"], + [3460, 0, "\\"], + [3461, 0, "s"], + [3462, 0, "e"], + [3463, 0, "c"], + [3464, 0, "t"], + [3465, 0, "i"], + [3466, 0, "o"], + [3467, 0, "n"], + [3468, 0, "{"], + [3469, 0, "R"], + [3470, 0, "e"], + [3471, 0, "l"], + [3472, 0, "a"], + [3473, 0, "t"], + [3474, 0, "e"], + [3475, 0, "d"], + [3476, 0, "i"], + [3477, 0, "o"], + [3478, 0, "n"], + [3479, 0, "{"], + [3480, 0, "O"], + [3481, 0, "p"], + [3482, 0, "e"], + [3483, 0, "r"], + [3484, 0, "a"], + [3485, 0, "t"], + [3486, 0, "i"], + [3487, 0, "o"], + [3488, 0, "n"], + [3489, 0, "a"], + [3490, 0, "l"], + [3491, 0, " "], + [3492, 0, "t"], + [3493, 0, "r"], + [3494, 0, "a"], + [3495, 0, "n"], + [3496, 0, "s"], + [3497, 0, "f"], + [3498, 0, "o"], + [3499, 0, "r"], + [3500, 0, "m"], + [3501, 0, "a"], + [3502, 0, "t"], + [3503, 0, "i"], + [3504, 0, "o"], + [3505, 0, "n"], + [3506, 0, "}"], + [3507, 0, "\\"], + [3508, 0, "s"], + [3509, 0, " "], + [3510, 0, "b"], + [3511, 0, "a"], + [3512, 0, "s"], + [3513, 0, "e"], + [3514, 0, "d"], + [3515, 0, " "], + [3516, 0, "o"], + [3517, 0, "n"], + [3518, 0, " "], + [3519, 0, "\\"], + [3520, 0, "e"], + [3521, 0, "m"], + [3522, 0, "p"], + [3523, 0, "h"], + [3524, 0, "{"], + [3525, 0, "o"], + [3526, 0, "p"], + [3527, 0, "e"], + [3528, 0, "r"], + [3529, 0, "a"], + [3530, 0, "t"], + [3531, 0, "i"], + [3532, 0, "o"], + [3533, 0, "n"], + [3534, 0, "a"], + [3535, 0, "l"], + [3536, 0, " "], + [3537, 0, "t"], + [3538, 0, "r"], + [3539, 0, "a"], + [3540, 0, "n"], + [3541, 0, "s"], + [3542, 0, "f"], + [3543, 0, "o"], + [3544, 0, "r"], + [3545, 0, "m"], + [3546, 0, "a"], + [3547, 0, "t"], + [3548, 0, "i"], + [3549, 0, "o"], + [3550, 0, "n"], + [3551, 0, "}"], + [3552, 0, " "], + [3553, 0, "("], + [3554, 0, "O"], + [3555, 0, "T"], + [3556, 0, ")"], + [3557, 0, " "], + [3558, 0, "h"], + [3559, 0, "a"], + [3560, 0, "v"], + [3561, 0, "e"], + [3562, 0, " "], + [3563, 0, "l"], + [3564, 0, "o"], + [3565, 0, "n"], + [3566, 0, "g"], + [3567, 0, " "], + [3568, 0, "b"], + [3569, 0, "e"], + [3570, 0, "e"], + [3571, 0, "n"], + [3572, 0, "i"], + [3573, 0, "t"], + [3574, 0, "e"], + [3575, 0, "{"], + [3576, 0, "E"], + [3577, 0, "l"], + [3578, 0, "l"], + [3579, 0, "i"], + [3580, 0, "s"], + [3581, 0, ":"], + [3582, 0, "1"], + [3583, 0, "9"], + [3584, 0, "8"], + [3585, 0, "9"], + [3586, 0, "u"], + [3587, 0, "e"], + [3588, 0, ","], + [3589, 0, "R"], + [3590, 0, "e"], + [3591, 0, "s"], + [3592, 0, "s"], + [3593, 0, "e"], + [3594, 0, "l"], + [3595, 0, ":"], + [3596, 0, "1"], + [3597, 0, "9"], + [3598, 0, "9"], + [3599, 0, "6"], + [3600, 0, "w"], + [3601, 0, "x"], + [3602, 0, ","], + [3603, 0, "S"], + [3604, 0, "u"], + [3605, 0, "n"], + [3606, 0, ":"], + [3607, 0, "1"], + [3608, 0, "9"], + [3609, 0, "9"], + [3610, 0, "8"], + [3611, 0, "v"], + [3612, 0, "f"], + [3613, 0, ","], + [3614, 0, "N"], + [3615, 0, "i"], + [3616, 0, "c"], + [3617, 0, "h"], + [3618, 0, "o"], + [3619, 0, "l"], + [3620, 0, "s"], + [3621, 0, ":"], + [3622, 0, "1"], + [3623, 0, "9"], + [3624, 0, "9"], + [3625, 0, "5"], + [3626, 0, "f"], + [3627, 0, "d"], + [3628, 0, "}"], + [3629, 0, "."], + [3630, 0, " "], + [3631, 0, "M"], + [3632, 0, "o"], + [3633, 0, "s"], + [3634, 0, "t"], + [3635, 0, " "], + [3636, 0, "o"], + [3637, 0, "f"], + [3638, 0, " "], + [3639, 0, "t"], + [3640, 0, "h"], + [3641, 0, "e"], + [3642, 0, "m"], + [3643, 0, " "], + [3644, 0, "t"], + [3645, 0, "r"], + [3646, 0, "e"], + [3647, 0, "a"], + [3648, 0, "t"], + [3649, 0, " "], + [3650, 0, "a"], + [3651, 0, " "], + [3652, 0, "d"], + [3653, 0, "o"], + [3654, 0, "c"], + [3655, 0, "u"], + [3656, 0, "m"], + [3657, 0, "e"], + [3658, 0, "n"], + [3659, 0, "t"], + [3660, 0, " "], + [3661, 0, "a"], + [3662, 0, "s"], + [3663, 0, " "], + [3664, 0, "a"], + [3665, 0, " "], + [3666, 0, "s"], + [3667, 0, "i"], + [3668, 0, "n"], + [3669, 0, "g"], + [3670, 0, "l"], + [3671, 0, "e"], + [3672, 0, " "], + [3673, 0, "o"], + [3674, 0, "r"], + [3675, 0, "d"], + [3676, 0, "e"], + [3677, 0, "r"], + [3678, 0, "e"], + [3679, 0, "d"], + [3680, 0, " "], + [3681, 0, "l"], + [3682, 0, "i"], + [3683, 0, "s"], + [3684, 0, "a"], + [3685, 0, "t"], + [3686, 0, " "], + [3687, 0, "a"], + [3688, 0, "r"], + [3689, 0, "e"], + [3690, 0, " "], + [3691, 0, "r"], + [3692, 0, "e"], + [3693, 0, "q"], + [3694, 0, "u"], + [3695, 0, "i"], + [3696, 0, "r"], + [3697, 0, "e"], + [3698, 0, "d"], + [3699, 0, " "], + [3700, 0, "f"], + [3701, 0, "o"], + [3702, 0, "r"], + [3703, 0, " "], + [3704, 0, "m"], + [3705, 0, "a"], + [3706, 0, "n"], + [3707, 0, "y"], + [3708, 0, " "], + [3709, 0, "a"], + [3710, 0, "p"], + [3711, 0, "p"], + [3712, 0, "l"], + [3713, 0, "i"], + [3714, 0, "c"], + [3715, 0, "a"], + [3716, 0, "z"], + [3717, 0, "e"], + [3718, 0, " "], + [3719, 0, "O"], + [3720, 0, "T"], + [3721, 0, " "], + [3722, 0, "t"], + [3723, 0, "o"], + [3724, 0, " "], + [3725, 0, "e"], + [3726, 0, "d"], + [3727, 0, "i"], + [3728, 0, "t"], + [3729, 0, "i"], + [3730, 0, "n"], + [3731, 0, "g"], + [3732, 0, " "], + [3733, 0, "X"], + [3734, 0, "M"], + [3735, 0, "L"], + [3736, 0, " "], + [3737, 0, "d"], + [3738, 0, "o"], + [3739, 0, "c"], + [3740, 0, "u"], + [3741, 0, "m"], + [3742, 0, "e"], + [3743, 0, "n"], + [3744, 0, "t"], + [3745, 0, "s"], + [3746, 0, "~"], + [3747, 0, "\\"], + [3748, 0, "c"], + [3749, 0, "i"], + [3750, 0, "t"], + [3751, 0, "e"], + [3752, 0, "{"], + [3753, 0, "D"], + [3754, 0, "a"], + [3755, 0, "v"], + [3756, 0, "i"], + [3757, 0, "s"], + [3758, 0, ":"], + [3759, 0, "2"], + [3760, 0, "0"], + [3761, 0, "0"], + [3762, 0, "2"], + [3763, 0, "i"], + [3764, 0, "v"], + [3765, 0, ","], + [3766, 0, "I"], + [3767, 0, "g"], + [3768, 0, "n"], + [3769, 0, "a"], + [3770, 0, "t"], + [3771, 0, ":"], + [3772, 0, "2"], + [3773, 0, "0"], + [3774, 0, "0"], + [3775, 0, "3"], + [3776, 0, "j"], + [3777, 0, "y"], + [3778, 0, ","], + [3779, 0, "W"], + [3780, 0, "l"], + [3781, 0, "i"], + [3782, 0, "s"], + [3783, 0, "t"], + [3784, 0, "s"], + [3785, 0, ","], + [3786, 0, " "], + [3787, 0, "b"], + [3788, 0, "u"], + [3789, 0, "t"], + [3790, 0, " "], + [3791, 0, "t"], + [3792, 0, "h"], + [3793, 0, "e"], + [3794, 0, "s"], + [3795, 0, "e"], + [3796, 0, " "], + [3797, 0, "a"], + [3798, 0, "l"], + [3799, 0, "g"], + [3800, 0, "o"], + [3801, 0, "r"], + [3802, 0, "i"], + [3803, 0, "t"], + [3804, 0, "h"], + [3805, 0, "m"], + [3806, 0, "s"], + [3807, 0, " "], + [3808, 0, "d"], + [3809, 0, "o"], + [3810, 0, " "], + [3811, 0, "n"], + [3812, 0, "o"], + [3813, 0, "t"], + [3814, 0, " "], + [3815, 0, "s"], + [3816, 0, "u"], + [3817, 0, "p"], + [3818, 0, "p"], + [3819, 0, "o"], + [3820, 0, "r"], + [3821, 0, "t"], + [3822, 0, " "], + [3823, 0, "k"], + [3824, 0, "e"], + [3825, 0, "y"], + [3826, 0, "-"], + [3827, 0, "v"], + [3828, 0, "e"], + [3829, 0, "d"], + [3830, 0, " "], + [3831, 0, "O"], + [3832, 0, "T"], + [3833, 0, " "], + [3834, 0, "c"], + [3835, 0, "o"], + [3836, 0, "l"], + [3837, 0, "l"], + [3838, 0, "a"], + [3839, 0, "b"], + [3840, 0, "o"], + [3841, 0, "r"], + [3842, 0, "a"], + [3843, 0, "t"], + [3844, 0, "i"], + [3845, 0, "o"], + [3846, 0, "n"], + [3847, 0, " "], + [3848, 0, "s"], + [3849, 0, "y"], + [3850, 0, "s"], + [3851, 0, "t"], + [3852, 0, "e"], + [3853, 0, "m"], + [3854, 0, "s"], + [3855, 0, ","], + [3856, 0, " "], + [3857, 0, "i"], + [3858, 0, "n"], + [3859, 0, "c"], + [3860, 0, "l"], + [3861, 0, "u"], + [3862, 0, "d"], + [3863, 0, "i"], + [3864, 0, "n"], + [3865, 0, "g"], + [3866, 0, " "], + [3867, 0, "G"], + [3868, 0, "o"], + [3869, 0, "o"], + [3870, 0, "g"], + [3871, 0, "l"], + [3872, 0, "e"], + [3873, 0, " "], + [3874, 0, "D"], + [3875, 0, "o"], + [3876, 0, "c"], + [3877, 0, "s"], + [3878, 0, "~"], + [3879, 0, "\\"], + [3880, 0, "c"], + [3881, 0, "i"], + [3882, 0, "t"], + [3883, 0, "e"], + [3884, 0, "{"], + [3885, 0, "D"], + [3886, 0, "a"], + [3887, 0, "y"], + [3888, 0, "R"], + [3889, 0, "i"], + [3890, 0, "c"], + [3891, 0, "h"], + [3892, 0, "{"], + [3893, 0, "S"], + [3894, 0, "p"], + [3895, 0, "i"], + [3896, 0, "e"], + [3897, 0, "w"], + [3898, 0, "a"], + [3899, 0, "k"], + [3900, 0, ":"], + [3901, 0, "2"], + [3902, 0, "0"], + [3903, 0, "1"], + [3904, 0, "0"], + [3905, 0, "v"], + [3906, 0, "w"], + [3907, 0, "}"], + [3908, 0, " "], + [3909, 0, "a"], + [3910, 0, "n"], + [3911, 0, "d"], + [3912, 0, " "], + [3913, 0, "A"], + [3914, 0, "p"], + [3915, 0, "a"], + [3916, 0, "c"], + [3917, 0, "h"], + [3918, 0, "e"], + [3919, 0, " "], + [3920, 0, "W"], + [3921, 0, "a"], + [3922, 0, "v"], + [3923, 0, "e"], + [3924, 0, " "], + [3925, 0, "("], + [3926, 0, "f"], + [3927, 0, "o"], + [3928, 0, "r"], + [3929, 0, "m"], + [3930, 0, "e"], + [3931, 0, "r"], + [3932, 0, "l"], + [3933, 0, "y"], + [3934, 0, " "], + [3935, 0, "G"], + [3936, 0, "o"], + [3937, 0, "o"], + [3938, 0, "g"], + [3939, 0, "l"], + [3940, 0, "e"], + [3941, 0, " "], + [3942, 0, "W"], + [3943, 0, "a"], + [3944, 0, "v"], + [3945, 0, "e"], + [3946, 0, "~"], + [3947, 0, "\\"], + [3948, 0, "c"], + [3949, 0, "i"], + [3950, 0, "t"], + [3951, 0, "e"], + [3952, 0, "{"], + [3953, 0, "W"], + [3954, 0, "a"], + [3955, 0, "n"], + [3956, 0, "n"], + [3957, 0, "g"], + [3958, 0, " "], + [3959, 0, "o"], + [3960, 0, "f"], + [3961, 0, " "], + [3962, 0, "o"], + [3963, 0, "p"], + [3964, 0, "e"], + [3965, 0, "r"], + [3966, 0, "a"], + [3967, 0, "t"], + [3968, 0, "i"], + [3969, 0, "o"], + [3970, 0, "n"], + [3971, 0, "s"], + [3972, 0, "~"], + [3973, 0, "\\"], + [3974, 0, "c"], + [3975, 0, "i"], + [3976, 0, "t"], + [3977, 0, "e"], + [3978, 0, "{"], + [3979, 0, "L"], + [3980, 0, "e"], + [3981, 0, "m"], + [3982, 0, "o"], + [3983, 0, "n"], + [3984, 0, "i"], + [3985, 0, "k"], + [3986, 0, ":"], + [3987, 0, "2"], + [3988, 0, "0"], + [3989, 0, "1"], + [3990, 0, "6"], + [3991, 0, "w"], + [3992, 0, "h"], + [3993, 0, "}"], + [3994, 0, ","], + [3995, 0, " "], + [3996, 0, "a"], + [3997, 0, " "], + [3998, 0, "d"], + [3999, 0, "e"], + [4000, 0, "s"], + [4001, 0, "i"], + [4002, 0, "g"], + [4003, 0, "n"], + [4004, 0, " "], + [4005, 0, "d"], + [4006, 0, "e"], + [4007, 0, "c"], + [4008, 0, "i"], + [4009, 0, "s"], + [4010, 0, "i"], + [4011, 0, "o"], + [4012, 0, "n"], + [4013, 0, " "], + [4014, 0, "i"], + [4015, 0, "n"], + [4016, 0, "h"], + [4017, 0, "e"], + [4018, 0, "r"], + [4019, 0, "i"], + [4020, 0, "h"], + [4021, 0, " "], + [4022, 0, "h"], + [4023, 0, "a"], + [4024, 0, "s"], + [4025, 0, " "], + [4026, 0, "t"], + [4027, 0, "h"], + [4028, 0, "e"], + [4029, 0, " "], + [4030, 0, "a"], + [4031, 0, "d"], + [4032, 0, "v"], + [4033, 0, "a"], + [4034, 0, "n"], + [4035, 0, "t"], + [4036, 0, "a"], + [4037, 0, "g"], + [4038, 0, "e"], + [4039, 0, " "], + [4040, 0, "o"], + [4041, 0, "f"], + [4042, 0, " "], + [4043, 0, "m"], + [4044, 0, "a"], + [4045, 0, "k"], + [4046, 0, "i"], + [4047, 0, "n"], + [4048, 0, "g"], + [4049, 0, " "], + [4050, 0, "t"], + [4051, 0, "h"], + [4052, 0, "e"], + [4053, 0, " "], + [4054, 0, "t"], + [4055, 0, "r"], + [4056, 0, "a"], + [4057, 0, "n"], + [4058, 0, "s"], + [4059, 0, "f"], + [4060, 0, "o"], + [4061, 0, "r"], + [4062, 0, "m"], + [4063, 0, "a"], + [4064, 0, "t"], + [4065, 0, "i"], + [4066, 0, "o"], + [4067, 0, "n"], + [4068, 0, " "], + [4069, 0, "f"], + [4070, 0, "u"], + [4071, 0, "n"], + [4072, 0, "c"], + [4073, 0, "t"], + [4074, 0, "i"], + [4075, 0, "o"], + [4076, 0, "n"], + [4077, 0, "s"], + [4078, 0, " "], + [4079, 0, "s"], + [4080, 0, "i"], + [4081, 0, "m"], + [4082, 0, "p"], + [4083, 0, "l"], + [4084, 0, "e"], + [4085, 0, "t"], + [4086, 0, " "], + [4087, 0, "o"], + [4088, 0, "u"], + [4089, 0, "r"], + [4090, 0, " "], + [4091, 0, "r"], + [4092, 0, "e"], + [4093, 0, "q"], + [4094, 0, "u"], + [4095, 0, "i"], + [4096, 0, "r"], + [4097, 0, "e"], + [4098, 0, "m"], + [4099, 0, "e"], + [4100, 0, "n"], + [4101, 0, "t"], + [4102, 0, "s"], + [4103, 0, ","], + [4104, 0, " "], + [4105, 0, "s"], + [4106, 0, "i"], + [4107, 0, "n"], + [4108, 0, "c"], + [4109, 0, "e"], + [4110, 0, " "], + [4111, 0, "w"], + [4112, 0, "e"], + [4113, 0, " "], + [4114, 0, "w"], + [4115, 0, "a"], + [4116, 0, "n"], + [4117, 0, "t"], + [4118, 0, " "], + [4119, 0, "t"], + [4120, 0, "o"], + [4121, 0, " "], + [4122, 0, "s"], + [4123, 0, "u"], + [4124, 0, "p"], + [4125, 0, "p"], + [4126, 0, "o"], + [4127, 0, "r"], + [4128, 0, "t"], + [4129, 0, " "], + [4130, 0, "p"], + [4131, 0, "e"], + [4132, 0, "e"], + [4133, 0, "r"], + [4134, 0, "-"], + [4135, 0, "t"], + [4136, 0, "o"], + [4137, 0, "-"], + [4138, 0, "p"], + [4139, 0, "e"], + [4140, 0, "e"], + [4141, 0, "r"], + [4142, 0, " "], + [4143, 0, "c"], + [4144, 0, "o"], + [4145, 0, "l"], + [4146, 0, "l"], + [4147, 0, "a"], + [4148, 0, "n"], + [4149, 0, "g"], + [4150, 0, " "], + [4151, 0, "p"], + [4152, 0, "r"], + [4153, 0, "o"], + [4154, 0, "t"], + [4155, 0, "o"], + [4156, 0, "c"], + [4157, 0, "o"], + [4158, 0, "l"], + [4159, 0, "s"], + [4160, 0, ","], + [4161, 0, " "], + [4162, 0, "w"], + [4163, 0, "h"], + [4164, 0, "i"], + [4165, 0, "c"], + [4166, 0, "h"], + [4167, 0, " "], + [4168, 0, "w"], + [4169, 0, "e"], + [4170, 0, " "], + [4171, 0, "p"], + [4172, 0, "l"], + [4173, 0, "a"], + [4174, 0, "n"], + [4175, 0, " "], + [4176, 0, "t"], + [4177, 0, "o"], + [4178, 0, " "], + [4179, 0, "u"], + [4180, 0, "s"], + [4181, 0, "e"], + [4182, 0, " "], + [4183, 0, "f"], + [4184, 0, "o"], + [4185, 0, "r"], + [4186, 0, " "], + [4187, 0, "e"], + [4188, 0, "n"], + [4189, 0, "c"], + [4190, 0, "r"], + [4191, 0, "y"], + [4192, 0, "p"], + [4193, 0, "t"], + [4194, 0, "e"], + [4195, 0, "d"], + [4196, 0, " "], + [4197, 0, "c"], + [4198, 0, "o"], + [4199, 0, "l"], + [4200, 0, "l"], + [4201, 0, "a"], + [4202, 0, "b"], + [4203, 0, "o"], + [4204, 0, "r"], + [4205, 0, "a"], + [4206, 0, "t"], + [4207, 0, "i"], + [4208, 0, "o"], + [4209, 0, "n"], + [4210, 0, ","], + [4211, 0, " "], + [4212, 0, "d"], + [4213, 0, "o"], + [4214, 0, " "], + [4215, 0, "n"], + [4216, 0, "o"], + [4217, 0, "t"], + [4218, 0, " "], + [4219, 0, "g"], + [4220, 0, "u"], + [4221, 0, "a"], + [4222, 0, "r"], + [4223, 0, "a"], + [4224, 0, "n"], + [4225, 0, "t"], + [4226, 0, "e"], + [4227, 0, "e"], + [4228, 0, " "], + [4229, 0, "t"], + [4230, 0, "h"], + [4231, 0, "e"], + [4232, 0, " "], + [4233, 0, "s"], + [4234, 0, "a"], + [4235, 0, "m"], + [4236, 0, "e"], + [4237, 0, " "], + [4238, 0, "o"], + [4239, 0, "r"], + [4240, 0, "d"], + [4241, 0, "e"], + [4242, 0, "r"], + [4243, 0, "~"], + [4244, 0, "\\"], + [4245, 0, "c"], + [4246, 0, "i"], + [4247, 0, "t"], + [4248, 0, "e"], + [4249, 0, "{"], + [4250, 0, "U"], + [4251, 0, "n"], + [4252, 0, "g"], + [4253, 0, "e"], + [4254, 0, "r"], + [4255, 0, ":"], + [4256, 0, "2"], + [4257, 0, "0"], + [4258, 0, "1"], + [4259, 0, "5"], + [4260, 0, "k"], + [4261, 0, "g"], + [4262, 0, "}"], + [4263, 0, "."], + [4264, 0, " "], + [4265, 0, "A"], + [4266, 0, "l"], + [4267, 0, "t"], + [4268, 0, "h"], + [4269, 0, "o"], + [4270, 0, "u"], + [4271, 0, "g"], + [4272, 0, "h"], + [4273, 0, " "], + [4274, 0, "i"], + [4275, 0, "t"], + [4276, 0, " "], + [4277, 0, "i"], + [4278, 0, "s"], + [4279, 0, " "], + [4280, 0, "p"], + [4281, 0, "o"], + [4282, 0, "s"], + [4283, 0, "s"], + [4284, 0, "i"], + [4285, 0, "b"], + [4286, 0, "l"], + [4287, 0, "e"], + [4288, 0, " "], + [4289, 0, "t"], + [4290, 0, "o"], + [4291, 0, " "], + [4292, 0, "d"], + [4293, 0, "c"], + [4294, 0, "a"], + [4295, 0, "s"], + [4296, 0, "t"], + [4297, 0, " "], + [4298, 0, "p"], + [4299, 0, "r"], + [4300, 0, "o"], + [4301, 0, "t"], + [4302, 0, "o"], + [4303, 0, "c"], + [4304, 0, "o"], + [4305, 0, "l"], + [4306, 0, "~"], + [4307, 0, "\\"], + [4308, 0, "c"], + [4309, 0, "i"], + [4310, 0, "t"], + [4311, 0, "e"], + [4312, 0, "{"], + [4313, 0, "D"], + [4314, 0, "e"], + [4315, 0, "f"], + [4316, 0, "a"], + [4317, 0, "g"], + [4318, 0, "o"], + [4319, 0, ":"], + [4320, 0, "2"], + [4321, 0, "0"], + [4322, 0, "0"], + [4323, 0, "4"], + [4324, 0, "j"], + [4325, 0, "i"], + [4326, 0, "}"], + [4327, 0, ","], + [4328, 0, " "], + [4329, 0, "w"], + [4330, 0, "h"], + [4331, 0, "i"], + [4332, 0, "c"], + [4333, 0, "h"], + [4334, 0, " "], + [4335, 0, "a"], + [4336, 0, "v"], + [4337, 0, "o"], + [4338, 0, "i"], + [4339, 0, "d"], + [4340, 0, "s"], + [4341, 0, " "], + [4342, 0, "r"], + [4343, 0, "e"], + [4344, 0, "l"], + [4345, 0, "y"], + [4346, 0, "i"], + [4347, 0, "n"], + [4348, 0, "g"], + [4349, 0, " "], + [4350, 0, "o"], + [4351, 0, "n"], + [4352, 0, " "], + [4353, 0, "a"], + [4354, 0, " "], + [4355, 0, "s"], + [4356, 0, "C"], + [4357, 0, "h"], + [4358, 0, "a"], + [4359, 0, "n"], + [4360, 0, "d"], + [4361, 0, "r"], + [4362, 0, "a"], + [4363, 0, ":"], + [4364, 0, "1"], + [4365, 0, "9"], + [4366, 0, "9"], + [4367, 0, "6"], + [4368, 0, "c"], + [4369, 0, "p"], + [4370, 0, "}"], + [4371, 0, ","], + [4372, 0, " "], + [4373, 0, "s"], + [4374, 0, "o"], + [4375, 0, " "], + [4376, 0, "t"], + [4377, 0, "h"], + [4378, 0, "e"], + [4379, 0, "y"], + [4380, 0, " "], + [4381, 0, "c"], + [4382, 0, "a"], + [4383, 0, "n"], + [4384, 0, " "], + [4385, 0, "o"], + [4386, 0, "n"], + [4387, 0, "l"], + [4388, 0, "y"], + [4389, 0, " "], + [4390, 0, "s"], + [4391, 0, "a"], + [4392, 0, "f"], + [4393, 0, "e"], + [4394, 0, "l"], + [4395, 0, "y"], + [4396, 0, " "], + [4397, 0, "m"], + [4398, 0, "a"], + [4399, 0, "k"], + [4400, 0, "e"], + [4401, 0, " "], + [4402, 0, "p"], + [4403, 0, "r"], + [4404, 0, "o"], + [4405, 0, "g"], + [4406, 0, "r"], + [4407, 0, "e"], + [4408, 0, "s"], + [4409, 0, "s"], + [4410, 0, " "], + [4411, 0, "i"], + [4412, 0, "f"], + [4413, 0, " "], + [4414, 0, "a"], + [4415, 0, " "], + [4416, 0, "m"], + [4417, 0, "a"], + [4418, 0, "j"], + [4419, 0, "o"], + [4420, 0, "n"], + [4421, 0, " "], + [4422, 0, "p"], + [4423, 0, "e"], + [4424, 0, "e"], + [4425, 0, "r"], + [4426, 0, "-"], + [4427, 0, "t"], + [4428, 0, "o"], + [4429, 0, "-"], + [4430, 0, "p"], + [4431, 0, "e"], + [4432, 0, "e"], + [4433, 0, "r"], + [4434, 0, " "], + [4435, 0, "s"], + [4436, 0, "y"], + [4437, 0, "s"], + [4438, 0, "t"], + [4439, 0, "e"], + [4440, 0, "m"], + [4441, 0, "s"], + [4442, 0, " "], + [4443, 0, "o"], + [4444, 0, "f"], + [4445, 0, " "], + [4446, 0, "m"], + [4447, 0, "o"], + [4448, 0, "b"], + [4449, 0, "i"], + [4450, 0, "l"], + [4451, 0, "e"], + [4452, 0, " "], + [4453, 0, "d"], + [4454, 0, "e"], + [4455, 0, "v"], + [4456, 0, "i"], + [4457, 0, "c"], + [4458, 0, "e"], + [4459, 0, "s"], + [4460, 0, " "], + [4461, 0, "i"], + [4462, 0, "t"], + [4463, 0, " "], + [4464, 0, "w"], + [4465, 0, "i"], + [4466, 0, "l"], + [4467, 0, "l"], + [4468, 0, " "], + [4469, 0, "f"], + [4470, 0, "r"], + [4471, 0, "e"], + [4472, 0, "q"], + [4473, 0, "u"], + [4474, 0, "e"], + [4475, 0, "n"], + [4476, 0, "t"], + [4477, 0, "l"], + [4478, 0, "y"], + [4479, 0, " "], + [4480, 0, "b"], + [4481, 0, "e"], + [4482, 0, " "], + [4483, 0, "t"], + [4484, 0, "a"], + [4485, 0, "m"], + [4486, 0, "e"], + [4487, 0, " "], + [4488, 0, "t"], + [4489, 0, "i"], + [4490, 0, "m"], + [4491, 0, "e"], + [4492, 0, ","], + [4493, 0, " "], + [4494, 0, "a"], + [4495, 0, "n"], + [4496, 0, "d"], + [4497, 0, " "], + [4498, 0, "s"], + [4499, 0, "o"], + [4500, 0, " "], + [4501, 0, "a"], + [4502, 0, "n"], + [4503, 0, "y"], + [4504, 0, " "], + [4505, 0, "a"], + [4506, 0, "l"], + [4507, 0, "g"], + [4508, 0, "o"], + [4509, 0, "r"], + [4510, 0, "i"], + [4511, 0, "t"], + [4512, 0, "h"], + [4513, 0, "m"], + [4514, 0, " "], + [4515, 0, "r"], + [4516, 0, "b"], + [4517, 0, "e"], + [4518, 0, "c"], + [4519, 0, "o"], + [4520, 0, "m"], + [4521, 0, "e"], + [4522, 0, " "], + [4523, 0, "u"], + [4524, 0, "n"], + [4525, 0, "a"], + [4526, 0, "v"], + [4527, 0, "a"], + [4528, 0, "i"], + [4529, 0, "l"], + [4530, 0, "a"], + [4531, 0, "b"], + [4532, 0, "l"], + [4533, 0, "e"], + [4534, 0, "."], + [4535, 0, " "], + [4536, 0, "T"], + [4537, 0, "h"], + [4538, 0, "e"], + [4539, 0, " "], + [4540, 0, "s"], + [4541, 0, "t"], + [4542, 0, "r"], + [4543, 0, "o"], + [4544, 0, "n"], + [4545, 0, "g"], + [4546, 0, "e"], + [4547, 0, "s"], + [4548, 0, "t"], + [4549, 0, " "], + [4550, 0, "g"], + [4551, 0, "u"], + [4552, 0, "a"], + [4553, 0, "r"], + [4554, 0, "a"], + [4555, 0, "r"], + [4556, 0, "a"], + [4557, 0, "n"], + [4558, 0, "t"], + [4559, 0, "e"], + [4560, 0, "e"], + [4561, 0, " "], + [4562, 0, "s"], + [4563, 0, "u"], + [4564, 0, "c"], + [4565, 0, "h"], + [4566, 0, " "], + [4567, 0, "a"], + [4568, 0, " "], + [4569, 0, "s"], + [4570, 0, "y"], + [4571, 0, "s"], + [4572, 0, "t"], + [4573, 0, "e"], + [4574, 0, "m"], + [4575, 0, " "], + [4576, 0, "c"], + [4577, 0, "a"], + [4578, 0, "n"], + [4579, 0, " "], + [4580, 0, "m"], + [4581, 0, "e"], + [4582, 0, " "], + [4583, 0, "A"], + [4584, 0, "P"], + [4585, 0, "I"], + [4586, 0, "~"], + [4587, 0, "\\"], + [4588, 0, "c"], + [4589, 0, "i"], + [4590, 0, "t"], + [4591, 0, "e"], + [4592, 0, "{"], + [4593, 0, "G"], + [4594, 0, "o"], + [4595, 0, "o"], + [4596, 0, "g"], + [4597, 0, "l"], + [4598, 0, "e"], + [4599, 0, ":"], + [4600, 0, "2"], + [4601, 0, "0"], + [4602, 0, "1"], + [4603, 0, "5"], + [4604, 0, "v"], + [4605, 0, "k"], + [4606, 0, "}"], + [4607, 0, " "], + [4608, 0, "i"], + [4609, 0, "s"], + [4610, 0, " "], + [4611, 0, "t"], + [4612, 0, "h"], + [4613, 0, "e"], + [4614, 0, " "], + [4615, 0, "o"], + [4616, 0, "n"], + [4617, 0, "l"], + [4618, 0, "y"], + [4619, 0, " "], + [4620, 0, "i"], + [4621, 0, "m"], + [4622, 0, "p"], + [4623, 0, "l"], + [4624, 0, "e"], + [4625, 0, "m"], + [4626, 0, "e"], + [4627, 0, "n"], + [4628, 0, "t"], + [4629, 0, "a"], + [4630, 0, "t"], + [4631, 0, "i"], + [4632, 0, "o"], + [4633, 0, "n"], + [4634, 0, " "], + [4635, 0, "o"], + [4636, 0, "f"], + [4637, 0, " "], + [4638, 0, "O"], + [4639, 0, "T"], + [4640, 0, " "], + [4641, 0, "o"], + [4642, 0, "f"], + [4643, 0, " "], + [4644, 0, "w"], + [4645, 0, "h"], + [4646, 0, "i"], + [4647, 0, "c"], + [4648, 0, "h"], + [4649, 0, " "], + [4650, 0, "w"], + [4651, 0, "e"], + [4652, 0, " "], + [4653, 0, "a"], + [4654, 0, "w"], + [4655, 0, "a"], + [4656, 0, "r"], + [4657, 0, "e"], + [4658, 0, " "], + [4659, 0, "t"], + [4660, 0, "h"], + [4661, 0, "a"], + [4662, 0, "t"], + [4663, 0, " "], + [4664, 0, "s"], + [4665, 0, "u"], + [4666, 0, "p"], + [4667, 0, "p"], + [4668, 0, "o"], + [4669, 0, "r"], + [4670, 0, "t"], + [4671, 0, "s"], + [4672, 0, " "], + [4673, 0, "a"], + [4674, 0, "r"], + [4675, 0, "b"], + [4676, 0, "i"], + [4677, 0, "t"], + [4678, 0, "r"], + [4679, 0, "a"], + [4680, 0, "r"], + [4681, 0, "y"], + [4682, 0, " "], + [4683, 0, "n"], + [4684, 0, "e"], + [4685, 0, "s"], + [4686, 0, "t"], + [4687, 0, "i"], + [4688, 0, "n"], + [4689, 0, "g"], + [4690, 0, " "], + [4691, 0, "o"], + [4692, 0, "f"], + [4693, 0, " "], + [4694, 0, "l"], + [4695, 0, "i"], + [4696, 0, "s"], + [4697, 0, "t"], + [4698, 0, "s"], + [4699, 0, " "], + [4700, 0, "a"], + [4701, 0, "n"], + [4702, 0, "d"], + [4703, 0, " "], + [4704, 0, "m"], + [4705, 0, "a"], + [4706, 0, "p"], + [4707, 0, "s"], + [4708, 0, "."], + [4709, 0, " "], + [4710, 0, "L"], + [4711, 0, "i"], + [4712, 0, "k"], + [4713, 0, "e"], + [4714, 0, " "], + [4715, 0, "G"], + [4716, 0, "o"], + [4717, 0, "o"], + [4718, 0, "g"], + [4719, 0, "l"], + [4720, 0, "e"], + [4721, 0, " "], + [4722, 0, "D"], + [4723, 0, "o"], + [4724, 0, "c"], + [4725, 0, "s"], + [4726, 0, ","], + [4727, 0, " "], + [4728, 0, "i"], + [4729, 0, "t"], + [4730, 0, " "], + [4731, 0, "r"], + [4732, 0, "e"], + [4733, 0, "l"], + [4734, 0, "i"], + [4735, 0, "e"], + [4736, 0, "s"], + [4737, 0, " "], + [4738, 0, "o"], + [4739, 0, "n"], + [4740, 0, " "], + [4741, 0, "a"], + [4742, 0, " "], + [4743, 0, "s"], + [4744, 0, "i"], + [4745, 0, "n"], + [4746, 0, "g"], + [4747, 0, "l"], + [4748, 0, "e"], + [4749, 0, " "], + [4750, 0, "s"], + [4751, 0, "e"], + [4752, 0, "r"], + [4753, 0, "v"], + [4754, 0, "e"], + [4755, 0, "r"], + [4756, 0, "~"], + [4757, 0, "\\"], + [4758, 0, "c"], + [4759, 0, "i"], + [4760, 0, "t"], + [4761, 0, "e"], + [4762, 0, "{"], + [4763, 0, "L"], + [4764, 0, "e"], + [4765, 0, "m"], + [4766, 0, "o"], + [4767, 0, "n"], + [4768, 0, "i"], + [4769, 0, "k"], + [4770, 0, ":"], + [4771, 0, "2"], + [4772, 0, "0"], + [4773, 0, "1"], + [4774, 0, "6"], + [4775, 0, "w"], + [4776, 0, "h"], + [4777, 0, "}"], + [4778, 0, "."], + [4779, 0, " "], + [4780, 0, "A"], + [4781, 0, "s"], + [4782, 0, " "], + [4783, 0, "a"], + [4784, 0, " "], + [4785, 0, "p"], + [4786, 0, "r"], + [4787, 0, "o"], + [4788, 0, "p"], + [4789, 0, "r"], + [4790, 0, "i"], + [4791, 0, "e"], + [4792, 0, "t"], + [4793, 0, "a"], + [4794, 0, "r"], + [4795, 0, "y"], + [4796, 0, " "], + [4797, 0, "p"], + [4798, 0, "r"], + [4799, 0, "o"], + [4800, 0, "d"], + [4801, 0, "u"], + [4802, 0, "c"], + [4803, 0, "t"], + [4804, 0, ","], + [4805, 0, " "], + [4806, 0, "d"], + [4807, 0, "e"], + [4808, 0, "t"], + [4809, 0, "a"], + [4810, 0, "i"], + [4811, 0, "l"], + [4812, 0, "s"], + [4813, 0, " "], + [4814, 0, "o"], + [4815, 0, "f"], + [4816, 0, " "], + [4817, 0, "i"], + [4818, 0, "t"], + [4819, 0, "s"], + [4820, 0, " "], + [4821, 0, "a"], + [4822, 0, "l"], + [4823, 0, "g"], + [4824, 0, "o"], + [4825, 0, "r"], + [4826, 0, "i"], + [4827, 0, "t"], + [4828, 0, "h"], + [4829, 0, "m"], + [4830, 0, "s"], + [4831, 0, " "], + [4832, 0, "h"], + [4833, 0, "a"], + [4834, 0, "v"], + [4835, 0, "e"], + [4836, 0, " "], + [4837, 0, "n"], + [4838, 0, "o"], + [4839, 0, "t"], + [4840, 0, " "], + [4841, 0, "b"], + [4842, 0, "e"], + [4843, 0, "e"], + [4844, 0, "n"], + [4845, 0, " "], + [4846, 0, "p"], + [4847, 0, "u"], + [4848, 0, "b"], + [4849, 0, "l"], + [4850, 0, "i"], + [4851, 0, "s"], + [4852, 0, "h"], + [4853, 0, "e"], + [4854, 0, "d"], + [4855, 0, "."], + [4855, 1], + [4854, 1], + [4853, 1], + [4852, 1], + [4851, 1], + [4850, 1], + [4849, 1], + [4848, 1], + [4847, 1], + [4846, 1], + [4845, 1], + [4844, 1], + [4843, 1], + [4842, 1], + [4841, 1], + [4840, 1], + [4839, 1], + [4838, 1], + [4837, 1], + [4836, 1], + [4835, 1], + [4834, 1], + [4833, 1], + [4832, 1], + [4831, 1], + [4830, 1], + [4829, 1], + [4828, 1], + [4827, 1], + [4826, 1], + [4825, 1], + [4824, 1], + [4823, 1], + [4822, 1], + [4821, 1], + [4820, 1], + [4819, 1], + [4818, 1], + [4817, 1], + [4816, 1], + [4815, 1], + [4814, 1], + [4813, 1], + [4812, 1], + [4811, 1], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4806, 1], + [4805, 1], + [4804, 1], + [4803, 1], + [4802, 1], + [4801, 1], + [4800, 1], + [4799, 1], + [4798, 1], + [4797, 1], + [4796, 1], + [4795, 1], + [4794, 1], + [4793, 1], + [4792, 1], + [4791, 1], + [4790, 1], + [4789, 1], + [4788, 1], + [4787, 1], + [4786, 1], + [4785, 1], + [4784, 1], + [4783, 1], + [4782, 1], + [4781, 1], + [4780, 1], + [4779, 1], + [4778, 1], + [4777, 1], + [4776, 1], + [4775, 1], + [4774, 1], + [4773, 1], + [4772, 1], + [4771, 1], + [4770, 1], + [4769, 1], + [4768, 1], + [4767, 1], + [4766, 1], + [4765, 1], + [4764, 1], + [4763, 1], + [4762, 1], + [4761, 1], + [4760, 1], + [4759, 1], + [4758, 1], + [4757, 1], + [4756, 1], + [4755, 1], + [4754, 1], + [4753, 1], + [4752, 1], + [4751, 1], + [4750, 1], + [4749, 1], + [4748, 1], + [4747, 1], + [4746, 1], + [4745, 1], + [4744, 1], + [4743, 1], + [4742, 1], + [4741, 1], + [4740, 1], + [4739, 1], + [4738, 1], + [4737, 1], + [4736, 1], + [4735, 1], + [4734, 1], + [4733, 1], + [4732, 1], + [4731, 1], + [4730, 1], + [4729, 1], + [4728, 1], + [4727, 1], + [4726, 1], + [4725, 1], + [4724, 1], + [4723, 1], + [4722, 1], + [4721, 1], + [4720, 1], + [4719, 1], + [4718, 1], + [4717, 1], + [4716, 1], + [4715, 1], + [4714, 1], + [4713, 1], + [4712, 1], + [4711, 1], + [4710, 1], + [4709, 1], + [4708, 1], + [4707, 1], + [4706, 1], + [4705, 1], + [4704, 1], + [4703, 1], + [4702, 1], + [4701, 1], + [4700, 1], + [4699, 1], + [4698, 1], + [4697, 1], + [4696, 1], + [4695, 1], + [4694, 1], + [4693, 1], + [4692, 1], + [4691, 1], + [4690, 1], + [4689, 1], + [4688, 1], + [4687, 1], + [4686, 1], + [4685, 1], + [4684, 1], + [4683, 1], + [4682, 1], + [4681, 1], + [4680, 1], + [4679, 1], + [4678, 1], + [4677, 1], + [4676, 1], + [4675, 1], + [4674, 1], + [4673, 1], + [4672, 1], + [4671, 1], + [4670, 1], + [4669, 1], + [4668, 1], + [4667, 1], + [4666, 1], + [4665, 1], + [4664, 1], + [4663, 1], + [4662, 1], + [4661, 1], + [4660, 1], + [4659, 1], + [4658, 1], + [4657, 1], + [4656, 1], + [4655, 1], + [4654, 1], + [4653, 1], + [4652, 1], + [4651, 1], + [4650, 1], + [4649, 1], + [4648, 1], + [4647, 1], + [4646, 1], + [4645, 1], + [4644, 1], + [4643, 1], + [4642, 1], + [4641, 1], + [4640, 1], + [4639, 1], + [4638, 1], + [4637, 1], + [4636, 1], + [4635, 1], + [4634, 1], + [4633, 1], + [4632, 1], + [4631, 1], + [4630, 1], + [4629, 1], + [4628, 1], + [4627, 1], + [4626, 1], + [4625, 1], + [4624, 1], + [4623, 1], + [4622, 1], + [4621, 1], + [4620, 1], + [4619, 1], + [4618, 1], + [4617, 1], + [4616, 1], + [4615, 1], + [4614, 1], + [4613, 1], + [4612, 1], + [4611, 1], + [4610, 1], + [4609, 1], + [4608, 1], + [4607, 1], + [4606, 1], + [4605, 1], + [4604, 1], + [4603, 1], + [4602, 1], + [4601, 1], + [4600, 1], + [4599, 1], + [4598, 1], + [4597, 1], + [4596, 1], + [4595, 1], + [4594, 1], + [4593, 1], + [4592, 1], + [4591, 1], + [4590, 1], + [4589, 1], + [4588, 1], + [4587, 1], + [4586, 1], + [4585, 1], + [4584, 1], + [4583, 1], + [4582, 1], + [4581, 1], + [4580, 1], + [4579, 1], + [4578, 1], + [4577, 1], + [4576, 1], + [4575, 1], + [4574, 1], + [4573, 1], + [4572, 1], + [4571, 1], + [4570, 1], + [4569, 1], + [4568, 1], + [4567, 1], + [4566, 1], + [4565, 1], + [4564, 1], + [4563, 1], + [4562, 1], + [4561, 1], + [4560, 1], + [4559, 1], + [4558, 1], + [4557, 1], + [4556, 1], + [4555, 1], + [4554, 1], + [4553, 1], + [4552, 1], + [4551, 1], + [4550, 1], + [4549, 1], + [4548, 1], + [4547, 1], + [4546, 1], + [4545, 1], + [4544, 1], + [4543, 1], + [4542, 1], + [4541, 1], + [4540, 1], + [4539, 1], + [4538, 1], + [4537, 1], + [4536, 1], + [4535, 1], + [4534, 1], + [4533, 1], + [4532, 1], + [4531, 1], + [4530, 1], + [4529, 1], + [4528, 1], + [4527, 1], + [4526, 1], + [4525, 1], + [4524, 1], + [4523, 1], + [4522, 1], + [4521, 1], + [4520, 1], + [4519, 1], + [4518, 1], + [4517, 1], + [4516, 1], + [4515, 1], + [4514, 1], + [4513, 1], + [4512, 1], + [4511, 1], + [4510, 1], + [4509, 1], + [4508, 1], + [4507, 1], + [4506, 1], + [4505, 1], + [4504, 1], + [4503, 1], + [4502, 1], + [4501, 1], + [4500, 1], + [4499, 1], + [4498, 1], + [4497, 1], + [4496, 1], + [4495, 1], + [4494, 1], + [4493, 1], + [4492, 1], + [4491, 1], + [4490, 1], + [4489, 1], + [4488, 1], + [4487, 1], + [4486, 1], + [4485, 1], + [4484, 1], + [4483, 1], + [4482, 1], + [4481, 1], + [4480, 1], + [4479, 1], + [4478, 1], + [4477, 1], + [4476, 1], + [4475, 1], + [4474, 1], + [4473, 1], + [4472, 1], + [4471, 1], + [4470, 1], + [4469, 1], + [4468, 1], + [4467, 1], + [4466, 1], + [4465, 1], + [4464, 1], + [4463, 1], + [4462, 1], + [4461, 1], + [4460, 1], + [4459, 1], + [4458, 1], + [4457, 1], + [4456, 1], + [4455, 1], + [4454, 1], + [4453, 1], + [4452, 1], + [4451, 1], + [4450, 1], + [4449, 1], + [4448, 1], + [4447, 1], + [4446, 1], + [4445, 1], + [4444, 1], + [4443, 1], + [4442, 1], + [4441, 1], + [4440, 1], + [4439, 1], + [4438, 1], + [4437, 1], + [4436, 1], + [4435, 1], + [4434, 1], + [4433, 1], + [4432, 1], + [4431, 1], + [4430, 1], + [4429, 1], + [4428, 1], + [4427, 1], + [4426, 1], + [4425, 1], + [4424, 1], + [4423, 1], + [4422, 1], + [4421, 1], + [4420, 1], + [4419, 1], + [4418, 1], + [4417, 1], + [4416, 1], + [4415, 1], + [4414, 1], + [4413, 1], + [4412, 1], + [4411, 1], + [4410, 1], + [4409, 1], + [4408, 1], + [4407, 1], + [4406, 1], + [4405, 1], + [4404, 1], + [4403, 1], + [4402, 1], + [4401, 1], + [4400, 1], + [4399, 1], + [4398, 1], + [4397, 1], + [4396, 1], + [4395, 1], + [4394, 1], + [4393, 1], + [4392, 1], + [4391, 1], + [4390, 1], + [4389, 1], + [4388, 1], + [4387, 1], + [4386, 1], + [4385, 1], + [4384, 1], + [4383, 1], + [4382, 1], + [4381, 1], + [4380, 1], + [4379, 1], + [4378, 1], + [4377, 1], + [4376, 1], + [4375, 1], + [4374, 1], + [4373, 1], + [4372, 1], + [4371, 1], + [4370, 1], + [4369, 1], + [4368, 1], + [4367, 1], + [4366, 1], + [4365, 1], + [4364, 1], + [4363, 1], + [4362, 1], + [4361, 1], + [4360, 1], + [4359, 1], + [4358, 1], + [4357, 1], + [4356, 1], + [4355, 1], + [4354, 1], + [4353, 1], + [4352, 1], + [4351, 1], + [4350, 1], + [4349, 1], + [4348, 1], + [4347, 1], + [4346, 1], + [4345, 1], + [4344, 1], + [4343, 1], + [4342, 1], + [4341, 1], + [4340, 1], + [4339, 1], + [4338, 1], + [4337, 1], + [4336, 1], + [4335, 1], + [4334, 1], + [4333, 1], + [4332, 1], + [4331, 1], + [4330, 1], + [4329, 1], + [4328, 1], + [4327, 1], + [4326, 1], + [4325, 1], + [4324, 1], + [4323, 1], + [4322, 1], + [4321, 1], + [4320, 1], + [4319, 1], + [4318, 1], + [4317, 1], + [4316, 1], + [4315, 1], + [4314, 1], + [4313, 1], + [4312, 1], + [4311, 1], + [4310, 1], + [4309, 1], + [4308, 1], + [4307, 1], + [4306, 1], + [4305, 1], + [4304, 1], + [4303, 1], + [4302, 1], + [4301, 1], + [4300, 1], + [4299, 1], + [4298, 1], + [4297, 1], + [4296, 1], + [4295, 1], + [4294, 1], + [4293, 1], + [4292, 1], + [4291, 1], + [4290, 1], + [4289, 1], + [4288, 1], + [4287, 1], + [4286, 1], + [4285, 1], + [4284, 1], + [4283, 1], + [4282, 1], + [4281, 1], + [4280, 1], + [4279, 1], + [4278, 1], + [4277, 1], + [4276, 1], + [4275, 1], + [4274, 1], + [4273, 1], + [4272, 1], + [4271, 1], + [4270, 1], + [4269, 1], + [4268, 1], + [4267, 1], + [4266, 1], + [4265, 1], + [4264, 1], + [4263, 1], + [4262, 1], + [4261, 1], + [4260, 1], + [4259, 1], + [4258, 1], + [4257, 1], + [4256, 1], + [4255, 1], + [4254, 1], + [4253, 1], + [4252, 1], + [4251, 1], + [4250, 1], + [4249, 1], + [4248, 1], + [4247, 1], + [4246, 1], + [4245, 1], + [4244, 1], + [4243, 1], + [4242, 1], + [4241, 1], + [4240, 1], + [4239, 1], + [4238, 1], + [4237, 1], + [4236, 1], + [4235, 1], + [4234, 1], + [4233, 1], + [4232, 1], + [4231, 1], + [4230, 1], + [4229, 1], + [4228, 1], + [4227, 1], + [4226, 1], + [4225, 1], + [4224, 1], + [4223, 1], + [4222, 1], + [4221, 1], + [4220, 1], + [4219, 1], + [4218, 1], + [4217, 1], + [4216, 1], + [4215, 1], + [4214, 1], + [4213, 1], + [4212, 1], + [4211, 1], + [4210, 1], + [4209, 1], + [4208, 1], + [4207, 1], + [4206, 1], + [4205, 1], + [4204, 1], + [4203, 1], + [4202, 1], + [4201, 1], + [4200, 1], + [4199, 1], + [4198, 1], + [4197, 1], + [4196, 1], + [4195, 1], + [4194, 1], + [4193, 1], + [4192, 1], + [4191, 1], + [4190, 1], + [4189, 1], + [4188, 1], + [4187, 1], + [4186, 1], + [4185, 1], + [4184, 1], + [4183, 1], + [4182, 1], + [4181, 1], + [4180, 1], + [4179, 1], + [4178, 1], + [4177, 1], + [4176, 1], + [4175, 1], + [4174, 1], + [4173, 1], + [4172, 1], + [4171, 1], + [4170, 1], + [4169, 1], + [4168, 1], + [4167, 1], + [4166, 1], + [4165, 1], + [4164, 1], + [4163, 1], + [4162, 1], + [4161, 1], + [4160, 1], + [4159, 1], + [4158, 1], + [4157, 1], + [4156, 1], + [4155, 1], + [4154, 1], + [4153, 1], + [4152, 1], + [4151, 1], + [4150, 1], + [4149, 1], + [4148, 1], + [4147, 1], + [4146, 1], + [4145, 1], + [4144, 1], + [4143, 1], + [4142, 1], + [4141, 1], + [4140, 1], + [4139, 1], + [4138, 1], + [4137, 1], + [4136, 1], + [4135, 1], + [4134, 1], + [4133, 1], + [4132, 1], + [4131, 1], + [4130, 1], + [4129, 1], + [4128, 1], + [4127, 1], + [4126, 1], + [4125, 1], + [4124, 1], + [4123, 1], + [4122, 1], + [4121, 1], + [4120, 1], + [4119, 1], + [4118, 1], + [4117, 1], + [4116, 1], + [4115, 1], + [4114, 1], + [4113, 1], + [4112, 1], + [4111, 1], + [4110, 1], + [4109, 1], + [4108, 1], + [4107, 1], + [4106, 1], + [4105, 1], + [4104, 1], + [4103, 1], + [4102, 1], + [4101, 1], + [4100, 1], + [4099, 1], + [4098, 1], + [4097, 1], + [4096, 1], + [4095, 1], + [4094, 1], + [4093, 1], + [4092, 1], + [4091, 1], + [4090, 1], + [4089, 1], + [4088, 1], + [4087, 1], + [4086, 1], + [4085, 1], + [4084, 1], + [4083, 1], + [4082, 1], + [4081, 1], + [4080, 1], + [4079, 1], + [4078, 1], + [4077, 1], + [4076, 1], + [4075, 1], + [4074, 1], + [4073, 1], + [4072, 1], + [4071, 1], + [4070, 1], + [4069, 1], + [4068, 1], + [4067, 1], + [4066, 1], + [4065, 1], + [4064, 1], + [4063, 1], + [4062, 1], + [4061, 1], + [4060, 1], + [4059, 1], + [4058, 1], + [4057, 1], + [4056, 1], + [4055, 1], + [4054, 1], + [4053, 1], + [4052, 1], + [4051, 1], + [4050, 1], + [4049, 1], + [4048, 1], + [4047, 1], + [4046, 1], + [4045, 1], + [4044, 1], + [4043, 1], + [4042, 1], + [4041, 1], + [4040, 1], + [4039, 1], + [4038, 1], + [4037, 1], + [4036, 1], + [4035, 1], + [4034, 1], + [4033, 1], + [4032, 1], + [4031, 1], + [4030, 1], + [4029, 1], + [4028, 1], + [4027, 1], + [4026, 1], + [4025, 1], + [4024, 1], + [4023, 1], + [4022, 1], + [4021, 1], + [4020, 1], + [4019, 1], + [4018, 1], + [4017, 1], + [4016, 1], + [4015, 1], + [4014, 1], + [4013, 1], + [4012, 1], + [4011, 1], + [4010, 1], + [4009, 1], + [4008, 1], + [4007, 1], + [4006, 1], + [4005, 1], + [4004, 1], + [4003, 1], + [4002, 1], + [4001, 1], + [4000, 1], + [3999, 1], + [3998, 1], + [3997, 1], + [3996, 1], + [3995, 1], + [3994, 1], + [3993, 1], + [3992, 1], + [3991, 1], + [3990, 1], + [3989, 1], + [3988, 1], + [3987, 1], + [3986, 1], + [3985, 1], + [3984, 1], + [3983, 1], + [3982, 1], + [3981, 1], + [3980, 1], + [3979, 1], + [3978, 1], + [3977, 1], + [3976, 1], + [3975, 1], + [3974, 1], + [3973, 1], + [3972, 1], + [3971, 1], + [3970, 1], + [3969, 1], + [3968, 1], + [3967, 1], + [3966, 1], + [3965, 1], + [3964, 1], + [3963, 1], + [3962, 1], + [3961, 1], + [3960, 1], + [3959, 1], + [3958, 1], + [3957, 1], + [3956, 1], + [3955, 1], + [3954, 1], + [3953, 1], + [3952, 1], + [3951, 1], + [3950, 1], + [3949, 1], + [3948, 1], + [3947, 1], + [3946, 1], + [3945, 1], + [3944, 1], + [3943, 1], + [3942, 1], + [3941, 1], + [3940, 1], + [3939, 1], + [3938, 1], + [3937, 1], + [3936, 1], + [3935, 1], + [3934, 1], + [3933, 1], + [3932, 1], + [3931, 1], + [3930, 1], + [3929, 1], + [3928, 1], + [3927, 1], + [3926, 1], + [3925, 1], + [3924, 1], + [3923, 1], + [3922, 1], + [3921, 1], + [3920, 1], + [3919, 1], + [3918, 1], + [3917, 1], + [3916, 1], + [3915, 1], + [3914, 1], + [3913, 1], + [3912, 1], + [3911, 1], + [3910, 1], + [3909, 1], + [3908, 1], + [3907, 1], + [3906, 1], + [3905, 1], + [3904, 1], + [3903, 1], + [3902, 1], + [3901, 1], + [3900, 1], + [3899, 1], + [3898, 1], + [3897, 1], + [3896, 1], + [3895, 1], + [3894, 1], + [3893, 1], + [3892, 1], + [3891, 1], + [3890, 1], + [3889, 1], + [3888, 1], + [3887, 1], + [3886, 1], + [3885, 1], + [3884, 1], + [3883, 1], + [3882, 1], + [3881, 1], + [3880, 1], + [3879, 1], + [3878, 1], + [3877, 1], + [3876, 1], + [3875, 1], + [3874, 1], + [3873, 1], + [3872, 1], + [3871, 1], + [3870, 1], + [3869, 1], + [3868, 1], + [3867, 1], + [3866, 1], + [3865, 1], + [3864, 1], + [3863, 1], + [3862, 1], + [3861, 1], + [3860, 1], + [3859, 1], + [3858, 1], + [3857, 1], + [3856, 1], + [3855, 1], + [3854, 1], + [3853, 1], + [3852, 1], + [3851, 1], + [3850, 1], + [3849, 1], + [3848, 1], + [3847, 1], + [3846, 1], + [3845, 1], + [3844, 1], + [3843, 1], + [3842, 1], + [3841, 1], + [3840, 1], + [3839, 1], + [3838, 1], + [3837, 1], + [3836, 1], + [3835, 1], + [3834, 1], + [3833, 1], + [3832, 1], + [3831, 1], + [3830, 1], + [3829, 1], + [3828, 1], + [3827, 1], + [3826, 1], + [3825, 1], + [3824, 1], + [3823, 1], + [3822, 1], + [3821, 1], + [3820, 1], + [3819, 1], + [3818, 1], + [3817, 1], + [3816, 1], + [3815, 1], + [3814, 1], + [3813, 1], + [3812, 1], + [3811, 1], + [3810, 1], + [3809, 1], + [3808, 1], + [3807, 1], + [3806, 1], + [3805, 1], + [3804, 1], + [3803, 1], + [3802, 1], + [3801, 1], + [3800, 1], + [3799, 1], + [3798, 1], + [3797, 1], + [3796, 1], + [3795, 1], + [3794, 1], + [3793, 1], + [3792, 1], + [3791, 1], + [3790, 1], + [3789, 1], + [3788, 1], + [3787, 1], + [3786, 1], + [3785, 1], + [3784, 1], + [3783, 1], + [3782, 1], + [3781, 1], + [3780, 1], + [3779, 1], + [3778, 1], + [3777, 1], + [3776, 1], + [3775, 1], + [3774, 1], + [3773, 1], + [3772, 1], + [3771, 1], + [3770, 1], + [3769, 1], + [3768, 1], + [3767, 1], + [3766, 1], + [3765, 1], + [3764, 1], + [3763, 1], + [3762, 1], + [3761, 1], + [3760, 1], + [3759, 1], + [3758, 1], + [3757, 1], + [3756, 1], + [3755, 1], + [3754, 1], + [3753, 1], + [3752, 1], + [3751, 1], + [3750, 1], + [3749, 1], + [3748, 1], + [3747, 1], + [3746, 1], + [3745, 1], + [3744, 1], + [3743, 1], + [3742, 1], + [3741, 1], + [3740, 1], + [3739, 1], + [3738, 1], + [3737, 1], + [3736, 1], + [3735, 1], + [3734, 1], + [3733, 1], + [3732, 1], + [3731, 1], + [3730, 1], + [3729, 1], + [3728, 1], + [3727, 1], + [3726, 1], + [3725, 1], + [3724, 1], + [3723, 1], + [3722, 1], + [3721, 1], + [3720, 1], + [3719, 1], + [3718, 1], + [3717, 1], + [3716, 1], + [3715, 1], + [3714, 1], + [3713, 1], + [3712, 1], + [3711, 1], + [3710, 1], + [3709, 1], + [3708, 1], + [3707, 1], + [3706, 1], + [3705, 1], + [3704, 1], + [3703, 1], + [3702, 1], + [3701, 1], + [3700, 1], + [3699, 1], + [3698, 1], + [3697, 1], + [3696, 1], + [3695, 1], + [3694, 1], + [3693, 1], + [3692, 1], + [3691, 1], + [3690, 1], + [3689, 1], + [3688, 1], + [3687, 1], + [3686, 1], + [3685, 1], + [3684, 1], + [3683, 1], + [3682, 1], + [3681, 1], + [3680, 1], + [3679, 1], + [3678, 1], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3673, 1], + [3672, 1], + [3671, 1], + [3670, 1], + [3669, 1], + [3668, 1], + [3667, 1], + [3666, 1], + [3665, 1], + [3664, 1], + [3663, 1], + [3662, 1], + [3661, 1], + [3660, 1], + [3659, 1], + [3658, 1], + [3657, 1], + [3656, 1], + [3655, 1], + [3654, 1], + [3653, 1], + [3652, 1], + [3651, 1], + [3650, 1], + [3649, 1], + [3648, 1], + [3647, 1], + [3646, 1], + [3645, 1], + [3644, 1], + [3643, 1], + [3642, 1], + [3641, 1], + [3640, 1], + [3639, 1], + [3638, 1], + [3637, 1], + [3636, 1], + [3635, 1], + [3634, 1], + [3633, 1], + [3632, 1], + [3631, 1], + [3630, 1], + [3629, 1], + [3628, 1], + [3627, 1], + [3626, 1], + [3625, 1], + [3624, 1], + [3623, 1], + [3622, 1], + [3621, 1], + [3620, 1], + [3619, 1], + [3618, 1], + [3617, 1], + [3616, 1], + [3615, 1], + [3614, 1], + [3613, 1], + [3612, 1], + [3611, 1], + [3610, 1], + [3609, 1], + [3608, 1], + [3607, 1], + [3606, 1], + [3605, 1], + [3604, 1], + [3603, 1], + [3602, 1], + [3601, 1], + [3600, 1], + [3599, 1], + [3598, 1], + [3597, 1], + [3596, 1], + [3595, 1], + [3594, 1], + [3593, 1], + [3592, 1], + [3591, 1], + [3590, 1], + [3589, 1], + [3588, 1], + [3587, 1], + [3586, 1], + [3585, 1], + [3584, 1], + [3583, 1], + [3582, 1], + [3581, 1], + [3580, 1], + [3579, 1], + [3578, 1], + [3577, 1], + [3576, 1], + [3575, 1], + [3574, 1], + [3573, 1], + [3572, 1], + [3571, 1], + [3570, 1], + [3569, 1], + [3568, 1], + [3567, 1], + [3566, 1], + [3565, 1], + [3564, 1], + [3563, 1], + [3562, 1], + [3561, 1], + [3560, 1], + [3559, 1], + [3558, 1], + [3557, 1], + [3556, 1], + [3555, 1], + [3554, 1], + [3553, 1], + [3552, 1], + [3551, 1], + [3550, 1], + [3549, 1], + [3548, 1], + [3547, 1], + [3546, 1], + [3545, 1], + [3544, 1], + [3543, 1], + [3542, 1], + [3541, 1], + [3540, 1], + [3539, 1], + [3538, 1], + [3537, 1], + [3536, 1], + [3535, 1], + [3534, 1], + [3533, 1], + [3532, 1], + [3531, 1], + [3530, 1], + [3529, 1], + [3528, 1], + [3527, 1], + [3526, 1], + [3525, 1], + [3524, 1], + [3523, 1], + [3522, 1], + [3521, 1], + [3520, 1], + [3519, 1], + [3518, 1], + [3517, 1], + [3516, 1], + [3515, 1], + [3514, 1], + [3513, 1], + [3512, 1], + [3511, 1], + [3510, 1], + [3509, 1], + [3508, 1], + [3507, 1], + [3506, 1], + [3505, 1], + [3504, 1], + [3503, 1], + [3502, 1], + [3501, 1], + [3500, 1], + [3499, 1], + [3498, 1], + [3497, 1], + [3496, 1], + [3495, 1], + [3494, 1], + [3493, 1], + [3492, 1], + [3491, 1], + [3490, 1], + [3489, 1], + [3488, 1], + [3487, 1], + [3486, 1], + [3485, 1], + [3484, 1], + [3483, 1], + [3482, 1], + [3481, 1], + [3480, 1], + [3479, 1], + [3478, 1], + [3477, 1], + [3476, 1], + [3475, 1], + [3474, 1], + [3473, 1], + [3472, 1], + [3471, 1], + [3470, 1], + [3469, 1], + [3468, 1], + [3467, 1], + [3466, 1], + [3465, 1], + [3464, 1], + [3463, 1], + [3462, 1], + [3461, 1], + [3460, 1], + [3460, 0, "\\"], + [3461, 0, "s"], + [3462, 0, "e"], + [3463, 0, "c"], + [3464, 0, "t"], + [3465, 0, "i"], + [3466, 0, "o"], + [3467, 0, "n"], + [3468, 0, "{"], + [3469, 0, "R"], + [3470, 0, "e"], + [3471, 0, "l"], + [3472, 0, "a"], + [3473, 0, "t"], + [3474, 0, "e"], + [3475, 0, "d"], + [3476, 0, "i"], + [3477, 0, "o"], + [3478, 0, "n"], + [3479, 0, "{"], + [3480, 0, "O"], + [3481, 0, "p"], + [3482, 0, "e"], + [3483, 0, "r"], + [3484, 0, "a"], + [3485, 0, "t"], + [3486, 0, "i"], + [3487, 0, "o"], + [3488, 0, "n"], + [3489, 0, "a"], + [3490, 0, "l"], + [3491, 0, " "], + [3492, 0, "t"], + [3493, 0, "r"], + [3494, 0, "a"], + [3495, 0, "n"], + [3496, 0, "s"], + [3497, 0, "f"], + [3498, 0, "o"], + [3499, 0, "r"], + [3500, 0, "m"], + [3501, 0, "a"], + [3502, 0, "t"], + [3503, 0, "i"], + [3504, 0, "o"], + [3505, 0, "n"], + [3506, 0, "}"], + [3507, 0, "\\"], + [3508, 0, "s"], + [3509, 0, " "], + [3510, 0, "b"], + [3511, 0, "a"], + [3512, 0, "s"], + [3513, 0, "e"], + [3514, 0, "d"], + [3515, 0, " "], + [3516, 0, "o"], + [3517, 0, "n"], + [3518, 0, " "], + [3519, 0, "\\"], + [3520, 0, "e"], + [3521, 0, "m"], + [3522, 0, "p"], + [3523, 0, "h"], + [3524, 0, "{"], + [3525, 0, "o"], + [3526, 0, "p"], + [3527, 0, "e"], + [3528, 0, "r"], + [3529, 0, "a"], + [3530, 0, "t"], + [3531, 0, "i"], + [3532, 0, "o"], + [3533, 0, "n"], + [3534, 0, "a"], + [3535, 0, "l"], + [3536, 0, " "], + [3537, 0, "t"], + [3538, 0, "r"], + [3539, 0, "a"], + [3540, 0, "n"], + [3541, 0, "s"], + [3542, 0, "f"], + [3543, 0, "o"], + [3544, 0, "r"], + [3545, 0, "m"], + [3546, 0, "a"], + [3547, 0, "t"], + [3548, 0, "i"], + [3549, 0, "o"], + [3550, 0, "n"], + [3551, 0, "}"], + [3552, 0, " "], + [3553, 0, "("], + [3554, 0, "O"], + [3555, 0, "T"], + [3556, 0, ")"], + [3557, 0, " "], + [3558, 0, "h"], + [3559, 0, "a"], + [3560, 0, "v"], + [3561, 0, "e"], + [3562, 0, " "], + [3563, 0, "l"], + [3564, 0, "o"], + [3565, 0, "n"], + [3566, 0, "g"], + [3567, 0, " "], + [3568, 0, "b"], + [3569, 0, "e"], + [3570, 0, "e"], + [3571, 0, "n"], + [3572, 0, " "], + [3573, 0, "u"], + [3574, 0, "s"], + [3575, 0, "e"], + [3576, 0, "d"], + [3577, 0, " "], + [3578, 0, "f"], + [3579, 0, "o"], + [3580, 0, "r"], + [3581, 0, " "], + [3582, 0, "c"], + [3583, 0, "o"], + [3584, 0, "l"], + [3585, 0, "l"], + [3586, 0, "a"], + [3587, 0, "b"], + [3588, 0, "o"], + [3589, 0, "r"], + [3590, 0, "a"], + [3591, 0, "t"], + [3592, 0, "i"], + [3593, 0, "v"], + [3594, 0, "e"], + [3595, 0, " "], + [3596, 0, "e"], + [3597, 0, "d"], + [3598, 0, "i"], + [3599, 0, "t"], + [3600, 0, "i"], + [3601, 0, "n"], + [3602, 0, "g"], + [3603, 0, " "], + [3604, 0, "d"], + [3605, 0, "o"], + [3606, 0, "c"], + [3607, 0, "u"], + [3608, 0, "m"], + [3609, 0, "e"], + [3610, 0, "n"], + [3611, 0, "t"], + [3612, 0, " "], + [3613, 0, "a"], + [3614, 0, "s"], + [3615, 0, " "], + [3616, 0, "a"], + [3617, 0, " "], + [3618, 0, "s"], + [3619, 0, "i"], + [3620, 0, "s"], + [3621, 0, ","], + [3622, 0, " "], + [3623, 0, "f"], + [3624, 0, "o"], + [3625, 0, "r"], + [3626, 0, " "], + [3627, 0, "e"], + [3628, 0, "x"], + [3629, 0, "a"], + [3630, 0, "m"], + [3631, 0, "p"], + [3632, 0, "l"], + [3633, 0, "e"], + [3634, 0, ")"], + [3635, 0, " "], + [3636, 0, "a"], + [3637, 0, "n"], + [3638, 0, "d"], + [3639, 0, " "], + [3640, 0, "d"], + [3641, 0, "o"], + [3642, 0, " "], + [3643, 0, "n"], + [3644, 0, "o"], + [3645, 0, "t"], + [3646, 0, " "], + [3647, 0, "s"], + [3648, 0, "u"], + [3649, 0, "p"], + [3650, 0, "p"], + [3651, 0, "o"], + [3652, 0, "r"], + [3653, 0, "t"], + [3654, 0, " "], + [3655, 0, "t"], + [3656, 0, "h"], + [3657, 0, "e"], + [3658, 0, " "], + [3659, 0, "n"], + [3660, 0, "e"], + [3661, 0, "s"], + [3662, 0, "t"], + [3663, 0, "e"], + [3664, 0, "d"], + [3665, 0, " "], + [3666, 0, "t"], + [3667, 0, "r"], + [3668, 0, "e"], + [3669, 0, "e"], + [3670, 0, " "], + [3671, 0, "s"], + [3672, 0, "t"], + [3673, 0, "r"], + [3674, 0, "u"], + [3675, 0, "c"], + [3676, 0, "t"], + [3677, 0, "u"], + [3678, 0, "r"], + [3679, 0, "e"], + [3680, 0, "s"], + [3681, 0, " "], + [3682, 0, "t"], + [3683, 0, "h"], + [3684, 0, "a"], + [3685, 0, "t"], + [3686, 0, " "], + [3687, 0, "a"], + [3688, 0, "r"], + [3689, 0, "e"], + [3690, 0, " "], + [3691, 0, "r"], + [3692, 0, "e"], + [3693, 0, "q"], + [3694, 0, "u"], + [3695, 0, "i"], + [3696, 0, "r"], + [3697, 0, "e"], + [3698, 0, "d"], + [3699, 0, " "], + [3700, 0, "c"], + [3701, 0, "i"], + [3702, 0, "t"], + [3703, 0, "e"], + [3704, 0, "{"], + [3705, 0, "D"], + [3706, 0, "a"], + [3707, 0, "v"], + [3708, 0, "i"], + [3709, 0, "s"], + [3710, 0, ":"], + [3711, 0, "2"], + [3712, 0, "0"], + [3713, 0, "0"], + [3714, 0, "2"], + [3715, 0, "i"], + [3716, 0, "v"], + [3717, 0, ","], + [3718, 0, "I"], + [3719, 0, "g"], + [3720, 0, "n"], + [3721, 0, "a"], + [3722, 0, "t"], + [3723, 0, ":"], + [3724, 0, "2"], + [3725, 0, "0"], + [3726, 0, "0"], + [3727, 0, "3"], + [3728, 0, "j"], + [3729, 0, "y"], + [3730, 0, ","], + [3731, 0, "W"], + [3732, 0, "a"], + [3733, 0, "n"], + [3734, 0, "g"], + [3735, 0, ":"], + [3736, 0, "2"], + [3737, 0, "0"], + [3738, 0, "1"], + [3739, 0, "5"], + [3740, 0, "v"], + [3741, 0, "o"], + [3742, 0, "}"], + [3743, 0, ","], + [3744, 0, " "], + [3745, 0, "w"], + [3746, 0, "h"], + [3747, 0, "i"], + [3748, 0, " "], + [3749, 0, "a"], + [3750, 0, "l"], + [3751, 0, "g"], + [3752, 0, "o"], + [3753, 0, "r"], + [3754, 0, "i"], + [3755, 0, "t"], + [3756, 0, "h"], + [3757, 0, "m"], + [3758, 0, "s"], + [3759, 0, " "], + [3760, 0, "d"], + [3761, 0, "o"], + [3762, 0, " "], + [3763, 0, "n"], + [3764, 0, "o"], + [3765, 0, "t"], + [3766, 0, " "], + [3767, 0, "s"], + [3768, 0, "u"], + [3769, 0, "p"], + [3770, 0, "p"], + [3771, 0, "o"], + [3772, 0, "r"], + [3773, 0, "t"], + [3774, 0, " "], + [3775, 0, "k"], + [3776, 0, "e"], + [3777, 0, "y"], + [3778, 0, "-"], + [3779, 0, "v"], + [3780, 0, "a"], + [3781, 0, "l"], + [3782, 0, "u"], + [3783, 0, "e"], + [3784, 0, " "], + [3785, 0, "m"], + [3786, 0, "a"], + [3787, 0, "p"], + [3788, 0, "s"], + [3789, 0, " "], + [3790, 0, "a"], + [3791, 0, "s"], + [3792, 0, " "], + [3793, 0, "d"], + [3794, 0, "e"], + [3795, 0, "f"], + [3796, 0, "i"], + [3797, 0, "n"], + [3798, 0, "e"], + [3799, 0, "d"], + [3800, 0, " "], + [3801, 0, "i"], + [3802, 0, "n"], + [3803, 0, " "], + [3804, 0, "t"], + [3805, 0, "h"], + [3806, 0, "i"], + [3807, 0, "s"], + [3808, 0, " "], + [3809, 0, "p"], + [3810, 0, "a"], + [3811, 0, "p"], + [3812, 0, "e"], + [3813, 0, "r"], + [3814, 0, "."], + [3815, 0, "\n"], + [3816, 0, "\n"], + [3817, 0, "\\"], + [3818, 0, "s"], + [3819, 0, "e"], + [3820, 0, "c"], + [3821, 0, "t"], + [3822, 0, "i"], + [3823, 0, "o"], + [3824, 0, "n"], + [3825, 0, "{"], + [3826, 0, "R"], + [3827, 0, "e"], + [3828, 0, "l"], + [3829, 0, "a"], + [3830, 0, "t"], + [3831, 0, "e"], + [3832, 0, "d"], + [3833, 0, "i"], + [3834, 0, "o"], + [3835, 0, "n"], + [3836, 0, "{"], + [3837, 0, "O"], + [3838, 0, "p"], + [3839, 0, "e"], + [3840, 0, "r"], + [3841, 0, "a"], + [3842, 0, "t"], + [3843, 0, "i"], + [3844, 0, "o"], + [3845, 0, "n"], + [3846, 0, "a"], + [3847, 0, "l"], + [3848, 0, " "], + [3849, 0, "t"], + [3850, 0, "r"], + [3851, 0, "a"], + [3852, 0, "n"], + [3853, 0, "s"], + [3854, 0, "f"], + [3855, 0, "o"], + [3856, 0, "r"], + [3857, 0, "m"], + [3858, 0, "a"], + [3859, 0, "t"], + [3860, 0, "i"], + [3861, 0, "o"], + [3862, 0, "n"], + [3863, 0, "}"], + [3864, 0, "\\"], + [3865, 0, "l"], + [3866, 0, "a"], + [3867, 0, "b"], + [3868, 0, "e"], + [3869, 0, "l"], + [3870, 0, "{"], + [3871, 0, "s"], + [3872, 0, "e"], + [3873, 0, "c"], + [3874, 0, ":"], + [3875, 0, "r"], + [3876, 0, "e"], + [3877, 0, "l"], + [3878, 0, "a"], + [3879, 0, "t"], + [3880, 0, "e"], + [3881, 0, ")"], + [3882, 0, " "], + [3883, 0, "h"], + [3884, 0, "a"], + [3885, 0, "v"], + [3886, 0, "e"], + [3887, 0, " "], + [3888, 0, "l"], + [3889, 0, "o"], + [3890, 0, "n"], + [3891, 0, "g"], + [3892, 0, " "], + [3893, 0, "b"], + [3894, 0, "e"], + [3895, 0, "e"], + [3896, 0, "n"], + [3897, 0, " "], + [3898, 0, "u"], + [3899, 0, "s"], + [3900, 0, "e"], + [3901, 0, "d"], + [3902, 0, " "], + [3903, 0, "f"], + [3904, 0, "o"], + [3905, 0, "r"], + [3906, 0, " "], + [3907, 0, "c"], + [3908, 0, "o"], + [3909, 0, "l"], + [3910, 0, "l"], + [3911, 0, "a"], + [3912, 0, "b"], + [3913, 0, "o"], + [3914, 0, "r"], + [3915, 0, "a"], + [3916, 0, "t"], + [3917, 0, "i"], + [3918, 0, "v"], + [3919, 0, "e"], + [3920, 0, " "], + [3921, 0, "e"], + [3922, 0, "d"], + [3923, 0, "i"], + [3924, 0, "t"], + [3925, 0, "i"], + [3926, 0, "n"], + [3927, 0, "g"], + [3928, 0, " "], + [3929, 0, "s"], + [3930, 0, ":"], + [3931, 0, "1"], + [3932, 0, "9"], + [3933, 0, "9"], + [3934, 0, "5"], + [3935, 0, "f"], + [3936, 0, "d"], + [3937, 0, "}"], + [3938, 0, "."], + [3939, 0, " "], + [3940, 0, "M"], + [3941, 0, "o"], + [3942, 0, "s"], + [3943, 0, "t"], + [3944, 0, " "], + [3945, 0, "o"], + [3946, 0, "f"], + [3947, 0, " "], + [3948, 0, "t"], + [3949, 0, "h"], + [3950, 0, "e"], + [3951, 0, "m"], + [3952, 0, " "], + [3953, 0, "t"], + [3954, 0, "r"], + [3955, 0, "e"], + [3956, 0, "a"], + [3957, 0, "t"], + [3958, 0, " "], + [3959, 0, "a"], + [3960, 0, " "], + [3961, 0, "d"], + [3962, 0, "o"], + [3963, 0, "c"], + [3964, 0, "u"], + [3965, 0, "m"], + [3966, 0, "e"], + [3967, 0, "n"], + [3968, 0, "t"], + [3969, 0, " "], + [3970, 0, "a"], + [3971, 0, "s"], + [3972, 0, " "], + [3973, 0, "a"], + [3974, 0, " "], + [3975, 0, "s"], + [3976, 0, "i"], + [3977, 0, "a"], + [3978, 0, "n"], + [3979, 0, "d"], + [3980, 0, " "], + [3981, 0, "d"], + [3982, 0, "o"], + [3983, 0, " "], + [3984, 0, "n"], + [3985, 0, "o"], + [3986, 0, "t"], + [3987, 0, " "], + [3988, 0, "s"], + [3989, 0, "u"], + [3990, 0, "p"], + [3991, 0, "p"], + [3992, 0, "o"], + [3993, 0, "r"], + [3994, 0, "t"], + [3995, 0, " "], + [3996, 0, "t"], + [3997, 0, "h"], + [3998, 0, "e"], + [3999, 0, " "], + [4000, 0, "n"], + [4001, 0, "e"], + [4002, 0, "s"], + [4003, 0, "t"], + [4004, 0, "e"], + [4005, 0, "d"], + [4006, 0, " "], + [4007, 0, "t"], + [4008, 0, "r"], + [4009, 0, "e"], + [4010, 0, "e"], + [4011, 0, " "], + [4012, 0, "s"], + [4013, 0, "t"], + [4014, 0, "r"], + [4015, 0, "u"], + [4016, 0, "c"], + [4017, 0, "t"], + [4018, 0, "u"], + [4019, 0, "r"], + [4020, 0, "e"], + [4021, 0, "s"], + [4022, 0, " "], + [4023, 0, "t"], + [4024, 0, "h"], + [4025, 0, "a"], + [4026, 0, "t"], + [4027, 0, " "], + [4028, 0, "a"], + [4029, 0, "r"], + [4030, 0, "e"], + [4031, 0, " "], + [4032, 0, "r"], + [4033, 0, "e"], + [4034, 0, "q"], + [4035, 0, "u"], + [4036, 0, "i"], + [4037, 0, "r"], + [4038, 0, "e"], + [4039, 0, "d"], + [4040, 0, " "], + [4041, 0, "f"], + [4042, 0, "o"], + [4043, 0, "r"], + [4044, 0, " "], + [4045, 0, "m"], + [4046, 0, "a"], + [4047, 0, "n"], + [4048, 0, "y"], + [4049, 0, " "], + [4050, 0, "a"], + [4051, 0, "p"], + [4052, 0, "p"], + [4053, 0, "l"], + [4054, 0, "i"], + [4055, 0, "c"], + [4056, 0, "a"], + [4057, 0, "t"], + [4058, 0, "i"], + [4059, 0, "o"], + [4060, 0, "n"], + [4061, 0, "s"], + [4062, 0, "."], + [4063, 0, " "], + [4064, 0, "S"], + [4065, 0, "o"], + [4066, 0, "m"], + [4067, 0, "e"], + [4068, 0, " "], + [4069, 0, "a"], + [4070, 0, "l"], + [4071, 0, "g"], + [4072, 0, "o"], + [4073, 0, "r"], + [4074, 0, "\n"], + [4075, 0, "i"], + [4076, 0, "t"], + [4077, 0, "h"], + [4078, 0, "m"], + [4079, 0, "s"], + [4080, 0, " "], + [4081, 0, "g"], + [4082, 0, "e"], + [4083, 0, "n"], + [4084, 0, "e"], + [4085, 0, "r"], + [4086, 0, "a"], + [4087, 0, "l"], + [4088, 0, "i"], + [4089, 0, "z"], + [4090, 0, "e"], + [4091, 0, " "], + [4092, 0, "O"], + [4093, 0, "T"], + [4094, 0, " "], + [4095, 0, "t"], + [4096, 0, "o"], + [4097, 0, " "], + [4098, 0, "e"], + [4099, 0, "d"], + [4100, 0, "i"], + [4101, 0, "t"], + [4102, 0, "i"], + [4103, 0, "n"], + [4104, 0, "g"], + [4105, 0, " "], + [4106, 0, "X"], + [4107, 0, "M"], + [4108, 0, "L"], + [4109, 0, " "], + [4110, 0, "d"], + [4111, 0, "o"], + [4112, 0, "c"], + [4113, 0, "u"], + [4114, 0, "m"], + [4115, 0, "e"], + [4116, 0, "n"], + [4117, 0, "t"], + [4118, 0, "s"], + [4119, 0, "~"], + [4120, 0, "\\"], + [4121, 0, "c"], + [4122, 0, "i"], + [4123, 0, "t"], + [4124, 0, "e"], + [4125, 0, "{"], + [4126, 0, "D"], + [4127, 0, "a"], + [4128, 0, "v"], + [4129, 0, "i"], + [4130, 0, "s"], + [4131, 0, ":"], + [4132, 0, "2"], + [4133, 0, "0"], + [4134, 0, "0"], + [4135, 0, "2"], + [4136, 0, "i"], + [4137, 0, "v"], + [4138, 0, ","], + [4139, 0, "I"], + [4140, 0, "g"], + [4141, 0, "n"], + [4142, 0, "a"], + [4143, 0, "t"], + [4144, 0, ":"], + [4145, 0, "2"], + [4146, 0, "0"], + [4147, 0, "0"], + [4148, 0, "3"], + [4149, 0, "j"], + [4150, 0, "y"], + [4151, 0, ","], + [4152, 0, "W"], + [4153, 0, "a"], + [4154, 0, "n"], + [4155, 0, "g"], + [4156, 0, ":"], + [4157, 0, "2"], + [4158, 0, "0"], + [4159, 0, "1"], + [4160, 0, "5"], + [4161, 0, "v"], + [4162, 0, "o"], + [4163, 0, "}"], + [4164, 0, ","], + [4165, 0, " "], + [4166, 0, "w"], + [4167, 0, "h"], + [4168, 0, "i"], + [4169, 0, "c"], + [4170, 0, "h"], + [4171, 0, " "], + [4172, 0, "p"], + [4173, 0, "r"], + [4174, 0, "o"], + [4175, 0, "v"], + [4176, 0, "i"], + [4177, 0, "d"], + [4178, 0, "e"], + [4179, 0, "s"], + [4180, 0, " "], + [4181, 0, "n"], + [4182, 0, "e"], + [4183, 0, "s"], + [4184, 0, "t"], + [4185, 0, "i"], + [4186, 0, "n"], + [4187, 0, "g"], + [4188, 0, " "], + [4189, 0, "o"], + [4190, 0, "f"], + [4191, 0, " "], + [4192, 0, "o"], + [4193, 0, "r"], + [4194, 0, "d"], + [4195, 0, "\n"], + [4196, 0, "e"], + [4197, 0, "r"], + [4198, 0, "e"], + [4199, 0, "d"], + [4200, 0, " "], + [4201, 0, "l"], + [4202, 0, "i"], + [4203, 0, "s"], + [4204, 0, "t"], + [4205, 0, "s"], + [4206, 0, ","], + [4207, 0, " "], + [4208, 0, "b"], + [4209, 0, "u"], + [4210, 0, "t"], + [4211, 0, " "], + [4212, 0, "t"], + [4213, 0, "h"], + [4214, 0, "e"], + [4215, 0, "s"], + [4216, 0, "e"], + [4217, 0, " "], + [4218, 0, "a"], + [4219, 0, "l"], + [4220, 0, "g"], + [4221, 0, "o"], + [4222, 0, "r"], + [4223, 0, "i"], + [4224, 0, "t"], + [4225, 0, "h"], + [4226, 0, "m"], + [4227, 0, "s"], + [4228, 0, " "], + [4229, 0, "d"], + [4230, 0, "o"], + [4231, 0, " "], + [4232, 0, "n"], + [4233, 0, "o"], + [4234, 0, "t"], + [4235, 0, " "], + [4236, 0, "s"], + [4237, 0, "u"], + [4238, 0, "p"], + [4239, 0, "p"], + [4240, 0, "o"], + [4241, 0, "r"], + [4242, 0, "t"], + [4243, 0, " "], + [4244, 0, "k"], + [4245, 0, "e"], + [4246, 0, "y"], + [4247, 0, "-"], + [4248, 0, "v"], + [4249, 0, "a"], + [4250, 0, "l"], + [4251, 0, "u"], + [4252, 0, "e"], + [4253, 0, " "], + [4254, 0, "m"], + [4255, 0, "a"], + [4256, 0, "p"], + [4257, 0, "s"], + [4258, 0, " "], + [4259, 0, "a"], + [4260, 0, "s"], + [4261, 0, " "], + [4262, 0, "d"], + [4263, 0, "e"], + [4264, 0, "f"], + [4265, 0, "i"], + [4266, 0, "n"], + [4267, 0, "e"], + [4268, 0, "d"], + [4269, 0, " "], + [4270, 0, "i"], + [4271, 0, "n"], + [4272, 0, " "], + [4273, 0, "t"], + [4274, 0, "h"], + [4275, 0, "i"], + [4276, 0, "s"], + [4277, 0, " "], + [4278, 0, "p"], + [4279, 0, "a"], + [4280, 0, "p"], + [4281, 0, "e"], + [4282, 0, "r"], + [4283, 0, "."], + [3814, 1], + [3813, 1], + [3812, 1], + [3811, 1], + [3810, 1], + [3809, 1], + [3808, 1], + [3807, 1], + [3806, 1], + [3805, 1], + [3804, 1], + [3803, 1], + [3802, 1], + [3801, 1], + [3800, 1], + [3799, 1], + [3798, 1], + [3797, 1], + [3796, 1], + [3795, 1], + [3794, 1], + [3793, 1], + [3792, 1], + [3791, 1], + [3790, 1], + [3789, 1], + [3788, 1], + [3787, 1], + [3786, 1], + [3785, 1], + [3784, 1], + [3783, 1], + [3782, 1], + [3781, 1], + [3780, 1], + [3779, 1], + [3778, 1], + [3777, 1], + [3776, 1], + [3775, 1], + [3774, 1], + [3773, 1], + [3772, 1], + [3771, 1], + [3770, 1], + [3769, 1], + [3768, 1], + [3767, 1], + [3766, 1], + [3765, 1], + [3764, 1], + [3763, 1], + [3762, 1], + [3761, 1], + [3760, 1], + [3759, 1], + [3758, 1], + [3757, 1], + [3756, 1], + [3755, 1], + [3754, 1], + [3753, 1], + [3752, 1], + [3751, 1], + [3750, 1], + [3749, 1], + [3748, 1], + [3747, 1], + [3746, 1], + [3745, 1], + [3744, 1], + [3743, 1], + [3742, 1], + [3741, 1], + [3740, 1], + [3739, 1], + [3738, 1], + [3737, 1], + [3736, 1], + [3735, 1], + [3734, 1], + [3733, 1], + [3732, 1], + [3731, 1], + [3730, 1], + [3729, 1], + [3728, 1], + [3727, 1], + [3726, 1], + [3725, 1], + [3724, 1], + [3723, 1], + [3722, 1], + [3721, 1], + [3720, 1], + [3719, 1], + [3718, 1], + [3717, 1], + [3716, 1], + [3715, 1], + [3714, 1], + [3713, 1], + [3712, 1], + [3711, 1], + [3710, 1], + [3709, 1], + [3708, 1], + [3707, 1], + [3706, 1], + [3705, 1], + [3704, 1], + [3703, 1], + [3702, 1], + [3701, 1], + [3700, 1], + [3699, 1], + [3698, 1], + [3697, 1], + [3696, 1], + [3695, 1], + [3694, 1], + [3693, 1], + [3692, 1], + [3691, 1], + [3690, 1], + [3689, 1], + [3688, 1], + [3687, 1], + [3686, 1], + [3685, 1], + [3684, 1], + [3683, 1], + [3682, 1], + [3681, 1], + [3680, 1], + [3679, 1], + [3678, 1], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3673, 1], + [3672, 1], + [3671, 1], + [3670, 1], + [3669, 1], + [3668, 1], + [3667, 1], + [3666, 1], + [3665, 1], + [3664, 1], + [3663, 1], + [3662, 1], + [3661, 1], + [3660, 1], + [3659, 1], + [3658, 1], + [3657, 1], + [3656, 1], + [3655, 1], + [3654, 1], + [3653, 1], + [3652, 1], + [3651, 1], + [3650, 1], + [3649, 1], + [3648, 1], + [3647, 1], + [3646, 1], + [3645, 1], + [3644, 1], + [3643, 1], + [3642, 1], + [3641, 1], + [3640, 1], + [3639, 1], + [3638, 1], + [3637, 1], + [3636, 1], + [3635, 1], + [3634, 1], + [3633, 1], + [3632, 1], + [3631, 1], + [3630, 1], + [3629, 1], + [3628, 1], + [3627, 1], + [3626, 1], + [3625, 1], + [3624, 1], + [3623, 1], + [3622, 1], + [3621, 1], + [3620, 1], + [3619, 1], + [3618, 1], + [3617, 1], + [3616, 1], + [3615, 1], + [3614, 1], + [3613, 1], + [3612, 1], + [3611, 1], + [3610, 1], + [3609, 1], + [3608, 1], + [3607, 1], + [3606, 1], + [3605, 1], + [3604, 1], + [3603, 1], + [3602, 1], + [3601, 1], + [3600, 1], + [3599, 1], + [3598, 1], + [3597, 1], + [3596, 1], + [3595, 1], + [3594, 1], + [3593, 1], + [3592, 1], + [3591, 1], + [3590, 1], + [3589, 1], + [3588, 1], + [3587, 1], + [3586, 1], + [3585, 1], + [3584, 1], + [3583, 1], + [3582, 1], + [3581, 1], + [3580, 1], + [3579, 1], + [3578, 1], + [3577, 1], + [3576, 1], + [3575, 1], + [3574, 1], + [3573, 1], + [3572, 1], + [3571, 1], + [3570, 1], + [3569, 1], + [3568, 1], + [3567, 1], + [3566, 1], + [3565, 1], + [3564, 1], + [3563, 1], + [3562, 1], + [3561, 1], + [3560, 1], + [3559, 1], + [3558, 1], + [3557, 1], + [3556, 1], + [3555, 1], + [3554, 1], + [3553, 1], + [3552, 1], + [3551, 1], + [3550, 1], + [3549, 1], + [3548, 1], + [3547, 1], + [3546, 1], + [3545, 1], + [3544, 1], + [3543, 1], + [3542, 1], + [3541, 1], + [3540, 1], + [3539, 1], + [3538, 1], + [3537, 1], + [3536, 1], + [3535, 1], + [3534, 1], + [3533, 1], + [3532, 1], + [3531, 1], + [3530, 1], + [3529, 1], + [3528, 1], + [3527, 1], + [3526, 1], + [3525, 1], + [3524, 1], + [3523, 1], + [3522, 1], + [3521, 1], + [3520, 1], + [3519, 1], + [3518, 1], + [3517, 1], + [3516, 1], + [3515, 1], + [3514, 1], + [3513, 1], + [3512, 1], + [3511, 1], + [3510, 1], + [3509, 1], + [3508, 1], + [3507, 1], + [3506, 1], + [3505, 1], + [3504, 1], + [3503, 1], + [3502, 1], + [3501, 1], + [3500, 1], + [3499, 1], + [3498, 1], + [3497, 1], + [3496, 1], + [3495, 1], + [3494, 1], + [3493, 1], + [3492, 1], + [3491, 1], + [3490, 1], + [3489, 1], + [3488, 1], + [3487, 1], + [3486, 1], + [3485, 1], + [3484, 1], + [3483, 1], + [3482, 1], + [3481, 1], + [3480, 1], + [3479, 1], + [3478, 1], + [3477, 1], + [3476, 1], + [3475, 1], + [3474, 1], + [3473, 1], + [3472, 1], + [3471, 1], + [3470, 1], + [3469, 1], + [3468, 1], + [3467, 1], + [3466, 1], + [3465, 1], + [3464, 1], + [3463, 1], + [3462, 1], + [3461, 1], + [3460, 1], + [3459, 1], + [3477, 0, " "], + [3478, 0, "w"], + [3479, 0, "o"], + [3480, 0, "r"], + [3481, 0, "k"], + [3482, 0, "}"], + [3483, 0, "\n"], + [3484, 0, "\n"], + [3485, 0, "\\"], + [3486, 0, "s"], + [3487, 0, "u"], + [3488, 0, "b"], + [3489, 0, "s"], + [3490, 0, "e"], + [3491, 0, "c"], + [3492, 0, "t"], + [3541, 0, "d"], + [3542, 0, "-"], + [3543, 0, "o"], + [3544, 0, "t"], + [3545, 0, "}"], + [3546, 0, "\n"], + [3547, 0, "\n"], + [3548, 0, "A"], + [3549, 0, "l"], + [3550, 0, "g"], + [3551, 0, "o"], + [3552, 0, "r"], + [3553, 0, "i"], + [3554, 0, "t"], + [3555, 0, "h"], + [3556, 0, "m"], + [3557, 0, "s"], + [3558, 0, " "], + [3559, 0, "b"], + [3560, 0, "a"], + [3561, 0, "s"], + [3562, 0, "e"], + [3563, 0, "d"], + [3564, 0, " "], + [3565, 0, "o"], + [3566, 0, "n"], + [3567, 0, " "], + [3568, 0, "\\"], + [3569, 0, "e"], + [3570, 0, "m"], + [3571, 0, "p"], + [3572, 0, "h"], + [3573, 0, "{"], + [3574, 0, "o"], + [3575, 0, "p"], + [3576, 0, "e"], + [3577, 0, "r"], + [3578, 0, "a"], + [3579, 0, "t"], + [3580, 0, "i"], + [3581, 0, "o"], + [3582, 0, "n"], + [3583, 0, "a"], + [3584, 0, "l"], + [3585, 0, " "], + [3586, 0, "t"], + [3587, 0, "r"], + [3588, 0, "a"], + [3589, 0, "n"], + [3590, 0, "s"], + [3591, 0, "f"], + [3592, 0, "o"], + [3593, 0, "r"], + [3594, 0, "m"], + [3595, 0, "a"], + [3596, 0, "t"], + [3597, 0, "i"], + [3598, 0, "o"], + [3599, 0, "n"], + [3600, 0, "}"], + [3601, 0, " "], + [3602, 0, "("], + [3603, 0, "O"], + [3604, 0, "T"], + [3653, 0, "a"], + [3654, 0, "p"], + [3655, 0, "p"], + [3656, 0, "l"], + [3657, 0, "i"], + [3658, 0, "c"], + [3659, 0, "a"], + [3660, 0, "t"], + [3661, 0, "i"], + [3662, 0, "o"], + [3663, 0, "n"], + [3664, 0, "s"], + [3665, 0, "~"], + [3666, 0, "\\"], + [3667, 0, "c"], + [3668, 0, "i"], + [3669, 0, "t"], + [3670, 0, "e"], + [3671, 0, "{"], + [3672, 0, "E"], + [3673, 0, "l"], + [3674, 0, "l"], + [3675, 0, "i"], + [3676, 0, "s"], + [3677, 0, ":"], + [3678, 0, "1"], + [3679, 0, "9"], + [3680, 0, "8"], + [3681, 0, "9"], + [3682, 0, ":"], + [3682, 1], + [3682, 0, "u"], + [3683, 0, "e"], + [3684, 0, ","], + [3685, 0, "R"], + [3686, 0, "e"], + [3687, 0, "s"], + [3688, 0, "s"], + [3689, 0, "e"], + [3690, 0, "l"], + [3691, 0, ":"], + [3692, 0, "1"], + [3693, 0, "9"], + [3694, 0, "9"], + [3695, 0, "6"], + [3696, 0, "w"], + [3697, 0, "x"], + [3698, 0, ","], + [3699, 0, "S"], + [3700, 0, "u"], + [3701, 0, "n"], + [3702, 0, ":"], + [3703, 0, "1"], + [3704, 0, "9"], + [3705, 0, "9"], + [3706, 0, "8"], + [3707, 0, "v"], + [3708, 0, "f"], + [3709, 0, ","], + [3710, 0, "N"], + [3711, 0, "i"], + [3712, 0, "c"], + [3713, 0, "h"], + [3714, 0, "o"], + [3715, 0, "l"], + [3764, 0, "n"], + [3765, 0, "g"], + [3766, 0, "l"], + [3767, 0, "e"], + [3768, 0, " "], + [3769, 0, "o"], + [3770, 0, "r"], + [3771, 0, "d"], + [3772, 0, "e"], + [3773, 0, "r"], + [3774, 0, "e"], + [3775, 0, "d"], + [3776, 0, " "], + [3777, 0, "l"], + [3778, 0, "i"], + [3779, 0, "s"], + [3780, 0, "t"], + [3781, 0, " "], + [3782, 0, "("], + [3783, 0, "o"], + [3784, 0, "f"], + [3785, 0, " "], + [3786, 0, "c"], + [3787, 0, "h"], + [3788, 0, "a"], + [3789, 0, "r"], + [3790, 0, "a"], + [3791, 0, "c"], + [3792, 0, "t"], + [3793, 0, "e"], + [3794, 0, "r"], + [3795, 0, "s"], + [3796, 0, ","], + [3797, 0, " "], + [3798, 0, "f"], + [3799, 0, "o"], + [3800, 0, "r"], + [3801, 0, " "], + [3802, 0, "e"], + [3803, 0, "x"], + [3804, 0, "a"], + [3805, 0, "m"], + [3806, 0, "p"], + [3807, 0, "l"], + [3808, 0, "e"], + [3809, 0, ")"], + [3810, 0, " "], + [3908, 1], + [4028, 1], + [4116, 0, "\n"], + [4117, 0, "\n"], + [4118, 0, "M"], + [4119, 0, "o"], + [4120, 0, "s"], + [4121, 0, "t"], + [4122, 0, " "], + [4123, 0, "d"], + [4124, 0, "e"], + [4125, 0, "p"], + [4126, 0, "l"], + [4127, 0, "o"], + [4128, 0, "y"], + [4129, 0, "e"], + [4130, 0, "d"], + [4131, 0, " "], + [4132, 0, "O"], + [4133, 0, "T"], + [4134, 0, " "], + [4135, 0, "c"], + [4136, 0, "o"], + [4137, 0, "l"], + [4138, 0, "l"], + [4139, 0, "a"], + [4140, 0, "b"], + [4141, 0, "o"], + [4142, 0, "r"], + [4143, 0, "a"], + [4144, 0, "t"], + [4145, 0, "i"], + [4146, 0, "o"], + [4147, 0, "n"], + [4148, 0, " "], + [4149, 0, "s"], + [4150, 0, "y"], + [4151, 0, "s"], + [4152, 0, "t"], + [4153, 0, "e"], + [4154, 0, "m"], + [4155, 0, "s"], + [4156, 0, ","], + [4157, 0, " "], + [4158, 0, "i"], + [4159, 0, "n"], + [4160, 0, "c"], + [4161, 0, "l"], + [4162, 0, "u"], + [4163, 0, "d"], + [4164, 0, "i"], + [4165, 0, "n"], + [4166, 0, "g"], + [4167, 0, " "], + [4168, 0, "G"], + [4169, 0, "o"], + [4170, 0, "o"], + [4171, 0, "g"], + [4172, 0, "l"], + [4173, 0, "e"], + [4174, 0, " "], + [4175, 0, "D"], + [4176, 0, "o"], + [4177, 0, "c"], + [4178, 0, "s"], + [4179, 0, "~"], + [4180, 0, "\\"], + [4181, 0, "c"], + [4182, 0, "i"], + [4183, 0, "t"], + [4184, 0, "e"], + [4185, 0, "{"], + [4186, 0, "D"], + [4187, 0, "a"], + [4188, 0, "y"], + [4189, 0, "R"], + [4190, 0, "i"], + [4191, 0, "c"], + [4192, 0, "h"], + [4193, 0, "t"], + [4194, 0, "e"], + [4195, 0, "r"], + [4196, 0, ":"], + [4197, 0, "2"], + [4198, 0, "0"], + [4199, 0, "1"], + [4200, 0, "0"], + [4201, 0, "t"], + [4202, 0, "t"], + [4203, 0, "}"], + [4204, 0, ","], + [4205, 0, " "], + [4206, 0, "E"], + [4207, 0, "t"], + [4208, 0, "h"], + [4209, 0, "e"], + [4210, 0, "r"], + [4211, 0, "p"], + [4212, 0, "a"], + [4213, 0, "d"], + [4214, 0, "~"], + [4215, 0, "{"], + [4215, 1], + [4215, 0, "\\"], + [4216, 0, "c"], + [4217, 0, "i"], + [4218, 0, "t"], + [4219, 0, "e"], + [4220, 0, "{"], + [4221, 0, "E"], + [4222, 0, "t"], + [4223, 0, "h"], + [4224, 0, "e"], + [4225, 0, "r"], + [4226, 0, "p"], + [4227, 0, "a"], + [4228, 0, "d"], + [4229, 0, ":"], + [4230, 0, "2"], + [4231, 0, "0"], + [4232, 0, "1"], + [4233, 0, "1"], + [4234, 0, "u"], + [4235, 0, "m"], + [4236, 0, "}"], + [4237, 0, ","], + [4238, 0, " "], + [4239, 0, "N"], + [4240, 0, "o"], + [4241, 0, "v"], + [4242, 0, "e"], + [4243, 0, "l"], + [4244, 0, "l"], + [4245, 0, " "], + [4246, 0, "V"], + [4247, 0, "i"], + [4248, 0, "b"], + [4249, 0, "e"], + [4250, 0, "~"], + [4251, 0, "\\"], + [4252, 0, "c"], + [4253, 0, "i"], + [4254, 0, "t"], + [4255, 0, "e"], + [4256, 0, "{"], + [4257, 0, "S"], + [4258, 0, "p"], + [4259, 0, "i"], + [4260, 0, "e"], + [4261, 0, "w"], + [4262, 0, "a"], + [4263, 0, "k"], + [4264, 0, ":"], + [4265, 0, "2"], + [4266, 0, "0"], + [4267, 0, "1"], + [4268, 0, "0"], + [4269, 0, "v"], + [4270, 0, "w"], + [4271, 0, "}"], + [4272, 0, " "], + [4273, 0, "a"], + [4274, 0, "n"], + [4275, 0, "d"], + [4276, 0, " "], + [4277, 0, "A"], + [4278, 0, "p"], + [4279, 0, "a"], + [4280, 0, "c"], + [4281, 0, "h"], + [4282, 0, "e"], + [4283, 0, " "], + [4284, 0, "W"], + [4285, 0, "a"], + [4286, 0, "v"], + [4287, 0, "e"], + [4288, 0, " "], + [4289, 0, "("], + [4290, 0, "f"], + [4291, 0, "o"], + [4292, 0, "r"], + [4293, 0, "m"], + [4294, 0, "e"], + [4295, 0, "r"], + [4296, 0, "l"], + [4297, 0, "y"], + [4298, 0, " "], + [4299, 0, "G"], + [4300, 0, "o"], + [4301, 0, "o"], + [4302, 0, "g"], + [4303, 0, "l"], + [4304, 0, "e"], + [4305, 0, " "], + [4306, 0, "W"], + [4307, 0, "a"], + [4308, 0, "v"], + [4309, 0, "e"], + [4310, 0, "~"], + [4311, 0, "\\"], + [4312, 0, "c"], + [4313, 0, "i"], + [4314, 0, "t"], + [4315, 0, "e"], + [4316, 0, "{"], + [4317, 0, "W"], + [4318, 0, "a"], + [4319, 0, "n"], + [4320, 0, "g"], + [4321, 0, ":"], + [4322, 0, "2"], + [4323, 0, "0"], + [4324, 0, "1"], + [4325, 0, "5"], + [4326, 0, "v"], + [4327, 0, "o"], + [4328, 0, "}"], + [4329, 0, ")"], + [4330, 0, ","], + [4331, 0, " "], + [4332, 0, "r"], + [4333, 0, "e"], + [4334, 0, "l"], + [4335, 0, "y"], + [4336, 0, " "], + [4337, 0, "o"], + [4338, 0, "n"], + [4339, 0, " "], + [4340, 0, "a"], + [4341, 0, " "], + [4342, 0, "s"], + [4343, 0, "i"], + [4344, 0, "n"], + [4345, 0, "g"], + [4346, 0, "l"], + [4347, 0, "e"], + [4348, 0, " "], + [4349, 0, "s"], + [4350, 0, "e"], + [4351, 0, "r"], + [4352, 0, "v"], + [4353, 0, "e"], + [4354, 0, "r"], + [4355, 0, " "], + [4356, 0, "t"], + [4357, 0, "o"], + [4358, 0, " "], + [4359, 0, "d"], + [4360, 0, "e"], + [4361, 0, "c"], + [4362, 0, "i"], + [4363, 0, "d"], + [4364, 0, "e"], + [4365, 0, " "], + [4366, 0, "o"], + [4367, 0, "n"], + [4368, 0, " "], + [4369, 0, "a"], + [4370, 0, " "], + [4371, 0, "t"], + [4372, 0, "o"], + [4373, 0, "t"], + [4374, 0, "a"], + [4375, 0, "l"], + [4376, 0, " "], + [4377, 0, "o"], + [4378, 0, "r"], + [4379, 0, "d"], + [4380, 0, "e"], + [4381, 0, "r"], + [4382, 0, "i"], + [4383, 0, "n"], + [4384, 0, "g"], + [4385, 0, " "], + [4386, 0, "o"], + [4387, 0, "f"], + [4388, 0, " "], + [4389, 0, "o"], + [4390, 0, "p"], + [4391, 0, "e"], + [4392, 0, "r"], + [4393, 0, "a"], + [4394, 0, "t"], + [4395, 0, "i"], + [4396, 0, "o"], + [4397, 0, "n"], + [4398, 0, "s"], + [4399, 0, "~"], + [4400, 0, "\\"], + [4401, 0, "c"], + [4402, 0, "i"], + [4403, 0, "t"], + [4404, 0, "e"], + [4405, 0, "{"], + [4406, 0, "L"], + [4407, 0, "e"], + [4408, 0, "m"], + [4409, 0, "o"], + [4410, 0, "n"], + [4411, 0, "i"], + [4412, 0, "k"], + [4413, 0, ":"], + [4414, 0, "2"], + [4415, 0, "0"], + [4416, 0, "1"], + [4417, 0, "6"], + [4418, 0, "w"], + [4419, 0, "h"], + [4420, 0, "}"], + [4421, 0, ","], + [4422, 0, " "], + [4423, 0, "a"], + [4424, 0, " "], + [4425, 0, "d"], + [4426, 0, "e"], + [4427, 0, "s"], + [4428, 0, "i"], + [4429, 0, "g"], + [4430, 0, "n"], + [4431, 0, " "], + [4432, 0, "d"], + [4433, 0, "e"], + [4434, 0, "c"], + [4435, 0, "i"], + [4436, 0, "s"], + [4437, 0, "i"], + [4438, 0, "o"], + [4439, 0, "n"], + [4440, 0, " "], + [4441, 0, "i"], + [4442, 0, "n"], + [4443, 0, "h"], + [4444, 0, "e"], + [4445, 0, "r"], + [4446, 0, "i"], + [4447, 0, "t"], + [4448, 0, "e"], + [4449, 0, "d"], + [4450, 0, " "], + [4451, 0, "f"], + [4452, 0, "r"], + [4453, 0, "o"], + [4454, 0, "m"], + [4455, 0, " "], + [4456, 0, "t"], + [4457, 0, "h"], + [4458, 0, "e"], + [4459, 0, " "], + [4460, 0, "J"], + [4461, 0, "u"], + [4462, 0, "p"], + [4463, 0, "i"], + [4464, 0, "t"], + [4465, 0, "e"], + [4466, 0, "r"], + [4467, 0, " "], + [4468, 0, "s"], + [4469, 0, "y"], + [4470, 0, "s"], + [4471, 0, "t"], + [4472, 0, "e"], + [4473, 0, "m"], + [4474, 0, "~"], + [4475, 0, "\\"], + [4476, 0, "c"], + [4477, 0, "i"], + [4478, 0, "t"], + [4479, 0, "e"], + [4480, 0, "{"], + [4481, 0, "N"], + [4482, 0, "i"], + [4483, 0, "c"], + [4484, 0, "h"], + [4485, 0, "o"], + [4486, 0, "l"], + [4487, 0, "s"], + [4488, 0, ":"], + [4489, 0, "1"], + [4490, 0, "9"], + [4491, 0, "9"], + [4492, 0, "5"], + [4493, 0, "f"], + [4494, 0, "d"], + [4495, 0, "}"], + [4496, 0, "."], + [4497, 0, " "], + [4498, 0, "T"], + [4499, 0, "h"], + [4500, 0, "i"], + [4501, 0, "s"], + [4502, 0, " "], + [4503, 0, "a"], + [4504, 0, "p"], + [4505, 0, "p"], + [4506, 0, "r"], + [4507, 0, "o"], + [4508, 0, "a"], + [4509, 0, "c"], + [4510, 0, "h"], + [4511, 0, " "], + [4512, 0, "h"], + [4513, 0, "a"], + [4514, 0, "s"], + [4515, 0, " "], + [4516, 0, "t"], + [4517, 0, "h"], + [4518, 0, "e"], + [4519, 0, " "], + [4520, 0, "a"], + [4521, 0, "d"], + [4522, 0, "v"], + [4523, 0, "a"], + [4524, 0, "n"], + [4525, 0, "t"], + [4526, 0, "a"], + [4527, 0, "g"], + [4528, 0, "e"], + [4529, 0, " "], + [4530, 0, "o"], + [4531, 0, "f"], + [4532, 0, " "], + [4533, 0, "m"], + [4534, 0, "a"], + [4535, 0, "k"], + [4536, 0, "i"], + [4537, 0, "n"], + [4538, 0, "g"], + [4539, 0, " "], + [4540, 0, "t"], + [4541, 0, "h"], + [4542, 0, "e"], + [4543, 0, " "], + [4544, 0, "t"], + [4545, 0, "r"], + [4546, 0, "a"], + [4547, 0, "n"], + [4548, 0, "s"], + [4549, 0, "o"], + [4550, 0, "f"], + [4550, 1], + [4549, 1], + [4549, 0, "f"], + [4550, 0, "o"], + [4551, 0, "r"], + [4552, 0, "m"], + [4553, 0, "a"], + [4554, 0, "t"], + [4555, 0, "i"], + [4556, 0, "o"], + [4557, 0, "n"], + [4558, 0, " "], + [4559, 0, "f"], + [4560, 0, "u"], + [4561, 0, "n"], + [4562, 0, "c"], + [4563, 0, "t"], + [4564, 0, "i"], + [4565, 0, "o"], + [4566, 0, "n"], + [4567, 0, "s"], + [4568, 0, " "], + [4569, 0, "s"], + [4570, 0, "i"], + [4571, 0, "m"], + [4572, 0, "p"], + [4573, 0, "l"], + [4574, 0, "e"], + [4575, 0, "r"], + [4576, 0, " "], + [4577, 0, "a"], + [4578, 0, "n"], + [4579, 0, "d"], + [4580, 0, " "], + [4581, 0, "l"], + [4582, 0, "e"], + [4583, 0, "s"], + [4584, 0, "s"], + [4585, 0, " "], + [4586, 0, "e"], + [4587, 0, "r"], + [4588, 0, "r"], + [4589, 0, "o"], + [4590, 0, "r"], + [4591, 0, "-"], + [4592, 0, "p"], + [4593, 0, "r"], + [4594, 0, "o"], + [4595, 0, "n"], + [4596, 0, "e"], + [4597, 0, "~"], + [4598, 0, "\\"], + [4599, 0, "c"], + [4600, 0, "i"], + [4601, 0, "t"], + [4602, 0, "e"], + [4603, 0, "{"], + [4604, 0, "I"], + [4605, 0, "m"], + [4606, 0, "i"], + [4607, 0, "n"], + [4608, 0, "e"], + [4609, 0, ":"], + [4610, 0, "2"], + [4611, 0, "0"], + [4612, 0, "0"], + [4613, 0, "3"], + [4614, 0, "k"], + [4615, 0, "s"], + [4616, 0, "}"], + [4617, 0, ","], + [4618, 0, " "], + [4619, 0, "b"], + [4620, 0, "u"], + [4621, 0, "t"], + [4622, 0, " "], + [4623, 0, "i"], + [4624, 0, "t"], + [4625, 0, " "], + [4626, 0, "d"], + [4627, 0, "o"], + [4628, 0, "e"], + [4629, 0, "s"], + [4630, 0, " "], + [4631, 0, "n"], + [4632, 0, "o"], + [4633, 0, "t"], + [4634, 0, " "], + [4635, 0, "m"], + [4636, 0, "e"], + [4637, 0, "e"], + [4638, 0, "t"], + [4639, 0, " "], + [4640, 0, "o"], + [4641, 0, "u"], + [4642, 0, "r"], + [4643, 0, " "], + [4644, 0, "r"], + [4645, 0, "e"], + [4646, 0, "q"], + [4647, 0, "u"], + [4648, 0, "i"], + [4649, 0, "r"], + [4650, 0, "e"], + [4651, 0, "m"], + [4652, 0, "e"], + [4653, 0, "n"], + [4654, 0, "t"], + [4655, 0, "s"], + [4656, 0, ","], + [4657, 0, " "], + [4658, 0, "s"], + [4659, 0, "i"], + [4660, 0, "n"], + [4661, 0, "c"], + [4662, 0, "e"], + [4663, 0, " "], + [4664, 0, "w"], + [4665, 0, "e"], + [4666, 0, " "], + [4667, 0, "w"], + [4668, 0, "a"], + [4669, 0, "n"], + [4670, 0, "t"], + [4671, 0, " "], + [4672, 0, "t"], + [4673, 0, "o"], + [4674, 0, " "], + [4675, 0, "s"], + [4676, 0, "u"], + [4677, 0, "p"], + [4678, 0, "p"], + [4679, 0, "o"], + [4680, 0, "r"], + [4681, 0, "t"], + [4682, 0, " "], + [4683, 0, "p"], + [4684, 0, "e"], + [4685, 0, "e"], + [4686, 0, "r"], + [4687, 0, "-"], + [4688, 0, "t"], + [4689, 0, "o"], + [4690, 0, "-"], + [4691, 0, "p"], + [4692, 0, "e"], + [4693, 0, "e"], + [4694, 0, "r"], + [4695, 0, " "], + [4696, 0, "c"], + [4697, 0, "o"], + [4698, 0, "l"], + [4699, 0, "l"], + [4700, 0, "a"], + [4701, 0, "b"], + [4702, 0, "o"], + [4703, 0, "r"], + [4704, 0, "a"], + [4705, 0, "t"], + [4706, 0, "i"], + [4707, 0, "o"], + [4708, 0, "n"], + [4709, 0, " "], + [4710, 0, "w"], + [4711, 0, "i"], + [4712, 0, "t"], + [4713, 0, "h"], + [4714, 0, "o"], + [4715, 0, "u"], + [4716, 0, "t"], + [4717, 0, " "], + [4718, 0, "r"], + [4719, 0, "e"], + [4720, 0, "q"], + [4721, 0, "u"], + [4722, 0, "i"], + [4723, 0, "r"], + [4724, 0, "i"], + [4725, 0, "n"], + [4726, 0, "g"], + [4727, 0, " "], + [4728, 0, "a"], + [4729, 0, " "], + [4730, 0, "s"], + [4731, 0, "i"], + [4732, 0, "n"], + [4733, 0, "g"], + [4734, 0, "l"], + [4735, 0, "e"], + [4736, 0, " "], + [4737, 0, "s"], + [4738, 0, "e"], + [4739, 0, "r"], + [4740, 0, "v"], + [4741, 0, "e"], + [4742, 0, "r"], + [4743, 0, "."], + [4744, 0, "\n"], + [4745, 0, "\n"], + [4746, 0, "M"], + [4747, 0, "a"], + [4748, 0, "n"], + [4749, 0, "y"], + [4750, 0, " "], + [4751, 0, "s"], + [4752, 0, "e"], + [4753, 0, "c"], + [4754, 0, "u"], + [4755, 0, "r"], + [4756, 0, "e"], + [4757, 0, " "], + [4758, 0, "m"], + [4759, 0, "e"], + [4760, 0, "s"], + [4761, 0, "s"], + [4762, 0, "a"], + [4763, 0, "g"], + [4764, 0, "i"], + [4765, 0, "n"], + [4766, 0, "g"], + [4767, 0, " "], + [4768, 0, "p"], + [4769, 0, "r"], + [4770, 0, "o"], + [4771, 0, "t"], + [4772, 0, "o"], + [4773, 0, "c"], + [4774, 0, "o"], + [4775, 0, "l"], + [4776, 0, "s"], + [4777, 0, ","], + [4778, 0, " "], + [4779, 0, "w"], + [4780, 0, "h"], + [4781, 0, "i"], + [4782, 0, "c"], + [4783, 0, "h"], + [4784, 0, " "], + [4785, 0, "w"], + [4786, 0, "e"], + [4787, 0, " "], + [4788, 0, "p"], + [4789, 0, "l"], + [4790, 0, "a"], + [4791, 0, "n"], + [4792, 0, " "], + [4793, 0, "t"], + [4794, 0, "o"], + [4795, 0, " "], + [4796, 0, "u"], + [4797, 0, "s"], + [4798, 0, "e"], + [4799, 0, " "], + [4800, 0, "f"], + [4801, 0, "o"], + [4802, 0, "r"], + [4803, 0, " "], + [4804, 0, "e"], + [4805, 0, "n"], + [4806, 0, "c"], + [4807, 0, "r"], + [4808, 0, "y"], + [4809, 0, "p"], + [4810, 0, "t"], + [4811, 0, "e"], + [4812, 0, "d"], + [4813, 0, " "], + [4814, 0, "c"], + [4815, 0, "o"], + [4816, 0, "l"], + [4817, 0, "l"], + [4818, 0, "a"], + [4819, 0, "b"], + [4820, 0, "o"], + [4821, 0, "r"], + [4822, 0, "a"], + [4823, 0, "t"], + [4824, 0, "i"], + [4825, 0, "o"], + [4826, 0, "n"], + [4827, 0, ","], + [4828, 0, " "], + [4829, 0, "d"], + [4830, 0, "o"], + [4831, 0, " "], + [4832, 0, "n"], + [4833, 0, "o"], + [4834, 0, "t"], + [4835, 0, " "], + [4836, 0, "g"], + [4837, 0, "u"], + [4838, 0, "a"], + [4839, 0, "r"], + [4840, 0, "a"], + [4841, 0, "n"], + [4842, 0, "t"], + [4843, 0, "e"], + [4844, 0, "e"], + [4845, 0, " "], + [4846, 0, "t"], + [4847, 0, "h"], + [4848, 0, "a"], + [4849, 0, "t"], + [4850, 0, " "], + [4851, 0, "d"], + [4852, 0, "i"], + [4853, 0, "f"], + [4854, 0, "f"], + [4855, 0, "e"], + [4856, 0, "r"], + [4857, 0, "e"], + [4858, 0, "n"], + [4859, 0, "t"], + [4860, 0, " "], + [4861, 0, "r"], + [4862, 0, "e"], + [4863, 0, "c"], + [4864, 0, "i"], + [4865, 0, "p"], + [4866, 0, "i"], + [4867, 0, "e"], + [4868, 0, "n"], + [4869, 0, "t"], + [4870, 0, "s"], + [4871, 0, " "], + [4872, 0, "w"], + [4873, 0, "i"], + [4874, 0, "l"], + [4875, 0, "l"], + [4876, 0, " "], + [4877, 0, "s"], + [4878, 0, "e"], + [4879, 0, "e"], + [4880, 0, " "], + [4881, 0, "m"], + [4882, 0, "e"], + [4883, 0, "s"], + [4884, 0, "s"], + [4885, 0, "a"], + [4886, 0, "g"], + [4887, 0, "e"], + [4888, 0, "s"], + [4889, 0, " "], + [4890, 0, "i"], + [4891, 0, "n"], + [4892, 0, " "], + [4893, 0, "t"], + [4894, 0, "h"], + [4895, 0, "e"], + [4896, 0, " "], + [4897, 0, "s"], + [4898, 0, "a"], + [4899, 0, "m"], + [4900, 0, "e"], + [4901, 0, " "], + [4902, 0, "o"], + [4903, 0, "r"], + [4904, 0, "d"], + [4905, 0, "e"], + [4906, 0, "r"], + [4907, 0, "~"], + [4908, 0, "\\"], + [4909, 0, "c"], + [4910, 0, "i"], + [4911, 0, "t"], + [4912, 0, "e"], + [4913, 0, "{"], + [4914, 0, "U"], + [4915, 0, "n"], + [4916, 0, "g"], + [4917, 0, "e"], + [4918, 0, "r"], + [4919, 0, ":"], + [4920, 0, "2"], + [4921, 0, "0"], + [4922, 0, "1"], + [4923, 0, "5"], + [4924, 0, "k"], + [4925, 0, "g"], + [4926, 0, "}"], + [4927, 0, "."], + [4928, 0, " "], + [4929, 0, "A"], + [4930, 0, "l"], + [4931, 0, "t"], + [4932, 0, "h"], + [4933, 0, "o"], + [4934, 0, "u"], + [4935, 0, "g"], + [4936, 0, "h"], + [4937, 0, " "], + [4938, 0, "i"], + [4939, 0, "t"], + [4940, 0, " "], + [4941, 0, "i"], + [4942, 0, "s"], + [4943, 0, " "], + [4944, 0, "p"], + [4945, 0, "o"], + [4946, 0, "s"], + [4947, 0, "s"], + [4948, 0, "i"], + [4949, 0, "b"], + [4950, 0, "l"], + [4951, 0, "e"], + [4952, 0, " "], + [4953, 0, "t"], + [4954, 0, "o"], + [4955, 0, " "], + [4956, 0, "d"], + [4957, 0, "e"], + [4958, 0, "c"], + [4959, 0, "i"], + [4960, 0, "d"], + [4961, 0, "e"], + [4962, 0, " "], + [4963, 0, "o"], + [4964, 0, "n"], + [4965, 0, " "], + [4966, 0, "a"], + [4967, 0, " "], + [4968, 0, "t"], + [4969, 0, "o"], + [4970, 0, "t"], + [4971, 0, "l"], + [4972, 0, "a"], + [4973, 0, " "], + [4973, 1], + [4972, 1], + [4971, 1], + [4971, 0, "a"], + [4972, 0, "l"], + [4973, 0, " "], + [4974, 0, "o"], + [4975, 0, "r"], + [4976, 0, "d"], + [4977, 0, "e"], + [4978, 0, "r"], + [4979, 0, "i"], + [4980, 0, "n"], + [4981, 0, "g"], + [4982, 0, " "], + [4983, 0, "o"], + [4984, 0, "f"], + [4985, 0, " "], + [4986, 0, "o"], + [4987, 0, "p"], + [4988, 0, "e"], + [4989, 0, "r"], + [4990, 0, "a"], + [4991, 0, "t"], + [4992, 0, "i"], + [4993, 0, "o"], + [4994, 0, "n"], + [4995, 0, "s"], + [4996, 0, " "], + [4997, 0, "b"], + [4998, 0, "y"], + [4999, 0, " "], + [5000, 0, "u"], + [5001, 0, "s"], + [5002, 0, "i"], + [5003, 0, "n"], + [5004, 0, "g"], + [5005, 0, " "], + [5006, 0, "a"], + [5007, 0, "n"], + [5008, 0, " "], + [5009, 0, "a"], + [5010, 0, "t"], + [5011, 0, "o"], + [5012, 0, "m"], + [5013, 0, "i"], + [5014, 0, "c"], + [5015, 0, " "], + [5016, 0, "b"], + [5017, 0, "r"], + [5018, 0, "o"], + [5019, 0, "a"], + [5020, 0, "d"], + [5021, 0, "c"], + [5022, 0, "a"], + [5023, 0, "s"], + [5024, 0, "t"], + [5025, 0, " "], + [5026, 0, "p"], + [5027, 0, "r"], + [5028, 0, "o"], + [5029, 0, "t"], + [5030, 0, "o"], + [5031, 0, "c"], + [5032, 0, "o"], + [5033, 0, "l"], + [5034, 0, "~"], + [5035, 0, "\\"], + [5036, 0, "c"], + [5037, 0, "i"], + [5038, 0, "t"], + [5039, 0, "e"], + [5040, 0, "{"], + [5041, 0, "D"], + [5042, 0, "e"], + [5043, 0, "f"], + [5044, 0, "a"], + [5045, 0, "g"], + [5046, 0, "o"], + [5047, 0, ":"], + [5048, 0, "2"], + [5049, 0, "0"], + [5050, 0, "0"], + [5051, 0, "4"], + [5052, 0, "j"], + [5053, 0, "i"], + [5054, 0, "}"], + [5055, 0, ","], + [5056, 0, " "], + [5057, 0, "w"], + [5058, 0, "h"], + [5059, 0, "i"], + [5060, 0, "c"], + [5061, 0, "h"], + [5062, 0, " "], + [5063, 0, "a"], + [5064, 0, "v"], + [5065, 0, "o"], + [5066, 0, "i"], + [5067, 0, "d"], + [5068, 0, "s"], + [5069, 0, " "], + [5070, 0, "r"], + [5071, 0, "e"], + [5072, 0, "l"], + [5073, 0, "y"], + [5074, 0, "i"], + [5075, 0, "n"], + [5076, 0, "g"], + [5077, 0, " "], + [5078, 0, "o"], + [5079, 0, "n"], + [5080, 0, " "], + [5081, 0, "a"], + [5082, 0, " "], + [5083, 0, "s"], + [5084, 0, "i"], + [5085, 0, "n"], + [5086, 0, "g"], + [5087, 0, "l"], + [5088, 0, "e"], + [5089, 0, " "], + [5090, 0, "s"], + [5091, 0, "e"], + [5092, 0, "r"], + [5093, 0, "v"], + [5094, 0, "e"], + [5095, 0, "r"], + [5096, 0, ","], + [5097, 0, " "], + [5098, 0, "s"], + [5099, 0, "u"], + [5100, 0, "c"], + [5101, 0, "h"], + [5102, 0, " "], + [5103, 0, "p"], + [5104, 0, "r"], + [5105, 0, "o"], + [5106, 0, "t"], + [5107, 0, "o"], + [5108, 0, "c"], + [5109, 0, "o"], + [5110, 0, "l"], + [5111, 0, "s"], + [5112, 0, " "], + [5113, 0, "a"], + [5114, 0, "r"], + [5115, 0, "e"], + [5116, 0, " "], + [5117, 0, "e"], + [5118, 0, "q"], + [5119, 0, "u"], + [5120, 0, "i"], + [5121, 0, "v"], + [5122, 0, "a"], + [5123, 0, "l"], + [5124, 0, "e"], + [5125, 0, "n"], + [5126, 0, "t"], + [5127, 0, " "], + [5128, 0, "t"], + [5129, 0, "o"], + [5130, 0, " "], + [5131, 0, "c"], + [5132, 0, "o"], + [5133, 0, "n"], + [5134, 0, "s"], + [5135, 0, "e"], + [5136, 0, "n"], + [5137, 0, "s"], + [5138, 0, "u"], + [5139, 0, "s"], + [5140, 0, "~"], + [5141, 0, "\\"], + [5142, 0, "c"], + [5143, 0, "i"], + [5144, 0, "t"], + [5145, 0, "e"], + [5146, 0, "{"], + [5147, 0, "C"], + [5148, 0, "h"], + [5149, 0, "a"], + [5150, 0, "n"], + [5151, 0, "d"], + [5152, 0, "r"], + [5153, 0, "a"], + [5154, 0, ":"], + [5155, 0, "1"], + [5156, 0, "9"], + [5157, 0, "9"], + [5158, 0, "6"], + [5159, 0, "c"], + [5160, 0, "p"], + [5161, 0, "}"], + [5162, 0, ","], + [5163, 0, " "], + [5164, 0, "s"], + [5165, 0, "o"], + [5166, 0, " "], + [5167, 0, "t"], + [5168, 0, "h"], + [5169, 0, "e"], + [5170, 0, "y"], + [5171, 0, " "], + [5172, 0, "c"], + [5173, 0, "a"], + [5174, 0, "n"], + [5175, 0, " "], + [5176, 0, "o"], + [5177, 0, "n"], + [5178, 0, "l"], + [5179, 0, "y"], + [5180, 0, " "], + [5181, 0, "s"], + [5182, 0, "a"], + [5183, 0, "f"], + [5184, 0, "e"], + [5185, 0, "l"], + [5186, 0, "y"], + [5187, 0, " "], + [5188, 0, "m"], + [5189, 0, "a"], + [5190, 0, "k"], + [5191, 0, "e"], + [5192, 0, " "], + [5193, 0, "p"], + [5194, 0, "r"], + [5195, 0, "o"], + [5196, 0, "g"], + [5197, 0, "r"], + [5198, 0, "e"], + [5199, 0, "s"], + [5200, 0, "s"], + [5201, 0, " "], + [5202, 0, "i"], + [5203, 0, "f"], + [5204, 0, " "], + [5205, 0, "a"], + [5206, 0, " "], + [5207, 0, "m"], + [5208, 0, "a"], + [5209, 0, "j"], + [5210, 0, "o"], + [5211, 0, "r"], + [5212, 0, "i"], + [5213, 0, "t"], + [5214, 0, "y"], + [5215, 0, " "], + [5216, 0, "o"], + [5217, 0, "f"], + [5218, 0, " "], + [5219, 0, "p"], + [5220, 0, "a"], + [5221, 0, "r"], + [5222, 0, "t"], + [5223, 0, "i"], + [5224, 0, "c"], + [5225, 0, "i"], + [5226, 0, "p"], + [5227, 0, "a"], + [5228, 0, "n"], + [5229, 0, "t"], + [5230, 0, "s"], + [5231, 0, " "], + [5232, 0, "a"], + [5233, 0, "r"], + [5234, 0, "e"], + [5235, 0, " "], + [5236, 0, "o"], + [5237, 0, "n"], + [5238, 0, "l"], + [5239, 0, "i"], + [5240, 0, "n"], + [5241, 0, "e"], + [5242, 0, " "], + [5243, 0, "a"], + [5244, 0, "n"], + [5245, 0, "d"], + [5246, 0, " "], + [5247, 0, "r"], + [5248, 0, "e"], + [5249, 0, "a"], + [5250, 0, "c"], + [5251, 0, "h"], + [5252, 0, "a"], + [5253, 0, "b"], + [5254, 0, "l"], + [5255, 0, "e"], + [5256, 0, "."], + [5257, 0, " "], + [5258, 0, "W"], + [5259, 0, "e"], + [5260, 0, " "], + [5261, 0, "e"], + [5262, 0, "x"], + [5263, 0, "p"], + [5264, 0, "e"], + [5265, 0, "c"], + [5266, 0, "t"], + [5267, 0, " "], + [5268, 0, "t"], + [5269, 0, "h"], + [5270, 0, "a"], + [5271, 0, "t"], + [5272, 0, " "], + [5273, 0, "i"], + [5274, 0, "n"], + [5275, 0, " "], + [5276, 0, "p"], + [5277, 0, "e"], + [5278, 0, "e"], + [5279, 0, "r"], + [5280, 0, "-"], + [5281, 0, "t"], + [5282, 0, "o"], + [5283, 0, "-"], + [5284, 0, "p"], + [5285, 0, "e"], + [5286, 0, "e"], + [5287, 0, "r"], + [5288, 0, " "], + [5289, 0, "s"], + [5290, 0, "y"], + [5291, 0, "s"], + [5292, 0, "t"], + [5293, 0, "e"], + [5294, 0, "m"], + [5295, 0, "s"], + [5296, 0, " "], + [5297, 0, "o"], + [5298, 0, "f"], + [5299, 0, " "], + [5300, 0, "m"], + [5301, 0, "o"], + [5302, 0, "b"], + [5303, 0, "i"], + [5304, 0, "l"], + [5305, 0, "e"], + [5306, 0, " "], + [5307, 0, "d"], + [5308, 0, "e"], + [5309, 0, "v"], + [5310, 0, "i"], + [5311, 0, "c"], + [5312, 0, "e"], + [5313, 0, "s"], + [5314, 0, " "], + [5315, 0, "i"], + [5316, 0, "t"], + [5317, 0, " "], + [5318, 0, "w"], + [5319, 0, "i"], + [5320, 0, "l"], + [5321, 0, "l"], + [5322, 0, " "], + [5323, 0, "f"], + [5324, 0, "r"], + [5325, 0, "e"], + [5326, 0, "q"], + [5327, 0, "u"], + [5328, 0, "e"], + [5329, 0, "n"], + [5330, 0, "t"], + [5331, 0, "l"], + [5332, 0, "y"], + [5333, 0, " "], + [5334, 0, "b"], + [5335, 0, "e"], + [5336, 0, " "], + [5337, 0, "t"], + [5338, 0, "h"], + [5339, 0, "e"], + [5340, 0, " "], + [5341, 0, "c"], + [5342, 0, "a"], + [5343, 0, "s"], + [5344, 0, "e"], + [5345, 0, " "], + [5346, 0, "t"], + [5347, 0, "h"], + [5348, 0, "a"], + [5349, 0, "t"], + [5350, 0, " "], + [5351, 0, "o"], + [5352, 0, "n"], + [5353, 0, "l"], + [5354, 0, "y"], + [5355, 0, " "], + [5356, 0, "a"], + [5357, 0, " "], + [5358, 0, "m"], + [5359, 0, "i"], + [5360, 0, "n"], + [5361, 0, "o"], + [5362, 0, "r"], + [5363, 0, "i"], + [5364, 0, "t"], + [5365, 0, "y"], + [5366, 0, " "], + [5367, 0, "o"], + [5368, 0, "f"], + [5369, 0, " "], + [5370, 0, "p"], + [5371, 0, "a"], + [5372, 0, "r"], + [5373, 0, "t"], + [5374, 0, "i"], + [5375, 0, "c"], + [5376, 0, "i"], + [5377, 0, "p"], + [5378, 0, "a"], + [5379, 0, "n"], + [5380, 0, "t"], + [5381, 0, "s"], + [5382, 0, " "], + [5383, 0, "a"], + [5384, 0, "r"], + [5385, 0, "e"], + [5386, 0, " "], + [5387, 0, "o"], + [5388, 0, "n"], + [5389, 0, "l"], + [5390, 0, "i"], + [5391, 0, "n"], + [5392, 0, "e"], + [5393, 0, " "], + [5394, 0, "a"], + [5395, 0, "t"], + [5396, 0, " "], + [5397, 0, "t"], + [5398, 0, "h"], + [5399, 0, "e"], + [5400, 0, " "], + [5401, 0, "s"], + [5402, 0, "a"], + [5403, 0, "m"], + [5404, 0, "e"], + [5405, 0, " "], + [5406, 0, "t"], + [5407, 0, "i"], + [5408, 0, "m"], + [5409, 0, "e"], + [5410, 0, ","], + [5411, 0, " "], + [5412, 0, "a"], + [5413, 0, "n"], + [5414, 0, "d"], + [5415, 0, " "], + [5416, 0, "s"], + [5417, 0, "o"], + [5418, 0, " "], + [5419, 0, "a"], + [5420, 0, "n"], + [5421, 0, "y"], + [5422, 0, " "], + [5423, 0, "a"], + [5424, 0, "l"], + [5425, 0, "g"], + [5426, 0, "o"], + [5427, 0, "r"], + [5428, 0, "i"], + [5429, 0, "t"], + [5430, 0, "h"], + [5431, 0, "m"], + [5432, 0, "s"], + [5432, 1], + [5432, 0, " "], + [5433, 0, "r"], + [5434, 0, "e"], + [5435, 0, "q"], + [5436, 0, "u"], + [5437, 0, "i"], + [5438, 0, "r"], + [5439, 0, "i"], + [5440, 0, "n"], + [5441, 0, "g"], + [5442, 0, " "], + [5443, 0, "a"], + [5444, 0, "t"], + [5445, 0, "o"], + [5446, 0, "m"], + [5447, 0, "i"], + [5448, 0, "c"], + [5449, 0, " "], + [5450, 0, "b"], + [5451, 0, "r"], + [5452, 0, "o"], + [5453, 0, "a"], + [5454, 0, "d"], + [5455, 0, "c"], + [5456, 0, "a"], + [5457, 0, "s"], + [5458, 0, "t"], + [5459, 0, " "], + [5460, 0, "w"], + [5461, 0, "o"], + [5462, 0, "u"], + [5463, 0, "l"], + [5464, 0, "d"], + [5465, 0, " "], + [5466, 0, "b"], + [5467, 0, "e"], + [5468, 0, "c"], + [5469, 0, "o"], + [5470, 0, "m"], + [5471, 0, "e"], + [5472, 0, " "], + [5473, 0, "u"], + [5474, 0, "n"], + [5475, 0, "a"], + [5476, 0, "v"], + [5477, 0, "a"], + [5478, 0, "i"], + [5479, 0, "l"], + [5480, 0, "a"], + [5481, 0, "b"], + [5482, 0, "l"], + [5483, 0, "e"], + [5484, 0, "."], + [5485, 0, " "], + [5486, 0, "T"], + [5487, 0, "h"], + [5488, 0, "e"], + [5489, 0, " "], + [5490, 0, "s"], + [5491, 0, "t"], + [5492, 0, "r"], + [5493, 0, "o"], + [5494, 0, "n"], + [5495, 0, "g"], + [5496, 0, "e"], + [5497, 0, "s"], + [5498, 0, "t"], + [5499, 0, " "], + [5500, 0, "g"], + [5501, 0, "u"], + [5502, 0, "a"], + [5503, 0, "r"], + [5504, 0, "a"], + [5505, 0, "n"], + [5506, 0, "t"], + [5507, 0, "e"], + [5508, 0, "e"], + [5509, 0, " "], + [5510, 0, "s"], + [5511, 0, "u"], + [5512, 0, "c"], + [5513, 0, "h"], + [5514, 0, " "], + [5515, 0, "a"], + [5516, 0, " "], + [5517, 0, "s"], + [5518, 0, "y"], + [5519, 0, "s"], + [5520, 0, "t"], + [5521, 0, "e"], + [5522, 0, "m"], + [5523, 0, " "], + [5524, 0, "c"], + [5525, 0, "a"], + [5526, 0, "n"], + [5527, 0, " "], + [5528, 0, "g"], + [5529, 0, "i"], + [5530, 0, "v"], + [5531, 0, "e"], + [5532, 0, " "], + [5533, 0, "i"], + [5534, 0, "s"], + [5535, 0, " "], + [5536, 0, "c"], + [5537, 0, "a"], + [5538, 0, "u"], + [5539, 0, "s"], + [5540, 0, "a"], + [5541, 0, "l"], + [5542, 0, " "], + [5543, 0, "o"], + [5544, 0, "r"], + [5545, 0, "d"], + [5546, 0, "e"], + [5547, 0, "r"], + [5548, 0, "i"], + [5549, 0, "n"], + [5550, 0, "g"], + [5551, 0, "~"], + [5552, 0, "]"], + [5552, 1], + [5552, 0, "\\"], + [5553, 0, "c"], + [5554, 0, "i"], + [5555, 0, "t"], + [5556, 0, "e"], + [5557, 0, "{"], + [5558, 0, "A"], + [5559, 0, "t"], + [5560, 0, "t"], + [5561, 0, "i"], + [5562, 0, "y"], + [5563, 0, "a"], + [5564, 0, ":"], + [5565, 0, "2"], + [5566, 0, "0"], + [5567, 0, "1"], + [5568, 0, "5"], + [5569, 0, "d"], + [5570, 0, "m"], + [5571, 0, "}"], + [5572, 0, "."], + [5573, 0, "\n"], + [5574, 0, "\n"], + [5575, 0, "T"], + [5576, 0, "h"], + [5577, 0, "e"], + [5578, 0, " "], + [5579, 0, "G"], + [5580, 0, "o"], + [5581, 0, "o"], + [5582, 0, "g"], + [5583, 0, "l"], + [5584, 0, "e"], + [5585, 0, " "], + [5586, 0, "R"], + [5587, 0, "e"], + [5588, 0, "a"], + [5589, 0, "l"], + [5590, 0, "t"], + [5591, 0, "i"], + [5592, 0, "m"], + [5593, 0, "e"], + [5594, 0, " "], + [5595, 0, "A"], + [5596, 0, "P"], + [5597, 0, "I"], + [5598, 0, "~"], + [5599, 0, "\\"], + [5600, 0, "c"], + [5601, 0, "i"], + [5602, 0, "t"], + [5603, 0, "e"], + [5604, 0, "{"], + [5605, 0, "G"], + [5606, 0, "o"], + [5607, 0, "o"], + [5608, 0, "g"], + [5609, 0, "o"], + [5609, 1], + [5609, 0, "l"], + [5610, 0, "e"], + [5611, 0, ":"], + [5612, 0, "2"], + [5613, 0, "0"], + [5614, 0, "1"], + [5615, 0, "5"], + [5616, 0, "v"], + [5617, 0, "k"], + [5618, 0, "}"], + [5619, 0, " "], + [5620, 0, "i"], + [5621, 0, "s"], + [5622, 0, " "], + [5623, 0, "t"], + [5624, 0, "h"], + [5625, 0, "e"], + [5626, 0, " "], + [5627, 0, "o"], + [5628, 0, "n"], + [5629, 0, "l"], + [5630, 0, "y"], + [5631, 0, " "], + [5632, 0, "i"], + [5633, 0, "m"], + [5634, 0, "p"], + [5635, 0, "l"], + [5636, 0, "e"], + [5637, 0, "m"], + [5638, 0, "e"], + [5639, 0, "n"], + [5640, 0, "t"], + [5641, 0, "a"], + [5642, 0, "t"], + [5643, 0, "i"], + [5644, 0, "o"], + [5645, 0, "n"], + [5646, 0, " "], + [5647, 0, "o"], + [5648, 0, "f"], + [5649, 0, " "], + [5650, 0, "O"], + [5651, 0, "T"], + [5652, 0, " "], + [5653, 0, "o"], + [5654, 0, "f"], + [5655, 0, " "], + [5656, 0, "w"], + [5657, 0, "h"], + [5658, 0, "i"], + [5659, 0, "c"], + [5660, 0, "h"], + [5661, 0, " "], + [5662, 0, "w"], + [5663, 0, "e"], + [5664, 0, " "], + [5665, 0, "a"], + [5666, 0, "r"], + [5667, 0, "e"], + [5668, 0, " "], + [5669, 0, "a"], + [5670, 0, "w"], + [5671, 0, "a"], + [5672, 0, "r"], + [5673, 0, "e"], + [5674, 0, " "], + [5675, 0, "t"], + [5676, 0, "h"], + [5677, 0, "a"], + [5678, 0, "t"], + [5679, 0, " "], + [5623, 0, "t"], + [5624, 0, "o"], + [5625, 0, " "], + [5626, 0, "o"], + [5627, 0, "u"], + [5628, 0, "r"], + [5629, 0, " "], + [5630, 0, "k"], + [5631, 0, "n"], + [5632, 0, "o"], + [5633, 0, "w"], + [5634, 0, "l"], + [5635, 0, "e"], + [5636, 0, "d"], + [5637, 0, "g"], + [5638, 0, "e"], + [5639, 0, " "], + [5691, 1], + [5690, 1], + [5689, 1], + [5688, 1], + [5687, 1], + [5686, 1], + [5685, 1], + [5684, 1], + [5683, 1], + [5682, 1], + [5681, 1], + [5680, 1], + [5679, 1], + [5678, 1], + [5677, 1], + [5676, 1], + [5675, 1], + [5674, 1], + [5673, 1], + [5672, 1], + [5671, 1], + [5670, 1], + [5675, 0, "s"], + [5676, 0, "u"], + [5677, 0, "p"], + [5678, 0, "p"], + [5679, 0, "o"], + [5680, 0, "r"], + [5681, 0, "t"], + [5682, 0, "s"], + [5683, 0, " "], + [5684, 0, "a"], + [5685, 0, "r"], + [5686, 0, "b"], + [5687, 0, "i"], + [5688, 0, "t"], + [5689, 0, "r"], + [5690, 0, "a"], + [5691, 0, "r"], + [5692, 0, "y"], + [5693, 0, " "], + [5694, 0, "n"], + [5695, 0, "e"], + [5696, 0, "s"], + [5697, 0, "t"], + [5698, 0, "i"], + [5699, 0, "n"], + [5700, 0, "g"], + [5701, 0, " "], + [5702, 0, "o"], + [5703, 0, "f"], + [5704, 0, " "], + [5705, 0, "l"], + [5706, 0, "i"], + [5707, 0, "s"], + [5708, 0, "t"], + [5709, 0, "s"], + [5710, 0, " "], + [5711, 0, "a"], + [5712, 0, "n"], + [5713, 0, "d"], + [5714, 0, " "], + [5715, 0, "m"], + [5716, 0, "a"], + [5717, 0, "p"], + [5718, 0, "s"], + [5719, 0, "."], + [5720, 0, " "], + [5721, 0, "L"], + [5722, 0, "i"], + [5723, 0, "k"], + [5724, 0, "e"], + [5725, 0, " "], + [5726, 0, "G"], + [5727, 0, "o"], + [5728, 0, "o"], + [5729, 0, "g"], + [5730, 0, "l"], + [5731, 0, "e"], + [5732, 0, " "], + [5733, 0, "D"], + [5734, 0, "o"], + [5735, 0, "c"], + [5736, 0, "s"], + [5737, 0, ","], + [5738, 0, " "], + [5739, 0, "i"], + [5740, 0, "t"], + [5741, 0, " "], + [5742, 0, "r"], + [5743, 0, "e"], + [5744, 0, "l"], + [5745, 0, "i"], + [5746, 0, "e"], + [5747, 0, "s"], + [5748, 0, " "], + [5749, 0, "o"], + [5750, 0, "n"], + [5751, 0, " "], + [5752, 0, "a"], + [5753, 0, " "], + [5754, 0, "s"], + [5755, 0, "i"], + [5756, 0, "n"], + [5757, 0, "g"], + [5758, 0, "l"], + [5759, 0, "e"], + [5760, 0, " "], + [5761, 0, "s"], + [5762, 0, "e"], + [5763, 0, "r"], + [5764, 0, "v"], + [5765, 0, "e"], + [5766, 0, "r"], + [5767, 0, "~"], + [5768, 0, "\\"], + [5769, 0, "c"], + [5770, 0, "i"], + [5771, 0, "t"], + [5772, 0, "e"], + [5773, 0, "{"], + [5774, 0, "L"], + [5775, 0, "e"], + [5776, 0, "m"], + [5777, 0, "o"], + [5778, 0, "n"], + [5779, 0, "i"], + [5780, 0, "k"], + [5781, 0, ":"], + [5782, 0, "2"], + [5783, 0, "0"], + [5784, 0, "1"], + [5785, 0, "6"], + [5786, 0, "w"], + [5787, 0, "h"], + [5788, 0, "}"], + [5789, 0, "."], + [5790, 0, " "], + [5791, 0, "A"], + [5792, 0, "s"], + [5793, 0, " "], + [5794, 0, "a"], + [5795, 0, " "], + [5796, 0, "p"], + [5797, 0, "r"], + [5798, 0, "o"], + [5799, 0, "p"], + [5800, 0, "r"], + [5801, 0, "i"], + [5802, 0, "e"], + [5803, 0, "t"], + [5804, 0, "a"], + [5805, 0, "r"], + [5806, 0, "y"], + [5807, 0, " "], + [5808, 0, "p"], + [5809, 0, "r"], + [5810, 0, "o"], + [5811, 0, "d"], + [5812, 0, "u"], + [5813, 0, "c"], + [5814, 0, "t"], + [5815, 0, ","], + [5816, 0, " "], + [5817, 0, "d"], + [5818, 0, "e"], + [5819, 0, "t"], + [5820, 0, "a"], + [5821, 0, "i"], + [5822, 0, "l"], + [5823, 0, "s"], + [5824, 0, " "], + [5825, 0, "o"], + [5826, 0, "f"], + [5827, 0, " "], + [5828, 0, "i"], + [5829, 0, "t"], + [5830, 0, "s"], + [5831, 0, " "], + [5832, 0, "a"], + [5833, 0, "l"], + [5834, 0, "g"], + [5835, 0, "o"], + [5836, 0, "r"], + [5837, 0, "i"], + [5838, 0, "t"], + [5839, 0, "h"], + [5840, 0, "m"], + [5841, 0, "s"], + [5842, 0, " "], + [5843, 0, "h"], + [5844, 0, "a"], + [5845, 0, "v"], + [5846, 0, "e"], + [5847, 0, " "], + [5848, 0, "n"], + [5849, 0, "o"], + [5850, 0, "t"], + [5851, 0, " "], + [5852, 0, "b"], + [5853, 0, "e"], + [5854, 0, "e"], + [5855, 0, "n"], + [5856, 0, " "], + [5857, 0, "p"], + [5858, 0, "u"], + [5859, 0, "b"], + [5860, 0, "l"], + [5861, 0, "i"], + [5862, 0, "s"], + [5863, 0, "h"], + [5864, 0, "e"], + [5865, 0, "d"], + [5866, 0, "."], + [5867, 0, "\n"], + [5868, 0, "\n"], + [5869, 0, "\\"], + [5870, 0, "s"], + [5871, 0, "u"], + [5872, 0, "b"], + [5873, 0, "s"], + [5874, 0, "e"], + [5875, 0, "c"], + [5876, 0, "t"], + [5877, 0, "i"], + [5878, 0, "o"], + [5879, 0, "n"], + [5880, 0, "{"], + [5881, 0, "C"], + [5882, 0, "R"], + [5883, 0, "D"], + [5884, 0, "T"], + [5885, 0, "s"], + [5886, 0, "}"], + [5887, 0, "\\"], + [5888, 0, "l"], + [5889, 0, "a"], + [5890, 0, "b"], + [5891, 0, "e"], + [5892, 0, "l"], + [5893, 0, "{"], + [5894, 0, "s"], + [5895, 0, "e"], + [5896, 0, "c"], + [5897, 0, ":"], + [5898, 0, "r"], + [5899, 0, "e"], + [5900, 0, "l"], + [5901, 0, "a"], + [5902, 0, "t"], + [5903, 0, "e"], + [5904, 0, "d"], + [5905, 0, "-"], + [5906, 0, "c"], + [5907, 0, "r"], + [5908, 0, "d"], + [5909, 0, "t"], + [5910, 0, "s"], + [5911, 0, "}"], + [5912, 0, "\n"], + [5913, 0, "\n"], + [5914, 0, "C"], + [5915, 0, "R"], + [5916, 0, "D"], + [5917, 0, "T"], + [5918, 0, "s"], + [5919, 0, " "], + [5920, 0, "f"], + [5921, 0, "o"], + [5922, 0, "r"], + [5923, 0, " "], + [5924, 0, "r"], + [5925, 0, "e"], + [5926, 0, "g"], + [5927, 0, "i"], + [5928, 0, "s"], + [5929, 0, "t"], + [5930, 0, "e"], + [5931, 0, "r"], + [5932, 0, "s"], + [5933, 0, ","], + [5934, 0, " "], + [5935, 0, "c"], + [5936, 0, "o"], + [5937, 0, "u"], + [5938, 0, "n"], + [5939, 0, "t"], + [5940, 0, "e"], + [5941, 0, "r"], + [5942, 0, "s"], + [5943, 0, ","], + [5944, 0, " "], + [5945, 0, "m"], + [5946, 0, "a"], + [5947, 0, "p"], + [5948, 0, "s"], + [5949, 0, " "], + [5950, 0, "a"], + [5951, 0, "n"], + [5952, 0, "d"], + [5953, 0, " "], + [5954, 0, "s"], + [5955, 0, "e"], + [5956, 0, "t"], + [5957, 0, "s"], + [5958, 0, " "], + [5959, 0, "a"], + [5960, 0, "r"], + [5961, 0, "e"], + [5962, 0, " "], + [5963, 0, "w"], + [5964, 0, "i"], + [5965, 0, "d"], + [5966, 0, "e"], + [5967, 0, "l"], + [5968, 0, "y"], + [5969, 0, " "], + [5970, 0, "k"], + [5971, 0, "n"], + [5972, 0, "o"], + [5973, 0, "w"], + [5974, 0, "n"], + [5975, 0, "~"], + [5976, 0, "\\"], + [5977, 0, "c"], + [5978, 0, "i"], + [5979, 0, "t"], + [5980, 0, "e"], + [5981, 0, "{"], + [5982, 0, "S"], + [5983, 0, "h"], + [5984, 0, "a"], + [5985, 0, "p"], + [5986, 0, "i"], + [5987, 0, "r"], + [5988, 0, "o"], + [5989, 0, ":"], + [5990, 0, "2"], + [5991, 0, "0"], + [5992, 0, "1"], + [5993, 0, "1"], + [5994, 0, "u"], + [5995, 0, "n"], + [5996, 0, ","], + [5997, 0, "S"], + [5998, 0, "h"], + [5999, 0, "a"], + [6000, 0, "p"], + [6001, 0, "i"], + [6002, 0, "r"], + [6003, 0, "o"], + [6004, 0, ":"], + [6005, 0, "2"], + [6006, 0, "0"], + [6007, 0, "1"], + [6008, 0, "1"], + [6009, 0, "w"], + [6010, 0, "y"], + [6011, 0, "}"], + [6012, 0, ","], + [6013, 0, " "], + [6014, 0, "a"], + [6015, 0, "n"], + [6016, 0, "d"], + [6017, 0, " "], + [6018, 0, "h"], + [6019, 0, "a"], + [6020, 0, "v"], + [6021, 0, "e"], + [6022, 0, " "], + [6023, 0, "b"], + [6024, 0, "e"], + [6025, 0, "e"], + [6026, 0, "n"], + [6027, 0, " "], + [6028, 0, "i"], + [6029, 0, "m"], + [6030, 0, "p"], + [6031, 0, "l"], + [6032, 0, "e"], + [6033, 0, "m"], + [6034, 0, "e"], + [6035, 0, "n"], + [6036, 0, "t"], + [6037, 0, "e"], + [6038, 0, "d"], + [6039, 0, " "], + [6040, 0, "i"], + [6041, 0, "n"], + [6042, 0, " "], + [6043, 0, "v"], + [6044, 0, "a"], + [6045, 0, "r"], + [6046, 0, "i"], + [6047, 0, "o"], + [6048, 0, "u"], + [6049, 0, "s"], + [6050, 0, " "], + [6051, 0, "d"], + [6052, 0, "e"], + [6053, 0, "p"], + [6054, 0, "l"], + [6055, 0, "o"], + [6056, 0, "y"], + [6057, 0, "e"], + [6058, 0, "d"], + [6059, 0, " "], + [6060, 0, "s"], + [6061, 0, "y"], + [6062, 0, "s"], + [6063, 0, "t"], + [6064, 0, "e"], + [6065, 0, "m"], + [6066, 0, "s"], + [6067, 0, " "], + [6068, 0, "s"], + [6069, 0, "u"], + [6070, 0, "c"], + [6071, 0, "h"], + [6072, 0, " "], + [6073, 0, "a"], + [6074, 0, "s"], + [6075, 0, " "], + [6076, 0, "R"], + [6077, 0, "i"], + [6078, 0, "a"], + [6079, 0, "k"], + [6080, 0, "~"], + [6081, 0, "\\"], + [6082, 0, "c"], + [6083, 0, "i"], + [6084, 0, "t"], + [6085, 0, "e"], + [6086, 0, "{"], + [6087, 0, "B"], + [6088, 0, "r"], + [6089, 0, "o"], + [6090, 0, "w"], + [6091, 0, "n"], + [6092, 0, ":"], + [6093, 0, "2"], + [6094, 0, "0"], + [6095, 0, "1"], + [6096, 0, "4"], + [6097, 0, "h"], + [6098, 0, "s"], + [6099, 0, ","], + [6100, 0, "B"], + [6101, 0, "r"], + [6102, 0, "o"], + [6103, 0, "w"], + [6104, 0, "n"], + [6105, 0, ":"], + [6106, 0, "2"], + [6107, 0, "0"], + [6108, 0, "1"], + [6109, 0, "3"], + [6110, 0, "w"], + [6111, 0, "y"], + [6112, 0, "}"], + [6113, 0, "."], + [6114, 0, " "], + [6115, 0, "F"], + [6116, 0, "o"], + [6117, 0, "r"], + [6118, 0, " "], + [6119, 0, "o"], + [6120, 0, "r"], + [6121, 0, "d"], + [6122, 0, "e"], + [6123, 0, "r"], + [6124, 0, "e"], + [6125, 0, "d"], + [6126, 0, " "], + [6127, 0, "l"], + [6128, 0, "i"], + [6129, 0, "s"], + [6130, 0, "t"], + [6131, 0, "s"], + [6132, 0, ","], + [6133, 0, " "], + [6134, 0, "v"], + [6135, 0, "a"], + [6136, 0, "r"], + [6137, 0, "i"], + [6138, 0, "o"], + [6139, 0, "u"], + [6140, 0, "s"], + [6141, 0, " "], + [6142, 0, "a"], + [6143, 0, "l"], + [6144, 0, "g"], + [6145, 0, "o"], + [6146, 0, "r"], + [6147, 0, "i"], + [6148, 0, "t"], + [6149, 0, "h"], + [6150, 0, "m"], + [6151, 0, "s"], + [6152, 0, " "], + [6153, 0, "h"], + [6154, 0, "a"], + [6155, 0, "v"], + [6156, 0, "e"], + [6157, 0, " "], + [6158, 0, "b"], + [6159, 0, "e"], + [6160, 0, "e"], + [6161, 0, "n"], + [6162, 0, " "], + [6163, 0, "p"], + [6164, 0, "r"], + [6165, 0, "o"], + [6166, 0, "p"], + [6167, 0, "o"], + [6168, 0, "s"], + [6169, 0, "e"], + [6170, 0, "d"], + [6171, 0, ","], + [6172, 0, " "], + [6173, 0, "i"], + [6174, 0, "n"], + [6175, 0, "c"], + [6176, 0, "l"], + [6177, 0, "u"], + [6177, 1], + [6177, 0, "u"], + [6178, 0, "d"], + [6179, 0, "i"], + [6180, 0, "n"], + [6181, 0, "g"], + [6182, 0, " "], + [6183, 0, "W"], + [6184, 0, "O"], + [6185, 0, "O"], + [6186, 0, "T"], + [6187, 0, "~"], + [6188, 0, "\\"], + [6189, 0, "c"], + [6190, 0, "i"], + [6191, 0, "t"], + [6192, 0, "e"], + [6193, 0, "{"], + [6194, 0, "O"], + [6195, 0, "s"], + [6196, 0, "t"], + [6197, 0, "e"], + [6198, 0, "r"], + [6199, 0, ":"], + [6200, 0, "2"], + [6201, 0, "0"], + [6202, 0, "0"], + [6203, 0, "6"], + [6204, 0, "w"], + [6205, 0, "j"], + [6206, 0, "}"], + [6207, 0, ","], + [6208, 0, " "], + [6209, 0, "R"], + [6210, 0, "G"], + [6211, 0, "A"], + [6212, 0, "~"], + [6213, 0, "\\"], + [6214, 0, "c"], + [6215, 0, "i"], + [6216, 0, "t"], + [6217, 0, "e"], + [6218, 0, "{"], + [6219, 0, "R"], + [6220, 0, "o"], + [6221, 0, "h"], + [6222, 0, ":"], + [6223, 0, "2"], + [6224, 0, "0"], + [6225, 0, "1"], + [6226, 0, "1"], + [6227, 0, "d"], + [6228, 0, "w"], + [6229, 0, "}"], + [6230, 0, ","], + [6231, 0, " "], + [6232, 0, "T"], + [6233, 0, "r"], + [6234, 0, "e"], + [6235, 0, "e"], + [6236, 0, "d"], + [6237, 0, "o"], + [6238, 0, "c"], + [6239, 0, "~"], + [6240, 0, "\\"], + [6241, 0, "c"], + [6242, 0, "i"], + [6243, 0, "t"], + [6244, 0, "e"], + [6245, 0, "{"], + [6246, 0, "P"], + [6247, 0, "r"], + [6248, 0, "e"], + [6249, 0, "g"], + [6250, 0, "u"], + [6251, 0, "i"], + [6252, 0, "c"], + [6253, 0, "a"], + [6254, 0, ":"], + [6255, 0, "2"], + [6256, 0, "0"], + [6257, 0, "0"], + [6258, 0, "9"], + [6259, 0, "f"], + [6260, 0, "z"], + [6261, 0, "}"], + [6262, 0, ","], + [6263, 0, " "], + [6264, 0, "L"], + [6265, 0, "o"], + [6266, 0, "g"], + [6267, 0, "o"], + [6268, 0, "o"], + [6269, 0, "t"], + [6270, 0, "~"], + [6271, 0, "\\"], + [6272, 0, "c"], + [6273, 0, "i"], + [6274, 0, "t"], + [6275, 0, "e"], + [6276, 0, "{"], + [6277, 0, "W"], + [6278, 0, "e"], + [6279, 0, "i"], + [6280, 0, "s"], + [6281, 0, "s"], + [6282, 0, ":"], + [6283, 0, "2"], + [6284, 0, "0"], + [6285, 0, "1"], + [6286, 0, "0"], + [6287, 0, "h"], + [6288, 0, "x"], + [6289, 0, "}"], + [6290, 0, " "], + [6291, 0, "a"], + [6292, 0, "n"], + [6293, 0, "d"], + [6294, 0, " "], + [6295, 0, "L"], + [6296, 0, "S"], + [6297, 0, "E"], + [6298, 0, "Q"], + [6299, 0, "~"], + [6300, 0, "\\"], + [6301, 0, "c"], + [6302, 0, "i"], + [6303, 0, "t"], + [6304, 0, "e"], + [6305, 0, "{"], + [6306, 0, "N"], + [6307, 0, "e"], + [6308, 0, "d"], + [6309, 0, "e"], + [6310, 0, "l"], + [6311, 0, "e"], + [6312, 0, "c"], + [6313, 0, ":"], + [6314, 0, "2"], + [6315, 0, "0"], + [6316, 0, "1"], + [6317, 0, "3"], + [6318, 0, "k"], + [6319, 0, "y"], + [6320, 0, "}"], + [6321, 0, "."], + [6322, 0, " "], + [6323, 0, "H"], + [6324, 0, "o"], + [6325, 0, "w"], + [6326, 0, "e"], + [6327, 0, "v"], + [6328, 0, "e"], + [6329, 0, "r"], + [6330, 0, ","], + [6331, 0, " "], + [6332, 0, "n"], + [6333, 0, "o"], + [6334, 0, "n"], + [6335, 0, "e"], + [6336, 0, " "], + [6337, 0, "o"], + [6338, 0, "f"], + [6339, 0, " "], + [6340, 0, "t"], + [6341, 0, "h"], + [6342, 0, "e"], + [6343, 0, "m"], + [6344, 0, " "], + [6345, 0, "s"], + [6346, 0, "u"], + [6347, 0, "p"], + [6348, 0, "p"], + [6349, 0, "o"], + [6350, 0, "r"], + [6351, 0, "t"], + [6352, 0, " "], + [6353, 0, "n"], + [6354, 0, "e"], + [6355, 0, "s"], + [6356, 0, "t"], + [6357, 0, "i"], + [6358, 0, "n"], + [6359, 0, "g"], + [6360, 0, ":"], + [6361, 0, " "], + [6362, 0, "t"], + [6363, 0, "h"], + [6364, 0, "e"], + [6365, 0, "y"], + [6366, 0, " "], + [6367, 0, "a"], + [6368, 0, "s"], + [6369, 0, "s"], + [6370, 0, "u"], + [6371, 0, "m"], + [6372, 0, "e"], + [6373, 0, " "], + [6374, 0, "t"], + [6375, 0, "h"], + [6376, 0, "a"], + [6377, 0, "t"], + [6378, 0, " "], + [6379, 0, "t"], + [6380, 0, "h"], + [6381, 0, "e"], + [6382, 0, " "], + [6383, 0, "e"], + [6384, 0, "l"], + [6385, 0, "e"], + [6386, 0, "m"], + [6387, 0, "e"], + [6388, 0, "n"], + [6389, 0, "t"], + [6390, 0, "s"], + [6391, 0, " "], + [6392, 0, "o"], + [6393, 0, "f"], + [6394, 0, " "], + [6395, 0, "t"], + [6396, 0, "h"], + [6397, 0, "e"], + [6398, 0, " "], + [6399, 0, "C"], + [6400, 0, "R"], + [6401, 0, "D"], + [6402, 0, "T"], + [6403, 0, " "], + [6404, 0, "m"], + [6405, 0, "a"], + [6406, 0, "p"], + [6407, 0, " "], + [6408, 0, "o"], + [6409, 0, "r"], + [6410, 0, " "], + [6411, 0, "l"], + [6412, 0, "i"], + [6413, 0, "s"], + [6414, 0, "t"], + [6415, 0, " "], + [6416, 0, "a"], + [6417, 0, "r"], + [6418, 0, "e"], + [6419, 0, " "], + [6420, 0, "a"], + [6421, 0, "t"], + [6422, 0, "o"], + [6423, 0, "m"], + [6424, 0, "i"], + [6425, 0, "c"], + [6426, 0, " "], + [6427, 0, "v"], + [6428, 0, "a"], + [6429, 0, "l"], + [6430, 0, "u"], + [6431, 0, "e"], + [6432, 0, "s"], + [6433, 0, ","], + [6434, 0, " "], + [6435, 0, "n"], + [6436, 0, "o"], + [6437, 0, "t"], + [6438, 0, " "], + [6439, 0, "a"], + [6440, 0, "n"], + [6441, 0, "o"], + [6442, 0, "t"], + [6443, 0, "h"], + [6444, 0, "e"], + [6445, 0, "r"], + [6446, 0, " "], + [6447, 0, "C"], + [6448, 0, "R"], + [6449, 0, "D"], + [6450, 0, "T"], + [6451, 0, "."], + [6452, 0, "\n"], + [6453, 0, "\n"], + [6454, 0, "T"], + [6455, 0, "h"], + [6456, 0, "e"], + [6457, 0, " "], + [6458, 0, "p"], + [6459, 0, "r"], + [6460, 0, "o"], + [6461, 0, "b"], + [6462, 0, "l"], + [6463, 0, "e"], + [6464, 0, "m"], + [6465, 0, " "], + [6466, 0, "o"], + [6467, 0, "f"], + [6468, 0, " "], + [6469, 0, "n"], + [6470, 0, "e"], + [6471, 0, "s"], + [6472, 0, "t"], + [6473, 0, "i"], + [6474, 0, "n"], + [6475, 0, "g"], + [6476, 0, " "], + [6477, 0, "o"], + [6478, 0, "n"], + [6479, 0, "e"], + [6480, 0, " "], + [6481, 0, "C"], + [6482, 0, "R"], + [6483, 0, "D"], + [6484, 0, "T"], + [6485, 0, " "], + [6486, 0, "i"], + [6487, 0, "n"], + [6488, 0, "s"], + [6489, 0, "i"], + [6490, 0, "d"], + [6491, 0, "e"], + [6492, 0, " "], + [6493, 0, "a"], + [6494, 0, "n"], + [6495, 0, "o"], + [6496, 0, "t"], + [6497, 0, "h"], + [6498, 0, "e"], + [6499, 0, "r"], + [6500, 0, " "], + [6501, 0, "("], + [6502, 0, "a"], + [6503, 0, "l"], + [6504, 0, "s"], + [6505, 0, "o"], + [6506, 0, " "], + [6507, 0, "k"], + [6508, 0, "n"], + [6509, 0, "o"], + [6510, 0, "w"], + [6511, 0, "n"], + [6512, 0, " "], + [6513, 0, "a"], + [6514, 0, "s"], + [6515, 0, " "], + [6516, 0, "\\"], + [6517, 0, "e"], + [6518, 0, "m"], + [6519, 0, "p"], + [6520, 0, "h"], + [6521, 0, "{"], + [6522, 0, "c"], + [6523, 0, "o"], + [6524, 0, "m"], + [6525, 0, "p"], + [6526, 0, "o"], + [6527, 0, "s"], + [6528, 0, "i"], + [6529, 0, "t"], + [6530, 0, "i"], + [6531, 0, "o"], + [6532, 0, "n"], + [6533, 0, "}"], + [6534, 0, " "], + [6535, 0, "o"], + [6536, 0, "r"], + [6537, 0, " "], + [6538, 0, "\\"], + [6539, 0, "e"], + [6540, 0, "m"], + [6541, 0, "p"], + [6542, 0, "h"], + [6543, 0, "{"], + [6544, 0, "e"], + [6545, 0, "m"], + [6546, 0, "b"], + [6547, 0, "e"], + [6548, 0, "d"], + [6549, 0, "d"], + [6550, 0, "i"], + [6551, 0, "n"], + [6552, 0, "g"], + [6553, 0, "}"], + [6554, 0, ")"], + [6555, 0, " "], + [6556, 0, "h"], + [6557, 0, "a"], + [6558, 0, "s"], + [6559, 0, " "], + [6560, 0, "o"], + [6561, 0, "n"], + [6562, 0, "l"], + [6563, 0, "y"], + [6564, 0, " "], + [6565, 0, "b"], + [6566, 0, "e"], + [6567, 0, "e"], + [6568, 0, "n"], + [6569, 0, " "], + [6570, 0, "s"], + [6571, 0, "t"], + [6572, 0, "u"], + [6573, 0, "d"], + [6574, 0, "i"], + [6575, 0, "e"], + [6576, 0, "d"], + [6577, 0, " "], + [6578, 0, "m"], + [6579, 0, "o"], + [6580, 0, "r"], + [6581, 0, "e"], + [6582, 0, " "], + [6583, 0, "r"], + [6584, 0, "e"], + [6585, 0, "c"], + [6586, 0, "e"], + [6587, 0, "n"], + [6588, 0, "t"], + [6589, 0, "l"], + [6590, 0, "y"], + [6591, 0, "."], + [6592, 0, " "], + [6593, 0, "R"], + [6594, 0, "i"], + [6595, 0, "a"], + [6596, 0, "k"], + [6597, 0, " "], + [6598, 0, "a"], + [6599, 0, "l"], + [6600, 0, "l"], + [6601, 0, "o"], + [6602, 0, "w"], + [6603, 0, "s"], + [6604, 0, " "], + [6605, 0, "n"], + [6606, 0, "e"], + [6607, 0, "s"], + [6608, 0, "t"], + [6609, 0, "i"], + [6610, 0, "n"], + [6611, 0, "g"], + [6612, 0, " "], + [6613, 0, "o"], + [6614, 0, "f"], + [6615, 0, " "], + [6616, 0, "c"], + [6617, 0, "o"], + [6618, 0, "u"], + [6619, 0, "n"], + [6620, 0, "t"], + [6621, 0, "e"], + [6622, 0, "r"], + [6623, 0, "s"], + [6624, 0, " "], + [6625, 0, "a"], + [6626, 0, "n"], + [6627, 0, "d"], + [6628, 0, " "], + [6629, 0, "r"], + [6630, 0, "e"], + [6631, 0, "g"], + [6632, 0, "i"], + [6633, 0, "s"], + [6634, 0, "t"], + [6635, 0, "e"], + [6636, 0, "r"], + [6637, 0, "s"], + [6638, 0, " "], + [6639, 0, "i"], + [6640, 0, "n"], + [6641, 0, "s"], + [6642, 0, "i"], + [6643, 0, "d"], + [6644, 0, "e"], + [6645, 0, " "], + [6646, 0, "m"], + [6647, 0, "a"], + [6648, 0, "p"], + [6649, 0, "s"], + [6650, 0, ","], + [6651, 0, " "], + [6652, 0, "a"], + [6653, 0, "n"], + [6654, 0, "d"], + [6655, 0, " "], + [6656, 0, "o"], + [6657, 0, "f"], + [6658, 0, " "], + [6659, 0, "m"], + [6660, 0, "a"], + [6661, 0, "p"], + [6662, 0, "s"], + [6663, 0, " "], + [6664, 0, "w"], + [6665, 0, "i"], + [6666, 0, "t"], + [6667, 0, "h"], + [6668, 0, "i"], + [6669, 0, "n"], + [6670, 0, " "], + [6671, 0, "o"], + [6672, 0, "t"], + [6673, 0, "h"], + [6674, 0, "e"], + [6675, 0, "r"], + [6676, 0, " "], + [6677, 0, "m"], + [6678, 0, "a"], + [6679, 0, "p"], + [6680, 0, "s"], + [6681, 0, "~"], + [6682, 0, "\\"], + [6683, 0, "c"], + [6684, 0, "i"], + [6685, 0, "t"], + [6686, 0, "e"], + [6687, 0, "{"], + [6688, 0, "B"], + [6689, 0, "r"], + [6690, 0, "o"], + [6691, 0, "w"], + [6692, 0, "n"], + [6693, 0, ":"], + [6694, 0, "2"], + [6695, 0, "0"], + [6696, 0, "1"], + [6697, 0, "4"], + [6698, 0, "h"], + [6699, 0, "s"], + [6700, 0, ","], + [6701, 0, "B"], + [6702, 0, "r"], + [6703, 0, "o"], + [6704, 0, "w"], + [6705, 0, "n"], + [6706, 0, ":"], + [6707, 0, "2"], + [6708, 0, "0"], + [6709, 0, "1"], + [6710, 0, "3"], + [6711, 0, "w"], + [6712, 0, "y"], + [6713, 0, "}"], + [6714, 0, "."], + [6715, 0, " "], + [6716, 0, "E"], + [6717, 0, "m"], + [6718, 0, "b"], + [6719, 0, "e"], + [6720, 0, "d"], + [6721, 0, "d"], + [6722, 0, "i"], + [6723, 0, "n"], + [6724, 0, "g"], + [6725, 0, " "], + [6726, 0, "c"], + [6727, 0, "o"], + [6728, 0, "u"], + [6729, 0, "n"], + [6730, 0, "t"], + [6731, 0, "e"], + [6732, 0, "r"], + [6733, 0, "s"], + [6734, 0, " "], + [6735, 0, "i"], + [6736, 0, "n"], + [6737, 0, "s"], + [6738, 0, "i"], + [6739, 0, "d"], + [6740, 0, "e"], + [6741, 0, " "], + [6742, 0, "m"], + [6743, 0, "a"], + [6744, 0, "p"], + [6745, 0, "s"], + [6746, 0, " "], + [6747, 0, "r"], + [6748, 0, "a"], + [6749, 0, "i"], + [6750, 0, "s"], + [6751, 0, "e"], + [6752, 0, "s"], + [6753, 0, " "], + [6754, 0, "q"], + [6755, 0, "u"], + [6756, 0, "e"], + [6757, 0, "s"], + [6758, 0, "t"], + [6759, 0, "i"], + [6760, 0, "o"], + [6761, 0, "n"], + [6762, 0, "s"], + [6763, 0, " "], + [6764, 0, "o"], + [6765, 0, "f"], + [6766, 0, " "], + [6767, 0, "s"], + [6768, 0, "e"], + [6769, 0, "m"], + [6770, 0, "a"], + [6771, 0, "n"], + [6772, 0, "t"], + [6773, 0, "i"], + [6774, 0, "c"], + [6775, 0, "s"], + [6776, 0, ","], + [6777, 0, " "], + [6778, 0, "w"], + [6779, 0, "h"], + [6780, 0, "i"], + [6781, 0, "c"], + [6782, 0, "h"], + [6783, 0, " "], + [6784, 0, "h"], + [6785, 0, "a"], + [6786, 0, "v"], + [6787, 0, "e"], + [6788, 0, " "], + [6789, 0, "b"], + [6790, 0, "e"], + [6791, 0, "e"], + [6792, 0, "n"], + [6793, 0, " "], + [6794, 0, "s"], + [6795, 0, "t"], + [6796, 0, "u"], + [6797, 0, "d"], + [6798, 0, "i"], + [6799, 0, "e"], + [6800, 0, "d"], + [6801, 0, " "], + [6802, 0, "b"], + [6803, 0, "y"], + [6804, 0, " "], + [6805, 0, "B"], + [6806, 0, "a"], + [6807, 0, "q"], + [6808, 0, "u"], + [6809, 0, "e"], + [6810, 0, "r"], + [6811, 0, "o"], + [6812, 0, ","], + [6813, 0, " "], + [6814, 0, "A"], + [6815, 0, "l"], + [6816, 0, "m"], + [6817, 0, "e"], + [6818, 0, "i"], + [6819, 0, "d"], + [6820, 0, "a"], + [6821, 0, " "], + [6822, 0, "a"], + [6823, 0, "n"], + [6824, 0, "d"], + [6825, 0, " "], + [6826, 0, "L"], + [6827, 0, "e"], + [6828, 0, "r"], + [6829, 0, "c"], + [6830, 0, "h"], + [6831, 0, "e"], + [6832, 0, "~"], + [6833, 0, "\\"], + [6834, 0, "c"], + [6835, 0, "i"], + [6836, 0, "t"], + [6837, 0, "e"], + [6838, 0, "{"], + [6839, 0, "B"], + [6840, 0, "a"], + [6841, 0, "q"], + [6842, 0, "u"], + [6843, 0, "e"], + [6844, 0, "r"], + [6845, 0, "o"], + [6846, 0, ":"], + [6847, 0, "2"], + [6848, 0, "0"], + [6849, 0, "1"], + [6850, 0, "6"], + [6851, 0, "i"], + [6852, 0, "v"], + [6853, 0, "}"], + [6854, 0, "."], + [6855, 0, " "], + [6856, 0, "A"], + [6857, 0, "l"], + [6858, 0, "m"], + [6859, 0, "e"], + [6860, 0, "i"], + [6861, 0, "d"], + [6862, 0, "a"], + [6863, 0, " "], + [6864, 0, "e"], + [6865, 0, "t"], + [6866, 0, " "], + [6867, 0, "a"], + [6868, 0, "."], + [6868, 1], + [6868, 0, "l"], + [6869, 0, "."], + [6870, 0, "~"], + [6871, 0, "\\"], + [6872, 0, "c"], + [6873, 0, "i"], + [6874, 0, "t"], + [6875, 0, "e"], + [6876, 0, "{"], + [6877, 0, "A"], + [6878, 0, "l"], + [6879, 0, "m"], + [6880, 0, "e"], + [6881, 0, "i"], + [6882, 0, "d"], + [6883, 0, "a"], + [6884, 0, ":"], + [6885, 0, "2"], + [6886, 0, "0"], + [6887, 0, "1"], + [6888, 0, "6"], + [6889, 0, "t"], + [6890, 0, "k"], + [6891, 0, "}"], + [6892, 0, " "], + [6893, 0, "a"], + [6894, 0, "l"], + [6895, 0, "s"], + [6896, 0, "o"], + [6897, 0, " "], + [6898, 0, "d"], + [6899, 0, "e"], + [6900, 0, "f"], + [6901, 0, "i"], + [6902, 0, "n"], + [6903, 0, "e"], + [6904, 0, " "], + [6905, 0, "d"], + [6906, 0, "e"], + [6907, 0, "l"], + [6908, 0, "t"], + [6909, 0, "a"], + [6910, 0, " "], + [6911, 0, "m"], + [6912, 0, "u"], + [6913, 0, "t"], + [6914, 0, "a"], + [6915, 0, "t"], + [6916, 0, "i"], + [6917, 0, "o"], + [6918, 0, "n"], + [6919, 0, "s"], + [6920, 0, " "], + [6921, 0, "f"], + [6922, 0, "o"], + [6923, 0, "r"], + [6924, 0, " "], + [6925, 0, "n"], + [6926, 0, "e"], + [6927, 0, "s"], + [6928, 0, "t"], + [6929, 0, "e"], + [6930, 0, "d"], + [6931, 0, " "], + [6932, 0, "m"], + [6933, 0, "a"], + [6934, 0, "p"], + [6935, 0, "s"], + [6936, 0, ","], + [6937, 0, " "], + [6938, 0, "a"], + [6939, 0, "n"], + [6940, 0, "d"], + [6941, 0, " "], + [6942, 0, "B"], + [6943, 0, "a"], + [6944, 0, "q"], + [6945, 0, "u"], + [6946, 0, "e"], + [6947, 0, "r"], + [6948, 0, "o"], + [6949, 0, " "], + [6950, 0, "e"], + [6951, 0, "t"], + [6952, 0, " "], + [6953, 0, "a"], + [6954, 0, "l"], + [6955, 0, "."], + [6956, 0, "~"], + [6957, 0, "\\"], + [6958, 0, "c"], + [6959, 0, "i"], + [6960, 0, "t"], + [6961, 0, "e"], + [6962, 0, "{"], + [6963, 0, "B"], + [6964, 0, "a"], + [6965, 0, "q"], + [6966, 0, "u"], + [6967, 0, "e"], + [6968, 0, "r"], + [6969, 0, "o"], + [6970, 0, ":"], + [6971, 0, "2"], + [6972, 0, "0"], + [6973, 0, "1"], + [6974, 0, "5"], + [6975, 0, "t"], + [6976, 0, "m"], + [6977, 0, "}"], + [6978, 0, " "], + [6979, 0, "d"], + [6980, 0, "e"], + [6981, 0, "f"], + [6982, 0, "i"], + [6983, 0, "n"], + [6984, 0, "e"], + [6985, 0, " "], + [6986, 0, "a"], + [6987, 0, " "], + [6988, 0, "t"], + [6989, 0, "h"], + [6990, 0, "e"], + [6991, 0, "o"], + [6992, 0, "r"], + [6993, 0, "e"], + [6994, 0, "t"], + [6995, 0, "i"], + [6996, 0, "c"], + [6997, 0, "a"], + [6998, 0, "l"], + [6999, 0, " "], + [7000, 0, "f"], + [7001, 0, "r"], + [7002, 0, "a"], + [7003, 0, "m"], + [7004, 0, "e"], + [7005, 0, "w"], + [7006, 0, "o"], + [7007, 0, "r"], + [7008, 0, "k"], + [7009, 0, " "], + [7010, 0, "f"], + [7011, 0, "o"], + [7012, 0, "r"], + [7013, 0, " "], + [7014, 0, "c"], + [7015, 0, "o"], + [7016, 0, "m"], + [7017, 0, "p"], + [7018, 0, "o"], + [7019, 0, "s"], + [7020, 0, "i"], + [7021, 0, "t"], + [7022, 0, "i"], + [7023, 0, "o"], + [7024, 0, "n"], + [7025, 0, " "], + [7026, 0, "o"], + [7027, 0, "f"], + [7028, 0, " "], + [7029, 0, "s"], + [7030, 0, "t"], + [7031, 0, "a"], + [7032, 0, "t"], + [7033, 0, "e"], + [7034, 0, "-"], + [7035, 0, "b"], + [7036, 0, "a"], + [7037, 0, "s"], + [7038, 0, "e"], + [7039, 0, "d"], + [7040, 0, " "], + [7041, 0, "C"], + [7042, 0, "R"], + [7043, 0, "D"], + [7044, 0, "T"], + [7045, 0, "s"], + [7046, 0, ","], + [7047, 0, " "], + [7048, 0, "b"], + [7049, 0, "a"], + [7050, 0, "s"], + [7051, 0, "e"], + [7052, 0, "d"], + [7053, 0, " "], + [7054, 0, "o"], + [7055, 0, "n"], + [7056, 0, " "], + [7057, 0, "l"], + [7058, 0, "a"], + [7059, 0, "t"], + [7060, 0, "t"], + [7061, 0, "i"], + [7062, 0, "c"], + [7063, 0, "e"], + [7064, 0, "s"], + [7065, 0, "."], + [7066, 0, " "], + [7067, 0, "N"], + [7068, 0, "o"], + [7069, 0, "n"], + [7070, 0, "e"], + [7071, 0, " "], + [7072, 0, "o"], + [7073, 0, "f"], + [7074, 0, " "], + [7075, 0, "t"], + [7076, 0, "h"], + [7077, 0, "i"], + [7078, 0, "s"], + [7079, 0, " "], + [7080, 0, "w"], + [7081, 0, "o"], + [7082, 0, "r"], + [7083, 0, "k"], + [7084, 0, " "], + [7085, 0, "i"], + [7086, 0, "n"], + [7087, 0, "t"], + [7088, 0, "e"], + [7089, 0, "g"], + [7090, 0, "r"], + [7091, 0, "a"], + [7092, 0, "t"], + [7093, 0, "e"], + [7094, 0, "s"], + [7095, 0, " "], + [7096, 0, "C"], + [7097, 0, "R"], + [7098, 0, "D"], + [7099, 0, "T"], + [7100, 0, "s"], + [7101, 0, " "], + [7102, 0, "f"], + [7103, 0, "o"], + [7104, 0, "r"], + [7105, 0, " "], + [7106, 0, "o"], + [7107, 0, "r"], + [7108, 0, "d"], + [7109, 0, "e"], + [7110, 0, "r"], + [7111, 0, "e"], + [7112, 0, "d"], + [7113, 0, " "], + [7114, 0, "l"], + [7115, 0, "i"], + [7116, 0, "s"], + [7117, 0, "t"], + [7118, 0, "s"], + [7119, 0, ","], + [7120, 0, " "], + [7121, 0, "b"], + [7122, 0, "u"], + [7123, 0, "t"], + [7124, 0, " "], + [7125, 0, "t"], + [7126, 0, "h"], + [7127, 0, "e"], + [7128, 0, " "], + [7129, 0, "t"], + [7130, 0, "r"], + [7131, 0, "e"], + [7132, 0, "a"], + [7133, 0, "t"], + [7134, 0, "m"], + [7135, 0, "e"], + [7136, 0, "n"], + [7137, 0, "t"], + [7138, 0, " "], + [7139, 0, "o"], + [7140, 0, "f"], + [7141, 0, " "], + [7142, 0, "c"], + [7143, 0, "a"], + [7144, 0, "u"], + [7145, 0, "s"], + [7146, 0, "a"], + [7147, 0, "l"], + [7148, 0, "i"], + [7149, 0, "t"], + [7150, 0, "y"], + [7151, 0, " "], + [7152, 0, "i"], + [7153, 0, "n"], + [7154, 0, " "], + [7155, 0, "t"], + [7156, 0, "h"], + [7157, 0, "e"], + [7158, 0, "s"], + [7159, 0, "e"], + [7160, 0, " "], + [7161, 0, "d"], + [7162, 0, "a"], + [7163, 0, "t"], + [7164, 0, "a"], + [7165, 0, "t"], + [7166, 0, "y"], + [7167, 0, "p"], + [7168, 0, "e"], + [7169, 0, "s"], + [7170, 0, " "], + [7171, 0, "f"], + [7172, 0, "o"], + [7173, 0, "r"], + [7174, 0, "m"], + [7175, 0, "s"], + [7176, 0, " "], + [7177, 0, "a"], + [7178, 0, " "], + [7179, 0, "b"], + [7180, 0, "a"], + [7181, 0, "s"], + [7182, 0, "i"], + [7183, 0, "s"], + [7184, 0, " "], + [7185, 0, "f"], + [7186, 0, "o"], + [7187, 0, "r"], + [7188, 0, " "], + [7189, 0, "t"], + [7190, 0, "h"], + [7191, 0, "e"], + [7192, 0, " "], + [7193, 0, "s"], + [7194, 0, "e"], + [7195, 0, "m"], + [7196, 0, "a"], + [7197, 0, "n"], + [7198, 0, "t"], + [7199, 0, "i"], + [7200, 0, "c"], + [7201, 0, "s"], + [7202, 0, " "], + [7203, 0, "d"], + [7204, 0, "e"], + [7205, 0, "v"], + [7206, 0, "e"], + [7207, 0, "l"], + [7208, 0, "o"], + [7209, 0, "p"], + [7210, 0, "e"], + [7211, 0, "d"], + [7212, 0, " "], + [7213, 0, "i"], + [7214, 0, "n"], + [7215, 0, " "], + [7216, 0, "t"], + [7217, 0, "h"], + [7218, 0, "i"], + [7219, 0, "s"], + [7220, 0, " "], + [7221, 0, "p"], + [7222, 0, "a"], + [7223, 0, "p"], + [7224, 0, "e"], + [7225, 0, "r"], + [7226, 0, "."], + [7227, 0, "\n"], + [7228, 0, "\n"], + [7229, 0, "B"], + [7230, 0, "u"], + [7231, 0, "r"], + [7232, 0, "c"], + [7233, 0, "k"], + [7234, 0, "h"], + [7235, 0, "a"], + [7236, 0, "r"], + [7237, 0, "d"], + [7238, 0, "t"], + [7239, 0, " "], + [7240, 0, "e"], + [7241, 0, "t"], + [7242, 0, " "], + [7243, 0, "a"], + [7244, 0, "l"], + [7245, 0, "."], + [7246, 0, "Z"], + [7247, 0, "~"], + [7247, 1], + [7246, 1], + [7246, 0, "|"], + [7247, 0, "~"], + [7247, 1], + [7246, 1], + [7246, 0, "|"], + [7246, 1], + [7246, 0, "~"], + [7247, 0, "\\"], + [7248, 0, "c"], + [7249, 0, "i"], + [7250, 0, "t"], + [7251, 0, "e"], + [7252, 0, "{"], + [7253, 0, "B"], + [7254, 0, "u"], + [7255, 0, "r"], + [7256, 0, "c"], + [7257, 0, "k"], + [7258, 0, "h"], + [7259, 0, "a"], + [7260, 0, "r"], + [7261, 0, "d"], + [7262, 0, "t"], + [7263, 0, ":"], + [7264, 0, "2"], + [7265, 0, "0"], + [7266, 0, "1"], + [7267, 0, "2"], + [7268, 0, "j"], + [7269, 0, "y"], + [7270, 0, "}"], + [7271, 0, " "], + [7272, 0, "d"], + [7273, 0, "e"], + [7274, 0, "f"], + [7275, 0, "i"], + [7276, 0, "n"], + [7277, 0, "e"], + [7278, 0, " "], + [7279, 0, "\\"], + [7280, 0, "e"], + [7281, 0, "m"], + [7282, 0, "p"], + [7283, 0, "h"], + [7284, 0, "{"], + [7285, 0, "c"], + [7286, 0, "l"], + [7287, 0, "o"], + [7288, 0, "u"], + [7289, 0, "d"], + [7290, 0, " "], + [7291, 0, "t"], + [7292, 0, "y"], + [7293, 0, "p"], + [7294, 0, "e"], + [7295, 0, "s"], + [7296, 0, "}"], + [7297, 0, ","], + [7298, 0, " "], + [7299, 0, "w"], + [7300, 0, "h"], + [7301, 0, "i"], + [7302, 0, "c"], + [7303, 0, "h"], + [7304, 0, " "], + [7305, 0, "a"], + [7306, 0, "r"], + [7307, 0, "e"], + [7308, 0, " "], + [7309, 0, "s"], + [7310, 0, "i"], + [7311, 0, "m"], + [7312, 0, "i"], + [7313, 0, "l"], + [7314, 0, "a"], + [7315, 0, "r"], + [7316, 0, " "], + [7317, 0, "t"], + [7318, 0, "o"], + [7319, 0, " "], + [7320, 0, "C"], + [7321, 0, "R"], + [7322, 0, "D"], + [7323, 0, "T"], + [7324, 0, "s"], + [7325, 0, " "], + [7326, 0, "a"], + [7327, 0, "n"], + [7328, 0, "d"], + [7329, 0, " "], + [7330, 0, "c"], + [7331, 0, "a"], + [7332, 0, "n"], + [7333, 0, " "], + [7334, 0, "b"], + [7335, 0, "e"], + [7336, 0, " "], + [7337, 0, "c"], + [7338, 0, "o"], + [7339, 0, "m"], + [7340, 0, "p"], + [7341, 0, "o"], + [7342, 0, "s"], + [7343, 0, "e"], + [7344, 0, "d"], + [7345, 0, "."], + [7346, 0, " "], + [7347, 0, "T"], + [7348, 0, "h"], + [7349, 0, "e"], + [7350, 0, "y"], + [7351, 0, " "], + [7352, 0, "d"], + [7353, 0, "e"], + [7354, 0, "f"], + [7355, 0, "i"], + [7356, 0, "n"], + [7357, 0, "e"], + [7358, 0, " "], + [7359, 0, "\\"], + [7360, 0, "e"], + [7361, 0, "m"], + [7362, 0, "p"], + [7363, 0, "h"], + [7364, 0, "{"], + [7365, 0, "c"], + [7366, 0, "l"], + [7367, 0, "o"], + [7368, 0, "u"], + [7369, 0, "d"], + [7370, 0, " "], + [7371, 0, "a"], + [7372, 0, "r"], + [7373, 0, "r"], + [7374, 0, "a"], + [7375, 0, "y"], + [7376, 0, "s"], + [7377, 0, "}"], + [7378, 0, ","], + [7379, 0, " "], + [7380, 0, "w"], + [7381, 0, "h"], + [7382, 0, "i"], + [7383, 0, "c"], + [7384, 0, "h"], + [7385, 0, " "], + [7386, 0, "b"], + [7387, 0, "e"], + [7388, 0, "h"], + [7389, 0, "a"], + [7390, 0, "v"], + [7391, 0, "e"], + [7392, 0, " "], + [7393, 0, "s"], + [7394, 0, "i"], + [7395, 0, "m"], + [7396, 0, "i"], + [7397, 0, "l"], + [7398, 0, "a"], + [7399, 0, "r"], + [7400, 0, "l"], + [7401, 0, "y"], + [7402, 0, " "], + [7403, 0, "t"], + [7404, 0, "o"], + [7405, 0, " "], + [7406, 0, "o"], + [7407, 0, "u"], + [7408, 0, "r"], + [7409, 0, " "], + [7410, 0, "m"], + [7411, 0, "a"], + [7412, 0, "p"], + [7413, 0, " "], + [7414, 0, "d"], + [7415, 0, "a"], + [7416, 0, "t"], + [7417, 0, "a"], + [7418, 0, "t"], + [7419, 0, "y"], + [7420, 0, "p"], + [7421, 0, "e"], + [7422, 0, "s"], + [7422, 1], + [7422, 0, ","], + [7423, 0, " "], + [7424, 0, "a"], + [7425, 0, "n"], + [7426, 0, "d"], + [7427, 0, " "], + [7428, 0, "\\"], + [7429, 0, "e"], + [7430, 0, "m"], + [7431, 0, "p"], + [7432, 0, "h"], + [7433, 0, "{"], + [7434, 0, "e"], + [7435, 0, "n"], + [7436, 0, "t"], + [7437, 0, "i"], + [7438, 0, "t"], + [7439, 0, "i"], + [7440, 0, "e"], + [7441, 0, "s"], + [7442, 0, "}"], + [7443, 0, ","], + [7444, 0, " "], + [7445, 0, "w"], + [7446, 0, "h"], + [7447, 0, "i"], + [7448, 0, "c"], + [7449, 0, "h"], + [7450, 0, " "], + [7451, 0, "a"], + [7452, 0, "r"], + [7453, 0, "e"], + [7454, 0, " "], + [7455, 0, "l"], + [7456, 0, "i"], + [7457, 0, "k"], + [7458, 0, "e"], + [7459, 0, " "], + [7460, 0, "u"], + [7461, 0, "n"], + [7462, 0, "o"], + [7463, 0, "r"], + [7464, 0, "d"], + [7465, 0, "e"], + [7466, 0, "r"], + [7467, 0, "e"], + [7468, 0, "d"], + [7469, 0, " "], + [7470, 0, "s"], + [7471, 0, "e"], + [7472, 0, "t"], + [7473, 0, "s"], + [7474, 0, " "], + [7475, 0, "o"], + [7476, 0, "r"], + [7477, 0, " "], + [7478, 0, "r"], + [7479, 0, "e"], + [7480, 0, "l"], + [7481, 0, "a"], + [7482, 0, "t"], + [7483, 0, "i"], + [7484, 0, "o"], + [7485, 0, "n"], + [7486, 0, "s"], + [7487, 0, ";"], + [7488, 0, " "], + [7489, 0, "o"], + [7490, 0, "r"], + [7491, 0, "d"], + [7492, 0, "e"], + [7493, 0, "r"], + [7494, 0, "e"], + [7495, 0, "d"], + [7496, 0, " "], + [7497, 0, "l"], + [7498, 0, "i"], + [7499, 0, "s"], + [7500, 0, "t"], + [7501, 0, "s"], + [7502, 0, " "], + [7503, 0, "a"], + [7504, 0, "r"], + [7505, 0, "e"], + [7506, 0, " "], + [7507, 0, "n"], + [7508, 0, "o"], + [7509, 0, "t"], + [7510, 0, " "], + [7511, 0, "d"], + [7512, 0, "e"], + [7513, 0, "f"], + [7514, 0, "i"], + [7515, 0, "n"], + [7516, 0, "e"], + [7517, 0, "d"], + [7518, 0, " "], + [7519, 0, "i"], + [7520, 0, "n"], + [7521, 0, " "], + [7522, 0, "t"], + [7523, 0, "h"], + [7524, 0, "i"], + [7525, 0, "s"], + [7526, 0, " "], + [7527, 0, "f"], + [7528, 0, "r"], + [7529, 0, "a"], + [7530, 0, "m"], + [7531, 0, "e"], + [7532, 0, "o"], + [7533, 0, "w"], + [7533, 1], + [7532, 1], + [7532, 0, "w"], + [7533, 0, "o"], + [7534, 0, "r"], + [7535, 0, "k"], + [7536, 0, "."], + [7537, 0, " "], + [7538, 0, "O"], + [7539, 0, "u"], + [7540, 0, "r"], + [7541, 0, " "], + [7542, 0, "\\"], + [7543, 0, "t"], + [7544, 0, "e"], + [7545, 0, "x"], + [7546, 0, "t"], + [7547, 0, "s"], + [7548, 0, "f"], + [7549, 0, "{"], + [7550, 0, "y"], + [7551, 0, "i"], + [7552, 0, "e"], + [7553, 0, "l"], + [7554, 0, "d"], + [7555, 0, "}"], + [7556, 0, " "], + [7557, 0, "s"], + [7558, 0, "t"], + [7559, 0, "a"], + [7560, 0, "t"], + [7561, 0, "e"], + [7562, 0, "m"], + [7563, 0, "e"], + [7564, 0, "n"], + [7565, 0, "t"], + [7566, 0, " "], + [7567, 0, "i"], + [7568, 0, "s"], + [7569, 0, " "], + [7570, 0, "i"], + [7571, 0, "n"], + [7572, 0, "s"], + [7573, 0, "p"], + [7574, 0, "i"], + [7575, 0, "r"], + [7576, 0, "e"], + [7577, 0, "d"], + [7578, 0, " "], + [7579, 0, "b"], + [7580, 0, "y"], + [7581, 0, " "], + [7582, 0, "B"], + [7583, 0, "u"], + [7584, 0, "r"], + [7585, 0, "c"], + [7586, 0, "k"], + [7587, 0, "h"], + [7588, 0, "a"], + [7589, 0, "r"], + [7590, 0, "d"], + [7591, 0, "t"], + [7592, 0, " "], + [7593, 0, "e"], + [7594, 0, "t"], + [7595, 0, " "], + [7596, 0, "a"], + [7597, 0, "l"], + [7598, 0, "."], + [7599, 0, "\n"], + [7600, 0, "\n"], + [7601, 0, "A"], + [7602, 0, "l"], + [7603, 0, "t"], + [7604, 0, "h"], + [7605, 0, "o"], + [7606, 0, "u"], + [7607, 0, "g"], + [7608, 0, "h"], + [7609, 0, " "], + [7610, 0, "C"], + [7611, 0, "R"], + [7612, 0, "D"], + [7613, 0, "T"], + [7614, 0, "s"], + [7615, 0, " "], + [7616, 0, "f"], + [7617, 0, "o"], + [7618, 0, "r"], + [7619, 0, " "], + [7620, 0, "r"], + [7621, 0, "e"], + [7622, 0, "g"], + [7623, 0, "i"], + [7624, 0, "s"], + [7625, 0, "t"], + [7626, 0, "e"], + [7627, 0, "r"], + [7628, 0, "s"], + [7629, 0, ","], + [7630, 0, " "], + [7631, 0, "m"], + [7632, 0, "a"], + [7633, 0, "p"], + [7634, 0, "s"], + [7635, 0, " "], + [7636, 0, "a"], + [7637, 0, "n"], + [7638, 0, "d"], + [7639, 0, " "], + [7640, 0, "o"], + [7641, 0, "r"], + [7642, 0, "d"], + [7643, 0, "e"], + [7644, 0, "r"], + [7645, 0, "e"], + [7646, 0, "d"], + [7647, 0, " "], + [7648, 0, "l"], + [7649, 0, "i"], + [7650, 0, "s"], + [7651, 0, "t"], + [7652, 0, "s"], + [7653, 0, " "], + [7654, 0, "h"], + [7655, 0, "a"], + [7656, 0, "v"], + [7657, 0, "e"], + [7658, 0, " "], + [7659, 0, "e"], + [7660, 0, "x"], + [7661, 0, "i"], + [7662, 0, "s"], + [7663, 0, "t"], + [7664, 0, "e"], + [7665, 0, "d"], + [7666, 0, " "], + [7667, 0, "f"], + [7668, 0, "o"], + [7669, 0, "r"], + [7670, 0, " "], + [7671, 0, "y"], + [7672, 0, "e"], + [7673, 0, "a"], + [7674, 0, "r"], + [7675, 0, "s"], + [7676, 0, " "], + [7677, 0, "i"], + [7678, 0, "n"], + [7679, 0, " "], + [7680, 0, "i"], + [7681, 0, "s"], + [7682, 0, "o"], + [7683, 0, "l"], + [7684, 0, "a"], + [7685, 0, "t"], + [7686, 0, "i"], + [7687, 0, "o"], + [7688, 0, "n"], + [7689, 0, ","], + [7690, 0, " "], + [7691, 0, "w"], + [7692, 0, "e"], + [7693, 0, " "], + [7694, 0, "a"], + [7695, 0, "r"], + [7696, 0, "e"], + [7697, 0, " "], + [7698, 0, "n"], + [7699, 0, "o"], + [7700, 0, "t"], + [7701, 0, " "], + [7702, 0, "a"], + [7703, 0, "w"], + [7704, 0, "a"], + [7705, 0, "r"], + [7706, 0, "e"], + [7707, 0, " "], + [7708, 0, "o"], + [7709, 0, "f"], + [7710, 0, " "], + [7711, 0, "a"], + [7712, 0, "n"], + [7713, 0, "y"], + [7714, 0, " "], + [7715, 0, "p"], + [7716, 0, "r"], + [7717, 0, "i"], + [7718, 0, "o"], + [7719, 0, "r"], + [7720, 0, " "], + [7721, 0, "w"], + [7722, 0, "o"], + [7723, 0, "r"], + [7724, 0, "k"], + [7725, 0, " "], + [7726, 0, "t"], + [7727, 0, "h"], + [7728, 0, "a"], + [7729, 0, "t"], + [7730, 0, " "], + [7731, 0, "a"], + [7732, 0, "l"], + [7733, 0, "l"], + [7734, 0, "o"], + [7735, 0, "w"], + [7736, 0, "s"], + [7737, 0, " "], + [7738, 0, "t"], + [7739, 0, "h"], + [7740, 0, "e"], + [7741, 0, "m"], + [7742, 0, " "], + [7743, 0, "a"], + [7744, 0, "l"], + [7745, 0, "l"], + [7746, 0, "t"], + [7747, 0, " "], + [7747, 1], + [7746, 1], + [7746, 0, " "], + [7747, 0, "t"], + [7748, 0, "o"], + [7749, 0, " "], + [7750, 0, "b"], + [7751, 0, "e"], + [7752, 0, " "], + [7753, 0, "c"], + [7754, 0, "o"], + [7755, 0, "m"], + [7756, 0, "p"], + [7757, 0, "o"], + [7758, 0, "s"], + [7759, 0, "e"], + [7760, 0, "d"], + [7761, 0, " "], + [7762, 0, "i"], + [7763, 0, "n"], + [7764, 0, "t"], + [7765, 0, "o"], + [7766, 0, " "], + [7767, 0, "a"], + [7768, 0, "n"], + [7769, 0, " "], + [7770, 0, "a"], + [7771, 0, "r"], + [7772, 0, "b"], + [7773, 0, "i"], + [7774, 0, "t"], + [7775, 0, "r"], + [7776, 0, "a"], + [7777, 0, "r"], + [7778, 0, "i"], + [7779, 0, "l"], + [7780, 0, "y"], + [7781, 0, " "], + [7782, 0, "n"], + [7783, 0, "e"], + [7784, 0, "s"], + [7785, 0, "t"], + [7786, 0, "e"], + [7787, 0, "d"], + [7788, 0, " "], + [7789, 0, "C"], + [7790, 0, "R"], + [7791, 0, "D"], + [7792, 0, "T"], + [7793, 0, " "], + [7794, 0, "w"], + [7795, 0, "i"], + [7796, 0, "t"], + [7797, 0, "h"], + [7798, 0, " "], + [7799, 0, "a"], + [7800, 0, " "], + [7801, 0, "J"], + [7802, 0, "S"], + [7803, 0, "O"], + [7804, 0, "N"], + [7805, 0, "-"], + [7806, 0, "l"], + [7807, 0, "i"], + [7808, 0, "k"], + [7809, 0, "e"], + [7810, 0, " "], + [7811, 0, "s"], + [7812, 0, "t"], + [7813, 0, "r"], + [7814, 0, "u"], + [7815, 0, "c"], + [7816, 0, "t"], + [7817, 0, "u"], + [7818, 0, "r"], + [7819, 0, "e"], + [7820, 0, "."], + [7821, 0, "\n"], + [7822, 0, "\n"], + [7823, 0, "\\"], + [7824, 0, "s"], + [7825, 0, "u"], + [7826, 0, "b"], + [7827, 0, "s"], + [7828, 0, "e"], + [7829, 0, "c"], + [7830, 0, "t"], + [7831, 0, "i"], + [7832, 0, "o"], + [7833, 0, "n"], + [7834, 0, "{"], + [7835, 0, "O"], + [7836, 0, "t"], + [7837, 0, "h"], + [7838, 0, "e"], + [7839, 0, "r"], + [7840, 0, " "], + [7841, 0, "a"], + [7842, 0, "p"], + [7843, 0, "p"], + [7844, 0, "r"], + [7845, 0, "o"], + [7846, 0, "a"], + [7847, 0, "c"], + [7848, 0, "h"], + [7849, 0, "e"], + [7850, 0, "s"], + [7851, 0, "}"], + [7852, 0, "\\"], + [7853, 0, "l"], + [7854, 0, "a"], + [7855, 0, "b"], + [7856, 0, "e"], + [7857, 0, "l"], + [7858, 0, "{"], + [7859, 0, "s"], + [7860, 0, "e"], + [7861, 0, "c"], + [7862, 0, ":"], + [7863, 0, "r"], + [7864, 0, "e"], + [7865, 0, "l"], + [7866, 0, "a"], + [7867, 0, "t"], + [7868, 0, "e"], + [7869, 0, "d"], + [7870, 0, "-"], + [7871, 0, "o"], + [7872, 0, "t"], + [7873, 0, "h"], + [7874, 0, "e"], + [7875, 0, "r"], + [7876, 0, "}"], + [7877, 0, "\n"], + [7878, 0, "\n"], + [7879, 0, "M"], + [7880, 0, "a"], + [7881, 0, "n"], + [7882, 0, "y"], + [7883, 0, " "], + [7884, 0, "r"], + [7885, 0, "e"], + [7886, 0, "p"], + [7887, 0, "l"], + [7888, 0, "i"], + [7889, 0, "c"], + [7890, 0, "a"], + [7891, 0, "t"], + [7892, 0, "e"], + [7893, 0, "d"], + [7894, 0, " "], + [7895, 0, "d"], + [7896, 0, "a"], + [7897, 0, "t"], + [7898, 0, "a"], + [7899, 0, " "], + [7900, 0, "s"], + [7901, 0, "y"], + [7902, 0, "s"], + [7903, 0, "t"], + [7904, 0, "e"], + [7905, 0, "m"], + [7906, 0, "s"], + [7907, 0, " "], + [7908, 0, "n"], + [7909, 0, "e"], + [7910, 0, "e"], + [7911, 0, "d"], + [7912, 0, " "], + [7913, 0, "t"], + [7914, 0, "o"], + [7915, 0, " "], + [7916, 0, "d"], + [7917, 0, "e"], + [7918, 0, "a"], + [7919, 0, "l"], + [7920, 0, " "], + [7921, 0, "w"], + [7922, 0, "i"], + [7923, 0, "t"], + [7924, 0, "h"], + [7925, 0, " "], + [7926, 0, "t"], + [7927, 0, "h"], + [7928, 0, "e"], + [7929, 0, " "], + [7930, 0, "p"], + [7931, 0, "r"], + [7932, 0, "o"], + [7933, 0, "b"], + [7934, 0, "l"], + [7935, 0, "e"], + [7936, 0, "m"], + [7937, 0, " "], + [7938, 0, "o"], + [7939, 0, "f"], + [7940, 0, " "], + [7941, 0, "c"], + [7942, 0, "o"], + [7943, 0, "n"], + [7944, 0, "c"], + [7945, 0, "u"], + [7946, 0, "r"], + [7947, 0, "r"], + [7948, 0, "e"], + [7949, 0, "n"], + [7950, 0, "t"], + [7951, 0, ","], + [7952, 0, " "], + [7953, 0, "c"], + [7954, 0, "o"], + [7955, 0, "n"], + [7956, 0, "f"], + [7957, 0, "l"], + [7958, 0, "i"], + [7959, 0, "c"], + [7960, 0, "t"], + [7961, 0, "i"], + [7962, 0, "n"], + [7963, 0, "g"], + [7964, 0, " "], + [7965, 0, "m"], + [7966, 0, "o"], + [7967, 0, "d"], + [7968, 0, "i"], + [7969, 0, "f"], + [7970, 0, "i"], + [7971, 0, "c"], + [7972, 0, "a"], + [7973, 0, "t"], + [7974, 0, "i"], + [7975, 0, "o"], + [7976, 0, "n"], + [7977, 0, "s"], + [7978, 0, ","], + [7979, 0, " "], + [7980, 0, "b"], + [7981, 0, "u"], + [7982, 0, "t"], + [7983, 0, " "], + [7984, 0, "t"], + [7985, 0, "h"], + [7986, 0, "e"], + [7987, 0, " "], + [7988, 0, "s"], + [7989, 0, "o"], + [7990, 0, "l"], + [7991, 0, "u"], + [7992, 0, "t"], + [7993, 0, "i"], + [7994, 0, "o"], + [7995, 0, "n"], + [7996, 0, "s"], + [7997, 0, " "], + [7998, 0, "a"], + [7999, 0, "r"], + [8000, 0, "e"], + [8001, 0, " "], + [8002, 0, "o"], + [8003, 0, "f"], + [8004, 0, "t"], + [8005, 0, "e"], + [8006, 0, "n"], + [8007, 0, " "], + [8008, 0, "a"], + [8009, 0, "d"], + [8010, 0, "-"], + [8011, 0, "h"], + [8012, 0, "o"], + [8013, 0, "c"], + [8014, 0, "."], + [8015, 0, " "], + [8016, 0, "F"], + [8017, 0, "o"], + [8018, 0, "r"], + [8019, 0, " "], + [8020, 0, "e"], + [8021, 0, "x"], + [8022, 0, "a"], + [8023, 0, "m"], + [8024, 0, "p"], + [8025, 0, "l"], + [8026, 0, "e"], + [8027, 0, ","], + [8028, 0, " "], + [8029, 0, "i"], + [8030, 0, "n"], + [8031, 0, " "], + [8032, 0, "D"], + [8033, 0, "y"], + [8034, 0, "n"], + [8035, 0, "a"], + [8036, 0, "m"], + [8037, 0, "o"], + [8038, 0, "~"], + [8039, 0, "\\"], + [8040, 0, "c"], + [8041, 0, "i"], + [8042, 0, "t"], + [8043, 0, "e"], + [8044, 0, "{"], + [8045, 0, "D"], + [8046, 0, "e"], + [8047, 0, "C"], + [8048, 0, "a"], + [8049, 0, "n"], + [8050, 0, "d"], + [8051, 0, "i"], + [8052, 0, "a"], + [8053, 0, ":"], + [8054, 0, "2"], + [8055, 0, "0"], + [8056, 0, "0"], + [8057, 0, "7"], + [8058, 0, "u"], + [8059, 0, "i"], + [8060, 0, "}"], + [8061, 0, ","], + [8062, 0, " "], + [8063, 0, "i"], + [8064, 0, "f"], + [8065, 0, " "], + [8066, 0, "s"], + [8067, 0, "e"], + [8068, 0, "v"], + [8069, 0, "e"], + [8070, 0, "r"], + [8071, 0, "a"], + [8072, 0, "l"], + [8073, 0, " "], + [8074, 0, "v"], + [8075, 0, "a"], + [8076, 0, "l"], + [8077, 0, "u"], + [8078, 0, "e"], + [8079, 0, "s"], + [8080, 0, " "], + [8081, 0, "a"], + [8082, 0, "r"], + [8083, 0, "e"], + [8084, 0, " "], + [8085, 0, "c"], + [8086, 0, "o"], + [8087, 0, "n"], + [8088, 0, "c"], + [8089, 0, "u"], + [8090, 0, "r"], + [8091, 0, "r"], + [8092, 0, "e"], + [8093, 0, "n"], + [8094, 0, "t"], + [8095, 0, "l"], + [8096, 0, "y"], + [8097, 0, " "], + [8098, 0, "w"], + [8099, 0, "r"], + [8100, 0, "i"], + [8101, 0, "t"], + [8102, 0, "t"], + [8103, 0, "e"], + [8104, 0, "n"], + [8105, 0, " "], + [8106, 0, "t"], + [8107, 0, "o"], + [8108, 0, " "], + [8109, 0, "t"], + [8110, 0, "h"], + [8111, 0, "e"], + [8112, 0, " "], + [8113, 0, "s"], + [8114, 0, "a"], + [8115, 0, "m"], + [8116, 0, "e"], + [8117, 0, " "], + [8118, 0, "k"], + [8119, 0, "e"], + [8120, 0, "y"], + [8121, 0, ","], + [8122, 0, " "], + [8123, 0, "t"], + [8124, 0, "h"], + [8125, 0, "e"], + [8126, 0, " "], + [8127, 0, "d"], + [8128, 0, "a"], + [8129, 0, "t"], + [8130, 0, "a"], + [8131, 0, "b"], + [8132, 0, "a"], + [8133, 0, "s"], + [8134, 0, "e"], + [8135, 0, " "], + [8136, 0, "p"], + [8137, 0, "r"], + [8138, 0, "e"], + [8139, 0, "s"], + [8140, 0, "e"], + [8141, 0, "r"], + [8142, 0, "v"], + [8143, 0, "e"], + [8144, 0, "s"], + [8145, 0, " "], + [8146, 0, "a"], + [8147, 0, "l"], + [8148, 0, "l"], + [8149, 0, " "], + [8150, 0, "o"], + [8151, 0, "f"], + [8152, 0, " "], + [8153, 0, "t"], + [8154, 0, "h"], + [8155, 0, "e"], + [8156, 0, "s"], + [8157, 0, "e"], + [8158, 0, " "], + [8159, 0, "v"], + [8160, 0, "a"], + [8161, 0, "l"], + [8162, 0, "u"], + [8163, 0, "e"], + [8164, 0, "s"], + [8165, 0, ","], + [8166, 0, " "], + [8167, 0, "a"], + [8168, 0, "n"], + [8169, 0, "d"], + [8170, 0, " "], + [8171, 0, "l"], + [8172, 0, "e"], + [8173, 0, "a"], + [8174, 0, "v"], + [8175, 0, "e"], + [8176, 0, "s"], + [8177, 0, " "], + [8178, 0, "c"], + [8179, 0, "o"], + [8180, 0, "n"], + [8181, 0, "f"], + [8182, 0, "l"], + [8183, 0, "i"], + [8184, 0, "c"], + [8185, 0, "t"], + [8186, 0, " "], + [8187, 0, "r"], + [8188, 0, "e"], + [8189, 0, "s"], + [8190, 0, "o"], + [8191, 0, "l"], + [8192, 0, "u"], + [8193, 0, "t"], + [8194, 0, "i"], + [8195, 0, "o"], + [8196, 0, "n"], + [8197, 0, " "], + [8198, 0, "t"], + [8199, 0, "o"], + [8200, 0, " "], + [8201, 0, "a"], + [8202, 0, "p"], + [8203, 0, "p"], + [8204, 0, "l"], + [8205, 0, "i"], + [8206, 0, "c"], + [8207, 0, "a"], + [8208, 0, "t"], + [8209, 0, "i"], + [8210, 0, "o"], + [8211, 0, "n"], + [8212, 0, " "], + [8213, 0, "c"], + [8214, 0, "o"], + [8215, 0, "d"], + [8216, 0, "e"], + [8217, 0, "."], + [8218, 0, " "], + [8219, 0, "N"], + [8220, 0, "a"], + [8221, 0, "i"], + [8222, 0, "v"], + [8223, 0, "e"], + [8224, 0, "l"], + [8225, 0, "y"], + [8226, 0, " "], + [8227, 0, "c"], + [8228, 0, "h"], + [8229, 0, "o"], + [8230, 0, "s"], + [8231, 0, "e"], + [8232, 0, "n"], + [8233, 0, " "], + [8234, 0, "m"], + [8235, 0, "e"], + [8236, 0, "r"], + [8237, 0, "g"], + [8238, 0, "e"], + [8239, 0, " "], + [8240, 0, "f"], + [8241, 0, "u"], + [8242, 0, "n"], + [8243, 0, "c"], + [8244, 0, "t"], + [8245, 0, "i"], + [8246, 0, "o"], + [8247, 0, "n"], + [8248, 0, "s"], + [8249, 0, " "], + [8250, 0, "o"], + [8251, 0, "f"], + [8252, 0, "t"], + [8253, 0, "e"], + [8254, 0, "n"], + [8255, 0, " "], + [8256, 0, "e"], + [8257, 0, "x"], + [8258, 0, "h"], + [8259, 0, "i"], + [8260, 0, "b"], + [8261, 0, "i"], + [8262, 0, "t"], + [8263, 0, " "], + [8264, 0, "a"], + [8265, 0, "n"], + [8266, 0, "o"], + [8267, 0, "m"], + [8268, 0, "a"], + [8269, 0, "l"], + [8270, 0, "i"], + [8271, 0, "e"], + [8272, 0, "s"], + [8273, 0, " "], + [8274, 0, "s"], + [8275, 0, "u"], + [8276, 0, "c"], + [8277, 0, "h"], + [8278, 0, " "], + [8279, 0, "a"], + [8280, 0, "s"], + [8281, 0, " "], + [8282, 0, "t"], + [8283, 0, "h"], + [8284, 0, "e"], + [8285, 0, " "], + [8285, 1], + [8284, 1], + [8283, 1], + [8282, 1], + [8282, 0, "d"], + [8283, 0, "e"], + [8284, 0, "l"], + [8285, 0, "e"], + [8286, 0, "t"], + [8287, 0, "e"], + [8288, 0, "d"], + [8289, 0, " "], + [8290, 0, "i"], + [8291, 0, "t"], + [8292, 0, "e"], + [8293, 0, "m"], + [8294, 0, "s"], + [8295, 0, " "], + [8296, 0, "r"], + [8297, 0, "e"], + [8298, 0, "a"], + [8299, 0, "p"], + [8300, 0, "p"], + [8301, 0, "e"], + [8302, 0, "a"], + [8303, 0, "r"], + [8304, 0, "i"], + [8305, 0, "n"], + [8306, 0, "g"], + [8307, 0, "~"], + [8308, 0, "\\"], + [8309, 0, "c"], + [8310, 0, "i"], + [8311, 0, "t"], + [8312, 0, "e"], + [8313, 0, "{"], + [8314, 0, "D"], + [8315, 0, "e"], + [8316, 0, "C"], + [8317, 0, "a"], + [8318, 0, "n"], + [8319, 0, "d"], + [8320, 0, "i"], + [8321, 0, "a"], + [8322, 0, ":"], + [8323, 0, "2"], + [8324, 0, "0"], + [8325, 0, "0"], + [8326, 0, "7"], + [8327, 0, "u"], + [8328, 0, "i"], + [8329, 0, "}"], + [8330, 0, "."], + [8331, 0, " "], + [8332, 0, "A"], + [8333, 0, "s"], + [8334, 0, " "], + [8335, 0, "t"], + [8336, 0, "h"], + [8337, 0, "e"], + [8338, 0, " "], + [8339, 0, "c"], + [8340, 0, "o"], + [8341, 0, "m"], + [8342, 0, "p"], + [8343, 0, "l"], + [8344, 0, "e"], + [8345, 0, "x"], + [8346, 0, "i"], + [8347, 0, "t"], + [8348, 0, "y"], + [8349, 0, " "], + [8350, 0, "o"], + [8351, 0, "f"], + [8352, 0, " "], + [8353, 0, "t"], + [8354, 0, "h"], + [8355, 0, "i"], + [8356, 0, "s"], + [8357, 0, " "], + [8358, 0, "p"], + [8359, 0, "a"], + [8360, 0, "p"], + [8361, 0, "e"], + [8362, 0, "r"], + [8363, 0, " "], + [8364, 0, "d"], + [8365, 0, "e"], + [8366, 0, "m"], + [8367, 0, "o"], + [8368, 0, "n"], + [8369, 0, "s"], + [8370, 0, "t"], + [8371, 0, "r"], + [8372, 0, "a"], + [8373, 0, "t"], + [8374, 0, "e"], + [8375, 0, "s"], + [8376, 0, ","], + [8377, 0, " "], + [8378, 0, "c"], + [8379, 0, "o"], + [8380, 0, "n"], + [8381, 0, "f"], + [8382, 0, "l"], + [8383, 0, "c"], + [8384, 0, "i"], + [8385, 0, "t"], + [8386, 0, " "], + [8387, 0, "r"], + [8388, 0, "e"], + [8389, 0, "s"], + [8390, 0, "o"], + [8391, 0, "l"], + [8392, 0, "u"], + [8393, 0, "t"], + [8394, 0, "i"], + [8395, 0, "o"], + [8396, 0, "n"], + [8397, 0, " "], + [8398, 0, "i"], + [8399, 0, "s"], + [8400, 0, " "], + [8401, 0, "n"], + [8402, 0, "o"], + [8403, 0, "t"], + [8404, 0, " "], + [8405, 0, "a"], + [8406, 0, " "], + [8407, 0, "s"], + [8408, 0, "i"], + [8409, 0, "m"], + [8410, 0, "p"], + [8411, 0, "l"], + [8412, 0, "e"], + [8413, 0, " "], + [8414, 0, "m"], + [8415, 0, "a"], + [8416, 0, "t"], + [8417, 0, "t"], + [8418, 0, "e"], + [8419, 0, "r"], + [8420, 0, " "], + [8421, 0, "t"], + [8422, 0, "h"], + [8423, 0, "a"], + [8424, 0, "n"], + [8425, 0, " "], + [8425, 1], + [8424, 1], + [8424, 0, "t"], + [8425, 0, " "], + [8426, 0, "c"], + [8427, 0, "a"], + [8428, 0, "n"], + [8429, 0, " "], + [8430, 0, "r"], + [8431, 0, "e"], + [8432, 0, "a"], + [8433, 0, "s"], + [8434, 0, "o"], + [8435, 0, "n"], + [8436, 0, "a"], + [8437, 0, "b"], + [8438, 0, "l"], + [8439, 0, "y"], + [8440, 0, " "], + [8441, 0, "b"], + [8442, 0, "e"], + [8443, 0, " "], + [8444, 0, "l"], + [8445, 0, "e"], + [8446, 0, "f"], + [8447, 0, "t"], + [8448, 0, " "], + [8449, 0, "t"], + [8450, 0, "o"], + [8451, 0, " "], + [8452, 0, "a"], + [8453, 0, "p"], + [8454, 0, "p"], + [8455, 0, "l"], + [8456, 0, "i"], + [8457, 0, "c"], + [8458, 0, "a"], + [8459, 0, "t"], + [8460, 0, "i"], + [8461, 0, "o"], + [8462, 0, "n"], + [8463, 0, " "], + [8464, 0, "p"], + [8465, 0, "r"], + [8466, 0, "o"], + [8467, 0, "g"], + [8468, 0, "r"], + [8469, 0, "a"], + [8470, 0, "m"], + [8471, 0, "m"], + [8472, 0, "e"], + [8473, 0, "r"], + [8474, 0, "s"], + [8475, 0, "."], + [8476, 0, "\n"], + [8477, 0, "\n"], + [8478, 0, "A"], + [8479, 0, "n"], + [8480, 0, "o"], + [8481, 0, "t"], + [8482, 0, "h"], + [8483, 0, "e"], + [8484, 0, "r"], + [8485, 0, " "], + [8486, 0, "f"], + [8487, 0, "r"], + [8488, 0, "e"], + [8489, 0, "q"], + [8490, 0, "u"], + [8491, 0, "e"], + [8492, 0, "n"], + [8493, 0, "t"], + [8494, 0, "l"], + [8495, 0, "y"], + [8496, 0, "-"], + [8497, 0, "u"], + [8498, 0, "s"], + [8499, 0, "e"], + [8500, 0, "d"], + [8501, 0, " "], + [8502, 0, "a"], + [8503, 0, "p"], + [8504, 0, "p"], + [8505, 0, "r"], + [8506, 0, "o"], + [8507, 0, "a"], + [8508, 0, "c"], + [8509, 0, "h"], + [8510, 0, " "], + [8511, 0, "t"], + [8512, 0, "o"], + [8513, 0, " "], + [8514, 0, "c"], + [8515, 0, "o"], + [8516, 0, "n"], + [8517, 0, "f"], + [8518, 0, "l"], + [8519, 0, "i"], + [8520, 0, "c"], + [8521, 0, "t"], + [8522, 0, " "], + [8523, 0, "r"], + [8524, 0, "e"], + [8525, 0, "s"], + [8526, 0, "o"], + [8527, 0, "l"], + [8528, 0, "u"], + [8529, 0, "t"], + [8530, 0, "i"], + [8531, 0, "o"], + [8532, 0, "n"], + [8533, 0, " "], + [8534, 0, "i"], + [8535, 0, "s"], + [8536, 0, " "], + [8537, 0, "\\"], + [8538, 0, "e"], + [8539, 0, "m"], + [8540, 0, "p"], + [8541, 0, "h"], + [8542, 0, "{"], + [8543, 0, "l"], + [8544, 0, "a"], + [8545, 0, "s"], + [8546, 0, "t"], + [8547, 0, " "], + [8548, 0, "w"], + [8549, 0, "r"], + [8550, 0, "i"], + [8551, 0, "t"], + [8552, 0, "e"], + [8553, 0, "r"], + [8554, 0, " "], + [8555, 0, "w"], + [8556, 0, "i"], + [8557, 0, "n"], + [8558, 0, "s"], + [8559, 0, "}"], + [8560, 0, " "], + [8561, 0, "("], + [8562, 0, "L"], + [8563, 0, "W"], + [8564, 0, "W"], + [8565, 0, ")"], + [8566, 0, ","], + [8567, 0, " "], + [8568, 0, "w"], + [8569, 0, "h"], + [8570, 0, "i"], + [8571, 0, "c"], + [8572, 0, "h"], + [8573, 0, " "], + [8574, 0, "a"], + [8575, 0, "r"], + [8576, 0, "b"], + [8577, 0, "i"], + [8578, 0, "t"], + [8579, 0, "r"], + [8580, 0, "a"], + [8581, 0, "r"], + [8582, 0, "i"], + [8583, 0, "l"], + [8584, 0, "y"], + [8585, 0, " "], + [8586, 0, "c"], + [8587, 0, "h"], + [8588, 0, "o"], + [8589, 0, "o"], + [8590, 0, "s"], + [8591, 0, "e"], + [8592, 0, "s"], + [8593, 0, " "], + [8594, 0, "o"], + [8595, 0, "n"], + [8596, 0, "e"], + [8597, 0, " "], + [8598, 0, "a"], + [8599, 0, "m"], + [8600, 0, "o"], + [8601, 0, "n"], + [8602, 0, "g"], + [8603, 0, " "], + [8604, 0, "s"], + [8605, 0, "e"], + [8606, 0, "v"], + [8607, 0, "e"], + [8608, 0, "r"], + [8609, 0, "a"], + [8610, 0, "l"], + [8611, 0, " "], + [8612, 0, "c"], + [8613, 0, "o"], + [8614, 0, "n"], + [8615, 0, "c"], + [8616, 0, "u"], + [8617, 0, "r"], + [8618, 0, "r"], + [8619, 0, "e"], + [8620, 0, "n"], + [8621, 0, "t"], + [8622, 0, " "], + [8623, 0, "w"], + [8624, 0, "r"], + [8625, 0, "i"], + [8626, 0, "t"], + [8627, 0, "e"], + [8628, 0, "s"], + [8629, 0, " "], + [8630, 0, "a"], + [8631, 0, "s"], + [8632, 0, " "], + [8633, 0, "`"], + [8634, 0, "`"], + [8635, 0, "w"], + [8636, 0, "i"], + [8637, 0, "n"], + [8638, 0, "n"], + [8639, 0, "e"], + [8640, 0, "r"], + [8641, 0, "'"], + [8642, 0, "'"], + [8643, 0, " "], + [8644, 0, "a"], + [8645, 0, "n"], + [8646, 0, "d"], + [8647, 0, " "], + [8648, 0, "d"], + [8649, 0, "i"], + [8650, 0, "s"], + [8651, 0, "c"], + [8652, 0, "a"], + [8653, 0, "r"], + [8654, 0, "d"], + [8655, 0, "s"], + [8656, 0, " "], + [8657, 0, "t"], + [8658, 0, "h"], + [8659, 0, "e"], + [8660, 0, " "], + [8661, 0, "o"], + [8662, 0, "t"], + [8663, 0, "h"], + [8664, 0, "e"], + [8665, 0, "r"], + [8666, 0, "s"], + [8667, 0, "."], + [8668, 0, " "], + [8669, 0, "T"], + [8670, 0, "h"], + [8671, 0, "i"], + [8672, 0, "s"], + [8673, 0, " "], + [8674, 0, "a"], + [8675, 0, "p"], + [8676, 0, "p"], + [8677, 0, "r"], + [8678, 0, "o"], + [8679, 0, "a"], + [8680, 0, "c"], + [8681, 0, "h"], + [8682, 0, " "], + [8683, 0, "i"], + [8684, 0, "s"], + [8685, 0, " "], + [8686, 0, "u"], + [8687, 0, "s"], + [8688, 0, "e"], + [8689, 0, "d"], + [8690, 0, " "], + [8691, 0, "i"], + [8692, 0, "n"], + [8693, 0, " "], + [8694, 0, "A"], + [8695, 0, "p"], + [8696, 0, "a"], + [8697, 0, "c"], + [8698, 0, "h"], + [8699, 0, "e"], + [8700, 0, " "], + [8701, 0, "C"], + [8702, 0, "a"], + [8703, 0, "s"], + [8704, 0, "s"], + [8705, 0, "a"], + [8706, 0, "n"], + [8707, 0, "d"], + [8708, 0, "r"], + [8709, 0, "a"], + [8710, 0, ","], + [8711, 0, " "], + [8712, 0, "a"], + [8713, 0, "n"], + [8714, 0, "d"], + [8715, 0, " "], + [8716, 0, "i"], + [8717, 0, "t"], + [8718, 0, " "], + [8719, 0, "i"], + [8720, 0, "s"], + [8721, 0, " "], + [8722, 0, "a"], + [8723, 0, "n"], + [8724, 0, " "], + [8725, 0, "o"], + [8726, 0, "p"], + [8727, 0, "e"], + [8727, 1], + [8727, 0, "t"], + [8728, 0, "i"], + [8729, 0, "o"], + [8730, 0, "n"], + [8731, 0, " "], + [8732, 0, "i"], + [8733, 0, "n"], + [8734, 0, " "], + [8735, 0, "m"], + [8736, 0, "a"], + [8737, 0, "n"], + [8738, 0, "y"], + [8739, 0, " "], + [8740, 0, "o"], + [8741, 0, "t"], + [8742, 0, "h"], + [8743, 0, "e"], + [8744, 0, "r"], + [8745, 0, " "], + [8746, 0, "s"], + [8747, 0, "y"], + [8748, 0, "s"], + [8749, 0, "t"], + [8750, 0, "e"], + [8751, 0, "m"], + [8752, 0, "s"], + [8753, 0, " "], + [8754, 0, "i"], + [8755, 0, "n"], + [8756, 0, "c"], + [8757, 0, "l"], + [8758, 0, "u"], + [8759, 0, "d"], + [8760, 0, "i"], + [8761, 0, "n"], + [8762, 0, "g"], + [8763, 0, " "], + [8764, 0, "R"], + [8765, 0, "i"], + [8766, 0, "a"], + [8767, 0, "k"], + [8768, 0, " "], + [8769, 0, "a"], + [8770, 0, "n"], + [8771, 0, "d"], + [8772, 0, " "], + [8773, 0, "C"], + [8774, 0, "o"], + [8775, 0, "u"], + [8776, 0, "c"], + [8777, 0, "h"], + [8778, 0, "D"], + [8779, 0, "B"], + [8780, 0, "."], + [8781, 0, " "], + [8782, 0, "L"], + [8783, 0, "W"], + [8784, 0, "W"], + [8785, 0, "W"], + [8785, 1], + [8785, 0, " "], + [8786, 0, "d"], + [8787, 0, "o"], + [8788, 0, "e"], + [8789, 0, "s"], + [8790, 0, " "], + [8791, 0, "n"], + [8792, 0, "o"], + [8793, 0, "t"], + [8794, 0, " "], + [8795, 0, "m"], + [8796, 0, "e"], + [8797, 0, "e"], + [8798, 0, "t"], + [8799, 0, " "], + [8800, 0, "o"], + [8801, 0, "u"], + [8802, 0, "r"], + [8803, 0, " "], + [8804, 0, "r"], + [8805, 0, "e"], + [8806, 0, "q"], + [8807, 0, "u"], + [8808, 0, "i"], + [8809, 0, "r"], + [8810, 0, "e"], + [8811, 0, "m"], + [8812, 0, "e"], + [8813, 0, "n"], + [8814, 0, "t"], + [8815, 0, "s"], + [8816, 0, ","], + [8817, 0, " "], + [8818, 0, "s"], + [8819, 0, "i"], + [8820, 0, "n"], + [8821, 0, "c"], + [8822, 0, "e"], + [8823, 0, " "], + [8824, 0, "w"], + [8825, 0, "e"], + [8826, 0, " "], + [8827, 0, "w"], + [8828, 0, "a"], + [8829, 0, "n"], + [8830, 0, "t"], + [8831, 0, " "], + [8832, 0, "n"], + [8833, 0, "o"], + [8834, 0, " "], + [8835, 0, "u"], + [8836, 0, "s"], + [8837, 0, "e"], + [8838, 0, "r"], + [8839, 0, " "], + [8840, 0, "i"], + [8841, 0, "n"], + [8842, 0, "p"], + [8843, 0, "u"], + [8844, 0, "t"], + [8845, 0, " "], + [8846, 0, "t"], + [8847, 0, "o"], + [8848, 0, " "], + [8849, 0, "b"], + [8850, 0, "e"], + [8851, 0, " "], + [8852, 0, "l"], + [8853, 0, "o"], + [8854, 0, "s"], + [8855, 0, "t"], + [8856, 0, " "], + [8857, 0, "d"], + [8858, 0, "u"], + [8859, 0, "e"], + [8860, 0, " "], + [8861, 0, "t"], + [8862, 0, "o"], + [8863, 0, " "], + [8864, 0, "c"], + [8865, 0, "o"], + [8866, 0, "n"], + [8867, 0, "c"], + [8868, 0, "u"], + [8869, 0, "r"], + [8870, 0, "r"], + [8871, 0, "e"], + [8872, 0, "n"], + [8873, 0, "t"], + [8874, 0, " "], + [8875, 0, "m"], + [8876, 0, "o"], + [8877, 0, "d"], + [8878, 0, "i"], + [8879, 0, "f"], + [8880, 0, "i"], + [8881, 0, "c"], + [8882, 0, "a"], + [8883, 0, "t"], + [8884, 0, "i"], + [8885, 0, "o"], + [8886, 0, "n"], + [8887, 0, "s"], + [8888, 0, "."], + [8889, 0, "\n"], + [8890, 0, "\n"], + [8891, 0, "F"], + [8892, 0, "i"], + [8893, 0, "n"], + [8894, 0, "a"], + [8895, 0, "l"], + [8896, 0, "l"], + [8897, 0, "y"], + [8898, 0, ","], + [8899, 0, " "], + [8900, 0, "s"], + [8901, 0, "y"], + [8902, 0, "s"], + [8903, 0, "t"], + [8904, 0, "e"], + [8905, 0, "m"], + [8906, 0, "s"], + [8907, 0, " "], + [8908, 0, "s"], + [8909, 0, "u"], + [8910, 0, "c"], + [8911, 0, "h"], + [8912, 0, " "], + [8913, 0, "a"], + [8914, 0, "s"], + [8915, 0, " "], + [8916, 0, "B"], + [8917, 0, "a"], + [8918, 0, "y"], + [8919, 0, "o"], + [8920, 0, "u"], + [8921, 0, "~"], + [8922, 0, "\\"], + [8923, 0, "c"], + [8924, 0, "i"], + [8925, 0, "t"], + [8926, 0, "e"], + [8927, 0, "{"], + [8928, 0, "T"], + [8929, 0, "e"], + [8930, 0, "r"], + [8931, 0, "r"], + [8932, 0, "y"], + [8933, 0, ":"], + [8934, 0, "1"], + [8935, 0, "0"], + [8935, 1], + [8935, 0, "9"], + [8936, 0, "9"], + [8937, 0, "5"], + [8938, 0, "d"], + [8939, 0, "n"], + [8940, 0, "}"], + [8941, 0, " "], + [8942, 0, "a"], + [8943, 0, "l"], + [8944, 0, "l"], + [8945, 0, "o"], + [8946, 0, "w"], + [8947, 0, " "], + [8948, 0, "o"], + [8949, 0, "f"], + [8950, 0, "f"], + [8951, 0, "l"], + [8952, 0, "i"], + [8953, 0, "n"], + [8954, 0, "e"], + [8955, 0, " "], + [8956, 0, "n"], + [8957, 0, "o"], + [8958, 0, "d"], + [8959, 0, "e"], + [8960, 0, "s"], + [8961, 0, " "], + [8962, 0, "t"], + [8963, 0, "o"], + [8964, 0, " "], + [8965, 0, "e"], + [8966, 0, "x"], + [8967, 0, "e"], + [8968, 0, "c"], + [8969, 0, "u"], + [8970, 0, "t"], + [8971, 0, "e"], + [8972, 0, " "], + [8973, 0, "t"], + [8974, 0, "r"], + [8975, 0, "a"], + [8976, 0, "n"], + [8977, 0, "s"], + [8978, 0, "a"], + [8979, 0, "c"], + [8980, 0, "t"], + [8981, 0, "i"], + [8982, 0, "o"], + [8983, 0, "n"], + [8984, 0, "s"], + [8985, 0, " "], + [8986, 0, "t"], + [8987, 0, "e"], + [8988, 0, "n"], + [8989, 0, "t"], + [8990, 0, "a"], + [8991, 0, "t"], + [8992, 0, "i"], + [8993, 0, "v"], + [8994, 0, "e"], + [8995, 0, "l"], + [8996, 0, "y"], + [8997, 0, ","], + [8998, 0, " "], + [8999, 0, "a"], + [9000, 0, "n"], + [9001, 0, "d"], + [9002, 0, " "], + [9003, 0, " "], + [9004, 0, "o"], + [9005, 0, "n"], + [9005, 1], + [9004, 1], + [9003, 1], + [9003, 0, "c"], + [9004, 0, "o"], + [9005, 0, "n"], + [9006, 0, "f"], + [9007, 0, "i"], + [9008, 0, "r"], + [9009, 0, "m"], + [9010, 0, " "], + [9011, 0, "t"], + [9012, 0, "h"], + [9013, 0, "e"], + [9014, 0, "m"], + [9015, 0, " "], + [9016, 0, "w"], + [9017, 0, "h"], + [9018, 0, "e"], + [9019, 0, "n"], + [9020, 0, " "], + [9021, 0, "t"], + [9022, 0, "h"], + [9023, 0, "e"], + [9024, 0, "y"], + [9025, 0, " "], + [9026, 0, "a"], + [9027, 0, "r"], + [9028, 0, "e"], + [9029, 0, " "], + [9030, 0, "n"], + [9031, 0, "e"], + [9032, 0, "x"], + [9033, 0, "t"], + [9034, 0, " "], + [9035, 0, "o"], + [9036, 0, "n"], + [9037, 0, "l"], + [9038, 0, "i"], + [9039, 0, "n"], + [9040, 0, "e"], + [9041, 0, "."], + [9042, 0, " "], + [9043, 0, "T"], + [9044, 0, "h"], + [9045, 0, "i"], + [9046, 0, "s"], + [9047, 0, " "], + [9048, 0, "a"], + [9049, 0, "p"], + [9050, 0, "p"], + [9051, 0, "r"], + [9052, 0, "o"], + [9053, 0, "a"], + [9054, 0, "c"], + [9055, 0, "h"], + [9056, 0, " "], + [9057, 0, "r"], + [9058, 0, "e"], + [9059, 0, "l"], + [9060, 0, "i"], + [9061, 0, "e"], + [9062, 0, "s"], + [9063, 0, " "], + [9064, 0, "o"], + [9065, 0, "n"], + [9066, 0, " "], + [9067, 0, "a"], + [9068, 0, "l"], + [9069, 0, "l"], + [9070, 0, " "], + [9071, 0, "s"], + [9072, 0, "e"], + [9073, 0, "r"], + [9074, 0, "v"], + [9075, 0, "e"], + [9076, 0, "r"], + [9077, 0, "s"], + [9078, 0, " "], + [9079, 0, "e"], + [9080, 0, "x"], + [9081, 0, "e"], + [9082, 0, "c"], + [9083, 0, "u"], + [9084, 0, "t"], + [9085, 0, "i"], + [9086, 0, "n"], + [9087, 0, "g"], + [9088, 0, " "], + [9089, 0, "t"], + [9090, 0, "r"], + [9091, 0, "a"], + [9092, 0, "n"], + [9093, 0, "s"], + [9094, 0, "a"], + [9095, 0, "c"], + [9096, 0, "t"], + [9097, 0, "i"], + [9098, 0, "o"], + [9099, 0, "n"], + [9100, 0, "s"], + [9101, 0, " "], + [9102, 0, "i"], + [9103, 0, "n"], + [9104, 0, " "], + [9105, 0, "t"], + [9106, 0, "h"], + [9107, 0, "e"], + [9108, 0, " "], + [9109, 0, "s"], + [9110, 0, "a"], + [9111, 0, "m"], + [9112, 0, "e"], + [9113, 0, " "], + [9114, 0, "s"], + [9115, 0, "e"], + [9116, 0, "r"], + [9117, 0, "i"], + [9118, 0, "a"], + [9119, 0, "l"], + [9120, 0, " "], + [9121, 0, "o"], + [9122, 0, "r"], + [9123, 0, "d"], + [9124, 0, "e"], + [9125, 0, "r"], + [9126, 0, ","], + [9127, 0, " "], + [9128, 0, "a"], + [9129, 0, "n"], + [9130, 0, "d"], + [9131, 0, " "], + [9132, 0, "d"], + [9133, 0, "e"], + [9134, 0, "c"], + [9135, 0, "i"], + [9136, 0, "d"], + [9137, 0, "i"], + [9138, 0, "n"], + [9139, 0, "g"], + [9140, 0, " "], + [9141, 0, "w"], + [9142, 0, "h"], + [9143, 0, "e"], + [9144, 0, "t"], + [9145, 0, "h"], + [9146, 0, "e"], + [9147, 0, "r"], + [9148, 0, " "], + [9149, 0, "a"], + [9150, 0, " "], + [9151, 0, "t"], + [9152, 0, "r"], + [9153, 0, "a"], + [9154, 0, "n"], + [9155, 0, "s"], + [9156, 0, "a"], + [9157, 0, "c"], + [9158, 0, "t"], + [9159, 0, "i"], + [9160, 0, "o"], + [9161, 0, "n"], + [9162, 0, " "], + [9163, 0, "w"], + [9164, 0, "a"], + [9165, 0, "n"], + [9165, 1], + [9165, 0, "s"], + [9166, 0, " "], + [9167, 0, "s"], + [9168, 0, "u"], + [9169, 0, "c"], + [9170, 0, "c"], + [9171, 0, "e"], + [9172, 0, "s"], + [9173, 0, "s"], + [9174, 0, "f"], + [9175, 0, "u"], + [9176, 0, "l"], + [9177, 0, " "], + [9178, 0, "d"], + [9179, 0, "e"], + [9180, 0, "p"], + [9181, 0, "e"], + [9182, 0, "n"], + [9183, 0, "d"], + [9184, 0, "i"], + [9185, 0, "n"], + [9186, 0, "g"], + [9187, 0, " "], + [9188, 0, "o"], + [9189, 0, "n"], + [9190, 0, " "], + [9191, 0, "i"], + [9192, 0, "t"], + [9193, 0, "s"], + [9194, 0, " "], + [9195, 0, "p"], + [9196, 0, "r"], + [9197, 0, "e"], + [9198, 0, "c"], + [9199, 0, "o"], + [9200, 0, "n"], + [9201, 0, "d"], + [9202, 0, "i"], + [9203, 0, "t"], + [9204, 0, "i"], + [9205, 0, "o"], + [9206, 0, "n"], + [9207, 0, "s"], + [9208, 0, "."], + [9209, 0, " "], + [9210, 0, "A"], + [9211, 0, "s"], + [9212, 0, " "], + [9213, 0, "d"], + [9214, 0, "i"], + [9215, 0, "s"], + [9216, 0, "c"], + [9217, 0, "u"], + [9218, 0, "s"], + [9219, 0, "s"], + [9220, 0, "e"], + [9221, 0, "d"], + [9222, 0, " "], + [9223, 0, "i"], + [9224, 0, "n"], + [9225, 0, " "], + [9226, 0, "s"], + [9227, 0, "e"], + [9228, 0, "c"], + [9229, 0, "t"], + [9230, 0, "i"], + [9231, 0, "o"], + [9232, 0, "n"], + [9233, 0, "~"], + [9234, 0, "\\"], + [9235, 0, "r"], + [9236, 0, "e"], + [9237, 0, "f"], + [9238, 0, "{"], + [9239, 0, "s"], + [9240, 0, "e"], + [9241, 0, "c"], + [9242, 0, ":"], + [9243, 0, "r"], + [9244, 0, "e"], + [9245, 0, "l"], + [9246, 0, "a"], + [9247, 0, "t"], + [9248, 0, "e"], + [9249, 0, "d"], + [9250, 0, "-"], + [9251, 0, "o"], + [9252, 0, "t"], + [9253, 0, "}"], + [9254, 0, ","], + [9255, 0, " "], + [9256, 0, "s"], + [9257, 0, "u"], + [9258, 0, "c"], + [9259, 0, "h"], + [9260, 0, " "], + [9261, 0, "s"], + [9262, 0, "e"], + [9263, 0, "r"], + [9264, 0, "i"], + [9265, 0, "a"], + [9266, 0, "l"], + [9267, 0, " "], + [9268, 0, "o"], + [9269, 0, "r"], + [9270, 0, "d"], + [9271, 0, "e"], + [9272, 0, "r"], + [9273, 0, "i"], + [9274, 0, "n"], + [9275, 0, "g"], + [9276, 0, " "], + [9277, 0, "r"], + [9278, 0, "e"], + [9279, 0, "q"], + [9280, 0, "u"], + [9281, 0, "i"], + [9282, 0, "r"], + [9283, 0, "e"], + [9284, 0, "m"], + [9285, 0, "e"], + [9286, 0, "n"], + [9287, 0, "t"], + [9288, 0, "s"], + [9289, 0, " "], + [9290, 0, "a"], + [9291, 0, "r"], + [9292, 0, "e"], + [9293, 0, " "], + [9294, 0, "p"], + [9295, 0, "r"], + [9296, 0, "o"], + [9297, 0, "h"], + [9298, 0, "i"], + [9299, 0, "b"], + [9300, 0, "i"], + [9301, 0, "t"], + [9302, 0, "i"], + [9303, 0, "v"], + [9304, 0, "e"], + [9305, 0, " "], + [9306, 0, "i"], + [9307, 0, "n"], + [9308, 0, " "], + [9309, 0, "a"], + [9310, 0, " "], + [9311, 0, "p"], + [9312, 0, "e"], + [9313, 0, "e"], + [9314, 0, "r"], + [9315, 0, "-"], + [9316, 0, "t"], + [9317, 0, "o"], + [9318, 0, "-"], + [9319, 0, "p"], + [9320, 0, "e"], + [9321, 0, "e"], + [9322, 0, "r"], + [9323, 0, " "], + [9324, 0, "s"], + [9325, 0, "y"], + [9326, 0, "s"], + [9327, 0, "t"], + [9328, 0, "e"], + [9329, 0, "m"], + [9330, 0, " "], + [9331, 0, "o"], + [9332, 0, "f"], + [9333, 0, " "], + [9334, 0, "m"], + [9335, 0, "o"], + [9336, 0, "b"], + [9337, 0, "i"], + [9338, 0, "l"], + [9339, 0, "e"], + [9340, 0, " "], + [9341, 0, "d"], + [9342, 0, "e"], + [9343, 0, "v"], + [9344, 0, "i"], + [9345, 0, "c"], + [9346, 0, "e"], + [9347, 0, "s"], + [9348, 0, "."], + [9351, 0, "\n"], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [75235, 1], + [62368, 0, "\n"], + [62369, 0, "\n"], + [62370, 0, "\n"], + [62371, 0, "\\"], + [62372, 0, "s"], + [62373, 0, "e"], + [62374, 0, "c"], + [62375, 0, "t"], + [62376, 0, "i"], + [62377, 0, "o"], + [62378, 0, "n"], + [62379, 0, "{"], + [62380, 0, "C"], + [62381, 0, "o"], + [62382, 0, "n"], + [62383, 0, "c"], + [62384, 0, "l"], + [62385, 0, "u"], + [62386, 0, "s"], + [62387, 0, "i"], + [62388, 0, "o"], + [62389, 0, "n"], + [62390, 0, "}"], + [62391, 0, "\n"], + [62392, 0, "\n"], + [62393, 0, "T"], + [62394, 0, "O"], + [62395, 0, "D"], + [62396, 0, "O"], + [62397, 0, " "], + [62398, 0, "c"], + [62399, 0, "o"], + [62400, 0, "n"], + [62401, 0, "c"], + [62402, 0, "l"], + [62403, 0, "u"], + [62404, 0, "s"], + [62405, 0, "i"], + [62406, 0, "o"], + [62407, 0, "n"], + [62408, 0, "."], + [62409, 0, "\n"], + [62410, 0, "\n"], + [62411, 0, "\n"], + [62412, 0, "\\"], + [62413, 0, "s"], + [62414, 0, "e"], + [62415, 0, "c"], + [62416, 0, "t"], + [62417, 0, "i"], + [62418, 0, "o"], + [62419, 0, "n"], + [62420, 0, "*"], + [62421, 0, "{"], + [62422, 0, "A"], + [62423, 0, "c"], + [62424, 0, "k"], + [62425, 0, "n"], + [62426, 0, "o"], + [62427, 0, "w"], + [62428, 0, "l"], + [62429, 0, "e"], + [62430, 0, "d"], + [62431, 0, "g"], + [62432, 0, "e"], + [62433, 0, "m"], + [62434, 0, "e"], + [62435, 0, "n"], + [62436, 0, "t"], + [62437, 0, "s"], + [62438, 0, "}"], + [62439, 0, "\n"], + [62440, 0, "\n"], + [62441, 0, "T"], + [62442, 0, "h"], + [62443, 0, "i"], + [62444, 0, "s"], + [62445, 0, " "], + [62446, 0, "r"], + [62447, 0, "e"], + [62448, 0, "s"], + [62449, 0, "e"], + [62450, 0, "a"], + [62451, 0, "r"], + [62452, 0, "c"], + [62453, 0, "h"], + [62454, 0, " "], + [62455, 0, "w"], + [62456, 0, "a"], + [62457, 0, "s"], + [62458, 0, " "], + [62459, 0, "s"], + [62460, 0, "u"], + [62461, 0, "p"], + [62462, 0, "p"], + [62463, 0, "o"], + [62464, 0, "r"], + [62465, 0, "t"], + [62466, 0, "e"], + [62467, 0, "d"], + [62468, 0, " "], + [62469, 0, "b"], + [62470, 0, "y"], + [62471, 0, " "], + [62472, 0, "a"], + [62473, 0, " "], + [62474, 0, "g"], + [62475, 0, "r"], + [62476, 0, "a"], + [62477, 0, "n"], + [62478, 0, "t"], + [62479, 0, " "], + [62480, 0, "f"], + [62481, 0, "r"], + [62482, 0, "o"], + [62483, 0, "m"], + [62484, 0, " "], + [62485, 0, "T"], + [62486, 0, "h"], + [62487, 0, "e"], + [62488, 0, " "], + [62489, 0, "B"], + [62490, 0, "o"], + [62491, 0, "e"], + [62492, 0, "i"], + [62493, 0, "n"], + [62494, 0, "g"], + [62495, 0, " "], + [62496, 0, "C"], + [62497, 0, "o"], + [62498, 0, "m"], + [62499, 0, "p"], + [62500, 0, "a"], + [62501, 0, "n"], + [62502, 0, "y"], + [62503, 0, "."], + [62504, 0, "\n"], + [62521, 0, "\\"], + [62522, 0, "a"], + [62523, 0, "p"], + [62524, 0, "p"], + [62525, 0, "e"], + [62526, 0, "n"], + [62527, 0, "d"], + [62528, 0, "i"], + [62529, 0, "c"], + [62530, 0, "e"], + [62531, 0, "s"], + [62532, 0, "\n"], + [62533, 0, "\\"], + [62534, 0, "s"], + [62535, 0, "e"], + [62536, 0, "c"], + [62537, 0, "t"], + [62538, 0, "i"], + [62539, 0, "o"], + [62540, 0, "n"], + [62541, 0, "{"], + [62542, 0, "P"], + [62543, 0, "r"], + [62544, 0, "o"], + [62545, 0, "o"], + [62546, 0, "f"], + [62547, 0, " "], + [62548, 0, "o"], + [62549, 0, "f"], + [62550, 0, " "], + [62551, 0, "c"], + [62552, 0, "o"], + [62553, 0, "n"], + [62554, 0, "v"], + [62555, 0, "e"], + [62556, 0, "r"], + [62557, 0, "g"], + [62558, 0, "e"], + [62559, 0, "n"], + [62560, 0, "c"], + [62561, 0, "e"], + [62562, 0, "}"], + [62563, 0, "\n"], + [62505, 0, "\n"], + [62506, 0, "\\"], + [62507, 0, "b"], + [62508, 0, "i"], + [62509, 0, "b"], + [62510, 0, "l"], + [62511, 0, "i"], + [62512, 0, "o"], + [62513, 0, "g"], + [62514, 0, "r"], + [62515, 0, "a"], + [62516, 0, "p"], + [62517, 0, "h"], + [62518, 0, "y"], + [62519, 0, "s"], + [62520, 0, "t"], + [62521, 0, "y"], + [62522, 0, "l"], + [62523, 0, "e"], + [62524, 0, "{"], + [62525, 0, "I"], + [62526, 0, "E"], + [62527, 0, "E"], + [62528, 0, "E"], + [62529, 0, "t"], + [62530, 0, "r"], + [62531, 0, "a"], + [62532, 0, "n"], + [62533, 0, "}"], + [62534, 0, "\n"], + [62535, 0, "\\"], + [62536, 0, "b"], + [62537, 0, "i"], + [62538, 0, "b"], + [62539, 0, "l"], + [62540, 0, "i"], + [62541, 0, "o"], + [62542, 0, "g"], + [62543, 0, "r"], + [62544, 0, "a"], + [62545, 0, "p"], + [62546, 0, "h"], + [62547, 0, "y"], + [62548, 0, "{"], + [62549, 0, "r"], + [62550, 0, "e"], + [62551, 0, "f"], + [62552, 0, "e"], + [62553, 0, "r"], + [62554, 0, "e"], + [62555, 0, "n"], + [62556, 0, "c"], + [62557, 0, "e"], + [62558, 0, "s"], + [62559, 0, "}"], + [62560, 0, "{"], + [62561, 0, "}"], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75472, 1], + [75471, 1], + [1065, 1], + [1064, 1], + [1063, 1], + [1062, 1], + [1062, 0, "M"], + [1063, 0, "a"], + [1064, 0, "n"], + [1065, 0, "y"], + [1066, 0, " "], + [1067, 0, "a"], + [1068, 0, "p"], + [1069, 0, "p"], + [1070, 0, "l"], + [1071, 0, "i"], + [1072, 0, "c"], + [1073, 0, "a"], + [1074, 0, "t"], + [1075, 0, "i"], + [1076, 0, "o"], + [1077, 0, "n"], + [1078, 0, "s"], + [1079, 0, " "], + [1080, 0, "m"], + [1081, 0, "o"], + [1082, 0, "d"], + [1083, 0, "e"], + [1084, 0, "l"], + [1085, 0, " "], + [1086, 0, "t"], + [1087, 0, "h"], + [1088, 0, "e"], + [1089, 0, "i"], + [1090, 0, "r"], + [1091, 0, " "], + [1092, 0, "d"], + [1093, 0, "a"], + [1094, 0, "t"], + [1095, 0, "a"], + [1096, 0, " "], + [1097, 0, "i"], + [1098, 0, "n"], + [1099, 0, " "], + [1100, 0, "a"], + [1101, 0, " "], + [1102, 0, "g"], + [1103, 0, "e"], + [1104, 0, "n"], + [1105, 0, "e"], + [1106, 0, "r"], + [1107, 0, "a"], + [1108, 0, "l"], + [1109, 0, "-"], + [1110, 0, "p"], + [1111, 0, "u"], + [1112, 0, "r"], + [1113, 0, "p"], + [1114, 0, "o"], + [1115, 0, "s"], + [1116, 0, "e"], + [1117, 0, " "], + [1118, 0, "s"], + [1119, 0, "t"], + [1120, 0, "o"], + [1121, 0, "r"], + [1122, 0, "a"], + [1123, 0, "g"], + [1124, 0, "e"], + [1125, 0, " "], + [1126, 0, "f"], + [1127, 0, "o"], + [1128, 0, "r"], + [1129, 0, "m"], + [1130, 0, "a"], + [1131, 0, "t"], + [1132, 0, " "], + [1133, 0, "s"], + [1134, 0, "u"], + [1135, 0, "c"], + [1136, 0, "h"], + [1137, 0, " "], + [1138, 0, "a"], + [1139, 0, "s"], + [1140, 0, " "], + [1141, 0, "J"], + [1142, 0, "S"], + [1143, 0, "O"], + [1144, 0, "N"], + [1145, 0, "."], + [1146, 0, " "], + [1147, 0, "F"], + [1147, 1], + [1147, 0, "T"], + [1148, 0, "h"], + [1149, 0, "i"], + [1150, 0, "s"], + [1151, 0, " "], + [1152, 0, "d"], + [1153, 0, "a"], + [1154, 0, "t"], + [1155, 0, "a"], + [1156, 0, " "], + [1157, 0, "s"], + [1158, 0, "t"], + [1159, 0, "r"], + [1160, 0, "u"], + [1161, 0, "c"], + [1162, 0, "t"], + [1163, 0, "u"], + [1164, 0, "r"], + [1165, 0, "e"], + [1166, 0, " "], + [1167, 0, "i"], + [1168, 0, "s"], + [1169, 0, " "], + [1170, 0, "m"], + [1171, 0, "o"], + [1172, 0, "d"], + [1173, 0, "i"], + [1174, 0, "f"], + [1175, 0, "i"], + [1176, 0, "e"], + [1177, 0, "d"], + [1178, 0, " "], + [1179, 0, "b"], + [1180, 0, "y"], + [1181, 0, " "], + [1182, 0, "t"], + [1183, 0, "h"], + [1184, 0, "e"], + [1185, 0, " "], + [1186, 0, "a"], + [1187, 0, "p"], + [1188, 0, "p"], + [1189, 0, "l"], + [1190, 0, "i"], + [1191, 0, "c"], + [1192, 0, "a"], + [1193, 0, "t"], + [1194, 0, "i"], + [1195, 0, "o"], + [1196, 0, "n"], + [1197, 0, " "], + [1198, 0, "a"], + [1199, 0, "s"], + [1200, 0, " "], + [1201, 0, "a"], + [1202, 0, " "], + [1203, 0, "r"], + [1204, 0, "e"], + [1205, 0, "s"], + [1206, 0, "u"], + [1207, 0, "l"], + [1208, 0, "t"], + [1209, 0, " "], + [1210, 0, "o"], + [1211, 0, "f"], + [1212, 0, " "], + [1213, 0, "u"], + [1214, 0, "s"], + [1215, 0, "e"], + [1216, 0, "r"], + [1217, 0, " "], + [1218, 0, "i"], + [1219, 0, "n"], + [1220, 0, "p"], + [1221, 0, "u"], + [1222, 0, "t"], + [1223, 0, "."], + [1224, 0, " "], + [1225, 0, "S"], + [1226, 0, "u"], + [1227, 0, "c"], + [1228, 0, "h"], + [1229, 0, " "], + [1230, 0, "m"], + [1231, 0, "o"], + [1232, 0, "d"], + [1233, 0, "i"], + [1234, 0, "f"], + [1235, 0, "i"], + [1236, 0, "c"], + [1237, 0, "a"], + [1238, 0, "t"], + [1239, 0, "i"], + [1240, 0, "o"], + [1241, 0, "n"], + [1242, 0, "s"], + [1243, 0, " "], + [1244, 0, "a"], + [1245, 0, "r"], + [1246, 0, "e"], + [1247, 0, " "], + [1248, 0, "w"], + [1249, 0, "e"], + [1250, 0, "l"], + [1251, 0, "l"], + [1252, 0, " "], + [1253, 0, "u"], + [1254, 0, "n"], + [1255, 0, "d"], + [1256, 0, "e"], + [1257, 0, "r"], + [1258, 0, "s"], + [1259, 0, "t"], + [1260, 0, "o"], + [1261, 0, "o"], + [1262, 0, "d"], + [1263, 0, " "], + [1264, 0, "i"], + [1265, 0, "f"], + [1266, 0, " "], + [1267, 0, "t"], + [1267, 1], + [1267, 0, "p"], + [1268, 0, "e"], + [1269, 0, "r"], + [1270, 0, "f"], + [1271, 0, "o"], + [1272, 0, "r"], + [1273, 0, "m"], + [1274, 0, "e"], + [1275, 0, "d"], + [1276, 0, " "], + [1277, 0, "s"], + [1278, 0, "e"], + [1279, 0, "q"], + [1280, 0, "u"], + [1281, 0, "e"], + [1282, 0, "n"], + [1283, 0, "t"], + [1284, 0, "i"], + [1285, 0, "a"], + [1286, 0, "l"], + [1287, 0, "l"], + [1288, 0, "y"], + [1289, 0, " "], + [1290, 0, "o"], + [1291, 0, "n"], + [1292, 0, " "], + [1293, 0, "a"], + [1294, 0, " "], + [1295, 0, "s"], + [1296, 0, "i"], + [1297, 0, "n"], + [1298, 0, "g"], + [1299, 0, "l"], + [1300, 0, "e"], + [1301, 0, " "], + [1302, 0, "c"], + [1303, 0, "o"], + [1304, 0, "p"], + [1305, 0, "y"], + [1306, 0, " "], + [1307, 0, "o"], + [1308, 0, "f"], + [1309, 0, " "], + [1310, 0, "t"], + [1311, 0, "h"], + [1312, 0, "e"], + [1313, 0, " "], + [1314, 0, "d"], + [1315, 0, "a"], + [1316, 0, "t"], + [1317, 0, "a"], + [1318, 0, ","], + [1319, 0, " "], + [1320, 0, "b"], + [1321, 0, "u"], + [1322, 0, "t"], + [1323, 0, " "], + [1324, 0, "t"], + [1325, 0, "h"], + [1326, 0, "e"], + [1327, 0, " "], + [1328, 0, "s"], + [1329, 0, "e"], + [1330, 0, "m"], + [1331, 0, "a"], + [1332, 0, "n"], + [1333, 0, "t"], + [1334, 0, "i"], + [1335, 0, "c"], + [1336, 0, "s"], + [1337, 0, " "], + [1338, 0, "a"], + [1339, 0, "r"], + [1340, 0, "e"], + [1341, 0, " "], + [1341, 1], + [1340, 1], + [1339, 1], + [1338, 1], + [1338, 0, "i"], + [1339, 0, "s"], + [1340, 0, " "], + [1341, 0, "u"], + [1342, 0, "n"], + [1343, 0, "c"], + [1344, 0, "l"], + [1345, 0, "e"], + [1346, 0, "a"], + [1347, 0, "r"], + [1348, 0, " "], + [1349, 0, "i"], + [1350, 0, "f"], + [1351, 0, " "], + [1352, 0, "d"], + [1353, 0, "a"], + [1354, 0, "t"], + [1354, 1], + [1353, 1], + [1352, 1], + [1352, 0, "t"], + [1353, 0, "h"], + [1354, 0, "e"], + [1355, 0, " "], + [1356, 0, "d"], + [1357, 0, "a"], + [1358, 0, "t"], + [1359, 0, "a"], + [1360, 0, " "], + [1361, 0, "i"], + [1362, 0, "s"], + [1363, 0, " "], + [1364, 0, "r"], + [1365, 0, "e"], + [1366, 0, "p"], + [1367, 0, "l"], + [1368, 0, "i"], + [1369, 0, "c"], + [1370, 0, "a"], + [1371, 0, "t"], + [1372, 0, "e"], + [1373, 0, "d"], + [1374, 0, " "], + [1375, 0, "o"], + [1376, 0, "n"], + [1377, 0, " "], + [1378, 0, "m"], + [1379, 0, "u"], + [1380, 0, "l"], + [1381, 0, "t"], + [1382, 0, "i"], + [1383, 0, "p"], + [1384, 0, "l"], + [1385, 0, "e"], + [1386, 0, " "], + [1387, 0, "d"], + [1388, 0, "e"], + [1389, 0, "v"], + [1390, 0, "i"], + [1391, 0, "c"], + [1392, 0, "e"], + [1393, 0, "s"], + [1394, 0, " "], + [1395, 0, "w"], + [1396, 0, "h"], + [1397, 0, "e"], + [1398, 0, "r"], + [1399, 0, "e"], + [1400, 0, " "], + [1401, 0, "i"], + [1402, 0, "t"], + [1403, 0, " "], + [1404, 0, "m"], + [1405, 0, "a"], + [1406, 0, "y"], + [1407, 0, " "], + [1408, 0, "b"], + [1409, 0, "e"], + [1410, 0, " "], + [1411, 0, "m"], + [1412, 0, "o"], + [1413, 0, "d"], + [1414, 0, "i"], + [1415, 0, "f"], + [1416, 0, "i"], + [1417, 0, "e"], + [1418, 0, "d"], + [1419, 0, " "], + [1419, 1], + [1418, 1], + [1417, 1], + [1416, 1], + [1415, 1], + [1414, 1], + [1413, 1], + [1412, 1], + [1411, 1], + [1410, 1], + [1409, 1], + [1408, 1], + [1407, 1], + [1406, 1], + [1405, 1], + [1404, 1], + [1403, 1], + [1402, 1], + [1401, 1], + [1400, 1], + [1399, 1], + [1398, 1], + [1397, 1], + [1396, 1], + [1396, 0, "i"], + [1396, 1], + [1395, 1], + [1395, 0, "a"], + [1396, 0, "n"], + [1397, 0, "d"], + [1398, 0, " "], + [1399, 0, "m"], + [1400, 0, "o"], + [1401, 0, "d"], + [1402, 0, "i"], + [1403, 0, "f"], + [1404, 0, "i"], + [1405, 0, "e"], + [1406, 0, "d"], + [1407, 0, " "], + [1408, 0, "c"], + [1409, 0, "o"], + [1410, 0, "n"], + [1411, 0, "c"], + [1412, 0, "u"], + [1413, 0, "r"], + [1414, 0, "r"], + [1415, 0, "e"], + [1416, 0, "n"], + [1417, 0, "t"], + [1418, 0, "l"], + [1419, 0, "y"], + [1420, 0, " "], + [1421, 0, "o"], + [1422, 0, "n"], + [1423, 0, " "], + [1424, 0, "m"], + [1425, 0, "u"], + [1426, 0, "l"], + [1427, 0, "t"], + [1428, 0, "i"], + [1429, 0, "p"], + [1430, 0, "l"], + [1431, 0, "e"], + [1432, 0, " "], + [1433, 0, "d"], + [1434, 0, "e"], + [1435, 0, "v"], + [1436, 0, "i"], + [1437, 0, "c"], + [1438, 0, "e"], + [1439, 0, "s"], + [1440, 0, "."], + [1393, 1], + [1392, 1], + [1391, 1], + [1390, 1], + [1389, 1], + [1388, 1], + [1387, 1], + [1386, 1], + [1385, 1], + [1384, 1], + [1383, 1], + [1382, 1], + [1381, 1], + [1380, 1], + [1379, 1], + [1378, 1], + [1377, 1], + [1376, 1], + [1375, 1], + [1374, 1], + [1421, 0, " "], + [1422, 0, "I"], + [1423, 0, "n"], + [1424, 0, " "], + [1425, 0, "t"], + [1426, 0, "h"], + [1427, 0, "i"], + [1428, 0, "s"], + [1429, 0, " "], + [1430, 0, "p"], + [1431, 0, "a"], + [1432, 0, "p"], + [1433, 0, "e"], + [1434, 0, "r"], + [1435, 0, " "], + [1436, 0, "w"], + [1437, 0, "e"], + [1438, 0, " "], + [1439, 0, "p"], + [1440, 0, "r"], + [1441, 0, "e"], + [1442, 0, "s"], + [1443, 0, "e"], + [1444, 0, "n"], + [1445, 0, "t"], + [1446, 0, " "], + [1447, 0, "a"], + [1448, 0, "n"], + [1449, 0, " "], + [1450, 0, "a"], + [1451, 0, "l"], + [1452, 0, "g"], + [1453, 0, "o"], + [1454, 0, "r"], + [1455, 0, "i"], + [1456, 0, "t"], + [1457, 0, "h"], + [1458, 0, "m"], + [1459, 0, " "], + [1460, 0, "a"], + [1461, 0, "n"], + [1462, 0, "d"], + [1463, 0, " "], + [1464, 0, "f"], + [1465, 0, "o"], + [1466, 0, "r"], + [1467, 0, "m"], + [1468, 0, "a"], + [1469, 0, "l"], + [1470, 0, " "], + [1471, 0, "s"], + [1472, 0, "e"], + [1473, 0, "m"], + [1474, 0, "a"], + [1475, 0, "n"], + [1476, 0, "t"], + [1477, 0, "i"], + [1478, 0, "c"], + [1479, 0, "s"], + [1480, 0, " "], + [1481, 0, "f"], + [1482, 0, "o"], + [1483, 0, "r"], + [1484, 0, " "], + [1485, 0, "a"], + [1486, 0, " "], + [1487, 0, "J"], + [1488, 0, "S"], + [1489, 0, "O"], + [1490, 0, "N"], + [1491, 0, " "], + [1492, 0, "d"], + [1493, 0, "a"], + [1494, 0, "t"], + [1495, 0, "a"], + [1496, 0, " "], + [1497, 0, "s"], + [1498, 0, "t"], + [1499, 0, "r"], + [1500, 0, "u"], + [1501, 0, "c"], + [1502, 0, "t"], + [1503, 0, "u"], + [1504, 0, "r"], + [1505, 0, "e"], + [1506, 0, " "], + [1507, 0, "t"], + [1508, 0, "h"], + [1509, 0, "a"], + [1510, 0, "t"], + [1511, 0, " "], + [1512, 0, "a"], + [1513, 0, "u"], + [1514, 0, "t"], + [1515, 0, "o"], + [1516, 0, "m"], + [1517, 0, "a"], + [1518, 0, "t"], + [1519, 0, "i"], + [1520, 0, "c"], + [1521, 0, "a"], + [1522, 0, "l"], + [1523, 0, "l"], + [1524, 0, "y"], + [1525, 0, " "], + [1526, 0, "r"], + [1527, 0, "e"], + [1528, 0, "s"], + [1529, 0, "o"], + [1530, 0, "l"], + [1531, 0, "v"], + [1532, 0, "e"], + [1533, 0, "s"], + [1534, 0, " "], + [1535, 0, "c"], + [1536, 0, "o"], + [1537, 0, "n"], + [1538, 0, "c"], + [1539, 0, "u"], + [1540, 0, "r"], + [1541, 0, "r"], + [1542, 0, "e"], + [1543, 0, "n"], + [1544, 0, "t"], + [1545, 0, " "], + [1546, 0, "m"], + [1547, 0, "o"], + [1548, 0, "d"], + [1549, 0, "i"], + [1550, 0, "f"], + [1551, 0, "i"], + [1552, 0, "c"], + [1553, 0, "a"], + [1554, 0, "t"], + [1555, 0, "i"], + [1556, 0, "o"], + [1557, 0, "n"], + [1558, 0, "s"], + [1559, 0, " "], + [1560, 0, "s"], + [1561, 0, "u"], + [1562, 0, "c"], + [1563, 0, "h"], + [1564, 0, " "], + [1565, 0, "t"], + [1566, 0, "h"], + [1567, 0, "a"], + [1568, 0, "t"], + [1569, 0, " "], + [1570, 0, "n"], + [1571, 0, "o"], + [1572, 0, " "], + [1573, 0, "u"], + [1574, 0, "p"], + [1575, 0, "d"], + [1576, 0, "a"], + [1577, 0, "t"], + [1578, 0, "e"], + [1579, 0, "s"], + [1580, 0, " "], + [1581, 0, "a"], + [1582, 0, "r"], + [1583, 0, "e"], + [1584, 0, " "], + [1585, 0, "l"], + [1586, 0, "o"], + [1587, 0, "s"], + [1588, 0, "t"], + [1589, 0, ","], + [1590, 0, " "], + [1591, 0, "a"], + [1592, 0, "n"], + [1593, 0, "d"], + [1594, 0, " "], + [1595, 0, "t"], + [1596, 0, "h"], + [1597, 0, "a"], + [1598, 0, "t"], + [1599, 0, " "], + [1595, 0, "s"], + [1596, 0, "u"], + [1597, 0, "c"], + [1598, 0, "h"], + [1599, 0, " "], + [1605, 0, "a"], + [1606, 0, "l"], + [1607, 0, "l"], + [1608, 0, " "], + [1609, 0, "r"], + [1610, 0, "e"], + [1611, 0, "p"], + [1612, 0, "l"], + [1613, 0, "i"], + [1614, 0, "c"], + [1615, 0, "a"], + [1616, 0, "s"], + [1617, 0, " "], + [1618, 0, "c"], + [1619, 0, "o"], + [1620, 0, "n"], + [1621, 0, "v"], + [1622, 0, "e"], + [1623, 0, "r"], + [1624, 0, "g"], + [1625, 0, "e"], + [1626, 0, " "], + [1627, 0, "t"], + [1628, 0, "o"], + [1629, 0, "w"], + [1630, 0, "a"], + [1631, 0, "r"], + [1632, 0, "d"], + [1633, 0, "s"], + [1634, 0, " "], + [1635, 0, "t"], + [1636, 0, "h"], + [1637, 0, "e"], + [1638, 0, " "], + [1639, 0, "s"], + [1640, 0, "a"], + [1641, 0, "m"], + [1642, 0, "e"], + [1643, 0, " "], + [1644, 0, "s"], + [1645, 0, "t"], + [1646, 0, "a"], + [1647, 0, "t"], + [1648, 0, "e"], + [1649, 0, "."], + [1650, 0, " "], + [1651, 0, "I"], + [1652, 0, "t"], + [1653, 0, " "], + [1654, 0, "s"], + [1655, 0, "u"], + [1656, 0, "p"], + [1657, 0, "p"], + [1658, 0, "o"], + [1659, 0, "r"], + [1660, 0, "t"], + [1661, 0, "s"], + [1662, 0, " "], + [1663, 0, "a"], + [1664, 0, "r"], + [1665, 0, "b"], + [1666, 0, "i"], + [1667, 0, "t"], + [1668, 0, "r"], + [1669, 0, "a"], + [1670, 0, "r"], + [1671, 0, "i"], + [1672, 0, "l"], + [1673, 0, "y"], + [1674, 0, " "], + [1675, 0, "n"], + [1676, 0, "e"], + [1677, 0, "s"], + [1678, 0, "t"], + [1679, 0, "e"], + [1680, 0, "d"], + [1681, 0, " "], + [1682, 0, "l"], + [1683, 0, "i"], + [1684, 0, "s"], + [1685, 0, "t"], + [1686, 0, " "], + [1687, 0, "a"], + [1688, 0, "n"], + [1689, 0, "d"], + [1690, 0, " "], + [1691, 0, "m"], + [1692, 0, "a"], + [1693, 0, "p"], + [1694, 0, " "], + [1695, 0, "t"], + [1696, 0, "y"], + [1697, 0, "p"], + [1698, 0, "e"], + [1699, 0, "s"], + [1700, 0, "."], + [1701, 0, " "], + [1701, 1], + [1700, 1], + [1700, 0, "."], + [1701, 0, " "], + [1702, 0, "I"], + [1703, 0, "t"], + [1704, 0, " "], + [1700, 0, ","], + [1701, 0, " "], + [1702, 0, "w"], + [1703, 0, "h"], + [1704, 0, "i"], + [1705, 0, "c"], + [1706, 0, "h"], + [1707, 0, " "], + [1708, 0, "c"], + [1709, 0, "a"], + [1710, 0, "n"], + [1711, 0, " "], + [1712, 0, "b"], + [1713, 0, "e"], + [1714, 0, " "], + [1715, 0, "m"], + [1716, 0, "o"], + [1717, 0, "d"], + [1718, 0, "i"], + [1719, 0, "f"], + [1720, 0, "i"], + [1721, 0, "e"], + [1722, 0, "d"], + [1723, 0, " "], + [1724, 0, "b"], + [1725, 0, "y"], + [1726, 0, " "], + [1727, 0, "i"], + [1728, 0, "n"], + [1729, 0, "s"], + [1730, 0, "e"], + [1731, 0, "r"], + [1732, 0, "t"], + [1733, 0, "i"], + [1734, 0, "o"], + [1735, 0, "n"], + [1736, 0, ","], + [1737, 0, " "], + [1738, 0, "d"], + [1739, 0, "e"], + [1740, 0, "l"], + [1741, 0, "e"], + [1742, 0, "t"], + [1743, 0, "i"], + [1744, 0, "o"], + [1745, 0, "n"], + [1746, 0, " "], + [1747, 0, "a"], + [1748, 0, "n"], + [1749, 0, "d"], + [1750, 0, " "], + [1751, 0, "a"], + [1752, 0, "s"], + [1753, 0, "s"], + [1754, 0, "i"], + [1755, 0, "g"], + [1756, 0, "n"], + [1757, 0, "m"], + [1758, 0, "e"], + [1759, 0, "n"], + [1760, 0, "t"], + [1765, 1], + [1764, 1], + [1763, 1], + [1763, 0, "T"], + [1764, 0, "h"], + [1765, 0, "e"], + [1766, 0, " "], + [1767, 0, "a"], + [1768, 0, "l"], + [1769, 0, "g"], + [1770, 0, "o"], + [1771, 0, "r"], + [1772, 0, "i"], + [1773, 0, "t"], + [1774, 0, "h"], + [1775, 0, "m"], + [1776, 0, " "], + [1777, 0, "p"], + [1778, 0, "e"], + [1779, 0, "r"], + [1780, 0, "f"], + [1781, 0, "o"], + [1782, 0, "r"], + [1783, 0, "m"], + [1784, 0, "s"], + [1785, 0, " "], + [1786, 0, "a"], + [1787, 0, "l"], + [1788, 0, "l"], + [1789, 0, " "], + [1790, 0, "m"], + [1791, 0, "e"], + [1792, 0, "r"], + [1793, 0, "g"], + [1794, 0, "i"], + [1795, 0, "n"], + [1796, 0, "g"], + [1797, 0, " "], + [1798, 0, "c"], + [1799, 0, "l"], + [1800, 0, "i"], + [1801, 0, "e"], + [1802, 0, "n"], + [1803, 0, "t"], + [1804, 0, "-"], + [1805, 0, "s"], + [1806, 0, "i"], + [1807, 0, "d"], + [1808, 0, "e"], + [1809, 0, " "], + [1810, 0, "a"], + [1811, 0, "n"], + [1812, 0, "d"], + [1813, 0, " "], + [1814, 0, "d"], + [1815, 0, "o"], + [1816, 0, "e"], + [1817, 0, "s"], + [1818, 0, " "], + [1819, 0, "n"], + [1820, 0, "o"], + [1821, 0, "t"], + [1822, 0, " "], + [1823, 0, "d"], + [1824, 0, "e"], + [1825, 0, "p"], + [1826, 0, "e"], + [1827, 0, "n"], + [1828, 0, "d"], + [1829, 0, " "], + [1830, 0, "o"], + [1831, 0, "n"], + [1832, 0, " "], + [1833, 0, "o"], + [1834, 0, "r"], + [1835, 0, "d"], + [1836, 0, "e"], + [1837, 0, "r"], + [1838, 0, "i"], + [1839, 0, "n"], + [1840, 0, "g"], + [1841, 0, " "], + [1842, 0, "g"], + [1843, 0, "u"], + [1844, 0, "a"], + [1845, 0, "r"], + [1846, 0, "a"], + [1847, 0, "n"], + [1848, 0, "t"], + [1849, 0, "e"], + [1850, 0, "e"], + [1851, 0, "s"], + [1852, 0, " "], + [1853, 0, "f"], + [1854, 0, "r"], + [1855, 0, "o"], + [1856, 0, "m"], + [1857, 0, " "], + [1858, 0, "t"], + [1859, 0, "h"], + [1860, 0, "e"], + [1861, 0, " "], + [1862, 0, "n"], + [1863, 0, "e"], + [1864, 0, "t"], + [1865, 0, "w"], + [1866, 0, "o"], + [1867, 0, "r"], + [1868, 0, "k"], + [1869, 0, ","], + [1870, 0, " "], + [1871, 0, "a"], + [1872, 0, "l"], + [1873, 0, "l"], + [1874, 0, "o"], + [1875, 0, "w"], + [1876, 0, "i"], + [1877, 0, "n"], + [1878, 0, "g"], + [1879, 0, " "], + [1880, 0, "i"], + [1881, 0, "t"], + [1882, 0, " "], + [1883, 0, "t"], + [1884, 0, "o"], + [1885, 0, " "], + [1886, 0, "b"], + [1887, 0, "e"], + [1888, 0, " "], + [1889, 0, "d"], + [1890, 0, "e"], + [1891, 0, "p"], + [1892, 0, "l"], + [1893, 0, "o"], + [1894, 0, "y"], + [1895, 0, "e"], + [1896, 0, "d"], + [1897, 0, " "], + [1898, 0, "i"], + [1899, 0, "n"], + [1900, 0, " "], + [1901, 0, "p"], + [1902, 0, "e"], + [1903, 0, "e"], + [1904, 0, "r"], + [1905, 0, "-"], + [1906, 0, "t"], + [1907, 0, "o"], + [1908, 0, "-"], + [1909, 0, "p"], + [1910, 0, "e"], + [1911, 0, "e"], + [1912, 0, "r"], + [1913, 0, " "], + [1914, 0, "n"], + [1915, 0, "e"], + [1916, 0, "t"], + [1917, 0, "w"], + [1918, 0, "o"], + [1919, 0, "r"], + [1920, 0, "k"], + [1921, 0, "s"], + [1922, 0, " "], + [1923, 0, "a"], + [1924, 0, "n"], + [1925, 0, "d"], + [1926, 0, " "], + [1927, 0, "i"], + [1928, 0, "n"], + [1929, 0, " "], + [1930, 0, "e"], + [1930, 1], + [1930, 0, "m"], + [1931, 0, "e"], + [1932, 0, "s"], + [1933, 0, "s"], + [1934, 0, "a"], + [1935, 0, "g"], + [1936, 0, "i"], + [1937, 0, "n"], + [1938, 0, "g"], + [1939, 0, " "], + [1940, 0, "s"], + [1941, 0, "y"], + [1942, 0, "s"], + [1943, 0, "t"], + [1944, 0, "e"], + [1945, 0, "m"], + [1946, 0, "s"], + [1947, 0, " "], + [1948, 0, "w"], + [1949, 0, "i"], + [1950, 0, "t"], + [1951, 0, "h"], + [1952, 0, " "], + [1953, 0, "e"], + [1954, 0, "n"], + [1955, 0, "d"], + [1956, 0, "-"], + [1957, 0, "t"], + [1958, 0, "o"], + [1959, 0, "-"], + [1960, 0, "e"], + [1961, 0, "n"], + [1962, 0, "d"], + [1963, 0, " "], + [1964, 0, "e"], + [1965, 0, "n"], + [1966, 0, "c"], + [1967, 0, "r"], + [1968, 0, "y"], + [1969, 0, "p"], + [1970, 0, "t"], + [1971, 0, "i"], + [1972, 0, "o"], + [1973, 0, "n"], + [1974, 0, "."], + [1061, 0, "\n"], + [1062, 0, "%"], + [1063, 0, " "], + [1064, 0, "w"], + [1065, 0, "o"], + [1066, 0, "r"], + [1067, 0, "d"], + [1068, 0, " "], + [1069, 0, "l"], + [1070, 0, "i"], + [1071, 0, "m"], + [1072, 0, "i"], + [1073, 0, "t"], + [1074, 0, " "], + [1064, 0, "a"], + [1065, 0, "b"], + [1066, 0, "s"], + [1067, 0, "t"], + [1068, 0, "r"], + [1069, 0, "a"], + [1070, 0, "c"], + [1071, 0, "t"], + [1072, 0, " "], + [1083, 1], + [1083, 0, ":"], + [1084, 0, " "], + [1085, 0, "1"], + [1086, 0, "0"], + [1087, 0, "0"], + [1088, 0, "-"], + [1089, 0, "2"], + [1090, 0, "0"], + [1091, 0, "0"], + [1092, 0, " "], + [1093, 0, "w"], + [1094, 0, "o"], + [1095, 0, "r"], + [1096, 0, "d"], + [1097, 0, "s"], + [2294, 1], + [2293, 1], + [2292, 1], + [2291, 1], + [2290, 1], + [2289, 1], + [2288, 1], + [2287, 1], + [2286, 1], + [2285, 1], + [2284, 1], + [2283, 1], + [2282, 1], + [2281, 1], + [2280, 1], + [2279, 1], + [2294, 0, " "], + [2295, 0, "s"], + [2296, 0, "u"], + [2297, 0, "c"], + [2298, 0, "h"], + [2299, 0, " "], + [2300, 0, "a"], + [2301, 0, "s"], + [2302, 0, " "], + [2303, 0, "s"], + [2304, 0, "m"], + [2305, 0, "a"], + [2306, 0, "r"], + [2307, 0, "t"], + [2308, 0, "p"], + [2309, 0, "h"], + [2310, 0, "o"], + [2311, 0, "n"], + [2312, 0, "e"], + [2313, 0, "s"], + [2324, 1], + [2323, 1], + [2322, 1], + [2321, 1], + [2333, 1], + [2338, 1], + [2337, 1], + [2336, 1], + [2335, 1], + [2334, 1], + [2333, 1], + [2336, 0, " "], + [2337, 0, "c"], + [2338, 0, "o"], + [2339, 0, "n"], + [2340, 0, "t"], + [2341, 0, "i"], + [2342, 0, "n"], + [2343, 0, "u"], + [2344, 0, "e"], + [2350, 0, "i"], + [2351, 0, "n"], + [2352, 0, "g"], + [2294, 0, ","], + [2315, 0, ","], + [2335, 0, "s"], + [2584, 0, " "], + [2585, 0, "t"], + [2586, 0, "o"], + [2587, 0, "o"], + [2588, 0, "l"], + [2589, 0, "s"], + [2590, 0, ","], + [2591, 0, " "], + [2592, 0, "t"], + [2593, 0, "o"], + [2594, 0, "-"], + [2595, 0, "d"], + [2596, 0, "o"], + [2597, 0, " "], + [2598, 0, "l"], + [2599, 0, "i"], + [2600, 0, "s"], + [2601, 0, "t"], + [2602, 0, "s"], + [3082, 0, "~"], + [3083, 0, "\\"], + [3084, 0, "c"], + [3085, 0, "i"], + [3086, 0, "t"], + [3087, 0, "e"], + [3088, 0, "{"], + [3089, 0, "D"], + [3090, 0, "a"], + [3091, 0, "v"], + [3092, 0, "i"], + [3093, 0, "d"], + [3094, 0, "s"], + [3095, 0, "o"], + [3096, 0, "n"], + [3097, 0, ":"], + [3098, 0, "1"], + [3099, 0, "9"], + [3100, 0, "8"], + [3101, 0, "5"], + [3102, 0, "h"], + [3103, 0, "v"], + [3104, 0, "}"], + [2825, 1], + [2824, 1], + [2823, 1], + [2822, 1], + [2821, 1], + [3100, 1], + [3100, 0, "."], + [3103, 1], + [3103, 0, "="], + [3103, 1], + [3102, 1], + [3102, 0, "I"], + [3103, 0, "f"], + [3104, 0, " "], + [3105, 0, "w"], + [3106, 0, "e"], + [3107, 0, " "], + [3108, 0, "r"], + [3109, 0, "e"], + [3110, 0, "q"], + [3111, 0, "u"], + [3112, 0, "i"], + [3113, 0, "r"], + [3114, 0, "e"], + [3115, 0, " "], + [3116, 0, "a"], + [3117, 0, "p"], + [3118, 0, "p"], + [3119, 0, "l"], + [3120, 0, "i"], + [3121, 0, "c"], + [3122, 0, "a"], + [3123, 0, "t"], + [3124, 0, "i"], + [3125, 0, "o"], + [3126, 0, "n"], + [3127, 0, "s"], + [3128, 0, " "], + [3129, 0, "t"], + [3130, 0, "o"], + [3131, 0, " "], + [3132, 0, "w"], + [3133, 0, "o"], + [3134, 0, "r"], + [3135, 0, "k"], + [3136, 0, " "], + [3137, 0, "r"], + [3138, 0, "e"], + [3139, 0, "g"], + [3140, 0, "a"], + [3141, 0, "r"], + [3142, 0, "d"], + [3143, 0, "l"], + [3144, 0, "e"], + [3145, 0, "s"], + [3146, 0, "s"], + [3147, 0, " "], + [3148, 0, "o"], + [3149, 0, "f"], + [3150, 0, " "], + [3151, 0, "t"], + [3152, 0, "h"], + [3153, 0, "e"], + [3154, 0, " "], + [3155, 0, "n"], + [3156, 0, "e"], + [3157, 0, "t"], + [3158, 0, "w"], + [3159, 0, "o"], + [3160, 0, "r"], + [3161, 0, "k"], + [3162, 0, ","], + [3261, 0, " "], + [3262, 0, "t"], + [3263, 0, "h"], + [3264, 0, "a"], + [3265, 0, "t"], + [2938, 0, "a"], + [2939, 0, "p"], + [2940, 0, "p"], + [2941, 0, "r"], + [2942, 0, "o"], + [2943, 0, "a"], + [2944, 0, "c"], + [2945, 0, "h"], + [2946, 0, "e"], + [2947, 0, "s"], + [2948, 0, " "], + [2949, 0, "t"], + [2950, 0, "o"], + [2951, 0, " "], + [2981, 1], + [2980, 1], + [2979, 1], + [2978, 1], + [2977, 1], + [2976, 1], + [2975, 1], + [2974, 1], + [2973, 1], + [2972, 1], + [2971, 1], + [2971, 0, ","], + [2926, 0, "R"], + [2927, 0, "e"], + [2928, 0, "q"], + [2929, 0, "u"], + [2930, 0, "i"], + [2931, 0, "r"], + [2932, 0, "i"], + [2933, 0, "n"], + [2934, 0, "g"], + [2935, 0, " "], + [2936, 0, "s"], + [2937, 0, "e"], + [2938, 0, "r"], + [2939, 0, "i"], + [2940, 0, "a"], + [2941, 0, "l"], + [2942, 0, "i"], + [2943, 0, "z"], + [2944, 0, "a"], + [2945, 0, "b"], + [2946, 0, "i"], + [2947, 0, "l"], + [2948, 0, "i"], + [2949, 0, "t"], + [2950, 0, "y"], + [2951, 0, ","], + [2952, 0, " "], + [2953, 0, "t"], + [2954, 0, "h"], + [2955, 0, "e"], + [2956, 0, " "], + [2957, 1], + [2957, 0, "t"], + [2978, 1], + [2977, 1], + [3024, 1], + [3023, 1], + [3022, 1], + [3021, 1], + [3020, 1], + [3019, 1], + [3018, 1], + [3017, 1], + [3016, 1], + [3015, 1], + [3014, 1], + [3013, 1], + [3012, 1], + [3011, 1], + [3010, 1], + [3009, 1], + [3008, 1], + [3007, 1], + [3006, 1], + [3005, 1], + [3004, 1], + [3003, 1], + [3002, 1], + [3001, 1], + [3125, 0, "t"], + [3126, 0, "h"], + [3127, 0, "a"], + [3128, 0, "t"], + [3129, 0, " "], + [3144, 1], + [3143, 1], + [3142, 1], + [3680, 0, "\n"], + [3681, 0, "\n"], + [3682, 0, "C"], + [3683, 0, "u"], + [3684, 0, "r"], + [3685, 0, "r"], + [3686, 0, "e"], + [3687, 0, "n"], + [3688, 0, "t"], + [3689, 0, "l"], + [3690, 0, "y"], + [3690, 1], + [3689, 1], + [3689, 0, " "], + [3690, 0, "a"], + [3691, 0, "p"], + [3692, 0, "p"], + [3693, 0, "l"], + [3694, 0, "i"], + [3695, 0, "c"], + [3696, 0, "a"], + [3697, 0, "t"], + [3698, 0, "i"], + [3699, 0, "o"], + [3700, 0, "n"], + [3701, 0, "s"], + [3702, 0, " "], + [3703, 0, "s"], + [3704, 0, "o"], + [3705, 0, "l"], + [3706, 0, "v"], + [3707, 0, "e"], + [3708, 0, " "], + [3709, 0, "t"], + [3710, 0, "h"], + [3711, 0, "i"], + [3712, 0, "s"], + [3713, 0, " "], + [3714, 0, "p"], + [3715, 0, "r"], + [3716, 0, "o"], + [3717, 0, "b"], + [3718, 0, "l"], + [3719, 0, "e"], + [3720, 0, "m"], + [3721, 0, " "], + [3722, 0, "w"], + [3723, 0, "i"], + [3724, 0, "t"], + [3725, 0, "h"], + [3726, 0, " "], + [3727, 0, "a"], + [3728, 0, " "], + [3729, 0, "r"], + [3730, 0, "a"], + [3731, 0, "n"], + [3732, 0, "g"], + [3733, 0, "e"], + [3734, 0, " "], + [3735, 0, "o"], + [3736, 0, "f"], + [3737, 0, " "], + [3738, 0, "a"], + [3739, 0, "d"], + [3740, 0, "-"], + [3741, 0, "h"], + [3742, 0, "o"], + [3743, 0, "c"], + [3744, 0, " "], + [3745, 0, "a"], + [3746, 0, "n"], + [3747, 0, "d"], + [3748, 0, " "], + [3749, 0, "a"], + [3750, 0, "p"], + [3751, 0, "p"], + [3752, 0, "l"], + [3753, 0, "i"], + [3754, 0, "c"], + [3755, 0, "a"], + [3756, 0, "t"], + [3757, 0, "i"], + [3758, 0, "o"], + [3759, 0, "n"], + [3760, 0, "-"], + [3761, 0, "s"], + [3762, 0, "p"], + [3763, 0, "e"], + [3764, 0, "c"], + [3765, 0, "i"], + [3766, 0, "f"], + [3767, 0, "i"], + [3768, 0, "c"], + [3769, 0, " "], + [3770, 0, "m"], + [3771, 0, "e"], + [3772, 0, "c"], + [3773, 0, "h"], + [3774, 0, "a"], + [3775, 0, "n"], + [3776, 0, "i"], + [3777, 0, "s"], + [3778, 0, "m"], + [3779, 0, "s"], + [3780, 0, ","], + [3781, 0, " "], + [3782, 0, "t"], + [3783, 0, "h"], + [3784, 0, "e"], + [3785, 0, " "], + [3786, 0, "c"], + [3787, 0, "o"], + [3788, 0, "r"], + [3789, 0, "r"], + [3790, 0, "e"], + [3791, 0, "c"], + [3791, 1], + [3790, 1], + [3789, 1], + [3788, 1], + [3787, 1], + [3786, 1], + [3785, 1], + [3784, 1], + [3783, 1], + [3782, 1], + [3781, 1], + [3780, 1], + [3780, 0, "."], + [3781, 0, " "], + [3782, 0, "A"], + [3783, 0, "s"], + [3784, 0, " "], + [3785, 0, "c"], + [3786, 0, "o"], + [3787, 0, "n"], + [3788, 0, "c"], + [3789, 0, "u"], + [3790, 0, "r"], + [3791, 0, "r"], + [3792, 0, "e"], + [3793, 0, "n"], + [3794, 0, "t"], + [3795, 0, " "], + [3796, 0, "m"], + [3797, 0, "o"], + [3798, 0, "d"], + [3799, 0, "i"], + [3800, 0, "f"], + [3801, 0, "i"], + [3802, 0, "c"], + [3803, 0, "a"], + [3804, 0, "t"], + [3805, 0, "i"], + [3806, 0, "o"], + [3807, 0, "n"], + [3808, 0, "s"], + [3809, 0, " "], + [3810, 0, "a"], + [3811, 0, "r"], + [3812, 0, "e"], + [3813, 0, " "], + [3814, 0, "d"], + [3815, 0, "i"], + [3816, 0, "f"], + [3817, 0, "f"], + [3818, 0, "i"], + [3819, 0, "c"], + [3820, 0, "u"], + [3821, 0, "l"], + [3822, 0, "t"], + [3823, 0, " "], + [3824, 0, "t"], + [3825, 0, "o"], + [3826, 0, " "], + [3827, 0, "r"], + [3828, 0, "e"], + [3829, 0, "a"], + [3830, 0, "s"], + [3831, 0, "o"], + [3832, 0, "n"], + [3833, 0, " "], + [3834, 0, "a"], + [3835, 0, "b"], + [3836, 0, "o"], + [3837, 0, "u"], + [3838, 0, "t"], + [3839, 0, " "], + [3781, 0, " "], + [3782, 0, "I"], + [3783, 0, "n"], + [3784, 0, " "], + [3785, 0, "t"], + [3786, 0, "h"], + [3787, 0, "i"], + [3788, 0, "s"], + [3789, 0, " "], + [3790, 0, "p"], + [3791, 0, "a"], + [3792, 0, "p"], + [3793, 0, "e"], + [3794, 0, "r"], + [3795, 0, " "], + [3796, 0, "w"], + [3797, 0, "e"], + [3798, 0, " "], + [3799, 0, "p"], + [3800, 0, "r"], + [3801, 0, "e"], + [3802, 0, "s"], + [3803, 0, "e"], + [3804, 0, "n"], + [3805, 0, "t"], + [3806, 0, " "], + [3807, 0, "t"], + [3808, 0, "h"], + [3809, 0, "e"], + [3810, 0, " "], + [3811, 0, "f"], + [3812, 0, "i"], + [3813, 0, "r"], + [3814, 0, "s"], + [3815, 0, "t"], + [3815, 1], + [3814, 1], + [3813, 1], + [3812, 1], + [3811, 1], + [3810, 1], + [3809, 1], + [3808, 1], + [3807, 1], + [3807, 0, "a"], + [3808, 0, " "], + [3809, 0, "d"], + [3810, 0, "a"], + [3811, 0, "t"], + [3812, 0, "a"], + [3813, 0, "t"], + [3814, 0, "y"], + [3815, 0, "p"], + [3816, 0, "e"], + [3817, 0, " "], + [3818, 0, "t"], + [3819, 0, "h"], + [3820, 0, "a"], + [3821, 0, "t"], + [3822, 0, " "], + [3823, 0, "p"], + [3824, 0, "r"], + [3825, 0, "o"], + [3826, 0, "v"], + [3827, 0, "i"], + [3828, 0, "d"], + [3829, 0, "e"], + [3830, 0, "s"], + [3831, 0, " "], + [3832, 0, "t"], + [3833, 0, "h"], + [3834, 0, "e"], + [3835, 0, " "], + [3836, 0, "f"], + [3837, 0, "u"], + [3838, 0, "l"], + [3839, 0, "l"], + [3840, 0, " "], + [3841, 0, "e"], + [3842, 0, "x"], + [3843, 0, "p"], + [3844, 0, "r"], + [3845, 0, "e"], + [3846, 0, "s"], + [3847, 0, "s"], + [3848, 0, "i"], + [3849, 0, "v"], + [3850, 0, "e"], + [3851, 0, "n"], + [3852, 0, "e"], + [3853, 0, "s"], + [3854, 0, "s"], + [3855, 0, " "], + [3856, 0, "o"], + [3857, 0, "f"], + [3858, 0, " "], + [3859, 0, "t"], + [3860, 0, "h"], + [3861, 0, "e"], + [3862, 0, " "], + [3863, 0, "J"], + [3864, 0, "S"], + [3865, 0, "O"], + [3866, 0, "N"], + [3867, 0, " "], + [3868, 0, "d"], + [3869, 0, "a"], + [3870, 0, "t"], + [3871, 0, "a"], + [3872, 0, " "], + [3873, 0, "m"], + [3874, 0, "o"], + [3875, 0, "d"], + [3876, 0, "e"], + [3877, 0, "l"], + [3878, 0, ","], + [3879, 0, " "], + [3880, 0, "a"], + [3881, 0, "n"], + [3882, 0, "d"], + [3883, 0, " "], + [3884, 0, "a"], + [3885, 0, "u"], + [3886, 0, "t"], + [3887, 0, "o"], + [3888, 0, "m"], + [3889, 0, "a"], + [3890, 0, "t"], + [3891, 0, "i"], + [3892, 0, "c"], + [3893, 0, "a"], + [3894, 0, "l"], + [3895, 0, "l"], + [3896, 0, "y"], + [3897, 0, " "], + [3898, 0, "m"], + [3899, 0, "e"], + [3900, 0, "r"], + [3901, 0, "g"], + [3902, 0, "e"], + [3903, 0, "s"], + [3904, 0, " "], + [3905, 0, "a"], + [3906, 0, "n"], + [3907, 0, "y"], + [3908, 0, " "], + [3909, 0, "c"], + [3910, 0, "o"], + [3911, 0, "n"], + [3912, 0, "c"], + [3913, 0, "u"], + [3914, 0, "r"], + [3915, 0, "r"], + [3916, 0, "e"], + [3917, 0, "n"], + [3918, 0, "t"], + [3919, 0, " "], + [3920, 0, "m"], + [3921, 0, "o"], + [3922, 0, "d"], + [3923, 0, "i"], + [3924, 0, "f"], + [3925, 0, "i"], + [3926, 0, "c"], + [3927, 0, "a"], + [3928, 0, "t"], + [3929, 0, "i"], + [3930, 0, "o"], + [3931, 0, "n"], + [3932, 0, "s"], + [3933, 0, " "], + [3934, 0, "w"], + [3935, 0, "i"], + [3936, 0, "t"], + [3937, 0, "h"], + [3938, 0, "o"], + [3939, 0, "u"], + [3940, 0, "t"], + [3941, 0, " "], + [3942, 0, "l"], + [3943, 0, "o"], + [3944, 0, "s"], + [3945, 0, "s"], + [3946, 0, " "], + [3947, 0, "o"], + [3948, 0, "f"], + [3949, 0, " "], + [3950, 0, "i"], + [3951, 0, "n"], + [3952, 0, "f"], + [3953, 0, "o"], + [3954, 0, "r"], + [3955, 0, "m"], + [3956, 0, "a"], + [3957, 0, "t"], + [3958, 0, "i"], + [3959, 0, "o"], + [3960, 0, "n"], + [3961, 0, "."], + [3962, 0, " "], + [3963, 0, "W"], + [3964, 0, "e"], + [3965, 0, " "], + [3966, 0, "e"], + [3967, 0, "x"], + [3968, 0, "p"], + [3969, 0, "e"], + [3970, 0, "c"], + [3971, 0, "t"], + [3972, 0, " "], + [3973, 0, "t"], + [3974, 0, "h"], + [3975, 0, "a"], + [3976, 0, "t"], + [3977, 0, " "], + [3978, 0, "t"], + [3979, 0, "h"], + [3980, 0, "i"], + [3981, 0, "s"], + [3982, 0, " "], + [3983, 0, "d"], + [3984, 0, "a"], + [3985, 0, "t"], + [3986, 0, "a"], + [3987, 0, "t"], + [3988, 0, "y"], + [3989, 0, "p"], + [3990, 0, "e"], + [3991, 0, " "], + [3992, 0, "w"], + [3993, 0, "i"], + [3994, 0, "l"], + [3995, 0, "l"], + [3996, 0, " "], + [3808, 0, " "], + [3809, 0, "g"], + [3810, 0, "e"], + [3811, 0, "n"], + [3812, 0, "e"], + [3813, 0, "r"], + [3814, 0, "a"], + [3815, 0, "l"], + [3816, 0, "-"], + [3817, 0, "p"], + [3818, 0, "u"], + [3819, 0, "r"], + [3820, 0, "p"], + [3821, 0, "o"], + [3822, 0, "s"], + [3823, 0, "e"], + [3994, 0, "i"], + [3995, 0, "m"], + [3996, 0, "p"], + [3997, 0, "l"], + [3998, 0, "e"], + [3999, 0, "m"], + [4000, 0, "e"], + [4001, 0, "n"], + [4002, 0, "t"], + [4003, 0, "a"], + [4004, 0, "t"], + [4005, 0, "i"], + [4006, 0, "o"], + [4007, 0, "n"], + [4008, 0, "s"], + [4009, 0, " "], + [4010, 0, "o"], + [4011, 0, "f"], + [4012, 0, " "], + [4031, 0, " "], + [4032, 0, "s"], + [4033, 0, "i"], + [4034, 0, "g"], + [4035, 0, "n"], + [4036, 0, "i"], + [4037, 0, "f"], + [4038, 0, "i"], + [4039, 0, "c"], + [4039, 1], + [4038, 1], + [4037, 1], + [4036, 1], + [4035, 1], + [4034, 1], + [4033, 1], + [4032, 1], + [4032, 0, "d"], + [4033, 0, "r"], + [4034, 0, "a"], + [4035, 0, "s"], + [4036, 0, "t"], + [4037, 0, "i"], + [4038, 0, "c"], + [4039, 0, "a"], + [4040, 0, "l"], + [4041, 0, "l"], + [4042, 0, "y"], + [4043, 0, " "], + [4044, 0, "s"], + [4045, 0, "i"], + [4046, 0, "m"], + [4047, 0, "p"], + [4048, 0, "l"], + [4049, 0, "i"], + [4050, 0, "f"], + [4051, 0, "y"], + [4052, 0, " "], + [4053, 0, "t"], + [4054, 0, "h"], + [4055, 0, "e"], + [4056, 0, " "], + [4057, 0, "d"], + [4058, 0, "e"], + [4059, 0, "v"], + [4060, 0, "e"], + [4061, 0, "l"], + [4062, 0, "o"], + [4063, 0, "p"], + [4064, 0, "m"], + [4065, 0, "e"], + [4066, 0, "n"], + [4067, 0, "t"], + [4068, 0, " "], + [4069, 0, "o"], + [4070, 0, "f"], + [4071, 0, " "], + [4072, 0, "c"], + [4073, 0, "o"], + [4074, 0, "l"], + [4075, 0, "l"], + [4076, 0, "a"], + [4077, 0, "b"], + [4078, 0, "o"], + [4079, 0, "r"], + [4080, 0, "a"], + [4081, 0, "t"], + [4082, 0, "i"], + [4083, 0, "v"], + [4084, 0, "e"], + [4085, 0, " "], + [4086, 0, "a"], + [4087, 0, "n"], + [4088, 0, "d"], + [4089, 0, " "], + [4090, 0, "s"], + [4091, 0, "t"], + [4092, 0, "a"], + [4093, 0, "t"], + [4094, 0, "e"], + [4095, 0, "-"], + [4096, 0, "s"], + [4097, 0, "y"], + [4098, 0, "n"], + [4099, 0, "c"], + [4100, 0, "h"], + [4101, 0, "r"], + [4102, 0, "o"], + [4103, 0, "n"], + [4104, 0, "i"], + [4105, 0, "z"], + [4106, 0, "i"], + [4107, 0, "n"], + [4108, 0, "g"], + [4109, 0, " "], + [4110, 0, "a"], + [4111, 0, "p"], + [4112, 0, "p"], + [4113, 0, "l"], + [4114, 0, "i"], + [4115, 0, "c"], + [4116, 0, "a"], + [4117, 0, "t"], + [4118, 0, "i"], + [4119, 0, "o"], + [4120, 0, "n"], + [4121, 0, "s"], + [4122, 0, " "], + [4123, 0, "f"], + [4124, 0, "o"], + [4125, 0, "r"], + [4126, 0, " "], + [4127, 0, "m"], + [4128, 0, "o"], + [4129, 0, "b"], + [4130, 0, "i"], + [4131, 0, "l"], + [4132, 0, "e"], + [4133, 0, " "], + [4134, 0, "d"], + [4135, 0, "e"], + [4136, 0, "v"], + [4137, 0, "i"], + [4138, 0, "c"], + [4139, 0, "e"], + [4140, 0, "s"], + [4141, 0, "."], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4142, 1], + [4166, 1], + [4165, 1], + [4164, 1], + [4163, 1], + [4162, 1], + [4161, 1], + [4160, 1], + [4159, 1], + [4158, 1], + [4157, 1], + [4156, 1], + [4155, 1], + [4154, 1], + [4153, 1], + [4152, 1], + [4151, 1], + [4150, 1], + [4149, 1], + [4148, 1], + [4147, 1], + [4146, 1], + [4145, 1], + [4144, 1], + [4144, 0, "\\"], + [4145, 0, "s"], + [4146, 0, "u"], + [4147, 0, "b"], + [4148, 0, "s"], + [4149, 0, "e"], + [4150, 0, "c"], + [4151, 0, "t"], + [4152, 0, "i"], + [4153, 0, "o"], + [4154, 0, "n"], + [4155, 0, "{"], + [4156, 0, "J"], + [4157, 0, "S"], + [4158, 0, "O"], + [4159, 0, "N"], + [4160, 0, " "], + [4161, 0, "d"], + [4162, 0, "a"], + [4163, 0, "t"], + [4164, 0, "a"], + [4165, 0, " "], + [4166, 0, "m"], + [4167, 0, "o"], + [4168, 0, "d"], + [4169, 0, "e"], + [4170, 0, "l"], + [4171, 0, "}"], + [64152, 1], + [64152, 0, "]"], + [64131, 1], + [64130, 1], + [64129, 1], + [64128, 1], + [64127, 1], + [64126, 1], + [64125, 1], + [64124, 1], + [64124, 0, "a"], + [64125, 0, "p"], + [64126, 0, "p"], + [64127, 0, "e"], + [64128, 0, "n"], + [64129, 0, "d"], + [64130, 0, "i"], + [64131, 0, "x"], + [64132, 0, "["], + [64121, 1], + [64120, 1], + [64119, 1], + [64118, 1], + [64117, 1], + [64116, 1], + [64115, 1], + [64114, 1], + [64113, 1], + [64112, 1], + [64111, 1], + [64110, 1], + [64142, 0, "\\"], + [64143, 0, "l"], + [64144, 0, "a"], + [64145, 0, "b"], + [64146, 0, "e"], + [64147, 0, "l"], + [64148, 0, "{"], + [64149, 0, "s"], + [64150, 0, "e"], + [64151, 0, "c"], + [64152, 0, ":"], + [64153, 0, "p"], + [64154, 0, "r"], + [64155, 0, "o"], + [64156, 0, "o"], + [64157, 0, "f"], + [64158, 0, "}"], + [4172, 0, "\n"], + [4173, 0, "\n"], + [4174, 0, "J"], + [4175, 0, "S"], + [4176, 0, "O"], + [4177, 0, "N"], + [4178, 0, " "], + [10927, 0, "\\"], + [10928, 0, "l"], + [10929, 0, "a"], + [10930, 0, "b"], + [10931, 0, "e"], + [10932, 0, "l"], + [10933, 0, "{"], + [10934, 0, "s"], + [10935, 0, "e"], + [10936, 0, "c"], + [10937, 0, ":"], + [10938, 0, "c"], + [10939, 0, "o"], + [10940, 0, "m"], + [10941, 0, "p"], + [10942, 0, "o"], + [10943, 0, "s"], + [10944, 0, "i"], + [10945, 0, "n"], + [10946, 0, "g"], + [10947, 0, "}"], + [12653, 0, "\\"], + [12654, 0, "l"], + [12655, 0, "a"], + [12656, 0, "b"], + [12657, 0, "e"], + [12658, 0, "l"], + [12659, 0, "{"], + [12660, 0, "s"], + [12661, 0, "e"], + [12662, 0, "c"], + [12663, 0, ":"], + [12664, 0, "e"], + [12665, 0, "x"], + [12666, 0, "a"], + [12667, 0, "m"], + [12668, 0, "p"], + [12669, 0, "l"], + [12670, 0, "e"], + [12671, 0, "s"], + [12672, 0, "}"], + [20599, 0, "\\"], + [20600, 0, "l"], + [20601, 0, "a"], + [20602, 0, "b"], + [20603, 0, "e"], + [20604, 0, "l"], + [20605, 0, "{"], + [20606, 0, "s"], + [20607, 0, "e"], + [20608, 0, "c"], + [20609, 0, ":"], + [20610, 0, "j"], + [20611, 0, "s"], + [20612, 0, "o"], + [20613, 0, "n"], + [20614, 0, "-"], + [20615, 0, "x"], + [20616, 0, "m"], + [20617, 0, "l"], + [20618, 0, "}"], + [22121, 0, "\\"], + [22122, 0, "l"], + [22123, 0, "a"], + [22124, 0, "b"], + [22125, 0, "e"], + [22126, 0, "l"], + [22127, 0, "{"], + [22128, 0, "s"], + [22129, 0, "e"], + [22130, 0, "c"], + [22131, 0, ":"], + [22132, 0, "c"], + [22133, 0, "l"], + [22134, 0, "i"], + [22135, 0, "e"], + [22136, 0, "n"], + [22137, 0, "t"], + [22138, 0, "-"], + [22139, 0, "a"], + [22140, 0, "p"], + [22141, 0, "i"], + [22142, 0, "}"], + [22137, 1], + [22136, 1], + [22135, 1], + [22134, 1], + [22133, 1], + [22132, 1], + [22132, 0, "e"], + [22133, 0, "d"], + [22134, 0, "i"], + [22135, 0, "t"], + [22136, 0, "i"], + [22137, 0, "n"], + [22138, 0, "g"], + [4179, 0, "I"], + [4180, 0, "t"], + [4181, 0, " "], + [4182, 0, "h"], + [4183, 0, "a"], + [4184, 0, "s"], + [4185, 0, " "], + [4186, 0, "s"], + [4187, 0, "i"], + [4188, 0, "m"], + [4189, 0, "i"], + [4190, 0, "l"], + [4191, 0, "a"], + [4192, 0, "r"], + [4193, 0, "i"], + [4194, 0, "t"], + [4195, 0, "i"], + [4196, 0, "e"], + [4197, 0, "s"], + [4198, 0, " "], + [4199, 0, "t"], + [4200, 0, "o"], + [4201, 0, " "], + [4202, 0, "X"], + [4203, 0, "M"], + [4204, 0, "L"], + [4205, 0, ","], + [4206, 0, " "], + [4207, 0, "a"], + [4208, 0, "n"], + [4209, 0, "d"], + [4210, 0, " "], + [4211, 0, "w"], + [4212, 0, "e"], + [4213, 0, " "], + [4214, 0, "c"], + [4215, 0, "o"], + [4216, 0, "m"], + [4217, 0, "p"], + [4218, 0, "a"], + [4219, 0, "r"], + [4220, 0, "e"], + [4221, 0, " "], + [4222, 0, "t"], + [4223, 0, "h"], + [4224, 0, "e"], + [4225, 0, "m"], + [4226, 0, " "], + [4227, 0, "f"], + [4228, 0, "u"], + [4229, 0, "r"], + [4230, 0, "t"], + [4231, 0, "h"], + [4232, 0, "e"], + [4233, 0, "r"], + [4234, 0, " "], + [4235, 0, "i"], + [4236, 0, "n"], + [4237, 0, " "], + [4238, 0, "s"], + [4239, 0, "e"], + [4240, 0, "c"], + [4241, 0, "t"], + [4242, 0, "i"], + [4243, 0, "o"], + [4244, 0, "n"], + [4245, 0, "~"], + [4246, 0, "\\"], + [4247, 0, "r"], + [4248, 0, "e"], + [4249, 0, "f"], + [4250, 0, "{"], + [4251, 0, "s"], + [4252, 0, "e"], + [4253, 0, "c"], + [4254, 0, ":"], + [4255, 0, "j"], + [4256, 0, "s"], + [4257, 0, "o"], + [4258, 0, "n"], + [4259, 0, "-"], + [4260, 0, "x"], + [4261, 0, "m"], + [4262, 0, "l"], + [4263, 0, "}"], + [4264, 0, "."], + [4178, 0, " "], + [4179, 0, "i"], + [4180, 0, "s"], + [4181, 0, " "], + [4182, 0, "a"], + [4183, 0, " "], + [4184, 0, "p"], + [4185, 0, "o"], + [4186, 0, "p"], + [4187, 0, "u"], + [4188, 0, "l"], + [4189, 0, "a"], + [4190, 0, "r"], + [4191, 0, " "], + [4192, 0, "g"], + [4193, 0, "e"], + [4194, 0, "n"], + [4195, 0, "e"], + [4196, 0, "r"], + [4197, 0, "a"], + [4198, 0, "l"], + [4199, 0, "-"], + [4200, 0, "p"], + [4201, 0, "u"], + [4202, 0, "r"], + [4203, 0, "p"], + [4204, 0, "o"], + [4205, 0, "s"], + [4206, 0, "e"], + [4207, 0, " "], + [4208, 0, "d"], + [4209, 0, "a"], + [4210, 0, "t"], + [4211, 0, "a"], + [4212, 0, " "], + [4213, 0, "e"], + [4214, 0, "n"], + [4215, 0, "c"], + [4216, 0, "o"], + [4217, 0, "d"], + [4218, 0, "i"], + [4219, 0, "n"], + [4220, 0, "g"], + [4221, 0, " "], + [4222, 0, "f"], + [4223, 0, "o"], + [4224, 0, "r"], + [4225, 0, "m"], + [4226, 0, "a"], + [4227, 0, "t"], + [4228, 0, "."], + [4285, 1], + [4284, 1], + [4283, 1], + [4282, 1], + [4281, 1], + [4280, 1], + [4279, 1], + [4278, 1], + [4308, 0, " "], + [4228, 0, ","], + [4229, 0, " "], + [4230, 0, "u"], + [4231, 0, "s"], + [4232, 0, "e"], + [4233, 0, "d"], + [4234, 0, " "], + [4235, 0, "i"], + [4236, 0, "n"], + [4237, 0, " "], + [4238, 0, "m"], + [4239, 0, "a"], + [4240, 0, "n"], + [4241, 0, "y"], + [4242, 0, " "], + [4243, 0, "d"], + [4244, 0, "a"], + [4245, 0, "t"], + [4246, 0, "a"], + [4247, 0, "b"], + [4248, 0, "a"], + [4249, 0, "s"], + [4250, 0, "e"], + [4251, 0, "s"], + [4252, 0, " "], + [4253, 0, "a"], + [4254, 0, "n"], + [4255, 0, "d"], + [4256, 0, " "], + [4257, 0, "w"], + [4258, 0, "e"], + [4259, 0, "b"], + [4260, 0, " "], + [4261, 0, "s"], + [4262, 0, "e"], + [4263, 0, "r"], + [4264, 0, "v"], + [4265, 0, "i"], + [4266, 0, "c"], + [4267, 0, "e"], + [4268, 0, "s"], + [4350, 0, "T"], + [4351, 0, "h"], + [4352, 0, "e"], + [4353, 0, " "], + [4354, 0, "s"], + [4355, 0, "t"], + [4356, 0, "r"], + [4357, 0, "u"], + [4358, 0, "c"], + [4359, 0, "t"], + [4360, 0, "u"], + [4361, 0, "r"], + [4362, 0, "e"], + [4363, 0, " "], + [4364, 0, "o"], + [4365, 0, "f"], + [4366, 0, " "], + [4367, 0, "a"], + [4368, 0, " "], + [4369, 0, "J"], + [4370, 0, "S"], + [4371, 0, "O"], + [4372, 0, "N"], + [4373, 0, " "], + [4374, 0, "d"], + [4375, 0, "o"], + [4376, 0, "c"], + [4377, 0, "u"], + [4378, 0, "m"], + [4379, 0, "e"], + [4380, 0, "n"], + [4381, 0, "t"], + [4382, 0, " "], + [4383, 0, "c"], + [4384, 0, "a"], + [4385, 0, "n"], + [4386, 0, " "], + [4387, 0, "o"], + [4388, 0, "p"], + [4389, 0, "t"], + [4390, 0, "i"], + [4391, 0, "o"], + [4392, 0, "n"], + [4393, 0, "a"], + [4394, 0, "l"], + [4395, 0, "l"], + [4396, 0, "y"], + [4397, 0, " "], + [4398, 0, "b"], + [4399, 0, "e"], + [4400, 0, " "], + [4401, 0, "c"], + [4402, 0, "o"], + [4403, 0, "n"], + [4404, 0, "s"], + [4405, 0, "t"], + [4406, 0, "r"], + [4407, 0, "a"], + [4408, 0, "i"], + [4409, 0, "n"], + [4410, 0, "e"], + [4411, 0, "d"], + [4412, 0, " "], + [4413, 0, "b"], + [4414, 0, "y"], + [4415, 0, " "], + [4416, 0, "a"], + [4417, 0, " "], + [4418, 0, "s"], + [4419, 0, "c"], + [4420, 0, "h"], + [4421, 0, "e"], + [4422, 0, "m"], + [4423, 0, "a"], + [4424, 0, ","], + [4425, 0, " "], + [4426, 0, "b"], + [4427, 0, "u"], + [4428, 0, "t"], + [4429, 0, " "], + [4430, 0, "i"], + [4431, 0, "n"], + [4432, 0, " "], + [4433, 0, "t"], + [4434, 0, "h"], + [4435, 0, "i"], + [4436, 0, "s"], + [4437, 0, " "], + [4438, 0, "p"], + [4439, 0, "a"], + [4440, 0, "p"], + [4441, 0, "e"], + [4442, 0, "r"], + [4443, 0, " "], + [4444, 0, "w"], + [4445, 0, "e"], + [4446, 0, " "], + [4447, 0, "c"], + [4448, 0, "o"], + [4449, 0, "n"], + [4450, 0, "s"], + [4451, 0, "i"], + [4452, 0, "d"], + [4453, 0, "e"], + [4454, 0, "r"], + [4455, 0, " "], + [4456, 0, "`"], + [4457, 0, "`"], + [4457, 1], + [4456, 1], + [4456, 0, "o"], + [4457, 0, "n"], + [4458, 0, "l"], + [4459, 0, "y"], + [4460, 0, " "], + [4461, 0, "u"], + [4462, 0, "n"], + [4463, 0, "t"], + [4464, 0, "y"], + [4465, 0, "p"], + [4466, 0, "e"], + [4467, 0, "d"], + [4468, 0, " "], + [4469, 0, "J"], + [4470, 0, "S"], + [4471, 0, "O"], + [4472, 0, "N"], + [4473, 0, " "], + [4474, 0, "w"], + [4475, 0, "i"], + [4476, 0, "t"], + [4477, 0, "h"], + [4478, 0, "o"], + [4479, 0, "u"], + [4480, 0, "t"], + [4481, 0, " "], + [4482, 0, "a"], + [4483, 0, "n"], + [4484, 0, " "], + [4485, 0, "e"], + [4486, 0, "x"], + [4487, 0, "p"], + [4488, 0, "l"], + [4489, 0, "i"], + [4490, 0, "c"], + [4491, 0, "i"], + [4492, 0, "t"], + [4493, 0, " "], + [4494, 0, "s"], + [4495, 0, "c"], + [4496, 0, "h"], + [4497, 0, "e"], + [4498, 0, "m"], + [4499, 0, "a"], + [4500, 0, "."], + [4428, 1], + [4427, 1], + [4426, 1], + [4425, 1], + [4424, 1], + [4424, 0, ";"], + [4425, 0, " "], + [4426, 0, "f"], + [4427, 0, "o"], + [4428, 0, "r"], + [4429, 0, " "], + [4430, 0, "s"], + [4431, 0, "i"], + [4432, 0, "m"], + [4433, 0, "p"], + [4434, 0, "l"], + [4435, 0, "i"], + [4436, 0, "c"], + [4437, 0, "i"], + [4438, 0, "t"], + [4439, 0, "y"], + [4440, 0, ","], + [4442, 1], + [4442, 1], + [4442, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 1], + [4453, 0, "d"], + [4454, 0, "i"], + [4455, 0, "s"], + [4456, 0, "c"], + [4457, 0, "u"], + [4458, 0, "s"], + [4459, 0, "s"], + [4460, 0, "e"], + [4461, 0, "s"], + [4425, 0, " "], + [4426, 0, "h"], + [4427, 0, "o"], + [4428, 0, "w"], + [4429, 0, "e"], + [4430, 0, "v"], + [4431, 0, "e"], + [4432, 0, "r"], + [4433, 0, ","], + [4517, 0, "\n"], + [4518, 0, "\n"], + [4519, 0, "A"], + [4520, 0, " "], + [4521, 0, "J"], + [4522, 0, "S"], + [4523, 0, "O"], + [4524, 0, "N"], + [4525, 0, " "], + [4526, 0, "d"], + [4527, 0, "o"], + [4528, 0, "c"], + [4529, 0, "u"], + [4530, 0, "m"], + [4531, 0, "e"], + [4532, 0, "n"], + [4533, 0, "t"], + [4534, 0, " "], + [4535, 0, "i"], + [4536, 0, "s"], + [4537, 0, " "], + [4538, 0, "a"], + [4539, 0, " "], + [4540, 0, "t"], + [4541, 0, "r"], + [4542, 0, "e"], + [4543, 0, "e"], + [4544, 0, " "], + [4545, 0, "c"], + [4546, 0, "o"], + [4547, 0, "n"], + [4548, 0, "s"], + [4549, 0, "i"], + [4550, 0, "s"], + [4551, 0, "t"], + [4552, 0, "i"], + [4553, 0, "n"], + [4554, 0, "g"], + [4555, 0, " "], + [4556, 0, "o"], + [4557, 0, "f"], + [4558, 0, " "], + [4559, 0, "t"], + [4560, 0, "h"], + [4561, 0, "e"], + [4562, 0, " "], + [4563, 0, "f"], + [4564, 0, "o"], + [4565, 0, "l"], + [4566, 0, "l"], + [4567, 0, "o"], + [4568, 0, "w"], + [4569, 0, "i"], + [4570, 0, "n"], + [4571, 0, "g"], + [4572, 0, " "], + [4573, 0, "t"], + [4574, 0, "y"], + [4575, 0, "p"], + [4576, 0, "e"], + [4577, 0, "s"], + [4578, 0, " "], + [4579, 0, "o"], + [4580, 0, "f"], + [4581, 0, " "], + [4582, 0, "n"], + [4583, 0, "o"], + [4584, 0, "d"], + [4585, 0, "e"], + [4586, 0, ":"], + [4587, 0, "\n"], + [4588, 0, "\n"], + [4589, 0, "\\"], + [4590, 0, "b"], + [4591, 0, "e"], + [4592, 0, "g"], + [4593, 0, "i"], + [4594, 0, "n"], + [4595, 0, "{"], + [4596, 0, "d"], + [4597, 0, "e"], + [4598, 0, "s"], + [4599, 0, "c"], + [4600, 0, "r"], + [4601, 0, "i"], + [4602, 0, "p"], + [4603, 0, "t"], + [4604, 0, "i"], + [4605, 0, "o"], + [4606, 0, "n"], + [4607, 0, "}"], + [4608, 0, "\n"], + [4609, 0, "\\"], + [4610, 0, "e"], + [4611, 0, "n"], + [4612, 0, "d"], + [4613, 0, "{"], + [4614, 0, "d"], + [4615, 0, "e"], + [4616, 0, "s"], + [4617, 0, "c"], + [4618, 0, "r"], + [4619, 0, "i"], + [4620, 0, "p"], + [4621, 0, "t"], + [4622, 0, "i"], + [4623, 0, "o"], + [4624, 0, "n"], + [4625, 0, "}"], + [4608, 0, "\n"], + [4609, 0, "\\"], + [4610, 0, "i"], + [4611, 0, "t"], + [4612, 0, "e"], + [4613, 0, "m"], + [4614, 0, "["], + [4615, 0, "M"], + [4616, 0, "a"], + [4617, 0, "p"], + [4618, 0, ":"], + [4619, 0, "]"], + [4620, 0, " "], + [4621, 0, "A"], + [4622, 0, " "], + [4623, 0, "b"], + [4624, 0, "r"], + [4625, 0, "a"], + [4626, 0, "n"], + [4627, 0, "c"], + [4628, 0, "h"], + [4629, 0, " "], + [4630, 0, "n"], + [4631, 0, "o"], + [4632, 0, "d"], + [4633, 0, "e"], + [4634, 0, " "], + [4635, 0, "w"], + [4636, 0, "h"], + [4637, 0, "o"], + [4638, 0, "s"], + [4639, 0, "e"], + [4640, 0, " "], + [4641, 0, "c"], + [4642, 0, "h"], + [4643, 0, "i"], + [4644, 0, "l"], + [4645, 0, "d"], + [4646, 0, "r"], + [4647, 0, "e"], + [4648, 0, "n"], + [4649, 0, " "], + [4650, 0, "a"], + [4651, 0, "r"], + [4652, 0, "e"], + [4653, 0, " "], + [4654, 0, "n"], + [4655, 0, "o"], + [4656, 0, "t"], + [4657, 0, " "], + [4658, 0, "o"], + [4659, 0, "r"], + [4660, 0, "d"], + [4661, 0, "e"], + [4662, 0, "r"], + [4663, 0, "e"], + [4664, 0, "d"], + [4664, 1], + [4663, 1], + [4662, 1], + [4661, 1], + [4660, 1], + [4659, 1], + [4658, 1], + [4657, 1], + [4656, 1], + [4655, 1], + [4654, 1], + [4653, 1], + [4652, 1], + [4651, 1], + [4650, 1], + [4650, 0, "h"], + [4651, 0, "a"], + [4652, 0, "v"], + [4653, 0, "e"], + [4654, 0, " "], + [4655, 0, "n"], + [4656, 0, "o"], + [4657, 0, " "], + [4658, 0, "d"], + [4659, 0, "e"], + [4660, 0, "f"], + [4661, 0, "i"], + [4662, 0, "n"], + [4663, 0, "e"], + [4664, 0, "d"], + [4665, 0, " "], + [4666, 0, "o"], + [4667, 0, "r"], + [4668, 0, "d"], + [4669, 0, "e"], + [4670, 0, "r"], + [4671, 0, ","], + [4672, 0, " "], + [4673, 0, "a"], + [4674, 0, "n"], + [4675, 0, "d"], + [4676, 0, " "], + [4677, 0, "w"], + [4678, 0, "h"], + [4679, 0, "e"], + [4680, 0, "r"], + [4681, 0, "e"], + [4682, 0, " "], + [4683, 0, "e"], + [4684, 0, "a"], + [4685, 0, "c"], + [4686, 0, "h"], + [4687, 0, " "], + [4688, 0, "c"], + [4689, 0, "h"], + [4690, 0, "i"], + [4691, 0, "l"], + [4692, 0, "d"], + [4693, 0, " "], + [4694, 0, "i"], + [4695, 0, "s"], + [4696, 0, " "], + [4697, 0, "l"], + [4698, 0, "a"], + [4699, 0, "b"], + [4700, 0, "e"], + [4701, 0, "l"], + [4702, 0, "l"], + [4703, 0, "e"], + [4704, 0, "d"], + [4705, 0, " "], + [4706, 0, "w"], + [4707, 0, "i"], + [4708, 0, "t"], + [4709, 0, "h"], + [4710, 0, " "], + [4711, 0, "a"], + [4712, 0, " "], + [4713, 0, "s"], + [4714, 0, "t"], + [4715, 0, "r"], + [4716, 0, "i"], + [4717, 0, "n"], + [4718, 0, "g"], + [4719, 0, " "], + [4720, 0, "\\"], + [4721, 0, "e"], + [4722, 0, "m"], + [4723, 0, "p"], + [4724, 0, "h"], + [4725, 0, "{"], + [4726, 0, "k"], + [4727, 0, "e"], + [4728, 0, "y"], + [4729, 0, "}"], + [4730, 0, "."], + [4731, 0, " "], + [4732, 0, "A"], + [4733, 0, " "], + [4734, 0, "k"], + [4735, 0, "e"], + [4736, 0, "y"], + [4737, 0, " "], + [4738, 0, "u"], + [4739, 0, "n"], + [4740, 0, "i"], + [4741, 0, "q"], + [4742, 0, "u"], + [4743, 0, "e"], + [4744, 0, "l"], + [4745, 0, "y"], + [4746, 0, " "], + [4747, 0, "i"], + [4748, 0, "d"], + [4749, 0, "e"], + [4750, 0, "n"], + [4751, 0, "t"], + [4752, 0, "i"], + [4753, 0, "f"], + [4754, 0, "i"], + [4755, 0, "e"], + [4756, 0, "s"], + [4757, 0, " "], + [4758, 0, "o"], + [4759, 0, "n"], + [4760, 0, "e"], + [4761, 0, " "], + [4762, 0, "o"], + [4763, 0, "f"], + [4764, 0, " "], + [4765, 0, "t"], + [4766, 0, "h"], + [4767, 0, "e"], + [4768, 0, " "], + [4769, 0, "c"], + [4770, 0, "h"], + [4771, 0, "i"], + [4772, 0, "l"], + [4773, 0, "d"], + [4774, 0, "r"], + [4775, 0, "e"], + [4776, 0, "n"], + [4777, 0, "."], + [4778, 0, " "], + [4779, 0, "A"], + [4780, 0, " "], + [4781, 0, "J"], + [4782, 0, "S"], + [4783, 0, "O"], + [4784, 0, "N"], + [4785, 0, " "], + [4786, 0, "m"], + [4787, 0, "a"], + [4788, 0, "p"], + [4789, 0, " "], + [4790, 0, "i"], + [4791, 0, "s"], + [4792, 0, " "], + [4793, 0, "a"], + [4794, 0, "l"], + [4795, 0, "s"], + [4796, 0, "o"], + [4797, 0, " "], + [4798, 0, "k"], + [4799, 0, "n"], + [4800, 0, "o"], + [4801, 0, "w"], + [4802, 0, "n"], + [4803, 0, " "], + [4804, 0, "a"], + [4805, 0, "s"], + [4806, 0, " "], + [4807, 0, "a"], + [4808, 0, "n"], + [4809, 0, " "], + [4810, 0, "\\"], + [4811, 0, "e"], + [4812, 0, "m"], + [4813, 0, "p"], + [4814, 0, "h"], + [4815, 0, "{"], + [4816, 0, "o"], + [4817, 0, "b"], + [4818, 0, "j"], + [4819, 0, "e"], + [4820, 0, "c"], + [4821, 0, "t"], + [4822, 0, "}"], + [4823, 0, "."], + [4824, 0, "\n"], + [4825, 0, "\\"], + [4826, 0, "i"], + [4827, 0, "t"], + [4828, 0, "e"], + [4829, 0, "m"], + [4830, 0, "{"], + [4831, 0, "L"], + [4832, 0, "i"], + [4833, 0, "s"], + [4834, 0, "t"], + [4835, 0, ":"], + [4830, 1], + [4830, 0, "["], + [4836, 0, "]"], + [4837, 0, " "], + [4838, 0, "A"], + [4839, 0, " "], + [4840, 0, "b"], + [4841, 0, "r"], + [4842, 0, "a"], + [4843, 0, "n"], + [4844, 0, "c"], + [4845, 0, "h"], + [4846, 0, " "], + [4847, 0, "n"], + [4848, 0, "o"], + [4849, 0, "d"], + [4850, 0, "e"], + [4851, 0, " "], + [4852, 0, "w"], + [4853, 0, "h"], + [4854, 0, "o"], + [4855, 0, "s"], + [4856, 0, "e"], + [4857, 0, " "], + [4858, 0, "c"], + [4859, 0, "h"], + [4860, 0, "i"], + [4861, 0, "l"], + [4862, 0, "d"], + [4863, 0, "r"], + [4864, 0, "e"], + [4865, 0, "n"], + [4866, 0, " "], + [4867, 0, "h"], + [4868, 0, "a"], + [4869, 0, "v"], + [4870, 0, "e"], + [4871, 0, " "], + [4872, 0, "a"], + [4873, 0, "n"], + [4874, 0, " "], + [4875, 0, "o"], + [4876, 0, "r"], + [4877, 0, "d"], + [4878, 0, "e"], + [4879, 0, "r"], + [4880, 0, " "], + [4881, 0, "d"], + [4882, 0, "e"], + [4883, 0, "f"], + [4884, 0, "i"], + [4885, 0, "n"], + [4886, 0, "e"], + [4887, 0, "d"], + [4888, 0, " "], + [4889, 0, "b"], + [4890, 0, "y"], + [4891, 0, " "], + [4892, 0, "t"], + [4893, 0, "h"], + [4894, 0, "e"], + [4895, 0, " "], + [4896, 0, "a"], + [4897, 0, "p"], + [4898, 0, "p"], + [4899, 0, "l"], + [4900, 0, "i"], + [4901, 0, "c"], + [4902, 0, "a"], + [4903, 0, "t"], + [4904, 0, "i"], + [4905, 0, "o"], + [4906, 0, "n"], + [4907, 0, "."], + [4908, 0, " "], + [4909, 0, "T"], + [4910, 0, "h"], + [4910, 1], + [4909, 1], + [4909, 0, "A"], + [4910, 0, " "], + [4911, 0, "J"], + [4912, 0, "S"], + [4913, 0, "O"], + [4914, 0, "N"], + [4915, 0, " "], + [4916, 0, "l"], + [4917, 0, "i"], + [4918, 0, "s"], + [4919, 0, "t"], + [4920, 0, " "], + [4921, 0, "i"], + [4922, 0, "s"], + [4923, 0, " "], + [4924, 0, "a"], + [4925, 0, "l"], + [4926, 0, "s"], + [4927, 0, "o"], + [4928, 0, " "], + [4929, 0, "k"], + [4930, 0, "n"], + [4931, 0, "o"], + [4932, 0, "w"], + [4933, 0, "n"], + [4934, 0, " "], + [4935, 0, "a"], + [4936, 0, "s"], + [4937, 0, " "], + [4938, 0, "a"], + [4939, 0, "n"], + [4940, 0, " "], + [4941, 0, "\\"], + [4942, 0, "e"], + [4943, 0, "m"], + [4944, 0, "p"], + [4945, 0, "h"], + [4946, 0, "{"], + [4947, 0, "a"], + [4948, 0, "r"], + [4949, 0, "r"], + [4950, 0, "a"], + [4951, 0, "y"], + [4952, 0, "}"], + [4953, 0, "."], + [4954, 0, "\n"], + [4955, 0, "\\"], + [4956, 0, "i"], + [4957, 0, "t"], + [4958, 0, "e"], + [4959, 0, "m"], + [4960, 0, "["], + [4961, 0, "R"], + [4962, 0, "e"], + [4963, 0, "g"], + [4964, 0, "i"], + [4965, 0, "s"], + [4966, 0, "t"], + [4967, 0, "e"], + [4968, 0, "r"], + [4969, 0, ":"], + [4970, 0, "]"], + [4971, 0, " "], + [4972, 0, "A"], + [4973, 0, " "], + [4974, 0, "l"], + [4975, 0, "e"], + [4976, 0, "a"], + [4977, 0, "f"], + [4978, 0, " "], + [4979, 0, "n"], + [4980, 0, "o"], + [4981, 0, "d"], + [4982, 0, "e"], + [4983, 0, " "], + [4984, 0, "c"], + [4985, 0, "o"], + [4986, 0, "n"], + [4987, 0, "t"], + [4988, 0, "a"], + [4989, 0, "i"], + [4990, 0, "n"], + [4991, 0, "i"], + [4992, 0, "n"], + [4993, 0, "g"], + [4994, 0, " "], + [4995, 0, "a"], + [4996, 0, " "], + [4997, 0, "p"], + [4998, 0, "r"], + [4999, 0, "i"], + [5000, 0, "m"], + [5001, 0, "i"], + [5002, 0, "t"], + [5003, 0, "i"], + [5004, 0, "v"], + [5005, 0, "e"], + [5006, 0, " "], + [5007, 0, "v"], + [5008, 0, "a"], + [5009, 0, "l"], + [5010, 0, "u"], + [5011, 0, "e"], + [5012, 0, " "], + [5013, 0, "("], + [5014, 0, "s"], + [5015, 0, "t"], + [5016, 0, "r"], + [5017, 0, "i"], + [5018, 0, "n"], + [5019, 0, "g"], + [5020, 0, ","], + [5021, 0, " "], + [5022, 0, "n"], + [5023, 0, "u"], + [5024, 0, "m"], + [5025, 0, "b"], + [5026, 0, "e"], + [5027, 0, "r"], + [5028, 0, ","], + [5029, 0, " "], + [5030, 0, "b"], + [5031, 0, "o"], + [5032, 0, "o"], + [5033, 0, "l"], + [5034, 0, "e"], + [5035, 0, "a"], + [5036, 0, "n"], + [5037, 0, " "], + [5038, 0, "o"], + [5039, 0, "r"], + [5037, 0, ","], + [5041, 0, " "], + [5042, 0, "n"], + [5043, 0, "u"], + [5044, 0, "l"], + [5045, 0, "l"], + [5046, 0, ")"], + [5047, 0, "."], + [5048, 0, " "], + [5048, 1], + [4582, 0, "b"], + [4583, 0, "r"], + [4584, 0, "a"], + [4585, 0, "n"], + [4586, 0, "c"], + [4587, 0, "h"], + [4588, 0, " "], + [4635, 1], + [4634, 1], + [4633, 1], + [4632, 1], + [4631, 1], + [4630, 1], + [4629, 1], + [4840, 1], + [4840, 1], + [4840, 1], + [4840, 1], + [4840, 1], + [4840, 1], + [4840, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4948, 1], + [4947, 1], + [4965, 0, "\n"], + [4966, 0, "\n"], + [4824, 0, " "], + [4824, 1], + [4778, 0, " "], + [4779, 0, "K"], + [4780, 0, "e"], + [4781, 0, "y"], + [4782, 0, "s"], + [4783, 0, " "], + [4784, 0, "a"], + [4785, 0, "r"], + [4786, 0, "e"], + [4787, 0, " "], + [4788, 0, "i"], + [4789, 0, "m"], + [4790, 0, "m"], + [4791, 0, "u"], + [4792, 0, "t"], + [4793, 0, "a"], + [4794, 0, "b"], + [4795, 0, "l"], + [4796, 0, "e"], + [4797, 0, ","], + [4798, 0, " "], + [4799, 0, "b"], + [4800, 0, "u"], + [4801, 0, "t"], + [4802, 0, " "], + [4803, 0, "v"], + [4804, 0, "a"], + [4805, 0, "l"], + [4806, 0, "u"], + [4807, 0, "e"], + [4808, 0, "s"], + [4809, 0, " "], + [4810, 0, "a"], + [4811, 0, "r"], + [4812, 0, "e"], + [4813, 0, " "], + [4814, 0, "m"], + [4815, 0, "u"], + [4816, 0, "t"], + [4817, 0, "a"], + [4818, 0, "b"], + [4819, 0, "l"], + [4820, 0, "e"], + [4821, 0, ","], + [4822, 0, " "], + [4823, 0, "a"], + [4824, 0, "n"], + [4825, 0, "d"], + [4826, 0, " "], + [4827, 0, "k"], + [4828, 0, "e"], + [4829, 0, "y"], + [4830, 0, "-"], + [4831, 0, "v"], + [4832, 0, "a"], + [4833, 0, "l"], + [4834, 0, "u"], + [4835, 0, "e"], + [4836, 0, " "], + [4837, 0, "m"], + [4838, 0, "a"], + [4839, 0, "p"], + [4840, 0, "p"], + [4841, 0, "i"], + [4842, 0, "n"], + [4843, 0, "g"], + [4844, 0, "s"], + [4845, 0, " "], + [4846, 0, "c"], + [4847, 0, "a"], + [4848, 0, "n"], + [4849, 0, " "], + [4850, 0, "b"], + [4851, 0, "e"], + [4852, 0, " "], + [4853, 0, "a"], + [4854, 0, "d"], + [4855, 0, "d"], + [4856, 0, "e"], + [4857, 0, "d"], + [4858, 0, " "], + [4859, 0, "a"], + [4860, 0, "n"], + [4861, 0, "d"], + [4862, 0, " "], + [4863, 0, "r"], + [4864, 0, "e"], + [4865, 0, "m"], + [4866, 0, "o"], + [4867, 0, "v"], + [4868, 0, "e"], + [4869, 0, "d"], + [4870, 0, " "], + [4871, 0, "f"], + [4872, 0, "r"], + [4873, 0, "o"], + [4874, 0, "m"], + [4875, 0, " "], + [4876, 0, "t"], + [4877, 0, "h"], + [4878, 0, "e"], + [4879, 0, " "], + [4880, 0, "m"], + [4881, 0, "a"], + [4882, 0, "p"], + [4883, 0, "."], + [5007, 0, " "], + [5008, 0, "T"], + [5009, 0, "h"], + [5010, 0, "e"], + [5011, 0, " "], + [5012, 0, "l"], + [5013, 0, "i"], + [5014, 0, "s"], + [5015, 0, "t"], + [5016, 0, " "], + [5017, 0, "c"], + [5018, 0, "a"], + [5019, 0, "n"], + [5020, 0, " "], + [5021, 0, "b"], + [5022, 0, "e"], + [5023, 0, " "], + [5024, 0, "m"], + [5025, 0, "u"], + [5026, 0, "t"], + [5027, 0, "a"], + [5028, 0, "t"], + [5029, 0, "e"], + [5030, 0, "d"], + [5031, 0, " "], + [5032, 0, "b"], + [5033, 0, "y"], + [5034, 0, " "], + [5035, 0, "i"], + [5036, 0, "n"], + [5037, 0, "s"], + [5038, 0, "e"], + [5039, 0, "r"], + [5040, 0, "t"], + [5041, 0, "i"], + [5042, 0, "n"], + [5043, 0, "g"], + [5044, 0, " "], + [5045, 0, "o"], + [5046, 0, "r"], + [5047, 0, " "], + [5048, 0, "d"], + [5049, 0, "e"], + [5050, 0, "l"], + [5051, 0, "e"], + [5052, 0, "t"], + [5053, 0, "i"], + [5054, 0, "n"], + [5055, 0, "g"], + [5056, 0, " "], + [5057, 0, "l"], + [5058, 0, "i"], + [5059, 0, "s"], + [5060, 0, "t"], + [5061, 0, " "], + [5062, 0, "e"], + [5063, 0, "l"], + [5064, 0, "e"], + [5065, 0, "m"], + [5066, 0, "e"], + [5067, 0, "n"], + [5068, 0, "t"], + [5069, 0, "s"], + [5070, 0, "."], + [5137, 0, "T"], + [5138, 0, "h"], + [5139, 0, "e"], + [5140, 0, " "], + [5141, 0, "l"], + [5142, 0, "e"], + [5143, 0, "a"], + [5144, 0, "v"], + [5145, 0, "e"], + [5146, 0, "s"], + [5147, 0, " "], + [5148, 0, "o"], + [5149, 0, "f"], + [5150, 0, " "], + [5151, 0, "t"], + [5152, 0, "h"], + [5153, 0, "e"], + [5154, 0, " "], + [5155, 0, "t"], + [5156, 0, "r"], + [5157, 0, "e"], + [5158, 0, "e"], + [5159, 0, " "], + [5160, 0, "c"], + [5161, 0, "o"], + [5162, 0, "n"], + [5163, 0, "t"], + [5164, 0, "a"], + [5165, 0, "i"], + [5166, 0, "n"], + [5167, 0, " "], + [5139, 1], + [5138, 1], + [5137, 1], + [5137, 0, "e"], + [5137, 1], + [5137, 0, "A"], + [5138, 0, " "], + [5139, 0, "c"], + [5140, 0, "h"], + [5141, 0, "i"], + [5142, 0, "l"], + [5143, 0, "d"], + [5144, 0, " "], + [5145, 0, "o"], + [5146, 0, "f"], + [5147, 0, " "], + [5148, 0, "a"], + [5149, 0, " "], + [5150, 0, "b"], + [5151, 0, "r"], + [5152, 0, "a"], + [5153, 0, "n"], + [5154, 0, "c"], + [5155, 0, "h"], + [5156, 0, " "], + [5157, 0, "n"], + [5158, 0, "o"], + [5159, 0, "d"], + [5160, 0, "e"], + [5161, 0, " "], + [5162, 0, "c"], + [5163, 0, "a"], + [5164, 0, "n"], + [5165, 0, " "], + [5166, 0, "b"], + [5167, 0, "e"], + [5168, 0, " "], + [5169, 0, "e"], + [5170, 0, "i"], + [5171, 0, "t"], + [5172, 0, "h"], + [5173, 0, "e"], + [5174, 0, "r"], + [5175, 0, " "], + [5176, 0, "a"], + [5177, 0, "n"], + [5178, 0, "o"], + [5179, 0, "t"], + [5180, 0, "h"], + [5181, 0, "e"], + [5182, 0, "r"], + [5183, 0, " "], + [5184, 0, "b"], + [5185, 0, "r"], + [5186, 0, "a"], + [5187, 0, "n"], + [5188, 0, "c"], + [5189, 0, "h"], + [5190, 0, " "], + [5191, 0, "n"], + [5192, 0, "o"], + [5193, 0, "d"], + [5194, 0, "e"], + [5195, 0, ","], + [5196, 0, " "], + [5197, 0, "o"], + [5198, 0, "r"], + [5199, 0, " "], + [5200, 0, "a"], + [5201, 0, " "], + [5202, 0, "l"], + [5203, 0, "e"], + [5204, 0, "a"], + [5205, 0, "f"], + [5206, 0, " "], + [5207, 0, "n"], + [5208, 0, "o"], + [5209, 0, "d"], + [5210, 0, "e"], + [5211, 0, "."], + [5212, 0, " "], + [5213, 0, "A"], + [5220, 1], + [5219, 1], + [5218, 1], + [5218, 0, "f"], + [5239, 1], + [5239, 0, "s"], + [5240, 0, " "], + [5241, 0, "a"], + [5242, 0, " "], + [5243, 0, "p"], + [5244, 0, "r"], + [5245, 0, "i"], + [5246, 0, "m"], + [5247, 0, "i"], + [5248, 0, "t"], + [5249, 0, "i"], + [5250, 0, "v"], + [5251, 0, "e"], + [5252, 0, " "], + [5253, 0, "v"], + [5254, 0, "a"], + [5255, 0, "l"], + [5256, 0, "u"], + [5257, 0, "e"], + [5258, 0, " "], + [5259, 0, "("], + [5260, 0, "s"], + [5261, 0, "t"], + [5262, 0, "r"], + [5263, 0, "i"], + [5264, 0, "n"], + [5265, 0, "g"], + [5266, 0, ","], + [5267, 0, " "], + [5268, 0, "n"], + [5269, 0, "u"], + [5270, 0, "m"], + [5271, 0, "b"], + [5272, 0, "e"], + [5273, 0, "r"], + [5274, 0, ","], + [5275, 0, " "], + [5276, 0, "b"], + [5277, 0, "o"], + [5278, 0, "o"], + [5279, 0, "l"], + [5280, 0, "e"], + [5281, 0, "a"], + [5282, 0, "n"], + [5283, 0, ","], + [5284, 0, " "], + [5285, 0, "o"], + [5286, 0, "r"], + [5287, 0, " "], + [5288, 0, "n"], + [5289, 0, "u"], + [5290, 0, "l"], + [5291, 0, "l"], + [5292, 0, ")"], + [5293, 0, "."], + [5294, 0, " "], + [5295, 0, "W"], + [5296, 0, "e"], + [5297, 0, " "], + [5298, 0, "t"], + [5299, 0, "r"], + [5300, 0, "e"], + [5301, 0, "a"], + [5302, 0, "t"], + [5303, 0, " "], + [5304, 0, "p"], + [5305, 0, "r"], + [5306, 0, "i"], + [5307, 0, "m"], + [5308, 0, "i"], + [5309, 0, "t"], + [5310, 0, "i"], + [5311, 0, "v"], + [5312, 0, "e"], + [5313, 0, " "], + [5314, 0, "v"], + [5315, 0, "a"], + [5316, 0, "l"], + [5317, 0, "u"], + [5318, 0, "e"], + [5319, 0, "s"], + [5320, 0, " "], + [5321, 0, "a"], + [5322, 0, "s"], + [5323, 0, " "], + [5324, 0, "i"], + [5325, 0, "m"], + [5326, 0, "m"], + [5327, 0, "u"], + [5328, 0, "t"], + [5329, 0, "a"], + [5330, 0, "b"], + [5331, 0, "l"], + [5332, 0, "e"], + [5333, 0, ","], + [5334, 0, " "], + [5335, 0, "b"], + [5336, 0, "u"], + [5337, 0, "t"], + [5338, 0, " "], + [5339, 0, "a"], + [5340, 0, "l"], + [5341, 0, "l"], + [5342, 0, "o"], + [5343, 0, "w"], + [5344, 0, " "], + [5345, 0, "a"], + [5346, 0, " "], + [5346, 1], + [5345, 1], + [5345, 0, "t"], + [5346, 0, "h"], + [5347, 0, "e"], + [5348, 0, " "], + [5349, 0, "v"], + [5350, 0, "a"], + [5351, 0, "l"], + [5352, 0, "u"], + [5353, 0, "e"], + [5354, 0, " "], + [5355, 0, "o"], + [5356, 0, "f"], + [5357, 0, " "], + [5358, 0, "a"], + [5359, 0, " "], + [5360, 0, "l"], + [5361, 0, "e"], + [5362, 0, "a"], + [5363, 0, "f"], + [5364, 0, " "], + [5365, 0, "n"], + [5366, 0, "o"], + [5367, 0, "d"], + [5368, 0, "e"], + [5369, 0, " "], + [5370, 0, "t"], + [5371, 0, "o"], + [5372, 0, " "], + [5373, 0, "b"], + [5374, 0, "e"], + [5375, 0, " "], + [5376, 0, "m"], + [5377, 0, "o"], + [5378, 0, "d"], + [5379, 0, "i"], + [5380, 0, "f"], + [5381, 0, "i"], + [5382, 0, "e"], + [5383, 0, "d"], + [5384, 0, " "], + [5385, 0, "b"], + [5386, 0, "y"], + [5387, 0, " "], + [5388, 0, "t"], + [5389, 0, "r"], + [5390, 0, "e"], + [5391, 0, "a"], + [5392, 0, "t"], + [5393, 0, "i"], + [5394, 0, "n"], + [5395, 0, "g"], + [5396, 0, " "], + [5397, 0, "i"], + [5398, 0, "t"], + [5399, 0, " "], + [5400, 0, "a"], + [5401, 0, "s"], + [5402, 0, " "], + [5403, 0, "a"], + [5404, 0, " "], + [5405, 0, "\\"], + [5406, 0, "e"], + [5407, 0, "m"], + [5408, 0, "p"], + [5409, 0, "h"], + [5410, 0, "{"], + [5411, 0, "r"], + [5412, 0, "e"], + [5413, 0, "g"], + [5414, 0, "i"], + [5415, 0, "s"], + [5416, 0, "t"], + [5417, 0, "e"], + [5418, 0, "r"], + [5419, 0, "}"], + [5420, 0, " "], + [5421, 0, "t"], + [5422, 0, "h"], + [5423, 0, "a"], + [5424, 0, "t"], + [5425, 0, " "], + [5426, 0, "c"], + [5427, 0, "a"], + [5428, 0, "n"], + [5429, 0, " "], + [5430, 0, "b"], + [5431, 0, "e"], + [5432, 0, " "], + [5433, 0, "a"], + [5434, 0, "s"], + [5435, 0, "s"], + [5436, 0, "i"], + [5437, 0, "g"], + [5438, 0, "n"], + [5439, 0, "e"], + [5440, 0, "d"], + [5441, 0, " "], + [5442, 0, "a"], + [5443, 0, " "], + [5444, 0, "n"], + [5445, 0, "e"], + [5446, 0, "w"], + [5447, 0, " "], + [5448, 0, "v"], + [5449, 0, "a"], + [5450, 0, "l"], + [5451, 0, "u"], + [5452, 0, "e"], + [5453, 0, "."], + [4571, 1], + [4570, 1], + [4569, 1], + [4568, 1], + [4567, 1], + [4566, 1], + [4565, 1], + [4564, 1], + [4563, 1], + [4562, 1], + [4561, 1], + [4560, 1], + [4559, 1], + [4558, 1], + [4557, 1], + [4556, 1], + [4555, 1], + [4554, 1], + [4553, 1], + [4552, 1], + [4551, 1], + [4550, 1], + [4549, 1], + [4548, 1], + [4548, 0, "n"], + [4549, 0, "t"], + [4550, 0, "a"], + [4551, 0, "i"], + [4552, 0, "n"], + [4552, 1], + [4551, 1], + [4550, 1], + [4549, 1], + [4548, 1], + [4548, 0, "t"], + [4549, 0, "a"], + [4550, 0, "i"], + [4551, 0, "n"], + [4552, 0, "i"], + [4553, 0, "n"], + [4554, 0, "g"], + [4555, 0, " "], + [4556, 0, "t"], + [4557, 0, "w"], + [4558, 0, "o"], + [5441, 0, "\n"], + [5442, 0, "\n"], + [5443, 0, "\\"], + [5443, 1], + [5443, 0, "I"], + [5444, 0, "n"], + [5445, 0, " "], + [5446, 0, "s"], + [5447, 0, "e"], + [5448, 0, "c"], + [5449, 0, "t"], + [5450, 0, "i"], + [5451, 0, "o"], + [5452, 0, "n"], + [5453, 0, "~"], + [5454, 0, "\\"], + [5455, 0, "r"], + [5456, 0, "e"], + [5457, 0, "f"], + [5458, 0, "{"], + [5459, 0, "s"], + [5460, 0, "e"], + [5461, 0, "c"], + [5462, 0, ":"], + [5463, 0, "e"], + [5464, 0, "a"], + [5464, 1], + [5464, 0, "x"], + [5465, 0, "a"], + [5466, 0, "m"], + [5467, 0, "p"], + [5468, 0, "l"], + [5469, 0, "e"], + [5470, 0, "s"], + [5471, 0, "}"], + [5472, 0, " "], + [5473, 0, "w"], + [5474, 0, "e"], + [5475, 0, " "], + [5476, 0, "s"], + [5477, 0, "h"], + [5478, 0, "o"], + [5479, 0, "w"], + [5480, 0, " "], + [5481, 0, "s"], + [5482, 0, "o"], + [5483, 0, "m"], + [5484, 0, "e"], + [5485, 0, " "], + [5486, 0, "e"], + [5487, 0, "x"], + [5487, 1], + [5486, 1], + [5486, 0, "s"], + [5487, 0, "i"], + [5488, 0, "m"], + [5489, 0, "p"], + [5490, 0, "l"], + [5491, 0, "e"], + [5492, 0, " "], + [5493, 0, "e"], + [5494, 0, "x"], + [5495, 0, "a"], + [5496, 0, "m"], + [5497, 0, "p"], + [5498, 0, "l"], + [5499, 0, "e"], + [5500, 0, "s"], + [5501, 0, " "], + [5502, 0, "o"], + [5503, 0, "f"], + [5504, 0, " "], + [5505, 0, "u"], + [5506, 0, "s"], + [5507, 0, "i"], + [5508, 0, "n"], + [5509, 0, "g"], + [5510, 0, " "], + [5511, 0, "J"], + [5512, 0, "S"], + [5513, 0, "O"], + [5514, 0, "N"], + [5515, 0, " "], + [5516, 0, "t"], + [5517, 0, "o"], + [5518, 0, " "], + [5519, 0, "m"], + [5520, 0, "o"], + [5521, 0, "d"], + [5522, 0, "e"], + [5523, 0, "l"], + [5524, 0, " "], + [5525, 0, "a"], + [5526, 0, "p"], + [5527, 0, "p"], + [5528, 0, "l"], + [5529, 0, "i"], + [5530, 0, "c"], + [5531, 0, "a"], + [5532, 0, "t"], + [5533, 0, "i"], + [5534, 0, "o"], + [5535, 0, "n"], + [5536, 0, " "], + [5537, 0, "d"], + [5538, 0, "a"], + [5539, 0, "t"], + [5540, 0, "a"], + [5541, 0, "."], + [5442, 0, "\n"], + [5443, 0, "T"], + [5444, 0, "h"], + [5445, 0, "i"], + [5446, 0, "s"], + [5447, 0, " "], + [5448, 0, "m"], + [5449, 0, "o"], + [5450, 0, "d"], + [5451, 0, "e"], + [5452, 0, "l"], + [5453, 0, " "], + [5454, 0, "i"], + [5455, 0, "s"], + [5456, 0, " "], + [5457, 0, "s"], + [5458, 0, "u"], + [5459, 0, "f"], + [5460, 0, "f"], + [5461, 0, "i"], + [5462, 0, "c"], + [5463, 0, "i"], + [5464, 0, "e"], + [5465, 0, "n"], + [5466, 0, "t"], + [5467, 0, " "], + [5468, 0, "t"], + [5469, 0, "o"], + [5470, 0, " "], + [5471, 0, "e"], + [5472, 0, "x"], + [5473, 0, "p"], + [5474, 0, "r"], + [5475, 0, "e"], + [5476, 0, "s"], + [5477, 0, "s"], + [5478, 0, " "], + [5479, 0, "t"], + [5480, 0, "h"], + [5481, 0, "e"], + [5482, 0, " "], + [5483, 0, "s"], + [5484, 0, "t"], + [5485, 0, "a"], + [5486, 0, "t"], + [5487, 0, "e"], + [5488, 0, " "], + [5489, 0, "o"], + [5490, 0, "f"], + [5491, 0, " "], + [5492, 0, "a"], + [5493, 0, " "], + [5494, 0, "w"], + [5495, 0, "i"], + [5496, 0, "d"], + [5497, 0, "e"], + [5498, 0, " "], + [5499, 0, "r"], + [5500, 0, "a"], + [5501, 0, "n"], + [5502, 0, "g"], + [5503, 0, "e"], + [5504, 0, " "], + [5505, 0, "o"], + [5506, 0, "f"], + [5507, 0, " "], + [5508, 0, "a"], + [5509, 0, "p"], + [5510, 0, "p"], + [5511, 0, "l"], + [5512, 0, "i"], + [5513, 0, "c"], + [5514, 0, "a"], + [5515, 0, "t"], + [5516, 0, "i"], + [5517, 0, "o"], + [5518, 0, "n"], + [5519, 0, "s"], + [5520, 0, "."], + [5521, 0, " "], + [5522, 0, "F"], + [5523, 0, "o"], + [5524, 0, "r"], + [5525, 0, " "], + [5526, 0, "e"], + [5527, 0, "x"], + [5528, 0, "a"], + [5529, 0, "m"], + [5530, 0, "p"], + [5531, 0, "l"], + [5532, 0, "e"], + [5533, 0, ","], + [5534, 0, " "], + [5535, 0, "a"], + [5536, 0, " "], + [5537, 0, "t"], + [5538, 0, "e"], + [5539, 0, "x"], + [5540, 0, "t"], + [5541, 0, " "], + [5542, 0, "d"], + [5543, 0, "o"], + [5544, 0, "c"], + [5545, 0, "u"], + [5546, 0, "m"], + [5547, 0, "e"], + [5548, 0, "n"], + [5549, 0, "t"], + [5550, 0, " "], + [5551, 0, "c"], + [5552, 0, "a"], + [5553, 0, "n"], + [5554, 0, " "], + [5555, 0, "b"], + [5556, 0, "e"], + [5557, 0, " "], + [5558, 0, "r"], + [5559, 0, "e"], + [5560, 0, "p"], + [5561, 0, "r"], + [5562, 0, "e"], + [5563, 0, "s"], + [5564, 0, "e"], + [5565, 0, "n"], + [5566, 0, "t"], + [5567, 0, "e"], + [5568, 0, "d"], + [5569, 0, " "], + [5570, 0, "b"], + [5571, 0, "y"], + [5572, 0, " "], + [5573, 0, "a"], + [5574, 0, "n"], + [5575, 0, " "], + [5576, 0, "o"], + [5577, 0, "r"], + [5578, 0, "d"], + [5579, 0, "e"], + [5580, 0, "r"], + [5581, 0, "e"], + [5582, 0, "d"], + [5583, 0, " "], + [5584, 0, "l"], + [5585, 0, "i"], + [5586, 0, "s"], + [5587, 0, "t"], + [5588, 0, " "], + [5589, 0, "o"], + [5590, 0, "f"], + [5591, 0, " "], + [5592, 0, "i"], + [5593, 0, "n"], + [5594, 0, "d"], + [5595, 0, "i"], + [5596, 0, "v"], + [5582, 1], + [5581, 1], + [5580, 1], + [5579, 1], + [5578, 1], + [5577, 1], + [5576, 1], + [5575, 1], + [5574, 1], + [5588, 0, "i"], + [5589, 0, "d"], + [5590, 0, "u"], + [5591, 0, "a"], + [5592, 0, "l"], + [5593, 0, " "], + [5594, 0, "c"], + [5595, 0, "h"], + [5596, 0, "a"], + [5597, 0, "r"], + [5598, 0, "a"], + [5599, 0, "c"], + [5600, 0, "t"], + [5601, 0, "e"], + [5602, 0, "r"], + [5603, 0, "s"], + [5593, 1], + [5592, 1], + [5591, 1], + [5590, 1], + [5589, 1], + [5588, 1], + [5587, 1], + [5586, 1], + [5585, 1], + [5584, 1], + [5583, 1], + [5583, 0, "s"], + [5584, 0, "i"], + [5585, 0, "n"], + [5586, 0, "g"], + [5587, 0, "l"], + [5588, 0, "e"], + [5589, 0, "-"], + [5599, 1], + [5599, 0, " "], + [5600, 0, "s"], + [5601, 0, "t"], + [5602, 0, "r"], + [5603, 0, "i"], + [5604, 0, "n"], + [5605, 0, "g"], + [5606, 0, "s"], + [5607, 0, ";"], + [5608, 0, " "], + [5609, 0, "c"], + [5610, 0, "h"], + [5611, 0, "a"], + [5612, 0, "r"], + [5613, 0, "a"], + [5614, 0, "c"], + [5615, 0, "t"], + [5616, 0, "e"], + [5617, 0, "r"], + [5618, 0, "-"], + [5619, 0, "b"], + [5620, 0, "y"], + [5621, 0, "-"], + [5622, 0, "c"], + [5623, 0, "h"], + [5624, 0, "a"], + [5625, 0, "r"], + [5626, 0, "a"], + [5627, 0, "c"], + [5628, 0, "t"], + [5629, 0, "e"], + [5630, 0, "r"], + [5631, 0, " "], + [5632, 0, "e"], + [5633, 0, "d"], + [5634, 0, "i"], + [5635, 0, "t"], + [5636, 0, "s"], + [5637, 0, " "], + [5638, 0, "a"], + [5639, 0, "r"], + [5640, 0, "e"], + [5641, 0, " "], + [5642, 0, "t"], + [5643, 0, "h"], + [5644, 0, "e"], + [5645, 0, "n"], + [5646, 0, " "], + [5647, 0, "e"], + [5648, 0, "x"], + [5649, 0, "p"], + [5650, 0, "r"], + [5651, 0, "e"], + [5652, 0, "s"], + [5653, 0, "s"], + [5654, 0, "e"], + [5655, 0, "d"], + [5656, 0, " "], + [5657, 0, "a"], + [5658, 0, "s"], + [5659, 0, " "], + [5660, 0, "i"], + [5661, 0, "n"], + [5662, 0, "s"], + [5663, 0, "e"], + [5664, 0, "r"], + [5665, 0, "t"], + [5666, 0, "i"], + [5667, 0, "o"], + [5668, 0, "n"], + [5669, 0, "s"], + [5670, 0, " "], + [5671, 0, "a"], + [5672, 0, "n"], + [5673, 0, "d"], + [5674, 0, " "], + [5675, 0, "d"], + [5676, 0, "e"], + [5677, 0, "l"], + [5678, 0, "e"], + [5679, 0, "t"], + [5680, 0, "i"], + [5681, 0, "o"], + [5682, 0, "n"], + [5683, 0, "s"], + [5684, 0, " "], + [5685, 0, "o"], + [5686, 0, "f"], + [5687, 0, " "], + [5688, 0, "l"], + [5689, 0, "i"], + [5690, 0, "s"], + [5691, 0, "t"], + [5692, 0, " "], + [5693, 0, "e"], + [5694, 0, "l"], + [5695, 0, "e"], + [5696, 0, "m"], + [5697, 0, "e"], + [5698, 0, "n"], + [5699, 0, "t"], + [5700, 0, "s"], + [5701, 0, "."], + [5702, 1], + [5702, 0, " "], + [5751, 1], + [5750, 1], + [5749, 1], + [5748, 1], + [5747, 1], + [5746, 1], + [5745, 1], + [5744, 1], + [5743, 1], + [5742, 1], + [5741, 1], + [5741, 0, "f"], + [5742, 0, "u"], + [5743, 0, "r"], + [5744, 0, "t"], + [5745, 0, "h"], + [5746, 0, "e"], + [5747, 0, "r"], + [5798, 0, "\n"], + [5799, 0, "\n"], + [5800, 0, "\\"], + [5801, 0, "s"], + [5802, 0, "u"], + [5803, 0, "b"], + [5804, 0, "s"], + [5805, 0, "e"], + [5806, 0, "c"], + [5807, 0, "t"], + [5808, 0, "i"], + [5809, 0, "o"], + [5810, 0, "n"], + [5811, 0, "{"], + [5812, 0, "C"], + [5813, 0, "o"], + [5814, 0, "n"], + [5815, 0, "f"], + [5816, 0, "l"], + [5817, 0, "i"], + [5818, 0, "c"], + [5819, 0, "t"], + [5820, 0, " "], + [5821, 0, "r"], + [5822, 0, "e"], + [5823, 0, "s"], + [5824, 0, "o"], + [5825, 0, "l"], + [5826, 0, "u"], + [5827, 0, "t"], + [5828, 0, "i"], + [5829, 0, "o"], + [5830, 0, "n"], + [5831, 0, "}"], + [5830, 1], + [5829, 1], + [5828, 1], + [5827, 1], + [5826, 1], + [5825, 1], + [5824, 1], + [5823, 1], + [5822, 1], + [5821, 1], + [5820, 1], + [5819, 1], + [5818, 1], + [5817, 1], + [5816, 1], + [5815, 1], + [5814, 1], + [5813, 1], + [5812, 1], + [5812, 0, "R"], + [5813, 0, "e"], + [5814, 0, "p"], + [5815, 0, "l"], + [5816, 0, "i"], + [5817, 0, "c"], + [5818, 0, "a"], + [5819, 0, "t"], + [5820, 0, "i"], + [5821, 0, "o"], + [5822, 0, "n"], + [5823, 0, " "], + [5824, 0, "m"], + [5825, 0, "o"], + [5826, 0, "d"], + [5827, 0, "e"], + [5828, 0, "l"], + [5828, 1], + [5827, 1], + [5826, 1], + [5825, 1], + [5824, 1], + [5824, 0, "a"], + [5825, 0, "n"], + [5826, 0, "d"], + [5827, 0, " "], + [5828, 0, "c"], + [5829, 0, "o"], + [5830, 0, "n"], + [5831, 0, "f"], + [5832, 0, "l"], + [5833, 0, "i"], + [5834, 0, "c"], + [5835, 0, "t"], + [5836, 0, " "], + [5837, 0, "r"], + [5838, 0, "e"], + [5839, 0, "s"], + [5840, 0, "o"], + [5841, 0, "l"], + [5842, 0, "u"], + [5843, 0, "t"], + [5844, 0, "i"], + [5845, 0, "o"], + [5846, 0, "n"], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [12904, 1], + [6127, 0, "\n"], + [6128, 0, "\n"], + [6128, 0, "W"], + [6129, 0, "e"], + [6130, 0, " "], + [6131, 0, "c"], + [6132, 0, "o"], + [6133, 0, "n"], + [6134, 0, "s"], + [6135, 0, "i"], + [6136, 0, "d"], + [6137, 0, "e"], + [6138, 0, "r"], + [6139, 0, " "], + [6140, 0, "s"], + [6141, 0, "y"], + [6142, 0, "s"], + [6143, 0, "t"], + [6144, 0, "e"], + [6145, 0, "m"], + [6146, 0, "s"], + [6147, 0, " "], + [6148, 0, "i"], + [6149, 0, "n"], + [6150, 0, " "], + [6151, 0, "w"], + [6152, 0, "h"], + [6153, 0, "i"], + [6154, 0, "c"], + [6155, 0, "h"], + [6156, 0, " "], + [6157, 0, "a"], + [6158, 0, " "], + [6159, 0, "f"], + [6160, 0, "u"], + [6161, 0, "l"], + [6162, 0, "l"], + [6163, 0, " "], + [6164, 0, "c"], + [6165, 0, "o"], + [6166, 0, "p"], + [6167, 0, "y"], + [6168, 0, " "], + [6169, 0, "o"], + [6170, 0, "f"], + [6171, 0, " "], + [6172, 0, "t"], + [6173, 0, "h"], + [6174, 0, "e"], + [6175, 0, " "], + [6176, 0, "J"], + [6177, 0, "S"], + [6178, 0, "O"], + [6179, 0, "N"], + [6180, 0, " "], + [6181, 0, "d"], + [6182, 0, "o"], + [6183, 0, "c"], + [6184, 0, "u"], + [6185, 0, "m"], + [6186, 0, "e"], + [6187, 0, "n"], + [6188, 0, "t"], + [6189, 0, " "], + [6190, 0, "i"], + [6191, 0, "s"], + [6192, 0, " "], + [6193, 0, "r"], + [6194, 0, "e"], + [6195, 0, "p"], + [6196, 0, "l"], + [6197, 0, "i"], + [6198, 0, "c"], + [6199, 0, "a"], + [6200, 0, "t"], + [6201, 0, "e"], + [6202, 0, "d"], + [6203, 0, " "], + [6204, 0, "o"], + [6205, 0, "n"], + [6206, 0, " "], + [6207, 0, "s"], + [6208, 0, "e"], + [6209, 0, "v"], + [6210, 0, "e"], + [6211, 0, "r"], + [6212, 0, "a"], + [6213, 0, "l"], + [6214, 0, " "], + [6215, 0, "d"], + [6216, 0, "e"], + [6217, 0, "v"], + [6218, 0, "i"], + [6219, 0, "c"], + [6220, 0, "e"], + [6221, 0, "s"], + [6222, 0, "."], + [6223, 0, " "], + [6224, 0, "T"], + [6225, 0, "h"], + [6226, 0, "o"], + [6227, 0, "s"], + [6228, 0, "e"], + [6229, 0, " "], + [6230, 0, "d"], + [6231, 0, "e"], + [6232, 0, "v"], + [6233, 0, "i"], + [6234, 0, "c"], + [6235, 0, "e"], + [6236, 0, "s"], + [6237, 0, " "], + [6238, 0, "c"], + [6239, 0, "o"], + [6240, 0, "u"], + [6241, 0, "l"], + [6242, 0, "d"], + [6243, 0, " "], + [6244, 0, "b"], + [6245, 0, "e"], + [6246, 0, " "], + [6247, 0, "s"], + [6248, 0, "e"], + [6249, 0, "r"], + [6250, 0, "v"], + [6251, 0, "e"], + [6252, 0, "r"], + [6253, 0, "s"], + [6254, 0, " "], + [6255, 0, "i"], + [6256, 0, "n"], + [6257, 0, " "], + [6258, 0, "d"], + [6259, 0, "a"], + [6260, 0, "t"], + [6261, 0, "a"], + [6262, 0, "c"], + [6263, 0, "e"], + [6264, 0, "n"], + [6265, 0, "t"], + [6266, 0, "e"], + [6267, 0, "r"], + [6268, 0, "s"], + [6269, 0, ","], + [6270, 0, " "], + [6271, 0, "b"], + [6272, 0, "u"], + [6273, 0, "t"], + [6274, 0, " "], + [6275, 0, "w"], + [6276, 0, "e"], + [6277, 0, " "], + [6278, 0, "p"], + [6279, 0, "r"], + [6280, 0, "i"], + [6281, 0, "m"], + [6282, 0, "a"], + [6283, 0, "r"], + [6284, 0, "i"], + [6285, 0, "l"], + [6286, 0, "y"], + [6287, 0, " "], + [6287, 1], + [6286, 1], + [6285, 1], + [6284, 1], + [6283, 1], + [6282, 1], + [6281, 1], + [6280, 1], + [6279, 1], + [6278, 1], + [6278, 0, "c"], + [6279, 0, "o"], + [6279, 1], + [6278, 1], + [6278, 0, "p"], + [6278, 1], + [6278, 0, "f"], + [6279, 0, "o"], + [6280, 0, "c"], + [6281, 0, "u"], + [6282, 0, "s"], + [6283, 0, " "], + [6284, 0, "o"], + [6285, 0, "n"], + [6286, 0, " "], + [6287, 0, "m"], + [6288, 0, "o"], + [6289, 0, "b"], + [6290, 0, "i"], + [6291, 0, "l"], + [6292, 0, "e"], + [6293, 0, " "], + [6294, 0, "d"], + [6295, 0, "e"], + [6296, 0, "v"], + [6297, 0, "i"], + [6298, 0, "c"], + [6299, 0, "e"], + [6300, 0, "s"], + [6301, 0, " "], + [6302, 0, "s"], + [6303, 0, "u"], + [6304, 0, "c"], + [6305, 0, "h"], + [6306, 0, " "], + [6307, 0, "a"], + [6308, 0, "s"], + [6309, 0, " "], + [6310, 0, "s"], + [6311, 0, "m"], + [6312, 0, "a"], + [6313, 0, "r"], + [6314, 0, "t"], + [6315, 0, "p"], + [6316, 0, "h"], + [6317, 0, "o"], + [6318, 0, "n"], + [6319, 0, "e"], + [6320, 0, "s"], + [6321, 0, ","], + [6322, 0, " "], + [6323, 0, "t"], + [6324, 0, "a"], + [6325, 0, "b"], + [6326, 0, "l"], + [6327, 0, "e"], + [6327, 1], + [6326, 1], + [6325, 1], + [6324, 1], + [6323, 1], + [6322, 1], + [6321, 1], + [6321, 0, " "], + [6322, 0, "a"], + [6323, 0, "n"], + [6324, 0, "d"], + [6325, 0, " "], + [6326, 0, "l"], + [6327, 0, "a"], + [6328, 0, "p"], + [6329, 0, "t"], + [6330, 0, "o"], + [6331, 0, "p"], + [6332, 0, "s"], + [6333, 0, "."], + [6333, 0, ","], + [6334, 0, " "], + [6335, 0, "w"], + [6336, 0, "h"], + [6337, 0, "i"], + [6338, 0, "c"], + [6339, 0, "h"], + [6340, 0, " "], + [6341, 0, "h"], + [6342, 0, "a"], + [6343, 0, "v"], + [6344, 0, "e"], + [6345, 0, " "], + [6346, 0, "i"], + [6347, 0, "n"], + [6348, 0, "t"], + [6349, 0, "e"], + [6350, 0, "r"], + [6351, 0, "m"], + [6352, 0, "i"], + [6353, 0, "t"], + [6354, 0, "t"], + [6355, 0, "e"], + [6356, 0, "n"], + [6357, 0, "t"], + [6358, 0, " "], + [6359, 0, "n"], + [6360, 0, "e"], + [6361, 0, "t"], + [6362, 0, "w"], + [6363, 0, "o"], + [6364, 0, "r"], + [6365, 0, "k"], + [6366, 0, " "], + [6367, 0, "c"], + [6368, 0, "o"], + [6369, 0, "n"], + [6370, 0, "n"], + [6371, 0, "e"], + [6372, 0, "c"], + [6373, 0, "t"], + [6374, 0, "i"], + [6375, 0, "v"], + [6376, 0, "i"], + [6377, 0, "t"], + [6378, 0, "y"], + [6380, 0, " "], + [6381, 0, "O"], + [6382, 0, "u"], + [6383, 0, "r"], + [6384, 0, " "], + [6385, 0, "m"], + [6386, 0, "o"], + [6387, 0, "d"], + [6388, 0, "e"], + [6389, 0, "l"], + [6390, 0, " "], + [6391, 0, "a"], + [6392, 0, "l"], + [6393, 0, "l"], + [6394, 0, "o"], + [6395, 0, "w"], + [6396, 0, "s"], + [6397, 0, " "], + [6398, 0, "e"], + [6399, 0, "a"], + [6400, 0, "c"], + [6401, 0, "h"], + [6402, 0, " "], + [6403, 0, "r"], + [6404, 0, "e"], + [6405, 0, "p"], + [6405, 1], + [6404, 1], + [6403, 1], + [6403, 0, "d"], + [6404, 0, "e"], + [6405, 0, "v"], + [6406, 0, "i"], + [6407, 0, "c"], + [6408, 0, "e"], + [6409, 0, " "], + [6410, 0, "t"], + [6411, 0, "o"], + [6412, 0, " "], + [6413, 0, "m"], + [6414, 0, "o"], + [6415, 0, "d"], + [6416, 0, "i"], + [6417, 0, "f"], + [6418, 0, "y"], + [6419, 0, " "], + [6420, 0, "i"], + [6421, 0, "t"], + [6422, 0, "s"], + [6423, 0, " "], + [6424, 0, "l"], + [6425, 0, "o"], + [6426, 0, "c"], + [6427, 0, "a"], + [6428, 0, "l"], + [6429, 0, " "], + [6430, 0, "c"], + [6431, 0, "o"], + [6432, 0, "p"], + [6433, 0, "y"], + [6434, 0, " "], + [6434, 1], + [6433, 1], + [6432, 1], + [6431, 1], + [6430, 1], + [6430, 0, "r"], + [6431, 0, "e"], + [6432, 0, "p"], + [6433, 0, "l"], + [6434, 0, "i"], + [6435, 0, "c"], + [6436, 0, "a"], + [6437, 0, " "], + [6438, 0, "o"], + [6439, 0, "f"], + [6440, 0, " "], + [6441, 0, "t"], + [6442, 0, "h"], + [6443, 0, "e"], + [6444, 0, " "], + [6445, 0, "d"], + [6446, 0, "o"], + [6447, 0, "c"], + [6448, 0, "u"], + [6449, 0, "m"], + [6450, 0, "e"], + [6451, 0, "n"], + [6452, 0, "t"], + [6453, 0, ","], + [6454, 0, " "], + [6455, 0, "a"], + [6456, 0, "n"], + [6457, 0, "d"], + [6458, 0, " "], + [6459, 0, "t"], + [6460, 0, "o"], + [6461, 0, " "], + [6462, 0, "a"], + [6463, 0, "s"], + [6464, 0, "y"], + [6465, 0, "n"], + [6466, 0, "c"], + [6467, 0, "h"], + [6468, 0, "r"], + [6469, 0, "o"], + [6470, 0, "n"], + [6471, 0, "o"], + [6472, 0, "u"], + [6473, 0, "s"], + [6474, 0, "l"], + [6475, 0, "y"], + [6476, 0, " "], + [6477, 0, "p"], + [6478, 0, "r"], + [6479, 0, "o"], + [6480, 0, "p"], + [6481, 0, "a"], + [6482, 0, "g"], + [6483, 0, "a"], + [6484, 0, "t"], + [6485, 0, "e"], + [6486, 0, " "], + [6487, 0, "t"], + [6488, 0, "h"], + [6489, 0, "o"], + [6490, 0, "s"], + [6491, 0, "e"], + [6492, 0, " "], + [6493, 0, "e"], + [6494, 0, "d"], + [6495, 0, "i"], + [6496, 0, "t"], + [6497, 0, "s"], + [6498, 0, " "], + [6499, 0, "t"], + [6500, 0, "o"], + [6501, 0, " "], + [6502, 0, "o"], + [6503, 0, "t"], + [6504, 0, "h"], + [6505, 0, "e"], + [6506, 0, "r"], + [6507, 0, " "], + [6508, 0, "r"], + [6509, 0, "e"], + [6510, 0, "p"], + [6511, 0, "l"], + [6512, 0, "i"], + [6513, 0, "c"], + [6514, 0, "a"], + [6515, 0, "s"], + [6516, 0, "."], + [6517, 0, "\n"], + [6518, 0, "\n"], + [6519, 0, "W"], + [6520, 0, "e"], + [6521, 0, " "], + [6521, 1], + [6520, 1], + [6519, 1], + [6519, 0, "O"], + [6520, 0, "u"], + [6521, 0, "r"], + [6522, 0, " "], + [6523, 0, "o"], + [6524, 0, "n"], + [6525, 0, "l"], + [6526, 0, "y"], + [6527, 0, " "], + [6528, 0, "r"], + [6529, 0, "e"], + [6530, 0, "q"], + [6531, 0, "u"], + [6532, 0, "i"], + [6533, 0, "r"], + [6534, 0, "e"], + [6535, 0, "m"], + [6536, 0, "e"], + [6537, 0, "n"], + [6538, 0, "t"], + [6539, 0, " "], + [6540, 0, "o"], + [6541, 0, "f"], + [6542, 0, " "], + [6543, 0, "t"], + [6544, 0, "h"], + [6545, 0, "e"], + [6546, 0, " "], + [6547, 0, "n"], + [6548, 0, "e"], + [6549, 0, "t"], + [6550, 0, "w"], + [6551, 0, "o"], + [6552, 0, "r"], + [6553, 0, "k"], + [6554, 0, " "], + [6555, 0, "i"], + [6556, 0, "s"], + [6557, 0, " "], + [6558, 0, "t"], + [6559, 0, "h"], + [6560, 0, "e"], + [6561, 0, " "], + [6562, 0, "l"], + [6563, 0, "i"], + [6564, 0, "v"], + [6565, 0, "e"], + [6566, 0, "n"], + [6567, 0, "e"], + [6568, 0, "s"], + [6569, 0, "s"], + [6570, 0, " "], + [6571, 0, "c"], + [6572, 0, "o"], + [6573, 0, "n"], + [6574, 0, "d"], + [6575, 0, "i"], + [6576, 0, "t"], + [6577, 0, "i"], + [6578, 0, "o"], + [6579, 0, "n"], + [6580, 0, " "], + [6581, 0, "t"], + [6582, 0, "h"], + [6583, 0, "a"], + [6584, 0, "t"], + [6585, 0, " "], + [6586, 0, "m"], + [6587, 0, "e"], + [6588, 0, "s"], + [6589, 0, "s"], + [6590, 0, "a"], + [6591, 0, "g"], + [6592, 0, "e"], + [6593, 0, "s"], + [6594, 0, " "], + [6595, 0, "a"], + [6596, 0, "r"], + [6597, 0, "e"], + [6598, 0, " "], + [6599, 0, "e"], + [6600, 0, "v"], + [6601, 0, "e"], + [6602, 0, "n"], + [6603, 0, "t"], + [6604, 0, "u"], + [6605, 0, "a"], + [6606, 0, "l"], + [6607, 0, "l"], + [6608, 0, "y"], + [6609, 0, " "], + [6610, 0, "d"], + [6611, 0, "e"], + [6612, 0, "l"], + [6613, 0, "i"], + [6614, 0, "e"], + [6615, 0, "v"], + [6616, 0, "e"], + [6616, 1], + [6615, 1], + [6614, 1], + [6614, 0, "v"], + [6615, 0, "e"], + [6616, 0, "r"], + [6617, 0, "e"], + [6618, 0, "d"], + [6580, 1], + [6579, 1], + [6578, 1], + [6577, 1], + [6576, 1], + [6575, 1], + [6574, 1], + [6573, 1], + [6572, 1], + [6571, 1], + [6570, 1], + [6569, 1], + [6568, 1], + [6567, 1], + [6566, 1], + [6565, 1], + [6564, 1], + [6563, 1], + [6562, 1], + [6561, 1], + [6560, 1], + [6559, 1], + [6558, 1], + [6596, 0, ","], + [6597, 0, " "], + [6598, 0, "a"], + [6599, 0, " "], + [6600, 0, "l"], + [6601, 0, "i"], + [6602, 0, "v"], + [6603, 0, "e"], + [6604, 0, "n"], + [6605, 0, "e"], + [6606, 0, "s"], + [6607, 0, "s"], + [6608, 0, " "], + [6609, 0, "c"], + [6610, 0, "o"], + [6611, 0, "n"], + [6612, 0, "d"], + [6613, 0, "i"], + [6614, 0, "t"], + [6615, 0, "i"], + [6616, 0, "o"], + [6617, 0, "n"], + [6618, 0, "."], + [6619, 0, " "], + [6619, 1], + [6618, 1], + [6617, 1], + [6616, 1], + [6615, 1], + [6614, 1], + [6613, 1], + [6612, 1], + [6611, 1], + [6610, 1], + [6609, 1], + [6608, 1], + [6607, 1], + [6606, 1], + [6605, 1], + [6604, 1], + [6603, 1], + [6602, 1], + [6601, 1], + [6600, 1], + [6599, 1], + [6598, 1], + [6598, 0, "i"], + [6599, 0, "f"], + [6600, 0, " "], + [6601, 0, "n"], + [6602, 0, "e"], + [6603, 0, "c"], + [6604, 0, "e"], + [6605, 0, "s"], + [6606, 0, "s"], + [6607, 0, "a"], + [6608, 0, "r"], + [6609, 0, "y"], + [6610, 0, " "], + [6611, 0, "b"], + [6612, 0, "y"], + [6613, 0, " "], + [6614, 0, "r"], + [6615, 0, "e"], + [6616, 0, "t"], + [6617, 0, "r"], + [6618, 0, "y"], + [6619, 0, "i"], + [6620, 0, "n"], + [6621, 0, "g"], + [6622, 0, " "], + [6623, 0, "i"], + [6624, 0, "f"], + [6625, 0, " "], + [6626, 0, "n"], + [6627, 0, "e"], + [6628, 0, "c"], + [6629, 0, "e"], + [6630, 0, "s"], + [6631, 0, "s"], + [6632, 0, "a"], + [6633, 0, "r"], + [6634, 0, "y"], + [6635, 0, "."], + [6636, 0, "/"], + [6636, 1], + [6613, 1], + [6612, 1], + [6611, 1], + [6610, 1], + [6609, 1], + [6608, 1], + [6607, 1], + [6606, 1], + [6605, 1], + [6604, 1], + [6603, 1], + [6602, 1], + [6601, 1], + [6600, 1], + [6599, 1], + [6598, 1], + [6598, 0, "b"], + [6599, 0, "y"], + [6600, 0, " "], + [6621, 1], + [6620, 1], + [6619, 1], + [6618, 1], + [6617, 1], + [6616, 1], + [6615, 1], + [6614, 1], + [6613, 1], + [6613, 0, "d"], + [6614, 0, "e"], + [6615, 0, "l"], + [6616, 0, "i"], + [6617, 0, "v"], + [6618, 0, "e"], + [6619, 0, "r"], + [6620, 0, "y"], + [6621, 0, " "], + [6622, 0, "f"], + [6623, 0, "a"], + [6624, 0, "i"], + [6625, 0, "l"], + [6626, 0, "s"], + [6628, 0, " "], + [6629, 0, "W"], + [6630, 0, "e"], + [6631, 0, " "], + [6632, 0, "m"], + [6633, 0, "a"], + [6634, 0, "k"], + [6635, 0, "e"], + [6636, 0, " "], + [6637, 0, "n"], + [6638, 0, "o"], + [6639, 0, " "], + [6640, 0, "a"], + [6641, 0, "s"], + [6642, 0, "s"], + [6643, 0, "u"], + [6644, 0, "m"], + [6645, 0, "p"], + [6646, 0, "t"], + [6647, 0, "i"], + [6648, 0, "o"], + [6649, 0, "n"], + [6650, 0, "s"], + [6651, 0, " "], + [6652, 0, "a"], + [6653, 0, "b"], + [6654, 0, "o"], + [6655, 0, "u"], + [6655, 1], + [6654, 1], + [6653, 1], + [6652, 1], + [6651, 1], + [6650, 1], + [6649, 1], + [6648, 1], + [6647, 1], + [6646, 1], + [6645, 1], + [6644, 1], + [6643, 1], + [6642, 1], + [6641, 1], + [6640, 1], + [6639, 1], + [6638, 1], + [6637, 1], + [6636, 1], + [6635, 1], + [6634, 1], + [6633, 1], + [6632, 1], + [6631, 1], + [6630, 1], + [6629, 1], + [6629, 0, "T"], + [6630, 0, "h"], + [6631, 0, "e"], + [6632, 0, " "], + [6633, 0, "n"], + [6634, 0, "e"], + [6635, 0, "t"], + [6636, 0, "w"], + [6637, 0, "o"], + [6638, 0, "r"], + [6639, 0, "k"], + [6640, 0, " "], + [6641, 0, "i"], + [6642, 0, "s"], + [6643, 0, " "], + [6644, 0, "a"], + [6645, 0, "l"], + [6646, 0, "l"], + [6647, 0, "o"], + [6648, 0, "w"], + [6649, 0, "e"], + [6650, 0, "d"], + [6651, 0, " "], + [6652, 0, "t"], + [6653, 0, "o"], + [6654, 0, " "], + [6655, 0, "a"], + [6656, 0, "r"], + [6657, 0, "b"], + [6658, 0, "i"], + [6659, 0, "t"], + [6660, 0, "r"], + [6661, 0, "a"], + [6662, 0, "r"], + [6663, 0, "i"], + [6664, 0, "l"], + [6665, 0, "y"], + [6666, 0, " "], + [6667, 0, "r"], + [6668, 0, "e"], + [6669, 0, "-"], + [6670, 0, "o"], + [6671, 0, "r"], + [6671, 1], + [6670, 1], + [6669, 1], + [6669, 0, "o"], + [6670, 0, "r"], + [6671, 0, "d"], + [6672, 0, "e"], + [6673, 0, "r"], + [6674, 0, " "], + [6675, 0, "o"], + [6676, 0, "r"], + [6677, 0, " "], + [6678, 0, "d"], + [6679, 0, "u"], + [6680, 0, "p"], + [6681, 0, "l"], + [6682, 0, "i"], + [6683, 0, "c"], + [6684, 0, "a"], + [6685, 0, "t"], + [6686, 0, "e"], + [6687, 0, " "], + [6688, 0, "m"], + [6689, 0, "e"], + [6690, 0, "s"], + [6691, 0, "s"], + [6692, 0, "a"], + [6693, 0, "g"], + [6694, 0, "e"], + [6695, 0, "s"], + [6696, 0, "."], + [6697, 0, " "], + [6698, 0, "W"], + [6699, 0, "e"], + [6700, 0, " "], + [6700, 1], + [6699, 1], + [6698, 1], + [6698, 0, "O"], + [6699, 0, "u"], + [6700, 0, "r"], + [6701, 0, " "], + [6702, 0, "a"], + [6703, 0, "l"], + [6704, 0, "g"], + [6705, 0, "o"], + [6706, 0, "r"], + [6707, 0, "i"], + [6708, 0, "t"], + [6709, 0, "h"], + [6710, 0, "m"], + [6711, 0, " "], + [6712, 0, "p"], + [6713, 0, "e"], + [6714, 0, "r"], + [6715, 0, "f"], + [6716, 0, "o"], + [6717, 0, "r"], + [6718, 0, "m"], + [6719, 0, "s"], + [6720, 0, " "], + [6721, 0, "a"], + [6722, 0, "l"], + [6723, 0, "l"], + [6724, 0, " "], + [6725, 0, "w"], + [6726, 0, "o"], + [6727, 0, "r"], + [6728, 0, "k"], + [6729, 0, " "], + [6730, 0, "o"], + [6731, 0, "n"], + [6732, 0, " "], + [6733, 0, "t"], + [6734, 0, "h"], + [6735, 0, "e"], + [6736, 0, " "], + [6737, 0, "c"], + [6738, 0, "l"], + [6739, 0, "i"], + [6740, 0, "e"], + [6741, 0, "n"], + [6742, 0, "t"], + [6743, 0, "s"], + [6744, 0, " "], + [6745, 0, "a"], + [6746, 0, "n"], + [6747, 0, "d"], + [6748, 0, " "], + [6749, 0, "d"], + [6750, 0, "o"], + [6751, 0, "e"], + [6752, 0, "s"], + [6753, 0, " "], + [6754, 0, "n"], + [6755, 0, "o"], + [6756, 0, "t"], + [6757, 0, " "], + [6758, 0, "d"], + [6759, 0, "e"], + [6760, 0, "p"], + [6761, 0, "e"], + [6762, 0, "n"], + [6763, 0, "d"], + [6764, 0, " "], + [6765, 0, "o"], + [6766, 0, "n"], + [6767, 0, " "], + [6768, 0, "a"], + [6769, 0, "n"], + [6770, 0, "y"], + [6771, 0, " "], + [6772, 0, "s"], + [6773, 0, "e"], + [6774, 0, "r"], + [6775, 0, "v"], + [6776, 0, "e"], + [6777, 0, "r"], + [6778, 0, " "], + [6779, 0, "t"], + [6780, 0, "o"], + [6781, 0, " "], + [6782, 0, "t"], + [6783, 0, "r"], + [6784, 0, "a"], + [6785, 0, "n"], + [6786, 0, "s"], + [6787, 0, "f"], + [6788, 0, "o"], + [6789, 0, "r"], + [6790, 0, "m"], + [6791, 0, " "], + [6792, 0, "o"], + [6793, 0, "r"], + [6794, 0, " "], + [6795, 0, "p"], + [6796, 0, "r"], + [6797, 0, "o"], + [6798, 0, "c"], + [6799, 0, "e"], + [6800, 0, "s"], + [6801, 0, "s"], + [6802, 0, " "], + [6803, 0, "m"], + [6804, 0, "e"], + [6805, 0, "s"], + [6806, 0, "s"], + [6807, 0, "a"], + [6808, 0, "g"], + [6809, 0, "e"], + [6810, 0, "s"], + [6735, 1], + [6734, 1], + [6733, 1], + [6732, 1], + [6731, 1], + [6730, 1], + [6729, 1], + [6728, 1], + [6727, 1], + [6726, 1], + [6725, 1], + [6724, 1], + [6723, 1], + [6722, 1], + [6721, 1], + [6720, 1], + [6719, 1], + [6718, 1], + [6717, 1], + [6716, 1], + [6715, 1], + [6714, 1], + [6713, 1], + [6712, 1], + [6712, 0, "w"], + [6713, 0, "o"], + [6714, 0, "r"], + [6715, 0, "k"], + [6716, 0, "s"], + [6724, 0, "-"], + [6726, 0, "i"], + [6727, 0, "d"], + [6728, 0, "e"], + [6596, 0, " "], + [6597, 0, "t"], + [6598, 0, "o"], + [6599, 0, " "], + [6600, 0, "a"], + [6601, 0, "l"], + [6602, 0, "l"], + [6603, 0, " "], + [6604, 0, "r"], + [6605, 0, "e"], + [6606, 0, "p"], + [6607, 0, "l"], + [6608, 0, "i"], + [6609, 0, "c"], + [6610, 0, "a"], + [6611, 0, "s"], + [6571, 0, " "], + [6572, 0, "s"], + [6573, 0, "e"], + [6574, 0, "n"], + [6575, 0, "t"], + [6576, 0, " "], + [6577, 0, "b"], + [6578, 0, "y"], + [6579, 0, " "], + [6580, 0, "o"], + [6581, 0, "n"], + [6582, 0, "e"], + [6583, 0, " "], + [6584, 0, "r"], + [6585, 0, "e"], + [6586, 0, "p"], + [6587, 0, "l"], + [6588, 0, "i"], + [6589, 0, "c"], + [6590, 0, "a"], + [6623, 0, " "], + [6624, 0, "o"], + [6625, 0, "t"], + [6626, 0, "h"], + [6627, 0, "e"], + [6628, 0, "r"], + [6838, 0, ";"], + [6839, 0, " "], + [6840, 0, "t"], + [6841, 0, "h"], + [6842, 0, "i"], + [6843, 0, "s"], + [6844, 0, " "], + [6845, 0, "a"], + [6846, 0, "p"], + [6847, 0, "p"], + [6848, 0, "r"], + [6849, 0, "o"], + [6850, 0, "a"], + [6851, 0, "c"], + [6852, 0, "h"], + [6853, 0, " "], + [6854, 0, "a"], + [6855, 0, "l"], + [6856, 0, "l"], + [6857, 0, "o"], + [6858, 0, "w"], + [6859, 0, "s"], + [6860, 0, " "], + [6861, 0, "a"], + [6862, 0, " "], + [6863, 0, "p"], + [6864, 0, "e"], + [6865, 0, "e"], + [6866, 0, "r"], + [6867, 0, "-"], + [6868, 0, "t"], + [6869, 0, "o"], + [6870, 0, "-"], + [6871, 0, "p"], + [6872, 0, "e"], + [6873, 0, "e"], + [6874, 0, "r"], + [6875, 0, " "], + [6876, 0, "n"], + [6877, 0, "e"], + [6878, 0, "t"], + [6879, 0, "w"], + [6880, 0, "o"], + [6881, 0, "r"], + [6882, 0, "k"], + [6883, 0, " "], + [6884, 0, "a"], + [6885, 0, "n"], + [6886, 0, "d"], + [6887, 0, " "], + [6888, 0, "a"], + [6889, 0, " "], + [6890, 0, "s"], + [6891, 0, "e"], + [6892, 0, "c"], + [6893, 0, "u"], + [6894, 0, "r"], + [6895, 0, "e"], + [6896, 0, " "], + [6897, 0, "m"], + [6898, 0, "e"], + [6899, 0, "s"], + [6900, 0, "s"], + [6901, 0, "a"], + [6902, 0, "g"], + [6903, 0, "i"], + [6904, 0, "n"], + [6905, 0, "g"], + [6906, 0, " "], + [6907, 0, "p"], + [6908, 0, "r"], + [6909, 0, "o"], + [6910, 0, "t"], + [6911, 0, "o"], + [6912, 0, "c"], + [6913, 0, "o"], + [6914, 0, "l"], + [6915, 0, " "], + [6915, 1], + [6915, 0, "~"], + [6916, 0, "\\"], + [6917, 0, "c"], + [6918, 0, "i"], + [6919, 0, "t"], + [6920, 0, "e"], + [6921, 0, "{"], + [6922, 0, "U"], + [6923, 0, "n"], + [6924, 0, "g"], + [6925, 0, "e"], + [6926, 0, "r"], + [6927, 0, ":"], + [6928, 0, "2"], + [6929, 0, "0"], + [6930, 0, "1"], + [6931, 0, "5"], + [6932, 0, "k"], + [6933, 0, "g"], + [6934, 0, "}"], + [6935, 0, " "], + [6936, 0, "t"], + [6937, 0, "o"], + [6938, 0, " "], + [6939, 0, "b"], + [6940, 0, "e"], + [6941, 0, " "], + [6942, 0, "u"], + [6943, 0, "s"], + [6944, 0, "e"], + [6945, 0, "d"], + [6946, 0, "."], + [6840, 1], + [6839, 1], + [6838, 1], + [6837, 1], + [6837, 0, "s"], + [6838, 0, "."], + [6839, 0, " "], + [6840, 0, "T"], + [6946, 0, ","], + [6947, 0, " "], + [6948, 0, "a"], + [6949, 0, "l"], + [6950, 0, "t"], + [6951, 0, "h"], + [6952, 0, "o"], + [6953, 0, "u"], + [6954, 0, "g"], + [6955, 0, "h"], + [6956, 0, " "], + [6957, 0, "t"], + [6958, 0, "h"], + [6959, 0, "e"], + [6960, 0, " "], + [6961, 0, "d"], + [6962, 0, "e"], + [6963, 0, "t"], + [6964, 0, "a"], + [6965, 0, "i"], + [6966, 0, "l"], + [6967, 0, "s"], + [6968, 0, " "], + [6969, 0, "o"], + [6970, 0, "f"], + [6971, 0, " "], + [6972, 0, "t"], + [6973, 0, "h"], + [6974, 0, "e"], + [6975, 0, " "], + [6976, 0, "n"], + [6977, 0, "e"], + [6978, 0, "t"], + [6979, 0, "w"], + [6980, 0, "o"], + [6981, 0, "r"], + [6982, 0, "k"], + [6983, 0, " "], + [6984, 0, "i"], + [6985, 0, "m"], + [6986, 0, "p"], + [6987, 0, "l"], + [6988, 0, "e"], + [6989, 0, "m"], + [6990, 0, "e"], + [6991, 0, "n"], + [6992, 0, "t"], + [6993, 0, "a"], + [6994, 0, "t"], + [6995, 0, "i"], + [6996, 0, "o"], + [6997, 0, "n"], + [6998, 0, " "], + [6999, 0, "a"], + [7000, 0, "n"], + [7001, 0, "d"], + [7002, 0, " "], + [7003, 0, "a"], + [7004, 0, "n"], + [7005, 0, "y"], + [7006, 0, " "], + [7007, 0, "c"], + [7008, 0, "r"], + [7009, 0, "y"], + [7010, 0, "p"], + [7011, 0, "t"], + [7012, 0, "o"], + [7013, 0, "g"], + [7014, 0, "r"], + [7015, 0, "a"], + [7016, 0, "p"], + [7017, 0, "h"], + [7018, 0, "i"], + [7019, 0, "c"], + [7020, 0, " "], + [7021, 0, "p"], + [7022, 0, "r"], + [7023, 0, "o"], + [7024, 0, "t"], + [7025, 0, "o"], + [7026, 0, "c"], + [7027, 0, "o"], + [7028, 0, "l"], + [7029, 0, "s"], + [7030, 0, " "], + [7031, 0, "a"], + [7032, 0, "r"], + [7033, 0, "e"], + [7034, 0, " "], + [7035, 0, "o"], + [7036, 0, "u"], + [7037, 0, "t"], + [7038, 0, "s"], + [7039, 0, "i"], + [7040, 0, "d"], + [7041, 0, "e"], + [7042, 0, " "], + [7043, 0, "o"], + [7044, 0, "f"], + [7045, 0, " "], + [7046, 0, "t"], + [7047, 0, "h"], + [7048, 0, "e"], + [7049, 0, " "], + [7050, 0, "s"], + [7051, 0, "c"], + [7052, 0, "o"], + [7053, 0, "p"], + [7054, 0, "e"], + [7055, 0, " "], + [7056, 0, "o"], + [7057, 0, "f"], + [7058, 0, " "], + [7059, 0, "t"], + [7060, 0, "h"], + [7061, 0, "i"], + [7062, 0, "s"], + [7063, 0, " "], + [7064, 0, "p"], + [7065, 0, "a"], + [7066, 0, "p"], + [7067, 0, "e"], + [7068, 0, "r"], + [6915, 0, " "], + [6916, 0, "w"], + [6917, 0, "i"], + [6918, 0, "t"], + [6919, 0, "h"], + [6920, 0, " "], + [6921, 0, "e"], + [6922, 0, "n"], + [6923, 0, "d"], + [6924, 0, "-"], + [6925, 0, "t"], + [6926, 0, "o"], + [6927, 0, "-"], + [6928, 0, "e"], + [6929, 0, "n"], + [6930, 0, "d"], + [6931, 0, " "], + [6932, 0, "e"], + [6933, 0, "n"], + [6934, 0, "c"], + [6935, 0, "r"], + [6936, 0, "y"], + [6937, 0, "p"], + [6938, 0, "t"], + [6939, 0, "i"], + [6940, 0, "o"], + [6941, 0, "n"], + [7099, 0, " "], + [7099, 0, "W"], + [7100, 0, "h"], + [7101, 0, "e"], + [7102, 0, "n"], + [7103, 0, " "], + [7104, 0, "t"], + [7105, 0, "h"], + [7106, 0, "e"], + [7107, 0, " "], + [7108, 0, "J"], + [7109, 0, "S"], + [7110, 0, "O"], + [7111, 0, "N"], + [7112, 0, " "], + [7113, 0, "d"], + [7114, 0, "o"], + [7115, 0, "c"], + [7116, 0, "u"], + [7117, 0, "m"], + [7118, 0, "e"], + [7119, 0, "n"], + [7120, 0, "t"], + [7121, 0, " "], + [7122, 0, "i"], + [7123, 0, "s"], + [7124, 0, " "], + [7125, 0, "c"], + [7126, 0, "o"], + [7127, 0, "n"], + [7128, 0, "c"], + [7129, 0, "u"], + [7130, 0, "r"], + [7131, 0, "r"], + [7132, 0, "e"], + [7133, 0, "n"], + [7134, 0, "t"], + [7135, 0, "l"], + [7136, 0, "y"], + [7137, 0, " "], + [7138, 0, "m"], + [7139, 0, "o"], + [7140, 0, "d"], + [7141, 0, "i"], + [7142, 0, "f"], + [7143, 0, "i"], + [7144, 0, "e"], + [7145, 0, "d"], + [7146, 0, " "], + [7147, 0, "o"], + [7148, 0, "n"], + [7149, 0, " "], + [7150, 0, "d"], + [7151, 0, "i"], + [7152, 0, "f"], + [7153, 0, "f"], + [7154, 0, "e"], + [7155, 0, "r"], + [7156, 0, "e"], + [7157, 0, "n"], + [7158, 0, "t"], + [7159, 0, " "], + [7160, 0, "d"], + [7161, 0, "e"], + [7162, 0, "v"], + [7163, 0, "i"], + [7164, 0, "c"], + [7165, 0, "e"], + [7166, 0, "s"], + [7167, 0, ","], + [7168, 0, " "], + [7169, 0, "w"], + [7170, 0, "e"], + [7171, 0, " "], + [28766, 0, "\\"], + [28767, 0, "l"], + [28768, 0, "a"], + [28769, 0, "b"], + [28770, 0, "e"], + [28771, 0, "l"], + [28772, 0, "{"], + [28773, 0, "s"], + [28774, 0, "e"], + [28775, 0, "c"], + [28776, 0, ":"], + [28777, 0, "s"], + [28778, 0, "e"], + [28779, 0, "m"], + [28780, 0, "a"], + [28781, 0, "n"], + [28782, 0, "t"], + [28783, 0, "i"], + [28784, 0, "c"], + [28785, 0, "s"], + [28786, 0, "}"], + [7099, 0, " "], + [7099, 0, "I"], + [7100, 0, "n"], + [7101, 0, " "], + [7102, 0, "s"], + [7103, 0, "e"], + [7104, 0, "c"], + [7105, 0, "t"], + [7106, 0, "i"], + [7107, 0, "o"], + [7108, 0, "n"], + [7109, 0, "~"], + [7110, 0, "\\"], + [7111, 0, "r"], + [7112, 0, "e"], + [7113, 0, "f"], + [7114, 0, "{"], + [7115, 0, "s"], + [7116, 0, "e"], + [7117, 0, "c"], + [7118, 0, ":"], + [7119, 0, "s"], + [7120, 0, "e"], + [7121, 0, "m"], + [7122, 0, "a"], + [7123, 0, "n"], + [7124, 0, "t"], + [7125, 0, "i"], + [7126, 0, "c"], + [7127, 0, "s"], + [7128, 0, "}"], + [7129, 0, " "], + [7130, 0, "w"], + [7131, 0, "e"], + [7132, 0, " "], + [7133, 0, "p"], + [7134, 0, "r"], + [7135, 0, "o"], + [7135, 1], + [7134, 1], + [7133, 1], + [7133, 0, "g"], + [7134, 0, "i"], + [7135, 0, "v"], + [7136, 0, "e"], + [7137, 0, " "], + [7138, 0, "f"], + [7139, 0, "o"], + [7140, 0, "r"], + [7141, 0, "m"], + [7142, 0, "a"], + [7143, 0, "l"], + [7144, 0, " "], + [7145, 0, "s"], + [7146, 0, "e"], + [7147, 0, "m"], + [7148, 0, "a"], + [7149, 0, "n"], + [7150, 0, "t"], + [7151, 0, "i"], + [7152, 0, "c"], + [7153, 0, "s"], + [7154, 0, " "], + [7155, 0, "t"], + [7156, 0, "h"], + [7157, 0, "a"], + [7158, 0, "t"], + [7159, 0, " "], + [7160, 0, "d"], + [7161, 0, "e"], + [7162, 0, "s"], + [7163, 0, "c"], + [7164, 0, "r"], + [7165, 0, "i"], + [7166, 0, "b"], + [7167, 0, "e"], + [7168, 0, "s"], + [7169, 0, " "], + [7170, 0, "h"], + [7171, 0, "o"], + [7172, 0, "w"], + [7173, 0, " "], + [7174, 0, "c"], + [7175, 0, "o"], + [7176, 0, "n"], + [7177, 0, "f"], + [7178, 0, "l"], + [7179, 0, "i"], + [7180, 0, "c"], + [7181, 0, "t"], + [7182, 0, "s"], + [7183, 0, " "], + [7184, 0, "a"], + [7185, 0, "r"], + [7186, 0, "e"], + [7187, 0, " "], + [7188, 0, "r"], + [7189, 0, "e"], + [7190, 0, "s"], + [7191, 0, "o"], + [7192, 0, "l"], + [7193, 0, "v"], + [7194, 0, "e"], + [7195, 0, "d"], + [7197, 1], + [7197, 0, "w"], + [7202, 1], + [7202, 1], + [7202, 1], + [7202, 0, "a"], + [7267, 1], + [7266, 1], + [7265, 1], + [7264, 1], + [7263, 1], + [7263, 0, "."], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 1], + [7509, 0, "\\"], + [7510, 0, "s"], + [7511, 0, "u"], + [7512, 0, "b"], + [7513, 0, "s"], + [7514, 0, "e"], + [7515, 0, "c"], + [7516, 0, "t"], + [7517, 0, "i"], + [7518, 0, "o"], + [7519, 0, "n"], + [7520, 0, "{"], + [7521, 0, "O"], + [7522, 0, "u"], + [7523, 0, "r"], + [7524, 0, " "], + [7525, 0, "c"], + [7526, 0, "o"], + [7527, 0, "n"], + [7528, 0, "t"], + [7529, 0, "r"], + [7530, 0, "i"], + [7531, 0, "b"], + [7532, 0, "u"], + [7533, 0, "t"], + [7534, 0, "i"], + [7535, 0, "o"], + [7536, 0, "n"], + [7537, 0, "s"], + [7538, 0, "}"], + [7564, 0, "\\"], + [7565, 0, "a"], + [7566, 0, "b"], + [7567, 0, "l"], + [7568, 0, "e"], + [7568, 1], + [7567, 1], + [7566, 1], + [7565, 1], + [7565, 0, "l"], + [7566, 0, "a"], + [7567, 0, "b"], + [7568, 0, "e"], + [7569, 0, "l"], + [7570, 0, "{"], + [7571, 0, "s"], + [7572, 0, "e"], + [7573, 0, "c"], + [7574, 0, ":"], + [7575, 0, "r"], + [7576, 0, "e"], + [7577, 0, "l"], + [7578, 0, "a"], + [7579, 0, "t"], + [7580, 0, "e"], + [7581, 0, "d"], + [7582, 0, "}"], + [7540, 0, "\n"], + [7541, 0, "O"], + [7542, 0, "u"], + [7543, 0, "r"], + [7544, 0, " "], + [7545, 0, "m"], + [7546, 0, "a"], + [7547, 0, "i"], + [7548, 0, "n"], + [7549, 0, " "], + [7550, 0, "c"], + [7551, 0, "o"], + [7552, 0, "n"], + [7553, 0, "t"], + [7554, 0, "r"], + [7555, 0, "i"], + [7556, 0, "b"], + [7557, 0, "u"], + [7558, 0, "t"], + [7559, 0, "i"], + [7560, 0, "o"], + [7561, 0, "n"], + [7562, 0, " "], + [7563, 0, "i"], + [7564, 0, "n"], + [7565, 0, " "], + [7566, 0, "t"], + [7567, 0, "h"], + [7568, 0, "i"], + [7569, 0, "s"], + [7570, 0, " "], + [7571, 0, "w"], + [7572, 0, "o"], + [7573, 0, "r"], + [7574, 0, "k"], + [7575, 0, " "], + [7576, 0, "i"], + [7577, 0, "s"], + [7578, 0, " "], + [7579, 0, "t"], + [7580, 0, "o"], + [7581, 0, " "], + [7582, 0, "d"], + [7583, 0, "e"], + [7584, 0, "f"], + [7585, 0, "i"], + [7586, 0, "n"], + [7587, 0, "e"], + [7588, 0, " "], + [7589, 0, "a"], + [7590, 0, "n"], + [7591, 0, " "], + [7592, 0, "a"], + [7593, 0, "l"], + [7594, 0, "g"], + [7595, 0, "o"], + [7596, 0, "r"], + [7597, 0, "i"], + [7598, 0, "t"], + [7599, 0, "h"], + [7600, 0, "m"], + [7601, 0, " "], + [7602, 0, "a"], + [7603, 0, "n"], + [7604, 0, "d"], + [7605, 0, " "], + [7606, 0, "f"], + [7607, 0, "o"], + [7607, 1], + [7607, 0, "o"], + [7608, 0, "r"], + [7609, 0, "m"], + [7610, 0, "a"], + [7611, 0, "l"], + [7612, 0, " "], + [7613, 0, "s"], + [7614, 0, "e"], + [7615, 0, "m"], + [7616, 0, "a"], + [7617, 0, "n"], + [7618, 0, "t"], + [7619, 0, "i"], + [7620, 0, "c"], + [7621, 0, "s"], + [7622, 0, " "], + [7623, 0, "f"], + [7624, 0, "o"], + [7625, 0, "r"], + [7626, 0, " "], + [7627, 0, "c"], + [7628, 0, "o"], + [7629, 0, "l"], + [7630, 0, "l"], + [7631, 0, "a"], + [7632, 0, "b"], + [7633, 0, "o"], + [7634, 0, "r"], + [7635, 0, "a"], + [7636, 0, "t"], + [7637, 0, "i"], + [7638, 0, "v"], + [7639, 0, "e"], + [7640, 0, ","], + [7641, 0, " "], + [7642, 0, "c"], + [7643, 0, "o"], + [7644, 0, "n"], + [7645, 0, "c"], + [7646, 0, "u"], + [7647, 0, "r"], + [7648, 0, "r"], + [7649, 0, "e"], + [7650, 0, "n"], + [7651, 0, "t"], + [7652, 0, " "], + [7653, 0, "e"], + [7654, 0, "d"], + [7655, 0, "i"], + [7656, 0, "t"], + [7657, 0, "i"], + [7658, 0, "n"], + [7659, 0, "g"], + [7660, 0, " "], + [7661, 0, "o"], + [7662, 0, "f"], + [7663, 0, " "], + [7664, 0, "J"], + [7665, 0, "S"], + [7666, 0, "O"], + [7667, 0, "N"], + [7668, 0, " "], + [7669, 0, "d"], + [7670, 0, "a"], + [7671, 0, "t"], + [7672, 0, "a"], + [7673, 0, " "], + [7674, 0, "s"], + [7675, 0, "t"], + [7676, 0, "r"], + [7677, 0, "u"], + [7678, 0, "c"], + [7679, 0, "t"], + [7680, 0, "u"], + [7681, 0, "r"], + [7682, 0, "e"], + [7683, 0, "s"], + [7684, 0, " "], + [7685, 0, "w"], + [7686, 0, "i"], + [7687, 0, "t"], + [7688, 0, "h"], + [7689, 0, " "], + [7690, 0, "a"], + [7691, 0, "u"], + [7692, 0, "t"], + [7693, 0, "o"], + [7694, 0, "m"], + [7695, 0, "a"], + [7696, 0, "t"], + [7697, 0, "i"], + [7698, 0, "c"], + [7699, 0, " "], + [7700, 0, "c"], + [7701, 0, "o"], + [7702, 0, "n"], + [7703, 0, "f"], + [7704, 0, "l"], + [7705, 0, "i"], + [7706, 0, "c"], + [7707, 0, "t"], + [7708, 0, " "], + [7709, 0, "r"], + [7710, 0, "e"], + [7711, 0, "s"], + [7712, 0, "o"], + [7713, 0, "l"], + [7714, 0, "u"], + [7715, 0, "t"], + [7716, 0, "i"], + [7717, 0, "o"], + [7718, 0, "n"], + [7719, 0, "."], + [7720, 0, " "], + [7721, 0, "A"], + [7722, 0, "l"], + [7723, 0, "t"], + [7724, 0, "h"], + [7725, 0, "o"], + [7726, 0, "u"], + [7727, 0, "g"], + [7728, 0, "h"], + [7729, 0, " "], + [7730, 0, "s"], + [7731, 0, "i"], + [7732, 0, "m"], + [7733, 0, "i"], + [7734, 0, "l"], + [7735, 0, "a"], + [7736, 0, "r"], + [7737, 0, " "], + [7738, 0, "a"], + [7739, 0, "l"], + [7740, 0, "g"], + [7741, 0, "o"], + [7742, 0, "r"], + [7743, 0, "i"], + [7744, 0, "t"], + [7745, 0, "h"], + [7746, 0, "m"], + [7747, 0, "s"], + [7748, 0, " "], + [7749, 0, "h"], + [7750, 0, "a"], + [7751, 0, "v"], + [7752, 0, "e"], + [7753, 0, " "], + [7754, 0, "p"], + [7755, 0, "r"], + [7756, 0, "e"], + [7757, 0, "v"], + [7758, 0, "i"], + [7759, 0, "o"], + [7760, 0, "u"], + [7761, 0, "s"], + [7762, 0, "l"], + [7763, 0, "y"], + [7764, 0, " "], + [7765, 0, "b"], + [7766, 0, "e"], + [7767, 0, "e"], + [7768, 0, "n"], + [7769, 0, " "], + [7770, 0, "d"], + [7771, 0, "e"], + [7772, 0, "f"], + [7773, 0, "i"], + [7774, 0, "n"], + [7775, 0, "e"], + [7776, 0, "d"], + [7777, 0, " "], + [7778, 0, "f"], + [7779, 0, "o"], + [7780, 0, "r"], + [7781, 0, " "], + [7782, 0, "l"], + [7783, 0, "i"], + [7784, 0, "s"], + [7785, 0, "t"], + [7786, 0, "s"], + [7787, 0, ","], + [7788, 0, " "], + [7789, 0, "m"], + [7790, 0, "a"], + [7791, 0, "p"], + [7792, 0, "s"], + [7793, 0, " "], + [7794, 0, "a"], + [7795, 0, "n"], + [7796, 0, "d"], + [7797, 0, " "], + [7798, 0, "r"], + [7799, 0, "e"], + [7800, 0, "g"], + [7801, 0, "i"], + [7802, 0, "s"], + [7803, 0, "t"], + [7804, 0, "e"], + [7805, 0, "r"], + [7806, 0, "s"], + [7807, 0, " "], + [7808, 0, "i"], + [7809, 0, "n"], + [7810, 0, "d"], + [7811, 0, "i"], + [7812, 0, "v"], + [7813, 0, "i"], + [7814, 0, "d"], + [7815, 0, "u"], + [7816, 0, "a"], + [7817, 0, "l"], + [7818, 0, "l"], + [7819, 0, "y"], + [7820, 0, ","], + [7821, 0, " "], + [7822, 0, "t"], + [7823, 0, "o"], + [7824, 0, " "], + [7825, 0, "o"], + [7826, 0, "u"], + [7827, 0, "r"], + [7828, 0, " "], + [7829, 0, "k"], + [7830, 0, "n"], + [7831, 0, "o"], + [7832, 0, "w"], + [7833, 0, "l"], + [7834, 0, "e"], + [7835, 0, "d"], + [7836, 0, "g"], + [7837, 0, "e"], + [7838, 0, " "], + [7839, 0, "t"], + [7840, 0, "h"], + [7841, 0, "i"], + [7842, 0, "s"], + [7843, 0, " "], + [7844, 0, "p"], + [7845, 0, "a"], + [7846, 0, "p"], + [7847, 0, "e"], + [7848, 0, "r"], + [7849, 0, " "], + [7850, 0, "i"], + [7851, 0, "s"], + [7852, 0, " "], + [7853, 0, "t"], + [7854, 0, "h"], + [7855, 0, "e"], + [7856, 0, " "], + [7857, 0, "f"], + [7858, 0, "i"], + [7859, 0, "r"], + [7860, 0, "s"], + [7861, 0, "t"], + [7862, 0, " "], + [7863, 0, "t"], + [7864, 0, "o"], + [7865, 0, " "], + [7866, 0, "i"], + [7867, 0, "n"], + [7868, 0, "t"], + [7869, 0, "e"], + [7870, 0, "g"], + [7871, 0, "r"], + [7872, 0, "a"], + [7873, 0, "t"], + [7874, 0, "e"], + [7875, 0, " "], + [7876, 0, "a"], + [7877, 0, "l"], + [7878, 0, "l"], + [7879, 0, " "], + [7880, 0, "o"], + [7881, 0, "f"], + [7882, 0, " "], + [7883, 0, "t"], + [7884, 0, "h"], + [7885, 0, "e"], + [7886, 0, "s"], + [7887, 0, "e"], + [7888, 0, " "], + [7889, 0, "s"], + [7890, 0, "t"], + [7891, 0, "r"], + [7892, 0, "u"], + [7893, 0, "c"], + [7894, 0, "t"], + [7895, 0, "u"], + [7896, 0, "r"], + [7897, 0, "e"], + [7898, 0, "s"], + [7899, 0, " "], + [7900, 0, "i"], + [7901, 0, "n"], + [7902, 0, "t"], + [7903, 0, "o"], + [7904, 0, " "], + [7905, 0, "a"], + [7906, 0, "n"], + [7907, 0, " "], + [7908, 0, "a"], + [7909, 0, "r"], + [7910, 0, "b"], + [7911, 0, "i"], + [7912, 0, "t"], + [7913, 0, "r"], + [7914, 0, "a"], + [7915, 0, "r"], + [7916, 0, "i"], + [7917, 0, "l"], + [7918, 0, "y"], + [7919, 0, " "], + [7920, 0, "c"], + [7921, 0, "o"], + [7922, 0, "m"], + [7923, 0, "p"], + [7924, 0, "o"], + [7925, 0, "s"], + [7926, 0, "a"], + [7927, 0, "b"], + [7928, 0, "l"], + [7929, 0, "e"], + [7930, 0, " "], + [7931, 0, "d"], + [7932, 0, "a"], + [7933, 0, "t"], + [7934, 0, "a"], + [7935, 0, "t"], + [7936, 0, "y"], + [7937, 0, "p"], + [7938, 0, "e"], + [7939, 0, "."], + [7820, 0, " "], + [7821, 0, "("], + [7822, 0, "s"], + [7823, 0, "e"], + [7824, 0, "e"], + [7825, 0, " "], + [7826, 0, "s"], + [7827, 0, "e"], + [7828, 0, "c"], + [7829, 0, "t"], + [7830, 0, "i"], + [7831, 0, "o"], + [7832, 0, "n"], + [7833, 0, "~"], + [7834, 0, "\\"], + [7835, 0, "r"], + [7836, 0, "e"], + [7837, 0, "f"], + [7838, 0, "{"], + [7839, 0, "s"], + [7840, 0, "e"], + [7841, 0, "c"], + [7842, 0, ":"], + [7843, 0, "r"], + [7844, 0, "e"], + [7845, 0, "l"], + [7846, 0, "a"], + [7847, 0, "t"], + [7848, 0, "e"], + [7849, 0, "d"], + [7850, 0, "}"], + [7851, 0, ")"], + [7972, 0, "\n"], + [7973, 0, "\n"], + [7974, 0, "C"], + [7975, 0, "o"], + [7976, 0, "m"], + [7977, 0, "p"], + [7978, 0, "o"], + [7979, 0, "s"], + [7980, 0, "i"], + [7981, 0, "n"], + [7982, 0, "g"], + [7983, 0, " "], + [7984, 0, "m"], + [7985, 0, "a"], + [7986, 0, "p"], + [7987, 0, "s"], + [7988, 0, " "], + [7989, 0, "a"], + [7990, 0, "n"], + [7991, 0, "d"], + [7992, 0, " "], + [7993, 0, "l"], + [7994, 0, "i"], + [7995, 0, "s"], + [7996, 0, "t"], + [7997, 0, "s"], + [7998, 0, " "], + [7999, 0, "i"], + [8000, 0, "n"], + [8001, 0, "t"], + [8002, 0, "o"], + [8003, 0, " "], + [8004, 0, "a"], + [8005, 0, "r"], + [8006, 0, "b"], + [8007, 0, "i"], + [8008, 0, "t"], + [8009, 0, "r"], + [8010, 0, "a"], + [8011, 0, "r"], + [8012, 0, "i"], + [8013, 0, "l"], + [8014, 0, "y"], + [8015, 0, " "], + [8016, 0, "n"], + [8017, 0, "e"], + [8018, 0, "s"], + [8019, 0, "t"], + [8020, 0, "e"], + [8021, 0, "d"], + [8022, 0, " "], + [8023, 0, "s"], + [8024, 0, "t"], + [8025, 0, "r"], + [8026, 0, "u"], + [8027, 0, "c"], + [8028, 0, "t"], + [8029, 0, "u"], + [8030, 0, "r"], + [8031, 0, "e"], + [8032, 0, "s"], + [8033, 0, " "], + [8034, 0, "o"], + [8035, 0, "p"], + [8036, 0, "e"], + [8037, 0, "n"], + [8038, 0, "s"], + [8039, 0, " "], + [8040, 0, "u"], + [8041, 0, "p"], + [8042, 0, " "], + [8043, 0, "s"], + [8044, 0, "u"], + [8045, 0, "b"], + [8046, 0, "t"], + [8047, 0, "l"], + [8048, 0, "e"], + [8049, 0, " "], + [8050, 0, "c"], + [8051, 0, "h"], + [8052, 0, "a"], + [8053, 0, "l"], + [8054, 0, "l"], + [8055, 0, "e"], + [8056, 0, "n"], + [8057, 0, "g"], + [8058, 0, "e"], + [8059, 0, "s"], + [8060, 0, " "], + [8061, 0, "t"], + [8062, 0, "h"], + [8063, 0, "a"], + [8064, 0, "t"], + [8065, 0, " "], + [8066, 0, "d"], + [8067, 0, "o"], + [8068, 0, " "], + [8069, 0, "n"], + [8070, 0, "o"], + [8071, 0, "t"], + [8072, 0, " "], + [8073, 0, "a"], + [8074, 0, "r"], + [8075, 0, "i"], + [8076, 0, "s"], + [8077, 0, "e"], + [8078, 0, " "], + [8079, 0, "i"], + [8080, 0, "n"], + [8081, 0, " "], + [8082, 0, "f"], + [8083, 0, "l"], + [8084, 0, "a"], + [8085, 0, "t"], + [8086, 0, " "], + [8087, 0, "s"], + [8088, 0, "t"], + [8089, 0, "r"], + [8090, 0, "u"], + [8091, 0, "c"], + [8092, 0, "t"], + [8093, 0, "u"], + [8094, 0, "r"], + [8095, 0, "e"], + [8096, 0, "s"], + [8097, 0, ","], + [8098, 0, " "], + [8099, 0, "d"], + [8100, 0, "u"], + [8101, 0, "e"], + [8102, 0, " "], + [8103, 0, "t"], + [8104, 0, "o"], + [8105, 0, " "], + [8106, 0, "t"], + [8107, 0, "h"], + [8108, 0, "e"], + [8109, 0, " "], + [8110, 0, "p"], + [8111, 0, "o"], + [8112, 0, "s"], + [8113, 0, "s"], + [8114, 0, "i"], + [8115, 0, "b"], + [8116, 0, "i"], + [8117, 0, "l"], + [8118, 0, "i"], + [8119, 0, "t"], + [8120, 0, "y"], + [8121, 0, " "], + [8122, 0, "o"], + [8123, 0, "f"], + [8124, 0, " "], + [8125, 0, "e"], + [8126, 0, "d"], + [8127, 0, "i"], + [8128, 0, "t"], + [8125, 0, "c"], + [8126, 0, "o"], + [8127, 0, "n"], + [8128, 0, "c"], + [8129, 0, "u"], + [8130, 0, "r"], + [8131, 0, "r"], + [8132, 0, "e"], + [8133, 0, "n"], + [8134, 0, "t"], + [8135, 0, " "], + [8140, 0, "s"], + [8141, 0, " "], + [8142, 0, "a"], + [8143, 0, "t"], + [8144, 0, " "], + [8145, 0, "d"], + [8146, 0, "i"], + [8147, 0, "f"], + [8148, 0, "f"], + [8149, 0, "e"], + [8150, 0, "r"], + [8151, 0, "e"], + [8152, 0, "n"], + [8153, 0, "t"], + [8154, 0, " "], + [8155, 0, "l"], + [8156, 0, "e"], + [8157, 0, "v"], + [8158, 0, "e"], + [8159, 0, "l"], + [8160, 0, "s"], + [8161, 0, " "], + [8162, 0, "o"], + [8163, 0, "f"], + [8164, 0, " "], + [8165, 0, "t"], + [8166, 0, "h"], + [8167, 0, "e"], + [8168, 0, " "], + [8169, 0, "t"], + [8170, 0, "r"], + [8171, 0, "e"], + [8172, 0, "e"], + [8173, 0, "."], + [8174, 0, " "], + [8175, 0, "W"], + [8176, 0, "e"], + [8177, 0, " "], + [8178, 0, "i"], + [8179, 0, "l"], + [8180, 0, "l"], + [8181, 0, "u"], + [8182, 0, "s"], + [8183, 0, "t"], + [8184, 0, "r"], + [8185, 0, "a"], + [8186, 0, "t"], + [8187, 0, "e"], + [8188, 0, " "], + [8189, 0, "s"], + [8190, 0, "o"], + [8191, 0, "m"], + [8192, 0, "e"], + [8193, 0, " "], + [8194, 0, "o"], + [8195, 0, "f"], + [8196, 0, " "], + [8197, 0, "t"], + [8198, 0, "h"], + [8199, 0, "o"], + [8200, 0, "s"], + [8201, 0, "e"], + [8202, 0, " "], + [8203, 0, "c"], + [8204, 0, "h"], + [8205, 0, "a"], + [8206, 0, "l"], + [8207, 0, "l"], + [8208, 0, "e"], + [8209, 0, "n"], + [8210, 0, "g"], + [8211, 0, "e"], + [8212, 0, "s"], + [8213, 0, " "], + [8214, 0, "b"], + [8215, 0, "y"], + [8216, 0, " "], + [8217, 0, "e"], + [8218, 0, "x"], + [8219, 0, "a"], + [8220, 0, "m"], + [8221, 0, "p"], + [8222, 0, "l"], + [8223, 0, "e"], + [8224, 0, " "], + [8225, 0, "i"], + [8226, 0, "n"], + [8227, 0, " "], + [8228, 0, "s"], + [8229, 0, "e"], + [8230, 0, "c"], + [8231, 0, "t"], + [8232, 0, "i"], + [8233, 0, "o"], + [8234, 0, "n"], + [8235, 0, "~"], + [8236, 0, "\\"], + [8237, 0, "r"], + [8238, 0, "e"], + [8239, 0, "f"], + [8240, 0, "{"], + [8241, 0, "s"], + [8242, 0, "e"], + [8243, 0, "c"], + [8244, 0, ":"], + [8245, 0, "e"], + [8246, 0, "x"], + [8247, 0, "a"], + [8248, 0, "m"], + [8249, 0, "p"], + [8250, 0, "l"], + [8251, 0, "e"], + [8252, 0, "s"], + [8253, 0, "}"], + [8254, 0, "."], + [8255, 0, " "], + [8256, 0, "O"], + [8257, 0, "n"], + [8258, 0, " "], + [8259, 0, "t"], + [8260, 0, "h"], + [8261, 0, "e"], + [8262, 0, " "], + [8263, 0, "o"], + [8264, 0, "t"], + [8265, 0, "h"], + [8266, 0, "e"], + [8267, 0, "r"], + [8268, 0, " "], + [8269, 0, "h"], + [8270, 0, "a"], + [8271, 0, "n"], + [8272, 0, "d"], + [8273, 0, ","], + [8274, 0, " "], + [8275, 0, "n"], + [8276, 0, "e"], + [8277, 0, "s"], + [8278, 0, "t"], + [8279, 0, "e"], + [8280, 0, "d"], + [8281, 0, " "], + [8282, 0, "s"], + [8283, 0, "t"], + [8284, 0, "r"], + [8285, 0, "u"], + [8286, 0, "c"], + [8287, 0, "t"], + [8288, 0, "u"], + [8289, 0, "r"], + [8290, 0, "e"], + [8291, 0, "s"], + [8292, 0, " "], + [8293, 0, "a"], + [8294, 0, "r"], + [8295, 0, "e"], + [8296, 0, " "], + [8297, 0, "a"], + [8298, 0, "n"], + [8299, 0, " "], + [8300, 0, "i"], + [8301, 0, "m"], + [8302, 0, "p"], + [8303, 0, "o"], + [8304, 0, "r"], + [8305, 0, "t"], + [8306, 0, "a"], + [8307, 0, "n"], + [8308, 0, "t"], + [8309, 0, " "], + [8310, 0, "r"], + [8311, 0, "e"], + [8312, 0, "q"], + [8313, 0, "u"], + [8314, 0, "i"], + [8315, 0, "r"], + [8316, 0, "e"], + [8317, 0, "m"], + [8318, 0, "e"], + [8319, 0, "n"], + [8320, 0, "t"], + [8321, 0, " "], + [8322, 0, "f"], + [8323, 0, "o"], + [8324, 0, "r"], + [8325, 0, " "], + [8326, 0, "m"], + [8327, 0, "a"], + [8328, 0, "n"], + [8329, 0, "y"], + [8330, 0, " "], + [8331, 0, "a"], + [8332, 0, "p"], + [8333, 0, "p"], + [8334, 0, "l"], + [8335, 0, "i"], + [8336, 0, "c"], + [8337, 0, "a"], + [8338, 0, "t"], + [8339, 0, "i"], + [8340, 0, "o"], + [8341, 0, "n"], + [8342, 0, "s"], + [8343, 0, ";"], + [8344, 0, " "], + [8345, 0, "b"], + [8346, 0, "y"], + [8347, 0, " "], + [8348, 0, "p"], + [8349, 0, "r"], + [8350, 0, "o"], + [8351, 0, "v"], + [8352, 0, "i"], + [8353, 0, "d"], + [8354, 0, "i"], + [8355, 0, "n"], + [8356, 0, "g"], + [8357, 0, " "], + [8358, 0, "a"], + [8359, 0, "n"], + [8360, 0, " "], + [8361, 0, "a"], + [8362, 0, "l"], + [8363, 0, "g"], + [8364, 0, "o"], + [8365, 0, "r"], + [8366, 0, "i"], + [8367, 0, "t"], + [8368, 0, "h"], + [8369, 0, "m"], + [8370, 0, " "], + [8371, 0, "t"], + [8372, 0, "h"], + [8373, 0, "a"], + [8374, 0, "t"], + [8375, 0, " "], + [6413, 0, "o"], + [6414, 0, "p"], + [6415, 0, "t"], + [6416, 0, "i"], + [6417, 0, "m"], + [6418, 0, "i"], + [6419, 0, "s"], + [6420, 0, "t"], + [6421, 0, "i"], + [6422, 0, "c"], + [6423, 0, "a"], + [6424, 0, "l"], + [6425, 0, "l"], + [6426, 0, "y"], + [6427, 0, " "], + [6532, 0, " "], + [6532, 1], + [8391, 0, "h"], + [8392, 0, "a"], + [8393, 0, "n"], + [8394, 0, "d"], + [8395, 0, "l"], + [8396, 0, "e"], + [8397, 0, "s"], + [8398, 0, " "], + [8399, 0, "c"], + [8400, 0, "o"], + [8401, 0, "n"], + [8402, 0, "f"], + [8403, 0, "l"], + [8404, 0, "i"], + [8405, 0, "c"], + [8406, 0, "t"], + [8407, 0, " "], + [8408, 0, "r"], + [8409, 0, "e"], + [8410, 0, "s"], + [8411, 0, "o"], + [8412, 0, "l"], + [8413, 0, "u"], + [8414, 0, "t"], + [8415, 0, "i"], + [8416, 0, "o"], + [8417, 0, "n"], + [8418, 0, " "], + [8419, 0, "o"], + [8420, 0, "n"], + [8421, 0, " "], + [8422, 0, "s"], + [8423, 0, "u"], + [8424, 0, "c"], + [8425, 0, "h"], + [8426, 0, " "], + [8427, 0, "s"], + [8428, 0, "t"], + [8429, 0, "r"], + [8430, 0, "u"], + [8431, 0, "c"], + [8432, 0, "t"], + [8433, 0, "u"], + [8434, 0, "r"], + [8435, 0, "e"], + [8436, 0, "s"], + [8437, 0, ","], + [8438, 0, " "], + [8439, 0, "w"], + [8440, 0, "e"], + [8441, 0, " "], + [8442, 0, "h"], + [8443, 0, "o"], + [8444, 0, "p"], + [8445, 0, "e"], + [8446, 0, " "], + [8447, 0, "t"], + [8448, 0, "o"], + [8449, 0, " "], + [8450, 0, "s"], + [8451, 0, "i"], + [8452, 0, "m"], + [8453, 0, "p"], + [8454, 0, "l"], + [8455, 0, "i"], + [8456, 0, "f"], + [8457, 0, "y"], + [8458, 0, " "], + [8459, 0, "t"], + [8460, 0, "h"], + [8461, 0, "e"], + [8462, 0, " "], + [8463, 0, "t"], + [8464, 0, "h"], + [8465, 0, "e"], + [8466, 0, " "], + [8467, 0, "d"], + [8468, 0, "e"], + [8469, 0, "v"], + [8470, 0, "e"], + [8471, 0, "l"], + [8472, 0, "o"], + [8473, 0, "p"], + [8474, 0, "m"], + [8475, 0, "e"], + [8476, 0, "n"], + [8477, 0, "t"], + [8478, 0, " "], + [8479, 0, "o"], + [8480, 0, "f"], + [8481, 0, " "], + [8482, 0, "a"], + [8483, 0, "p"], + [8484, 0, "p"], + [8485, 0, "l"], + [8486, 0, "i"], + [8487, 0, "c"], + [8488, 0, "a"], + [8489, 0, "t"], + [8490, 0, "i"], + [8491, 0, "o"], + [8492, 0, "n"], + [8493, 0, "s"], + [8494, 0, " "], + [8495, 0, "t"], + [8496, 0, "h"], + [8497, 0, "a"], + [8498, 0, "t"], + [8499, 0, " "], + [8500, 0, "u"], + [8501, 0, "s"], + [8502, 0, "e"], + [8503, 0, " "], + [8504, 0, "o"], + [8505, 0, "p"], + [8506, 0, "t"], + [8507, 0, "i"], + [8508, 0, "m"], + [8509, 0, "i"], + [8510, 0, "s"], + [8511, 0, "t"], + [8512, 0, "i"], + [8513, 0, "c"], + [8514, 0, " "], + [8515, 0, "r"], + [8516, 0, "e"], + [8517, 0, "p"], + [8518, 0, "l"], + [8519, 0, "i"], + [8520, 0, "c"], + [8521, 0, "a"], + [8522, 0, "t"], + [8523, 0, "i"], + [8524, 0, "o"], + [8525, 0, "n"], + [8526, 0, "."], + [8570, 0, "\n"], + [8571, 0, "\n"], + [8572, 0, "I"], + [8573, 0, "n"], + [8574, 0, " "], + [8575, 0, "t"], + [8576, 0, "h"], + [8577, 0, "i"], + [8578, 0, "s"], + [8579, 0, " "], + [8580, 0, "s"], + [8581, 0, "e"], + [8582, 0, "c"], + [8583, 0, "t"], + [8584, 0, "i"], + [8585, 0, "o"], + [8586, 0, "n"], + [8587, 0, " "], + [8588, 0, "w"], + [8589, 0, "e"], + [8590, 0, " "], + [8591, 0, "d"], + [8592, 0, "i"], + [8593, 0, "s"], + [8594, 0, "c"], + [8595, 0, "u"], + [8596, 0, "s"], + [8597, 0, "s"], + [8598, 0, " "], + [8599, 0, "e"], + [8600, 0, "x"], + [8601, 0, "i"], + [8602, 0, "s"], + [8603, 0, "t"], + [8604, 0, "i"], + [8605, 0, "n"], + [8606, 0, "g"], + [8607, 0, " "], + [8608, 0, "a"], + [8609, 0, "p"], + [8610, 0, "p"], + [8611, 0, "r"], + [8612, 0, "o"], + [8613, 0, "a"], + [8614, 0, "c"], + [8615, 0, "h"], + [8616, 0, "e"], + [8617, 0, "s"], + [8618, 0, " "], + [8619, 0, "t"], + [8620, 0, "o"], + [8621, 0, " "], + [8622, 0, "o"], + [8623, 0, "p"], + [8624, 0, "t"], + [8625, 0, "i"], + [8626, 0, "m"], + [8627, 0, "i"], + [8628, 0, "s"], + [8629, 0, "t"], + [8630, 0, "i"], + [8631, 0, "c"], + [8632, 0, " "], + [8633, 0, "r"], + [8634, 0, "e"], + [8635, 0, "p"], + [8636, 0, "l"], + [8637, 0, "i"], + [8638, 0, "c"], + [8639, 0, "a"], + [8640, 0, "t"], + [8641, 0, "i"], + [8642, 0, "o"], + [8643, 0, "n"], + [8644, 0, ","], + [8645, 0, " "], + [8646, 0, "c"], + [8647, 0, "o"], + [8648, 0, "l"], + [8649, 0, "l"], + [8650, 0, "a"], + [8651, 0, "b"], + [8652, 0, "o"], + [8653, 0, "r"], + [8654, 0, "a"], + [8655, 0, "t"], + [8656, 0, "i"], + [8657, 0, "v"], + [8658, 0, "e"], + [8659, 0, " "], + [8660, 0, "e"], + [8661, 0, "d"], + [8662, 0, "i"], + [8663, 0, "t"], + [8664, 0, "i"], + [8665, 0, "n"], + [8666, 0, "g"], + [8667, 0, " "], + [8668, 0, "a"], + [8669, 0, "n"], + [8670, 0, "d"], + [8671, 0, " "], + [8672, 0, "c"], + [8673, 0, "o"], + [8674, 0, "n"], + [8675, 0, "f"], + [8676, 0, "l"], + [8677, 0, "i"], + [8678, 0, "c"], + [8679, 0, "t"], + [8680, 0, " "], + [8681, 0, "r"], + [8682, 0, "e"], + [8683, 0, "s"], + [8684, 0, "o"], + [8685, 0, "l"], + [8686, 0, "u"], + [8687, 0, "t"], + [8688, 0, "i"], + [8689, 0, "o"], + [8690, 0, "n"], + [8691, 0, "."], + [9324, 0, " "], + [9325, 0, "("], + [9326, 0, "s"], + [9327, 0, "e"], + [9328, 0, "e"], + [9329, 0, " "], + [9330, 0, "s"], + [9331, 0, "e"], + [9332, 0, "c"], + [9333, 0, "t"], + [9334, 0, "i"], + [9335, 0, "o"], + [9336, 0, "n"], + [9337, 0, "~"], + [9338, 0, "\\"], + [9339, 0, "r"], + [9340, 0, "e"], + [9341, 0, "f"], + [9342, 0, "{"], + [9343, 0, "s"], + [9344, 0, "e"], + [9345, 0, "c"], + [9346, 0, ":"], + [9347, 0, "j"], + [9348, 0, "s"], + [9349, 0, "o"], + [9350, 0, "n"], + [9351, 0, "-"], + [9352, 0, "x"], + [9353, 0, "m"], + [9354, 0, "l"], + [9355, 0, "}"], + [9356, 0, ")"], + [6380, 0, " "], + [6381, 0, "W"], + [6382, 0, "e"], + [6383, 0, " "], + [6384, 0, "d"], + [6385, 0, "o"], + [6386, 0, " "], + [6387, 0, "n"], + [6388, 0, "o"], + [6389, 0, "t"], + [6390, 0, " "], + [6391, 0, "d"], + [6392, 0, "i"], + [6393, 0, "s"], + [6394, 0, "t"], + [6395, 0, "i"], + [6396, 0, "n"], + [6397, 0, "g"], + [6398, 0, "u"], + [6399, 0, "i"], + [6400, 0, "s"], + [6401, 0, "h"], + [6402, 0, " "], + [6403, 0, "b"], + [6404, 0, "e"], + [6405, 0, "t"], + [6406, 0, "w"], + [6407, 0, "e"], + [6408, 0, "e"], + [6409, 0, "n"], + [6410, 0, " "], + [6411, 0, "d"], + [6412, 0, "e"], + [6413, 0, "v"], + [6414, 0, "i"], + [6415, 0, "c"], + [6416, 0, "e"], + [6417, 0, "s"], + [6418, 0, " "], + [6419, 0, "o"], + [6420, 0, "w"], + [6421, 0, "n"], + [6422, 0, "e"], + [6423, 0, "d"], + [6424, 0, " "], + [6425, 0, "b"], + [6426, 0, "y"], + [6427, 0, " "], + [6428, 0, "t"], + [6429, 0, "h"], + [6430, 0, "e"], + [6431, 0, " "], + [6432, 0, "s"], + [6433, 0, "a"], + [6434, 0, "m"], + [6435, 0, "e"], + [6436, 0, " "], + [6437, 0, "u"], + [6438, 0, "s"], + [6439, 0, "e"], + [6440, 0, "r"], + [6441, 0, " "], + [6442, 0, "a"], + [6443, 0, "n"], + [6444, 0, "d"], + [6445, 0, " "], + [6446, 0, "d"], + [6447, 0, "i"], + [6448, 0, "f"], + [6449, 0, "f"], + [6450, 0, "e"], + [6451, 0, "r"], + [6452, 0, "e"], + [6453, 0, "n"], + [6454, 0, "t"], + [6455, 0, " "], + [6456, 0, "u"], + [6457, 0, "s"], + [6458, 0, "e"], + [6459, 0, "r"], + [6460, 0, "s"], + [6461, 0, "."], + [4766, 0, "W"], + [4767, 0, "e"], + [4768, 0, " "], + [4769, 0, "t"], + [4770, 0, "r"], + [4771, 0, "e"], + [4772, 0, "a"], + [4773, 0, "t"], + [4774, 0, " "], + [4775, 1], + [4775, 0, "k"], + [4780, 1], + [4780, 1], + [4780, 1], + [4780, 0, "a"], + [4781, 0, "s"], + [4807, 1], + [4806, 1], + [4806, 0, "s"], + [6843, 1], + [6843, 0, "\n"], + [6844, 0, "\n"], + [6965, 0, " "], + [6966, 0, "m"], + [6967, 0, "e"], + [6968, 0, "s"], + [6969, 0, "s"], + [6970, 0, "a"], + [6971, 0, "g"], + [6972, 0, "e"], + [6973, 0, "s"], + [6974, 0, " "], + [6975, 0, "t"], + [6976, 0, "o"], + [6977, 0, " "], + [6978, 0, "b"], + [6979, 0, "e"], + [6980, 0, " "], + [6981, 0, "d"], + [6982, 0, "e"], + [6983, 0, "l"], + [6984, 0, "i"], + [6985, 0, "v"], + [6986, 0, "e"], + [6987, 0, "r"], + [6988, 0, "e"], + [6989, 0, "d"], + [6990, 0, " "], + [6991, 0, "v"], + [6992, 0, "i"], + [6993, 0, "a"], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7096, 1], + [7153, 1], + [7153, 1], + [7153, 1], + [7153, 1], + [7409, 1], + [7408, 1], + [7408, 0, "h"], + [7409, 0, "r"], + [7410, 0, "e"], + [7411, 0, "e"], + [7612, 0, "\n"], + [7613, 0, "\\"], + [7614, 0, "i"], + [7615, 0, "t"], + [7616, 0, "e"], + [7617, 0, "m"], + [7618, 0, " "], + [7619, 0, "I"], + [7620, 0, "f"], + [7621, 0, " "], + [7622, 0, "a"], + [7622, 1], + [7621, 1], + [7620, 1], + [7619, 1], + [7619, 0, "F"], + [7620, 0, "o"], + [7621, 0, "r"], + [7622, 0, " "], + [7623, 0, "s"], + [7624, 0, "o"], + [7625, 0, "m"], + [7626, 0, "e"], + [7627, 0, " "], + [7628, 0, "s"], + [7629, 0, "e"], + [7630, 0, "t"], + [7631, 0, " "], + [7631, 1], + [7630, 1], + [7629, 1], + [7628, 1], + [7627, 1], + [7626, 1], + [7625, 1], + [7624, 1], + [7623, 1], + [7622, 1], + [7621, 1], + [7620, 1], + [7619, 1], + [7619, 0, "I"], + [7620, 0, "f"], + [7621, 0, " "], + [7622, 0, "a"], + [7623, 0, "l"], + [7624, 0, "l"], + [7625, 0, " "], + [7626, 0, "s"], + [7627, 0, "e"], + [7628, 0, "q"], + [7629, 0, "u"], + [7630, 0, "e"], + [7631, 0, "n"], + [7632, 0, "t"], + [7633, 0, "i"], + [7634, 0, "a"], + [7635, 0, "l"], + [7636, 0, " "], + [7637, 0, "p"], + [7638, 0, "e"], + [7639, 0, "r"], + [7640, 0, "m"], + [7641, 0, "u"], + [7642, 0, "t"], + [7643, 0, "a"], + [7644, 0, "t"], + [7645, 0, "i"], + [7646, 0, "o"], + [7647, 0, "n"], + [7648, 0, "s"], + [7649, 0, " "], + [7650, 0, "o"], + [7651, 0, "f"], + [7652, 0, " "], + [7653, 0, "u"], + [7654, 0, "p"], + [7655, 0, "d"], + [7656, 0, "a"], + [7657, 0, "t"], + [7658, 0, "e"], + [7659, 0, "s"], + [7660, 0, " "], + [7661, 0, "l"], + [7662, 0, "e"], + [7663, 0, "a"], + [7664, 0, "d"], + [7665, 0, " "], + [7666, 0, "t"], + [7667, 0, "o"], + [7668, 0, " "], + [7669, 0, "t"], + [7670, 0, "h"], + [7671, 0, "e"], + [7672, 0, " "], + [7673, 0, "s"], + [7674, 0, "a"], + [7675, 0, "m"], + [7676, 0, "e"], + [7677, 0, " "], + [7678, 0, "s"], + [7679, 0, "t"], + [7680, 0, "a"], + [7681, 0, "t"], + [7682, 0, "e"], + [7683, 0, ","], + [7684, 0, " "], + [7685, 0, "t"], + [7686, 0, "h"], + [7687, 0, "e"], + [7688, 0, "n"], + [7689, 0, " "], + [7690, 0, "c"], + [7691, 0, "o"], + [7692, 0, "n"], + [7693, 0, "c"], + [7694, 0, "u"], + [7695, 0, "r"], + [7696, 0, "r"], + [7697, 0, "e"], + [7698, 0, "n"], + [7699, 0, "t"], + [7700, 0, " "], + [7701, 0, "e"], + [7702, 0, "x"], + [7703, 0, "e"], + [7704, 0, "c"], + [7705, 0, "u"], + [7706, 0, "t"], + [7707, 0, "i"], + [7708, 0, "o"], + [7709, 0, "n"], + [7710, 0, " "], + [7711, 0, "o"], + [7712, 0, "f"], + [7713, 0, " "], + [7714, 0, "t"], + [7715, 0, "h"], + [7716, 0, "o"], + [7717, 0, "s"], + [7718, 0, "e"], + [7719, 0, " "], + [7720, 0, "u"], + [7721, 0, "p"], + [7722, 0, "d"], + [7723, 0, "a"], + [7724, 0, "t"], + [7725, 0, "e"], + [7726, 0, "s"], + [7727, 0, " "], + [7728, 0, "a"], + [7729, 0, "l"], + [7730, 0, "s"], + [7731, 0, "o"], + [7732, 0, " "], + [7733, 0, "l"], + [7734, 0, "e"], + [7735, 0, "a"], + [7736, 0, "d"], + [7737, 0, "s"], + [7738, 0, " "], + [7739, 0, "t"], + [7740, 0, "o"], + [7741, 0, " "], + [7742, 0, "t"], + [7743, 0, "h"], + [7744, 0, "e"], + [7745, 0, " "], + [7746, 0, "s"], + [7747, 0, "a"], + [7748, 0, "m"], + [7749, 0, "e"], + [7750, 0, " "], + [7751, 0, "s"], + [7752, 0, "t"], + [7753, 0, "a"], + [7754, 0, "t"], + [7755, 0, "e"], + [7756, 0, "~"], + [7757, 0, "\\"], + [7758, 0, "c"], + [7759, 0, "i"], + [7760, 0, "t"], + [7761, 0, "e"], + [7762, 0, "{"], + [7763, 0, "B"], + [7764, 0, "i"], + [7765, 0, "e"], + [7766, 0, "n"], + [7767, 0, "i"], + [7768, 0, "u"], + [7769, 0, "s"], + [7770, 0, "a"], + [7771, 0, ":"], + [7772, 0, "2"], + [7773, 0, "0"], + [7774, 0, "1"], + [7775, 0, "2"], + [7776, 0, "g"], + [7777, 0, "t"], + [7778, 0, "}"], + [7779, 0, "."], + [7257, 0, "a"], + [7258, 0, " "], + [11431, 0, "\n"], + [11432, 0, "C"], + [11433, 0, "o"], + [11434, 0, "n"], + [11435, 0, "f"], + [11436, 0, "l"], + [11437, 0, "i"], + [11438, 0, "c"], + [11439, 0, "t"], + [11440, 0, "-"], + [11441, 0, "f"], + [11442, 0, "r"], + [11443, 0, "e"], + [11444, 0, "e"], + [11445, 0, " "], + [11446, 0, "r"], + [11447, 0, "e"], + [11448, 0, "p"], + [11449, 0, "l"], + [11450, 0, "i"], + [11451, 0, "c"], + [11452, 0, "a"], + [11453, 0, "t"], + [11454, 0, "e"], + [11455, 0, "d"], + [11456, 0, " "], + [11457, 0, "d"], + [11458, 0, "a"], + [11459, 0, "t"], + [11460, 0, "a"], + [11461, 0, "t"], + [11462, 0, "y"], + [11463, 0, "p"], + [11464, 0, "e"], + [11465, 0, "s"], + [11466, 0, " "], + [11467, 0, "a"], + [11468, 0, "r"], + [11469, 0, "e"], + [11470, 0, " "], + [11471, 0, "a"], + [11472, 0, " "], + [11473, 0, "f"], + [11474, 0, "a"], + [11475, 0, "m"], + [11476, 0, "i"], + [11477, 0, "l"], + [11478, 0, "y"], + [11479, 0, " "], + [11480, 0, "o"], + [11481, 0, "f"], + [11482, 0, " "], + [11483, 0, "d"], + [11484, 0, "a"], + [11485, 0, "t"], + [11486, 0, "a"], + [11487, 0, " "], + [11488, 0, "s"], + [11489, 0, "t"], + [11490, 0, "r"], + [11491, 0, "u"], + [11492, 0, "c"], + [11493, 0, "t"], + [11494, 0, "u"], + [11495, 0, "r"], + [11496, 0, "e"], + [11497, 0, "s"], + [11498, 0, " "], + [11499, 0, "\n"], + [11467, 0, "("], + [11468, 0, "C"], + [11469, 0, "R"], + [11470, 0, "D"], + [11471, 0, "T"], + [11472, 0, ")"], + [11473, 0, " "], + [11472, 0, "s"], + [11507, 0, "t"], + [11508, 0, "h"], + [11509, 0, "a"], + [11510, 0, "t"], + [11511, 0, " "], + [11512, 0, "c"], + [11513, 0, "a"], + [11514, 0, "n"], + [11515, 0, " "], + [11516, 0, "b"], + [11517, 0, "e"], + [11518, 0, " "], + [11519, 0, "c"], + [11520, 0, "o"], + [11521, 0, "n"], + [11522, 0, "c"], + [11523, 0, "u"], + [11524, 0, "r"], + [11525, 0, "r"], + [11526, 0, "e"], + [11527, 0, "n"], + [11528, 0, "t"], + [11529, 0, "l"], + [11530, 0, "y"], + [11531, 0, " "], + [11532, 0, "m"], + [11533, 0, "o"], + [11534, 0, "d"], + [11535, 0, "i"], + [11536, 0, "f"], + [11537, 0, "i"], + [11538, 0, "e"], + [11539, 0, "d"], + [11540, 0, " "], + [11541, 0, "a"], + [11542, 0, "n"], + [11543, 0, "d"], + [11544, 0, " "], + [11545, 0, "t"], + [11546, 0, "h"], + [11547, 0, "a"], + [11548, 0, "t"], + [11549, 0, " "], + [11550, 0, "g"], + [11551, 0, "u"], + [11552, 0, "a"], + [11553, 0, "r"], + [11554, 0, "a"], + [11555, 0, "n"], + [11556, 0, "t"], + [11557, 0, "e"], + [11558, 0, "e"], + [11559, 0, " "], + [11560, 0, "c"], + [11561, 0, "o"], + [11562, 0, "n"], + [11563, 0, "v"], + [11564, 0, "e"], + [11565, 0, "r"], + [11566, 0, "g"], + [11567, 0, "e"], + [11568, 0, "n"], + [11569, 0, "c"], + [11570, 0, "e"], + [11571, 0, " "], + [11572, 0, "o"], + [11573, 0, "f"], + [11574, 0, " "], + [11575, 0, "s"], + [11576, 0, "u"], + [11577, 0, "c"], + [11578, 0, "h"], + [11579, 0, " "], + [11580, 0, "c"], + [11581, 0, "o"], + [11582, 0, "n"], + [11583, 0, "c"], + [11584, 0, "u"], + [11585, 0, "r"], + [11586, 0, "r"], + [11587, 0, "e"], + [11588, 0, "n"], + [11589, 0, "t"], + [11590, 0, " "], + [11591, 0, "u"], + [11592, 0, "p"], + [11593, 0, "d"], + [11594, 0, "a"], + [11595, 0, "t"], + [11596, 0, "e"], + [11597, 0, "s"], + [11598, 0, "."], + [11599, 0, " "], + [11600, 0, "T"], + [11601, 0, "h"], + [11602, 0, "e"], + [11603, 0, "y"], + [11604, 0, " "], + [11605, 0, "w"], + [11606, 0, "o"], + [11607, 0, "r"], + [11608, 0, "k"], + [11609, 0, " "], + [11610, 0, "b"], + [11611, 0, "y"], + [11612, 0, " "], + [11613, 0, "a"], + [11614, 0, "t"], + [11615, 0, "t"], + [11616, 0, "a"], + [11617, 0, "c"], + [11618, 0, "h"], + [11619, 0, "i"], + [11620, 0, "n"], + [11621, 0, "g"], + [11622, 0, " "], + [11623, 0, "a"], + [11624, 0, "d"], + [11625, 0, "d"], + [11626, 0, "i"], + [11627, 0, "t"], + [11628, 0, "i"], + [11629, 0, "o"], + [11630, 0, "n"], + [11631, 0, "a"], + [11632, 0, "l"], + [11633, 0, " "], + [11634, 0, "m"], + [11635, 0, "e"], + [11636, 0, "t"], + [11637, 0, "a"], + [11638, 0, "d"], + [11639, 0, "a"], + [11640, 0, "t"], + [11641, 0, "a"], + [11642, 0, " "], + [11643, 0, "t"], + [11644, 0, "o"], + [11645, 0, " "], + [11646, 0, "t"], + [11647, 0, "h"], + [11648, 0, "e"], + [11649, 0, " "], + [11650, 0, "d"], + [11651, 0, "a"], + [11652, 0, "t"], + [11653, 0, "a"], + [11654, 0, " "], + [11655, 0, "s"], + [11656, 0, "t"], + [11657, 0, "r"], + [11658, 0, "u"], + [11659, 0, "c"], + [11660, 0, "t"], + [11661, 0, "u"], + [11662, 0, "r"], + [11663, 0, "e"], + [11664, 0, ","], + [11665, 0, " "], + [11666, 0, "a"], + [11667, 0, "n"], + [11668, 0, "d"], + [11669, 0, " "], + [11670, 0, "m"], + [11671, 0, "a"], + [11672, 0, "k"], + [11673, 0, "i"], + [11674, 0, "n"], + [11675, 0, "g"], + [11676, 0, " "], + [11677, 0, "m"], + [11678, 0, "o"], + [11679, 0, "d"], + [11680, 0, "i"], + [11681, 0, "f"], + [11682, 0, "i"], + [11683, 0, "c"], + [11684, 0, "a"], + [11685, 0, "t"], + [11686, 0, "i"], + [11687, 0, "o"], + [11688, 0, "n"], + [11689, 0, " "], + [11690, 0, "o"], + [11691, 0, "p"], + [11692, 0, "e"], + [11693, 0, "r"], + [11694, 0, "a"], + [11695, 0, "t"], + [11696, 0, "i"], + [11697, 0, "o"], + [11698, 0, "n"], + [11699, 0, "s"], + [11700, 0, " "], + [11701, 0, "c"], + [11702, 0, "o"], + [11703, 0, "m"], + [11704, 0, "m"], + [11705, 0, "u"], + [11706, 0, "t"], + [11707, 0, "a"], + [11708, 0, "t"], + [11709, 0, "i"], + [11710, 0, "v"], + [11711, 0, "e"], + [11712, 0, " "], + [11713, 0, "b"], + [11714, 0, "y"], + [11715, 0, " "], + [11716, 0, "c"], + [11717, 0, "o"], + [11718, 0, "n"], + [11719, 0, "s"], + [11720, 0, "t"], + [11721, 0, "r"], + [11722, 0, "u"], + [11723, 0, "c"], + [11724, 0, "t"], + [11725, 0, "i"], + [11726, 0, "o"], + [11727, 0, "n"], + [11728, 0, "."], + [11599, 0, " "], + [11600, 0, "U"], + [11601, 0, "n"], + [11602, 0, "l"], + [11603, 0, "i"], + [11604, 0, "k"], + [11605, 0, "e"], + [11606, 0, " "], + [11607, 0, "O"], + [11608, 0, "T"], + [11609, 0, ","], + [11610, 0, " "], + [11611, 0, "w"], + [11612, 0, "h"], + [11613, 0, "i"], + [11614, 0, "c"], + [11615, 0, "h"], + [11616, 0, " "], + [11617, 0, "t"], + [11618, 0, "r"], + [11619, 0, "a"], + [11620, 0, "n"], + [11621, 0, "s"], + [11622, 0, "f"], + [11623, 0, "o"], + [11624, 0, "r"], + [11625, 0, "m"], + [11626, 0, "s"], + [11627, 0, " "], + [11628, 0, "o"], + [11629, 0, "p"], + [11630, 0, "e"], + [11631, 0, "r"], + [11632, 0, "a"], + [11633, 0, "t"], + [11634, 0, "i"], + [11635, 0, "o"], + [11636, 0, "n"], + [11637, 0, "s"], + [11638, 0, " "], + [11639, 0, "a"], + [11639, 1], + [11638, 1], + [11637, 1], + [11636, 1], + [11635, 1], + [11634, 1], + [11633, 1], + [11632, 1], + [11631, 1], + [11630, 1], + [11629, 1], + [11628, 1], + [11627, 1], + [11626, 1], + [11625, 1], + [11624, 1], + [11623, 1], + [11622, 1], + [11621, 1], + [11620, 1], + [11619, 1], + [11618, 1], + [11617, 1], + [11616, 1], + [11615, 1], + [11614, 1], + [11613, 1], + [11612, 1], + [11611, 1], + [11610, 1], + [11609, 1], + [11608, 1], + [11607, 1], + [11606, 1], + [11605, 1], + [11604, 1], + [11603, 1], + [11602, 1], + [11601, 1], + [11600, 1], + [11599, 1], + [11729, 0, " "], + [11730, 0, "B"], + [11731, 0, "y"], + [11732, 0, " "], + [11733, 0, "c"], + [11734, 0, "o"], + [11735, 0, "n"], + [11736, 0, "t"], + [11737, 0, "r"], + [11738, 0, "a"], + [11739, 0, "s"], + [11740, 0, "t"], + [11741, 0, ","], + [11742, 0, " "], + [11743, 0, "O"], + [11744, 0, "T"], + [11745, 0, " "], + [11746, 0, "w"], + [11747, 0, "o"], + [11748, 0, "r"], + [11749, 0, "k"], + [11750, 0, "s"], + [11751, 0, " "], + [11752, 0, "b"], + [11753, 0, "y"], + [11754, 0, " "], + [11755, 0, "t"], + [11756, 0, "r"], + [11757, 0, "a"], + [11758, 0, "n"], + [11759, 0, "s"], + [11760, 0, "o"], + [11760, 1], + [11760, 0, "f"], + [11761, 0, "o"], + [11762, 0, "r"], + [11763, 0, "m"], + [11764, 0, "i"], + [11765, 0, "n"], + [11766, 0, "g"], + [11767, 0, " "], + [11768, 0, "n"], + [11769, 0, "o"], + [11770, 0, "n"], + [11771, 0, "-"], + [11772, 0, "c"], + [11773, 0, "o"], + [11774, 0, "m"], + [11775, 0, "m"], + [11776, 0, "u"], + [11777, 0, "t"], + [11778, 0, "a"], + [11779, 0, "t"], + [11780, 0, "i"], + [11781, 0, "v"], + [11782, 0, "e"], + [11783, 0, " "], + [11784, 0, "u"], + [11785, 0, "p"], + [11786, 0, "d"], + [11787, 0, "a"], + [11788, 0, "t"], + [11789, 0, "e"], + [11790, 0, " "], + [11791, 0, "o"], + [11792, 0, "p"], + [11793, 0, "e"], + [11794, 0, "r"], + [11795, 0, "a"], + [11796, 0, "t"], + [11797, 0, "i"], + [11798, 0, "o"], + [11799, 0, "n"], + [11800, 0, "s"], + [11801, 0, " "], + [11801, 1], + [11800, 1], + [11799, 1], + [11798, 1], + [11797, 1], + [11796, 1], + [11795, 1], + [11794, 1], + [11793, 1], + [11792, 1], + [11791, 1], + [11790, 1], + [11789, 1], + [11788, 1], + [11787, 1], + [11786, 1], + [11785, 1], + [11784, 1], + [11783, 1], + [11782, 1], + [11781, 1], + [11780, 1], + [11779, 1], + [11778, 1], + [11777, 1], + [11776, 1], + [11775, 1], + [11774, 1], + [11773, 1], + [11772, 1], + [11771, 1], + [11770, 1], + [11769, 1], + [11768, 1], + [11767, 1], + [11766, 1], + [11765, 1], + [11764, 1], + [11763, 1], + [11762, 1], + [11761, 1], + [11760, 1], + [11759, 1], + [11758, 1], + [11757, 1], + [11756, 1], + [11755, 1], + [11754, 1], + [11753, 1], + [11752, 1], + [11751, 1], + [11750, 1], + [11749, 1], + [11748, 1], + [11747, 1], + [11746, 1], + [11745, 1], + [11744, 1], + [11743, 1], + [11742, 1], + [11741, 1], + [11740, 1], + [11739, 1], + [11738, 1], + [11737, 1], + [11736, 1], + [11735, 1], + [11734, 1], + [11733, 1], + [11732, 1], + [11731, 1], + [11730, 1], + [11729, 1], + [12242, 1], + [12241, 1], + [12240, 1], + [12239, 1], + [12238, 1], + [12237, 1], + [12237, 0, "p"], + [12238, 0, "r"], + [12239, 0, "i"], + [12240, 0, "m"], + [12241, 0, "i"], + [12242, 0, "t"], + [12243, 0, "i"], + [12244, 0, "v"], + [12245, 0, "e"], + [9634, 0, " "], + [9635, 0, "M"], + [9636, 0, "o"], + [9637, 0, "r"], + [9638, 0, "e"], + [9639, 0, "o"], + [9640, 0, "v"], + [9641, 0, "e"], + [9642, 0, "r"], + [9643, 0, ","], + [9644, 0, " "], + [9645, 0, "p"], + [9646, 0, "e"], + [9647, 0, "r"], + [9648, 0, "f"], + [9649, 0, "o"], + [9650, 0, "r"], + [9651, 0, "m"], + [9652, 0, "a"], + [9653, 0, "n"], + [9654, 0, "c"], + [9655, 0, "e"], + [9656, 0, " "], + [9657, 0, "s"], + [9658, 0, "t"], + [9659, 0, "u"], + [9660, 0, "d"], + [9661, 0, "i"], + [9662, 0, "e"], + [9663, 0, "s"], + [9664, 0, " "], + [9665, 0, "h"], + [9666, 0, "a"], + [9667, 0, "v"], + [9668, 0, "e"], + [9669, 0, " "], + [9670, 0, "c"], + [9671, 0, "a"], + [9672, 0, "s"], + [9673, 0, "t"], + [9674, 0, " "], + [9675, 0, "d"], + [9676, 0, "o"], + [9677, 0, "u"], + [9678, 0, "b"], + [9679, 0, "t"], + [9680, 0, " "], + [9681, 0, "o"], + [9682, 0, "n"], + [9683, 0, " "], + [9683, 1], + [9682, 1], + [9681, 1], + [9680, 1], + [9679, 1], + [9678, 1], + [9677, 1], + [9676, 1], + [9675, 1], + [9674, 1], + [9673, 1], + [9672, 1], + [9671, 1], + [9670, 1], + [9669, 1], + [9668, 1], + [9667, 1], + [9666, 1], + [9665, 1], + [9664, 1], + [9663, 1], + [9662, 1], + [9661, 1], + [9660, 1], + [9659, 1], + [9658, 1], + [9657, 1], + [9656, 1], + [9655, 1], + [9645, 0, "t"], + [9646, 0, "h"], + [9647, 0, "e"], + [9648, 0, " "], + [9659, 0, "e"], + [9660, 0, " "], + [9661, 0, "o"], + [9662, 0, "f"], + [9663, 0, " "], + [9664, 0, "O"], + [9665, 0, "T"], + [9666, 0, " "], + [9667, 0, "a"], + [9668, 0, "l"], + [9669, 0, "g"], + [9670, 0, "o"], + [9671, 0, "r"], + [9672, 0, "i"], + [9673, 0, "t"], + [9674, 0, "h"], + [9675, 0, "m"], + [9676, 0, "s"], + [9677, 0, " "], + [9678, 0, "d"], + [9679, 0, "e"], + [9680, 0, "g"], + [9681, 0, "r"], + [9682, 0, "a"], + [9683, 0, "d"], + [9684, 0, "e"], + [9685, 0, "s"], + [9686, 0, " "], + [9687, 0, "r"], + [9688, 0, "a"], + [9689, 0, "p"], + [9690, 0, "i"], + [9691, 0, "d"], + [9692, 0, "l"], + [9693, 0, "y"], + [9694, 0, " "], + [9645, 1], + [9644, 1], + [9643, 1], + [9642, 1], + [9641, 1], + [9640, 1], + [9639, 1], + [9638, 1], + [9637, 1], + [9636, 1], + [9635, 1], + [9635, 0, "T"], + [9685, 0, "a"], + [9686, 0, "s"], + [9687, 0, " "], + [9688, 0, "t"], + [9689, 0, "h"], + [9690, 0, "e"], + [9691, 0, " "], + [9692, 0, "n"], + [9693, 0, "u"], + [9694, 0, "m"], + [9695, 0, "b"], + [9696, 0, "e"], + [9697, 0, "r"], + [9698, 0, " "], + [9699, 0, "o"], + [9700, 0, "f"], + [9701, 0, " "], + [9702, 0, "c"], + [9703, 0, "o"], + [9704, 0, "n"], + [9705, 0, "c"], + [9706, 0, "u"], + [9707, 0, "r"], + [9708, 0, "r"], + [9709, 0, "e"], + [9710, 0, "n"], + [9711, 0, "t"], + [9712, 0, " "], + [9713, 0, "o"], + [9714, 0, "p"], + [9715, 0, "e"], + [9716, 0, "r"], + [9717, 0, "a"], + [9718, 0, "t"], + [9719, 0, "i"], + [9720, 0, "o"], + [9721, 0, "n"], + [9722, 0, "s"], + [9723, 0, " "], + [9724, 0, "i"], + [9725, 0, "n"], + [9726, 0, "c"], + [9727, 0, "r"], + [9728, 0, "e"], + [9729, 0, "a"], + [9730, 0, "s"], + [9731, 0, "e"], + [9732, 0, "s"], + [9733, 0, "~"], + [9734, 0, "\\"], + [9735, 0, "c"], + [9736, 0, "i"], + [9737, 0, "t"], + [9738, 0, "e"], + [9739, 0, "{"], + [9740, 0, "L"], + [9741, 0, "i"], + [9742, 0, ":"], + [9743, 0, "2"], + [9744, 0, "0"], + [9745, 0, "0"], + [9746, 0, "6"], + [9747, 0, "k"], + [9748, 0, "d"], + [9749, 0, "}"], + [9750, 0, "."], + [11846, 0, " "], + [11847, 0, "T"], + [11848, 0, "h"], + [11849, 0, "e"], + [11850, 0, " "], + [11851, 0, "J"], + [11852, 0, "S"], + [11853, 0, "O"], + [11854, 0, "N"], + [11855, 0, " "], + [11856, 0, "d"], + [11857, 0, "a"], + [11858, 0, "t"], + [11859, 0, "a"], + [11860, 0, "t"], + [11861, 0, "y"], + [11862, 0, "p"], + [11863, 0, "e"], + [11864, 0, " "], + [11865, 0, "d"], + [11866, 0, "e"], + [11867, 0, "s"], + [11868, 0, "c"], + [11869, 0, "r"], + [11870, 0, "i"], + [11871, 0, "b"], + [11872, 0, "e"], + [11873, 0, "d"], + [11874, 0, " "], + [11875, 0, "i"], + [11876, 0, "n"], + [11877, 0, " "], + [11878, 0, "t"], + [11879, 0, "h"], + [11880, 0, "i"], + [11881, 0, "s"], + [11882, 0, " "], + [11883, 0, "p"], + [11884, 0, "a"], + [11885, 0, "p"], + [11886, 0, "e"], + [11887, 0, "r"], + [11888, 0, " "], + [11889, 0, "i"], + [11890, 0, "s"], + [11891, 0, " "], + [11892, 0, "a"], + [11893, 0, " "], + [11894, 0, "k"], + [11895, 0, "i"], + [11896, 0, "n"], + [11897, 0, "d"], + [11898, 0, " "], + [11899, 0, "o"], + [11900, 0, "f"], + [11901, 0, " "], + [11902, 0, "C"], + [11903, 0, "R"], + [11904, 0, "D"], + [11905, 0, "T"], + [11906, 0, "."], + [7654, 0, " "], + [7655, 0, "a"], + [7656, 0, " "], + [7657, 0, "s"], + [7658, 0, "e"], + [7659, 0, "t"], + [7660, 0, " "], + [7661, 0, "o"], + [7662, 0, "f"], + [13605, 1], + [13604, 1], + [13603, 1], + [13602, 1], + [13601, 1], + [13600, 1], + [13599, 1], + [13598, 1], + [13597, 1], + [13596, 1], + [13595, 1], + [13594, 1], + [13593, 1], + [13592, 1], + [13591, 1], + [13590, 1], + [13589, 1], + [13588, 1], + [13587, 1], + [13586, 1], + [13585, 1], + [13584, 1], + [13583, 1], + [13582, 1], + [13581, 1], + [13580, 1], + [13579, 1], + [13578, 1], + [13577, 1], + [13576, 1], + [13575, 1], + [13574, 1], + [13573, 1], + [13572, 1], + [13571, 1], + [13570, 1], + [13569, 1], + [13568, 1], + [13567, 1], + [13566, 1], + [13565, 1], + [13564, 1], + [13563, 1], + [13562, 1], + [13561, 1], + [13560, 1], + [13559, 1], + [13558, 1], + [13557, 1], + [13556, 1], + [13555, 1], + [13554, 1], + [13553, 1], + [13552, 1], + [13551, 1], + [13550, 1], + [13549, 1], + [13548, 1], + [13547, 1], + [13546, 1], + [13545, 1], + [13544, 1], + [50753, 0, "\n"], + [50754, 0, "T"], + [50755, 0, "h"], + [50756, 0, "e"], + [50757, 0, " "], + [50758, 0, "\\"], + [50759, 0, "t"], + [50760, 0, "e"], + [50761, 0, "x"], + [50762, 0, "t"], + [50763, 0, "s"], + [50764, 0, "f"], + [50765, 0, "{"], + [50766, 0, "y"], + [50767, 0, "i"], + [50768, 0, "e"], + [50769, 0, "l"], + [50770, 0, "d"], + [50771, 0, "}"], + [50772, 0, " "], + [50773, 0, "c"], + [50774, 0, "o"], + [50775, 0, "m"], + [50776, 0, "m"], + [50777, 0, "a"], + [50778, 0, "n"], + [50779, 0, "d"], + [50780, 0, ","], + [50781, 0, " "], + [50782, 0, "i"], + [50783, 0, "n"], + [50784, 0, "s"], + [50785, 0, "p"], + [50786, 0, "i"], + [50787, 0, "r"], + [50788, 0, "e"], + [50789, 0, "d"], + [50790, 0, " "], + [50791, 0, "b"], + [50792, 0, "y"], + [50793, 0, " "], + [50794, 0, "B"], + [50795, 0, "u"], + [50796, 0, "r"], + [50797, 0, "c"], + [50798, 0, "k"], + [50799, 0, "h"], + [50800, 0, "a"], + [50801, 0, "r"], + [50802, 0, "d"], + [50803, 0, "t"], + [50804, 0, " "], + [50805, 0, "e"], + [50806, 0, "t"], + [50807, 0, " "], + [50808, 0, "a"], + [50809, 0, "l"], + [50810, 0, "."], + [50811, 0, "~"], + [50812, 0, "\\"], + [50813, 0, "c"], + [50814, 0, "i"], + [50815, 0, "t"], + [50816, 0, "e"], + [50817, 0, "{"], + [50818, 0, "B"], + [50819, 0, "u"], + [50820, 0, "r"], + [50821, 0, "c"], + [50822, 0, "k"], + [50823, 0, "h"], + [50824, 0, "a"], + [50825, 0, "r"], + [50826, 0, "d"], + [50827, 0, "t"], + [50828, 0, ":"], + [50829, 0, "2"], + [50830, 0, "0"], + [50831, 0, "1"], + [50832, 0, "2"], + [50833, 0, "j"], + [50834, 0, "y"], + [50835, 0, "}"], + [50836, 0, ","], + [50837, 0, " "], + [50838, 0, "p"], + [50839, 0, "e"], + [50840, 0, "r"], + [50841, 0, "f"], + [50842, 0, "o"], + [50843, 0, "r"], + [50844, 0, "m"], + [50845, 0, "s"], + [50846, 0, " "], + [50847, 0, "n"], + [50848, 0, "e"], + [50849, 0, "t"], + [50850, 0, "w"], + [50851, 0, "o"], + [50852, 0, "r"], + [50853, 0, "k"], + [50854, 0, " "], + [50855, 0, "c"], + [50856, 0, "o"], + [50857, 0, "m"], + [50858, 0, "m"], + [50859, 0, "u"], + [50860, 0, "n"], + [50861, 0, "i"], + [50862, 0, "c"], + [50863, 0, "a"], + [50864, 0, "t"], + [50865, 0, "i"], + [50866, 0, "o"], + [50867, 0, "n"], + [50868, 0, ":"], + [50869, 0, " "], + [50870, 0, "s"], + [50871, 0, "e"], + [50872, 0, "n"], + [50873, 0, "d"], + [50874, 0, "i"], + [50875, 0, "n"], + [50876, 0, "g"], + [50877, 0, " "], + [50878, 0, "a"], + [50879, 0, "n"], + [50880, 0, "d"], + [50881, 0, " "], + [50882, 0, "r"], + [50883, 0, "e"], + [50884, 0, "c"], + [50885, 0, "e"], + [50886, 0, "i"], + [50887, 0, "v"], + [50888, 0, "i"], + [50889, 0, "n"], + [50890, 0, "g"], + [50891, 0, " "], + [50892, 0, "o"], + [50893, 0, "p"], + [50894, 0, "e"], + [50895, 0, "r"], + [50896, 0, "a"], + [50897, 0, "t"], + [50898, 0, "i"], + [50899, 0, "o"], + [50900, 0, "n"], + [50901, 0, "s"], + [50902, 0, " "], + [50903, 0, "t"], + [50904, 0, "o"], + [50905, 0, " "], + [50906, 0, "a"], + [50907, 0, "n"], + [50908, 0, "d"], + [50909, 0, " "], + [50910, 0, "f"], + [50911, 0, "r"], + [50912, 0, "o"], + [50913, 0, "m"], + [50914, 0, " "], + [50915, 0, "o"], + [50916, 0, "t"], + [50917, 0, "h"], + [50918, 0, "e"], + [50919, 0, "r"], + [50920, 0, " "], + [50921, 0, "p"], + [50922, 0, "e"], + [50923, 0, "e"], + [50924, 0, "r"], + [50925, 0, "s"], + [50926, 0, ","], + [50927, 0, " "], + [50928, 0, "a"], + [50929, 0, "n"], + [50930, 0, "d"], + [50931, 0, " "], + [50932, 0, "a"], + [50933, 0, "p"], + [50934, 0, "p"], + [50935, 0, "l"], + [50936, 0, "y"], + [50937, 0, "i"], + [50938, 0, "n"], + [50939, 0, "g"], + [50940, 0, " "], + [50941, 0, "o"], + [50942, 0, "p"], + [50943, 0, "e"], + [50944, 0, "r"], + [50945, 0, "a"], + [50946, 0, "t"], + [50947, 0, "i"], + [50948, 0, "o"], + [50949, 0, "n"], + [50950, 0, "s"], + [50951, 0, " "], + [50952, 0, "f"], + [50953, 0, "r"], + [50954, 0, "o"], + [50955, 0, "m"], + [50956, 0, " "], + [50957, 0, "r"], + [50958, 0, "e"], + [50959, 0, "m"], + [50960, 0, "o"], + [50961, 0, "t"], + [50962, 0, "e"], + [50963, 0, " "], + [50964, 0, "p"], + [50965, 0, "e"], + [50966, 0, "e"], + [50967, 0, "r"], + [50968, 0, "s"], + [50969, 0, "."], + [50970, 1], + [50970, 0, " "], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50975, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [50981, 1], + [51101, 1], + [51100, 1], + [51099, 1], + [51098, 1], + [51097, 1], + [51096, 1], + [51095, 1], + [51094, 1], + [51079, 1], + [51078, 1], + [51077, 1], + [51076, 1], + [14330, 1], + [14329, 1], + [14328, 1], + [14327, 1], + [14326, 1], + [14325, 1], + [14324, 1], + [14323, 1], + [14322, 1], + [14321, 1], + [14320, 1], + [14319, 1], + [14318, 1], + [14317, 1], + [14316, 1], + [14315, 1], + [14314, 1], + [14313, 1], + [14312, 1], + [14311, 1], + [14310, 1], + [14309, 1], + [14308, 1], + [14307, 1], + [14306, 1], + [14305, 1], + [14304, 1], + [14303, 1], + [14302, 1], + [14301, 1], + [14300, 1], + [14299, 1], + [14298, 1], + [14297, 1], + [14296, 1], + [14295, 1], + [14294, 1], + [14293, 1], + [14292, 1], + [14291, 1], + [14290, 1], + [14289, 1], + [14288, 1], + [14287, 1], + [14286, 1], + [14285, 1], + [14284, 1], + [14283, 1], + [14282, 1], + [14281, 1], + [14280, 1], + [14279, 1], + [14278, 1], + [14277, 1], + [14277, 0, "W"], + [14278, 0, "e"], + [14279, 0, " "], + [14280, 0, "b"], + [14281, 0, "e"], + [14282, 0, "l"], + [14283, 0, "i"], + [14284, 0, "e"], + [14285, 0, "v"], + [14286, 0, "e"], + [14287, 0, " "], + [14288, 0, "t"], + [14289, 0, "h"], + [14290, 0, "a"], + [14291, 0, "t"], + [14292, 0, " "], + [14293, 0, "c"], + [14294, 0, "o"], + [14295, 0, "n"], + [14296, 0, "f"], + [14297, 0, "l"], + [14298, 0, "i"], + [14299, 0, "c"], + [14300, 0, "t"], + [15264, 0, " "], + [15265, 0, "T"], + [15266, 0, "h"], + [15267, 0, "e"], + [15268, 0, " "], + [15269, 0, "p"], + [15270, 0, "o"], + [15271, 0, "s"], + [15272, 0, "s"], + [15273, 0, "i"], + [15274, 0, "b"], + [15275, 0, "i"], + [15276, 0, "l"], + [15277, 0, "i"], + [15278, 0, "t"], + [15279, 0, "y"], + [15280, 0, " "], + [15281, 0, "o"], + [15282, 0, "f"], + [15283, 0, " "], + [15284, 0, "t"], + [15285, 0, "e"], + [15286, 0, "n"], + [15287, 0, "t"], + [15288, 0, "a"], + [15289, 0, "t"], + [15290, 0, "i"], + [15291, 0, "v"], + [15292, 0, "e"], + [15293, 0, " "], + [15294, 0, "t"], + [15295, 0, "r"], + [15296, 0, "a"], + [15297, 0, "n"], + [15298, 0, "s"], + [15299, 0, "a"], + [15300, 0, "c"], + [15301, 0, "t"], + [15302, 0, "i"], + [15303, 0, "o"], + [15304, 0, "n"], + [15305, 0, "s"], + [15306, 0, " "], + [15307, 0, "l"], + [15308, 0, "a"], + [15309, 0, "t"], + [15310, 0, "e"], + [15311, 0, "r"], + [15312, 0, " "], + [15313, 0, "b"], + [15314, 0, "e"], + [15315, 0, "i"], + [15316, 0, "n"], + [15317, 0, "g"], + [15318, 0, " "], + [15319, 0, "r"], + [15320, 0, "o"], + [15321, 0, "l"], + [15322, 0, "l"], + [15323, 0, "e"], + [15324, 0, "d"], + [15325, 0, " "], + [15326, 0, "b"], + [15327, 0, "a"], + [15328, 0, "c"], + [15329, 0, "k"], + [15330, 0, " "], + [15331, 0, "a"], + [15332, 0, "l"], + [15333, 0, "s"], + [15334, 0, "o"], + [15335, 0, " "], + [15336, 0, "o"], + [15337, 0, "p"], + [15338, 0, "e"], + [15339, 0, "n"], + [15340, 0, "s"], + [15341, 0, " "], + [15342, 0, "t"], + [15343, 0, "h"], + [15344, 0, "e"], + [15345, 0, " "], + [15346, 0, "r"], + [15347, 0, "i"], + [15348, 0, "s"], + [15349, 0, "k"], + [15350, 0, " "], + [15351, 0, "o"], + [15352, 0, "f"], + [15353, 0, " "], + [15354, 0, "u"], + [15355, 0, "s"], + [15356, 0, "e"], + [15357, 0, "r"], + [15358, 0, " "], + [15359, 0, "i"], + [15360, 0, "n"], + [15361, 0, "p"], + [15362, 0, "u"], + [15363, 0, "t"], + [15364, 0, " "], + [15365, 0, "b"], + [15366, 0, "e"], + [15367, 0, "i"], + [15368, 0, "n"], + [15369, 0, "g"], + [15370, 0, " "], + [15371, 0, "l"], + [15372, 0, "o"], + [15373, 0, "s"], + [15374, 0, "t"], + [15375, 0, "."], + [15455, 0, "\n"], + [15456, 0, "\n"], + [15455, 0, " "], + [15456, 0, "i"], + [15457, 0, "n"], + [15458, 0, "t"], + [15459, 0, "r"], + [15460, 0, "o"], + [15461, 0, "d"], + [15462, 0, "u"], + [15463, 0, "c"], + [15464, 0, "e"], + [15465, 0, " "], + [15466, 0, "o"], + [15467, 0, "u"], + [15468, 0, "r"], + [15469, 0, " "], + [15470, 0, "a"], + [15471, 0, "p"], + [15472, 0, "p"], + [15473, 0, "r"], + [15474, 0, "o"], + [15475, 0, "a"], + [15476, 0, "c"], + [15477, 0, "h"], + [15478, 0, " "], + [15479, 0, "t"], + [15480, 0, "o"], + [15481, 0, " "], + [15456, 0, "i"], + [15457, 0, "n"], + [15458, 0, "f"], + [15459, 0, "o"], + [15460, 0, "r"], + [15461, 0, "m"], + [15462, 0, "a"], + [15463, 0, "l"], + [15464, 0, "l"], + [15465, 0, "y"], + [15466, 0, " "], + [15493, 0, "c"], + [15494, 0, "o"], + [15495, 0, "l"], + [15496, 0, "l"], + [15497, 0, "a"], + [15498, 0, "b"], + [15499, 0, "o"], + [15500, 0, "r"], + [15501, 0, "a"], + [15502, 0, "t"], + [15503, 0, "i"], + [15504, 0, "v"], + [15505, 0, "e"], + [15506, 0, " "], + [15507, 0, "e"], + [15508, 0, "d"], + [15509, 0, "i"], + [15510, 0, "t"], + [15511, 0, "i"], + [15512, 0, "n"], + [15513, 0, "g"], + [15514, 0, " "], + [15515, 0, "o"], + [15516, 0, "f"], + [15517, 0, " "], + [15518, 0, "J"], + [15519, 0, "S"], + [15520, 0, "O"], + [15521, 0, "N"], + [15522, 0, " "], + [15523, 0, "d"], + [15524, 0, "a"], + [15525, 0, "t"], + [15526, 0, "a"], + [15527, 0, " "], + [15528, 0, "s"], + [15529, 0, "t"], + [15530, 0, "r"], + [15531, 0, "u"], + [15532, 0, "c"], + [15533, 0, "t"], + [15534, 0, "u"], + [15535, 0, "r"], + [15536, 0, "e"], + [15537, 0, "s"], + [15538, 0, "."], + [15539, 0, " "], + [15540, 0, "A"], + [15541, 0, " "], + [15542, 0, "f"], + [15543, 0, "o"], + [15544, 0, "r"], + [15545, 0, "m"], + [15546, 0, "a"], + [15547, 0, "l"], + [15548, 0, " "], + [15549, 0, "p"], + [15550, 0, "r"], + [15551, 0, "e"], + [15552, 0, "s"], + [15553, 0, "e"], + [15554, 0, "n"], + [15555, 0, "t"], + [15556, 0, "a"], + [15557, 0, "t"], + [15558, 0, "i"], + [15559, 0, "o"], + [15560, 0, "n"], + [15561, 0, " "], + [15562, 0, "o"], + [15563, 0, "f"], + [15564, 0, " "], + [15565, 0, "t"], + [15566, 0, "h"], + [15567, 0, "e"], + [15568, 0, " "], + [15569, 0, "a"], + [15570, 0, "l"], + [15571, 0, "g"], + [15572, 0, "o"], + [15573, 0, "r"], + [15574, 0, "i"], + [15575, 0, "t"], + [15576, 0, "h"], + [15577, 0, "m"], + [15578, 0, " "], + [15579, 0, "f"], + [15580, 0, "o"], + [15581, 0, "l"], + [15582, 0, "l"], + [15583, 0, "o"], + [15584, 0, "w"], + [15585, 0, "s"], + [15586, 0, " "], + [15587, 0, "i"], + [15588, 0, "n"], + [15589, 0, " "], + [15590, 0, "s"], + [15591, 0, "e"], + [15592, 0, "c"], + [15593, 0, "t"], + [15594, 0, "i"], + [15595, 0, "o"], + [15596, 0, "n"], + [15597, 0, "~"], + [15598, 0, "\\"], + [15599, 0, "r"], + [15600, 0, "e"], + [15601, 0, "f"], + [15602, 0, "{"], + [15603, 0, "s"], + [15604, 0, "e"], + [15605, 0, "c"], + [15606, 0, ":"], + [15607, 0, "s"], + [15608, 0, "e"], + [15609, 0, "m"], + [15610, 0, "a"], + [15611, 0, "n"], + [15612, 0, "t"], + [15613, 0, "i"], + [15614, 0, "c"], + [15615, 0, "s"], + [15616, 0, "}"], + [15617, 0, "."], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [15620, 1], + [16624, 1], + [16623, 1], + [16622, 1], + [16621, 1], + [16620, 1], + [16619, 1], + [16618, 1], + [16617, 1], + [16616, 1], + [16615, 1], + [16614, 1], + [16613, 1], + [16612, 1], + [16611, 1], + [16610, 1], + [16609, 1], + [16608, 1], + [16607, 1], + [16606, 1], + [16605, 1], + [16604, 1], + [16603, 1], + [16602, 1], + [16601, 1], + [16600, 1], + [16599, 1], + [16598, 1], + [16597, 1], + [16596, 1], + [16595, 1], + [16594, 1], + [16593, 1], + [16592, 1], + [16591, 1], + [16590, 1], + [16589, 1], + [16588, 1], + [16587, 1], + [16586, 1], + [16585, 1], + [16584, 1], + [16583, 1], + [16582, 1], + [16581, 1], + [16580, 1], + [16579, 1], + [16578, 1], + [16577, 1], + [16576, 1], + [16575, 1], + [16574, 1], + [16573, 1], + [16572, 1], + [16571, 1], + [16570, 1], + [16569, 1], + [16568, 1], + [16567, 1], + [16566, 1], + [16565, 1], + [16564, 1], + [16563, 1], + [16562, 1], + [16561, 1], + [16560, 1], + [16559, 1], + [16558, 1], + [16557, 1], + [16556, 1], + [16555, 1], + [16554, 1], + [16553, 1], + [16552, 1], + [16551, 1], + [16550, 1], + [16549, 1], + [16548, 1], + [16547, 1], + [16546, 1], + [16545, 1], + [16544, 1], + [16543, 1], + [16542, 1], + [16541, 1], + [16540, 1], + [16539, 1], + [16538, 1], + [16537, 1], + [16536, 1], + [16535, 1], + [16534, 1], + [16533, 1], + [16532, 1], + [16531, 1], + [16530, 1], + [16529, 1], + [16528, 1], + [16527, 1], + [16526, 1], + [16525, 1], + [16524, 1], + [16523, 1], + [16522, 1], + [16521, 1], + [16520, 1], + [16519, 1], + [16518, 1], + [16517, 1], + [16516, 1], + [16515, 1], + [16514, 1], + [16514, 0, "T"], + [16561, 0, " "], + [16562, 0, "w"], + [16563, 0, "h"], + [16564, 0, "e"], + [16565, 0, "n"], + [16566, 0, " "], + [16567, 0, "J"], + [16568, 0, "S"], + [16569, 0, "O"], + [16570, 0, "N"], + [16571, 0, " "], + [16572, 0, "d"], + [16573, 0, "o"], + [16574, 0, "c"], + [16575, 0, "u"], + [16576, 0, "m"], + [16577, 0, "e"], + [16578, 0, "n"], + [16579, 0, "t"], + [16580, 0, "s"], + [16581, 0, " "], + [16582, 0, "a"], + [16583, 0, "r"], + [16584, 0, "e"], + [16585, 0, " "], + [16586, 0, "c"], + [16587, 0, "o"], + [16588, 0, "n"], + [16589, 0, "c"], + [16590, 0, "u"], + [16591, 0, "r"], + [16592, 0, "r"], + [16593, 0, "e"], + [16594, 0, "n"], + [16595, 0, "t"], + [16596, 0, "l"], + [16597, 0, "y"], + [16598, 0, " "], + [16599, 0, "m"], + [16600, 0, "o"], + [16601, 0, "d"], + [16602, 0, "i"], + [16603, 0, "f"], + [16604, 0, "i"], + [16605, 0, "e"], + [16606, 0, "d"], + [16607, 0, ","], + [16608, 0, " "], + [16609, 0, "w"], + [16610, 0, "e"], + [16611, 0, " "], + [16612, 0, "p"], + [16613, 0, "r"], + [16614, 0, "e"], + [16615, 0, "s"], + [16616, 0, "e"], + [16617, 0, "n"], + [16618, 0, "t"], + [16619, 0, " "], + [16620, 0, "s"], + [16621, 0, "o"], + [16622, 0, "m"], + [16623, 0, "e"], + [16624, 0, " "], + [16625, 0, "e"], + [16626, 0, "x"], + [16627, 0, "a"], + [16628, 0, "m"], + [16629, 0, "p"], + [16630, 0, "l"], + [16631, 0, "e"], + [16632, 0, "s"], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [24966, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [5857, 1], + [6535, 0, "d"], + [6536, 0, "e"], + [6537, 0, "y"], + [6538, 0, "a"], + [6539, 0, "l"], + [6540, 0, "y"], + [6540, 1], + [6539, 1], + [6538, 1], + [6537, 1], + [6537, 0, "l"], + [6538, 0, "a"], + [6539, 0, "y"], + [6540, 0, ","], + [6541, 0, " "], + [6550, 1], + [6550, 1], + [6550, 0, "a"], + [6551, 0, "n"], + [6552, 0, "d"], + [6499, 1], + [6498, 1], + [6497, 1], + [6497, 0, "W"], + [6498, 0, "e"], + [6499, 0, " "], + [6500, 0, "a"], + [6501, 0, "s"], + [6502, 0, "s"], + [6503, 0, "u"], + [6504, 0, "m"], + [6505, 0, "e"], + [6506, 0, " "], + [6507, 0, "t"], + [6508, 0, "h"], + [6509, 0, "e"], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 1], + [6519, 0, "m"], + [6520, 0, "a"], + [6521, 0, "y"], + [7143, 1], + [7142, 1], + [7141, 1], + [7140, 1], + [7139, 1], + [7139, 0, "t"], + [7140, 0, "h"], + [7141, 0, "r"], + [7142, 0, "e"], + [7143, 0, "e"], + [26310, 1], + [26310, 1], + [26310, 1], + [26310, 1], + [26310, 1], + [26310, 0, "r"], + [26311, 0, "e"], + [26312, 0, "p"], + [26313, 0, "l"], + [26314, 0, "i"], + [26315, 0, "c"], + [26316, 0, "a"], + [26317, 0, "s"], + [26342, 1], + [26342, 1], + [26342, 1], + [26342, 1], + [26342, 0, "r"], + [26343, 0, "e"], + [26344, 0, "p"], + [26345, 0, "l"], + [26346, 0, "i"], + [26347, 0, "c"], + [26348, 0, "a"], + [26667, 1], + [26666, 1], + [26665, 1], + [26664, 1], + [26663, 1], + [26663, 0, "r"], + [26664, 0, "e"], + [26665, 0, "p"], + [26666, 0, "l"], + [26667, 0, "i"], + [26668, 0, "c"], + [26669, 0, "a"], + [26670, 0, "s"], + [31466, 1], + [31465, 1], + [31464, 1], + [31463, 1], + [31463, 0, "r"], + [31464, 0, "e"], + [31465, 0, "o"], + [31465, 1], + [31465, 0, "p"], + [31466, 0, "l"], + [31467, 0, "i"], + [31468, 0, "c"], + [31469, 0, "a"], + [36842, 1], + [36842, 1], + [36842, 1], + [36842, 1], + [36842, 0, "r"], + [36843, 0, "e"], + [36844, 0, "p"], + [36845, 0, "l"], + [36846, 0, "i"], + [36847, 0, "c"], + [36848, 0, "a"], + [37072, 1], + [37072, 1], + [37072, 1], + [37072, 1], + [37072, 0, "r"], + [37073, 0, "e"], + [37074, 0, "p"], + [37075, 0, "l"], + [37076, 0, "i"], + [37077, 0, "c"], + [37078, 0, "a"], + [37121, 1], + [37120, 1], + [37119, 1], + [37118, 1], + [37117, 1], + [37117, 0, "r"], + [37118, 0, "e"], + [37119, 0, "p"], + [37120, 0, "l"], + [37121, 0, "i"], + [37122, 0, "c"], + [37123, 0, "a"], + [37124, 0, "s"], + [37274, 1], + [37273, 1], + [37272, 1], + [37271, 1], + [37271, 0, "r"], + [37272, 0, "e"], + [37273, 0, "p"], + [37274, 0, "l"], + [37275, 0, "i"], + [37276, 0, "c"], + [37277, 0, "a"], + [37319, 1], + [37318, 1], + [37317, 1], + [37316, 1], + [37316, 0, "r"], + [37317, 0, "e"], + [37318, 0, "p"], + [37319, 0, "l"], + [37320, 0, "i"], + [37321, 0, "c"], + [37322, 0, "a"], + [38268, 1], + [38268, 1], + [38268, 1], + [38268, 1], + [38268, 0, "r"], + [38269, 0, "e"], + [38270, 0, "p"], + [38271, 0, "l"], + [38272, 0, "i"], + [38273, 0, "c"], + [38274, 0, "a"], + [38953, 1], + [38952, 1], + [38951, 1], + [38950, 1], + [38950, 0, "r"], + [38951, 0, "e"], + [38952, 0, "p"], + [38953, 0, "l"], + [38954, 0, "i"], + [38955, 0, "c"], + [38956, 0, "a"], + [42126, 1], + [42125, 1], + [42124, 1], + [42123, 1], + [42123, 0, "r"], + [42124, 0, "e"], + [42125, 0, "p"], + [42126, 0, "l"], + [42127, 0, "i"], + [42128, 0, "c"], + [42129, 0, "a"], + [42241, 1], + [42241, 1], + [42241, 1], + [42241, 1], + [42241, 0, "r"], + [42242, 0, "e"], + [42243, 0, "p"], + [42244, 0, "l"], + [42245, 0, "i"], + [42246, 0, "c"], + [42247, 0, "a"], + [42542, 1], + [42542, 1], + [42542, 1], + [42542, 1], + [42542, 0, "r"], + [42543, 0, "e"], + [42544, 0, "p"], + [42545, 0, "l"], + [42546, 0, "i"], + [42547, 0, "c"], + [42548, 0, "a"], + [42745, 1], + [42745, 1], + [42745, 1], + [42745, 1], + [42745, 0, "r"], + [42746, 0, "e"], + [42747, 0, "p"], + [42748, 0, "l"], + [42749, 0, "i"], + [42750, 0, "c"], + [42751, 0, "a"], + [42757, 1], + [42757, 1], + [42757, 1], + [42757, 1], + [42757, 0, "r"], + [42758, 0, "e"], + [42759, 0, "p"], + [42760, 0, "l"], + [42761, 0, "i"], + [42762, 0, "c"], + [42763, 0, "a"], + [42805, 1], + [42805, 1], + [42805, 1], + [42805, 1], + [42805, 0, "r"], + [42806, 0, "e"], + [42807, 0, "p"], + [42808, 0, "l"], + [42809, 0, "i"], + [42810, 0, "c"], + [42811, 0, "a"], + [42812, 0, "s"], + [43395, 1], + [43394, 1], + [43393, 1], + [43392, 1], + [43392, 0, "r"], + [43393, 0, "e"], + [43394, 0, "p"], + [43395, 0, "l"], + [43396, 0, "i"], + [43397, 0, "c"], + [43398, 0, "a"], + [43399, 0, "s"], + [43399, 1], + [43513, 1], + [43512, 1], + [43511, 1], + [43510, 1], + [43510, 0, "R"], + [43511, 0, "e"], + [43512, 0, "p"], + [43513, 0, "l"], + [43514, 0, "i"], + [43515, 0, "c"], + [43516, 0, "a"], + [43619, 1], + [43619, 1], + [43619, 0, " "], + [43620, 0, "k"], + [43557, 1], + [43556, 1], + [43555, 1], + [43554, 1], + [43554, 0, "r"], + [43555, 0, "e"], + [43556, 0, "p"], + [43557, 0, "l"], + [43558, 0, "i"], + [43559, 0, "c"], + [43560, 0, "a"], + [43688, 1], + [43688, 1], + [43688, 1], + [43689, 0, "e"], + [43690, 0, "p"], + [43691, 0, "l"], + [43692, 0, "i"], + [43693, 0, "c"], + [43694, 0, "a"], + [43747, 1], + [43746, 1], + [43745, 1], + [43744, 1], + [43744, 0, "r"], + [43745, 0, "e"], + [43746, 0, "p"], + [43747, 0, "l"], + [43748, 0, "i"], + [43749, 0, "c"], + [43750, 0, "a"], + [43865, 1], + [43865, 1], + [43865, 1], + [43866, 0, "e"], + [43867, 0, "p"], + [43868, 0, "l"], + [43869, 0, "i"], + [43870, 0, "c"], + [43871, 0, "a"], + [44956, 1], + [44955, 1], + [44954, 1], + [44953, 1], + [44953, 0, "R"], + [44954, 0, "e"], + [44955, 0, "p"], + [44956, 0, "l"], + [44957, 0, "i"], + [44958, 0, "c"], + [44959, 0, "a"], + [45026, 1], + [45026, 1], + [45026, 1], + [45026, 1], + [45026, 0, "R"], + [45027, 0, "e"], + [45028, 0, "p"], + [45029, 0, "l"], + [45030, 0, "i"], + [45031, 0, "c"], + [45032, 0, "a"], + [46450, 1], + [46449, 1], + [46448, 1], + [46449, 0, "e"], + [46450, 0, "p"], + [46451, 0, "l"], + [46452, 0, "i"], + [46453, 0, "c"], + [46454, 0, "a"], + [46508, 1], + [46507, 1], + [46506, 1], + [46505, 1], + [46505, 0, "r"], + [46506, 0, "e"], + [46507, 0, "p"], + [46508, 0, "l"], + [46509, 0, "i"], + [46510, 0, "c"], + [46511, 0, "a"], + [48978, 1], + [48977, 1], + [48976, 1], + [48975, 1], + [48975, 0, "R"], + [48976, 0, "e"], + [48977, 0, "p"], + [48978, 0, "l"], + [48979, 0, "i"], + [48980, 0, "c"], + [48981, 0, "a"], + [50587, 1], + [50587, 1], + [50587, 1], + [50587, 1], + [50587, 1], + [50587, 0, "r"], + [50588, 0, "e"], + [50589, 0, "p"], + [50590, 0, "l"], + [50591, 0, "i"], + [50592, 0, "c"], + [50593, 0, "s"], + [50593, 1], + [50593, 0, "a"], + [50594, 0, "s"], + [50633, 1], + [50633, 1], + [50633, 1], + [50634, 0, "e"], + [50635, 0, "p"], + [50636, 0, "l"], + [50637, 0, "i"], + [50638, 0, "c"], + [50639, 0, "a"], + [50919, 1], + [50919, 1], + [50919, 1], + [50920, 0, "e"], + [50921, 0, "p"], + [50922, 0, "l"], + [50923, 0, "i"], + [50924, 0, "c"], + [50925, 0, "a"], + [50951, 1], + [50951, 1], + [50951, 1], + [50952, 0, "e"], + [50953, 0, "p"], + [50954, 0, "l"], + [50955, 0, "i"], + [50956, 0, "c"], + [50957, 0, "a"], + [50980, 1], + [50979, 1], + [50978, 1], + [50979, 0, "e"], + [50980, 0, "p"], + [50981, 0, "l"], + [50982, 0, "i"], + [50983, 0, "c"], + [50984, 0, "a"], + [51328, 1], + [51328, 1], + [51328, 1], + [51329, 0, "e"], + [51330, 0, "p"], + [51331, 0, "l"], + [51332, 0, "i"], + [51333, 0, "c"], + [51334, 0, "a"], + [51400, 1], + [51400, 1], + [51400, 1], + [51401, 0, "e"], + [51402, 0, "p"], + [51403, 0, "l"], + [51404, 0, "i"], + [51405, 0, "c"], + [51406, 0, "a"], + [51463, 1], + [51463, 1], + [51463, 1], + [51464, 0, "e"], + [51465, 0, "p"], + [51466, 0, "l"], + [51467, 0, "i"], + [51468, 0, "c"], + [51469, 0, "a"], + [58123, 1], + [58123, 1], + [58123, 1], + [58124, 0, "e"], + [58125, 0, "p"], + [58126, 0, "l"], + [58127, 0, "i"], + [58128, 0, "c"], + [58129, 0, "a"], + [59556, 1], + [59555, 1], + [59554, 1], + [59553, 1], + [59552, 1], + [59552, 0, "r"], + [59553, 0, "e"], + [59554, 0, "p"], + [59555, 0, "l"], + [59556, 0, "i"], + [59557, 0, "c"], + [59558, 0, "a"], + [59559, 0, "s"], + [59768, 1], + [59767, 1], + [59766, 1], + [59767, 0, "e"], + [59768, 0, "p"], + [59769, 0, "l"], + [59770, 0, "i"], + [59771, 0, "c"], + [59772, 0, "a"], + [44117, 1], + [44117, 1], + [44117, 1], + [44118, 0, "e"], + [44119, 0, "p"], + [44120, 0, "l"], + [44121, 0, "i"], + [44122, 0, "c"], + [44123, 0, "a"], + [37082, 1], + [37081, 1], + [37081, 0, "q"], + [37056, 1], + [37055, 1], + [37054, 1], + [37053, 1], + [37053, 0, "q"], + [42328, 1], + [42327, 1], + [42326, 1], + [42325, 1], + [42324, 1], + [42323, 1], + [42322, 1], + [42321, 1], + [42320, 1], + [42319, 1], + [42318, 1], + [42317, 1], + [42316, 1], + [42315, 1], + [42314, 1], + [42313, 1], + [42312, 1], + [42311, 1], + [42310, 1], + [42309, 1], + [42308, 1], + [42307, 1], + [42306, 1], + [42305, 1], + [42304, 1], + [42303, 1], + [42302, 1], + [42301, 1], + [42300, 1], + [42299, 1], + [42298, 1], + [42297, 1], + [42296, 1], + [42295, 1], + [42294, 1], + [42293, 1], + [42292, 1], + [42291, 1], + [42290, 1], + [42289, 1], + [42288, 1], + [42287, 1], + [42286, 1], + [42285, 1], + [42284, 1], + [42283, 1], + [42282, 1], + [42281, 1], + [42280, 1], + [42279, 1], + [42278, 1], + [42758, 1], + [42717, 0, " "], + [42718, 0, "a"], + [42719, 0, "n"], + [42730, 1], + [42716, 1], + [42715, 1], + [42714, 1], + [42713, 1], + [42712, 1], + [42711, 1], + [42710, 1], + [42709, 1], + [42708, 1], + [42707, 1], + [42706, 1], + [42705, 1], + [42704, 1], + [42703, 1], + [42702, 1], + [42701, 1], + [42701, 0, "f"], + [42702, 0, "t"], + [42703, 0, "e"], + [42704, 0, "r"], + [42718, 0, " "], + [42719, 0, "i"], + [42720, 0, "s"], + [42734, 1], + [42733, 1], + [42732, 1], + [42731, 1], + [42731, 0, "a"], + [42747, 0, ","], + [42748, 0, " "], + [42749, 1], + [42749, 0, "i"], + [42750, 0, "t"], + [42751, 0, " "], + [42752, 0, "i"], + [42753, 0, "s"], + [42754, 0, " "], + [42755, 0, "a"], + [42756, 0, "p"], + [42757, 0, "p"], + [42758, 0, "l"], + [42759, 0, "i"], + [42760, 0, "e"], + [42761, 0, "d"], + [42762, 0, " "], + [42763, 0, "l"], + [42764, 0, "o"], + [42765, 0, "c"], + [42766, 0, "a"], + [42767, 0, "l"], + [42768, 0, "l"], + [42769, 0, "y"], + [42733, 0, "f"], + [42734, 0, "r"], + [42735, 0, "o"], + [42736, 0, "m"], + [42737, 0, " "], + [43240, 0, " "], + [43241, 0, "f"], + [43242, 0, "o"], + [43243, 0, "r"], + [43244, 0, " "], + [43245, 0, "p"], + [43246, 0, "e"], + [43247, 0, "r"], + [43241, 1], + [43247, 0, "f"], + [43248, 0, "o"], + [43249, 0, "r"], + [43250, 0, "m"], + [43251, 0, "e"], + [43252, 0, "d"], + [43253, 0, " "], + [43254, 0, "t"], + [43255, 0, "h"], + [43256, 0, "e"], + [43257, 0, " "], + [43258, 0, "r"], + [43259, 0, "e"], + [43260, 0, "g"], + [43261, 0, "i"], + [43262, 0, "s"], + [43263, 0, "t"], + [43264, 0, "e"], + [43265, 0, "r"], + [43266, 0, " "], + [43267, 0, "a"], + [43268, 0, "s"], + [43269, 0, "s"], + [43270, 0, "i"], + [43271, 0, "g"], + [43272, 0, "n"], + [43273, 0, "m"], + [43274, 0, "e"], + [43275, 0, "n"], + [43276, 0, "t"], + [43277, 0, "s"], + [44080, 0, "c"], + [44081, 0, "a"], + [44082, 0, "u"], + [44083, 0, "s"], + [44084, 0, "a"], + [44085, 0, "l"], + [44086, 0, "l"], + [44087, 0, "y"], + [44088, 0, " "], + [44615, 1], + [16201, 0, "."], + [18549, 0, "."], + [20512, 0, "."], + [22183, 0, "."], + [25695, 0, "."], + [26128, 0, "."], + [36795, 1], + [36794, 1], + [36793, 1], + [36792, 1], + [36791, 1], + [36790, 1], + [36789, 1], + [36788, 1], + [36787, 1], + [36786, 1], + [36785, 1], + [36784, 1], + [36783, 1], + [36782, 1], + [36781, 1], + [36780, 1], + [36779, 1], + [36778, 1], + [36777, 1], + [36777, 0, "s"], + [36766, 1], + [36765, 1], + [36764, 1], + [36775, 0, "."], + [49427, 0, "."], + [57463, 1], + [57462, 1], + [57461, 1], + [57460, 1], + [57459, 1], + [57458, 1], + [57457, 1], + [57456, 1], + [57455, 1], + [57454, 1], + [57454, 0, "a"], + [57455, 0, "p"], + [57456, 0, "p"], + [57457, 0, "l"], + [57458, 0, "y"], + [57459, 0, "i"], + [57460, 0, "n"], + [57461, 0, "g"], + [57462, 0, " "], + [57463, 0, "i"], + [57464, 0, "n"], + [57465, 0, "s"], + [57466, 0, "e"], + [57467, 0, "r"], + [57468, 0, "t"], + [57469, 0, "i"], + [57470, 0, "o"], + [57471, 0, "n"], + [57472, 0, " "], + [57473, 0, "a"], + [57474, 0, "n"], + [57475, 0, "d"], + [57476, 0, " "], + [57477, 0, "a"], + [57478, 0, "s"], + [57479, 0, "s"], + [57480, 0, "i"], + [57481, 0, "g"], + [57482, 0, "n"], + [57483, 0, "m"], + [57484, 0, "e"], + [57485, 0, "n"], + [57486, 0, "t"], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 1], + [57498, 0, "."], + [57498, 0, " "], + [57499, 0, "t"], + [57500, 0, "o"], + [57501, 0, " "], + [57502, 0, "t"], + [57503, 0, "h"], + [57504, 0, "e"], + [57505, 0, " "], + [57506, 0, "s"], + [57507, 0, "t"], + [57508, 0, "a"], + [57509, 0, "t"], + [57510, 0, "e"], + [57511, 0, " "], + [57512, 0, "o"], + [57513, 0, "f"], + [57514, 0, " "], + [57515, 0, "a"], + [57516, 0, " "], + [57517, 0, "r"], + [57518, 0, "e"], + [57519, 0, "p"], + [57520, 0, "l"], + [57521, 0, "i"], + [57522, 0, "c"], + [57523, 0, "a"], + [57502, 0, "u"], + [57503, 0, "p"], + [57504, 0, "d"], + [57505, 0, "a"], + [57506, 0, "t"], + [57507, 0, "e"], + [57508, 0, " "], + [64749, 1], + [64748, 1], + [64747, 1], + [64746, 1], + [64745, 1], + [64744, 1], + [64743, 1], + [64742, 1], + [64741, 1], + [64740, 1], + [64739, 1], + [64738, 1], + [64737, 1], + [64736, 1], + [64735, 1], + [64734, 1], + [64733, 1], + [64732, 1], + [64731, 1], + [64730, 1], + [64729, 1], + [64728, 1], + [64723, 0, "a"], + [64724, 0, "p"], + [64725, 0, "p"], + [64726, 0, "l"], + [64727, 0, "y"], + [64728, 0, "i"], + [64729, 0, "n"], + [64730, 0, "g"], + [64731, 0, " "], + [64737, 0, "i"], + [64738, 0, "o"], + [64739, 0, "n"], + [64740, 0, " "], + [64741, 0, "o"], + [64742, 0, "p"], + [64743, 0, "e"], + [64744, 0, "r"], + [64745, 0, "a"], + [64746, 0, "t"], + [64747, 0, "i"], + [64748, 0, "o"], + [64749, 0, "n"], + [64750, 0, "s"], + [64751, 0, " "], + [64752, 0, "t"], + [64753, 0, "o"], + [64754, 0, " "], + [64755, 0, "r"], + [64756, 0, "e"], + [64757, 0, "p"], + [64758, 0, "l"], + [64759, 0, "i"], + [64760, 0, "c"], + [64761, 0, "a"], + [64762, 0, " "], + [64763, 0, "s"], + [64764, 0, "t"], + [64765, 0, "a"], + [64766, 0, "t"], + [64767, 0, "e"], + [64768, 0, "."], + [64755, 1], + [64755, 1], + [64755, 1], + [64755, 1], + [64755, 1], + [64755, 1], + [64755, 1], + [64755, 0, "u"], + [64756, 0, "p"], + [64757, 0, "d"], + [64758, 0, "a"], + [64759, 0, "t"], + [64760, 0, "e"], + [64761, 0, " "], + [64762, 0, "t"], + [64763, 0, "h"], + [64764, 0, "e"], + [64765, 0, " "], + [64765, 1], + [64771, 0, " "], + [64772, 0, "o"], + [64773, 0, "f"], + [64774, 0, " "], + [64775, 0, "a"], + [64776, 0, " "], + [64777, 0, "r"], + [64778, 0, "e"], + [64779, 0, "p"], + [64780, 0, "l"], + [64781, 0, "i"], + [64782, 0, "c"], + [64783, 0, "a"], + [49471, 1], + [49471, 1], + [49471, 1], + [49471, 1], + [49471, 1], + [49471, 1], + [49471, 1], + [49976, 1], + [49975, 1], + [49974, 1], + [49973, 1], + [49972, 1], + [49971, 1], + [49970, 1], + [49969, 1], + [49968, 1], + [49967, 1], + [49966, 1], + [49965, 1], + [49965, 0, "r"], + [49966, 0, "e"], + [49967, 0, "p"], + [49968, 0, "l"], + [49969, 0, "i"], + [49970, 0, "c"], + [49971, 0, "a"], + [49972, 0, " "], + [49973, 0, "$"], + [49974, 0, "p"], + [49975, 0, "$"], + [52675, 0, "\\"], + [52676, 0, "v"], + [52677, 0, "s"], + [52678, 0, "p"], + [52679, 0, "a"], + [52680, 0, "c"], + [52681, 0, "e"], + [52682, 0, "{"], + [52683, 0, "6"], + [52684, 0, "p"], + [52685, 0, "t"], + [52686, 0, "}"], + [53305, 0, "\\"], + [53306, 0, "v"], + [53307, 0, "s"], + [53308, 0, "p"], + [53309, 0, "a"], + [53310, 0, "c"], + [53311, 0, "e"], + [53312, 0, "{"], + [53313, 0, "6"], + [53314, 0, "p"], + [53315, 0, "t"], + [53316, 0, "}"], + [53920, 0, "\\"], + [53921, 0, "v"], + [53922, 0, "s"], + [53923, 0, "p"], + [53924, 0, "a"], + [53925, 0, "c"], + [53926, 0, "e"], + [53927, 0, "{"], + [53928, 0, "6"], + [53929, 0, "p"], + [53930, 0, "t"], + [53931, 0, "}"], + [54324, 0, "\\"], + [54325, 0, "v"], + [54326, 0, "s"], + [54327, 0, "p"], + [54328, 0, "a"], + [54329, 0, "c"], + [54330, 0, "e"], + [54331, 0, "{"], + [54332, 0, "6"], + [54333, 0, "p"], + [54334, 0, "t"], + [54335, 0, "}"], + [55050, 0, "\\"], + [55051, 0, "v"], + [55052, 0, "s"], + [55053, 0, "p"], + [55054, 0, "a"], + [55055, 0, "c"], + [55056, 0, "e"], + [55057, 0, "{"], + [55058, 0, "6"], + [55059, 0, "p"], + [55060, 0, "t"], + [55061, 0, "}"], + [55675, 0, "\\"], + [55676, 0, "v"], + [55677, 0, "s"], + [55678, 0, "p"], + [55679, 0, "a"], + [55680, 0, "c"], + [55681, 0, "e"], + [55682, 0, "{"], + [55683, 0, "6"], + [55684, 0, "p"], + [55685, 0, "t"], + [55686, 0, "}"], + [56290, 0, "\\"], + [56291, 0, "v"], + [56292, 0, "s"], + [56293, 0, "p"], + [56294, 0, "a"], + [56295, 0, "c"], + [56296, 0, "e"], + [56297, 0, "{"], + [56298, 0, "6"], + [56299, 0, "p"], + [56300, 0, "t"], + [56301, 0, "}"], + [56990, 0, "\\"], + [56991, 0, "v"], + [56992, 0, "s"], + [56993, 0, "p"], + [56994, 0, "a"], + [56995, 0, "c"], + [56996, 0, "e"], + [56997, 0, "{"], + [56998, 0, "6"], + [56999, 0, "p"], + [57000, 0, "t"], + [57001, 0, "}"], + [57842, 0, " "], + [57843, 0, "T"], + [57844, 0, "h"], + [57845, 0, "e"], + [57846, 0, " "], + [57847, 0, "c"], + [57848, 0, "o"], + [57849, 0, "n"], + [57850, 0, "t"], + [57851, 0, "e"], + [57852, 0, "x"], + [57853, 0, "t"], + [57854, 0, " "], + [57855, 0, "i"], + [57856, 0, "s"], + [57857, 0, " "], + [57858, 0, "i"], + [57859, 0, "n"], + [57860, 0, "i"], + [57861, 0, "t"], + [57862, 0, "i"], + [57863, 0, "a"], + [57864, 0, "l"], + [57865, 0, "l"], + [57866, 0, "y"], + [57867, 0, " "], + [57868, 0, "t"], + [57869, 0, "h"], + [57870, 0, "e"], + [57871, 0, " "], + [57872, 0, "r"], + [57873, 0, "e"], + [57874, 0, "p"], + [57875, 0, "l"], + [57876, 0, "i"], + [57877, 0, "c"], + [57878, 0, "a"], + [57879, 0, " "], + [57880, 0, "s"], + [57881, 0, "t"], + [57882, 0, "a"], + [57883, 0, "t"], + [57884, 0, "e"], + [57885, 0, "$"], + [57885, 1], + [57885, 0, " "], + [57886, 0, "$"], + [57887, 0, "A"], + [57888, 0, "-"], + [57888, 1], + [57888, 0, "_"], + [57889, 0, "p"], + [57890, 0, "$"], + [57891, 0, ","], + [57892, 0, " "], + [57893, 0, "b"], + [57894, 0, "u"], + [57895, 0, "t"], + [57896, 0, " "], + [57897, 0, "m"], + [57898, 0, "a"], + [57899, 0, "y"], + [57900, 0, " "], + [57901, 0, "r"], + [57902, 0, "e"], + [57903, 0, "f"], + [57904, 0, "e"], + [57905, 0, "r"], + [57906, 0, " "], + [57907, 0, "t"], + [57908, 0, "o"], + [57909, 0, " "], + [57910, 0, "i"], + [57911, 0, "n"], + [57912, 0, "n"], + [57913, 0, "e"], + [57914, 0, "r"], + [57915, 0, " "], + [57916, 0, "p"], + [57917, 0, "a"], + [57918, 0, "r"], + [57919, 0, "t"], + [57920, 0, "s"], + [57921, 0, " "], + [57922, 0, "o"], + [57923, 0, "f"], + [57924, 0, " "], + [57925, 0, "t"], + [57926, 0, "h"], + [57927, 0, "e"], + [57928, 0, " "], + [57929, 0, "s"], + [57930, 0, "t"], + [57931, 0, "a"], + [57932, 0, "t"], + [57933, 0, "e"], + [57934, 0, " "], + [57935, 0, "a"], + [57936, 0, "s"], + [57937, 0, " "], + [57938, 0, "r"], + [57939, 0, "u"], + [57940, 0, "l"], + [57941, 0, "e"], + [57942, 0, "s"], + [57943, 0, " "], + [57944, 0, "a"], + [57945, 0, "r"], + [57946, 0, "e"], + [57947, 0, " "], + [57948, 0, "r"], + [57949, 0, "e"], + [57950, 0, "c"], + [57951, 0, "u"], + [57952, 0, "r"], + [57953, 0, "s"], + [57954, 0, "i"], + [57955, 0, "v"], + [57956, 0, "e"], + [57957, 0, "l"], + [57958, 0, "y"], + [57959, 0, " "], + [57960, 0, "a"], + [57961, 0, "p"], + [57962, 0, "p"], + [57963, 0, "l"], + [57964, 0, "i"], + [57965, 0, "e"], + [57966, 0, "d"], + [57967, 0, "."], + [57920, 1], + [57919, 1], + [57918, 1], + [57917, 1], + [57916, 1], + [57915, 1], + [57914, 1], + [57913, 1], + [57912, 1], + [57911, 1], + [57910, 1], + [57910, 0, "s"], + [57911, 0, "u"], + [57912, 0, "b"], + [57913, 0, "t"], + [57914, 0, "r"], + [57915, 0, "e"], + [57916, 0, "e"], + [57917, 0, "s"], + [58990, 0, " "], + [58991, 0, "p"], + [58992, 0, "r"], + [58993, 0, "i"], + [58994, 0, "m"], + [58995, 0, "i"], + [58996, 0, "t"], + [58997, 0, "i"], + [58998, 0, "v"], + [58999, 0, "e"], + [59000, 0, " "], + [59001, 0, "v"], + [59002, 0, "a"], + [59003, 0, "l"], + [59004, 0, "u"], + [59005, 0, "e"], + [59006, 0, " "], + [59007, 0, "t"], + [59008, 0, "o"], + [59009, 0, " "], + [59010, 0, "a"], + [59980, 0, " "], + [59981, 0, "O"], + [59982, 0, "u"], + [59983, 0, "r"], + [59984, 0, " "], + [59985, 0, "a"], + [59986, 0, "p"], + [59987, 0, "p"], + [59988, 0, "r"], + [59989, 0, "o"], + [59990, 0, "a"], + [59991, 0, "c"], + [59992, 0, "h"], + [59993, 0, " "], + [59994, 0, "f"], + [59995, 0, "o"], + [59996, 0, "r"], + [59997, 0, " "], + [59998, 0, "h"], + [59999, 0, "a"], + [60000, 0, "n"], + [60001, 0, "d"], + [60002, 0, "l"], + [60003, 0, "i"], + [60004, 0, "n"], + [60005, 0, "g"], + [60006, 0, " "], + [60007, 0, "i"], + [60008, 0, "n"], + [60009, 0, "s"], + [60010, 0, "e"], + [60011, 0, "r"], + [60012, 0, "t"], + [60013, 0, "i"], + [60014, 0, "o"], + [60015, 0, "n"], + [60016, 0, "s"], + [60017, 0, " "], + [60018, 0, "i"], + [60019, 0, "s"], + [60020, 0, " "], + [60021, 0, "b"], + [60022, 0, "a"], + [60023, 0, "s"], + [60024, 0, "e"], + [60025, 0, "d"], + [60026, 0, " "], + [60027, 0, "o"], + [60028, 0, "n"], + [60029, 0, " "], + [60030, 0, "t"], + [60031, 0, "h"], + [60032, 0, "e"], + [60033, 0, " "], + [60034, 0, "R"], + [60035, 0, "G"], + [60036, 0, "A"], + [60037, 0, " "], + [60038, 0, "a"], + [60039, 0, "l"], + [60040, 0, "g"], + [60041, 0, "o"], + [60042, 0, "r"], + [60043, 0, "i"], + [60044, 0, "t"], + [60045, 0, "h"], + [60046, 0, "m"], + [60047, 0, "~"], + [60048, 0, "\\"], + [60049, 0, "c"], + [60050, 0, "i"], + [60051, 0, "t"], + [60052, 0, "e"], + [60053, 0, "{"], + [60054, 0, "R"], + [60055, 0, "o"], + [60056, 0, "h"], + [60057, 0, ":"], + [60058, 0, "2"], + [60059, 0, "0"], + [60060, 0, "1"], + [60061, 0, "1"], + [60062, 0, "d"], + [60063, 0, "w"], + [60064, 0, "}"], + [60065, 0, "."], + [65318, 0, ","], + [65319, 0, " "], + [65320, 0, "a"], + [65321, 0, "s"], + [65322, 0, " "], + [65323, 0, "i"], + [65324, 0, "l"], + [65325, 0, "l"], + [65326, 0, "u"], + [65327, 0, "s"], + [65328, 0, "t"], + [65329, 0, "r"], + [65330, 0, "a"], + [65331, 0, "t"], + [65332, 0, "e"], + [65333, 0, "d"], + [65334, 0, " "], + [65335, 0, "i"], + [65336, 0, "n"], + [65337, 0, " "], + [65338, 0, "F"], + [65339, 0, "i"], + [65340, 0, "g"], + [65341, 0, "u"], + [65342, 0, "r"], + [65343, 0, "e"], + [65344, 0, "~"], + [65345, 0, "\\"], + [65346, 0, "r"], + [65347, 0, "e"], + [65348, 0, "f"], + [65349, 0, "{"], + [65350, 0, "f"], + [65351, 0, "i"], + [65352, 0, "g"], + [65353, 0, ":"], + [65354, 0, "m"], + [65355, 0, "a"], + [65356, 0, "p"], + [65357, 0, "-"], + [65358, 0, "r"], + [65359, 0, "e"], + [65360, 0, "m"], + [65361, 0, "o"], + [65362, 0, "v"], + [65363, 0, "e"], + [65364, 0, "}"], + [4322, 1], + [4322, 0, "S"], + [5713, 1], + [5713, 0, "S"], + [6951, 1], + [6951, 0, "S"], + [7856, 1], + [7856, 0, "S"], + [8258, 1], + [8258, 0, "S"], + [9345, 1], + [9345, 0, "S"], + [14871, 1], + [14871, 0, "S"], + [15320, 1], + [15320, 0, "S"], + [67329, 0, "\n"], + [67330, 0, "\\"], + [67331, 0, "s"], + [67332, 0, "u"], + [67333, 0, "b"], + [67334, 0, "s"], + [67335, 0, "e"], + [67336, 0, "c"], + [67337, 0, "t"], + [67338, 0, "i"], + [67339, 0, "o"], + [67340, 0, "n"], + [67341, 0, "{"], + [67342, 0, "C"], + [67343, 0, "o"], + [67344, 0, "n"], + [67345, 0, "v"], + [67346, 0, "e"], + [67347, 0, "r"], + [67348, 0, "g"], + [67349, 0, "e"], + [67350, 0, "n"], + [67351, 0, "c"], + [67352, 0, "e"], + [67353, 0, "}"], + [67354, 0, "\\"], + [67355, 0, "l"], + [67356, 0, "a"], + [67357, 0, "b"], + [67358, 0, "e"], + [67359, 0, "l"], + [67360, 0, "{"], + [67361, 0, "s"], + [67362, 0, "e"], + [67363, 0, "c"], + [67364, 0, ":"], + [67365, 0, "c"], + [67366, 0, "o"], + [67367, 0, "n"], + [67368, 0, "v"], + [67369, 0, "e"], + [67370, 0, "r"], + [67371, 0, "g"], + [67372, 0, "e"], + [67373, 0, "n"], + [67374, 0, "c"], + [67375, 0, "e"], + [67376, 0, "}"], + [67377, 0, "\n"], + [67378, 0, "\n"], + [5855, 0, "l"], + [5856, 0, "a"], + [5857, 0, "b"], + [5857, 1], + [5856, 1], + [5855, 1], + [5855, 0, "\\"], + [5856, 0, "l"], + [5857, 0, "a"], + [5858, 0, "b"], + [5859, 0, "e"], + [5860, 0, "l"], + [5861, 0, "{"], + [5862, 0, "s"], + [5863, 0, "e"], + [5864, 0, "c"], + [5865, 0, ":"], + [5866, 0, "i"], + [5867, 0, "n"], + [5868, 0, "t"], + [5869, 0, "r"], + [5870, 0, "o"], + [5871, 0, "-"], + [5872, 0, "r"], + [5873, 0, "e"], + [5874, 0, "p"], + [5875, 0, "l"], + [5876, 0, "i"], + [5877, 0, "c"], + [5878, 0, "a"], + [5879, 0, "t"], + [5880, 0, "i"], + [5881, 0, "o"], + [5882, 0, "n"], + [5883, 0, "}"], + [67408, 0, "A"], + [67409, 0, "s"], + [67410, 0, " "], + [67411, 0, "o"], + [67412, 0, "u"], + [67413, 0, "t"], + [67414, 0, "l"], + [67415, 0, "i"], + [67416, 0, "n"], + [67417, 0, "e"], + [67418, 0, "d"], + [67419, 0, " "], + [67420, 0, "i"], + [67421, 0, "n"], + [67422, 0, " "], + [67423, 0, "S"], + [67424, 0, "e"], + [67425, 0, "c"], + [67426, 0, "t"], + [67427, 0, "i"], + [67428, 0, "o"], + [67429, 0, "n"], + [67430, 0, "~"], + [67431, 0, "\\"], + [67432, 0, "r"], + [67433, 0, "e"], + [67434, 0, "f"], + [67435, 0, "{"], + [67436, 0, "s"], + [67437, 0, "e"], + [67438, 0, "c"], + [67439, 0, ":"], + [67440, 0, "i"], + [67441, 0, "n"], + [67442, 0, "t"], + [67443, 0, "r"], + [67444, 0, "o"], + [67445, 0, "-"], + [67446, 0, "r"], + [67447, 0, "e"], + [67448, 0, "p"], + [67449, 0, "l"], + [67450, 0, "i"], + [67451, 0, "c"], + [67452, 0, "a"], + [67453, 0, "t"], + [67454, 0, "i"], + [67455, 0, "o"], + [67456, 0, "n"], + [67457, 0, "}"], + [67458, 0, ","], + [67459, 0, " "], + [67460, 0, "w"], + [67461, 0, "e"], + [67462, 0, " "], + [67463, 0, "r"], + [67464, 0, "e"], + [67465, 0, "q"], + [67466, 0, "u"], + [67467, 0, "i"], + [67468, 0, "r"], + [67469, 0, "e"], + [67470, 0, " "], + [67471, 0, "t"], + [67472, 0, "h"], + [67473, 0, "a"], + [67474, 0, "t"], + [67475, 0, " "], + [67476, 0, "a"], + [67477, 0, "l"], + [67478, 0, "l"], + [67479, 0, " "], + [67480, 0, "r"], + [67481, 0, "e"], + [67482, 0, "p"], + [67483, 0, "l"], + [67484, 0, "i"], + [67485, 0, "c"], + [67486, 0, "a"], + [67487, 0, "s"], + [67488, 0, " "], + [67489, 0, "a"], + [67490, 0, "u"], + [67491, 0, "t"], + [67492, 0, "o"], + [67493, 0, "m"], + [67494, 0, "a"], + [67495, 0, "t"], + [67496, 0, "i"], + [67497, 0, "c"], + [67498, 0, "a"], + [67499, 0, "l"], + [67500, 0, "l"], + [67501, 0, "y"], + [67502, 0, " "], + [67503, 0, "c"], + [67504, 0, "o"], + [67505, 0, "n"], + [67506, 0, "v"], + [67507, 0, "e"], + [67508, 0, "r"], + [67509, 0, "g"], + [67510, 0, "e"], + [67511, 0, " "], + [67512, 0, "t"], + [67513, 0, "o"], + [67514, 0, "w"], + [67515, 0, "a"], + [67516, 0, "r"], + [67517, 0, "d"], + [67518, 0, "s"], + [67519, 0, " "], + [67520, 0, "t"], + [67521, 0, "h"], + [67522, 0, "e"], + [67523, 0, " "], + [67524, 0, "s"], + [67525, 0, "a"], + [67526, 0, "m"], + [67527, 0, "e"], + [67528, 0, " "], + [67529, 0, "s"], + [67530, 0, "t"], + [67531, 0, "a"], + [67532, 0, "t"], + [67533, 0, "e"], + [67534, 0, "."], + [67535, 0, " "], + [67536, 0, "T"], + [67537, 0, "h"], + [67538, 0, "i"], + [67538, 1], + [67537, 1], + [67536, 1], + [67534, 0, " "], + [67535, 0, "-"], + [67536, 0, "-"], + [67537, 0, " "], + [67538, 0, "a"], + [67539, 0, " "], + [67540, 0, "k"], + [67541, 0, "e"], + [67542, 0, "y"], + [67543, 0, " "], + [67544, 0, "r"], + [67545, 0, "e"], + [67546, 0, "q"], + [67547, 0, "u"], + [67548, 0, "i"], + [67549, 0, "r"], + [67550, 0, "e"], + [67551, 0, "m"], + [67552, 0, "e"], + [67553, 0, "n"], + [67554, 0, "t"], + [67555, 0, " "], + [67556, 0, "o"], + [67557, 0, "f"], + [67558, 0, " "], + [67559, 0, "a"], + [67560, 0, " "], + [67561, 0, "C"], + [67562, 0, "R"], + [67563, 0, "D"], + [67564, 0, "T"], + [67567, 0, "W"], + [67568, 0, "e"], + [67569, 0, " "], + [67570, 0, "n"], + [67571, 0, "o"], + [67572, 0, "w"], + [67573, 0, " "], + [67574, 0, "f"], + [67575, 0, "o"], + [67576, 0, "r"], + [67577, 0, "m"], + [67578, 0, "a"], + [67579, 0, "l"], + [67580, 0, "i"], + [67581, 0, "z"], + [67582, 0, "e"], + [67583, 0, " "], + [67584, 0, "t"], + [67585, 0, "h"], + [67586, 0, "i"], + [67587, 0, "s"], + [67588, 0, " "], + [67589, 0, "n"], + [67590, 0, "o"], + [67591, 0, "t"], + [67592, 0, "i"], + [67593, 0, "o"], + [67594, 0, "n"], + [67595, 0, ","], + [67596, 0, " "], + [67597, 0, "a"], + [67598, 0, "n"], + [67599, 0, "d"], + [67600, 0, " "], + [67601, 0, "s"], + [67602, 0, "h"], + [67603, 0, "o"], + [67604, 0, "w"], + [67605, 0, " "], + [67606, 0, "t"], + [67607, 0, "h"], + [67608, 0, "a"], + [67609, 0, "t"], + [67610, 0, " "], + [67611, 0, "t"], + [67612, 0, "h"], + [67613, 0, "e"], + [67614, 0, " "], + [67615, 0, "r"], + [67616, 0, "u"], + [67617, 0, "l"], + [67618, 0, "e"], + [67619, 0, "s"], + [67620, 0, " "], + [67621, 0, "i"], + [67622, 0, "n"], + [67623, 0, " "], + [67624, 0, "F"], + [67625, 0, "i"], + [67626, 0, "g"], + [67627, 0, "u"], + [67628, 0, "r"], + [67629, 0, "e"], + [67630, 0, "s"], + [67631, 0, "~"], + [67632, 0, "\\"], + [67633, 0, "r"], + [67634, 0, "e"], + [67635, 0, "f"], + [67636, 0, "{"], + [67637, 0, "f"], + [67638, 0, "i"], + [67639, 0, "g"], + [67640, 0, ":"], + [67641, 0, "e"], + [67642, 0, "x"], + [67643, 0, "p"], + [67644, 0, "r"], + [67645, 0, "-"], + [67646, 0, "r"], + [67647, 0, "u"], + [67648, 0, "l"], + [67649, 0, "e"], + [67650, 0, "s"], + [67651, 0, "}"], + [67652, 0, " "], + [67653, 0, "t"], + [67654, 0, "o"], + [67655, 0, " "], + [67655, 1], + [67655, 0, "~"], + [67656, 0, "\\"], + [67657, 0, "r"], + [67658, 0, "e"], + [67659, 0, "f"], + [67660, 0, "{"], + [67661, 0, "f"], + [67662, 0, "i"], + [67663, 0, "g"], + [67664, 0, ":"], + [67665, 0, "c"], + [67666, 0, "l"], + [67667, 0, "e"], + [67668, 0, "a"], + [67669, 0, "r"], + [67670, 0, "-"], + [67671, 0, "r"], + [67672, 0, "u"], + [67673, 0, "l"], + [67674, 0, "e"], + [67675, 0, "s"], + [67676, 0, "}"], + [67677, 0, " "], + [67678, 0, "s"], + [67679, 0, "a"], + [67680, 0, "t"], + [67681, 0, "i"], + [67682, 0, "s"], + [67683, 0, "f"], + [67684, 0, "y"], + [67685, 0, " "], + [67686, 0, "t"], + [67687, 0, "h"], + [67688, 0, "i"], + [67689, 0, "s"], + [67690, 0, " "], + [67691, 0, "r"], + [67692, 0, "e"], + [67693, 0, "q"], + [67694, 0, "u"], + [67695, 0, "i"], + [67696, 0, "r"], + [67697, 0, "e"], + [67698, 0, "m"], + [67699, 0, "e"], + [67700, 0, "n"], + [67701, 0, "t"], + [67702, 0, "."], + [318, 0, "\n"], + [319, 0, "%"], + [320, 0, " "], + [321, 0, "T"], + [322, 0, "h"], + [323, 0, "e"], + [324, 0, "o"], + [325, 0, "r"], + [326, 0, "e"], + [327, 0, "m"], + [328, 0, " "], + [329, 0, "e"], + [330, 0, "n"], + [331, 0, "v"], + [332, 0, "i"], + [333, 0, "r"], + [334, 0, "o"], + [335, 0, "n"], + [336, 0, "m"], + [337, 0, "e"], + [338, 0, "n"], + [339, 0, "t"], + [340, 0, "s"], + [341, 0, "\n"], + [342, 0, "\\"], + [343, 0, "u"], + [344, 0, "s"], + [345, 0, "e"], + [346, 0, "p"], + [347, 0, "a"], + [348, 0, "c"], + [349, 0, "k"], + [350, 0, "a"], + [351, 0, "g"], + [352, 0, "e"], + [353, 0, "{"], + [354, 0, "a"], + [355, 0, "m"], + [356, 0, "s"], + [357, 0, "t"], + [358, 0, "h"], + [359, 0, "m"], + [360, 0, "}"], + [361, 0, "\n"], + [362, 0, "\n"], + [362, 0, "\\"], + [363, 0, "n"], + [364, 0, "e"], + [365, 0, "w"], + [366, 0, "t"], + [367, 0, "h"], + [368, 0, "e"], + [369, 0, "o"], + [370, 0, "r"], + [371, 0, "e"], + [372, 0, "m"], + [373, 0, "{"], + [374, 0, "t"], + [375, 0, "h"], + [376, 0, "e"], + [377, 0, "o"], + [378, 0, "r"], + [379, 0, "e"], + [380, 0, "m"], + [381, 0, "}"], + [382, 0, "{"], + [383, 0, "T"], + [384, 0, "h"], + [385, 0, "e"], + [386, 0, "o"], + [387, 0, "r"], + [388, 0, "e"], + [389, 0, "m"], + [390, 0, "}"], + [391, 0, "\n"], + [392, 0, "\\"], + [393, 0, "n"], + [394, 0, "e"], + [395, 0, "w"], + [396, 0, "t"], + [397, 0, "h"], + [398, 0, "e"], + [399, 0, "o"], + [400, 0, "r"], + [401, 0, "e"], + [402, 0, "m"], + [403, 0, "{"], + [404, 0, "l"], + [405, 0, "e"], + [406, 0, "m"], + [407, 0, "m"], + [408, 0, "a"], + [409, 0, "}"], + [410, 0, "["], + [411, 0, "t"], + [412, 0, "h"], + [413, 0, "e"], + [414, 0, "o"], + [415, 0, "r"], + [416, 0, "e"], + [417, 0, "m"], + [418, 0, "]"], + [419, 0, "{"], + [420, 0, "L"], + [421, 0, "e"], + [422, 0, "m"], + [423, 0, "m"], + [424, 0, "a"], + [425, 0, "}"], + [581, 1], + [580, 1], + [579, 1], + [578, 1], + [578, 0, "f"], + [579, 0, "a"], + [580, 0, "l"], + [581, 0, "s"], + [582, 0, "e"], + [361, 0, "\n"], + [362, 0, "\\"], + [363, 0, "n"], + [364, 0, "e"], + [365, 0, "w"], + [366, 0, "t"], + [367, 0, "h"], + [368, 0, "e"], + [369, 0, "o"], + [370, 0, "r"], + [371, 0, "e"], + [372, 0, "m"], + [373, 0, "{"], + [374, 0, "d"], + [375, 0, "e"], + [376, 0, "f"], + [377, 0, "i"], + [378, 0, "n"], + [379, 0, "i"], + [380, 0, "t"], + [381, 0, "i"], + [382, 0, "o"], + [383, 0, "n"], + [384, 0, "}"], + [385, 0, "{"], + [386, 0, "D"], + [387, 0, "e"], + [388, 0, "f"], + [389, 0, "i"], + [390, 0, "n"], + [391, 0, "i"], + [392, 0, "t"], + [393, 0, "i"], + [394, 0, "o"], + [395, 0, "n"], + [396, 0, "}"], + [67849, 0, "\n"], + [67850, 0, "\n"], + [67851, 0, "\\"], + [67852, 0, "b"], + [67853, 0, "e"], + [67854, 0, "g"], + [67855, 0, "i"], + [67856, 0, "n"], + [67857, 0, "{"], + [67858, 0, "d"], + [67859, 0, "e"], + [67860, 0, "f"], + [67861, 0, "i"], + [67862, 0, "n"], + [67863, 0, "i"], + [67864, 0, "t"], + [67865, 0, "i"], + [67866, 0, "o"], + [67867, 0, "n"], + [67868, 0, "}"], + [67869, 0, "\n"], + [67870, 0, "\\"], + [67871, 0, "e"], + [67872, 0, "n"], + [67873, 0, "d"], + [67874, 0, "{"], + [67875, 0, "d"], + [67876, 0, "e"], + [67877, 0, "f"], + [67878, 0, "i"], + [67879, 0, "n"], + [67880, 0, "i"], + [67881, 0, "t"], + [67882, 0, "i"], + [67883, 0, "o"], + [67884, 0, "n"], + [67885, 0, "}"], + [67869, 0, "\n"], + [67870, 0, "A"], + [67871, 0, " "], + [67872, 0, "\\"], + [67873, 0, "e"], + [67874, 0, "m"], + [67875, 0, "p"], + [67876, 0, "h"], + [67877, 0, "{"], + [67878, 0, "v"], + [67879, 0, "a"], + [67880, 0, "l"], + [67881, 0, "i"], + [67882, 0, "d"], + [67883, 0, " "], + [67884, 0, "e"], + [67885, 0, "x"], + [67886, 0, "e"], + [67887, 0, "c"], + [67888, 0, "u"], + [67889, 0, "t"], + [67890, 0, "i"], + [67891, 0, "o"], + [67892, 0, "n"], + [67893, 0, "}"], + [67894, 0, " "], + [67895, 0, "i"], + [67896, 0, "s"], + [67897, 0, " "], + [67898, 0, "a"], + [67899, 0, " "], + [67900, 0, "s"], + [67901, 0, "e"], + [67901, 1], + [67900, 1], + [67900, 0, "s"], + [67901, 0, "e"], + [67902, 0, "t"], + [67903, 0, " "], + [67904, 0, "o"], + [67905, 0, "f"], + [67906, 0, " "], + [67907, 0, "o"], + [67908, 0, "p"], + [67909, 0, "e"], + [67910, 0, "r"], + [67911, 0, "a"], + [67912, 0, "t"], + [67913, 0, "i"], + [67914, 0, "o"], + [67915, 0, "n"], + [67916, 0, "s"], + [67917, 0, " "], + [67918, 0, "g"], + [67919, 0, "e"], + [67920, 0, "n"], + [67921, 0, "e"], + [67922, 0, "r"], + [67923, 0, "a"], + [67924, 0, "t"], + [67925, 0, "e"], + [67926, 0, "d"], + [67927, 0, " "], + [67928, 0, "b"], + [67929, 0, "y"], + [67930, 0, " "], + [67931, 0, "a"], + [67932, 0, " "], + [67933, 0, "s"], + [67934, 0, "e"], + [67935, 0, "t"], + [67936, 0, " "], + [67937, 0, "o"], + [67938, 0, "f"], + [67939, 0, " "], + [67940, 0, "r"], + [67941, 0, "e"], + [67942, 0, "p"], + [67943, 0, "l"], + [67944, 0, "i"], + [67945, 0, "c"], + [67946, 0, "a"], + [67947, 0, "s"], + [67948, 0, " "], + [67949, 0, "$"], + [67950, 0, "\\"], + [67951, 0, "{"], + [67952, 0, "p"], + [67953, 0, "_"], + [67954, 0, "1"], + [67955, 0, ","], + [67956, 0, " "], + [67957, 0, "\\"], + [67958, 0, "d"], + [67959, 0, "o"], + [67960, 0, "t"], + [67961, 0, "s"], + [67962, 0, ","], + [67963, 0, " "], + [67964, 0, "p"], + [67965, 0, "_"], + [67966, 0, "k"], + [67967, 0, "\\"], + [67968, 0, "}"], + [67969, 0, " "], + [67970, 0, "="], + [67971, 0, " "], + [67972, 0, "\\"], + [67973, 0, "m"], + [67974, 0, "a"], + [67975, 0, "t"], + [67976, 0, "h"], + [67977, 0, "r"], + [67978, 0, "m"], + [67979, 0, "{"], + [67980, 0, "R"], + [67981, 0, "e"], + [67982, 0, "p"], + [67983, 0, "l"], + [67984, 0, "i"], + [67985, 0, "c"], + [67986, 0, "a"], + [67987, 0, "I"], + [67988, 0, "D"], + [67989, 0, "}"], + [67990, 0, "$"], + [67991, 0, ","], + [67992, 0, " "], + [67993, 0, "e"], + [67994, 0, "a"], + [67995, 0, "h"], + [67995, 1], + [67995, 0, "c"], + [67996, 0, "h"], + [67997, 0, " "], + [67998, 0, "r"], + [67999, 0, "e"], + [68000, 0, "d"], + [68001, 0, "u"], + [68002, 0, "c"], + [68003, 0, "i"], + [68004, 0, "n"], + [68005, 0, "g"], + [68006, 0, " "], + [68007, 0, "a"], + [68008, 0, " "], + [68009, 0, "s"], + [68010, 0, "e"], + [68011, 0, "q"], + [68012, 0, "u"], + [68013, 0, "e"], + [68014, 0, "n"], + [68015, 0, "c"], + [68016, 0, "e"], + [68017, 0, " "], + [68018, 0, "o"], + [68019, 0, "f"], + [68020, 0, " "], + [68021, 0, "c"], + [68022, 0, "o"], + [68023, 0, "m"], + [68024, 0, "m"], + [68025, 0, "a"], + [68026, 0, "n"], + [68027, 0, "d"], + [68028, 0, "s"], + [68029, 0, " "], + [68030, 0, "$"], + [68031, 0, "\\"], + [68032, 0, "l"], + [68033, 0, "a"], + [68034, 0, "n"], + [68035, 0, "g"], + [68036, 0, "l"], + [68037, 0, "e"], + [68038, 0, " "], + [68039, 0, "\\"], + [68040, 0, "m"], + [68041, 0, "a"], + [68042, 0, "t"], + [68043, 0, "h"], + [68044, 0, "i"], + [68045, 0, "t"], + [68046, 0, "{"], + [68047, 0, "c"], + [68048, 0, "m"], + [68049, 0, "d"], + [68050, 0, "}"], + [68051, 0, "_"], + [68052, 0, "1"], + [68053, 0, " "], + [68054, 0, "\\"], + [68055, 0, "m"], + [68056, 0, "a"], + [68057, 0, "t"], + [68058, 0, "h"], + [68059, 0, "b"], + [68060, 0, "i"], + [68061, 0, "n"], + [68062, 0, "{"], + [68063, 0, ";"], + [68064, 0, "}"], + [68065, 0, " "], + [68066, 0, "\\"], + [68067, 0, "d"], + [68068, 0, "o"], + [68069, 0, "t"], + [68070, 0, "s"], + [68071, 0, " "], + [68072, 0, "\\"], + [68073, 0, "m"], + [68074, 0, "a"], + [68075, 0, "t"], + [68076, 0, "h"], + [68077, 0, "b"], + [68078, 0, "i"], + [68079, 0, "n"], + [68080, 0, "{"], + [68081, 0, ";"], + [68082, 0, "]"], + [68082, 1], + [68082, 0, "}"], + [68083, 0, " "], + [68084, 0, "\\"], + [68085, 0, "m"], + [68086, 0, "a"], + [68087, 0, "t"], + [68088, 0, "h"], + [68089, 0, "i"], + [68090, 0, "t"], + [68091, 0, "{"], + [68092, 0, "c"], + [68093, 0, "m"], + [68094, 0, "d"], + [68095, 0, "}"], + [68096, 0, "_"], + [68097, 0, "n"], + [68098, 0, " "], + [68099, 0, "\\"], + [68100, 0, "r"], + [68101, 0, "a"], + [68102, 0, "n"], + [68103, 0, "g"], + [68104, 0, "l"], + [68105, 0, "e"], + [68106, 0, "$"], + [68107, 0, "."], + [68107, 0, " "], + [68108, 0, "w"], + [68109, 0, "i"], + [68110, 0, "t"], + [68111, 0, "h"], + [68112, 0, "o"], + [68113, 0, "u"], + [68114, 0, "t"], + [68115, 0, " "], + [68116, 0, "g"], + [68117, 0, "e"], + [68118, 0, "t"], + [68119, 0, "t"], + [68120, 0, "i"], + [68121, 0, "n"], + [68122, 0, "g"], + [68123, 0, " "], + [68124, 0, "s"], + [68125, 0, "t"], + [68126, 0, "u"], + [68127, 0, "c"], + [68128, 0, "k"], + [68147, 0, "\n"], + [68148, 0, "\n"], + [68149, 0, "B"], + [68150, 0, "y"], + [68151, 0, " "], + [68152, 0, "c"], + [68153, 0, "o"], + [68154, 0, "n"], + [68155, 0, "s"], + [68156, 0, "t"], + [68157, 0, "r"], + [68158, 0, "a"], + [68159, 0, "i"], + [68160, 0, "n"], + [68161, 0, "i"], + [68162, 0, "n"], + [68163, 0, "g"], + [68164, 0, " "], + [68165, 0, "t"], + [68166, 0, "h"], + [68167, 0, "e"], + [68168, 0, " "], + [68168, 1], + [68167, 1], + [68166, 1], + [68165, 1], + [68164, 1], + [68163, 1], + [68162, 1], + [68161, 1], + [68160, 1], + [68159, 1], + [68158, 1], + [68157, 1], + [68156, 1], + [68155, 1], + [68154, 1], + [68153, 1], + [68152, 1], + [68151, 1], + [68150, 1], + [68149, 1], + [68149, 0, "A"], + [68150, 0, " "], + [68151, 0, "r"], + [68152, 0, "e"], + [68153, 0, "d"], + [68154, 0, "u"], + [68155, 0, "c"], + [68156, 0, "t"], + [68157, 0, "i"], + [68158, 0, "o"], + [68159, 0, "n"], + [68160, 0, " "], + [68161, 0, "g"], + [68162, 0, "e"], + [68163, 0, "t"], + [68164, 0, "s"], + [68165, 0, " "], + [68166, 0, "s"], + [68167, 0, "t"], + [68168, 0, "u"], + [68169, 0, "c"], + [68170, 0, "k"], + [68171, 0, " "], + [68172, 0, "i"], + [68173, 0, "f"], + [68174, 0, " "], + [68175, 0, "i"], + [68176, 0, "t"], + [68177, 0, "s"], + [68178, 0, " "], + [68179, 0, "p"], + [68180, 0, "r"], + [68181, 0, "e"], + [68181, 1], + [68180, 1], + [68179, 1], + [68179, 0, "p"], + [68180, 0, "r"], + [68181, 0, "e"], + [68182, 0, "m"], + [68183, 0, "i"], + [68184, 0, "s"], + [68185, 0, "e"], + [68186, 0, "s"], + [68187, 0, " "], + [68188, 0, "c"], + [68189, 0, "a"], + [68190, 0, "n"], + [68191, 0, "n"], + [68192, 0, "o"], + [68192, 1], + [68191, 1], + [68190, 1], + [68189, 1], + [68188, 1], + [68187, 1], + [68186, 1], + [68185, 1], + [68184, 1], + [68183, 1], + [68182, 1], + [68181, 1], + [68180, 1], + [68179, 1], + [68178, 1], + [68177, 1], + [68176, 1], + [68175, 1], + [68175, 0, "a"], + [68176, 0, " "], + [68177, 0, "p"], + [68178, 0, "r"], + [68179, 0, "e"], + [68180, 0, "m"], + [68181, 0, "i"], + [68182, 0, "s"], + [68183, 0, "e"], + [68184, 0, " "], + [68185, 0, "i"], + [68186, 0, "n"], + [68187, 0, " "], + [68188, 0, "o"], + [68189, 0, "n"], + [68190, 0, "e"], + [68191, 0, " "], + [68192, 0, "o"], + [68193, 0, "f"], + [68194, 0, " "], + [68195, 0, "t"], + [68196, 0, "h"], + [68197, 0, "e"], + [68198, 0, " "], + [68199, 0, "r"], + [68200, 0, "u"], + [68201, 0, "l"], + [68202, 0, "e"], + [68203, 0, " "], + [68204, 0, "a"], + [68205, 0, "p"], + [68206, 0, "p"], + [68207, 0, "l"], + [68208, 0, "i"], + [68209, 0, "c"], + [68210, 0, "a"], + [68211, 0, "t"], + [68212, 0, "i"], + [68213, 0, "o"], + [68214, 0, "n"], + [68215, 0, "s"], + [68216, 0, " "], + [68217, 0, "c"], + [68218, 0, "a"], + [68219, 0, "n"], + [68220, 0, "n"], + [68221, 0, "o"], + [68222, 0, "t"], + [68223, 0, " "], + [68224, 0, "b"], + [68225, 0, "e"], + [68226, 0, " "], + [68227, 0, "s"], + [68228, 0, "a"], + [68229, 0, "t"], + [68230, 0, "i"], + [68231, 0, "s"], + [68232, 0, "f"], + [68233, 0, "i"], + [68234, 0, "e"], + [68235, 0, "d"], + [68236, 0, "."], + [68237, 0, " "], + [68238, 0, "F"], + [68239, 0, "o"], + [68240, 0, "r"], + [68241, 0, " "], + [68242, 0, "e"], + [68243, 0, "x"], + [68244, 0, "a"], + [68245, 0, "m"], + [68246, 0, "p"], + [68247, 0, "l"], + [68248, 0, "e"], + [68249, 0, ","], + [68250, 0, " "], + [68251, 0, "t"], + [68252, 0, "h"], + [68253, 0, "e"], + [68254, 0, " "], + [68255, 0, "\\"], + [68256, 0, "t"], + [68257, 0, "e"], + [68258, 0, "x"], + [68259, 0, "t"], + [68260, 0, "s"], + [68261, 0, "c"], + [68255, 0, "$"], + [68263, 0, "{"], + [68264, 0, "N"], + [68265, 0, "e"], + [68266, 0, "x"], + [68267, 0, "t"], + [68268, 0, "}"], + [68269, 0, "_"], + [68270, 0, "{"], + [68271, 0, "2"], + [68272, 0, ","], + [68273, 0, "3"], + [68274, 0, "}"], + [68275, 0, "$"], + [68276, 0, " "], + [68277, 0, "r"], + [68278, 0, "u"], + [68279, 0, "l"], + [68280, 0, "e"], + [68281, 0, "s"], + [68282, 0, " "], + [68283, 0, "i"], + [68284, 0, "n"], + [68285, 0, " "], + [68286, 0, "F"], + [68287, 0, "i"], + [68288, 0, "g"], + [68289, 0, "u"], + [68290, 0, "r"], + [68291, 0, "e"], + [68292, 0, "~"], + [68293, 0, "\\"], + [68294, 0, "r"], + [68295, 0, "e"], + [68296, 0, "f"], + [68297, 0, "{"], + [68298, 0, "f"], + [68299, 0, "i"], + [68300, 0, "g"], + [68301, 0, ":"], + [68302, 0, "e"], + [68303, 0, "x"], + [68304, 0, "p"], + [68305, 0, "r"], + [68306, 0, "-"], + [68307, 0, "r"], + [68308, 0, "u"], + [68309, 0, "l"], + [68310, 0, "e"], + [68311, 0, "s"], + [68312, 0, "}"], + [68313, 0, " "], + [68314, 0, "g"], + [68315, 0, "e"], + [68316, 0, "t"], + [68317, 0, " "], + [68318, 0, "s"], + [68319, 0, "t"], + [68320, 0, "u"], + [68321, 0, "c"], + [68322, 0, "k"], + [68323, 0, " "], + [68324, 0, "i"], + [68325, 0, "f"], + [68326, 0, " "], + [68327, 0, "\\"], + [68328, 0, "t"], + [68329, 0, "e"], + [68330, 0, "x"], + [68331, 0, "t"], + [68332, 0, "s"], + [68333, 0, "f"], + [68334, 0, "{"], + [68335, 0, "n"], + [68336, 0, "e"], + [68337, 0, "x"], + [68338, 0, "t"], + [68339, 0, "}"], + [68340, 0, " "], + [68341, 0, "t"], + [68342, 0, "r"], + [68343, 0, "i"], + [68344, 0, "e"], + [68345, 0, "s"], + [68346, 0, " "], + [68347, 0, "t"], + [68348, 0, "o"], + [68349, 0, " "], + [68350, 0, "i"], + [68351, 0, "t"], + [68352, 0, "e"], + [68353, 0, "r"], + [68354, 0, "a"], + [68355, 0, "t"], + [68356, 0, "e"], + [68357, 0, " "], + [68358, 0, "p"], + [68359, 0, "a"], + [68360, 0, "s"], + [68361, 0, "t"], + [68362, 0, " "], + [68363, 0, "t"], + [68364, 0, "h"], + [68365, 0, "e"], + [68366, 0, " "], + [68367, 0, "e"], + [68368, 0, "n"], + [68369, 0, "d"], + [68370, 0, " "], + [68371, 0, "o"], + [68372, 0, "f"], + [68373, 0, " "], + [68374, 0, "a"], + [68375, 0, " "], + [68376, 0, "l"], + [68377, 0, "i"], + [68378, 0, "s"], + [68379, 0, "t"], + [68380, 0, "."], + [68381, 0, " "], + [68382, 0, "B"], + [68383, 0, "y"], + [68384, 0, " "], + [68385, 0, "c"], + [68386, 0, "o"], + [68387, 0, "n"], + [68388, 0, "s"], + [68389, 0, "t"], + [68390, 0, "r"], + [68391, 0, "a"], + [68392, 0, "i"], + [68393, 0, "n"], + [68394, 0, "i"], + [68395, 0, "n"], + [68396, 0, "g"], + [68397, 0, " "], + [68398, 0, "e"], + [68399, 0, "x"], + [68400, 0, "e"], + [68400, 1], + [68399, 1], + [68398, 1], + [68398, 0, "v"], + [68399, 0, "a"], + [68400, 0, "l"], + [68401, 0, "i"], + [68402, 0, "d"], + [68403, 0, " "], + [68404, 0, "e"], + [68405, 0, "x"], + [68406, 0, "e"], + [68407, 0, "c"], + [68408, 0, "u"], + [68409, 0, "t"], + [68410, 0, "i"], + [68411, 0, "o"], + [68412, 0, "n"], + [68413, 0, "s"], + [68414, 0, " "], + [68415, 0, "t"], + [68416, 0, "o"], + [68417, 0, " "], + [68418, 0, "t"], + [68419, 0, "h"], + [68420, 0, "o"], + [68421, 0, "s"], + [68422, 0, "e"], + [68423, 0, " "], + [68424, 0, "t"], + [68425, 0, "h"], + [68426, 0, "a"], + [68427, 0, "t"], + [68428, 0, " "], + [68429, 0, "d"], + [68430, 0, "o"], + [68431, 0, " "], + [68432, 0, "n"], + [68433, 0, "o"], + [68434, 0, "t"], + [68435, 0, " "], + [68436, 0, "g"], + [68437, 0, "e"], + [68438, 0, "t"], + [68439, 0, " "], + [68440, 0, "s"], + [68441, 0, "t"], + [68442, 0, "u"], + [68443, 0, "c"], + [68444, 0, "k"], + [68445, 0, ","], + [68446, 0, " "], + [68447, 0, "w"], + [68448, 0, "e"], + [68449, 0, " "], + [68450, 0, "e"], + [68451, 0, "n"], + [68452, 0, "s"], + [68381, 0, " "], + [68382, 0, "("], + [68383, 0, "I"], + [68384, 0, "n"], + [68385, 0, " "], + [68386, 0, "a"], + [68387, 0, " "], + [68388, 0, "r"], + [68389, 0, "e"], + [68390, 0, "a"], + [68391, 0, "l"], + [68392, 0, " "], + [68393, 0, "i"], + [68394, 0, "m"], + [68395, 0, "p"], + [68396, 0, "l"], + [68397, 0, "e"], + [68398, 0, "m"], + [68399, 0, "e"], + [68400, 0, "n"], + [68401, 0, "t"], + [68402, 0, "a"], + [68403, 0, "t"], + [68404, 0, "i"], + [68405, 0, "o"], + [68406, 0, "n"], + [68407, 0, " "], + [68408, 0, "t"], + [68409, 0, "h"], + [68410, 0, "i"], + [68411, 0, "s"], + [68412, 0, " "], + [68413, 0, "w"], + [68414, 0, "o"], + [68415, 0, "u"], + [68416, 0, "l"], + [68417, 0, "d"], + [68418, 0, " "], + [68419, 0, "b"], + [68420, 0, "e"], + [68421, 0, " "], + [68422, 0, "a"], + [68423, 0, " "], + [68424, 0, "r"], + [68425, 0, "u"], + [68426, 0, "n"], + [68427, 0, "t"], + [68428, 0, "i"], + [68429, 0, "m"], + [68430, 0, "e"], + [68431, 0, " "], + [68432, 0, "e"], + [68433, 0, "r"], + [68434, 0, "r"], + [68435, 0, "o"], + [68436, 0, "r"], + [68437, 0, "."], + [68383, 1], + [68382, 1], + [68381, 1], + [68380, 1], + [68380, 0, ";"], + [68381, 0, " "], + [68382, 0, "i"], + [68437, 0, " "], + [68437, 1], + [68509, 0, "u"], + [68510, 0, "r"], + [68511, 0, "e"], + [68512, 0, " "], + [68513, 0, "t"], + [68514, 0, "h"], + [68515, 0, "a"], + [68516, 0, "t"], + [68517, 0, " "], + [68518, 0, "o"], + [68519, 0, "p"], + [68520, 0, "e"], + [68521, 0, "r"], + [68522, 0, "a"], + [68523, 0, "t"], + [68524, 0, "i"], + [68525, 0, "o"], + [68526, 0, "n"], + [68527, 0, "s"], + [68528, 0, " "], + [68529, 0, "o"], + [68530, 0, "n"], + [68531, 0, "l"], + [68532, 0, "y"], + [68533, 0, " "], + [68534, 0, "r"], + [68535, 0, "e"], + [68536, 0, "f"], + [68537, 0, "e"], + [68538, 0, "r"], + [68539, 0, " "], + [68540, 0, "t"], + [68541, 0, "o"], + [68542, 0, " "], + [68543, 0, "l"], + [68544, 0, "i"], + [68545, 0, "s"], + [68546, 0, "t"], + [68547, 0, " "], + [68548, 0, "e"], + [68549, 0, "l"], + [68550, 0, "e"], + [68551, 0, "m"], + [68552, 0, "e"], + [68553, 0, "n"], + [68554, 0, "t"], + [68555, 0, "s"], + [68556, 0, " "], + [68557, 0, "t"], + [68558, 0, "h"], + [68559, 0, "a"], + [68560, 0, "t"], + [68561, 0, " "], + [68562, 0, "a"], + [68563, 0, "c"], + [68564, 0, "t"], + [68565, 0, "u"], + [68566, 0, "a"], + [68567, 0, "l"], + [68568, 0, "l"], + [68569, 0, "y"], + [68570, 0, " "], + [68571, 0, "e"], + [68572, 0, "x"], + [68573, 0, "i"], + [68574, 0, "s"], + [68575, 0, "t"], + [68576, 0, "."], + [68577, 0, "\n"], + [68578, 0, "\n"], + [68579, 0, "\\"], + [68580, 0, "b"], + [68581, 0, "e"], + [68582, 0, "g"], + [68583, 0, "i"], + [68584, 0, "n"], + [68585, 0, "{"], + [68586, 0, "d"], + [68587, 0, "e"], + [68588, 0, "f"], + [68589, 0, "i"], + [68590, 0, "n"], + [68591, 0, "i"], + [68592, 0, "t"], + [68593, 0, "i"], + [68594, 0, "o"], + [68595, 0, "n"], + [68596, 0, "}"], + [68597, 0, "\n"], + [68598, 0, "A"], + [68599, 0, " "], + [68600, 0, "\\"], + [68601, 0, "e"], + [68602, 0, "m"], + [68603, 0, "p"], + [68604, 0, "h"], + [68605, 0, "{"], + [68606, 0, "h"], + [68607, 0, "i"], + [68608, 0, "s"], + [68609, 0, "t"], + [68610, 0, "o"], + [68611, 0, "r"], + [68612, 0, "y"], + [68613, 0, "}"], + [68614, 0, " "], + [68615, 0, "\n"], + [68616, 0, "\\"], + [68617, 0, "e"], + [68618, 0, "n"], + [68619, 0, "d"], + [68620, 0, "{"], + [68621, 0, "d"], + [68622, 0, "e"], + [68623, 0, "f"], + [68624, 0, "i"], + [68625, 0, "n"], + [68626, 0, "i"], + [68627, 0, "t"], + [68628, 0, "i"], + [68629, 0, "o"], + [68630, 0, "n"], + [68631, 0, "}"], + [68615, 0, "i"], + [68616, 0, "s"], + [68617, 0, " "], + [68618, 0, "t"], + [68619, 0, "h"], + [68620, 0, "e"], + [68621, 0, " "], + [68622, 0, "s"], + [68623, 0, "e"], + [68624, 0, "q"], + [68625, 0, "u"], + [68626, 0, "e"], + [68627, 0, "n"], + [68628, 0, "c"], + [68629, 0, "e"], + [68630, 0, " "], + [68631, 0, "o"], + [68632, 0, "f"], + [68633, 0, " "], + [68634, 0, "o"], + [68620, 1], + [68619, 1], + [68618, 1], + [68618, 0, "a"], + [68633, 0, "p"], + [68634, 0, "e"], + [68635, 0, "r"], + [68636, 0, "a"], + [68637, 0, "t"], + [68638, 0, "i"], + [68639, 0, "o"], + [68640, 0, "n"], + [68641, 0, "s"], + [68642, 0, " "], + [68643, 0, "i"], + [68644, 0, "n"], + [68645, 0, " "], + [68646, 0, "t"], + [68647, 0, "h"], + [68648, 0, "e"], + [68649, 0, " "], + [68650, 0, "o"], + [68651, 0, "r"], + [68652, 0, "d"], + [68653, 0, "e"], + [68654, 0, "r"], + [68655, 0, " "], + [68656, 0, "i"], + [68657, 0, "t"], + [68658, 0, " "], + [68659, 0, "w"], + [68660, 0, "a"], + [68661, 0, "s"], + [68662, 0, " "], + [68663, 0, "a"], + [68664, 0, "p"], + [68665, 0, "p"], + [68666, 0, "l"], + [68667, 0, "i"], + [68668, 0, "e"], + [68669, 0, "d"], + [68670, 0, " "], + [68671, 0, "a"], + [68672, 0, "t"], + [68673, 0, " "], + [68674, 0, "o"], + [68675, 0, "n"], + [68676, 0, "e"], + [68677, 0, " "], + [68678, 0, "p"], + [68679, 0, "a"], + [68680, 0, "r"], + [68681, 0, "t"], + [68682, 0, "i"], + [68683, 0, "c"], + [68684, 0, "u"], + [68685, 0, "l"], + [68686, 0, "a"], + [68687, 0, "r"], + [68688, 0, " "], + [68689, 0, "r"], + [68690, 0, "e"], + [68691, 0, "p"], + [68692, 0, "l"], + [68693, 0, "i"], + [68694, 0, "c"], + [68695, 0, "a"], + [68696, 0, " "], + [68697, 0, "$"], + [68698, 0, "p"], + [68699, 0, "$"], + [68700, 0, "."], + [68700, 0, ","], + [68701, 0, " "], + [68702, 0, "b"], + [68703, 0, "y"], + [68704, 0, " "], + [68705, 0, "a"], + [68706, 0, "p"], + [68707, 0, "p"], + [68708, 0, "l"], + [68709, 0, "i"], + [68710, 0, "c"], + [68711, 0, "a"], + [68712, 0, "t"], + [68713, 0, "i"], + [68714, 0, "o"], + [68715, 0, "n"], + [68716, 0, " "], + [68717, 0, "o"], + [68718, 0, "f"], + [68719, 0, " "], + [68720, 0, "t"], + [68721, 0, "h"], + [68722, 0, "e"], + [68723, 0, " "], + [68724, 0, "r"], + [68725, 0, "u"], + [68726, 0, "l"], + [68727, 0, "e"], + [68728, 0, "s"], + [68729, 0, " "], + [68730, 0, "\\"], + [68731, 0, "t"], + [68732, 0, "e"], + [68733, 0, "x"], + [68734, 0, "t"], + [68735, 0, "s"], + [68736, 0, "c"], + [68737, 0, "{"], + [68738, 0, "A"], + [68739, 0, "p"], + [68740, 0, "p"], + [68741, 0, "l"], + [68742, 0, "y"], + [68743, 0, "-"], + [68744, 0, "L"], + [68745, 0, "o"], + [68746, 0, "c"], + [68747, 0, "a"], + [68748, 0, "l"], + [68749, 0, "}"], + [68750, 0, " "], + [68751, 0, "a"], + [68752, 0, "n"], + [68753, 0, "d"], + [68754, 0, " "], + [68755, 0, "\\"], + [68756, 0, "t"], + [68757, 0, "e"], + [68758, 0, "x"], + [68759, 0, "t"], + [68760, 0, "s"], + [68761, 0, "c"], + [68762, 0, "{"], + [68763, 0, "A"], + [68764, 0, "p"], + [68765, 0, "p"], + [68766, 0, "l"], + [68767, 0, "y"], + [68768, 0, "-"], + [68769, 0, "R"], + [68770, 0, "e"], + [68771, 0, "m"], + [68772, 0, "o"], + [68773, 0, "t"], + [68774, 0, "e"], + [68775, 0, "}"], + [68794, 0, "\n"], + [68795, 0, "\n"], + [68796, 0, "N"], + [68796, 1], + [68796, 0, "E"], + [68797, 0, "v"], + [68798, 0, "e"], + [68799, 0, "n"], + [68800, 0, " "], + [68801, 0, "i"], + [68802, 0, "f"], + [68803, 0, " "], + [68804, 0, "t"], + [68805, 0, "w"], + [68806, 0, "o"], + [68807, 0, " "], + [68808, 0, "r"], + [68809, 0, "e"], + [68810, 0, "p"], + [68811, 0, "l"], + [68812, 0, "i"], + [68813, 0, "c"], + [68814, 0, "a"], + [68815, 0, "s"], + [68816, 0, " "], + [68817, 0, "a"], + [68818, 0, "p"], + [68819, 0, "p"], + [68820, 0, "l"], + [68821, 0, "i"], + [68822, 0, "e"], + [68823, 0, "d"], + [68824, 0, " "], + [68825, 0, "t"], + [68826, 0, "h"], + [68827, 0, "e"], + [68828, 0, " "], + [68829, 0, "s"], + [68830, 0, "a"], + [68831, 0, "m"], + [68832, 0, "e"], + [68833, 0, " "], + [68834, 0, "s"], + [68835, 0, "e"], + [68836, 0, "t"], + [68837, 0, " "], + [68838, 0, "o"], + [68839, 0, "f"], + [68840, 0, " "], + [68841, 0, "o"], + [68842, 0, "p"], + [68843, 0, "e"], + [68844, 0, "r"], + [68845, 0, "a"], + [68846, 0, "t"], + [68847, 0, "i"], + [68848, 0, "o"], + [68849, 0, "n"], + [68850, 0, "s"], + [68816, 0, " "], + [68817, 0, "$"], + [68818, 0, "p"], + [68819, 0, "$"], + [68820, 0, " "], + [68821, 0, "a"], + [68822, 0, "n"], + [68823, 0, "d"], + [68824, 0, " "], + [68825, 0, "$"], + [68826, 0, "q"], + [68827, 0, "$"], + [68863, 0, ","], + [68864, 0, " "], + [68865, 0, "i"], + [68866, 0, "."], + [68867, 0, "e"], + [68868, 0, "."], + [68869, 0, " "], + [68870, 0, "$"], + [68871, 0, "A"], + [68872, 0, "_"], + [68873, 0, "p"], + [68874, 0, "("], + [68875, 0, "\\"], + [68876, 0, "m"], + [68877, 0, "a"], + [68878, 0, "t"], + [68879, 0, "h"], + [68880, 0, "s"], + [68881, 0, "f"], + [68882, 0, "{"], + [68883, 0, "o"], + [68884, 0, "p"], + [68885, 0, "s"], + [68886, 0, "}"], + [68887, 0, ")"], + [68888, 0, " "], + [68889, 0, "="], + [68890, 0, " "], + [68891, 0, "A"], + [68892, 0, "_"], + [68893, 0, "q"], + [68894, 0, "("], + [68895, 0, "\\"], + [68896, 0, "m"], + [68897, 0, "a"], + [68898, 0, "t"], + [68899, 0, "h"], + [68900, 0, "s"], + [68901, 0, "f"], + [68902, 0, "{"], + [68903, 0, "o"], + [68904, 0, "p"], + [68905, 0, "s"], + [68906, 0, "}"], + [68907, 0, ")"], + [68908, 0, "$"], + [68909, 0, ","], + [68910, 0, " "], + [68911, 0, "t"], + [68912, 0, "h"], + [68913, 0, "e"], + [68914, 0, "y"], + [68915, 0, " "], + [68916, 0, "m"], + [68917, 0, "a"], + [68918, 0, "y"], + [68919, 0, " "], + [68920, 0, "h"], + [68921, 0, "a"], + [68922, 0, "v"], + [68923, 0, "e"], + [68924, 0, " "], + [68925, 0, "a"], + [68926, 0, "p"], + [68927, 0, "p"], + [68928, 0, "l"], + [68929, 0, "i"], + [68930, 0, "e"], + [68931, 0, "d"], + [68932, 0, " "], + [68933, 0, "t"], + [68934, 0, "h"], + [68935, 0, "e"], + [68936, 0, " "], + [68937, 0, "o"], + [68938, 0, "p"], + [68939, 0, "e"], + [68940, 0, "r"], + [68941, 0, "a"], + [68942, 0, "t"], + [68943, 0, "i"], + [68944, 0, "o"], + [68945, 0, "n"], + [68946, 0, "s"], + [68947, 0, " "], + [68948, 0, "i"], + [68949, 0, "n"], + [68950, 0, " "], + [68951, 0, "a"], + [68952, 0, " "], + [68953, 0, "d"], + [68954, 0, "i"], + [68955, 0, "f"], + [68956, 0, "f"], + [68957, 0, "e"], + [68958, 0, "r"], + [68959, 0, "e"], + [68960, 0, "n"], + [68961, 0, "t"], + [68962, 0, " "], + [68963, 0, "o"], + [68964, 0, "r"], + [68965, 0, "d"], + [68966, 0, "e"], + [68967, 0, "r"], + [68968, 0, "."], + [68935, 1], + [68934, 1], + [68933, 1], + [68933, 0, "a"], + [68934, 0, "n"], + [68935, 0, "y"], + [68936, 0, " "], + [68937, 0, "c"], + [68938, 0, "o"], + [68939, 0, "n"], + [68940, 0, "c"], + [68941, 0, "u"], + [68942, 0, "r"], + [68943, 0, "r"], + [68944, 0, "e"], + [68945, 0, "n"], + [68946, 0, "t"], + [68869, 0, " "], + [68870, 0, "i"], + [68871, 0, "f"], + [68577, 0, " "], + [68577, 1], + [68577, 0, "\n"], + [68578, 0, "\n"], + [68579, 0, "N"], + [68580, 0, "o"], + [68581, 0, "t"], + [68582, 0, "e"], + [68583, 0, " "], + [68584, 0, "t"], + [68585, 0, "h"], + [68586, 0, "a"], + [68587, 0, "t"], + [68588, 0, " "], + [68589, 0, "i"], + [68590, 0, "t"], + [68591, 0, " "], + [68592, 0, "i"], + [68593, 0, "s"], + [68594, 0, " "], + [68595, 0, "v"], + [68596, 0, "a"], + [68597, 0, "l"], + [68598, 0, "i"], + [68599, 0, "d"], + [68600, 0, " "], + [68601, 0, "f"], + [68602, 0, "o"], + [68603, 0, "r"], + [68604, 0, " "], + [68605, 0, "a"], + [68606, 0, "n"], + [68607, 0, " "], + [68608, 0, "e"], + [68609, 0, "x"], + [68610, 0, "e"], + [68611, 0, "c"], + [68612, 0, "u"], + [68613, 0, "t"], + [68614, 0, "i"], + [68615, 0, "o"], + [68616, 0, "n"], + [68617, 0, " "], + [68618, 0, "t"], + [68619, 0, "o"], + [68620, 0, " "], + [68621, 0, "n"], + [68622, 0, "e"], + [68623, 0, "v"], + [68624, 0, "e"], + [68625, 0, "r"], + [68626, 0, " "], + [68627, 0, "p"], + [68628, 0, "e"], + [68629, 0, "r"], + [68630, 0, "f"], + [68631, 0, "o"], + [68632, 0, "r"], + [68633, 0, "m"], + [68634, 0, " "], + [68635, 0, "a"], + [68636, 0, "n"], + [68637, 0, "y"], + [68638, 0, " "], + [68639, 0, "n"], + [68640, 0, "e"], + [68641, 0, "t"], + [68642, 0, "w"], + [68643, 0, "o"], + [68644, 0, "r"], + [68645, 0, "k"], + [68646, 0, " "], + [68647, 0, "c"], + [68648, 0, "o"], + [68649, 0, "m"], + [68650, 0, "m"], + [68651, 0, "u"], + [68652, 0, "n"], + [68653, 0, "i"], + [68654, 0, "c"], + [68655, 0, "a"], + [68656, 0, "t"], + [68657, 0, "i"], + [68658, 0, "o"], + [68659, 0, "n"], + [68660, 0, ","], + [68661, 0, " "], + [68662, 0, "e"], + [68663, 0, "i"], + [68664, 0, "t"], + [68665, 0, "h"], + [68666, 0, "e"], + [68667, 0, "r"], + [68668, 0, " "], + [68669, 0, "b"], + [68670, 0, "e"], + [68671, 0, "c"], + [68672, 0, "a"], + [68673, 0, "u"], + [68674, 0, "s"], + [68675, 0, "e"], + [68676, 0, " "], + [68677, 0, "i"], + [68678, 0, "t"], + [68679, 0, " "], + [68680, 0, "n"], + [68681, 0, "e"], + [68682, 0, "v"], + [68683, 0, "e"], + [68684, 0, "r"], + [68685, 0, " "], + [68686, 0, "u"], + [68687, 0, "s"], + [68688, 0, "e"], + [68689, 0, "s"], + [68690, 0, " "], + [68691, 0, "t"], + [68691, 1], + [68690, 1], + [68689, 1], + [68688, 1], + [68687, 1], + [68686, 1], + [68686, 0, "i"], + [68687, 0, "n"], + [68688, 0, "v"], + [68689, 0, "o"], + [68690, 0, "k"], + [68691, 0, "e"], + [68692, 0, "s"], + [68693, 0, " "], + [68694, 0, "t"], + [68695, 0, "h"], + [68696, 0, "e"], + [68697, 0, " "], + [68698, 0, "\\"], + [68699, 0, "t"], + [68700, 0, "e"], + [68701, 0, "x"], + [68702, 0, "t"], + [68703, 0, "s"], + [68704, 0, "f"], + [68705, 0, "{"], + [68706, 0, "y"], + [68707, 0, "i"], + [68708, 0, "e"], + [68709, 0, "l"], + [68710, 0, "d"], + [68711, 0, "}"], + [68712, 0, " "], + [68713, 0, "c"], + [68714, 0, "o"], + [68715, 0, "m"], + [68716, 0, "m"], + [68717, 0, "a"], + [68718, 0, "n"], + [68719, 0, "d"], + [68720, 0, ","], + [68721, 0, " "], + [68722, 0, "o"], + [68723, 0, "r"], + [68724, 0, " "], + [68725, 0, "b"], + [68726, 0, "e"], + [68727, 0, "c"], + [68728, 0, "a"], + [68729, 0, "u"], + [68730, 0, "s"], + [68731, 0, "e"], + [68732, 0, " "], + [68733, 0, "t"], + [68734, 0, "h"], + [68735, 0, "e"], + [68736, 0, " "], + [68737, 0, "n"], + [68738, 0, "o"], + [68739, 0, "n"], + [68740, 0, "d"], + [68741, 0, "e"], + [68742, 0, "t"], + [68743, 0, "e"], + [68744, 0, "r"], + [68745, 0, "m"], + [68746, 0, "i"], + [68747, 0, "n"], + [68748, 0, "i"], + [68749, 0, "s"], + [68750, 0, "t"], + [68751, 0, "i"], + [68752, 0, "c"], + [68753, 0, " "], + [68754, 0, "e"], + [68755, 0, "x"], + [68756, 0, "e"], + [68757, 0, "c"], + [68758, 0, "u"], + [68759, 0, "t"], + [68760, 0, "i"], + [68761, 0, "o"], + [68762, 0, "n"], + [68763, 0, " "], + [68764, 0, "o"], + [68765, 0, "f"], + [68766, 0, " "], + [68767, 0, "\\"], + [68768, 0, "t"], + [68769, 0, "e"], + [68770, 0, "x"], + [68771, 0, "t"], + [68772, 0, "s"], + [68773, 0, "f"], + [68774, 0, "{"], + [68775, 0, "y"], + [68776, 0, "i"], + [68777, 0, "e"], + [68778, 0, "l"], + [68779, 0, "d"], + [68780, 0, "}"], + [68781, 0, " "], + [68782, 0, "n"], + [68783, 0, "e"], + [68784, 0, "v"], + [68785, 0, "e"], + [68786, 0, "r"], + [68787, 0, " "], + [68788, 0, "a"], + [68789, 0, "p"], + [68790, 0, "p"], + [68791, 0, "l"], + [68792, 0, "i"], + [68793, 0, "e"], + [68794, 0, "s"], + [68795, 0, " "], + [68796, 0, "t"], + [68797, 0, "h"], + [68798, 0, "e"], + [68799, 0, " "], + [68800, 0, "\\"], + [68801, 0, "t"], + [68802, 0, "e"], + [68803, 0, "x"], + [68804, 0, "t"], + [68805, 0, "s"], + [68806, 0, "c"], + [68807, 0, "{"], + [68808, 0, "R"], + [68809, 0, "e"], + [68810, 0, "c"], + [68811, 0, "v"], + [68812, 0, "}"], + [68813, 0, " "], + [68814, 0, "r"], + [68815, 0, "u"], + [68816, 0, "l"], + [68817, 0, "e"], + [68818, 0, "."], + [68819, 0, " "], + [68820, 0, "T"], + [68821, 0, "h"], + [68822, 0, "u"], + [68823, 0, "s"], + [68824, 0, ","], + [68825, 0, " "], + [68826, 0, "w"], + [68827, 0, "h"], + [68828, 0, "e"], + [68829, 0, "t"], + [68830, 0, "h"], + [68831, 0, "e"], + [68832, 0, "r"], + [68833, 0, " "], + [68833, 1], + [68832, 1], + [68831, 1], + [68830, 1], + [68829, 1], + [68828, 1], + [68827, 1], + [68827, 0, "e"], + [68828, 0, " "], + [68829, 0, "c"], + [68830, 0, "a"], + [68831, 0, "n"], + [68832, 0, " "], + [68833, 0, "c"], + [68834, 0, "h"], + [68835, 0, "e"], + [68836, 0, "c"], + [68837, 0, "k"], + [68838, 0, " "], + [68839, 0, "w"], + [68840, 0, "h"], + [68841, 0, "e"], + [68842, 0, "t"], + [68843, 0, "h"], + [68844, 0, "e"], + [68845, 0, "r"], + [68846, 0, " "], + [68847, 0, "r"], + [68848, 0, "e"], + [68849, 0, "d"], + [68850, 0, "u"], + [68851, 0, "c"], + [68852, 0, "t"], + [68853, 0, "i"], + [68854, 0, "n"], + [68855, 0, "o"], + [68856, 0, " "], + [68856, 1], + [68855, 1], + [68854, 1], + [68854, 0, "o"], + [68855, 0, "n"], + [68856, 0, " "], + [68826, 1], + [68825, 1], + [68824, 1], + [68823, 1], + [68822, 1], + [68821, 1], + [68820, 1], + [68820, 0, "W"], + [68831, 1], + [68830, 1], + [68829, 1], + [68828, 1], + [68827, 1], + [68826, 1], + [68825, 1], + [68824, 1], + [68823, 1], + [68823, 0, "n"], + [68824, 0, "e"], + [68825, 0, "e"], + [68826, 0, "d"], + [68827, 0, " "], + [68828, 0, "o"], + [68829, 0, "n"], + [68830, 0, "l"], + [68831, 0, "y"], + [68832, 0, " "], + [68833, 0, "a"], + [68834, 0, " "], + [68835, 0, "r"], + [68836, 0, "e"], + [68837, 0, "p"], + [68838, 0, "l"], + [68839, 0, "i"], + [68840, 0, "c"], + [68841, 0, "a"], + [68842, 0, "'"], + [68843, 0, "s"], + [68844, 0, " "], + [68845, 0, "l"], + [68846, 0, "o"], + [68847, 0, "c"], + [68848, 0, "a"], + [68849, 0, "l"], + [68850, 0, " "], + [68851, 0, "s"], + [68852, 0, "t"], + [68853, 0, "a"], + [68854, 0, "t"], + [68855, 0, "e"], + [68856, 0, " "], + [68857, 0, "t"], + [68858, 0, "o"], + [68859, 0, " "], + [68860, 0, "d"], + [68861, 0, "e"], + [68862, 0, "t"], + [68863, 0, "e"], + [68864, 0, "r"], + [68865, 0, "m"], + [68866, 0, "i"], + [68867, 0, "n"], + [68868, 0, "e"], + [68888, 0, "g"], + [68889, 0, "e"], + [68890, 0, "t"], + [68891, 0, "s"], + [68892, 0, " "], + [68893, 0, "s"], + [68894, 0, "t"], + [68895, 0, "u"], + [68896, 0, "c"], + [68897, 0, "k"], + [68898, 0, "."], + [69305, 0, " "], + [69306, 0, "S"], + [69307, 0, "i"], + [69308, 0, "n"], + [69309, 0, "c"], + [69310, 0, "e"], + [69311, 0, " "], + [69312, 0, "t"], + [69313, 0, "h"], + [69314, 0, "e"], + [69315, 0, " "], + [69316, 0, "e"], + [69317, 0, "v"], + [69318, 0, "a"], + [69319, 0, "l"], + [69320, 0, "u"], + [69321, 0, "a"], + [69322, 0, "t"], + [69323, 0, "i"], + [69324, 0, "o"], + [69325, 0, "n"], + [69326, 0, " "], + [69327, 0, "r"], + [69328, 0, "u"], + [69329, 0, "l"], + [69330, 0, "e"], + [69331, 0, "s"], + [69332, 0, " "], + [69333, 0, "s"], + [69334, 0, "e"], + [69335, 0, "q"], + [69336, 0, "u"], + [69337, 0, "e"], + [69338, 0, "n"], + [69339, 0, "t"], + [69340, 0, "i"], + [69341, 0, "a"], + [69342, 0, "l"], + [69343, 0, "l"], + [69344, 0, "y"], + [69345, 0, " "], + [69346, 0, "a"], + [69347, 0, "p"], + [69348, 0, "p"], + [69349, 0, "l"], + [69350, 0, "y"], + [69351, 0, " "], + [69352, 0, "o"], + [69353, 0, "n"], + [69354, 0, "e"], + [69355, 0, " "], + [69356, 0, "o"], + [69357, 0, "p"], + [69358, 0, "e"], + [69359, 0, "r"], + [69360, 0, "a"], + [69361, 0, "t"], + [69362, 0, "i"], + [69363, 0, "o"], + [69364, 0, "n"], + [69365, 0, " "], + [69366, 0, "a"], + [69367, 0, "t"], + [69368, 0, " "], + [69369, 0, "a"], + [69370, 0, " "], + [69371, 0, "t"], + [69372, 0, "i"], + [69373, 0, "m"], + [69374, 0, "e"], + [69375, 0, " "], + [69305, 0, " "], + [69306, 0, "D"], + [69307, 0, "u"], + [69308, 0, "e"], + [69309, 0, " "], + [69310, 0, "t"], + [69311, 0, "o"], + [69312, 0, " "], + [69313, 0, "t"], + [69314, 0, "h"], + [69315, 0, "e"], + [69316, 0, " "], + [69317, 0, "p"], + [69318, 0, "r"], + [69319, 0, "e"], + [69320, 0, "m"], + [69321, 0, "i"], + [69322, 0, "s"], + [69323, 0, "e"], + [69324, 0, " "], + [69325, 0, "$"], + [69326, 0, "\\"], + [69327, 0, "m"], + [69328, 0, "a"], + [69329, 0, "t"], + [69330, 0, "h"], + [69331, 0, "i"], + [69332, 0, "t"], + [69333, 0, "{"], + [69334, 0, "o"], + [69335, 0, "p"], + [69336, 0, "."], + [69337, 0, "i"], + [69338, 0, "d"], + [69338, 1], + [69337, 1], + [69337, 0, "d"], + [69338, 0, "e"], + [69339, 0, "p"], + [69340, 0, "s"], + [69341, 0, "}"], + [69342, 0, " "], + [69343, 0, "\\"], + [69344, 0, "s"], + [69345, 0, "u"], + [69346, 0, "b"], + [69347, 0, "s"], + [69348, 0, "e"], + [69349, 0, "t"], + [69350, 0, "e"], + [69351, 0, "q"], + [69352, 0, " "], + [69353, 0, "A"], + [69354, 0, "_"], + [69355, 0, "p"], + [69356, 0, "("], + [69357, 0, "\\"], + [69358, 0, "m"], + [69359, 0, "a"], + [69360, 0, "t"], + [69361, 0, "h"], + [69362, 0, "s"], + [69363, 0, "f"], + [69364, 0, "{"], + [69365, 0, "o"], + [69366, 0, "p"], + [69367, 0, "s"], + [69368, 0, "}"], + [69369, 0, ")"], + [69370, 0, "$"], + [69371, 0, " "], + [69372, 0, "i"], + [69373, 0, "n"], + [69374, 0, " "], + [69375, 0, "\\"], + [69376, 0, "t"], + [69377, 0, "e"], + [69378, 0, "x"], + [69379, 0, "t"], + [69380, 0, "s"], + [69381, 0, "c"], + [69382, 0, "{"], + [69383, 0, "A"], + [69384, 0, "p"], + [69385, 0, "p"], + [69386, 0, "l"], + [69387, 0, "y"], + [69388, 0, "-"], + [69389, 0, "R"], + [69390, 0, "e"], + [69391, 0, "m"], + [69392, 0, "o"], + [69393, 0, "t"], + [69394, 0, "e"], + [69395, 0, "}"], + [69305, 0, " "], + [69306, 0, "S"], + [69307, 0, "i"], + [69308, 0, "n"], + [69309, 0, "c"], + [69310, 0, " "], + [69311, 0, "e"], + [69312, 0, "t"], + [69313, 0, "h"], + [69313, 1], + [69312, 1], + [69311, 1], + [69310, 1], + [69310, 0, "e"], + [69311, 0, " "], + [69312, 0, "t"], + [69313, 0, "h"], + [69314, 0, "e"], + [69315, 0, " "], + [69316, 0, "e"], + [69317, 0, "v"], + [69318, 0, "a"], + [69319, 0, "l"], + [69320, 0, "u"], + [69321, 0, "a"], + [69322, 0, "t"], + [69323, 0, "i"], + [69324, 0, "o"], + [69325, 0, "n"], + [69326, 0, " "], + [69327, 0, "r"], + [69328, 0, "u"], + [69329, 0, "l"], + [69330, 0, "e"], + [69331, 0, "s"], + [69332, 0, " "], + [69333, 0, "s"], + [69334, 0, "e"], + [69335, 0, "q"], + [69336, 0, "u"], + [69337, 0, "e"], + [69338, 0, "n"], + [69339, 0, "t"], + [69340, 0, "i"], + [69341, 0, "a"], + [69342, 0, "l"], + [69343, 0, "l"], + [69344, 0, "y"], + [69345, 0, " "], + [69346, 0, "a"], + [69347, 0, "p"], + [69348, 0, "p"], + [69349, 0, "l"], + [69350, 0, "y"], + [69351, 0, " "], + [69352, 0, "o"], + [69353, 0, "n"], + [69354, 0, "e"], + [69355, 0, " "], + [69356, 0, "o"], + [69357, 0, "p"], + [69358, 0, "e"], + [69359, 0, "r"], + [69360, 0, "a"], + [69361, 0, "t"], + [69362, 0, "i"], + [69363, 0, "o"], + [69364, 0, "n"], + [69365, 0, " "], + [69366, 0, "a"], + [69367, 0, "t"], + [69368, 0, " "], + [69369, 0, "a"], + [69370, 0, " "], + [69371, 0, "t"], + [69372, 0, "i"], + [69373, 0, "m"], + [69374, 0, "e"], + [69375, 0, ","], + [69376, 0, " "], + [69377, 0, "t"], + [69378, 0, "h"], + [69379, 0, "e"], + [69380, 0, " "], + [69381, 0, "o"], + [69382, 0, "r"], + [69383, 0, "d"], + [69384, 0, "e"], + [69385, 0, "r"], + [69386, 0, " "], + [69387, 0, "i"], + [69388, 0, "s"], + [69389, 0, " "], + [69390, 0, "w"], + [69391, 0, "e"], + [69392, 0, "l"], + [69393, 0, "l"], + [69394, 0, "-"], + [69395, 0, "d"], + [69396, 0, "e"], + [69397, 0, "f"], + [69398, 0, "i"], + [69399, 0, "n"], + [69400, 0, "e"], + [69401, 0, "d"], + [69402, 0, "."], + [69564, 1], + [69563, 1], + [69562, 1], + [69561, 1], + [69560, 1], + [69559, 1], + [69558, 1], + [69557, 1], + [69556, 1], + [69555, 1], + [69554, 1], + [69553, 1], + [69552, 1], + [69551, 1], + [69550, 1], + [69549, 1], + [69548, 1], + [69547, 1], + [69546, 1], + [69545, 1], + [69544, 1], + [69543, 1], + [69542, 1], + [69541, 1], + [69540, 1], + [69539, 1], + [69538, 1], + [69537, 1], + [69536, 1], + [69535, 1], + [69534, 1], + [69533, 1], + [69532, 1], + [69531, 1], + [69530, 1], + [69529, 1], + [69528, 1], + [69527, 1], + [69526, 1], + [69525, 1], + [69524, 1], + [69523, 1], + [69522, 1], + [69521, 1], + [69520, 1], + [69519, 1], + [69518, 1], + [69517, 1], + [69516, 1], + [69515, 1], + [69514, 1], + [69513, 1], + [69512, 1], + [69511, 1], + [69510, 1], + [69509, 1], + [69508, 1], + [69507, 1], + [69506, 1], + [69505, 1], + [69504, 1], + [69503, 1], + [69502, 1], + [69501, 1], + [69500, 1], + [69499, 1], + [69498, 1], + [69497, 1], + [69496, 1], + [69495, 1], + [69494, 1], + [69494, 0, ","], + [69495, 0, " "], + [69496, 0, "t"], + [69497, 0, "h"], + [69498, 0, "e"], + [69499, 0, " "], + [69500, 0, "o"], + [69501, 0, "r"], + [69502, 0, "d"], + [69503, 0, "e"], + [69504, 0, "r"], + [69505, 0, " "], + [69506, 0, "i"], + [69507, 0, "s"], + [69508, 0, " "], + [69509, 0, "c"], + [69510, 0, "o"], + [69511, 0, "n"], + [69512, 0, "s"], + [69513, 0, "i"], + [69514, 0, "s"], + [69515, 0, "t"], + [69516, 0, "e"], + [69517, 0, "n"], + [69518, 0, "t"], + [69519, 0, " "], + [69520, 0, "w"], + [69521, 0, "i"], + [69522, 0, "t"], + [69523, 0, "h"], + [69524, 0, " "], + [69525, 0, "c"], + [69526, 0, "a"], + [69527, 0, "u"], + [69528, 0, "s"], + [69529, 0, "a"], + [69530, 0, "l"], + [69531, 0, "i"], + [69532, 0, "t"], + [69533, 0, "y"], + [69534, 0, " "], + [69535, 0, "("], + [69504, 1], + [69503, 1], + [69502, 1], + [69501, 1], + [69500, 1], + [69499, 1], + [69498, 1], + [69497, 1], + [69496, 1], + [69496, 0, "a"], + [69497, 0, "n"], + [69498, 0, "y"], + [69499, 0, " "], + [69500, 0, "h"], + [69501, 0, "i"], + [69502, 0, "s"], + [69503, 0, "t"], + [69504, 0, "o"], + [69505, 0, "r"], + [69506, 0, "y"], + [69022, 1], + [69117, 0, "S"], + [69118, 0, "i"], + [69119, 0, "n"], + [69120, 0, "c"], + [69121, 0, "e"], + [69122, 0, " "], + [69123, 0, "t"], + [69124, 0, "h"], + [69125, 0, "e"], + [69126, 0, " "], + [69127, 0, "e"], + [69128, 0, "v"], + [69129, 0, "a"], + [69130, 0, "l"], + [69131, 0, "u"], + [69132, 0, "a"], + [69133, 0, "t"], + [69134, 0, "i"], + [69135, 0, "o"], + [69136, 0, "n"], + [69137, 0, " "], + [69138, 0, "r"], + [69139, 0, "u"], + [69140, 0, "l"], + [69141, 0, "e"], + [69142, 0, "s"], + [69143, 0, " "], + [69144, 0, "s"], + [69145, 0, "e"], + [69146, 0, "q"], + [69147, 0, "u"], + [69148, 0, "e"], + [69149, 0, "n"], + [69150, 0, "t"], + [69151, 0, "i"], + [69152, 0, "a"], + [69152, 1], + [69152, 0, "a"], + [69153, 0, "l"], + [69154, 0, "l"], + [69155, 0, "y"], + [69156, 0, " "], + [69157, 0, "a"], + [69158, 0, "p"], + [69159, 0, "p"], + [69160, 0, "l"], + [69161, 0, "y"], + [69162, 0, " "], + [69163, 0, "o"], + [69164, 0, "n"], + [69165, 0, "e"], + [69166, 0, " "], + [69167, 0, "o"], + [69168, 0, "p"], + [69169, 0, "e"], + [69170, 0, "r"], + [69171, 0, "a"], + [69172, 0, "t"], + [69173, 0, "i"], + [69174, 0, "o"], + [69175, 0, "n"], + [69176, 0, " "], + [69177, 0, "a"], + [69178, 0, "t"], + [69179, 0, " "], + [69180, 0, "a"], + [69181, 0, " "], + [69182, 0, "t"], + [69183, 0, "i"], + [69184, 0, "m"], + [69185, 0, "e"], + [69186, 0, ","], + [69187, 0, " "], + [69188, 0, "t"], + [69189, 0, "h"], + [69190, 0, "e"], + [69191, 0, " "], + [69192, 0, "o"], + [69193, 0, "r"], + [69194, 0, "d"], + [69195, 0, "e"], + [69196, 0, "r"], + [69197, 0, " "], + [69198, 0, "i"], + [69199, 0, "s"], + [69200, 0, " "], + [69201, 0, "w"], + [69202, 0, "e"], + [69203, 0, "l"], + [69204, 0, "l"], + [69205, 0, "-"], + [69206, 0, "d"], + [69207, 0, "e"], + [69208, 0, "f"], + [69209, 0, "i"], + [69210, 0, "n"], + [69211, 0, "e"], + [69212, 0, "d"], + [69213, 0, "."], + [69214, 0, " "], + [69500, 1], + [69499, 1], + [69498, 1], + [69497, 1], + [69496, 1], + [69495, 1], + [69494, 1], + [69493, 1], + [69492, 1], + [69491, 1], + [69490, 1], + [69489, 1], + [69488, 1], + [69487, 1], + [69486, 1], + [69485, 1], + [69484, 1], + [69483, 1], + [69482, 1], + [69481, 1], + [69480, 1], + [69479, 1], + [69478, 1], + [69477, 1], + [69476, 1], + [69475, 1], + [69474, 1], + [69473, 1], + [69472, 1], + [69471, 1], + [69470, 1], + [69469, 1], + [69468, 1], + [69467, 1], + [69466, 1], + [69465, 1], + [69464, 1], + [69463, 1], + [69462, 1], + [69461, 1], + [69460, 1], + [69459, 1], + [69458, 1], + [69457, 1], + [69456, 1], + [69455, 1], + [69454, 1], + [69453, 1], + [69452, 1], + [69451, 1], + [69450, 1], + [69449, 1], + [69448, 1], + [69447, 1], + [69446, 1], + [69445, 1], + [69444, 1], + [69443, 1], + [69442, 1], + [69441, 1], + [69440, 1], + [69439, 1], + [69438, 1], + [69437, 1], + [69436, 1], + [69435, 1], + [69434, 1], + [69433, 1], + [69432, 1], + [69431, 1], + [69430, 1], + [69429, 1], + [69428, 1], + [69427, 1], + [69426, 1], + [69425, 1], + [69424, 1], + [69423, 1], + [69422, 1], + [69421, 1], + [69420, 1], + [69419, 1], + [69418, 1], + [69417, 1], + [69416, 1], + [69415, 1], + [69414, 1], + [69413, 1], + [69412, 1], + [69411, 1], + [69410, 1], + [69409, 1], + [69408, 1], + [69407, 1], + [69406, 1], + [69405, 1], + [69404, 1], + [69403, 1], + [69537, 0, "e"], + [69538, 0, "v"], + [69539, 0, "e"], + [69540, 0, "r"], + [69541, 0, "y"], + [69542, 0, " "], + [69543, 0, "o"], + [69544, 0, "p"], + [69545, 0, "e"], + [69546, 0, "r"], + [69547, 0, "a"], + [69548, 0, "t"], + [69549, 0, "i"], + [69550, 0, "o"], + [69551, 0, "n"], + [69552, 0, " "], + [69553, 0, "a"], + [69554, 0, "p"], + [69555, 0, "p"], + [69556, 0, "e"], + [69557, 0, "a"], + [69558, 0, "r"], + [69559, 0, "s"], + [69581, 0, " "], + [69582, 0, "a"], + [69583, 0, "n"], + [69584, 0, "d"], + [69585, 0, " "], + [69586, 0, "f"], + [69587, 0, "u"], + [69588, 0, "r"], + [69589, 0, "t"], + [69590, 0, "h"], + [69591, 0, "e"], + [69592, 0, "r"], + [69593, 0, " "], + [69594, 0, "w"], + [69595, 0, "o"], + [69596, 0, "r"], + [69597, 0, "k"], + [69559, 1], + [69558, 1], + [69557, 1], + [69556, 1], + [69555, 1], + [69554, 1], + [69553, 1], + [69552, 1], + [69551, 1], + [69541, 1], + [69540, 1], + [69539, 1], + [69538, 1], + [69537, 1], + [69537, 0, "i"], + [69538, 0, "f"], + [69539, 0, " "], + [69540, 0, "a"], + [69541, 0, "n"], + [69551, 0, "n"], + [69552, 0, " "], + [69553, 0, "h"], + [69554, 0, "a"], + [69555, 0, "s"], + [69556, 0, " "], + [69557, 0, "c"], + [69558, 0, "a"], + [69559, 0, "u"], + [69560, 0, "s"], + [69561, 0, "a"], + [69562, 0, "l"], + [69563, 0, " "], + [69564, 0, "d"], + [69565, 0, "e"], + [69566, 0, "p"], + [69567, 0, "e"], + [69568, 0, "n"], + [69569, 0, "d"], + [69570, 0, "e"], + [69571, 0, "n"], + [69572, 0, "c"], + [69573, 0, "i"], + [69574, 0, "e"], + [69575, 0, "s"], + [69576, 0, ","], + [69577, 0, " "], + [69578, 0, "i"], + [69579, 0, "t"], + [69580, 0, " "], + [69581, 0, "a"], + [69582, 0, "p"], + [69583, 0, "p"], + [69584, 0, "e"], + [69585, 0, "a"], + [69586, 0, "r"], + [69587, 0, "s"], + [69588, 0, " "], + [69589, 0, "a"], + [69590, 0, "t"], + [69591, 0, " "], + [69592, 0, "s"], + [69593, 0, "o"], + [69594, 0, "m"], + [69595, 0, "e"], + [69596, 0, " "], + [69597, 0, "p"], + [69598, 0, "o"], + [69599, 0, "i"], + [69600, 0, "n"], + [69601, 0, "t"], + [69602, 0, " "], + [69603, 0, "a"], + [69604, 0, "f"], + [69605, 0, "t"], + [69606, 0, "e"], + [69607, 0, "r"], + [69608, 0, " "], + [69609, 0, "t"], + [69610, 0, "h"], + [69611, 0, "o"], + [69612, 0, "s"], + [69613, 0, "e"], + [69614, 0, " "], + [69615, 0, "d"], + [69616, 0, "e"], + [69617, 0, "p"], + [69618, 0, "e"], + [69619, 0, "n"], + [69620, 0, "d"], + [69621, 0, "e"], + [69622, 0, "n"], + [69623, 0, "c"], + [69624, 0, "i"], + [69625, 0, "e"], + [69626, 0, "s"], + [69627, 0, " "], + [69628, 0, "i"], + [69629, 0, "n"], + [69630, 0, " "], + [69631, 0, "t"], + [69632, 0, "h"], + [69633, 0, "e"], + [69634, 0, " "], + [69635, 0, "h"], + [69636, 0, "i"], + [69637, 0, "s"], + [69638, 0, "t"], + [69639, 0, "o"], + [69640, 0, "r"], + [69641, 0, "y"], + [69642, 0, ")"], + [69643, 0, "."], + [68175, 0, "t"], + [68176, 0, "h"], + [68177, 0, "e"], + [68178, 0, "r"], + [68179, 0, "e"], + [68180, 0, " "], + [68181, 0, "i"], + [68182, 0, "s"], + [68183, 0, " "], + [68184, 0, "n"], + [68185, 0, "o"], + [68186, 0, " "], + [68187, 0, "a"], + [68188, 0, "p"], + [68189, 0, "p"], + [68190, 0, "l"], + [68191, 0, "i"], + [68192, 0, "c"], + [68193, 0, "a"], + [68194, 0, "t"], + [68195, 0, "i"], + [68196, 0, "o"], + [68197, 0, "n"], + [68198, 0, " "], + [68199, 0, "o"], + [68200, 0, "f"], + [68201, 0, " "], + [68202, 0, "r"], + [68203, 0, "u"], + [68204, 0, "l"], + [68205, 0, "e"], + [68206, 0, "s"], + [68207, 0, " "], + [68208, 0, "i"], + [68209, 0, "n"], + [68210, 0, " "], + [68211, 0, "w"], + [68212, 0, "h"], + [68213, 0, "i"], + [68214, 0, "c"], + [68215, 0, "h"], + [68216, 0, " "], + [68218, 0, "l"], + [68219, 0, "l"], + [68228, 0, "s"], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 1], + [68230, 0, "a"], + [68231, 0, "r"], + [68232, 0, "e"], + [68233, 0, " "], + [69543, 1], + [69542, 0, ":"], + [69649, 1], + [69650, 0, "\n"], + [69651, 0, "\n"], + [69652, 0, "\\"], + [69653, 0, "b"], + [69654, 0, "e"], + [69655, 0, "g"], + [69656, 0, "i"], + [69657, 0, "n"], + [69658, 0, "{"], + [69659, 0, "t"], + [69660, 0, "h"], + [69661, 0, "e"], + [69662, 0, "o"], + [69663, 0, "r"], + [69664, 0, "e"], + [69665, 0, "m"], + [69666, 0, "*"], + [69667, 0, "}"], + [69668, 0, "\n"], + [69669, 0, "\\"], + [69670, 0, "e"], + [69671, 0, "n"], + [69672, 0, "d"], + [69673, 0, "{"], + [69674, 0, "t"], + [69675, 0, "h"], + [69676, 0, "e"], + [69677, 0, "o"], + [69678, 0, "r"], + [69679, 0, "e"], + [69680, 0, "m"], + [69681, 0, "*"], + [69682, 0, "}"], + [69668, 0, "\n"], + [69669, 0, "F"], + [69670, 0, "o"], + [69671, 0, "r"], + [69672, 0, " "], + [69673, 0, "a"], + [69674, 0, "n"], + [69675, 0, "y"], + [69676, 0, " "], + [69677, 0, "t"], + [69678, 0, "w"], + [69679, 0, "o"], + [69680, 0, " "], + [69681, 0, "r"], + [69682, 0, "e"], + [69683, 0, "p"], + [69684, 0, "l"], + [69685, 0, "i"], + [69686, 0, "c"], + [69687, 0, "a"], + [69688, 0, "s"], + [69689, 0, " "], + [69690, 0, "$"], + [69691, 0, "p"], + [69692, 0, "$"], + [69693, 0, " "], + [69694, 0, "a"], + [69695, 0, "n"], + [69696, 0, "d"], + [69697, 0, " "], + [69698, 0, "$"], + [69699, 0, "q"], + [69700, 0, "$"], + [69701, 0, " "], + [69702, 0, "t"], + [69703, 0, "h"], + [69704, 0, "a"], + [69705, 0, "t"], + [69706, 0, " "], + [69707, 0, "p"], + [69708, 0, "a"], + [69709, 0, "r"], + [69710, 0, "t"], + [69711, 0, "i"], + [69712, 0, "c"], + [69713, 0, "i"], + [69714, 0, "p"], + [69715, 0, "a"], + [69716, 0, "t"], + [69717, 0, "e"], + [69718, 0, "d"], + [69719, 0, " "], + [69720, 0, "i"], + [69721, 0, "n"], + [69722, 0, " "], + [69723, 0, "a"], + [69724, 0, " "], + [69725, 0, "v"], + [69726, 0, "a"], + [69727, 0, "l"], + [69728, 0, "i"], + [69729, 0, "d"], + [69730, 0, " "], + [69731, 0, "e"], + [69732, 0, "x"], + [69733, 0, "e"], + [69734, 0, "c"], + [69735, 0, "u"], + [69736, 0, "t"], + [69737, 0, "i"], + [69738, 0, "o"], + [69739, 0, "n"], + [69740, 0, ","], + [69741, 0, " "], + [69742, 0, "i"], + [69743, 0, "f"], + [69744, 0, " "], + [69745, 0, "$"], + [69746, 0, "A"], + [69747, 0, "_"], + [69748, 0, "p"], + [69749, 0, "("], + [69750, 0, "\\"], + [69751, 0, "m"], + [69752, 0, "a"], + [69753, 0, "t"], + [69754, 0, "h"], + [69755, 0, "s"], + [69756, 0, "f"], + [69757, 0, "{"], + [69758, 0, "o"], + [69759, 0, "p"], + [69760, 0, "s"], + [69761, 0, "}"], + [69762, 0, ")"], + [69763, 0, " "], + [69764, 0, "="], + [69765, 0, " "], + [69766, 0, "$"], + [69766, 1], + [69766, 0, "A"], + [69767, 0, "_"], + [69768, 0, "q"], + [69769, 0, "("], + [69770, 0, "\\"], + [69771, 0, "m"], + [69772, 0, "a"], + [69773, 0, "t"], + [69774, 0, "h"], + [69775, 0, "s"], + [69776, 0, "f"], + [69777, 0, "{"], + [69778, 0, "o"], + [69779, 0, "p"], + [69780, 0, "s"], + [69781, 0, "}"], + [69782, 0, ")"], + [69783, 0, "$"], + [69784, 0, ","], + [69785, 0, " "], + [69786, 0, "t"], + [69787, 0, "h"], + [69788, 0, "e"], + [69789, 0, "n"], + [69790, 0, " "], + [69791, 0, "$"], + [69792, 0, "p"], + [69793, 0, "$"], + [69794, 0, " "], + [69795, 0, "a"], + [69796, 0, "n"], + [69797, 0, "d"], + [69798, 0, " "], + [69799, 0, "$"], + [69800, 0, "q"], + [69801, 0, "$"], + [69802, 0, " "], + [69803, 0, "h"], + [69804, 0, "a"], + [69805, 0, "v"], + [69806, 0, "e"], + [69807, 0, " "], + [69808, 0, "t"], + [69809, 0, "h"], + [69810, 0, "e"], + [69811, 0, " "], + [69812, 0, "s"], + [69813, 0, "a"], + [69814, 0, "m"], + [69815, 0, "e"], + [69816, 0, " "], + [69817, 0, "d"], + [69818, 0, "o"], + [69819, 0, "c"], + [69820, 0, "u"], + [69821, 0, "m"], + [69822, 0, "e"], + [69823, 0, "n"], + [69824, 0, "t"], + [69825, 0, " "], + [69826, 0, "s"], + [69827, 0, "t"], + [69828, 0, "a"], + [69829, 0, "t"], + [69830, 0, "e"], + [69831, 0, "."], + [69847, 0, "\n"], + [69848, 0, "\n"], + [69849, 0, "T"], + [69850, 0, "h"], + [69851, 0, "i"], + [69852, 0, "s"], + [69853, 0, " "], + [69854, 0, "t"], + [69855, 0, "h"], + [69856, 0, "e"], + [69857, 0, "o"], + [69858, 0, "r"], + [69859, 0, "e"], + [69860, 0, "m"], + [69861, 0, " "], + [69862, 0, "i"], + [69863, 0, "s"], + [69864, 0, " "], + [69865, 0, "p"], + [69866, 0, "r"], + [69867, 0, "o"], + [69868, 0, "v"], + [69869, 0, "e"], + [69870, 0, "d"], + [69871, 0, " "], + [69872, 0, "i"], + [69873, 0, "n"], + [69874, 0, " "], + [69875, 0, "t"], + [69876, 0, "h"], + [69877, 0, "e"], + [69878, 0, " "], + [69879, 0, "a"], + [69880, 0, "p"], + [69881, 0, "p"], + [69882, 0, "e"], + [69883, 0, "n"], + [69884, 0, "d"], + [69885, 0, "i"], + [69886, 0, "x"], + [69887, 0, "."], + [69888, 0, " "], + [69889, 0, "I"], + [69890, 0, "t"], + [69891, 0, " "], + [69892, 0, "f"], + [69893, 0, "o"], + [69894, 0, "r"], + [69895, 0, "m"], + [69896, 0, "a"], + [69897, 0, "l"], + [69898, 0, "i"], + [69899, 0, "z"], + [69900, 0, "e"], + [69901, 0, "s"], + [69902, 0, " "], + [69903, 0, "t"], + [69904, 0, "h"], + [69905, 0, "e"], + [69906, 0, " "], + [69907, 0, "s"], + [69908, 0, "a"], + [69909, 0, "f"], + [69910, 0, "e"], + [69911, 0, "t"], + [69912, 0, "y"], + [69913, 0, " "], + [69914, 0, "p"], + [69915, 0, "r"], + [69916, 0, "o"], + [69917, 0, "p"], + [69918, 0, "e"], + [69919, 0, "r"], + [69920, 0, "t"], + [69921, 0, "y"], + [69922, 0, " "], + [69923, 0, "o"], + [69924, 0, "f"], + [69925, 0, " "], + [69926, 0, "c"], + [69927, 0, "o"], + [69928, 0, "n"], + [69929, 0, "v"], + [69930, 0, "e"], + [69931, 0, "r"], + [69932, 0, "g"], + [69933, 0, "e"], + [69934, 0, "n"], + [69935, 0, "c"], + [69936, 0, "e"], + [69937, 0, ":"], + [69938, 0, " "], + [69939, 0, "i"], + [69940, 0, "f"], + [69941, 0, " "], + [69942, 0, "t"], + [69943, 0, "w"], + [69944, 0, "o"], + [69945, 0, " "], + [69946, 0, "r"], + [69947, 0, "e"], + [69948, 0, "p"], + [69949, 0, "l"], + [69950, 0, "i"], + [69951, 0, "c"], + [69952, 0, "a"], + [69953, 0, "s"], + [69954, 0, " "], + [69955, 0, "h"], + [69956, 0, "a"], + [69957, 0, "v"], + [69958, 0, "e"], + [69959, 0, " "], + [69960, 0, "p"], + [69961, 0, "r"], + [69962, 0, "o"], + [69963, 0, "c"], + [69964, 0, "e"], + [69965, 0, "s"], + [69966, 0, "s"], + [69967, 0, "e"], + [69968, 0, "d"], + [69969, 0, " "], + [69970, 0, "t"], + [69971, 0, "h"], + [69972, 0, "e"], + [69973, 0, " "], + [69974, 0, "s"], + [69975, 0, "a"], + [69976, 0, "m"], + [69977, 0, "e"], + [69978, 0, " "], + [69979, 0, "s"], + [69980, 0, "e"], + [69981, 0, "t"], + [69982, 0, " "], + [69983, 0, "o"], + [69984, 0, "f"], + [69985, 0, " "], + [69986, 0, "o"], + [69987, 0, "p"], + [69988, 0, "e"], + [69989, 0, "r"], + [69990, 0, "a"], + [69991, 0, "t"], + [69992, 0, "i"], + [69993, 0, "o"], + [69994, 0, "n"], + [69995, 0, "s"], + [69996, 0, ","], + [69997, 0, " "], + [69998, 0, "p"], + [69999, 0, "o"], + [70000, 0, "s"], + [70001, 0, "s"], + [70002, 0, "i"], + [70003, 0, "b"], + [70004, 0, "l"], + [70005, 0, "y"], + [70006, 0, " "], + [70007, 0, "i"], + [70008, 0, "n"], + [70009, 0, " "], + [70010, 0, "a"], + [70011, 0, " "], + [70012, 0, "d"], + [70013, 0, "i"], + [70014, 0, "f"], + [70015, 0, "f"], + [70016, 0, "e"], + [70017, 0, "r"], + [70018, 0, "e"], + [70019, 0, "n"], + [70020, 0, "t"], + [70021, 0, " "], + [70022, 0, "o"], + [70023, 0, "r"], + [70024, 0, "d"], + [70025, 0, "e"], + [70026, 0, "r"], + [70027, 0, ","], + [70028, 0, " "], + [70029, 0, "t"], + [70030, 0, "h"], + [70031, 0, "e"], + [70032, 0, "n"], + [70033, 0, " "], + [70034, 0, "t"], + [70035, 0, "h"], + [70036, 0, "e"], + [70037, 0, "y"], + [70038, 0, " "], + [70039, 0, "a"], + [70040, 0, "r"], + [70041, 0, "e"], + [70042, 0, " "], + [70043, 0, "i"], + [70044, 0, "n"], + [70045, 0, " "], + [70046, 0, "t"], + [70047, 0, "h"], + [70048, 0, "e"], + [70049, 0, " "], + [70050, 0, "s"], + [70051, 0, "a"], + [70052, 0, "m"], + [70053, 0, "e"], + [70054, 0, " "], + [70055, 0, "s"], + [70056, 0, "t"], + [70057, 0, "a"], + [70058, 0, "t"], + [70059, 0, "e"], + [70060, 0, "."], + [70061, 0, " "], + [70062, 0, "I"], + [70063, 0, "t"], + [70064, 0, " "], + [70065, 0, "n"], + [70066, 0, "e"], + [70067, 0, "e"], + [70068, 0, "d"], + [70069, 0, "s"], + [70070, 0, " "], + [70071, 0, "t"], + [70072, 0, "o"], + [70073, 0, " "], + [70074, 0, "b"], + [70075, 0, "e"], + [70076, 0, " "], + [70077, 0, "c"], + [70078, 0, "o"], + [70079, 0, "u"], + [70080, 0, "p"], + [70081, 0, "l"], + [70082, 0, "e"], + [70083, 0, "d"], + [70084, 0, " "], + [70085, 0, "w"], + [70086, 0, "i"], + [70087, 0, "t"], + [70088, 0, "h"], + [70089, 0, " "], + [70090, 0, "a"], + [70091, 0, " "], + [70092, 0, "l"], + [70093, 0, "i"], + [70094, 0, "v"], + [70095, 0, "e"], + [70096, 0, "n"], + [70097, 0, "e"], + [70098, 0, "s"], + [70099, 0, "s"], + [70100, 0, " "], + [70101, 0, "p"], + [70102, 0, "r"], + [70103, 0, "o"], + [70104, 0, "p"], + [70105, 0, "e"], + [70106, 0, "r"], + [70107, 0, "t"], + [70108, 0, "y"], + [70109, 0, ","], + [70110, 0, " "], + [70111, 0, "n"], + [70112, 0, "a"], + [70113, 0, "m"], + [70114, 0, "e"], + [70115, 0, "l"], + [70116, 0, "y"], + [70117, 0, " "], + [70118, 0, "t"], + [70119, 0, "h"], + [70120, 0, "a"], + [70121, 0, "t"], + [70122, 0, " "], + [70083, 1], + [70082, 1], + [70081, 1], + [70080, 1], + [70079, 1], + [70078, 1], + [70077, 1], + [70076, 1], + [70075, 1], + [70074, 1], + [70073, 1], + [70072, 1], + [70071, 1], + [70070, 1], + [70069, 1], + [70068, 1], + [70067, 1], + [70066, 1], + [70065, 1], + [70064, 1], + [70063, 1], + [70063, 0, "n"], + [70064, 0, " "], + [70065, 0, "c"], + [70066, 0, "o"], + [70067, 0, "m"], + [70068, 0, "b"], + [70069, 0, "i"], + [70070, 0, "n"], + [70071, 0, "a"], + [70072, 0, "t"], + [70073, 0, "i"], + [70074, 0, "o"], + [70075, 0, "n"], + [70115, 0, "e"], + [70116, 0, "v"], + [70117, 0, "e"], + [70118, 0, "r"], + [70119, 0, "y"], + [70120, 0, " "], + [70121, 0, "r"], + [70122, 0, "e"], + [70123, 0, "p"], + [70124, 0, "l"], + [70125, 0, "i"], + [70126, 0, "c"], + [70127, 0, "a"], + [70128, 0, " "], + [70129, 0, "e"], + [70130, 0, "v"], + [70131, 0, "e"], + [70132, 0, "n"], + [70133, 0, "t"], + [70134, 0, "u"], + [70135, 0, "a"], + [70136, 0, "l"], + [70137, 0, "l"], + [70138, 0, "y"], + [70139, 0, " "], + [70140, 0, "p"], + [70141, 0, "r"], + [70142, 0, "o"], + [70143, 0, "c"], + [70144, 0, "e"], + [70145, 0, "s"], + [70146, 0, "s"], + [70147, 0, "e"], + [70148, 0, "s"], + [70149, 0, " "], + [70150, 0, "a"], + [70151, 0, "l"], + [70152, 0, "l"], + [70153, 0, " "], + [70154, 0, "o"], + [70155, 0, "p"], + [70156, 0, "e"], + [70157, 0, "r"], + [70158, 0, "a"], + [70159, 0, "t"], + [70160, 0, "i"], + [70161, 0, "o"], + [70162, 0, "n"], + [70163, 0, "s"], + [70164, 0, ","], + [70165, 0, " "], + [70166, 0, "w"], + [70167, 0, "e"], + [70168, 0, " "], + [70169, 0, "o"], + [70170, 0, "b"], + [70171, 0, "t"], + [70172, 0, "a"], + [70173, 0, "i"], + [70174, 0, "n"], + [70175, 0, " "], + [70176, 0, "t"], + [70177, 0, "h"], + [70178, 0, "e"], + [70179, 0, " "], + [70180, 0, "d"], + [70181, 0, "e"], + [70182, 0, "s"], + [70183, 0, "i"], + [70184, 0, "r"], + [70185, 0, "e"], + [70186, 0, "d"], + [70187, 0, " "], + [70188, 0, "n"], + [70189, 0, "o"], + [70190, 0, "t"], + [70191, 0, "i"], + [70192, 0, "o"], + [70193, 0, "n"], + [70194, 0, " "], + [70195, 0, "o"], + [70196, 0, "f"], + [70197, 0, " "], + [70198, 0, "c"], + [70199, 0, "o"], + [70200, 0, "n"], + [70201, 0, "v"], + [70202, 0, "e"], + [70203, 0, "r"], + [70204, 0, "g"], + [70205, 0, "e"], + [70206, 0, "n"], + [70207, 0, "c"], + [70208, 0, "e"], + [70209, 0, ":"], + [70210, 0, " "], + [70211, 0, "a"], + [70212, 0, "l"], + [70213, 0, "l"], + [70214, 0, " "], + [70215, 0, "r"], + [70216, 0, "e"], + [70217, 0, "p"], + [70218, 0, "l"], + [70219, 0, "i"], + [70220, 0, "c"], + [70221, 0, "a"], + [70222, 0, "s"], + [70223, 0, " "], + [70224, 0, "e"], + [70225, 0, "v"], + [70226, 0, "e"], + [70227, 0, "n"], + [70228, 0, "t"], + [70229, 0, "u"], + [70230, 0, "a"], + [70231, 0, "l"], + [70232, 0, "l"], + [70233, 0, "y"], + [70234, 0, " "], + [70235, 0, "e"], + [70236, 0, "n"], + [70237, 0, "d"], + [70238, 0, " "], + [70239, 0, "u"], + [70240, 0, "p"], + [70241, 0, " "], + [70242, 0, "i"], + [70243, 0, "n"], + [70244, 0, " "], + [70245, 0, "t"], + [70246, 0, "h"], + [70247, 0, "e"], + [70248, 0, " "], + [70249, 0, "s"], + [70250, 0, "a"], + [70251, 0, "m"], + [70252, 0, "e"], + [70253, 0, " "], + [70254, 0, "s"], + [70255, 0, "t"], + [70256, 0, "a"], + [70257, 0, "t"], + [70258, 0, "e"], + [70259, 0, "."], + [70260, 0, "\n"], + [70261, 0, "\n"], + [70262, 0, "T"], + [70263, 0, "h"], + [70264, 0, "e"], + [70265, 0, " "], + [70266, 0, "l"], + [70267, 0, "i"], + [70268, 0, "v"], + [70269, 0, "e"], + [70270, 0, "n"], + [70271, 0, "e"], + [70272, 0, "s"], + [70273, 0, "s"], + [70274, 0, " "], + [70275, 0, "p"], + [70276, 0, "r"], + [70277, 0, "o"], + [70278, 0, "p"], + [70279, 0, "e"], + [70280, 0, "r"], + [70281, 0, "t"], + [70282, 0, "y"], + [70283, 0, " "], + [70284, 0, "d"], + [70285, 0, "e"], + [70286, 0, "p"], + [70287, 0, "e"], + [70288, 0, "n"], + [70289, 0, "d"], + [70290, 0, "s"], + [70291, 0, " "], + [70292, 0, "o"], + [70293, 0, "n"], + [70294, 0, " "], + [70295, 0, "a"], + [70296, 0, "s"], + [70297, 0, "s"], + [70298, 0, "u"], + [70299, 0, "m"], + [70300, 0, "p"], + [70301, 0, "t"], + [70302, 0, "i"], + [70303, 0, "o"], + [70304, 0, "n"], + [70305, 0, "s"], + [70306, 0, " "], + [70307, 0, "o"], + [70308, 0, "f"], + [70309, 0, " "], + [70310, 0, "r"], + [70311, 0, "e"], + [70312, 0, "p"], + [70313, 0, "l"], + [70314, 0, "i"], + [70315, 0, "c"], + [70316, 0, "a"], + [70317, 0, "s"], + [70318, 0, " "], + [70319, 0, "i"], + [70320, 0, "n"], + [70321, 0, "v"], + [70322, 0, "o"], + [70323, 0, "k"], + [70324, 0, "i"], + [70325, 0, "n"], + [70326, 0, "g"], + [70327, 0, " "], + [70328, 0, "\\"], + [70329, 0, "m"], + [70330, 0, "a"], + [70330, 1], + [70329, 1], + [70329, 0, "t"], + [70330, 0, "e"], + [70331, 0, "x"], + [70332, 0, "t"], + [70333, 0, "s"], + [70334, 0, "f"], + [70335, 0, "{"], + [70336, 0, "y"], + [70337, 0, "i"], + [70338, 0, "e"], + [70339, 0, "l"], + [70340, 0, "d"], + [70341, 0, "}"], + [70342, 0, " "], + [70343, 0, "s"], + [70344, 0, "u"], + [70345, 0, "f"], + [70346, 0, "f"], + [70347, 0, "i"], + [70348, 0, "c"], + [70349, 0, "i"], + [70350, 0, "e"], + [70351, 0, "n"], + [70352, 0, "t"], + [70353, 0, "l"], + [70354, 0, "y"], + [70355, 0, " "], + [70356, 0, "o"], + [70357, 0, "f"], + [70358, 0, "t"], + [70359, 0, "e"], + [70360, 0, "n"], + [70361, 0, ","], + [70362, 0, " "], + [70363, 0, "a"], + [70364, 0, "n"], + [70365, 0, "d"], + [70366, 0, " "], + [70367, 0, "a"], + [70368, 0, "l"], + [70369, 0, "l"], + [70370, 0, " "], + [70371, 0, "n"], + [70372, 0, "o"], + [70373, 0, "n"], + [70374, 0, "d"], + [70375, 0, "e"], + [70376, 0, "t"], + [70377, 0, "e"], + [70378, 0, "r"], + [70379, 0, "m"], + [70380, 0, "i"], + [70381, 0, "n"], + [70382, 0, "i"], + [70383, 0, "s"], + [70384, 0, "t"], + [70385, 0, "i"], + [70386, 0, "c"], + [70387, 0, " "], + [70388, 0, "r"], + [70389, 0, "u"], + [70390, 0, "l"], + [70391, 0, "e"], + [70392, 0, "s"], + [70393, 0, " "], + [70394, 0, "f"], + [70395, 0, "o"], + [70396, 0, "r"], + [70397, 0, " "], + [70398, 0, "t"], + [70399, 0, "e"], + [70400, 0, "x"], + [70400, 1], + [70399, 1], + [70398, 1], + [70398, 0, "\\"], + [70399, 0, "t"], + [70400, 0, "e"], + [70401, 0, "x"], + [70402, 0, "t"], + [70403, 0, "s"], + [70404, 0, "f"], + [70405, 0, "{"], + [70406, 0, "y"], + [70407, 0, "i"], + [70408, 0, "e"], + [70409, 0, "l"], + [70410, 0, "d"], + [70411, 0, "}"], + [70412, 0, " "], + [70413, 0, "b"], + [70414, 0, "e"], + [70415, 0, "i"], + [70416, 0, "n"], + [70417, 0, "g"], + [70418, 0, " "], + [70419, 0, "c"], + [70420, 0, "h"], + [70421, 0, "o"], + [70422, 0, "s"], + [70423, 0, "e"], + [70424, 0, "n"], + [70425, 0, " "], + [70426, 0, "f"], + [70427, 0, "a"], + [70428, 0, "i"], + [70429, 0, "r"], + [70430, 0, "l"], + [70431, 0, "y"], + [70432, 0, "."], + [70433, 0, " "], + [70434, 0, "W"], + [70435, 0, "e"], + [70436, 0, " "], + [70437, 0, "w"], + [70438, 0, "i"], + [70439, 0, "l"], + [70440, 0, "l"], + [70441, 0, " "], + [70442, 0, "n"], + [70443, 0, "o"], + [70444, 0, "t"], + [70445, 0, " "], + [70446, 0, "f"], + [70447, 0, "o"], + [70448, 0, "r"], + [70449, 0, "m"], + [70450, 0, "a"], + [70451, 0, "l"], + [70452, 0, "i"], + [70453, 0, "z"], + [70454, 0, "e"], + [70455, 0, " "], + [70456, 0, "t"], + [70457, 0, "h"], + [70458, 0, "e"], + [70459, 0, " "], + [70460, 0, "l"], + [70461, 0, "i"], + [70462, 0, "v"], + [70463, 0, "e"], + [70464, 0, "n"], + [70465, 0, "e"], + [70466, 0, "s"], + [70467, 0, "s"], + [70468, 0, " "], + [70469, 0, "p"], + [70470, 0, "r"], + [70471, 0, "o"], + [70472, 0, "p"], + [70473, 0, "e"], + [70474, 0, "r"], + [70475, 0, "t"], + [70476, 0, "y"], + [70477, 0, " "], + [70478, 0, "i"], + [70479, 0, "n"], + [70480, 0, " "], + [70481, 0, "t"], + [70482, 0, "h"], + [70483, 0, "i"], + [70484, 0, "s"], + [70485, 0, " "], + [70486, 0, "p"], + [70487, 0, "a"], + [70488, 0, "p"], + [70489, 0, "e"], + [70490, 0, "r"], + [70491, 0, ","], + [70492, 0, " "], + [70493, 0, "b"], + [70494, 0, "u"], + [70495, 0, "t"], + [70496, 0, " "], + [70497, 0, "a"], + [70498, 0, "s"], + [70499, 0, "s"], + [70500, 0, "e"], + [70501, 0, "r"], + [70502, 0, "t"], + [70503, 0, " "], + [70504, 0, "t"], + [70505, 0, "h"], + [70506, 0, "a"], + [70507, 0, "t"], + [70508, 0, " "], + [70509, 0, "i"], + [70510, 0, "t"], + [70511, 0, " "], + [70512, 0, "c"], + [70513, 0, "a"], + [70514, 0, "n"], + [70515, 0, " "], + [70516, 0, "b"], + [70517, 0, "e"], + [70518, 0, " "], + [70519, 0, "p"], + [70520, 0, "r"], + [70521, 0, "o"], + [70522, 0, "v"], + [70523, 0, "i"], + [70524, 0, "d"], + [70525, 0, "e"], + [70526, 0, "d"], + [70527, 0, " "], + [70528, 0, "i"], + [70529, 0, "n"], + [70530, 0, " "], + [70531, 0, "p"], + [70532, 0, "r"], + [70533, 0, "a"], + [70534, 0, "c"], + [70535, 0, "t"], + [70536, 0, "i"], + [70537, 0, "c"], + [70538, 0, "e"], + [70539, 0, ","], + [70540, 0, " "], + [70541, 0, "a"], + [70542, 0, "s"], + [70543, 0, " "], + [70544, 0, "n"], + [70545, 0, "e"], + [70546, 0, "t"], + [70547, 0, "w"], + [70548, 0, "o"], + [70549, 0, "r"], + [70550, 0, "k"], + [70551, 0, " "], + [70552, 0, "i"], + [70553, 0, "n"], + [70554, 0, "t"], + [70555, 0, "e"], + [70556, 0, "r"], + [70557, 0, "r"], + [70558, 0, "u"], + [70559, 0, "p"], + [70560, 0, "t"], + [70561, 0, "i"], + [70562, 0, "o"], + [70563, 0, "n"], + [70564, 0, "s"], + [70565, 0, " "], + [70566, 0, "a"], + [70567, 0, "r"], + [70568, 0, "e"], + [70569, 0, " "], + [70570, 0, "u"], + [70571, 0, "s"], + [70572, 0, "u"], + [70573, 0, "a"], + [70574, 0, "l"], + [70575, 0, "l"], + [70576, 0, "y"], + [70577, 0, " "], + [70578, 0, "o"], + [70579, 0, "f"], + [70580, 0, " "], + [70581, 0, "f"], + [70582, 0, "i"], + [70583, 0, "n"], + [70584, 0, "i"], + [70585, 0, "t"], + [70586, 0, "e"], + [70587, 0, " "], + [70588, 0, "d"], + [70589, 0, "u"], + [70590, 0, "r"], + [70591, 0, "a"], + [70592, 0, "t"], + [70593, 0, "i"], + [70594, 0, "o"], + [70595, 0, "n"], + [70596, 0, "."], + [70512, 0, "u"], + [70513, 0, "s"], + [70514, 0, "u"], + [70515, 0, "a"], + [70516, 0, "l"], + [70517, 0, "l"], + [70518, 0, "y"], + [70519, 0, " "], + [70519, 1], + [70518, 1], + [70517, 1], + [70516, 1], + [70515, 1], + [70514, 1], + [70513, 1], + [70512, 1], + [70515, 0, " "], + [70516, 0, "u"], + [70517, 0, "s"], + [70518, 0, "u"], + [70519, 0, "a"], + [70520, 0, "l"], + [70521, 0, "l"], + [70522, 0, "y"], + [69650, 0, "\n"], + [69651, 0, "\n"], + [69652, 0, "\\"], + [69653, 0, "b"], + [69654, 0, "e"], + [69655, 0, "g"], + [69656, 0, "i"], + [69657, 0, "n"], + [69658, 0, "{"], + [69659, 0, "d"], + [69660, 0, "e"], + [69661, 0, "f"], + [69662, 0, "i"], + [69663, 0, "n"], + [69664, 0, "i"], + [69665, 0, "t"], + [69666, 0, "i"], + [69667, 0, "o"], + [69668, 0, "n"], + [69669, 0, "}"], + [69670, 0, "\n"], + [69671, 0, "\\"], + [69672, 0, "e"], + [69673, 0, "n"], + [69674, 0, "d"], + [69675, 0, "{"], + [69676, 0, "d"], + [69677, 0, "e"], + [69678, 0, "f"], + [69679, 0, "i"], + [69680, 0, "n"], + [69681, 0, "i"], + [69682, 0, "t"], + [69683, 0, "i"], + [69684, 0, "o"], + [69685, 0, "n"], + [69686, 0, "}"], + [69670, 0, "\n"], + [69671, 0, "T"], + [69672, 0, "h"], + [69673, 0, "e"], + [69674, 0, " "], + [69675, 0, "\\"], + [69676, 0, "m"], + [69676, 1], + [69676, 0, "e"], + [69677, 0, "m"], + [69678, 0, "p"], + [69679, 0, "h"], + [69680, 0, "{"], + [69681, 0, "d"], + [69682, 0, "o"], + [69683, 0, "c"], + [69684, 0, "u"], + [69685, 0, "m"], + [69686, 0, "e"], + [69687, 0, "n"], + [69688, 0, "t"], + [69689, 0, " "], + [69690, 0, "s"], + [69691, 0, "t"], + [69692, 0, "a"], + [69693, 0, "t"], + [69694, 0, "e"], + [69695, 0, "}"], + [69696, 0, " "], + [69697, 0, "o"], + [69698, 0, "f"], + [69699, 0, " "], + [69700, 0, "a"], + [69701, 0, " "], + [69702, 0, "r"], + [69703, 0, "e"], + [69704, 0, "p"], + [69705, 0, "l"], + [69706, 0, "i"], + [69707, 0, "c"], + [69708, 0, "a"], + [69709, 0, " "], + [69710, 0, "$"], + [69711, 0, "p"], + [69712, 0, "$"], + [69713, 0, " "], + [69714, 0, "i"], + [69715, 0, "s"], + [69716, 0, " "], + [69717, 0, "t"], + [69718, 0, "h"], + [69719, 0, "e"], + [69720, 0, " "], + [69721, 0, "s"], + [69722, 0, "u"], + [69723, 0, "b"], + [69724, 0, "t"], + [69725, 0, "r"], + [69726, 0, "e"], + [69727, 0, "e"], + [69728, 0, " "], + [69729, 0, "o"], + [69730, 0, "f"], + [69731, 0, " "], + [69732, 0, "$"], + [69733, 0, "A"], + [69734, 0, "_"], + [69735, 0, "p"], + [69736, 0, "$"], + [69737, 0, " "], + [69738, 0, "c"], + [69739, 0, "o"], + [69740, 0, "n"], + [69741, 0, "t"], + [69742, 0, "a"], + [69743, 0, "i"], + [69744, 0, "n"], + [69745, 0, "i"], + [69746, 0, "n"], + [69747, 0, "g"], + [69748, 0, " "], + [69749, 0, "t"], + [69750, 0, "h"], + [69751, 0, "e"], + [69752, 0, " "], + [69753, 0, "d"], + [69754, 0, "o"], + [69755, 0, "c"], + [69756, 0, "u"], + [69757, 0, "m"], + [69758, 0, "e"], + [69759, 0, "n"], + [69760, 0, "t"], + [69761, 0, " "], + [69761, 1], + [69761, 0, ":"], + [69762, 0, " "], + [69763, 0, "t"], + [69764, 0, "h"], + [69765, 0, "a"], + [69766, 0, "t"], + [69767, 0, " "], + [69768, 0, "i"], + [69769, 0, "s"], + [69770, 0, ","], + [69771, 0, " "], + [69772, 0, "$"], + [69773, 0, "A"], + [69774, 0, "_"], + [69775, 0, "p"], + [69776, 0, "("], + [69777, 0, "\\"], + [69778, 0, "m"], + [69779, 0, "a"], + [69780, 0, "t"], + [69781, 0, "h"], + [69782, 0, "s"], + [69783, 0, "f"], + [69784, 0, "{"], + [69785, 0, "m"], + [69786, 0, "a"], + [69787, 0, "p"], + [69788, 0, "T"], + [69789, 0, "}"], + [69790, 0, "("], + [69791, 0, "\\"], + [69792, 0, "m"], + [69793, 0, "a"], + [69794, 0, "t"], + [69795, 0, "h"], + [69796, 0, "s"], + [69797, 0, "f"], + [69798, 0, "{"], + [69799, 0, "d"], + [69800, 0, "o"], + [69801, 0, "c"], + [69802, 0, "}"], + [69803, 0, ")"], + [69804, 0, "$"], + [69805, 0, " "], + [69806, 0, "o"], + [69807, 0, "r"], + [69808, 0, " "], + [69809, 0, "$"], + [69810, 0, "A"], + [69811, 0, "_"], + [69812, 0, "p"], + [69813, 0, "("], + [69814, 0, "\\"], + [69815, 0, "m"], + [69816, 0, "a"], + [69817, 0, "t"], + [69818, 0, "h"], + [69819, 0, "s"], + [69820, 0, "f"], + [69821, 0, "{"], + [69822, 0, "l"], + [69823, 0, "i"], + [69824, 0, "s"], + [69825, 0, "t"], + [69826, 0, "T"], + [69827, 0, "}"], + [69828, 0, "("], + [69829, 0, "\\"], + [69830, 0, "m"], + [69831, 0, "a"], + [69832, 0, "t"], + [69833, 0, "h"], + [69834, 0, "s"], + [69835, 0, "f"], + [69836, 0, "{"], + [69837, 0, "d"], + [69838, 0, "o"], + [69839, 0, "c"], + [69840, 0, "}"], + [69841, 0, ")"], + [69842, 0, "$"], + [69843, 0, " "], + [69844, 0, "o"], + [69845, 0, "r"], + [69846, 0, " "], + [69847, 0, "$"], + [69848, 0, "A"], + [69849, 0, "_"], + [69850, 0, "p"], + [69851, 0, "("], + [69852, 0, "\\"], + [69853, 0, "m"], + [69854, 0, "a"], + [69855, 0, "t"], + [69856, 0, "h"], + [69857, 0, "s"], + [69858, 0, "f"], + [69859, 0, "{"], + [69860, 0, "r"], + [69861, 0, "e"], + [69862, 0, "g"], + [69863, 0, "T"], + [69864, 0, "}"], + [69865, 0, "("], + [69866, 0, "\\"], + [69867, 0, "m"], + [69868, 0, "a"], + [69869, 0, "t"], + [69870, 0, "h"], + [69871, 0, "s"], + [69872, 0, "f"], + [69873, 0, "{"], + [69874, 0, "d"], + [69875, 0, "o"], + [69876, 0, "c"], + [69877, 0, "}"], + [69878, 0, ")"], + [69879, 0, "$"], + [69880, 0, ","], + [69881, 0, " "], + [69882, 0, "w"], + [69883, 0, "h"], + [69884, 0, "c"], + [69884, 1], + [69884, 0, "i"], + [69885, 0, "c"], + [69886, 0, "h"], + [69887, 0, "e"], + [69888, 0, "v"], + [69889, 0, "e"], + [69890, 0, "r"], + [69891, 0, " "], + [69892, 0, "i"], + [69893, 0, "s"], + [69894, 0, " "], + [69895, 0, "d"], + [69896, 0, "e"], + [69897, 0, "f"], + [69898, 0, "i"], + [69899, 0, "n"], + [69900, 0, "e"], + [69901, 0, "d"], + [69902, 0, "."], + [69920, 0, "\n"], + [69921, 0, "\n"], + [69922, 0, "T"], + [69923, 0, "h"], + [69924, 0, "e"], + [69925, 0, " "], + [69926, 0, "d"], + [69927, 0, "o"], + [69928, 0, "c"], + [69929, 0, "u"], + [69930, 0, "m"], + [69931, 0, "e"], + [69932, 0, "n"], + [69933, 0, "t"], + [69934, 0, " "], + [69935, 0, "s"], + [69936, 0, "t"], + [69937, 0, "a"], + [69938, 0, "t"], + [69939, 0, "e"], + [69940, 0, " "], + [69941, 0, "e"], + [69942, 0, "x"], + [69943, 0, "c"], + [69944, 0, "l"], + [69945, 0, "u"], + [69946, 0, "d"], + [69947, 0, "e"], + [69948, 0, "s"], + [69949, 0, " "], + [69950, 0, "a"], + [69951, 0, "n"], + [69952, 0, "y"], + [69953, 0, " "], + [69954, 0, "v"], + [69955, 0, "a"], + [69956, 0, "r"], + [69957, 0, "i"], + [69958, 0, "a"], + [69959, 0, "b"], + [69960, 0, "l"], + [69961, 0, "e"], + [69962, 0, "s"], + [69963, 0, " "], + [69964, 0, "d"], + [69965, 0, "e"], + [69966, 0, "f"], + [69967, 0, "i"], + [69968, 0, "n"], + [69969, 0, "e"], + [69970, 0, "d"], + [69971, 0, " "], + [69972, 0, "w"], + [69973, 0, "i"], + [69974, 0, "t"], + [69975, 0, "h"], + [69976, 0, " "], + [69977, 0, "\\"], + [69978, 0, "m"], + [69979, 0, "a"], + [69980, 0, "t"], + [69981, 0, "h"], + [69981, 1], + [69980, 1], + [69979, 1], + [69978, 1], + [69978, 0, "t"], + [69979, 0, "e"], + [69980, 0, "x"], + [69981, 0, "t"], + [69982, 0, "s"], + [69983, 0, "f"], + [69984, 0, "{"], + [69985, 0, "l"], + [69986, 0, "e"], + [69987, 0, "t"], + [69988, 0, "}"], + [69989, 0, ","], + [69990, 0, " "], + [69991, 0, "s"], + [69992, 0, "i"], + [69993, 0, "n"], + [69994, 0, "c"], + [69995, 0, "e"], + [69996, 0, " "], + [69997, 0, "t"], + [69998, 0, "h"], + [69999, 0, "e"], + [70000, 0, "y"], + [70001, 0, " "], + [70002, 0, "a"], + [70003, 0, "r"], + [70004, 0, "e"], + [70005, 0, " "], + [70006, 0, "l"], + [70007, 0, "o"], + [70008, 0, "c"], + [70009, 0, "a"], + [70010, 0, "l"], + [70011, 0, " "], + [70012, 0, "t"], + [70013, 0, "o"], + [70014, 0, " "], + [70015, 0, "o"], + [70016, 0, "n"], + [70017, 0, "e"], + [70018, 0, " "], + [70019, 0, "r"], + [70020, 0, "e"], + [70021, 0, "p"], + [70022, 0, "l"], + [70023, 0, "i"], + [70024, 0, "c"], + [70025, 0, "a"], + [70026, 0, ","], + [70027, 0, " "], + [70028, 0, "a"], + [70029, 0, "n"], + [70030, 0, "d"], + [70031, 0, " "], + [70032, 0, "n"], + [70033, 0, "o"], + [70034, 0, "t"], + [70035, 0, " "], + [70036, 0, "p"], + [70037, 0, "a"], + [70038, 0, "r"], + [70039, 0, "t"], + [70040, 0, " "], + [70041, 0, "o"], + [70042, 0, "f"], + [70043, 0, " "], + [70044, 0, "t"], + [70045, 0, "h"], + [70046, 0, "e"], + [70047, 0, " "], + [70048, 0, "s"], + [70049, 0, "t"], + [70050, 0, "a"], + [70051, 0, "t"], + [70052, 0, "e"], + [70053, 0, " "], + [70054, 0, "t"], + [70055, 0, "h"], + [70056, 0, "a"], + [70057, 0, "t"], + [70058, 0, " "], + [70059, 0, "i"], + [70060, 0, "s"], + [70061, 0, " "], + [70062, 0, "r"], + [70063, 0, "e"], + [70064, 0, "p"], + [70065, 0, "l"], + [70066, 0, "i"], + [70067, 0, "c"], + [70068, 0, "a"], + [70069, 0, "t"], + [70070, 0, "e"], + [70071, 0, "d"], + [70072, 0, "."], + [70047, 0, " "], + [70048, 0, "r"], + [70049, 0, "e"], + [70050, 0, "p"], + [70051, 0, "l"], + [70052, 0, "i"], + [70053, 0, "c"], + [70054, 0, "a"], + [70055, 0, "t"], + [70056, 0, "e"], + [70057, 0, "d"], + [70082, 1], + [70081, 1], + [70080, 1], + [70079, 1], + [70078, 1], + [70077, 1], + [70076, 1], + [70075, 1], + [70074, 1], + [70073, 1], + [70072, 1], + [70071, 1], + [70070, 1], + [70069, 1], + [70068, 1], + [70067, 1], + [70066, 1], + [70065, 1], + [70064, 1], + [69952, 1], + [69951, 1], + [69950, 1], + [69949, 1], + [69948, 1], + [69947, 1], + [69946, 1], + [69945, 1], + [69944, 1], + [69943, 1], + [69942, 1], + [69941, 1], + [69940, 1], + [69939, 1], + [69938, 1], + [69937, 1], + [69936, 1], + [69935, 1], + [69934, 1], + [69933, 1], + [69932, 1], + [69931, 1], + [69930, 1], + [69929, 1], + [69928, 1], + [69927, 1], + [69926, 1], + [69925, 1], + [69924, 1], + [69923, 1], + [69922, 1], + [69922, 0, "$"], + [69923, 0, "A"], + [69924, 0, "_"], + [69925, 0, "p"], + [69926, 0, "$"], + [69922, 0, "W"], + [69923, 0, "e"], + [69924, 0, " "], + [69925, 0, "n"], + [69926, 0, "e"], + [69927, 0, "e"], + [69928, 0, "d"], + [69929, 0, " "], + [69930, 0, "t"], + [69931, 0, "h"], + [69932, 0, "i"], + [69933, 0, "s"], + [69934, 0, " "], + [69935, 0, "d"], + [69936, 0, "e"], + [69937, 0, "f"], + [69938, 0, "i"], + [69939, 0, "n"], + [69940, 0, "i"], + [69941, 0, "t"], + [69942, 0, "i"], + [69943, 0, "o"], + [69944, 0, "n"], + [69945, 0, " "], + [69946, 0, "b"], + [69947, 0, "e"], + [69948, 0, "c"], + [69949, 0, "a"], + [69950, 0, "u"], + [69951, 0, "s"], + [69952, 0, "e"], + [69953, 0, " "], + [69959, 0, " "], + [69960, 0, "c"], + [69961, 0, "o"], + [69962, 0, "n"], + [69963, 0, "t"], + [69964, 0, "a"], + [69965, 0, "i"], + [69966, 0, "n"], + [69967, 0, "s"], + [70015, 1], + [70014, 1], + [70013, 1], + [70012, 1], + [70011, 1], + [70010, 1], + [70009, 1], + [70008, 1], + [70007, 1], + [70006, 1], + [70006, 0, "w"], + [70007, 0, "h"], + [70008, 0, "i"], + [70009, 0, "c"], + [70010, 0, "h"], + [70075, 0, " "], + [70076, 0, "T"], + [69953, 1], + [69952, 1], + [69951, 1], + [69950, 1], + [69949, 1], + [69948, 1], + [69947, 1], + [69946, 1], + [69945, 1], + [69944, 1], + [69943, 1], + [69942, 1], + [69941, 1], + [69940, 1], + [69939, 1], + [69938, 1], + [69937, 1], + [69936, 1], + [69935, 1], + [69934, 1], + [69933, 1], + [69932, 1], + [69931, 1], + [69930, 1], + [69929, 1], + [69928, 1], + [69927, 1], + [69926, 1], + [69925, 1], + [69924, 1], + [69923, 1], + [69922, 1], + [70045, 0, "h"], + [70046, 0, "e"], + [70047, 0, " "], + [70048, 0, "d"], + [70049, 0, "e"], + [70050, 0, "f"], + [70051, 0, "i"], + [70052, 0, "n"], + [70053, 0, "i"], + [70054, 0, "t"], + [70055, 0, "i"], + [70056, 0, "o"], + [70057, 0, "n"], + [70058, 0, " "], + [70059, 0, "o"], + [70060, 0, "f"], + [70061, 0, " "], + [70062, 0, "d"], + [70063, 0, "o"], + [70064, 0, "c"], + [70065, 0, "u"], + [70066, 0, "m"], + [70067, 0, "e"], + [70068, 0, "n"], + [70069, 0, "t"], + [70070, 0, " "], + [70071, 0, "s"], + [70072, 0, "t"], + [70073, 0, "a"], + [70074, 0, "t"], + [70075, 0, "e"], + [70076, 0, " "], + [70077, 0, "e"], + [70078, 0, "x"], + [70079, 0, "c"], + [70080, 0, "l"], + [70081, 0, "u"], + [70082, 0, "d"], + [70083, 0, "e"], + [70084, 0, "s"], + [70085, 0, " "], + [70086, 0, "t"], + [70087, 0, "h"], + [70088, 0, "e"], + [70089, 0, "s"], + [70090, 0, "e"], + [70091, 0, " "], + [70092, 0, "v"], + [70093, 0, "a"], + [70094, 0, "r"], + [70095, 0, "i"], + [70096, 0, "a"], + [70097, 0, "b"], + [70098, 0, "l"], + [70099, 0, "e"], + [70100, 0, "s"], + [70101, 0, "."], + [70118, 1], + [70296, 1], + [70296, 0, "-"], + [70297, 0, "u"], + [70298, 0, "n"], + [70299, 0, "n"], + [70300, 0, "u"], + [70301, 0, "m"], + [70302, 0, "b"], + [70303, 0, "e"], + [70304, 0, "r"], + [70305, 0, "e"], + [70306, 0, "d"], + [70118, 0, "-"], + [70119, 0, "u"], + [70119, 1], + [70118, 1], + [70117, 1], + [70116, 1], + [70115, 1], + [70114, 1], + [70113, 1], + [70113, 0, "m"], + [70114, 0, ":"], + [70115, 0, "c"], + [70116, 0, "o"], + [70117, 0, "n"], + [70118, 0, "v"], + [70119, 0, "e"], + [70120, 0, "r"], + [70121, 0, "g"], + [70122, 0, "e"], + [70123, 0, "n"], + [70124, 0, "c"], + [70125, 0, "e"], + [70314, 1], + [70313, 1], + [70312, 1], + [70311, 1], + [70310, 1], + [70309, 1], + [70308, 1], + [70307, 1], + [70306, 1], + [70305, 1], + [70304, 1], + [70303, 1], + [70302, 1], + [70301, 1], + [70300, 1], + [70299, 1], + [70299, 0, "m"], + [70300, 0, "-"], + [70301, 0, "c"], + [70302, 0, "o"], + [70303, 0, "n"], + [70304, 0, "v"], + [70305, 0, "e"], + [70306, 0, "r"], + [70307, 0, "g"], + [70308, 0, "e"], + [70309, 0, "n"], + [70310, 0, "c"], + [70311, 0, "e"], + [70312, 0, "-"], + [70313, 0, "t"], + [70314, 0, "h"], + [70315, 0, "m"], + [70300, 1], + [70299, 1], + [70298, 1], + [70297, 1], + [70114, 1], + [70113, 1], + [70112, 1], + [70111, 1], + [70122, 0, "-"], + [70123, 0, "t"], + [70124, 0, "h"], + [70125, 0, "m"], + [462, 0, "\n"], + [463, 0, "\\"], + [464, 0, "n"], + [465, 0, "e"], + [466, 0, "w"], + [467, 0, "t"], + [468, 0, "h"], + [469, 0, "e"], + [470, 0, "o"], + [471, 0, "r"], + [472, 0, "e"], + [473, 0, "m"], + [474, 0, "*"], + [475, 0, "{"], + [476, 0, "c"], + [477, 0, "o"], + [478, 0, "n"], + [479, 0, "v"], + [480, 0, "e"], + [481, 0, "r"], + [482, 0, "g"], + [483, 0, "e"], + [484, 0, "n"], + [485, 0, "c"], + [486, 0, "e"], + [487, 0, "-"], + [488, 0, "t"], + [489, 0, "h"], + [490, 0, "m"], + [491, 0, "}"], + [492, 0, "{"], + [493, 0, "T"], + [494, 0, "h"], + [495, 0, "e"], + [496, 0, "o"], + [497, 0, "r"], + [498, 0, "e"], + [499, 0, "m"], + [500, 0, "}"], + [69843, 0, ")"], + [69881, 0, ")"], + [69919, 0, ")"], + [69232, 0, " "], + [69233, 0, "a"], + [69234, 0, "t"], + [69235, 0, " "], + [69236, 0, "a"], + [69237, 0, " "], + [69238, 0, "g"], + [69239, 0, "i"], + [69240, 0, "v"], + [69241, 0, "e"], + [69242, 0, "n"], + [69243, 0, " "], + [69244, 0, "r"], + [69245, 0, "e"], + [69246, 0, "p"], + [69247, 0, "l"], + [69248, 0, "i"], + [69249, 0, "c"], + [69250, 0, "a"], + [69573, 1], + [69572, 1], + [69572, 0, "a"], + [69573, 0, "r"], + [69574, 0, "e"], + [69570, 1], + [69570, 0, "i"], + [69571, 0, "e"], + [69572, 0, "s"], + [69563, 1], + [69562, 1], + [69561, 1], + [69560, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 1], + [71172, 0, "I"], + [71173, 0, "n"], + [71174, 0, " "], + [71175, 0, "t"], + [71176, 0, "h"], + [71177, 0, "i"], + [71178, 0, "s"], + [71179, 0, " "], + [71180, 0, "p"], + [71181, 0, "a"], + [71182, 0, "p"], + [71183, 0, "e"], + [71184, 0, "r"], + [71185, 0, " "], + [71186, 0, "w"], + [71187, 0, "e"], + [71188, 0, " "], + [71189, 0, "d"], + [71190, 0, "e"], + [71191, 0, "m"], + [71192, 0, "o"], + [71193, 0, "n"], + [71194, 0, "s"], + [71195, 0, "t"], + [71196, 0, "r"], + [71197, 0, "a"], + [71198, 0, "t"], + [71199, 0, "e"], + [71200, 0, "d"], + [71201, 0, " "], + [71202, 0, "h"], + [71203, 0, "o"], + [71204, 0, "w"], + [71205, 0, " "], + [71206, 0, "t"], + [71207, 0, "o"], + [71208, 0, " "], + [71209, 0, "c"], + [71210, 0, "o"], + [71211, 0, "m"], + [71212, 0, "p"], + [71213, 0, "o"], + [71214, 0, "s"], + [71215, 0, "e"], + [71216, 0, " "], + [71217, 0, "C"], + [71217, 1], + [71217, 0, "C"], + [71218, 0, "R"], + [71219, 0, "D"], + [71220, 0, "T"], + [71221, 0, "s"], + [71222, 0, " "], + [71223, 0, "f"], + [71224, 0, "o"], + [71225, 0, "r"], + [71226, 0, " "], + [71227, 0, "o"], + [71228, 0, "r"], + [71229, 0, "d"], + [71230, 0, "e"], + [71231, 0, "r"], + [71232, 0, "e"], + [71233, 0, "d"], + [71234, 0, " "], + [71235, 0, "l"], + [71236, 0, "i"], + [71237, 0, "s"], + [71238, 0, "t"], + [71239, 0, "s"], + [71240, 0, ","], + [71241, 0, " "], + [71242, 0, "m"], + [71243, 0, "a"], + [71244, 0, "p"], + [71245, 0, "s"], + [71246, 0, " "], + [71247, 0, "a"], + [71248, 0, "n"], + [71249, 0, "d"], + [71250, 0, " "], + [71251, 0, "r"], + [71252, 0, "e"], + [71253, 0, "g"], + [71254, 0, "i"], + [71255, 0, "s"], + [71256, 0, "t"], + [71257, 0, "e"], + [71258, 0, "r"], + [71259, 0, "s"], + [71260, 0, " "], + [71261, 0, "i"], + [71262, 0, "n"], + [71263, 0, "t"], + [71264, 0, "o"], + [71265, 0, " "], + [71266, 0, "a"], + [71267, 0, " "], + [71268, 0, "c"], + [71269, 0, "o"], + [71270, 0, "m"], + [71271, 0, "p"], + [71272, 0, "o"], + [71273, 0, "u"], + [71274, 0, "n"], + [71275, 0, "d"], + [71276, 0, " "], + [71277, 0, "C"], + [71278, 0, "R"], + [71279, 0, "D"], + [71280, 0, "T"], + [71281, 0, " "], + [71282, 0, "w"], + [71283, 0, "i"], + [71284, 0, "t"], + [71285, 0, "h"], + [71286, 0, " "], + [71287, 0, "a"], + [71288, 0, " "], + [71289, 0, "J"], + [71290, 0, "S"], + [71291, 0, "O"], + [71292, 0, "N"], + [71293, 0, " "], + [71294, 0, "d"], + [71295, 0, "a"], + [71296, 0, "t"], + [71297, 0, "a"], + [71298, 0, " "], + [71299, 0, "m"], + [71300, 0, "o"], + [71301, 0, "d"], + [71302, 0, "e"], + [71303, 0, "l"], + [71304, 0, "."], + [71305, 0, " "], + [71306, 0, "I"], + [71307, 0, "t"], + [71308, 0, " "], + [71309, 0, "s"], + [71310, 0, "u"], + [71311, 0, "p"], + [71312, 0, "p"], + [71313, 0, "o"], + [71314, 0, "r"], + [71315, 0, "t"], + [71316, 0, "s"], + [71317, 0, " "], + [71318, 0, "a"], + [71319, 0, "r"], + [71320, 0, "b"], + [71321, 0, "i"], + [71322, 0, "t"], + [71323, 0, "r"], + [71324, 0, "a"], + [71325, 0, "r"], + [71326, 0, "i"], + [71327, 0, "l"], + [71328, 0, "y"], + [71329, 0, " "], + [71330, 0, "n"], + [71331, 0, "e"], + [71332, 0, "s"], + [71333, 0, "t"], + [71334, 0, "e"], + [71335, 0, "d"], + [71336, 0, " "], + [71337, 0, "l"], + [71338, 0, "i"], + [71339, 0, "s"], + [71340, 0, "t"], + [71341, 0, "s"], + [71342, 0, " "], + [71343, 0, "a"], + [71344, 0, "n"], + [71345, 0, "d"], + [71346, 0, " "], + [71347, 0, "m"], + [71348, 0, "a"], + [71349, 0, "p"], + [71350, 0, "s"], + [71351, 0, ","], + [71352, 0, " "], + [71353, 0, "a"], + [71354, 0, "n"], + [71355, 0, "d"], + [71356, 0, " "], + [71357, 0, "i"], + [71358, 0, "t"], + [71359, 0, " "], + [71360, 0, "l"], + [71360, 1], + [71360, 0, "a"], + [71361, 0, "l"], + [71362, 0, "l"], + [71363, 0, "o"], + [71364, 0, "w"], + [71365, 0, "s"], + [71366, 0, " "], + [71367, 0, "r"], + [71368, 0, "e"], + [71369, 0, "p"], + [71370, 0, "l"], + [71371, 0, "i"], + [71372, 0, "c"], + [71373, 0, "a"], + [71374, 0, "s"], + [71375, 0, " "], + [71376, 0, "t"], + [71377, 0, "o"], + [71378, 0, " "], + [71379, 0, "m"], + [71380, 0, "a"], + [71381, 0, "k"], + [71382, 0, "e"], + [71383, 0, " "], + [71384, 0, "a"], + [71385, 0, "r"], + [71386, 0, "b"], + [71387, 0, "i"], + [71388, 0, "t"], + [71389, 0, "r"], + [71390, 0, "a"], + [71391, 0, "r"], + [71392, 0, "y"], + [71393, 0, " "], + [71394, 0, "c"], + [71395, 0, "h"], + [71396, 0, "a"], + [71397, 0, "n"], + [71398, 0, "g"], + [71399, 0, "e"], + [71400, 0, "s"], + [71401, 0, " "], + [71402, 0, "t"], + [71403, 0, "o"], + [71404, 0, " "], + [71405, 0, "t"], + [71406, 0, "h"], + [71407, 0, "e"], + [71408, 0, " "], + [71409, 0, "d"], + [71410, 0, "a"], + [71411, 0, "t"], + [71412, 0, "a"], + [71413, 0, " "], + [71414, 0, "w"], + [71415, 0, "i"], + [71416, 0, "t"], + [71417, 0, "h"], + [71418, 0, "o"], + [71419, 0, "u"], + [71420, 0, "t"], + [71421, 0, " "], + [71422, 0, "c"], + [71423, 0, "o"], + [71424, 0, "m"], + [71425, 0, "m"], + [71426, 0, "u"], + [71427, 0, "n"], + [71428, 0, "i"], + [71429, 0, "c"], + [71430, 0, "a"], + [71431, 0, "t"], + [71432, 0, "i"], + [71433, 0, "n"], + [71434, 0, "g"], + [71435, 0, " "], + [71436, 0, "w"], + [71437, 0, "i"], + [71438, 0, "t"], + [71439, 0, "h"], + [71440, 0, " "], + [71422, 0, "a"], + [71423, 0, "n"], + [71424, 0, "y"], + [71425, 0, " "], + [71426, 0, "n"], + [71427, 0, "e"], + [71428, 0, "t"], + [71429, 0, "w"], + [71430, 0, "o"], + [71431, 0, "r"], + [71432, 0, "k"], + [71433, 0, " "], + [71446, 1], + [71445, 1], + [71445, 0, "o"], + [71446, 0, "n"], + [71421, 0, " "], + [71422, 0, "r"], + [71423, 0, "e"], + [71424, 0, "q"], + [71425, 0, "i"], + [71426, 0, "o"], + [71427, 0, "r"], + [71428, 0, "o"], + [71429, 0, "m"], + [71430, 0, "g"], + [71430, 1], + [71429, 1], + [71428, 1], + [71427, 1], + [71426, 1], + [71426, 0, "i"], + [71427, 0, "n"], + [71428, 0, "g"], + [71426, 0, "r"], + [71426, 0, "u"], + [71426, 1], + [71425, 1], + [71425, 0, "u"], + [71426, 0, "i"], + [71462, 1], + [71461, 1], + [71460, 1], + [71459, 1], + [71458, 1], + [71457, 1], + [71457, 0, "."], + [71458, 0, " "], + [71459, 0, "R"], + [71460, 0, "e"], + [71461, 0, "p"], + [71462, 0, "l"], + [71463, 0, "i"], + [71464, 0, "c"], + [71465, 0, "a"], + [71466, 0, "s"], + [71467, 0, " "], + [71468, 0, "a"], + [71469, 0, "s"], + [71470, 0, "y"], + [71471, 0, "n"], + [71472, 0, "c"], + [71473, 0, "h"], + [71474, 0, "r"], + [71475, 0, "o"], + [71476, 0, "n"], + [71477, 0, "o"], + [71478, 0, "u"], + [71479, 0, "s"], + [71480, 0, "l"], + [71481, 0, "y"], + [71482, 0, " "], + [71483, 0, "c"], + [71484, 0, "o"], + [71485, 0, "m"], + [71486, 0, "m"], + [71487, 0, "u"], + [71488, 0, "n"], + [71489, 0, "i"], + [71490, 0, "c"], + [71491, 0, "a"], + [71492, 0, "t"], + [71493, 0, "e"], + [71494, 0, " "], + [71495, 0, "c"], + [71496, 0, "h"], + [71497, 0, "a"], + [71497, 1], + [71496, 1], + [71495, 1], + [71495, 0, "e"], + [71496, 0, "d"], + [71497, 0, "i"], + [71498, 0, "t"], + [71499, 0, "s"], + [71500, 0, " "], + [71501, 0, "i"], + [71502, 0, "n"], + [71503, 0, " "], + [71504, 0, "t"], + [71505, 0, "h"], + [71506, 0, "e"], + [71507, 0, " "], + [71508, 0, "f"], + [71509, 0, "o"], + [71510, 0, "r"], + [71511, 0, "m"], + [71499, 1], + [71498, 1], + [71497, 1], + [71496, 1], + [71495, 1], + [71495, 0, "m"], + [71496, 0, "u"], + [71497, 0, "t"], + [71498, 0, "a"], + [71499, 0, "t"], + [71500, 0, "i"], + [71501, 0, "o"], + [71502, 0, "n"], + [71503, 0, "s"], + [71493, 1], + [71492, 1], + [71491, 1], + [71490, 1], + [71489, 1], + [71488, 1], + [71487, 1], + [71486, 1], + [71485, 1], + [71484, 1], + [71483, 1], + [71483, 0, "s"], + [71484, 0, "e"], + [71485, 0, "n"], + [71486, 0, "d"], + [71497, 0, " "], + [71498, 0, "t"], + [71499, 0, "o"], + [71500, 0, " "], + [71501, 0, "o"], + [71502, 0, "t"], + [71503, 0, "h"], + [71504, 0, "e"], + [71505, 0, "r"], + [71506, 0, " "], + [71507, 0, "r"], + [71508, 0, "e"], + [71509, 0, "p"], + [71510, 0, "l"], + [71511, 0, "i"], + [71512, 0, "c"], + [71513, 0, "a"], + [71514, 0, "s"], + [71527, 0, " "], + [71528, 0, "o"], + [71529, 0, "f"], + [71530, 0, " "], + [71531, 0, "o"], + [71532, 0, "p"], + [71533, 0, "e"], + [71534, 0, "r"], + [71535, 0, "a"], + [71536, 0, "t"], + [71537, 0, "i"], + [71538, 0, "o"], + [71539, 0, "n"], + [71540, 0, "s"], + [71541, 0, "."], + [71542, 0, " "], + [71543, 0, "C"], + [71544, 0, "o"], + [71545, 0, "n"], + [71546, 0, "c"], + [71547, 0, "u"], + [71548, 0, "r"], + [71549, 0, "r"], + [71550, 0, "e"], + [71551, 0, "n"], + [71552, 0, "t"], + [71553, 0, " "], + [71554, 0, "o"], + [71555, 0, "p"], + [71556, 0, "e"], + [71557, 0, "r"], + [71558, 0, "a"], + [71559, 0, "t"], + [71560, 0, "i"], + [71561, 0, "o"], + [71562, 0, "n"], + [71563, 0, "s"], + [71564, 0, " "], + [71565, 0, "a"], + [71566, 0, "r"], + [71567, 0, "e"], + [71568, 0, " "], + [71569, 0, "c"], + [71570, 0, "o"], + [71571, 0, "m"], + [71572, 0, "m"], + [71573, 0, "u"], + [71574, 0, "t"], + [71575, 0, "a"], + [71576, 0, "t"], + [71577, 0, "i"], + [71578, 0, "v"], + [71579, 0, "e"], + [71580, 0, ","], + [71581, 0, " "], + [71582, 0, "w"], + [71583, 0, "h"], + [71584, 0, "i"], + [71585, 0, "c"], + [71586, 0, "h"], + [71587, 0, " "], + [71588, 0, "e"], + [71589, 0, "n"], + [71590, 0, "s"], + [71591, 0, "u"], + [71592, 0, "r"], + [71593, 0, "e"], + [71594, 0, "s"], + [71595, 0, " "], + [71596, 0, "t"], + [71597, 0, "h"], + [71598, 0, "a"], + [71599, 0, "t"], + [71600, 0, " "], + [71601, 0, "r"], + [71602, 0, "e"], + [71603, 0, "p"], + [71604, 0, "l"], + [71605, 0, "i"], + [71606, 0, "c"], + [71607, 0, "a"], + [71608, 0, "s"], + [71609, 0, " "], + [71610, 0, "c"], + [71611, 0, "o"], + [71612, 0, "n"], + [71613, 0, "v"], + [71614, 0, "e"], + [71615, 0, "r"], + [71616, 0, "g"], + [71617, 0, "e"], + [71618, 0, " "], + [71619, 0, "t"], + [71620, 0, "o"], + [71621, 0, "w"], + [71622, 0, "a"], + [71623, 0, "r"], + [71624, 0, "d"], + [71625, 0, "s"], + [71626, 0, " "], + [71627, 0, "t"], + [71628, 0, "h"], + [71629, 0, "e"], + [71630, 0, " "], + [71631, 0, "s"], + [71632, 0, "a"], + [71633, 0, "m"], + [71634, 0, "e"], + [71635, 0, " "], + [71636, 0, "s"], + [71637, 0, "t"], + [71638, 0, "a"], + [71639, 0, "t"], + [71640, 0, "e"], + [71641, 0, " "], + [71642, 0, "w"], + [71643, 0, "i"], + [71644, 0, "t"], + [71645, 0, "h"], + [71646, 0, "o"], + [71647, 0, "u"], + [71648, 0, "t"], + [71649, 0, " "], + [71650, 0, "r"], + [71651, 0, "e"], + [71652, 0, "q"], + [71653, 0, "u"], + [71654, 0, "i"], + [71655, 0, "r"], + [71656, 0, "i"], + [71657, 0, "n"], + [71658, 0, "g"], + [71659, 0, " "], + [71660, 0, "a"], + [71661, 0, "n"], + [71662, 0, "y"], + [71663, 0, " "], + [71664, 0, "a"], + [71665, 0, "p"], + [71666, 0, "p"], + [71667, 0, "l"], + [71668, 0, "i"], + [71669, 0, "c"], + [71670, 0, "a"], + [71671, 0, "t"], + [71672, 0, "i"], + [71673, 0, "o"], + [71674, 0, "n"], + [71675, 0, "-"], + [71676, 0, "s"], + [71677, 0, "p"], + [71678, 0, "e"], + [71679, 0, "c"], + [71680, 0, "i"], + [71681, 0, "f"], + [71682, 0, "i"], + [71683, 0, "c"], + [71684, 0, " "], + [71685, 0, "c"], + [71686, 0, "o"], + [71687, 0, "n"], + [71662, 1], + [71661, 1], + [71660, 1], + [71659, 1], + [71684, 0, "f"], + [71685, 0, "l"], + [71686, 0, "i"], + [71687, 0, "c"], + [71688, 0, "t"], + [71689, 0, " "], + [71690, 0, "r"], + [71691, 0, "e"], + [71692, 0, "s"], + [71693, 0, "o"], + [71694, 0, "l"], + [71695, 0, "u"], + [71696, 0, "t"], + [71697, 0, "i"], + [71698, 0, "o"], + [71699, 0, "n"], + [71700, 0, " "], + [71701, 0, "l"], + [71702, 0, "o"], + [71703, 0, "g"], + [71704, 0, "i"], + [71705, 0, "c"], + [71706, 0, "."], + [71707, 0, "\n"], + [71708, 0, "\n"], + [71709, 0, "T"], + [71710, 0, "h"], + [71711, 0, "i"], + [71712, 0, "s"], + [71713, 0, " "], + [71714, 0, "w"], + [71715, 0, "o"], + [71716, 0, "r"], + [71717, 0, "k"], + [71718, 0, " "], + [71719, 0, "f"], + [71720, 0, "o"], + [71721, 0, "c"], + [71722, 0, "u"], + [71723, 0, "s"], + [71724, 0, "e"], + [71725, 0, "d"], + [71726, 0, " "], + [71727, 0, "o"], + [71728, 0, "n"], + [71729, 0, " "], + [71730, 0, "t"], + [71731, 0, "h"], + [71732, 0, "e"], + [71733, 0, " "], + [71734, 0, "f"], + [71735, 0, "o"], + [71736, 0, "r"], + [71737, 0, "m"], + [71738, 0, "a"], + [71739, 0, "l"], + [71740, 0, " "], + [71741, 0, "s"], + [71742, 0, "e"], + [71743, 0, "m"], + [71744, 0, "a"], + [71745, 0, "n"], + [71746, 0, "t"], + [71747, 0, "i"], + [71748, 0, "c"], + [71749, 0, "s"], + [71750, 0, " "], + [71751, 0, "o"], + [71752, 0, "f"], + [71753, 0, " "], + [71754, 0, "t"], + [71755, 0, "h"], + [71756, 0, "e"], + [71757, 0, " "], + [71758, 0, "J"], + [71759, 0, "S"], + [71760, 0, "O"], + [71761, 0, "N"], + [71762, 0, " "], + [71763, 0, "C"], + [71764, 0, "R"], + [71765, 0, "D"], + [71766, 0, "T"], + [71767, 0, ","], + [71768, 0, " "], + [71769, 0, "r"], + [71770, 0, "e"], + [71771, 0, "p"], + [71772, 0, "r"], + [71773, 0, "e"], + [71774, 0, "s"], + [71775, 0, "e"], + [71776, 0, "n"], + [71777, 0, "t"], + [71778, 0, "e"], + [71779, 0, "d"], + [71780, 0, " "], + [71781, 0, "a"], + [71782, 0, "s"], + [71783, 0, " "], + [71784, 0, "a"], + [71785, 0, " "], + [71786, 0, "m"], + [71787, 0, "a"], + [71788, 0, "t"], + [71789, 0, "h"], + [71790, 0, "e"], + [71791, 0, "m"], + [71792, 0, "a"], + [71793, 0, "t"], + [71794, 0, "i"], + [71795, 0, "c"], + [71796, 0, "a"], + [71797, 0, "l"], + [71798, 0, " "], + [71799, 0, "m"], + [71800, 0, "o"], + [71801, 0, "d"], + [71802, 0, "e"], + [71803, 0, "l"], + [71804, 0, "."], + [71805, 0, " "], + [71806, 0, "W"], + [71807, 0, "e"], + [71808, 0, " "], + [71809, 0, "h"], + [71810, 0, "a"], + [71811, 0, "v"], + [71812, 0, "e"], + [71813, 0, " "], + [71814, 0, "a"], + [71815, 0, "l"], + [71816, 0, "s"], + [71817, 0, "o"], + [71818, 0, " "], + [71819, 0, "c"], + [71820, 0, "r"], + [71821, 0, "e"], + [71822, 0, "a"], + [71823, 0, "t"], + [71824, 0, "e"], + [71825, 0, "d"], + [71826, 0, " "], + [71827, 0, "a"], + [71828, 0, " "], + [71829, 0, "p"], + [71830, 0, "r"], + [71831, 0, "a"], + [71832, 0, "c"], + [71833, 0, "t"], + [71834, 0, "i"], + [71835, 0, "c"], + [71836, 0, "a"], + [71837, 0, "l"], + [71838, 0, " "], + [71839, 0, "i"], + [71840, 0, "m"], + [71841, 0, "p"], + [71842, 0, "l"], + [71843, 0, "e"], + [71844, 0, "m"], + [71845, 0, "e"], + [71846, 0, "n"], + [71847, 0, "t"], + [71848, 0, "a"], + [71849, 0, "t"], + [71850, 0, "i"], + [71851, 0, "o"], + [71852, 0, "n"], + [71853, 0, " "], + [71854, 0, "a"], + [71855, 0, "n"], + [71856, 0, "d"], + [71857, 0, " "], + [71858, 0, "w"], + [71859, 0, "i"], + [71860, 0, "l"], + [71861, 0, "l"], + [71862, 0, " "], + [71863, 0, "r"], + [71864, 0, "e"], + [71865, 0, "p"], + [71866, 0, "o"], + [71867, 0, "r"], + [71868, 0, "t"], + [71869, 0, " "], + [71870, 0, "o"], + [71871, 0, "n"], + [71872, 0, " "], + [71873, 0, "i"], + [71874, 0, "t"], + [71875, 0, "s"], + [71876, 0, " "], + [71877, 0, "p"], + [71878, 0, "e"], + [71879, 0, "r"], + [71880, 0, "f"], + [71881, 0, "o"], + [71882, 0, "r"], + [71883, 0, "m"], + [71884, 0, "a"], + [71885, 0, "n"], + [71886, 0, "c"], + [71887, 0, "e"], + [71888, 0, " "], + [71889, 0, "c"], + [71890, 0, "h"], + [71891, 0, "a"], + [71892, 0, "r"], + [71893, 0, "a"], + [71894, 0, "c"], + [71895, 0, "t"], + [71896, 0, "e"], + [71897, 0, "r"], + [71898, 0, "i"], + [71899, 0, "s"], + [71900, 0, "t"], + [71901, 0, "i"], + [71902, 0, "c"], + [71903, 0, "s"], + [71904, 0, " "], + [71905, 0, "i"], + [71906, 0, "n"], + [71907, 0, " "], + [71908, 0, "a"], + [71909, 0, " "], + [71910, 0, "s"], + [71911, 0, "e"], + [71912, 0, "p"], + [71913, 0, "a"], + [71914, 0, "r"], + [71915, 0, "a"], + [71916, 0, "t"], + [71917, 0, "e"], + [71918, 0, " "], + [71919, 0, "p"], + [71920, 0, "a"], + [71921, 0, "p"], + [71922, 0, "e"], + [71923, 0, "r"], + [71924, 0, "."], + [71925, 0, " "], + [71926, 0, "I"], + [71927, 0, "n"], + [71928, 0, " "], + [71923, 1], + [71922, 1], + [71921, 1], + [71920, 1], + [71919, 1], + [71918, 1], + [71917, 1], + [71916, 1], + [71915, 1], + [71914, 1], + [71913, 1], + [71912, 1], + [71911, 1], + [71910, 1], + [71909, 1], + [71908, 1], + [71908, 0, "f"], + [71909, 0, "o"], + [71910, 0, "l"], + [71911, 0, "l"], + [71912, 0, "o"], + [71913, 0, "w"], + [71914, 0, "-"], + [71915, 0, "o"], + [71916, 0, "n"], + [71917, 0, " "], + [71918, 0, "w"], + [71919, 0, "o"], + [71920, 0, "r"], + [71921, 0, "k"], + [71927, 0, "f"], + [71928, 0, "a"], + [71929, 0, "c"], + [71930, 0, "t"], + [71931, 0, ","], + [71932, 0, " "], + [71933, 0, "w"], + [71934, 0, "e"], + [71935, 0, " "], + [71936, 0, "w"], + [71937, 0, "r"], + [71938, 0, "o"], + [71939, 0, "t"], + [71940, 0, "e"], + [71941, 0, " "], + [71942, 0, "t"], + [71943, 0, "h"], + [71944, 0, "e"], + [71945, 0, " "], + [71946, 0, "{"], + [71947, 0, "\\"], + [71948, 0, "L"], + [71949, 0, "a"], + [71950, 0, "T"], + [71951, 0, "e"], + [71952, 0, "X"], + [71953, 0, "}"], + [71954, 0, " "], + [71955, 0, "s"], + [71956, 0, "o"], + [71957, 0, "u"], + [71958, 0, "r"], + [71959, 0, "c"], + [71960, 0, "e"], + [71961, 0, " "], + [71962, 0, "t"], + [71963, 0, "e"], + [71964, 0, "x"], + [71965, 0, "t"], + [71966, 0, " "], + [71967, 0, "o"], + [71968, 0, "f"], + [71969, 0, " "], + [71970, 0, "t"], + [71971, 0, "h"], + [71972, 0, "i"], + [71973, 0, "s"], + [71974, 0, " "], + [71975, 0, "p"], + [71976, 0, "a"], + [71977, 0, "p"], + [71978, 0, "e"], + [71979, 0, "r"], + [71980, 0, " "], + [71981, 0, "u"], + [71982, 0, "s"], + [71983, 0, "i"], + [71984, 0, "n"], + [71985, 0, "g"], + [71986, 0, " "], + [71987, 0, "a"], + [71988, 0, "n"], + [71989, 0, " "], + [71990, 0, "e"], + [71991, 0, "x"], + [71992, 0, "p"], + [71993, 0, "e"], + [71994, 0, "r"], + [71995, 0, "i"], + [71996, 0, "m"], + [71997, 0, "e"], + [71998, 0, "n"], + [71999, 0, "t"], + [72000, 0, "a"], + [72001, 0, "l"], + [72002, 0, " "], + [72003, 0, "c"], + [72004, 0, "o"], + [72005, 0, "l"], + [72006, 0, "l"], + [72007, 0, "a"], + [72008, 0, "b"], + [72009, 0, "o"], + [72010, 0, "r"], + [72011, 0, "a"], + [72012, 0, "t"], + [72013, 0, "i"], + [72014, 0, "v"], + [72015, 0, "e"], + [72016, 0, " "], + [72017, 0, "t"], + [72018, 0, "e"], + [72019, 0, "x"], + [72020, 0, "t"], + [72021, 0, " "], + [72022, 0, "e"], + [72023, 0, "d"], + [72024, 0, "i"], + [72025, 0, "t"], + [72026, 0, "o"], + [72027, 0, "r"], + [72028, 0, " "], + [72029, 0, "u"], + [72030, 0, "s"], + [72031, 0, "i"], + [72032, 0, "n"], + [72033, 0, "g"], + [72034, 0, " "], + [72035, 0, "o"], + [72036, 0, "u"], + [72037, 0, "r"], + [72038, 0, " "], + [72039, 0, "i"], + [72040, 0, "m"], + [72041, 0, "p"], + [72042, 0, "l"], + [72043, 0, "e"], + [72044, 0, "m"], + [72045, 0, "e"], + [72046, 0, "n"], + [72047, 0, "t"], + [72048, 0, "a"], + [72049, 0, "t"], + [72050, 0, "i"], + [72051, 0, "o"], + [72052, 0, "n"], + [72053, 0, " "], + [72054, 0, "o"], + [72055, 0, "f"], + [72056, 0, " "], + [72057, 0, "t"], + [72058, 0, "h"], + [72059, 0, "i"], + [72060, 0, "s"], + [72061, 0, " "], + [72062, 0, "C"], + [72063, 0, "R"], + [72064, 0, "D"], + [72065, 0, "T"], + [72066, 0, "."], + [72067, 0, "\n"], + [72068, 0, "\n"], + [72069, 0, "F"], + [72070, 0, "u"], + [72071, 0, "r"], + [72072, 0, "t"], + [72073, 0, "h"], + [72074, 0, "e"], + [72075, 0, "r"], + [72076, 0, " "], + [72077, 0, "w"], + [72078, 0, "o"], + [72079, 0, "r"], + [72080, 0, "k"], + [72081, 0, " "], + [72082, 0, "w"], + [72083, 0, "i"], + [72084, 0, "l"], + [72085, 0, "l"], + [72086, 0, " "], + [72087, 0, "b"], + [72088, 0, "e"], + [72089, 0, " "], + [72090, 0, "n"], + [72091, 0, "e"], + [72092, 0, "e"], + [72093, 0, "d"], + [72094, 0, "e"], + [72095, 0, "d"], + [72096, 0, " "], + [72097, 0, "t"], + [72098, 0, "o"], + [72099, 0, " "], + [72100, 0, "e"], + [72101, 0, "x"], + [72102, 0, "p"], + [72103, 0, "l"], + [72104, 0, "o"], + [72105, 0, "r"], + [72106, 0, "e"], + [72107, 0, " "], + [72108, 0, "t"], + [72109, 0, "h"], + [72110, 0, "e"], + [72111, 0, " "], + [72112, 0, "s"], + [72113, 0, "e"], + [72114, 0, "m"], + [72115, 0, "a"], + [72116, 0, "n"], + [72117, 0, "t"], + [72118, 0, "i"], + [72119, 0, "c"], + [72120, 0, "s"], + [72121, 0, " "], + [72122, 0, "t"], + [72123, 0, "h"], + [72124, 0, "a"], + [72125, 0, "t"], + [72126, 0, " "], + [72127, 0, "a"], + [72128, 0, "p"], + [72129, 0, "p"], + [72130, 0, "l"], + [72131, 0, "i"], + [72132, 0, "c"], + [72133, 0, "a"], + [72134, 0, "t"], + [72135, 0, "i"], + [72136, 0, "o"], + [72137, 0, "n"], + [72138, 0, " "], + [72139, 0, "p"], + [72140, 0, "r"], + [72141, 0, "o"], + [72142, 0, "g"], + [72143, 0, "r"], + [72144, 0, "a"], + [72145, 0, "m"], + [72146, 0, "m"], + [72147, 0, "e"], + [72148, 0, "r"], + [72149, 0, "s"], + [72150, 0, " "], + [72151, 0, "e"], + [72152, 0, "x"], + [72153, 0, "p"], + [72154, 0, "e"], + [72155, 0, "c"], + [72156, 0, "t"], + [72157, 0, " "], + [72158, 0, "a"], + [72159, 0, "n"], + [72160, 0, "d"], + [72161, 0, " "], + [72162, 0, "r"], + [72163, 0, "e"], + [72164, 0, "q"], + [72165, 0, "u"], + [72166, 0, "i"], + [72167, 0, "r"], + [72168, 0, "e"], + [72169, 0, " "], + [72170, 0, "o"], + [72171, 0, "f"], + [72172, 0, " "], + [72173, 0, "c"], + [72174, 0, "o"], + [72175, 0, "l"], + [72176, 0, "l"], + [72177, 0, "a"], + [72178, 0, "b"], + [72179, 0, "o"], + [72180, 0, "r"], + [72181, 0, "a"], + [72182, 0, "t"], + [72183, 0, "i"], + [72184, 0, "v"], + [72185, 0, "e"], + [72186, 0, "l"], + [72187, 0, "y"], + [72188, 0, " "], + [72189, 0, "e"], + [72190, 0, "d"], + [72191, 0, "i"], + [72192, 0, "t"], + [72193, 0, "a"], + [72194, 0, "b"], + [72195, 0, "l"], + [72196, 0, "e"], + [72197, 0, " "], + [72198, 0, "d"], + [72199, 0, "a"], + [72200, 0, "t"], + [72201, 0, "a"], + [72202, 0, " "], + [72203, 0, "s"], + [72204, 0, "t"], + [72205, 0, "r"], + [72206, 0, "u"], + [72207, 0, "c"], + [72208, 0, "t"], + [72209, 0, "u"], + [72210, 0, "r"], + [72211, 0, "e"], + [72212, 0, "s"], + [72213, 0, "."], + [72214, 0, " "], + [72215, 0, "G"], + [72216, 0, "o"], + [72217, 0, "o"], + [72218, 0, "g"], + [72219, 0, "l"], + [72220, 0, "e"], + [72221, 0, " "], + [72222, 0, "R"], + [72223, 0, "e"], + [72224, 0, "a"], + [72225, 0, "l"], + [72226, 0, "t"], + [72227, 0, "i"], + [72228, 0, "m"], + [72229, 0, "e"], + [72230, 0, " "], + [72231, 0, "A"], + [72232, 0, "P"], + [72233, 0, "I"], + [72234, 0, "~"], + [72235, 0, "\\"], + [72236, 0, "c"], + [72237, 0, "i"], + [72238, 0, "t"], + [72239, 0, "e"], + [72240, 0, "{"], + [72241, 0, "G"], + [72242, 0, "o"], + [72243, 0, "o"], + [72244, 0, "g"], + [72245, 0, "l"], + [72246, 0, "e"], + [72247, 0, ":"], + [72248, 0, "2"], + [72249, 0, "0"], + [72250, 0, "1"], + [72251, 0, "5"], + [72252, 0, "v"], + [72253, 0, "k"], + [72254, 0, "}"], + [72214, 0, " "], + [72033, 1], + [72032, 1], + [72031, 1], + [72030, 1], + [72029, 1], + [72029, 0, "t"], + [72030, 0, "h"], + [72031, 0, "a"], + [72032, 0, "t"], + [72033, 0, " "], + [72034, 0, "i"], + [72035, 0, "s"], + [72036, 0, " "], + [72037, 0, "b"], + [72038, 0, "a"], + [72039, 0, "s"], + [72040, 0, "e"], + [72041, 0, "d"], + [72042, 0, " "], + [72043, 0, "o"], + [72044, 0, "n"], + [72078, 0, " "], + [72079, 0, "W"], + [72080, 0, "e"], + [72081, 0, " "], + [72082, 0, "a"], + [72083, 0, "r"], + [72084, 0, "e"], + [72085, 0, " "], + [72086, 0, "m"], + [72087, 0, "a"], + [72088, 0, "k"], + [72089, 0, "i"], + [72090, 0, "n"], + [72091, 0, "g"], + [72092, 0, " "], + [72093, 0, "t"], + [72094, 0, "h"], + [72095, 0, "e"], + [72096, 0, " "], + [72097, 0, "c"], + [72098, 0, "h"], + [72099, 0, "a"], + [72100, 0, "r"], + [72101, 0, "a"], + [72102, 0, "c"], + [72103, 0, "t"], + [72104, 0, "e"], + [72105, 0, "r"], + [72106, 0, "-"], + [72107, 0, "b"], + [72108, 0, "y"], + [72109, 0, "-"], + [72110, 0, "c"], + [72111, 0, "h"], + [72112, 0, "a"], + [72113, 0, "r"], + [72114, 0, "a"], + [72115, 0, "c"], + [72116, 0, "t"], + [72117, 0, "e"], + [72118, 0, "r"], + [72119, 0, " "], + [72120, 0, "e"], + [72121, 0, "d"], + [72122, 0, "i"], + [72123, 0, "t"], + [72124, 0, "i"], + [72125, 0, "n"], + [72126, 0, "g"], + [72127, 0, " "], + [72128, 0, "t"], + [72129, 0, "r"], + [72130, 0, "a"], + [72131, 0, "c"], + [72132, 0, "e"], + [72133, 0, " "], + [72134, 0, "o"], + [72135, 0, "f"], + [72136, 0, " "], + [72137, 0, "t"], + [72138, 0, "h"], + [72139, 0, "i"], + [72140, 0, "s"], + [72141, 0, " "], + [72142, 0, "d"], + [72143, 0, "o"], + [72144, 0, "c"], + [72145, 0, "u"], + [72146, 0, "m"], + [72147, 0, "e"], + [72148, 0, "n"], + [72149, 0, "t"], + [72150, 0, " "], + [72151, 0, "a"], + [72152, 0, "v"], + [72153, 0, "a"], + [72154, 0, "i"], + [72155, 0, "l"], + [72156, 0, "a"], + [72157, 0, "b"], + [72158, 0, "l"], + [72159, 0, "e"], + [72160, 0, " "], + [72161, 0, "a"], + [72162, 0, "s"], + [72163, 0, " "], + [72164, 0, "s"], + [72165, 0, "u"], + [72166, 0, "p"], + [72167, 0, "p"], + [72168, 0, "l"], + [72169, 0, "e"], + [72170, 0, "m"], + [72171, 0, "e"], + [72172, 0, "n"], + [72173, 0, "t"], + [72174, 0, "a"], + [72175, 0, "l"], + [72176, 0, " "], + [72177, 0, "d"], + [72178, 0, "a"], + [72179, 0, "t"], + [72180, 0, "a"], + [72181, 0, " "], + [72182, 0, "o"], + [72183, 0, "f"], + [72184, 0, " "], + [72185, 0, "t"], + [72186, 0, "h"], + [72187, 0, "i"], + [72188, 0, "s"], + [72189, 0, " "], + [72190, 0, "p"], + [72191, 0, "a"], + [72192, 0, "p"], + [72193, 0, "e"], + [72194, 0, "r"], + [72195, 0, ","], + [72196, 0, " "], + [72197, 0, "i"], + [72198, 0, "n"], + [72199, 0, " "], + [72200, 0, "o"], + [72201, 0, "r"], + [72202, 0, "d"], + [72203, 0, "e"], + [72204, 0, "r"], + [72205, 0, " "], + [72206, 0, "t"], + [72207, 0, "o"], + [72208, 0, " "], + [72209, 0, "p"], + [72210, 0, "r"], + [72211, 0, "o"], + [72212, 0, "v"], + [72213, 0, "i"], + [72214, 0, "d"], + [72215, 0, "e"], + [72216, 0, " "], + [72217, 0, "a"], + [72218, 0, " "], + [72219, 0, "d"], + [72220, 0, "a"], + [72221, 0, "t"], + [72222, 0, "a"], + [72223, 0, "s"], + [72224, 0, "e"], + [72225, 0, "t"], + [72226, 0, " "], + [72227, 0, "f"], + [72228, 0, "o"], + [72229, 0, "r"], + [72230, 0, " "], + [72231, 0, "t"], + [72232, 0, "h"], + [72233, 0, "e"], + [72234, 0, " "], + [72235, 0, "s"], + [72236, 0, "t"], + [72237, 0, "u"], + [72238, 0, "d"], + [72239, 0, "y"], + [72235, 0, "e"], + [72236, 0, "x"], + [72237, 0, "p"], + [72237, 1], + [72236, 1], + [72235, 1], + [72235, 0, "e"], + [72236, 0, "m"], + [72237, 0, "p"], + [72238, 0, "i"], + [72239, 0, "r"], + [72240, 0, "i"], + [72241, 0, "c"], + [72242, 0, "a"], + [72243, 0, "l"], + [72244, 0, " "], + [72250, 0, " "], + [72251, 0, "o"], + [72252, 0, "f"], + [72253, 0, " "], + [72254, 0, "c"], + [72255, 0, "o"], + [72256, 0, "l"], + [72257, 0, "l"], + [72258, 0, "a"], + [72259, 0, "b"], + [72260, 0, "o"], + [72261, 0, "r"], + [72262, 0, "a"], + [72263, 0, "t"], + [72264, 0, "i"], + [72265, 0, "v"], + [72266, 0, "e"], + [72267, 0, " "], + [72268, 0, "e"], + [72269, 0, "d"], + [72270, 0, "i"], + [72271, 0, "t"], + [72272, 0, "i"], + [72273, 0, "n"], + [72274, 0, "g"], + [72275, 0, " "], + [72276, 0, "a"], + [72277, 0, "l"], + [72278, 0, "g"], + [72279, 0, "o"], + [72280, 0, "r"], + [72281, 0, "i"], + [72282, 0, "t"], + [72283, 0, "h"], + [72284, 0, "m"], + [72285, 0, "s"], + [72286, 0, "."], + [72435, 0, "A"], + [72436, 0, "s"], + [72437, 0, " "], + [72438, 0, "i"], + [72439, 0, "l"], + [72440, 0, "l"], + [72441, 0, "u"], + [72442, 0, "s"], + [72443, 0, "t"], + [72444, 0, "r"], + [72445, 0, "a"], + [72446, 0, "t"], + [72447, 0, "e"], + [72448, 0, "d"], + [72449, 0, " "], + [72450, 0, "i"], + [72451, 0, "n"], + [72452, 0, " "], + [72453, 0, "F"], + [72454, 0, "i"], + [72455, 0, "g"], + [72456, 0, "u"], + [72457, 0, "r"], + [72458, 0, "e"], + [72459, 0, "~"], + [72460, 0, "\\"], + [72461, 0, "r"], + [72462, 0, "e"], + [72463, 0, "f"], + [72464, 0, "{"], + [72465, 0, "f"], + [72466, 0, "i"], + [72467, 0, "g"], + [72468, 0, ":"], + [72469, 0, "t"], + [72470, 0, "o"], + [72471, 0, "d"], + [72472, 0, "o"], + [72473, 0, "-"], + [72474, 0, "i"], + [72475, 0, "t"], + [72476, 0, "e"], + [72477, 0, "m"], + [72478, 0, "}"], + [72479, 0, ","], + [72480, 0, " "], + [72289, 0, "A"], + [72290, 0, "s"], + [72291, 0, " "], + [72292, 0, "i"], + [72293, 0, "l"], + [72294, 0, "l"], + [72295, 0, "u"], + [72296, 0, "s"], + [72297, 0, "t"], + [72298, 0, "r"], + [72299, 0, "a"], + [72300, 0, "t"], + [72301, 0, "e"], + [72302, 0, "d"], + [72303, 0, " "], + [72289, 0, "O"], + [72290, 0, "u"], + [72291, 0, "r"], + [72292, 0, " "], + [72293, 0, "p"], + [72294, 0, "r"], + [72295, 0, "i"], + [72296, 0, "n"], + [72297, 0, "c"], + [72298, 0, "i"], + [72299, 0, "p"], + [72300, 0, "l"], + [72301, 0, "e"], + [72302, 0, " "], + [72303, 0, "o"], + [72304, 0, "f"], + [72305, 0, " "], + [72306, 0, "n"], + [72307, 0, "o"], + [72308, 0, "t"], + [72309, 0, " "], + [72310, 0, "l"], + [72311, 0, "o"], + [72312, 0, "s"], + [72313, 0, "i"], + [72314, 0, "n"], + [72315, 0, "g"], + [72316, 0, " "], + [72317, 0, "i"], + [72318, 0, "n"], + [72319, 0, "p"], + [72320, 0, "u"], + [72321, 0, "t"], + [72322, 0, " "], + [72323, 0, "d"], + [72324, 0, "u"], + [72325, 0, "e"], + [72326, 0, " "], + [72327, 0, "t"], + [72328, 0, "o"], + [72329, 0, " "], + [72330, 0, "o"], + [72330, 1], + [72330, 0, "c"], + [72331, 0, "o"], + [72332, 0, "n"], + [72333, 0, "c"], + [72334, 0, "u"], + [72335, 0, "r"], + [72336, 0, "r"], + [72337, 0, "e"], + [72338, 0, "n"], + [72339, 0, "t"], + [72340, 0, " "], + [72341, 0, "m"], + [72342, 0, "o"], + [72343, 0, "d"], + [72344, 0, "i"], + [72345, 0, "f"], + [72346, 0, "i"], + [72347, 0, "c"], + [72348, 0, "a"], + [72349, 0, "t"], + [72350, 0, "i"], + [72351, 0, "o"], + [72352, 0, "n"], + [72353, 0, "s"], + [72354, 0, " "], + [72355, 0, "a"], + [72356, 0, "p"], + [72357, 0, "p"], + [72358, 0, "e"], + [72359, 0, "a"], + [72360, 0, "r"], + [72361, 0, "s"], + [72362, 0, " "], + [72363, 0, "r"], + [72364, 0, "e"], + [72365, 0, "a"], + [72366, 0, "s"], + [72367, 0, "o"], + [72368, 0, "n"], + [72369, 0, "a"], + [72370, 0, "b"], + [72371, 0, "l"], + [72372, 0, "e"], + [72373, 0, ","], + [72374, 0, " "], + [72375, 0, "b"], + [72376, 0, "u"], + [72377, 0, "t"], + [72378, 0, " "], + [72379, 0, "a"], + [72380, 0, "s"], + [72381, 0, " "], + [72382, 0, "i"], + [72383, 0, "l"], + [72384, 0, "l"], + [72385, 0, "u"], + [72386, 0, "s"], + [72387, 0, "t"], + [72388, 0, "r"], + [72389, 0, "a"], + [72390, 0, "t"], + [72391, 0, "e"], + [72392, 0, "d"], + [72393, 0, " "], + [72394, 0, "i"], + [72395, 0, "n"], + [72396, 0, " "], + [72397, 0, "F"], + [72398, 0, "i"], + [72399, 0, "g"], + [72400, 0, "u"], + [72401, 0, "r"], + [72402, 0, "e"], + [72403, 0, "~"], + [72404, 0, "\\"], + [72405, 0, "r"], + [72406, 0, "e"], + [72407, 0, "f"], + [72408, 0, "{"], + [72409, 0, "f"], + [72410, 0, "i"], + [72411, 0, "g"], + [72412, 0, ":"], + [72413, 0, "t"], + [72414, 0, "o"], + [72415, 0, "d"], + [72416, 0, "o"], + [72417, 0, "-"], + [72418, 0, "i"], + [72419, 0, "t"], + [72420, 0, "e"], + [72421, 0, "m"], + [72422, 0, "}"], + [72423, 0, ","], + [72424, 0, " "], + [72425, 1], + [72425, 1], + [72425, 0, "i"], + [72426, 0, "t"], + [72427, 0, " "], + [72428, 0, "l"], + [72429, 0, "e"], + [72430, 0, "a"], + [72431, 0, "d"], + [72432, 0, "s"], + [72433, 0, " "], + [72434, 0, "t"], + [72435, 0, "o"], + [72436, 0, " "], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 1], + [72437, 0, "s"], + [72438, 0, "u"], + [72439, 0, "r"], + [72440, 0, "p"], + [72441, 0, "r"], + [72441, 1], + [72440, 1], + [72439, 1], + [72438, 1], + [72437, 1], + [72437, 0, "m"], + [72438, 0, "e"], + [72439, 0, "r"], + [72440, 0, "g"], + [72441, 0, "e"], + [72442, 0, "d"], + [72443, 0, " "], + [72444, 0, "d"], + [72445, 0, "o"], + [72446, 0, "c"], + [72447, 0, "u"], + [72448, 0, "m"], + [72449, 0, "e"], + [72450, 0, "n"], + [72451, 0, "t"], + [72452, 0, " "], + [72453, 0, "s"], + [72454, 0, "t"], + [72455, 0, "a"], + [72456, 0, "t"], + [72457, 0, "e"], + [72458, 0, "s"], + [72459, 0, " "], + [72460, 0, "t"], + [72461, 0, "h"], + [72462, 0, "a"], + [72463, 0, "t"], + [72464, 0, " "], + [72465, 0, "m"], + [72466, 0, "a"], + [72467, 0, "y"], + [72468, 0, " "], + [72469, 0, "b"], + [72470, 0, "e"], + [72471, 0, " "], + [72472, 0, "s"], + [72473, 0, "u"], + [72474, 0, "r"], + [72475, 0, "p"], + [72476, 0, "r"], + [72477, 0, "i"], + [72478, 0, "s"], + [72479, 0, "i"], + [72480, 0, "n"], + [72481, 0, "g"], + [72482, 0, " "], + [72483, 0, "t"], + [72484, 0, "o"], + [72485, 0, " "], + [72486, 0, "a"], + [72487, 0, "p"], + [72488, 0, "p"], + [72489, 0, "l"], + [72490, 0, "i"], + [72491, 0, "c"], + [72492, 0, "a"], + [72493, 0, "t"], + [72494, 0, "i"], + [72495, 0, "o"], + [72496, 0, "n"], + [72497, 0, " "], + [72498, 0, "p"], + [72499, 0, "r"], + [72500, 0, "o"], + [72501, 0, "g"], + [72502, 0, "r"], + [72503, 0, "a"], + [72504, 0, "m"], + [72505, 0, "m"], + [72506, 0, "e"], + [72507, 0, "r"], + [72508, 0, "s"], + [72509, 0, " "], + [72510, 0, "w"], + [72511, 0, "h"], + [72512, 0, "o"], + [72513, 0, " "], + [72514, 0, "a"], + [72515, 0, "r"], + [72516, 0, "e"], + [72517, 0, " "], + [72518, 0, "m"], + [72519, 0, "o"], + [72520, 0, "r"], + [72521, 0, "e"], + [72522, 0, " "], + [72523, 0, "f"], + [72524, 0, "a"], + [72525, 0, "m"], + [72526, 0, "i"], + [72527, 0, "l"], + [72528, 0, "i"], + [72529, 0, "a"], + [72530, 0, "r"], + [72531, 0, " "], + [72532, 0, "w"], + [72533, 0, "i"], + [72534, 0, "t"], + [72535, 0, "h"], + [72536, 0, " "], + [72537, 0, "s"], + [72538, 0, "e"], + [72539, 0, "q"], + [72540, 0, "u"], + [72541, 0, "e"], + [72542, 0, "n"], + [72543, 0, "t"], + [72544, 0, "i"], + [72545, 0, "a"], + [72546, 0, "l"], + [72547, 0, " "], + [72548, 0, "p"], + [72549, 0, "r"], + [72550, 0, "o"], + [72551, 0, "g"], + [72552, 0, "r"], + [72553, 0, "a"], + [72554, 0, "m"], + [72555, 0, "s"], + [72556, 0, "."], + [72790, 1], + [72789, 1], + [72788, 1], + [72787, 1], + [72786, 1], + [72785, 1], + [72784, 1], + [72783, 1], + [72782, 1], + [72781, 1], + [72780, 1], + [72779, 1], + [72778, 1], + [72777, 1], + [72776, 1], + [72775, 1], + [72774, 1], + [72773, 1], + [72772, 1], + [72771, 1], + [72770, 1], + [72769, 1], + [72768, 1], + [72767, 1], + [72766, 1], + [72765, 1], + [72764, 1], + [72763, 1], + [72762, 1], + [72761, 1], + [72760, 1], + [72759, 1], + [72758, 1], + [72757, 1], + [72756, 1], + [72755, 1], + [72754, 1], + [72753, 1], + [72752, 1], + [72751, 1], + [72750, 1], + [72749, 1], + [72748, 1], + [72747, 1], + [72746, 1], + [72745, 1], + [72744, 1], + [72743, 1], + [72742, 1], + [72741, 1], + [72740, 1], + [72739, 1], + [72738, 1], + [72737, 1], + [72736, 1], + [72735, 1], + [72734, 1], + [72733, 1], + [72732, 1], + [72731, 1], + [72730, 1], + [72729, 1], + [72728, 1], + [72727, 1], + [72726, 1], + [72725, 1], + [72724, 1], + [72723, 1], + [72722, 1], + [72721, 1], + [72720, 1], + [72719, 1], + [72718, 1], + [72717, 1], + [72716, 1], + [72715, 1], + [72714, 1], + [72713, 1], + [72712, 1], + [72711, 1], + [72710, 1], + [72709, 1], + [72708, 1], + [72707, 1], + [72706, 1], + [72705, 1], + [72704, 1], + [72703, 1], + [72703, 0, "\n"], + [71152, 0, "s"], + [72706, 0, "T"], + [72707, 0, "w"], + [72708, 0, "o"], + [72709, 0, " "], + [72710, 0, "i"], + [72711, 0, "m"], + [72712, 0, "p"], + [72713, 0, "o"], + [72714, 0, "r"], + [72715, 0, "t"], + [72716, 0, "a"], + [72717, 0, "n"], + [72718, 0, "t"], + [72719, 0, " "], + [72720, 0, "f"], + [72721, 0, "e"], + [72722, 0, "r"], + [72723, 0, "a"], + [72724, 0, "t"], + [72725, 0, "u"], + [72725, 1], + [72724, 1], + [72723, 1], + [72722, 1], + [72722, 0, "a"], + [72723, 0, "t"], + [72724, 0, "u"], + [72725, 0, "r"], + [72726, 0, "e"], + [72727, 0, "s"], + [72727, 1], + [72726, 1], + [72725, 1], + [72724, 1], + [72723, 1], + [72722, 1], + [72721, 1], + [72720, 1], + [72719, 1], + [72718, 1], + [72717, 1], + [72716, 1], + [72715, 1], + [72714, 1], + [72713, 1], + [72712, 1], + [72711, 1], + [72710, 1], + [72709, 1], + [72708, 1], + [72707, 1], + [72707, 0, "h"], + [72708, 0, "e"], + [72709, 0, " "], + [72710, 0, "C"], + [72711, 0, "R"], + [72712, 0, "D"], + [72713, 0, "T"], + [72714, 0, " "], + [72715, 0, "d"], + [72716, 0, "e"], + [72717, 0, "f"], + [72718, 0, "i"], + [72719, 0, "n"], + [72720, 0, "e"], + [72721, 0, "d"], + [72722, 0, " "], + [72723, 0, "i"], + [72724, 0, "n"], + [72725, 0, " "], + [72726, 0, "t"], + [72727, 0, "h"], + [72728, 0, "i"], + [72729, 0, "s"], + [72730, 0, " "], + [72731, 0, "p"], + [72732, 0, "a"], + [72733, 0, "p"], + [72734, 0, "e"], + [72735, 0, "r"], + [72736, 0, " "], + [72737, 0, "s"], + [72738, 0, "u"], + [72739, 0, "p"], + [72740, 0, "p"], + [72741, 0, "o"], + [72742, 0, "r"], + [72743, 0, "t"], + [72744, 0, "s"], + [72745, 0, " "], + [72746, 0, "i"], + [72747, 0, "n"], + [72748, 0, "s"], + [72749, 0, "e"], + [72750, 0, "r"], + [72751, 0, "t"], + [72752, 0, "i"], + [72753, 0, "o"], + [72754, 0, "n"], + [72755, 0, ","], + [72756, 0, " "], + [72757, 0, "d"], + [72758, 0, "e"], + [72759, 0, "l"], + [72760, 0, "e"], + [72761, 0, "t"], + [72762, 0, "i"], + [72763, 0, "o"], + [72764, 0, "n"], + [72765, 0, " "], + [72766, 0, "a"], + [72767, 0, "n"], + [72768, 0, "d"], + [72769, 0, " "], + [72770, 0, "a"], + [72771, 0, "s"], + [72772, 0, "s"], + [72773, 0, "i"], + [72774, 0, "g"], + [72775, 0, "n"], + [72776, 0, "m"], + [72777, 0, "e"], + [72778, 0, "n"], + [72779, 0, "t"], + [72780, 0, " "], + [72781, 0, "o"], + [72782, 0, "p"], + [72783, 0, "e"], + [72784, 0, "r"], + [72785, 0, "a"], + [72786, 0, "t"], + [72787, 0, "i"], + [72788, 0, "o"], + [72789, 0, "n"], + [72790, 0, "s"], + [72791, 0, "."], + [72792, 0, " "], + [72793, 0, "I"], + [72794, 0, "n"], + [72795, 0, " "], + [72796, 0, "a"], + [72797, 0, "d"], + [72798, 0, "d"], + [72799, 0, "i"], + [72800, 0, "t"], + [72801, 0, "i"], + [72802, 0, "o"], + [72803, 0, "n"], + [72804, 0, " "], + [72805, 0, "t"], + [72806, 0, "o"], + [72807, 0, " "], + [72808, 0, "t"], + [72809, 0, "h"], + [72810, 0, "e"], + [72811, 0, "s"], + [72812, 0, "e"], + [72813, 0, ","], + [72814, 0, " "], + [72815, 0, "i"], + [72816, 0, "t"], + [72817, 0, " "], + [72818, 0, "w"], + [72819, 0, "o"], + [72820, 0, "u"], + [72821, 0, "l"], + [72822, 0, "d"], + [72823, 0, " "], + [72824, 0, "b"], + [72825, 0, "e"], + [72826, 0, " "], + [72827, 0, "u"], + [72828, 0, "s"], + [72829, 0, "e"], + [72830, 0, "f"], + [72831, 0, "u"], + [72832, 0, "l"], + [72833, 0, " "], + [72834, 0, "t"], + [72835, 0, "o"], + [72836, 0, " "], + [72837, 0, "s"], + [72838, 0, "u"], + [72839, 0, "p"], + [72840, 0, "p"], + [72841, 0, "o"], + [72842, 0, "r"], + [72843, 0, "t"], + [72844, 0, " "], + [72845, 0, "a"], + [72846, 0, " "], + [72847, 0, "\\"], + [72848, 0, "e"], + [72849, 0, "m"], + [72850, 0, "p"], + [72851, 0, "h"], + [72852, 0, "{"], + [72853, 0, "m"], + [72854, 0, "o"], + [72855, 0, "v"], + [72856, 0, "e"], + [72857, 0, "}"], + [72858, 0, " "], + [72859, 0, "o"], + [72860, 0, "p"], + [72861, 0, "e"], + [72862, 0, "r"], + [72863, 0, "a"], + [72864, 0, "t"], + [72865, 0, "i"], + [72866, 0, "o"], + [72867, 0, "n"], + [72868, 0, " "], + [72869, 0, "("], + [72870, 0, "t"], + [72871, 0, "o"], + [72872, 0, " "], + [72873, 0, "c"], + [72874, 0, "h"], + [72875, 0, "a"], + [72876, 0, "n"], + [72877, 0, "g"], + [72878, 0, "e"], + [72879, 0, " "], + [72880, 0, "t"], + [72881, 0, "h"], + [72882, 0, "e"], + [72883, 0, " "], + [72884, 0, "o"], + [72885, 0, "r"], + [72886, 0, "d"], + [72887, 0, "e"], + [72888, 0, "r"], + [72889, 0, " "], + [72890, 0, "o"], + [72891, 0, "f"], + [72892, 0, " "], + [72893, 0, "e"], + [72894, 0, "l"], + [72895, 0, "e"], + [72896, 0, "m"], + [72897, 0, "e"], + [72898, 0, "n"], + [72899, 0, "t"], + [72900, 0, "s"], + [72901, 0, " "], + [72902, 0, "i"], + [72903, 0, "n"], + [72904, 0, " "], + [72905, 0, "a"], + [72906, 0, "n"], + [72907, 0, " "], + [72908, 0, "o"], + [72909, 0, "r"], + [72910, 0, "d"], + [72911, 0, "e"], + [72912, 0, "r"], + [72913, 0, "e"], + [72914, 0, "d"], + [72915, 0, " "], + [72916, 0, "l"], + [72917, 0, "i"], + [72918, 0, "s"], + [72919, 0, "t"], + [72920, 0, ","], + [72921, 0, " "], + [72922, 0, "o"], + [72923, 0, "r"], + [72924, 0, " "], + [72925, 0, "t"], + [72926, 0, "o"], + [72927, 0, " "], + [72928, 0, "m"], + [72929, 0, "o"], + [72930, 0, "v"], + [72931, 0, "e"], + [72932, 0, " "], + [72933, 0, "a"], + [72934, 0, " "], + [72935, 0, "s"], + [72936, 0, "u"], + [72937, 0, "b"], + [72938, 0, "t"], + [72939, 0, "r"], + [72940, 0, "e"], + [72941, 0, "e"], + [72942, 0, " "], + [72943, 0, "f"], + [72944, 0, "r"], + [72945, 0, "o"], + [72946, 0, "m"], + [72947, 0, " "], + [72948, 0, "o"], + [72949, 0, "n"], + [72950, 0, "e"], + [72951, 0, " "], + [72952, 0, "p"], + [72953, 0, "o"], + [72954, 0, "s"], + [72955, 0, "i"], + [72956, 0, "t"], + [72957, 0, "i"], + [72958, 0, "o"], + [72959, 0, "n"], + [72960, 0, " "], + [72961, 0, "i"], + [72962, 0, "n"], + [72963, 0, " "], + [72964, 0, "a"], + [72965, 0, " "], + [72966, 0, "d"], + [72967, 0, "o"], + [72968, 0, "c"], + [72969, 0, "u"], + [72970, 0, "m"], + [72971, 0, "e"], + [72972, 0, "n"], + [72973, 0, "t"], + [72974, 0, " "], + [72975, 0, "t"], + [72976, 0, "o"], + [72977, 0, " "], + [72978, 0, "a"], + [72979, 0, "n"], + [72980, 0, "o"], + [72981, 0, "t"], + [72982, 0, "h"], + [72983, 0, "e"], + [72984, 0, "r"], + [72985, 0, ")"], + [72986, 0, " "], + [72987, 0, "a"], + [72988, 0, "n"], + [72989, 0, "d"], + [72990, 0, " "], + [72991, 0, "a"], + [72992, 0, "n"], + [72993, 0, " "], + [72994, 0, "\\"], + [72995, 0, "e"], + [72996, 0, "m"], + [72997, 0, "p"], + [72998, 0, "h"], + [72999, 0, "{"], + [73000, 0, "u"], + [73001, 0, "n"], + [73002, 0, "d"], + [73003, 0, "o"], + [73004, 0, "}"], + [73005, 0, " "], + [73006, 0, "o"], + [73007, 0, "p"], + [73008, 0, "e"], + [73009, 0, "r"], + [73010, 0, "a"], + [73011, 0, "t"], + [73012, 0, "i"], + [73013, 0, "o"], + [73014, 0, "n"], + [73015, 0, "."], + [73016, 0, " "], + [73017, 0, "W"], + [73018, 0, "e"], + [73019, 0, " "], + [73020, 0, "p"], + [73021, 0, "l"], + [73022, 0, "a"], + [73023, 0, "n"], + [73024, 0, " "], + [73025, 0, "t"], + [73026, 0, "o"], + [73027, 0, " "], + [73028, 0, "a"], + [73029, 0, "d"], + [73030, 0, "d"], + [73031, 0, "r"], + [73032, 0, "e"], + [73033, 0, "s"], + [73034, 0, "s"], + [73035, 0, " "], + [73036, 0, "t"], + [73037, 0, "h"], + [73038, 0, "e"], + [73039, 0, "s"], + [73040, 0, "e"], + [73041, 0, " "], + [73042, 0, "m"], + [73043, 0, "i"], + [73044, 0, "s"], + [73045, 0, "s"], + [73046, 0, "i"], + [73047, 0, "n"], + [73048, 0, "g"], + [73049, 0, " "], + [73050, 0, "f"], + [73051, 0, "e"], + [73052, 0, "a"], + [73053, 0, "t"], + [73054, 0, "u"], + [73055, 0, "r"], + [73056, 0, "e"], + [73057, 0, "s"], + [73058, 0, " "], + [73059, 0, "i"], + [73060, 0, "n"], + [73061, 0, " "], + [73062, 0, "f"], + [73063, 0, "u"], + [73064, 0, "t"], + [73065, 0, "u"], + [73066, 0, "r"], + [73067, 0, "e"], + [73068, 0, " "], + [73069, 0, "w"], + [73070, 0, "o"], + [73071, 0, "r"], + [73072, 0, "k"], + [73073, 0, "."], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 1], + [71423, 0, "w"], + [71424, 0, "a"], + [71425, 0, "i"], + [71426, 0, "t"], + [71427, 0, "i"], + [71428, 0, "n"], + [71429, 0, "g"], + [71430, 0, " "], + [71431, 0, "f"], + [71432, 0, "o"], + [71433, 0, "r"], + [657, 1], + [656, 1], + [655, 1], + [654, 1], + [653, 1], + [653, 0, "t"], + [654, 0, "r"], + [655, 0, "u"], + [656, 0, "e"], + [73238, 0, "\n"], + [73239, 0, "\\"], + [73240, 0, "c"], + [73241, 0, "l"], + [73242, 0, "e"], + [73243, 0, "a"], + [73244, 0, "r"], + [73245, 0, "p"], + [73246, 0, "a"], + [73247, 0, "g"], + [73248, 0, "e"], + [73299, 0, "\n"], + [73300, 0, "\n"], + [73300, 0, "I"], + [73301, 0, "n"], + [73302, 0, " "], + [73303, 0, "t"], + [73304, 0, "h"], + [73305, 0, "i"], + [73306, 0, "s"], + [73307, 0, " "], + [73308, 0, "a"], + [73309, 0, "p"], + [73310, 0, "p"], + [73311, 0, "e"], + [73312, 0, "n"], + [73313, 0, "d"], + [73314, 0, "i"], + [73315, 0, "x"], + [73316, 0, " "], + [73317, 0, "w"], + [73318, 0, "e"], + [73319, 0, " "], + [73320, 0, "p"], + [73321, 0, "r"], + [73322, 0, "o"], + [73323, 0, "v"], + [73324, 0, "i"], + [73325, 0, "d"], + [73326, 0, "e"], + [73327, 0, " "], + [73328, 0, "a"], + [73329, 0, " "], + [73330, 0, "p"], + [73331, 0, "r"], + [73332, 0, "o"], + [73333, 0, "o"], + [73334, 0, "f"], + [73335, 0, " "], + [73336, 0, "o"], + [73337, 0, "f"], + [73338, 0, " "], + [73339, 0, "t"], + [73340, 0, "h"], + [73341, 0, "e"], + [73342, 0, " "], + [73343, 0, "t"], + [73344, 0, "h"], + [73345, 0, "e"], + [73346, 0, "o"], + [73347, 0, "r"], + [73348, 0, "e"], + [73349, 0, "m"], + [73350, 0, " "], + [73351, 0, "s"], + [73352, 0, "t"], + [73353, 0, "a"], + [73354, 0, "t"], + [73355, 0, "e"], + [73356, 0, "d"], + [73357, 0, " "], + [73358, 0, "i"], + [73359, 0, "n"], + [73360, 0, " "], + [73361, 0, "s"], + [73362, 0, "e"], + [73362, 1], + [73361, 1], + [73361, 0, "S"], + [73362, 0, "e"], + [73363, 0, "c"], + [73364, 0, "t"], + [73365, 0, "i"], + [73366, 0, "o"], + [73367, 0, "n"], + [73368, 0, "~"], + [73369, 0, "\\"], + [73370, 0, "r"], + [73371, 0, "e"], + [73372, 0, "f"], + [73373, 0, "{"], + [73374, 0, "s"], + [73375, 0, "e"], + [73376, 0, "c"], + [73377, 0, ":"], + [73378, 0, "c"], + [73379, 0, "o"], + [73380, 0, "n"], + [73381, 0, "v"], + [73382, 0, "e"], + [73383, 0, "r"], + [73384, 0, "g"], + [73385, 0, "e"], + [73386, 0, "n"], + [73387, 0, "c"], + [73388, 0, "e"], + [73389, 0, "}"], + [73390, 0, "."], + [73392, 0, "\n"], + [73393, 0, "\n"], + [73393, 0, "\\"], + [73394, 0, "b"], + [73395, 0, "e"], + [73396, 0, "g"], + [73397, 0, "i"], + [73398, 0, "n"], + [73399, 0, "{"], + [73400, 0, "l"], + [73401, 0, "e"], + [73402, 0, "m"], + [73403, 0, "m"], + [73404, 0, "a"], + [73405, 0, "}"], + [73406, 0, "\n"], + [73407, 0, "\\"], + [73408, 0, "e"], + [73409, 0, "n"], + [73410, 0, "d"], + [73411, 0, "{"], + [73412, 0, "l"], + [73413, 0, "e"], + [73414, 0, "m"], + [73415, 0, "m"], + [73416, 0, "a"], + [73417, 0, "}"], + [73406, 0, "\n"], + [73407, 0, "T"], + [73408, 0, "h"], + [73409, 0, "e"], + [73410, 0, " "], + [73411, 0, "e"], + [73412, 0, "v"], + [73413, 0, "a"], + [73414, 0, "l"], + [73415, 0, "u"], + [73416, 0, "a"], + [73417, 0, "t"], + [73417, 1], + [73416, 1], + [73415, 1], + [73414, 1], + [73413, 1], + [73412, 1], + [73411, 1], + [73410, 1], + [73409, 1], + [73408, 1], + [73407, 1], + [73407, 0, "I"], + [73408, 0, "f"], + [73409, 0, " "], + [73410, 0, "$"], + [73411, 0, "\\"], + [73412, 0, "m"], + [73413, 0, "a"], + [73414, 0, "t"], + [73415, 0, "h"], + [73416, 0, "i"], + [73417, 0, "t"], + [73418, 0, "{"], + [73419, 0, "i"], + [73420, 0, "d"], + [73421, 0, "}"], + [73422, 0, "_"], + [73423, 0, "1"], + [73424, 0, "$"], + [73425, 0, " "], + [73426, 0, "a"], + [73427, 0, "p"], + [73428, 0, "p"], + [73429, 0, "e"], + [73430, 0, "a"], + [73431, 0, "r"], + [73432, 0, "s"], + [73433, 0, " "], + [73434, 0, "b"], + [73435, 0, "e"], + [73436, 0, "f"], + [73437, 0, "o"], + [73438, 0, "r"], + [73439, 0, "e"], + [73440, 0, " "], + [73441, 0, "$"], + [73442, 0, "\\"], + [73443, 0, "m"], + [73444, 0, "a"], + [73445, 0, "t"], + [73446, 0, "h"], + [73447, 0, "i"], + [73448, 0, "t"], + [73449, 0, "{"], + [73450, 0, "i"], + [73451, 0, "d"], + [73452, 0, "}"], + [73453, 0, "_"], + [73454, 0, "2"], + [73455, 0, "$"], + [73456, 0, " "], + [73457, 0, "i"], + [73458, 0, "n"], + [73459, 0, " "], + [73460, 0, "a"], + [73461, 0, "n"], + [73462, 0, " "], + [73463, 0, "o"], + [73464, 0, "r"], + [73465, 0, "d"], + [73466, 0, "e"], + [73467, 0, "r"], + [73468, 0, "e"], + [73469, 0, "d"], + [73470, 0, " "], + [73471, 0, "l"], + [73472, 0, "i"], + [73473, 0, "s"], + [73474, 0, "t"], + [73475, 0, ","], + [73476, 0, " "], + [73477, 0, "a"], + [73478, 0, "n"], + [73479, 0, "d"], + [73480, 0, " "], + [73481, 0, "t"], + [73482, 0, "h"], + [73483, 0, "e"], + [73484, 0, " "], + [73485, 0, "l"], + [73486, 0, "i"], + [73487, 0, "s"], + [73488, 0, "t"], + [73489, 0, " "], + [73490, 0, "i"], + [73491, 0, "s"], + [73492, 0, " "], + [73493, 0, "m"], + [73494, 0, "u"], + [73495, 0, "t"], + [73496, 0, "a"], + [73497, 0, "t"], + [73498, 0, "e"], + [73499, 0, "d"], + [73500, 0, " "], + [73501, 0, "a"], + [73502, 0, "c"], + [73503, 0, "c"], + [73504, 0, "o"], + [73505, 0, "r"], + [73506, 0, "d"], + [73507, 0, "i"], + [73508, 0, "n"], + [73509, 0, "g"], + [73510, 0, " "], + [73511, 0, "t"], + [73512, 0, "o"], + [73513, 0, " "], + [73514, 0, "t"], + [73515, 0, "h"], + [73516, 0, "e"], + [73517, 0, " "], + [73518, 0, "v"], + [73518, 1], + [73518, 0, "e"], + [73519, 0, "v"], + [73520, 0, "a"], + [73521, 0, "l"], + [73522, 0, "u"], + [73523, 0, "a"], + [73524, 0, "t"], + [73525, 0, "i"], + [73526, 0, "o"], + [73527, 0, "n"], + [73528, 0, " "], + [73529, 0, "r"], + [73530, 0, "u"], + [73531, 0, "l"], + [73532, 0, "e"], + [73533, 0, "s"], + [73534, 0, ","], + [73535, 0, " "], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 1], + [73426, 0, "p"], + [73427, 0, "r"], + [73428, 0, "e"], + [73429, 0, "c"], + [73430, 0, "e"], + [73431, 0, "d"], + [73432, 0, "e"], + [73433, 0, "s"], + [73530, 0, "$"], + [73531, 0, "\\"], + [73532, 0, "m"], + [73533, 0, "a"], + [73534, 0, "t"], + [73535, 0, "h"], + [73536, 0, "i"], + [73537, 0, "t"], + [73538, 0, "{"], + [73539, 0, "i"], + [73540, 0, "d"], + [73541, 0, "}"], + [73542, 0, "_"], + [73543, 0, "1"], + [73544, 0, "$"], + [73545, 0, " "], + [73546, 0, "a"], + [73547, 0, "l"], + [73548, 0, "s"], + [73549, 0, "o"], + [73550, 0, " "], + [73551, 0, "p"], + [73552, 0, "r"], + [73553, 0, "e"], + [73554, 0, "c"], + [73555, 0, "e"], + [73556, 0, "d"], + [73557, 0, "e"], + [73558, 0, "s"], + [73559, 0, " "], + [73560, 0, "$"], + [73561, 0, "\\"], + [73562, 0, "m"], + [73563, 0, "a"], + [73564, 0, "t"], + [73565, 0, "h"], + [73566, 0, "i"], + [73567, 0, "t"], + [73568, 0, "{"], + [73569, 0, "i"], + [73570, 0, "d"], + [73571, 0, "}"], + [73572, 0, "_"], + [73573, 0, "2"], + [73574, 0, "$"], + [73575, 0, " "], + [73576, 0, "i"], + [73577, 0, "n"], + [73578, 0, " "], + [73579, 0, "a"], + [73580, 0, "l"], + [73581, 0, "l"], + [73582, 0, " "], + [73583, 0, "r"], + [73584, 0, "e"], + [73585, 0, "s"], + [73586, 0, "u"], + [73587, 0, "l"], + [73588, 0, "t"], + [73589, 0, "i"], + [73590, 0, "n"], + [73591, 0, "g"], + [73592, 0, " "], + [73592, 1], + [73591, 1], + [73590, 1], + [73589, 1], + [73588, 1], + [73587, 1], + [73586, 1], + [73585, 1], + [73584, 1], + [73583, 1], + [73583, 0, "s"], + [73584, 0, "u"], + [73585, 0, "c"], + [73586, 0, "c"], + [73587, 0, "e"], + [73588, 0, "s"], + [73589, 0, "s"], + [73590, 0, "i"], + [73591, 0, "v"], + [73592, 0, "e"], + [73593, 0, " "], + [73594, 0, "s"], + [73595, 0, "t"], + [73595, 1], + [73594, 1], + [73594, 0, "d"], + [73595, 0, "o"], + [73596, 0, "c"], + [73597, 0, "u"], + [73598, 0, "m"], + [73599, 0, "e"], + [73600, 0, "n"], + [73601, 0, "t"], + [73602, 0, " "], + [73603, 0, "s"], + [73604, 0, "t"], + [73605, 0, "a"], + [73606, 0, "t"], + [73607, 0, "e"], + [73608, 0, "s"], + [73609, 0, "."], + [73391, 0, "\n"], + [73392, 0, "\n"], + [73393, 0, "\\"], + [73394, 0, "b"], + [73395, 0, "e"], + [73396, 0, "g"], + [73397, 0, "i"], + [73398, 0, "n"], + [73399, 0, "{"], + [73400, 0, "d"], + [73401, 0, "e"], + [73402, 0, "f"], + [73403, 0, "i"], + [73404, 0, "n"], + [73405, 0, "i"], + [73406, 0, "t"], + [73407, 0, "i"], + [73408, 0, "o"], + [73409, 0, "n"], + [73410, 0, "}"], + [73411, 0, "\n"], + [73412, 0, "\\"], + [73413, 0, "e"], + [73414, 0, "n"], + [73415, 0, "d"], + [73416, 0, "{"], + [73417, 0, "d"], + [73418, 0, "e"], + [73419, 0, "f"], + [73420, 0, "i"], + [73421, 0, "n"], + [73422, 0, "i"], + [73423, 0, "t"], + [73424, 0, "i"], + [73425, 0, "o"], + [73426, 0, "n"], + [73427, 0, "}"], + [73411, 0, "\n"], + [73391, 0, " "], + [73392, 0, "W"], + [73393, 0, "e"], + [73394, 0, " "], + [73395, 0, "b"], + [73396, 0, "e"], + [73397, 0, "g"], + [73398, 0, "i"], + [73399, 0, "n"], + [73400, 0, " "], + [73401, 0, "w"], + [73402, 0, "i"], + [73403, 0, "t"], + [73404, 0, "h"], + [73405, 0, " "], + [73406, 0, "s"], + [73407, 0, "o"], + [73408, 0, "m"], + [73409, 0, "e"], + [73410, 0, " "], + [73411, 0, "l"], + [73412, 0, "e"], + [73413, 0, "m"], + [73414, 0, "m"], + [73415, 0, "a"], + [73416, 0, "s"], + [73417, 0, " "], + [73418, 0, "a"], + [73419, 0, "b"], + [73420, 0, "o"], + [73421, 0, "u"], + [73422, 0, "t"], + [73423, 0, " "], + [73424, 0, "o"], + [73425, 0, "r"], + [73426, 0, "d"], + [73427, 0, "e"], + [73428, 0, "r"], + [73429, 0, "e"], + [73430, 0, "d"], + [73431, 0, " "], + [73432, 0, "l"], + [73433, 0, "i"], + [73434, 0, "s"], + [73435, 0, "t"], + [73436, 0, "s"], + [73437, 0, ","], + [73438, 0, " "], + [73439, 0, "a"], + [73440, 0, "n"], + [73441, 0, "d"], + [73442, 0, " "], + [73443, 0, "t"], + [73444, 0, "h"], + [73445, 0, "e"], + [73446, 0, "n"], + [73447, 0, " "], + [73448, 0, "w"], + [73449, 0, "o"], + [73450, 0, "r"], + [73451, 0, "k"], + [73452, 0, " "], + [73453, 0, "o"], + [73454, 0, "u"], + [73455, 0, "r"], + [73456, 0, " "], + [73457, 0, "w"], + [73458, 0, "a"], + [73459, 0, "y"], + [73460, 0, " "], + [73461, 0, "t"], + [73462, 0, "o"], + [73463, 0, "w"], + [73464, 0, "a"], + [73465, 0, "r"], + [73466, 0, "d"], + [73467, 0, "s"], + [73468, 0, " "], + [73469, 0, "m"], + [73470, 0, "o"], + [73471, 0, "r"], + [73472, 0, "e"], + [73473, 0, " "], + [73474, 0, "c"], + [73475, 0, "o"], + [73476, 0, "m"], + [73477, 0, "p"], + [73478, 0, "l"], + [73479, 0, "e"], + [73480, 0, " "], + [73480, 1], + [73480, 0, "x"], + [73481, 0, " "], + [73482, 0, "c"], + [73483, 0, "o"], + [73484, 0, "m"], + [73485, 0, "p"], + [73486, 0, "o"], + [73487, 0, "s"], + [73488, 0, "i"], + [73489, 0, "t"], + [73490, 0, "e"], + [73491, 0, " "], + [73492, 0, "d"], + [73493, 0, "o"], + [73494, 0, "c"], + [73495, 0, "u"], + [73496, 0, "m"], + [73497, 0, "e"], + [73498, 0, "n"], + [73499, 0, "t"], + [73500, 0, "s"], + [73501, 0, "."], + [73492, 0, "J"], + [73493, 0, "S"], + [73494, 0, "O"], + [73495, 0, "N"], + [73496, 0, " "], + [73528, 0, "L"], + [73529, 0, "i"], + [73530, 0, "t"], + [73530, 1], + [73530, 0, "s"], + [73531, 0, "t"], + [73532, 0, " "], + [73533, 0, "e"], + [73534, 0, "l"], + [73535, 0, "e"], + [73536, 0, "m"], + [73537, 0, "e"], + [73538, 0, "n"], + [73539, 0, " "], + [73540, 0, "t"], + [73541, 0, " "], + [73541, 1], + [73540, 1], + [73539, 1], + [73539, 0, "t"], + [73540, 0, " "], + [73541, 0, "$"], + [73542, 0, "k"], + [73543, 0, "_"], + [73544, 0, "1"], + [73545, 0, "$"], + [73593, 1], + [73592, 1], + [73591, 1], + [73590, 1], + [73589, 1], + [73588, 1], + [73587, 1], + [73586, 1], + [73585, 1], + [73584, 1], + [73583, 1], + [73583, 0, "k"], + [73608, 1], + [73607, 1], + [73606, 1], + [73605, 1], + [73604, 1], + [73603, 1], + [73602, 1], + [73601, 1], + [73600, 1], + [73599, 1], + [73598, 1], + [73598, 0, "k"], + [73723, 1], + [73722, 1], + [73721, 1], + [73720, 1], + [73719, 1], + [73718, 1], + [73717, 1], + [73716, 1], + [73715, 1], + [73714, 1], + [73713, 1], + [73713, 0, "k"], + [73693, 1], + [73692, 1], + [73691, 1], + [73690, 1], + [73689, 1], + [73688, 1], + [73687, 1], + [73686, 1], + [73685, 1], + [73684, 1], + [73683, 1], + [73683, 0, "k"], + [73546, 0, " "], + [73547, 0, "\\"], + [73548, 0, "e"], + [73549, 0, "m"], + [73550, 0, "p"], + [73551, 0, "h"], + [73552, 0, "{"], + [73553, 0, "p"], + [73554, 0, "r"], + [73555, 0, "e"], + [73556, 0, "c"], + [73557, 0, "e"], + [73558, 0, "d"], + [73559, 0, "e"], + [73560, 0, "s"], + [73561, 0, "}"], + [73562, 0, " "], + [73563, 0, "l"], + [73564, 0, "i"], + [73565, 0, "s"], + [73566, 0, "t"], + [73567, 0, " "], + [73568, 0, "e"], + [73569, 0, "l"], + [73570, 0, "e"], + [73571, 0, "m"], + [73572, 0, "e"], + [73573, 0, "n"], + [73574, 0, "t"], + [73575, 0, " "], + [73576, 0, "$"], + [73577, 0, "k"], + [73578, 0, "_"], + [73579, 0, "2"], + [73580, 0, "$"], + [73581, 0, " "], + [73582, 0, "i"], + [73583, 0, "n"], + [73584, 0, " "], + [73585, 0, "\\"], + [73585, 1], + [73585, 0, "$"], + [73586, 0, "\\"], + [73587, 0, "m"], + [73588, 0, "a"], + [73589, 0, "t"], + [73590, 0, "h"], + [73591, 0, "i"], + [73592, 0, "t"], + [73593, 0, "{"], + [73594, 0, "c"], + [73595, 0, "t"], + [73596, 0, "x"], + [73597, 0, "}"], + [73598, 0, "$"], + [73599, 0, " "], + [73600, 0, "i"], + [73601, 0, "f"], + [73602, 0, " "], + [73579, 1], + [73579, 0, "n"], + [73603, 0, "t"], + [73604, 0, "h"], + [73605, 0, "e"], + [73606, 0, "r"], + [73607, 0, "e"], + [73608, 0, " "], + [73609, 0, "e"], + [73610, 0, "x"], + [73611, 0, "i"], + [73612, 0, "s"], + [73613, 0, "t"], + [73614, 0, " "], + [73615, 0, "$"], + [73616, 0, "k"], + [73617, 0, "_"], + [73618, 0, "2"], + [73619, 0, ","], + [73620, 0, " "], + [73621, 0, "\\"], + [73622, 0, "d"], + [73623, 0, "o"], + [73624, 0, "t"], + [73625, 0, "s"], + [73626, 0, ","], + [73627, 0, " "], + [73628, 0, "k"], + [73629, 0, "_"], + [73630, 0, "{"], + [73631, 0, "n"], + [73632, 0, "-"], + [73633, 0, "1"], + [73634, 0, "}"], + [73635, 0, "$"], + [73636, 0, " "], + [73637, 0, "s"], + [73638, 0, "u"], + [73639, 0, "c"], + [73640, 0, "h"], + [73641, 0, " "], + [73642, 0, "t"], + [73643, 0, "h"], + [73644, 0, "a"], + [73645, 0, "t"], + [73646, 0, " "], + [73647, 0, "$"], + [73648, 0, "\\"], + [73649, 0, "m"], + [73650, 0, "a"], + [73651, 0, "t"], + [73652, 0, "h"], + [73653, 0, "i"], + [73654, 0, "t"], + [73655, 0, "{"], + [73656, 0, "c"], + [73657, 0, "t"], + [73658, 0, "x"], + [73659, 0, "}"], + [73660, 0, "("], + [73661, 0, "\\"], + [73662, 0, "m"], + [73663, 0, "a"], + [73664, 0, "t"], + [73665, 0, "h"], + [73666, 0, "s"], + [73667, 0, "f"], + [73668, 0, "{"], + [73669, 0, "n"], + [73670, 0, "e"], + [73671, 0, "x"], + [73672, 0, "t"], + [73673, 0, "}"], + [73674, 0, "("], + [73675, 0, "k"], + [73676, 0, "_"], + [73677, 0, "1"], + [73678, 0, ")"], + [73679, 0, ")"], + [73680, 0, " "], + [73681, 0, "="], + [73682, 0, " "], + [73683, 0, "k"], + [73684, 0, "_"], + [73685, 0, "2"], + [73686, 0, " "], + [73687, 0, "\\"], + [73688, 0, ";"], + [73689, 0, "\\"], + [73690, 0, "w"], + [73691, 0, "e"], + [73692, 0, "d"], + [73693, 0, "g"], + [73694, 0, "e"], + [73695, 0, "\\"], + [73696, 0, ";"], + [73697, 0, " "], + [73698, 0, "\\"], + [73699, 0, "m"], + [73700, 0, "a"], + [73701, 0, "t"], + [73702, 0, "h"], + [73703, 0, "i"], + [73704, 0, "t"], + [73705, 0, "{"], + [73706, 0, "c"], + [73707, 0, "t"], + [73708, 0, "x"], + [73709, 0, "}"], + [73710, 0, "("], + [73711, 0, "\\"], + [73712, 0, "m"], + [73713, 0, "a"], + [73714, 0, "t"], + [73715, 0, "h"], + [73716, 0, "s"], + [73717, 0, "f"], + [73718, 0, "{"], + [73719, 0, "n"], + [73720, 0, "e"], + [73721, 0, "x"], + [73722, 0, "t"], + [73723, 0, "}"], + [73724, 0, "("], + [73725, 0, "k"], + [73726, 0, "_"], + [73727, 0, "2"], + [73648, 0, "\\"], + [73649, 0, "f"], + [73650, 0, "o"], + [73651, 0, "r"], + [73652, 0, "a"], + [73653, 0, "l"], + [73654, 0, "l"], + [73655, 0, " "], + [73646, 0, " "], + [73647, 0, "f"], + [73648, 0, "o"], + [73649, 0, "r"], + [73650, 0, " "], + [73651, 0, "a"], + [73652, 0, "l"], + [73653, 0, "l"], + [73654, 0, " "], + [73655, 0, "$"], + [73656, 0, "i"], + [73657, 0, "$"], + [73658, 0, " "], + [73659, 0, "w"], + [73660, 0, "i"], + [73661, 0, "t"], + [73662, 0, "h"], + [73663, 0, " "], + [73664, 0, "$"], + [73665, 0, "1"], + [73666, 0, " "], + [73667, 0, "\\"], + [73668, 0, "l"], + [73669, 0, "e"], + [73670, 0, " "], + [73671, 0, "i"], + [73672, 0, " "], + [73673, 0, "<"], + [73674, 0, " "], + [73675, 0, "n"], + [73676, 0, "$"], + [73677, 0, ","], + [73687, 1], + [73686, 1], + [73685, 1], + [73684, 1], + [73683, 1], + [73682, 1], + [73681, 1], + [73680, 1], + [73709, 1], + [73709, 0, "i"], + [73717, 1], + [73717, 0, "{"], + [73718, 0, "i"], + [73719, 0, "+"], + [73720, 0, "1"], + [73721, 0, "}"], + [73722, 0, "$"], + [73723, 0, "."], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73724, 1], + [73584, 0, " "], + [73585, 0, "t"], + [73586, 0, "h"], + [73587, 0, "e"], + [73588, 0, " "], + [73589, 0, "o"], + [73590, 0, "r"], + [73591, 0, "d"], + [73592, 0, "e"], + [73593, 0, "r"], + [73594, 0, "e"], + [73595, 0, "d"], + [73596, 0, " "], + [73597, 0, "l"], + [73598, 0, "i"], + [73599, 0, "s"], + [73600, 0, "t"], + [73758, 0, "\n"], + [73759, 0, "\n"], + [73760, 0, "T"], + [73761, 0, "h"], + [73762, 0, "e"], + [73763, 0, " "], + [73764, 0, "n"], + [73765, 0, "o"], + [73766, 0, "t"], + [73767, 0, "i"], + [73768, 0, "o"], + [73769, 0, "n"], + [73770, 0, " "], + [73771, 0, "o"], + [73772, 0, "f"], + [73773, 0, " "], + [73774, 0, "\\"], + [73775, 0, "e"], + [73776, 0, "m"], + [73777, 0, "p"], + [73778, 0, "h"], + [73779, 0, "{"], + [73780, 0, "p"], + [73781, 0, "r"], + [73782, 0, "e"], + [73783, 0, "c"], + [73784, 0, "e"], + [73785, 0, "d"], + [73786, 0, "i"], + [73787, 0, "n"], + [73788, 0, "g"], + [73789, 0, "}"], + [73790, 0, " "], + [73791, 0, "c"], + [73792, 0, "o"], + [73793, 0, "r"], + [73794, 0, "r"], + [73795, 0, "e"], + [73796, 0, "s"], + [73797, 0, "p"], + [73798, 0, "o"], + [73799, 0, "n"], + [73800, 0, "d"], + [73801, 0, "s"], + [73802, 0, " "], + [73803, 0, "t"], + [73804, 0, "o"], + [73805, 0, " "], + [73806, 0, "t"], + [73807, 0, "h"], + [73808, 0, "e"], + [73809, 0, " "], + [73810, 0, "o"], + [73811, 0, "r"], + [73812, 0, "d"], + [73813, 0, "e"], + [73814, 0, "r"], + [73815, 0, " "], + [73816, 0, "i"], + [73817, 0, "n"], + [73818, 0, " "], + [73819, 0, "w"], + [73820, 0, "h"], + [73821, 0, "i"], + [73822, 0, "c"], + [73823, 0, "h"], + [73824, 0, " "], + [73825, 0, "t"], + [73826, 0, "h"], + [73827, 0, "e"], + [73828, 0, " "], + [73829, 0, "\\"], + [73830, 0, "t"], + [73831, 0, "e"], + [73832, 0, "x"], + [73833, 0, "t"], + [73834, 0, "s"], + [73835, 0, "c"], + [73836, 0, "{"], + [73837, 0, "N"], + [73838, 0, "e"], + [73839, 0, "x"], + [73840, 0, "t"], + [73841, 0, "}"], + [73842, 0, " "], + [73843, 0, "r"], + [73844, 0, "u"], + [73845, 0, "l"], + [73846, 0, "e"], + [73847, 0, "s"], + [73848, 0, " "], + [73849, 0, "i"], + [73850, 0, "t"], + [73851, 0, "e"], + [73852, 0, "r"], + [73853, 0, "a"], + [73854, 0, "t"], + [73855, 0, "e"], + [73856, 0, " "], + [73857, 0, "o"], + [73858, 0, "v"], + [73859, 0, "e"], + [73860, 0, "r"], + [73861, 0, " "], + [73862, 0, "t"], + [73863, 0, "h"], + [73864, 0, "e"], + [73865, 0, " "], + [73866, 0, "l"], + [73867, 0, "i"], + [73868, 0, "s"], + [73869, 0, "t"], + [73870, 0, "."], + [74062, 0, "\n"], + [74063, 0, "\\"], + [74064, 0, "b"], + [74065, 0, "e"], + [74066, 0, "g"], + [74067, 0, "i"], + [74068, 0, "n"], + [74069, 0, "{"], + [74070, 0, "p"], + [74071, 0, "r"], + [74072, 0, "o"], + [74073, 0, "o"], + [74074, 0, "f"], + [74075, 0, "}"], + [74076, 0, "\n"], + [74077, 0, "\\"], + [74078, 0, "e"], + [74079, 0, "n"], + [74080, 0, "d"], + [74081, 0, "{"], + [74082, 0, "p"], + [74083, 0, "r"], + [74084, 0, "o"], + [74085, 0, "o"], + [74086, 0, "f"], + [74087, 0, "}"], + [74076, 0, "\n"], + [74077, 0, "T"], + [74078, 0, "h"], + [74079, 0, "e"], + [74080, 0, " "], + [74081, 0, "o"], + [74082, 0, "n"], + [74083, 0, "l"], + [74084, 0, "y"], + [74085, 0, " "], + [74086, 0, "r"], + [74087, 0, "u"], + [74088, 0, "l"], + [74089, 0, "e"], + [74090, 0, " "], + [74091, 0, "t"], + [74092, 0, "h"], + [74093, 0, "a"], + [74094, 0, "t"], + [74095, 0, " "], + [74096, 0, "m"], + [74097, 0, "o"], + [74098, 0, "d"], + [74099, 0, "i"], + [74100, 0, "f"], + [74101, 0, "i"], + [74102, 0, "e"], + [74103, 0, "s"], + [74104, 0, " "], + [74105, 0, "t"], + [74106, 0, "h"], + [74107, 0, "e"], + [74108, 0, " "], + [74109, 0, "\\"], + [74110, 0, "t"], + [74111, 0, "e"], + [74112, 0, "x"], + [74113, 0, "t"], + [74114, 0, "s"], + [74115, 0, "f"], + [74116, 0, "{"], + [74117, 0, "n"], + [74118, 0, "e"], + [74119, 0, "x"], + [74120, 0, "t"], + [74121, 0, "}"], + [74122, 0, " "], + [74123, 0, "e"], + [74124, 0, "n"], + [74125, 0, "t"], + [74126, 0, "r"], + [74127, 0, "i"], + [74128, 0, "e"], + [74129, 0, "s"], + [74130, 0, " "], + [74131, 0, "i"], + [74132, 0, "n"], + [74133, 0, " "], + [74134, 0, "t"], + [74135, 0, "h"], + [74136, 0, "e"], + [74137, 0, " "], + [74138, 0, "c"], + [74139, 0, "o"], + [74140, 0, "n"], + [74141, 0, "t"], + [74142, 0, "e"], + [74143, 0, "x"], + [74144, 0, "t"], + [74145, 0, " "], + [74146, 0, "i"], + [74147, 0, "s"], + [74148, 0, " "], + [74149, 0, "$"], + [74150, 0, "\\"], + [74151, 0, "m"], + [74152, 0, "a"], + [74153, 0, "t"], + [74154, 0, "h"], + [74155, 0, "s"], + [74156, 0, "f"], + [74157, 0, "{"], + [74157, 1], + [74156, 1], + [74155, 1], + [74154, 1], + [74153, 1], + [74152, 1], + [74151, 1], + [74151, 0, "t"], + [74152, 0, "e"], + [74153, 0, "x"], + [74154, 0, "t"], + [74155, 0, "s"], + [74156, 0, "c"], + [74157, 0, "{"], + [74158, 0, "I"], + [74159, 0, "n"], + [74160, 0, "s"], + [74161, 0, "e"], + [74162, 0, "r"], + [74163, 0, "t"], + [74164, 0, "}"], + [74165, 0, "_"], + [74166, 0, "1"], + [74167, 0, "$"], + [74168, 0, ","], + [74169, 0, " "], + [74170, 0, "a"], + [74171, 0, "n"], + [74172, 0, "d"], + [74173, 0, " "], + [74174, 0, "i"], + [74175, 0, "t"], + [74176, 0, " "], + [74177, 0, "m"], + [74178, 0, "o"], + [74179, 0, "d"], + [74180, 0, "i"], + [74181, 0, "f"], + [74182, 0, "i"], + [74183, 0, "e"], + [74184, 0, "s"], + [74185, 0, " "], + [74185, 1], + [74184, 1], + [74183, 1], + [74182, 1], + [74181, 1], + [74180, 1], + [74179, 1], + [74178, 1], + [74177, 1], + [74177, 0, "i"], + [74178, 0, "n"], + [74179, 0, "s"], + [74180, 0, "e"], + [74181, 0, "r"], + [74182, 0, "t"], + [74183, 0, "s"], + [74184, 0, " "], + [74185, 0, "a"], + [74186, 0, " "], + [74187, 0, "p"], + [74187, 1], + [74187, 0, "n"], + [74188, 0, "e"], + [74189, 0, "w"], + [74190, 0, " "], + [74191, 0, "l"], + [74192, 0, "i"], + [74193, 0, "s"], + [74194, 0, "t"], + [74195, 0, " "], + [74196, 0, "e"], + [74197, 0, "l"], + [74198, 0, "e"], + [74199, 0, "m"], + [74200, 0, "e"], + [74201, 0, "n"], + [74202, 0, "t"], + [74203, 0, " "], + [74204, 0, "b"], + [74205, 0, "e"], + [74206, 0, "t"], + [74207, 0, "w"], + [74208, 0, "e"], + [74209, 0, "e"], + [74210, 0, "n"], + [74211, 0, " "], + [74212, 0, "r"], + [74212, 1], + [74212, 0, "t"], + [74213, 0, "w"], + [74214, 0, "o"], + [74215, 0, " "], + [74216, 0, "e"], + [74217, 0, "x"], + [74218, 0, "c"], + [74218, 1], + [74218, 0, "i"], + [74219, 0, "s"], + [74220, 0, "t"], + [74221, 0, "i"], + [74222, 0, "n"], + [74223, 0, "g"], + [74224, 0, " "], + [74225, 0, "l"], + [74226, 0, "i"], + [74227, 0, "s"], + [74228, 0, "t"], + [74229, 0, " "], + [74230, 0, "e"], + [74231, 0, "l"], + [74232, 0, "e"], + [74233, 0, "m"], + [74234, 0, "e"], + [74235, 0, "n"], + [74236, 0, "t"], + [74237, 0, "s"], + [74238, 0, " "], + [74239, 0, "("], + [74240, 0, "p"], + [74241, 0, "o"], + [74242, 0, "s"], + [74243, 0, "s"], + [74244, 0, "i"], + [74245, 0, "b"], + [74246, 0, "l"], + [74247, 0, "y"], + [74248, 0, " "], + [74249, 0, "\\"], + [74250, 0, "m"], + [74251, 0, "a"], + [74252, 0, "t"], + [74253, 0, "h"], + [74254, 0, "s"], + [74255, 0, "f"], + [74256, 0, "{"], + [74257, 0, "h"], + [74258, 0, "e"], + [74259, 0, "a"], + [74260, 0, "d"], + [74261, 0, "}"], + [74262, 0, " "], + [74263, 0, "a"], + [74264, 0, "n"], + [74265, 0, "d"], + [74266, 0, "/"], + [74267, 0, "o"], + [74268, 0, "r"], + [74269, 0, " "], + [74270, 0, "\\"], + [74253, 1], + [74252, 1], + [74251, 1], + [74250, 1], + [74250, 0, "t"], + [74251, 0, "e"], + [74252, 0, "x"], + [74253, 0, "t"], + [74271, 0, "t"], + [74272, 0, "e"], + [74273, 0, "x"], + [74274, 0, "t"], + [74275, 0, "s"], + [74276, 0, "f"], + [74277, 0, "{"], + [74278, 0, "t"], + [74279, 0, "a"], + [74280, 0, "i"], + [74281, 0, "l"], + [74282, 0, "}"], + [74283, 0, ")"], + [74284, 0, "."], + [74285, 0, " "], + [74286, 0, "T"], + [74287, 0, "h"], + [74288, 0, "i"], + [74289, 0, "s"], + [74290, 0, " "], + [74291, 0, "m"], + [74292, 0, "o"], + [74293, 0, "d"], + [74294, 0, "i"], + [74295, 0, "f"], + [74296, 0, "i"], + [74297, 0, "c"], + [74298, 0, "a"], + [74299, 0, "t"], + [74300, 0, "i"], + [74301, 0, "o"], + [74302, 0, "n"], + [74303, 0, " "], + [74304, 0, "p"], + [74305, 0, "r"], + [74306, 0, "e"], + [74307, 0, "s"], + [74308, 0, "e"], + [74309, 0, "r"], + [74310, 0, "v"], + [74311, 0, "e"], + [74312, 0, "s"], + [74313, 0, " "], + [74314, 0, "t"], + [74315, 0, "h"], + [74316, 0, "e"], + [74317, 0, " "], + [74318, 0, "p"], + [74319, 0, "r"], + [74320, 0, "e"], + [74321, 0, "c"], + [74322, 0, "e"], + [74323, 0, "d"], + [74324, 0, "e"], + [74325, 0, "n"], + [74326, 0, "c"], + [74327, 0, "e"], + [74328, 0, " "], + [74329, 0, "r"], + [74330, 0, "e"], + [74331, 0, "l"], + [74332, 0, "a"], + [74333, 0, "t"], + [74334, 0, "o"], + [74335, 0, "i"], + [74336, 0, "n"], + [74337, 0, "s"], + [74337, 1], + [74336, 1], + [74335, 1], + [74334, 1], + [74334, 0, "i"], + [74335, 0, "o"], + [74336, 0, "n"], + [74337, 0, "s"], + [74338, 0, "h"], + [74339, 0, "i"], + [74340, 0, "p"], + [74341, 0, " "], + [74342, 0, "b"], + [74343, 0, "e"], + [74344, 0, "t"], + [74345, 0, "w"], + [74346, 0, "e"], + [74347, 0, "e"], + [74348, 0, "n"], + [74349, 0, " "], + [74350, 0, "a"], + [74351, 0, "n"], + [74352, 0, "y"], + [74353, 0, " "], + [74354, 0, "t"], + [74355, 0, "w"], + [74356, 0, "o"], + [74357, 0, " "], + [74358, 0, "e"], + [74359, 0, "x"], + [74360, 0, "i"], + [74361, 0, "s"], + [74362, 0, "t"], + [74363, 0, "i"], + [74364, 0, "n"], + [74365, 0, "g"], + [74366, 0, " "], + [74367, 0, "l"], + [74368, 0, "i"], + [74369, 0, "s"], + [74370, 0, "t"], + [74371, 0, " "], + [74372, 0, "e"], + [74373, 0, "l"], + [74374, 0, "e"], + [74375, 0, "m"], + [74376, 0, "e"], + [74377, 0, "n"], + [74378, 0, "t"], + [74379, 0, "s"], + [74380, 0, "."], + [73769, 1], + [73768, 1], + [73767, 1], + [73766, 1], + [73765, 1], + [73764, 1], + [73764, 0, "d"], + [73765, 0, "e"], + [73766, 0, "f"], + [73767, 0, "i"], + [73768, 0, "n"], + [73769, 0, "i"], + [73770, 0, "o"], + [73771, 0, "n"], + [73771, 1], + [73770, 1], + [73770, 0, "t"], + [73771, 0, "i"], + [73772, 0, "o"], + [73773, 0, "n"], + [74385, 0, " "], + [74386, 0, "S"], + [74387, 0, "i"], + [74388, 0, "n"], + [74389, 0, "c"], + [74390, 0, "e"], + [74391, 0, " "], + [74392, 0, "n"], + [74393, 0, "o"], + [74394, 0, " "], + [74395, 0, "o"], + [74396, 0, "t"], + [74397, 0, "h"], + [74398, 0, "e"], + [74399, 0, "r"], + [74400, 0, " "], + [74401, 0, "r"], + [74402, 0, "u"], + [74403, 0, "l"], + [74404, 0, "e"], + [74405, 0, " "], + [74406, 0, "a"], + [74407, 0, "f"], + [74408, 0, "f"], + [74409, 0, "e"], + [74410, 0, "c"], + [74411, 0, "t"], + [74412, 0, "s"], + [74413, 0, " "], + [74414, 0, "t"], + [74415, 0, "h"], + [74416, 0, "e"], + [74417, 0, " "], + [74418, 0, "l"], + [74419, 0, "i"], + [74420, 0, "s"], + [74421, 0, "t"], + [74422, 0, " "], + [74423, 0, "o"], + [74424, 0, "r"], + [74425, 0, "d"], + [74426, 0, "e"], + [74427, 0, "r"], + [74428, 0, ","], + [74429, 0, " "], + [74430, 0, "p"], + [74431, 0, "r"], + [74432, 0, "e"], + [74433, 0, "c"], + [74434, 0, "e"], + [74435, 0, "d"], + [74436, 0, "e"], + [74437, 0, "n"], + [74438, 0, "c"], + [74439, 0, "e"], + [74440, 0, " "], + [74441, 0, "i"], + [74442, 0, "s"], + [74443, 0, " "], + [74444, 0, "a"], + [74445, 0, "l"], + [74446, 0, "w"], + [74447, 0, "a"], + [74448, 0, "y"], + [74449, 0, "s"], + [74450, 0, " "], + [74451, 0, "p"], + [74452, 0, "r"], + [74453, 0, "e"], + [74454, 0, "s"], + [74455, 0, "e"], + [74456, 0, "r"], + [74457, 0, "v"], + [74458, 0, "e"], + [74459, 0, "d"], + [74460, 0, "."], + [74473, 0, "\n"], + [74474, 0, "\n"], + [74475, 0, "N"], + [74476, 0, "o"], + [74477, 0, "t"], + [74478, 0, "e"], + [74479, 0, " "], + [74480, 0, "t"], + [74481, 0, "h"], + [74482, 0, "a"], + [74483, 0, "t"], + [74484, 0, " "], + [74485, 0, "d"], + [74486, 0, "e"], + [74487, 0, "l"], + [74488, 0, "e"], + [74489, 0, "t"], + [74490, 0, "i"], + [74491, 0, "o"], + [74492, 0, "n"], + [74493, 0, " "], + [74494, 0, "o"], + [74495, 0, "f"], + [74496, 0, " "], + [74497, 0, "a"], + [74498, 0, "l"], + [74498, 1], + [74498, 0, "n"], + [74499, 0, " "], + [74500, 0, "e"], + [74501, 0, "l"], + [74502, 0, "e"], + [74503, 0, "m"], + [74504, 0, "e"], + [74505, 0, "n"], + [74506, 0, "t"], + [74507, 0, " "], + [74508, 0, "f"], + [74509, 0, "r"], + [74510, 0, "o"], + [74511, 0, "m"], + [74512, 0, " "], + [74513, 0, "a"], + [74514, 0, " "], + [74515, 0, "l"], + [74516, 0, "i"], + [74517, 0, "s"], + [74518, 0, "t"], + [74519, 0, " "], + [74520, 0, "d"], + [74521, 0, "o"], + [74522, 0, "e"], + [74523, 0, "s"], + [74524, 0, " "], + [74525, 0, "n"], + [74526, 0, "o"], + [74527, 0, "t"], + [74528, 0, " "], + [74529, 0, "r"], + [74530, 0, "e"], + [74531, 0, "m"], + [74532, 0, "o"], + [74533, 0, "v"], + [74534, 0, "e"], + [74535, 0, " "], + [74536, 0, "i"], + [74537, 0, "t"], + [74538, 0, " "], + [74539, 0, "f"], + [74540, 0, "r"], + [74541, 0, "o"], + [74542, 0, "m"], + [74543, 0, " "], + [74544, 0, "t"], + [74545, 0, "h"], + [74546, 0, "e"], + [74547, 0, " "], + [74548, 0, "s"], + [74549, 0, "e"], + [74550, 0, "q"], + [74551, 0, "u"], + [74552, 0, "e"], + [74553, 0, "n"], + [74554, 0, "c"], + [74555, 0, "e"], + [74556, 0, " "], + [74557, 0, "o"], + [74558, 0, "f"], + [74559, 0, " "], + [74560, 0, "\\"], + [74561, 0, "t"], + [74562, 0, "e"], + [74563, 0, "x"], + [74564, 0, "t"], + [74565, 0, "s"], + [74566, 0, "f"], + [74567, 0, "{"], + [74568, 0, "n"], + [74569, 0, "e"], + [74570, 0, "x"], + [74571, 0, "t"], + [74572, 0, "}"], + [74573, 0, " "], + [74574, 0, "p"], + [74575, 0, "o"], + [74576, 0, "i"], + [74577, 0, "n"], + [74578, 0, "t"], + [74579, 0, "e"], + [74580, 0, "r"], + [74581, 0, "s"], + [74133, 1], + [74132, 1], + [74131, 1], + [74130, 1], + [74129, 1], + [74128, 1], + [74127, 1], + [74127, 0, "p"], + [74128, 0, "o"], + [74129, 0, "i"], + [74130, 0, "n"], + [74131, 0, "t"], + [74132, 0, "e"], + [74133, 0, "r"], + [74134, 0, "s"], + [74583, 0, ","], + [74584, 0, " "], + [74585, 0, "b"], + [74586, 0, "u"], + [74587, 0, "t"], + [74588, 0, " "], + [74589, 0, "o"], + [74590, 0, "n"], + [74591, 0, "l"], + [74592, 0, "y"], + [74593, 0, " "], + [74594, 0, "c"], + [74595, 0, "l"], + [74596, 0, "e"], + [74597, 0, "a"], + [74598, 0, "r"], + [74599, 0, "s"], + [74600, 0, " "], + [74601, 0, "i"], + [74602, 0, "t"], + [74603, 0, "s"], + [74604, 0, " "], + [74605, 0, "p"], + [74606, 0, "r"], + [74607, 0, "e"], + [74608, 0, "s"], + [74609, 0, "e"], + [74610, 0, "n"], + [74611, 0, "c"], + [74612, 0, "e"], + [74613, 0, " "], + [74614, 0, "s"], + [74615, 0, "e"], + [74616, 0, "t"], + [74617, 0, " "], + [74618, 0, "$"], + [74619, 0, "\\"], + [74620, 0, "m"], + [74621, 0, "a"], + [74622, 0, "t"], + [74623, 0, "h"], + [74624, 0, "s"], + [74625, 0, "f"], + [74626, 0, "{"], + [74627, 0, "p"], + [74628, 0, "r"], + [74629, 0, "e"], + [74630, 0, "s"], + [74631, 0, "}"], + [74632, 0, "("], + [74633, 0, "k"], + [74634, 0, ")"], + [74635, 0, "$"], + [74636, 0, "."], + [73890, 0, "\\"], + [73891, 0, "l"], + [73892, 0, "a"], + [73893, 0, "b"], + [73894, 0, "e"], + [73895, 0, "l"], + [73896, 0, "{"], + [73897, 0, "l"], + [73898, 0, "e"], + [73899, 0, "m"], + [73900, 0, ":"], + [73901, 0, "l"], + [73902, 0, "i"], + [73903, 0, "s"], + [73904, 0, "t"], + [73905, 0, "-"], + [73906, 0, "p"], + [73907, 0, "r"], + [73908, 0, "e"], + [73908, 1], + [73907, 1], + [73906, 1], + [73906, 0, "o"], + [73907, 0, "r"], + [73908, 0, "d"], + [73909, 0, "e"], + [73910, 0, "r"], + [73911, 0, "}"], + [73910, 1], + [73909, 1], + [73908, 1], + [73907, 1], + [73906, 1], + [73906, 0, "p"], + [73907, 0, "r"], + [73908, 0, "e"], + [73909, 0, "c"], + [73910, 0, "e"], + [73911, 0, "d"], + [73912, 0, "e"], + [73913, 0, "s"], + [74662, 0, "\n"], + [74663, 0, "\n"], + [74664, 0, "\\"], + [74665, 0, "b"], + [74666, 0, "e"], + [74667, 0, "g"], + [74668, 0, "i"], + [74669, 0, "n"], + [74670, 0, "{"], + [74671, 0, "e"], + [74671, 1], + [74671, 0, "l"], + [74672, 0, "e"], + [74673, 0, "m"], + [74674, 0, "m"], + [74675, 0, "a"], + [74676, 0, "}"], + [74677, 0, "\n"], + [74678, 0, "\\"], + [74679, 0, "e"], + [74680, 0, "n"], + [74681, 0, "d"], + [74682, 0, "{"], + [74683, 0, "l"], + [74684, 0, "e"], + [74685, 0, "m"], + [74686, 0, "m"], + [74687, 0, "a"], + [74688, 0, "}"], + [74677, 0, "\n"], + [74678, 0, "I"], + [74679, 0, "f"], + [74680, 0, " "], + [74681, 0, "o"], + [74682, 0, "n"], + [74683, 0, "e"], + [74684, 0, " "], + [74685, 0, "r"], + [74686, 0, "e"], + [74687, 0, "p"], + [74688, 0, "l"], + [74689, 0, "i"], + [74690, 0, "c"], + [74691, 0, "a"], + [74692, 0, " "], + [74693, 0, "i"], + [74694, 0, "n"], + [74695, 0, "s"], + [74696, 0, "e"], + [74697, 0, "r"], + [74698, 0, "t"], + [74699, 0, "s"], + [74700, 0, " "], + [74701, 0, "a"], + [74702, 0, " "], + [74703, 0, "l"], + [74704, 0, "i"], + [74705, 0, "s"], + [74706, 0, "t"], + [74707, 0, " "], + [74708, 0, "e"], + [74709, 0, "l"], + [74710, 0, "e"], + [74711, 0, "m"], + [74712, 0, "e"], + [74713, 0, "n"], + [74714, 0, "t"], + [74715, 0, " "], + [74716, 0, "$"], + [74717, 0, "k"], + [74718, 0, "{"], + [74718, 1], + [74718, 0, "_"], + [74719, 0, "\\"], + [74720, 0, "m"], + [74721, 0, "a"], + [74722, 0, "t"], + [74723, 0, "h"], + [74724, 0, "i"], + [74725, 0, "t"], + [74726, 0, "{"], + [74727, 0, "n"], + [74728, 0, "e"], + [74729, 0, "w"], + [74730, 0, "}"], + [74731, 0, "$"], + [74732, 0, " "], + [74733, 0, "b"], + [74734, 0, "e"], + [74735, 0, "t"], + [74736, 0, "w"], + [74737, 0, "e"], + [74738, 0, "e"], + [74739, 0, "n"], + [74740, 0, " "], + [74741, 0, "$"], + [74742, 0, "k"], + [74743, 0, "_"], + [74744, 0, "1"], + [74745, 0, "$"], + [74746, 0, " "], + [74747, 0, "A"], + [74748, 0, "N"], + [74749, 0, "D"], + [74750, 0, " "], + [74750, 1], + [74749, 1], + [74748, 1], + [74747, 1], + [74747, 0, "a"], + [74748, 0, "n"], + [74749, 0, "d"], + [74750, 0, " "], + [74751, 0, "$"], + [74752, 0, "k"], + [74753, 0, "_"], + [74754, 0, "2"], + [74755, 0, "$"], + [74756, 0, ","], + [74757, 0, " "], + [74758, 0, "i"], + [74759, 0, "."], + [74760, 0, "e"], + [74761, 0, "."], + [74762, 0, " "], + [74763, 0, "i"], + [74764, 0, "f"], + [74765, 0, " "], + [74766, 0, "$"], + [74767, 0, "\\"], + [74768, 0, "m"], + [74769, 0, "a"], + [74770, 0, "t"], + [74771, 0, "h"], + [74772, 0, "i"], + [74773, 0, "t"], + [74774, 0, "{"], + [74775, 0, "c"], + [74776, 0, "t"], + [74777, 0, "x"], + [74778, 0, "}"], + [74779, 0, "("], + [74780, 0, "n"], + [74781, 0, "e"], + [74781, 1], + [74780, 1], + [74780, 0, "\\"], + [74781, 0, "m"], + [74782, 0, "a"], + [74783, 0, "t"], + [74784, 0, "h"], + [74785, 0, "s"], + [74786, 0, "f"], + [74787, 0, "{"], + [74788, 0, "n"], + [74789, 0, "e"], + [74790, 0, "x"], + [74791, 0, "t"], + [74792, 0, "}"], + [74793, 0, "("], + [74794, 0, "k"], + [74795, 0, "_"], + [74796, 0, "1"], + [74797, 0, ")"], + [74798, 0, ")"], + [74799, 0, " "], + [74800, 0, "="], + [74801, 0, " "], + [74802, 0, "\\"], + [74803, 0, "m"], + [74804, 0, "a"], + [74805, 0, "t"], + [74806, 0, "h"], + [74807, 0, "i"], + [74808, 0, "t"], + [74809, 0, "{"], + [74810, 0, "c"], + [74811, 0, "t"], + [74812, 0, "x"], + [74813, 0, "}"], + [74814, 0, "("], + [74815, 0, "\\"], + [74816, 0, "m"], + [74817, 0, "a"], + [74817, 1], + [74816, 1], + [74815, 1], + [74814, 1], + [74813, 1], + [74812, 1], + [74811, 1], + [74810, 1], + [74809, 1], + [74808, 1], + [74807, 1], + [74806, 1], + [74805, 1], + [74804, 1], + [74803, 1], + [74802, 1], + [74802, 0, "k"], + [74803, 0, "_"], + [74804, 0, "\\"], + [74805, 0, "m"], + [74806, 0, "a"], + [74807, 0, "t"], + [74808, 0, "h"], + [74809, 0, "i"], + [74810, 0, "t"], + [74811, 0, "{"], + [74812, 0, "n"], + [74813, 0, "e"], + [74814, 0, "w"], + [74815, 0, "}"], + [74816, 0, "$"], + [74817, 0, " "], + [74818, 0, "a"], + [74819, 0, "n"], + [74820, 0, "d"], + [74821, 0, " "], + [74822, 0, "$"], + [74823, 0, "\\"], + [74824, 0, "m"], + [74825, 0, "a"], + [74826, 0, "t"], + [74827, 0, "h"], + [74828, 0, "i"], + [74829, 0, "t"], + [74830, 0, "{"], + [74831, 0, "c"], + [74832, 0, "t"], + [74833, 0, "x"], + [74834, 0, "}"], + [74835, 0, "("], + [74836, 0, "\\"], + [74837, 0, "m"], + [74838, 0, "a"], + [74839, 0, "t"], + [74840, 0, "h"], + [74841, 0, "s"], + [74842, 0, "f"], + [74843, 0, "{"], + [74844, 0, "n"], + [74845, 0, "e"], + [74846, 0, "x"], + [74847, 0, "t"], + [74848, 0, "}"], + [74849, 0, "("], + [74850, 0, "k"], + [74851, 0, "_"], + [74852, 0, "\\"], + [74853, 0, "m"], + [74854, 0, "a"], + [74855, 0, "t"], + [74856, 0, "h"], + [74857, 0, "i"], + [74858, 0, "t"], + [74859, 0, "{"], + [74860, 0, "n"], + [74861, 0, "e"], + [74862, 0, "w"], + [74863, 0, "}"], + [74864, 0, ")"], + [74865, 0, ")"], + [74866, 0, " "], + [74867, 0, "="], + [74868, 0, " "], + [74869, 0, "k"], + [74870, 0, "_"], + [74871, 0, "2"], + [74872, 0, "$"], + [74873, 0, " "], + [74874, 0, "o"], + [74875, 0, "n"], + [74876, 0, " "], + [74877, 0, "t"], + [74878, 0, "h"], + [74879, 0, "e"], + [74880, 0, " "], + [74881, 0, "s"], + [74882, 0, "o"], + [74883, 0, "u"], + [74884, 0, "r"], + [74885, 0, "c"], + [74886, 0, "e"], + [74887, 0, " "], + [74888, 0, "r"], + [74889, 0, "e"], + [74890, 0, "p"], + [74891, 0, "l"], + [74892, 0, "i"], + [74893, 0, "c"], + [74894, 0, "a"], + [74895, 0, " "], + [74896, 0, "a"], + [74897, 0, "f"], + [74898, 0, "t"], + [74899, 0, "e"], + [74900, 0, "r"], + [74901, 0, " "], + [74902, 0, "a"], + [74903, 0, "p"], + [74904, 0, "p"], + [74905, 0, "l"], + [74906, 0, "y"], + [74907, 0, "i"], + [74908, 0, "n"], + [74909, 0, "g"], + [74910, 0, " "], + [74911, 0, "\\"], + [74912, 0, "t"], + [74913, 0, "e"], + [74914, 0, "x"], + [74915, 0, "t"], + [74916, 0, "s"], + [74917, 0, "c"], + [74918, 0, "{"], + [74919, 0, "A"], + [74920, 0, "p"], + [74921, 0, "p"], + [74922, 0, "l"], + [74923, 0, "y"], + [74924, 0, "-"], + [74925, 0, "L"], + [74926, 0, "o"], + [74927, 0, "c"], + [74928, 0, "a"], + [74929, 0, "l"], + [74930, 0, "}"], + [74931, 0, ","], + [74932, 0, " "], + [74933, 0, "t"], + [74934, 0, "h"], + [74935, 0, "e"], + [74936, 0, "n"], + [74937, 0, " "], + [74938, 0, "$"], + [74939, 0, "k"], + [74940, 0, "_"], + [74941, 0, "1"], + [74942, 0, "$"], + [74943, 0, " "], + [74944, 0, "p"], + [74945, 0, "r"], + [74946, 0, "e"], + [74947, 0, "c"], + [74948, 0, "e"], + [74949, 0, "d"], + [74950, 0, "e"], + [74951, 0, "s"], + [74952, 0, " "], + [74953, 0, "$"], + [74954, 0, "k"], + [74955, 0, "_"], + [74956, 0, "\\"], + [74957, 0, "m"], + [74958, 0, "a"], + [74959, 0, "t"], + [74960, 0, "h"], + [74961, 0, "i"], + [74962, 0, "t"], + [74963, 0, "{"], + [74964, 0, "n"], + [74965, 0, "e"], + [74966, 0, "w"], + [74967, 0, "}"], + [74968, 0, "$"], + [74969, 0, " "], + [74970, 0, "a"], + [74971, 0, "n"], + [74972, 0, "d"], + [74973, 0, " "], + [74974, 0, "$"], + [74975, 0, "k"], + [74976, 0, "_"], + [74977, 0, "\\"], + [74978, 0, "m"], + [74979, 0, "a"], + [74980, 0, "t"], + [74981, 0, "h"], + [74982, 0, "i"], + [74983, 0, "t"], + [74984, 0, "{"], + [74985, 0, "n"], + [74986, 0, "e"], + [74987, 0, "w"], + [74988, 0, "}"], + [74989, 0, "$"], + [74990, 0, " "], + [74991, 0, "p"], + [74992, 0, "r"], + [74993, 0, "e"], + [74994, 0, "c"], + [74995, 0, "e"], + [74996, 0, "d"], + [74997, 0, "e"], + [74998, 0, "s"], + [74999, 0, " "], + [75000, 0, "$"], + [75001, 0, "k"], + [75002, 0, "_"], + [75003, 0, "2"], + [75004, 0, "$"], + [75005, 0, " "], + [75006, 0, "o"], + [75007, 0, "n"], + [75008, 0, " "], + [75009, 0, "e"], + [75010, 0, "v"], + [75011, 0, "e"], + [75012, 0, "r"], + [75013, 0, "y"], + [75014, 0, " "], + [75015, 0, "o"], + [75016, 0, "t"], + [75017, 0, "h"], + [75018, 0, "e"], + [75019, 0, "r"], + [75020, 0, " "], + [75021, 0, "r"], + [75022, 0, "e"], + [75023, 0, "p"], + [75024, 0, "l"], + [75025, 0, "i"], + [75026, 0, "c"], + [75027, 0, "a"], + [75028, 0, " "], + [75029, 0, "w"], + [75030, 0, "h"], + [75031, 0, "e"], + [75032, 0, "r"], + [75033, 0, "e"], + [75034, 0, " "], + [75035, 0, "t"], + [75036, 0, "h"], + [75037, 0, "a"], + [75038, 0, "t"], + [75039, 0, " "], + [75040, 0, "o"], + [75041, 0, "p"], + [75042, 0, "e"], + [75043, 0, "r"], + [75044, 0, "a"], + [75045, 0, "t"], + [75046, 0, "i"], + [75047, 0, "o"], + [75048, 0, "n"], + [75049, 0, " "], + [75050, 0, "i"], + [75051, 0, "s"], + [75052, 0, " "], + [75053, 0, "a"], + [75054, 0, "p"], + [75055, 0, "p"], + [75056, 0, "l"], + [75057, 0, "i"], + [75058, 0, "e"], + [75059, 0, "d"], + [75060, 0, "."], + [75073, 0, "\n"], + [75074, 0, "\\"], + [75075, 0, "b"], + [75076, 0, "e"], + [75077, 0, "g"], + [75078, 0, "i"], + [75079, 0, "n"], + [75080, 0, "{"], + [75081, 0, "p"], + [75082, 0, "r"], + [75083, 0, "o"], + [75084, 0, "o"], + [75085, 0, "f"], + [75086, 0, "}"], + [74091, 0, "\n"], + [75075, 0, "\n"], + [75089, 0, "\n"], + [75090, 0, "\\"], + [75091, 0, "e"], + [75092, 0, "n"], + [75093, 0, "d"], + [75094, 0, "P"], + [75095, 0, "p"], + [75095, 1], + [75094, 1], + [75094, 0, "{"], + [75095, 0, "}"], + [75095, 0, "p"], + [75096, 0, "r"], + [75097, 0, "o"], + [75098, 0, "o"], + [75099, 0, "f"], + [75089, 0, "\n"], + [75090, 0, "W"], + [75091, 0, "h"], + [75092, 0, "e"], + [75093, 0, "n"], + [75094, 0, " "], + [75095, 0, "t"], + [75096, 0, "h"], + [75097, 0, "e"], + [75098, 0, " "], + [75099, 0, "i"], + [75100, 0, "n"], + [75101, 0, "s"], + [75102, 0, "e"], + [75103, 0, "r"], + [75104, 0, "t"], + [75105, 0, "i"], + [75106, 0, "o"], + [75107, 0, "n"], + [75108, 0, " "], + [75109, 0, "o"], + [75110, 0, "p"], + [75111, 0, "e"], + [75112, 0, "r"], + [75113, 0, "a"], + [75114, 0, "t"], + [75115, 0, "i"], + [75116, 0, "o"], + [75117, 0, "n"], + [75118, 0, " "], + [75119, 0, "i"], + [75120, 0, "s"], + [75121, 0, " "], + [75122, 0, "g"], + [75123, 0, "e"], + [75124, 0, "n"], + [75125, 0, "e"], + [75126, 0, "r"], + [75127, 0, "a"], + [75128, 0, "t"], + [75129, 0, "e"], + [75130, 0, "d"], + [75131, 0, " "], + [75132, 0, "u"], + [75133, 0, "s"], + [75134, 0, "i"], + [75135, 0, "n"], + [75136, 0, "g"], + [75137, 0, " "], + [75138, 0, "t"], + [75139, 0, "h"], + [75140, 0, "e"], + [75141, 0, " "], + [75142, 0, "\\"], + [75143, 0, "t"], + [75144, 0, "e"], + [75145, 0, "x"], + [75146, 0, "t"], + [75147, 0, "s"], + [75148, 0, "c"], + [75149, 0, "{"], + [75150, 0, "M"], + [75151, 0, "a"], + [75152, 0, "k"], + [75153, 0, "e"], + [75154, 0, "-"], + [75155, 0, "O"], + [75156, 0, "p"], + [75157, 0, "}"], + [75158, 0, " "], + [75159, 0, "r"], + [75160, 0, "u"], + [75161, 0, "l"], + [75162, 0, "e"], + [75163, 0, ","], + [75164, 0, " "], + [75165, 0, "i"], + [75166, 0, "t"], + [75167, 0, "s"], + [75168, 0, " "], + [75169, 0, "o"], + [75170, 0, "p"], + [75171, 0, "e"], + [75172, 0, "r"], + [75173, 0, "a"], + [75174, 0, "t"], + [75175, 0, "i"], + [75176, 0, "o"], + [75177, 0, "n"], + [75178, 0, " "], + [75179, 0, "i"], + [75180, 0, "d"], + [75181, 0, "e"], + [75182, 0, "n"], + [75183, 0, "t"], + [75184, 0, "i"], + [75185, 0, "f"], + [75186, 0, "i"], + [75187, 0, "e"], + [75188, 0, "r"], + [75189, 0, " "], + [75190, 0, "c"], + [75191, 0, "o"], + [75192, 0, "n"], + [75193, 0, "t"], + [75194, 0, "a"], + [75195, 0, "i"], + [75196, 0, "n"], + [75197, 0, "s"], + [75198, 0, " "], + [75199, 0, "a"], + [75200, 0, " "], + [75200, 1], + [75199, 1], + [75198, 1], + [75197, 1], + [75196, 1], + [75195, 1], + [75194, 1], + [75193, 1], + [75192, 1], + [75191, 1], + [75190, 1], + [75190, 0, "i"], + [75191, 0, "s"], + [75192, 0, " "], + [75193, 0, "g"], + [75194, 0, "i"], + [75195, 0, "v"], + [75196, 0, "e"], + [75197, 0, "n"], + [75198, 0, " "], + [75199, 0, "a"], + [75200, 0, " "], + [75201, 0, "c"], + [75202, 0, "o"], + [75203, 0, "u"], + [75204, 0, "n"], + [75205, 0, "t"], + [75206, 0, "e"], + [75207, 0, "r"], + [75208, 0, " "], + [75209, 0, "v"], + [75210, 0, "a"], + [75211, 0, "l"], + [75212, 0, "u"], + [75213, 0, "e"], + [75214, 0, " "], + [75215, 0, "\\"], + [75215, 1], + [75215, 0, "$"], + [75216, 0, "\\"], + [75217, 0, "m"], + [75218, 0, "a"], + [75219, 0, "t"], + [75220, 0, "h"], + [75221, 0, "i"], + [75222, 0, "t"], + [75223, 0, "{"], + [75224, 0, "c"], + [75225, 0, "t"], + [75226, 0, "r"], + [75227, 0, "}"], + [75228, 0, "$"], + [75229, 0, " "], + [75230, 0, "t"], + [75231, 0, "h"], + [75232, 0, "a"], + [75233, 0, "t"], + [75234, 0, " "], + [75235, 0, "i"], + [75236, 0, "s"], + [75237, 0, " "], + [75238, 0, "g"], + [75239, 0, "r"], + [75240, 0, "e"], + [75241, 0, "a"], + [75242, 0, "t"], + [75243, 0, "e"], + [75244, 0, "r"], + [75245, 0, " "], + [75246, 0, "t"], + [75247, 0, "h"], + [75248, 0, "a"], + [75249, 0, "n"], + [75250, 0, " "], + [75251, 0, "t"], + [75252, 0, "h"], + [75253, 0, "e"], + [75254, 0, " "], + [75255, 0, "c"], + [75256, 0, "o"], + [75257, 0, "u"], + [75258, 0, "n"], + [75259, 0, "t"], + [75260, 0, "e"], + [75261, 0, "r"], + [75262, 0, " "], + [75263, 0, "o"], + [75264, 0, "f"], + [75265, 0, " "], + [75266, 0, "a"], + [75267, 0, "n"], + [75268, 0, "y"], + [75269, 0, " "], + [75270, 0, "e"], + [75271, 0, "x"], + [75272, 0, "i"], + [75273, 0, "s"], + [75274, 0, "t"], + [75275, 0, "i"], + [75276, 0, "n"], + [75277, 0, "g"], + [75278, 0, " "], + [75279, 0, "o"], + [75280, 0, "p"], + [75281, 0, "e"], + [75282, 0, "r"], + [75283, 0, "a"], + [75284, 0, "t"], + [75285, 0, "i"], + [75286, 0, "o"], + [75287, 0, "n"], + [75288, 0, " "], + [75289, 0, "I"], + [75290, 0, "D"], + [75291, 0, " "], + [75292, 0, "i"], + [75293, 0, "n"], + [75294, 0, " "], + [75295, 0, "$"], + [75296, 0, "\\"], + [75296, 1], + [75296, 0, "A"], + [75297, 0, "-"], + [75297, 1], + [75297, 0, "_"], + [75298, 0, "p"], + [75299, 0, "("], + [75300, 0, "\\"], + [75301, 0, "m"], + [75302, 0, "a"], + [75303, 0, "t"], + [75304, 0, "h"], + [75305, 0, "s"], + [75306, 0, "f"], + [75307, 0, "{"], + [75308, 0, "o"], + [75309, 0, "p"], + [75310, 0, "s"], + [75311, 0, "}"], + [75312, 0, ")"], + [75313, 0, "$"], + [75314, 0, "."], + [75315, 0, " "], + [75316, 0, "I"], + [75317, 0, "f"], + [75318, 0, " "], + [75319, 0, "$"], + [75320, 0, "k"], + [75321, 0, "_"], + [75322, 0, "2"], + [75323, 0, "$"], + [75324, 0, " "], + [75325, 0, "i"], + [75326, 0, "s"], + [75327, 0, " "], + [75328, 0, "a"], + [75329, 0, "n"], + [75330, 0, " "], + [75331, 0, "o"], + [75332, 0, "p"], + [75333, 0, "e"], + [75334, 0, "r"], + [75335, 0, "a"], + [75336, 0, "t"], + [75337, 0, "i"], + [75338, 0, "o"], + [75339, 0, "n"], + [75340, 0, " "], + [75341, 0, "i"], + [75342, 0, "d"], + [75343, 0, "e"], + [75344, 0, "n"], + [75345, 0, "t"], + [75346, 0, "i"], + [75347, 0, "f"], + [75348, 0, "i"], + [75349, 0, "e"], + [75350, 0, "r"], + [75074, 0, "\n"], + [75075, 0, "\n"], + [75076, 0, "T"], + [75076, 1], + [75075, 1], + [75074, 1], + [74663, 0, " "], + [74664, 0, "W"], + [74665, 0, "e"], + [74666, 0, " "], + [74667, 0, "n"], + [74668, 0, "o"], + [74669, 0, "w"], + [74670, 0, " "], + [74671, 0, "c"], + [74672, 0, "o"], + [74673, 0, "n"], + [74674, 0, "s"], + [74675, 0, "i"], + [74676, 0, "d"], + [74677, 0, "e"], + [74678, 0, "r"], + [74679, 0, " "], + [74680, 0, "w"], + [74681, 0, "h"], + [74682, 0, "a"], + [74683, 0, "t"], + [74684, 0, " "], + [74685, 0, "h"], + [74686, 0, "a"], + [74687, 0, "p"], + [74688, 0, "p"], + [74689, 0, "e"], + [74690, 0, "n"], + [74691, 0, "s"], + [74692, 0, " "], + [74693, 0, "w"], + [74694, 0, "h"], + [74695, 0, "e"], + [74696, 0, "n"], + [74697, 0, " "], + [74698, 0, "s"], + [74699, 0, "e"], + [74700, 0, "v"], + [74701, 0, "e"], + [74702, 0, "r"], + [74703, 0, "a"], + [74704, 0, "l"], + [74705, 0, " "], + [74706, 0, "r"], + [74707, 0, "e"], + [74708, 0, "p"], + [74709, 0, "l"], + [74710, 0, "i"], + [74711, 0, "c"], + [74712, 0, "a"], + [74713, 0, "s"], + [74714, 0, " "], + [74715, 0, "c"], + [74716, 0, "o"], + [74717, 0, "n"], + [74718, 0, "c"], + [74719, 0, "u"], + [74720, 0, "r"], + [74721, 0, "r"], + [74722, 0, "e"], + [74723, 0, "n"], + [74724, 0, "t"], + [74725, 0, "l"], + [74726, 0, "y"], + [74727, 0, " "], + [74728, 0, "i"], + [74729, 0, "n"], + [74730, 0, "s"], + [74731, 0, "e"], + [74732, 0, "r"], + [74733, 0, "t"], + [74734, 0, " "], + [74735, 0, "n"], + [74736, 0, "e"], + [74737, 0, "w"], + [74738, 0, " "], + [74739, 0, "e"], + [74740, 0, "l"], + [74741, 0, "e"], + [74742, 0, "m"], + [74743, 0, "e"], + [74744, 0, "n"], + [74745, 0, "t"], + [74746, 0, "s"], + [74747, 0, " "], + [74748, 0, "i"], + [74749, 0, "n"], + [74750, 0, "t"], + [74751, 0, " "], + [74751, 1], + [74751, 0, "o"], + [74752, 0, " "], + [74753, 0, "t"], + [74754, 0, "h"], + [74755, 0, "e"], + [74756, 0, " "], + [74757, 0, "s"], + [74758, 0, "a"], + [74759, 0, "m"], + [74760, 0, "e"], + [74761, 0, " "], + [74762, 0, "l"], + [74763, 0, "i"], + [74764, 0, "s"], + [74765, 0, "t"], + [74766, 0, "."], + [75455, 0, ","], + [75456, 0, " "], + [75457, 0, "w"], + [75458, 0, "e"], + [75459, 0, " "], + [75460, 0, "m"], + [75461, 0, "u"], + [75462, 0, "s"], + [75463, 0, "t"], + [75464, 0, " "], + [75465, 0, "h"], + [75466, 0, "a"], + [75467, 0, "v"], + [75468, 0, "e"], + [75469, 0, " "], + [75470, 0, "$"], + [75471, 0, "k"], + [75472, 0, "_"], + [75473, 0, "2"], + [75474, 0, " "], + [75475, 0, "\\"], + [75476, 0, "o"], + [75477, 0, "n"], + [75477, 1], + [75476, 1], + [75476, 0, "i"], + [75477, 0, "n"], + [75478, 0, " "], + [75479, 0, "A"], + [75480, 0, "_"], + [75481, 0, "p"], + [75482, 0, "("], + [75483, 0, "\\"], + [75484, 0, "m"], + [75485, 0, "a"], + [75486, 0, "t"], + [75487, 0, "h"], + [75488, 0, "s"], + [75489, 0, "f"], + [75490, 0, "{"], + [75491, 0, "o"], + [75492, 0, "p"], + [75493, 0, "s"], + [75494, 0, "}"], + [75495, 0, ")"], + [75496, 0, "$"], + [75497, 0, ","], + [75498, 0, " "], + [75499, 0, "s"], + [75500, 0, "i"], + [75501, 0, "n"], + [75502, 0, "c"], + [75503, 0, "e"], + [75504, 0, " "], + [75505, 0, "b"], + [75506, 0, "o"], + [75507, 0, "t"], + [75508, 0, "h"], + [75509, 0, " "], + [75510, 0, "\\"], + [75511, 0, "t"], + [75512, 0, "e"], + [75513, 0, "x"], + [75514, 0, "t"], + [75515, 0, "s"], + [75516, 0, "c"], + [75517, 0, "{"], + [75518, 0, "A"], + [75519, 0, "p"], + [75520, 0, "p"], + [75521, 0, "l"], + [75522, 0, "y"], + [75523, 0, "_"], + [75523, 1], + [75523, 0, "-"], + [75524, 0, "L"], + [75525, 0, "o"], + [75526, 0, "c"], + [75527, 0, "a"], + [75528, 0, "l"], + [75529, 0, "}"], + [75530, 0, " "], + [75531, 0, "a"], + [75532, 0, "n"], + [75533, 0, "d"], + [75534, 0, " "], + [75535, 0, "\\"], + [75536, 0, "t"], + [75537, 0, "e"], + [75538, 0, "x"], + [75539, 0, "t"], + [75540, 0, "s"], + [75541, 0, "c"], + [75542, 0, "{"], + [75543, 0, "A"], + [75544, 0, "p"], + [75545, 0, "p"], + [75546, 0, "l"], + [75547, 0, "y"], + [75548, 0, "_"], + [75548, 1], + [75548, 0, "-"], + [75549, 0, "R"], + [75550, 0, "e"], + [75551, 0, "m"], + [75552, 0, "o"], + [75553, 0, "t"], + [75554, 0, "e"], + [75555, 0, "}"], + [75556, 0, " "], + [75557, 0, "a"], + [75558, 0, "d"], + [75559, 0, "d"], + [75560, 0, " "], + [75561, 0, "o"], + [75562, 0, "p"], + [75563, 0, "e"], + [75564, 0, "r"], + [75565, 0, "a"], + [75566, 0, "t"], + [75567, 0, "i"], + [75568, 0, "o"], + [75569, 0, "n"], + [75570, 0, " "], + [75571, 0, "I"], + [75572, 0, "D"], + [75573, 0, "s"], + [75574, 0, " "], + [75575, 0, "t"], + [75576, 0, "o"], + [75577, 0, " "], + [75578, 0, "$"], + [75579, 0, "A"], + [75580, 0, "-"], + [75580, 1], + [75580, 0, "_"], + [75581, 0, "p"], + [75582, 0, "("], + [75583, 0, "\\"], + [75584, 0, "m"], + [75585, 0, "a"], + [75586, 0, "t"], + [75587, 0, "h"], + [75588, 0, "s"], + [75589, 0, "f"], + [75590, 0, "{"], + [75591, 0, "o"], + [75592, 0, "p"], + [75593, 0, "s"], + [75594, 0, "}"], + [75595, 0, ")"], + [75596, 0, "$"], + [75597, 0, " "], + [75598, 0, "w"], + [75599, 0, "h"], + [75600, 0, "e"], + [75601, 0, "n"], + [75602, 0, " "], + [75603, 0, "a"], + [75604, 0, "p"], + [75605, 0, "p"], + [75606, 0, "l"], + [75607, 0, "y"], + [75608, 0, "i"], + [75609, 0, "n"], + [75610, 0, "g"], + [75611, 0, " "], + [75612, 0, "a"], + [75613, 0, "n"], + [75614, 0, " "], + [75615, 0, "i"], + [75616, 0, "n"], + [75617, 0, "s"], + [75618, 0, "e"], + [75619, 0, "r"], + [75620, 0, "t"], + [75621, 0, "i"], + [75622, 0, "o"], + [75623, 0, "n"], + [75624, 0, " "], + [75624, 1], + [75624, 0, "."], + [75625, 0, " "], + [75626, 0, "T"], + [75627, 0, "h"], + [75628, 0, "u"], + [75629, 0, "s"], + [75630, 0, ","], + [75630, 1], + [75629, 1], + [75628, 1], + [75627, 1], + [75626, 1], + [75626, 0, "T"], + [75627, 0, "h"], + [75628, 0, "e"], + [75629, 0, " "], + [75630, 0, "o"], + [75631, 0, "n"], + [75632, 0, "l"], + [75633, 0, "y"], + [75634, 0, " "], + [75635, 0, "o"], + [75636, 0, "t"], + [75637, 0, "h"], + [75638, 0, "e"], + [75639, 0, "r"], + [75640, 0, " "], + [75641, 0, "p"], + [75642, 0, "o"], + [75642, 1], + [75641, 1], + [75640, 1], + [75639, 1], + [75638, 1], + [75637, 1], + [75636, 1], + [75635, 1], + [75634, 1], + [75633, 1], + [75632, 1], + [75631, 1], + [75630, 1], + [75629, 1], + [75628, 1], + [75627, 1], + [75626, 1], + [75625, 1], + [75625, 0, " "], + [75626, 0, "I"], + [75627, 0, "f"], + [75628, 0, " "], + [75629, 0, "$"], + [75630, 0, "k"], + [75631, 0, "_"], + [75632, 0, "2"], + [75633, 0, "$"], + [75634, 0, " "], + [75635, 0, "i"], + [75636, 0, "s"], + [75637, 0, " "], + [75638, 0, "n"], + [75639, 0, "o"], + [75640, 0, "t"], + [75641, 0, " "], + [75642, 0, "a"], + [75643, 0, "n"], + [75644, 0, " "], + [75645, 0, "o"], + [75646, 0, "p"], + [75647, 0, "e"], + [75648, 0, "r"], + [75649, 0, "a"], + [75650, 0, "t"], + [75651, 0, "i"], + [75652, 0, "o"], + [75653, 0, "n"], + [75654, 0, " "], + [75655, 0, "i"], + [75656, 0, "d"], + [75657, 0, "e"], + [75658, 0, "n"], + [75659, 0, "t"], + [75660, 0, "i"], + [75661, 0, "f"], + [75662, 0, "i"], + [75663, 0, "e"], + [75664, 0, "r"], + [75665, 0, ","], + [75666, 0, " "], + [75667, 0, "i"], + [75668, 0, "t"], + [75669, 0, " "], + [75670, 0, "m"], + [75671, 0, "u"], + [75672, 0, "s"], + [75673, 0, "t"], + [75674, 0, " "], + [75675, 0, "b"], + [75676, 0, "e"], + [75677, 0, " "], + [75678, 0, "\\"], + [75679, 0, "t"], + [75680, 0, "e"], + [75681, 0, "x"], + [75682, 0, "t"], + [75683, 0, "s"], + [75684, 0, "f"], + [75685, 0, "{"], + [75686, 0, "t"], + [75687, 0, "a"], + [75688, 0, "i"], + [75689, 0, "l"], + [75690, 0, "}"], + [75691, 0, "."], + [75692, 0, " "], + [75193, 0, "\n"], + [75194, 0, "T"], + [75195, 0, "h"], + [75196, 0, "e"], + [75197, 0, " "], + [75198, 0, "r"], + [75199, 0, "u"], + [75200, 0, "l"], + [75201, 0, "e"], + [75202, 0, "s"], + [75203, 0, " "], + [75204, 0, "f"], + [75205, 0, "o"], + [75206, 0, "r"], + [75207, 0, " "], + [75208, 0, "g"], + [75209, 0, "e"], + [75210, 0, "n"], + [75211, 0, "e"], + [75212, 0, "r"], + [75213, 0, "a"], + [75214, 0, "t"], + [75215, 0, "i"], + [75216, 0, "n"], + [75217, 0, "g"], + [75218, 0, " "], + [75219, 0, "l"], + [75220, 0, "i"], + [75221, 0, "s"], + [75222, 0, "t"], + [75223, 0, " "], + [75224, 0, "o"], + [75225, 0, "p"], + [75226, 0, "e"], + [75227, 0, "r"], + [75228, 0, "a"], + [75229, 0, "t"], + [75230, 0, "i"], + [75231, 0, "o"], + [75232, 0, "n"], + [75233, 0, "s"], + [75234, 0, " "], + [75235, 0, "e"], + [75236, 0, "n"], + [75237, 0, "s"], + [75238, 0, "u"], + [75239, 0, "r"], + [75240, 0, "e"], + [75241, 0, " "], + [75242, 0, "t"], + [75243, 0, "h"], + [75244, 0, "a"], + [75245, 0, "t"], + [75246, 0, " "], + [75247, 0, "$"], + [75248, 0, "k"], + [75249, 0, "_"], + [75250, 0, "1"], + [75251, 0, "$"], + [75252, 0, " "], + [75253, 0, "i"], + [75254, 0, "s"], + [75255, 0, " "], + [75256, 0, "e"], + [75257, 0, "i"], + [75258, 0, "t"], + [75259, 0, "h"], + [75260, 0, "e"], + [75261, 0, "r"], + [75262, 0, " "], + [75263, 0, "\\"], + [75264, 0, "t"], + [75265, 0, "e"], + [75266, 0, "x"], + [75267, 0, "t"], + [75268, 0, "s"], + [75269, 0, "f"], + [75270, 0, "{"], + [75271, 0, "h"], + [75272, 0, "e"], + [75273, 0, "a"], + [75274, 0, "d"], + [75275, 0, "}"], + [75276, 0, " "], + [75277, 0, "o"], + [75278, 0, "r"], + [75279, 0, " "], + [75280, 0, "a"], + [75281, 0, "n"], + [75282, 0, " "], + [75283, 0, "o"], + [75284, 0, "p"], + [75285, 0, "e"], + [75286, 0, "r"], + [75287, 0, "a"], + [75288, 0, "t"], + [75289, 0, "i"], + [75290, 0, "o"], + [75291, 0, "n"], + [75292, 0, " "], + [75293, 0, "i"], + [75294, 0, "d"], + [75295, 0, "e"], + [75296, 0, "n"], + [75297, 0, "t"], + [75298, 0, "i"], + [75299, 0, "f"], + [75300, 0, "i"], + [75301, 0, "e"], + [75302, 0, "r"], + [75303, 0, ","], + [75304, 0, " "], + [75305, 0, "a"], + [75306, 0, "n"], + [75307, 0, "d"], + [75308, 0, " "], + [75309, 0, "$"], + [75310, 0, "k"], + [75311, 0, "_"], + [75312, 0, "2"], + [75313, 0, "$"], + [75314, 0, " "], + [75315, 0, "i"], + [75316, 0, "s"], + [75317, 0, " "], + [75318, 0, "e"], + [75319, 0, "i"], + [75320, 0, "t"], + [75321, 0, "h"], + [75322, 0, "e"], + [75323, 0, "r"], + [75324, 0, " "], + [75325, 0, "\\"], + [75326, 0, "t"], + [75327, 0, "e"], + [75328, 0, "x"], + [75329, 0, "t"], + [75330, 0, "s"], + [75331, 0, "c"], + [75331, 1], + [75331, 0, "f"], + [75332, 0, "{"], + [75333, 0, "t"], + [75334, 0, "a"], + [75335, 0, "i"], + [75336, 0, "l"], + [75337, 0, "}"], + [75338, 0, " "], + [75339, 0, "o"], + [75340, 0, "r"], + [75341, 0, " "], + [75342, 0, "a"], + [75343, 0, "n"], + [75344, 0, " "], + [75345, 0, "o"], + [75346, 0, "p"], + [75347, 0, "e"], + [75348, 0, "r"], + [75349, 0, "a"], + [75350, 0, "t"], + [75351, 0, "i"], + [75352, 0, "o"], + [75353, 0, "n"], + [75354, 0, " "], + [75355, 0, "i"], + [75356, 0, "d"], + [75357, 0, "e"], + [75358, 0, "n"], + [75359, 0, "t"], + [75360, 0, "i"], + [75361, 0, "f"], + [75362, 0, "i"], + [75363, 0, "e"], + [75364, 0, "r"], + [75365, 0, "."], + [75366, 1], + [75366, 0, "\n"], + [75367, 0, "\n"], + [75866, 1], + [75865, 1], + [75864, 1], + [75863, 1], + [75862, 1], + [75861, 1], + [75860, 1], + [75859, 1], + [75858, 1], + [75857, 1], + [75856, 1], + [75855, 1], + [75854, 1], + [75853, 1], + [75852, 1], + [75851, 1], + [75850, 1], + [75849, 1], + [75848, 1], + [75847, 1], + [75846, 1], + [75845, 1], + [75844, 1], + [75843, 1], + [75842, 1], + [75841, 1], + [75840, 1], + [75839, 1], + [75838, 1], + [75837, 1], + [75836, 1], + [75835, 1], + [75834, 1], + [75833, 1], + [75832, 1], + [75831, 1], + [75830, 1], + [75829, 1], + [75828, 1], + [75827, 1], + [75826, 1], + [75825, 1], + [75824, 1], + [75823, 1], + [75822, 1], + [75821, 1], + [75820, 1], + [75819, 1], + [75818, 1], + [75817, 1], + [75816, 1], + [75815, 1], + [75814, 1], + [75813, 1], + [75812, 1], + [75811, 1], + [75810, 1], + [75809, 1], + [75808, 1], + [75807, 1], + [75806, 1], + [75805, 1], + [75804, 1], + [75803, 1], + [75802, 1], + [75801, 1], + [75800, 1], + [75800, 0, "T"], + [75801, 0, "h"], + [75802, 0, "u"], + [75803, 0, "s"], + [75804, 0, " "], + [75804, 1], + [75804, 0, ","], + [75805, 0, " "], + [75806, 0, "e"], + [75807, 0, "i"], + [75808, 0, "t"], + [75809, 0, "h"], + [75810, 0, "e"], + [75811, 0, "r"], + [75812, 0, " "], + [75813, 0, "$"], + [75814, 0, "k"], + [75815, 0, "_"], + [75816, 0, "2"], + [75817, 0, " "], + [75818, 0, "<"], + [75819, 0, " "], + [75820, 0, "k"], + [75821, 0, "_"], + [75822, 0, "\\"], + [75823, 0, "m"], + [75824, 0, "a"], + [75825, 0, "t"], + [75826, 0, "h"], + [75827, 0, "i"], + [75828, 0, "t"], + [75829, 0, "{"], + [75830, 0, "n"], + [75831, 0, "e"], + [75832, 0, "w"], + [75833, 0, "}"], + [75834, 0, "$"], + [75835, 0, " "], + [75836, 0, "u"], + [75837, 0, "n"], + [75838, 0, "d"], + [75839, 0, "e"], + [75840, 0, "r"], + [75841, 0, " "], + [75842, 0, "t"], + [75843, 0, "h"], + [75844, 0, "e"], + [75845, 0, " "], + [75846, 0, "o"], + [75847, 0, "r"], + [75848, 0, "d"], + [75849, 0, "e"], + [75850, 0, "r"], + [75851, 0, "i"], + [75852, 0, "n"], + [75853, 0, "g"], + [75854, 0, " "], + [75855, 0, "r"], + [75856, 0, "e"], + [75857, 0, "l"], + [75858, 0, "a"], + [75859, 0, "t"], + [75860, 0, "i"], + [75861, 0, "o"], + [75862, 0, "n"], + [75863, 0, " "], + [75864, 0, "$"], + [75865, 0, "<"], + [75866, 0, "$"], + [75867, 0, " "], + [75868, 0, "f"], + [75869, 0, "o"], + [75870, 0, "r"], + [75871, 0, " "], + [75872, 0, "L"], + [75873, 0, "a"], + [75874, 0, "m"], + [75875, 0, "p"], + [75876, 0, "o"], + [75877, 0, "r"], + [75878, 0, "t"], + [75879, 0, " "], + [75880, 0, "t"], + [75881, 0, "i"], + [75882, 0, "m"], + [75883, 0, "e"], + [75884, 0, "s"], + [75885, 0, "t"], + [75886, 0, "a"], + [75887, 0, "m"], + [75888, 0, "p"], + [75889, 0, "s"], + [75890, 0, ","], + [75891, 0, " "], + [75892, 0, "o"], + [75893, 0, "r"], + [75894, 0, " "], + [75895, 0, "$"], + [75896, 0, "k"], + [75897, 0, "_"], + [75898, 0, "2"], + [75899, 0, " "], + [75900, 0, "="], + [75901, 0, " "], + [75902, 0, "\\"], + [75903, 0, "m"], + [75904, 0, "a"], + [75905, 0, "t"], + [75906, 0, "h"], + [75907, 0, "s"], + [75908, 0, "f"], + [75909, 0, "{"], + [75910, 0, "t"], + [75911, 0, "a"], + [75912, 0, "i"], + [75913, 0, "l"], + [75914, 0, "}"], + [75915, 0, "$"], + [75916, 0, "."], + [75917, 0, "\n"], + [75918, 0, "\n"], + [75919, 0, "W"], + [75920, 0, "h"], + [75921, 0, "e"], + [75922, 0, "n"], + [75923, 0, " "], + [75924, 0, "t"], + [75925, 0, "h"], + [75926, 0, "e"], + [75927, 0, " "], + [75928, 0, "i"], + [75929, 0, "n"], + [75930, 0, "s"], + [75931, 0, "e"], + [75932, 0, "r"], + [75933, 0, "t"], + [75934, 0, "i"], + [75935, 0, "o"], + [75936, 0, "n"], + [75937, 0, " "], + [75938, 0, "o"], + [75939, 0, "p"], + [75940, 0, "e"], + [75941, 0, "r"], + [75942, 0, "a"], + [75943, 0, "t"], + [75944, 0, "i"], + [75945, 0, "o"], + [75946, 0, "n"], + [75947, 0, " "], + [75948, 0, "i"], + [75949, 0, "s"], + [75950, 0, " "], + [75951, 0, "a"], + [75952, 0, "p"], + [75953, 0, "p"], + [75954, 0, "l"], + [75955, 0, "i"], + [75956, 0, "e"], + [75957, 0, "d"], + [75958, 0, " "], + [75959, 0, "o"], + [75960, 0, "n"], + [75961, 0, " "], + [75962, 0, "o"], + [75963, 0, "t"], + [75964, 0, "h"], + [75965, 0, "e"], + [75966, 0, "r"], + [75967, 0, " "], + [75968, 0, "r"], + [75969, 0, "e"], + [75970, 0, "p"], + [75971, 0, "l"], + [75972, 0, "i"], + [75973, 0, "c"], + [75974, 0, "a"], + [75975, 0, "s"], + [75976, 0, "e"], + [75976, 1], + [75976, 0, " "], + [75977, 0, "u"], + [75978, 0, "s"], + [75979, 0, "i"], + [75980, 0, "n"], + [75981, 0, "g"], + [75982, 0, " "], + [75983, 0, "\\"], + [75984, 0, "t"], + [75985, 0, "e"], + [75986, 0, "x"], + [75987, 0, "t"], + [75988, 0, "s"], + [75989, 0, "c"], + [75990, 0, "{"], + [75991, 0, "A"], + [75992, 0, "p"], + [75993, 0, "p"], + [75994, 0, "l"], + [75995, 0, "y"], + [75996, 0, "-"], + [75997, 0, "R"], + [75998, 0, "e"], + [75999, 0, "m"], + [76000, 0, "o"], + [76001, 0, "t"], + [76002, 0, "e"], + [76003, 0, "}"], + [76004, 0, " "], + [76005, 0, "a"], + [76006, 0, "n"], + [76007, 0, "d"], + [76008, 0, " "], + [76009, 0, "$"], + [76010, 0, "\\"], + [76011, 0, "t"], + [76012, 0, "e"], + [76013, 0, "x"], + [76014, 0, "t"], + [76015, 0, "s"], + [76016, 0, "c"], + [76017, 0, "{"], + [76018, 0, "I"], + [76019, 0, "n"], + [76020, 0, "s"], + [76021, 0, "e"], + [76022, 0, "r"], + [76023, 0, "t"], + [76024, 0, "}"], + [76025, 0, "_"], + [76026, 0, "{"], + [76027, 0, "1"], + [76028, 0, ","], + [76029, 0, "2"], + [76030, 0, "}"], + [76031, 0, "$"], + [76032, 0, ","], + [76033, 0, " "], + [76034, 0, "b"], + [76035, 0, "y"], + [76036, 0, " "], + [76037, 0, "L"], + [76037, 1], + [76036, 1], + [76035, 1], + [76034, 1], + [76034, 0, "$"], + [76035, 0, "k"], + [76036, 0, "_"], + [76037, 0, "1"], + [76038, 0, "$"], + [76039, 0, " "], + [76040, 0, "p"], + [76041, 0, "r"], + [76042, 0, "e"], + [76043, 0, "c"], + [76044, 0, "e"], + [76045, 0, "d"], + [76046, 0, "e"], + [76047, 0, "s"], + [76048, 0, " "], + [76049, 0, "$"], + [76050, 0, "k"], + [76051, 0, "_"], + [76052, 0, "2"], + [76053, 0, "$"], + [76054, 0, " "], + [76055, 0, "o"], + [76056, 0, "n"], + [76057, 0, " "], + [76058, 0, "t"], + [76059, 0, "h"], + [76060, 0, "a"], + [76061, 0, "t"], + [76062, 0, " "], + [75962, 0, "a"], + [75963, 0, "n"], + [75977, 1], + [76064, 0, "r"], + [76065, 0, "e"], + [76066, 0, "p"], + [76067, 0, "l"], + [76068, 0, "i"], + [76069, 0, "c"], + [76070, 0, "a"], + [76071, 0, " "], + [76072, 0, "("], + [76073, 0, "b"], + [76074, 0, "y"], + [76075, 0, " "], + [76076, 0, "L"], + [76077, 0, "e"], + [76078, 0, "m"], + [76079, 0, "m"], + [76080, 0, "a"], + [76081, 0, "~"], + [76082, 0, "\\"], + [76083, 0, "r"], + [76084, 0, "e"], + [76085, 0, "f"], + [76086, 0, "{"], + [76087, 0, "l"], + [76088, 0, "e"], + [76089, 0, "m"], + [76090, 0, ":"], + [76091, 0, "l"], + [76092, 0, "i"], + [76093, 0, "s"], + [76094, 0, "t"], + [76095, 0, "-"], + [76096, 0, "p"], + [76097, 0, "r"], + [76098, 0, "e"], + [76099, 0, "c"], + [76100, 0, "e"], + [76101, 0, "d"], + [76102, 0, "e"], + [76103, 0, "s"], + [76104, 0, "}"], + [76105, 0, " "], + [76106, 0, "a"], + [76107, 0, "n"], + [76108, 0, "d"], + [76109, 0, " "], + [76110, 0, "c"], + [76111, 0, "a"], + [76112, 0, "u"], + [76113, 0, "s"], + [76114, 0, "a"], + [76115, 0, "l"], + [76116, 0, "i"], + [76117, 0, "t"], + [76118, 0, "y"], + [76119, 0, ")"], + [76120, 0, "."], + [74782, 0, "\\"], + [74783, 0, "l"], + [74784, 0, "a"], + [74785, 0, "b"], + [74786, 0, "e"], + [74787, 0, "l"], + [74788, 0, "{"], + [74789, 0, "l"], + [74790, 0, "e"], + [74791, 0, "m"], + [74792, 0, ":"], + [74793, 0, "i"], + [74794, 0, "n"], + [74795, 0, "s"], + [74796, 0, "e"], + [74797, 0, "r"], + [74798, 0, "t"], + [74799, 0, "-"], + [74800, 0, "b"], + [74801, 0, "e"], + [74802, 0, "t"], + [74803, 0, "w"], + [74804, 0, "e"], + [74805, 0, "e"], + [74806, 0, "n"], + [74807, 0, "}"], + [76147, 0, " "], + [76148, 0, "$"], + [76148, 1], + [76148, 0, "\n"], + [76148, 1], + [76148, 0, "T"], + [76149, 0, "h"], + [76150, 0, "e"], + [76151, 0, " "], + [76152, 0, "c"], + [76153, 0, "u"], + [76154, 0, "r"], + [76155, 0, "s"], + [76156, 0, "o"], + [76157, 0, "r"], + [76158, 0, " "], + [76159, 0, "o"], + [76160, 0, "f"], + [76161, 0, " "], + [76162, 0, "t"], + [76163, 0, "h"], + [76164, 0, "e"], + [76165, 0, " "], + [76166, 0, "o"], + [76167, 0, "p"], + [76168, 0, "e"], + [76169, 0, "r"], + [76170, 0, "a"], + [76171, 0, "t"], + [76172, 0, "i"], + [76173, 0, "o"], + [76174, 0, "n"], + [76175, 0, " "], + [76176, 0, "i"], + [76177, 0, "s"], + [76178, 0, " "], + [76179, 0, "$"], + [76180, 0, "\\"], + [76181, 0, "m"], + [76182, 0, "a"], + [76183, 0, "t"], + [76184, 0, "h"], + [76185, 0, "s"], + [76186, 0, "f"], + [76187, 0, "{"], + [76188, 0, "c"], + [76189, 0, "u"], + [76190, 0, "r"], + [76191, 0, "s"], + [76192, 0, "o"], + [76193, 0, "r"], + [76194, 0, "}"], + [76195, 0, "("], + [76196, 0, "\\"], + [76197, 0, "l"], + [76198, 0, "a"], + [76199, 0, "n"], + [76200, 0, "g"], + [76201, 0, "l"], + [76202, 0, "e"], + [76203, 0, "\\"], + [76204, 0, "d"], + [76205, 0, "o"], + [76206, 0, "t"], + [76207, 0, "s"], + [76208, 0, "\\"], + [76209, 0, "r"], + [76210, 0, "a"], + [76211, 0, "n"], + [76212, 0, "g"], + [76213, 0, "l"], + [76214, 0, "e"], + [76215, 0, ","], + [76216, 0, " "], + [76217, 0, "k"], + [76218, 0, "_"], + [76219, 0, "1"], + [76220, 0, ")"], + [76221, 0, "$"], + [76222, 0, "."], + [76223, 0, " "], + [76224, 0, "I"], + [76225, 0, "f"], + [76226, 0, " "], + [76227, 0, "o"], + [76228, 0, "t"], + [76229, 0, "h"], + [76230, 0, "e"], + [76231, 0, "r"], + [76232, 0, " "], + [76233, 0, "c"], + [76234, 0, "o"], + [76235, 0, "n"], + [76236, 0, "c"], + [76237, 0, "u"], + [76238, 0, "r"], + [76239, 0, "r"], + [76240, 0, "e"], + [76241, 0, "n"], + [76242, 0, "t"], + [76243, 0, " "], + [76244, 0, "i"], + [76245, 0, "n"], + [76246, 0, "s"], + [76247, 0, "e"], + [76248, 0, "r"], + [76249, 0, "t"], + [76250, 0, "i"], + [76251, 0, "o"], + [76252, 0, "n"], + [76253, 0, "s"], + [76254, 0, " "], + [76255, 0, "o"], + [76256, 0, "c"], + [76257, 0, "c"], + [76258, 0, "u"], + [76259, 0, "r"], + [76260, 0, "r"], + [76261, 0, "e"], + [76262, 0, "d"], + [76263, 0, " "], + [76264, 0, "b"], + [76265, 0, "e"], + [76266, 0, "t"], + [76267, 0, "w"], + [76268, 0, "e"], + [76269, 0, "e"], + [76270, 0, "n"], + [76271, 0, " "], + [76272, 0, "$"], + [76273, 0, "k"], + [76274, 0, "_"], + [76275, 0, "1"], + [76276, 0, "$"], + [76277, 0, " "], + [76278, 0, "a"], + [76279, 0, "n"], + [76280, 0, "d"], + [76281, 0, " "], + [76282, 0, "$"], + [76283, 0, "k"], + [76284, 0, "_"], + [76285, 0, "2"], + [76286, 0, "$"], + [76287, 0, ","], + [76288, 0, " "], + [76289, 0, "t"], + [76290, 0, "h"], + [76291, 0, "e"], + [76292, 0, "i"], + [76293, 0, "r"], + [76294, 0, " "], + [76295, 0, "o"], + [76296, 0, "p"], + [76297, 0, "e"], + [76298, 0, "r"], + [76299, 0, "a"], + [76300, 0, "t"], + [76301, 0, "i"], + [76302, 0, "o"], + [76303, 0, "n"], + [76304, 0, " "], + [76305, 0, "I"], + [76306, 0, "D"], + [76307, 0, " "], + [76308, 0, "m"], + [76309, 0, "a"], + [76310, 0, "y"], + [76311, 0, " "], + [76312, 0, "b"], + [76313, 0, "e"], + [76314, 0, " "], + [76315, 0, "g"], + [76316, 0, "r"], + [76317, 0, "e"], + [76318, 0, "a"], + [76319, 0, "t"], + [76320, 0, "e"], + [76321, 0, "r"], + [76322, 0, " "], + [76323, 0, "t"], + [76324, 0, "h"], + [76325, 0, "a"], + [76326, 0, "n"], + [76327, 0, " "], + [76328, 0, "o"], + [76329, 0, "r"], + [76330, 0, " "], + [76331, 0, "l"], + [76332, 0, "e"], + [76333, 0, "s"], + [76334, 0, "s"], + [76335, 0, " "], + [76336, 0, "t"], + [76337, 0, "h"], + [76338, 0, "a"], + [76339, 0, "n"], + [76340, 0, " "], + [76341, 0, "$"], + [76342, 0, "k"], + [76343, 0, "_"], + [76344, 0, "\\"], + [76345, 0, "m"], + [76346, 0, "a"], + [76347, 0, "t"], + [76348, 0, "h"], + [76349, 0, "i"], + [76350, 0, "t"], + [76351, 0, "{"], + [76352, 0, "n"], + [76353, 0, "e"], + [76354, 0, "w"], + [76355, 0, "}"], + [76356, 0, "$"], + [76357, 0, ","], + [76358, 0, " "], + [76359, 0, "a"], + [76360, 0, "n"], + [76361, 0, "d"], + [76362, 0, " "], + [76363, 0, "t"], + [76364, 0, "h"], + [76365, 0, "u"], + [76366, 0, "s"], + [76367, 0, " "], + [76368, 0, "e"], + [76369, 0, "i"], + [76370, 0, "t"], + [76371, 0, "h"], + [76372, 0, "e"], + [76373, 0, "r"], + [76374, 0, " "], + [76375, 0, "$"], + [76376, 0, "\\"], + [76377, 0, "m"], + [76378, 0, "a"], + [76379, 0, "t"], + [76380, 0, "h"], + [76380, 1], + [76379, 1], + [76378, 1], + [76377, 1], + [76377, 0, "t"], + [76378, 0, "e"], + [76379, 0, "x"], + [76380, 0, "t"], + [76381, 0, "s"], + [76382, 0, "c"], + [76383, 0, "{"], + [76384, 0, "I"], + [76385, 0, "n"], + [76386, 0, "s"], + [76387, 0, "e"], + [76388, 0, "r"], + [76389, 0, "t"], + [76390, 0, "}"], + [76391, 0, "_"], + [76392, 0, "1"], + [76393, 0, "$"], + [76394, 0, " "], + [76395, 0, "o"], + [76396, 0, "r"], + [76397, 0, " "], + [76398, 0, "\\"], + [76398, 1], + [76398, 0, "$"], + [76399, 0, "\\"], + [76400, 0, "t"], + [76401, 0, "e"], + [76402, 0, "x"], + [76403, 0, "t"], + [76404, 0, "s"], + [76405, 0, "c"], + [76406, 0, "{"], + [76407, 0, "I"], + [76408, 0, "n"], + [76409, 0, "s"], + [76410, 0, "e"], + [76411, 0, "r"], + [76412, 0, "t"], + [76413, 0, "}"], + [76414, 0, "_"], + [76415, 0, "2"], + [76416, 0, "$"], + [76417, 0, " "], + [76418, 0, "m"], + [76419, 0, "a"], + [76420, 0, "y"], + [76421, 0, " "], + [76422, 0, "a"], + [76423, 0, "p"], + [76424, 0, "p"], + [76425, 0, "l"], + [76426, 0, "y"], + [76427, 0, "."], + [76428, 0, " "], + [76429, 0, "I"], + [76430, 0, "n"], + [76431, 0, " "], + [76432, 0, "p"], + [76433, 0, "a"], + [76434, 0, "r"], + [76435, 0, "t"], + [76436, 0, "i"], + [76437, 0, "c"], + [76438, 0, "u"], + [76439, 0, "l"], + [76440, 0, "a"], + [76441, 0, "r"], + [76442, 0, ","], + [76443, 0, " "], + [76444, 0, "$"], + [76445, 0, "\\"], + [76446, 0, "t"], + [76447, 0, "e"], + [76448, 0, "x"], + [76449, 0, "t"], + [76450, 0, "s"], + [76451, 0, "c"], + [76452, 0, "{"], + [76453, 0, "I"], + [76454, 0, "n"], + [76455, 0, "s"], + [76456, 0, "e"], + [76457, 0, "r"], + [76458, 0, "t"], + [76459, 0, "}"], + [76460, 0, "_"], + [76461, 0, "2"], + [76462, 0, "$"], + [76463, 0, " "], + [76464, 0, "s"], + [76465, 0, "k"], + [76466, 0, "i"], + [76467, 0, "p"], + [76468, 0, "s"], + [76469, 0, " "], + [76470, 0, "o"], + [76471, 0, "v"], + [76472, 0, "e"], + [76473, 0, "r"], + [76474, 0, " "], + [76475, 0, "a"], + [76476, 0, "n"], + [76477, 0, "y"], + [76478, 0, " "], + [76479, 0, "l"], + [76480, 0, "i"], + [76481, 0, "s"], + [76482, 0, "t"], + [76483, 0, " "], + [76484, 0, "e"], + [76485, 0, "l"], + [76486, 0, "e"], + [76487, 0, "m"], + [76488, 0, "e"], + [76489, 0, "n"], + [76490, 0, "t"], + [76491, 0, "s"], + [76492, 0, " "], + [76493, 0, "w"], + [76494, 0, "h"], + [76495, 0, "o"], + [76496, 0, "s"], + [76497, 0, "e"], + [76498, 0, " "], + [76499, 0, "L"], + [76500, 0, "a"], + [76501, 0, "m"], + [76502, 0, "p"], + [76503, 0, "o"], + [76504, 0, "r"], + [76505, 0, "t"], + [76506, 0, " "], + [76507, 0, "t"], + [76508, 0, "i"], + [76509, 0, "m"], + [76510, 0, "e"], + [76511, 0, "s"], + [76512, 0, "t"], + [76513, 0, "a"], + [76514, 0, "m"], + [76515, 0, "p"], + [76516, 0, " "], + [76517, 0, "i"], + [76518, 0, "s"], + [76519, 0, " "], + [76520, 0, "g"], + [76521, 0, "r"], + [76522, 0, "e"], + [76523, 0, "a"], + [76524, 0, "t"], + [76525, 0, "e"], + [76526, 0, "r"], + [76527, 0, " "], + [76528, 0, "t"], + [76529, 0, "h"], + [76530, 0, "a"], + [76531, 0, "n"], + [76532, 0, " "], + [76533, 0, "$"], + [76534, 0, "k"], + [76535, 0, "_"], + [76536, 0, "\\"], + [76537, 0, "m"], + [76538, 0, "a"], + [76539, 0, "t"], + [76540, 0, "h"], + [76541, 0, "i"], + [76542, 0, "t"], + [76543, 0, "{"], + [76544, 0, "n"], + [76545, 0, "e"], + [76546, 0, "w"], + [76547, 0, "}"], + [76548, 0, "$"], + [76549, 0, "."], + [76222, 0, ","], + [76223, 0, " "], + [76224, 0, "s"], + [76225, 0, "o"], + [76226, 0, " "], + [76227, 0, "t"], + [76228, 0, "h"], + [76229, 0, "e"], + [76230, 0, " "], + [76231, 0, "r"], + [76232, 0, "u"], + [76233, 0, "l"], + [76234, 0, "e"], + [76235, 0, "s"], + [76236, 0, " "], + [76237, 0, "s"], + [76238, 0, "t"], + [76239, 0, "a"], + [76240, 0, "r"], + [76241, 0, "t"], + [76242, 0, " "], + [76243, 0, "i"], + [76244, 0, "t"], + [76245, 0, "e"], + [76246, 0, "r"], + [76247, 0, "a"], + [76248, 0, "t"], + [76249, 0, "i"], + [76250, 0, "n"], + [76251, 0, "g"], + [76252, 0, " "], + [76253, 0, "t"], + [76254, 0, "h"], + [76255, 0, "e"], + [76256, 0, " "], + [76257, 0, "l"], + [76258, 0, "i"], + [76259, 0, "s"], + [76260, 0, "t"], + [76261, 0, " "], + [76262, 0, "a"], + [76263, 0, "t"], + [76264, 0, " "], + [76265, 0, "$"], + [76266, 0, "k"], + [76267, 0, "_"], + [76268, 0, "1"], + [76269, 0, "$"], + [76270, 0, " "], + [76271, 0, "a"], + [76272, 0, "n"], + [76273, 0, "d"], + [76274, 0, " "], + [76275, 0, "n"], + [76276, 0, "e"], + [76277, 0, "v"], + [76278, 0, "e"], + [76279, 0, "r"], + [76280, 0, " "], + [76281, 0, "i"], + [76282, 0, "n"], + [76283, 0, "s"], + [76284, 0, "e"], + [76285, 0, "r"], + [76286, 0, "t"], + [76287, 0, " "], + [76288, 0, "$"], + [76289, 0, "k"], + [76290, 0, "_"], + [76291, 0, "\\"], + [76292, 0, "m"], + [76293, 0, "a"], + [76294, 0, "t"], + [76295, 0, "h"], + [76296, 0, "i"], + [76297, 0, "t"], + [76298, 0, "{"], + [76299, 0, "n"], + [76300, 0, "e"], + [76301, 0, "w"], + [76302, 0, "}"], + [76303, 0, "$"], + [76304, 0, " "], + [76305, 0, "a"], + [76306, 0, "t"], + [76307, 0, " "], + [76308, 0, "a"], + [76309, 0, " "], + [76310, 0, "p"], + [76311, 0, "o"], + [76312, 0, "s"], + [76313, 0, "i"], + [76314, 0, "t"], + [76315, 0, "i"], + [76316, 0, "o"], + [76317, 0, "n"], + [76318, 0, " "], + [76319, 0, "t"], + [76320, 0, "h"], + [76321, 0, "a"], + [76322, 0, "t"], + [76323, 0, " "], + [76324, 0, "p"], + [76325, 0, "r"], + [76326, 0, "e"], + [76327, 0, "c"], + [76328, 0, "e"], + [76329, 0, "d"], + [76330, 0, "e"], + [76331, 0, "s"], + [76332, 0, " "], + [76333, 0, "$"], + [76334, 0, "k"], + [76335, 0, "_"], + [76336, 0, "1"], + [76337, 0, "$"], + [76339, 0, "\n"], + [76340, 0, "\n"], + [76341, 1], + [76667, 0, " "], + [76668, 0, "H"], + [76669, 0, "o"], + [76670, 0, "w"], + [76671, 0, "e"], + [76672, 0, "v"], + [76673, 0, "e"], + [76674, 0, "r"], + [76675, 0, ","], + [76676, 0, " "], + [76677, 0, "w"], + [76678, 0, "e"], + [76679, 0, " "], + [76680, 0, "k"], + [76681, 0, "n"], + [76682, 0, "o"], + [76683, 0, "w"], + [76684, 0, " "], + [76685, 0, "t"], + [76686, 0, "h"], + [76687, 0, "a"], + [76688, 0, "t"], + [76689, 0, " "], + [76690, 0, "$"], + [76691, 0, "k"], + [76692, 0, "_"], + [76693, 0, "2"], + [76694, 0, " "], + [76695, 0, "<"], + [76696, 0, " "], + [76697, 0, "k"], + [76698, 0, "_"], + [76699, 0, "\\"], + [76700, 0, "m"], + [76701, 0, "a"], + [76702, 0, "t"], + [76703, 0, "h"], + [76704, 0, "i"], + [76705, 0, "t"], + [76706, 0, "{"], + [76707, 0, "n"], + [76708, 0, "e"], + [76709, 0, "w"], + [76710, 0, "}"], + [76711, 0, " "], + [76712, 0, "\\"], + [76713, 0, "v"], + [76714, 0, "e"], + [76715, 0, "e"], + [76716, 0, " "], + [76717, 0, "k"], + [76718, 0, "_"], + [76719, 0, "2"], + [76720, 0, " "], + [76721, 0, "="], + [76722, 0, " "], + [76723, 0, "\\"], + [76724, 0, "m"], + [76725, 0, "a"], + [76726, 0, "t"], + [76727, 0, "h"], + [76728, 0, "s"], + [76729, 0, "f"], + [76730, 0, "{"], + [76731, 0, "t"], + [76732, 0, "a"], + [76733, 0, "i"], + [76734, 0, "l"], + [76735, 0, "}"], + [76736, 0, "$"], + [76737, 0, ","], + [76738, 0, " "], + [76739, 0, "a"], + [76740, 0, "n"], + [76741, 0, "d"], + [76742, 0, " "], + [76743, 0, "s"], + [76744, 0, "o"], + [76745, 0, " "], + [76746, 0, "$"], + [76747, 0, "\\"], + [76748, 0, "t"], + [76749, 0, "e"], + [76750, 0, "x"], + [76751, 0, "t"], + [76752, 0, "s"], + [76753, 0, "c"], + [76754, 0, "{"], + [76755, 0, "I"], + [76756, 0, "n"], + [76757, 0, "s"], + [76758, 0, "e"], + [76759, 0, "r"], + [76760, 0, "t"], + [76761, 0, "}"], + [76762, 0, "_"], + [76763, 0, "1"], + [76764, 0, "$"], + [76765, 0, " "], + [76766, 0, "w"], + [76767, 0, "i"], + [76768, 0, "l"], + [76769, 0, "l"], + [76770, 0, " "], + [76771, 0, "a"], + [76772, 0, "p"], + [76773, 0, "p"], + [76774, 0, "l"], + [76775, 0, "y"], + [76776, 0, " "], + [76777, 0, "w"], + [76778, 0, "i"], + [76779, 0, "t"], + [76780, 0, "h"], + [76781, 0, " "], + [76782, 0, "$"], + [76783, 0, "\\"], + [76784, 0, "m"], + [76785, 0, "a"], + [76786, 0, "t"], + [76787, 0, "h"], + [76788, 0, "i"], + [76789, 0, "t"], + [76790, 0, "{"], + [76791, 0, "n"], + [76792, 0, "e"], + [76793, 0, "x"], + [76794, 0, "t"], + [76795, 0, "}"], + [76796, 0, "="], + [76797, 0, "k"], + [76798, 0, "_"], + [76799, 0, "2"], + [76800, 0, "$"], + [76801, 0, " "], + [76802, 0, "a"], + [76803, 0, "t"], + [76804, 0, " "], + [76805, 0, "t"], + [76806, 0, "h"], + [76807, 0, "e"], + [76808, 0, " "], + [76809, 0, "l"], + [76810, 0, "a"], + [76811, 0, "t"], + [76812, 0, "e"], + [76813, 0, "s"], + [76814, 0, "t"], + [76815, 0, "."], + [76816, 0, " "], + [76817, 0, "T"], + [76818, 0, "h"], + [76819, 0, "e"], + [76820, 0, " "], + [76821, 0, "$"], + [76822, 0, "\\"], + [76823, 0, "m"], + [76824, 0, "a"], + [76825, 0, "t"], + [76826, 0, "h"], + [76826, 1], + [76825, 1], + [76824, 1], + [76823, 1], + [76823, 0, "m"], + [76824, 0, "a"], + [76825, 0, "t"], + [76826, 0, "h"], + [76751, 1], + [76750, 1], + [76749, 1], + [76748, 1], + [76748, 0, "m"], + [76749, 0, "a"], + [76750, 0, "t"], + [76751, 0, "h"], + [76520, 1], + [76519, 1], + [76518, 1], + [76517, 1], + [76517, 0, "m"], + [76518, 0, "a"], + [76519, 0, "t"], + [76520, 0, "h"], + [76517, 1], + [76517, 1], + [76517, 1], + [76517, 1], + [76517, 0, "t"], + [76518, 0, "e"], + [76519, 0, "x"], + [76520, 0, "t"], + [76748, 1], + [76748, 1], + [76748, 1], + [76748, 1], + [76748, 0, "t"], + [76749, 0, "e"], + [76750, 0, "x"], + [76751, 0, "t"], + [76826, 1], + [76825, 1], + [76824, 1], + [76823, 1], + [76823, 0, "t"], + [76824, 0, "e"], + [76825, 0, "x"], + [76826, 0, "t"], + [76827, 0, "s"], + [76828, 0, "c"], + [76829, 0, "{"], + [76830, 0, "I"], + [76831, 0, "n"], + [76832, 0, "s"], + [76833, 0, "e"], + [76834, 0, "r"], + [76835, 0, "t"], + [76836, 0, "}"], + [76837, 0, "_"], + [76838, 0, "{"], + [76839, 0, "1"], + [76840, 0, ","], + [76841, 0, "2"], + [76842, 0, "}"], + [76843, 0, "$"], + [76844, 0, " "], + [76845, 0, "r"], + [76846, 0, "u"], + [76847, 0, "l"], + [76848, 0, "e"], + [76849, 0, "s"], + [76850, 0, " "], + [76851, 0, "t"], + [76852, 0, "h"], + [76853, 0, "u"], + [76854, 0, "s"], + [76855, 0, " "], + [76856, 0, "n"], + [76857, 0, "e"], + [76858, 0, "v"], + [76859, 0, "e"], + [76860, 0, "r"], + [76861, 0, " "], + [76862, 0, "i"], + [76863, 0, "t"], + [76864, 0, "e"], + [76865, 0, "r"], + [76866, 0, "a"], + [76867, 0, "t"], + [76868, 0, "e"], + [76869, 0, " "], + [76870, 0, "p"], + [76871, 0, "a"], + [76872, 0, "s"], + [76873, 0, "t"], + [76874, 0, " "], + [76875, 0, "$"], + [76876, 0, "k"], + [76877, 0, "_"], + [76878, 0, "2"], + [76879, 0, "$"], + [76880, 0, ","], + [76881, 0, " "], + [76882, 0, "a"], + [76883, 0, "n"], + [76884, 0, "d"], + [76885, 0, " "], + [76886, 0, "t"], + [76887, 0, "h"], + [76888, 0, "u"], + [76889, 0, "s"], + [76890, 0, " "], + [76891, 0, "a"], + [76892, 0, "l"], + [76893, 0, "w"], + [76894, 0, "a"], + [76895, 0, "y"], + [76896, 0, "s"], + [76897, 0, " "], + [76898, 0, "i"], + [76899, 0, "n"], + [76900, 0, "s"], + [76901, 0, "e"], + [76902, 0, "r"], + [76903, 0, "t"], + [76904, 0, " "], + [76905, 0, "$"], + [76906, 0, "k"], + [76907, 0, "_"], + [76908, 0, "\\"], + [76909, 0, "m"], + [76910, 0, "a"], + [76911, 0, "t"], + [76912, 0, "h"], + [76913, 0, "i"], + [76914, 0, "t"], + [76915, 0, "{"], + [76916, 0, "n"], + [76917, 0, "e"], + [76918, 0, "w"], + [76919, 0, "}"], + [76920, 0, "$"], + [76921, 0, " "], + [76922, 0, "a"], + [76923, 0, "t"], + [76924, 0, " "], + [76925, 0, "a"], + [76926, 0, " "], + [76927, 0, "p"], + [76927, 1], + [76927, 0, "l"], + [76928, 0, "i"], + [76929, 0, "s"], + [76930, 0, "t"], + [76931, 0, " "], + [76932, 0, "p"], + [76933, 0, "o"], + [76934, 0, "s"], + [76935, 0, "i"], + [76936, 0, "t"], + [76937, 0, "i"], + [76938, 0, "o"], + [76939, 0, "n"], + [76940, 0, " "], + [76941, 0, "t"], + [76942, 0, "h"], + [76943, 0, "a"], + [76944, 0, "t"], + [76945, 0, " "], + [76946, 0, "p"], + [76947, 0, "r"], + [76948, 0, "e"], + [76949, 0, "c"], + [76950, 0, "e"], + [76951, 0, "d"], + [76952, 0, "e"], + [76953, 0, "s"], + [76954, 0, " "], + [76955, 0, "$"], + [76956, 0, "k"], + [76957, 0, "_"], + [76958, 0, "2"], + [76959, 0, "$"], + [76960, 0, "."], + [76973, 0, "\n"], + [76974, 0, "\n"], + [76975, 0, "\\"], + [76976, 0, "b"], + [76977, 0, "e"], + [76978, 0, "g"], + [76979, 0, "i"], + [76980, 0, "n"], + [76981, 0, "{"], + [76982, 0, "l"], + [76983, 0, "e"], + [76984, 0, "m"], + [76985, 0, "m"], + [76986, 0, "a"], + [76987, 0, "}"], + [76988, 0, "\\"], + [76989, 0, "l"], + [76990, 0, "a"], + [76991, 0, "b"], + [76992, 0, "e"], + [76993, 0, "l"], + [76994, 0, "{"], + [76995, 0, "l"], + [76996, 0, "e"], + [76997, 0, "m"], + [76998, 0, ":"], + [76999, 0, "i"], + [77000, 0, "n"], + [77001, 0, "s"], + [77002, 0, "e"], + [77003, 0, "r"], + [77004, 0, "t"], + [77005, 0, "-"], + [77006, 0, "c"], + [77007, 0, "o"], + [77008, 0, "m"], + [77009, 0, "m"], + [77010, 0, "u"], + [77011, 0, "t"], + [77012, 0, "e"], + [77013, 0, "}"], + [77014, 0, "\n"], + [77015, 0, "\\"], + [77016, 0, "e"], + [77017, 0, "n"], + [77018, 0, "d"], + [77019, 0, "{"], + [77020, 0, "l"], + [77021, 0, "e"], + [77022, 0, "m"], + [77023, 0, "m"], + [77024, 0, "a"], + [77025, 0, "}"], + [77015, 0, "\n"], + [77015, 0, "C"], + [77016, 0, "o"], + [77017, 0, "n"], + [77018, 0, "c"], + [77019, 0, "u"], + [77020, 0, "r"], + [77021, 0, "r"], + [77022, 0, "e"], + [77023, 0, "n"], + [77024, 0, "t"], + [77025, 0, " "], + [77026, 0, "i"], + [77027, 0, "n"], + [77028, 0, "s"], + [77029, 0, "e"], + [77030, 0, "r"], + [77031, 0, "t"], + [77032, 0, "i"], + [77033, 0, "o"], + [77034, 0, "n"], + [77035, 0, "s"], + [77036, 0, " "], + [77037, 0, "i"], + [77038, 0, "n"], + [77039, 0, "t"], + [77040, 0, "o"], + [77041, 0, " "], + [77042, 0, "t"], + [77043, 0, "h"], + [77044, 0, "e"], + [77045, 0, " "], + [77046, 0, "s"], + [77047, 0, "a"], + [77048, 0, "m"], + [77049, 0, "e"], + [77050, 0, " "], + [77051, 0, "l"], + [77052, 0, "i"], + [77053, 0, "s"], + [77054, 0, "t"], + [77055, 0, " "], + [77056, 0, "a"], + [77057, 0, "r"], + [77058, 0, "e"], + [77059, 0, " "], + [77060, 0, "c"], + [77061, 0, "o"], + [77062, 0, "m"], + [77063, 0, "m"], + [77064, 0, "u"], + [77065, 0, "t"], + [77066, 0, "a"], + [77067, 0, "t"], + [77068, 0, "i"], + [77069, 0, "v"], + [77070, 0, "e"], + [77071, 0, "."], + [77084, 0, "\n"], + [77085, 0, "\n"], + [77086, 0, "\\"], + [77087, 0, "b"], + [77088, 0, "e"], + [77089, 0, "g"], + [77090, 0, "i"], + [77091, 0, "n"], + [77092, 0, "{"], + [77093, 0, "p"], + [77094, 0, "r"], + [77095, 0, "o"], + [77096, 0, "o"], + [77097, 0, "f"], + [77098, 0, "}"], + [77099, 0, "\n"], + [77100, 0, "\\"], + [77101, 0, "e"], + [77102, 0, "n"], + [77103, 0, "d"], + [77104, 0, "{"], + [77105, 0, "p"], + [77106, 0, "r"], + [77107, 0, "o"], + [77108, 0, "o"], + [77109, 0, "f"], + [77110, 0, "}"], + [77099, 0, "\n"], + [77100, 0, "L"], + [77101, 0, "e"], + [77102, 0, "t"], + [77103, 0, " "], + [77104, 0, "$"], + [77105, 0, "\\"], + [77106, 0, "m"], + [77107, 0, "a"], + [77108, 0, "t"], + [77109, 0, "h"], + [77110, 0, "i"], + [77111, 0, "t"], + [77112, 0, "{"], + [77113, 0, "o"], + [77114, 0, "p"], + [77115, 0, "}"], + [77116, 0, "_"], + [77117, 0, "1"], + [77118, 0, "$"], + [77119, 0, " "], + [77120, 0, "a"], + [77121, 0, "n"], + [77122, 0, "d"], + [77123, 0, " "], + [77124, 0, "$"], + [77125, 0, "\\"], + [77126, 0, "m"], + [77127, 0, "a"], + [77128, 0, "t"], + [77129, 0, "h"], + [77130, 0, "i"], + [77131, 0, "t"], + [77132, 0, "{"], + [77133, 0, "o"], + [77134, 0, "p"], + [77135, 0, "}"], + [77136, 0, "_"], + [77137, 0, "2"], + [77138, 0, "$"], + [77139, 0, " "], + [77140, 0, "b"], + [77141, 0, "e"], + [77142, 0, " "], + [77143, 0, "t"], + [77144, 0, "w"], + [77145, 0, "o"], + [77146, 0, " "], + [77147, 0, "c"], + [77148, 0, "o"], + [77149, 0, "m"], + [77150, 0, "m"], + [77151, 0, "u"], + [77152, 0, "t"], + [77153, 0, "a"], + [77154, 0, "t"], + [77155, 0, "i"], + [77156, 0, "v"], + [77157, 0, "e"], + [77158, 0, " "], + [77159, 0, "i"], + [77160, 0, "n"], + [77161, 0, "s"], + [77162, 0, "e"], + [77163, 0, "r"], + [77164, 0, "t"], + [77165, 0, "i"], + [77166, 0, "o"], + [77167, 0, "n"], + [77168, 0, " "], + [77169, 0, "o"], + [77170, 0, "p"], + [77171, 0, "e"], + [77172, 0, "r"], + [77173, 0, "a"], + [77174, 0, "t"], + [77175, 0, "i"], + [77176, 0, "o"], + [77177, 0, "n"], + [77178, 0, "s"], + [77157, 1], + [77156, 1], + [77155, 1], + [77154, 1], + [77153, 1], + [77152, 1], + [77151, 1], + [77150, 1], + [77149, 1], + [77149, 0, "n"], + [77150, 0, "c"], + [77151, 0, "u"], + [77152, 0, "r"], + [77153, 0, "r"], + [77154, 0, "e"], + [77155, 0, "n"], + [77156, 0, "t"], + [77178, 0, ","], + [77179, 0, " "], + [77180, 0, "i"], + [77181, 0, "."], + [77182, 0, "e"], + [77183, 0, "."], + [77184, 0, " "], + [77185, 0, "$"], + [77186, 0, "\\"], + [77187, 0, "m"], + [77188, 0, "a"], + [77189, 0, "t"], + [77190, 0, "h"], + [77191, 0, "i"], + [77192, 0, "t"], + [77193, 0, "{"], + [77194, 0, "o"], + [77195, 0, "p"], + [77196, 0, "_"], + [77196, 1], + [77196, 0, "}"], + [77197, 0, "_"], + [77198, 0, "1"], + [77199, 0, "."], + [77200, 0, "\\"], + [77201, 0, "m"], + [77202, 0, "a"], + [77203, 0, "t"], + [77204, 0, "h"], + [77205, 0, "i"], + [77206, 0, "t"], + [77207, 0, "{"], + [77208, 0, "d"], + [77209, 0, "e"], + [77210, 0, "p"], + [77211, 0, "s"], + [77212, 0, "}"], + [77213, 0, " "], + [77214, 0, "\\"], + [76973, 0, "\n"], + [76974, 0, "\n"], + [76975, 0, "\\"], + [76976, 0, "b"], + [76977, 0, "e"], + [76978, 0, "g"], + [76979, 0, "i"], + [76980, 0, "n"], + [76981, 0, "{"], + [76982, 0, "d"], + [76983, 0, "e"], + [76984, 0, "f"], + [76985, 0, "i"], + [76986, 0, "n"], + [76987, 0, "i"], + [76988, 0, "t"], + [76989, 0, "i"], + [76990, 0, "o"], + [76991, 0, "n"], + [76992, 0, "}"], + [76993, 0, "\\"], + [76994, 0, "l"], + [76995, 0, "a"], + [76996, 0, "b"], + [76997, 0, "e"], + [76998, 0, "l"], + [76999, 0, "{"], + [77000, 0, "d"], + [77001, 0, "e"], + [77002, 0, "f"], + [77003, 0, ":"], + [77004, 0, "c"], + [77005, 0, "o"], + [77006, 0, "n"], + [77007, 0, "c"], + [77008, 0, "u"], + [77009, 0, "r"], + [77010, 0, "r"], + [77011, 0, "e"], + [77012, 0, "n"], + [77013, 0, "t"], + [77014, 0, "}"], + [77015, 0, "\n"], + [77016, 0, "\\"], + [77017, 0, "e"], + [77018, 0, "n"], + [77019, 0, "d"], + [77020, 0, "{"], + [77021, 0, "d"], + [77022, 0, "e"], + [77023, 0, "f"], + [77024, 0, "i"], + [77025, 0, "n"], + [77026, 0, "i"], + [77027, 0, "t"], + [77028, 0, "i"], + [77029, 0, "o"], + [77030, 0, "n"], + [77031, 0, "}"], + [77015, 0, "\n"], + [77016, 0, "T"], + [77017, 0, "w"], + [77018, 0, "o"], + [77019, 0, " "], + [77020, 0, "o"], + [77021, 0, "p"], + [77022, 0, "e"], + [77023, 0, "r"], + [77024, 0, "a"], + [77025, 0, "t"], + [77026, 0, "i"], + [77027, 0, "o"], + [77028, 0, "n"], + [77029, 0, "s"], + [77030, 0, " "], + [77031, 0, "$"], + [77032, 0, "\\"], + [77033, 0, "m"], + [77034, 0, "a"], + [77035, 0, "t"], + [77036, 0, "h"], + [77037, 0, "i"], + [77038, 0, "t"], + [77039, 0, "{"], + [77040, 0, "o"], + [77041, 0, "p"], + [77042, 0, "}"], + [77043, 0, "_"], + [77044, 0, "1"], + [77045, 0, "$"], + [77046, 0, " "], + [77047, 0, "a"], + [77048, 0, "n"], + [77049, 0, "d"], + [77050, 0, " "], + [77051, 0, "$"], + [77052, 0, "\\"], + [77053, 0, "m"], + [77054, 0, "a"], + [77055, 0, "t"], + [77056, 0, "h"], + [77057, 0, "i"], + [77058, 0, "t"], + [77059, 0, "{"], + [77077, 1], + [77076, 1], + [77075, 1], + [77074, 1], + [77073, 1], + [77072, 1], + [77071, 1], + [77070, 1], + [77069, 1], + [77068, 1], + [77067, 1], + [77066, 1], + [77065, 1], + [77064, 1], + [77063, 1], + [77062, 1], + [77061, 1], + [77060, 1], + [77059, 1], + [77058, 1], + [77057, 1], + [77056, 1], + [77055, 1], + [77054, 1], + [77053, 1], + [77052, 1], + [77051, 1], + [77050, 1], + [77049, 1], + [77048, 1], + [77047, 1], + [77046, 1], + [77045, 1], + [77044, 1], + [77043, 1], + [77042, 1], + [77041, 1], + [77040, 1], + [77039, 1], + [77038, 1], + [77037, 1], + [77036, 1], + [77035, 1], + [77034, 1], + [77033, 1], + [77032, 1], + [77031, 1], + [77030, 1], + [77029, 1], + [77028, 1], + [77027, 1], + [77026, 1], + [77025, 1], + [77024, 1], + [77023, 1], + [77022, 1], + [77021, 1], + [77020, 1], + [77019, 1], + [77018, 1], + [77017, 1], + [77016, 1], + [77015, 1], + [77014, 1], + [77013, 1], + [77012, 1], + [77011, 1], + [77010, 1], + [77009, 1], + [77008, 1], + [77007, 1], + [77006, 1], + [77005, 1], + [77004, 1], + [77003, 1], + [77002, 1], + [77001, 1], + [77000, 1], + [76999, 1], + [76998, 1], + [76997, 1], + [76996, 1], + [76995, 1], + [76994, 1], + [76993, 1], + [76992, 1], + [76991, 1], + [76990, 1], + [76989, 1], + [76988, 1], + [76987, 1], + [76986, 1], + [76985, 1], + [76984, 1], + [76983, 1], + [76982, 1], + [76981, 1], + [76980, 1], + [76979, 1], + [76978, 1], + [76977, 1], + [76976, 1], + [76975, 1], + [76974, 1], + [77214, 1], + [77213, 1], + [77212, 1], + [77211, 1], + [77210, 1], + [77209, 1], + [77208, 1], + [77207, 1], + [77206, 1], + [77205, 1], + [77204, 1], + [77203, 1], + [77202, 1], + [77201, 1], + [77200, 1], + [77199, 1], + [77198, 1], + [77197, 1], + [77196, 1], + [77195, 1], + [77194, 1], + [77193, 1], + [77192, 1], + [77191, 1], + [77190, 1], + [77189, 1], + [77188, 1], + [77187, 1], + [77186, 1], + [77185, 1], + [77184, 1], + [77183, 1], + [77182, 1], + [77181, 1], + [77180, 1], + [77179, 1], + [77178, 1], + [77178, 0, "."], + [77179, 0, " "], + [76973, 0, "\n"], + [76974, 0, "\n"], + [76975, 0, "\\"], + [76976, 0, "b"], + [76977, 0, "e"], + [76978, 0, "g"], + [76979, 0, "i"], + [76980, 0, "n"], + [76981, 0, "{"], + [76982, 0, "d"], + [76983, 0, "e"], + [76984, 0, "f"], + [76985, 0, "i"], + [76986, 0, "n"], + [76987, 0, "i"], + [76988, 0, "t"], + [76989, 0, "i"], + [76990, 0, "o"], + [76991, 0, "n"], + [76992, 0, "}"], + [76993, 0, "\\"], + [76994, 0, "l"], + [76995, 0, "a"], + [76996, 0, "b"], + [76997, 0, "e"], + [76998, 0, "l"], + [76999, 0, "{"], + [77000, 0, "d"], + [77001, 0, "e"], + [77002, 0, "f"], + [77003, 0, ":"], + [77004, 0, "c"], + [77005, 0, "o"], + [77006, 0, "m"], + [77007, 0, "m"], + [77008, 0, "a"], + [77008, 1], + [77008, 0, "o"], + [77009, 0, "n"], + [77010, 0, "-"], + [77011, 0, "a"], + [77012, 0, "n"], + [77013, 0, "c"], + [77014, 0, "e"], + [77015, 0, "s"], + [77016, 0, "t"], + [77017, 0, "o"], + [77018, 0, "r"], + [77019, 0, "}"], + [77020, 0, "\n"], + [77021, 0, "\\"], + [77022, 0, "e"], + [77023, 0, "n"], + [77024, 0, "d"], + [77025, 0, "{"], + [77026, 0, "d"], + [77027, 0, "e"], + [77028, 0, "f"], + [77029, 0, "i"], + [77030, 0, "n"], + [77031, 0, "i"], + [77032, 0, "t"], + [77033, 0, "i"], + [77034, 0, "o"], + [77035, 0, "n"], + [77036, 0, "}"], + [77020, 0, "\n"], + [77021, 0, "F"], + [77022, 0, "o"], + [77023, 0, "r"], + [77024, 0, " "], + [77025, 0, "t"], + [77026, 0, "w"], + [77027, 0, "o"], + [77028, 0, " "], + [77029, 0, "c"], + [77030, 0, "o"], + [77031, 0, "n"], + [77032, 0, "c"], + [77033, 0, "u"], + [77034, 0, "r"], + [77035, 0, "r"], + [77036, 0, "e"], + [77037, 0, "n"], + [77038, 0, "t"], + [77039, 0, " "], + [77040, 0, "o"], + [77041, 0, "p"], + [77042, 0, "e"], + [77043, 0, "r"], + [77044, 0, "a"], + [77045, 0, "t"], + [77046, 0, "i"], + [77047, 0, "o"], + [77048, 0, "n"], + [77049, 0, "s"], + [77050, 0, " "], + [77051, 0, "$"], + [77052, 0, "\\"], + [77053, 0, "m"], + [77054, 0, "a"], + [77055, 0, "t"], + [77056, 0, "h"], + [77057, 0, "i"], + [77058, 0, "t"], + [77059, 0, "{"], + [77060, 0, "o"], + [77061, 0, "p"], + [77062, 0, "}"], + [77063, 0, "_"], + [77064, 0, "1"], + [77065, 0, "$"], + [77066, 0, " "], + [77067, 0, "a"], + [77068, 0, "n"], + [77069, 0, "d"], + [77070, 0, " "], + [77071, 0, "$"], + [77072, 0, "\\"], + [77073, 0, "m"], + [77074, 0, "a"], + [77075, 0, "t"], + [77076, 0, "h"], + [77077, 0, "i"], + [77078, 0, "t"], + [77079, 0, "{"], + [77080, 0, "o"], + [77081, 0, "p"], + [77082, 0, "}"], + [77083, 0, "_"], + [77084, 0, "2"], + [77085, 0, "$"], + [77086, 0, ","], + [77087, 0, " "], + [77088, 0, "t"], + [77089, 0, "h"], + [77090, 0, "e"], + [77091, 0, " "], + [77092, 0, "\\"], + [77093, 0, "e"], + [77094, 0, "m"], + [77095, 0, "p"], + [77096, 0, "h"], + [77097, 0, "{"], + [77098, 0, "c"], + [77099, 0, "o"], + [77100, 0, "m"], + [77101, 0, "m"], + [77102, 0, "o"], + [77103, 0, "n"], + [77104, 0, " "], + [77105, 0, "a"], + [77106, 0, "n"], + [77107, 0, "c"], + [77108, 0, "e"], + [77109, 0, "s"], + [77110, 0, "t"], + [77111, 0, "o"], + [77112, 0, "r"], + [77113, 0, "}"], + [77114, 0, " "], + [77115, 0, "i"], + [77116, 0, "s"], + [77117, 0, " "], + [77118, 0, "t"], + [77119, 0, "h"], + [77120, 0, "e"], + [77121, 0, " "], + [77122, 0, "d"], + [77123, 0, "o"], + [77124, 0, "c"], + [77125, 0, "u"], + [77126, 0, "m"], + [77127, 0, "e"], + [77128, 0, "n"], + [77129, 0, "t"], + [77130, 0, " "], + [77131, 0, "s"], + [77132, 0, "t"], + [77133, 0, "a"], + [77134, 0, "t"], + [77135, 0, "e"], + [77136, 0, " "], + [77137, 0, "r"], + [77138, 0, "e"], + [77139, 0, "s"], + [77140, 0, "u"], + [77141, 0, "l"], + [77142, 0, "t"], + [77143, 0, "i"], + [77144, 0, "n"], + [77145, 0, "g"], + [77146, 0, " "], + [77147, 0, "f"], + [77148, 0, "r"], + [77149, 0, "o"], + [77150, 0, "m"], + [77151, 0, " "], + [77152, 0, "a"], + [77153, 0, "p"], + [77154, 0, "p"], + [77155, 0, "l"], + [77156, 0, "y"], + [77157, 0, "i"], + [77158, 0, "n"], + [77159, 0, "g"], + [77160, 0, " "], + [77161, 0, "a"], + [77162, 0, "l"], + [77163, 0, "l"], + [77164, 0, " "], + [77165, 0, "o"], + [77166, 0, "p"], + [77167, 0, "e"], + [77168, 0, "r"], + [77169, 0, "a"], + [77170, 0, "t"], + [77171, 0, "i"], + [77172, 0, "o"], + [77173, 0, "n"], + [77174, 0, "s"], + [77175, 0, " "], + [77176, 0, "i"], + [77177, 0, "n"], + [77178, 0, " "], + [77179, 0, "$"], + [77180, 0, "\\"], + [77181, 0, "m"], + [77182, 0, "a"], + [77183, 0, "t"], + [77184, 0, "h"], + [77185, 0, "i"], + [77186, 0, "t"], + [77187, 0, "{"], + [77188, 0, "o"], + [77189, 0, "p"], + [77190, 0, "}"], + [77191, 0, "_"], + [77192, 0, "1"], + [77193, 0, "."], + [77194, 0, "\\"], + [77195, 0, "m"], + [77196, 0, "a"], + [77197, 0, "t"], + [77198, 0, "h"], + [77199, 0, "i"], + [77200, 0, "t"], + [77201, 0, "{"], + [77202, 0, "d"], + [77203, 0, "e"], + [77204, 0, "p"], + [77205, 0, "s"], + [77206, 0, "}"], + [77207, 0, " "], + [77208, 0, "\\"], + [77209, 0, "c"], + [77210, 0, "u"], + [77211, 0, "p"], + [77212, 0, " "], + [77213, 0, "\\"], + [77214, 0, "m"], + [77215, 0, "a"], + [77216, 0, "t"], + [77217, 0, "h"], + [77218, 0, "i"], + [77219, 0, "t"], + [77220, 0, "{"], + [77221, 0, "o"], + [77222, 0, "p"], + [77223, 0, "}"], + [77224, 0, "_"], + [77225, 0, "2"], + [77226, 0, "."], + [77227, 0, "\\"], + [77228, 0, "m"], + [77229, 0, "a"], + [77230, 0, "t"], + [77231, 0, "h"], + [77232, 0, "i"], + [77233, 0, "t"], + [77234, 0, "{"], + [77235, 0, "d"], + [77236, 0, "e"], + [77237, 0, "p"], + [77238, 0, "s"], + [77239, 0, "}"], + [77240, 0, "$"], + [77241, 0, ","], + [77242, 0, " "], + [77243, 0, "i"], + [77244, 0, "."], + [77245, 0, "e"], + [77246, 0, "."], + [77247, 0, " "], + [77248, 0, "t"], + [77249, 0, "h"], + [77250, 0, "e"], + [77251, 0, " "], + [77252, 0, "m"], + [77253, 0, "o"], + [77254, 0, "s"], + [77255, 0, "t"], + [77256, 0, " "], + [77257, 0, "r"], + [77258, 0, "e"], + [77259, 0, "c"], + [77260, 0, "e"], + [77261, 0, "n"], + [77262, 0, "t"], + [77263, 0, " "], + [77264, 0, "d"], + [77265, 0, "o"], + [77266, 0, "c"], + [77267, 0, "u"], + [77268, 0, "m"], + [77269, 0, "e"], + [77270, 0, "n"], + [77271, 0, "t"], + [77272, 0, " "], + [77273, 0, "s"], + [77274, 0, "t"], + [77275, 0, "a"], + [77276, 0, "t"], + [77277, 0, "e"], + [77278, 0, " "], + [77279, 0, "t"], + [77280, 0, "h"], + [77281, 0, "a"], + [77282, 0, "t"], + [77283, 0, " "], + [77284, 0, "c"], + [77285, 0, "a"], + [77286, 0, "u"], + [77287, 0, "s"], + [77288, 0, "a"], + [77289, 0, "l"], + [77290, 0, "l"], + [77291, 0, "y"], + [77292, 0, " "], + [77293, 0, "p"], + [77294, 0, "r"], + [77295, 0, "e"], + [77296, 0, "c"], + [77297, 0, "e"], + [77298, 0, "d"], + [77299, 0, "e"], + [77300, 0, "s"], + [77301, 0, " "], + [77302, 0, "b"], + [77303, 0, "o"], + [77304, 0, "t"], + [77305, 0, "h"], + [77306, 0, " "], + [77307, 0, "o"], + [77308, 0, "p"], + [77309, 0, "e"], + [77310, 0, "r"], + [77311, 0, "a"], + [77312, 0, "t"], + [77313, 0, "i"], + [77314, 0, "o"], + [77315, 0, "n"], + [77316, 0, "s"], + [77317, 0, ","], + [77318, 0, " "], + [77319, 0, "a"], + [77320, 0, "f"], + [77321, 0, "t"], + [77322, 0, "e"], + [77323, 0, "r"], + [77324, 0, " "], + [77325, 0, "w"], + [77326, 0, "h"], + [77327, 0, "i"], + [77328, 0, "c"], + [77329, 0, "h"], + [77330, 0, " "], + [77331, 0, "t"], + [77332, 0, "h"], + [77333, 0, "e"], + [77334, 0, " "], + [77335, 0, "d"], + [77336, 0, "o"], + [77337, 0, "c"], + [77338, 0, "u"], + [77339, 0, "m"], + [77340, 0, "e"], + [77341, 0, "n"], + [77342, 0, "t"], + [77343, 0, " "], + [77344, 0, "s"], + [77345, 0, "t"], + [77346, 0, "a"], + [77347, 0, "t"], + [77348, 0, "e"], + [77349, 0, "s"], + [77350, 0, " "], + [77351, 0, "d"], + [77352, 0, "i"], + [77353, 0, "v"], + [77354, 0, "e"], + [77355, 0, "r"], + [77356, 0, "g"], + [77357, 0, "e"], + [77358, 0, "d"], + [77359, 0, "."], + [76993, 0, "["], + [76994, 0, "c"], + [76995, 0, "o"], + [76996, 0, "m"], + [76997, 0, "m"], + [76998, 0, "o"], + [76999, 0, "n"], + [77000, 0, " "], + [77001, 0, "a"], + [77002, 0, "n"], + [77003, 0, "c"], + [77004, 0, "e"], + [77005, 0, "s"], + [77006, 0, "t"], + [77007, 0, "]"], + [77008, 0, "r"], + [77008, 1], + [77007, 1], + [77007, 0, "o"], + [77008, 0, "r"], + [77009, 0, "]"], + [73527, 0, "["], + [73528, 0, "l"], + [73529, 0, "i"], + [73530, 0, "s"], + [73531, 0, "t"], + [73532, 0, " "], + [73533, 0, "e"], + [73534, 0, "l"], + [73535, 0, "e"], + [73536, 0, "m"], + [73537, 0, "e"], + [73538, 0, "n"], + [73539, 0, "t"], + [73540, 0, " "], + [73541, 0, "p"], + [73542, 0, "r"], + [73543, 0, "e"], + [73544, 0, "c"], + [73545, 0, "e"], + [73546, 0, "d"], + [73547, 0, "e"], + [73548, 0, "n"], + [73549, 0, "c"], + [73550, 0, "e"], + [73551, 0, "]"], + [69726, 0, "["], + [69727, 0, "d"], + [69728, 0, "o"], + [69729, 0, "c"], + [69730, 0, "u"], + [69731, 0, "m"], + [69732, 0, "e"], + [69733, 0, "n"], + [69734, 0, "t"], + [69735, 0, " "], + [69736, 0, "s"], + [69737, 0, "t"], + [69738, 0, "a"], + [69739, 0, "t"], + [69740, 0, "e"], + [69741, 0, "]"], + [68964, 0, "["], + [68965, 0, "h"], + [68966, 0, "i"], + [68967, 0, "s"], + [68968, 0, "t"], + [68969, 0, "o"], + [68970, 0, "r"], + [68971, 0, "y"], + [68972, 0, "]"], + [67907, 0, "["], + [67908, 0, "v"], + [67909, 0, "a"], + [67910, 0, "l"], + [67911, 0, "i"], + [67912, 0, "d"], + [67913, 0, " "], + [67914, 0, "e"], + [67915, 0, "x"], + [67916, 0, "e"], + [67917, 0, "c"], + [67918, 0, "u"], + [67919, 0, "t"], + [67920, 0, "i"], + [67921, 0, "o"], + [67922, 0, "n"], + [67923, 0, "]"], + [77668, 0, "L"], + [77669, 0, "e"], + [77670, 0, "t"], + [77671, 0, " "], + [77672, 0, "$"], + [77673, 0, "k"], + [77674, 0, "_"], + [77675, 0, "1"], + [77676, 0, "$"], + [77677, 0, " "], + [77678, 0, "b"], + [77679, 0, "e"], + [77680, 0, " "], + [77681, 0, "t"], + [77682, 0, "h"], + [77683, 0, "e"], + [77684, 0, " "], + [77685, 0, "l"], + [77686, 0, "i"], + [77687, 0, "s"], + [77688, 0, "t"], + [77689, 0, " "], + [77690, 0, "e"], + [77691, 0, "l"], + [77692, 0, "e"], + [77693, 0, "m"], + [77694, 0, "e"], + [77695, 0, "n"], + [77696, 0, "t"], + [77697, 0, " "], + [77698, 0, "t"], + [77699, 0, "h"], + [77700, 0, "a"], + [77701, 0, "t"], + [77702, 0, " "], + [77703, 0, "m"], + [77704, 0, "o"], + [77705, 0, "s"], + [77706, 0, "t"], + [77707, 0, " "], + [77708, 0, "c"], + [77709, 0, "l"], + [77710, 0, "o"], + [77711, 0, "s"], + [77712, 0, "e"], + [77713, 0, "l"], + [77714, 0, "y"], + [77715, 0, " "], + [77716, 0, "p"], + [77717, 0, "r"], + [77718, 0, "e"], + [77719, 0, "c"], + [77720, 0, "e"], + [77721, 0, "d"], + [77722, 0, "e"], + [77723, 0, "s"], + [77666, 0, " "], + [77667, 0, "w"], + [77668, 0, "i"], + [77669, 0, "t"], + [77670, 0, "h"], + [77671, 0, " "], + [77672, 0, "a"], + [77673, 0, " "], + [77674, 0, "c"], + [77675, 0, "o"], + [77676, 0, "m"], + [77677, 0, "m"], + [77678, 0, "o"], + [77679, 0, "n"], + [77680, 0, " "], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 1], + [77206, 0, "r"], + [77207, 0, "e"], + [77208, 0, "p"], + [77209, 0, "l"], + [77210, 0, "i"], + [77211, 0, "c"], + [77212, 0, "a"], + [77354, 1], + [77353, 1], + [77352, 1], + [77351, 1], + [77350, 1], + [77349, 1], + [77348, 1], + [77347, 1], + [77347, 0, "r"], + [77348, 0, "e"], + [77349, 0, "p"], + [77350, 0, "l"], + [77351, 0, "i"], + [77352, 0, "c"], + [77353, 0, "a"], + [77431, 1], + [77430, 1], + [77429, 1], + [77428, 1], + [77427, 1], + [77426, 1], + [77425, 1], + [77424, 1], + [77423, 1], + [77422, 1], + [77421, 1], + [77420, 1], + [77419, 1], + [77418, 1], + [77417, 1], + [77416, 1], + [77416, 0, "y"], + [77324, 1], + [77324, 0, "."], + [77325, 0, "\n"], + [77326, 0, "\\"], + [77327, 0, "e"], + [77328, 0, "n"], + [77329, 0, "d"], + [77330, 0, "{"], + [77331, 0, "d"], + [77332, 0, "e"], + [77333, 0, "f"], + [77334, 0, "i"], + [77335, 0, "n"], + [77336, 0, "i"], + [77337, 0, "t"], + [77338, 0, "i"], + [77339, 0, "o"], + [77340, 0, "n"], + [77341, 0, "}"], + [77342, 0, "\n"], + [77343, 0, "\n"], + [77344, 1], + [77344, 1], + [77344, 1], + [77344, 1], + [77344, 1], + [77344, 0, "I"], + [77345, 0, "n"], + [77346, 0, " "], + [77347, 0, "o"], + [77348, 0, "t"], + [77349, 0, "h"], + [77350, 0, "e"], + [77351, 0, "r"], + [77352, 0, " "], + [77353, 0, "w"], + [77354, 0, "o"], + [77355, 0, "r"], + [77356, 0, "d"], + [77357, 0, "s"], + [77358, 0, ","], + [77359, 0, " "], + [77360, 0, "t"], + [77361, 0, "h"], + [77362, 0, "e"], + [77363, 0, " "], + [77364, 0, "c"], + [77365, 0, "o"], + [77366, 0, "m"], + [77367, 0, "m"], + [77368, 0, "o"], + [77369, 0, "n"], + [77370, 0, " "], + [77371, 0, "a"], + [77372, 0, "n"], + [77373, 0, "c"], + [77374, 0, "e"], + [77375, 0, "s"], + [77376, 0, "t"], + [77377, 0, "o"], + [77378, 0, "r"], + [77379, 0, " "], + [77380, 0, "i"], + [77381, 0, "s"], + [77495, 1], + [77494, 1], + [77493, 1], + [77492, 1], + [77491, 1], + [77490, 1], + [77489, 1], + [77488, 1], + [77487, 1], + [77486, 1], + [77485, 1], + [77484, 1], + [77483, 1], + [77482, 1], + [77481, 1], + [77480, 1], + [77479, 1], + [77468, 1], + [77468, 0, " "], + [77469, 0, "r"], + [77470, 0, "e"], + [77471, 0, "p"], + [77472, 0, "l"], + [77473, 0, "i"], + [77474, 0, "c"], + [77475, 0, "a"], + [77476, 0, "s"], + [77487, 0, " "], + [77488, 0, "T"], + [77489, 0, "h"], + [77490, 0, "e"], + [77491, 0, "r"], + [77492, 0, "e"], + [77493, 0, " "], + [77494, 0, "m"], + [77495, 0, "a"], + [77496, 0, "n"], + [77497, 0, "y"], + [77498, 0, " "], + [77499, 0, "b"], + [77500, 0, "e"], + [77501, 0, " "], + [77502, 0, "a"], + [77503, 0, "n"], + [77504, 0, "y"], + [77505, 0, " "], + [77506, 0, "n"], + [77507, 0, "u"], + [77508, 0, "m"], + [77509, 0, "b"], + [77510, 0, "e"], + [77511, 0, "r"], + [77512, 0, " "], + [77513, 0, "o"], + [77514, 0, "f"], + [77515, 0, " "], + [77516, 0, "o"], + [77517, 0, "p"], + [77518, 0, "e"], + [77519, 0, "r"], + [77520, 0, "a"], + [77521, 0, "t"], + [77522, 0, "i"], + [77523, 0, "o"], + [77524, 0, "n"], + [77525, 0, "s"], + [77526, 0, " "], + [77527, 0, "b"], + [77528, 0, "e"], + [77529, 0, "t"], + [77530, 0, "w"], + [77531, 0, "e"], + [77532, 0, "e"], + [77533, 0, "n"], + [77534, 0, " "], + [77535, 0, "t"], + [77536, 0, "h"], + [77537, 0, "e"], + [77538, 0, " "], + [77539, 0, "c"], + [77540, 0, "o"], + [77541, 0, "m"], + [77542, 0, "m"], + [77543, 0, "o"], + [77544, 0, "n"], + [77545, 0, " "], + [77546, 0, "a"], + [77547, 0, "n"], + [77548, 0, "c"], + [77549, 0, "e"], + [77550, 0, "s"], + [77551, 0, "t"], + [77552, 0, "o"], + [77553, 0, "r"], + [77554, 0, " "], + [77555, 0, "a"], + [77556, 0, "n"], + [77557, 0, "d"], + [77558, 0, " "], + [77559, 0, "$"], + [77560, 0, "\\"], + [77561, 0, "m"], + [77562, 0, "a"], + [77563, 0, "t"], + [77564, 0, "h"], + [77565, 0, "i"], + [77566, 0, "t"], + [77567, 0, "{"], + [77568, 0, "o"], + [77569, 0, "p"], + [77570, 0, "}"], + [77571, 0, "_"], + [77572, 0, "{"], + [77573, 0, "1"], + [77574, 0, ","], + [77575, 0, "2"], + [77576, 0, "}"], + [77577, 0, "$"], + [77578, 0, "."], + [77799, 0, "a"], + [77800, 0, "n"], + [77801, 0, "c"], + [77802, 0, "e"], + [77803, 0, "s"], + [77804, 0, "t"], + [77805, 0, "o"], + [77806, 0, "r"], + [77807, 0, " "], + [77808, 0, "#"], + [77809, 0, "$"], + [77809, 1], + [77808, 1], + [77808, 0, "$"], + [77809, 0, "A"], + [77810, 0, "\\"], + [77810, 1], + [77810, 0, "_"], + [77811, 0, "\\"], + [77812, 0, "m"], + [77813, 0, "a"], + [77814, 0, "t"], + [77815, 0, "h"], + [77816, 0, "i"], + [77817, 0, "t"], + [77818, 0, "{"], + [77819, 0, "a"], + [77820, 0, "n"], + [77821, 0, "c"], + [77822, 0, "}"], + [77823, 0, "$"], + [77834, 0, "^"], + [77835, 0, "\\"], + [77836, 0, "m"], + [77837, 0, "a"], + [77838, 0, "t"], + [77839, 0, "h"], + [77840, 0, "i"], + [77841, 0, "t"], + [77842, 0, "{"], + [77843, 0, "b"], + [77843, 1], + [77843, 0, "b"], + [77844, 0, "e"], + [77845, 0, "f"], + [77846, 0, "o"], + [77847, 0, "r"], + [77848, 0, "e"], + [77849, 0, "}"], + [77851, 0, " "], + [77852, 0, "a"], + [77853, 0, "n"], + [77854, 0, "d"], + [77855, 0, " "], + [77856, 0, "$"], + [77857, 0, "k"], + [77858, 0, "_"], + [77859, 0, "2"], + [77860, 0, "^"], + [77861, 0, "&"], + [77861, 1], + [77861, 0, "\\"], + [77862, 0, "m"], + [77863, 0, "a"], + [77864, 0, "t"], + [77865, 0, "h"], + [77866, 0, "i"], + [77867, 0, "t"], + [77868, 0, "{"], + [77869, 0, "b"], + [77870, 0, "e"], + [77871, 0, "f"], + [77872, 0, "o"], + [77873, 0, "r"], + [77874, 0, "e"], + [77875, 0, "}"], + [77876, 0, "$"], + [77897, 0, "s"], + [77898, 0, " "], + [77899, 0, "i"], + [77900, 0, "n"], + [77901, 0, " "], + [77902, 0, "$"], + [77903, 0, "A"], + [77904, 0, "_"], + [77905, 0, "\\"], + [77906, 0, "m"], + [77907, 0, "a"], + [77908, 0, "t"], + [77909, 0, "h"], + [77910, 0, "i"], + [77911, 0, "t"], + [77912, 0, "{"], + [77913, 0, "a"], + [77914, 0, "n"], + [77915, 0, "c"], + [77916, 0, "}"], + [77917, 0, "$"], + [77944, 1], + [77944, 0, " "], + [77945, 0, "t"], + [77946, 0, "h"], + [77947, 0, "e"], + [77948, 0, " "], + [77949, 0, "i"], + [77950, 0, "n"], + [77951, 0, "s"], + [77952, 0, "e"], + [77953, 0, "r"], + [77954, 0, "t"], + [77955, 0, "i"], + [77956, 0, "o"], + [77957, 0, "n"], + [77958, 0, " "], + [77959, 0, "p"], + [77960, 0, "i"], + [77961, 0, "s"], + [77962, 0, "i"], + [77962, 1], + [77961, 1], + [77960, 1], + [77960, 0, "o"], + [77961, 0, "s"], + [77962, 0, "i"], + [77963, 0, "t"], + [77964, 0, "i"], + [77965, 0, "o"], + [77966, 0, "n"], + [77967, 0, " "], + [77968, 0, "o"], + [77969, 0, "f"], + [77970, 0, " "], + [77971, 0, "$"], + [77972, 0, "\\"], + [77973, 0, "m"], + [77974, 0, "a"], + [77975, 0, "t"], + [77976, 0, "h"], + [77977, 0, "i"], + [77978, 0, "t"], + [77979, 0, "{"], + [77980, 0, "o"], + [77981, 0, "p"], + [77982, 0, "}"], + [77983, 0, "_"], + [77984, 0, "1"], + [77985, 0, "$"], + [77986, 0, " "], + [77987, 0, "a"], + [77988, 0, "n"], + [77989, 0, "d"], + [77990, 0, " "], + [77991, 0, "$"], + [77992, 0, "\\"], + [77993, 0, "m"], + [77994, 0, "a"], + [77995, 0, "t"], + [77996, 0, "h"], + [77997, 0, "i"], + [77998, 0, "t"], + [77999, 0, "{"], + [78000, 0, "o"], + [78001, 0, "p"], + [78002, 0, "}"], + [78003, 0, ")"], + [78004, 0, "2"], + [78004, 1], + [78003, 1], + [78003, 0, "_"], + [78004, 0, "2"], + [78005, 0, "$"], + [78006, 0, " "], + [78007, 0, "r"], + [78008, 0, "e"], + [78009, 0, "s"], + [78010, 0, "p"], + [78011, 0, "e"], + [78012, 0, "c"], + [78013, 0, "t"], + [78014, 0, "i"], + [78015, 0, "v"], + [78016, 0, "e"], + [78017, 0, "l"], + [78018, 0, "y"], + [78019, 0, ","], + [78020, 0, " "], + [78021, 0, "a"], + [78022, 0, "n"], + [78023, 0, "d"], + [78024, 0, " "], + [78025, 0, "l"], + [78026, 0, "e"], + [78027, 0, "t"], + [78028, 0, " "], + [78029, 0, "$"], + [78030, 0, "k"], + [78031, 0, "_"], + [78032, 0, "1"], + [78033, 0, "&"], + [78033, 1], + [78033, 0, "^"], + [78034, 0, "\\"], + [78035, 0, "m"], + [78036, 0, "a"], + [78037, 0, "t"], + [78038, 0, "h"], + [78039, 0, "i"], + [78040, 0, "t"], + [78041, 0, "{"], + [78042, 0, "a"], + [78043, 0, "f"], + [78044, 0, "t"], + [78045, 0, "e"], + [78046, 0, "r"], + [78047, 0, "}"], + [78048, 0, "$"], + [78049, 0, " "], + [78050, 0, "a"], + [78051, 0, "n"], + [78052, 0, "d"], + [78053, 0, " "], + [78054, 0, "$"], + [78055, 0, "k"], + [78056, 0, "_"], + [78057, 0, "2"], + [78058, 0, "^"], + [78059, 0, "\\"], + [78060, 0, "m"], + [78061, 0, "a"], + [78062, 0, "t"], + [78063, 0, "h"], + [78064, 0, "i"], + [78065, 0, "t"], + [78066, 0, "{"], + [78067, 0, "a"], + [78068, 0, "f"], + [78069, 0, "t"], + [78070, 0, "e"], + [78071, 0, "r"], + [78072, 0, "}"], + [78073, 0, "$"], + [78074, 0, " "], + [78075, 0, "b"], + [78076, 0, "e"], + [78077, 0, " "], + [78078, 0, "t"], + [78079, 0, "h"], + [78080, 0, "e"], + [78081, 0, " "], + [78082, 0, "l"], + [78083, 0, "i"], + [78084, 0, "s"], + [78085, 0, "t"], + [78086, 0, " "], + [78087, 0, "e"], + [78088, 0, "l"], + [78089, 0, "e"], + [78090, 0, "m"], + [78091, 0, "e"], + [78092, 0, "n"], + [78093, 0, "t"], + [78094, 0, "s"], + [78095, 0, " "], + [78096, 0, "i"], + [78097, 0, "n"], + [78098, 0, " "], + [78099, 0, "$"], + [78100, 0, "A"], + [78101, 0, "_"], + [78102, 0, "\\"], + [78103, 0, "m"], + [78104, 0, "a"], + [78105, 0, "t"], + [78106, 0, "h"], + [78107, 0, "i"], + [78108, 0, "t"], + [78109, 0, "{"], + [78110, 0, "a"], + [78111, 0, "n"], + [78112, 0, "c"], + [78113, 0, "}"], + [78114, 0, "$"], + [78115, 0, " "], + [78116, 0, "m"], + [78117, 0, "o"], + [78118, 0, "s"], + [78119, 0, "t"], + [78120, 0, " "], + [78121, 0, "c"], + [78122, 0, "l"], + [78123, 0, "o"], + [78124, 0, "s"], + [78125, 0, "e"], + [78126, 0, "l"], + [78127, 0, "y"], + [78128, 0, " "], + [78129, 0, "p"], + [78130, 0, "r"], + [78131, 0, "e"], + [78132, 0, "c"], + [78133, 0, "e"], + [78134, 0, "d"], + [78135, 0, "e"], + [78136, 0, "d"], + [78137, 0, " "], + [78138, 0, "b"], + [78139, 0, "y"], + [78140, 0, " "], + [78141, 0, "t"], + [78142, 0, "h"], + [78143, 0, "e"], + [78144, 0, " "], + [78145, 0, "i"], + [78146, 0, "n"], + [78147, 0, "s"], + [78148, 0, "e"], + [78149, 0, "r"], + [78150, 0, "t"], + [78151, 0, "i"], + [78152, 0, "o"], + [78153, 0, "n"], + [78154, 0, " "], + [78155, 0, "p"], + [78156, 0, "o"], + [78157, 0, "s"], + [78158, 0, "i"], + [78159, 0, "t"], + [78160, 0, "i"], + [78161, 0, "o"], + [78162, 0, "n"], + [78163, 0, " "], + [78164, 0, "o"], + [78165, 0, "f"], + [78166, 0, " "], + [78167, 0, "$"], + [78168, 0, "\\"], + [78169, 0, "m"], + [78170, 0, "a"], + [78171, 0, "t"], + [78172, 0, "h"], + [78173, 0, "i"], + [78174, 0, "t"], + [78175, 0, "{"], + [78176, 0, "o"], + [78177, 0, "p"], + [78178, 0, "_"], + [78178, 1], + [78178, 0, "}"], + [78179, 0, "_"], + [78180, 0, "1"], + [78181, 0, "$"], + [78182, 0, " "], + [78183, 0, "a"], + [78184, 0, "n"], + [78185, 0, "d"], + [78186, 0, " "], + [78187, 0, "$"], + [78188, 0, "\\"], + [78189, 0, "m"], + [78190, 0, "a"], + [78191, 0, "t"], + [78192, 0, "h"], + [78193, 0, "i"], + [78194, 0, "t"], + [78195, 0, "{"], + [78196, 0, "o"], + [78197, 0, "p"], + [78198, 0, "}"], + [78199, 0, "_"], + [78200, 0, "2"], + [78201, 0, "$"], + [78202, 0, " "], + [78203, 0, "r"], + [78204, 0, "e"], + [78205, 0, "s"], + [78206, 0, "p"], + [78207, 0, "e"], + [78208, 0, "c"], + [78209, 0, "t"], + [78210, 0, "i"], + [78211, 0, "v"], + [78212, 0, "e"], + [78213, 0, "l"], + [78214, 0, "y"], + [78215, 0, "."], + [78216, 0, "\n"], + [78217, 0, "\n"], + [78218, 0, "B"], + [78219, 0, "y"], + [78220, 0, " "], + [78221, 0, "L"], + [78222, 0, "e"], + [78223, 0, "m"], + [78224, 0, "m"], + [78225, 0, "a"], + [78226, 0, "~"], + [78227, 0, "\\"], + [78228, 0, "r"], + [78229, 0, "e"], + [78230, 0, "f"], + [78231, 0, "{"], + [78232, 0, "l"], + [78233, 0, "e"], + [78234, 0, "m"], + [78235, 0, ":"], + [78236, 0, "i"], + [78237, 0, "n"], + [78238, 0, "s"], + [78239, 0, "e"], + [78240, 0, "r"], + [78241, 0, "t"], + [78242, 0, "-"], + [78243, 0, "b"], + [78244, 0, "e"], + [78245, 0, "t"], + [78246, 0, "w"], + [78247, 0, "e"], + [78248, 0, "e"], + [78249, 0, "n"], + [78250, 0, "}"], + [78251, 0, ","], + [78252, 0, " "], + [78253, 0, "e"], + [78254, 0, "i"], + [78255, 0, "t"], + [78256, 0, "h"], + [78257, 0, "e"], + [78258, 0, "r"], + [78259, 0, " "], + [74964, 0, "$"], + [74965, 0, "k"], + [74966, 0, "1"], + [74966, 1], + [74966, 0, "_"], + [74967, 0, "1"], + [74968, 0, "$"], + [74969, 0, " "], + [74970, 0, "p"], + [74971, 0, "r"], + [74972, 0, "e"], + [74973, 0, "c"], + [74974, 0, "e"], + [74975, 0, "d"], + [74976, 0, "e"], + [74977, 0, "s"], + [74978, 0, " "], + [74979, 0, "$"], + [74980, 0, "k"], + [74981, 0, "_"], + [74982, 0, "\\"], + [74983, 0, "m"], + [74984, 0, "a"], + [74985, 0, "t"], + [74986, 0, "h"], + [74987, 0, "i"], + [74988, 0, "t"], + [74989, 0, "{"], + [74990, 0, "n"], + [74991, 0, "e"], + [74992, 0, "w"], + [74993, 0, "}"], + [74994, 0, " "], + [74995, 0, "i"], + [74996, 0, "n"], + [74997, 0, " "], + [74998, 0, "t"], + [74999, 0, "h"], + [75000, 0, "e"], + [75001, 0, " "], + [75002, 0, "l"], + [75003, 0, "i"], + [75004, 0, "s"], + [75005, 0, "t"], + [75006, 0, " "], + [75007, 0, "a"], + [75008, 0, "n"], + [75009, 0, "d"], + [75010, 0, " "], + [75011, 0, "$"], + [75012, 0, "k"], + [75013, 0, "_"], + [75014, 0, "\\"], + [75015, 0, "m"], + [75016, 0, "a"], + [75017, 0, "t"], + [75018, 0, "h"], + [75019, 0, "i"], + [75020, 0, "t"], + [75021, 0, "{"], + [75022, 0, "n"], + [75023, 0, "e"], + [75024, 0, "w"], + [75025, 0, "}"], + [75026, 0, "$"], + [75027, 0, " "], + [75028, 0, "p"], + [75029, 0, "r"], + [75030, 0, "e"], + [75031, 0, "c"], + [75032, 0, "e"], + [75033, 0, "d"], + [75034, 0, "e"], + [75035, 0, "s"], + [75036, 0, " "], + [75037, 0, "$"], + [75038, 0, "k"], + [75039, 0, "_"], + [75040, 0, "2"], + [75041, 0, "$"], + [75042, 0, " "], + [75043, 0, "i"], + [75044, 0, "n"], + [75045, 0, " "], + [75046, 0, "t"], + [75047, 0, "h"], + [75048, 0, "e"], + [75049, 0, " "], + [75050, 0, "l"], + [75051, 0, "i"], + [75052, 0, "s"], + [75053, 0, "t"], + [75054, 0, " "], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [75055, 1], + [78243, 0, "$"], + [78244, 0, "k"], + [78245, 0, "_"], + [78246, 0, "1"], + [78247, 0, "^"], + [78248, 0, "\\"], + [78249, 0, "m"], + [78250, 0, "a"], + [78251, 0, "t"], + [78252, 0, "h"], + [78253, 0, "i"], + [78254, 0, "t"], + [78255, 0, "{"], + [78256, 0, "b"], + [78257, 0, "e"], + [78258, 0, "f"], + [78259, 0, "o"], + [78260, 0, "r"], + [78261, 0, "e"], + [78262, 0, "}"], + [78263, 0, " "], + [78264, 0, "="], + [78265, 0, " "], + [78266, 0, "k"], + [78267, 0, "_"], + [78268, 0, "2"], + [78269, 0, "^"], + [78270, 0, "\\"], + [78271, 0, "m"], + [78272, 0, "a"], + [78273, 0, "t"], + [78274, 0, "h"], + [78275, 0, "i"], + [78276, 0, "t"], + [78277, 0, "{"], + [78278, 0, "b"], + [78279, 0, "e"], + [78280, 0, "f"], + [78281, 0, "o"], + [78282, 0, "r"], + [78283, 0, "e"], + [78284, 0, "}"], + [78285, 0, " "], + [78286, 0, "\\"], + [78287, 0, "v"], + [78287, 1], + [78287, 0, "w"], + [78288, 0, "e"], + [78289, 0, "d"], + [78290, 0, "g"], + [78291, 0, "e"], + [78292, 0, " "], + [78293, 0, "k"], + [78294, 0, "_"], + [78295, 0, "1"], + [78296, 0, "^"], + [78297, 0, "\\"], + [78298, 0, "m"], + [78299, 0, "a"], + [78300, 0, "t"], + [78301, 0, "h"], + [78302, 0, "i"], + [78303, 0, "t"], + [78304, 0, "{"], + [78305, 0, "a"], + [78306, 0, "f"], + [78307, 0, "t"], + [78308, 0, "e"], + [78309, 0, "r"], + [78310, 0, "}"], + [78311, 0, " "], + [78312, 0, "="], + [78313, 0, " "], + [78314, 0, "k"], + [78315, 0, "_"], + [78316, 0, "2"], + [78317, 0, "^"], + [78318, 0, "\\"], + [78319, 0, "m"], + [78320, 0, "a"], + [78321, 0, "t"], + [78322, 0, "h"], + [78323, 0, "i"], + [78324, 0, "t"], + [78325, 0, "{"], + [78326, 0, "a"], + [78327, 0, "f"], + [78328, 0, "g"], + [78329, 0, "t"], + [78330, 0, "e"], + [78331, 0, "r"], + [78331, 1], + [78330, 1], + [78329, 1], + [78328, 1], + [78328, 0, "t"], + [78329, 0, "e"], + [78330, 0, "r"], + [78331, 0, "}"], + [78332, 0, "$"], + [78333, 0, " "], + [78334, 0, "("], + [78335, 0, "i"], + [78336, 0, "."], + [78337, 0, "e"], + [78338, 0, "."], + [78339, 0, " "], + [78340, 0, "$"], + [78341, 0, "\\"], + [78342, 0, "m"], + [78343, 0, "a"], + [78344, 0, "t"], + [78345, 0, "h"], + [78346, 0, "i"], + [78347, 0, "t"], + [78348, 0, "{"], + [78349, 0, "o"], + [78350, 0, "p"], + [78351, 0, "}"], + [78352, 0, "_"], + [78353, 0, "1"], + [78354, 0, "$"], + [78355, 0, " "], + [78356, 0, "a"], + [78357, 0, "n"], + [78358, 0, "d"], + [78359, 0, " "], + [78360, 0, "$"], + [78361, 0, "\\"], + [78362, 0, "m"], + [78363, 0, "a"], + [78364, 0, "t"], + [78365, 0, "h"], + [78366, 0, "i"], + [78367, 0, "t"], + [78368, 0, "{"], + [78369, 0, "o"], + [78370, 0, "p"], + [78371, 0, "}"], + [78372, 0, ")"], + [78373, 0, "_"], + [78373, 1], + [78372, 1], + [78372, 0, "_"], + [78373, 0, "2"], + [78374, 0, "$"], + [78375, 0, " "], + [78376, 0, "a"], + [78377, 0, "r"], + [78378, 0, "e"], + [78379, 0, " "], + [78380, 0, "i"], + [78381, 0, "n"], + [78382, 0, "s"], + [78383, 0, "e"], + [78384, 0, "r"], + [78385, 0, "t"], + [78386, 0, "i"], + [78387, 0, "n"], + [78388, 0, "g"], + [78389, 0, " "], + [78390, 0, "i"], + [78391, 0, "n"], + [78392, 0, "t"], + [78393, 0, "o"], + [78394, 0, " "], + [78395, 0, "t"], + [78396, 0, "h"], + [78397, 0, "e"], + [78398, 0, " "], + [78399, 0, "s"], + [78400, 0, "a"], + [78401, 0, "m"], + [78402, 0, "e"], + [78403, 0, " "], + [78404, 0, "i"], + [78405, 0, "n"], + [78406, 0, "t"], + [78407, 0, "e"], + [78408, 0, "r"], + [78409, 0, "v"], + [78410, 0, "a"], + [78411, 0, "l"], + [78412, 0, " "], + [78413, 0, "o"], + [78414, 0, "f"], + [78415, 0, " "], + [78416, 0, "l"], + [78417, 0, "i"], + [78418, 0, "s"], + [78419, 0, "t"], + [78420, 0, " "], + [78421, 0, "e"], + [78422, 0, "l"], + [78423, 0, "e"], + [78424, 0, "m"], + [78425, 0, "e"], + [78426, 0, "n"], + [78427, 0, "t"], + [78428, 0, "s"], + [78429, 0, ")"], + [78430, 0, ","], + [78431, 0, " "], + [78432, 0, "o"], + [78433, 0, "r"], + [78434, 0, " "], + [78435, 0, "$"], + [78436, 0, "k"], + [78437, 0, "_"], + [78438, 0, "2"], + [78439, 0, "&"], + [78439, 1], + [78439, 0, "&"], + [78439, 1], + [78439, 0, "^"], + [78440, 0, "\\"], + [78441, 0, "m"], + [78442, 0, "a"], + [78443, 0, "t"], + [78444, 0, "h"], + [78445, 0, "i"], + [78446, 0, "t"], + [78447, 0, "{"], + [78448, 0, "b"], + [78449, 0, "e"], + [78450, 0, "f"], + [78451, 0, "o"], + [78452, 0, "r"], + [78453, 0, "e"], + [78454, 0, "}"], + [78455, 0, " "], + [78456, 0, "\\"], + [78457, 0, "n"], + [78458, 0, "o"], + [78459, 0, "t"], + [78460, 0, "="], + [78461, 0, " "], + [78462, 0, "k"], + [78438, 1], + [78438, 0, "1"], + [78463, 0, "_"], + [78464, 0, "2"], + [78465, 0, "^"], + [78466, 0, "\\"], + [78467, 0, "m"], + [78468, 0, "a"], + [78469, 0, "t"], + [78470, 0, "h"], + [78471, 0, "i"], + [78472, 0, "t"], + [78473, 0, "{"], + [78474, 0, "b"], + [78475, 0, "e"], + [78476, 0, "f"], + [78477, 0, "o"], + [78478, 0, "r"], + [78479, 0, "e"], + [78480, 0, "}"], + [78481, 0, " "], + [78482, 0, "\\"], + [78483, 0, "w"], + [78484, 0, "e"], + [78485, 0, "d"], + [78486, 0, "g"], + [78487, 0, "e"], + [78488, 0, " "], + [78489, 0, "k"], + [78490, 0, "_"], + [78491, 0, "1"], + [78492, 0, "^"], + [78493, 0, "\\"], + [78494, 0, "m"], + [78495, 0, "a"], + [78496, 0, "t"], + [78497, 0, "h"], + [78498, 0, "i"], + [78499, 0, "t"], + [78500, 0, "{"], + [78501, 0, "a"], + [78502, 0, "f"], + [78503, 0, "t"], + [78504, 0, "e"], + [78505, 0, "r"], + [78506, 0, "}"], + [78507, 0, " "], + [78508, 0, "\\"], + [78509, 0, "n"], + [78510, 0, "o"], + [78511, 0, "t"], + [78512, 0, "="], + [78513, 0, " "], + [78514, 0, "k"], + [78515, 0, "_"], + [78516, 0, "2"], + [78517, 0, "^"], + [78518, 0, "\\"], + [78519, 0, "m"], + [78520, 0, "a"], + [78521, 0, "t"], + [78522, 0, "h"], + [78523, 0, "i"], + [78524, 0, "t"], + [78525, 0, "{"], + [78526, 0, "a"], + [78527, 0, "f"], + [78528, 0, "t"], + [78529, 0, "e"], + [78530, 0, "r"], + [78531, 0, "}"], + [78532, 0, "$"], + [78533, 0, " "], + [78534, 0, "("], + [78535, 0, "i"], + [78536, 0, "."], + [78537, 0, "e"], + [78538, 0, "."], + [78539, 0, " "], + [78540, 0, "t"], + [78541, 0, "h"], + [78542, 0, "e"], + [78543, 0, " "], + [78544, 0, "o"], + [78545, 0, "p"], + [78546, 0, "e"], + [78547, 0, "r"], + [78548, 0, "a"], + [78549, 0, "t"], + [78550, 0, "i"], + [78551, 0, "o"], + [78552, 0, "n"], + [78553, 0, "s"], + [78554, 0, " "], + [78555, 0, "a"], + [78556, 0, "r"], + [78557, 0, "e"], + [78558, 0, " "], + [78559, 0, "i"], + [78560, 0, "n"], + [78561, 0, "s"], + [78562, 0, "e"], + [78563, 0, "r"], + [78564, 0, "t"], + [78565, 0, "i"], + [78566, 0, "n"], + [78567, 0, "g"], + [78568, 0, " "], + [78569, 0, "i"], + [78570, 0, "n"], + [78571, 0, "t"], + [78572, 0, "o"], + [78573, 0, " "], + [78574, 0, "d"], + [78575, 0, "i"], + [78576, 0, "s"], + [78577, 0, "j"], + [78578, 0, "o"], + [78579, 0, "i"], + [78580, 0, "n"], + [78581, 0, "t"], + [78582, 0, " "], + [78583, 0, "i"], + [78584, 0, "n"], + [78585, 0, "t"], + [78586, 0, "e"], + [78587, 0, "r"], + [78588, 0, "v"], + [78589, 0, "a"], + [78590, 0, "l"], + [78591, 0, "s"], + [78592, 0, " "], + [78593, 0, "o"], + [78594, 0, "f"], + [78595, 0, " "], + [78596, 0, "l"], + [78597, 0, "i"], + [78598, 0, "s"], + [78599, 0, "t"], + [78600, 0, " "], + [78601, 0, "e"], + [78602, 0, "l"], + [78603, 0, "e"], + [78604, 0, "m"], + [78605, 0, "e"], + [78606, 0, "n"], + [78607, 0, "t"], + [78608, 0, "s"], + [78609, 0, ")"], + [78610, 0, "."], + [78611, 0, " "], + [78612, 0, "I"], + [78613, 0, "n"], + [78614, 0, " "], + [78615, 0, "t"], + [78616, 0, "h"], + [78617, 0, "e"], + [78618, 0, " "], + [78619, 0, "l"], + [78620, 0, "a"], + [78621, 0, "t"], + [78622, 0, "t"], + [78623, 0, "e"], + [78624, 0, "r"], + [78625, 0, " "], + [78626, 0, "c"], + [78627, 0, "a"], + [78628, 0, "s"], + [78629, 0, "e"], + [78630, 0, ","], + [78631, 0, " "], + [78632, 0, "t"], + [78633, 0, "h"], + [78634, 0, "e"], + [78635, 0, " "], + [78636, 0, "t"], + [78637, 0, "w"], + [78638, 0, "o"], + [78639, 0, " "], + [78640, 0, "o"], + [78641, 0, "p"], + [78642, 0, "e"], + [78643, 0, "r"], + [78644, 0, "a"], + [78645, 0, "t"], + [78646, 0, "i"], + [78647, 0, "o"], + [78648, 0, "n"], + [78649, 0, "s"], + [78650, 0, " "], + [78651, 0, "a"], + [78652, 0, "r"], + [78653, 0, "e"], + [78654, 0, " "], + [78655, 0, "t"], + [78656, 0, "r"], + [78657, 0, "i"], + [78658, 0, "v"], + [78659, 0, "i"], + [78660, 0, "a"], + [78661, 0, "l"], + [78662, 0, "l"], + [78663, 0, "y"], + [78664, 0, " "], + [78665, 0, "c"], + [78666, 0, "o"], + [78667, 0, "m"], + [78668, 0, "m"], + [78669, 0, "u"], + [78670, 0, "t"], + [78671, 0, "a"], + [78672, 0, "t"], + [78673, 0, "i"], + [78674, 0, "v"], + [78675, 0, "e"], + [78676, 0, ","], + [78677, 0, " "], + [78678, 0, "a"], + [78679, 0, "s"], + [78680, 0, " "], + [78681, 0, "t"], + [78682, 0, "h"], + [78683, 0, "e"], + [78684, 0, "y"], + [78685, 0, " "], + [78686, 0, "a"], + [78687, 0, "f"], + [78688, 0, "f"], + [78689, 0, "e"], + [78690, 0, "c"], + [78691, 0, "t"], + [78692, 0, " "], + [78693, 0, "d"], + [78694, 0, "i"], + [78695, 0, "f"], + [78696, 0, "f"], + [78697, 0, "e"], + [78698, 0, "r"], + [78699, 0, "e"], + [78700, 0, "n"], + [78701, 0, "t"], + [78702, 0, " "], + [78703, 0, "p"], + [78704, 0, "a"], + [78705, 0, "r"], + [78706, 0, "t"], + [78707, 0, "s"], + [78708, 0, " "], + [78709, 0, "o"], + [78710, 0, "f"], + [78711, 0, " "], + [78712, 0, "t"], + [78713, 0, "h"], + [78714, 0, "e"], + [78715, 0, " "], + [78716, 0, "l"], + [78717, 0, "i"], + [78718, 0, "s"], + [78719, 0, "t"], + [78720, 0, ","], + [78721, 0, " "], + [78722, 0, "a"], + [78723, 0, "n"], + [78724, 0, "d"], + [78725, 0, " "], + [78726, 0, "b"], + [78727, 0, "y"], + [78728, 0, " "], + [78729, 0, "L"], + [78730, 0, "e"], + [78731, 0, "m"], + [78732, 0, "m"], + [78733, 0, "a"], + [78734, 0, "~"], + [78735, 0, "\\"], + [78736, 0, "r"], + [78737, 0, "e"], + [78738, 0, "f"], + [78739, 0, "{"], + [78740, 0, "l"], + [78741, 0, "e"], + [78742, 0, "m"], + [78743, 0, ":"], + [78744, 0, "i"], + [78745, 0, "n"], + [78746, 0, "s"], + [78747, 0, "e"], + [78748, 0, "r"], + [78749, 0, "t"], + [78750, 0, "-"], + [78751, 0, "b"], + [78752, 0, "e"], + [78753, 0, "t"], + [78754, 0, "w"], + [78755, 0, "e"], + [78756, 0, "e"], + [78757, 0, "n"], + [78758, 0, "}"], + [78759, 0, " "], + [78760, 0, "t"], + [78761, 0, "h"], + [78762, 0, "e"], + [78763, 0, "y"], + [78764, 0, " "], + [78765, 0, "d"], + [78766, 0, "o"], + [78767, 0, " "], + [78768, 0, "n"], + [78769, 0, "o"], + [78770, 0, "t"], + [78771, 0, " "], + [78772, 0, "a"], + [78773, 0, "f"], + [78774, 0, "f"], + [78775, 0, "e"], + [78776, 0, "c"], + [78777, 0, "t"], + [78778, 0, " "], + [78779, 0, "p"], + [78780, 0, "a"], + [78781, 0, "r"], + [78782, 0, "t"], + [78783, 0, "s"], + [78784, 0, " "], + [78785, 0, "o"], + [78786, 0, "f"], + [78787, 0, " "], + [78788, 0, "t"], + [78789, 0, "h"], + [78790, 0, "e"], + [78791, 0, " "], + [78792, 0, "l"], + [78793, 0, "i"], + [78794, 0, "s"], + [78795, 0, "t"], + [78796, 0, " "], + [78797, 0, "o"], + [78798, 0, "u"], + [78799, 0, "t"], + [78800, 0, "s"], + [78801, 0, "i"], + [78802, 0, "d"], + [78803, 0, "e"], + [78804, 0, " "], + [78805, 0, "o"], + [78806, 0, "f"], + [78807, 0, " "], + [78808, 0, "t"], + [78809, 0, "h"], + [78810, 0, "e"], + [78811, 0, "i"], + [78812, 0, "r"], + [78813, 0, " "], + [78814, 0, "r"], + [78815, 0, "e"], + [78816, 0, "s"], + [78817, 0, "p"], + [78818, 0, "e"], + [78819, 0, "c"], + [78820, 0, "t"], + [78821, 0, "i"], + [78822, 0, "v"], + [78823, 0, "e"], + [78824, 0, " "], + [78825, 0, "r"], + [78826, 0, "a"], + [78827, 0, "n"], + [78828, 0, "g"], + [78829, 0, "e"], + [78830, 0, "s"], + [78831, 0, "."], + [74994, 0, "$"], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78847, 1], + [78833, 0, "\n"], + [78834, 0, "\n"], + [78835, 0, "F"], + [78836, 0, "o"], + [78837, 0, "r"], + [78838, 0, " "], + [78839, 0, "t"], + [78840, 0, "h"], + [78841, 0, "e"], + [78842, 0, " "], + [78843, 0, "r"], + [78844, 0, "e"], + [78845, 0, "s"], + [78846, 0, "t"], + [78847, 0, " "], + [78848, 0, "o"], + [78849, 0, "f"], + [78850, 0, " "], + [78851, 0, "t"], + [78852, 0, "h"], + [78853, 0, "i"], + [78854, 0, "s"], + [78855, 0, " "], + [78856, 0, "p"], + [78857, 0, "r"], + [78858, 0, "o"], + [78859, 0, "o"], + [78860, 0, "f"], + [78861, 0, ","], + [78862, 0, " "], + [78863, 0, "c"], + [78864, 0, "o"], + [78865, 0, "n"], + [78866, 0, "s"], + [78867, 0, "i"], + [78868, 0, "d"], + [78869, 0, "e"], + [78870, 0, "r"], + [78871, 0, " "], + [78872, 0, "t"], + [78873, 0, "h"], + [78874, 0, "e"], + [78875, 0, " "], + [78876, 0, "c"], + [78877, 0, "a"], + [78878, 0, "s"], + [78879, 0, "e"], + [78880, 0, " "], + [78881, 0, "o"], + [78882, 0, "f"], + [78883, 0, " "], + [78884, 0, "$"], + [78885, 0, "k"], + [78886, 0, "^"], + [78887, 0, "\\"], + [78888, 0, "m"], + [78889, 0, "a"], + [78890, 0, "t"], + [78891, 0, "h"], + [78892, 0, "i"], + [78893, 0, "t"], + [78894, 0, "{"], + [78895, 0, "b"], + [78896, 0, "e"], + [78897, 0, "f"], + [78898, 0, "o"], + [78899, 0, "r"], + [78900, 0, "e"], + [78901, 0, "}"], + [78902, 0, " "], + [78903, 0, "="], + [78904, 0, " "], + [78905, 0, "k"], + [78906, 0, "_"], + [78907, 0, "1"], + [78908, 0, "^"], + [78909, 0, "\\"], + [78910, 0, "m"], + [78911, 0, "a"], + [78912, 0, "t"], + [78913, 0, "h"], + [78914, 0, "i"], + [78915, 0, "t"], + [78916, 0, "{"], + [78917, 0, "b"], + [78918, 0, "e"], + [78919, 0, "f"], + [78920, 0, "o"], + [78921, 0, "r"], + [78922, 0, "e"], + [78923, 0, "}"], + [78924, 0, " "], + [78925, 0, "="], + [78926, 0, " "], + [78927, 0, "k"], + [78928, 0, "_"], + [78929, 0, "2"], + [78930, 0, "^"], + [78931, 0, "\\"], + [78932, 0, "m"], + [78933, 0, "a"], + [78934, 0, "t"], + [78935, 0, "h"], + [78936, 0, "i"], + [78937, 0, "t"], + [78938, 0, "{"], + [78939, 0, "b"], + [78940, 0, "e"], + [78941, 0, "f"], + [78942, 0, "o"], + [78943, 0, "r"], + [78944, 0, "e"], + [78945, 0, "}"], + [78946, 0, "$"], + [78947, 0, " "], + [78948, 0, "a"], + [78949, 0, "n"], + [78950, 0, "d"], + [78951, 0, " "], + [78952, 0, "$"], + [78953, 0, "k"], + [78954, 0, "^"], + [78955, 0, "\\"], + [78956, 0, "a"], + [78957, 0, "f"], + [78958, 0, "t"], + [78959, 0, "e"], + [78960, 0, "r"], + [78956, 0, "m"], + [78957, 0, "a"], + [78958, 0, "t"], + [78959, 0, "h"], + [78960, 0, "i"], + [78961, 0, "t"], + [78962, 0, "{"], + [78968, 0, "}"], + [78969, 0, " "], + [78970, 0, "="], + [78971, 0, " "], + [78972, 0, "k"], + [78973, 0, "_"], + [78974, 0, "1"], + [78975, 0, "^"], + [78976, 0, "\\"], + [78977, 0, "m"], + [78978, 0, "a"], + [78979, 0, "t"], + [78980, 0, "h"], + [78981, 0, "i"], + [78982, 0, "t"], + [78983, 0, "{"], + [78984, 0, "a"], + [78985, 0, "f"], + [78986, 0, "t"], + [78987, 0, "e"], + [78988, 0, "r"], + [78989, 0, "}"], + [78990, 0, " "], + [78991, 0, "="], + [78992, 0, " "], + [78993, 0, "k"], + [78994, 0, "_"], + [78995, 0, "2"], + [78996, 0, "^"], + [78997, 0, "\\"], + [78998, 0, "m"], + [78999, 0, "a"], + [79000, 0, "t"], + [79001, 0, "h"], + [79002, 0, "i"], + [79003, 0, "t"], + [79004, 0, "{"], + [79005, 0, "a"], + [79006, 0, "f"], + [79007, 0, "t"], + [79008, 0, "e"], + [79009, 0, "r"], + [79010, 0, "}"], + [79011, 0, "$"], + [79012, 0, "."], + [79013, 0, " "], + [79014, 0, "W"], + [79015, 0, "e"], + [79016, 0, " "], + [79017, 0, "n"], + [79018, 0, "e"], + [79019, 0, "e"], + [79020, 0, "d"], + [79021, 0, " "], + [79022, 0, "t"], + [79023, 0, "o"], + [79024, 0, " "], + [79025, 0, "s"], + [79026, 0, "h"], + [79027, 0, "o"], + [79028, 0, "w"], + [79029, 0, " "], + [79030, 0, "t"], + [79031, 0, "h"], + [79032, 0, "a"], + [79033, 0, "t"], + [79034, 0, " "], + [87587, 0, ":"], + [87588, 0, "q"], + [87589, 0, "\n"], + [87589, 1], + [87588, 1], + [87587, 1], + [73548, 1], + [73547, 1], + [73546, 1], + [73545, 1], + [73544, 1], + [73543, 1], + [73542, 1], + [73541, 1], + [73540, 1], + [73539, 1], + [73538, 1], + [73537, 1], + [73536, 1], + [73535, 1], + [73534, 1], + [73533, 1], + [73532, 1], + [73531, 1], + [73530, 1], + [73529, 1], + [73528, 1], + [73527, 1], + [73526, 1], + [73525, 1], + [73524, 1], + [73523, 1], + [73522, 1], + [73521, 1], + [73520, 1], + [73519, 1], + [73518, 1], + [73517, 1], + [73516, 1], + [73515, 1], + [73514, 1], + [73513, 1], + [73512, 1], + [73511, 1], + [73510, 1], + [73509, 1], + [73508, 1], + [73507, 1], + [73506, 1], + [73505, 1], + [73504, 1], + [73503, 1], + [73502, 1], + [73501, 1], + [73500, 1], + [73499, 1], + [73498, 1], + [73497, 1], + [73496, 1], + [73495, 1], + [73494, 1], + [73493, 1], + [73492, 1], + [73491, 1], + [73490, 1], + [73489, 1], + [73488, 1], + [73487, 1], + [73486, 1], + [73485, 1], + [73484, 1], + [73483, 1], + [73482, 1], + [73481, 1], + [73480, 1], + [73479, 1], + [73478, 1], + [73477, 1], + [73476, 1], + [73475, 1], + [73474, 1], + [73473, 1], + [73472, 1], + [73471, 1], + [73470, 1], + [73469, 1], + [73468, 1], + [73467, 1], + [73466, 1], + [73465, 1], + [73464, 1], + [73463, 1], + [73462, 1], + [73461, 1], + [73460, 1], + [73459, 1], + [73458, 1], + [73457, 1], + [73456, 1], + [73455, 1], + [73454, 1], + [73453, 1], + [73452, 1], + [73451, 1], + [73450, 1], + [73449, 1], + [73448, 1], + [73447, 1], + [73446, 1], + [73445, 1], + [73444, 1], + [73443, 1], + [73442, 1], + [73441, 1], + [73440, 1], + [73439, 1], + [73438, 1], + [73437, 1], + [73436, 1], + [73435, 1], + [73434, 1], + [73433, 1], + [73432, 1], + [73431, 1], + [73430, 1], + [73429, 1], + [73428, 1], + [73427, 1], + [73426, 1], + [73425, 1], + [73424, 1], + [73423, 1], + [73422, 1], + [73421, 1], + [73420, 1], + [73419, 1], + [73418, 1], + [73417, 1], + [73416, 1], + [73415, 1], + [73414, 1], + [73413, 1], + [73412, 1], + [73411, 1], + [73410, 1], + [73409, 1], + [73408, 1], + [73407, 1], + [73406, 1], + [73405, 1], + [73404, 1], + [73403, 1], + [73402, 1], + [73401, 1], + [73400, 1], + [73399, 1], + [73398, 1], + [73397, 1], + [73396, 1], + [73395, 1], + [73394, 1], + [73393, 1], + [73392, 1], + [73391, 1], + [73390, 1], + [73389, 1], + [73388, 1], + [73387, 1], + [73386, 1], + [73385, 1], + [73384, 1], + [73383, 1], + [73382, 1], + [73381, 1], + [73380, 1], + [73379, 1], + [73378, 1], + [73377, 1], + [73376, 1], + [73375, 1], + [73374, 1], + [73373, 1], + [73372, 1], + [73371, 1], + [73370, 1], + [73369, 1], + [73368, 1], + [73367, 1], + [73366, 1], + [73365, 1], + [73364, 1], + [73363, 1], + [73362, 1], + [73361, 1], + [73360, 1], + [73359, 1], + [73358, 1], + [73357, 1], + [73356, 1], + [73355, 1], + [73354, 1], + [73353, 1], + [73352, 1], + [73351, 1], + [73350, 1], + [73349, 1], + [73348, 1], + [73347, 1], + [73346, 1], + [73345, 1], + [73344, 1], + [73343, 1], + [73342, 1], + [73342, 0, "\\"], + [73343, 0, "b"], + [73344, 0, "e"], + [73345, 0, "g"], + [73346, 0, "i"], + [73347, 0, "n"], + [73348, 0, "{"], + [73349, 0, "t"], + [73350, 0, "h"], + [73351, 0, "e"], + [73352, 0, "o"], + [73353, 0, "r"], + [73354, 0, "e"], + [73355, 0, "m"], + [73356, 0, "}"], + [73357, 0, "\\"], + [73358, 0, "l"], + [73359, 0, "a"], + [73360, 0, "b"], + [73361, 0, "e"], + [73362, 0, "l"], + [73363, 0, "{"], + [73364, 0, "t"], + [73365, 0, "h"], + [73366, 0, "m"], + [73367, 0, ":"], + [73368, 0, "c"], + [73369, 0, "o"], + [73370, 0, "n"], + [73371, 0, "v"], + [73372, 0, "e"], + [73373, 0, "r"], + [73374, 0, "g"], + [73375, 0, "e"], + [73376, 0, "n"], + [73377, 0, "c"], + [73378, 0, "e"], + [73379, 0, "}"], + [73380, 0, "\n"], + [73381, 0, "F"], + [73382, 0, "o"], + [73383, 0, "r"], + [73384, 0, " "], + [73385, 0, "a"], + [73386, 0, "n"], + [73387, 0, "y"], + [73388, 0, " "], + [73389, 0, "t"], + [73390, 0, "w"], + [73391, 0, "o"], + [73392, 0, " "], + [73393, 0, "r"], + [73394, 0, "e"], + [73395, 0, "p"], + [73396, 0, "l"], + [73397, 0, "i"], + [73398, 0, "c"], + [73399, 0, "a"], + [73400, 0, "s"], + [73401, 0, " "], + [73402, 0, "$"], + [73403, 0, "p"], + [73404, 0, "$"], + [73405, 0, " "], + [73406, 0, "a"], + [73407, 0, "n"], + [73408, 0, "d"], + [73409, 0, " "], + [73410, 0, "$"], + [73411, 0, "q"], + [73412, 0, "$"], + [73413, 0, " "], + [73414, 0, "t"], + [73415, 0, "h"], + [73416, 0, "a"], + [73417, 0, "t"], + [73418, 0, " "], + [73419, 0, "p"], + [73420, 0, "a"], + [73421, 0, "r"], + [73422, 0, "t"], + [73423, 0, "i"], + [73424, 0, "c"], + [73425, 0, "i"], + [73426, 0, "p"], + [73427, 0, "a"], + [73428, 0, "t"], + [73429, 0, "e"], + [73430, 0, "d"], + [73431, 0, " "], + [73432, 0, "i"], + [73433, 0, "n"], + [73434, 0, " "], + [73435, 0, "a"], + [73436, 0, " "], + [73437, 0, "v"], + [73438, 0, "a"], + [73439, 0, "l"], + [73440, 0, "i"], + [73441, 0, "d"], + [73442, 0, " "], + [73443, 0, "e"], + [73444, 0, "x"], + [73445, 0, "e"], + [73446, 0, "c"], + [73447, 0, "u"], + [73448, 0, "t"], + [73449, 0, "i"], + [73450, 0, "o"], + [73451, 0, "n"], + [73452, 0, ","], + [73453, 0, " "], + [73454, 0, "i"], + [73455, 0, "f"], + [73456, 0, " "], + [73457, 0, "$"], + [73458, 0, "A"], + [73459, 0, "_"], + [73460, 0, "p"], + [73461, 0, "("], + [73462, 0, "\\"], + [73463, 0, "m"], + [73464, 0, "a"], + [73465, 0, "t"], + [73466, 0, "h"], + [73467, 0, "s"], + [73468, 0, "f"], + [73469, 0, "{"], + [73470, 0, "o"], + [73471, 0, "p"], + [73472, 0, "s"], + [73473, 0, "}"], + [73474, 0, ")"], + [73475, 0, " "], + [73476, 0, "="], + [73477, 0, " "], + [73478, 0, "A"], + [73479, 0, "_"], + [73480, 0, "q"], + [73481, 0, "("], + [73482, 0, "\\"], + [73483, 0, "m"], + [73484, 0, "a"], + [73485, 0, "t"], + [73486, 0, "h"], + [73487, 0, "s"], + [73488, 0, "f"], + [73489, 0, "{"], + [73490, 0, "o"], + [73491, 0, "p"], + [73492, 0, "s"], + [73493, 0, "}"], + [73494, 0, ")"], + [73495, 0, "$"], + [73496, 0, ","], + [73497, 0, " "], + [73498, 0, "t"], + [73499, 0, "h"], + [73500, 0, "e"], + [73501, 0, "n"], + [73502, 0, " "], + [73503, 0, "$"], + [73504, 0, "p"], + [73505, 0, "4"], + [73505, 1], + [73505, 0, "$"], + [73506, 0, " "], + [73507, 0, "a"], + [73508, 0, "n"], + [73509, 0, "d"], + [73510, 0, " "], + [73511, 0, "$"], + [73512, 0, "q"], + [73513, 0, "$"], + [73514, 0, " "], + [73515, 0, "h"], + [73516, 0, "a"], + [73517, 0, "v"], + [73518, 0, "e"], + [73519, 0, " "], + [73520, 0, "t"], + [73521, 0, "h"], + [73522, 0, "e"], + [73523, 0, " "], + [73524, 0, "s"], + [73525, 0, "a"], + [73526, 0, "m"], + [73527, 0, "e"], + [73528, 0, " "], + [73529, 0, "d"], + [73530, 0, "o"], + [73531, 0, "c"], + [73532, 0, "u"], + [73533, 0, "m"], + [73534, 0, "e"], + [73535, 0, "n"], + [73536, 0, "t"], + [73537, 0, " "], + [73538, 0, "s"], + [73539, 0, "t"], + [73540, 0, "a"], + [73541, 0, "t"], + [73542, 0, "e"], + [73543, 0, "."], + [73544, 0, "\n"], + [73545, 0, "\\"], + [73546, 0, "b"], + [73546, 1], + [73546, 0, "e"], + [73547, 0, "n"], + [73548, 0, "d"], + [73549, 0, "{"], + [73550, 0, "t"], + [73551, 0, "h"], + [73552, 0, "e"], + [73553, 0, "o"], + [73554, 0, "r"], + [73555, 0, "e"], + [73556, 0, "m"], + [73557, 0, "}"], + [73558, 0, "\n"], + [73559, 0, "\n"], + [73560, 0, "\\"], + [73561, 0, "b"], + [73562, 0, "e"], + [73563, 0, "g"], + [73564, 0, "i"], + [73565, 0, "n"], + [73566, 0, "{"], + [73567, 0, "p"], + [73568, 0, "r"], + [73569, 0, "o"], + [73570, 0, "o"], + [73571, 0, "f"], + [73572, 0, "}"], + [73573, 0, "\n"], + [73574, 0, "\\"], + [73575, 0, "e"], + [73576, 0, "n"], + [73577, 0, "d"], + [73578, 0, "{"], + [73579, 0, "p"], + [73580, 0, "r"], + [73581, 0, "o"], + [73582, 0, "o"], + [73583, 0, "f"], + [73584, 0, "}"], + [73573, 0, "\n"], + [73574, 0, "C"], + [73575, 0, "o"], + [73576, 0, "n"], + [73577, 0, "s"], + [73578, 0, "i"], + [73579, 0, "d"], + [73580, 0, "e"], + [73581, 0, "r"], + [73582, 0, " "], + [73583, 0, "t"], + [73584, 0, "h"], + [73585, 0, "e"], + [73586, 0, " "], + [73587, 0, "h"], + [73588, 0, "i"], + [73589, 0, "s"], + [73590, 0, "t"], + [73591, 0, "o"], + [73592, 0, "r"], + [73593, 0, "y"], + [73594, 0, " "], + [73594, 1], + [73593, 1], + [73593, 0, "i"], + [73594, 0, "e"], + [73595, 0, "s"], + [73596, 0, " "], + [73597, 0, "$"], + [73598, 0, "H"], + [73599, 0, "_"], + [73600, 0, "p"], + [73601, 0, "$"], + [73602, 0, " "], + [73603, 0, "a"], + [73604, 0, "n"], + [73605, 0, "d"], + [73606, 0, " "], + [73607, 0, "$"], + [73608, 0, "H"], + [73609, 0, "_"], + [73610, 0, "q"], + [73611, 0, "$"], + [73612, 0, " "], + [73613, 0, "a"], + [73614, 0, "t"], + [73615, 0, " "], + [73616, 0, "$"], + [73617, 0, "p"], + [73618, 0, "$"], + [73619, 0, " "], + [73620, 0, "a"], + [73621, 0, "n"], + [73622, 0, "d"], + [73623, 0, " "], + [73624, 0, "$"], + [73625, 0, "q"], + [73626, 0, "$"], + [73627, 0, " "], + [73628, 0, "r"], + [73629, 0, "e"], + [73630, 0, "s"], + [73631, 0, "p"], + [73632, 0, "e"], + [73633, 0, "c"], + [73634, 0, "t"], + [73635, 0, "i"], + [73636, 0, "v"], + [73637, 0, "e"], + [73638, 0, "l"], + [73639, 0, "y"], + [73640, 0, "."], + [73641, 0, " "], + [73640, 0, " "], + [73641, 0, "("], + [73642, 0, "s"], + [73643, 0, "e"], + [73644, 0, "e"], + [73645, 0, " "], + [73646, 0, "D"], + [73647, 0, "e"], + [73648, 0, "f"], + [73649, 0, "i"], + [73650, 0, "n"], + [73651, 0, "i"], + [73652, 0, "t"], + [73653, 0, "i"], + [73654, 0, "o"], + [73655, 0, "n"], + [73656, 0, "~"], + [73657, 0, "\\"], + [73658, 0, "r"], + [73659, 0, "e"], + [73660, 0, "f"], + [73661, 0, "{"], + [73662, 0, "d"], + [73663, 0, "e"], + [73664, 0, "f"], + [73665, 0, ":"], + [73666, 0, "h"], + [73667, 0, "i"], + [73668, 0, "s"], + [73669, 0, "t"], + [73670, 0, "o"], + [73671, 0, "r"], + [73672, 0, "y"], + [73673, 0, "}"], + [73674, 0, ")"], + [69768, 0, "\\"], + [69769, 0, "l"], + [69770, 0, "a"], + [69771, 0, "b"], + [69772, 0, "e"], + [69773, 0, "l"], + [69774, 0, "{"], + [69775, 0, "d"], + [69776, 0, "e"], + [69777, 0, "f"], + [69778, 0, ":"], + [69779, 0, "d"], + [69780, 0, "o"], + [69781, 0, "c"], + [69782, 0, "-"], + [69783, 0, "s"], + [69784, 0, "t"], + [69785, 0, "a"], + [69786, 0, "t"], + [69787, 0, "e"], + [69788, 0, "}"], + [68990, 0, "\\"], + [68991, 0, "l"], + [68992, 0, "a"], + [68993, 0, "b"], + [68994, 0, "e"], + [68995, 0, "l"], + [68996, 0, "{"], + [68997, 0, "d"], + [68998, 0, "e"], + [68999, 0, "f"], + [69000, 0, ":"], + [69001, 0, "h"], + [69002, 0, "i"], + [69003, 0, "s"], + [69004, 0, "t"], + [69005, 0, "o"], + [69006, 0, "r"], + [69007, 0, "y"], + [69008, 0, "}"], + [67924, 0, "\\"], + [67925, 0, "l"], + [67926, 0, "a"], + [67927, 0, "b"], + [67928, 0, "e"], + [67929, 0, "l"], + [67930, 0, "{"], + [67931, 0, "d"], + [67932, 0, "e"], + [67933, 0, "f"], + [67934, 0, ":"], + [67935, 0, "v"], + [67936, 0, "a"], + [67937, 0, "l"], + [67938, 0, "i"], + [67939, 0, "d"], + [67940, 0, "-"], + [67941, 0, "e"], + [67942, 0, "x"], + [67943, 0, "e"], + [67944, 0, "c"], + [67945, 0, "}"], + [73739, 0, "\\"], + [73740, 0, "t"], + [73741, 0, "e"], + [73742, 0, "x"], + [73743, 0, "t"], + [73744, 0, "s"], + [73745, 0, "c"], + [73746, 0, "{"], + [73747, 0, "A"], + [73748, 0, "p"], + [73749, 0, "p"], + [73750, 0, "l"], + [73751, 0, "y"], + [73752, 0, "-"], + [73753, 0, "L"], + [73754, 0, "o"], + [73755, 0, "c"], + [73756, 0, "a"], + [73757, 0, "l"], + [73758, 0, "}"], + [73759, 0, " "], + [73760, 0, "a"], + [73761, 0, "n"], + [73762, 0, "d"], + [73763, 0, " "], + [73764, 0, "\\"], + [73765, 0, "t"], + [73766, 0, "e"], + [73767, 0, "x"], + [73768, 0, "t"], + [73769, 0, "s"], + [73770, 0, "c"], + [73771, 0, "{"], + [73772, 0, "A"], + [73773, 0, "p"], + [73774, 0, "p"], + [73775, 0, "l"], + [73776, 0, "y"], + [73777, 0, "-"], + [73778, 0, "R"], + [73779, 0, "e"], + [73780, 0, "m"], + [73781, 0, "o"], + [73782, 0, "t"], + [73783, 0, "e"], + [73784, 0, "}"], + [73738, 0, " "], + [73739, 0, "T"], + [73740, 0, "h"], + [73741, 0, "e"], + [73742, 0, " "], + [73743, 0, "o"], + [73744, 0, "n"], + [73745, 0, "l"], + [73746, 0, "y"], + [73747, 0, " "], + [73748, 0, "r"], + [73749, 0, "u"], + [73750, 0, "l"], + [73751, 0, "e"], + [73752, 0, "s"], + [73753, 0, " "], + [73754, 0, "t"], + [73755, 0, "h"], + [73756, 0, "a"], + [73757, 0, "t"], + [73758, 0, " "], + [73759, 0, "a"], + [73760, 0, "p"], + [73761, 0, "p"], + [73762, 0, "l"], + [73763, 0, "y"], + [73764, 0, " "], + [73765, 0, "o"], + [73766, 0, "p"], + [73767, 0, "e"], + [73768, 0, "r"], + [73769, 0, "a"], + [73770, 0, "t"], + [73771, 0, "i"], + [73772, 0, "o"], + [73773, 0, "n"], + [73774, 0, "s"], + [73775, 0, " "], + [73776, 0, "a"], + [73777, 0, "n"], + [73778, 0, "d"], + [73779, 0, " "], + [73780, 0, "t"], + [73781, 0, "h"], + [73782, 0, "a"], + [73783, 0, "t"], + [73784, 0, " "], + [73785, 0, "m"], + [73786, 0, "o"], + [73787, 0, "d"], + [73788, 0, "i"], + [73789, 0, "f"], + [73790, 0, "y"], + [73791, 0, " "], + [73792, 0, "$"], + [73793, 0, "A"], + [73794, 0, "_"], + [73795, 0, "p"], + [73796, 0, "("], + [73797, 0, "\\"], + [73798, 0, "m"], + [73799, 0, "a"], + [73800, 0, "t"], + [73801, 0, "h"], + [73802, 0, "s"], + [73803, 0, "f"], + [73804, 0, "{"], + [73805, 0, "o"], + [73806, 0, "p"], + [73807, 0, "s"], + [73808, 0, "}"], + [73809, 0, ")"], + [73810, 0, "$"], + [73811, 0, " "], + [73812, 0, "a"], + [73813, 0, "n"], + [73814, 0, "d"], + [73815, 0, " "], + [73816, 0, "$"], + [73817, 0, "A"], + [73818, 0, "_"], + [73819, 0, "q"], + [73820, 0, "("], + [73821, 0, "\\"], + [73822, 0, "m"], + [73823, 0, "a"], + [73824, 0, "t"], + [73825, 0, "h"], + [73826, 0, "s"], + [73827, 0, "f"], + [73828, 0, "{"], + [73829, 0, "o"], + [73830, 0, "p"], + [73831, 0, "s"], + [73832, 0, ")"], + [73832, 1], + [73832, 0, "}"], + [73833, 0, ")"], + [73834, 0, "$"], + [73835, 0, " "], + [73836, 0, "a"], + [73837, 0, "r"], + [73838, 0, "e"], + [73886, 0, ","], + [73887, 0, " "], + [73888, 0, "a"], + [73889, 0, "n"], + [73890, 0, "d"], + [73891, 0, " "], + [73892, 0, "t"], + [73893, 0, "h"], + [73894, 0, "e"], + [73895, 0, "y"], + [73896, 0, " "], + [73897, 0, "m"], + [73898, 0, "a"], + [73899, 0, "i"], + [73900, 0, "n"], + [73901, 0, "t"], + [73902, 0, "a"], + [73903, 0, "i"], + [73904, 0, "n"], + [73905, 0, " "], + [73906, 0, "t"], + [73907, 0, "h"], + [73908, 0, "e"], + [73909, 0, " "], + [73910, 0, "v"], + [73911, 0, "a"], + [73912, 0, "r"], + [73913, 0, "i"], + [73914, 0, "a"], + [73915, 0, "n"], + [73916, 0, "t"], + [73917, 0, " "], + [73918, 0, "t"], + [73919, 0, "h"], + [73920, 0, "a"], + [73921, 0, "t"], + [73922, 0, " "], + [73923, 0, "a"], + [73924, 0, "n"], + [73925, 0, " "], + [73925, 1], + [73924, 1], + [73923, 1], + [73923, 0, "f"], + [73924, 0, "o"], + [73925, 0, "r"], + [73926, 0, " "], + [73927, 0, "a"], + [73928, 0, "n"], + [73929, 0, "y"], + [73930, 0, " "], + [73931, 0, "o"], + [73932, 0, "p"], + [73933, 0, "e"], + [73934, 0, "r"], + [73935, 0, "a"], + [73936, 0, "t"], + [73937, 0, "i"], + [73938, 0, "o"], + [73939, 0, "n"], + [73940, 0, " "], + [73941, 0, "$"], + [73942, 0, "\\"], + [73943, 0, "m"], + [73944, 0, "a"], + [73945, 0, "t"], + [73946, 0, "h"], + [73947, 0, "i"], + [73948, 0, "t"], + [73949, 0, "{"], + [73950, 0, "o"], + [73951, 0, "p"], + [73952, 0, "}"], + [73953, 0, "$"], + [73954, 0, ","], + [73955, 0, " "], + [73956, 0, "$"], + [73957, 0, "\\"], + [73958, 0, "m"], + [73959, 0, "a"], + [73960, 0, "t"], + [73961, 0, "h"], + [73962, 0, "i"], + [73963, 0, "t"], + [73964, 0, "{"], + [73965, 0, "o"], + [73966, 0, "p"], + [73967, 0, "}"], + [73968, 0, " "], + [73969, 0, "\\"], + [73970, 0, "i"], + [73971, 0, "n"], + [73972, 0, " "], + [73890, 1], + [73889, 1], + [73888, 1], + [73887, 1], + [73886, 1], + [73890, 1], + [73889, 1], + [73888, 1], + [73887, 1], + [73886, 1], + [73900, 0, "i"], + [73901, 0, "n"], + [73921, 1], + [73920, 1], + [73919, 1], + [73918, 1], + [73917, 1], + [73916, 1], + [73915, 1], + [73915, 0, "a"], + [73916, 0, "n"], + [73959, 1], + [73958, 1], + [73957, 1], + [73956, 1], + [73955, 1], + [73954, 1], + [73953, 1], + [73952, 1], + [73951, 1], + [73950, 1], + [73949, 1], + [73948, 1], + [73947, 1], + [73946, 1], + [73945, 1], + [73944, 1], + [73943, 1], + [73942, 1], + [73941, 1], + [73940, 1], + [73939, 1], + [73938, 1], + [73937, 1], + [73936, 1], + [73935, 1], + [73934, 1], + [73933, 1], + [73932, 1], + [73931, 1], + [73930, 1], + [73929, 1], + [73928, 1], + [73928, 0, "i"], + [73929, 0, "s"], + [73930, 0, " "], + [73931, 0, "a"], + [73932, 0, "d"], + [73933, 0, "d"], + [73934, 0, "e"], + [73935, 0, "d"], + [73936, 0, " "], + [73937, 0, "t"], + [73938, 0, "o"], + [73939, 0, " "], + [73940, 0, "$"], + [73941, 0, "A"], + [73942, 0, "_"], + [73943, 0, "p"], + [73944, 0, "("], + [73945, 0, "\\"], + [73946, 0, "m"], + [73947, 0, "a"], + [73948, 0, "t"], + [73949, 0, "h"], + [73950, 0, "s"], + [73951, 0, "f"], + [73952, 0, "{"], + [73953, 0, "o"], + [73954, 0, "p"], + [73955, 0, "s"], + [73956, 0, "}"], + [73957, 0, ")"], + [73958, 0, " "], + [73958, 1], + [73958, 0, "$"], + [73959, 0, " "], + [73960, 0, "o"], + [73961, 0, "r"], + [73962, 0, " "], + [73963, 0, "$"], + [73964, 0, "A"], + [73965, 0, "_"], + [73966, 0, "q"], + [73967, 0, "("], + [73968, 0, "\\"], + [73969, 0, "m"], + [73970, 0, "a"], + [73971, 0, "t"], + [73972, 0, "h"], + [73973, 0, "s"], + [73974, 0, "f"], + [73975, 0, "{"], + [73976, 0, "o"], + [73977, 0, "p"], + [73978, 0, "s"], + [73979, 0, "}"], + [73980, 0, ")"], + [73981, 0, "$"], + [73982, 0, " "], + [73983, 0, "i"], + [73984, 0, "f"], + [73985, 0, "f"], + [73985, 1], + [73985, 0, " "], + [73986, 0, "a"], + [73987, 0, "n"], + [73988, 0, "d"], + [73989, 0, " "], + [73990, 0, "o"], + [73991, 0, "n"], + [73992, 0, "l"], + [73993, 0, "y"], + [73994, 0, " "], + [73995, 0, "i"], + [73996, 0, "f"], + [73997, 0, " "], + [73998, 0, "i"], + [73999, 0, "t"], + [74000, 0, " "], + [74001, 0, "w"], + [74002, 0, "a"], + [74003, 0, "s"], + [74004, 0, " "], + [74005, 0, "a"], + [74006, 0, "p"], + [74007, 0, "p"], + [74008, 0, "l"], + [74009, 0, "i"], + [74010, 0, "e"], + [74011, 0, "d"], + [74012, 0, " "], + [74013, 0, "t"], + [74014, 0, "o"], + [74015, 0, " "], + [74016, 0, "t"], + [74017, 0, "h"], + [74018, 0, "e"], + [74019, 0, " "], + [74020, 0, "d"], + [74021, 0, "o"], + [74022, 0, "c"], + [74023, 0, "u"], + [74024, 0, "m"], + [74025, 0, "e"], + [74026, 0, "n"], + [74027, 0, "t"], + [74028, 0, " "], + [74029, 0, "s"], + [74030, 0, "t"], + [74031, 0, "a"], + [74032, 0, "t"], + [74033, 0, "e"], + [74034, 0, "."], + [73839, 1], + [73838, 1], + [73837, 1], + [73836, 1], + [73835, 1], + [73834, 1], + [73833, 1], + [73832, 1], + [73831, 1], + [73830, 1], + [73829, 1], + [73828, 1], + [73827, 1], + [73826, 1], + [73825, 1], + [73824, 1], + [73823, 1], + [73822, 1], + [73821, 1], + [73820, 1], + [73819, 1], + [73818, 1], + [73817, 1], + [73816, 1], + [73815, 1], + [73814, 1], + [73813, 1], + [73812, 1], + [73811, 1], + [73810, 1], + [73809, 1], + [73808, 1], + [73807, 1], + [73806, 1], + [73805, 1], + [73804, 1], + [73803, 1], + [73802, 1], + [73801, 1], + [73800, 1], + [73799, 1], + [73798, 1], + [73797, 1], + [73796, 1], + [73795, 1], + [73794, 1], + [73793, 1], + [73792, 1], + [73791, 1], + [73790, 1], + [73789, 1], + [73788, 1], + [73787, 1], + [73786, 1], + [73785, 1], + [73784, 1], + [73783, 1], + [73782, 1], + [73781, 1], + [73780, 1], + [73779, 1], + [73778, 1], + [73777, 1], + [73776, 1], + [73775, 1], + [73774, 1], + [73773, 1], + [73772, 1], + [73771, 1], + [73770, 1], + [73769, 1], + [73768, 1], + [73767, 1], + [73766, 1], + [73765, 1], + [73764, 1], + [73763, 1], + [73762, 1], + [73761, 1], + [73760, 1], + [73759, 1], + [73758, 1], + [73757, 1], + [73756, 1], + [73755, 1], + [73754, 1], + [73747, 1], + [73746, 1], + [73745, 1], + [73744, 1], + [73743, 1], + [73944, 0, " "], + [73945, 0, "T"], + [73946, 0, "h"], + [73947, 0, "u"], + [73948, 0, "s"], + [73949, 0, ","], + [73950, 0, " "], + [73951, 0, "i"], + [73952, 0, "f"], + [73953, 0, " "], + [73954, 0, "$"], + [73955, 0, "A"], + [73956, 0, "_"], + [73957, 0, "p"], + [73958, 0, "{"], + [73959, 0, "\\"], + [73959, 1], + [73958, 1], + [73958, 0, "("], + [73959, 0, "\\"], + [73960, 0, "m"], + [73961, 0, "a"], + [73962, 0, "t"], + [73963, 0, "h"], + [73964, 0, "s"], + [73965, 0, "f"], + [73966, 0, "{"], + [73967, 0, "o"], + [73968, 0, "p"], + [73969, 0, "s"], + [73970, 0, "}"], + [73971, 0, ")"], + [73972, 0, " "], + [73973, 0, "="], + [73974, 0, " "], + [73975, 0, "A"], + [73976, 0, "_"], + [73977, 0, "q"], + [73978, 0, "("], + [73979, 0, "\\"], + [73980, 0, "m"], + [73981, 0, "a"], + [73982, 0, "t"], + [73983, 0, "h"], + [73984, 0, "s"], + [73985, 0, "f"], + [73986, 0, "{"], + [73987, 0, "o"], + [73988, 0, "p"], + [73989, 0, "s"], + [73990, 0, "}"], + [73991, 0, ")"], + [73992, 0, "$"], + [73993, 0, " "], + [73994, 0, "t"], + [73995, 0, "h"], + [73996, 0, "e"], + [73997, 0, "n"], + [73998, 0, " "], + [73999, 0, "$"], + [74000, 0, "H"], + [74001, 0, "_"], + [74002, 0, "p"], + [74003, 0, "$"], + [74004, 0, " "], + [74005, 0, "a"], + [74006, 0, "n"], + [74007, 0, "d"], + [74008, 0, " "], + [74009, 0, "$"], + [74010, 0, "H"], + [74011, 0, "_"], + [74012, 0, "q"], + [74013, 0, "$"], + [74014, 0, " "], + [74015, 0, "c"], + [74016, 0, "o"], + [74017, 0, "n"], + [74018, 0, "t"], + [74019, 0, "a"], + [74020, 0, "i"], + [74021, 0, "n"], + [74022, 0, " "], + [74023, 0, "t"], + [74024, 0, "h"], + [74025, 0, "e"], + [74026, 0, " "], + [74027, 0, "s"], + [74028, 0, "a"], + [74029, 0, "m"], + [74030, 0, "e"], + [74031, 0, " "], + [74032, 0, "s"], + [74033, 0, "e"], + [74034, 0, "t"], + [74035, 0, " "], + [74036, 0, "o"], + [74037, 0, "f"], + [74038, 0, " "], + [74039, 0, "o"], + [74040, 0, "p"], + [74041, 0, "e"], + [74042, 0, "r"], + [74043, 0, "a"], + [74044, 0, "t"], + [74045, 0, "i"], + [74046, 0, "o"], + [74047, 0, "n"], + [74048, 0, "s"], + [74049, 0, ","], + [74050, 0, " "], + [74051, 0, "b"], + [74052, 0, "u"], + [74053, 0, "t"], + [74054, 0, " "], + [74055, 0, "p"], + [74056, 0, "o"], + [74057, 0, "t"], + [74058, 0, "e"], + [74059, 0, "n"], + [74060, 0, "t"], + [74061, 0, "i"], + [74062, 0, "a"], + [74063, 0, "l"], + [74064, 0, "l"], + [74065, 0, "y"], + [74066, 0, " "], + [74067, 0, "i"], + [74068, 0, "n"], + [74069, 0, " "], + [74070, 0, "a"], + [74071, 0, " "], + [74072, 0, "d"], + [74073, 0, "i"], + [74074, 0, "f"], + [74075, 0, "f"], + [74076, 0, "e"], + [74077, 0, "r"], + [74078, 0, "e"], + [74079, 0, "n"], + [74080, 0, "t"], + [74081, 0, " "], + [74082, 0, "o"], + [74083, 0, "r"], + [74084, 0, "d"], + [74085, 0, "e"], + [74086, 0, "r"], + [74087, 0, "."], + [73953, 1], + [73952, 1], + [73951, 1], + [73994, 1], + [73993, 1], + [73992, 1], + [73991, 1], + [73991, 0, "i"], + [73992, 0, "f"], + [73993, 0, " "], + [73994, 0, "a"], + [73995, 0, "n"], + [73996, 0, "d"], + [73997, 0, " "], + [73998, 0, "o"], + [73999, 0, "n"], + [74000, 0, "l"], + [74001, 0, "y"], + [74002, 0, " "], + [74002, 1], + [74001, 1], + [74000, 1], + [73999, 1], + [73998, 1], + [73997, 1], + [73996, 1], + [73995, 1], + [73994, 1], + [73993, 1], + [73993, 0, "f"], + [74049, 1], + [74048, 1], + [74047, 1], + [74046, 1], + [74045, 1], + [74046, 0, "("], + [74079, 0, ")"], + [74063, 1], + [74062, 1], + [74077, 0, "s"], + [74080, 0, "\n"], + [74081, 0, "\n"], + [74082, 0, "W"], + [74083, 0, "e"], + [74084, 0, " "], + [74085, 0, "c"], + [74086, 0, "a"], + [74087, 0, "n"], + [74088, 0, " "], + [74089, 0, "p"], + [74090, 0, "r"], + [74091, 0, "o"], + [74092, 0, "v"], + [74093, 0, "e"], + [74094, 0, " "], + [74095, 0, "t"], + [74096, 0, "h"], + [74097, 0, "a"], + [74098, 0, "t"], + [74099, 0, " "], + [74099, 1], + [74098, 1], + [74097, 1], + [74096, 1], + [74095, 1], + [74094, 1], + [74093, 1], + [74092, 1], + [74091, 1], + [74090, 1], + [74089, 1], + [74088, 1], + [74087, 1], + [74086, 1], + [74085, 1], + [74084, 1], + [74083, 1], + [74082, 1], + [74082, 0, "T"], + [74083, 0, "h"], + [74084, 0, "e"], + [74085, 0, " "], + [74086, 0, "f"], + [74087, 0, "i"], + [74088, 0, "n"], + [74089, 0, "a"], + [74090, 0, "."], + [74091, 0, " "], + [74091, 1], + [74090, 1], + [74090, 0, "l"], + [74091, 0, " "], + [74092, 0, "d"], + [74093, 0, "o"], + [74094, 0, "c"], + [74095, 0, "u"], + [74096, 0, "m"], + [74097, 0, "e"], + [74098, 0, "n"], + [74099, 0, "t"], + [74100, 0, " "], + [74101, 0, "s"], + [74102, 0, "t"], + [74103, 0, "a"], + [74104, 0, "t"], + [74105, 0, "e"], + [74106, 0, " "], + [74091, 1], + [74090, 1], + [74089, 1], + [74088, 1], + [74087, 1], + [74086, 1], + [74101, 0, "a"], + [74102, 0, "t"], + [74103, 0, " "], + [74104, 0, "r"], + [74105, 0, "e"], + [74106, 0, "p"], + [74107, 0, "l"], + [74108, 0, "i"], + [74109, 0, "c"], + [74110, 0, "a"], + [74111, 0, " "], + [74112, 0, "$"], + [74113, 0, "p"], + [74114, 0, "$"], + [74115, 0, " "], + [74116, 0, "c"], + [74117, 0, "a"], + [74118, 0, "n"], + [74119, 0, " "], + [74119, 1], + [74118, 1], + [74117, 1], + [74116, 1], + [74116, 0, "i"], + [74117, 0, "s"], + [74118, 0, " "], + [74119, 0, "d"], + [74120, 0, "e"], + [74121, 0, "t"], + [74122, 0, "e"], + [74123, 0, "r"], + [74124, 0, "m"], + [74125, 0, "i"], + [74126, 0, "n"], + [74127, 0, "e"], + [74128, 0, "d"], + [74129, 0, " "], + [74130, 0, "e"], + [74131, 0, "n"], + [74132, 0, "t"], + [74133, 0, "i"], + [74134, 0, "r"], + [74135, 0, "e"], + [74136, 0, "l"], + [74137, 0, "y"], + [74138, 0, " "], + [74138, 1], + [74137, 1], + [74136, 1], + [74135, 1], + [74134, 1], + [74133, 1], + [74132, 1], + [74131, 1], + [74130, 1], + [74129, 1], + [74128, 1], + [74127, 1], + [74126, 1], + [74125, 1], + [74124, 1], + [74123, 1], + [74122, 1], + [74121, 1], + [74121, 0, "r"], + [74122, 0, "i"], + [74123, 0, "v"], + [74124, 0, "e"], + [74125, 0, "d"], + [74126, 0, " "], + [74127, 0, "f"], + [74128, 0, "r"], + [74129, 0, "o"], + [74130, 0, "m"], + [74131, 0, " "], + [74132, 0, "t"], + [74133, 0, "h"], + [74134, 0, "e"], + [74135, 0, " "], + [74136, 0, "h"], + [74137, 0, "i"], + [74138, 0, "s"], + [74139, 0, "t"], + [74140, 0, "o"], + [74141, 0, "r"], + [74142, 0, "y"], + [74143, 0, " "], + [74144, 0, "$"], + [74145, 0, "H"], + [74146, 0, "_"], + [74147, 0, "p"], + [74148, 0, "$"], + [74149, 0, " "], + [74081, 0, "\n"], + [74082, 0, "T"], + [74083, 0, "h"], + [74084, 0, "e"], + [74085, 0, " "], + [74086, 0, "h"], + [74087, 0, "i"], + [74088, 0, "s"], + [74089, 0, "t"], + [74090, 0, "o"], + [74091, 0, "r"], + [74092, 0, "y"], + [74093, 0, " "], + [74094, 0, "i"], + [74095, 0, "s"], + [74096, 0, " "], + [74097, 0, "a"], + [74098, 0, " "], + [74098, 1], + [74097, 1], + [74096, 1], + [74095, 1], + [74094, 1], + [74094, 0, "a"], + [74095, 0, "t"], + [74096, 0, " "], + [74097, 0, "r"], + [74098, 0, "e"], + [74099, 0, "p"], + [74100, 0, "l"], + [74101, 0, "i"], + [74102, 0, "c"], + [74103, 0, "a"], + [74104, 0, " "], + [74105, 0, "$"], + [74106, 0, "p"], + [74107, 0, "$"], + [74108, 0, " "], + [74109, 0, "i"], + [74110, 0, "s"], + [74111, 0, " "], + [74112, 0, "a"], + [74113, 0, " "], + [74114, 0, "s"], + [74115, 0, "e"], + [74116, 0, "q"], + [74117, 0, "u"], + [74118, 0, "e"], + [74119, 0, "n"], + [74120, 0, "c"], + [74121, 0, "e"], + [74122, 0, " "], + [74123, 0, "o"], + [74124, 0, "f"], + [74125, 0, " "], + [74126, 0, "o"], + [74127, 0, "p"], + [74128, 0, "e"], + [74129, 0, "r"], + [74130, 0, "a"], + [74131, 0, "t"], + [74132, 0, "i"], + [74133, 0, "o"], + [74134, 0, "n"], + [74135, 0, "s"], + [74136, 0, " "], + [74137, 0, "$"], + [74138, 0, "H"], + [74139, 0, "_"], + [74140, 0, "p"], + [74141, 0, " "], + [74142, 0, "="], + [74143, 0, " "], + [74144, 0, "o"], + [74145, 0, "_"], + [74146, 0, "1"], + [74147, 0, " "], + [74148, 0, "\\"], + [74149, 0, "d"], + [74150, 0, "o"], + [74151, 0, "t"], + [74152, 0, "s"], + [74153, 0, " "], + [74154, 0, "o"], + [74155, 0, "_"], + [74156, 0, "n"], + [74157, 0, "$"], + [74158, 0, ","], + [74159, 0, " "], + [74160, 0, "a"], + [74161, 0, "n"], + [74162, 0, "d"], + [74163, 0, " "], + [74164, 0, "t"], + [74165, 0, "h"], + [74166, 0, "e"], + [74167, 0, " "], + [74168, 0, "d"], + [74169, 0, "o"], + [74170, 0, "c"], + [74171, 0, "u"], + [74172, 0, "m"], + [74173, 0, "e"], + [74174, 0, "n"], + [74175, 0, "t"], + [74176, 0, " "], + [74177, 0, "s"], + [74178, 0, "t"], + [74179, 0, "a"], + [74180, 0, "t"], + [74181, 0, "e"], + [74182, 0, " "], + [74183, 0, "a"], + [74184, 0, "t"], + [74185, 0, " "], + [74186, 0, "$"], + [74187, 0, "p"], + [74188, 0, "$"], + [74189, 0, " "], + [74190, 0, "i"], + [74191, 0, "s"], + [74192, 0, " "], + [74193, 0, "d"], + [74194, 0, "e"], + [74195, 0, "r"], + [74196, 0, "i"], + [74197, 0, "v"], + [74198, 0, "e"], + [74199, 0, "d"], + [74200, 0, " "], + [74201, 0, "f"], + [74202, 0, "r"], + [74203, 0, "o"], + [74204, 0, "m"], + [74205, 0, " "], + [74206, 0, "$"], + [74207, 0, "H"], + [74208, 0, "_"], + [74209, 0, "p"], + [74210, 0, "$"], + [74211, 0, " "], + [74212, 0, "b"], + [74213, 0, "y"], + [74214, 0, " "], + [74215, 0, "s"], + [74216, 0, "t"], + [74217, 0, "a"], + [74218, 0, "r"], + [74219, 0, "t"], + [74220, 0, "i"], + [74221, 0, "n"], + [74222, 0, "g"], + [74223, 0, " "], + [74224, 0, "i"], + [74225, 0, "n"], + [74226, 0, " "], + [74227, 0, "t"], + [74228, 0, "h"], + [74229, 0, "e"], + [74230, 0, " "], + [74231, 0, "e"], + [74232, 0, "m"], + [74233, 0, "p"], + [74234, 0, "s"], + [74234, 1], + [74234, 0, "t"], + [74235, 0, "y"], + [74236, 0, " "], + [74237, 0, "s"], + [74238, 0, "t"], + [74239, 0, "a"], + [74240, 0, "t"], + [74241, 0, "e"], + [74242, 0, " "], + [74243, 0, "a"], + [74244, 0, "n"], + [74245, 0, "d"], + [74246, 0, " "], + [74247, 0, "a"], + [74248, 0, "p"], + [74249, 0, "p"], + [74250, 0, "l"], + [74251, 0, "y"], + [74252, 0, " "], + [74252, 1], + [74252, 0, "i"], + [74253, 0, "n"], + [74254, 0, "g"], + [74255, 0, " "], + [74256, 0, "t"], + [74257, 0, "h"], + [74258, 0, "e"], + [74259, 0, " "], + [74260, 0, "o"], + [74261, 0, "p"], + [74262, 0, "e"], + [74263, 0, "r"], + [74264, 0, "a"], + [74265, 0, "t"], + [74266, 0, "i"], + [74267, 0, "o"], + [74268, 0, "n"], + [74269, 0, "s"], + [74270, 0, " "], + [74271, 0, "i"], + [74272, 0, "n"], + [74273, 0, " "], + [74274, 0, "o"], + [74275, 0, "r"], + [74276, 0, "d"], + [74277, 0, "e"], + [74278, 0, "r"], + [74279, 0, "."], + [74280, 0, " "], + [74281, 0, "L"], + [74282, 0, "i"], + [74283, 0, "k"], + [74284, 0, "e"], + [74285, 0, " "], + [74285, 1], + [74285, 0, "w"], + [74286, 0, "i"], + [74287, 0, "s"], + [74288, 0, "e"], + [74289, 0, ","], + [74290, 0, " "], + [74291, 0, "t"], + [74292, 0, "h"], + [74293, 0, "e"], + [74294, 0, " "], + [74295, 0, "d"], + [74296, 0, "o"], + [74297, 0, "c"], + [74298, 0, "u"], + [74299, 0, "m"], + [74300, 0, "e"], + [74301, 0, "n"], + [74302, 0, "t"], + [74303, 0, " "], + [74304, 0, "s"], + [74305, 0, "t"], + [74306, 0, "a"], + [74307, 0, "t"], + [74308, 0, "e"], + [74309, 0, " "], + [74310, 0, "a"], + [74311, 0, "t"], + [74312, 0, " "], + [74313, 0, "$"], + [74314, 0, "q"], + [74315, 0, "$"], + [74316, 0, " "], + [74317, 0, "i"], + [74318, 0, "s"], + [74319, 0, " "], + [74320, 0, "d"], + [74321, 0, "e"], + [74322, 0, "r"], + [74323, 0, "i"], + [74324, 0, "v"], + [74325, 0, "e"], + [74326, 0, "d"], + [74327, 0, " "], + [74328, 0, "f"], + [74329, 0, "r"], + [74330, 0, "o"], + [74331, 0, "m"], + [74332, 0, " "], + [74333, 0, "$"], + [74334, 0, "H"], + [74335, 0, "_"], + [74336, 0, "q"], + [74337, 0, "$"], + [74338, 0, ","], + [74339, 0, " "], + [74340, 0, "w"], + [74341, 0, "h"], + [74342, 0, "i"], + [74343, 0, "c"], + [74344, 0, "h"], + [74345, 0, " "], + [74346, 0, "i"], + [74347, 0, "s"], + [74348, 0, " "], + [74349, 0, "a"], + [74350, 0, " "], + [74351, 0, "p"], + [74352, 0, "e"], + [74353, 0, "r"], + [74354, 0, "m"], + [74355, 0, "u"], + [74356, 0, "t"], + [74357, 0, "a"], + [74358, 0, "t"], + [74359, 0, "i"], + [74360, 0, "o"], + [74361, 0, "n"], + [74362, 0, " "], + [74363, 0, "o"], + [74364, 0, "f"], + [74365, 0, " "], + [74366, 0, "$"], + [74367, 0, "H"], + [74368, 0, "_"], + [74369, 0, "p"], + [74370, 0, "$"], + [74371, 0, "."], + [74440, 1], + [74439, 1], + [74438, 1], + [74437, 1], + [74436, 1], + [74435, 1], + [74434, 1], + [74433, 1], + [74432, 1], + [74431, 1], + [74430, 1], + [74429, 1], + [74428, 1], + [74427, 1], + [74426, 1], + [74425, 1], + [74424, 1], + [74423, 1], + [74422, 1], + [74421, 1], + [74420, 1], + [74419, 1], + [74418, 1], + [74417, 1], + [74416, 1], + [74415, 1], + [74414, 1], + [74413, 1], + [74412, 1], + [74411, 1], + [74410, 1], + [74409, 1], + [74408, 1], + [74407, 1], + [74406, 1], + [74405, 1], + [74404, 1], + [74403, 1], + [74402, 1], + [74401, 1], + [74400, 1], + [74399, 1], + [74398, 1], + [74397, 1], + [74396, 1], + [74395, 1], + [74394, 1], + [74393, 1], + [74392, 1], + [74391, 1], + [74390, 1], + [74389, 1], + [74388, 1], + [74387, 1], + [74386, 1], + [74385, 1], + [74384, 1], + [74383, 1], + [74382, 1], + [74381, 1], + [74380, 1], + [74379, 1], + [74378, 1], + [74377, 1], + [74376, 1], + [74375, 1], + [74374, 1], + [74373, 1], + [74372, 1], + [74372, 0, " "], + [74373, 0, "B"], + [74374, 0, "o"], + [74375, 0, "t"], + [74376, 0, "h"], + [74377, 0, " "], + [74378, 0, "h"], + [74379, 0, "i"], + [74380, 0, "s"], + [74381, 0, "t"], + [74382, 0, "o"], + [74383, 0, "r"], + [74384, 0, "i"], + [74385, 0, "e"], + [74386, 0, "s"], + [74387, 0, " "], + [74388, 0, "m"], + [74389, 0, "u"], + [74390, 0, "s"], + [74391, 0, "t"], + [74392, 0, " "], + [74393, 0, "b"], + [74394, 0, "e"], + [74395, 0, " "], + [74396, 0, "c"], + [74397, 0, "o"], + [74398, 0, "n"], + [74399, 0, "s"], + [74400, 0, "i"], + [74401, 0, "s"], + [74402, 0, "t"], + [74403, 0, "e"], + [74404, 0, "n"], + [74405, 0, "t"], + [74406, 0, " "], + [74407, 0, "w"], + [74408, 0, "i"], + [74409, 0, "t"], + [74410, 0, "h"], + [74411, 0, " "], + [74412, 0, "c"], + [74413, 0, "a"], + [74414, 0, "u"], + [74415, 0, "s"], + [74416, 0, "a"], + [74417, 0, "l"], + [74418, 0, "i"], + [74419, 0, "t"], + [74420, 0, "y"], + [74421, 0, ","], + [74422, 0, " "], + [74423, 0, "i"], + [74424, 0, "."], + [74425, 0, "e"], + [74426, 0, "."], + [74427, 0, " "], + [74428, 0, "f"], + [74429, 0, "o"], + [74430, 0, "r"], + [74431, 0, " "], + [74432, 0, "a"], + [74433, 0, "l"], + [74434, 0, "l"], + [74435, 0, " "], + [74436, 0, "#"], + [74436, 1], + [74436, 0, "$"], + [74437, 0, "i"], + [74438, 0, "$"], + [74439, 0, " "], + [74440, 0, "w"], + [74441, 0, "i"], + [74442, 0, "t"], + [74443, 0, "h"], + [74444, 0, " "], + [74445, 0, "$"], + [74446, 0, "1"], + [74447, 0, " "], + [74448, 0, "\\"], + [74449, 0, "e"], + [74449, 1], + [74449, 0, "l"], + [74450, 0, "e"], + [74451, 0, " "], + [74452, 0, "i"], + [74453, 0, " "], + [74454, 0, "\\"], + [74455, 0, "l"], + [74456, 0, "e"], + [74457, 0, " "], + [74458, 0, "n"], + [74459, 0, "$"], + [74460, 0, ","], + [74461, 0, " "], + [74462, 0, "$"], + [74463, 0, "\\"], + [74464, 0, "m"], + [74465, 0, "a"], + [74466, 0, "t"], + [74467, 0, "h"], + [74468, 0, "i"], + [74469, 0, "t"], + [74469, 1], + [74468, 1], + [74467, 1], + [74466, 1], + [74465, 1], + [74464, 1], + [74463, 1], + [74463, 0, "o"], + [74464, 0, "_"], + [74465, 0, "i"], + [74466, 0, "."], + [74467, 0, "\\"], + [74468, 0, "m"], + [74469, 0, "a"], + [74470, 0, "t"], + [74471, 0, "h"], + [74472, 0, "i"], + [74473, 0, "t"], + [74474, 0, "{"], + [74475, 0, "d"], + [74476, 0, "e"], + [74477, 0, "p"], + [74478, 0, "s"], + [74479, 0, "}"], + [74480, 0, " "], + [74481, 0, "\\"], + [74482, 0, "s"], + [74483, 0, "u"], + [74484, 0, "b"], + [74485, 0, "s"], + [74486, 0, "e"], + [74487, 0, "t"], + [74488, 0, "e"], + [74489, 0, "q"], + [74490, 0, " "], + [74491, 0, "{"], + [74492, 0, " "], + [74493, 0, "o"], + [74494, 0, "_"], + [74495, 0, "j"], + [74496, 0, "."], + [74497, 0, "\\"], + [74498, 0, "m"], + [74499, 0, "a"], + [74500, 0, "t"], + [74501, 0, "h"], + [74502, 0, "i"], + [74503, 0, "t"], + [74504, 0, "{"], + [74505, 0, "i"], + [74506, 0, "d"], + [74507, 0, "}"], + [74508, 0, " "], + [74509, 0, "\\"], + [74510, 0, "m"], + [74511, 0, "i"], + [74512, 0, "d"], + [74513, 0, " "], + [74514, 0, "1"], + [74515, 0, " "], + [74516, 0, "\\"], + [74517, 0, "e"], + [74518, 0, " "], + [74518, 1], + [74517, 1], + [74517, 0, "l"], + [74518, 0, "e"], + [74519, 0, " "], + [74520, 0, "j"], + [74521, 0, " "], + [74522, 0, "<"], + [74523, 0, " "], + [74524, 0, "i"], + [74491, 0, "\\"], + [74526, 0, " "], + [74527, 0, "\\"], + [74528, 0, "}"], + [74526, 1], + [74493, 1], + [74527, 0, "$"], + [74528, 0, "."], + [73943, 0, " "], + [73944, 0, "a"], + [73945, 0, "t"], + [73946, 0, " "], + [73947, 0, "$"], + [73948, 0, "p"], + [73949, 0, "$"], + [73950, 0, " "], + [73951, 0, "o"], + [73952, 0, "r"], + [73953, 0, " "], + [73954, 0, "$"], + [73955, 0, "q"], + [73956, 0, "$"], + [74074, 1], + [74073, 1], + [74073, 0, "i"], + [74074, 0, "r"], + [74074, 1], + [74073, 1], + [74073, 0, "o"], + [74074, 0, "r"], + [74075, 0, "d"], + [74076, 0, "e"], + [74077, 0, "r"], + [74078, 0, "e"], + [74079, 0, "d"], + [74096, 1], + [74095, 1], + [74094, 1], + [74093, 1], + [74092, 1], + [74091, 1], + [74090, 1], + [74090, 0, "l"], + [74091, 0, "y"], + [74158, 0, "\\"], + [74159, 0, "l"], + [74160, 0, "a"], + [74161, 0, "n"], + [74162, 0, "g"], + [74163, 0, "l"], + [74164, 0, "e"], + [74165, 0, " "], + [74179, 0, " "], + [74180, 0, "\\"], + [74181, 0, "r"], + [74182, 0, "a"], + [74183, 0, "n"], + [74184, 0, "g"], + [74185, 0, "l"], + [74186, 0, "e"], + [74169, 0, ","], + [74176, 0, ","], + [74786, 0, " "], + [74787, 0, "w"], + [74788, 0, "e"], + [74789, 0, " "], + [74790, 0, "r"], + [74791, 0, "e"], + [74792, 0, "q"], + [74793, 0, "u"], + [74794, 0, "i"], + [74795, 0, "r"], + [74796, 0, "e"], + [74796, 1], + [74795, 1], + [74794, 1], + [74793, 1], + [74792, 1], + [74791, 1], + [74790, 1], + [74789, 1], + [74788, 1], + [74787, 1], + [74786, 1], + [74494, 0, "w"], + [74495, 0, "e"], + [74496, 0, " "], + [74497, 0, "r"], + [74498, 0, "e"], + [74499, 0, "q"], + [74500, 0, "u"], + [74501, 0, "i"], + [74502, 0, "r"], + [74503, 0, "e"], + [74504, 0, " "], + [74572, 0, "\n"], + [74573, 0, "\n"], + [74574, 0, "W"], + [74575, 0, "e"], + [74576, 0, " "], + [74577, 0, "c"], + [74578, 0, "a"], + [74579, 0, "n"], + [74580, 0, " "], + [74581, 0, "p"], + [74582, 0, "r"], + [74583, 0, "o"], + [74584, 0, "v"], + [74585, 0, "e"], + [74586, 0, " "], + [74587, 0, "t"], + [74588, 0, "h"], + [74589, 0, "e"], + [74590, 0, " "], + [74591, 0, "t"], + [74592, 0, "h"], + [74593, 0, "e"], + [74594, 0, "o"], + [74595, 0, "r"], + [74596, 0, "e"], + [74597, 0, "m"], + [74598, 0, " "], + [74599, 0, "b"], + [74600, 0, "y"], + [74601, 0, " "], + [74602, 0, "i"], + [74603, 0, "n"], + [74604, 0, "d"], + [74605, 0, "u"], + [74606, 0, "c"], + [74607, 0, "t"], + [74608, 0, "i"], + [74609, 0, "o"], + [74610, 0, "n"], + [74611, 0, " "], + [74612, 0, "o"], + [74613, 0, "v"], + [74614, 0, "e"], + [74615, 0, "r"], + [74616, 0, " "], + [74617, 0, "h"], + [74618, 0, "i"], + [74619, 0, "s"], + [74620, 0, "t"], + [74621, 0, "o"], + [74622, 0, "r"], + [74623, 0, "i"], + [74624, 0, "e"], + [74625, 0, "s"], + [74625, 1], + [74624, 1], + [74623, 1], + [74622, 1], + [74621, 1], + [74620, 1], + [74619, 1], + [74618, 1], + [74617, 1], + [74617, 0, "t"], + [74618, 0, "h"], + [74619, 0, "e"], + [74620, 0, " "], + [74621, 0, "l"], + [74622, 0, "e"], + [74623, 0, "n"], + [74624, 0, "g"], + [74625, 0, "t"], + [74626, 0, "h"], + [74627, 0, " "], + [74628, 0, "o"], + [74629, 0, "f"], + [74630, 0, " "], + [74631, 0, "h"], + [74632, 0, "i"], + [74633, 0, "s"], + [74634, 0, "t"], + [74635, 0, "o"], + [74636, 0, "r"], + [74637, 0, "y"], + [74638, 0, " "], + [74639, 0, "$"], + [74640, 0, "n"], + [74641, 0, "$"], + [74642, 0, "."], + [74643, 0, "\n"], + [74644, 0, "\n"], + [74645, 0, "\\"], + [74646, 0, "e"], + [74647, 0, "m"], + [74648, 0, "p"], + [74649, 0, "h"], + [74650, 0, "{"], + [74651, 0, "B"], + [74652, 0, "a"], + [74653, 0, "s"], + [74654, 0, "e"], + [74655, 0, " "], + [74656, 0, "c"], + [74657, 0, "a"], + [74658, 0, "s"], + [74659, 0, "e"], + [74660, 0, ":"], + [74661, 0, "}"], + [74662, 0, " "], + [74663, 0, "A"], + [74664, 0, " "], + [74665, 0, "h"], + [74666, 0, "i"], + [74667, 0, "s"], + [74668, 0, "t"], + [74669, 0, "o"], + [74670, 0, "r"], + [74670, 1], + [74669, 1], + [74668, 1], + [74667, 1], + [74666, 1], + [74665, 1], + [74664, 1], + [74664, 0, "n"], + [74665, 0, " "], + [74666, 0, "e"], + [74667, 0, "m"], + [74668, 0, "p"], + [74669, 0, "t"], + [74670, 0, "y"], + [74671, 0, " "], + [74672, 0, "h"], + [74673, 0, "i"], + [74674, 0, "s"], + [74675, 0, "t"], + [74676, 0, "o"], + [74677, 0, "r"], + [74678, 0, "y"], + [74679, 0, " "], + [74680, 0, "w"], + [74681, 0, "i"], + [74682, 0, "t"], + [74683, 0, "h"], + [74684, 0, " "], + [74685, 0, "$"], + [74686, 0, "n"], + [74687, 0, "="], + [74688, 0, "0"], + [74689, 0, "$"], + [74690, 0, " "], + [74691, 0, "d"], + [74692, 0, "e"], + [74693, 0, "s"], + [74694, 0, "c"], + [74695, 0, "r"], + [74696, 0, "i"], + [74697, 0, "b"], + [74698, 0, "e"], + [74699, 0, "s"], + [74700, 0, " "], + [74701, 0, "t"], + [74702, 0, "h"], + [74703, 0, "e"], + [74704, 0, " "], + [74705, 0, "e"], + [74706, 0, "m"], + [74707, 0, "p"], + [74708, 0, "t"], + [74709, 0, "y"], + [74710, 0, " "], + [74711, 0, "d"], + [74712, 0, "o"], + [74713, 0, "c"], + [74714, 0, "u"], + [74715, 0, "m"], + [74716, 0, "e"], + [74717, 0, "n"], + [74718, 0, "t"], + [74719, 0, " "], + [74720, 0, "s"], + [74721, 0, "t"], + [74722, 0, "a"], + [74723, 0, "t"], + [74724, 0, "e"], + [74725, 0, "."], + [74726, 0, " "], + [74727, 0, "T"], + [74728, 0, "h"], + [74729, 0, "e"], + [74730, 0, " "], + [74731, 0, "e"], + [74732, 0, "m"], + [74733, 0, "p"], + [74734, 0, "t"], + [74735, 0, "y"], + [74736, 0, " "], + [74737, 0, "d"], + [74738, 0, "o"], + [74739, 0, "c"], + [74740, 0, "u"], + [74741, 0, "m"], + [74742, 0, "e"], + [74743, 0, "n"], + [74744, 0, "t"], + [74745, 0, " "], + [74746, 0, "i"], + [74747, 0, "s"], + [74748, 0, " "], + [74749, 0, "a"], + [74750, 0, "l"], + [74751, 0, "w"], + [74752, 0, "a"], + [74753, 0, "y"], + [74754, 0, "s"], + [74755, 0, " "], + [74756, 0, "t"], + [74757, 0, "h"], + [74758, 0, "e"], + [74759, 0, " "], + [74760, 0, "s"], + [74761, 0, "a"], + [74762, 0, "m"], + [74763, 0, "e"], + [74764, 0, ","], + [74765, 0, " "], + [74766, 0, "a"], + [74767, 0, "n"], + [74768, 0, "d"], + [74769, 0, " "], + [74770, 0, "s"], + [74771, 0, "o"], + [74772, 0, " "], + [74773, 0, "a"], + [74774, 0, "n"], + [74775, 0, "y"], + [74776, 0, " "], + [74777, 0, "t"], + [74778, 0, "w"], + [74779, 0, "o"], + [74780, 0, " "], + [74781, 0, "r"], + [74782, 0, "e"], + [74783, 0, "p"], + [74784, 0, "l"], + [74785, 0, "i"], + [74786, 0, "c"], + [74787, 0, "a"], + [74788, 0, "s"], + [74789, 0, " "], + [74790, 0, "t"], + [74791, 0, "h"], + [74792, 0, "a"], + [74793, 0, "t"], + [74794, 0, " "], + [74795, 0, "h"], + [74796, 0, "a"], + [74797, 0, "v"], + [74798, 0, "e"], + [74799, 0, " "], + [74800, 0, "n"], + [74801, 0, "o"], + [74802, 0, "t"], + [74803, 0, " "], + [74804, 0, "e"], + [74805, 0, "x"], + [74806, 0, "e"], + [74807, 0, "c"], + [74808, 0, "u"], + [74809, 0, "t"], + [74810, 0, "e"], + [74811, 0, "d"], + [74812, 0, " "], + [74813, 0, "a"], + [74814, 0, "n"], + [74815, 0, "y"], + [74816, 0, " "], + [74817, 0, "o"], + [74818, 0, "p"], + [74819, 0, "e"], + [74820, 0, "r"], + [74821, 0, "a"], + [74822, 0, "t"], + [74823, 0, "i"], + [74824, 0, "o"], + [74825, 0, "n"], + [74826, 0, "s"], + [74827, 0, "a"], + [74828, 0, " "], + [74829, 0, "r"], + [74829, 1], + [74828, 1], + [74827, 1], + [74827, 0, " "], + [74828, 0, "a"], + [74829, 0, "r"], + [74830, 0, "e"], + [74831, 0, " "], + [74832, 0, "b"], + [74833, 0, "y"], + [74834, 0, " "], + [74835, 0, "d"], + [74836, 0, "e"], + [74837, 0, "f"], + [74838, 0, "i"], + [74839, 0, "n"], + [74840, 0, "i"], + [74841, 0, "t"], + [74842, 0, "i"], + [74843, 0, "o"], + [74844, 0, "n"], + [74845, 0, " "], + [74846, 0, "i"], + [74847, 0, "n"], + [74848, 0, " "], + [74849, 0, "t"], + [74850, 0, "h"], + [74851, 0, "e"], + [74852, 0, " "], + [74853, 0, "s"], + [74854, 0, "a"], + [74855, 0, "m"], + [74856, 0, "e"], + [74857, 0, " "], + [74858, 0, "s"], + [74859, 0, "t"], + [74860, 0, "a"], + [74861, 0, "t"], + [74862, 0, "e"], + [74863, 0, "."], + [74864, 0, "\n"], + [74865, 0, "\n"], + [74866, 0, "\\"], + [74867, 0, "e"], + [74868, 0, "m"], + [74869, 0, "p"], + [74870, 0, "h"], + [74871, 0, "{"], + [74872, 0, "I"], + [74873, 0, "n"], + [74874, 0, "d"], + [74875, 0, "u"], + [74876, 0, "c"], + [74877, 0, "t"], + [74878, 0, "i"], + [74879, 0, "o"], + [74880, 0, "n"], + [74881, 0, " "], + [74882, 0, "s"], + [74883, 0, "t"], + [74884, 0, "e"], + [74885, 0, "p"], + [74886, 0, ":"], + [74887, 0, "}"], + [74888, 0, " "], + [74889, 0, "G"], + [74890, 0, "i"], + [74891, 0, "v"], + [74892, 0, "e"], + [74893, 0, "n"], + [74894, 0, " "], + [74895, 0, "h"], + [74896, 0, "i"], + [74897, 0, "s"], + [74898, 0, "t"], + [74899, 0, "o"], + [74900, 0, "r"], + [74901, 0, "i"], + [74902, 0, "e"], + [74903, 0, "s"], + [74904, 0, " "], + [74905, 0, "$"], + [74906, 0, "H"], + [74907, 0, "_"], + [74908, 0, "p"], + [74909, 0, "$"], + [74910, 0, " "], + [74911, 0, "a"], + [74912, 0, "n"], + [74913, 0, "d"], + [74914, 0, " "], + [74915, 0, "$"], + [74916, 0, "H"], + [74917, 0, "_"], + [74918, 0, "q"], + [74919, 0, "$"], + [74920, 0, " "], + [74921, 0, "o"], + [74922, 0, "f"], + [74923, 0, " "], + [74924, 0, "l"], + [74925, 0, "e"], + [74926, 0, "n"], + [74927, 0, "g"], + [74928, 0, "t"], + [74929, 0, "h"], + [74930, 0, " "], + [74931, 0, "$"], + [74932, 0, "n"], + [74933, 0, "$"], + [74934, 0, ","], + [74935, 0, " "], + [74936, 0, "s"], + [74937, 0, "u"], + [74938, 0, "c"], + [74939, 0, "h"], + [74940, 0, " "], + [74941, 0, "t"], + [74942, 0, "h"], + [74943, 0, "a"], + [74944, 0, "t"], + [74945, 0, " "], + [74946, 0, "$"], + [74947, 0, "H"], + [74948, 0, "_"], + [74949, 0, "p"], + [74950, 0, " "], + [74951, 0, "="], + [74952, 0, " "], + [74953, 0, "\\"], + [74954, 0, "l"], + [74955, 0, "a"], + [74956, 0, "n"], + [74957, 0, "g"], + [74958, 0, "l"], + [74959, 0, "e"], + [74960, 0, " "], + [74961, 0, "o"], + [74962, 0, "_"], + [74963, 0, "1"], + [74964, 0, ","], + [74965, 0, " "], + [74966, 0, "\\"], + [74967, 0, "d"], + [74968, 0, "o"], + [74969, 0, "t"], + [74970, 0, "s"], + [74971, 0, ","], + [74972, 0, " "], + [74973, 0, "o"], + [74974, 0, "_"], + [74975, 0, "n"], + [74976, 0, " "], + [74977, 0, "\\"], + [74978, 0, "r"], + [74979, 0, "a"], + [74980, 0, "n"], + [74981, 0, "g"], + [74982, 0, "l"], + [74983, 0, "e"], + [74984, 0, "$"], + [74985, 0, " "], + [74986, 0, "a"], + [74987, 0, "n"], + [74988, 0, "d"], + [74989, 0, " "], + [74990, 0, "$"], + [74991, 0, "H"], + [74992, 0, "_"], + [74993, 0, "q"], + [74994, 0, " "], + [74994, 1], + [74994, 0, "$"], + [74995, 0, " "], + [74996, 0, "i"], + [74997, 0, "s"], + [74998, 0, " "], + [74999, 0, "a"], + [75000, 0, " "], + [75001, 0, "p"], + [75002, 0, "e"], + [75003, 0, "r"], + [75004, 0, "m"], + [75005, 0, "u"], + [75006, 0, "t"], + [75007, 0, "a"], + [75008, 0, "t"], + [75009, 0, "i"], + [75010, 0, "o"], + [75011, 0, "n"], + [75012, 0, " "], + [75013, 0, "o"], + [75014, 0, "f"], + [75015, 0, " "], + [75016, 0, "$"], + [75017, 0, "H"], + [75018, 0, "_"], + [75019, 0, "q"], + [75019, 1], + [75019, 0, "p"], + [75020, 0, "$"], + [75021, 0, ","], + [75022, 0, " "], + [75023, 0, "a"], + [75024, 0, "n"], + [75025, 0, "d"], + [75026, 0, " "], + [75027, 0, "s"], + [75028, 0, "u"], + [75029, 0, "c"], + [75030, 0, "h"], + [75031, 0, " "], + [75032, 0, "t"], + [75033, 0, "h"], + [75034, 0, "a"], + [75035, 0, "t"], + [75036, 0, " "], + [75037, 0, "a"], + [75038, 0, "p"], + [75039, 0, "p"], + [75040, 0, "l"], + [75041, 0, "y"], + [75042, 0, "i"], + [75043, 0, "n"], + [75044, 0, "g"], + [75045, 0, " "], + [75046, 0, "$"], + [75047, 0, "H"], + [75048, 0, "_"], + [75049, 0, "p"], + [75050, 0, "$"], + [75051, 0, " "], + [75052, 0, "r"], + [75053, 0, "e"], + [75054, 0, "s"], + [75055, 0, "u"], + [75056, 0, "l"], + [75057, 0, "t"], + [75058, 0, "s"], + [75059, 0, " "], + [75060, 0, "i"], + [75061, 0, "n"], + [75062, 0, " "], + [75063, 0, "t"], + [75064, 0, "h"], + [75065, 0, "e"], + [75066, 0, " "], + [75067, 0, "s"], + [75068, 0, "a"], + [75069, 0, "m"], + [75070, 0, "e"], + [75071, 0, " "], + [75072, 0, "d"], + [75073, 0, "o"], + [75074, 0, "c"], + [75075, 0, "u"], + [75076, 0, "m"], + [75077, 0, "e"], + [75078, 0, "n"], + [75079, 0, "t"], + [75080, 0, " "], + [75081, 0, "s"], + [75082, 0, "t"], + [75083, 0, "a"], + [75084, 0, "t"], + [75085, 0, "e"], + [75086, 0, " "], + [75087, 0, "a"], + [75088, 0, "s"], + [75089, 0, " "], + [75090, 0, "a"], + [75091, 0, "p"], + [75092, 0, "p"], + [75093, 0, "l"], + [75094, 0, "y"], + [75095, 0, "i"], + [75096, 0, "n"], + [75097, 0, "g"], + [75098, 0, " "], + [75099, 0, "$"], + [75100, 0, "H"], + [75101, 0, "-"], + [75102, 0, "Q"], + [75102, 1], + [75101, 1], + [75101, 0, "_"], + [75102, 0, "q"], + [75103, 0, "$"], + [75104, 0, ","], + [75105, 0, " "], + [75106, 0, "w"], + [75107, 0, "e"], + [75108, 0, " "], + [75109, 0, "c"], + [75110, 0, "a"], + [75111, 0, "n"], + [75112, 0, " "], + [75113, 0, "c"], + [75114, 0, "o"], + [75115, 0, "n"], + [75116, 0, "s"], + [75117, 0, "t"], + [75118, 0, "r"], + [75119, 0, "u"], + [75120, 0, "c"], + [75121, 0, "t"], + [75122, 0, " "], + [75123, 0, "n"], + [75124, 0, "e"], + [75125, 0, "w"], + [75126, 0, " "], + [75127, 0, "h"], + [75128, 0, "i"], + [75129, 0, "s"], + [75130, 0, "t"], + [75131, 0, "o"], + [75132, 0, "r"], + [75133, 0, "i"], + [75134, 0, "e"], + [75135, 0, "s"], + [75136, 0, " "], + [75137, 0, "o"], + [75138, 0, "f"], + [75139, 0, " "], + [75140, 0, "l"], + [75141, 0, "e"], + [75142, 0, "n"], + [75143, 0, "g"], + [75144, 0, "t"], + [75145, 0, "h"], + [75146, 0, " "], + [75147, 0, "$"], + [75148, 0, "n"], + [75149, 0, "+"], + [75150, 0, "1"], + [75151, 0, "$"], + [75152, 0, " "], + [75153, 0, "b"], + [75154, 0, "y"], + [75155, 0, " "], + [75156, 0, "i"], + [75157, 0, "n"], + [75158, 0, "s"], + [75159, 0, "e"], + [75160, 0, "r"], + [75161, 0, "t"], + [75162, 0, "i"], + [75163, 0, "n"], + [75164, 0, "g"], + [75165, 0, " "], + [75166, 0, "a"], + [75167, 0, " "], + [75168, 0, "n"], + [75169, 0, "e"], + [75170, 0, "w"], + [75171, 0, " "], + [75172, 0, "o"], + [75173, 0, "p"], + [75174, 0, "e"], + [75175, 0, "r"], + [75176, 0, "a"], + [75177, 0, "t"], + [75178, 0, "i"], + [75179, 0, "o"], + [75180, 0, "n"], + [75181, 0, " "], + [75182, 0, "$"], + [75183, 0, "o"], + [75184, 0, "_"], + [75185, 0, "{"], + [75186, 0, "n"], + [75187, 0, "+"], + [75188, 0, "1"], + [75189, 0, "}"], + [75190, 0, "$"], + [75191, 0, " "], + [75192, 0, "i"], + [75193, 0, "n"], + [75194, 0, " "], + [75195, 0, "a"], + [75196, 0, "n"], + [75197, 0, "y"], + [75198, 0, " "], + [75198, 1], + [75197, 1], + [75196, 1], + [75195, 1], + [75194, 1], + [75193, 1], + [75192, 1], + [75192, 0, "a"], + [75193, 0, "t"], + [75194, 0, " "], + [75195, 0, "a"], + [75196, 0, "n"], + [75197, 0, "y"], + [75198, 0, " "], + [75199, 0, "c"], + [75200, 0, "a"], + [75201, 0, "u"], + [75202, 0, "s"], + [75203, 0, "a"], + [75204, 0, "l"], + [75205, 0, "l"], + [75206, 0, "y"], + [75207, 0, " "], + [75208, 0, "r"], + [75209, 0, "e"], + [75210, 0, "a"], + [75211, 0, "d"], + [75212, 0, "y"], + [75213, 0, " "], + [75214, 0, "p"], + [75215, 0, "o"], + [75216, 0, "s"], + [75217, 0, "i"], + [75218, 0, "t"], + [75219, 0, "i"], + [75220, 0, "o"], + [75221, 0, "n"], + [75222, 0, " "], + [75223, 0, "i"], + [75224, 0, "n"], + [75225, 0, " "], + [75226, 0, "e"], + [75227, 0, "i"], + [75228, 0, "t"], + [75229, 0, "h"], + [75230, 0, "e"], + [75231, 0, "r"], + [75232, 0, " "], + [75233, 0, "$"], + [75234, 0, "H"], + [75235, 0, "_"], + [75236, 0, "p"], + [75237, 0, "$"], + [75238, 0, " "], + [75239, 0, "o"], + [75240, 0, "r"], + [75241, 0, " "], + [75242, 0, "$"], + [75232, 1], + [75231, 1], + [75230, 1], + [75229, 1], + [75228, 1], + [75227, 1], + [75226, 1], + [75225, 1], + [75225, 0, " "], + [75136, 0, " "], + [75137, 0, "$"], + [75138, 0, "H"], + [75139, 0, "_"], + [75140, 0, "p"], + [75141, 0, "'"], + [75142, 0, "$"], + [75143, 0, " "], + [75144, 0, "a"], + [75145, 0, "n"], + [75146, 0, "d"], + [75147, 0, " "], + [75148, 0, "$"], + [75149, 0, "H"], + [75150, 0, "_"], + [75151, 0, "q"], + [75152, 0, "'"], + [75153, 0, "$"], + [75254, 0, "H"], + [75255, 0, "_"], + [75256, 0, "q"], + [75257, 0, "$"], + [75258, 0, " "], + [75259, 0, "r"], + [75260, 0, "e"], + [75261, 0, "s"], + [75262, 0, "p"], + [75263, 0, "e"], + [75264, 0, "c"], + [75265, 0, "t"], + [75266, 0, "i"], + [75267, 0, "v"], + [75268, 0, "e"], + [75269, 0, "l"], + [75270, 0, "y"], + [75271, 0, "."], + [75272, 0, " "], + [75273, 0, "W"], + [75274, 0, "e"], + [75275, 0, " "], + [75276, 0, "m"], + [75277, 0, "u"], + [75278, 0, "s"], + [75279, 0, "t"], + [75280, 0, " "], + [75281, 0, "t"], + [75282, 0, "h"], + [75283, 0, "e"], + [75284, 0, "n"], + [75285, 0, " "], + [75286, 0, "s"], + [75287, 0, "h"], + [75288, 0, "o"], + [75289, 0, "w"], + [75290, 0, " "], + [75291, 0, "t"], + [75292, 0, "h"], + [75293, 0, "a"], + [75294, 0, "t"], + [75295, 0, " "], + [75296, 0, "f"], + [75297, 0, "o"], + [75298, 0, "r"], + [75299, 0, " "], + [75300, 0, "a"], + [75301, 0, "l"], + [75302, 0, "l"], + [75303, 0, " "], + [75304, 0, "t"], + [75305, 0, "h"], + [75306, 0, "e"], + [75307, 0, " "], + [75308, 0, "h"], + [75309, 0, "i"], + [75310, 0, "s"], + [75311, 0, "t"], + [75312, 0, "o"], + [75313, 0, "r"], + [75314, 0, "i"], + [75315, 0, "e"], + [75316, 0, "s"], + [75317, 0, " "], + [75318, 0, "$"], + [75319, 0, "H"], + [75320, 0, "_"], + [75321, 0, "p"], + [75322, 0, "'"], + [75323, 0, "$"], + [75324, 0, " "], + [75325, 0, "a"], + [75326, 0, "n"], + [75327, 0, "d"], + [75328, 0, " "], + [75329, 0, "$"], + [75330, 0, "H"], + [75331, 0, "_"], + [75332, 0, "q"], + [75333, 0, "'"], + [75334, 0, "$"], + [75335, 0, " "], + [75336, 0, "c"], + [75337, 0, "o"], + [75338, 0, "n"], + [75339, 0, "s"], + [75340, 0, "t"], + [75341, 0, "r"], + [75342, 0, "u"], + [75343, 0, "c"], + [75344, 0, "t"], + [75345, 0, "e"], + [75346, 0, "d"], + [75347, 0, " "], + [75348, 0, "t"], + [75349, 0, "h"], + [75350, 0, "i"], + [75351, 0, "s"], + [75352, 0, " "], + [75353, 0, "w"], + [75354, 0, "a"], + [75355, 0, "y"], + [75356, 0, ","], + [75357, 0, " "], + [75358, 0, "a"], + [75359, 0, "p"], + [75360, 0, "p"], + [75361, 0, "l"], + [75362, 0, "y"], + [75363, 0, "i"], + [75364, 0, "n"], + [75365, 0, "g"], + [75366, 0, " "], + [75367, 0, "t"], + [75368, 0, "h"], + [75369, 0, "e"], + [75370, 0, " "], + [75371, 0, "o"], + [75372, 0, "p"], + [75373, 0, "e"], + [75374, 0, "r"], + [75375, 0, "a"], + [75376, 0, "t"], + [75377, 0, "i"], + [75378, 0, "o"], + [75379, 0, "n"], + [75380, 0, "s"], + [75381, 0, " "], + [75382, 0, "i"], + [75383, 0, "n"], + [75384, 0, " "], + [75385, 0, "o"], + [75386, 0, "r"], + [75387, 0, "d"], + [75388, 0, "e"], + [75389, 0, "r"], + [75390, 0, " "], + [75391, 0, "r"], + [75392, 0, "e"], + [75393, 0, "s"], + [75394, 0, "u"], + [75395, 0, "l"], + [75396, 0, "t"], + [75397, 0, "s"], + [75398, 0, " "], + [75399, 0, "i"], + [75400, 0, "n"], + [75401, 0, " "], + [75402, 0, "t"], + [75403, 0, "h"], + [75404, 0, "e"], + [75405, 0, " "], + [75406, 0, "s"], + [75407, 0, "a"], + [75408, 0, "m"], + [75409, 0, "e"], + [75410, 0, " "], + [75411, 0, "f"], + [75412, 0, "i"], + [75413, 0, "n"], + [75414, 0, "a"], + [75415, 0, "l"], + [75416, 0, " "], + [75416, 1], + [75415, 1], + [75414, 1], + [75413, 1], + [75412, 1], + [75411, 1], + [75411, 0, "d"], + [75412, 0, "o"], + [75413, 0, "c"], + [75414, 0, "u"], + [75415, 0, "m"], + [75416, 0, "e"], + [75417, 0, "n"], + [75418, 0, "t"], + [75419, 0, " "], + [75420, 0, "s"], + [75421, 0, "t"], + [75422, 0, "a"], + [75423, 0, "t"], + [75424, 0, "e"], + [75425, 0, "."], + [75371, 0, "s"], + [75372, 0, "e"], + [75373, 0, "q"], + [75374, 0, "u"], + [75375, 0, "e"], + [75376, 0, "n"], + [75377, 0, "c"], + [75378, 0, "e"], + [75379, 0, " "], + [75380, 0, "o"], + [75381, 0, "f"], + [75382, 0, " "], + [75438, 0, "\n"], + [75439, 0, "\n"], + [75440, 0, "I"], + [75441, 0, "n"], + [75442, 0, " "], + [75443, 0, "o"], + [75444, 0, "r"], + [75445, 0, "d"], + [75446, 0, "e"], + [75447, 0, "r"], + [75448, 0, " "], + [75449, 0, "t"], + [75450, 0, "o"], + [75451, 0, " "], + [75452, 0, "p"], + [75453, 0, "r"], + [75454, 0, "o"], + [75455, 0, "v"], + [75456, 0, "e"], + [75457, 0, " "], + [75458, 0, "t"], + [75459, 0, "h"], + [75460, 0, "e"], + [75461, 0, " "], + [75462, 0, "i"], + [75463, 0, "n"], + [75464, 0, "d"], + [75465, 0, "u"], + [75466, 0, "c"], + [75467, 0, "t"], + [75468, 0, "i"], + [75469, 0, "o"], + [75470, 0, "n"], + [75471, 0, " "], + [75472, 0, "s"], + [75473, 0, "t"], + [75474, 0, "e"], + [75475, 0, "p"], + [75476, 0, ","], + [75477, 0, " "], + [75478, 0, "w"], + [75479, 0, "e"], + [75480, 0, " "], + [75481, 0, "e"], + [75482, 0, "x"], + [75483, 0, "a"], + [75484, 0, "m"], + [75485, 0, "i"], + [75486, 0, "n"], + [75487, 0, "e"], + [75488, 0, " "], + [75489, 0, "t"], + [75490, 0, "h"], + [75491, 0, "e"], + [75492, 0, " "], + [75493, 0, "i"], + [75494, 0, "n"], + [75495, 0, "s"], + [75496, 0, "e"], + [75497, 0, "r"], + [75498, 0, "t"], + [75499, 0, "i"], + [75500, 0, "o"], + [75501, 0, "n"], + [75502, 0, " "], + [75503, 0, "o"], + [75504, 0, "f"], + [75505, 0, " "], + [75506, 0, "$"], + [75507, 0, "o"], + [75508, 0, "_"], + [75509, 0, "{"], + [75510, 0, "n"], + [75511, 0, "+"], + [75512, 0, "1"], + [75513, 0, "}"], + [75514, 0, "$"], + [75515, 0, " "], + [75516, 0, "i"], + [75517, 0, "n"], + [75518, 0, "t"], + [75519, 0, "o"], + [75520, 0, " "], + [75521, 0, "$"], + [75522, 0, "H"], + [75523, 0, "_"], + [75524, 0, "p"], + [75525, 0, "$"], + [75526, 0, " "], + [75527, 0, "a"], + [75528, 0, "n"], + [75529, 0, "d"], + [75530, 0, " "], + [75531, 0, "$"], + [75532, 0, "H"], + [75533, 0, "_"], + [75534, 0, "q"], + [75535, 0, "$"], + [75536, 0, "."], + [75537, 0, " "], + [75538, 0, "E"], + [75539, 0, "a"], + [75540, 0, "c"], + [75541, 0, "h"], + [75542, 0, " "], + [75543, 0, "h"], + [75544, 0, "i"], + [75545, 0, "s"], + [75546, 0, "t"], + [75547, 0, "o"], + [75548, 0, "r"], + [75549, 0, "y"], + [75550, 0, " "], + [75551, 0, "c"], + [75552, 0, "a"], + [75553, 0, "n"], + [75554, 0, " "], + [75555, 0, "b"], + [75556, 0, "e"], + [75557, 0, " "], + [75558, 0, "s"], + [75559, 0, "p"], + [75560, 0, "l"], + [75561, 0, "i"], + [75562, 0, "t"], + [75563, 0, " "], + [75564, 0, "i"], + [75565, 0, "n"], + [75566, 0, "t"], + [75567, 0, "o"], + [75568, 0, " "], + [75569, 0, "a"], + [75570, 0, " "], + [75571, 0, "p"], + [75572, 0, "r"], + [75573, 0, "e"], + [75574, 0, "f"], + [75575, 0, "i"], + [75576, 0, "x"], + [75577, 0, ","], + [75578, 0, " "], + [75579, 0, "w"], + [75580, 0, "h"], + [75581, 0, "i"], + [75582, 0, "c"], + [75583, 0, "h"], + [75584, 0, " "], + [75585, 0, "i"], + [75586, 0, "s"], + [75587, 0, " "], + [75588, 0, "t"], + [75589, 0, "h"], + [75590, 0, "e"], + [75591, 0, " "], + [75592, 0, "m"], + [75593, 0, "i"], + [75594, 0, "n"], + [75595, 0, "i"], + [75596, 0, "m"], + [75597, 0, "a"], + [75598, 0, "l"], + [75599, 0, " "], + [75600, 0, "s"], + [75601, 0, "u"], + [75602, 0, "b"], + [75603, 0, "s"], + [75604, 0, "e"], + [75605, 0, "q"], + [75606, 0, "u"], + [75607, 0, "e"], + [75608, 0, "n"], + [75609, 0, "c"], + [75610, 0, "e"], + [75611, 0, " "], + [75612, 0, "$"], + [75613, 0, "\\"], + [75614, 0, "l"], + [75615, 0, "a"], + [75616, 0, "n"], + [75617, 0, "g"], + [75618, 0, "l"], + [75619, 0, "e"], + [75620, 0, " "], + [75621, 0, "o"], + [75622, 0, "_"], + [75623, 0, "1"], + [75624, 0, ","], + [75625, 0, " "], + [75626, 0, "\\"], + [75627, 0, "d"], + [75628, 0, "o"], + [75629, 0, "t"], + [75630, 0, "s"], + [75631, 0, ","], + [75632, 0, " "], + [75633, 0, "o"], + [75634, 0, "_"], + [75635, 0, "j"], + [75636, 0, " "], + [75637, 0, "\\"], + [75638, 0, "r"], + [75639, 0, "a"], + [75640, 0, "n"], + [75641, 0, "g"], + [75642, 0, "l"], + [75643, 0, "e"], + [75644, 0, "$"], + [75645, 0, " "], + [75646, 0, "s"], + [75647, 0, "u"], + [75648, 0, "c"], + [75649, 0, "h"], + [75650, 0, " "], + [75651, 0, "t"], + [75652, 0, "h"], + [75653, 0, "a"], + [75654, 0, "t"], + [75655, 0, " "], + [75656, 0, "$"], + [75657, 0, "o"], + [75658, 0, "_"], + [75659, 0, "{"], + [75660, 0, "n"], + [75661, 0, "+"], + [75662, 0, "1"], + [75663, 0, "}"], + [75664, 0, "."], + [75665, 0, "\\"], + [75666, 0, "m"], + [75667, 0, "a"], + [75668, 0, "t"], + [75669, 0, "h"], + [75670, 0, "i"], + [75671, 0, "t"], + [75672, 0, "{"], + [75673, 0, "d"], + [75674, 0, "e"], + [75675, 0, "p"], + [75676, 0, "s"], + [75677, 0, "}"], + [75678, 0, " "], + [75679, 0, "\\"], + [75680, 0, "s"], + [75681, 0, "u"], + [75682, 0, "b"], + [75683, 0, "s"], + [75684, 0, "e"], + [75685, 0, "t"], + [75686, 0, "e"], + [75687, 0, "q"], + [75688, 0, " "], + [75689, 0, "\\"], + [75690, 0, "{"], + [75691, 0, "o"], + [75692, 0, "_"], + [75693, 0, "1"], + [75694, 0, "."], + [75695, 0, "\\"], + [75696, 0, "m"], + [75697, 0, "a"], + [75698, 0, "t"], + [75699, 0, "h"], + [75700, 0, "i"], + [75701, 0, "t"], + [75702, 0, "{"], + [75703, 0, "i"], + [75704, 0, "d"], + [75705, 0, "}"], + [75706, 0, ","], + [75707, 0, " "], + [75708, 0, "\\"], + [75709, 0, "d"], + [75710, 0, "o"], + [75711, 0, "t"], + [75712, 0, "s"], + [75713, 0, ","], + [75714, 0, " "], + [75715, 0, "o"], + [75716, 0, "_"], + [75717, 0, "j"], + [75718, 0, "."], + [75719, 0, "\\"], + [75720, 0, "m"], + [75721, 0, "a"], + [75722, 0, "t"], + [75723, 0, "h"], + [75724, 0, "i"], + [75725, 0, "t"], + [75726, 0, "{"], + [75727, 0, "i"], + [75728, 0, "d"], + [75729, 0, "}"], + [75730, 0, "\\"], + [75731, 0, "}"], + [75732, 0, "$"], + [75733, 0, ","], + [75734, 0, " "], + [75735, 0, "a"], + [75736, 0, "n"], + [75737, 0, "d"], + [75738, 0, " "], + [75739, 0, "a"], + [75740, 0, " "], + [75741, 0, "p"], + [75742, 0, "r"], + [75743, 0, "e"], + [75744, 0, "f"], + [75745, 0, "i"], + [75746, 0, "x"], + [75747, 0, ","], + [75748, 0, " "], + [75749, 0, "w"], + [75750, 0, "h"], + [75751, 0, "i"], + [75752, 0, "c"], + [75753, 0, "h"], + [75754, 0, " "], + [75755, 0, "i"], + [75756, 0, "s"], + [75757, 0, " "], + [75758, 0, "t"], + [75759, 0, "h"], + [75760, 0, "e"], + [75761, 0, " "], + [75762, 0, "r"], + [75763, 0, "e"], + [75764, 0, "m"], + [75765, 0, "a"], + [75766, 0, "i"], + [75767, 0, "n"], + [75768, 0, "i"], + [75769, 0, "n"], + [75770, 0, "g"], + [75771, 0, " "], + [75772, 0, "s"], + [75773, 0, "e"], + [75774, 0, "q"], + [75775, 0, "u"], + [75776, 0, "e"], + [75777, 0, "n"], + [75778, 0, "c"], + [75779, 0, "e"], + [75780, 0, " "], + [75781, 0, "$"], + [75782, 0, "\\"], + [75783, 0, "l"], + [75784, 0, "a"], + [75785, 0, "n"], + [75786, 0, "g"], + [75787, 0, "l"], + [75788, 0, "e"], + [75789, 0, " "], + [75790, 0, "o"], + [75791, 0, "_"], + [75792, 0, "{"], + [75793, 0, "j"], + [75794, 0, "+"], + [75795, 0, "1"], + [75796, 0, "}"], + [75797, 0, ","], + [75798, 0, " "], + [75799, 0, "\\"], + [75800, 0, "d"], + [75801, 0, "o"], + [75802, 0, "t"], + [75803, 0, "s"], + [75804, 0, ","], + [75805, 0, " "], + [75806, 0, "o"], + [75807, 0, "_"], + [75808, 0, "n"], + [75809, 0, " "], + [75810, 0, "\\"], + [75811, 0, "r"], + [75812, 0, "a"], + [75813, 0, "n"], + [75814, 0, "g"], + [75815, 0, "l"], + [75816, 0, "e"], + [75817, 0, "$"], + [75818, 0, "."], + [75819, 0, " "], + [75820, 0, "T"], + [75821, 0, "h"], + [75822, 0, "e"], + [75823, 0, " "], + [75824, 0, "e"], + [75825, 0, "a"], + [75826, 0, "r"], + [75827, 0, "l"], + [75828, 0, "i"], + [75829, 0, "e"], + [75830, 0, "s"], + [75831, 0, "t"], + [75832, 0, " "], + [75833, 0, "p"], + [75834, 0, "o"], + [75835, 0, "s"], + [75836, 0, "i"], + [75837, 0, "t"], + [75838, 0, "i"], + [75839, 0, "o"], + [75840, 0, "n"], + [75841, 0, " "], + [75842, 0, "w"], + [75843, 0, "h"], + [75844, 0, "e"], + [75845, 0, "r"], + [75846, 0, "e"], + [75847, 0, " "], + [75848, 0, "$"], + [75849, 0, "o"], + [75850, 0, "_"], + [75851, 0, "{"], + [75852, 0, "n"], + [75853, 0, "+"], + [75854, 0, "1"], + [75855, 0, "}"], + [75856, 0, "$"], + [75857, 0, " "], + [75858, 0, "c"], + [75859, 0, "a"], + [75860, 0, "n"], + [75861, 0, " "], + [75862, 0, "b"], + [75863, 0, "e"], + [75864, 0, " "], + [75865, 0, "i"], + [75866, 0, "n"], + [75867, 0, "s"], + [75868, 0, "e"], + [75869, 0, "r"], + [75870, 0, "t"], + [75871, 0, "e"], + [75872, 0, "d"], + [75873, 0, " "], + [75874, 0, "i"], + [75875, 0, "n"], + [75876, 0, "t"], + [75877, 0, "o"], + [75878, 0, " "], + [75879, 0, "t"], + [75880, 0, "h"], + [75881, 0, "e"], + [75882, 0, " "], + [75883, 0, "h"], + [75884, 0, "i"], + [75885, 0, "s"], + [75886, 0, "t"], + [75887, 0, "o"], + [75888, 0, "r"], + [75889, 0, "y"], + [75890, 0, " "], + [75891, 0, "i"], + [75892, 0, "s"], + [75893, 0, " "], + [75894, 0, "b"], + [75895, 0, "e"], + [75896, 0, "t"], + [75897, 0, "w"], + [75898, 0, "e"], + [75899, 0, "e"], + [75900, 0, "n"], + [75901, 0, " "], + [75902, 0, "t"], + [75903, 0, "h"], + [75904, 0, "e"], + [75905, 0, " "], + [75906, 0, "p"], + [75907, 0, "r"], + [75908, 0, "e"], + [75909, 0, "f"], + [75910, 0, "i"], + [75911, 0, "x"], + [75912, 0, " "], + [75913, 0, "a"], + [75914, 0, "n"], + [75915, 0, "d"], + [75916, 0, " "], + [75917, 0, "t"], + [75918, 0, "h"], + [75919, 0, "e"], + [75920, 0, " "], + [75921, 0, "s"], + [75922, 0, "u"], + [75923, 0, "f"], + [75924, 0, "f"], + [75925, 0, "i"], + [75926, 0, "x"], + [75927, 0, ";"], + [75928, 0, " "], + [75929, 0, "t"], + [75930, 0, "h"], + [75931, 0, "e"], + [75932, 0, " "], + [75933, 0, "l"], + [75934, 0, "a"], + [75935, 0, "t"], + [75936, 0, "e"], + [75937, 0, "s"], + [75938, 0, "t"], + [75939, 0, " "], + [75940, 0, "p"], + [75941, 0, "o"], + [75942, 0, "s"], + [75943, 0, "i"], + [75944, 0, "t"], + [75945, 0, "i"], + [75946, 0, "o"], + [75947, 0, "n"], + [75948, 0, " "], + [75949, 0, "i"], + [75950, 0, "s"], + [75951, 0, " "], + [75952, 0, "a"], + [75953, 0, "t"], + [75954, 0, " "], + [75955, 0, "t"], + [75956, 0, "h"], + [75957, 0, "e"], + [75958, 0, " "], + [75959, 0, "e"], + [75960, 0, "n"], + [75961, 0, "d"], + [75962, 0, " "], + [75963, 0, "o"], + [75964, 0, "f"], + [75965, 0, " "], + [75966, 0, "t"], + [75967, 0, "h"], + [75968, 0, "e"], + [75969, 0, " "], + [75970, 0, "s"], + [75971, 0, "u"], + [75972, 0, "f"], + [75973, 0, "f"], + [75974, 0, "i"], + [75975, 0, "x"], + [75976, 0, ";"], + [75977, 0, " "], + [75978, 0, "o"], + [75979, 0, "r"], + [75980, 0, " "], + [75981, 0, "i"], + [75982, 0, "t"], + [75983, 0, " "], + [75984, 0, "c"], + [75985, 0, "o"], + [75986, 0, "u"], + [75987, 0, "l"], + [75988, 0, "d"], + [75989, 0, " "], + [75990, 0, "b"], + [75991, 0, "e"], + [75992, 0, " "], + [75993, 0, "i"], + [75994, 0, "n"], + [75995, 0, "s"], + [75996, 0, "e"], + [75997, 0, "r"], + [75998, 0, "t"], + [75999, 0, "e"], + [76000, 0, "d"], + [76001, 0, " "], + [76002, 0, "a"], + [76003, 0, "t"], + [76004, 0, " "], + [76005, 0, "a"], + [76006, 0, "n"], + [76007, 0, "y"], + [76008, 0, " "], + [76009, 0, "p"], + [76010, 0, "o"], + [76011, 0, "i"], + [76012, 0, "n"], + [76013, 0, "t"], + [76014, 0, " "], + [76015, 0, "w"], + [76016, 0, "i"], + [76017, 0, "t"], + [76018, 0, "h"], + [76019, 0, "i"], + [76020, 0, "n"], + [76021, 0, " "], + [76022, 0, "t"], + [76023, 0, "h"], + [76024, 0, "e"], + [76025, 0, " "], + [76026, 0, "s"], + [76027, 0, "u"], + [76028, 0, "f"], + [76029, 0, "f"], + [76030, 0, "i"], + [76031, 0, "x"], + [76032, 0, "."], + [75743, 1], + [75742, 1], + [75741, 1], + [75741, 0, "s"], + [75742, 0, "u"], + [75743, 0, "f"], + [75772, 0, "s"], + [75773, 0, "u"], + [75774, 0, "b"], + [76036, 0, "\n"], + [76037, 0, "\n"], + [76038, 0, "W"], + [76039, 0, "e"], + [76040, 0, " "], + [76041, 0, "s"], + [76042, 0, "h"], + [76043, 0, "o"], + [76044, 0, "w"], + [76045, 0, " "], + [76046, 0, "t"], + [76047, 0, "h"], + [76048, 0, "a"], + [76049, 0, "t"], + [76050, 0, " "], + [76051, 0, "t"], + [76052, 0, "h"], + [76053, 0, "e"], + [76054, 0, " "], + [76055, 0, "e"], + [76056, 0, "f"], + [76057, 0, "f"], + [76058, 0, "e"], + [76059, 0, "c"], + [76060, 0, "t"], + [76061, 0, " "], + [76062, 0, "o"], + [76063, 0, "n"], + [76064, 0, " "], + [76065, 0, "t"], + [76066, 0, "h"], + [76067, 0, "e"], + [76068, 0, " "], + [76069, 0, "d"], + [76070, 0, "o"], + [76071, 0, "c"], + [76072, 0, "u"], + [76073, 0, "m"], + [76074, 0, "e"], + [76075, 0, "n"], + [76076, 0, "t"], + [76077, 0, " "], + [76078, 0, "s"], + [76079, 0, "t"], + [76080, 0, "a"], + [76081, 0, "t"], + [76082, 0, "e"], + [76083, 0, " "], + [76084, 0, "i"], + [76085, 0, "s"], + [76086, 0, " "], + [76087, 0, "t"], + [76088, 0, "h"], + [76089, 0, "e"], + [76090, 0, " "], + [76091, 0, "s"], + [76092, 0, "a"], + [76093, 0, "m"], + [76094, 0, "e"], + [76095, 0, ","], + [76096, 0, " "], + [76097, 0, "r"], + [76098, 0, "e"], + [76099, 0, "g"], + [76100, 0, "a"], + [76101, 0, "r"], + [76102, 0, "d"], + [76103, 0, "l"], + [76104, 0, "e"], + [76105, 0, "s"], + [76106, 0, "s"], + [76107, 0, " "], + [76108, 0, "o"], + [76109, 0, "f"], + [76110, 0, " "], + [76111, 0, "t"], + [76112, 0, "h"], + [76113, 0, "e"], + [76114, 0, " "], + [76115, 0, "p"], + [76116, 0, "o"], + [76117, 0, "s"], + [76118, 0, "i"], + [76119, 0, "t"], + [76120, 0, "i"], + [76121, 0, "o"], + [76122, 0, "n"], + [76123, 0, " "], + [76124, 0, "a"], + [76125, 0, "t"], + [76126, 0, " "], + [76127, 0, "w"], + [76128, 0, "h"], + [76129, 0, "i"], + [76130, 0, "c"], + [76131, 0, "h"], + [76132, 0, " "], + [76133, 0, "$"], + [76134, 0, "o"], + [76135, 0, "_"], + [76136, 0, "{"], + [76137, 0, "n"], + [76138, 0, "+"], + [76139, 0, "1"], + [76140, 0, "}"], + [76141, 0, "$"], + [76142, 0, " "], + [76143, 0, "i"], + [76144, 0, "s"], + [76145, 0, " "], + [76146, 0, "i"], + [76147, 0, "n"], + [76148, 0, "s"], + [76149, 0, "e"], + [76150, 0, "r"], + [76151, 0, "t"], + [76152, 0, "e"], + [76153, 0, "d"], + [76154, 0, ","], + [76155, 0, " "], + [76156, 0, "a"], + [76157, 0, "n"], + [76158, 0, "d"], + [76159, 0, " "], + [76160, 0, "r"], + [76161, 0, "e"], + [76162, 0, "g"], + [76163, 0, "a"], + [76164, 0, "r"], + [76165, 0, "d"], + [76166, 0, "l"], + [76167, 0, "e"], + [76168, 0, "s"], + [76169, 0, "s"], + [76170, 0, " "], + [76171, 0, "o"], + [76172, 0, "f"], + [76173, 0, " "], + [76174, 0, "w"], + [76175, 0, "h"], + [76176, 0, "e"], + [76177, 0, "t"], + [76178, 0, "h"], + [76179, 0, "e"], + [76180, 0, "r"], + [76181, 0, " "], + [76182, 0, "i"], + [76183, 0, "t"], + [76184, 0, " "], + [76185, 0, "i"], + [76186, 0, "s"], + [76187, 0, " "], + [76188, 0, "i"], + [76189, 0, "n"], + [76190, 0, "s"], + [76191, 0, "e"], + [76192, 0, "r"], + [76193, 0, "t"], + [76194, 0, "e"], + [76195, 0, "d"], + [76196, 0, " "], + [76197, 0, "i"], + [76198, 0, "n"], + [76199, 0, "o"], + [76199, 1], + [76199, 0, "t"], + [76200, 0, "o"], + [76201, 0, " "], + [76202, 0, "$"], + [76203, 0, "H"], + [76204, 0, "_"], + [76205, 0, "p"], + [76206, 0, "R"], + [76207, 0, "$"], + [76207, 1], + [76206, 1], + [76206, 0, "$"], + [76207, 0, " "], + [76208, 0, "o"], + [76209, 0, "r"], + [76210, 0, " "], + [76211, 0, "$"], + [76212, 0, "H"], + [76213, 0, "-"], + [76213, 1], + [76213, 0, "_"], + [76214, 0, "q"], + [76215, 0, "$"], + [76216, 0, "."], + [76217, 0, " "], + [76218, 0, "W"], + [76219, 0, "e"], + [76220, 0, " "], + [76221, 0, "d"], + [76222, 0, "o"], + [76223, 0, " "], + [76224, 0, "t"], + [76225, 0, "h"], + [76226, 0, "i"], + [76227, 0, "s"], + [76228, 0, " "], + [76229, 0, "b"], + [76230, 0, "y"], + [76231, 0, " "], + [76232, 0, "s"], + [76233, 0, "h"], + [76234, 0, "o"], + [76235, 0, "w"], + [76236, 0, "i"], + [76237, 0, "n"], + [76238, 0, "g"], + [76239, 0, " "], + [76240, 0, "t"], + [76241, 0, "h"], + [76242, 0, "a"], + [76243, 0, "t"], + [76244, 0, " "], + [76245, 0, "$"], + [76246, 0, "o"], + [76247, 0, "_"], + [76248, 0, "{"], + [76249, 0, "n"], + [76250, 0, "+"], + [76251, 0, "1"], + [76252, 0, "}"], + [76253, 0, "$"], + [76254, 0, " "], + [76255, 0, "i"], + [76256, 0, "s"], + [76257, 0, " "], + [76258, 0, "c"], + [76259, 0, "o"], + [76260, 0, "m"], + [76261, 0, "m"], + [76262, 0, "u"], + [76263, 0, "t"], + [76264, 0, "a"], + [76265, 0, "t"], + [76266, 0, "i"], + [76267, 0, "v"], + [76268, 0, "e"], + [76269, 0, " "], + [76270, 0, "w"], + [76271, 0, "i"], + [76272, 0, "t"], + [76273, 0, "h"], + [76274, 0, " "], + [76275, 0, "r"], + [76276, 0, "e"], + [76277, 0, "s"], + [76278, 0, "p"], + [76279, 0, "e"], + [76280, 0, "c"], + [76281, 0, "t"], + [76282, 0, " "], + [76283, 0, "t"], + [76284, 0, "o"], + [76285, 0, " "], + [76286, 0, "a"], + [76287, 0, "l"], + [76288, 0, "l"], + [76289, 0, " "], + [76290, 0, "o"], + [76291, 0, "p"], + [76292, 0, "e"], + [76293, 0, "r"], + [76294, 0, "a"], + [76295, 0, "t"], + [76296, 0, "i"], + [76297, 0, "o"], + [76298, 0, "n"], + [76299, 0, "s"], + [76300, 0, " "], + [76301, 0, "i"], + [76302, 0, "n"], + [76303, 0, " "], + [76304, 0, "t"], + [76305, 0, "h"], + [76306, 0, "e"], + [76307, 0, " "], + [76308, 0, "s"], + [76309, 0, "u"], + [76310, 0, "f"], + [76311, 0, "f"], + [76312, 0, "i"], + [76313, 0, "x"], + [76314, 0, ","], + [76315, 0, " "], + [76316, 0, "i"], + [76317, 0, "."], + [76318, 0, "e"], + [76319, 0, "."], + [76320, 0, " "], + [76321, 0, "w"], + [76322, 0, "i"], + [76323, 0, "t"], + [76324, 0, "h"], + [76325, 0, " "], + [76326, 0, "r"], + [76327, 0, "e"], + [76328, 0, "s"], + [76329, 0, "p"], + [76330, 0, "e"], + [76331, 0, "c"], + [76332, 0, "t"], + [76333, 0, " "], + [76334, 0, "t"], + [76335, 0, "o"], + [76336, 0, " "], + [76337, 0, "a"], + [76338, 0, "l"], + [76339, 0, "l"], + [76340, 0, " "], + [76341, 0, "o"], + [76342, 0, "p"], + [76343, 0, "e"], + [76344, 0, "r"], + [76345, 0, "a"], + [76346, 0, "t"], + [76347, 0, "i"], + [76348, 0, "o"], + [76349, 0, "n"], + [76350, 0, "s"], + [76351, 0, " "], + [76352, 0, "t"], + [76353, 0, "h"], + [76354, 0, "a"], + [76355, 0, "t"], + [76356, 0, " "], + [76357, 0, "a"], + [76358, 0, "r"], + [76359, 0, "e"], + [76360, 0, " "], + [76361, 0, "c"], + [76362, 0, "o"], + [76363, 0, "n"], + [76364, 0, "c"], + [76365, 0, "u"], + [76366, 0, "r"], + [76367, 0, "r"], + [76368, 0, "e"], + [76369, 0, "n"], + [76370, 0, "t"], + [76371, 0, " "], + [76372, 0, "t"], + [76373, 0, "o"], + [76374, 0, " "], + [76375, 0, "$"], + [76376, 0, "O"], + [76377, 0, "-"], + [76377, 1], + [76376, 1], + [76376, 0, "o"], + [76377, 0, "_"], + [76378, 0, "{"], + [76379, 0, "n"], + [76380, 0, "+"], + [76381, 0, "1"], + [76382, 0, "}"], + [76383, 0, "$"], + [76384, 0, "."], + [76385, 0, " "], + [76386, 0, "W"], + [76387, 0, "e"], + [76388, 0, " "], + [76389, 0, "d"], + [76390, 0, "e"], + [76391, 0, "m"], + [76392, 0, "o"], + [76393, 0, "n"], + [76394, 0, "s"], + [76395, 0, "t"], + [76396, 0, "r"], + [76397, 0, "a"], + [76398, 0, "t"], + [76399, 0, "e"], + [76400, 0, " "], + [76401, 0, "t"], + [76402, 0, "h"], + [76403, 0, "i"], + [76404, 0, "s"], + [76405, 0, " "], + [76406, 0, "c"], + [76407, 0, "o"], + [76408, 0, "m"], + [76409, 0, "m"], + [76410, 0, "u"], + [76411, 0, "t"], + [76412, 0, "a"], + [76413, 0, "t"], + [76414, 0, "i"], + [76415, 0, "v"], + [76416, 0, "i"], + [76417, 0, "t"], + [76418, 0, "y"], + [76419, 0, " "], + [76420, 0, "c"], + [76421, 0, "a"], + [76422, 0, "s"], + [76423, 0, "e"], + [76424, 0, "-"], + [76425, 0, "b"], + [76426, 0, "y"], + [76427, 0, "-"], + [76428, 0, "c"], + [76429, 0, "a"], + [76430, 0, "s"], + [76431, 0, "e"], + [76432, 0, " "], + [76433, 0, "d"], + [76434, 0, "e"], + [76435, 0, "p"], + [76436, 0, "e"], + [76437, 0, "n"], + [76438, 0, "d"], + [76439, 0, "o"], + [76440, 0, "n"], + [76440, 1], + [76439, 1], + [76439, 0, "i"], + [76440, 0, "n"], + [76441, 0, "g"], + [76442, 0, " "], + [76443, 0, "o"], + [76444, 0, "n"], + [76445, 0, " "], + [76446, 0, "t"], + [76447, 0, "h"], + [76448, 0, "e"], + [76449, 0, " "], + [76450, 0, "t"], + [76451, 0, "y"], + [76452, 0, "p"], + [76453, 0, "e"], + [76454, 0, " "], + [76455, 0, "o"], + [76456, 0, "f"], + [76457, 0, " "], + [76458, 0, "m"], + [76459, 0, "u"], + [76460, 0, "t"], + [76461, 0, "a"], + [76462, 0, "t"], + [76463, 0, "i"], + [76464, 0, "o"], + [76465, 0, "n"], + [76466, 0, " "], + [76467, 0, "i"], + [76468, 0, "n"], + [76469, 0, " "], + [76470, 0, "$"], + [76471, 0, "o"], + [76472, 0, "_"], + [76473, 0, "{"], + [76474, 0, "n"], + [76475, 0, "+"], + [76476, 0, "1"], + [76477, 0, "}"], + [76478, 0, "$"], + [76479, 0, ":"], + [76480, 0, " "], + [76481, 0, "i"], + [76482, 0, "n"], + [76483, 0, "s"], + [76484, 0, "e"], + [76485, 0, "r"], + [76486, 0, "t"], + [76487, 0, "i"], + [76488, 0, "o"], + [76489, 0, "n"], + [76490, 0, "s"], + [76491, 0, " "], + [76492, 0, "i"], + [76493, 0, "n"], + [76494, 0, " "], + [76495, 0, "L"], + [76496, 0, "e"], + [76497, 0, "m"], + [76498, 0, "m"], + [76499, 0, "a"], + [76500, 0, "~"], + [76501, 0, "\\"], + [76502, 0, "r"], + [76503, 0, "e"], + [76504, 0, "f"], + [76505, 0, "{"], + [76506, 0, "l"], + [76507, 0, "e"], + [76508, 0, "m"], + [76509, 0, ":"], + [76510, 0, "i"], + [76511, 0, "n"], + [76512, 0, "s"], + [76513, 0, "e"], + [76514, 0, "r"], + [76515, 0, "t"], + [76516, 0, "-"], + [76517, 0, "c"], + [76518, 0, "o"], + [76519, 0, "m"], + [76520, 0, "m"], + [76521, 0, "u"], + [76522, 0, "t"], + [76523, 0, "e"], + [76524, 0, "}"], + [76525, 0, ","], + [76526, 0, " "], + [76527, 0, "d"], + [76528, 0, "e"], + [76529, 0, "l"], + [76530, 0, "e"], + [76531, 0, "t"], + [76532, 0, "i"], + [76533, 0, "o"], + [76534, 0, "n"], + [76535, 0, "s"], + [76536, 0, " "], + [76537, 0, "i"], + [76538, 0, "n"], + [76539, 0, " "], + [76540, 0, "L"], + [76541, 0, "e"], + [76542, 0, "m"], + [76543, 0, "m"], + [76544, 0, "a"], + [76545, 0, "~"], + [76546, 0, "\\"], + [76547, 0, "r"], + [76548, 0, "e"], + [76549, 0, "f"], + [76550, 0, "{"], + [76551, 0, "l"], + [76552, 0, "e"], + [76553, 0, "m"], + [76554, 0, ":"], + [76555, 0, "d"], + [76556, 0, "e"], + [76557, 0, "l"], + [76558, 0, "e"], + [76559, 0, "t"], + [76560, 0, "e"], + [76561, 0, "-"], + [76562, 0, "c"], + [76563, 0, "o"], + [76564, 0, "m"], + [76565, 0, "m"], + [76566, 0, "u"], + [76567, 0, "t"], + [76568, 0, "e"], + [76569, 0, "}"], + [76490, 1], + [76534, 1], + [76568, 0, ","], + [76569, 0, " "], + [76570, 0, "a"], + [76571, 0, "n"], + [76572, 0, "d"], + [76573, 0, " "], + [76574, 0, "a"], + [76575, 0, "s"], + [76576, 0, "s"], + [76577, 0, "i"], + [76578, 0, "g"], + [76579, 0, "n"], + [76580, 0, "m"], + [76581, 0, "e"], + [76582, 0, "n"], + [76583, 0, "t"], + [76584, 0, " "], + [76585, 0, "i"], + [76586, 0, "n"], + [76587, 0, " "], + [76588, 0, "L"], + [76589, 0, "e"], + [76590, 0, "m"], + [76591, 0, "m"], + [76592, 0, "a"], + [76593, 0, "~"], + [76594, 0, "\\"], + [76595, 0, "r"], + [76596, 0, "e"], + [76597, 0, "f"], + [76598, 0, "{"], + [76599, 0, "l"], + [76600, 0, "e"], + [76601, 0, "m"], + [76602, 0, ":"], + [76603, 0, "a"], + [76604, 0, "s"], + [76605, 0, "s"], + [76606, 0, "i"], + [76607, 0, "g"], + [76608, 0, "n"], + [76609, 0, "-"], + [76610, 0, "c"], + [76611, 0, "o"], + [76612, 0, "m"], + [76613, 0, "m"], + [76614, 0, "u"], + [76615, 0, "t"], + [76616, 0, "e"], + [76617, 0, "}"], + [76618, 0, "."], + [82130, 0, "\n"], + [82131, 0, "\\"], + [82132, 0, "b"], + [82133, 0, "e"], + [82134, 0, "g"], + [82135, 0, "i"], + [82136, 0, "n"], + [82137, 0, "{"], + [82138, 0, "e"], + [82139, 0, "m"], + [82139, 1], + [82138, 1], + [82138, 0, "l"], + [82139, 0, "e"], + [82140, 0, "m"], + [82141, 0, "m"], + [82142, 0, "a"], + [82143, 0, "}"], + [82144, 0, "\\"], + [82145, 0, "l"], + [82146, 0, "a"], + [82147, 0, "b"], + [82148, 0, "e"], + [82149, 0, "l"], + [82150, 0, "{"], + [82151, 0, "l"], + [82152, 0, "e"], + [82153, 0, "m"], + [82154, 0, ":"], + [82155, 0, "d"], + [82156, 0, "e"], + [82157, 0, "l"], + [82158, 0, "e"], + [82159, 0, "t"], + [82160, 0, "e"], + [82161, 0, "-"], + [82162, 0, "c"], + [82163, 0, "o"], + [82164, 0, "m"], + [82165, 0, "m"], + [82166, 0, "u"], + [82167, 0, "t"], + [82168, 0, "e"], + [82169, 0, "}"], + [82170, 0, "\n"], + [82171, 0, "C"], + [82172, 0, "o"], + [82173, 0, "n"], + [82174, 0, "c"], + [82175, 0, "u"], + [82176, 0, "r"], + [82177, 0, "r"], + [82178, 0, "e"], + [82178, 1], + [82177, 1], + [82176, 1], + [82175, 1], + [82174, 1], + [82173, 1], + [82172, 1], + [82171, 1], + [82171, 0, "D"], + [82172, 0, "e"], + [82173, 0, "l"], + [82174, 0, "e"], + [82175, 0, "t"], + [82176, 0, "i"], + [82177, 0, "o"], + [82178, 0, "n"], + [82179, 0, " "], + [82180, 0, "i"], + [82181, 0, "s"], + [82182, 0, " "], + [82183, 0, "c"], + [82184, 0, "o"], + [82185, 0, "m"], + [82186, 0, "m"], + [82187, 0, "u"], + [82188, 0, "t"], + [82189, 0, "a"], + [82190, 0, "t"], + [82191, 0, "i"], + [82192, 0, "v"], + [82193, 0, "e"], + [82194, 0, " "], + [82195, 0, "w"], + [82196, 0, "i"], + [82197, 0, "t"], + [82198, 0, "h"], + [82199, 0, " "], + [82200, 0, "r"], + [82201, 0, "e"], + [82202, 0, "s"], + [82203, 0, "p"], + [82204, 0, "e"], + [82205, 0, "c"], + [82206, 0, "t"], + [82207, 0, " "], + [82208, 0, "t"], + [82209, 0, "o"], + [82210, 0, " "], + [82211, 0, "o"], + [82212, 0, "t"], + [82213, 0, "h"], + [82214, 0, "e"], + [82215, 0, "r"], + [82216, 0, " "], + [82217, 0, "c"], + [82218, 0, "o"], + [82219, 0, "n"], + [82220, 0, "c"], + [82221, 0, "u"], + [82222, 0, "r"], + [82223, 0, "r"], + [82224, 0, "e"], + [82225, 0, "n"], + [82226, 0, "t"], + [82227, 0, " "], + [82228, 0, "o"], + [82229, 0, "p"], + [82230, 0, "e"], + [82231, 0, "r"], + [82232, 0, "a"], + [82233, 0, "t"], + [82234, 0, "i"], + [82235, 0, "o"], + [82236, 0, "n"], + [82237, 0, "s"], + [82238, 0, "."], + [82239, 0, "\n"], + [82240, 0, "\\"], + [82241, 0, "e"], + [82242, 0, "n"], + [82243, 0, "d"], + [82244, 0, "{"], + [82245, 0, "l"], + [82246, 0, "e"], + [82247, 0, "m"], + [82248, 0, "m"], + [82249, 0, "a"], + [82250, 0, "}"], + [82251, 0, "\n"], + [82252, 0, "\n"], + [82253, 0, "\\"], + [82254, 0, "b"], + [82255, 0, "e"], + [82256, 0, "g"], + [82257, 0, "i"], + [82258, 0, "n"], + [82259, 0, "{"], + [82260, 0, "l"], + [82261, 0, "e"], + [82262, 0, "m"], + [82263, 0, "m"], + [82264, 0, "a"], + [82265, 0, "}"], + [82266, 0, "\\"], + [82267, 0, "l"], + [82268, 0, "a"], + [82269, 0, "b"], + [82270, 0, "e"], + [82271, 0, "l"], + [82272, 0, "{"], + [82273, 0, "l"], + [82274, 0, "e"], + [82275, 0, "m"], + [82276, 0, ":"], + [82277, 0, "a"], + [82278, 0, "s"], + [82279, 0, "s"], + [82280, 0, "i"], + [82281, 0, "g"], + [82282, 0, "n"], + [82283, 0, "-"], + [82284, 0, "c"], + [82285, 0, "o"], + [82286, 0, "m"], + [82287, 0, "m"], + [82288, 0, "u"], + [82289, 0, "t"], + [82290, 0, "e"], + [82291, 0, "}"], + [82292, 0, "\n"], + [82293, 0, "A"], + [82294, 0, "s"], + [82295, 0, "s"], + [82296, 0, "i"], + [82297, 0, "g"], + [82298, 0, "n"], + [82299, 0, "m"], + [82300, 0, "e"], + [82301, 0, "n"], + [82302, 0, "t"], + [82303, 0, " "], + [82304, 0, "i"], + [82305, 0, "s"], + [82306, 0, " "], + [82307, 0, "c"], + [82308, 0, "o"], + [82309, 0, "m"], + [82310, 0, "m"], + [82311, 0, "u"], + [82312, 0, "t"], + [82313, 0, "a"], + [82314, 0, "t"], + [82315, 0, "i"], + [82316, 0, "v"], + [82317, 0, "e"], + [82318, 0, " "], + [82319, 0, "w"], + [82320, 0, "i"], + [82321, 0, "t"], + [82322, 0, "h"], + [82323, 0, " "], + [82324, 0, "r"], + [82325, 0, "e"], + [82326, 0, "s"], + [82327, 0, "p"], + [82328, 0, "e"], + [82329, 0, "c"], + [82330, 0, "t"], + [82331, 0, " "], + [82332, 0, "t"], + [82333, 0, "o"], + [82334, 0, " "], + [82335, 0, "o"], + [82336, 0, "t"], + [82337, 0, "h"], + [82338, 0, "e"], + [82339, 0, "r"], + [82340, 0, " "], + [82341, 0, "c"], + [82342, 0, "o"], + [82343, 0, "n"], + [82344, 0, "c"], + [82345, 0, "u"], + [82346, 0, "r"], + [82347, 0, "r"], + [82348, 0, "e"], + [82349, 0, "n"], + [82350, 0, "t"], + [82351, 0, " "], + [82352, 0, "o"], + [82353, 0, "p"], + [82354, 0, "e"], + [82355, 0, "r"], + [82356, 0, "a"], + [82357, 0, "t"], + [82358, 0, "i"], + [82359, 0, "o"], + [82360, 0, "n"], + [82361, 0, "s"], + [82362, 0, "."], + [82340, 1], + [82339, 1], + [82338, 1], + [82337, 1], + [82336, 1], + [82335, 1], + [82215, 1], + [82214, 1], + [82213, 1], + [82212, 1], + [82211, 1], + [82210, 1], + [82352, 0, "\\"], + [82353, 0, "e"], + [82354, 0, "n"], + [82355, 0, "d"], + [82356, 0, "{"], + [82357, 0, "l"], + [82358, 0, "e"], + [82359, 0, "m"], + [82360, 0, "m"], + [82361, 0, "a"], + [82362, 0, "}"], + [82363, 0, "\n"], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [82391, 1], + [83429, 1], + [83428, 1], + [83427, 1], + [83426, 1], + [83425, 1], + [83424, 1], + [83423, 1], + [83422, 1], + [83421, 1], + [83420, 1], + [83419, 1], + [83418, 1], + [83417, 1], + [83416, 1], + [83415, 1], + [83414, 1], + [83413, 1], + [83412, 1], + [83411, 1], + [83410, 1], + [83409, 1], + [83408, 1], + [83407, 1], + [83406, 1], + [83405, 1], + [83404, 1], + [83403, 1], + [83402, 1], + [83401, 1], + [83400, 1], + [83399, 1], + [83398, 1], + [83397, 1], + [83396, 1], + [83395, 1], + [83394, 1], + [83393, 1], + [83392, 1], + [83391, 1], + [83390, 1], + [83389, 1], + [83388, 1], + [83387, 1], + [83386, 1], + [83385, 1], + [83384, 1], + [83383, 1], + [83382, 1], + [83381, 1], + [83380, 1], + [83379, 1], + [83378, 1], + [83377, 1], + [83376, 1], + [83375, 1], + [83374, 1], + [83373, 1], + [83372, 1], + [83371, 1], + [83370, 1], + [83369, 1], + [83368, 1], + [83367, 1], + [83366, 1], + [83365, 1], + [83364, 1], + [83363, 1], + [83362, 1], + [83361, 1], + [83360, 1], + [83359, 1], + [83358, 1], + [83357, 1], + [83356, 1], + [83355, 1], + [83354, 1], + [83353, 1], + [83352, 1], + [83351, 1], + [83350, 1], + [83349, 1], + [83348, 1], + [83347, 1], + [83346, 1], + [83345, 1], + [83344, 1], + [83343, 1], + [83342, 1], + [83341, 1], + [83340, 1], + [83339, 1], + [83338, 1], + [83337, 1], + [83336, 1], + [83335, 1], + [83334, 1], + [83333, 1], + [83332, 1], + [83331, 1], + [83330, 1], + [83329, 1], + [83328, 1], + [83327, 1], + [83326, 1], + [83325, 1], + [83324, 1], + [83323, 1], + [83322, 1], + [83321, 1], + [83320, 1], + [83319, 1], + [83318, 1], + [83317, 1], + [83316, 1], + [83315, 1], + [83314, 1], + [83313, 1], + [83312, 1], + [83311, 1], + [83310, 1], + [83309, 1], + [83308, 1], + [83307, 1], + [83306, 1], + [83305, 1], + [83304, 1], + [83303, 1], + [83302, 1], + [83301, 1], + [83300, 1], + [83299, 1], + [83298, 1], + [83297, 1], + [83296, 1], + [83295, 1], + [83294, 1], + [83293, 1], + [83292, 1], + [83291, 1], + [83290, 1], + [83289, 1], + [83288, 1], + [83287, 1], + [83286, 1], + [83285, 1], + [83284, 1], + [83283, 1], + [83282, 1], + [83281, 1], + [83280, 1], + [83279, 1], + [83278, 1], + [83277, 1], + [83276, 1], + [83275, 1], + [83274, 1], + [83273, 1], + [83272, 1], + [83271, 1], + [83270, 1], + [83269, 1], + [83268, 1], + [83267, 1], + [83266, 1], + [83265, 1], + [83264, 1], + [83263, 1], + [83262, 1], + [83261, 1], + [83260, 1], + [83259, 1], + [83258, 1], + [83257, 1], + [83256, 1], + [83255, 1], + [83254, 1], + [83253, 1], + [83252, 1], + [83251, 1], + [83250, 1], + [83249, 1], + [83248, 1], + [83247, 1], + [83246, 1], + [83245, 1], + [83244, 1], + [83243, 1], + [83242, 1], + [83241, 1], + [83240, 1], + [83239, 1], + [83238, 1], + [83237, 1], + [83236, 1], + [83235, 1], + [83234, 1], + [83233, 1], + [83232, 1], + [83231, 1], + [83230, 1], + [83229, 1], + [83228, 1], + [83227, 1], + [83226, 1], + [83225, 1], + [83224, 1], + [83223, 1], + [83222, 1], + [83221, 1], + [83220, 1], + [83219, 1], + [83218, 1], + [83217, 1], + [83216, 1], + [83215, 1], + [83214, 1], + [83213, 1], + [83212, 1], + [83211, 1], + [83210, 1], + [83209, 1], + [83208, 1], + [83207, 1], + [83206, 1], + [83205, 1], + [83204, 1], + [83203, 1], + [83202, 1], + [83201, 1], + [83200, 1], + [83199, 1], + [83198, 1], + [83197, 1], + [83196, 1], + [83195, 1], + [83194, 1], + [83193, 1], + [83192, 1], + [83191, 1], + [83190, 1], + [83189, 1], + [83188, 1], + [83187, 1], + [83186, 1], + [83185, 1], + [83184, 1], + [83183, 1], + [83182, 1], + [83181, 1], + [83180, 1], + [83179, 1], + [83178, 1], + [83177, 1], + [83176, 1], + [83175, 1], + [83174, 1], + [83173, 1], + [83172, 1], + [83171, 1], + [83170, 1], + [83169, 1], + [83168, 1], + [83167, 1], + [83166, 1], + [83165, 1], + [83164, 1], + [83163, 1], + [83162, 1], + [83161, 1], + [83160, 1], + [83159, 1], + [83158, 1], + [83157, 1], + [83156, 1], + [83155, 1], + [83154, 1], + [83153, 1], + [83152, 1], + [83151, 1], + [83150, 1], + [83149, 1], + [83148, 1], + [83147, 1], + [83146, 1], + [83145, 1], + [83144, 1], + [83143, 1], + [83142, 1], + [83141, 1], + [83140, 1], + [83139, 1], + [83138, 1], + [83137, 1], + [83136, 1], + [83135, 1], + [83134, 1], + [83133, 1], + [83132, 1], + [83131, 1], + [83130, 1], + [83129, 1], + [83128, 1], + [83127, 1], + [83126, 1], + [83125, 1], + [83124, 1], + [83123, 1], + [83122, 1], + [83121, 1], + [83120, 1], + [83119, 1], + [83118, 1], + [83117, 1], + [83116, 1], + [83115, 1], + [83114, 1], + [83113, 1], + [83112, 1], + [83111, 1], + [83110, 1], + [83109, 1], + [83108, 1], + [83107, 1], + [83106, 1], + [83105, 1], + [83104, 1], + [83103, 1], + [83102, 1], + [83101, 1], + [83100, 1], + [83099, 1], + [83098, 1], + [83097, 1], + [83096, 1], + [83095, 1], + [83094, 1], + [83093, 1], + [83092, 1], + [83091, 1], + [83090, 1], + [83089, 1], + [83088, 1], + [83087, 1], + [83086, 1], + [83085, 1], + [83084, 1], + [83083, 1], + [83082, 1], + [83081, 1], + [83080, 1], + [83079, 1], + [83078, 1], + [83077, 1], + [83076, 1], + [83075, 1], + [83074, 1], + [83073, 1], + [83072, 1], + [83071, 1], + [83070, 1], + [83069, 1], + [83068, 1], + [83067, 1], + [83066, 1], + [83065, 1], + [83064, 1], + [83063, 1], + [83062, 1], + [83061, 1], + [83060, 1], + [83059, 1], + [83058, 1], + [83057, 1], + [83056, 1], + [83055, 1], + [83054, 1], + [83053, 1], + [83052, 1], + [83051, 1], + [83050, 1], + [83049, 1], + [83048, 1], + [83047, 1], + [83046, 1], + [83045, 1], + [83044, 1], + [83043, 1], + [83042, 1], + [83041, 1], + [83040, 1], + [83039, 1], + [83038, 1], + [83037, 1], + [83036, 1], + [83035, 1], + [83034, 1], + [83033, 1], + [83032, 1], + [83031, 1], + [83030, 1], + [83029, 1], + [83028, 1], + [83027, 1], + [83026, 1], + [83025, 1], + [83024, 1], + [83023, 1], + [83022, 1], + [83021, 1], + [83020, 1], + [83019, 1], + [83018, 1], + [83017, 1], + [83016, 1], + [83015, 1], + [83014, 1], + [83013, 1], + [83012, 1], + [83011, 1], + [83010, 1], + [83009, 1], + [83008, 1], + [83007, 1], + [83006, 1], + [83005, 1], + [83004, 1], + [83003, 1], + [83002, 1], + [83001, 1], + [83000, 1], + [82999, 1], + [82998, 1], + [82997, 1], + [82996, 1], + [82995, 1], + [82994, 1], + [82993, 1], + [82992, 1], + [82991, 1], + [82990, 1], + [82989, 1], + [82988, 1], + [82987, 1], + [82986, 1], + [82985, 1], + [82984, 1], + [82983, 1], + [82982, 1], + [82981, 1], + [82980, 1], + [82979, 1], + [82978, 1], + [82977, 1], + [82976, 1], + [82975, 1], + [82974, 1], + [82973, 1], + [82972, 1], + [82971, 1], + [82970, 1], + [82969, 1], + [82968, 1], + [82967, 1], + [82966, 1], + [82965, 1], + [82964, 1], + [82963, 1], + [82962, 1], + [82961, 1], + [82960, 1], + [82959, 1], + [82958, 1], + [82957, 1], + [82956, 1], + [82955, 1], + [82954, 1], + [82953, 1], + [82952, 1], + [82951, 1], + [82950, 1], + [82949, 1], + [82948, 1], + [82947, 1], + [82946, 1], + [82945, 1], + [82944, 1], + [82943, 1], + [82942, 1], + [82941, 1], + [82940, 1], + [82939, 1], + [82938, 1], + [82937, 1], + [82936, 1], + [82935, 1], + [82934, 1], + [82933, 1], + [82932, 1], + [82931, 1], + [82930, 1], + [82929, 1], + [82928, 1], + [82927, 1], + [82926, 1], + [82925, 1], + [82924, 1], + [82923, 1], + [82922, 1], + [82921, 1], + [82920, 1], + [82919, 1], + [82918, 1], + [82917, 1], + [82916, 1], + [82915, 1], + [82914, 1], + [82913, 1], + [82912, 1], + [82911, 1], + [82910, 1], + [82909, 1], + [82908, 1], + [82907, 1], + [82906, 1], + [82905, 1], + [82904, 1], + [82903, 1], + [82902, 1], + [82901, 1], + [82900, 1], + [82899, 1], + [82898, 1], + [82897, 1], + [82896, 1], + [82895, 1], + [82894, 1], + [82893, 1], + [82892, 1], + [82891, 1], + [82890, 1], + [82889, 1], + [82888, 1], + [82887, 1], + [82886, 1], + [82885, 1], + [82884, 1], + [82883, 1], + [82882, 1], + [82881, 1], + [82880, 1], + [82879, 1], + [82878, 1], + [82877, 1], + [82876, 1], + [82875, 1], + [82874, 1], + [82873, 1], + [82872, 1], + [82871, 1], + [82870, 1], + [82869, 1], + [82868, 1], + [82867, 1], + [82866, 1], + [82865, 1], + [82864, 1], + [82863, 1], + [82862, 1], + [82861, 1], + [82860, 1], + [82859, 1], + [82858, 1], + [82857, 1], + [82856, 1], + [82855, 1], + [82854, 1], + [82853, 1], + [82852, 1], + [82851, 1], + [82850, 1], + [82849, 1], + [82848, 1], + [82847, 1], + [82846, 1], + [82845, 1], + [82844, 1], + [82843, 1], + [82842, 1], + [82841, 1], + [82840, 1], + [82839, 1], + [82838, 1], + [82837, 1], + [82836, 1], + [82835, 1], + [82834, 1], + [82833, 1], + [82832, 1], + [82831, 1], + [82830, 1], + [82829, 1], + [82828, 1], + [82827, 1], + [82826, 1], + [82825, 1], + [82824, 1], + [82823, 1], + [82822, 1], + [82821, 1], + [82820, 1], + [82819, 1], + [82818, 1], + [82817, 1], + [82816, 1], + [82815, 1], + [82814, 1], + [82813, 1], + [82812, 1], + [82811, 1], + [82810, 1], + [82809, 1], + [82808, 1], + [82807, 1], + [82806, 1], + [82805, 1], + [82804, 1], + [82803, 1], + [82802, 1], + [82801, 1], + [82800, 1], + [82799, 1], + [82798, 1], + [82797, 1], + [82796, 1], + [82795, 1], + [82794, 1], + [82793, 1], + [82792, 1], + [82791, 1], + [82790, 1], + [82789, 1], + [82788, 1], + [82787, 1], + [82786, 1], + [82785, 1], + [82784, 1], + [82783, 1], + [82782, 1], + [82781, 1], + [82780, 1], + [82779, 1], + [82778, 1], + [82777, 1], + [82776, 1], + [82775, 1], + [82774, 1], + [82773, 1], + [82772, 1], + [82771, 1], + [82770, 1], + [82769, 1], + [82768, 1], + [82767, 1], + [82766, 1], + [82765, 1], + [82764, 1], + [82763, 1], + [82762, 1], + [82761, 1], + [82760, 1], + [82759, 1], + [82758, 1], + [82757, 1], + [82756, 1], + [82755, 1], + [82754, 1], + [82753, 1], + [82752, 1], + [82751, 1], + [82750, 1], + [82749, 1], + [82748, 1], + [82747, 1], + [82746, 1], + [82745, 1], + [82744, 1], + [82743, 1], + [82742, 1], + [82741, 1], + [82740, 1], + [82739, 1], + [82738, 1], + [82737, 1], + [82736, 1], + [82735, 1], + [82734, 1], + [82733, 1], + [82732, 1], + [82731, 1], + [82730, 1], + [82729, 1], + [82728, 1], + [82727, 1], + [82726, 1], + [82725, 1], + [82724, 1], + [82723, 1], + [82722, 1], + [82721, 1], + [82720, 1], + [82719, 1], + [82718, 1], + [82717, 1], + [82716, 1], + [82715, 1], + [82714, 1], + [82713, 1], + [82712, 1], + [82711, 1], + [82710, 1], + [82709, 1], + [82708, 1], + [82707, 1], + [82706, 1], + [82705, 1], + [82704, 1], + [82703, 1], + [82702, 1], + [82701, 1], + [82700, 1], + [82699, 1], + [82698, 1], + [82697, 1], + [82696, 1], + [82695, 1], + [82694, 1], + [82693, 1], + [82692, 1], + [82691, 1], + [82690, 1], + [82689, 1], + [82688, 1], + [82687, 1], + [82686, 1], + [82685, 1], + [82684, 1], + [82683, 1], + [82682, 1], + [82681, 1], + [82680, 1], + [82679, 1], + [82678, 1], + [82677, 1], + [82676, 1], + [82675, 1], + [82674, 1], + [82673, 1], + [82672, 1], + [82671, 1], + [82670, 1], + [82669, 1], + [82668, 1], + [82667, 1], + [82666, 1], + [82665, 1], + [82664, 1], + [82663, 1], + [82662, 1], + [82661, 1], + [82660, 1], + [82659, 1], + [82658, 1], + [82657, 1], + [82656, 1], + [82655, 1], + [82654, 1], + [82653, 1], + [82652, 1], + [82651, 1], + [82650, 1], + [82649, 1], + [82648, 1], + [82647, 1], + [82646, 1], + [82645, 1], + [82644, 1], + [82643, 1], + [82642, 1], + [82641, 1], + [82640, 1], + [82639, 1], + [82638, 1], + [82637, 1], + [82636, 1], + [82635, 1], + [82634, 1], + [82633, 1], + [82632, 1], + [82631, 1], + [82630, 1], + [82629, 1], + [82628, 1], + [82627, 1], + [82626, 1], + [82625, 1], + [82624, 1], + [82623, 1], + [82622, 1], + [82621, 1], + [82620, 1], + [82619, 1], + [82618, 1], + [82617, 1], + [82616, 1], + [82615, 1], + [82614, 1], + [82613, 1], + [82612, 1], + [82611, 1], + [82610, 1], + [82609, 1], + [82608, 1], + [82607, 1], + [82606, 1], + [82605, 1], + [82604, 1], + [82603, 1], + [82602, 1], + [82601, 1], + [82600, 1], + [82599, 1], + [82598, 1], + [82597, 1], + [82596, 1], + [82595, 1], + [82594, 1], + [82593, 1], + [82592, 1], + [82591, 1], + [82590, 1], + [82589, 1], + [82588, 1], + [82587, 1], + [82586, 1], + [82585, 1], + [82584, 1], + [82583, 1], + [82582, 1], + [82581, 1], + [82580, 1], + [82579, 1], + [82578, 1], + [82577, 1], + [82576, 1], + [82575, 1], + [82574, 1], + [82573, 1], + [82572, 1], + [82571, 1], + [82570, 1], + [82569, 1], + [82568, 1], + [82567, 1], + [82566, 1], + [82565, 1], + [82564, 1], + [82563, 1], + [82562, 1], + [82561, 1], + [82560, 1], + [82559, 1], + [82558, 1], + [82557, 1], + [82556, 1], + [82555, 1], + [82554, 1], + [82553, 1], + [82552, 1], + [82551, 1], + [82550, 1], + [82549, 1], + [82548, 1], + [82547, 1], + [82546, 1], + [82545, 1], + [82544, 1], + [82543, 1], + [82542, 1], + [82541, 1], + [82540, 1], + [82539, 1], + [82538, 1], + [82537, 1], + [82536, 1], + [82535, 1], + [82534, 1], + [82533, 1], + [82532, 1], + [82531, 1], + [82530, 1], + [82529, 1], + [82528, 1], + [82527, 1], + [82526, 1], + [82525, 1], + [82524, 1], + [82523, 1], + [82522, 1], + [82521, 1], + [82520, 1], + [82519, 1], + [82518, 1], + [82517, 1], + [82516, 1], + [82515, 1], + [82514, 1], + [82513, 1], + [82512, 1], + [82511, 1], + [82510, 1], + [82509, 1], + [82508, 1], + [82507, 1], + [82506, 1], + [82505, 1], + [82504, 1], + [82503, 1], + [82502, 1], + [82501, 1], + [82500, 1], + [82499, 1], + [82498, 1], + [82497, 1], + [82496, 1], + [82495, 1], + [82494, 1], + [82493, 1], + [82492, 1], + [82491, 1], + [82490, 1], + [82489, 1], + [82488, 1], + [82487, 1], + [82486, 1], + [82485, 1], + [82484, 1], + [82483, 1], + [82482, 1], + [82481, 1], + [82480, 1], + [82479, 1], + [82478, 1], + [82477, 1], + [82476, 1], + [82475, 1], + [82474, 1], + [82473, 1], + [82472, 1], + [82471, 1], + [82470, 1], + [82469, 1], + [82468, 1], + [82467, 1], + [82466, 1], + [82465, 1], + [82464, 1], + [82463, 1], + [82462, 1], + [82461, 1], + [82460, 1], + [82459, 1], + [82458, 1], + [82457, 1], + [82456, 1], + [82455, 1], + [82454, 1], + [82453, 1], + [82452, 1], + [82451, 1], + [82450, 1], + [82449, 1], + [82448, 1], + [82447, 1], + [82446, 1], + [82445, 1], + [82444, 1], + [82443, 1], + [82442, 1], + [82441, 1], + [82440, 1], + [82439, 1], + [82438, 1], + [82437, 1], + [82436, 1], + [82435, 1], + [82434, 1], + [82433, 1], + [82432, 1], + [82431, 1], + [82430, 1], + [82429, 1], + [82428, 1], + [82427, 1], + [82426, 1], + [82425, 1], + [82424, 1], + [82423, 1], + [82422, 1], + [82421, 1], + [82420, 1], + [82419, 1], + [82418, 1], + [82417, 1], + [82416, 1], + [82415, 1], + [82414, 1], + [82413, 1], + [82412, 1], + [82411, 1], + [82410, 1], + [82409, 1], + [82408, 1], + [82407, 1], + [82406, 1], + [82405, 1], + [82404, 1], + [82403, 1], + [82402, 1], + [82401, 1], + [82400, 1], + [82399, 1], + [82398, 1], + [82397, 1], + [82396, 1], + [82395, 1], + [82394, 1], + [82393, 1], + [82392, 1], + [82391, 1], + [82390, 1], + [82389, 1], + [74572, 0, " "], + [74573, 0, "T"], + [74574, 0, "h"], + [74575, 0, "e"], + [74576, 0, " "], + [74577, 0, "c"], + [74578, 0, "a"], + [74579, 0, "u"], + [74580, 0, "s"], + [74581, 0, "a"], + [74582, 0, "l"], + [74583, 0, "i"], + [74584, 0, "t"], + [74585, 0, "y"], + [74586, 0, " "], + [74587, 0, "i"], + [74588, 0, "n"], + [74589, 0, "v"], + [74590, 0, "a"], + [74591, 0, "r"], + [74592, 0, "i"], + [74593, 0, "a"], + [74594, 0, "n"], + [74595, 0, "t"], + [74596, 0, " "], + [74597, 0, "i"], + [74598, 0, "s"], + [74599, 0, " "], + [74600, 0, "m"], + [74601, 0, "a"], + [74602, 0, "i"], + [74603, 0, "n"], + [74604, 0, "t"], + [74605, 0, "a"], + [74606, 0, "i"], + [74607, 0, "n"], + [74608, 0, "e"], + [74609, 0, "d"], + [74610, 0, " "], + [74611, 0, "b"], + [74612, 0, "y"], + [74613, 0, " "], + [74614, 0, "t"], + [74615, 0, "h"], + [74616, 0, "e"], + [74617, 0, " "], + [74618, 0, "\\"], + [74619, 0, "t"], + [74620, 0, "e"], + [74621, 0, "x"], + [74622, 0, "t"], + [74623, 0, "s"], + [74624, 0, "c"], + [74625, 0, "{"], + [74626, 0, "A"], + [74627, 0, "p"], + [74628, 0, "p"], + [74629, 0, "l"], + [74630, 0, "y"], + [74631, 0, "-"], + [74632, 0, "*"], + [74633, 0, "}"], + [74634, 0, " "], + [74635, 0, "r"], + [74636, 0, "u"], + [74637, 0, "l"], + [74638, 0, "e"], + [74639, 0, "s"], + [74640, 0, "."], + [76700, 0, "\n"], + [76701, 0, "\n"], + [76702, 0, "B"], + [76703, 0, "e"], + [76704, 0, "f"], + [76705, 0, "o"], + [76706, 0, "r"], + [76707, 0, "e"], + [76708, 0, " "], + [76709, 0, "w"], + [76710, 0, "e"], + [76711, 0, " "], + [76712, 0, "c"], + [76713, 0, "a"], + [76714, 0, "n"], + [76715, 0, " "], + [76716, 0, "p"], + [76717, 0, "r"], + [76718, 0, "o"], + [76719, 0, "v"], + [76720, 0, "e"], + [76721, 0, " "], + [76722, 0, "t"], + [76723, 0, "h"], + [76724, 0, "e"], + [76725, 0, " "], + [76726, 0, "c"], + [76727, 0, "o"], + [76728, 0, "m"], + [76729, 0, "m"], + [76730, 0, "u"], + [76731, 0, "t"], + [76732, 0, "a"], + [76733, 0, "t"], + [76734, 0, "i"], + [76735, 0, "v"], + [76736, 0, "i"], + [76737, 0, "t"], + [76738, 0, "y"], + [76739, 0, " "], + [76740, 0, "o"], + [76741, 0, "f"], + [76742, 0, " "], + [76743, 0, "i"], + [76744, 0, "n"], + [76745, 0, "s"], + [76746, 0, "e"], + [76747, 0, "r"], + [76748, 0, "t"], + [76749, 0, "i"], + [76750, 0, "o"], + [76751, 0, "n"], + [76752, 0, ","], + [76753, 0, " "], + [76754, 0, "d"], + [76755, 0, "e"], + [76756, 0, "l"], + [76757, 0, "e"], + [76758, 0, "t"], + [76759, 0, "i"], + [76760, 0, "o"], + [76761, 0, "n"], + [76762, 0, " "], + [76763, 0, "a"], + [76764, 0, "n"], + [76765, 0, "d"], + [76766, 0, " "], + [76767, 0, "a"], + [76768, 0, "s"], + [76769, 0, "s"], + [76770, 0, "i"], + [76771, 0, "g"], + [76772, 0, "n"], + [76773, 0, "m"], + [76774, 0, "e"], + [76775, 0, "n"], + [76776, 0, "t"], + [76777, 0, ","], + [76778, 0, " "], + [76779, 0, "w"], + [76780, 0, "e"], + [76781, 0, " "], + [76782, 0, "m"], + [76783, 0, "u"], + [76784, 0, "s"], + [76785, 0, "t"], + [76786, 0, " "], + [76787, 0, "f"], + [76788, 0, "i"], + [76789, 0, "r"], + [76790, 0, "s"], + [76791, 0, "t"], + [76792, 0, " "], + [76793, 0, "p"], + [76794, 0, "r"], + [76795, 0, "o"], + [76796, 0, "v"], + [76797, 0, "e"], + [76798, 0, " "], + [76799, 0, "s"], + [76800, 0, "o"], + [76801, 0, "m"], + [76802, 0, "e"], + [76803, 0, " "], + [76804, 0, "p"], + [76805, 0, "r"], + [76806, 0, "e"], + [76807, 0, "l"], + [76808, 0, "i"], + [76809, 0, "m"], + [76810, 0, "i"], + [76811, 0, "n"], + [76812, 0, "a"], + [76813, 0, "r"], + [76814, 0, "y"], + [76815, 0, " "], + [76816, 0, "l"], + [76817, 0, "e"], + [76818, 0, "m"], + [76819, 0, "m"], + [76820, 0, "a"], + [76821, 0, "s"], + [76822, 0, "."], + [76792, 0, " "], + [76793, 0, "d"], + [76794, 0, "e"], + [76795, 0, "f"], + [76796, 0, "i"], + [76797, 0, "n"], + [76798, 0, "e"], + [76799, 0, " "], + [76800, 0, "s"], + [76801, 0, "o"], + [76802, 0, "m"], + [76803, 0, "e"], + [76804, 0, " "], + [76805, 0, "m"], + [76806, 0, "o"], + [76807, 0, "r"], + [76808, 0, "e"], + [76809, 0, " "], + [76810, 0, "t"], + [76811, 0, "e"], + [76812, 0, "r"], + [76813, 0, "m"], + [76814, 0, "s"], + [76815, 0, " "], + [76816, 0, "a"], + [76817, 0, "n"], + [76818, 0, "d"], + [73117, 0, " "], + [73118, 0, "M"], + [73119, 0, "o"], + [73120, 0, "r"], + [73121, 0, "e"], + [73122, 0, "o"], + [73123, 0, "v"], + [73124, 0, "e"], + [73125, 0, "r"], + [73126, 0, ","], + [73127, 0, " "], + [73128, 0, "g"], + [73129, 0, "a"], + [73130, 0, "r"], + [73131, 0, "b"], + [73132, 0, "a"], + [73133, 0, "g"], + [73134, 0, "e"], + [73135, 0, " "], + [73136, 0, "c"], + [73137, 0, "o"], + [73138, 0, "l"], + [73139, 0, "l"], + [73140, 0, "e"], + [73141, 0, "c"], + [73142, 0, "t"], + [73143, 0, "i"], + [73144, 0, "o"], + [73145, 0, "n"], + [73146, 0, " "], + [73147, 0, "("], + [73148, 0, "t"], + [73149, 0, "o"], + [73150, 0, "m"], + [73151, 0, "b"], + [73152, 0, "s"], + [73153, 0, "t"], + [73154, 0, "o"], + [73155, 0, "n"], + [73156, 0, "e"], + [73157, 0, " "], + [73158, 0, "r"], + [73159, 0, "e"], + [73160, 0, "m"], + [73161, 0, "o"], + [73162, 0, "v"], + [73163, 0, "a"], + [73164, 0, "l"], + [73165, 0, ")"], + [73166, 0, " "], + [73167, 0, "i"], + [73168, 0, "s"], + [73169, 0, " "], + [73170, 0, "r"], + [73171, 0, "e"], + [73172, 0, "q"], + [73173, 0, "u"], + [73174, 0, "i"], + [73175, 0, "r"], + [73176, 0, "e"], + [73177, 0, "d"], + [73178, 0, " "], + [73179, 0, "i"], + [73180, 0, "n"], + [73181, 0, " "], + [73182, 0, "o"], + [73183, 0, "r"], + [73184, 0, "d"], + [73185, 0, "e"], + [73186, 0, "r"], + [73187, 0, " "], + [73188, 0, "t"], + [73189, 0, "o"], + [73190, 0, " "], + [73191, 0, "p"], + [73192, 0, "r"], + [73193, 0, "e"], + [73194, 0, "v"], + [73195, 0, "e"], + [73196, 0, "n"], + [73197, 0, "t"], + [73198, 0, " "], + [73199, 0, "u"], + [73200, 0, "n"], + [73201, 0, "b"], + [73202, 0, "o"], + [73203, 0, "u"], + [73204, 0, "n"], + [73205, 0, "d"], + [73206, 0, "e"], + [73207, 0, "d"], + [73208, 0, " "], + [73209, 0, "g"], + [73210, 0, "r"], + [73211, 0, "o"], + [73212, 0, "w"], + [73213, 0, "t"], + [73214, 0, "h"], + [73215, 0, " "], + [73216, 0, "o"], + [73217, 0, "f"], + [73218, 0, " "], + [73219, 0, "t"], + [73220, 0, "h"], + [73221, 0, "e"], + [73222, 0, " "], + [73223, 0, "d"], + [73224, 0, "a"], + [73225, 0, "t"], + [73226, 0, "a"], + [73227, 0, "s"], + [73228, 0, "t"], + [73229, 0, "r"], + [73230, 0, "u"], + [73231, 0, "c"], + [73232, 0, "t"], + [73233, 0, "u"], + [73234, 0, "r"], + [73235, 0, "e"], + [73236, 0, "."], + [2143, 0, "i"], + [2144, 0, ","], + [2145, 0, " "], + [2145, 1], + [2144, 1], + [2143, 1], + [2143, 0, ","], + [2144, 0, " "], + [2145, 0, "o"], + [2146, 0, "n"], + [2147, 0, " "], + [2148, 0, "m"], + [2149, 0, "o"], + [2150, 0, "b"], + [2151, 0, "i"], + [2152, 0, "l"], + [2153, 0, "e"], + [2154, 0, " "], + [2155, 0, "s"], + [2156, 0, "y"], + [2157, 0, "s"], + [2158, 0, "t"], + [2159, 0, "e"], + [2160, 0, "m"], + [2161, 0, "s"], + [2162, 0, " "], + [2163, 0, "w"], + [2164, 0, "h"], + [2165, 0, "i"], + [2166, 0, "c"], + [2167, 0, "h"], + [2168, 0, " "], + [2169, 0, "s"], + [2170, 0, "u"], + [2171, 0, "u"], + [2171, 1], + [2171, 0, "f"], + [2172, 0, "f"], + [2173, 0, "e"], + [2174, 0, "r"], + [2175, 0, " "], + [2176, 0, "f"], + [2177, 0, "r"], + [2178, 0, "o"], + [2179, 0, "m"], + [2180, 0, " "], + [2181, 0, "p"], + [2182, 0, "e"], + [2183, 0, "r"], + [2184, 0, "i"], + [2185, 0, "o"], + [2186, 0, "d"], + [2187, 0, "s"], + [2188, 0, " "], + [2189, 0, "o"], + [2190, 0, "f"], + [2191, 0, " "], + [2192, 0, "d"], + [2193, 0, "i"], + [2194, 0, "s"], + [2195, 0, "c"], + [2196, 0, "o"], + [2197, 0, "n"], + [2198, 0, "n"], + [2199, 0, "e"], + [2200, 0, "c"], + [2201, 0, "t"], + [2202, 0, "i"], + [2203, 0, "v"], + [2204, 0, "i"], + [2205, 0, "t"], + [2206, 0, "y"], + [2207, 0, ","], + [2161, 1], + [2160, 1], + [2159, 1], + [2158, 1], + [2157, 1], + [2156, 1], + [2155, 1], + [2155, 0, "d"], + [2156, 0, "e"], + [2157, 0, "v"], + [2158, 0, "i"], + [2159, 0, "c"], + [2160, 0, "e"], + [2161, 0, "s"], + [2145, 0, "d"], + [2146, 0, "w"], + [2147, 0, "d"], + [2210, 1], + [2209, 1], + [2208, 1], + [2207, 1], + [2206, 1], + [2205, 1], + [2204, 1], + [2203, 1], + [2202, 1], + [2201, 1], + [2200, 1], + [2199, 1], + [2198, 1], + [2197, 1], + [2196, 1], + [2195, 1], + [2194, 1], + [2193, 1], + [2192, 1], + [2191, 1], + [2190, 1], + [2189, 1], + [2188, 1], + [2187, 1], + [2186, 1], + [2185, 1], + [2184, 1], + [2183, 1], + [2182, 1], + [2181, 1], + [2180, 1], + [2179, 1], + [2178, 1], + [2177, 1], + [2176, 1], + [2175, 1], + [2174, 1], + [2173, 1], + [2172, 1], + [2171, 1], + [2170, 1], + [2169, 1], + [2168, 1], + [2167, 1], + [2166, 1], + [2165, 1], + [2164, 1], + [2163, 1], + [2162, 1], + [2161, 1], + [2160, 1], + [2159, 1], + [2158, 1], + [2157, 1], + [2156, 1], + [2155, 1], + [2154, 1], + [2153, 1], + [2152, 1], + [2151, 1], + [2150, 1], + [2149, 1], + [2148, 1], + [2147, 1], + [2146, 1], + [2145, 1], + [2144, 1], + [2197, 0, "i"], + [2197, 1], + [2197, 0, " "], + [2198, 0, "M"], + [2199, 0, "e"], + [2200, 0, "r"], + [2201, 0, "g"], + [2202, 0, "i"], + [2203, 0, "n"], + [2204, 0, "g"], + [2205, 0, " "], + [2205, 1], + [2204, 1], + [2203, 1], + [2202, 1], + [2201, 1], + [2200, 1], + [2199, 1], + [2198, 1], + [2198, 0, "T"], + [2199, 0, "h"], + [2200, 0, "e"], + [2201, 0, " "], + [2202, 0, "m"], + [2203, 0, "e"], + [2204, 0, "r"], + [2205, 0, "g"], + [2206, 0, "i"], + [2207, 0, "n"], + [2208, 0, "g"], + [2208, 1], + [2207, 1], + [2206, 1], + [2205, 1], + [2204, 1], + [2203, 1], + [2202, 1], + [2201, 1], + [2200, 1], + [2199, 1], + [2198, 1], + [2198, 0, "O"], + [2199, 0, "u"], + [2200, 0, "r"], + [2201, 0, " "], + [2202, 0, "s"], + [2203, 0, "o"], + [2204, 0, "l"], + [2205, 0, "u"], + [2206, 0, "t"], + [2207, 0, "i"], + [2208, 0, "o"], + [2209, 0, "n"], + [2210, 0, " "], + [2211, 0, "i"], + [2212, 0, "s"], + [2213, 0, " "], + [2214, 0, "p"], + [2215, 0, "a"], + [2216, 0, "r"], + [2217, 0, "t"], + [2218, 0, "i"], + [2219, 0, "c"], + [2220, 0, "u"], + [2221, 0, "l"], + [2222, 0, "a"], + [2223, 0, "r"], + [2224, 0, "l"], + [2225, 0, "y"], + [2226, 0, " "], + [2226, 1], + [2225, 1], + [2224, 1], + [2223, 1], + [2222, 1], + [2221, 1], + [2220, 1], + [2219, 1], + [2218, 1], + [2217, 1], + [2216, 1], + [2215, 1], + [2214, 1], + [2213, 1], + [2212, 1], + [2211, 1], + [2210, 1], + [2209, 1], + [2208, 1], + [2207, 1], + [2206, 1], + [2205, 1], + [2204, 1], + [2203, 1], + [2202, 1], + [2201, 1], + [2200, 1], + [2199, 1], + [2198, 1], + [2197, 1], + [2197, 0, "\n"], + [2198, 0, "%"], + [2199, 0, "T"], + [2200, 0, "O"], + [2201, 0, "D"], + [2202, 0, "O"], + [2203, 0, " "], + [2204, 0, "m"], + [2205, 0, "e"], + [2206, 0, "n"], + [2207, 0, "t"], + [2208, 0, "i"], + [2209, 0, "o"], + [2210, 0, "n"], + [2211, 0, " "], + [2212, 0, "h"], + [2213, 0, "e"], + [2214, 0, "r"], + [2215, 0, "e"], + [2216, 0, " "], + [2217, 0, "s"], + [2218, 0, "o"], + [2219, 0, "m"], + [2219, 1], + [2218, 1], + [2217, 1], + [2217, 0, "t"], + [2218, 0, "h"], + [2219, 0, "a"], + [2220, 0, "t"], + [2221, 0, " "], + [2222, 0, "w"], + [2223, 0, "e"], + [2224, 0, " "], + [2225, 0, "s"], + [2226, 0, "h"], + [2227, 0, "o"], + [2228, 0, "u"], + [2229, 0, "l"], + [2230, 0, "d"], + [2231, 0, " "], + [2232, 0, "s"], + [2233, 0, "u"], + [2234, 0, "p"], + [2235, 0, "p"], + [2236, 0, "o"], + [2237, 0, "r"], + [2238, 0, "t"], + [2239, 0, " "], + [2239, 1], + [2238, 1], + [2237, 1], + [2236, 1], + [2235, 1], + [2234, 1], + [2233, 1], + [2232, 1], + [2231, 1], + [2230, 1], + [2229, 1], + [2228, 1], + [2227, 1], + [2226, 1], + [2225, 1], + [2224, 1], + [2223, 1], + [2222, 1], + [2222, 0, "t"], + [2223, 0, "h"], + [2224, 0, "i"], + [2225, 0, "s"], + [2226, 0, " "], + [2227, 0, "i"], + [2228, 0, "s"], + [2229, 0, " "], + [2230, 0, "p"], + [2231, 0, "a"], + [2232, 0, "r"], + [2233, 0, "t"], + [2234, 0, "i"], + [2235, 0, "c"], + [2236, 0, "u"], + [2237, 0, "l"], + [2238, 0, "a"], + [2239, 0, "r"], + [2240, 0, "l"], + [2241, 0, "y"], + [2242, 0, " "], + [2243, 0, "u"], + [2244, 0, "s"], + [2245, 0, "e"], + [2246, 0, "f"], + [2247, 0, "u"], + [2248, 0, "l"], + [2249, 0, " "], + [2250, 0, "f"], + [2251, 0, "o"], + [2252, 0, "r"], + [2253, 0, " "], + [2254, 0, "m"], + [2255, 0, "o"], + [2256, 0, "b"], + [2257, 0, "i"], + [2258, 0, "l"], + [2259, 0, "e"], + [2260, 0, " "], + [2261, 0, "s"], + [2262, 0, "y"], + [2263, 0, "s"], + [2264, 0, "t"], + [2265, 0, "e"], + [2266, 0, "m"], + [2267, 0, "s"], + [2268, 0, " "], + [2269, 0, "w"], + [2270, 0, "i"], + [2271, 0, "c"], + [2272, 0, "h"], + [2273, 0, " "], + [2273, 1], + [2272, 1], + [2271, 1], + [2270, 1], + [2270, 0, "h"], + [2271, 0, "i"], + [2272, 0, "c"], + [2273, 0, "h"], + [2274, 0, " "], + [2275, 0, "a"], + [2276, 0, "l"], + [2277, 0, "s"], + [2278, 0, "o"], + [2279, 0, " "], + [2280, 0, "s"], + [2280, 1], + [2279, 1], + [2278, 1], + [2277, 1], + [2276, 1], + [2275, 1], + [2275, 0, "s"], + [2276, 0, "u"], + [2277, 0, "p"], + [2278, 0, "p"], + [2278, 1], + [2277, 1], + [2277, 0, "f"], + [2278, 0, "f"], + [2279, 0, "e"], + [2280, 0, "r"], + [2281, 0, " "], + [2282, 0, "p"], + [2283, 0, "e"], + [2284, 0, "r"], + [2285, 0, "i"], + [2286, 0, "o"], + [2287, 0, "d"], + [2288, 0, "s"], + [2289, 0, " "], + [2290, 0, "o"], + [2291, 0, "f"], + [2292, 0, " "], + [2293, 0, "d"], + [2294, 0, "i"], + [2295, 0, "s"], + [2296, 0, "c"], + [2297, 0, "o"], + [2298, 0, "n"], + [2299, 0, "n"], + [2300, 0, "e"], + [2301, 0, "t"], + [2301, 1], + [2301, 0, "c"], + [2302, 0, "t"], + [2303, 0, "i"], + [2304, 0, "v"], + [2305, 0, "i"], + [2306, 0, "t"], + [2307, 0, "y"], + [2308, 0, " "], + [2309, 0, "a"], + [2310, 0, "n"], + [2311, 0, "d"], + [2312, 0, " "], + [2313, 0, "a"], + [2314, 0, "l"], + [2315, 0, "s"], + [2316, 0, "o"], + [2317, 0, " "], + [2318, 0, "u"], + [2319, 0, "s"], + [2320, 0, "e"], + [2321, 0, " "], + [2322, 0, "m"], + [2323, 0, "u"], + [2324, 0, "l"], + [2325, 0, "t"], + [2326, 0, "i"], + [2327, 0, "p"], + [2328, 0, "l"], + [2329, 0, "e"], + [2330, 0, " "], + [2331, 0, "i"], + [2332, 0, "n"], + [2333, 0, "t"], + [2334, 0, "e"], + [2335, 0, "r"], + [2336, 0, "f"], + [2337, 0, "a"], + [2338, 0, "c"], + [2339, 0, "e"], + [2340, 0, "s"], + [2341, 0, " "], + [2342, 0, "("], + [2343, 0, "w"], + [2344, 0, "h"], + [2345, 0, "i"], + [2346, 0, "c"], + [2347, 0, "h"], + [2348, 0, " "], + [2349, 0, "m"], + [2350, 0, "e"], + [2351, 0, "s"], + [2352, 0, "s"], + [2353, 0, "e"], + [2354, 0, "s"], + [2355, 0, "s"], + [2356, 0, " "], + [2357, 0, "w"], + [2357, 1], + [2356, 1], + [2355, 1], + [2354, 1], + [2354, 0, " "], + [2354, 1], + [2354, 0, "s"], + [2355, 0, " "], + [2356, 0, "w"], + [2357, 0, "i"], + [2358, 0, "t"], + [2359, 0, "h"], + [2360, 0, " "], + [2361, 0, "o"], + [2362, 0, "r"], + [2363, 0, "d"], + [2364, 0, "e"], + [2365, 0, "r"], + [2366, 0, "i"], + [2367, 0, "n"], + [2368, 0, "g"], + [2369, 0, ")"], + [2370, 0, "?"], + [2683, 0, "i"], + [2684, 0, "c"], + [2685, 0, "o"], + [2685, 1], + [2684, 1], + [2683, 1], + [2683, 0, "c"], + [2684, 0, "o"], + [2685, 0, "l"], + [2686, 0, "l"], + [2687, 0, "a"], + [2688, 0, "b"], + [2689, 0, "o"], + [2690, 0, "r"], + [2691, 0, "a"], + [2692, 0, "t"], + [2693, 0, "i"], + [2694, 0, "v"], + [2695, 0, "e"], + [2696, 0, " "], + [2695, 1], + [2694, 1], + [2693, 1], + [2692, 1], + [2691, 1], + [2690, 1], + [2689, 1], + [2688, 1], + [2687, 1], + [2686, 1], + [2685, 1], + [2684, 1], + [2683, 1], + [2682, 1], + [3040, 0, "i"], + [3040, 1], + [3040, 0, " "], + [3041, 0, "w"], + [3042, 0, "i"], + [3043, 0, "t"], + [3044, 0, "h"], + [3045, 0, " "], + [3046, 0, "t"], + [3047, 0, "h"], + [3048, 0, "e"], + [3049, 0, "s"], + [3050, 0, "e"], + [3051, 0, " "], + [3052, 0, "a"], + [3053, 0, "p"], + [3054, 0, "p"], + [3055, 0, "l"], + [3056, 0, "i"], + [3057, 0, "c"], + [3058, 0, "a"], + [3059, 0, "t"], + [3060, 0, "i"], + [3061, 0, "o"], + [3062, 0, "n"], + [3063, 0, "s"], + [3064, 0, " "], + [3065, 0, "a"], + [3066, 0, "s"], + [3067, 0, " "], + [3068, 0, "w"], + [3069, 0, "e"], + [3070, 0, "l"], + [3071, 0, "l"], + [3072, 0, " "], + [3073, 0, "a"], + [3074, 0, "s"], + [3074, 1], + [3073, 1], + [3072, 1], + [3071, 1], + [3070, 1], + [3069, 1], + [3068, 1], + [3067, 1], + [3066, 1], + [3065, 1], + [3064, 1], + [3063, 1], + [3062, 1], + [3061, 1], + [3060, 1], + [3059, 1], + [3058, 1], + [3057, 1], + [3056, 1], + [3055, 1], + [3054, 1], + [3053, 1], + [3052, 1], + [3051, 1], + [3050, 1], + [3049, 1], + [3048, 1], + [3047, 1], + [3046, 1], + [3045, 1], + [3044, 1], + [3043, 1], + [3042, 1], + [3041, 1], + [3040, 1], + [3128, 0, "\n"], + [3128, 0, "T"], + [3129, 0, "O"], + [3130, 0, "D"], + [3131, 0, "O"], + [3128, 0, "%"], + [3133, 0, " "], + [3134, 0, "T"], + [3135, 0, "h"], + [3136, 0, "i"], + [3137, 0, "s"], + [3138, 0, " "], + [3139, 0, "s"], + [3140, 0, "e"], + [3141, 0, "e"], + [3142, 0, "m"], + [3143, 0, "s"], + [3144, 0, " "], + [3145, 0, "l"], + [3146, 0, "i"], + [3147, 0, "k"], + [3148, 0, "e"], + [3149, 0, " "], + [3150, 0, "a"], + [3151, 0, " "], + [3152, 0, "c"], + [3152, 1], + [3152, 0, "f"], + [3153, 0, "a"], + [3154, 0, "l"], + [3155, 0, "s"], + [3156, 0, "e"], + [3157, 0, " "], + [3158, 0, "d"], + [3159, 0, "i"], + [3160, 0, "c"], + [3161, 0, "o"], + [3161, 1], + [3161, 0, "h"], + [3162, 0, "o"], + [3163, 0, "t"], + [3164, 0, "o"], + [3165, 0, "m"], + [3166, 0, "y"], + [3167, 0, " "], + [3168, 0, "t"], + [3169, 0, "o"], + [3170, 0, " "], + [3171, 0, "m"], + [3172, 0, "e"], + [3173, 0, ":"], + [3174, 0, " "], + [3175, 0, "s"], + [3176, 0, "o"], + [3177, 0, "m"], + [3178, 0, "e"], + [3179, 0, " "], + [3180, 0, "t"], + [3181, 0, "e"], + [3182, 0, "x"], + [3183, 0, "t"], + [3184, 0, " "], + [3185, 0, "d"], + [3186, 0, "o"], + [3187, 0, "c"], + [3188, 0, "u"], + [3189, 0, "m"], + [3190, 0, "e"], + [3191, 0, "n"], + [3192, 0, "t"], + [3193, 0, "s"], + [3194, 0, " "], + [3195, 0, "a"], + [3196, 0, "r"], + [3197, 0, "e"], + [3198, 0, " "], + [3199, 0, "f"], + [3200, 0, "o"], + [3201, 0, "r"], + [3202, 0, " "], + [3203, 0, "a"], + [3204, 0, " "], + [3205, 0, "s"], + [3206, 0, "i"], + [3207, 0, "n"], + [3208, 0, "g"], + [3209, 0, "l"], + [3210, 0, "e"], + [3211, 0, " "], + [3212, 0, "u"], + [3213, 0, "s"], + [3214, 0, "e"], + [3215, 0, "r"], + [3216, 0, " "], + [3217, 0, "m"], + [3218, 0, "e"], + [3219, 0, "r"], + [3220, 0, "g"], + [3221, 0, "e"], + [3222, 0, "d"], + [3223, 0, " "], + [3224, 0, "a"], + [3225, 0, "c"], + [3226, 0, "r"], + [3227, 0, "o"], + [3228, 0, "s"], + [3229, 0, "s"], + [3230, 0, " "], + [3231, 0, "t"], + [3232, 0, "h"], + [3233, 0, "e"], + [3234, 0, "r"], + [3234, 1], + [3234, 0, "i"], + [3235, 0, "r"], + [3236, 0, " "], + [3237, 0, "d"], + [3238, 0, "e"], + [3239, 0, "v"], + [3240, 0, "i"], + [3241, 0, "c"], + [3242, 0, "e"], + [3242, 1], + [3241, 1], + [3240, 1], + [3239, 1], + [3238, 1], + [3237, 1], + [3236, 1], + [3235, 1], + [3234, 1], + [3233, 1], + [3232, 1], + [3231, 1], + [3230, 1], + [3229, 1], + [3228, 1], + [3227, 1], + [3226, 1], + [3225, 1], + [3224, 1], + [3223, 1], + [3222, 1], + [3221, 1], + [3220, 1], + [3219, 1], + [3218, 1], + [3217, 1], + [3216, 1], + [3216, 0, ","], + [3217, 0, " "], + [3218, 0, "r"], + [3219, 0, "e"], + [3220, 0, "p"], + [3221, 0, "l"], + [3222, 0, "i"], + [3223, 0, "c"], + [3224, 0, "a"], + [3225, 0, "t"], + [3226, 0, "e"], + [3227, 0, "d"], + [3228, 0, " "], + [3229, 0, "a"], + [3230, 0, "c"], + [3231, 0, "r"], + [3232, 0, "o"], + [3233, 0, "s"], + [3234, 0, "s"], + [3235, 0, " "], + [3236, 0, "t"], + [3237, 0, "h"], + [3238, 0, "e"], + [3239, 0, "i"], + [3240, 0, "r"], + [3241, 0, " "], + [3242, 0, "d"], + [3243, 0, "e"], + [3244, 0, "v"], + [3245, 0, "i"], + [3246, 0, "c"], + [3247, 0, "e"], + [3248, 0, ","], + [3249, 0, " "], + [3250, 0, "y"], + [3251, 0, "e"], + [3252, 0, "t"], + [3253, 0, " "], + [3253, 1], + [3252, 1], + [3251, 1], + [3250, 1], + [3250, 0, "a"], + [3251, 0, "j"], + [3252, 0, "d"], + [3252, 1], + [3251, 1], + [3251, 0, "n"], + [3252, 0, "d"], + [3253, 0, " "], + [3254, 0, "c"], + [3255, 0, "a"], + [3256, 0, "l"], + [3257, 0, "e"], + [3258, 0, "n"], + [3259, 0, "d"], + [3260, 0, "a"], + [3261, 0, "r"], + [3262, 0, "s"], + [3263, 0, " "], + [3264, 0, "a"], + [3265, 0, "r"], + [3266, 0, "e"], + [3267, 0, " "], + [3268, 0, "o"], + [3269, 0, "f"], + [3270, 0, "t"], + [3271, 0, "e"], + [3272, 0, "n"], + [3273, 0, " "], + [3274, 0, "c"], + [3275, 0, "o"], + [3276, 0, "l"], + [3277, 0, "l"], + [3278, 0, "a"], + [3279, 0, "b"], + [3280, 0, "o"], + [3281, 0, "r"], + [3282, 0, "a"], + [3283, 0, "t"], + [3284, 0, "i"], + [3285, 0, "v"], + [3286, 0, "e"], + [3287, 0, "."], + [3288, 0, "."], + [3289, 0, "."], + [3448, 0, "d"], + [3449, 0, "w"], + [3477, 1], + [3476, 1], + [3475, 1], + [3474, 1], + [3473, 1], + [3472, 1], + [3471, 1], + [3470, 1], + [3469, 1], + [3468, 1], + [3467, 1], + [3466, 1], + [3465, 1], + [3464, 1], + [3463, 1], + [3462, 1], + [3461, 1], + [3460, 1], + [3459, 1], + [3458, 1], + [3457, 1], + [3456, 1], + [3455, 1], + [3454, 1], + [3453, 1], + [3452, 1], + [3451, 1], + [3450, 1], + [3449, 1], + [3448, 1], + [3448, 0, "T"], + [3496, 0, " "], + [3497, 0, "s"], + [3498, 0, "e"], + [3499, 0, "r"], + [3500, 0, "i"], + [3501, 0, "a"], + [3502, 0, "l"], + [3503, 0, "i"], + [3504, 0, "z"], + [3505, 0, "a"], + [3506, 0, "b"], + [3507, 0, "i"], + [3508, 0, "l"], + [3509, 0, "i"], + [3510, 0, "t"], + [3511, 0, "y"], + [3512, 0, ","], + [3677, 1], + [3676, 1], + [3675, 1], + [3674, 1], + [3681, 0, " "], + [3682, 0, "a"], + [3683, 0, "v"], + [3684, 0, "a"], + [3685, 0, "i"], + [3686, 0, "l"], + [3687, 0, "a"], + [3688, 0, "b"], + [3689, 0, "i"], + [3690, 0, "l"], + [3691, 0, "i"], + [3692, 0, "t"], + [3693, 0, "y"], + [3860, 1], + [3859, 1], + [3859, 0, "t"], + [3860, 0, "o"], + [3870, 1], + [3869, 1], + [3869, 0, "e"], + [3869, 1], + [3868, 1], + [3868, 0, "e"], + [3907, 1], + [3906, 1], + [3905, 1], + [3904, 1], + [3903, 1], + [3902, 1], + [3901, 1], + [3900, 1], + [3899, 1], + [3916, 1], + [3915, 1], + [3914, 1], + [3913, 1], + [3913, 0, "w"], + [3914, 0, "h"], + [3915, 0, "e"], + [3916, 0, "n"], + [3918, 0, "a"], + [3919, 0, " "], + [3936, 1], + [3935, 1], + [3935, 0, "s"], + [3934, 1], + [4129, 0, "i"], + [4129, 1], + [4129, 0, " "], + [4130, 0, "a"], + [4131, 0, "n"], + [4132, 0, "d"], + [4133, 0, " "], + [4134, 0, "t"], + [4135, 0, "h"], + [4136, 0, "e"], + [4137, 0, "r"], + [4138, 0, "e"], + [4139, 0, "f"], + [4140, 0, "o"], + [4141, 0, "r"], + [4142, 0, "e"], + [4143, 0, " "], + [4144, 0, "s"], + [4145, 0, "h"], + [4146, 0, "o"], + [4147, 0, "u"], + [4148, 0, "l"], + [4149, 0, "d"], + [4150, 0, " "], + [4151, 0, "b"], + [4152, 0, "e"], + [4154, 0, "a"], + [4155, 0, "v"], + [4156, 0, "o"], + [4157, 0, "i"], + [4158, 0, "d"], + [4159, 0, "e"], + [4160, 0, "d"], + [4161, 0, " "], + [4162, 0, "w"], + [4163, 0, "h"], + [4164, 0, "e"], + [4165, 0, "v"], + [4165, 1], + [4165, 0, "n"], + [4166, 0, "e"], + [4167, 0, "v"], + [4168, 0, "e"], + [4169, 0, "r"], + [4170, 0, " "], + [4171, 0, "p"], + [4172, 0, "o"], + [4173, 0, "s"], + [4174, 0, "s"], + [4175, 0, "i"], + [4176, 0, "b"], + [4177, 0, "l"], + [4178, 0, "e"], + [4179, 0, "."], + [4180, 0, "\n"], + [4240, 1], + [4239, 1], + [4238, 1], + [4237, 1], + [4236, 1], + [4235, 1], + [4234, 1], + [4233, 1], + [4232, 1], + [4231, 1], + [4230, 1], + [4229, 1], + [4228, 1], + [4227, 1], + [4226, 1], + [4225, 1], + [4224, 1], + [4223, 1], + [4222, 1], + [4221, 1], + [4220, 1], + [4219, 1], + [4218, 1], + [4217, 1], + [4216, 1], + [4215, 1], + [4214, 1], + [4213, 1], + [4212, 1], + [4211, 1], + [4210, 1], + [4209, 1], + [4208, 1], + [4207, 1], + [4206, 1], + [4205, 1], + [4204, 1], + [4203, 1], + [4202, 1], + [4201, 1], + [4200, 1], + [4199, 1], + [4198, 1], + [4197, 1], + [4196, 1], + [4195, 1], + [4194, 1], + [4193, 1], + [4192, 1], + [4191, 1], + [4190, 1], + [4189, 1], + [4188, 1], + [4187, 1], + [4186, 1], + [4185, 1], + [4184, 1], + [4183, 1], + [4182, 1], + [4181, 1], + [4180, 1], + [4642, 0, "\n"], + [4643, 0, "%"], + [4644, 0, "T"], + [4645, 0, "O"], + [4646, 0, "D"], + [4647, 0, "O"], + [4648, 0, " "], + [4649, 0, "w"], + [4650, 0, "h"], + [4651, 0, "i"], + [4652, 0, "l"], + [4653, 0, "e"], + [4654, 0, " "], + [4655, 0, "i"], + [4656, 0, "t"], + [4657, 0, " "], + [4658, 0, "i"], + [4659, 0, "s"], + [4660, 0, " "], + [4661, 0, "t"], + [4662, 0, "r"], + [4663, 0, "u"], + [4664, 0, "e"], + [4665, 0, " "], + [4666, 0, "t"], + [4666, 1], + [4665, 1], + [4664, 1], + [4663, 1], + [4662, 1], + [4662, 0, "e"], + [4663, 0, "c"], + [4664, 0, "h"], + [4665, 0, "n"], + [4666, 0, "i"], + [4667, 0, "c"], + [4668, 0, "a"], + [4669, 0, "l"], + [4670, 0, "l"], + [4671, 0, "y"], + [4672, 0, " "], + [4673, 0, "t"], + [4674, 0, "r"], + [4675, 0, "u"], + [4676, 0, " "], + [4676, 1], + [4676, 0, "e"], + [4677, 0, " "], + [4678, 0, "t"], + [4679, 0, "h"], + [4680, 0, "a"], + [4681, 0, "t"], + [4682, 0, " "], + [4683, 0, "w"], + [4684, 0, "e"], + [4685, 0, " "], + [4686, 0, "a"], + [4687, 0, "u"], + [4688, 0, "t"], + [4689, 0, "o"], + [4690, 0, "m"], + [4691, 0, "a"], + [4692, 0, "t"], + [4693, 0, "i"], + [4694, 0, "c"], + [4695, 0, "a"], + [4696, 0, "l"], + [4697, 0, "l"], + [4698, 0, "y"], + [4699, 0, " "], + [4700, 0, "m"], + [4701, 0, "e"], + [4702, 0, "r"], + [4703, 0, "g"], + [4704, 0, "e"], + [4705, 0, " "], + [4706, 0, "c"], + [4707, 0, "o"], + [4708, 0, "n"], + [4709, 0, "n"], + [4710, 0, "c"], + [4711, 0, "u"], + [4712, 0, "r"], + [4713, 0, "r"], + [4714, 0, "e"], + [4715, 0, "n"], + [4716, 0, "t"], + [4717, 0, " "], + [4718, 0, "m"], + [4719, 0, "o"], + [4720, 0, "d"], + [4721, 0, "s"], + [4722, 0, ","], + [4723, 0, " "], + [4724, 0, "w"], + [4725, 0, "e"], + [4726, 0, " "], + [4727, 0, "d"], + [4728, 0, "o"], + [4729, 0, " "], + [4730, 0, "t"], + [4731, 0, "h"], + [4732, 0, "i"], + [4733, 0, "s"], + [4734, 0, " "], + [4735, 0, "b"], + [4736, 0, "y"], + [4737, 0, " "], + [4738, 0, "i"], + [4739, 0, "n"], + [4740, 0, "t"], + [4741, 0, "r"], + [4742, 0, "o"], + [4743, 0, "d"], + [4744, 0, "u"], + [4745, 0, "c"], + [4746, 0, "t"], + [4746, 1], + [4746, 0, "i"], + [4747, 0, "n"], + [4748, 0, "g"], + [4749, 0, " "], + [4750, 0, "m"], + [4751, 0, "u"], + [4752, 0, "l"], + [4753, 0, "t"], + [4754, 0, "i"], + [4755, 0, "-"], + [4756, 0, "v"], + [4757, 0, "a"], + [4758, 0, "l"], + [4759, 0, "u"], + [4760, 0, "e"], + [4761, 0, "d"], + [4762, 0, " "], + [4763, 0, "r"], + [4764, 0, "e"], + [4765, 0, "g"], + [4766, 0, "i"], + [4767, 0, "s"], + [4768, 0, "t"], + [4769, 0, "e"], + [4770, 0, "r"], + [4771, 0, "e"], + [4772, 0, "d"], + [4772, 1], + [4771, 1], + [4771, 0, "s"], + [4772, 0, " "], + [4773, 0, "w"], + [4774, 0, "h"], + [4775, 0, "i"], + [4776, 0, "c"], + [4777, 0, "h"], + [4778, 0, " "], + [4779, 0, "t"], + [4780, 0, "h"], + [4781, 0, "e"], + [4781, 1], + [4780, 1], + [4779, 1], + [4779, 0, "t"], + [4780, 0, "h"], + [4781, 0, "e"], + [4782, 0, "n"], + [4783, 0, " "], + [4784, 0, "r"], + [4785, 0, "e"], + [4786, 0, "q"], + [4787, 0, "u"], + [4788, 0, "i"], + [4789, 0, "r"], + [4790, 0, "e"], + [4791, 0, " "], + [4792, 0, "a"], + [4793, 0, "p"], + [4794, 0, "p"], + [4795, 0, "l"], + [4796, 0, "i"], + [4797, 0, "c"], + [4798, 0, "a"], + [4799, 0, "t"], + [4800, 0, "i"], + [4801, 0, "o"], + [4802, 0, "n"], + [4803, 0, " "], + [4804, 0, "s"], + [4805, 0, "p"], + [4806, 0, "e"], + [4807, 0, "i"], + [4808, 0, "c"], + [4809, 0, "i"], + [4810, 0, "f"], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4807, 0, "c"], + [4808, 0, "i"], + [4809, 0, "f"], + [4810, 0, "i"], + [4811, 0, "c"], + [4812, 0, " "], + [4813, 0, "s"], + [4814, 0, "o"], + [4815, 0, "l"], + [4816, 0, "u"], + [4817, 0, "t"], + [4818, 0, "i"], + [4819, 0, "o"], + [4820, 0, "n"], + [4821, 0, "s"], + [4822, 0, " "], + [4823, 0, "("], + [4824, 0, "a"], + [4825, 0, "n"], + [4826, 0, "d"], + [4827, 0, " "], + [4828, 0, "p"], + [4829, 0, "o"], + [4830, 0, "s"], + [4831, 0, "s"], + [4832, 0, "i"], + [4833, 0, "b"], + [4834, 0, "l"], + [4835, 0, "y"], + [4836, 0, " "], + [4837, 0, "u"], + [4838, 0, "s"], + [4839, 0, "e"], + [4840, 0, "r"], + [4841, 0, " "], + [4842, 0, "i"], + [4843, 0, "n"], + [4844, 0, "t"], + [4845, 0, "e"], + [4846, 0, "r"], + [4847, 0, "v"], + [4848, 0, "e"], + [4849, 0, "n"], + [4850, 0, "t"], + [4851, 0, "i"], + [4852, 0, "o"], + [4853, 0, "n"], + [4854, 0, ")"], + [4855, 0, "."], + [4856, 0, " "], + [4857, 0, "C"], + [4858, 0, "a"], + [4859, 0, "n"], + [4860, 0, " "], + [4861, 0, "w"], + [4862, 0, "e"], + [4863, 0, " "], + [4864, 0, "c"], + [4865, 0, "o"], + [4866, 0, "n"], + [4867, 0, "v"], + [4868, 0, "e"], + [4869, 0, "u"], + [4869, 1], + [4869, 0, "y"], + [4870, 0, " "], + [4871, 0, "t"], + [4872, 0, "h"], + [4873, 0, "i"], + [4874, 0, "s"], + [4875, 0, " "], + [4876, 0, "c"], + [4876, 1], + [4876, 0, "s"], + [4877, 0, "u"], + [4878, 0, "b"], + [4879, 0, "t"], + [4880, 0, "l"], + [4880, 1], + [4880, 0, "e"], + [4881, 0, "l"], + [4882, 0, "t"], + [4883, 0, "y"], + [4884, 0, " "], + [4885, 0, "a"], + [4885, 1], + [4884, 1], + [4883, 1], + [4882, 1], + [4881, 1], + [4880, 1], + [4880, 0, "l"], + [4881, 0, "e"], + [4882, 0, "t"], + [4883, 0, "y"], + [4884, 0, " "], + [4885, 0, "a"], + [4886, 0, "t"], + [4887, 0, " "], + [4888, 0, "t"], + [4889, 0, "h"], + [4890, 0, "i"], + [4891, 0, "s"], + [4892, 0, " "], + [4893, 0, "p"], + [4894, 0, "o"], + [4895, 0, "i"], + [4896, 0, "n"], + [4897, 0, "t"], + [4898, 0, "?"], + [9072, 0, "x"], + [9073, 0, "x"], + [9074, 0, "x"], + [9094, 1], + [9093, 1], + [9092, 1], + [9091, 1], + [9090, 1], + [9089, 1], + [9088, 1], + [9087, 1], + [9086, 1], + [9085, 1], + [9084, 1], + [9083, 1], + [9082, 1], + [9081, 1], + [9080, 1], + [9079, 1], + [9078, 1], + [9077, 1], + [9076, 1], + [9075, 1], + [9074, 1], + [9073, 1], + [9072, 1], + [9072, 0, "i"], + [9073, 0, "N"], + [9072, 1], + [9140, 1], + [9140, 0, "."], + [9221, 0, "\n"], + [9220, 1], + [9219, 1], + [9218, 1], + [9217, 1], + [9216, 1], + [9215, 1], + [9214, 1], + [9213, 1], + [9212, 1], + [9211, 1], + [9210, 1], + [9209, 1], + [9208, 1], + [9207, 1], + [9206, 1], + [9205, 1], + [9204, 1], + [9203, 1], + [9202, 1], + [9201, 1], + [9200, 1], + [9199, 1], + [9198, 1], + [9197, 1], + [9196, 1], + [9195, 1], + [9194, 1], + [9193, 1], + [9192, 1], + [9191, 1], + [9190, 1], + [9189, 1], + [9188, 1], + [9187, 1], + [9186, 1], + [9185, 1], + [9184, 1], + [9183, 1], + [9182, 1], + [9181, 1], + [9180, 1], + [9179, 1], + [9178, 1], + [9177, 1], + [9176, 1], + [9175, 1], + [9174, 1], + [9173, 1], + [9172, 1], + [9171, 1], + [9170, 1], + [9169, 1], + [9168, 1], + [9167, 1], + [9166, 1], + [9165, 1], + [9164, 1], + [9163, 1], + [9162, 1], + [9161, 1], + [9160, 1], + [9159, 1], + [9158, 1], + [9157, 1], + [9156, 1], + [9155, 1], + [9154, 1], + [9153, 1], + [9152, 1], + [9151, 1], + [9150, 1], + [9149, 1], + [9148, 1], + [9147, 1], + [9146, 1], + [9145, 1], + [9144, 1], + [9143, 1], + [9142, 1], + [9141, 1], + [9151, 1], + [9150, 1], + [9149, 1], + [9148, 1], + [9147, 1], + [9146, 1], + [9145, 1], + [9144, 1], + [9143, 1], + [9142, 1], + [9142, 0, "C"], + [9143, 0, "o"], + [9144, 0, "n"], + [9145, 0, "s"], + [9146, 0, "e"], + [9147, 0, "q"], + [9148, 0, "u"], + [9149, 0, "e"], + [9150, 0, "n"], + [9151, 0, "t"], + [9152, 0, "l"], + [9153, 0, "y"], + [9154, 0, " "], + [9155, 0, "t"], + [9156, 0, "h"], + [9157, 0, "e"], + [9158, 0, " "], + [9159, 0, "l"], + [9160, 0, "o"], + [9161, 0, "n"], + [9162, 0, "g"], + [9163, 0, "-"], + [9164, 0, "t"], + [9165, 0, "e"], + [9166, 0, "r"], + [9167, 0, "m"], + [9168, 0, " "], + [9169, 0, "g"], + [9170, 0, "o"], + [9171, 0, "a"], + [9172, 0, "l"], + [9173, 0, " "], + [9174, 0, "o"], + [9175, 0, "f"], + [9176, 0, " "], + [9177, 0, "o"], + [9178, 0, "u"], + [9179, 0, "r"], + [9180, 0, " "], + [9181, 0, "w"], + [9182, 0, "o"], + [9183, 0, "r"], + [9184, 0, "k"], + [9185, 0, " "], + [9186, 0, "i"], + [9187, 0, "s"], + [9188, 0, " "], + [9189, 0, "t"], + [9190, 0, "o"], + [9203, 1], + [9202, 1], + [9201, 1], + [9200, 1], + [9264, 0, "i"], + [9264, 1], + [9264, 0, "i"], + [9264, 1], + [9264, 0, " "], + [9265, 0, "b"], + [9266, 0, "y"], + [9267, 0, " "], + [9268, 0, "p"], + [9269, 0, "r"], + [9270, 0, "o"], + [9271, 0, "v"], + [9272, 0, "i"], + [9273, 0, "d"], + [9274, 0, "i"], + [9275, 0, "n"], + [9276, 0, "g"], + [9277, 0, " "], + [9278, 0, "a"], + [9279, 0, " "], + [9279, 1], + [9279, 0, "n"], + [9280, 0, " "], + [9281, 0, "a"], + [9282, 0, "l"], + [9283, 0, "g"], + [9284, 0, "o"], + [9285, 0, "r"], + [9286, 0, "i"], + [9287, 0, "t"], + [9288, 0, "h"], + [9289, 0, " "], + [9290, 0, "m"], + [9290, 1], + [9289, 1], + [9289, 0, "m"], + [9290, 0, " "], + [9290, 1], + [9289, 1], + [9288, 1], + [9287, 1], + [9286, 1], + [9285, 1], + [9284, 1], + [9283, 1], + [9282, 1], + [9281, 1], + [9280, 1], + [9279, 1], + [9279, 0, " "], + [9280, 0, "g"], + [9281, 0, "e"], + [9282, 0, "n"], + [9283, 0, "e"], + [9284, 0, "r"], + [9285, 0, "a"], + [9286, 0, "l"], + [9287, 0, " "], + [9288, 0, "a"], + [9289, 0, "l"], + [9290, 0, "g"], + [9291, 0, "o"], + [9292, 0, "r"], + [9293, 0, "i"], + [9294, 0, "t"], + [9295, 0, "h"], + [9296, 0, "m"], + [9297, 0, " "], + [9298, 0, "t"], + [9298, 1], + [9298, 0, "f"], + [9299, 0, "o"], + [9300, 0, "r"], + [9301, 0, " "], + [9302, 0, "c"], + [9303, 0, "o"], + [9304, 0, "n"], + [9305, 0, "f"], + [9306, 0, "i"], + [9306, 1], + [9306, 0, "l"], + [9307, 0, "i"], + [9308, 0, "c"], + [9309, 0, "t"], + [9310, 0, " "], + [9311, 0, "r"], + [9312, 0, "e"], + [9313, 0, "s"], + [9314, 0, "o"], + [9315, 0, "l"], + [9316, 0, "u"], + [9317, 0, "t"], + [9318, 0, "i"], + [9319, 0, "o"], + [9320, 0, "n"], + [9321, 1], + [9321, 0, " "], + [9322, 0, "w"], + [9323, 0, "i"], + [9324, 0, "t"], + [9325, 0, "h"], + [9326, 0, " "], + [9326, 1], + [9325, 1], + [9324, 1], + [9323, 1], + [9322, 1], + [9321, 1], + [9321, 0, "."], + [9322, 0, " "], + [9323, 0, "S"], + [9324, 0, "u"], + [9325, 0, "c"], + [9326, 0, "h"], + [9327, 0, " "], + [9328, 0, "a"], + [9329, 0, "l"], + [9329, 1], + [9329, 0, "n"], + [9330, 0, " "], + [9331, 0, "a"], + [9332, 0, "l"], + [9333, 0, "g"], + [9334, 0, "o"], + [9335, 0, "r"], + [9336, 0, "i"], + [9337, 0, "t"], + [9338, 0, "h"], + [9339, 0, "m"], + [9340, 0, " "], + [9341, 0, "n"], + [9342, 0, "e"], + [9343, 0, "e"], + [9344, 0, "d"], + [9345, 0, "s"], + [9346, 0, " "], + [9347, 0, "t"], + [9348, 0, "o"], + [9349, 0, " "], + [9350, 0, "b"], + [9351, 0, "e"], + [9352, 0, " "], + [9352, 1], + [9351, 1], + [9350, 1], + [9349, 1], + [9348, 1], + [9347, 1], + [9346, 1], + [9345, 1], + [9344, 1], + [9343, 1], + [9342, 1], + [9341, 1], + [9341, 0, "m"], + [9342, 0, "u"], + [9343, 0, "s"], + [9344, 0, "t"], + [9345, 0, " "], + [9346, 0, "b"], + [9347, 0, "e"], + [9348, 0, " "], + [9349, 0, "a"], + [9350, 0, "m"], + [9351, 0, "e"], + [9352, 0, "n"], + [9353, 0, "a"], + [9354, 0, "b"], + [9355, 0, "l"], + [9356, 0, "e"], + [9357, 0, " "], + [9358, 0, "t"], + [9359, 0, "o"], + [9360, 0, " "], + [9360, 1], + [9359, 1], + [9358, 1], + [9357, 1], + [9356, 1], + [9355, 1], + [9354, 1], + [9353, 1], + [9352, 1], + [9351, 1], + [9350, 1], + [9349, 1], + [9348, 1], + [9347, 1], + [9346, 1], + [9345, 1], + [9344, 1], + [9343, 1], + [9342, 1], + [9341, 1], + [9340, 1], + [9339, 1], + [9338, 1], + [9337, 1], + [9336, 1], + [9335, 1], + [9334, 1], + [9333, 1], + [9332, 1], + [9331, 1], + [9330, 1], + [9329, 1], + [9328, 1], + [9327, 1], + [9326, 1], + [9325, 1], + [9324, 1], + [9323, 1], + [9322, 1], + [9321, 1], + [9321, 0, " "], + [9322, 0, "t"], + [9323, 0, "h"], + [9324, 0, "a"], + [9325, 0, "t"], + [9326, 0, " "], + [9327, 0, "i"], + [9328, 0, "s"], + [9329, 0, " "], + [9330, 0, "a"], + [9331, 0, "m"], + [9332, 0, "e"], + [9333, 0, "n"], + [9334, 0, "a"], + [9335, 0, "b"], + [9336, 0, "l"], + [9337, 0, "e"], + [9338, 0, " "], + [9339, 0, "t"], + [9340, 0, "o"], + [9341, 0, " "], + [9342, 0, "e"], + [9343, 0, "m"], + [9344, 0, "b"], + [9345, 0, "e"], + [9346, 0, "d"], + [9347, 0, "d"], + [9348, 0, "i"], + [9349, 0, "n"], + [9350, 0, "g"], + [9351, 0, " "], + [9351, 1], + [9350, 1], + [9349, 1], + [9348, 1], + [9347, 1], + [9346, 1], + [9345, 1], + [9344, 1], + [9343, 1], + [9343, 0, "n"], + [9344, 0, "a"], + [9345, 0, "p"], + [9346, 0, "s"], + [9347, 0, "u"], + [9348, 0, "l"], + [9349, 0, "a"], + [9350, 0, "t"], + [9351, 0, "i"], + [9352, 0, "o"], + [9353, 0, "n"], + [9354, 0, " "], + [9355, 0, "i"], + [9356, 0, "n"], + [9357, 0, "s"], + [9358, 0, "i"], + [9359, 0, "d"], + [9360, 0, "e"], + [9361, 0, " "], + [9362, 0, "a"], + [9363, 0, " "], + [9364, 0, "l"], + [9365, 0, "i"], + [9366, 0, "b"], + [9367, 0, "r"], + [9368, 0, "a"], + [9369, 0, "r"], + [9370, 0, "y"], + [9362, 1], + [9361, 1], + [9360, 1], + [9359, 1], + [9358, 1], + [9357, 1], + [9356, 1], + [9355, 1], + [9354, 1], + [9353, 1], + [9352, 1], + [9351, 1], + [9350, 1], + [9349, 1], + [9348, 1], + [9347, 1], + [9346, 1], + [9345, 1], + [9344, 1], + [9343, 1], + [9342, 1], + [9341, 1], + [9340, 1], + [9339, 1], + [9338, 1], + [9337, 1], + [9336, 1], + [9335, 1], + [9334, 1], + [9333, 1], + [9332, 1], + [9331, 1], + [9330, 1], + [9329, 1], + [9328, 1], + [9327, 1], + [9326, 1], + [9325, 1], + [9324, 1], + [9323, 1], + [9322, 1], + [9322, 0, "w"], + [9323, 0, "h"], + [9324, 0, "o"], + [9325, 0, "s"], + [9326, 0, "e"], + [9327, 0, " "], + [9328, 0, "d"], + [9329, 0, "e"], + [9330, 0, "t"], + [9331, 0, "a"], + [9332, 0, "i"], + [9333, 0, "l"], + [9334, 0, "s"], + [9335, 0, " "], + [9336, 0, "c"], + [9337, 0, "a"], + [9338, 0, "n"], + [9339, 0, " "], + [9340, 0, "l"], + [9341, 0, "a"], + [9342, 0, "r"], + [9343, 0, "g"], + [9344, 0, "e"], + [9345, 0, "l"], + [9346, 0, "y"], + [9347, 0, " "], + [9348, 0, "b"], + [9349, 0, "e"], + [9350, 0, " "], + [9351, 0, "i"], + [9352, 0, "n"], + [9352, 1], + [9351, 1], + [9351, 0, "h"], + [9352, 0, "i"], + [9353, 0, "d"], + [9354, 0, "d"], + [9355, 0, "e"], + [9356, 0, "n"], + [9357, 0, " "], + [9358, 0, "i"], + [9359, 0, "n"], + [9360, 0, "s"], + [9361, 0, "i"], + [9362, 0, "d"], + [9363, 0, "e"], + [9364, 0, " "], + [9365, 0, "a"], + [9366, 0, "n"], + [9367, 0, " "], + [9368, 0, "e"], + [9369, 0, "a"], + [9370, 0, "s"], + [9371, 0, "y"], + [9372, 0, "-"], + [9373, 0, "t"], + [9374, 0, "o"], + [9375, 0, "-"], + [9376, 0, "u"], + [9377, 0, "s"], + [9378, 0, "e"], + [9379, 0, " "], + [9380, 0, "s"], + [9381, 0, "o"], + [9382, 0, "f"], + [9383, 0, "t"], + [9384, 0, "a"], + [9384, 1], + [9384, 0, "w"], + [9385, 0, "a"], + [9386, 0, "r"], + [9387, 0, "e"], + [9396, 0, "."], + [9912, 0, "\n"], + [9913, 0, "\n"], + [9913, 1], + [9912, 1], + [9911, 1], + [9910, 1], + [9909, 1], + [9908, 1], + [9952, 1], + [9951, 1], + [9950, 1], + [9950, 0, "b"], + [9951, 0, "y"], + [12223, 1], + [12222, 1], + [12221, 1], + [12220, 1], + [12219, 1], + [12218, 1], + [12218, 0, "s"], + [12219, 0, "u"], + [12220, 0, "p"], + [12221, 0, "p"], + [12222, 0, "o"], + [12223, 0, "r"], + [12224, 0, "t"], + [12237, 1], + [12236, 1], + [12244, 1], + [12243, 1], + [12243, 0, "c"], + [12244, 0, "a"], + [12245, 0, "t"], + [12246, 0, "i"], + [12247, 0, "o"], + [12248, 0, "n"], + [74029, 0, " "], + [74030, 0, "T"], + [74031, 0, "h"], + [74032, 0, "a"], + [74033, 0, "n"], + [74034, 0, "k"], + [74035, 0, " "], + [74036, 0, "y"], + [74037, 0, "o"], + [74038, 0, "u"], + [74039, 0, " "], + [74040, 0, "t"], + [74041, 0, "o"], + [74042, 0, " "], + [74043, 0, "D"], + [74044, 0, "i"], + [74045, 0, "a"], + [74046, 0, "n"], + [74047, 0, "a"], + [74048, 0, " "], + [74049, 0, "V"], + [74050, 0, "a"], + [74051, 0, "s"], + [74052, 0, "i"], + [74053, 0, "l"], + [74054, 0, "e"], + [74055, 0, " "], + [74056, 0, "f"], + [74057, 0, "o"], + [74058, 0, "r"], + [74059, 0, " "], + [74060, 0, "c"], + [74061, 0, "o"], + [74062, 0, "m"], + [74063, 0, "m"], + [74064, 0, "e"], + [74065, 0, "n"], + [74066, 0, "t"], + [74067, 0, "s"], + [74068, 0, " "], + [74069, 0, "o"], + [74070, 0, "n"], + [74071, 0, " "], + [74072, 0, "a"], + [74073, 0, " "], + [74074, 0, "d"], + [74075, 0, "r"], + [74076, 0, "a"], + [74077, 0, "f"], + [74078, 0, "t"], + [74079, 0, " "], + [74080, 0, "o"], + [74081, 0, "f"], + [74082, 0, " "], + [74083, 0, "t"], + [74084, 0, "h"], + [74085, 0, "i"], + [74086, 0, "s"], + [74087, 0, " "], + [74088, 0, "p"], + [74089, 0, "a"], + [74090, 0, "p"], + [74091, 0, "e"], + [74092, 0, "r"], + [74093, 0, "."], + [74043, 0, "D"], + [74044, 0, "o"], + [74045, 0, "m"], + [74046, 0, "i"], + [74047, 0, "n"], + [74048, 0, "i"], + [74049, 0, "c"], + [74050, 0, " "], + [74051, 0, "O"], + [74052, 0, "r"], + [74053, 0, "c"], + [74054, 0, "h"], + [74055, 0, "a"], + [74056, 0, "r"], + [74057, 0, "d"], + [74058, 0, " "], + [74059, 0, "a"], + [74060, 0, "n"], + [74061, 0, "d"], + [74062, 0, " "], + [1568, 1], + [1567, 1], + [1566, 1], + [1565, 1], + [1564, 1], + [1563, 1], + [1562, 1], + [1561, 1], + [1560, 1], + [1559, 1], + [1558, 1], + [1557, 1], + [1556, 1], + [1555, 1], + [1554, 1], + [1553, 1], + [1552, 1], + [1551, 1], + [1550, 1], + [1549, 1], + [1548, 1], + [1547, 1], + [1546, 1], + [1545, 1], + [1544, 1], + [1616, 0, ","], + [1617, 0, " "], + [1618, 0, "i"], + [1619, 0, "t"], + [1620, 0, " "], + [1621, 0, "i"], + [1622, 0, "s"], + [1623, 0, " "], + [1624, 0, "u"], + [1625, 0, "n"], + [1626, 0, "c"], + [1627, 0, "l"], + [1628, 0, "e"], + [1629, 0, "a"], + [1630, 0, "r"], + [1631, 0, " "], + [1632, 0, "w"], + [1633, 0, "h"], + [1634, 0, "a"], + [1635, 0, "t"], + [1636, 0, " "], + [1637, 0, "t"], + [1638, 0, "h"], + [1639, 0, "e"], + [1640, 0, " "], + [1641, 0, "s"], + [1642, 0, "e"], + [1643, 0, "m"], + [1644, 0, "a"], + [1645, 0, "n"], + [1646, 0, "t"], + [1647, 0, "i"], + [1648, 0, "c"], + [1649, 0, "s"], + [1650, 0, " "], + [1651, 0, "s"], + [1652, 0, "h"], + [1653, 0, "o"], + [1654, 0, "u"], + [1655, 0, "l"], + [1656, 0, "d"], + [1657, 0, " "], + [1658, 0, "b"], + [1659, 0, "e"], + [2493, 0, "O"], + [2494, 0, "p"], + [2495, 0, "e"], + [2496, 0, "r"], + [2497, 0, "a"], + [2498, 0, "t"], + [2499, 0, "i"], + [2500, 0, "o"], + [2501, 0, "n"], + [2502, 0, "a"], + [2503, 0, "l"], + [2504, 0, " "], + [7804, 1], + [7803, 1], + [7802, 1], + [7801, 1], + [7800, 1], + [7799, 1], + [7799, 0, "d"], + [7800, 0, "e"], + [7801, 0, "f"], + [7802, 0, "i"], + [7803, 0, "n"], + [7804, 0, "e"], + [7826, 1], + [7825, 1], + [7824, 1], + [7823, 1], + [7822, 1], + [7831, 1], + [7830, 1], + [7830, 0, "i"], + [7831, 0, "n"], + [7832, 0, "g"], + [25278, 1], + [25277, 1], + [25276, 1], + [25275, 1], + [25274, 1], + [25273, 1], + [25272, 1], + [25271, 1], + [25270, 1], + [25269, 1], + [25268, 1], + [25267, 1], + [25266, 1], + [25265, 1], + [25264, 1], + [25263, 1], + [25262, 1], + [25262, 0, "i"], + [25263, 0, "s"], + [25264, 0, " "], + [25265, 0, "k"], + [25266, 0, "e"], + [25267, 0, "y"], + [25268, 0, "-"], + [25269, 0, "v"], + [25270, 0, "a"], + [25271, 0, "l"], + [25272, 0, "u"], + [25273, 0, "e"], + [25274, 0, " "], + [25275, 0, "t"], + [25275, 1], + [25275, 0, "s"], + [25276, 0, "t"], + [25277, 0, "r"], + [25278, 0, "u"], + [25279, 0, "c"], + [25280, 0, "t"], + [25281, 0, "u"], + [25282, 0, "r"], + [25283, 0, "e"], + [25284, 0, " "], + [25285, 0, "i"], + [25286, 0, "s"], + [25310, 0, ","], + [37794, 1], + [37793, 1], + [37792, 1], + [37791, 1], + [37790, 1], + [37789, 1], + [37788, 1], + [37787, 1], + [37786, 1], + [37785, 1], + [37784, 1], + [37783, 1], + [37783, 0, "e"], + [37784, 0, "v"], + [37785, 0, "a"], + [37786, 0, "l"], + [37787, 0, "u"], + [37788, 0, "a"], + [37789, 0, "t"], + [37790, 0, "i"], + [37791, 0, "o"], + [37792, 0, "n"], + [37793, 0, " "], + [37794, 0, "r"], + [37795, 0, "u"], + [37796, 0, "l"], + [37797, 0, "e"], + [37798, 0, "s"], + [37799, 0, " "], + [37800, 0, "o"], + [37801, 0, "f"], + [37849, 1], + [37848, 1], + [37847, 1], + [37846, 1], + [37845, 1], + [37844, 1], + [37843, 1], + [37842, 1], + [37841, 1], + [37840, 1], + [37839, 1], + [37838, 1], + [37837, 1], + [37836, 1], + [37835, 1], + [37834, 1], + [37833, 1], + [37832, 1], + [37831, 1], + [37830, 1], + [37829, 1], + [37828, 1], + [37827, 1], + [37826, 1], + [37825, 1], + [37824, 1], + [37875, 1], + [37874, 1], + [37873, 1], + [37872, 1], + [37871, 1], + [37871, 0, "t"], + [37872, 0, "h"], + [37873, 0, "e"], + [37874, 0, "y"], + [46504, 1], + [46490, 1], + [46489, 1], + [46488, 1], + [46487, 1], + [46486, 1], + [46485, 1], + [46484, 1], + [46483, 1], + [46482, 1], + [46482, 0, "r"], + [46483, 0, "u"], + [46484, 0, "l"], + [46485, 0, "e"], + [46486, 0, "s"], + [46561, 0, "a"], + [46562, 0, "l"], + [46563, 0, "r"], + [46564, 0, "e"], + [46565, 0, "a"], + [46566, 0, "d"], + [46567, 0, "y"], + [46568, 0, " "], + [51702, 1], + [51701, 1], + [51700, 1], + [51699, 1], + [51698, 1], + [51697, 1], + [51696, 1], + [51695, 1], + [51694, 1], + [51693, 1], + [51693, 0, "i"], + [51694, 0, "r"], + [51695, 0, " "], + [51696, 0, "e"], + [51697, 0, "f"], + [51698, 0, "f"], + [51699, 0, "e"], + [51700, 0, "c"], + [51701, 0, "t"], + [73348, 0, " "], + [73349, 0, "u"], + [73350, 0, "n"], + [73351, 0, "d"], + [73352, 0, "e"], + [73353, 0, "r"], + [73354, 0, "s"], + [73355, 0, "t"], + [73356, 0, "a"], + [73357, 0, "n"], + [73358, 0, "d"], + [73359, 0, " "], + [73360, 0, "t"], + [73361, 0, "h"], + [73362, 0, "e"], + [73363, 0, " "], + [73364, 0, "e"], + [73365, 0, "x"], + [73366, 0, "p"], + [73367, 0, "e"], + [73368, 0, "c"], + [73369, 0, "t"], + [73370, 0, "a"], + [73371, 0, "t"], + [73372, 0, "i"], + [73373, 0, "o"], + [73374, 0, "n"], + [73375, 0, "s"], + [73376, 0, " "], + [73377, 0, "o"], + [73378, 0, "f"], + [73379, 0, " "], + [73380, 0, "a"], + [73381, 0, "p"], + [73382, 0, "p"], + [73383, 0, "l"], + [73384, 0, "i"], + [73385, 0, "c"], + [73386, 0, "a"], + [73387, 0, "t"], + [73388, 0, "i"], + [73389, 0, "o"], + [73390, 0, "n"], + [73391, 0, " "], + [73392, 0, "p"], + [73393, 0, "r"], + [73394, 0, "o"], + [73395, 0, "g"], + [73396, 0, "r"], + [73397, 0, "a"], + [73398, 0, "m"], + [73399, 0, "m"], + [73400, 0, "e"], + [73401, 0, "r"], + [73402, 0, "s"], + [73403, 0, " "], + [73404, 0, "a"], + [73405, 0, "n"], + [73406, 0, "d"], + [73407, 0, " "], + [73408, 0, "t"], + [73409, 0, "o"], + [73410, 0, " "], + [73411, 0, "d"], + [73412, 0, "e"], + [73413, 0, "s"], + [73414, 0, "i"], + [73415, 0, "g"], + [73416, 0, "n"], + [73417, 0, " "], + [73418, 0, "d"], + [73419, 0, "a"], + [73420, 0, "t"], + [73421, 0, "a"], + [73422, 0, " "], + [73423, 0, "s"], + [73424, 0, "t"], + [73425, 0, "r"], + [73426, 0, "u"], + [73427, 0, "c"], + [73428, 0, "t"], + [73429, 0, "u"], + [73430, 0, "r"], + [73431, 0, "e"], + [73432, 0, "s"], + [73433, 0, " "], + [73434, 0, "t"], + [73435, 0, "h"], + [73436, 0, "a"], + [73437, 0, "t"], + [73438, 0, " "], + [73439, 0, "a"], + [73440, 0, "r"], + [73441, 0, "e"], + [73442, 0, " "], + [73443, 0, "m"], + [73444, 0, "i"], + [73445, 0, "n"], + [73446, 0, "i"], + [73447, 0, "m"], + [73448, 0, "a"], + [73449, 0, "l"], + [73450, 0, " "], + [73451, 0, "s"], + [73451, 1], + [73450, 1], + [73450, 0, "l"], + [73451, 0, "y"], + [73452, 0, " "], + [73453, 0, "s"], + [73454, 0, "u"], + [73455, 0, "r"], + [73456, 0, "p"], + [73457, 0, "r"], + [73458, 0, "i"], + [73459, 0, "s"], + [73460, 0, "i"], + [73461, 0, "n"], + [73462, 0, "g"], + [73463, 0, " "], + [73464, 0, "u"], + [73465, 0, "n"], + [73466, 0, "d"], + [73467, 0, "e"], + [73468, 0, "r"], + [73469, 0, " "], + [73470, 0, "c"], + [73471, 0, "o"], + [73472, 0, "n"], + [73473, 0, "c"], + [73474, 0, "u"], + [73475, 0, "r"], + [73476, 0, "r"], + [73477, 0, "e"], + [73478, 0, "n"], + [73479, 0, "t"], + [73480, 0, " "], + [73481, 0, "m"], + [73482, 0, "o"], + [73483, 0, "d"], + [73484, 0, "i"], + [73485, 0, "f"], + [73486, 0, "i"], + [73487, 0, "c"], + [73488, 0, "a"], + [73489, 0, "t"], + [73490, 0, "i"], + [73491, 0, "o"], + [73492, 0, "n"], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73493, 1], + [73157, 0, "i"], + [73158, 0, "i"], + [73158, 1], + [73157, 1], + [3157, 0, "s"], + [17640, 0, " "], + [17641, 0, "b"], + [17642, 0, "e"], + [17657, 1], + [17657, 1], + [17657, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 1], + [1136, 0, "M"], + [1137, 0, "a"], + [1138, 0, "r"], + [1139, 0, "t"], + [1140, 0, "i"], + [1141, 0, "n"], + [1142, 0, " "], + [1143, 0, "K"], + [1144, 0, "l"], + [1145, 0, "e"], + [1146, 0, "p"], + [1147, 0, "p"], + [1148, 0, "m"], + [1149, 0, "a"], + [1150, 0, "n"], + [1151, 0, "n"], + [1164, 1], + [1163, 1], + [1162, 1], + [1161, 1], + [1160, 1], + [1159, 1], + [1158, 1], + [1158, 0, "l"], + [1159, 0, "a"], + [1160, 0, "s"], + [1161, 0, "t"], + [1162, 0, "a"], + [1163, 0, "i"], + [1164, 0, "r"], + [1165, 0, " "], + [1166, 0, "R"], + [1167, 0, "."], + [1168, 0, " "], + [1169, 0, "B"], + [1170, 0, "e"], + [1171, 0, "r"], + [1172, 0, "e"], + [1173, 0, "s"], + [1174, 0, "f"], + [1175, 0, "o"], + [1176, 0, "r"], + [1177, 0, "d"], + [1215, 1], + [1214, 1], + [1213, 1], + [1212, 1], + [1211, 1], + [1210, 1], + [1209, 1], + [1208, 1], + [1207, 1], + [1206, 1], + [1205, 1], + [1204, 1], + [1203, 1], + [1202, 1], + [1201, 1], + [1200, 1], + [1199, 1], + [1198, 1], + [1197, 1], + [1196, 1], + [1195, 1], + [1194, 1], + [1193, 1], + [1192, 1], + [1191, 1], + [1190, 1], + [1189, 1], + [1188, 1], + [1187, 1], + [1187, 0, "C"], + [1188, 0, "o"], + [1189, 0, "m"], + [1190, 0, "p"], + [1191, 0, "u"], + [1192, 0, "t"], + [1193, 0, "e"], + [1194, 0, "r"], + [1195, 0, " "], + [1196, 0, "L"], + [1197, 0, "a"], + [1198, 0, "b"], + [1199, 0, "o"], + [1200, 0, "r"], + [1201, 0, "a"], + [1202, 0, "t"], + [1203, 0, "o"], + [1204, 0, "r"], + [1205, 0, "y"], + [1206, 0, ","], + [1207, 0, " "], + [1208, 0, "U"], + [1209, 0, "n"], + [1210, 0, "i"], + [1211, 0, "v"], + [1212, 0, "e"], + [1213, 0, "r"], + [1214, 0, "s"], + [1215, 0, "i"], + [1216, 0, "t"], + [1217, 0, "y"], + [1218, 0, " "], + [1219, 0, "o"], + [1220, 0, "f"], + [1221, 0, " "], + [1222, 0, "C"], + [1223, 0, "a"], + [1224, 0, "m"], + [1225, 0, "b"], + [1226, 0, "r"], + [1227, 0, "i"], + [1228, 0, "d"], + [1229, 0, "g"], + [1230, 0, "e"], + [1231, 0, ","], + [1232, 0, " "], + [1233, 0, "U"], + [1234, 0, "K"], + [1235, 0, "."], + [1236, 0, "\\"], + [1237, 0, "\\"], + [1237, 1], + [1237, 0, "p"], + [1238, 0, "r"], + [1239, 0, "o"], + [1240, 0, "t"], + [1241, 0, "e"], + [1242, 0, "c"], + [1243, 0, "t"], + [1244, 0, "\\"], + [1245, 0, "\\"], + [1246, 0, "\n"], + [1247, 0, "E"], + [1248, 0, "m"], + [1249, 0, "a"], + [1250, 0, "i"], + [1251, 0, "l"], + [1252, 0, ":"], + [1253, 0, " "], + [1254, 0, "\\"], + [1255, 0, "u"], + [1256, 0, "r"], + [1257, 0, "l"], + [1258, 0, "{"], + [1259, 0, "m"], + [1260, 0, "k"], + [1261, 0, "4"], + [1262, 0, "2"], + [1263, 0, "8"], + [1264, 0, "@"], + [1265, 0, "c"], + [1266, 0, "l"], + [1267, 0, "."], + [1268, 0, "c"], + [1269, 0, "a"], + [1270, 0, "m"], + [1271, 0, "."], + [1272, 0, "a"], + [1273, 0, "c"], + [1274, 0, "."], + [1275, 0, "u"], + [1276, 0, "k"], + [1277, 0, "}"], + [1231, 0, " "], + [1232, 0, "C"], + [1233, 0, "o"], + [1234, 0, "m"], + [1235, 0, "p"], + [1236, 0, "u"], + [1237, 0, "t"], + [1238, 0, "e"], + [1239, 0, "r"], + [1240, 0, " "], + [1241, 0, "L"], + [1242, 0, "a"], + [1243, 0, "b"], + [1244, 0, "o"], + [1245, 0, "r"], + [1246, 0, "a"], + [1247, 0, "t"], + [1248, 0, "o"], + [1249, 0, "r"], + [1250, 0, "y"], + [1252, 0, " "], + [1253, 0, "C"], + [1254, 0, "a"], + [1255, 0, "n"], + [1256, 0, "m"], + [1257, 0, "b"], + [1257, 1], + [1256, 1], + [1255, 1], + [1255, 0, "m"], + [1256, 0, "b"], + [1257, 0, "r"], + [1258, 0, "i"], + [1259, 0, "d"], + [1260, 0, "g"], + [1261, 0, "e"], + [1262, 0, ","], + [1206, 1], + [1205, 1], + [1204, 1], + [1203, 1], + [1202, 1], + [1201, 1], + [1200, 1], + [1199, 1], + [1198, 1], + [1197, 1], + [1196, 1], + [1195, 1], + [1194, 1], + [1193, 1], + [1192, 1], + [1191, 1], + [1190, 1], + [1189, 1], + [1188, 1], + [1187, 1], + [1187, 0, "M"], + [1188, 0, "."], + [1189, 0, " "], + [1190, 0, "K"], + [1191, 0, "l"], + [1192, 0, "e"], + [1193, 0, "p"], + [1194, 0, "p"], + [1195, 0, "m"], + [1196, 0, "a"], + [1197, 0, "n"], + [1198, 0, "n"], + [1199, 0, " "], + [1200, 0, "a"], + [1201, 0, "n"], + [1202, 0, "d"], + [1203, 0, " "], + [1204, 0, "A"], + [1205, 0, "."], + [1206, 0, " "], + [1207, 0, "B"], + [1207, 1], + [1206, 1], + [1206, 0, " "], + [1207, 0, "B"], + [1208, 0, "e"], + [1209, 0, "r"], + [1210, 0, "e"], + [1211, 0, "s"], + [1212, 0, "f"], + [1213, 0, "o"], + [1214, 0, "r"], + [1215, 0, "d"], + [1216, 0, " "], + [1217, 0, "a"], + [1218, 0, "r"], + [1219, 0, "e"], + [1220, 0, " "], + [1221, 0, "w"], + [1222, 0, "i"], + [1223, 0, "t"], + [1224, 0, "h"], + [1225, 0, " "], + [1226, 0, "t"], + [1227, 0, "h"], + [1228, 0, "e"], + [1299, 1], + [1330, 0, ","], + [1331, 0, " "], + [1332, 0, "\\"], + [1333, 0, "u"], + [1334, 0, "r"], + [1335, 0, "l"], + [1336, 0, "{"], + [1337, 0, "a"], + [1338, 0, "r"], + [1339, 0, "b"], + [1340, 0, "3"], + [1341, 0, "3"], + [1342, 0, "@"], + [1343, 0, "c"], + [1344, 0, "l"], + [1345, 0, "."], + [1346, 0, "c"], + [1347, 0, "a"], + [1348, 0, "m"], + [1349, 0, "."], + [1350, 0, "a"], + [1351, 0, "c"], + [1352, 0, "."], + [1353, 0, "u"], + [1354, 0, "k"], + [1357, 0, "}"], + [1206, 0, "R"], + [1207, 0, "."], + [1358, 0, "."], + [75198, 0, " "], + [75199, 0, "$"], + [75200, 0, "n"], + [75201, 0, "$"], + [75166, 0, " "], + [75167, 0, "$"], + [75168, 0, "H"], + [75169, 0, "_"], + [75170, 0, "p"], + [75171, 0, "$"], + [75219, 0, ":"], + [76961, 0, " "], + [76962, 0, "T"], + [76963, 0, "h"], + [76964, 0, "e"], + [76965, 0, " "], + [76966, 0, "p"], + [76967, 0, "r"], + [76968, 0, "e"], + [76969, 0, "f"], + [76970, 0, "i"], + [76971, 0, "x"], + [76972, 0, " "], + [76973, 0, "c"], + [76974, 0, "o"], + [76975, 0, "n"], + [76976, 0, "t"], + [76977, 0, "a"], + [76978, 0, "i"], + [76979, 0, "n"], + [76980, 0, "s"], + [76981, 0, " "], + [76982, 0, "a"], + [76983, 0, "l"], + [76984, 0, "l"], + [76985, 0, " "], + [76986, 0, "c"], + [76987, 0, "a"], + [76988, 0, "u"], + [76989, 0, "s"], + [76990, 0, "a"], + [76991, 0, "l"], + [76992, 0, "l"], + [76993, 0, "y"], + [76994, 0, " "], + [76986, 0, "o"], + [76987, 0, "p"], + [76988, 0, "e"], + [76989, 0, "r"], + [76990, 0, "a"], + [76991, 0, "t"], + [76992, 0, "i"], + [76993, 0, "o"], + [76994, 0, "n"], + [76995, 0, "s"], + [76996, 0, " "], + [76997, 0, "t"], + [76998, 0, "h"], + [76999, 0, "a"], + [77000, 0, "t"], + [77001, 0, " "], + [77011, 0, "p"], + [77012, 0, "r"], + [77013, 0, "e"], + [77014, 0, "c"], + [77015, 0, "e"], + [77016, 0, "d"], + [77017, 0, "e"], + [77018, 0, " "], + [77019, 0, "$"], + [77020, 0, "o"], + [77021, 0, "_"], + [77022, 0, "{"], + [77023, 0, "n"], + [77024, 0, "+"], + [77025, 0, "1"], + [77026, 0, "}"], + [77027, 0, "$"], + [77028, 0, ","], + [77029, 0, " "], + [77030, 0, "a"], + [77031, 0, "n"], + [77032, 0, "d"], + [77033, 0, " "], + [77034, 0, "p"], + [77035, 0, "o"], + [77036, 0, "s"], + [77037, 0, "s"], + [77038, 0, "i"], + [77039, 0, "b"], + [77040, 0, "y"], + [77040, 1], + [77040, 0, "l"], + [77041, 0, "y"], + [77042, 0, " "], + [77043, 0, "s"], + [77044, 0, "o"], + [77045, 0, "m"], + [77046, 0, "e"], + [77047, 0, " "], + [77048, 0, "o"], + [77049, 0, "p"], + [77050, 0, "e"], + [77051, 0, "r"], + [77052, 0, "a"], + [77053, 0, "t"], + [77054, 0, "i"], + [77055, 0, "o"], + [77056, 0, "n"], + [77057, 0, "s"], + [77058, 0, " "], + [77059, 0, "c"], + [77059, 1], + [77059, 0, "t"], + [77060, 0, "h"], + [77061, 0, "a"], + [77062, 0, "t"], + [77063, 0, " "], + [77064, 0, "a"], + [77065, 0, "r"], + [77066, 0, "e"], + [77067, 0, " "], + [77068, 0, "c"], + [77069, 0, "o"], + [77070, 0, "n"], + [77071, 0, "c"], + [77072, 0, "u"], + [77073, 0, "r"], + [77074, 0, "r"], + [77075, 0, "e"], + [77076, 0, "n"], + [77077, 0, "t"], + [77078, 0, " "], + [77079, 0, "w"], + [77080, 0, "i"], + [77081, 0, "t"], + [77082, 0, "h"], + [77083, 0, " "], + [77084, 0, "$"], + [77085, 0, "o"], + [77086, 0, "_"], + [77087, 0, "{"], + [77088, 0, "n"], + [77089, 0, "+"], + [77090, 0, "1"], + [77091, 0, "}"], + [77092, 0, "$"], + [77093, 0, ";"], + [77094, 0, " "], + [77095, 0, "t"], + [77096, 0, "h"], + [77097, 0, "e"], + [77098, 0, " "], + [77099, 0, "s"], + [77100, 0, "u"], + [77101, 0, "f"], + [77102, 0, "f"], + [77103, 0, "i"], + [77104, 0, "x"], + [77105, 0, " "], + [77106, 0, "c"], + [77107, 0, "o"], + [77108, 0, "n"], + [77109, 0, "t"], + [77110, 0, "a"], + [77111, 0, "i"], + [77112, 0, "n"], + [77113, 0, "s"], + [77114, 0, " "], + [77115, 0, "o"], + [77116, 0, "n"], + [77117, 0, "l"], + [77118, 0, "y"], + [77119, 0, " "], + [77120, 0, "o"], + [77121, 0, "p"], + [77122, 0, "e"], + [77123, 0, "r"], + [77124, 0, "a"], + [77125, 0, "t"], + [77126, 0, "i"], + [77127, 0, "o"], + [77128, 0, "n"], + [77129, 0, "s"], + [77130, 0, " "], + [77131, 0, "t"], + [77132, 0, "h"], + [77133, 0, "a"], + [77134, 0, "t"], + [77135, 0, " "], + [77136, 0, "a"], + [77137, 0, "r"], + [77138, 0, "e"], + [77139, 0, " "], + [77140, 0, "c"], + [77141, 0, "o"], + [77142, 0, "n"], + [77143, 0, "c"], + [77144, 0, "u"], + [77145, 0, "r"], + [77146, 0, "r"], + [77147, 0, "e"], + [77148, 0, "n"], + [77149, 0, "t"], + [77150, 0, " "], + [77151, 0, "w"], + [77152, 0, "i"], + [77153, 0, "t"], + [77154, 0, "h"], + [77155, 0, " "], + [77156, 0, "$"], + [77157, 0, "o"], + [77158, 0, "_"], + [77159, 0, "{"], + [77160, 0, "n"], + [77161, 0, "+"], + [77162, 0, "1"], + [77163, 0, "}"], + [77164, 0, "$"], + [77165, 0, "."], + [77384, 0, " "], + [77385, 0, "n"], + [77386, 0, "e"], + [77387, 0, "e"], + [77388, 0, "d"], + [77389, 0, " "], + [77390, 0, "t"], + [77391, 0, "o"], + [77692, 0, "="], + [77692, 1], + [77691, 1], + [77690, 1], + [77690, 0, "n"], + [77691, 0, "y"], + [78230, 1], + [78230, 0, "j"], + [78299, 1], + [78299, 0, "j"], + [78343, 1], + [78343, 0, "j"], + [78176, 1], + [78175, 1], + [78174, 1], + [78173, 1], + [78172, 1], + [78171, 1], + [78170, 1], + [78169, 1], + [78168, 1], + [78167, 1], + [78166, 1], + [78166, 0, " "], + [78167, 0, "s"], + [78168, 0, "u"], + [78169, 0, "c"], + [78170, 0, "c"], + [78171, 0, "e"], + [78172, 0, "s"], + [78173, 0, "s"], + [78174, 0, "i"], + [78175, 0, "o"], + [78176, 0, "n"], + [78195, 1], + [78195, 0, "j"], + [78206, 1], + [78205, 1], + [78204, 1], + [78204, 0, "s"], + [78205, 0, "u"], + [78206, 0, "c"], + [78230, 1], + [78230, 0, "1"], + [78437, 1], + [78436, 1], + [78435, 1], + [78435, 0, "s"], + [78436, 0, "u"], + [78437, 0, "c"], + [78438, 0, "c"], + [78438, 1], + [78573, 1], + [78573, 0, "2"], + [78576, 1], + [78576, 1], + [78576, 1], + [78576, 0, "s"], + [78577, 0, "u"], + [78578, 0, "c"], + [78588, 1], + [78588, 0, "1"], + [78673, 1], + [78673, 0, "2"], + [78681, 1], + [78681, 1], + [78681, 1], + [78681, 0, "s"], + [78682, 0, "u"], + [78683, 0, "c"], + [78693, 1], + [78693, 0, "1"], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 1], + [79000, 0, "s"], + [79001, 0, "u"], + [79002, 0, "c"], + [79003, 0, "c"], + [79004, 0, "e"], + [79005, 0, "s"], + [79006, 0, "s"], + [79007, 0, "i"], + [79008, 0, "o"], + [79009, 0, "n"], + [79117, 1], + [79116, 1], + [79115, 1], + [79114, 1], + [79113, 1], + [79112, 1], + [79111, 1], + [79110, 1], + [79109, 1], + [79108, 1], + [79108, 0, "s"], + [79109, 0, "u"], + [79110, 0, "c"], + [79111, 0, "c"], + [79112, 0, "e"], + [79113, 0, "s"], + [79114, 0, "s"], + [79115, 0, "i"], + [79116, 0, "o"], + [79117, 0, "n"], + [79579, 0, " "], + [79580, 0, "s"], + [79581, 0, "u"], + [79582, 0, "c"], + [79583, 0, "c"], + [79584, 0, "e"], + [79585, 0, "e"], + [79586, 0, "d"], + [79587, 0, "s"], + [79588, 0, " "], + [79589, 0, "$"], + [79590, 0, "k"], + [79591, 0, "_"], + [79592, 0, "1"], + [79593, 0, "$"], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [79548, 1], + [78210, 1], + [78209, 0, "e"], + [78440, 0, "e"], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 1], + [78558, 0, "s"], + [78559, 0, "u"], + [78560, 0, "c"], + [78561, 0, "c"], + [78562, 0, "e"], + [78563, 0, "e"], + [78564, 0, "d"], + [78565, 0, "s"], + [78583, 1], + [78582, 0, "e"], + [78686, 0, "e"], + [78689, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 1], + [78704, 0, "l"], + [78705, 0, "a"], + [78706, 0, "t"], + [78707, 0, "e"], + [78708, 0, "r"], + [79591, 0, " "], + [79592, 0, "$"], + [79593, 0, "k"], + [79594, 0, "_"], + [79595, 0, "2"], + [79596, 0, "$"], + [79597, 0, " "], + [79598, 0, "s"], + [79599, 0, "u"], + [79600, 0, "c"], + [79601, 0, "c"], + [79602, 0, "e"], + [79603, 0, "e"], + [79604, 0, "d"], + [79605, 0, "s"], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79624, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79700, 1], + [79716, 0, " "], + [79717, 0, "s"], + [79718, 0, "u"], + [79719, 0, "c"], + [79720, 0, "c"], + [79721, 0, "e"], + [79722, 0, "e"], + [79723, 0, "d"], + [79724, 0, "s"], + [79725, 0, " "], + [79726, 0, "$"], + [79727, 0, "k"], + [79728, 0, "_"], + [79729, 0, "1"], + [79730, 0, "$"], + [79735, 0, " "], + [79736, 0, "$"], + [79737, 0, "k"], + [79738, 0, "_"], + [79739, 0, "2"], + [79740, 0, "$"], + [79741, 0, " "], + [79742, 0, "s"], + [79743, 0, "u"], + [79744, 0, "c"], + [79745, 0, "c"], + [79746, 0, "e"], + [79747, 0, "e"], + [79748, 0, "d"], + [79749, 0, "s"], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [79768, 1], + [78179, 0, "I"], + [78180, 0, "n"], + [78181, 0, " "], + [78182, 0, "t"], + [78183, 0, "h"], + [78184, 0, "e"], + [78185, 0, " "], + [78186, 0, "o"], + [78187, 0, "r"], + [78188, 0, "d"], + [78189, 0, "e"], + [78190, 0, "r"], + [78191, 0, "e"], + [78192, 0, "d"], + [78193, 0, " "], + [78194, 0, "l"], + [78195, 0, "i"], + [78196, 0, "s"], + [78197, 0, "t"], + [78198, 0, " "], + [78199, 0, "$"], + [78200, 0, "\\"], + [78201, 0, "m"], + [78202, 0, "a"], + [78203, 0, "t"], + [78204, 0, "h"], + [78205, 0, "i"], + [78206, 0, "t"], + [78207, 0, "{"], + [78208, 0, "c"], + [78209, 0, "t"], + [78210, 0, "x"], + [78211, 0, "}"], + [78212, 0, "$"], + [78213, 0, ","], + [78214, 0, " "], + [78215, 1], + [78215, 0, "l"], + [78302, 1], + [78301, 1], + [78300, 1], + [78299, 1], + [78298, 1], + [78297, 1], + [78296, 1], + [78295, 1], + [78294, 1], + [78293, 1], + [78292, 1], + [78291, 1], + [78290, 1], + [78289, 1], + [78288, 1], + [78287, 1], + [78286, 1], + [78285, 1], + [78284, 1], + [78283, 1], + [78282, 1], + [78281, 1], + [78280, 1], + [78279, 1], + [78278, 1], + [78277, 1], + [78276, 1], + [78275, 1], + [78274, 1], + [78273, 1], + [78272, 1], + [78271, 1], + [78270, 1], + [78269, 1], + [78268, 1], + [78283, 0, " "], + [78284, 0, "l"], + [78285, 0, "i"], + [78286, 0, "s"], + [78287, 0, "t"], + [78288, 0, " "], + [78288, 1], + [78287, 1], + [78286, 1], + [78285, 1], + [78284, 1], + [78283, 1], + [78283, 0, "s"], + [78284, 0, " "], + [78285, 0, "a"], + [78286, 0, " "], + [78287, 0, "("], + [78288, 0, "p"], + [78289, 0, "o"], + [78290, 0, "s"], + [78291, 0, "s"], + [78292, 0, "i"], + [78293, 0, "b"], + [78294, 0, "l"], + [78295, 0, "y"], + [78296, 0, " "], + [78297, 0, "e"], + [78298, 0, "m"], + [78299, 0, "p"], + [78300, 0, "t"], + [78301, 0, "y"], + [78302, 0, ")"], + [78303, 0, " "], + [78304, 0, "s"], + [78305, 0, "e"], + [78306, 0, "q"], + [78307, 0, "u"], + [78308, 0, "e"], + [78309, 0, "n"], + [78310, 0, "c"], + [78311, 0, "e"], + [78312, 0, " "], + [78313, 0, "o"], + [78314, 0, "f"], + [78315, 0, " "], + [78316, 0, "l"], + [78317, 0, "i"], + [78318, 0, "s"], + [78319, 0, "t"], + [78320, 0, " "], + [78321, 0, "e"], + [78322, 0, "l"], + [78323, 0, "e"], + [78324, 0, "m"], + [78325, 0, "e"], + [78326, 0, "n"], + [78327, 0, "t"], + [78328, 0, "s"], + [78176, 1], + [78175, 1], + [78174, 1], + [78173, 1], + [78172, 1], + [78171, 1], + [78170, 1], + [78169, 1], + [78168, 1], + [78167, 1], + [78166, 1], + [78165, 1], + [78164, 1], + [78163, 1], + [78162, 1], + [78161, 1], + [78160, 1], + [78159, 1], + [78158, 1], + [78157, 1], + [78156, 1], + [78155, 1], + [78154, 1], + [78154, 0, "o"], + [78155, 0, "c"], + [78156, 0, "c"], + [78157, 0, "u"], + [78158, 0, "r"], + [78159, 0, "r"], + [78160, 0, "i"], + [78161, 0, "n"], + [78162, 0, "g"], + [78163, 0, " "], + [78164, 0, "a"], + [78165, 0, "f"], + [78166, 0, "t"], + [78167, 0, "e"], + [78168, 0, "r"], + [78239, 1], + [78238, 1], + [78237, 1], + [78236, 1], + [78235, 1], + [78234, 1], + [78233, 1], + [78232, 1], + [78232, 0, "o"], + [78233, 0, "c"], + [78234, 0, "c"], + [78235, 0, "u"], + [78236, 0, "r"], + [78237, 0, "s"], + [78238, 0, " "], + [78239, 0, "a"], + [78240, 0, "f"], + [78241, 0, "t"], + [78242, 0, "e"], + [78243, 0, "r"], + [78487, 1], + [78486, 1], + [78485, 1], + [78484, 1], + [78237, 1], + [78236, 1], + [78235, 1], + [78234, 1], + [78233, 1], + [78232, 1], + [78232, 0, "a"], + [78233, 0, "p"], + [78234, 0, "p"], + [78235, 0, "e"], + [78236, 0, "a"], + [78237, 0, "r"], + [78238, 0, "s"], + [78162, 1], + [78161, 1], + [78160, 1], + [78159, 1], + [78158, 1], + [78157, 1], + [78156, 1], + [78155, 1], + [78154, 1], + [78154, 0, "a"], + [78155, 0, "p"], + [78156, 0, "p"], + [78157, 0, "e"], + [78158, 0, "a"], + [78159, 0, "r"], + [78160, 0, "i"], + [78161, 0, "n"], + [78162, 0, "g"], + [78484, 1], + [78483, 1], + [78482, 1], + [78481, 1], + [78480, 1], + [78479, 1], + [78479, 0, "a"], + [78480, 0, "p"], + [78481, 0, "p"], + [78482, 0, "e"], + [78483, 0, "a"], + [78484, 0, "r"], + [78485, 0, "i"], + [78486, 0, "n"], + [78487, 0, "g"], + [78488, 0, " "], + [78489, 0, "a"], + [78490, 0, "f"], + [78491, 0, "t"], + [78492, 0, "e"], + [78493, 0, "r"], + [78633, 1], + [78632, 1], + [78631, 1], + [78630, 1], + [78629, 1], + [78628, 1], + [78627, 1], + [78626, 1], + [78626, 0, "a"], + [78627, 0, "p"], + [78628, 0, "p"], + [78629, 0, "e"], + [78630, 0, "a"], + [78631, 0, "r"], + [78632, 0, "s"], + [78633, 0, " "], + [78634, 0, "a"], + [78635, 0, "f"], + [78636, 0, "t"], + [78637, 0, "e"], + [78638, 0, "r"], + [78614, 1], + [78613, 1], + [78612, 1], + [78611, 1], + [78610, 1], + [78609, 1], + [78608, 1], + [78607, 1], + [78607, 0, "a"], + [78608, 0, "f"], + [78609, 0, "t"], + [78610, 0, "e"], + [78611, 0, "r"], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 1], + [80804, 0, "a"], + [80805, 0, "f"], + [80806, 0, "t"], + [80807, 0, "e"], + [80808, 0, "r"], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 1], + [78733, 0, "a"], + [78734, 0, "p"], + [78735, 0, "p"], + [78736, 0, "e"], + [78737, 0, "a"], + [78738, 0, "r"], + [78739, 0, "s"], + [78740, 0, " "], + [78741, 0, "a"], + [78742, 0, "f"], + [78743, 0, "t"], + [78744, 0, "e"], + [78745, 0, "r"], + [79061, 1], + [79060, 1], + [79059, 1], + [79058, 1], + [79057, 1], + [79056, 1], + [79055, 1], + [79054, 1], + [79053, 1], + [79052, 1], + [79052, 0, "a"], + [79053, 0, "p"], + [79054, 0, "p"], + [79055, 0, "e"], + [79056, 0, "a"], + [79057, 0, "r"], + [79058, 0, "s"], + [79059, 0, "-"], + [79060, 0, "a"], + [79061, 0, "f"], + [79062, 0, "t"], + [79063, 0, "e"], + [79064, 0, "r"], + [79172, 1], + [79171, 1], + [79170, 1], + [79169, 1], + [79168, 1], + [79167, 1], + [79166, 1], + [79165, 1], + [79164, 1], + [79163, 1], + [79163, 0, "a"], + [79164, 0, "p"], + [79165, 0, "p"], + [79166, 0, "e"], + [79167, 0, "a"], + [79168, 0, "r"], + [79169, 0, "s"], + [79170, 0, "-"], + [79171, 0, "a"], + [79172, 0, "f"], + [79173, 0, "t"], + [79174, 0, "e"], + [79175, 0, "r"], + [79630, 1], + [79629, 1], + [79628, 1], + [79627, 1], + [79626, 1], + [79625, 1], + [79624, 1], + [79623, 1], + [79623, 0, "a"], + [79624, 0, "p"], + [79625, 0, "p"], + [79626, 0, "e"], + [79627, 0, "a"], + [79628, 0, "r"], + [79629, 0, "s"], + [79630, 0, " "], + [79631, 0, "a"], + [79632, 0, "f"], + [79633, 0, "t"], + [79634, 0, "e"], + [79635, 0, "r"], + [79672, 1], + [79671, 1], + [79670, 1], + [79669, 1], + [79668, 1], + [79667, 1], + [79666, 1], + [79665, 1], + [79665, 0, "a"], + [79666, 0, "p"], + [79667, 0, "p"], + [79668, 0, "e"], + [79669, 0, "a"], + [79670, 0, "r"], + [79671, 0, "s"], + [79672, 0, " "], + [79673, 0, "a"], + [79674, 0, "f"], + [79675, 0, "t"], + [79676, 0, "e"], + [79677, 0, "r"], + [79796, 1], + [79795, 1], + [79794, 1], + [79793, 1], + [79792, 1], + [79791, 1], + [79790, 1], + [79789, 1], + [79789, 0, "a"], + [79790, 0, "p"], + [79791, 0, "p"], + [79792, 0, "e"], + [79793, 0, "a"], + [79794, 0, "r"], + [79795, 0, "s"], + [79796, 0, " "], + [79797, 0, "a"], + [79798, 0, "f"], + [79799, 0, "t"], + [79800, 0, "e"], + [79801, 0, "r"], + [79826, 1], + [79825, 1], + [79824, 1], + [79823, 1], + [79822, 1], + [79821, 1], + [79820, 1], + [79819, 1], + [79819, 0, "a"], + [79820, 0, "p"], + [79821, 0, "p"], + [79822, 0, "e"], + [79823, 0, "a"], + [79824, 0, "r"], + [79825, 0, "s"], + [79826, 0, " "], + [79827, 0, "a"], + [79828, 0, "f"], + [79829, 0, "t"], + [79830, 0, "e"], + [79831, 0, "r"], + [78385, 1], + [78385, 0, "\\"], + [78386, 0, "l"], + [78387, 0, "e"], + [78390, 0, "-"], + [78391, 0, "1"], + [78391, 1], + [78390, 1], + [78387, 1], + [78386, 1], + [78385, 1], + [78385, 0, "<"], + [79475, 1], + [79474, 1], + [79473, 1], + [79472, 1], + [79471, 1], + [79470, 1], + [79469, 1], + [79468, 1], + [79467, 1], + [79466, 1], + [79465, 1], + [79464, 1], + [79463, 1], + [79462, 1], + [79461, 1], + [79460, 1], + [79459, 1], + [79458, 1], + [79457, 1], + [79456, 1], + [79455, 1], + [79454, 1], + [79453, 1], + [79452, 1], + [79451, 1], + [79450, 1], + [79449, 1], + [79448, 1], + [79447, 1], + [79446, 1], + [79445, 1], + [79444, 1], + [79443, 1], + [79442, 1], + [79441, 1], + [79440, 1], + [79439, 1], + [79438, 1], + [79437, 1], + [79436, 1], + [79435, 1], + [79434, 1], + [79433, 1], + [79432, 1], + [79431, 1], + [79430, 1], + [79429, 1], + [79428, 1], + [79427, 1], + [79426, 1], + [79425, 1], + [79424, 1], + [79423, 1], + [79422, 1], + [79421, 1], + [79420, 1], + [79419, 1], + [79418, 1], + [79417, 1], + [79416, 1], + [79415, 1], + [79414, 1], + [79413, 1], + [79412, 1], + [79411, 1], + [79410, 1], + [79409, 1], + [79408, 1], + [79407, 1], + [79406, 1], + [79405, 1], + [79404, 1], + [79403, 1], + [79402, 1], + [79401, 1], + [79400, 1], + [79399, 1], + [79398, 1], + [79397, 1], + [79396, 1], + [79395, 1], + [79394, 1], + [79393, 1], + [79392, 1], + [79391, 1], + [79390, 1], + [79389, 1], + [79388, 1], + [79387, 1], + [79386, 1], + [79385, 1], + [79384, 1], + [79383, 1], + [79382, 1], + [79381, 1], + [79380, 1], + [79379, 1], + [79378, 1], + [79377, 1], + [79376, 1], + [79375, 1], + [79374, 1], + [79373, 1], + [79372, 1], + [80673, 1], + [80673, 0, "2"], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 1], + [80676, 0, "a"], + [80677, 0, "p"], + [80678, 0, "p"], + [80679, 0, "e"], + [80680, 0, "a"], + [80681, 0, "r"], + [80682, 0, "s"], + [80683, 0, " "], + [80684, 0, "a"], + [80685, 0, "f"], + [80686, 0, "t"], + [80687, 0, "e"], + [80688, 0, "r"], + [80693, 1], + [80693, 0, "1"], + [80891, 1], + [80890, 1], + [80889, 1], + [80888, 1], + [80887, 1], + [80886, 1], + [80913, 1], + [80913, 0, "s"], + [80914, 0, "p"], + [80914, 1], + [80914, 0, "o"], + [80915, 0, "m"], + [80916, 0, "e"], + [80939, 1], + [80938, 1], + [80937, 1], + [80936, 1], + [80935, 1], + [80934, 1], + [80933, 1], + [80932, 1], + [80931, 1], + [80930, 1], + [80929, 1], + [80928, 1], + [80927, 1], + [80927, 0, "a"], + [80928, 0, "f"], + [80929, 0, "t"], + [80930, 0, "e"], + [80931, 0, "r"], + [80891, 1], + [80890, 1], + [80889, 1], + [80888, 1], + [80887, 1], + [80886, 1], + [80881, 0, ","], + [80887, 0, "t"], + [80888, 0, "h"], + [80889, 0, "e"], + [80890, 0, "r"], + [80891, 0, "e"], + [80892, 0, "f"], + [80893, 0, "o"], + [80894, 0, "r"], + [80895, 0, "e"], + [80914, 0, "i"], + [80915, 0, "s"], + [80916, 0, " "], + [80917, 0, "i"], + [80918, 0, "n"], + [80919, 0, "s"], + [80920, 0, "e"], + [80921, 0, "r"], + [80922, 0, "t"], + [80923, 0, "e"], + [80924, 0, "d"], + [80925, 0, " "], + [81519, 1], + [81518, 1], + [81517, 1], + [81516, 1], + [81515, 1], + [81514, 1], + [81513, 1], + [81512, 1], + [81511, 1], + [81510, 1], + [81509, 1], + [81508, 1], + [81507, 1], + [81506, 1], + [81524, 0, "i"], + [81525, 0, "s"], + [81526, 0, " "], + [81527, 0, "n"], + [81528, 0, "e"], + [81529, 0, "v"], + [81530, 0, "e"], + [81531, 0, "r"], + [81532, 0, " "], + [81533, 0, "i"], + [81534, 0, "n"], + [81535, 0, "s"], + [81536, 0, "e"], + [81537, 0, "r"], + [81538, 0, "t"], + [81539, 0, "e"], + [81540, 0, "d"], + [81541, 0, " "], + [81573, 1], + [81572, 1], + [81571, 1], + [81570, 1], + [81569, 1], + [81568, 1], + [81567, 1], + [81566, 1], + [81565, 1], + [81564, 1], + [81563, 1], + [81562, 1], + [81562, 0, "h"], + [81563, 0, "a"], + [81564, 0, "t"], + [81565, 0, " "], + [81566, 0, "a"], + [81567, 0, "p"], + [81568, 0, "p"], + [81569, 0, "e"], + [81570, 0, "a"], + [81571, 0, "r"], + [81572, 0, "s"], + [81573, 0, " "], + [81574, 0, "a"], + [81575, 0, "f"], + [81576, 0, "t"], + [81577, 0, "e"], + [81578, 0, "r"], + [81598, 0, "\n"], + [81599, 0, "\n"], + [81600, 0, "%"], + [81601, 0, " "], + [81602, 0, "T"], + [81603, 0, "O"], + [81604, 0, "D"], + [81605, 0, "O"], + [81606, 0, " "], + [81607, 0, "w"], + [81608, 0, "o"], + [81609, 0, "r"], + [81610, 0, "k"], + [81611, 0, "i"], + [81612, 0, "n"], + [81613, 0, " "], + [81614, 0, "g"], + [81615, 0, "p"], + [81615, 1], + [81614, 1], + [81613, 1], + [81612, 1], + [81611, 1], + [81611, 0, " "], + [81612, 0, "i"], + [81613, 0, "n"], + [81614, 0, " "], + [81615, 0, "p"], + [81616, 0, "r"], + [81617, 0, "o"], + [81618, 0, "g"], + [81619, 0, "r"], + [81620, 0, "e"], + [81621, 0, "s"], + [81622, 0, "s"], + [81623, 0, " "], + [81624, 0, "h"], + [81625, 0, "e"], + [81626, 0, "r"], + [81627, 0, "e"], + [81601, 0, "%"], + [81602, 0, "%"], + [81603, 0, "%"], + [81604, 0, "%"], + [81605, 0, "%"], + [81606, 0, "%"], + [81607, 0, "%"], + [81608, 0, "%"], + [81609, 0, "%"], + [81610, 0, "%"], + [81611, 0, "%"], + [81639, 0, " "], + [81640, 0, "%"], + [81641, 0, "%"], + [81642, 0, "%"], + [81643, 0, "%"], + [81644, 0, "%"], + [81645, 0, "%"], + [81646, 0, "%"], + [81647, 0, "%"], + [81648, 0, "%"], + [81649, 0, "%"], + [81650, 0, "%"], + [81651, 0, "%"], + [81652, 0, "%"], + [81653, 0, "%"], + [81654, 0, "%"], + [81655, 0, "%"], + [81656, 0, "%"], + [81657, 0, "%"], + [81658, 0, "%"], + [81659, 0, "%"], + [81660, 0, "%"], + [81598, 0, "\n"], + [81599, 0, "\n"], + [81600, 0, "\\"], + [81601, 0, "b"], + [81602, 0, "e"], + [81603, 0, "g"], + [81604, 0, "i"], + [81605, 0, "n"], + [81606, 0, "{"], + [81607, 0, "l"], + [81608, 0, "e"], + [81609, 0, "m"], + [81610, 0, "m"], + [81611, 0, "a"], + [81612, 0, "}"], + [81613, 0, "\\"], + [81614, 0, "l"], + [81615, 0, "a"], + [81616, 0, "b"], + [81617, 0, "e"], + [81618, 0, "l"], + [81619, 0, "{"], + [81620, 0, "l"], + [81621, 0, "e"], + [81622, 0, "m"], + [81623, 0, ":"], + [81624, 0, "i"], + [81625, 0, "n"], + [81626, 0, "s"], + [81627, 0, "e"], + [81628, 0, "r"], + [81629, 0, "t"], + [81630, 0, "-"], + [81631, 0, "r"], + [81632, 0, "e"], + [81633, 0, "o"], + [81634, 0, "r"], + [81635, 0, "d"], + [81636, 0, "e"], + [81637, 0, "r"], + [81638, 0, "}"], + [81639, 0, "\n"], + [81640, 0, "\\"], + [81641, 0, "e"], + [81642, 0, "n"], + [81643, 0, "d"], + [81644, 0, "{"], + [81645, 0, "l"], + [81646, 0, "e"], + [81647, 0, "m"], + [81648, 0, "m"], + [81649, 0, "a"], + [81650, 0, "}"], + [81640, 0, "\n"], + [81640, 0, "A"], + [81641, 0, "n"], + [81642, 0, " "], + [81643, 0, "i"], + [81644, 0, "n"], + [81645, 0, "s"], + [81646, 0, "e"], + [81647, 0, "r"], + [81648, 0, "t"], + [81649, 0, "i"], + [81650, 0, "o"], + [81651, 0, "n"], + [81652, 0, " "], + [81653, 0, "o"], + [81654, 0, "p"], + [81655, 0, "e"], + [81656, 0, "r"], + [81657, 0, "a"], + [81658, 0, "t"], + [81659, 0, "i"], + [81660, 0, "o"], + [81661, 0, "n"], + [81662, 0, " "], + [81663, 0, "c"], + [81664, 0, "a"], + [81665, 0, "n"], + [81666, 0, " "], + [81667, 0, "b"], + [81668, 0, "e"], + [81669, 0, " "], + [81670, 0, "r"], + [81671, 0, "e"], + [81640, 0, "I"], + [81641, 0, "n"], + [81642, 0, " "], + [81643, 0, "a"], + [81644, 0, "n"], + [81645, 0, " "], + [81646, 0, "o"], + [81647, 0, "p"], + [81648, 0, "e"], + [81649, 0, "r"], + [81650, 0, "a"], + [81651, 0, "t"], + [81652, 0, "i"], + [81653, 0, "o"], + [81654, 0, "n"], + [81655, 0, " "], + [81656, 0, "h"], + [81657, 0, "i"], + [81658, 0, "s"], + [81659, 0, "t"], + [81660, 0, "o"], + [81661, 0, "r"], + [81662, 0, "y"], + [81663, 0, ","], + [81664, 0, " "], + [81665, 1], + [81665, 0, "a"], + [81697, 0, "o"], + [81698, 0, "r"], + [81699, 0, "d"], + [81700, 0, "e"], + [81701, 0, "r"], + [81702, 0, "e"], + [81703, 0, "d"], + [81704, 0, " "], + [81705, 0, "w"], + [81706, 0, "i"], + [81707, 0, "t"], + [81708, 0, "h"], + [81709, 0, " "], + [81710, 0, "r"], + [81711, 0, "e"], + [81712, 0, "s"], + [81713, 0, "p"], + [81714, 0, "e"], + [81715, 0, "c"], + [81716, 0, "t"], + [81717, 0, " "], + [81718, 0, "t"], + [81719, 0, "o"], + [81720, 0, " "], + [81721, 0, "c"], + [81722, 0, "o"], + [81723, 0, "n"], + [81724, 0, "c"], + [81725, 0, "u"], + [81726, 0, "r"], + [81727, 0, "r"], + [81728, 0, "e"], + [81729, 0, "n"], + [81730, 0, "t"], + [81731, 0, " "], + [81732, 0, "i"], + [81733, 0, "n"], + [81734, 0, "s"], + [81735, 0, "e"], + [81736, 0, "r"], + [81737, 0, "t"], + [81738, 0, "i"], + [81739, 0, "o"], + [81740, 0, "n"], + [81741, 0, " "], + [81742, 0, "o"], + [81743, 0, "p"], + [81744, 0, "e"], + [81745, 0, "r"], + [81746, 0, "a"], + [81747, 0, "t"], + [81748, 0, "i"], + [81749, 0, "o"], + [81750, 0, "n"], + [81751, 0, "s"], + [81752, 0, " "], + [81753, 0, "t"], + [81754, 0, "o"], + [81755, 0, " "], + [81756, 0, "t"], + [81757, 0, "h"], + [81758, 0, "e"], + [81759, 0, " "], + [81760, 0, "s"], + [81761, 0, "a"], + [81762, 0, "m"], + [81763, 0, "e"], + [81764, 0, " "], + [81765, 0, "l"], + [81766, 0, "i"], + [81767, 0, "s"], + [81768, 0, "t"], + [81769, 0, " "], + [81770, 0, "w"], + [81771, 0, "i"], + [81772, 0, "t"], + [81773, 0, "h"], + [81774, 0, "o"], + [81775, 0, "u"], + [81776, 0, "t"], + [81777, 0, " "], + [81778, 0, "a"], + [81779, 0, "f"], + [81780, 0, "f"], + [81781, 0, "e"], + [81782, 0, "c"], + [81783, 0, "t"], + [81784, 0, "i"], + [81785, 0, "n"], + [81786, 0, "g"], + [81787, 0, " "], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 1], + [81688, 0, "i"], + [81689, 0, "s"], + [81690, 0, " "], + [81691, 0, "c"], + [81692, 0, "o"], + [81693, 0, "m"], + [81694, 0, "m"], + [81695, 0, "u"], + [81696, 0, "t"], + [81697, 0, "a"], + [81698, 0, "t"], + [81699, 0, "i"], + [81700, 0, "v"], + [81701, 0, "e"], + [81785, 1], + [81784, 1], + [81783, 1], + [81782, 1], + [81781, 1], + [81780, 1], + [81779, 1], + [81778, 1], + [81777, 1], + [81776, 1], + [81775, 1], + [81774, 1], + [81773, 1], + [81772, 1], + [81771, 1], + [81770, 1], + [81769, 1], + [81768, 1], + [81767, 1], + [81767, 0, "."], + [81780, 0, "\n"], + [81781, 0, "\n"], + [81782, 0, "\\"], + [81783, 0, "b"], + [81784, 0, "e"], + [81785, 0, "g"], + [81786, 0, "i"], + [81787, 0, "n"], + [81788, 0, "{"], + [81789, 0, "p"], + [81790, 0, "r"], + [81791, 0, "o"], + [81792, 0, "o"], + [81793, 0, "f"], + [81794, 0, "}"], + [81795, 0, "\n"], + [81796, 0, "\\"], + [81797, 0, "e"], + [81798, 0, "n"], + [81799, 0, "d"], + [81800, 0, "{"], + [81801, 0, "p"], + [81802, 0, "r"], + [81803, 0, "o"], + [81804, 0, "o"], + [81805, 0, "f"], + [81806, 0, "}"], + [81795, 1], + [81795, 0, "\n"], + [81796, 0, "\n"], + [81796, 0, "C"], + [81797, 0, "o"], + [81798, 0, "n"], + [81799, 0, "s"], + [81800, 0, "i"], + [81801, 0, "d"], + [81802, 0, "e"], + [81803, 0, "r"], + [81804, 0, " "], + [81805, 0, "t"], + [81806, 0, "h"], + [81807, 0, "e"], + [81808, 0, " "], + [81809, 0, "o"], + [81810, 0, "p"], + [81811, 0, "e"], + [81812, 0, "r"], + [81813, 0, "a"], + [81814, 0, "t"], + [81815, 0, "i"], + [81816, 0, "o"], + [81817, 0, "n"], + [81818, 0, " "], + [81819, 0, "$"], + [81820, 0, "o"], + [81821, 0, "_"], + [81822, 0, "{"], + [81823, 0, "n"], + [81824, 0, "+"], + [81825, 0, "1"], + [81826, 0, "}"], + [81827, 0, "$"], + [81828, 0, " "], + [81829, 0, "b"], + [81830, 0, "b"], + [81831, 0, "e"], + [81832, 0, "i"], + [81833, 0, "n"], + [81834, 0, "g"], + [81835, 0, " "], + [81835, 1], + [81834, 1], + [81833, 1], + [81832, 1], + [81831, 1], + [81830, 1], + [81830, 0, "e"], + [81831, 0, "i"], + [81832, 0, "n"], + [81833, 0, "g"], + [81834, 0, " "], + [81835, 0, "r"], + [81836, 0, "e"], + [81837, 0, "o"], + [81838, 0, "r"], + [81839, 0, "d"], + [81840, 0, "e"], + [81841, 0, "r"], + [81842, 0, "e"], + [81843, 0, "d"], + [81844, 0, " "], + [81845, 0, "w"], + [81846, 0, "i"], + [81847, 0, "t"], + [81848, 0, "h"], + [81849, 0, " "], + [81850, 0, "r"], + [81851, 0, "e"], + [81852, 0, "s"], + [81853, 0, "p"], + [81854, 0, "e"], + [81855, 0, "c"], + [81856, 0, "t"], + [81857, 0, " "], + [81858, 0, "t"], + [81859, 0, "o"], + [81860, 0, " "], + [81861, 0, "c"], + [81862, 0, "o"], + [81863, 0, "n"], + [81864, 0, "c"], + [81865, 0, "u"], + [81866, 0, "r"], + [81867, 0, "r"], + [81868, 0, "e"], + [81869, 0, "n"], + [81870, 0, "t"], + [81871, 0, " "], + [81872, 0, "o"], + [81873, 0, "p"], + [81874, 0, "e"], + [81875, 0, "r"], + [81876, 0, "a"], + [81877, 0, "t"], + [81878, 0, "i"], + [81879, 0, "o"], + [81880, 0, "n"], + [81881, 0, "s"], + [81882, 0, " "], + [81883, 0, "i"], + [81884, 0, "n"], + [81885, 0, " "], + [81886, 0, "a"], + [81887, 0, " "], + [81888, 0, "h"], + [81889, 0, "i"], + [81890, 0, "s"], + [81891, 0, "t"], + [81892, 0, "o"], + [81893, 0, "r"], + [81894, 0, "y"], + [81895, 0, "."], + [81896, 0, " "], + [81897, 0, "$"], + [81898, 0, "o"], + [81899, 0, "_"], + [81900, 0, "{"], + [81901, 0, "n"], + [81902, 0, "+"], + [81903, 0, "1"], + [81904, 0, "}"], + [81905, 0, "$"], + [81906, 0, " "], + [81907, 0, "i"], + [81908, 0, "s"], + [81909, 0, " "], + [81910, 0, "i"], + [81911, 0, "n"], + [81912, 0, "s"], + [81913, 0, "e"], + [81914, 0, "r"], + [81915, 0, "t"], + [81916, 0, "e"], + [81917, 0, "d"], + [81918, 0, " "], + [81919, 0, "b"], + [81920, 0, "e"], + [81921, 0, "t"], + [81922, 0, "w"], + [81923, 0, "e"], + [81924, 0, "e"], + [81925, 0, "n"], + [81926, 0, " "], + [81927, 0, "s"], + [81928, 0, "o"], + [81929, 0, "m"], + [81930, 0, "e"], + [81931, 0, " "], + [81932, 0, "$"], + [81933, 0, "k"], + [81934, 0, "_"], + [81935, 0, "1"], + [81936, 0, "$"], + [81937, 0, " "], + [81938, 0, "a"], + [81939, 0, "n"], + [81940, 0, "d"], + [81941, 0, " "], + [81942, 0, "$"], + [81943, 0, "k"], + [81944, 0, "_"], + [81945, 0, "2"], + [81946, 0, "$"], + [81947, 0, " "], + [81948, 0, "o"], + [81949, 0, "n"], + [81950, 0, " "], + [81951, 0, "t"], + [81952, 0, "h"], + [81953, 0, "e"], + [81954, 0, " "], + [81955, 0, "r"], + [81956, 0, "e"], + [81957, 0, "p"], + [81958, 0, "l"], + [81959, 0, "i"], + [81960, 0, "c"], + [81961, 0, "a"], + [81962, 0, " "], + [81963, 0, "w"], + [81964, 0, "h"], + [81965, 0, "e"], + [81966, 0, "r"], + [81967, 0, "e"], + [81968, 0, " "], + [81969, 0, "i"], + [81970, 0, "t"], + [81971, 0, " "], + [81972, 0, "o"], + [81973, 0, "r"], + [81974, 0, "i"], + [81975, 0, "g"], + [81976, 0, "i"], + [81977, 0, "n"], + [81978, 0, "a"], + [81979, 0, "t"], + [81980, 0, "e"], + [81981, 0, "d"], + [81982, 0, "."], + [81983, 0, " "], + [81984, 0, "I"], + [81985, 0, "f"], + [81986, 0, " "], + [81987, 0, "a"], + [81988, 0, "n"], + [81989, 0, "y"], + [81990, 0, " "], + [81991, 0, "c"], + [81992, 0, "o"], + [81993, 0, "n"], + [81994, 0, "c"], + [81995, 0, "u"], + [81996, 0, "r"], + [81997, 0, "r"], + [81998, 0, "e"], + [81999, 0, "n"], + [82000, 0, "t"], + [82001, 0, " "], + [82002, 0, "o"], + [82003, 0, "p"], + [82004, 0, "e"], + [82005, 0, "r"], + [82006, 0, "a"], + [82007, 0, "t"], + [82008, 0, "i"], + [82009, 0, "o"], + [82010, 0, "n"], + [82011, 0, " "], + [82012, 0, "j"], + [82012, 1], + [82012, 0, "i"], + [82013, 0, "n"], + [82014, 0, "s"], + [82015, 0, "e"], + [82016, 0, "r"], + [82017, 0, "t"], + [82018, 0, "s"], + [82019, 0, " "], + [82020, 0, "a"], + [82021, 0, "t"], + [82022, 0, " "], + [82023, 0, "a"], + [82024, 0, " "], + [82025, 0, "p"], + [82026, 0, "o"], + [82027, 0, "s"], + [82028, 0, "i"], + [82029, 0, "t"], + [82030, 0, "i"], + [82031, 0, "o"], + [82032, 0, "n"], + [82033, 0, " "], + [82034, 0, "t"], + [82035, 0, "h"], + [82036, 0, "a"], + [82037, 0, "t"], + [82038, 0, " "], + [82039, 0, "i"], + [82040, 0, "s"], + [82041, 0, " "], + [82042, 0, "n"], + [82043, 0, "o"], + [82044, 0, "t"], + [82045, 0, " "], + [82046, 0, "b"], + [82047, 0, "e"], + [82048, 0, "t"], + [82049, 0, "w"], + [82050, 0, "e"], + [82051, 0, "e"], + [82052, 0, "n"], + [82053, 0, " "], + [82054, 0, "$"], + [82055, 0, "k"], + [82056, 0, "_"], + [82057, 0, "1"], + [82058, 0, "$"], + [82059, 0, " "], + [82060, 0, "a"], + [82061, 0, "n"], + [82062, 0, "d"], + [82063, 0, " "], + [82064, 0, "$"], + [82065, 0, "k"], + [82066, 0, "_"], + [82067, 0, "2"], + [82068, 0, "$"], + [82069, 0, ","], + [82070, 0, " "], + [82071, 0, "t"], + [82072, 0, "h"], + [82073, 0, "e"], + [82074, 0, "n"], + [82075, 0, " "], + [82076, 0, "b"], + [82077, 0, "y"], + [82078, 0, " "], + [82079, 0, "L"], + [82080, 0, "e"], + [82081, 0, "m"], + [82082, 0, "m"], + [82083, 0, "a"], + [82084, 0, "~"], + [82085, 0, "\\"], + [82086, 0, "r"], + [82087, 0, "e"], + [82088, 0, "f"], + [82089, 0, "{"], + [82090, 0, "i"], + [82091, 0, "n"], + [82092, 0, "s"], + [82093, 0, "e"], + [82094, 0, "r"], + [82095, 0, "t"], + [82096, 0, "-"], + [82097, 0, "b"], + [82098, 0, "e"], + [82099, 0, "t"], + [82100, 0, "w"], + [82101, 0, "e"], + [82102, 0, "e"], + [82103, 0, "n"], + [82104, 0, "}"], + [82105, 0, " "], + [82106, 0, "t"], + [82107, 0, "h"], + [82108, 0, "e"], + [82109, 0, " "], + [82110, 0, "o"], + [82111, 0, "p"], + [82112, 0, "e"], + [82113, 0, "r"], + [82114, 0, "a"], + [82115, 0, "t"], + [82116, 0, "i"], + [82117, 0, "o"], + [82118, 0, "n"], + [82119, 0, "s"], + [82120, 0, " "], + [82121, 0, "c"], + [82122, 0, "a"], + [82123, 0, "n"], + [82124, 0, "n"], + [82125, 0, "o"], + [82126, 0, "t"], + [82127, 0, " "], + [82128, 0, "a"], + [82129, 0, "f"], + [82130, 0, "f"], + [82131, 0, "e"], + [82132, 0, "c"], + [82133, 0, "t"], + [82134, 0, " "], + [82135, 0, "e"], + [82136, 0, "a"], + [82137, 0, "c"], + [82138, 0, "h"], + [82139, 0, " "], + [82140, 0, "o"], + [82141, 0, "t"], + [82142, 0, "h"], + [82143, 0, "e"], + [82144, 0, "r"], + [82145, 0, ","], + [82146, 0, " "], + [82147, 0, "a"], + [82148, 0, "n"], + [82149, 0, "d"], + [82150, 0, " "], + [82151, 0, "s"], + [82152, 0, "o"], + [82153, 0, " "], + [82154, 0, "t"], + [82155, 0, "h"], + [82156, 0, "e"], + [82157, 0, "y"], + [82158, 0, " "], + [82159, 0, "h"], + [82160, 0, "a"], + [82161, 0, "v"], + [82162, 0, "e"], + [82163, 0, " "], + [82164, 0, "t"], + [82165, 0, "h"], + [82166, 0, "e"], + [82167, 0, " "], + [82168, 0, "s"], + [82169, 0, "a"], + [82170, 0, "m"], + [82171, 0, "e"], + [82172, 0, " "], + [82173, 0, "e"], + [82174, 0, "f"], + [82175, 0, "f"], + [82176, 0, "e"], + [82177, 0, "c"], + [82178, 0, "t"], + [82179, 0, " "], + [82180, 0, "r"], + [82181, 0, "e"], + [82182, 0, "g"], + [82183, 0, "a"], + [82184, 0, "r"], + [82185, 0, "d"], + [82186, 0, "l"], + [82187, 0, "e"], + [82188, 0, "s"], + [82189, 0, "s"], + [82190, 0, " "], + [82191, 0, "o"], + [82192, 0, "f"], + [82193, 0, " "], + [82194, 0, "t"], + [82195, 0, "h"], + [82196, 0, "e"], + [82197, 0, "i"], + [82198, 0, "r"], + [82199, 0, " "], + [82200, 0, "o"], + [82201, 0, "r"], + [82202, 0, "d"], + [82203, 0, "e"], + [82204, 0, "r"], + [82205, 0, "."], + [81983, 0, "\n"], + [81984, 0, "\n"], + [81985, 1], + [82207, 0, " "], + [82208, 0, "F"], + [82209, 0, "o"], + [82210, 0, "r"], + [82211, 0, " "], + [82212, 0, "t"], + [82213, 0, "h"], + [82214, 0, "e"], + [82215, 0, " "], + [82216, 0, "r"], + [82217, 0, "e"], + [82218, 0, "s"], + [82219, 0, "t"], + [82220, 0, " "], + [82221, 0, "o"], + [82222, 0, "f"], + [82223, 0, " "], + [82224, 0, "t"], + [82225, 0, "h"], + [82226, 0, "i"], + [82227, 0, "s"], + [82228, 0, " "], + [82229, 0, "p"], + [82230, 0, "r"], + [82231, 0, "o"], + [82232, 0, "o"], + [82233, 0, "f"], + [82234, 0, ","], + [82235, 0, " "], + [82236, 0, "c"], + [82237, 0, "o"], + [82238, 0, "n"], + [82239, 0, "s"], + [82240, 0, "i"], + [82241, 0, "d"], + [82242, 0, "e"], + [82243, 0, "r"], + [82236, 0, "w"], + [82237, 0, "e"], + [82238, 0, " "], + [82247, 0, " "], + [82248, 0, "o"], + [82249, 0, "n"], + [82250, 0, "l"], + [82251, 0, "y"], + [82252, 0, " "], + [82253, 0, "c"], + [82254, 0, "o"], + [82255, 0, "n"], + [82256, 0, "c"], + [82257, 0, "u"], + [82258, 0, "r"], + [82259, 0, "r"], + [82260, 0, "e"], + [82261, 0, "n"], + [82262, 0, "t"], + [82263, 0, " "], + [82264, 0, "o"], + [82265, 0, "p"], + [82266, 0, "e"], + [82267, 0, "r"], + [82268, 0, "a"], + [82269, 0, "t"], + [82270, 0, "i"], + [82271, 0, "o"], + [82272, 0, "n"], + [82273, 0, "s"], + [82274, 0, " "], + [82275, 0, "t"], + [82276, 0, "h"], + [82277, 0, "a"], + [82278, 0, "t"], + [82279, 0, " "], + [82280, 0, "a"], + [82281, 0, "r"], + [82282, 0, "e"], + [82283, 0, " "], + [82283, 1], + [82282, 1], + [82281, 1], + [82280, 1], + [82280, 0, "i"], + [82281, 0, "n"], + [82282, 0, "s"], + [82283, 0, "e"], + [82284, 0, "r"], + [82285, 0, "t"], + [82286, 0, " "], + [82287, 0, "a"], + [82288, 0, "t"], + [82289, 0, " "], + [82290, 0, "a"], + [82291, 0, " "], + [82292, 0, "p"], + [82293, 0, "o"], + [82294, 0, "s"], + [82295, 0, "i"], + [82296, 0, "t"], + [82297, 0, "i"], + [82298, 0, "o"], + [82299, 0, "n"], + [82300, 0, " "], + [82301, 0, "b"], + [82302, 0, "e"], + [82303, 0, "t"], + [82304, 0, "w"], + [82305, 0, "e"], + [82306, 0, "e"], + [82307, 0, "n"], + [82308, 0, " "], + [82309, 0, "$"], + [82310, 0, "k"], + [82311, 0, "_"], + [82312, 0, "1"], + [82313, 0, "$"], + [82314, 0, " "], + [82315, 0, "a"], + [82316, 0, "n"], + [82317, 0, "d"], + [82318, 0, " "], + [82319, 0, "$"], + [82320, 0, "k"], + [82321, 0, "_"], + [82322, 0, "2"], + [82323, 0, "$"], + [82324, 0, "."], + [82091, 0, "l"], + [82092, 0, "e"], + [82093, 0, "m"], + [82094, 0, ":"], + [78436, 0, " "], + [78437, 0, "M"], + [78438, 0, "o"], + [78439, 0, "r"], + [78440, 0, "e"], + [78441, 0, "o"], + [78442, 0, "v"], + [78443, 0, "e"], + [78444, 0, "r"], + [78445, 0, ","], + [78446, 0, " "], + [78447, 0, "$"], + [78448, 0, "j"], + [78448, 1], + [78448, 0, "k"], + [78449, 0, "_"], + [78450, 0, "j"], + [78451, 0, "$"], + [78452, 0, " "], + [78453, 0, "a"], + [78454, 0, "p"], + [78455, 0, "p"], + [78456, 0, "e"], + [78457, 0, "a"], + [78458, 0, "r"], + [78459, 0, "s"], + [78460, 0, " "], + [78461, 0, "\\"], + [78462, 0, "e"], + [78463, 0, "m"], + [78464, 0, "p"], + [78465, 0, "h"], + [78466, 0, "{"], + [78467, 0, "i"], + [78468, 0, "m"], + [78469, 0, "m"], + [78470, 0, "e"], + [78471, 0, "d"], + [78472, 0, "i"], + [78473, 0, "a"], + [78474, 0, "t"], + [78475, 0, "e"], + [78476, 0, "l"], + [78477, 0, "y"], + [78478, 0, " "], + [78479, 0, "a"], + [78480, 0, "f"], + [78481, 0, "t"], + [78482, 0, "e"], + [78483, 0, "r"], + [78484, 0, "}"], + [78467, 0, "a"], + [78468, 0, "p"], + [78469, 0, "p"], + [78470, 0, "e"], + [78471, 0, "a"], + [78472, 0, "r"], + [78472, 1], + [78471, 1], + [78470, 1], + [78469, 1], + [78468, 1], + [78467, 1], + [78485, 0, " "], + [78486, 0, "$"], + [78487, 0, "k"], + [78488, 0, "_"], + [78489, 0, "1"], + [78490, 0, "$"], + [78491, 0, " "], + [78492, 0, "i"], + [78493, 0, "f"], + [78494, 0, " "], + [78495, 0, "t"], + [78496, 0, "h"], + [78497, 0, "a"], + [78498, 0, "t"], + [78499, 0, " "], + [78500, 0, "s"], + [78501, 0, "e"], + [78502, 0, "q"], + [78503, 0, "u"], + [78504, 0, "e"], + [78505, 0, "n"], + [78506, 0, "c"], + [78507, 0, "e"], + [78508, 0, " "], + [78509, 0, "i"], + [78510, 0, "s"], + [78511, 0, " "], + [78512, 0, "e"], + [78513, 0, "m"], + [78514, 0, "p"], + [78515, 0, "t"], + [78516, 0, "y"], + [78517, 0, ","], + [78518, 0, " "], + [78519, 0, "i"], + [78520, 0, "."], + [78521, 0, "e"], + [78522, 0, "."], + [78523, 0, " "], + [78524, 0, "$"], + [78525, 0, "\\"], + [78526, 0, "m"], + [78527, 0, "a"], + [78528, 0, "t"], + [78529, 0, "h"], + [78530, 0, "i"], + [78531, 0, "t"], + [78532, 0, "{"], + [78533, 0, "c"], + [78534, 0, "t"], + [78535, 0, "x"], + [78536, 0, "}"], + [78537, 0, "("], + [78538, 0, "\\"], + [78539, 0, "m"], + [78540, 0, "a"], + [78541, 0, "t"], + [78542, 0, "h"], + [78543, 0, "s"], + [78544, 0, "f"], + [78545, 0, "{"], + [78546, 0, "n"], + [78547, 0, "e"], + [78548, 0, "x"], + [78549, 0, "t"], + [78550, 0, "}"], + [78551, 0, ")"], + [78551, 1], + [78551, 0, "("], + [78552, 0, "k"], + [78553, 0, "_"], + [78554, 0, "1"], + [78555, 0, ")"], + [78556, 0, ")"], + [78557, 0, "$"], + [78557, 1], + [78557, 0, " "], + [78558, 0, "="], + [78559, 0, " "], + [78560, 0, "k"], + [78561, 0, "_"], + [78562, 0, "j"], + [78563, 0, "$"], + [78564, 0, "."], + [78523, 0, " "], + [78524, 0, "i"], + [78525, 0, "f"], + [78446, 0, " "], + [78447, 0, "w"], + [78448, 0, "e"], + [78449, 0, " "], + [78450, 0, "s"], + [78451, 0, "a"], + [78452, 0, "y"], + [81737, 0, "\n"], + [81738, 0, "\n"], + [81739, 0, "\\"], + [81740, 0, "e"], + [81740, 1], + [81740, 0, "b"], + [81741, 0, "e"], + [81742, 0, "g"], + [81743, 0, "i"], + [81744, 0, "n"], + [81745, 0, "{"], + [81746, 0, "d"], + [81747, 0, "e"], + [81748, 0, "f"], + [81749, 0, "i"], + [81750, 0, "n"], + [81751, 0, "i"], + [81752, 0, "t"], + [81753, 0, "i"], + [81754, 0, "o"], + [81755, 0, "n"], + [81756, 0, "}"], + [81757, 0, "["], + [81758, 0, "c"], + [81759, 0, "o"], + [81760, 0, "m"], + [81761, 0, "m"], + [81762, 0, "a"], + [81763, 0, "n"], + [81763, 1], + [81762, 1], + [81762, 0, "o"], + [81763, 0, "n"], + [81764, 0, " "], + [81765, 0, "a"], + [81766, 0, "n"], + [81767, 0, "c"], + [81768, 0, "e"], + [81769, 0, "s"], + [81770, 0, "t"], + [81771, 0, "o"], + [81772, 0, "r"], + [81773, 0, "]"], + [81774, 0, "\\"], + [81775, 0, "l"], + [81776, 0, "a"], + [81777, 0, "b"], + [81778, 0, "e"], + [81779, 0, "l"], + [81780, 0, "{"], + [81781, 0, "d"], + [81782, 0, "e"], + [81783, 0, "f"], + [81784, 0, ":"], + [81785, 0, "c"], + [81786, 0, "o"], + [81787, 0, "m"], + [81788, 0, "m"], + [81789, 0, "o"], + [81790, 0, "n"], + [81791, 0, "-"], + [81792, 0, "a"], + [81793, 0, "n"], + [81794, 0, "c"], + [81795, 0, "e"], + [81796, 0, "s"], + [81797, 0, "t"], + [81798, 0, "o"], + [81799, 0, "r"], + [81800, 0, "}"], + [81801, 0, "\n"], + [81802, 0, "\\"], + [81803, 0, "e"], + [81804, 0, "n"], + [81805, 0, "d"], + [81806, 0, "{"], + [81807, 0, "d"], + [81808, 0, "e"], + [81809, 0, "f"], + [81810, 0, "i"], + [81811, 0, "n"], + [81812, 0, "i"], + [81813, 0, "t"], + [81814, 0, "i"], + [81815, 0, "o"], + [81816, 0, "n"], + [81817, 0, "}"], + [81801, 0, "\n"], + [81802, 0, "I"], + [81803, 0, "n"], + [81804, 0, " "], + [81805, 0, "a"], + [81806, 0, " "], + [81807, 0, "h"], + [81808, 0, "i"], + [81809, 0, "s"], + [81810, 0, "t"], + [81811, 0, "o"], + [81812, 0, "r"], + [81813, 0, "y"], + [81814, 0, " "], + [81815, 0, "$"], + [81816, 0, "H"], + [81817, 0, "$"], + [81818, 0, ","], + [81819, 0, " "], + [81820, 0, "t"], + [81821, 0, "h"], + [81822, 0, "e"], + [81823, 0, " "], + [81824, 0, "\\"], + [81825, 0, "e"], + [81826, 0, "m"], + [81827, 0, "p"], + [81828, 0, "h"], + [81829, 0, "{"], + [81830, 0, "c"], + [81831, 0, "o"], + [81832, 0, "m"], + [81833, 0, "m"], + [81834, 0, "o"], + [81835, 0, "n"], + [81836, 0, " "], + [81837, 0, "a"], + [81838, 0, "n"], + [81839, 0, "c"], + [81840, 0, "e"], + [81841, 0, "s"], + [81842, 0, "t"], + [81843, 0, "o"], + [81844, 0, "r"], + [81845, 0, "}"], + [81846, 0, " "], + [81847, 0, "o"], + [81848, 0, "f"], + [81849, 0, " "], + [81850, 0, "t"], + [81851, 0, "w"], + [81852, 0, "o"], + [81853, 0, " "], + [81854, 0, "o"], + [81855, 0, "p"], + [81856, 0, "e"], + [81857, 0, "r"], + [81858, 0, "a"], + [81859, 0, "t"], + [81860, 0, "i"], + [81861, 0, "o"], + [81862, 0, "n"], + [81863, 0, "s"], + [81864, 0, " "], + [81865, 0, "$"], + [81866, 0, "o"], + [81867, 0, "_"], + [81868, 0, "1"], + [81869, 0, "$"], + [81870, 0, " "], + [81871, 0, "a"], + [81872, 0, "n"], + [81873, 0, "d"], + [81874, 0, " "], + [81875, 0, "$"], + [81876, 0, "o"], + [81877, 0, "_"], + [81878, 0, "2"], + [81879, 0, "$"], + [81880, 0, "%"], + [81880, 1], + [81880, 0, " "], + [81881, 0, "i"], + [81882, 0, "s"], + [81883, 0, " "], + [81884, 0, "t"], + [81885, 0, "h"], + [81886, 0, "e"], + [81887, 0, " "], + [81888, 0, "l"], + [81888, 1], + [81888, 0, "d"], + [81889, 0, "o"], + [81890, 0, "c"], + [81891, 0, "u"], + [81892, 0, "m"], + [81893, 0, "e"], + [81894, 0, "n"], + [81895, 0, "t"], + [81896, 0, " "], + [81897, 0, "s"], + [81898, 0, "t"], + [81899, 0, "a"], + [81900, 0, "t"], + [81901, 0, "e"], + [81902, 0, " "], + [81903, 0, "t"], + [81904, 0, "h"], + [81905, 0, "a"], + [81906, 0, "t"], + [81907, 0, " "], + [81888, 0, "m"], + [81888, 1], + [81888, 0, "l"], + [81889, 0, "a"], + [81890, 0, "t"], + [81891, 0, "e"], + [81892, 0, "s"], + [81893, 0, "t"], + [81894, 0, " "], + [81915, 0, "c"], + [81916, 0, "a"], + [81917, 0, "u"], + [81918, 0, "s"], + [81919, 0, "a"], + [81920, 0, "l"], + [81921, 0, "l"], + [81922, 0, "y"], + [81923, 0, " "], + [81924, 0, "p"], + [81925, 0, "r"], + [81926, 0, "e"], + [81927, 0, "c"], + [81928, 0, "e"], + [81929, 0, "d"], + [81930, 0, "e"], + [81931, 0, "s"], + [81932, 0, " "], + [81933, 0, "b"], + [81934, 0, "o"], + [81935, 0, "t"], + [81936, 0, "h"], + [81937, 0, " "], + [81938, 0, "$"], + [81939, 0, "o"], + [81940, 0, "_"], + [81941, 0, "1"], + [81942, 0, "$"], + [81943, 0, " "], + [81944, 0, "a"], + [81945, 0, "n"], + [81946, 0, "d"], + [81947, 0, " "], + [81948, 0, "$"], + [81949, 0, "o"], + [81950, 0, "_"], + [81951, 0, "2"], + [81952, 0, "$"], + [81953, 0, "."], + [81972, 0, "\n"], + [81973, 0, "\n"], + [81973, 0, "T"], + [81974, 0, "h"], + [81975, 0, "e"], + [81976, 0, " "], + [81977, 0, "c"], + [81978, 0, "o"], + [81979, 0, "m"], + [81980, 0, "m"], + [81981, 0, "o"], + [81982, 0, "n"], + [81983, 0, " "], + [81984, 0, "a"], + [81985, 0, "n"], + [81986, 0, "c"], + [81987, 0, "e"], + [81988, 0, "s"], + [81989, 0, "t"], + [81990, 0, "o"], + [81991, 0, "r"], + [81992, 0, " "], + [81993, 0, "c"], + [81994, 0, "a"], + [81995, 0, "n"], + [81996, 0, " "], + [81997, 0, "b"], + [81998, 0, "e"], + [81999, 0, " "], + [82000, 0, "d"], + [82001, 0, "e"], + [82002, 0, "f"], + [82003, 0, "i"], + [82004, 0, "n"], + [82005, 0, "e"], + [82006, 0, "d"], + [82007, 0, " "], + [82008, 0, "m"], + [82009, 0, "o"], + [82010, 0, "r"], + [82011, 0, "e"], + [82012, 0, " "], + [82013, 0, "f"], + [82014, 0, "o"], + [82015, 0, "r"], + [82016, 0, "m"], + [82017, 0, "a"], + [82018, 0, "l"], + [82019, 0, "l"], + [82020, 0, "y"], + [82021, 0, " "], + [82022, 0, "a"], + [82023, 0, "s"], + [82024, 0, " "], + [82025, 0, "t"], + [82026, 0, "h"], + [82027, 0, "e"], + [82028, 0, " "], + [82029, 0, "d"], + [82030, 0, "o"], + [82031, 0, "c"], + [82032, 0, "u"], + [82033, 0, "m"], + [82034, 0, "e"], + [82035, 0, "n"], + [82036, 0, "t"], + [82037, 0, " "], + [82038, 0, "s"], + [82039, 0, "t"], + [82040, 0, "a"], + [82041, 0, "t"], + [82042, 0, "e"], + [82043, 0, " "], + [82044, 0, "r"], + [82045, 0, "e"], + [82046, 0, "s"], + [82047, 0, "u"], + [82048, 0, "l"], + [82049, 0, "t"], + [82050, 0, "i"], + [82051, 0, "n"], + [82052, 0, "g"], + [82053, 0, " "], + [82054, 0, "f"], + [82055, 0, "r"], + [82056, 0, "o"], + [82057, 0, "m"], + [82058, 0, " "], + [82059, 0, "a"], + [82060, 0, "p"], + [82061, 0, "p"], + [82062, 0, "l"], + [82063, 0, "y"], + [82064, 0, "i"], + [82065, 0, "n"], + [82066, 0, "g"], + [82067, 0, " "], + [82068, 0, "a"], + [82069, 0, " "], + [82070, 0, "p"], + [82071, 0, "r"], + [82072, 0, "e"], + [82073, 0, "f"], + [82074, 0, "i"], + [82075, 0, "x"], + [82076, 0, " "], + [82077, 0, "o"], + [82078, 0, "f"], + [82079, 0, " "], + [82080, 0, "o"], + [82081, 0, "p"], + [82082, 0, "e"], + [82083, 0, "r"], + [82084, 0, "a"], + [82085, 0, "t"], + [82086, 0, "i"], + [82087, 0, "o"], + [82088, 0, "n"], + [82089, 0, "s"], + [82090, 0, " "], + [82091, 0, "i"], + [82092, 0, "n"], + [82093, 0, " "], + [82094, 0, "$"], + [82095, 0, "H"], + [82096, 0, "$"], + [82078, 1], + [82077, 1], + [82076, 1], + [82075, 1], + [82074, 1], + [82073, 1], + [82072, 1], + [82071, 1], + [82070, 1], + [82070, 0, "s"], + [82071, 0, "e"], + [82072, 0, "q"], + [82073, 0, "u"], + [82074, 0, "e"], + [82075, 0, "n"], + [82076, 0, "c"], + [82077, 0, "e"], + [82078, 0, " "], + [82079, 0, "o"], + [82080, 0, "f"], + [82093, 1], + [82093, 1], + [82093, 0, "t"], + [82094, 0, "h"], + [82094, 1], + [82093, 1], + [82092, 1], + [82092, 0, ","], + [82093, 0, " "], + [82094, 0, "n"], + [82095, 0, "a"], + [82096, 0, "m"], + [82097, 0, "e"], + [82098, 0, "l"], + [82099, 0, "y"], + [82100, 0, " "], + [82101, 0, "t"], + [82102, 0, "h"], + [82103, 0, "e"], + [82104, 0, " "], + [82105, 0, "s"], + [82106, 0, "h"], + [82107, 0, "o"], + [82108, 0, "r"], + [82109, 0, "t"], + [82110, 0, "e"], + [82111, 0, "s"], + [82112, 0, "t"], + [82113, 0, " "], + [82114, 0, "p"], + [82115, 0, "r"], + [82116, 0, "e"], + [82117, 0, "f"], + [82118, 0, "i"], + [82119, 0, "x"], + [82120, 0, " "], + [82121, 0, "o"], + [82122, 0, "f"], + [82127, 0, " "], + [82128, 0, "t"], + [82129, 0, "h"], + [82130, 0, "a"], + [82131, 0, "t"], + [82132, 0, " "], + [82133, 0, "s"], + [82134, 0, "a"], + [82135, 0, "t"], + [82136, 0, "i"], + [82137, 0, "s"], + [82138, 0, "f"], + [82139, 0, "i"], + [82140, 0, "e"], + [82141, 0, "s"], + [82142, 0, " "], + [81992, 0, " "], + [81993, 0, "o"], + [81994, 0, "f"], + [81995, 0, " "], + [81996, 0, "$"], + [81997, 0, "O"], + [81997, 1], + [81997, 0, "o"], + [81998, 0, "_"], + [81999, 0, "1"], + [82000, 0, "$"], + [82001, 0, " "], + [82002, 0, "a"], + [82003, 0, "n"], + [82004, 0, "d"], + [82005, 0, " "], + [82006, 0, "$"], + [82007, 0, "o"], + [82008, 0, "_"], + [82009, 0, "2"], + [82010, 0, "$"], + [81868, 1], + [81868, 0, "r"], + [81878, 1], + [81878, 0, "s"], + [81941, 1], + [81941, 0, "r"], + [81951, 1], + [81951, 0, "s"], + [82009, 1], + [82009, 0, "s"], + [81999, 1], + [81999, 0, "r"], + [81868, 1], + [81868, 0, "s"], + [81878, 1], + [81878, 0, "t"], + [81878, 1], + [81878, 0, "s"], + [81868, 1], + [81868, 0, "r"], + [82111, 0, " "], + [82112, 0, "$"], + [82113, 0, "\\"], + [82114, 0, "a"], + [82114, 1], + [82114, 0, "l"], + [82115, 0, "a"], + [82116, 0, "n"], + [82117, 0, "g"], + [82118, 0, "l"], + [82119, 0, "e"], + [82120, 0, " "], + [82121, 0, "o"], + [82122, 0, "_"], + [82123, 0, "1"], + [82124, 0, ","], + [82125, 0, " "], + [82126, 0, "\\"], + [82127, 0, "d"], + [82128, 0, "o"], + [82129, 0, "t"], + [82130, 0, "s"], + [82131, 0, ","], + [82132, 0, " "], + [82133, 0, "o"], + [82134, 0, "_"], + [82135, 0, "j"], + [82136, 0, " "], + [82137, 0, "\\"], + [82138, 0, "r"], + [82139, 0, "a"], + [82140, 0, "n"], + [82141, 0, "g"], + [82142, 0, "l"], + [82143, 0, "e"], + [82144, 0, "$"], + [82145, 1], + [82146, 1], + [82146, 1], + [82146, 1], + [82146, 1], + [82146, 1], + [82146, 1], + [82146, 0, "t"], + [82147, 0, "h"], + [82148, 0, "a"], + [82149, 0, "t"], + [82150, 0, " "], + [82151, 0, "i"], + [82152, 0, "s"], + [82196, 0, "$"], + [82197, 0, "("], + [82198, 0, "o"], + [82199, 0, "_"], + [82200, 0, "r"], + [82201, 0, "."], + [82202, 0, "\\"], + [82203, 0, "m"], + [82204, 0, "a"], + [82205, 0, "t"], + [82206, 0, "h"], + [82207, 0, "i"], + [82208, 0, "t"], + [82209, 0, "{"], + [82210, 0, "d"], + [82211, 0, "e"], + [82212, 0, "p"], + [82213, 0, "s"], + [82214, 0, "}"], + [82215, 0, " "], + [82216, 0, "\\"], + [82217, 0, "c"], + [82218, 0, "u"], + [82219, 0, "p"], + [82220, 0, " "], + [82221, 0, "o"], + [82222, 0, "_"], + [82223, 0, "s"], + [82224, 0, "\\"], + [82225, 0, "."], + [82226, 0, "m"], + [82227, 0, "a"], + [82228, 0, "t"], + [82229, 0, "h"], + [82230, 0, "i"], + [82231, 0, "t"], + [82232, 0, "{"], + [82233, 0, "d"], + [82234, 0, "e"], + [82235, 0, "p"], + [82236, 0, "s"], + [82237, 0, "}"], + [82238, 0, ")"], + [82239, 0, " "], + [82240, 0, "\\"], + [82241, 0, "s"], + [82242, 0, "u"], + [82243, 0, "b"], + [82244, 0, "s"], + [82245, 0, "e"], + [82246, 0, "t"], + [82247, 0, "e"], + [82248, 0, "q"], + [82249, 0, " "], + [82250, 0, "\\"], + [82251, 0, "{"], + [82252, 0, "o"], + [82253, 0, "_"], + [82254, 0, "1"], + [82255, 0, "."], + [82256, 0, "\\"], + [82257, 0, "m"], + [82258, 0, "a"], + [82259, 0, "t"], + [82260, 0, "h"], + [82261, 0, "i"], + [82262, 0, "t"], + [82263, 0, "{"], + [82264, 0, "i"], + [82265, 0, "d"], + [82266, 0, "}"], + [82267, 0, ","], + [82268, 0, " "], + [82269, 0, "\\"], + [82270, 0, "d"], + [82271, 0, "o"], + [82272, 0, "t"], + [82273, 0, "s"], + [82274, 0, ","], + [82275, 0, " "], + [82276, 0, "o"], + [82277, 0, "_"], + [82278, 0, "j"], + [82279, 0, "."], + [82280, 0, "\\"], + [82281, 0, "m"], + [82282, 0, "a"], + [82283, 0, "t"], + [82284, 0, "h"], + [82285, 0, "i"], + [82286, 0, "t"], + [82287, 0, "{"], + [82288, 0, "i"], + [82289, 0, "d"], + [82290, 0, "}"], + [82291, 0, "\\"], + [82292, 0, "}"], + [82293, 0, "$"], + [82294, 0, "."], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [83103, 1], + [82224, 0, "."], + [82226, 1], + [82327, 1], + [82327, 0, "-"], + [82219, 1], + [82218, 1], + [82217, 1], + [82217, 0, "c"], + [82218, 0, "a"], + [82219, 0, "p"], + [81853, 0, " "], + [81854, 0, "c"], + [81855, 0, "o"], + [81856, 0, "n"], + [81857, 0, "c"], + [81858, 0, "u"], + [81859, 0, "r"], + [81860, 0, "r"], + [81861, 0, "e"], + [81862, 0, "n"], + [81863, 0, "t"], + [82307, 0, "\n"], + [82308, 0, "\n"], + [82308, 0, "\\"], + [82309, 0, "b"], + [82310, 0, "e"], + [82311, 0, "g"], + [82312, 0, "i"], + [82313, 0, "n"], + [82314, 0, "{"], + [82315, 0, "d"], + [82316, 0, "e"], + [82317, 0, "f"], + [82318, 0, "i"], + [82319, 0, "n"], + [82320, 0, "i"], + [82321, 0, "t"], + [82322, 0, "i"], + [82323, 0, "o"], + [82324, 0, "n"], + [82325, 0, "}"], + [82326, 0, "["], + [82327, 0, "i"], + [82328, 0, "n"], + [82329, 0, "s"], + [82330, 0, "e"], + [82331, 0, "r"], + [82332, 0, "t"], + [82333, 0, "i"], + [82334, 0, "o"], + [82335, 0, "n"], + [82336, 0, " "], + [82337, 0, "i"], + [82338, 0, "n"], + [82339, 0, "t"], + [82340, 0, "e"], + [82341, 0, "r"], + [82342, 0, "v"], + [82343, 0, "a"], + [82344, 0, "l"], + [82345, 0, "\n"], + [82345, 1], + [82345, 0, "]"], + [82346, 0, "\\"], + [82347, 0, "l"], + [82348, 0, "a"], + [82349, 0, "b"], + [82350, 0, "e"], + [82351, 0, "l"], + [82352, 0, "{"], + [82353, 0, "d"], + [82354, 0, "e"], + [82355, 0, "f"], + [82356, 0, ":"], + [82357, 0, "i"], + [82358, 0, "n"], + [82359, 0, "s"], + [82360, 0, "e"], + [82361, 0, "r"], + [82362, 0, "t"], + [82363, 0, "-"], + [82364, 0, "i"], + [82365, 0, "n"], + [82366, 0, "t"], + [82367, 0, "e"], + [82368, 0, "r"], + [82369, 0, "v"], + [82370, 0, "a"], + [82371, 0, "l"], + [82372, 0, "}"], + [82373, 0, "\n"], + [82374, 0, "\\"], + [82375, 0, "e"], + [82376, 0, "n"], + [82377, 0, "d"], + [82378, 0, "{"], + [82379, 0, "d"], + [82380, 0, "e"], + [82381, 0, "f"], + [82382, 0, "i"], + [82383, 0, "n"], + [82384, 0, "i"], + [82385, 0, "t"], + [82386, 0, "i"], + [82387, 0, "o"], + [82388, 0, "n"], + [82389, 0, "}"], + [82374, 0, "\n"], + [82374, 0, "T"], + [82374, 1], + [82374, 0, "G"], + [82375, 0, "i"], + [82376, 0, "v"], + [82377, 0, "e"], + [82378, 0, "n"], + [82379, 0, " "], + [82380, 0, "t"], + [82381, 0, "w"], + [82382, 0, "o"], + [82383, 0, " "], + [82384, 0, "i"], + [82385, 0, "n"], + [82386, 0, "s"], + [82387, 0, "e"], + [82388, 0, "r"], + [82389, 0, "t"], + [82389, 1], + [82388, 1], + [82387, 1], + [82386, 1], + [82385, 1], + [82384, 1], + [82384, 0, "o"], + [82385, 0, "p"], + [82386, 0, "e"], + [82387, 0, "r"], + [82388, 0, "a"], + [82389, 0, "t"], + [82390, 0, "i"], + [82391, 0, "o"], + [82392, 0, "n"], + [82393, 0, "s"], + [82394, 0, " "], + [82395, 0, "$"], + [82396, 0, "o"], + [82397, 0, "_"], + [82398, 0, "r"], + [82399, 0, "$"], + [82400, 0, " "], + [82401, 0, "a"], + [82402, 0, "n"], + [82403, 0, "d"], + [82404, 0, " "], + [82405, 0, "$"], + [82406, 0, "o"], + [82407, 0, "_"], + [82408, 0, "s"], + [82409, 0, "$"], + [82410, 0, " "], + [82411, 0, "t"], + [82412, 0, "h"], + [82413, 0, "a"], + [82414, 0, "t"], + [82415, 0, " "], + [82416, 0, "i"], + [82417, 0, "n"], + [82418, 0, "s"], + [82419, 0, "e"], + [82420, 0, "r"], + [82421, 0, "t"], + [82422, 0, " "], + [82423, 0, "i"], + [82424, 0, "n"], + [82425, 0, "t"], + [82426, 0, "o"], + [82427, 0, " "], + [82428, 0, "t"], + [82429, 0, "h"], + [82430, 0, "e"], + [82431, 0, " "], + [82432, 0, "s"], + [82433, 0, "a"], + [82434, 0, "m"], + [82435, 0, "e"], + [82436, 0, " "], + [82437, 0, "l"], + [82438, 0, "i"], + [82439, 0, "s"], + [82440, 0, "t"], + [82441, 0, ","], + [82442, 0, " "], + [82443, 0, "t"], + [82444, 0, "h"], + [82445, 0, "e"], + [82446, 0, " "], + [82447, 0, "\\"], + [82448, 0, "e"], + [82449, 0, "m"], + [82450, 0, "p"], + [82451, 0, "h"], + [82452, 0, "{"], + [82453, 0, "i"], + [82454, 0, "n"], + [82455, 0, "s"], + [82456, 0, "e"], + [82457, 0, "r"], + [82458, 0, "t"], + [82459, 0, "i"], + [82460, 0, "o"], + [82461, 0, "n"], + [82462, 0, " "], + [82463, 0, "i"], + [82464, 0, "n"], + [82465, 0, "t"], + [82466, 0, "e"], + [82467, 0, "r"], + [82468, 0, "v"], + [82469, 0, "a"], + [82470, 0, "l"], + [82471, 0, "}"], + [82472, 0, " "], + [82473, 0, "o"], + [82474, 0, "f"], + [82475, 0, " "], + [82476, 0, "t"], + [82477, 0, "h"], + [82477, 1], + [82476, 1], + [82476, 0, "$"], + [82477, 0, "o"], + [82478, 0, "_"], + [82479, 0, "r"], + [82480, 0, "$"], + [82481, 0, " "], + [82482, 0, "i"], + [82483, 0, "s"], + [82484, 0, " "], + [82485, 0, "t"], + [82486, 0, "h"], + [82487, 0, "e"], + [82488, 0, " "], + [82489, 0, "p"], + [82490, 0, "a"], + [82491, 0, "i"], + [82492, 0, "r"], + [82493, 0, " "], + [82494, 0, "o"], + [82495, 0, "f"], + [82496, 0, " "], + [82497, 0, "k"], + [82498, 0, "e"], + [82499, 0, "y"], + [82500, 0, "s"], + [82501, 0, " "], + [82502, 0, "$"], + [82503, 0, "("], + [82504, 0, "k"], + [82505, 0, "_"], + [82506, 0, "r"], + [82507, 0, "^"], + [82508, 0, "\\"], + [82509, 0, "m"], + [82510, 0, "a"], + [82511, 0, "t"], + [82512, 0, "h"], + [82513, 0, "i"], + [82514, 0, "t"], + [82515, 0, "{"], + [82516, 0, "b"], + [82517, 0, "e"], + [82518, 0, "f"], + [82519, 0, "o"], + [82520, 0, "r"], + [82521, 0, "e"], + [82522, 0, "}"], + [82523, 0, ","], + [82524, 0, " "], + [82525, 0, "k"], + [82526, 0, "_"], + [82527, 0, "r"], + [82528, 0, "&"], + [82528, 1], + [82528, 0, "^"], + [82529, 0, "\\"], + [82530, 0, "m"], + [82531, 0, "a"], + [82532, 0, "t"], + [82533, 0, "h"], + [82534, 0, "i"], + [82535, 0, "t"], + [82536, 0, "{"], + [82537, 0, "a"], + [82538, 0, "f"], + [82539, 0, "t"], + [82540, 0, "e"], + [82541, 0, "r"], + [82542, 0, "}"], + [82543, 0, ")"], + [82544, 0, "$"], + [82535, 1], + [82534, 1], + [82534, 0, "r"], + [82535, 0, "m"], + [82514, 1], + [82513, 1], + [82513, 0, "r"], + [82514, 0, "m"], + [82545, 0, " "], + [82383, 0, " "], + [82384, 0, "c"], + [82385, 0, "o"], + [82386, 0, "n"], + [82387, 0, "c"], + [82388, 0, "u"], + [82389, 0, "r"], + [82390, 0, "r"], + [82391, 0, "e"], + [82392, 0, "n"], + [82393, 0, "t"], + [82557, 0, "s"], + [82558, 0, "u"], + [82559, 0, "c"], + [82560, 0, "h"], + [82561, 0, " "], + [82562, 0, "t"], + [82563, 0, "h"], + [82564, 0, "a"], + [82565, 0, "t"], + [82566, 0, " "], + [82567, 0, "$"], + [82568, 0, "k"], + [82569, 0, "_"], + [82570, 0, "r"], + [82571, 0, "&"], + [82571, 1], + [82571, 0, "^"], + [82572, 0, "\\"], + [82573, 0, "m"], + [82574, 0, "a"], + [82575, 0, "t"], + [82576, 0, "h"], + [82577, 0, "i"], + [82577, 1], + [82577, 0, "r"], + [82578, 0, "m"], + [82579, 0, "{"], + [82580, 0, "b"], + [82581, 0, "e"], + [82582, 0, "f"], + [82583, 0, "o"], + [82584, 0, "r"], + [82585, 0, "e"], + [82586, 0, "}"], + [82587, 0, "$"], + [82566, 0, " "], + [82567, 0, "$"], + [82568, 0, "o"], + [82569, 0, "_"], + [82570, 0, "r"], + [82571, 0, "."], + [82572, 0, "\\"], + [82573, 0, "m"], + [82574, 0, "a"], + [82575, 0, "t"], + [82576, 0, "h"], + [82577, 0, "i"], + [82578, 0, "t"], + [82579, 0, "{"], + [82580, 0, "i"], + [82581, 0, "d"], + [82582, 0, "}"], + [82583, 0, "$"], + [82584, 0, " "], + [82585, 0, "a"], + [82586, 0, "p"], + [82587, 0, "p"], + [82588, 0, "e"], + [82589, 0, "a"], + [82590, 0, "r"], + [82591, 0, "s"], + [82592, 0, " "], + [82593, 0, "a"], + [82594, 0, "f"], + [82595, 0, "t"], + [82596, 0, "e"], + [82597, 0, "r"], + [82620, 0, " "], + [82621, 0, "w"], + [82622, 0, "h"], + [82623, 0, "e"], + [82624, 0, "n"], + [82625, 0, " "], + [82626, 0, "$"], + [82627, 0, "o"], + [82628, 0, "_"], + [82629, 0, "r"], + [82630, 0, "$"], + [82631, 0, " "], + [82632, 0, "h"], + [82633, 0, "a"], + [82634, 0, "s"], + [82635, 0, " "], + [82636, 0, "b"], + [82637, 0, "e"], + [82638, 0, "e"], + [82639, 0, "n"], + [82640, 0, " "], + [82641, 0, "a"], + [82642, 0, "p"], + [82643, 0, "p"], + [82644, 0, "l"], + [82645, 0, "i"], + [82646, 0, "e"], + [82647, 0, "d"], + [82648, 0, ","], + [82649, 0, " "], + [82650, 0, "$"], + [82651, 0, "k"], + [82652, 0, "_"], + [82653, 0, "r"], + [82654, 0, "&"], + [82654, 1], + [82654, 0, "^"], + [82655, 0, "\\"], + [82656, 0, "m"], + [82657, 0, "a"], + [82658, 0, "t"], + [82659, 0, "h"], + [82660, 0, "r"], + [82661, 0, "m"], + [82662, 0, "{"], + [82663, 0, "a"], + [82664, 0, "f"], + [82665, 0, "t"], + [82666, 0, "e"], + [82667, 0, "r"], + [82668, 0, "}"], + [82669, 0, "$"], + [82670, 0, " "], + [82671, 0, "a"], + [82672, 0, "p"], + [82673, 0, "p"], + [82674, 0, "e"], + [82675, 0, "a"], + [82676, 0, "r"], + [82677, 0, "s"], + [82678, 0, " "], + [82679, 0, "a"], + [82680, 0, "f"], + [82681, 0, "t"], + [82682, 0, "e"], + [82683, 0, "r"], + [82684, 0, " "], + [82685, 0, "$"], + [82686, 0, "k"], + [82687, 0, "_"], + [82687, 1], + [82686, 1], + [82686, 0, "o"], + [82687, 0, "_"], + [82688, 0, "r"], + [82689, 0, "."], + [82690, 0, "\\"], + [82691, 0, "m"], + [82692, 0, "a"], + [82693, 0, "t"], + [82694, 0, "h"], + [82695, 0, "i"], + [82696, 0, "t"], + [82697, 0, "{"], + [82698, 0, "i"], + [82699, 0, "d"], + [82700, 0, "}"], + [82701, 0, "$"], + [82702, 0, " "], + [82703, 0, "a"], + [82703, 1], + [82703, 0, "w"], + [82704, 0, "h"], + [82705, 0, "e"], + [82706, 0, "n"], + [82707, 0, " "], + [82708, 0, "$"], + [82709, 0, "o"], + [82710, 0, "_"], + [82711, 0, "r"], + [82712, 0, "$"], + [82713, 0, " "], + [82714, 0, "h"], + [82715, 0, "a"], + [82716, 0, "s"], + [82717, 0, " "], + [82718, 0, "b"], + [82719, 0, "e"], + [82720, 0, "e"], + [82721, 0, "n"], + [82722, 0, " "], + [82723, 0, "a"], + [82724, 0, "p"], + [82725, 0, "p"], + [82726, 0, "l"], + [82727, 0, "i"], + [82728, 0, "e"], + [82729, 0, "d"], + [82730, 0, ","], + [82731, 0, " "], + [82732, 0, "a"], + [82733, 0, "n"], + [82734, 0, "d"], + [82735, 0, " "], + [82736, 0, "$"], + [82737, 0, "k"], + [82738, 0, "_"], + [82739, 0, "r"], + [82740, 0, "^"], + [82741, 0, "\\"], + [82742, 0, "m"], + [82743, 0, "a"], + [82744, 0, "t"], + [82745, 0, "h"], + [82746, 0, "r"], + [82747, 0, "m"], + [82748, 0, "{"], + [82749, 0, "a"], + [82750, 0, "f"], + [82751, 0, "t"], + [82752, 0, "e"], + [82753, 0, "r"], + [82754, 0, "}"], + [82755, 0, " "], + [82756, 0, "a"], + [82757, 0, "p"], + [82758, 0, "p"], + [82759, 0, "e"], + [82760, 0, "a"], + [82761, 0, "r"], + [82762, 0, "s"], + [82763, 0, " "], + [82764, 0, "i"], + [82765, 0, "m"], + [82766, 0, "m"], + [82767, 0, "e"], + [82768, 0, "d"], + [82769, 0, "i"], + [82770, 0, "a"], + [82771, 0, "t"], + [82772, 0, "e"], + [82773, 0, "l"], + [82774, 0, "y"], + [82775, 0, " "], + [82776, 0, "a"], + [82777, 0, "f"], + [82778, 0, "t"], + [82779, 0, "e"], + [82780, 0, "r"], + [82781, 0, " "], + [82782, 0, "$"], + [82783, 0, "k"], + [82784, 0, "_"], + [82785, 0, "r"], + [82786, 0, "&"], + [82786, 1], + [82786, 0, "^"], + [82787, 0, "\\"], + [82788, 0, "m"], + [82789, 0, "a"], + [82790, 0, "t"], + [82791, 0, "h"], + [82792, 0, "r"], + [82793, 0, "m"], + [82794, 0, "{"], + [82795, 0, "b"], + [82796, 0, "e"], + [82797, 0, "f"], + [82798, 0, "o"], + [82799, 0, "r"], + [82800, 0, "e"], + [82801, 0, "}"], + [82802, 0, "$"], + [82755, 0, "$"], + [82804, 0, " "], + [82805, 0, "i"], + [82806, 0, "n"], + [82807, 0, " "], + [82808, 0, "t"], + [82809, 0, "h"], + [82810, 0, "e"], + [82811, 0, " "], + [82812, 0, "c"], + [82813, 0, "o"], + [82814, 0, "m"], + [82815, 0, "m"], + [82816, 0, "o"], + [82817, 0, "n"], + [82818, 0, " "], + [82819, 0, "a"], + [82820, 0, "n"], + [82821, 0, "c"], + [82822, 0, "e"], + [82823, 0, "s"], + [82824, 0, "t"], + [82825, 0, "o"], + [82826, 0, "r"], + [82827, 0, " "], + [82828, 0, "o"], + [82829, 0, "f"], + [82830, 0, " "], + [82831, 0, "$"], + [82832, 0, "o"], + [82833, 0, "_"], + [82834, 0, "r"], + [82835, 0, "$"], + [82836, 0, " "], + [82837, 0, "a"], + [82838, 0, "n"], + [82839, 0, "d"], + [82840, 0, " "], + [82841, 0, "$"], + [82842, 0, "o"], + [82843, 0, "_"], + [82844, 0, "s"], + [82845, 0, "$"], + [82846, 0, "."], + [82847, 0, " "], + [82848, 0, "T"], + [82849, 0, "h"], + [82850, 0, "e"], + [82851, 0, " "], + [82852, 0, "i"], + [82853, 0, "n"], + [82854, 0, "s"], + [82855, 0, "e"], + [82856, 0, "r"], + [82857, 0, "t"], + [82858, 0, "i"], + [82859, 0, "o"], + [82860, 0, "n"], + [82861, 0, " "], + [82862, 0, "i"], + [82863, 0, "n"], + [82864, 0, "t"], + [82865, 0, "e"], + [82866, 0, "r"], + [82867, 0, "v"], + [82868, 0, "a"], + [82869, 0, "l"], + [82870, 0, " "], + [82871, 0, "o"], + [82872, 0, "f"], + [82873, 0, " "], + [82874, 0, "$"], + [82875, 0, "o"], + [82876, 0, "_"], + [82877, 0, "s"], + [82878, 0, "$"], + [82879, 0, " "], + [82880, 0, "i"], + [82881, 0, "s"], + [82882, 0, " "], + [82883, 0, "t"], + [82884, 0, "h"], + [82885, 0, "e"], + [82886, 0, " "], + [82887, 0, "p"], + [82888, 0, "a"], + [82889, 0, "i"], + [82890, 0, "r"], + [82891, 0, " "], + [82892, 0, "o"], + [82893, 0, "f"], + [82894, 0, " "], + [82895, 0, "k"], + [82896, 0, "e"], + [82897, 0, "y"], + [82898, 0, "s"], + [82899, 0, " "], + [82900, 0, "$"], + [82901, 0, "("], + [82902, 0, "k"], + [82903, 0, "_"], + [82904, 0, "s"], + [82905, 0, "^"], + [82906, 0, "\\"], + [82907, 0, "m"], + [82908, 0, "a"], + [82909, 0, "t"], + [82910, 0, "h"], + [82911, 0, "r"], + [82912, 0, "m"], + [82913, 0, "{"], + [82914, 0, "b"], + [82915, 0, "e"], + [82916, 0, "f"], + [82917, 0, "o"], + [82918, 0, "r"], + [82919, 0, "e"], + [82920, 0, "}"], + [82921, 0, ","], + [82922, 0, " "], + [82923, 0, "k"], + [82924, 0, "_"], + [82925, 0, "s"], + [82926, 0, "^"], + [82927, 0, "\\"], + [82928, 0, "m"], + [82929, 0, "a"], + [82930, 0, "t"], + [82931, 0, "h"], + [82932, 0, "r"], + [82933, 0, "m"], + [82934, 0, "{"], + [82935, 0, "a"], + [82936, 0, "f"], + [82937, 0, "t"], + [82938, 0, "e"], + [82939, 0, "r"], + [82940, 0, "}"], + [82941, 0, ")"], + [82942, 0, "$"], + [82943, 0, " "], + [82944, 0, "d"], + [82945, 0, "e"], + [82946, 0, "f"], + [82947, 0, "i"], + [82948, 0, "n"], + [82949, 0, "e"], + [82950, 0, "d"], + [82951, 0, " "], + [82952, 0, "a"], + [82953, 0, "l"], + [82953, 1], + [82952, 1], + [82952, 0, "s"], + [82953, 0, "i"], + [82954, 0, "m"], + [82955, 0, "i"], + [82956, 0, "l"], + [82957, 0, "a"], + [82958, 0, "r"], + [82959, 0, "l"], + [82960, 0, "y"], + [82961, 0, "."], + [82980, 0, "\n"], + [82981, 0, "\n"], + [82981, 0, "I"], + [82982, 0, "f"], + [82983, 0, " "], + [82983, 1], + [82982, 1], + [82982, 0, "t"], + [82983, 0, " "], + [82984, 0, "m"], + [82985, 0, "a"], + [82986, 0, "y"], + [82987, 0, " "], + [82988, 0, "b"], + [82989, 0, "e"], + [82990, 0, " "], + [82991, 0, "t"], + [82992, 0, "h"], + [82993, 0, "e"], + [82994, 0, " "], + [82995, 0, "c"], + [82996, 0, "a"], + [82997, 0, "s"], + [82998, 0, "e"], + [82999, 0, " "], + [83000, 0, "t"], + [83001, 0, "h"], + [83002, 0, "a"], + [83003, 0, "t"], + [83004, 0, " "], + [83005, 0, "$"], + [83006, 0, "K"], + [83006, 1], + [83006, 0, "k"], + [83007, 0, "_"], + [83008, 0, "r"], + [83009, 0, "^"], + [83010, 0, "\\"], + [83011, 0, "m"], + [83012, 0, "a"], + [83013, 0, "t"], + [83014, 0, "h"], + [83015, 0, "r"], + [83016, 0, "m"], + [83017, 0, "{"], + [83018, 0, "b"], + [83019, 0, "e"], + [83020, 0, "f"], + [83021, 0, "o"], + [83022, 0, "r"], + [83023, 0, "e"], + [83024, 0, "}"], + [83025, 0, "$"], + [83026, 0, " "], + [83027, 0, "o"], + [83028, 0, "r"], + [83029, 0, " "], + [83030, 0, "$"], + [83031, 0, "k"], + [83032, 0, "_"], + [83033, 0, "s"], + [83034, 0, "^"], + [83035, 0, "\\"], + [83036, 0, "b"], + [83037, 0, "e"], + [83037, 1], + [83036, 1], + [83036, 0, "m"], + [83037, 0, "a"], + [83038, 0, "t"], + [83039, 0, "h"], + [83040, 0, "r"], + [83041, 0, "m"], + [83042, 0, "{"], + [83043, 0, "b"], + [83044, 0, "e"], + [83045, 0, "f"], + [83046, 0, "o"], + [83047, 0, "r"], + [83048, 0, "e"], + [83049, 0, "}"], + [83050, 0, "$"], + [83051, 0, " "], + [83052, 0, "i"], + [83053, 0, "s"], + [83054, 0, " "], + [83055, 0, "\\"], + [83055, 1], + [83055, 0, "$"], + [83056, 0, "\\"], + [83056, 1], + [83055, 1], + [83055, 0, "\\"], + [83056, 0, "t"], + [83057, 0, "e"], + [83058, 0, "x"], + [83059, 0, "t"], + [83060, 0, "s"], + [83061, 0, "f"], + [83062, 0, "{"], + [83063, 0, "h"], + [83064, 0, "e"], + [83065, 0, "a"], + [83066, 0, "d"], + [83067, 0, "}"], + [83068, 0, " "], + [83068, 1], + [83068, 0, ","], + [83069, 0, " "], + [83070, 0, "a"], + [83071, 0, "n"], + [83072, 0, "d"], + [83073, 0, " "], + [83074, 0, "t"], + [83075, 0, "h"], + [83076, 0, "a"], + [83077, 0, "t"], + [83078, 0, " "], + [83079, 0, "$"], + [83080, 0, "k"], + [83081, 0, "_"], + [83082, 0, "r"], + [83083, 0, "^"], + [83084, 0, "\\"], + [83085, 0, "m"], + [83086, 0, "a"], + [83087, 0, "t"], + [83088, 0, "h"], + [83089, 0, "r"], + [83090, 0, "m"], + [83091, 0, "{"], + [83092, 0, "a"], + [83093, 0, "f"], + [83094, 0, "t"], + [83095, 0, "e"], + [83096, 0, "r"], + [83097, 0, "}"], + [83098, 0, "$"], + [83099, 0, " "], + [83100, 0, "o"], + [83101, 0, "r"], + [83102, 0, " "], + [83103, 0, "$"], + [83104, 0, "\\"], + [83105, 0, "k"], + [83105, 1], + [83104, 1], + [83104, 0, "k"], + [83105, 0, "_"], + [83106, 0, "s"], + [83107, 0, "^"], + [83108, 0, "\\"], + [83109, 0, "m"], + [83110, 0, "a"], + [83111, 0, "t"], + [83112, 0, "h"], + [83113, 0, "r"], + [83114, 0, "m"], + [83115, 0, "{"], + [83116, 0, "a"], + [83117, 0, "f"], + [83118, 0, "t"], + [83119, 0, "e"], + [83120, 0, "r"], + [83121, 0, "}"], + [83122, 0, "$"], + [83123, 0, " "], + [83124, 0, "i"], + [83125, 0, "s"], + [83126, 0, " "], + [83127, 0, "'"], + [83127, 1], + [83127, 0, "\\"], + [83128, 0, "t"], + [83129, 0, "e"], + [83130, 0, "x"], + [83131, 0, "t"], + [83132, 0, "s"], + [83133, 0, "f"], + [83134, 0, "{"], + [83135, 0, "t"], + [83136, 0, "a"], + [83137, 0, "i"], + [83138, 0, "l"], + [83139, 0, "}"], + [83140, 0, "."], + [83141, 0, " "], + [83142, 0, "i"], + [83142, 1], + [83142, 0, "I"], + [83143, 0, "n"], + [83144, 0, " "], + [83145, 0, "p"], + [83146, 0, "a"], + [83147, 0, "r"], + [83148, 0, "t"], + [83149, 0, "i"], + [83150, 0, "c"], + [83151, 0, "u"], + [83152, 0, "l"], + [83153, 0, "a"], + [83154, 0, "r"], + [83155, 0, ","], + [83156, 0, " "], + [83157, 0, "t"], + [83158, 0, "h"], + [83159, 0, "i"], + [83160, 0, "s"], + [83161, 0, " "], + [83162, 0, "i"], + [83163, 0, "s"], + [83164, 0, " "], + [83165, 0, "t"], + [83166, 0, "h"], + [83167, 0, "e"], + [83168, 0, " "], + [83169, 0, "c"], + [83170, 0, "a"], + [83171, 0, "s"], + [83172, 0, "e"], + [83173, 0, " "], + [83174, 0, "i"], + [83175, 0, "f"], + [83176, 0, " "], + [83177, 0, "$"], + [83178, 0, "o"], + [83179, 0, "_"], + [83180, 0, "r"], + [83181, 0, "$"], + [83182, 0, " "], + [83183, 0, "a"], + [83184, 0, "n"], + [83185, 0, "d"], + [83186, 0, " "], + [83187, 0, "$"], + [83188, 0, "o"], + [83189, 0, "_"], + [83190, 0, "s"], + [83191, 0, "$"], + [83192, 0, " "], + [83193, 0, "h"], + [83194, 0, "a"], + [83195, 0, "v"], + [83196, 0, "e"], + [83197, 0, " "], + [83198, 0, "n"], + [83199, 0, "o"], + [83200, 0, " "], + [83201, 0, "c"], + [83202, 0, "o"], + [83203, 0, "m"], + [83204, 0, "m"], + [83205, 0, "o"], + [83206, 0, "n"], + [83207, 0, " "], + [83208, 0, "c"], + [83209, 0, "a"], + [83210, 0, "u"], + [83211, 0, "s"], + [83212, 0, "a"], + [83213, 0, "l"], + [83214, 0, " "], + [83215, 0, "h"], + [83216, 0, "i"], + [83217, 0, "s"], + [83218, 0, "t"], + [83219, 0, "o"], + [83220, 0, "r"], + [83221, 0, "y"], + [83222, 0, ","], + [83223, 0, " "], + [83224, 0, "i"], + [83225, 0, "."], + [83226, 0, "e"], + [83227, 0, "."], + [83228, 0, " "], + [83229, 0, "i"], + [83230, 0, "f"], + [83231, 0, " "], + [83232, 0, "$"], + [83233, 0, "o"], + [83234, 0, "_"], + [83235, 0, "r"], + [83236, 0, "\\"], + [83236, 1], + [83236, 0, "."], + [83237, 0, "\\"], + [83238, 0, "m"], + [83239, 0, "a"], + [83240, 0, "t"], + [83241, 0, "h"], + [83242, 0, "i"], + [83243, 0, "t"], + [83244, 0, "{"], + [83245, 0, "d"], + [83246, 0, "e"], + [83247, 0, "p"], + [83248, 0, "s"], + [83249, 0, "}"], + [83250, 0, " "], + [83251, 0, "\\"], + [83252, 0, "c"], + [83253, 0, "a"], + [83254, 0, "p"], + [83255, 0, " "], + [83256, 0, "o"], + [83257, 0, "_"], + [83258, 0, "s"], + [83259, 0, "."], + [83260, 0, "\\"], + [83261, 0, "m"], + [83262, 0, "a"], + [83263, 0, "t"], + [83264, 0, "h"], + [83265, 0, "i"], + [83266, 0, "t"], + [83267, 0, "{"], + [83268, 0, "d"], + [83269, 0, "e"], + [83270, 0, "p"], + [83271, 0, "s"], + [83272, 0, "}"], + [83273, 0, " "], + [83274, 0, "="], + [83275, 0, " "], + [83276, 0, "\\"], + [83277, 0, "{"], + [83278, 0, "\\"], + [83279, 0, "}"], + [83280, 0, "$"], + [83281, 0, " "], + [83282, 0, "a"], + [83283, 0, "n"], + [83284, 0, "d"], + [83285, 0, " "], + [83286, 0, "s"], + [83287, 0, "o"], + [83288, 0, " "], + [83289, 0, "t"], + [83290, 0, "h"], + [83291, 0, "e"], + [83292, 0, " "], + [83293, 0, "c"], + [83294, 0, "o"], + [83295, 0, "m"], + [83296, 0, "m"], + [83297, 0, "o"], + [83298, 0, "n"], + [83299, 0, " "], + [83300, 0, "a"], + [83301, 0, "n"], + [83302, 0, "c"], + [83303, 0, "e"], + [83304, 0, "s"], + [83305, 0, "t"], + [83306, 0, "o"], + [83307, 0, "r"], + [83308, 0, " "], + [83309, 0, "i"], + [83310, 0, "s"], + [83311, 0, " "], + [83312, 0, "t"], + [83313, 0, "h"], + [83314, 0, "e"], + [83315, 0, " "], + [83316, 0, "e"], + [83317, 0, "m"], + [83318, 0, "p"], + [83319, 0, "t"], + [83320, 0, "y"], + [83321, 0, " "], + [83322, 0, "d"], + [83323, 0, "o"], + [83324, 0, "c"], + [83325, 0, "u"], + [83326, 0, "m"], + [83327, 0, "e"], + [83328, 0, "n"], + [83329, 0, "t"], + [83330, 0, "."], + [83154, 1], + [83153, 1], + [83152, 1], + [83151, 1], + [83150, 1], + [83149, 1], + [83148, 1], + [83147, 1], + [83146, 1], + [83145, 1], + [83144, 1], + [83143, 1], + [83142, 1], + [83142, 0, "F"], + [83143, 0, "o"], + [83144, 0, "r"], + [83145, 0, " "], + [83146, 0, "e"], + [83147, 0, "x"], + [83148, 0, "a"], + [83149, 0, "m"], + [83150, 0, "p"], + [83151, 0, "l"], + [83152, 0, "e"], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83142, 1], + [83141, 1], + [83206, 0, " "], + [83207, 0, "$"], + [83208, 0, "H"], + [83209, 0, "$"], + [83342, 0, "\n"], + [83343, 0, "G"], + [83344, 0, "i"], + [83345, 0, "v"], + [83346, 0, "e"], + [83347, 0, "n"], + [83348, 0, " "], + [83349, 0, "a"], + [83350, 0, "n"], + [83351, 0, "y"], + [83352, 0, " "], + [83353, 0, "t"], + [83354, 0, "w"], + [83355, 0, "o"], + [83356, 0, " "], + [83357, 0, "c"], + [83358, 0, "o"], + [83359, 0, "n"], + [83360, 0, "c"], + [83361, 0, "u"], + [83362, 0, "r"], + [83363, 0, "r"], + [83364, 0, "e"], + [83365, 0, "n"], + [83366, 0, "t"], + [83367, 0, " "], + [83368, 0, "i"], + [83369, 0, "n"], + [83370, 0, "s"], + [83371, 0, "e"], + [83372, 0, "r"], + [83373, 0, "t"], + [83374, 0, "i"], + [83375, 0, "o"], + [83376, 0, "n"], + [83377, 0, " "], + [83378, 0, "o"], + [83379, 0, "p"], + [83380, 0, "e"], + [83381, 0, "r"], + [83382, 0, "a"], + [83383, 0, "t"], + [83384, 0, "i"], + [83385, 0, "o"], + [83386, 0, "n"], + [83387, 0, "s"], + [83388, 0, " "], + [83389, 0, "i"], + [83390, 0, "n"], + [83391, 0, " "], + [83392, 0, "$"], + [83393, 0, "H"], + [83394, 0, "$"], + [83395, 0, ","], + [83396, 0, " "], + [83397, 0, "w"], + [83398, 0, "e"], + [83399, 0, " "], + [83400, 0, "m"], + [83401, 0, "u"], + [83402, 0, "s"], + [83403, 0, "t"], + [83404, 0, " "], + [83405, 0, "s"], + [83406, 0, "h"], + [83407, 0, "o"], + [83408, 0, "w"], + [83409, 0, " "], + [83410, 0, "t"], + [83411, 0, "h"], + [83412, 0, "a"], + [83413, 0, "t"], + [83414, 0, " "], + [83415, 0, "t"], + [83416, 0, "h"], + [83417, 0, "e"], + [83418, 0, " "], + [83419, 0, "d"], + [83420, 0, "o"], + [83421, 0, "c"], + [83422, 0, "u"], + [83423, 0, "m"], + [83424, 0, "e"], + [83388, 0, " "], + [83389, 0, "$"], + [83390, 0, "o"], + [83391, 0, "_"], + [83392, 0, "r"], + [83393, 0, ","], + [83394, 0, " "], + [83395, 0, "$"], + [83396, 0, "o"], + [83397, 0, "_"], + [83398, 0, "s"], + [83399, 0, "$"], + [83437, 0, "n"], + [83438, 0, "t"], + [83439, 0, " "], + [83440, 0, "s"], + [83441, 0, "t"], + [83442, 0, "a"], + [83443, 0, "t"], + [83444, 0, "e"], + [83445, 0, " "], + [83446, 0, "d"], + [83447, 0, "o"], + [83448, 0, "e"], + [83449, 0, "s"], + [83450, 0, " "], + [83451, 0, "n"], + [83452, 0, "o"], + [83453, 0, "t"], + [83454, 0, " "], + [83455, 0, "d"], + [83456, 0, "e"], + [83457, 0, "p"], + [83458, 0, "e"], + [83459, 0, "n"], + [83460, 0, "d"], + [83461, 0, " "], + [83462, 0, "o"], + [83463, 0, "n"], + [83464, 0, " "], + [83465, 0, "t"], + [83466, 0, "h"], + [83467, 0, "e"], + [83468, 0, " "], + [83469, 0, "o"], + [83470, 0, "r"], + [83471, 0, "d"], + [83472, 0, "e"], + [83473, 0, "r"], + [83474, 0, " "], + [83475, 0, "i"], + [83476, 0, "n"], + [83477, 0, " "], + [83478, 0, "w"], + [83479, 0, "h"], + [83480, 0, "i"], + [83481, 0, "c"], + [83482, 0, "h"], + [83483, 0, " "], + [83484, 0, "$"], + [83485, 0, "o"], + [83486, 0, "_"], + [83487, 0, "r"], + [83488, 0, "$"], + [83489, 0, " "], + [83490, 0, "a"], + [83491, 0, "n"], + [83492, 0, "d"], + [83493, 0, " "], + [83494, 0, "$"], + [83495, 0, "o"], + [83496, 0, "_"], + [83497, 0, "s"], + [83498, 0, "$"], + [83499, 0, " "], + [83500, 0, "a"], + [83501, 0, "r"], + [83502, 0, "e"], + [83503, 0, " "], + [83504, 0, "a"], + [83505, 0, "p"], + [83506, 0, "p"], + [83507, 0, "l"], + [83508, 0, "i"], + [83509, 0, "e"], + [83510, 0, "d"], + [83511, 0, "."], + [83512, 0, "\n"], + [83512, 0, "\n"], + [83513, 0, "\n"], + [83514, 0, "E"], + [83515, 0, "i"], + [83516, 0, "t"], + [83517, 0, "h"], + [83518, 0, "e"], + [83519, 0, "r"], + [83520, 0, " "], + [83521, 0, "$"], + [83522, 0, "o"], + [83523, 0, "_"], + [83524, 0, "r"], + [83525, 0, "$"], + [83526, 0, " "], + [83527, 0, "a"], + [83528, 0, "n"], + [83529, 0, "d"], + [83530, 0, " "], + [83531, 0, "$"], + [83532, 0, "o"], + [83533, 0, "_"], + [83534, 0, "s"], + [83535, 0, "$"], + [83536, 0, " "], + [83537, 0, "a"], + [83538, 0, "h"], + [83539, 0, "v"], + [83540, 0, "e"], + [83541, 0, " "], + [83541, 1], + [83540, 1], + [83539, 1], + [83538, 1], + [83537, 1], + [83537, 0, "h"], + [83538, 0, "a"], + [83539, 0, "v"], + [83540, 0, "e"], + [83541, 0, " "], + [83542, 0, "t"], + [83543, 0, "h"], + [83544, 0, "e"], + [83545, 0, " "], + [83546, 0, "s"], + [83547, 0, "a"], + [83548, 0, "m"], + [83549, 0, "e"], + [83550, 0, " "], + [83551, 0, "i"], + [83552, 0, "n"], + [83553, 0, "s"], + [83554, 0, "e"], + [83555, 0, "r"], + [83556, 0, "t"], + [83557, 0, "i"], + [83558, 0, "o"], + [83559, 0, "n"], + [83560, 0, " "], + [83561, 0, "i"], + [83562, 0, "n"], + [83563, 0, "t"], + [83564, 0, "e"], + [83565, 0, "r"], + [83566, 0, "v"], + [83567, 0, "a"], + [83568, 0, "l"], + [83569, 0, " "], + [83570, 0, "a"], + [83571, 0, "s"], + [83572, 0, " "], + [83573, 0, "d"], + [83573, 1], + [83573, 0, "d"], + [83574, 0, "e"], + [83575, 0, "f"], + [83576, 0, "i"], + [83577, 0, "n"], + [83578, 0, "e"], + [83579, 0, "d"], + [83580, 0, " "], + [83581, 0, "i"], + [83582, 0, "n"], + [83583, 0, " "], + [83584, 0, "D"], + [83585, 0, "e"], + [83586, 0, "f"], + [83587, 0, "i"], + [83588, 0, "n"], + [83589, 0, "i"], + [83590, 0, "t"], + [83591, 0, "i"], + [83592, 0, "o"], + [83593, 0, "n"], + [83594, 0, "~"], + [83595, 0, "\\"], + [83596, 0, "r"], + [83597, 0, "e"], + [83598, 0, "f"], + [83599, 0, "{"], + [83600, 0, "d"], + [83601, 0, "e"], + [83602, 0, "f"], + [83603, 0, ":"], + [83604, 0, "i"], + [83605, 0, "n"], + [83606, 0, "s"], + [83607, 0, "e"], + [83608, 0, "r"], + [83609, 0, "t"], + [83610, 0, "-"], + [83611, 0, "i"], + [83612, 0, "n"], + [83613, 0, "t"], + [83614, 0, "e"], + [83615, 0, "r"], + [83616, 0, "v"], + [83617, 0, "a"], + [83618, 0, "l"], + [83619, 0, "}"], + [83620, 0, ","], + [83621, 0, " "], + [83622, 0, "o"], + [83623, 0, "r"], + [83624, 0, " "], + [83625, 0, "t"], + [83626, 0, "h"], + [83627, 0, "e"], + [83628, 0, "y"], + [83629, 0, " "], + [83630, 0, "h"], + [83631, 0, "a"], + [83632, 0, "v"], + [83633, 0, "e"], + [83634, 0, " "], + [83635, 0, "d"], + [83636, 0, "i"], + [83637, 0, "f"], + [83638, 0, "f"], + [83639, 0, "e"], + [83640, 0, "r"], + [83641, 0, "e"], + [83642, 0, "n"], + [83643, 0, "t"], + [83644, 0, " "], + [83645, 0, "i"], + [83646, 0, "n"], + [83647, 0, "s"], + [83648, 0, "e"], + [83649, 0, "r"], + [83650, 0, "t"], + [83651, 0, "i"], + [83652, 0, "o"], + [83653, 0, "n"], + [83654, 0, " "], + [83655, 0, "i"], + [83656, 0, "n"], + [83657, 0, "t"], + [83658, 0, "e"], + [83659, 0, "r"], + [83660, 0, "v"], + [83661, 0, "a"], + [83662, 0, "l"], + [83663, 0, "s"], + [83664, 0, "."], + [83665, 0, " "], + [83666, 0, "I"], + [83667, 0, "f"], + [83668, 0, " "], + [83669, 0, "t"], + [83670, 0, "h"], + [83671, 0, "e"], + [83672, 0, " "], + [83673, 0, "i"], + [83674, 0, "n"], + [83675, 0, "s"], + [83676, 0, "e"], + [83677, 0, "r"], + [83678, 0, "t"], + [83679, 0, "i"], + [83680, 0, "o"], + [83681, 0, "n"], + [83682, 0, " "], + [83683, 0, "i"], + [83684, 0, "n"], + [83685, 0, "t"], + [83686, 0, "e"], + [83687, 0, "r"], + [83688, 0, "v"], + [83689, 0, "a"], + [83690, 0, "l"], + [83691, 0, "s"], + [83692, 0, " "], + [83693, 0, "a"], + [83694, 0, "r"], + [83695, 0, "e"], + [83696, 0, " "], + [83697, 0, "d"], + [83698, 0, "i"], + [83699, 0, "f"], + [83700, 0, "f"], + [83701, 0, "e"], + [83702, 0, "r"], + [83703, 0, "e"], + [83704, 0, "n"], + [83705, 0, "t"], + [83706, 0, ","], + [83707, 0, " "], + [83708, 0, "t"], + [83709, 0, "h"], + [83710, 0, "e"], + [83711, 0, "n"], + [83712, 0, " "], + [83713, 0, "b"], + [83714, 0, "y"], + [83715, 0, " "], + [83716, 0, "L"], + [83717, 0, "e"], + [83718, 0, "m"], + [83719, 0, "m"], + [83720, 0, "a"], + [83721, 0, "~"], + [83722, 0, "\\"], + [83723, 0, "r"], + [83724, 0, "e"], + [83725, 0, "f"], + [83726, 0, "{"], + [83727, 0, "l"], + [83728, 0, "e"], + [83729, 0, "m"], + [83730, 0, ":"], + [83731, 0, "i"], + [83732, 0, "n"], + [83733, 0, "s"], + [83734, 0, "e"], + [83735, 0, "r"], + [83736, 0, "t"], + [83737, 0, "-"], + [83738, 0, "b"], + [83739, 0, "e"], + [83740, 0, "t"], + [83741, 0, "w"], + [83742, 0, "e"], + [83743, 0, "e"], + [83744, 0, "n"], + [83745, 0, "}"], + [83746, 0, " "], + [83747, 0, "t"], + [83748, 0, "h"], + [83749, 0, "e"], + [83750, 0, " "], + [83751, 0, "o"], + [83752, 0, "p"], + [83753, 0, "e"], + [83754, 0, "r"], + [83755, 0, "a"], + [83756, 0, "t"], + [83757, 0, "i"], + [83758, 0, "o"], + [83759, 0, "n"], + [83760, 0, "s"], + [83761, 0, " "], + [83762, 0, "c"], + [83763, 0, "a"], + [83764, 0, "n"], + [83765, 0, "n"], + [83766, 0, "o"], + [83767, 0, "t"], + [83768, 0, " "], + [83769, 0, "a"], + [83770, 0, "f"], + [83771, 0, "f"], + [83772, 0, "e"], + [83773, 0, "c"], + [83774, 0, "t"], + [83775, 0, " "], + [83776, 0, "e"], + [83777, 0, "a"], + [83778, 0, "c"], + [83779, 0, "h"], + [83780, 0, " "], + [83781, 0, "o"], + [83782, 0, "t"], + [83783, 0, "h"], + [83784, 0, "e"], + [83785, 0, "r"], + [83786, 0, ","], + [83787, 0, " "], + [83788, 0, "a"], + [83789, 0, "n"], + [83790, 0, "d"], + [83791, 0, " "], + [83792, 0, "s"], + [83793, 0, "o"], + [83794, 0, " "], + [83795, 0, "t"], + [83796, 0, "h"], + [83797, 0, "e"], + [83798, 0, "y"], + [83799, 0, " "], + [83800, 0, "h"], + [83801, 0, "a"], + [83802, 0, "v"], + [83803, 0, "e"], + [83804, 0, " "], + [83805, 0, "t"], + [83806, 0, "h"], + [83807, 0, "e"], + [83808, 0, " "], + [83809, 0, "s"], + [83810, 0, "a"], + [83811, 0, "m"], + [83812, 0, "e"], + [83813, 0, " "], + [83814, 0, "e"], + [83815, 0, "f"], + [83816, 0, "f"], + [83817, 0, "e"], + [83818, 0, "c"], + [83819, 0, "t"], + [83820, 0, " "], + [83821, 0, "r"], + [83822, 0, "e"], + [83823, 0, "g"], + [83824, 0, "a"], + [83825, 0, "r"], + [83826, 0, "d"], + [83827, 0, "l"], + [83828, 0, "e"], + [83829, 0, "s"], + [83830, 0, "s"], + [83831, 0, " "], + [83832, 0, "o"], + [83833, 0, "f"], + [83834, 0, " "], + [83835, 0, "t"], + [83836, 0, "h"], + [83837, 0, "e"], + [83838, 0, "i"], + [83839, 0, "r"], + [83840, 0, " "], + [83841, 0, "o"], + [83842, 0, "r"], + [83843, 0, "d"], + [83844, 0, "e"], + [83845, 0, "r"], + [83846, 0, "."], + [83847, 0, " "], + [83848, 0, "F"], + [83849, 0, "o"], + [83850, 0, "r"], + [83851, 0, " "], + [83852, 0, "t"], + [83853, 0, "h"], + [83854, 0, "e"], + [83855, 0, " "], + [83856, 0, "r"], + [83857, 0, "e"], + [83858, 0, "s"], + [83859, 0, "t"], + [83859, 1], + [83858, 1], + [83857, 1], + [83856, 1], + [83855, 1], + [83854, 1], + [83853, 1], + [83852, 1], + [83851, 1], + [83850, 1], + [83849, 1], + [83848, 1], + [83848, 0, "A"], + [83848, 1], + [83848, 0, "S"], + [83849, 0, "o"], + [83850, 0, " "], + [83851, 0, "w"], + [83852, 0, "e"], + [83853, 0, " "], + [83854, 0, "n"], + [83855, 0, "e"], + [83856, 0, "e"], + [83857, 0, "d"], + [83858, 0, " "], + [83859, 0, "t"], + [83860, 0, "o"], + [83861, 0, " "], + [83862, 0, "o"], + [83863, 0, "n"], + [83864, 0, "l"], + [83865, 0, "y"], + [83866, 0, " "], + [83867, 0, "a"], + [83868, 0, "n"], + [83869, 0, "a"], + [83870, 0, "l"], + [83871, 0, "y"], + [83872, 0, "z"], + [83873, 0, "e"], + [83874, 0, " "], + [83875, 0, "t"], + [83876, 0, "h"], + [83877, 0, "e"], + [83878, 0, " "], + [83879, 0, "c"], + [83880, 0, "a"], + [83881, 0, "s"], + [83882, 0, "e"], + [83883, 0, " "], + [83884, 0, "i"], + [83885, 0, "n"], + [83886, 0, " "], + [83887, 0, "w"], + [83888, 0, "h"], + [83889, 0, "i"], + [83890, 0, "c"], + [83891, 0, "h"], + [83892, 0, " "], + [83893, 0, "t"], + [83894, 0, "h"], + [83895, 0, "e"], + [83896, 0, "y"], + [83897, 0, " "], + [83898, 0, "h"], + [83899, 0, "a"], + [83900, 0, "v"], + [83901, 0, "e"], + [83902, 0, " "], + [83903, 0, "t"], + [83904, 0, "h"], + [83905, 0, "e"], + [83906, 0, " "], + [83907, 0, "s"], + [83908, 0, "a"], + [83909, 0, "m"], + [83910, 0, "e"], + [83911, 0, " "], + [83912, 0, "i"], + [83913, 0, "n"], + [83914, 0, "s"], + [83915, 0, "e"], + [83916, 0, "r"], + [83917, 0, "t"], + [83918, 0, "i"], + [83919, 0, "o"], + [83920, 0, "n"], + [83921, 0, " "], + [83922, 0, "i"], + [83923, 0, "n"], + [83924, 0, "t"], + [83925, 0, "e"], + [83926, 0, "r"], + [83927, 0, "v"], + [83928, 0, "a"], + [83929, 0, "l"], + [83930, 0, " "], + [83931, 0, "$"], + [83932, 0, "("], + [83933, 0, "k"], + [83934, 0, "^"], + [83935, 0, "\\"], + [83936, 0, "m"], + [83937, 0, "a"], + [83938, 0, "t"], + [83939, 0, "h"], + [83940, 0, "r"], + [83941, 0, "m"], + [83942, 0, "{"], + [83943, 0, "b"], + [83944, 0, "e"], + [83945, 0, "f"], + [83946, 0, "o"], + [83947, 0, "r"], + [83948, 0, "e"], + [83949, 0, "}"], + [83950, 0, ","], + [83951, 0, " "], + [83952, 0, "k"], + [83953, 0, "&"], + [83954, 0, "^"], + [83954, 1], + [83953, 1], + [83953, 0, "^"], + [83954, 0, "\\"], + [83955, 0, "m"], + [83956, 0, "a"], + [83957, 0, "t"], + [83958, 0, "h"], + [83959, 0, "r"], + [83960, 0, "m"], + [83961, 0, "{"], + [83962, 0, "a"], + [83963, 0, "f"], + [83964, 0, "t"], + [83965, 0, "e"], + [83966, 0, "r"], + [83967, 0, "}"], + [83968, 0, ")"], + [83969, 0, "$"], + [83970, 0, "."], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [83973, 1], + [84461, 1], + [84460, 1], + [84459, 1], + [84458, 1], + [84457, 1], + [84456, 1], + [84455, 1], + [84454, 1], + [84453, 1], + [84452, 1], + [84451, 1], + [84450, 1], + [84449, 1], + [84448, 1], + [84447, 1], + [84446, 1], + [84445, 1], + [84444, 1], + [84443, 1], + [84442, 1], + [84441, 1], + [84440, 1], + [84439, 1], + [84438, 1], + [84437, 1], + [84436, 1], + [84435, 1], + [84434, 1], + [84433, 1], + [84432, 1], + [84431, 1], + [84430, 1], + [84429, 1], + [84428, 1], + [84427, 1], + [84426, 1], + [84425, 1], + [84424, 1], + [84423, 1], + [84422, 1], + [84421, 1], + [84420, 1], + [84419, 1], + [84418, 1], + [84417, 1], + [84416, 1], + [84415, 1], + [84414, 1], + [84413, 1], + [84412, 1], + [84411, 1], + [84410, 1], + [84409, 1], + [84408, 1], + [84407, 1], + [84406, 1], + [84405, 1], + [84404, 1], + [84403, 1], + [84402, 1], + [84401, 1], + [84400, 1], + [84399, 1], + [84398, 1], + [84397, 1], + [84396, 1], + [84395, 1], + [84394, 1], + [84393, 1], + [84392, 1], + [84391, 1], + [84390, 1], + [84389, 1], + [84388, 1], + [84387, 1], + [84386, 1], + [84385, 1], + [84384, 1], + [84383, 1], + [84382, 1], + [84381, 1], + [84380, 1], + [84379, 1], + [84378, 1], + [84377, 1], + [84376, 1], + [84375, 1], + [84374, 1], + [84373, 1], + [84372, 1], + [84371, 1], + [84370, 1], + [84369, 1], + [84368, 1], + [84367, 1], + [84366, 1], + [84365, 1], + [84364, 1], + [84363, 1], + [84362, 1], + [84361, 1], + [84360, 1], + [84359, 1], + [84358, 1], + [84357, 1], + [84356, 1], + [84355, 1], + [84354, 1], + [84353, 1], + [84352, 1], + [84351, 1], + [84350, 1], + [84349, 1], + [84348, 1], + [84347, 1], + [84346, 1], + [84345, 1], + [84344, 1], + [84343, 1], + [84342, 1], + [84341, 1], + [84340, 1], + [84339, 1], + [84338, 1], + [84337, 1], + [84336, 1], + [84335, 1], + [84334, 1], + [84333, 1], + [84332, 1], + [84331, 1], + [84330, 1], + [84329, 1], + [84328, 1], + [84327, 1], + [84326, 1], + [84325, 1], + [84324, 1], + [84323, 1], + [84322, 1], + [84321, 1], + [84320, 1], + [84319, 1], + [84318, 1], + [84317, 1], + [84316, 1], + [84315, 1], + [84314, 1], + [84313, 1], + [84312, 1], + [84311, 1], + [84310, 1], + [84309, 1], + [84308, 1], + [84307, 1], + [84306, 1], + [84305, 1], + [84304, 1], + [84303, 1], + [84302, 1], + [84301, 1], + [84300, 1], + [84299, 1], + [84298, 1], + [84297, 1], + [84296, 1], + [84295, 1], + [84294, 1], + [84293, 1], + [84292, 1], + [84291, 1], + [84290, 1], + [84289, 1], + [84288, 1], + [84287, 1], + [84286, 1], + [84285, 1], + [84284, 1], + [84283, 1], + [84282, 1], + [84281, 1], + [84280, 1], + [84279, 1], + [84278, 1], + [84277, 1], + [84276, 1], + [84275, 1], + [84274, 1], + [84273, 1], + [84272, 1], + [84271, 1], + [84270, 1], + [84269, 1], + [84268, 1], + [84267, 1], + [84266, 1], + [84265, 1], + [84264, 1], + [84263, 1], + [84262, 1], + [84261, 1], + [84260, 1], + [84259, 1], + [84258, 1], + [84257, 1], + [84256, 1], + [84255, 1], + [84254, 1], + [84253, 1], + [84252, 1], + [84251, 1], + [84250, 1], + [84249, 1], + [84248, 1], + [84247, 1], + [84246, 1], + [84245, 1], + [84244, 1], + [84243, 1], + [84242, 1], + [84241, 1], + [84240, 1], + [84239, 1], + [84238, 1], + [84237, 1], + [84236, 1], + [84235, 1], + [84234, 1], + [84233, 1], + [84232, 1], + [84231, 1], + [84230, 1], + [84229, 1], + [84228, 1], + [84227, 1], + [84226, 1], + [84225, 1], + [84224, 1], + [84223, 1], + [84222, 1], + [84221, 1], + [84220, 1], + [84219, 1], + [84218, 1], + [84217, 1], + [84216, 1], + [84215, 1], + [84214, 1], + [84213, 1], + [84212, 1], + [84211, 1], + [84210, 1], + [84209, 1], + [84208, 1], + [84207, 1], + [84206, 1], + [84205, 1], + [84204, 1], + [84203, 1], + [84202, 1], + [84201, 1], + [84200, 1], + [84199, 1], + [84198, 1], + [84197, 1], + [84196, 1], + [84195, 1], + [84194, 1], + [84193, 1], + [84192, 1], + [84191, 1], + [84190, 1], + [84189, 1], + [84188, 1], + [84187, 1], + [84186, 1], + [84185, 1], + [84184, 1], + [84183, 1], + [84182, 1], + [84181, 1], + [84180, 1], + [84179, 1], + [84178, 1], + [84177, 1], + [84176, 1], + [84175, 1], + [84174, 1], + [84173, 1], + [84172, 1], + [84171, 1], + [84170, 1], + [84169, 1], + [84168, 1], + [84167, 1], + [84166, 1], + [84165, 1], + [84164, 1], + [84163, 1], + [84162, 1], + [84161, 1], + [84160, 1], + [84159, 1], + [84158, 1], + [84157, 1], + [84156, 1], + [84155, 1], + [84154, 1], + [84153, 1], + [84152, 1], + [84151, 1], + [84150, 1], + [84149, 1], + [84148, 1], + [84147, 1], + [84146, 1], + [84145, 1], + [84144, 1], + [84143, 1], + [84142, 1], + [84141, 1], + [84140, 1], + [84139, 1], + [84138, 1], + [84137, 1], + [84136, 1], + [84135, 1], + [84134, 1], + [84133, 1], + [84132, 1], + [84131, 1], + [84130, 1], + [84129, 1], + [84128, 1], + [84127, 1], + [84126, 1], + [84125, 1], + [84124, 1], + [84123, 1], + [84122, 1], + [84121, 1], + [84120, 1], + [84119, 1], + [84118, 1], + [84117, 1], + [84116, 1], + [84115, 1], + [84114, 1], + [84113, 1], + [84112, 1], + [84111, 1], + [84110, 1], + [84109, 1], + [84108, 1], + [84107, 1], + [84106, 1], + [84105, 1], + [84104, 1], + [84103, 1], + [84102, 1], + [84101, 1], + [84100, 1], + [84099, 1], + [84098, 1], + [84097, 1], + [84096, 1], + [84095, 1], + [84094, 1], + [84093, 1], + [84092, 1], + [84091, 1], + [84090, 1], + [84089, 1], + [84088, 1], + [84087, 1], + [84086, 1], + [84085, 1], + [84084, 1], + [84083, 1], + [84082, 1], + [84081, 1], + [84080, 1], + [84079, 1], + [84078, 1], + [84077, 1], + [84076, 1], + [84075, 1], + [84074, 1], + [84073, 1], + [84072, 1], + [84071, 1], + [84070, 1], + [84069, 1], + [84068, 1], + [84067, 1], + [84066, 1], + [84065, 1], + [84064, 1], + [84063, 1], + [84062, 1], + [84061, 1], + [84060, 1], + [84059, 1], + [84058, 1], + [84057, 1], + [84056, 1], + [84055, 1], + [84054, 1], + [84053, 1], + [84052, 1], + [84051, 1], + [84050, 1], + [84049, 1], + [84048, 1], + [84047, 1], + [84046, 1], + [84045, 1], + [84044, 1], + [84043, 1], + [84042, 1], + [84041, 1], + [84040, 1], + [84039, 1], + [84038, 1], + [84037, 1], + [84036, 1], + [84035, 1], + [84034, 1], + [84033, 1], + [84032, 1], + [84031, 1], + [84030, 1], + [84029, 1], + [84028, 1], + [84027, 1], + [84026, 1], + [84025, 1], + [84024, 1], + [84023, 1], + [84022, 1], + [84021, 1], + [84020, 1], + [84019, 1], + [84018, 1], + [84017, 1], + [84016, 1], + [84015, 1], + [84014, 1], + [84013, 1], + [84012, 1], + [84011, 1], + [84010, 1], + [84009, 1], + [84008, 1], + [84007, 1], + [84006, 1], + [84005, 1], + [84004, 1], + [84003, 1], + [84002, 1], + [84001, 1], + [84000, 1], + [83999, 1], + [83998, 1], + [83997, 1], + [83996, 1], + [83995, 1], + [83994, 1], + [83993, 1], + [83992, 1], + [83991, 1], + [83990, 1], + [83989, 1], + [83988, 1], + [83987, 1], + [83986, 1], + [83985, 1], + [83984, 1], + [83983, 1], + [83982, 1], + [83981, 1], + [83980, 1], + [83979, 1], + [83978, 1], + [83977, 1], + [83976, 1], + [83975, 1], + [83974, 1], + [83973, 1], + [83973, 0, "W"], + [83974, 0, "e"], + [83975, 0, " "], + [83976, 0, "d"], + [83977, 0, "i"], + [83978, 0, "s"], + [83979, 0, "t"], + [83980, 0, "i"], + [83981, 0, "n"], + [83982, 0, "g"], + [83983, 0, "u"], + [83984, 0, "i"], + [83985, 0, "s"], + [83986, 0, "h"], + [83987, 0, " "], + [83988, 0, "f"], + [83989, 0, "o"], + [83990, 0, "u"], + [83991, 0, "r"], + [83992, 0, " "], + [83993, 0, "c"], + [83994, 0, "a"], + [83995, 0, "s"], + [83996, 0, "e"], + [83997, 0, "s"], + [83998, 0, ","], + [83999, 0, " "], + [84000, 0, "b"], + [84001, 0, "a"], + [84002, 0, "s"], + [84003, 0, "e"], + [84004, 0, "d"], + [84005, 0, " "], + [84006, 0, "o"], + [84007, 0, "n"], + [84008, 0, " "], + [84009, 0, "w"], + [84010, 0, "h"], + [84011, 0, "i"], + [84012, 0, "c"], + [84013, 0, "h"], + [84014, 0, " "], + [84015, 0, "o"], + [84016, 0, "f"], + [84017, 0, " "], + [84018, 0, "t"], + [84018, 1], + [84018, 0, "#"], + [84018, 1], + [84018, 0, "$"], + [84019, 0, "o"], + [84020, 0, "_"], + [84021, 0, "r"], + [84022, 0, "$"], + [84023, 0, " "], + [84024, 0, "a"], + [84025, 0, "n"], + [84026, 0, "d"], + [84027, 0, " "], + [84028, 0, "$"], + [84029, 0, "o"], + [84030, 0, "_"], + [84031, 0, "s"], + [84032, 0, "$"], + [84033, 0, " "], + [84034, 0, "h"], + [84035, 0, "a"], + [84036, 0, "s"], + [84037, 0, " "], + [84038, 0, "t"], + [84039, 0, "h"], + [84040, 0, "e"], + [84041, 0, " "], + [84042, 0, "g"], + [84043, 0, "r"], + [84044, 0, "e"], + [84045, 0, "a"], + [84046, 0, "t"], + [84047, 0, "e"], + [84048, 0, "r"], + [84049, 0, " "], + [84050, 0, "o"], + [84051, 0, "p"], + [84052, 0, "e"], + [84053, 0, "r"], + [84054, 0, "a"], + [84055, 0, "t"], + [84056, 0, "i"], + [84057, 0, "o"], + [84058, 0, "n"], + [84059, 0, " "], + [84060, 0, "I"], + [84061, 0, "D"], + [84062, 0, " "], + [84063, 0, "("], + [84064, 0, "l"], + [84065, 0, "a"], + [84066, 0, "m"], + [84067, 0, "p"], + [84068, 0, "o"], + [84068, 1], + [84067, 1], + [84066, 1], + [84065, 1], + [84064, 1], + [84064, 0, "L"], + [84065, 0, "a"], + [84066, 0, "m"], + [84067, 0, "p"], + [84068, 0, "o"], + [84069, 0, "r"], + [84070, 0, "t"], + [84071, 0, " "], + [84072, 0, "t"], + [84073, 0, "i"], + [84074, 0, "m"], + [84075, 0, "e"], + [84076, 0, "s"], + [84077, 0, "t"], + [84078, 0, "a"], + [84079, 0, "m"], + [84080, 0, "p"], + [84081, 0, ")"], + [84082, 0, ","], + [84083, 0, " "], + [84084, 0, "a"], + [84085, 0, "n"], + [84086, 0, "d"], + [84087, 0, " "], + [84088, 0, "w"], + [84089, 0, "h"], + [84090, 0, "i"], + [84091, 0, "c"], + [84092, 0, "h"], + [84093, 0, " "], + [84094, 0, "o"], + [84095, 0, "n"], + [84096, 0, "e"], + [84097, 0, " "], + [84098, 0, "f"], + [84099, 0, "o"], + [84100, 0, " "], + [84101, 0, "t"], + [84102, 0, "h"], + [84103, 0, "e"], + [84104, 0, " "], + [84104, 1], + [84103, 1], + [84102, 1], + [84101, 1], + [84100, 1], + [84099, 1], + [84098, 1], + [84098, 0, "o"], + [84099, 0, "f"], + [84100, 0, " "], + [84101, 0, "t"], + [84102, 0, "h"], + [84103, 0, "e"], + [84104, 0, " "], + [84105, 0, "t"], + [84106, 0, "w"], + [84107, 0, "o"], + [84108, 0, " "], + [84109, 0, "o"], + [84110, 0, "p"], + [84111, 0, "e"], + [84112, 0, "r"], + [84113, 0, "a"], + [84114, 0, "t"], + [84115, 0, "i"], + [84116, 0, "o"], + [84117, 0, "n"], + [84118, 0, "s"], + [84119, 0, " "], + [84120, 0, "i"], + [84121, 0, "s"], + [84122, 0, " "], + [84123, 0, "a"], + [84124, 0, "p"], + [84125, 0, "p"], + [84126, 0, "l"], + [84127, 0, "i"], + [84128, 0, "e"], + [84129, 0, "d"], + [84130, 0, " "], + [84131, 0, "f"], + [84132, 0, "i"], + [84133, 0, "r"], + [84134, 0, "s"], + [84135, 0, "t"], + [84136, 0, "."], + [84137, 0, " "], + [84138, 0, "W"], + [84139, 0, "e"], + [84140, 0, " "], + [84141, 0, "t"], + [84142, 0, "h"], + [84143, 0, "e"], + [84144, 0, "n"], + [84145, 0, " "], + [84146, 0, "s"], + [84147, 0, "h"], + [84148, 0, "o"], + [84149, 0, "w"], + [84150, 0, "s"], + [84151, 0, " "], + [84151, 1], + [84150, 1], + [84150, 0, " "], + [84151, 0, "t"], + [84152, 0, "h"], + [84153, 0, "a"], + [84154, 0, "t"], + [84155, 0, " "], + [84156, 0, "t"], + [84157, 0, "h"], + [84158, 0, "e"], + [84159, 0, " "], + [84160, 0, "f"], + [84161, 0, "i"], + [84162, 0, "n"], + [84163, 0, "a"], + [84164, 0, "l"], + [84165, 0, " "], + [84166, 0, "o"], + [84167, 0, "r"], + [84168, 0, "d"], + [84169, 0, "e"], + [84170, 0, "r"], + [84171, 0, " "], + [84172, 0, "o"], + [84173, 0, "f"], + [84174, 0, " "], + [84175, 0, "e"], + [84176, 0, "l"], + [84177, 0, "e"], + [84178, 0, "m"], + [84179, 0, "e"], + [84180, 0, "n"], + [84181, 0, "t"], + [84182, 0, "s"], + [84183, 0, " "], + [84184, 0, "i"], + [84185, 0, "n"], + [84186, 0, " "], + [84187, 0, "t"], + [84188, 0, "h"], + [84189, 0, "e"], + [84190, 0, " "], + [84191, 0, "l"], + [84192, 0, "i"], + [84193, 0, "s"], + [84194, 0, "t"], + [84195, 0, " "], + [84196, 0, "d"], + [84197, 0, "e"], + [84198, 0, "p"], + [84199, 0, "e"], + [84200, 0, "n"], + [84201, 0, "d"], + [84202, 0, "s"], + [84203, 0, " "], + [84204, 0, "o"], + [84205, 0, "n"], + [84206, 0, "l"], + [84207, 0, "y"], + [84208, 0, " "], + [84209, 0, "o"], + [84210, 0, "n"], + [84211, 0, " "], + [84212, 0, "t"], + [84213, 0, "h"], + [84214, 0, "e"], + [84215, 0, " "], + [84216, 0, "o"], + [84217, 0, "p"], + [84218, 0, "e"], + [84219, 0, "r"], + [84220, 0, "a"], + [84221, 0, "t"], + [84222, 0, "i"], + [84223, 0, "o"], + [84224, 0, "n"], + [84225, 0, " "], + [84226, 0, "I"], + [84227, 0, "D"], + [84228, 0, " "], + [84229, 0, "("], + [84230, 0, "w"], + [84231, 0, "h"], + [84232, 0, "i"], + [84233, 0, "c"], + [84234, 0, "h"], + [84235, 0, " "], + [84236, 0, "i"], + [84237, 0, "s"], + [84238, 0, " "], + [84239, 0, "t"], + [84240, 0, "h"], + [84241, 0, "e"], + [84242, 0, " "], + [84243, 0, "s"], + [84244, 0, "a"], + [84245, 0, "m"], + [84246, 0, "e"], + [84247, 0, " "], + [84248, 0, "o"], + [84249, 0, "n"], + [84250, 0, " "], + [84251, 0, "a"], + [84252, 0, "l"], + [84253, 0, "l"], + [84254, 0, "r"], + [84255, 0, " "], + [84255, 1], + [84254, 1], + [84254, 0, " "], + [84255, 0, "r"], + [84256, 0, "e"], + [84257, 0, "p"], + [84258, 0, "l"], + [84259, 0, "i"], + [84260, 0, "c"], + [84261, 0, "a"], + [84262, 0, "s"], + [84263, 0, ")"], + [84264, 0, ","], + [84265, 0, " "], + [84266, 0, "a"], + [84267, 0, "n"], + [84268, 0, "d"], + [84269, 0, " "], + [84270, 0, "n"], + [84271, 0, "o"], + [84272, 0, "t"], + [84273, 0, " "], + [84274, 0, "o"], + [84275, 0, "n"], + [84276, 0, " "], + [84277, 0, "t"], + [84278, 0, "h"], + [84279, 0, "e"], + [84280, 0, " "], + [84281, 0, "o"], + [84282, 0, "r"], + [84283, 0, "d"], + [84284, 0, "e"], + [84285, 0, "r"], + [84286, 0, " "], + [84287, 0, "i"], + [84288, 0, "n"], + [84289, 0, " "], + [84290, 0, "w"], + [84291, 0, "h"], + [84292, 0, "i"], + [84293, 0, "c"], + [84294, 0, "h"], + [84295, 0, " "], + [84296, 0, "t"], + [84297, 0, "h"], + [84298, 0, "e"], + [84299, 0, " "], + [84300, 0, "o"], + [84301, 0, "p"], + [84302, 0, "e"], + [84303, 0, "r"], + [84304, 0, "a"], + [84305, 0, "t"], + [84306, 0, "i"], + [84307, 0, "o"], + [84308, 0, "n"], + [84309, 0, "s"], + [84310, 0, " "], + [84311, 0, "a"], + [84312, 0, "r"], + [84313, 0, "e"], + [84314, 0, " "], + [84315, 0, "a"], + [84316, 0, "p"], + [84317, 0, "p"], + [84318, 0, "l"], + [84319, 0, "i"], + [84320, 0, "e"], + [84321, 0, "d"], + [84322, 0, "."], + [84323, 0, "\n"], + [84324, 0, "\n"], + [84325, 0, "\\"], + [84326, 0, "b"], + [84327, 0, "e"], + [84328, 0, "g"], + [84329, 0, "i"], + [84330, 0, "n"], + [84331, 0, "{"], + [84332, 0, "e"], + [84333, 0, "n"], + [84334, 0, "u"], + [84335, 0, "m"], + [84336, 0, "e"], + [84337, 0, "r"], + [84338, 0, "a"], + [84339, 0, "t"], + [84340, 0, "e"], + [84341, 0, "}"], + [84342, 0, "\n"], + [84343, 0, "\\"], + [84344, 0, "e"], + [84345, 0, "n"], + [84346, 0, "d"], + [84347, 0, "{"], + [84348, 0, "e"], + [84349, 0, "n"], + [84350, 0, "u"], + [84351, 0, "m"], + [84352, 0, "e"], + [84353, 0, "r"], + [84354, 0, "a"], + [84355, 0, "g"], + [84356, 0, "e"], + [84357, 0, "}"], + [84357, 1], + [84356, 1], + [84355, 1], + [84355, 0, "t"], + [84356, 0, "e"], + [84357, 0, "}"], + [84342, 0, "\n"], + [84343, 0, "\\"], + [84344, 0, "i"], + [84345, 0, "t"], + [84346, 0, "e"], + [84347, 0, "m"], + [84348, 0, " "], + [84349, 0, "x"], + [83395, 1], + [83971, 0, "\n"], + [83972, 0, "\n"], + [83972, 0, "W"], + [83973, 0, "i"], + [83974, 0, "t"], + [83975, 0, "h"], + [83976, 0, "o"], + [83977, 0, "u"], + [83978, 0, "t"], + [83979, 0, " "], + [83980, 0, "l"], + [83981, 0, "o"], + [83982, 0, "s"], + [83983, 0, "s"], + [83984, 0, " "], + [83985, 0, "o"], + [83986, 0, "f"], + [83987, 0, " "], + [83988, 0, "g"], + [83989, 0, "e"], + [83990, 0, "n"], + [83991, 0, "e"], + [83992, 0, "r"], + [83993, 0, "a"], + [83994, 0, "l"], + [83995, 0, "i"], + [83996, 0, "t"], + [83997, 0, "y"], + [83998, 0, ","], + [83999, 0, " "], + [84000, 0, "s"], + [84001, 0, "a"], + [84002, 0, "s"], + [84003, 0, "u"], + [84004, 0, "m"], + [84005, 0, "e"], + [84006, 0, " "], + [84007, 0, "t"], + [84008, 0, "h"], + [84000, 0, "a"], + [84002, 1], + [84009, 0, "a"], + [84010, 0, "t"], + [84011, 0, " "], + [84012, 0, "$"], + [84013, 0, "o"], + [84014, 0, "_"], + [84015, 0, "r"], + [84016, 0, "."], + [84017, 0, "\\"], + [84018, 0, "m"], + [84019, 0, "a"], + [84020, 0, "t"], + [84021, 0, "h"], + [84022, 0, "i"], + [84023, 0, "t"], + [84024, 0, "{"], + [84025, 0, "i"], + [84026, 0, "d"], + [84027, 0, "}"], + [84028, 0, " "], + [84029, 0, "<"], + [84030, 0, " "], + [84031, 0, "o"], + [84032, 0, "_"], + [84033, 0, "s"], + [84034, 0, "."], + [84035, 0, "\\"], + [84036, 0, "m"], + [84037, 0, "a"], + [84038, 0, "t"], + [84039, 0, "h"], + [84040, 0, "i"], + [84041, 0, "t"], + [84042, 0, "{"], + [84043, 0, "i"], + [84044, 0, "d"], + [84045, 0, "}"], + [84046, 0, "$"], + [84047, 0, " "], + [84048, 0, "a"], + [84049, 0, "c"], + [84050, 0, "c"], + [84051, 0, "o"], + [84052, 0, "r"], + [84053, 0, "d"], + [84054, 0, "i"], + [84055, 0, "n"], + [84056, 0, "g"], + [84057, 0, " "], + [84058, 0, "t"], + [84059, 0, "h"], + [84060, 0, "e"], + [84061, 0, " "], + [84061, 1], + [84060, 1], + [84059, 1], + [84059, 0, "o"], + [84060, 0, " "], + [84061, 0, "t"], + [84062, 0, "h"], + [84063, 0, "e"], + [84064, 0, " "], + [84065, 0, "o"], + [84066, 0, "r"], + [84067, 0, "d"], + [84068, 0, "e"], + [84069, 0, "r"], + [84070, 0, "i"], + [84071, 0, "n"], + [84072, 0, "g"], + [84073, 0, " "], + [84074, 0, "r"], + [84075, 0, "e"], + [84076, 0, "l"], + [84077, 0, "a"], + [84078, 0, "t"], + [84079, 0, "i"], + [84080, 0, "o"], + [84081, 0, "n"], + [84082, 0, " "], + [84083, 0, "o"], + [84084, 0, "n"], + [84085, 0, " "], + [84086, 0, "L"], + [84087, 0, "a"], + [84088, 0, "m"], + [84089, 0, "p"], + [84090, 0, "o"], + [84091, 0, "r"], + [84092, 0, "t"], + [84093, 0, " "], + [84094, 0, "t"], + [84095, 0, "i"], + [84096, 0, "m"], + [84097, 0, "e"], + [84098, 0, "s"], + [84099, 0, "t"], + [84100, 0, "a"], + [84101, 0, "m"], + [84102, 0, "p"], + [84103, 0, "s"], + [84104, 0, "."], + [84105, 0, " "], + [84106, 0, "("], + [84107, 0, "I"], + [84108, 0, "f"], + [84109, 0, " "], + [84110, 0, "t"], + [84111, 0, "h"], + [84112, 0, "e"], + [84113, 0, " "], + [84113, 1], + [84112, 1], + [84111, 1], + [84110, 1], + [84110, 0, "t"], + [84111, 0, "h"], + [84112, 0, "e"], + [84113, 0, " "], + [84114, 0, "o"], + [84115, 0, "p"], + [84116, 0, "e"], + [84117, 0, "r"], + [84118, 0, "a"], + [84119, 0, "t"], + [84120, 0, "i"], + [84121, 0, "o"], + [84122, 0, "n"], + [84123, 0, " "], + [84124, 0, "I"], + [84125, 0, "D"], + [84126, 0, " "], + [84127, 0, "o"], + [84128, 0, "f"], + [84129, 0, " "], + [84130, 0, "$"], + [84131, 0, "o"], + [84132, 0, "_"], + [84133, 0, "r"], + [84134, 0, "$"], + [84135, 0, " "], + [84136, 0, "w"], + [84137, 0, "e"], + [84138, 0, "r"], + [84139, 0, "e"], + [84140, 0, " "], + [84141, 0, "g"], + [84142, 0, "r"], + [84143, 0, "e"], + [84144, 0, "a"], + [84145, 0, "t"], + [84146, 0, "e"], + [84147, 0, "r"], + [84148, 0, ","], + [84149, 0, " "], + [84150, 0, "$"], + [84151, 0, "o"], + [84152, 0, "_"], + [84153, 0, "r"], + [84154, 0, "$"], + [84155, 0, " "], + [84156, 0, "a"], + [84157, 0, "n"], + [84158, 0, "d"], + [84159, 0, " "], + [84160, 0, "$"], + [84161, 0, "o"], + [84162, 0, "_"], + [84163, 0, "s"], + [84164, 0, "$"], + [84165, 0, " "], + [84166, 0, "c"], + [84167, 0, "o"], + [84168, 0, "u"], + [84169, 0, "l"], + [84170, 0, "d"], + [84171, 0, " "], + [84172, 0, "b"], + [84173, 0, "e"], + [84174, 0, " "], + [84175, 0, "s"], + [84176, 0, "w"], + [84177, 0, "a"], + [84178, 0, "p"], + [84179, 0, "p"], + [84180, 0, "e"], + [84181, 0, "d"], + [84182, 0, " "], + [84183, 0, "i"], + [84184, 0, "n"], + [84185, 0, " "], + [84186, 0, "t"], + [84187, 0, "h"], + [84188, 0, "i"], + [84189, 0, "s"], + [84190, 0, " "], + [84191, 0, "p"], + [84192, 0, "o"], + [84193, 0, "r"], + [84193, 1], + [84192, 1], + [84192, 0, "r"], + [84193, 0, "o"], + [84194, 0, "o"], + [84195, 0, "f"], + [84196, 0, "."], + [84197, 0, ")"], + [84198, 0, " "], + [84199, 0, "W"], + [84200, 0, "e"], + [84201, 0, " "], + [84202, 0, "n"], + [84203, 0, "o"], + [84204, 0, "w"], + [84205, 0, " "], + [84206, 0, "d"], + [84207, 0, "i"], + [84208, 0, "s"], + [84209, 0, "t"], + [84210, 0, "i"], + [84211, 0, "n"], + [84212, 0, "g"], + [84213, 0, "u"], + [84214, 0, "i"], + [84215, 0, "s"], + [84216, 0, "h"], + [84217, 0, " "], + [84218, 0, "t"], + [84219, 0, "w"], + [84220, 0, "o"], + [84221, 0, " "], + [84222, 0, "c"], + [84223, 0, "a"], + [84224, 0, "s"], + [84225, 0, "e"], + [84226, 0, "s"], + [84227, 0, ":"], + [84606, 1], + [84606, 0, "$"], + [84607, 0, "o"], + [84608, 0, "_"], + [84609, 0, "r"], + [84610, 0, "$"], + [84611, 0, " "], + [84612, 0, "i"], + [84613, 0, "s"], + [84614, 0, " "], + [84615, 0, "a"], + [84616, 0, "p"], + [84617, 0, "p"], + [84618, 0, "l"], + [84619, 0, "i"], + [84620, 0, "e"], + [84621, 0, "d"], + [84622, 0, " "], + [84623, 0, "b"], + [84624, 0, "e"], + [84625, 0, "f"], + [84626, 0, "o"], + [84627, 0, "r"], + [84628, 0, "e"], + [84629, 0, " "], + [84630, 0, "$"], + [84631, 0, "o"], + [84632, 0, "_"], + [84633, 0, "s"], + [84634, 0, "$"], + [84635, 0, " "], + [84636, 0, "i"], + [84637, 0, "n"], + [84638, 0, " "], + [84639, 0, "$"], + [84640, 0, "H"], + [84641, 0, "$"], + [84642, 0, "."], + [84643, 0, "\n"], + [84644, 0, "\\"], + [84645, 0, "i"], + [84646, 0, "t"], + [84647, 0, "e"], + [84648, 0, "m"], + [84649, 0, " "], + [84650, 0, "$"], + [84651, 0, "o"], + [84652, 0, "_"], + [84653, 0, "s"], + [84654, 0, "$"], + [84655, 0, " "], + [84656, 0, "i"], + [84657, 0, "s"], + [84658, 0, " "], + [84659, 0, "a"], + [84660, 0, "p"], + [84661, 0, "p"], + [84662, 0, "l"], + [84663, 0, "i"], + [84664, 0, "e"], + [84665, 0, "d"], + [84666, 0, " "], + [84667, 0, "b"], + [84668, 0, "e"], + [84669, 0, "f"], + [84670, 0, "o"], + [84671, 0, "r"], + [84672, 0, "e"], + [84673, 0, " "], + [84674, 0, "$"], + [84675, 0, "o"], + [84676, 0, "_"], + [84677, 0, "r"], + [84678, 0, "$"], + [84679, 0, " "], + [84680, 0, "i"], + [84681, 0, "n"], + [84682, 0, " "], + [84683, 0, "$"], + [84684, 0, "H"], + [84685, 0, "$"], + [84686, 0, "."], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84230, 1], + [84140, 0, "="], + [84140, 1], + [84139, 1], + [84138, 1], + [84137, 1], + [84136, 1], + [84136, 0, "i"], + [84137, 0, "s"], + [84168, 1], + [84167, 1], + [84166, 1], + [84165, 1], + [84165, 0, "a"], + [84166, 0, "n"], + [83860, 1], + [83859, 1], + [83858, 1], + [84143, 0, " "], + [84144, 0, "t"], + [84145, 0, "h"], + [84146, 0, "a"], + [84147, 0, "t"], + [84148, 0, "n"], + [84149, 0, " "], + [84150, 0, "$"], + [84150, 1], + [84149, 1], + [84148, 1], + [84147, 1], + [84147, 0, "n"], + [84148, 0, " "], + [84149, 0, "$"], + [84150, 0, "o"], + [84151, 0, "_"], + [84152, 0, "s"], + [84153, 0, "$"], + [84295, 0, " "], + [84296, 0, "T"], + [84297, 0, "h"], + [84298, 0, "u"], + [84299, 0, "s"], + [84300, 0, ","], + [84301, 0, " "], + [84302, 0, "w"], + [84303, 0, "h"], + [84304, 0, "e"], + [84305, 0, "n"], + [84306, 0, " "], + [84307, 0, "$"], + [84308, 0, "o"], + [84309, 0, "_"], + [84310, 0, "s"], + [84311, 0, "$"], + [84312, 0, " "], + [84313, 0, "i"], + [84314, 0, "s"], + [84315, 0, " "], + [84316, 0, "a"], + [84317, 0, "p"], + [84318, 0, "p"], + [84319, 0, "l"], + [84320, 0, "i"], + [84321, 0, "e"], + [84322, 0, "d"], + [84323, 0, ","], + [84324, 0, " "], + [84325, 0, "$"], + [84326, 0, "o"], + [84327, 0, "_"], + [84328, 0, "r"], + [84329, 0, "$"], + [84330, 0, " "], + [84331, 0, "a"], + [84332, 0, "n"], + [84333, 0, "d"], + [84334, 0, " "], + [84335, 0, "a"], + [84336, 0, "n"], + [84337, 0, "y"], + [84338, 0, " "], + [84339, 0, "c"], + [84340, 0, "a"], + [84341, 0, "u"], + [84342, 0, "s"], + [84343, 0, "a"], + [84344, 0, "p"], + [84345, 0, " "], + [84346, 0, "d"], + [84346, 1], + [84345, 1], + [84344, 1], + [84344, 0, "l"], + [84345, 0, " "], + [84346, 0, "d"], + [84347, 0, "e"], + [84348, 0, "p"], + [84349, 0, "e"], + [84350, 0, "n"], + [84351, 0, "d"], + [84352, 0, "e"], + [84353, 0, "n"], + [84354, 0, "c"], + [84355, 0, "i"], + [84356, 0, "e"], + [84357, 0, "s"], + [84358, 0, " "], + [84359, 0, "o"], + [84360, 0, "f"], + [84361, 0, " "], + [84361, 1], + [84360, 1], + [84359, 1], + [84358, 1], + [84357, 1], + [84356, 1], + [84355, 1], + [84354, 1], + [84353, 1], + [84352, 1], + [84351, 1], + [84350, 1], + [84349, 1], + [84348, 1], + [84347, 1], + [84346, 1], + [84345, 1], + [84339, 0, "i"], + [84340, 0, "n"], + [84341, 0, "s"], + [84342, 0, "e"], + [84343, 0, "r"], + [84344, 0, "t"], + [84345, 0, "i"], + [84346, 0, "o"], + [84347, 0, "n"], + [84348, 0, "s"], + [84349, 0, " "], + [84356, 0, "l"], + [84357, 0, "y"], + [84358, 0, " "], + [84359, 0, "p"], + [84360, 0, "r"], + [84361, 0, "i"], + [84362, 0, "o"], + [84363, 0, "r"], + [84364, 0, " "], + [84365, 0, "t"], + [84366, 0, "o"], + [84367, 0, " "], + [84368, 0, "$"], + [84369, 0, "o"], + [84370, 0, "_"], + [84371, 0, "r"], + [84372, 0, "$"], + [84373, 0, " "], + [84374, 0, "i"], + [84375, 0, "n"], + [84376, 0, " "], + [84377, 0, "t"], + [84378, 0, "h"], + [84379, 0, "e"], + [84380, 0, " "], + [84381, 0, "s"], + [84382, 0, "a"], + [84383, 0, "m"], + [84384, 0, "e"], + [84385, 0, " "], + [84386, 0, "i"], + [84387, 0, "n"], + [84388, 0, "s"], + [84389, 0, "e"], + [84390, 0, "r"], + [84391, 0, "t"], + [84392, 0, "i"], + [84393, 0, "o"], + [84394, 0, "n"], + [84395, 0, " "], + [84396, 0, "i"], + [84397, 0, "n"], + [84398, 0, "t"], + [84399, 0, "e"], + [84400, 0, "r"], + [84401, 0, "v"], + [84402, 0, "a"], + [84403, 0, "l"], + [84404, 0, " "], + [84405, 0, "h"], + [84406, 0, "a"], + [84407, 0, "v"], + [84408, 0, "e"], + [84409, 0, " "], + [84410, 0, "a"], + [84411, 0, "l"], + [84412, 0, "r"], + [84413, 0, "e"], + [84414, 0, "a"], + [84415, 0, "d"], + [84416, 0, "y"], + [84417, 0, " "], + [84418, 0, "b"], + [84419, 0, "e"], + [84420, 0, "e"], + [84421, 0, "n"], + [84422, 0, " "], + [84423, 0, "a"], + [84424, 0, "p"], + [84425, 0, "p"], + [84426, 0, "l"], + [84427, 0, "i"], + [84428, 0, "e"], + [84429, 0, "d"], + [84430, 0, "."], + [84475, 0, " "], + [84476, 0, "T"], + [84477, 0, "h"], + [84478, 0, "u"], + [84479, 0, "s"], + [84480, 0, ","], + [84481, 0, " "], + [84482, 0, "w"], + [84483, 0, "e"], + [84484, 0, "h"], + [84484, 1], + [84483, 1], + [84483, 0, "h"], + [84484, 0, "e"], + [84485, 0, "n"], + [84486, 0, " "], + [84487, 0, "$"], + [84488, 0, "o"], + [84488, 1], + [84488, 0, "o"], + [84489, 0, "_"], + [84490, 0, "r"], + [84491, 0, "$"], + [84492, 0, " "], + [84493, 0, "i"], + [84494, 0, "s"], + [84495, 0, " "], + [84496, 0, "a"], + [84497, 0, "p"], + [84498, 0, "p"], + [84499, 0, "l"], + [84500, 0, "i"], + [84501, 0, "e"], + [84502, 0, "d"], + [84503, 0, ","], + [84504, 0, " "], + [84505, 0, "$"], + [84506, 0, "o"], + [84507, 0, "_"], + [84508, 0, "s"], + [84509, 0, "$"], + [84510, 0, " "], + [84511, 0, "a"], + [84512, 0, "n"], + [84513, 0, "d"], + [84514, 0, " "], + [84515, 0, "a"], + [84516, 0, "n"], + [84517, 0, "y"], + [84518, 0, " "], + [84519, 0, "i"], + [84520, 0, "n"], + [84521, 0, "s"], + [84522, 0, "e"], + [84523, 0, "r"], + [84524, 0, "t"], + [84525, 0, "i"], + [84526, 0, "o"], + [84527, 0, "n"], + [84528, 0, "s"], + [84529, 0, " "], + [84530, 0, "c"], + [84531, 0, "a"], + [84532, 0, "u"], + [84533, 0, "s"], + [84534, 0, "a"], + [84535, 0, "l"], + [84536, 0, "l"], + [84537, 0, "y"], + [84538, 0, " "], + [84539, 0, "p"], + [84540, 0, "r"], + [84541, 0, "i"], + [84542, 0, "o"], + [84543, 0, "r"], + [84544, 0, " "], + [84545, 0, "t"], + [84546, 0, "o"], + [84547, 0, " "], + [84548, 0, "$"], + [84549, 0, "o"], + [84550, 0, "_"], + [84551, 0, "s"], + [84552, 0, "$"], + [84553, 0, " "], + [84554, 0, "i"], + [84555, 0, "n"], + [84556, 0, " "], + [84557, 0, "t"], + [84558, 0, "h"], + [84559, 0, "e"], + [84560, 0, " "], + [84561, 0, "s"], + [84562, 0, "a"], + [84563, 0, "m"], + [84564, 0, "e"], + [84565, 0, " "], + [84566, 0, "i"], + [84567, 0, "n"], + [84568, 0, "s"], + [84569, 0, "e"], + [84570, 0, "r"], + [84571, 0, "t"], + [84572, 0, "i"], + [84573, 0, "o"], + [84574, 0, "n"], + [84575, 0, " "], + [84576, 0, "i"], + [84577, 0, "n"], + [84578, 0, "t"], + [84579, 0, "e"], + [84580, 0, "r"], + [84581, 0, "v"], + [84582, 0, "a"], + [84583, 0, "l"], + [84584, 0, " "], + [84585, 0, "h"], + [84586, 0, "a"], + [84587, 0, "v"], + [84588, 0, "e"], + [84589, 0, " "], + [84590, 0, "a"], + [84591, 0, "l"], + [84592, 0, "r"], + [84593, 0, "a"], + [84593, 1], + [84593, 0, "e"], + [84594, 0, "a"], + [84595, 0, "d"], + [84596, 0, "y"], + [84597, 0, " "], + [84598, 0, "b"], + [84599, 0, "e"], + [84600, 0, "e"], + [84601, 0, "n"], + [84602, 0, " "], + [84603, 0, "a"], + [84604, 0, "p"], + [84605, 0, "p"], + [84606, 0, "l"], + [84607, 0, "i"], + [84608, 0, "e"], + [84609, 0, "d"], + [84610, 0, "."], + [84408, 1], + [84407, 1], + [84407, 0, "s"], + [84403, 1], + [84402, 1], + [84401, 1], + [84400, 1], + [84399, 1], + [84398, 1], + [84397, 1], + [84396, 1], + [84395, 1], + [84394, 1], + [84393, 1], + [84392, 1], + [84391, 1], + [84390, 1], + [84389, 1], + [84388, 1], + [84387, 1], + [84386, 1], + [84385, 1], + [84384, 1], + [84383, 1], + [84382, 1], + [84381, 1], + [84380, 1], + [84379, 1], + [84378, 1], + [84377, 1], + [84376, 1], + [84375, 1], + [84374, 1], + [84373, 1], + [84372, 1], + [84371, 1], + [84370, 1], + [84369, 1], + [84368, 1], + [84367, 1], + [84366, 1], + [84365, 1], + [84364, 1], + [84363, 1], + [84362, 1], + [84361, 1], + [84360, 1], + [84359, 1], + [84358, 1], + [84357, 1], + [84356, 1], + [84355, 1], + [84354, 1], + [84353, 1], + [84352, 1], + [84351, 1], + [84350, 1], + [84349, 1], + [84348, 1], + [84347, 1], + [84346, 1], + [84345, 1], + [84344, 1], + [84343, 1], + [84342, 1], + [84341, 1], + [84340, 1], + [84339, 1], + [84338, 1], + [84337, 1], + [84336, 1], + [84335, 1], + [84334, 1], + [84333, 1], + [84332, 1], + [84331, 1], + [84330, 1], + [84302, 0, "a"], + [84303, 0, "t"], + [84304, 0, " "], + [84305, 0, "t"], + [84306, 0, "h"], + [84307, 0, "e"], + [84308, 0, " "], + [84309, 0, "t"], + [84310, 0, "i"], + [84311, 0, "m"], + [84312, 0, "e"], + [84313, 0, " "], + [84419, 0, "a"], + [84420, 0, "t"], + [84421, 0, " "], + [84422, 0, "t"], + [84423, 0, "h"], + [84424, 0, "e"], + [84425, 0, " "], + [84426, 0, "t"], + [84427, 0, "i"], + [84428, 0, "m"], + [84429, 0, "e"], + [84430, 0, " "], + [84368, 0, " "], + [84369, 0, "S"], + [84370, 0, "i"], + [84371, 0, "n"], + [84372, 0, "c"], + [84373, 0, "e"], + [84374, 0, " "], + [84375, 0, "$"], + [84376, 0, "o"], + [84377, 0, "_"], + [84378, 0, "r"], + [84379, 0, "$"], + [84380, 0, " "], + [84381, 0, "h"], + [84382, 0, "a"], + [84383, 0, "s"], + [84384, 0, " "], + [84385, 0, "a"], + [84386, 0, " "], + [84387, 0, "l"], + [84388, 0, "e"], + [84389, 0, "s"], + [84390, 0, "s"], + [84391, 0, "e"], + [84392, 0, "r"], + [84393, 0, " "], + [84394, 0, "o"], + [84395, 0, "p"], + [84396, 0, "e"], + [84397, 0, "r"], + [84398, 0, "a"], + [84399, 0, "t"], + [84400, 0, "i"], + [84401, 0, "o"], + [84402, 0, "n"], + [84403, 0, " "], + [84404, 0, "I"], + [84405, 0, "D"], + [84406, 0, ","], + [84407, 0, " "], + [84408, 0, "t"], + [84409, 0, "h"], + [84410, 0, "e"], + [84411, 0, " "], + [84412, 0, "r"], + [84413, 0, "u"], + [84414, 0, "l"], + [84415, 0, "e"], + [84416, 0, " "], + [84417, 0, "$"], + [84418, 0, "\\"], + [84419, 0, "m"], + [84419, 1], + [84419, 0, "t"], + [84420, 0, "e"], + [84421, 0, "x"], + [84422, 0, "t"], + [84423, 0, "s"], + [84424, 0, "c"], + [84425, 0, "{"], + [84426, 0, "I"], + [84427, 0, "n"], + [84428, 0, "s"], + [84429, 0, "e"], + [84430, 0, "r"], + [84431, 0, "t"], + [84432, 0, "}"], + [84433, 0, "_"], + [84434, 0, "1"], + [84435, 0, "$"], + [84436, 0, " "], + [84437, 0, "a"], + [84438, 0, "p"], + [84439, 0, "p"], + [84440, 0, "l"], + [84441, 0, "i"], + [84442, 0, "e"], + [84443, 0, "s"], + [84444, 0, " "], + [84445, 0, "w"], + [84446, 0, "i"], + [84447, 0, "t"], + [84448, 0, "h"], + [84449, 0, " "], + [84450, 0, "$"], + [84451, 0, "\\"], + [84452, 0, "m"], + [84453, 0, "a"], + [84454, 0, "t"], + [84455, 0, "h"], + [84456, 0, "i"], + [84457, 0, "t"], + [84458, 0, "{"], + [84459, 0, "n"], + [84460, 0, "e"], + [84461, 0, "x"], + [84462, 0, "t"], + [84463, 0, "}"], + [84464, 0, " "], + [84465, 0, "="], + [84466, 0, " "], + [84467, 0, "o"], + [84468, 0, "_"], + [84469, 0, "r"], + [84470, 0, "."], + [84471, 0, "\\"], + [84472, 0, "m"], + [84473, 0, "a"], + [84474, 0, "t"], + [84475, 0, "h"], + [84476, 0, "i"], + [84477, 0, "t"], + [84478, 0, "{"], + [84479, 0, "i"], + [84480, 0, "d"], + [84481, 0, "}"], + [84482, 0, "$"], + [84483, 0, " "], + [84484, 0, "a"], + [84485, 0, "t"], + [84486, 0, " "], + [84487, 0, "t"], + [84488, 0, "h"], + [84489, 0, "e"], + [84490, 0, " "], + [84491, 0, "l"], + [84492, 0, "a"], + [84493, 0, "t"], + [84494, 0, "e"], + [84495, 0, "s"], + [84496, 0, "t"], + [84497, 0, ";"], + [84498, 0, " "], + [84499, 0, "i"], + [84500, 0, "t"], + [84501, 0, " "], + [84502, 0, "i"], + [84503, 0, "s"], + [84504, 0, " "], + [84505, 0, "n"], + [84506, 0, "o"], + [84507, 0, "t"], + [84508, 0, " "], + [84509, 0, "p"], + [84510, 0, "o"], + [84511, 0, "s"], + [84512, 0, "s"], + [84513, 0, "i"], + [84514, 0, "b"], + [84515, 0, "l"], + [84516, 0, "e"], + [84517, 0, " "], + [84518, 0, "f"], + [84519, 0, "o"], + [84520, 0, "r"], + [84521, 0, " "], + [84522, 0, "$"], + [84523, 0, "\\"], + [84524, 0, "m"], + [84524, 1], + [84524, 0, "t"], + [84525, 0, "e"], + [84526, 0, "x"], + [84527, 0, "t"], + [84528, 0, "s"], + [84529, 0, "c"], + [84530, 0, "{"], + [84531, 0, "I"], + [84532, 0, "n"], + [84533, 0, "s"], + [84534, 0, "e"], + [84535, 0, "r"], + [84536, 0, "t"], + [84537, 0, "}"], + [84538, 0, "_"], + [84539, 0, "2"], + [84540, 0, "$"], + [84541, 0, "%"], + [84541, 1], + [84541, 0, " "], + [84542, 0, "t"], + [84543, 0, "o"], + [84544, 0, " "], + [84497, 0, ","], + [84498, 0, " "], + [84499, 0, "s"], + [84500, 0, "o"], + [84501, 0, " "], + [84502, 0, "t"], + [84503, 0, "h"], + [84504, 0, "e"], + [84505, 0, " "], + [84506, 0, "i"], + [84507, 0, "n"], + [84508, 0, "s"], + [84509, 0, "e"], + [84510, 0, "r"], + [84511, 0, "t"], + [84512, 0, "i"], + [84513, 0, "o"], + [84514, 0, "n"], + [84515, 0, " "], + [84516, 0, "p"], + [84517, 0, "o"], + [84518, 0, "s"], + [84519, 0, "i"], + [84520, 0, "t"], + [84521, 0, "i"], + [84522, 0, "o"], + [84523, 0, "n"], + [84524, 0, " "], + [84525, 0, "o"], + [84526, 0, "f"], + [84527, 0, " "], + [84528, 0, "$"], + [84529, 0, "o"], + [84530, 0, "_"], + [84531, 0, "s"], + [84532, 0, "$"], + [84533, 0, " "], + [84534, 0, "m"], + [84535, 0, "u"], + [84536, 0, "s"], + [84537, 0, "t"], + [84538, 0, " "], + [84539, 0, "a"], + [84540, 0, "p"], + [84541, 0, "p"], + [84542, 0, "e"], + [84543, 0, "a"], + [84544, 0, "r"], + [84545, 0, " "], + [84546, 0, "b"], + [84547, 0, "e"], + [84548, 0, "f"], + [84549, 0, "o"], + [84550, 0, "r"], + [84551, 0, "e"], + [84552, 0, " "], + [84553, 0, "$"], + [84554, 0, "o"], + [84555, 0, "_"], + [84556, 0, "r"], + [84557, 0, "$"], + [84369, 0, "W"], + [84370, 0, "h"], + [84371, 0, "e"], + [84372, 0, "n"], + [84373, 0, " "], + [84374, 0, "a"], + [84375, 0, "p"], + [84376, 0, "p"], + [84377, 0, "l"], + [84378, 0, "y"], + [84379, 0, "i"], + [84380, 0, "n"], + [84381, 0, "g"], + [84382, 0, " "], + [84383, 0, "$"], + [84384, 0, "o"], + [84385, 0, "_"], + [84386, 0, "s"], + [84387, 0, "$"], + [84388, 0, ","], + [84389, 0, " "], + [84390, 1], + [84390, 0, "s"], + [84579, 1], + [84579, 0, "."], + [84581, 1], + [84581, 0, "I"], + [84627, 0, "s"], + [84628, 0, "k"], + [84629, 0, "i"], + [84630, 0, "p"], + [84631, 0, " "], + [84632, 0, "p"], + [84633, 0, "a"], + [84634, 0, "s"], + [84635, 0, "t"], + [84636, 0, " "], + [84637, 0, "$"], + [84638, 0, "o"], + [84639, 0, "_"], + [84640, 0, "r"], + [84641, 0, "."], + [84641, 1], + [84641, 0, "$"], + [84642, 0, "."], + [84851, 0, "\n"], + [84852, 0, "\n"], + [84853, 0, "I"], + [84854, 0, "n"], + [84855, 0, " "], + [84856, 0, "b"], + [84857, 0, "o"], + [84858, 0, "t"], + [84859, 0, "h"], + [84860, 0, " "], + [84861, 0, "c"], + [84862, 0, "a"], + [84863, 0, "s"], + [84864, 0, "e"], + [84865, 0, "s"], + [84866, 0, ","], + [84867, 0, " "], + [84868, 0, "t"], + [84869, 0, "h"], + [84870, 0, "e"], + [84871, 0, " "], + [84872, 0, "i"], + [84873, 0, "n"], + [84874, 0, "s"], + [84875, 0, "e"], + [84876, 0, "r"], + [84877, 0, "t"], + [84878, 0, "i"], + [84879, 0, "o"], + [84880, 0, "n"], + [84881, 0, " "], + [84882, 0, "p"], + [84883, 0, "o"], + [84884, 0, "s"], + [84885, 0, "i"], + [84886, 0, "t"], + [84887, 0, "i"], + [84888, 0, "o"], + [84889, 0, "n"], + [84890, 0, " "], + [84891, 0, "o"], + [84892, 0, "f"], + [84893, 0, " "], + [84894, 0, "$"], + [84895, 0, "o"], + [84896, 0, "_"], + [84897, 0, "r"], + [84898, 0, "$"], + [84899, 0, " "], + [84900, 0, "a"], + [84901, 0, "p"], + [84902, 0, "p"], + [84903, 0, "e"], + [84904, 0, "a"], + [84905, 0, "r"], + [84906, 0, "s"], + [84907, 0, " "], + [84908, 0, "a"], + [84909, 0, "f"], + [84910, 0, "t"], + [84911, 0, "e"], + [84912, 0, "r"], + [84913, 0, " "], + [84914, 0, "t"], + [84915, 0, "h"], + [84916, 0, "e"], + [84917, 0, " "], + [84918, 0, "i"], + [84919, 0, "n"], + [84920, 0, "s"], + [84921, 0, "e"], + [84922, 0, "r"], + [84923, 0, "t"], + [84924, 0, "i"], + [84925, 0, "o"], + [84926, 0, "n"], + [84927, 0, " "], + [84928, 0, "p"], + [84929, 0, "o"], + [84930, 0, "s"], + [84931, 0, "i"], + [84932, 0, "t"], + [84933, 0, "i"], + [84934, 0, "o"], + [84935, 0, "n"], + [84936, 0, " "], + [84937, 0, "o"], + [84938, 0, "f"], + [84939, 0, " "], + [84940, 0, "$"], + [84941, 0, "o"], + [84942, 0, "_"], + [84943, 0, "s"], + [84944, 0, "$"], + [84945, 0, "."], + [84946, 0, " "], + [84947, 0, "T"], + [84947, 1], + [84946, 1], + [84945, 1], + [84945, 0, ","], + [84946, 0, " "], + [84947, 0, "w"], + [84948, 0, "h"], + [84949, 0, "i"], + [84950, 0, "c"], + [84951, 0, "h"], + [84952, 0, " "], + [84953, 0, "s"], + [84954, 0, "h"], + [84955, 0, "o"], + [84956, 0, "w"], + [84957, 0, "s"], + [84958, 0, " "], + [84959, 0, "t"], + [84960, 0, "h"], + [84961, 0, "a"], + [84962, 0, "t"], + [84963, 0, " "], + [84964, 0, "$"], + [84965, 0, "o"], + [84966, 0, "_"], + [84967, 0, "r"], + [84968, 0, "$"], + [84969, 0, " "], + [84970, 0, "a"], + [84971, 0, "n"], + [84972, 0, "d"], + [84973, 0, " "], + [84974, 0, "$"], + [84975, 0, "o"], + [84976, 0, "_"], + [84977, 0, "s"], + [84978, 0, "$"], + [84979, 0, " "], + [84980, 0, "a"], + [84981, 0, "r"], + [84982, 0, "e"], + [84983, 0, " "], + [84984, 0, "c"], + [84985, 0, "o"], + [84986, 0, "m"], + [84987, 0, "m"], + [84988, 0, "u"], + [84989, 0, "t"], + [84990, 0, "a"], + [84991, 0, "t"], + [84992, 0, "i"], + [84993, 0, "v"], + [84994, 0, "e"], + [84995, 0, "."], + [84945, 1], + [84945, 0, "."], + [84946, 0, " "], + [84947, 0, "S"], + [84948, 0, "i"], + [84949, 0, "n"], + [84950, 0, "c"], + [84951, 0, "e"], + [84952, 0, " "], + [84953, 0, "t"], + [84954, 0, "h"], + [84955, 0, "e"], + [84956, 0, " "], + [84957, 0, "a"], + [84958, 0, "r"], + [84959, 0, "g"], + [84960, 0, "u"], + [84961, 0, "m"], + [84962, 0, "e"], + [84963, 0, "n"], + [84964, 0, "t"], + [84965, 0, " "], + [84966, 0, "a"], + [84967, 0, "p"], + [84968, 0, "p"], + [84969, 0, "l"], + [84970, 0, "i"], + [84971, 0, "e"], + [84972, 0, "s"], + [84973, 0, " "], + [84974, 0, "t"], + [84975, 0, "o"], + [84976, 0, " "], + [84977, 0, "a"], + [84978, 0, "l"], + [84979, 0, "l"], + [84980, 0, " "], + [84981, 0, "p"], + [84982, 0, "a"], + [84983, 0, "i"], + [84984, 0, "r"], + [84985, 0, "s"], + [84986, 0, " "], + [84987, 0, "o"], + [84988, 0, "f"], + [84989, 0, " "], + [84990, 0, "c"], + [84991, 0, "o"], + [84992, 0, "n"], + [84993, 0, "c"], + [84994, 0, "u"], + [84995, 0, "r"], + [84996, 0, "r"], + [84997, 0, "e"], + [84998, 0, "n"], + [84999, 0, "t"], + [85000, 0, " "], + [85001, 0, "o"], + [85002, 0, "p"], + [85003, 0, "e"], + [85004, 0, "r"], + [85005, 0, "a"], + [85006, 0, "t"], + [85007, 0, "i"], + [85008, 0, "o"], + [85009, 0, "n"], + [85010, 0, "s"], + [85011, 0, " "], + [85012, 0, "$"], + [85013, 0, "o"], + [85014, 0, "_"], + [85015, 0, "r"], + [85016, 0, ","], + [85017, 0, " "], + [85018, 0, "$"], + [85019, 0, "o"], + [85020, 0, "_"], + [85020, 1], + [85019, 1], + [85018, 1], + [85017, 1], + [85017, 0, " "], + [85018, 0, "o"], + [85019, 0, "_"], + [85020, 0, "s"], + [85021, 0, "$"], + [85022, 0, " "], + [85023, 0, "i"], + [85024, 0, "n"], + [85025, 0, " "], + [85026, 0, "$"], + [85027, 0, "H"], + [85028, 0, "$"], + [85029, 0, ","], + [85030, 0, " "], + [85031, 0, "w"], + [85032, 0, "e"], + [85033, 0, " "], + [85034, 0, "d"], + [85035, 0, "e"], + [85036, 0, "d"], + [85037, 0, "u"], + [85038, 0, "c"], + [85039, 0, "e"], + [85040, 0, " "], + [85041, 0, "t"], + [85042, 0, "h"], + [85043, 0, "a"], + [85044, 0, "t"], + [85045, 0, " "], + [85046, 0, "t"], + [85047, 0, "h"], + [85048, 0, "e"], + [85049, 0, " "], + [85050, 0, "f"], + [85051, 0, "i"], + [85052, 0, "n"], + [85053, 0, "a"], + [85054, 0, "l"], + [85055, 0, " "], + [85056, 0, "o"], + [85057, 0, "r"], + [85058, 0, "d"], + [85059, 0, "e"], + [85060, 0, "r"], + [85061, 0, " "], + [85062, 0, "o"], + [85063, 0, "f"], + [85064, 0, " "], + [85065, 0, "e"], + [85066, 0, "l"], + [85067, 0, "e"], + [85068, 0, "m"], + [85069, 0, "e"], + [85070, 0, "n"], + [85071, 0, "t"], + [85072, 0, "s"], + [85073, 0, " "], + [85074, 0, "i"], + [85075, 0, "n"], + [85076, 0, " "], + [85077, 0, "t"], + [85078, 0, "h"], + [85079, 0, "e"], + [85080, 0, " "], + [85081, 0, "l"], + [85082, 0, "i"], + [85083, 0, "s"], + [85084, 0, "t"], + [85085, 0, " "], + [85086, 0, "d"], + [85087, 0, "e"], + [85088, 0, "p"], + [85089, 0, "e"], + [85090, 0, "n"], + [85091, 0, "d"], + [85092, 0, "s"], + [85093, 0, " "], + [85094, 0, "o"], + [85095, 0, "n"], + [85096, 0, "l"], + [85097, 0, "y"], + [85098, 0, " "], + [85099, 0, "o"], + [85100, 0, "n"], + [85101, 0, " "], + [85102, 0, "t"], + [85103, 0, "h"], + [85104, 0, "e"], + [85105, 0, " "], + [85106, 0, "o"], + [85107, 0, "p"], + [85108, 0, "e"], + [85109, 0, "r"], + [85110, 0, "a"], + [85111, 0, "t"], + [85112, 0, "i"], + [85113, 0, "o"], + [85114, 0, "n"], + [85115, 0, " "], + [85116, 0, "I"], + [85117, 0, "D"], + [85118, 0, "s"], + [85119, 0, " "], + [85120, 0, "b"], + [85121, 0, "u"], + [85122, 0, "t"], + [85123, 0, " "], + [85124, 0, "n"], + [85125, 0, "o"], + [85126, 0, "t"], + [85127, 0, " "], + [85128, 0, "t"], + [85129, 0, "h"], + [85130, 0, "e"], + [85131, 0, " "], + [85132, 0, "o"], + [85133, 0, "r"], + [85134, 0, "d"], + [85135, 0, "e"], + [85136, 0, "r"], + [85137, 0, " "], + [85138, 0, "o"], + [85139, 0, "f"], + [85140, 0, " "], + [85141, 0, "a"], + [85142, 0, "p"], + [85143, 0, "p"], + [85144, 0, "l"], + [85145, 0, "i"], + [85146, 0, "c"], + [85147, 0, "a"], + [85148, 0, "t"], + [85149, 0, "i"], + [85150, 0, "o"], + [85151, 0, "n"], + [85152, 0, ","], + [85185, 1], + [85184, 1], + [85183, 1], + [85182, 1], + [85181, 1], + [85180, 1], + [85179, 1], + [85178, 1], + [85177, 1], + [85176, 1], + [85175, 1], + [85174, 1], + [85173, 1], + [85172, 1], + [85171, 1], + [85171, 0, "c"], + [85172, 0, "o"], + [85173, 0, "n"], + [85174, 0, "c"], + [85175, 0, "u"], + [85176, 0, "r"], + [85177, 0, "r"], + [85178, 0, "e"], + [85179, 0, "n"], + [85180, 0, "t"], + [85181, 0, " "], + [85182, 0, "i"], + [85183, 0, "n"], + [85184, 0, "s"], + [85185, 0, "e"], + [85186, 0, "r"], + [85187, 0, "t"], + [85188, 0, "i"], + [85189, 0, "o"], + [85190, 0, "n"], + [85191, 0, "s"], + [85192, 0, " "], + [85193, 0, "t"], + [85194, 0, "o"], + [85195, 0, " "], + [85196, 0, "t"], + [85197, 0, "h"], + [85198, 0, "e"], + [85199, 0, " "], + [85200, 0, "s"], + [85201, 0, "a"], + [85202, 0, "m"], + [85203, 0, "e"], + [85204, 0, " "], + [85205, 0, "l"], + [85206, 0, "i"], + [85207, 0, "s"], + [85208, 0, "t"], + [83141, 0, "\n"], + [83142, 0, "\n"], + [83143, 0, "\\"], + [83144, 0, "b"], + [83145, 0, "e"], + [83146, 0, "g"], + [83147, 0, "i"], + [83148, 0, "n"], + [83149, 0, "{"], + [83150, 0, "l"], + [83151, 0, "e"], + [83152, 0, "m"], + [83153, 0, "m"], + [83154, 0, "a"], + [83155, 0, "}"], + [83156, 0, "\\"], + [83157, 0, "l"], + [83158, 0, "a"], + [83159, 0, "b"], + [83160, 0, "e"], + [83161, 0, "l"], + [83162, 0, "{"], + [83163, 0, "l"], + [83164, 0, "e"], + [83165, 0, "m"], + [83166, 0, ":"], + [83167, 0, "i"], + [83168, 0, "n"], + [83169, 0, "s"], + [83170, 0, "e"], + [83171, 0, "r"], + [83172, 0, "t"], + [83173, 0, "-"], + [83174, 0, "c"], + [83175, 0, "o"], + [83176, 0, "n"], + [83177, 0, "f"], + [83178, 0, "l"], + [83179, 0, "i"], + [83180, 0, "c"], + [83181, 0, "t"], + [83182, 0, "}"], + [83183, 0, "\n"], + [83184, 0, "\\"], + [83185, 0, "e"], + [83186, 0, "n"], + [83187, 0, "d"], + [83188, 0, "{"], + [83189, 0, "l"], + [83190, 0, "e"], + [83191, 0, "m"], + [83192, 0, "m"], + [83193, 0, "a"], + [83194, 0, "}"], + [83184, 0, "\n"], + [83184, 0, "I"], + [83185, 0, "n"], + [83186, 0, " "], + [83187, 0, "a"], + [83188, 0, "n"], + [83189, 0, " "], + [83190, 0, "o"], + [83191, 0, "p"], + [83192, 0, "e"], + [83193, 0, "r"], + [83194, 0, "a"], + [83195, 0, "t"], + [83196, 0, "i"], + [83197, 0, "o"], + [83198, 0, "n"], + [83199, 0, " "], + [83200, 0, "h"], + [83201, 0, "i"], + [83202, 0, "s"], + [83203, 0, "t"], + [83204, 0, "o"], + [83205, 0, "r"], + [83206, 0, "y"], + [83207, 0, " "], + [83208, 0, "$"], + [83209, 0, "H"], + [83210, 0, "$"], + [83211, 0, ","], + [83212, 0, " "], + [83213, 0, "g"], + [83213, 1], + [83184, 0, "F"], + [83185, 0, "o"], + [83186, 0, "r"], + [83187, 0, " "], + [83188, 0, "a"], + [83189, 0, "n"], + [83190, 0, "y"], + [83191, 0, " "], + [83192, 0, "t"], + [83193, 0, "w"], + [83194, 0, "o"], + [83195, 0, " "], + [83196, 0, "c"], + [83197, 0, "o"], + [83198, 0, "n"], + [83199, 0, "c"], + [83200, 0, "u"], + [83201, 0, "r"], + [83202, 0, "r"], + [83203, 0, "e"], + [83204, 0, "n"], + [83205, 0, "t"], + [83206, 0, " "], + [83207, 0, "i"], + [83208, 0, "n"], + [83209, 0, "s"], + [83210, 0, "e"], + [83211, 0, "r"], + [83212, 0, "t"], + [83213, 0, "i"], + [83214, 0, "o"], + [83215, 0, "n"], + [83216, 0, " "], + [83217, 0, "o"], + [83218, 0, "p"], + [83219, 0, "e"], + [83220, 0, "r"], + [83221, 0, "a"], + [83222, 0, "t"], + [83223, 0, "i"], + [83224, 0, "o"], + [83225, 0, "n"], + [83226, 0, "s"], + [83227, 0, " "], + [83228, 0, "$"], + [83229, 0, "o"], + [83230, 0, "_"], + [83231, 0, "r"], + [83232, 0, ","], + [83233, 0, " "], + [83234, 0, "o"], + [83235, 0, "_"], + [83236, 0, "s"], + [83237, 0, "$"], + [83238, 0, " "], + [83239, 1], + [83239, 0, "i"], + [83243, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 1], + [83244, 0, "h"], + [83257, 0, "i"], + [83258, 0, "f"], + [83259, 0, " "], + [83260, 0, "t"], + [83261, 0, "h"], + [83262, 0, "e"], + [83263, 0, " "], + [83264, 0, "o"], + [83265, 0, "p"], + [83266, 0, "e"], + [83267, 0, "r"], + [83268, 0, "a"], + [83269, 0, "t"], + [83270, 0, "i"], + [83271, 0, "o"], + [83272, 0, "n"], + [83273, 0, "s"], + [83274, 0, " "], + [83275, 0, "h"], + [83276, 0, "a"], + [83277, 0, "v"], + [83278, 0, "e"], + [83279, 0, " "], + [83280, 0, "t"], + [83281, 0, "h"], + [83282, 0, "e"], + [83283, 0, " "], + [83284, 0, "s"], + [83285, 0, "a"], + [83286, 0, "m"], + [83287, 0, "e"], + [83288, 0, " "], + [83289, 0, "c"], + [83290, 0, "u"], + [83291, 0, "r"], + [83292, 0, "s"], + [83293, 0, "o"], + [83294, 0, "r"], + [83295, 0, " "], + [83296, 0, "("], + [83297, 0, "$"], + [83298, 0, "o"], + [83299, 0, "_"], + [83300, 0, "r"], + [83301, 0, "."], + [83302, 0, "\\"], + [83303, 0, "m"], + [83304, 0, "a"], + [83305, 0, "t"], + [83306, 0, "h"], + [83307, 0, "i"], + [83308, 0, "t"], + [83309, 0, "{"], + [83310, 0, "c"], + [83311, 0, "u"], + [83312, 0, "r"], + [83313, 0, "}"], + [83314, 0, " "], + [83315, 0, "="], + [83316, 0, " "], + [83317, 0, "o"], + [83318, 0, "_"], + [83319, 0, "s"], + [83320, 0, "."], + [83321, 0, "\\"], + [83322, 0, "m"], + [83323, 0, "a"], + [83324, 0, "t"], + [83325, 0, "h"], + [83326, 0, "i"], + [83327, 0, "t"], + [83328, 0, "{"], + [83329, 0, "c"], + [83330, 0, "u"], + [83331, 0, "r"], + [83332, 0, "}"], + [83333, 0, "$"], + [83334, 0, ")"], + [83335, 0, ","], + [83336, 0, " "], + [83337, 0, "t"], + [83338, 0, "h"], + [83339, 0, "e"], + [83340, 0, "n"], + [83341, 0, " "], + [83342, 0, "t"], + [83343, 0, "h"], + [83344, 0, "e"], + [83345, 0, " "], + [83346, 0, "o"], + [83347, 0, "r"], + [83348, 0, "d"], + [83349, 0, "e"], + [83350, 0, "r"], + [83351, 0, " "], + [83352, 0, "a"], + [83353, 0, "t"], + [83354, 0, " "], + [83355, 0, "w"], + [83356, 0, "h"], + [83357, 0, "i"], + [83358, 0, "c"], + [83359, 0, "h"], + [83360, 0, " "], + [83361, 0, "t"], + [83362, 0, "h"], + [83363, 0, "e"], + [83364, 0, " "], + [83365, 0, "i"], + [83366, 0, "n"], + [83367, 0, "s"], + [83368, 0, "e"], + [83369, 0, "r"], + [83370, 0, "t"], + [83371, 0, "i"], + [83372, 0, "o"], + [83373, 0, "n"], + [83374, 0, "s"], + [83375, 0, " "], + [83376, 0, "a"], + [83377, 0, "r"], + [83378, 0, "e"], + [83379, 0, " "], + [83379, 1], + [83378, 1], + [83377, 1], + [83376, 1], + [83376, 0, "a"], + [83377, 0, "p"], + [83378, 0, "p"], + [83379, 0, "e"], + [83380, 0, "a"], + [83381, 0, "r"], + [83382, 0, " "], + [83383, 0, "i"], + [83384, 0, "n"], + [83385, 0, " "], + [83386, 0, "t"], + [83387, 0, "h"], + [83388, 0, "e"], + [83389, 0, " "], + [83390, 0, "l"], + [83391, 0, "i"], + [83392, 0, "s"], + [83393, 0, "t"], + [83394, 0, " "], + [83395, 0, "i"], + [83396, 0, "s"], + [83397, 0, " "], + [83398, 0, "i"], + [83399, 0, "n"], + [83400, 0, "d"], + [83401, 0, "e"], + [83402, 0, "p"], + [83403, 0, "e"], + [83404, 0, "n"], + [83405, 0, "d"], + [83406, 0, "e"], + [83407, 0, "n"], + [83408, 0, "t"], + [83409, 0, " "], + [83410, 0, "o"], + [83411, 0, "f"], + [83412, 0, " "], + [83413, 0, "t"], + [83414, 0, "h"], + [83415, 0, "e"], + [83416, 0, " "], + [83417, 0, "o"], + [83418, 0, "r"], + [83419, 0, "d"], + [83420, 0, "e"], + [83421, 0, "r"], + [83422, 0, " "], + [83423, 0, "i"], + [83424, 0, "n"], + [83425, 0, " "], + [83426, 0, "w"], + [83427, 0, "h"], + [83428, 0, "i"], + [83429, 0, "c"], + [83430, 0, "h"], + [83431, 0, " "], + [83432, 0, "t"], + [83433, 0, "h"], + [83434, 0, "e"], + [83435, 0, " "], + [83436, 0, "o"], + [83437, 0, "p"], + [83438, 0, "e"], + [83439, 0, "r"], + [83440, 0, "a"], + [83441, 0, "t"], + [83442, 0, "i"], + [83443, 0, "o"], + [83444, 0, "n"], + [83445, 0, "s"], + [83446, 0, " "], + [83447, 0, "a"], + [83448, 0, "r"], + [83449, 0, "e"], + [83450, 0, " "], + [83451, 0, "a"], + [83452, 0, "p"], + [83453, 0, "p"], + [83454, 0, "l"], + [83455, 0, "i"], + [83456, 0, "e"], + [83457, 0, "d"], + [83458, 0, "."], + [83471, 0, "\n"], + [83472, 0, "\n"], + [83473, 0, "\\"], + [83474, 0, "b"], + [83475, 0, "e"], + [83476, 0, "g"], + [83477, 0, "i"], + [83478, 0, "n"], + [83479, 0, "{"], + [83480, 0, "p"], + [83481, 0, "r"], + [83482, 0, "o"], + [83483, 0, "o"], + [83484, 0, "f"], + [83485, 0, "}"], + [83486, 0, "\n"], + [83487, 0, "T"], + [83488, 0, "O"], + [83489, 0, "D"], + [83490, 0, "O"], + [83491, 0, "\n"], + [83492, 0, "\\"], + [83493, 0, "e"], + [83494, 0, "n"], + [83495, 0, "d"], + [83496, 0, "{"], + [83497, 0, "p"], + [83498, 0, "r"], + [83499, 0, "o"], + [83500, 0, "o"], + [83501, 0, "f"], + [83502, 0, "}"], + [83353, 1], + [83352, 1], + [83334, 1], + [83296, 1], + [83295, 1], + [83294, 1], + [83293, 1], + [83292, 1], + [83291, 1], + [83290, 1], + [83289, 1], + [83288, 1], + [83287, 1], + [83286, 1], + [83285, 1], + [83284, 1], + [83283, 1], + [83282, 1], + [83281, 1], + [83280, 1], + [83279, 1], + [83278, 1], + [83277, 1], + [83276, 1], + [83275, 1], + [83274, 1], + [83273, 1], + [83272, 1], + [83271, 1], + [83270, 1], + [83269, 1], + [83268, 1], + [83267, 1], + [83266, 1], + [83265, 1], + [83264, 1], + [83263, 1], + [83262, 1], + [83261, 1], + [83260, 1], + [83314, 0, "a"], + [83315, 0, "t"], + [83336, 1], + [83335, 1], + [83334, 1], + [83333, 1], + [83333, 0, "e"], + [83334, 0, "d"], + [83335, 0, " "], + [83336, 0, "e"], + [83337, 0, "l"], + [83338, 0, "e"], + [83339, 0, "m"], + [83340, 0, "e"], + [83341, 0, "n"], + [83342, 0, "t"], + [83343, 0, "s"], + [83366, 0, " "], + [83367, 0, "d"], + [83368, 0, "e"], + [83369, 0, "t"], + [83370, 0, "e"], + [83371, 0, "r"], + [83372, 0, "m"], + [83373, 0, "i"], + [83374, 0, "n"], + [83375, 0, "i"], + [83376, 0, "s"], + [83377, 0, "t"], + [83378, 0, "i"], + [83379, 0, "c"], + [83380, 0, " "], + [83381, 0, "a"], + [83382, 0, "n"], + [83383, 0, "d"], + [83473, 0, "\n"], + [83474, 0, "W"], + [83475, 0, "i"], + [83476, 0, "t"], + [83477, 0, "h"], + [83478, 0, "o"], + [83479, 0, "u"], + [83480, 0, "t"], + [83481, 0, " "], + [83482, 0, "l"], + [83483, 0, "o"], + [83484, 0, "s"], + [83485, 0, "s"], + [83486, 0, " "], + [83487, 0, "o"], + [83488, 0, "f"], + [83489, 0, " "], + [83490, 0, "g"], + [83491, 0, "e"], + [83492, 0, "n"], + [83493, 0, "e"], + [83494, 0, "r"], + [83495, 0, "a"], + [83496, 0, "l"], + [83497, 0, "i"], + [83498, 0, "t"], + [83499, 0, "y"], + [83500, 0, ","], + [83501, 0, " "], + [83502, 0, "a"], + [83503, 0, "s"], + [83504, 0, "s"], + [83505, 0, "u"], + [83506, 0, "m"], + [83507, 0, "e"], + [83508, 0, " "], + [83509, 0, "t"], + [83510, 0, "h"], + [83511, 0, "a"], + [83512, 0, "t"], + [83513, 0, " "], + [83514, 0, "$"], + [83515, 0, "o"], + [83516, 0, "_"], + [83517, 0, "r"], + [83518, 0, "."], + [83519, 0, "\\"], + [83520, 0, "m"], + [83521, 0, "a"], + [83522, 0, "t"], + [83523, 0, "h"], + [83524, 0, "i"], + [83525, 0, "t"], + [83526, 0, "{"], + [83527, 0, "i"], + [83528, 0, "d"], + [83529, 0, "}"], + [83530, 0, " "], + [83531, 0, "<"], + [83532, 0, " "], + [83533, 0, "o"], + [83534, 0, "_"], + [83535, 0, "s"], + [83536, 0, "."], + [83537, 0, "\\"], + [83538, 0, "m"], + [83539, 0, "a"], + [83540, 0, "t"], + [83541, 0, "h"], + [83542, 0, "i"], + [83543, 0, "t"], + [83544, 0, "{"], + [83545, 0, "i"], + [83546, 0, "d"], + [83547, 0, "}"], + [83548, 0, "$"], + [83549, 0, " "], + [83550, 0, "a"], + [83551, 0, "c"], + [83552, 0, "c"], + [83553, 0, "o"], + [83554, 0, "r"], + [83555, 0, "d"], + [83556, 0, "i"], + [83557, 0, "n"], + [83558, 0, "g"], + [83559, 0, " "], + [83560, 0, "t"], + [83561, 0, "o"], + [83562, 0, " "], + [83563, 0, "t"], + [83564, 0, "h"], + [83565, 0, "e"], + [83566, 0, " "], + [83567, 0, "o"], + [83568, 0, "r"], + [83569, 0, "d"], + [83570, 0, "e"], + [83571, 0, "r"], + [83572, 0, "i"], + [83573, 0, "n"], + [83574, 0, "g"], + [83575, 0, " "], + [83576, 0, "r"], + [83577, 0, "e"], + [83578, 0, "l"], + [83579, 0, "a"], + [83580, 0, "t"], + [83581, 0, "i"], + [83582, 0, "o"], + [83583, 0, "n"], + [83584, 0, " "], + [83585, 0, "o"], + [83586, 0, "n"], + [83587, 0, " "], + [83588, 0, "L"], + [83589, 0, "a"], + [83590, 0, "m"], + [83591, 0, "p"], + [83592, 0, "o"], + [83593, 0, "r"], + [83594, 0, "t"], + [83595, 0, " "], + [83596, 0, "t"], + [83597, 0, "i"], + [83598, 0, "m"], + [83599, 0, "e"], + [83600, 0, "s"], + [83601, 0, "t"], + [83602, 0, "a"], + [83603, 0, "m"], + [83604, 0, "p"], + [83605, 0, "s"], + [83606, 0, "."], + [83607, 0, " "], + [83608, 0, "("], + [83609, 0, "I"], + [83610, 0, "f"], + [83611, 0, " "], + [83612, 0, "t"], + [83613, 0, "h"], + [83614, 0, "e"], + [83615, 0, " "], + [83616, 0, "o"], + [83617, 0, "p"], + [83618, 0, "e"], + [83619, 0, "r"], + [83620, 0, "a"], + [83621, 0, "t"], + [83622, 0, "i"], + [83623, 0, "o"], + [83624, 0, "n"], + [83625, 0, " "], + [83626, 0, "I"], + [83627, 0, "D"], + [83628, 0, " "], + [83629, 0, "o"], + [83630, 0, "f"], + [83631, 0, " "], + [83632, 0, "$"], + [83633, 0, "o"], + [83634, 0, "_"], + [83635, 0, "r"], + [83636, 0, "$"], + [83637, 0, " "], + [83638, 0, "i"], + [83639, 0, "s"], + [83640, 0, " "], + [83641, 0, "g"], + [83642, 0, "r"], + [83643, 0, "e"], + [83644, 0, "a"], + [83645, 0, "t"], + [83646, 0, " "], + [83646, 1], + [83646, 0, "e"], + [83647, 0, "r"], + [83648, 0, " "], + [83649, 0, "t"], + [83650, 0, "h"], + [83651, 0, "a"], + [83652, 0, "n"], + [83653, 0, " "], + [83654, 0, "t"], + [83655, 0, "h"], + [83656, 0, "a"], + [83657, 0, "t"], + [83658, 0, " "], + [83659, 0, "o"], + [83660, 0, "f"], + [83661, 0, " "], + [83662, 0, "$"], + [83663, 0, "o"], + [83664, 0, "_"], + [83665, 0, "s"], + [83666, 0, "$"], + [83667, 0, ","], + [83668, 0, " "], + [83669, 0, "t"], + [83670, 0, "h"], + [83671, 0, "e"], + [83672, 0, " "], + [83673, 0, "t"], + [83674, 0, "w"], + [83675, 0, "o"], + [83676, 0, " "], + [83677, 0, "o"], + [83678, 0, "p"], + [83679, 0, "e"], + [83680, 0, "r"], + [83681, 0, "a"], + [83682, 0, "t"], + [83683, 0, "i"], + [83684, 0, "o"], + [83685, 0, "n"], + [83686, 0, "s"], + [83687, 0, " "], + [83688, 0, "c"], + [83689, 0, "a"], + [83690, 0, "n"], + [83691, 0, " "], + [83692, 0, "b"], + [83693, 0, "e"], + [83694, 0, " "], + [83695, 0, "s"], + [83696, 0, "w"], + [83697, 0, "a"], + [83698, 0, "p"], + [83699, 0, "p"], + [83700, 0, "e"], + [83701, 0, "d"], + [83702, 0, " "], + [83703, 0, "i"], + [83704, 0, "n"], + [83705, 0, " "], + [83706, 0, "t"], + [83707, 0, "h"], + [83708, 0, "i"], + [83709, 0, "s"], + [83710, 0, " "], + [83711, 0, "p"], + [83712, 0, "r"], + [83713, 0, "o"], + [83714, 0, "o"], + [83715, 0, "f"], + [83716, 0, "."], + [83717, 0, ")"], + [83718, 0, " "], + [83719, 0, "W"], + [83720, 0, "e"], + [83721, 0, " "], + [83722, 0, "n"], + [83723, 0, "o"], + [83724, 0, "w"], + [83725, 0, " "], + [83726, 0, "d"], + [83727, 0, "i"], + [83728, 0, "s"], + [83729, 0, "t"], + [83730, 0, "i"], + [83731, 0, "n"], + [83732, 0, "g"], + [83733, 0, "u"], + [83734, 0, "i"], + [83735, 0, "s"], + [83736, 0, "h"], + [83737, 0, " "], + [83738, 0, "t"], + [83738, 1], + [83738, 0, "t"], + [83739, 0, "h"], + [83740, 0, "e"], + [83741, 0, " "], + [83742, 0, "t"], + [83743, 0, "w"], + [83744, 0, "o"], + [83745, 0, " "], + [83746, 0, "p"], + [83747, 0, "o"], + [83748, 0, "s"], + [83749, 0, "s"], + [83750, 0, "i"], + [83751, 0, "b"], + [83752, 0, "l"], + [83753, 0, "e"], + [83754, 0, " "], + [83755, 0, "o"], + [83756, 0, "r"], + [83757, 0, "d"], + [83758, 0, "e"], + [83759, 0, "r"], + [83760, 0, "i"], + [83761, 0, "n"], + [83762, 0, "g"], + [83763, 0, "s"], + [83764, 0, " "], + [83764, 1], + [83763, 1], + [83762, 1], + [83761, 1], + [83760, 1], + [83760, 0, "s"], + [83761, 0, " "], + [83762, 0, "o"], + [83763, 0, "f"], + [83764, 0, " "], + [83765, 0, "a"], + [83766, 0, "p"], + [83767, 0, "p"], + [83768, 0, "l"], + [83769, 0, "y"], + [83770, 0, "i"], + [83771, 0, "n"], + [83772, 0, "g"], + [83773, 0, " "], + [83774, 0, "t"], + [83775, 0, "h"], + [83776, 0, "e"], + [83777, 0, " "], + [83778, 0, "o"], + [83779, 0, "p"], + [83780, 0, "e"], + [83781, 0, "r"], + [83782, 0, "a"], + [83783, 0, "t"], + [83784, 0, "i"], + [83785, 0, "o"], + [83786, 0, "n"], + [83787, 0, "s"], + [83788, 0, ":"], + [83789, 0, "\n"], + [83790, 0, "\n"], + [83791, 0, "\\"], + [83792, 0, "b"], + [83793, 0, "e"], + [83794, 0, "g"], + [83795, 0, "i"], + [83796, 0, "n"], + [83797, 0, "{"], + [83798, 0, "e"], + [83799, 0, "n"], + [83800, 0, "u"], + [83801, 0, "m"], + [83802, 0, "e"], + [83803, 0, "r"], + [83804, 0, "a"], + [83805, 0, "t"], + [83806, 0, "e"], + [83807, 0, "}"], + [83812, 1], + [83811, 1], + [83810, 1], + [83809, 1], + [83809, 0, "\\"], + [83810, 0, "e"], + [83811, 0, "n"], + [83812, 0, "d"], + [83813, 0, "{"], + [83814, 0, "e"], + [83815, 0, "n"], + [83816, 0, "u"], + [83817, 0, "m"], + [83818, 0, "e"], + [83819, 0, "r"], + [83820, 0, "a"], + [83821, 0, "t"], + [83822, 0, "e"], + [83823, 0, "}"], + [83808, 0, "\n"], + [83809, 0, "\\"], + [83810, 0, "i"], + [83811, 0, "t"], + [83812, 0, "e"], + [83813, 0, "m"], + [83814, 0, " "], + [83815, 0, "$"], + [83816, 0, "o"], + [83817, 0, "_"], + [83818, 0, "r"], + [83819, 0, "$"], + [83820, 0, " "], + [83821, 0, "i"], + [83822, 0, "s"], + [83823, 0, " "], + [83824, 0, "a"], + [83825, 0, "p"], + [83826, 0, "p"], + [83827, 0, "l"], + [83828, 0, "i"], + [83829, 0, "e"], + [83830, 0, "d"], + [83831, 0, " "], + [83832, 0, "b"], + [83833, 0, "e"], + [83834, 0, "f"], + [83835, 0, "o"], + [83836, 0, "r"], + [83837, 0, "e"], + [83838, 0, " "], + [83839, 0, "$"], + [83840, 0, "o"], + [83841, 0, "_"], + [83842, 0, "s"], + [83843, 0, "$"], + [83844, 0, " "], + [83845, 0, "i"], + [83846, 0, "n"], + [83847, 0, " "], + [83848, 0, "$"], + [83849, 0, "H"], + [83850, 0, "$"], + [83363, 0, " "], + [83364, 0, "a"], + [83365, 0, "f"], + [83366, 0, "t"], + [83367, 0, "e"], + [83368, 0, "r"], + [83369, 0, " "], + [83370, 0, "a"], + [83371, 0, "p"], + [83372, 0, "p"], + [83373, 0, "l"], + [83374, 0, "y"], + [83375, 0, "i"], + [83376, 0, "n"], + [83377, 0, "t"], + [83378, 0, " "], + [83378, 1], + [83377, 1], + [83377, 0, "g"], + [83378, 0, " "], + [83379, 0, "$"], + [83380, 0, "H"], + [83381, 0, "$"], + [83463, 1], + [83462, 1], + [83461, 1], + [83460, 1], + [83459, 1], + [83458, 1], + [83457, 1], + [83456, 1], + [83455, 1], + [83454, 1], + [83453, 1], + [83452, 1], + [83451, 1], + [83450, 1], + [83449, 1], + [83448, 1], + [83447, 1], + [83446, 1], + [83445, 1], + [83444, 1], + [83443, 1], + [83442, 1], + [83441, 1], + [83440, 1], + [83439, 1], + [83438, 1], + [83437, 1], + [83436, 1], + [83435, 1], + [83434, 1], + [83433, 1], + [83432, 1], + [83431, 1], + [83430, 1], + [83429, 1], + [83429, 0, "o"], + [83430, 0, "f"], + [83431, 0, " "], + [83432, 0, "$"], + [83433, 0, "o"], + [83434, 0, "_"], + [83435, 0, "r"], + [83436, 0, "$"], + [83437, 0, " "], + [83438, 0, "a"], + [83439, 0, "n"], + [83440, 0, "d"], + [83441, 0, " "], + [83442, 0, "$"], + [83443, 0, "o"], + [83444, 0, "_"], + [83445, 0, "s"], + [83446, 0, "$"], + [83447, 0, " "], + [83448, 0, "i"], + [83449, 0, "n"], + [83450, 0, " "], + [83451, 0, "$"], + [83452, 0, "H"], + [83453, 0, "$"], + [83860, 0, "."], + [83861, 0, " "], + [83862, 0, "T"], + [83863, 0, "h"], + [83864, 0, "u"], + [83865, 0, "s"], + [83866, 0, ","], + [83867, 0, " "], + [83868, 0, "a"], + [83869, 0, "t"], + [83870, 0, " "], + [83871, 0, "t"], + [83872, 0, "h"], + [83873, 0, "e"], + [83874, 0, " "], + [83875, 0, "t"], + [83876, 0, "i"], + [83877, 0, "m"], + [83878, 0, "e"], + [83879, 0, " "], + [83880, 0, "w"], + [83881, 0, "h"], + [83882, 0, "e"], + [83883, 0, "n"], + [83884, 0, " "], + [83885, 0, "$"], + [83886, 0, "o"], + [83887, 0, "_"], + [83888, 0, "s"], + [83889, 0, "$"], + [83890, 0, " "], + [83891, 0, "i"], + [83892, 0, "s"], + [83893, 0, " "], + [83894, 0, "a"], + [83895, 0, "p"], + [83896, 0, "p"], + [83897, 0, "l"], + [83898, 0, "i"], + [83899, 0, "e"], + [83900, 0, "d"], + [83901, 0, ","], + [83902, 0, " "], + [83903, 0, "$"], + [83904, 0, "o"], + [83905, 0, "_"], + [83906, 0, "r"], + [83907, 0, "$"], + [83908, 0, " "], + [83909, 0, "h"], + [83910, 0, "a"], + [83911, 0, "s"], + [83912, 0, " "], + [83913, 0, "a"], + [83914, 0, "l"], + [83915, 0, "r"], + [83916, 0, "e"], + [83917, 0, "a"], + [83918, 0, "d"], + [83919, 0, "y"], + [83920, 0, " "], + [83921, 0, "b"], + [83922, 0, "e"], + [83923, 0, "e"], + [83924, 0, "n"], + [83925, 0, " "], + [83926, 0, "a"], + [83927, 0, "p"], + [83928, 0, "p"], + [83929, 0, "l"], + [83930, 0, "i"], + [83931, 0, "e"], + [83932, 0, "d"], + [83933, 0, "."], + [83934, 0, " "], + [83935, 0, "W"], + [83936, 0, "h"], + [83937, 0, "e"], + [83938, 0, "n"], + [83939, 0, " "], + [83940, 0, "a"], + [83941, 0, "p"], + [83942, 0, "p"], + [83943, 0, "l"], + [83944, 0, "y"], + [83945, 0, "i"], + [83946, 0, "n"], + [83947, 0, "g"], + [83948, 0, " "], + [83949, 0, "$"], + [83950, 0, "o"], + [83951, 0, "_"], + [83952, 0, "s"], + [83953, 0, "$"], + [83954, 0, ","], + [83955, 0, " "], + [83956, 0, "s"], + [83957, 0, "i"], + [83958, 0, "n"], + [83959, 0, "c"], + [83960, 0, "e"], + [83961, 0, " "], + [83962, 0, "$"], + [83963, 0, "o"], + [83964, 0, "_"], + [83965, 0, "r"], + [83966, 0, "$"], + [83967, 0, " "], + [83968, 0, "h"], + [83969, 0, "a"], + [83970, 0, "s"], + [83971, 0, " "], + [83972, 0, "a"], + [83973, 0, " "], + [83974, 0, "l"], + [83975, 0, "e"], + [83976, 0, "s"], + [83977, 0, "s"], + [83978, 0, "e"], + [83979, 0, "r"], + [83980, 0, " "], + [83981, 0, "o"], + [83982, 0, "p"], + [83983, 0, "e"], + [83984, 0, "r"], + [83985, 0, "a"], + [83986, 0, "t"], + [83987, 0, "i"], + [83988, 0, "o"], + [83989, 0, "n"], + [83990, 0, " "], + [83991, 0, "I"], + [83992, 0, "D"], + [83993, 0, ","], + [83994, 0, " "], + [83995, 0, "t"], + [83996, 0, "h"], + [83997, 0, "e"], + [83998, 0, " "], + [83999, 0, "\\"], + [83999, 1], + [83999, 0, "r"], + [84000, 0, "u"], + [84001, 0, "l"], + [84002, 0, "e"], + [84003, 0, " "], + [84004, 0, "$"], + [84005, 0, "\\"], + [84006, 0, "t"], + [84007, 0, "e"], + [84008, 0, "x"], + [84009, 0, "t"], + [84010, 0, "s"], + [84011, 0, "c"], + [84012, 0, "{"], + [84013, 0, "I"], + [84014, 0, "n"], + [84015, 0, "s"], + [84016, 0, "e"], + [84017, 0, "r"], + [84018, 0, "t"], + [84019, 0, "}"], + [84020, 0, "_"], + [84021, 0, "1"], + [84022, 0, "$"], + [84023, 0, " "], + [84024, 0, "a"], + [84025, 0, "p"], + [84026, 0, "p"], + [84027, 0, "l"], + [84028, 0, "i"], + [84029, 0, "e"], + [84030, 0, "s"], + [84031, 0, " "], + [84032, 0, "w"], + [84033, 0, "i"], + [84034, 0, "t"], + [84035, 0, "h"], + [84036, 0, " "], + [84037, 0, "$"], + [84038, 0, "\\"], + [84039, 0, "m"], + [84040, 0, "a"], + [84041, 0, "t"], + [84042, 0, "h"], + [84043, 0, "i"], + [84044, 0, "t"], + [84045, 0, "{"], + [84046, 0, "n"], + [84047, 0, "e"], + [84048, 0, "x"], + [84049, 0, "t"], + [84050, 0, "}"], + [84051, 0, " "], + [84052, 0, "="], + [84053, 0, " "], + [84054, 0, "o"], + [84055, 0, "_"], + [84056, 0, "r"], + [84057, 0, "."], + [84058, 0, "\\"], + [84059, 0, "m"], + [84060, 0, "a"], + [84061, 0, "t"], + [84062, 0, "h"], + [84063, 0, "i"], + [84064, 0, "t"], + [84065, 0, "{"], + [84066, 0, "i"], + [84067, 0, "d"], + [84068, 0, "}"], + [84069, 0, "$"], + [84070, 0, " "], + [84071, 0, "a"], + [84072, 0, "t"], + [84073, 0, " "], + [84074, 0, "t"], + [84075, 0, "h"], + [84076, 0, "e"], + [84077, 0, " "], + [84078, 0, "l"], + [84079, 0, "a"], + [84080, 0, "t"], + [84081, 0, "e"], + [84082, 0, "s"], + [84083, 0, "t"], + [84084, 0, ","], + [84085, 0, " "], + [84086, 0, "s"], + [84087, 0, "o"], + [84088, 0, " "], + [84089, 0, "t"], + [84090, 0, "h"], + [84091, 0, "e"], + [84092, 0, " "], + [84093, 0, "i"], + [84094, 0, "n"], + [84095, 0, "s"], + [84096, 0, "e"], + [84097, 0, "r"], + [84098, 0, "t"], + [84099, 0, "i"], + [84100, 0, "o"], + [84101, 0, "n"], + [84102, 0, " "], + [84103, 0, "p"], + [84104, 0, "o"], + [84105, 0, "s"], + [84106, 0, "i"], + [84107, 0, "t"], + [84108, 0, "i"], + [84109, 0, "o"], + [84110, 0, "n"], + [84111, 0, " "], + [84112, 0, "o"], + [84113, 0, "f"], + [84114, 0, " "], + [84115, 0, "$"], + [84116, 0, "o"], + [84117, 0, "_"], + [84118, 0, "s"], + [84119, 0, "$"], + [84120, 0, " "], + [84121, 0, "m"], + [84122, 0, "u"], + [84123, 0, "s"], + [84124, 0, "t"], + [84125, 0, " "], + [84126, 0, "a"], + [84127, 0, "p"], + [84128, 0, "p"], + [84129, 0, "e"], + [84130, 0, "a"], + [84131, 0, "r"], + [84132, 0, " "], + [84133, 0, "b"], + [84134, 0, "e"], + [84135, 0, "f"], + [84136, 0, "o"], + [84137, 0, "r"], + [84138, 0, "e"], + [84139, 0, " "], + [84140, 0, "$"], + [84141, 0, "o"], + [84142, 0, "_"], + [84143, 0, "r"], + [84144, 0, "$"], + [84145, 0, "."], + [84146, 0, " "], + [84147, 0, "I"], + [84148, 0, "t"], + [84149, 0, " "], + [84150, 0, "i"], + [84151, 0, "s"], + [84152, 0, " "], + [84153, 0, "n"], + [84154, 0, "o"], + [84155, 0, "t"], + [84156, 0, " "], + [84157, 0, "p"], + [84158, 0, "o"], + [84159, 0, "s"], + [84160, 0, "s"], + [84161, 0, "i"], + [84162, 0, "b"], + [84163, 0, "l"], + [84164, 0, "e"], + [84165, 0, " "], + [84166, 0, "f"], + [84167, 0, "o"], + [84168, 0, "r"], + [84169, 0, " "], + [84170, 0, "I"], + [84171, 0, "n"], + [84172, 0, "s"], + [84173, 0, "e"], + [84174, 0, "r"], + [84175, 0, "t"], + [84170, 0, "$"], + [84171, 0, "\\"], + [84172, 0, "m"], + [84173, 0, "a"], + [84174, 0, "t"], + [84175, 0, "h"], + [84175, 1], + [84174, 1], + [84173, 1], + [84172, 1], + [84172, 0, "t"], + [84173, 0, "e"], + [84174, 0, "x"], + [84175, 0, "t"], + [84176, 0, "s"], + [84177, 0, "c"], + [84178, 0, "{"], + [84185, 0, "}"], + [84186, 0, "_"], + [84187, 0, "2"], + [84188, 0, "$"], + [84189, 0, " "], + [84190, 0, "t"], + [84191, 0, "o"], + [84192, 0, " "], + [84193, 0, "s"], + [84194, 0, "k"], + [84195, 0, "i"], + [84196, 0, "p"], + [84197, 0, " "], + [84198, 0, "p"], + [84199, 0, "a"], + [84200, 0, "s"], + [84201, 0, "t"], + [84202, 0, " "], + [84203, 0, "o"], + [84203, 1], + [84203, 0, "$"], + [84204, 0, "o"], + [84205, 0, "_"], + [84206, 0, "r"], + [84207, 0, "$"], + [84208, 0, "."], + [84209, 0, "\n"], + [84210, 0, "\n"], + [84211, 0, "\\"], + [84212, 0, "i"], + [84213, 0, "t"], + [84214, 0, "e"], + [84215, 0, "m"], + [84216, 0, " "], + [84217, 0, "$"], + [84218, 0, "o"], + [84219, 0, "_"], + [84220, 0, "s"], + [84221, 0, "$"], + [84222, 0, " "], + [84223, 0, "i"], + [84224, 0, "s"], + [84225, 0, " "], + [84226, 0, "a"], + [84227, 0, "p"], + [84228, 0, "p"], + [84229, 0, "l"], + [84230, 0, "i"], + [84231, 0, "e"], + [84232, 0, "d"], + [84233, 0, " "], + [84234, 0, "b"], + [84235, 0, "e"], + [84236, 0, "f"], + [84237, 0, "o"], + [84238, 0, "r"], + [84239, 0, "e"], + [84240, 0, " "], + [84241, 0, "$"], + [84242, 0, "o"], + [84243, 0, "_"], + [84244, 0, "r"], + [84245, 0, "$"], + [84246, 0, " "], + [84247, 0, "i"], + [84248, 0, "n"], + [84249, 0, " "], + [84250, 0, "$"], + [84251, 0, "H"], + [84252, 0, "$"], + [84253, 0, "."], + [84254, 0, " "], + [84255, 0, "T"], + [84256, 0, "h"], + [84257, 0, "u"], + [84258, 0, "s"], + [84259, 0, ","], + [84260, 0, " "], + [84261, 0, "a"], + [84262, 0, "t"], + [84263, 0, " "], + [84264, 0, "t"], + [84265, 0, "h"], + [84266, 0, "e"], + [84267, 0, " "], + [84268, 0, "t"], + [84269, 0, "i"], + [84270, 0, "m"], + [84271, 0, "e"], + [84272, 0, " "], + [84273, 0, "w"], + [84274, 0, "h"], + [84275, 0, "e"], + [84276, 0, "n"], + [84277, 0, " "], + [84278, 0, "$"], + [84279, 0, "o"], + [84280, 0, "_"], + [84281, 0, "r"], + [84282, 0, "$"], + [84283, 0, " "], + [84284, 0, "i"], + [84285, 0, "s"], + [84286, 0, " "], + [84287, 0, "a"], + [84288, 0, "p"], + [84289, 0, "p"], + [84290, 0, "l"], + [84291, 0, "i"], + [84292, 0, "e"], + [84293, 0, "d"], + [84294, 0, ","], + [84295, 0, " "], + [84296, 0, "$"], + [84297, 0, "o"], + [84298, 0, "_"], + [84299, 0, "s"], + [84300, 0, "$"], + [84301, 0, " "], + [84302, 0, "h"], + [84303, 0, "a"], + [84304, 0, "s"], + [84305, 0, " "], + [84306, 0, "a"], + [84307, 0, "l"], + [84308, 0, "r"], + [84309, 0, "e"], + [84310, 0, "a"], + [84311, 0, "d"], + [84312, 0, "y"], + [84313, 0, " "], + [84314, 0, "b"], + [84315, 0, "e"], + [84316, 0, "e"], + [84317, 0, "n"], + [84318, 0, " "], + [84319, 0, "a"], + [84320, 0, "p"], + [84321, 0, "p"], + [84322, 0, "l"], + [84323, 0, "i"], + [84324, 0, "e"], + [84325, 0, "d"], + [84326, 0, "."], + [84327, 0, " "], + [84328, 0, "T"], + [84329, 0, "O"], + [84330, 0, "D"], + [84331, 0, "O"], + [84331, 1], + [84330, 1], + [84329, 1], + [84328, 1], + [84328, 0, "W"], + [84329, 0, "h"], + [84330, 0, "e"], + [84331, 0, "n"], + [84332, 0, " "], + [84333, 0, "a"], + [84334, 0, "p"], + [84335, 0, "p"], + [84336, 0, "l"], + [84337, 0, "y"], + [84338, 0, "i"], + [84339, 0, "n"], + [84340, 0, "g"], + [84341, 0, " "], + [84342, 0, "$"], + [84343, 0, "o"], + [84344, 0, "_"], + [84345, 0, "r"], + [84346, 0, "$"], + [84347, 0, ","], + [84348, 0, " "], + [84349, 0, "t"], + [84350, 0, "h"], + [84351, 0, "e"], + [84352, 0, " "], + [84353, 0, "r"], + [84354, 0, "u"], + [84355, 0, "l"], + [84356, 0, "e"], + [84357, 0, " "], + [84358, 0, "$"], + [84359, 0, "\\"], + [84360, 0, "t"], + [84361, 0, "e"], + [84362, 0, "x"], + [84363, 0, "t"], + [84364, 0, "s"], + [84365, 0, "c"], + [84366, 0, "{"], + [84367, 0, "I"], + [84368, 0, "n"], + [84369, 0, "s"], + [84370, 0, "e"], + [84371, 0, "r"], + [84372, 0, "t"], + [84373, 0, "_"], + [84373, 1], + [84373, 0, "}"], + [84374, 0, "_"], + [84375, 0, "2"], + [84376, 0, "$"], + [84377, 0, " "], + [84378, 0, "a"], + [84379, 0, "p"], + [84380, 0, "p"], + [84381, 0, "l"], + [84382, 0, "i"], + [84383, 0, "e"], + [84384, 0, "s"], + [84385, 0, " "], + [84386, 0, "w"], + [84387, 0, "i"], + [84388, 0, "t"], + [84389, 0, "h"], + [84390, 0, " "], + [84391, 0, "$"], + [84392, 0, "\\"], + [84393, 0, "m"], + [84394, 0, "a"], + [84395, 0, "t"], + [84396, 0, "h"], + [84397, 0, "i"], + [84398, 0, "t"], + [84399, 0, "{"], + [84400, 0, "n"], + [84401, 0, "e"], + [84402, 0, "x"], + [84403, 0, "t"], + [84404, 0, "}"], + [84405, 0, " "], + [84406, 0, "="], + [84407, 0, " "], + [84408, 0, "o"], + [84409, 0, "_"], + [84410, 0, "s"], + [84411, 0, "."], + [84412, 0, "\\"], + [84413, 0, "m"], + [84414, 0, "a"], + [84415, 0, "t"], + [84416, 0, "h"], + [84417, 0, "i"], + [84418, 0, "t"], + [84419, 0, "{"], + [84420, 0, "i"], + [84421, 0, "d"], + [84422, 0, "}"], + [84423, 0, "$"], + [84424, 0, " "], + [84424, 1], + [84424, 0, ","], + [84425, 0, " "], + [84426, 0, "s"], + [84427, 0, "o"], + [84428, 0, " "], + [84429, 0, "t"], + [84430, 0, "h"], + [84431, 0, "e"], + [84432, 0, " "], + [84433, 0, "r"], + [84434, 0, "u"], + [84435, 0, "l"], + [84436, 0, "e"], + [84437, 0, " "], + [84438, 0, "s"], + [84439, 0, "k"], + [84440, 0, "i"], + [84441, 0, "p"], + [84442, 0, "s"], + [84443, 0, " "], + [84444, 0, "o"], + [84445, 0, "v"], + [84446, 0, "e"], + [84447, 0, "r"], + [84448, 0, " "], + [84449, 0, "$"], + [84450, 0, "o"], + [84451, 0, "_"], + [84452, 0, "s"], + [84453, 0, "$"], + [84454, 0, " "], + [84455, 0, "a"], + [84456, 0, "n"], + [84457, 0, "d"], + [84458, 0, " "], + [84447, 1], + [84446, 1], + [84445, 1], + [84444, 1], + [84444, 0, "p"], + [84445, 0, "a"], + [84446, 0, "s"], + [84447, 0, "t"], + [84459, 0, "i"], + [84460, 0, "n"], + [84461, 0, "s"], + [84462, 0, "e"], + [84463, 0, "r"], + [84464, 0, "t"], + [84465, 0, "s"], + [84466, 0, " "], + [84467, 0, "$"], + [84468, 0, "o"], + [84469, 0, "_"], + [84470, 0, "r"], + [84471, 0, "$"], + [84472, 0, " "], + [84473, 0, "a"], + [84474, 0, "t"], + [84475, 0, " "], + [84476, 0, "a"], + [84477, 0, " "], + [84478, 0, "p"], + [84479, 0, "o"], + [84480, 0, "s"], + [84481, 0, "i"], + [84482, 0, "t"], + [84483, 0, "i"], + [84484, 0, "o"], + [84485, 0, "n"], + [84486, 0, " "], + [84487, 0, "a"], + [84488, 0, "f"], + [84489, 0, "t"], + [84490, 0, "e"], + [84491, 0, "r"], + [84492, 0, " "], + [84493, 0, "$"], + [84494, 0, "o"], + [84495, 0, "_"], + [84496, 0, "s"], + [84497, 0, "$"], + [84498, 0, "."], + [84499, 0, " "], + [84500, 0, "M"], + [84501, 0, "o"], + [84502, 0, "r"], + [84503, 0, "e"], + [84504, 0, "o"], + [84505, 0, "v"], + [84506, 0, "e"], + [84507, 0, "r"], + [84508, 0, ","], + [84509, 0, " "], + [84510, 0, "a"], + [84511, 0, "n"], + [84512, 0, "y"], + [84513, 0, " "], + [84514, 0, "l"], + [84515, 0, "i"], + [84516, 0, "s"], + [84517, 0, "t"], + [84518, 0, " "], + [84519, 0, "e"], + [84520, 0, "l"], + [84521, 0, "e"], + [84522, 0, "m"], + [84523, 0, "e"], + [84524, 0, "n"], + [84525, 0, "t"], + [84526, 0, "s"], + [84527, 0, " "], + [84528, 0, "b"], + [84529, 0, "e"], + [84530, 0, "t"], + [84531, 0, "w"], + [84532, 0, "e"], + [84533, 0, "e"], + [84534, 0, "n"], + [84535, 0, " "], + [84536, 0, "$"], + [84537, 0, "o"], + [84538, 0, "_"], + [84539, 0, "s"], + [84540, 0, "."], + [84541, 0, "\\"], + [84542, 0, "m"], + [84543, 0, "a"], + [84544, 0, "t"], + [84545, 0, "h"], + [84546, 0, "i"], + [84547, 0, "t"], + [84548, 0, "{"], + [84549, 0, "c"], + [84550, 0, "u"], + [84551, 0, "r"], + [84552, 0, "}"], + [84553, 0, "$"], + [84554, 0, " "], + [84555, 0, "a"], + [84556, 0, "n"], + [84557, 0, "d"], + [84558, 0, " "], + [84559, 0, "$"], + [84560, 0, "o"], + [84527, 0, " "], + [84528, 0, "t"], + [84529, 0, "h"], + [84530, 0, "a"], + [84531, 0, "t"], + [84532, 0, " "], + [84533, 0, "a"], + [84534, 0, "p"], + [84535, 0, "p"], + [84536, 0, "e"], + [84537, 0, "a"], + [84538, 0, "r"], + [84573, 0, "_"], + [84574, 0, "s"], + [84575, 0, "$"], + [84576, 0, " "], + [84577, 0, "a"], + [84578, 0, "t"], + [84579, 0, " "], + [84580, 0, "t"], + [84581, 0, "h"], + [84582, 0, "e"], + [84583, 0, " "], + [84584, 0, "t"], + [84585, 0, "i"], + [84586, 0, "m"], + [84587, 0, "e"], + [84588, 0, " "], + [84589, 0, "o"], + [84590, 0, "f"], + [84591, 0, " "], + [84592, 0, "i"], + [84593, 0, "n"], + [84594, 0, "s"], + [84595, 0, "e"], + [84596, 0, "r"], + [84597, 0, "t"], + [84598, 0, "i"], + [84599, 0, "n"], + [84600, 0, "g"], + [84601, 0, " "], + [84602, 0, "$"], + [84603, 0, "o"], + [84604, 0, "_"], + [84605, 0, "r"], + [84606, 0, "$"], + [84607, 0, " "], + [84608, 0, "m"], + [84609, 0, "u"], + [84610, 0, "s"], + [84611, 0, "t"], + [84612, 0, " "], + [84613, 0, "h"], + [84614, 0, "a"], + [84615, 0, "v"], + [84616, 0, "e"], + [84617, 0, " "], + [84618, 0, "a"], + [84619, 0, " "], + [84620, 0, "L"], + [84621, 0, "a"], + [84622, 0, "m"], + [84623, 0, "p"], + [84624, 0, "o"], + [84625, 0, "r"], + [84626, 0, "t"], + [84627, 0, " "], + [84628, 0, "t"], + [84629, 0, "i"], + [84630, 0, "m"], + [84631, 0, "e"], + [84632, 0, "s"], + [84633, 0, "t"], + [84634, 0, "a"], + [84635, 0, "m"], + [84636, 0, "p"], + [84637, 0, " "], + [84638, 0, "g"], + [84639, 0, "r"], + [84640, 0, "e"], + [84641, 0, "a"], + [84642, 0, "t"], + [84643, 0, "e"], + [84644, 0, "r"], + [84645, 0, " "], + [84646, 0, "t"], + [84647, 0, "h"], + [84648, 0, "a"], + [84649, 0, "t"], + [84650, 0, "n"], + [84650, 1], + [84649, 1], + [84649, 0, "n"], + [84650, 0, " "], + [84651, 0, "$"], + [84652, 0, "o"], + [84653, 0, "_"], + [84654, 0, "s"], + [84655, 0, "."], + [84656, 0, "\\"], + [84657, 0, "m"], + [84658, 0, "a"], + [84659, 0, "t"], + [84660, 0, "h"], + [84661, 0, "i"], + [84662, 0, "t"], + [84663, 0, "{"], + [84664, 0, "i"], + [84665, 0, "d"], + [84666, 0, "}"], + [84667, 0, "$"], + [84668, 0, ","], + [84669, 0, " "], + [84670, 0, "b"], + [84671, 0, "e"], + [84672, 0, "c"], + [84673, 0, "a"], + [84674, 0, "u"], + [84675, 0, "s"], + [84676, 0, "e"], + [84677, 0, " "], + [84677, 1], + [84676, 1], + [84675, 1], + [84674, 1], + [84673, 1], + [84672, 1], + [84671, 1], + [84670, 1], + [84670, 0, "s"], + [84671, 0, "o"], + [84672, 0, " "], + [84673, 0, "$"], + [84674, 0, "'"], + [84674, 1], + [84674, 0, "\\"], + [84675, 0, "t"], + [84676, 0, "e"], + [84677, 0, "x"], + [84678, 0, "t"], + [84679, 0, "s"], + [84680, 0, "c"], + [84681, 0, "{"], + [84682, 0, "I"], + [84683, 0, "n"], + [84684, 0, "s"], + [84685, 0, "e"], + [84686, 0, "r"], + [84687, 0, "t"], + [84688, 0, "}"], + [84689, 0, "_"], + [84690, 0, "2"], + [84691, 0, "$"], + [84692, 0, " "], + [84693, 0, "a"], + [84694, 0, "l"], + [84695, 0, "s"], + [84696, 0, "o"], + [84697, 0, " "], + [84698, 0, "s"], + [84699, 0, "k"], + [84700, 0, "i"], + [84701, 0, "p"], + [84702, 0, "s"], + [84703, 0, " "], + [84704, 0, "o"], + [84705, 0, "v"], + [84706, 0, "e"], + [84707, 0, "r"], + [84708, 0, " "], + [84709, 0, "t"], + [84710, 0, "h"], + [84711, 0, "o"], + [84712, 0, "s"], + [84713, 0, "e"], + [84714, 0, " "], + [84715, 0, "l"], + [84716, 0, "i"], + [84717, 0, "s"], + [84718, 0, "t"], + [84719, 0, " "], + [84720, 0, "e"], + [84721, 0, "l"], + [84722, 0, "e"], + [84723, 0, "m"], + [84724, 0, "e"], + [84725, 0, "n"], + [84726, 0, "t"], + [84727, 0, "s"], + [84728, 0, " "], + [84729, 0, "w"], + [84730, 0, "h"], + [84731, 0, "e"], + [84732, 0, "n"], + [84733, 0, " "], + [84734, 0, "i"], + [84735, 0, "n"], + [84736, 0, "s"], + [84737, 0, "e"], + [84738, 0, "r"], + [84739, 0, "t"], + [84740, 0, "i"], + [84741, 0, "n"], + [84742, 0, "g"], + [84743, 0, " "], + [84744, 0, "$"], + [84745, 0, "o"], + [84746, 0, "_"], + [84747, 0, "r"], + [84748, 0, "$"], + [84749, 0, "."], + [84750, 0, " "], + [84751, 0, "T"], + [84752, 0, "h"], + [84753, 0, "u"], + [84754, 0, "s"], + [84755, 0, ","], + [84756, 0, " "], + [84757, 0, "t"], + [84758, 0, "h"], + [84759, 0, "e"], + [84760, 0, " "], + [84761, 0, "i"], + [84762, 0, "n"], + [84763, 0, "s"], + [84764, 0, "e"], + [84765, 0, "r"], + [84766, 0, "t"], + [84767, 0, "i"], + [84768, 0, "o"], + [84769, 0, "n"], + [84770, 0, " "], + [84771, 0, "p"], + [84772, 0, "o"], + [84773, 0, "s"], + [84774, 0, "i"], + [84775, 0, "t"], + [84776, 0, "i"], + [84777, 0, "o"], + [84778, 0, "n"], + [84779, 0, " "], + [84780, 0, "o"], + [84781, 0, "f"], + [84782, 0, " "], + [84783, 0, "$"], + [84784, 0, "o"], + [84785, 0, "_"], + [84786, 0, "r"], + [84787, 0, "$"], + [84788, 0, " "], + [84789, 0, "m"], + [84790, 0, "u"], + [84791, 0, "s"], + [84792, 0, "t"], + [84793, 0, " "], + [84794, 0, "b"], + [84795, 0, "e"], + [84796, 0, " "], + [84797, 0, "a"], + [84798, 0, "f"], + [84799, 0, "t"], + [84800, 0, "e"], + [84801, 0, "r"], + [84802, 0, " "], + [84803, 0, "$"], + [84804, 0, "o"], + [84805, 0, "_"], + [84806, 0, "s"], + [84807, 0, "$"], + [84808, 0, "."], + [84826, 0, "\n"], + [84826, 0, "\n"], + [84827, 0, "I"], + [84828, 0, "n"], + [84829, 0, " "], + [84830, 0, "b"], + [84831, 0, "o"], + [84832, 0, "t"], + [84833, 0, "h"], + [84834, 0, " "], + [84835, 0, "c"], + [84836, 0, "a"], + [84837, 0, "s"], + [84838, 0, "e"], + [84839, 0, "s"], + [84840, 0, ","], + [84841, 0, " "], + [84842, 0, "t"], + [84843, 0, "h"], + [84844, 0, "e"], + [84845, 0, " "], + [84846, 0, "i"], + [84847, 0, "n"], + [84848, 0, "s"], + [84849, 0, "e"], + [84850, 0, "r"], + [84851, 0, "t"], + [84852, 0, "i"], + [84853, 0, "o"], + [84854, 0, "n"], + [84855, 0, " "], + [84856, 0, "p"], + [84857, 0, "o"], + [84858, 0, "s"], + [84859, 0, "i"], + [84860, 0, "t"], + [84861, 0, "i"], + [84862, 0, "o"], + [84863, 0, "n"], + [84864, 0, " "], + [84865, 0, "o"], + [84866, 0, "f"], + [84867, 0, " "], + [84868, 0, "$"], + [84869, 0, "o"], + [84870, 0, "_"], + [84871, 0, "r"], + [84872, 0, "$"], + [84873, 0, " "], + [84874, 0, "a"], + [84875, 0, "p"], + [84876, 0, "p"], + [84877, 0, "e"], + [84878, 0, "a"], + [84879, 0, "r"], + [84880, 0, "s"], + [84881, 0, " "], + [84882, 0, "a"], + [84883, 0, "f"], + [84884, 0, "t"], + [84885, 0, "e"], + [84886, 0, "r"], + [84887, 0, " "], + [84888, 0, "t"], + [84889, 0, "h"], + [84890, 0, "e"], + [84891, 0, " "], + [84892, 0, "i"], + [84893, 0, "n"], + [84894, 0, "s"], + [84895, 0, "e"], + [84896, 0, "r"], + [84897, 0, "t"], + [84898, 0, "i"], + [84899, 0, "o"], + [84900, 0, "n"], + [84901, 0, " "], + [84902, 0, "p"], + [84903, 0, "o"], + [84904, 0, "s"], + [84905, 0, "i"], + [84906, 0, "t"], + [84907, 0, "i"], + [84908, 0, "o"], + [84909, 0, "n"], + [84910, 0, " "], + [84911, 0, "o"], + [84912, 0, "f"], + [84913, 0, " "], + [84914, 0, "$"], + [84915, 0, "o"], + [84916, 0, "_"], + [84917, 0, "s"], + [84918, 0, "$"], + [84919, 0, "."], + [84920, 0, " "], + [84920, 1], + [84919, 1], + [84840, 1], + [84839, 1], + [84838, 1], + [84837, 1], + [84836, 1], + [84835, 1], + [84834, 1], + [84833, 1], + [84832, 1], + [84831, 1], + [84830, 1], + [84829, 1], + [84828, 1], + [84827, 1], + [84827, 0, "T"], + [84828, 0, "h"], + [84829, 0, "u"], + [84830, 0, "s"], + [84831, 0, ","], + [84910, 0, ","], + [84911, 0, " "], + [84912, 0, "r"], + [84913, 0, "e"], + [84914, 0, "g"], + [84915, 0, "a"], + [84916, 0, "r"], + [84917, 0, "d"], + [84918, 0, "l"], + [84919, 0, "e"], + [84920, 0, "s"], + [84921, 0, "s"], + [84922, 0, " "], + [84923, 0, "o"], + [84924, 0, "f"], + [84925, 0, " "], + [84926, 0, "t"], + [84927, 0, "h"], + [84928, 0, "e"], + [84929, 0, " "], + [84930, 0, "o"], + [84931, 0, "r"], + [84932, 0, "d"], + [84933, 0, "e"], + [84934, 0, "r"], + [84935, 0, " "], + [84936, 0, "i"], + [84937, 0, "n"], + [84938, 0, " "], + [84939, 0, "w"], + [84940, 0, "h"], + [84941, 0, "i"], + [84942, 0, "c"], + [84943, 0, "h"], + [84944, 0, " "], + [84945, 0, "t"], + [84946, 0, "h"], + [84947, 0, "e"], + [84948, 0, " "], + [84949, 0, "t"], + [84950, 0, "w"], + [84951, 0, "o"], + [84952, 0, " "], + [84953, 0, "o"], + [84954, 0, "p"], + [84955, 0, "e"], + [84956, 0, "r"], + [84957, 0, "a"], + [84958, 0, "t"], + [84959, 0, "i"], + [84960, 0, "o"], + [84961, 0, "n"], + [84962, 0, "s"], + [84963, 0, " "], + [84964, 0, "a"], + [84965, 0, "r"], + [84966, 0, "e"], + [84967, 0, " "], + [84968, 0, "a"], + [84969, 0, "p"], + [84970, 0, "p"], + [84971, 0, "l"], + [84972, 0, "i"], + [84973, 0, "e"], + [84974, 0, "d"], + [84975, 0, "."], + [84976, 0, " "], + [84977, 0, "S"], + [84977, 1], + [84977, 0, "T"], + [84978, 0, "h"], + [84979, 0, "e"], + [84980, 0, " "], + [84981, 0, "o"], + [84982, 0, "r"], + [84983, 0, "d"], + [84984, 0, "e"], + [84985, 0, "r"], + [84986, 0, "i"], + [84987, 0, "n"], + [84988, 0, "g"], + [84989, 0, " "], + [84990, 0, "d"], + [84991, 0, "e"], + [84992, 0, "p"], + [84993, 0, "e"], + [84994, 0, "n"], + [84995, 0, "d"], + [84996, 0, "s"], + [84997, 0, " "], + [84998, 0, "o"], + [84999, 0, "n"], + [85000, 0, "l"], + [85001, 0, "y"], + [85002, 0, " "], + [85003, 0, "o"], + [85004, 0, "n"], + [85005, 0, " "], + [85006, 0, "t"], + [85007, 0, "h"], + [85008, 0, "e"], + [85009, 0, " "], + [85010, 0, "o"], + [85011, 0, "p"], + [85012, 0, "e"], + [85013, 0, "r"], + [85014, 0, "a"], + [85015, 0, "t"], + [85016, 0, "i"], + [85017, 0, "o"], + [85018, 0, "n"], + [85019, 0, " "], + [85020, 0, "I"], + [85021, 0, "D"], + [85022, 0, "s"], + [85023, 0, ","], + [85024, 0, " "], + [85025, 0, "a"], + [85026, 0, "n"], + [85027, 0, "d"], + [85028, 0, " "], + [85029, 0, "s"], + [85030, 0, "i"], + [85031, 0, "n"], + [85032, 0, "c"], + [85033, 0, "e"], + [85034, 0, " "], + [85035, 0, "t"], + [85036, 0, "h"], + [85037, 0, "e"], + [85038, 0, "s"], + [85039, 0, "e"], + [85040, 0, " "], + [85041, 0, "I"], + [85042, 0, "D"], + [85043, 0, "s"], + [85044, 0, " "], + [85045, 0, "a"], + [85046, 0, "r"], + [85047, 0, "e"], + [85048, 0, " "], + [85049, 0, "f"], + [85050, 0, "i"], + [85051, 0, "x"], + [85052, 0, "e"], + [85053, 0, "d"], + [85054, 0, " "], + [85055, 0, "a"], + [85056, 0, "t"], + [85057, 0, " "], + [85058, 0, "t"], + [85059, 0, "h"], + [85060, 0, "e"], + [85061, 0, " "], + [85062, 0, "t"], + [85063, 0, "o"], + [85064, 0, "m"], + [85064, 1], + [85063, 1], + [85063, 0, "i"], + [85064, 0, "m"], + [85065, 0, "e"], + [85066, 0, " "], + [85067, 0, "t"], + [85068, 0, "h"], + [85069, 0, "e"], + [85070, 0, " "], + [85071, 0, "o"], + [85072, 0, "p"], + [85073, 0, "e"], + [85074, 0, "r"], + [85075, 0, "a"], + [85076, 0, "t"], + [85077, 0, "i"], + [85078, 0, "o"], + [85079, 0, "n"], + [85080, 0, "s"], + [85081, 0, " "], + [85082, 0, "a"], + [85083, 0, "r"], + [85084, 0, "e"], + [85085, 0, " "], + [85086, 0, "g"], + [85087, 0, "e"], + [85088, 0, "n"], + [85089, 0, "e"], + [85090, 0, "r"], + [85091, 0, "a"], + [85092, 0, "t"], + [85093, 0, "e"], + [85094, 0, "d"], + [85095, 0, ","], + [85096, 0, " "], + [85097, 0, "t"], + [85098, 0, "h"], + [85099, 0, "e"], + [85100, 0, " "], + [85101, 0, "l"], + [85102, 0, "i"], + [85103, 0, "s"], + [85104, 0, "t"], + [85105, 0, " "], + [85106, 0, "o"], + [85107, 0, "r"], + [85108, 0, "d"], + [85109, 0, "e"], + [85110, 0, "r"], + [85111, 0, " "], + [85112, 0, "i"], + [85113, 0, "s"], + [85114, 0, " "], + [85115, 0, "d"], + [85116, 0, "e"], + [85117, 0, "t"], + [85118, 0, "e"], + [85119, 0, "r"], + [85120, 0, "m"], + [85121, 0, "i"], + [85122, 0, "n"], + [85123, 0, "e"], + [85124, 0, "d"], + [85125, 0, " "], + [85126, 0, "b"], + [85127, 0, "y"], + [85128, 0, " "], + [85129, 0, "t"], + [85130, 0, "h"], + [85131, 0, "e"], + [85132, 0, " "], + [85133, 0, "I"], + [85134, 0, "D"], + [85135, 0, "s"], + [85136, 0, "."], + [86954, 1], + [86953, 1], + [86952, 1], + [86951, 1], + [86950, 1], + [86949, 1], + [86948, 1], + [86947, 1], + [86946, 1], + [86945, 1], + [86944, 1], + [86943, 1], + [86942, 1], + [86941, 1], + [86940, 1], + [86939, 1], + [86938, 1], + [86937, 1], + [86936, 1], + [86935, 1], + [86934, 1], + [86933, 1], + [86932, 1], + [86931, 1], + [86930, 1], + [86929, 1], + [86928, 1], + [86927, 1], + [86926, 1], + [86925, 1], + [86924, 1], + [86923, 1], + [86922, 1], + [86921, 1], + [86920, 1], + [86919, 1], + [86918, 1], + [86917, 1], + [86916, 1], + [86915, 1], + [86914, 1], + [86913, 1], + [86912, 1], + [86911, 1], + [86910, 1], + [86909, 1], + [86908, 1], + [86907, 1], + [86906, 1], + [86905, 1], + [86904, 1], + [86903, 1], + [86902, 1], + [86901, 1], + [86900, 1], + [86899, 1], + [86898, 1], + [86897, 1], + [86896, 1], + [86895, 1], + [86894, 1], + [86893, 1], + [86892, 1], + [86891, 1], + [86890, 1], + [86889, 1], + [86888, 1], + [86887, 1], + [86886, 1], + [86885, 1], + [86884, 1], + [86883, 1], + [86882, 1], + [86881, 1], + [86880, 1], + [86879, 1], + [86878, 1], + [86877, 1], + [86876, 1], + [86875, 1], + [86874, 1], + [86873, 1], + [86872, 1], + [86871, 1], + [86870, 1], + [86869, 1], + [86868, 1], + [86867, 1], + [86866, 1], + [86865, 1], + [86864, 1], + [86863, 1], + [86862, 1], + [86861, 1], + [86858, 1], + [86857, 1], + [86856, 1], + [86855, 1], + [86854, 1], + [86853, 1], + [86852, 1], + [86851, 1], + [86850, 1], + [86849, 1], + [86848, 1], + [86847, 1], + [86846, 1], + [86845, 1], + [86844, 1], + [86843, 1], + [86842, 1], + [86841, 1], + [86840, 1], + [86839, 1], + [86838, 1], + [86837, 1], + [86836, 1], + [86835, 1], + [86834, 1], + [86833, 1], + [86832, 1], + [86831, 1], + [86830, 1], + [86829, 1], + [86828, 1], + [86827, 1], + [86826, 1], + [86825, 1], + [86824, 1], + [86823, 1], + [86822, 1], + [86821, 1], + [86820, 1], + [86819, 1], + [86818, 1], + [86817, 1], + [86816, 1], + [86815, 1], + [86814, 1], + [86813, 1], + [86812, 1], + [86811, 1], + [86810, 1], + [86809, 1], + [86808, 1], + [86807, 1], + [86806, 1], + [86805, 1], + [86804, 1], + [86803, 1], + [86802, 1], + [86801, 1], + [86800, 1], + [86799, 1], + [86798, 1], + [86797, 1], + [86796, 1], + [86795, 1], + [86794, 1], + [86793, 1], + [86792, 1], + [86791, 1], + [86790, 1], + [86789, 1], + [86788, 1], + [86787, 1], + [86786, 1], + [86785, 1], + [86784, 1], + [86783, 1], + [86782, 1], + [86781, 1], + [86780, 1], + [86779, 1], + [86778, 1], + [86777, 1], + [86776, 1], + [86775, 1], + [86774, 1], + [86773, 1], + [86772, 1], + [86771, 1], + [86770, 1], + [86769, 1], + [86768, 1], + [86767, 1], + [86766, 1], + [86765, 1], + [86764, 1], + [86763, 1], + [86762, 1], + [86761, 1], + [86760, 1], + [86759, 1], + [86758, 1], + [86757, 1], + [86756, 1], + [86755, 1], + [86754, 1], + [86753, 1], + [86752, 1], + [86751, 1], + [86750, 1], + [86749, 1], + [86748, 1], + [86747, 1], + [86746, 1], + [86745, 1], + [86744, 1], + [86743, 1], + [86742, 1], + [86741, 1], + [86740, 1], + [86739, 1], + [86738, 1], + [86737, 1], + [86736, 1], + [86735, 1], + [86734, 1], + [86733, 1], + [86732, 1], + [86731, 1], + [86730, 1], + [86729, 1], + [86728, 1], + [86727, 1], + [86726, 1], + [86725, 1], + [86724, 1], + [86723, 1], + [86722, 1], + [86721, 1], + [86720, 1], + [86719, 1], + [86718, 1], + [86717, 1], + [86716, 1], + [86715, 1], + [86714, 1], + [86713, 1], + [86712, 1], + [86711, 1], + [86710, 1], + [86709, 1], + [86708, 1], + [86707, 1], + [86706, 1], + [86705, 1], + [86704, 1], + [86703, 1], + [86702, 1], + [86701, 1], + [86700, 1], + [86699, 1], + [86698, 1], + [86697, 1], + [86696, 1], + [86695, 1], + [86694, 1], + [86693, 1], + [86692, 1], + [86691, 1], + [86690, 1], + [86689, 1], + [86688, 1], + [86687, 1], + [86686, 1], + [86685, 1], + [86684, 1], + [86683, 1], + [86682, 1], + [86681, 1], + [86680, 1], + [86679, 1], + [86678, 1], + [86677, 1], + [86676, 1], + [86675, 1], + [86674, 1], + [86673, 1], + [86672, 1], + [86671, 1], + [86670, 1], + [86669, 1], + [86668, 1], + [86667, 1], + [86666, 1], + [86665, 1], + [86664, 1], + [86663, 1], + [86662, 1], + [86661, 1], + [86660, 1], + [86659, 1], + [86658, 1], + [86657, 1], + [86656, 1], + [86655, 1], + [86654, 1], + [86653, 1], + [86652, 1], + [86651, 1], + [86650, 1], + [86649, 1], + [86648, 1], + [86647, 1], + [86646, 1], + [86645, 1], + [86644, 1], + [86643, 1], + [86642, 1], + [86641, 1], + [86640, 1], + [86639, 1], + [86638, 1], + [86637, 1], + [86636, 1], + [86635, 1], + [86634, 1], + [86633, 1], + [86632, 1], + [86631, 1], + [86630, 1], + [86629, 1], + [86628, 1], + [86627, 1], + [86626, 1], + [86625, 1], + [86624, 1], + [86623, 1], + [86622, 1], + [86621, 1], + [86620, 1], + [86619, 1], + [86618, 1], + [86617, 1], + [86616, 1], + [86615, 1], + [86614, 1], + [86613, 1], + [86612, 1], + [86611, 1], + [86610, 1], + [86609, 1], + [86608, 1], + [86607, 1], + [86606, 1], + [86605, 1], + [86604, 1], + [86603, 1], + [86602, 1], + [86601, 1], + [86600, 1], + [86599, 1], + [86598, 1], + [86597, 1], + [86596, 1], + [86595, 1], + [86594, 1], + [86593, 1], + [86592, 1], + [86591, 1], + [86590, 1], + [86589, 1], + [86588, 1], + [86587, 1], + [86586, 1], + [86585, 1], + [86584, 1], + [86583, 1], + [86582, 1], + [86581, 1], + [86580, 1], + [86579, 1], + [86578, 1], + [86577, 1], + [86576, 1], + [86575, 1], + [86574, 1], + [86573, 1], + [86572, 1], + [86571, 1], + [86570, 1], + [86569, 1], + [86568, 1], + [86567, 1], + [86566, 1], + [86565, 1], + [86564, 1], + [86563, 1], + [86562, 1], + [86561, 1], + [86560, 1], + [86559, 1], + [86558, 1], + [86557, 1], + [86556, 1], + [86555, 1], + [86554, 1], + [86553, 1], + [86552, 1], + [86551, 1], + [86550, 1], + [86549, 1], + [86548, 1], + [86547, 1], + [86546, 1], + [86545, 1], + [86544, 1], + [86543, 1], + [86542, 1], + [86541, 1], + [86540, 1], + [86539, 1], + [86538, 1], + [86537, 1], + [86536, 1], + [86535, 1], + [86534, 1], + [86533, 1], + [86532, 1], + [86531, 1], + [86530, 1], + [86529, 1], + [86528, 1], + [86527, 1], + [86526, 1], + [86525, 1], + [86524, 1], + [86523, 1], + [86522, 1], + [86521, 1], + [86520, 1], + [86519, 1], + [86518, 1], + [86517, 1], + [86516, 1], + [86515, 1], + [86514, 1], + [86513, 1], + [86512, 1], + [86511, 1], + [86510, 1], + [86509, 1], + [86508, 1], + [86507, 1], + [86506, 1], + [86505, 1], + [86504, 1], + [86503, 1], + [86502, 1], + [86501, 1], + [86500, 1], + [86499, 1], + [86498, 1], + [86497, 1], + [86496, 1], + [86495, 1], + [86494, 1], + [86493, 1], + [86492, 1], + [86491, 1], + [86490, 1], + [86489, 1], + [86488, 1], + [86487, 1], + [86486, 1], + [86485, 1], + [86484, 1], + [86483, 1], + [86482, 1], + [86481, 1], + [86480, 1], + [86479, 1], + [86478, 1], + [86477, 1], + [86476, 1], + [86475, 1], + [86474, 1], + [86473, 1], + [86472, 1], + [86471, 1], + [86470, 1], + [86469, 1], + [86468, 1], + [86467, 1], + [86466, 1], + [86465, 1], + [86464, 1], + [86463, 1], + [86462, 1], + [86461, 1], + [86460, 1], + [86459, 1], + [86458, 1], + [86457, 1], + [86456, 1], + [86455, 1], + [86454, 1], + [86453, 1], + [86452, 1], + [86451, 1], + [86450, 1], + [86449, 1], + [86448, 1], + [86447, 1], + [86446, 1], + [86445, 1], + [86444, 1], + [86443, 1], + [86442, 1], + [86441, 1], + [86440, 1], + [86439, 1], + [86438, 1], + [86437, 1], + [86436, 1], + [86435, 1], + [86434, 1], + [86433, 1], + [86432, 1], + [86431, 1], + [86430, 1], + [86429, 1], + [86428, 1], + [86427, 1], + [86426, 1], + [86425, 1], + [86424, 1], + [86423, 1], + [86422, 1], + [86421, 1], + [86420, 1], + [86419, 1], + [86418, 1], + [86417, 1], + [86416, 1], + [86415, 1], + [86414, 1], + [86413, 1], + [86412, 1], + [86411, 1], + [86410, 1], + [86409, 1], + [86408, 1], + [86407, 1], + [86406, 1], + [86405, 1], + [86404, 1], + [86403, 1], + [86402, 1], + [86401, 1], + [86400, 1], + [86399, 1], + [86398, 1], + [86397, 1], + [86396, 1], + [86395, 1], + [86394, 1], + [86393, 1], + [86392, 1], + [86391, 1], + [86390, 1], + [86389, 1], + [86388, 1], + [86387, 1], + [86386, 1], + [86385, 1], + [86384, 1], + [86383, 1], + [86382, 1], + [86381, 1], + [86380, 1], + [86379, 1], + [86378, 1], + [86377, 1], + [86376, 1], + [86375, 1], + [86374, 1], + [86373, 1], + [86372, 1], + [86371, 1], + [86370, 1], + [86369, 1], + [86368, 1], + [86367, 1], + [86366, 1], + [86365, 1], + [86364, 1], + [86363, 1], + [86362, 1], + [86361, 1], + [86360, 1], + [86359, 1], + [86358, 1], + [86357, 1], + [86356, 1], + [86355, 1], + [86354, 1], + [86353, 1], + [86352, 1], + [86351, 1], + [86350, 1], + [86349, 1], + [86348, 1], + [86347, 1], + [86346, 1], + [86345, 1], + [86344, 1], + [86343, 1], + [86342, 1], + [86341, 1], + [86340, 1], + [86339, 1], + [86338, 1], + [86337, 1], + [86336, 1], + [86335, 1], + [86334, 1], + [86333, 1], + [86332, 1], + [86331, 1], + [86330, 1], + [86329, 1], + [86328, 1], + [86327, 1], + [86326, 1], + [86325, 1], + [86324, 1], + [86323, 1], + [86322, 1], + [86321, 1], + [86320, 1], + [86319, 1], + [86318, 1], + [86317, 1], + [86316, 1], + [86315, 1], + [86314, 1], + [86313, 1], + [86312, 1], + [86311, 1], + [86310, 1], + [86309, 1], + [86308, 1], + [86307, 1], + [86306, 1], + [86305, 1], + [86304, 1], + [86303, 1], + [86302, 1], + [86301, 1], + [86300, 1], + [86299, 1], + [86298, 1], + [86297, 1], + [86296, 1], + [86295, 1], + [86294, 1], + [86293, 1], + [86292, 1], + [86291, 1], + [86290, 1], + [86289, 1], + [86288, 1], + [86287, 1], + [86286, 1], + [86285, 1], + [86284, 1], + [86283, 1], + [86282, 1], + [86281, 1], + [86280, 1], + [86279, 1], + [86278, 1], + [86277, 1], + [86276, 1], + [86275, 1], + [86274, 1], + [86273, 1], + [86272, 1], + [86271, 1], + [86270, 1], + [86269, 1], + [86268, 1], + [86267, 1], + [86266, 1], + [86265, 1], + [86264, 1], + [86263, 1], + [86262, 1], + [86261, 1], + [86260, 1], + [86259, 1], + [86258, 1], + [86257, 1], + [86256, 1], + [86255, 1], + [86254, 1], + [86253, 1], + [86252, 1], + [86251, 1], + [86250, 1], + [86249, 1], + [86248, 1], + [86247, 1], + [86246, 1], + [86245, 1], + [86244, 1], + [86243, 1], + [86242, 1], + [86241, 1], + [86240, 1], + [86239, 1], + [86238, 1], + [86237, 1], + [86236, 1], + [86235, 1], + [86234, 1], + [86233, 1], + [86232, 1], + [86231, 1], + [86230, 1], + [86229, 1], + [86228, 1], + [86227, 1], + [86226, 1], + [86225, 1], + [86224, 1], + [86223, 1], + [86222, 1], + [86221, 1], + [86220, 1], + [86219, 1], + [86218, 1], + [86217, 1], + [86216, 1], + [86215, 1], + [86214, 1], + [86213, 1], + [86212, 1], + [86211, 1], + [86210, 1], + [86209, 1], + [86208, 1], + [86207, 1], + [86206, 1], + [86205, 1], + [86204, 1], + [86203, 1], + [86202, 1], + [86201, 1], + [86200, 1], + [86199, 1], + [86198, 1], + [86197, 1], + [86196, 1], + [86195, 1], + [86194, 1], + [86193, 1], + [86192, 1], + [86191, 1], + [86190, 1], + [86189, 1], + [86188, 1], + [86187, 1], + [86186, 1], + [86185, 1], + [86184, 1], + [86183, 1], + [86182, 1], + [86181, 1], + [86180, 1], + [86179, 1], + [86178, 1], + [86177, 1], + [86176, 1], + [86175, 1], + [86174, 1], + [86173, 1], + [86172, 1], + [86171, 1], + [86170, 1], + [86169, 1], + [86168, 1], + [86167, 1], + [86166, 1], + [86165, 1], + [86164, 1], + [86163, 1], + [86162, 1], + [86161, 1], + [86160, 1], + [86159, 1], + [86158, 1], + [86157, 1], + [86156, 1], + [86155, 1], + [86154, 1], + [86153, 1], + [86152, 1], + [86151, 1], + [86150, 1], + [86149, 1], + [86148, 1], + [86147, 1], + [86146, 1], + [86145, 1], + [86144, 1], + [86143, 1], + [86142, 1], + [86141, 1], + [86140, 1], + [86139, 1], + [86138, 1], + [86137, 1], + [86136, 1], + [86135, 1], + [86134, 1], + [86133, 1], + [86132, 1], + [86131, 1], + [86130, 1], + [86129, 1], + [86128, 1], + [86127, 1], + [86126, 1], + [86125, 1], + [86124, 1], + [86123, 1], + [86122, 1], + [86121, 1], + [86120, 1], + [86119, 1], + [86118, 1], + [86117, 1], + [86116, 1], + [86115, 1], + [86114, 1], + [86113, 1], + [86112, 1], + [86111, 1], + [86110, 1], + [86109, 1], + [86108, 1], + [86107, 1], + [86106, 1], + [86105, 1], + [86104, 1], + [86103, 1], + [86102, 1], + [86101, 1], + [86100, 1], + [86099, 1], + [86098, 1], + [86097, 1], + [86096, 1], + [86095, 1], + [86094, 1], + [86093, 1], + [86092, 1], + [86091, 1], + [86090, 1], + [86089, 1], + [86088, 1], + [86087, 1], + [86086, 1], + [86085, 1], + [86084, 1], + [86083, 1], + [86082, 1], + [86081, 1], + [86080, 1], + [86079, 1], + [86078, 1], + [86077, 1], + [86076, 1], + [86075, 1], + [86074, 1], + [86073, 1], + [86072, 1], + [86071, 1], + [86070, 1], + [86069, 1], + [86068, 1], + [86067, 1], + [86066, 1], + [86065, 1], + [86064, 1], + [86063, 1], + [86062, 1], + [86061, 1], + [86060, 1], + [86059, 1], + [86058, 1], + [86057, 1], + [86056, 1], + [86055, 1], + [86054, 1], + [86053, 1], + [86052, 1], + [86051, 1], + [86050, 1], + [86049, 1], + [86048, 1], + [86047, 1], + [86046, 1], + [86045, 1], + [86044, 1], + [86043, 1], + [86042, 1], + [86041, 1], + [86040, 1], + [86039, 1], + [86038, 1], + [86037, 1], + [86036, 1], + [86035, 1], + [86034, 1], + [86033, 1], + [86032, 1], + [86031, 1], + [86030, 1], + [86029, 1], + [86028, 1], + [86027, 1], + [86026, 1], + [86025, 1], + [86024, 1], + [86023, 1], + [86022, 1], + [86021, 1], + [86020, 1], + [86019, 1], + [86018, 1], + [86017, 1], + [86016, 1], + [86015, 1], + [86014, 1], + [86013, 1], + [86012, 1], + [86011, 1], + [86010, 1], + [86009, 1], + [86008, 1], + [86007, 1], + [86006, 1], + [86005, 1], + [86004, 1], + [86003, 1], + [86002, 1], + [86001, 1], + [86000, 1], + [85999, 1], + [85998, 1], + [85997, 1], + [85996, 1], + [85995, 1], + [85994, 1], + [85993, 1], + [85992, 1], + [85991, 1], + [85990, 1], + [85989, 1], + [85988, 1], + [85987, 1], + [85986, 1], + [85985, 1], + [85984, 1], + [85983, 1], + [85982, 1], + [85981, 1], + [85980, 1], + [85979, 1], + [85978, 1], + [85977, 1], + [85977, 0, "E"], + [85978, 0, "i"], + [85979, 0, "t"], + [85980, 0, "h"], + [85981, 0, "e"], + [85982, 0, "r"], + [85983, 0, " "], + [85983, 1], + [85982, 1], + [85981, 1], + [85980, 1], + [85979, 1], + [85978, 1], + [85977, 1], + [85977, 0, "I"], + [85978, 0, "f"], + [85979, 0, " "], + [85980, 0, "$"], + [85981, 0, "o"], + [85982, 0, "_"], + [85983, 0, "r"], + [85984, 0, "."], + [85985, 0, "\\"], + [85986, 0, "m"], + [85987, 0, "a"], + [85988, 0, "t"], + [85989, 0, "h"], + [85990, 0, "i"], + [85991, 0, "t"], + [85992, 0, "{"], + [85993, 0, "c"], + [85994, 0, "u"], + [85995, 0, "r"], + [85996, 0, "}"], + [85997, 0, " "], + [85998, 0, "="], + [85999, 0, " "], + [86000, 0, "o"], + [86001, 0, "_"], + [86002, 0, "s"], + [86003, 0, "."], + [86004, 0, "\\"], + [86005, 0, "m"], + [86006, 0, "a"], + [86007, 0, "t"], + [86008, 0, "h"], + [86009, 0, "i"], + [86010, 0, "t"], + [86011, 0, "{"], + [86012, 0, "c"], + [86013, 0, "u"], + [86014, 0, "r"], + [86015, 0, "}"], + [86016, 0, "$"], + [86017, 0, ","], + [86018, 0, " "], + [86019, 0, "t"], + [86020, 0, "h"], + [86021, 0, "e"], + [86022, 0, "n"], + [86023, 0, " "], + [86024, 0, "b"], + [86025, 0, "y"], + [86026, 0, " "], + [86027, 0, "L"], + [86028, 0, "e"], + [86029, 0, "m"], + [86030, 0, "m"], + [86031, 0, "a"], + [86032, 0, "~"], + [86033, 0, "\\"], + [86034, 0, "r"], + [86035, 0, "e"], + [86036, 0, "f"], + [86037, 0, "{"], + [86038, 0, "l"], + [86039, 0, "e"], + [86040, 0, "m"], + [86041, 0, ":"], + [86042, 0, "i"], + [86043, 0, "n"], + [86044, 0, "s"], + [86045, 0, "e"], + [86046, 0, "r"], + [86047, 0, "t"], + [86048, 0, "-"], + [86049, 0, "c"], + [86050, 0, "o"], + [86051, 0, "n"], + [86052, 0, "f"], + [86053, 0, "l"], + [86054, 0, "i"], + [86055, 0, "c"], + [86056, 0, "t"], + [86057, 0, "}"], + [86058, 0, ","], + [86059, 0, " "], + [86060, 0, "t"], + [86061, 0, "h"], + [86062, 0, "e"], + [86063, 0, " "], + [86064, 0, "o"], + [86065, 0, "p"], + [86066, 0, "e"], + [86067, 0, "r"], + [86068, 0, "a"], + [86069, 0, "t"], + [86070, 0, "i"], + [86071, 0, "o"], + [86072, 0, "n"], + [86073, 0, "s"], + [86074, 0, " "], + [86075, 0, "a"], + [86076, 0, "r"], + [86077, 0, "e"], + [86078, 0, " "], + [86079, 0, "c"], + [86080, 0, "o"], + [86081, 0, "m"], + [86082, 0, "m"], + [86083, 0, "u"], + [86084, 0, "t"], + [86085, 0, "a"], + [86086, 0, "t"], + [86087, 0, "i"], + [86088, 0, "v"], + [86089, 0, "e"], + [86090, 0, "."], + [86091, 0, " "], + [86092, 0, "I"], + [86093, 0, "f"], + [86094, 0, " "], + [86095, 0, "$"], + [86096, 0, "o"], + [86097, 0, "_"], + [86098, 0, "r"], + [86099, 0, "."], + [86100, 0, "\\"], + [86101, 0, "m"], + [86102, 0, "a"], + [86103, 0, "t"], + [86104, 0, "h"], + [86105, 0, "i"], + [86106, 0, "t"], + [86107, 0, "{"], + [86108, 0, "c"], + [86109, 0, "u"], + [86110, 0, "r"], + [86111, 0, "}"], + [86112, 0, " "], + [86113, 0, "\\"], + [86114, 0, "n"], + [86115, 0, "o"], + [86116, 0, "t"], + [86117, 0, "="], + [86118, 0, " "], + [86119, 0, "o"], + [86120, 0, "_"], + [86121, 0, "s"], + [86122, 0, "."], + [86123, 0, "\\"], + [86124, 0, "m"], + [86125, 0, "a"], + [86126, 0, "t"], + [86127, 0, "h"], + [86128, 0, "i"], + [86129, 0, "t"], + [86130, 0, "{"], + [86131, 0, "c"], + [86132, 0, "u"], + [86133, 0, "r"], + [86134, 0, "}"], + [86135, 0, "$"], + [86136, 0, ","], + [86137, 0, " "], + [86138, 0, "T"], + [86139, 0, "O"], + [86140, 0, "D"], + [86141, 0, "O"], + [86142, 0, "\\"], + [86143, 0, "d"], + [86144, 0, "o"], + [86145, 0, "t"], + [86146, 0, "s"], + [86146, 1], + [86145, 1], + [86144, 1], + [86143, 1], + [86142, 1], + [86141, 1], + [86140, 1], + [86139, 1], + [86138, 1], + [86090, 0, ","], + [86091, 0, " "], + [86092, 0, "a"], + [86093, 0, "n"], + [86094, 0, "d"], + [86095, 0, " "], + [86096, 0, "t"], + [86097, 0, "h"], + [86098, 0, "e"], + [86099, 0, " "], + [86100, 0, "o"], + [86101, 0, "p"], + [86102, 0, "e"], + [86103, 0, "r"], + [86104, 0, "a"], + [86105, 0, "t"], + [86106, 0, "i"], + [86107, 0, "o"], + [86108, 0, "n"], + [86109, 0, " "], + [86110, 0, "w"], + [86111, 0, "i"], + [86112, 0, "t"], + [86113, 0, "h"], + [86114, 0, " "], + [86115, 0, "t"], + [86116, 0, "h"], + [86117, 0, "e"], + [86118, 0, " "], + [86119, 0, "g"], + [86120, 0, "r"], + [86121, 0, "e"], + [86122, 0, "a"], + [86123, 0, "t"], + [86124, 0, "e"], + [86125, 0, "r"], + [86126, 0, " "], + [86127, 0, "o"], + [86128, 0, "p"], + [86129, 0, "e"], + [86130, 0, "r"], + [86131, 0, "a"], + [86132, 0, "t"], + [86133, 0, "i"], + [86134, 0, "o"], + [86135, 0, "n"], + [86136, 0, " "], + [86137, 0, "I"], + [86138, 0, "D"], + [86139, 0, " "], + [86140, 0, "a"], + [86141, 0, "p"], + [86142, 0, "p"], + [86143, 0, "e"], + [86144, 0, "a"], + [86145, 0, "r"], + [86146, 0, "s"], + [86147, 0, " "], + [86148, 0, "f"], + [86149, 0, "i"], + [86150, 0, "r"], + [86151, 0, "s"], + [86152, 0, "t"], + [86153, 0, " "], + [86154, 0, "i"], + [86155, 0, "n"], + [86156, 0, " "], + [86157, 0, "t"], + [86158, 0, "h"], + [86159, 0, "e"], + [86160, 0, " "], + [86161, 0, "l"], + [86162, 0, "i"], + [86163, 0, "s"], + [86164, 0, "t"], + [86095, 1], + [86094, 1], + [86093, 1], + [86092, 1], + [86091, 1], + [86090, 1], + [86089, 1], + [86088, 1], + [86087, 1], + [86086, 1], + [86085, 1], + [86084, 1], + [86083, 1], + [86082, 1], + [86081, 1], + [86080, 1], + [86079, 1], + [86078, 1], + [86077, 1], + [86076, 1], + [86075, 1], + [86074, 1], + [86073, 1], + [86072, 1], + [86071, 1], + [86070, 1], + [86069, 1], + [86068, 1], + [86067, 1], + [86066, 1], + [86065, 1], + [86064, 1], + [86063, 1], + [86062, 1], + [86061, 1], + [86060, 1], + [86129, 0, ","], + [86130, 0, " "], + [86131, 0, "r"], + [86132, 0, "e"], + [86133, 0, "g"], + [86134, 0, "a"], + [86135, 0, "r"], + [86136, 0, "d"], + [86137, 0, "l"], + [86138, 0, "e"], + [86139, 0, "s"], + [86140, 0, "s"], + [86141, 0, " "], + [86142, 0, "o"], + [86143, 0, "f"], + [86144, 0, " "], + [86145, 0, "t"], + [86146, 0, "h"], + [86147, 0, "e"], + [86148, 0, " "], + [86149, 0, "o"], + [86150, 0, "r"], + [86151, 0, "d"], + [86152, 0, "e"], + [86153, 0, "r"], + [86154, 0, " "], + [86155, 0, "i"], + [86156, 0, "n"], + [86157, 0, " "], + [86158, 0, "w"], + [86159, 0, "h"], + [86160, 0, "i"], + [86161, 0, "c"], + [86162, 0, "h"], + [86163, 0, " "], + [86164, 0, "t"], + [86165, 0, "h"], + [86166, 0, "e"], + [86167, 0, " "], + [86168, 0, "o"], + [86169, 0, "p"], + [86170, 0, "e"], + [86171, 0, "r"], + [86172, 0, "a"], + [86173, 0, "t"], + [86174, 0, "i"], + [86175, 0, "o"], + [86176, 0, "n"], + [86177, 0, " "], + [86177, 1], + [86177, 0, "s"], + [86178, 0, " "], + [86179, 0, "a"], + [86180, 0, "r"], + [86181, 0, "e"], + [86182, 0, " "], + [86183, 0, "a"], + [86184, 0, "p"], + [86185, 0, "p"], + [86186, 0, "l"], + [86187, 0, "i"], + [86188, 0, "e"], + [86189, 0, "d"], + [86238, 0, "t"], + [86239, 0, "h"], + [86240, 0, "e"], + [86241, 0, "n"], + [86242, 0, " "], + [86243, 0, "o"], + [86244, 0, "n"], + [86245, 0, "e"], + [86246, 0, " "], + [86247, 0, "o"], + [86248, 0, "r"], + [86249, 0, " "], + [86250, 0, "b"], + [86251, 0, "o"], + [86252, 0, "t"], + [86253, 0, "h"], + [86254, 0, " "], + [86255, 0, "o"], + [86256, 0, "f"], + [86257, 0, " "], + [86258, 0, "t"], + [86259, 0, "h"], + [86260, 0, "e"], + [86261, 0, " "], + [86262, 0, "c"], + [86263, 0, "u"], + [86264, 0, "r"], + [86265, 0, "s"], + [86266, 0, "o"], + [86267, 0, "r"], + [86268, 0, "s"], + [86269, 0, " "], + [86270, 0, "m"], + [86271, 0, "u"], + [86272, 0, "s"], + [86273, 0, "t"], + [86274, 0, " "], + [86275, 0, "r"], + [86276, 0, "e"], + [86277, 0, "f"], + [86278, 0, "e"], + [86279, 0, "r"], + [86280, 0, " "], + [86281, 0, "t"], + [86282, 0, "o"], + [86283, 0, " "], + [86284, 0, "a"], + [86285, 0, " "], + [86286, 0, "l"], + [86287, 0, "i"], + [86288, 0, "s"], + [86289, 0, "t"], + [86290, 0, " "], + [86291, 0, "e"], + [86292, 0, "l"], + [86293, 0, "e"], + [86294, 0, "m"], + [86295, 0, "e"], + [86296, 0, "n"], + [86297, 0, "t"], + [86298, 0, " "], + [86299, 0, "t"], + [86300, 0, "h"], + [86301, 0, "a"], + [86302, 0, "t"], + [86303, 0, " "], + [86304, 0, "a"], + [86305, 0, "p"], + [86306, 0, "p"], + [86307, 0, "e"], + [86308, 0, "a"], + [86309, 0, "r"], + [86310, 0, "s"], + [86311, 0, " "], + [86312, 0, "b"], + [86313, 0, "e"], + [86314, 0, "t"], + [86315, 0, "w"], + [86316, 0, "e"], + [86317, 0, "e"], + [86318, 0, "n"], + [86319, 0, " "], + [86320, 0, "$"], + [86321, 0, "k"], + [86322, 0, "^"], + [86323, 0, "\\"], + [86324, 0, "m"], + [86325, 0, "a"], + [86326, 0, "t"], + [86327, 0, "h"], + [86328, 0, "r"], + [86329, 0, "m"], + [86330, 0, "{"], + [86331, 0, "b"], + [86332, 0, "e"], + [86333, 0, "f"], + [86334, 0, "o"], + [86335, 0, "r"], + [86336, 0, "e"], + [86337, 0, "}"], + [86338, 0, "$"], + [86339, 0, " "], + [86340, 0, "a"], + [86341, 0, "n"], + [86342, 0, "d"], + [86343, 0, " "], + [86344, 0, "$"], + [86345, 0, "k"], + [86346, 0, "^"], + [86347, 0, "\\"], + [86348, 0, "m"], + [86349, 0, "a"], + [86350, 0, "t"], + [86351, 0, "h"], + [86352, 0, "r"], + [86353, 0, "m"], + [86354, 0, "{"], + [86355, 0, "a"], + [86356, 0, "f"], + [86357, 0, "t"], + [86358, 0, "e"], + [86359, 0, "r"], + [86360, 0, "}"], + [86361, 0, "$"], + [86362, 0, ","], + [86363, 0, " "], + [86364, 0, "a"], + [86365, 0, "n"], + [86366, 0, "d"], + [86367, 0, " "], + [86368, 0, "t"], + [86369, 0, "h"], + [86370, 0, "a"], + [86371, 0, "t"], + [86372, 0, " "], + [86373, 0, "w"], + [86374, 0, "a"], + [86375, 0, "s"], + [86376, 0, " "], + [86377, 0, "i"], + [86378, 0, "n"], + [86379, 0, "s"], + [86380, 0, "e"], + [86381, 0, "r"], + [86382, 0, "t"], + [86383, 0, "e"], + [86384, 0, "d"], + [86385, 0, " "], + [86385, 1], + [86384, 1], + [86383, 1], + [86382, 1], + [86381, 1], + [86380, 1], + [86379, 1], + [86378, 1], + [86377, 1], + [86376, 1], + [86375, 1], + [86374, 1], + [86373, 1], + [86373, 0, "d"], + [86374, 0, "i"], + [86375, 0, "d"], + [86376, 0, " "], + [86377, 0, "n"], + [86378, 0, "o"], + [86379, 0, "t"], + [86380, 0, " "], + [86381, 0, "y"], + [86382, 0, "e"], + [86383, 0, "t"], + [86384, 0, " "], + [86385, 0, "e"], + [86386, 0, "x"], + [86387, 0, "i"], + [86388, 0, "s"], + [86389, 0, "t"], + [86390, 0, " "], + [86391, 0, "i"], + [86392, 0, "n"], + [86393, 0, " "], + [86394, 0, "t"], + [86395, 0, "h"], + [86396, 0, "e"], + [86397, 0, " "], + [86398, 0, "c"], + [86399, 0, "o"], + [86400, 0, "m"], + [86401, 0, "m"], + [86402, 0, "o"], + [86403, 0, "n"], + [86404, 0, " "], + [86405, 0, "a"], + [86406, 0, "n"], + [86407, 0, "c"], + [86408, 0, "e"], + [86409, 0, "s"], + [86410, 0, "t"], + [86411, 0, "o"], + [86412, 0, "r"], + [86413, 0, " "], + [86414, 0, "("], + [86415, 0, "D"], + [86416, 0, "e"], + [86417, 0, "f"], + [86418, 0, "i"], + [86419, 0, "n"], + [86420, 0, "i"], + [86421, 0, "t"], + [86422, 0, "i"], + [86423, 0, "o"], + [86424, 0, "n"], + [86425, 0, "~"], + [86426, 0, "\\"], + [86427, 0, "r"], + [86428, 0, "e"], + [86429, 0, "f"], + [86430, 0, "{"], + [86431, 0, "d"], + [86432, 0, "e"], + [86433, 0, "f"], + [86434, 0, ":"], + [86435, 0, "c"], + [86436, 0, "o"], + [86437, 0, "m"], + [86438, 0, "m"], + [86439, 0, "o"], + [86440, 0, "n"], + [86441, 0, "-"], + [86442, 0, "a"], + [86443, 0, "n"], + [86444, 0, "c"], + [86445, 0, "e"], + [86446, 0, "s"], + [86447, 0, "t"], + [86448, 0, "o"], + [86449, 0, "r"], + [86450, 0, "}"], + [86451, 0, ")"], + [86452, 0, "."], + [86453, 0, "\n"], + [86454, 0, "\n"], + [86475, 0, " "], + [86476, 0, "a"], + [86477, 0, "b"], + [86478, 0, "o"], + [86479, 0, "v"], + [86480, 0, "e"], + [86455, 0, "T"], + [86456, 0, "a"], + [86457, 0, "k"], + [86458, 0, "e"], + [86459, 0, " "], + [86460, 0, "e"], + [86461, 0, "i"], + [86462, 0, "t"], + [86463, 0, "h"], + [86463, 1], + [86462, 1], + [86461, 1], + [86460, 1], + [86460, 0, "a"], + [86461, 0, " "], + [86462, 0, "c"], + [86463, 0, "u"], + [86464, 0, "r"], + [86465, 0, "s"], + [86466, 0, "o"], + [86467, 0, "r"], + [86468, 0, " "], + [86469, 0, "t"], + [86470, 0, "h"], + [86471, 0, "a"], + [86472, 0, "t"], + [86473, 0, " "], + [86474, 0, "d"], + [86475, 0, "i"], + [86476, 0, "f"], + [86477, 0, "f"], + [86478, 0, "e"], + [86479, 0, "r"], + [86480, 0, "s"], + [86481, 0, " "], + [86482, 0, "f"], + [86483, 0, "r"], + [86484, 0, "o"], + [86485, 0, "m"], + [86486, 0, " "], + [86487, 0, "$"], + [86488, 0, "k"], + [86489, 0, "^"], + [86490, 0, "\\"], + [86491, 0, "m"], + [86492, 0, "a"], + [86493, 0, "t"], + [86494, 0, "h"], + [86495, 0, "r"], + [86496, 0, "m"], + [86497, 0, "{"], + [86498, 0, "b"], + [86499, 0, "e"], + [86500, 0, "f"], + [86501, 0, "o"], + [86502, 0, "r"], + [86503, 0, "e"], + [86504, 0, "}"], + [86505, 0, "$"], + [86506, 0, "."], + [86507, 0, " "], + [86507, 1], + [86506, 1], + [86506, 0, ","], + [86507, 0, " "], + [86507, 1], + [86506, 1], + [86506, 0, ":"], + [86507, 0, " "], + [86508, 0, "t"], + [86509, 0, "h"], + [86510, 0, "e"], + [86511, 0, " "], + [86512, 0, "l"], + [86513, 0, "i"], + [86514, 0, "s"], + [86515, 0, "t"], + [86516, 0, " "], + [86517, 0, "e"], + [86518, 0, "l"], + [86519, 0, "e"], + [86520, 0, "m"], + [86521, 0, "e"], + [86522, 0, "n"], + [86523, 0, "t"], + [86524, 0, " "], + [86525, 0, "i"], + [86526, 0, "t"], + [86527, 0, " "], + [86528, 0, "r"], + [86529, 0, "e"], + [86530, 0, "f"], + [86531, 0, "e"], + [86532, 0, "r"], + [86533, 0, "s"], + [86534, 0, " "], + [86535, 0, "t"], + [86536, 0, "o"], + [86537, 0, " "], + [86538, 0, "w"], + [86539, 0, "a"], + [86540, 0, "s"], + [86541, 0, " "], + [86542, 0, "i"], + [86543, 0, "t"], + [86544, 0, "s"], + [86545, 0, "e"], + [86546, 0, "l"], + [86547, 0, "f"], + [86548, 0, " "], + [86549, 0, "i"], + [86550, 0, "n"], + [86551, 0, "s"], + [86552, 0, "e"], + [86553, 0, "r"], + [86554, 0, "t"], + [86555, 0, "e"], + [86556, 0, "d"], + [86557, 0, " "], + [86558, 0, "b"], + [86559, 0, "y"], + [86560, 0, " "], + [86561, 0, "a"], + [86562, 0, "n"], + [86563, 0, " "], + [86564, 0, "o"], + [86565, 0, "p"], + [86566, 0, "e"], + [86567, 0, "r"], + [86568, 0, "a"], + [86569, 0, "t"], + [86570, 0, "i"], + [86571, 0, "o"], + [86572, 0, "n"], + [86573, 0, " "], + [86574, 0, "w"], + [86575, 0, "i"], + [86576, 0, "t"], + [86577, 0, "h"], + [86578, 0, "i"], + [86579, 0, "n"], + [86580, 0, " "], + [86581, 0, "t"], + [86582, 0, "h"], + [86583, 0, "e"], + [86584, 0, " "], + [86585, 0, "s"], + [86586, 0, "a"], + [86587, 0, "m"], + [86588, 0, "e"], + [86589, 0, " "], + [86590, 0, "i"], + [86591, 0, "n"], + [86592, 0, "s"], + [86593, 0, "e"], + [86594, 0, "r"], + [86595, 0, "t"], + [86596, 0, "i"], + [86597, 0, "o"], + [86598, 0, "n"], + [86599, 0, " "], + [86600, 0, "i"], + [86601, 0, "n"], + [86602, 0, "t"], + [86603, 0, "e"], + [86604, 0, "r"], + [86605, 0, "v"], + [86606, 0, "a"], + [86607, 0, "l"], + [86608, 0, "."], + [86609, 0, " "], + [86579, 1], + [86578, 1], + [86605, 1], + [86604, 1], + [86603, 1], + [86602, 1], + [86601, 1], + [86600, 1], + [86599, 1], + [86598, 1], + [86597, 1], + [86596, 1], + [86595, 1], + [86594, 1], + [86593, 1], + [86592, 1], + [86591, 1], + [86590, 1], + [86589, 1], + [86588, 1], + [86587, 1], + [86586, 1], + [86585, 1], + [86584, 1], + [86583, 1], + [86582, 1], + [86581, 1], + [86580, 1], + [86579, 1], + [86578, 1], + [86577, 1], + [86576, 1], + [86575, 1], + [86574, 1], + [86573, 1], + [86573, 0, ","], + [86574, 0, " "], + [86575, 0, "w"], + [86576, 0, "h"], + [86577, 0, "o"], + [86578, 0, "s"], + [86579, 0, "e"], + [86580, 0, " "], + [86581, 0, "c"], + [86582, 0, "u"], + [86583, 0, "r"], + [86584, 0, "s"], + [86585, 0, "o"], + [86586, 0, "r"], + [86587, 0, " "], + [86588, 0, "i"], + [86589, 0, "n"], + [86590, 0, " "], + [86591, 0, "t"], + [86592, 0, "u"], + [86593, 0, "r"], + [86594, 0, "n"], + [86595, 0, " "], + [86596, 0, "r"], + [86597, 0, "e"], + [86598, 0, "f"], + [86599, 0, "e"], + [86600, 0, "r"], + [86601, 0, "s"], + [86602, 0, " "], + [86603, 0, "t"], + [86604, 0, "o"], + [86605, 0, " "], + [86606, 0, "a"], + [86607, 0, "n"], + [86608, 0, "o"], + [86609, 0, "t"], + [86610, 0, "h"], + [86611, 0, "e"], + [86612, 0, "r"], + [86613, 0, " "], + [86614, 0, "p"], + [86615, 0, "r"], + [86616, 0, "i"], + [86617, 0, "o"], + [86618, 0, "r"], + [86619, 0, " "], + [86620, 0, "o"], + [86621, 0, "p"], + [86622, 0, "e"], + [86623, 0, "r"], + [86624, 0, "a"], + [86625, 0, "t"], + [86626, 0, "i"], + [86627, 0, "o"], + [86628, 0, "n"], + [86562, 1], + [86562, 0, " "], + [86563, 0, "p"], + [86564, 0, "r"], + [86565, 0, "i"], + [86566, 0, "o"], + [86567, 0, "r"], + [86548, 1], + [86547, 1], + [86546, 1], + [86545, 1], + [86544, 1], + [86543, 1], + [86542, 1], + [86627, 0, ","], + [86628, 0, " "], + [86629, 0, "a"], + [86630, 0, "n"], + [86631, 0, "d"], + [86632, 0, " "], + [86633, 0, "s"], + [86634, 0, "o"], + [86635, 0, " "], + [86636, 0, "o"], + [86637, 0, "n"], + [86640, 0, "F"], + [86641, 0, "o"], + [86642, 0, "l"], + [86643, 0, "l"], + [86644, 0, "o"], + [86645, 0, "w"], + [86646, 0, "i"], + [86647, 0, "n"], + [86648, 0, "g"], + [86649, 0, " "], + [86650, 0, "t"], + [86651, 0, "h"], + [86652, 0, "i"], + [86653, 0, "s"], + [86654, 0, " "], + [86655, 0, "c"], + [86656, 0, "h"], + [86657, 0, "a"], + [86658, 0, "i"], + [86659, 0, "n"], + [86660, 0, " "], + [86661, 0, "o"], + [86662, 0, "f"], + [86663, 0, " "], + [86664, 0, "c"], + [86665, 0, "u"], + [86666, 0, "r"], + [86667, 0, "s"], + [86668, 0, "o"], + [86669, 0, "r"], + [86670, 0, "s"], + [86671, 0, " "], + [86672, 0, "l"], + [86673, 0, "e"], + [86674, 0, "a"], + [86675, 0, "d"], + [86676, 0, "s"], + [86677, 0, " "], + [86678, 0, "t"], + [86679, 0, "o"], + [86680, 0, " "], + [86681, 0, "a"], + [86682, 0, "n"], + [86683, 0, " "], + [86684, 0, "o"], + [86685, 0, "p"], + [86686, 0, "e"], + [86687, 0, "r"], + [86688, 0, "a"], + [86689, 0, "t"], + [86690, 0, "i"], + [86691, 0, "o"], + [86692, 0, "n"], + [86693, 0, " "], + [86694, 0, "w"], + [86695, 0, "h"], + [86696, 0, "o"], + [86697, 0, "s"], + [86698, 0, "e"], + [86699, 0, " "], + [86700, 0, "c"], + [86701, 0, "u"], + [86702, 0, "r"], + [86703, 0, "s"], + [86704, 0, "o"], + [86705, 0, "r"], + [86706, 0, " "], + [86707, 0, "r"], + [86708, 0, "e"], + [86709, 0, "f"], + [86710, 0, "e"], + [86711, 0, "r"], + [86712, 0, "s"], + [86713, 0, " "], + [86714, 0, "t"], + [86660, 0, " "], + [86661, 0, "f"], + [86662, 0, "o"], + [86663, 0, "r"], + [86664, 0, " "], + [86665, 0, "a"], + [86666, 0, " "], + [86667, 0, "f"], + [86668, 0, "i"], + [86669, 0, "n"], + [86670, 0, "i"], + [86671, 0, "t"], + [86672, 0, "e"], + [86673, 0, " "], + [86674, 0, "n"], + [86675, 0, "u"], + [86676, 0, "m"], + [86677, 0, "b"], + [86678, 0, "e"], + [86679, 0, "r"], + [86680, 0, " "], + [86681, 0, "o"], + [86682, 0, "f"], + [86683, 0, " "], + [86684, 0, "s"], + [86685, 0, "t"], + [86686, 0, "e"], + [86687, 0, "p"], + [86688, 0, "s"], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86690, 1], + [86660, 0, " "], + [86661, 0, "o"], + [86662, 0, "f"], + [86663, 0, " "], + [86664, 0, "c"], + [86665, 0, "u"], + [86666, 0, "r"], + [86667, 0, "s"], + [86668, 0, "o"], + [86669, 0, "r"], + [86670, 0, "s"], + [86744, 0, "o"], + [86745, 0, " "], + [86746, 0, "$"], + [86747, 0, "k"], + [86748, 0, "&"], + [86748, 1], + [86748, 0, "^"], + [86749, 0, "\\"], + [86750, 0, "m"], + [86751, 0, "a"], + [86752, 0, "t"], + [86753, 0, "h"], + [86754, 0, "r"], + [86755, 0, "m"], + [86756, 0, "{"], + [86757, 0, "b"], + [86758, 0, "e"], + [86759, 0, "f"], + [86760, 0, "o"], + [86761, 0, "r"], + [86762, 0, "e"], + [86763, 0, "}"], + [86764, 0, "$"], + [86765, 0, "."], + [86766, 0, " "], + [86767, 0, "N"], + [86768, 0, "o"], + [86769, 0, "t"], + [86770, 0, "e"], + [86771, 0, " "], + [86772, 0, "t"], + [86773, 0, "h"], + [86774, 0, "a"], + [86775, 0, "t"], + [86776, 0, " "], + [86765, 0, " "], + [86765, 1], + [86765, 0, ","], + [86766, 0, " "], + [86767, 0, "s"], + [86768, 0, "i"], + [86769, 0, "n"], + [86770, 0, "c"], + [86771, 0, "e"], + [86772, 0, " "], + [86773, 0, "a"], + [86774, 0, "n"], + [86775, 0, " "], + [86776, 0, "i"], + [86777, 0, "n"], + [86778, 0, "s"], + [86779, 0, "e"], + [86780, 0, "r"], + [86781, 0, "t"], + [86782, 0, "i"], + [86783, 0, "o"], + [86784, 0, "n"], + [86785, 0, " "], + [86786, 0, "o"], + [86787, 0, "p"], + [86788, 0, "e"], + [86789, 0, "r"], + [86790, 0, "a"], + [86791, 0, "t"], + [86792, 0, "i"], + [86793, 0, "o"], + [86794, 0, "n"], + [86795, 0, " "], + [86796, 0, "a"], + [86797, 0, "l"], + [86798, 0, "w"], + [86799, 0, "a"], + [86800, 0, "y"], + [86801, 0, "s"], + [86802, 0, " "], + [86803, 0, "i"], + [86804, 0, "n"], + [86805, 0, "s"], + [86806, 0, "e"], + [86807, 0, "r"], + [86808, 0, "t"], + [86809, 0, "s"], + [86810, 0, " "], + [86811, 0, "a"], + [86812, 0, "t"], + [86813, 0, " "], + [86814, 0, "a"], + [86815, 0, " "], + [86816, 0, "p"], + [86817, 0, "o"], + [86818, 0, "s"], + [86819, 0, "i"], + [86820, 0, "t"], + [86821, 0, "i"], + [86822, 0, "o"], + [86823, 0, "n"], + [86824, 0, " "], + [86825, 0, "a"], + [86826, 0, "f"], + [86827, 0, "t"], + [86828, 0, "e"], + [86829, 0, "r"], + [86830, 0, " "], + [86831, 0, "t"], + [86832, 0, "h"], + [86833, 0, "e"], + [86834, 0, " "], + [86835, 0, "c"], + [86836, 0, "u"], + [86837, 0, "r"], + [86838, 0, "s"], + [86839, 0, "o"], + [86840, 0, "r"], + [86722, 0, " "], + [86723, 0, "$"], + [86724, 0, "o"], + [86725, 0, "_"], + [86726, 0, "\\"], + [86727, 0, "m"], + [86728, 0, "a"], + [86729, 0, "t"], + [86730, 0, "h"], + [86731, 0, "r"], + [86732, 0, "m"], + [86733, 0, "{"], + [86734, 0, "f"], + [86735, 0, "i"], + [86736, 0, "r"], + [86737, 0, "s"], + [86738, 0, "t"], + [86739, 0, "}"], + [86740, 0, "$"], + [86784, 1], + [86785, 0, "("], + [86860, 0, ")"], + [86873, 0, "a"], + [86874, 0, "l"], + [86875, 0, "l"], + [86876, 0, " "], + [86877, 0, "o"], + [86878, 0, "f"], + [86879, 0, " "], + [86880, 0, "t"], + [86881, 0, "h"], + [86882, 0, "e"], + [86883, 0, " "], + [86884, 0, "o"], + [86885, 0, "p"], + [86886, 0, "e"], + [86887, 0, "r"], + [86888, 0, "a"], + [86889, 0, "t"], + [86890, 0, "i"], + [86891, 0, "o"], + [86892, 0, "n"], + [86893, 0, "s"], + [86894, 0, " "], + [86895, 0, "i"], + [86896, 0, "n"], + [86897, 0, " "], + [86898, 0, "t"], + [86899, 0, "h"], + [86900, 0, "i"], + [86901, 0, "s"], + [86902, 0, " "], + [86903, 0, "c"], + [86904, 0, "h"], + [86905, 0, "a"], + [86906, 0, "i"], + [86907, 0, "n"], + [86908, 0, " "], + [86909, 0, "a"], + [86910, 0, "r"], + [86911, 0, "e"], + [86912, 0, " "], + [86913, 0, "c"], + [86914, 0, "a"], + [86915, 0, "u"], + [86916, 0, "s"], + [86917, 0, "a"], + [86918, 0, "l"], + [86919, 0, "l"], + [86920, 0, "y"], + [86921, 0, " "], + [86922, 0, "d"], + [86923, 0, "e"], + [86924, 0, "p"], + [86925, 0, "e"], + [86926, 0, "n"], + [86927, 0, "d"], + [86928, 0, "e"], + [86929, 0, "n"], + [86930, 0, "t"], + [86931, 0, " "], + [86932, 0, "o"], + [86933, 0, "n"], + [86934, 0, " "], + [86862, 1], + [86862, 0, "\n"], + [86863, 0, "\n"], + [86936, 0, "$"], + [86937, 0, "o"], + [86938, 0, "_"], + [86939, 0, "\\"], + [86940, 0, "m"], + [86941, 0, "a"], + [86942, 0, "t"], + [86943, 0, "h"], + [86944, 0, "r"], + [86945, 0, "m"], + [86946, 0, "{"], + [86947, 0, "f"], + [86948, 0, "i"], + [86949, 0, "r"], + [86950, 0, "s"], + [86951, 0, "t"], + [86952, 0, "}"], + [86953, 0, "$"], + [86954, 0, ","], + [86955, 0, " "], + [86956, 0, "a"], + [86957, 0, "n"], + [86958, 0, "d"], + [86959, 0, " "], + [86960, 0, "s"], + [86961, 0, "o"], + [86962, 0, " "], + [86963, 0, "t"], + [86964, 0, "h"], + [86965, 0, "e"], + [86966, 0, "y"], + [86967, 0, " "], + [86968, 0, "m"], + [86969, 0, "u"], + [86970, 0, "s"], + [86971, 0, "t"], + [86972, 0, " "], + [86973, 0, "h"], + [86974, 0, "a"], + [86975, 0, "v"], + [86976, 0, "e"], + [86977, 0, " "], + [86978, 0, "a"], + [86979, 0, "n"], + [86980, 0, " "], + [86981, 0, "o"], + [86982, 0, "p"], + [86983, 0, "e"], + [86984, 0, "r"], + [86984, 1], + [86983, 1], + [86982, 1], + [86981, 1], + [86980, 1], + [86979, 1], + [86979, 0, " "], + [86980, 0, "L"], + [86981, 0, "a"], + [86982, 0, "m"], + [86983, 0, "p"], + [86984, 0, "o"], + [86985, 0, "r"], + [86986, 0, "t"], + [86987, 0, " "], + [86988, 0, "t"], + [86989, 0, "i"], + [86990, 0, "m"], + [86991, 0, "e"], + [86992, 0, "s"], + [86993, 0, "t"], + [86994, 0, "a"], + [86995, 0, "m"], + [86996, 0, "p"], + [86997, 0, " "], + [86998, 0, "g"], + [86999, 0, "r"], + [87000, 0, "e"], + [87001, 0, "a"], + [87002, 0, "t"], + [87003, 0, "e"], + [87004, 0, "r"], + [87005, 0, " "], + [87006, 0, "t"], + [87007, 0, "h"], + [87008, 0, "a"], + [87009, 0, "n"], + [87010, 0, " "], + [87011, 0, "$"], + [87012, 0, "o"], + [87013, 0, "_"], + [87014, 0, "\\"], + [87015, 0, "m"], + [87016, 0, "a"], + [87017, 0, "t"], + [87018, 0, "h"], + [87019, 0, "r"], + [87020, 0, "m"], + [87021, 0, "{"], + [87022, 0, "f"], + [87023, 0, "i"], + [87024, 0, "r"], + [87025, 0, "s"], + [87026, 0, "t"], + [87027, 0, "}"], + [87028, 0, "$"], + [87029, 0, "."], + [87030, 0, " "], + [87031, 0, "T"], + [87032, 0, "h"], + [87033, 0, "u"], + [87034, 0, "s"], + [87035, 0, ","], + [87036, 0, " "], + [87037, 0, "w"], + [87038, 0, "e"], + [87039, 0, " "], + [87040, 0, "c"], + [87041, 0, "a"], + [87042, 0, "n"], + [87043, 0, " "], + [87044, 0, "a"], + [87045, 0, "p"], + [87046, 0, "p"], + [87047, 0, "l"], + [87048, 0, "y"], + [87049, 0, " "], + [87050, 0, "t"], + [87051, 0, "h"], + [87052, 0, "e"], + [87053, 0, " "], + [87054, 0, "s"], + [87055, 0, "a"], + [87056, 0, "m"], + [87057, 0, "e"], + [87058, 0, " "], + [87059, 0, "a"], + [87060, 0, "r"], + [87061, 0, "g"], + [87062, 0, "u"], + [87063, 0, "m"], + [87064, 0, "e"], + [87065, 0, "n"], + [87066, 0, "t"], + [87067, 0, " "], + [87068, 0, "a"], + [87069, 0, "s"], + [87070, 0, " "], + [87071, 0, "i"], + [87072, 0, "n"], + [87073, 0, " "], + [87074, 0, "L"], + [87075, 0, "e"], + [87076, 0, "m"], + [87077, 0, "m"], + [87078, 0, "a"], + [87079, 0, "~"], + [87080, 0, "\\"], + [87081, 0, "r"], + [87082, 0, "e"], + [87083, 0, "f"], + [87084, 0, "{"], + [87085, 0, "l"], + [87086, 0, "e"], + [87087, 0, "m"], + [87088, 0, ":"], + [87089, 0, "i"], + [87090, 0, "n"], + [87091, 0, "s"], + [87092, 0, "e"], + [87093, 0, "r"], + [87094, 0, "t"], + [87095, 0, "-"], + [87096, 0, "c"], + [87097, 0, "o"], + [87098, 0, "n"], + [87099, 0, "f"], + [87100, 0, "l"], + [87101, 0, "i"], + [87102, 0, "c"], + [87103, 0, "t"], + [87104, 0, "}"], + [87105, 0, "f"], + [87105, 1], + [87105, 0, ":"], + [87106, 0, " "], + [87107, 0, "i"], + [87108, 0, "f"], + [87109, 0, " "], + [87110, 0, "$"], + [87111, 0, "\\"], + [87112, 0, "t"], + [87113, 0, "e"], + [87114, 0, "x"], + [87115, 0, "t"], + [87116, 0, "s"], + [87117, 0, "c"], + [87118, 0, "{"], + [87119, 0, "I"], + [87120, 0, "n"], + [87121, 0, "s"], + [87122, 0, "e"], + [87123, 0, "r"], + [87124, 0, "t"], + [87125, 0, "}"], + [87126, 0, "_"], + [87127, 0, "2"], + [87128, 0, "$"], + [87129, 0, " "], + [87130, 0, "s"], + [87131, 0, "k"], + [87132, 0, "i"], + [87133, 0, "p"], + [87134, 0, "s"], + [87135, 0, " "], + [87136, 0, "o"], + [87137, 0, "v"], + [87138, 0, "e"], + [87139, 0, "r"], + [87140, 0, " "], + [87141, 0, "t"], + [87142, 0, "h"], + [87143, 0, "e"], + [87144, 0, " "], + [87145, 0, "l"], + [87146, 0, "i"], + [87147, 0, "s"], + [87148, 0, "t"], + [87149, 0, " "], + [87150, 0, "e"], + [87151, 0, "l"], + [87152, 0, "e"], + [87153, 0, "m"], + [87154, 0, "e"], + [87155, 0, "n"], + [87156, 0, "t"], + [87157, 0, " "], + [87158, 0, "i"], + [87159, 0, "n"], + [87160, 0, "s"], + [87161, 0, "e"], + [87162, 0, "r"], + [87163, 0, "t"], + [87164, 0, "e"], + [87165, 0, "d"], + [87166, 0, " "], + [87167, 0, "b"], + [87168, 0, "y"], + [87169, 0, " "], + [87170, 0, "$"], + [87171, 0, "o"], + [87172, 0, "_"], + [87173, 0, "\\"], + [87174, 0, "m"], + [87175, 0, "a"], + [87176, 0, "t"], + [87177, 0, "h"], + [87178, 0, "r"], + [87179, 0, "m"], + [87180, 0, "{"], + [87181, 0, "f"], + [87182, 0, "i"], + [87183, 0, "r"], + [87184, 0, "s"], + [87185, 0, "t"], + [87186, 0, "}"], + [87187, 0, "$"], + [87188, 0, ","], + [87189, 0, " "], + [87190, 0, "i"], + [87191, 0, "t"], + [87192, 0, " "], + [87193, 0, "w"], + [87194, 0, "i"], + [87195, 0, "l"], + [87196, 0, "l"], + [87197, 0, " "], + [87198, 0, "a"], + [87199, 0, "l"], + [87200, 0, "s"], + [87201, 0, "o"], + [87202, 0, " "], + [87203, 0, "s"], + [87204, 0, "k"], + [87205, 0, "i"], + [87206, 0, "p"], + [87207, 0, " "], + [87208, 0, "o"], + [87209, 0, "v"], + [87210, 0, "e"], + [87211, 0, "r"], + [87212, 0, " "], + [87213, 0, "a"], + [87214, 0, "l"], + [87215, 0, "l"], + [87216, 0, " "], + [87217, 0, "o"], + [87218, 0, "f"], + [87219, 0, " "], + [87220, 0, "t"], + [87221, 0, "h"], + [87222, 0, "e"], + [87223, 0, " "], + [87224, 0, "l"], + [87225, 0, "i"], + [87226, 0, "s"], + [87227, 0, "t"], + [87228, 0, " "], + [87229, 0, "e"], + [87230, 0, "l"], + [87231, 0, "e"], + [87232, 0, "m"], + [87233, 0, "e"], + [87234, 0, "n"], + [87235, 0, "t"], + [87236, 0, "s"], + [87237, 0, " "], + [87238, 0, "t"], + [87239, 0, "h"], + [87240, 0, "a"], + [87241, 0, "t"], + [87242, 0, " "], + [87243, 0, "a"], + [87244, 0, "r"], + [87245, 0, "e"], + [87246, 0, " "], + [87247, 0, "c"], + [87248, 0, "a"], + [87249, 0, "u"], + [87250, 0, "s"], + [87251, 0, "a"], + [87252, 0, "l"], + [87253, 0, "l"], + [87254, 0, "y"], + [87255, 0, " "], + [87256, 0, "d"], + [87257, 0, "e"], + [87258, 0, "p"], + [87259, 0, "e"], + [87260, 0, "n"], + [87261, 0, "d"], + [87262, 0, "e"], + [87263, 0, "n"], + [87264, 0, "t"], + [87265, 0, " "], + [87266, 0, "o"], + [87267, 0, "n"], + [87268, 0, " "], + [87269, 0, "i"], + [87270, 0, "t"], + [87270, 1], + [87269, 1], + [87269, 0, "$"], + [87270, 0, "o"], + [87271, 0, "_"], + [87272, 0, "\\"], + [87273, 0, "m"], + [87274, 0, "a"], + [87275, 0, "t"], + [87275, 1], + [87274, 1], + [87273, 1], + [87272, 1], + [87271, 1], + [87270, 1], + [87269, 1], + [87269, 0, "i"], + [87270, 0, "t"], + [87271, 0, ";"], + [87272, 0, " "], + [87273, 0, "i"], + [87274, 0, "f"], + [87275, 0, " "], + [87276, 0, "$"], + [87277, 0, "\\"], + [87278, 0, "t"], + [87279, 0, "e"], + [87280, 0, "x"], + [87281, 0, "t"], + [87282, 0, "s"], + [87283, 0, "c"], + [87284, 0, "{"], + [87285, 0, "I"], + [87286, 0, "n"], + [87287, 0, "s"], + [87288, 0, "e"], + [87289, 0, "r"], + [87290, 0, "t"], + [87291, 0, "}"], + [87292, 0, "_"], + [87293, 0, "1"], + [87294, 0, "$"], + [87295, 0, " "], + [87296, 0, "i"], + [87297, 0, "n"], + [87298, 0, "s"], + [87299, 0, "e"], + [87300, 0, "r"], + [87301, 0, "t"], + [87302, 0, "s"], + [87303, 0, " "], + [87304, 0, "a"], + [87305, 0, " "], + [87306, 0, "n"], + [87307, 0, "e"], + [87308, 0, "w"], + [87309, 0, " "], + [87310, 0, "e"], + [87311, 0, "l"], + [87312, 0, "e"], + [87313, 0, "m"], + [87314, 0, "e"], + [87315, 0, "n"], + [87316, 0, "t"], + [87317, 0, " "], + [87318, 0, "b"], + [87319, 0, "e"], + [87320, 0, "f"], + [87321, 0, "o"], + [87322, 0, "r"], + [87323, 0, "e"], + [87324, 0, " "], + [87325, 0, "$"], + [87326, 0, "o"], + [87327, 0, "_"], + [87328, 0, "\\"], + [87329, 0, "m"], + [87330, 0, "a"], + [87331, 0, "t"], + [87332, 0, "h"], + [87333, 0, "r"], + [87334, 0, "m"], + [87335, 0, "{"], + [87336, 0, "f"], + [87337, 0, "i"], + [87338, 0, "r"], + [87339, 0, "s"], + [87340, 0, "t"], + [87341, 0, "}"], + [87342, 0, "$"], + [87343, 0, ","], + [87344, 0, " "], + [87345, 0, "i"], + [87346, 0, "t"], + [87347, 0, " "], + [87348, 0, "i"], + [87349, 0, "s"], + [87350, 0, " "], + [87351, 0, "a"], + [87352, 0, "l"], + [87353, 0, "s"], + [87354, 0, "o"], + [87355, 0, " "], + [87356, 0, "i"], + [87357, 0, "n"], + [87358, 0, "s"], + [87359, 0, "e"], + [87360, 0, "r"], + [87361, 0, "t"], + [87362, 0, "e"], + [87363, 0, "d"], + [87364, 0, " "], + [87365, 0, "b"], + [87366, 0, "e"], + [87367, 0, "f"], + [87368, 0, "o"], + [87369, 0, "r"], + [87370, 0, "e"], + [87371, 0, " "], + [87372, 0, "t"], + [87373, 0, "h"], + [87374, 0, "e"], + [87375, 0, " "], + [87376, 0, "c"], + [87377, 0, "h"], + [87378, 0, "a"], + [87379, 0, "i"], + [87380, 0, "n"], + [87381, 0, " "], + [87382, 0, "o"], + [87383, 0, "f"], + [87384, 0, " "], + [87385, 0, "o"], + [87386, 0, "p"], + [87387, 0, "e"], + [87388, 0, "r"], + [87389, 0, "a"], + [87390, 0, "t"], + [87391, 0, "i"], + [87392, 0, "o"], + [87393, 0, "n"], + [87394, 0, "s"], + [87395, 0, " "], + [87396, 0, "t"], + [87397, 0, "h"], + [87398, 0, "a"], + [87399, 0, "t"], + [87400, 0, " "], + [87401, 0, "i"], + [87402, 0, "s"], + [87403, 0, " "], + [87404, 0, "b"], + [87405, 0, "a"], + [87406, 0, "s"], + [87407, 0, "e"], + [87408, 0, "d"], + [87409, 0, " "], + [87410, 0, "o"], + [87411, 0, "n"], + [87412, 0, " "], + [87413, 0, "i"], + [87414, 0, "t"], + [87415, 0, "."], + [87418, 0, " "], + [87418, 0, "T"], + [87419, 0, "h"], + [87420, 0, "e"], + [87421, 0, "r"], + [87422, 0, "e"], + [87423, 0, "f"], + [87424, 0, "o"], + [87425, 0, "r"], + [87426, 0, "e"], + [87427, 0, ","], + [87428, 0, " "], + [87429, 0, "t"], + [87430, 0, "h"], + [87431, 0, "e"], + [87432, 0, " "], + [87433, 0, "o"], + [87434, 0, "r"], + [87435, 0, "d"], + [87436, 0, "e"], + [87437, 0, "r"], + [87438, 0, " "], + [87439, 0, "o"], + [87440, 0, "f"], + [87441, 0, " "], + [87442, 0, "$"], + [87443, 0, "o"], + [87444, 0, "_"], + [87445, 0, "r"], + [87446, 0, " "], + [87446, 1], + [87446, 0, "$"], + [87447, 0, " "], + [87448, 0, "a"], + [87449, 0, "n"], + [87450, 0, "d"], + [87451, 0, " "], + [87452, 0, "$"], + [87453, 0, "o"], + [87454, 0, "_"], + [87455, 0, "s"], + [87456, 0, "$"], + [87457, 0, " "], + [87458, 0, "i"], + [87459, 0, "n"], + [87460, 0, " "], + [87461, 0, "t"], + [87462, 0, "h"], + [87463, 0, "e"], + [87464, 0, " "], + [87465, 0, "f"], + [87466, 0, "i"], + [87467, 0, "n"], + [87468, 0, "a"], + [87469, 0, "l"], + [87470, 0, " "], + [87471, 0, "l"], + [87472, 0, "i"], + [87473, 0, "s"], + [87474, 0, "t"], + [87475, 0, " "], + [87476, 0, "d"], + [87477, 0, "e"], + [87478, 0, "p"], + [87479, 0, "e"], + [87480, 0, "n"], + [87481, 0, "d"], + [87482, 0, "s"], + [87483, 0, " "], + [87484, 0, "o"], + [87485, 0, "n"], + [87486, 0, " "], + [87487, 0, "t"], + [87488, 0, "h"], + [87489, 0, "e"], + [87490, 0, " "], + [87491, 0, "L"], + [87492, 0, "a"], + [87493, 0, "m"], + [87494, 0, "p"], + [87495, 0, "o"], + [87496, 0, "r"], + [87497, 0, "t"], + [87498, 0, " "], + [87499, 0, "t"], + [87500, 0, "i"], + [87501, 0, "m"], + [87502, 0, "e"], + [87503, 0, "s"], + [87504, 0, "t"], + [87505, 0, "a"], + [87506, 0, "m"], + [87507, 0, "p"], + [87508, 0, " "], + [87509, 0, "o"], + [87510, 0, "f"], + [87511, 0, " "], + [87512, 0, "t"], + [87513, 0, "h"], + [87514, 0, "e"], + [87515, 0, " "], + [87516, 0, "f"], + [87517, 0, "i"], + [87518, 0, "r"], + [87519, 0, "s"], + [87520, 0, "t"], + [87521, 0, " "], + [87522, 0, "o"], + [87523, 0, "p"], + [87524, 0, "e"], + [87525, 0, "r"], + [87526, 0, "a"], + [87527, 0, "t"], + [87528, 0, "i"], + [87529, 0, "o"], + [87530, 0, "n"], + [87531, 0, " "], + [87532, 0, "t"], + [87533, 0, "h"], + [87534, 0, "a"], + [87535, 0, "t"], + [87536, 0, " "], + [87536, 1], + [87535, 1], + [87534, 1], + [87533, 1], + [87532, 1], + [87531, 1], + [87530, 1], + [87529, 1], + [87528, 1], + [87527, 1], + [87526, 1], + [87525, 1], + [87524, 1], + [87523, 1], + [87522, 1], + [87522, 0, "i"], + [87523, 0, "n"], + [87524, 0, "s"], + [87525, 0, "e"], + [87526, 0, "r"], + [87527, 0, "t"], + [87528, 0, "i"], + [87529, 0, "o"], + [87530, 0, "n"], + [87531, 0, " "], + [87508, 0, "s"], + [87532, 0, "s"], + [87533, 0, " "], + [87485, 1], + [87484, 1], + [87483, 1], + [87482, 1], + [87481, 1], + [87480, 1], + [87479, 1], + [87478, 1], + [87477, 1], + [87476, 1], + [87476, 0, "i"], + [87477, 0, "s"], + [87478, 0, " "], + [87479, 0, "d"], + [87480, 0, "e"], + [87481, 0, "t"], + [87482, 0, "e"], + [87483, 0, "r"], + [87484, 0, "m"], + [87485, 0, "i"], + [87486, 0, "n"], + [87487, 0, "e"], + [87488, 0, "d"], + [87489, 0, " "], + [87490, 0, "b"], + [87491, 0, "y"], + [87540, 0, "i"], + [87541, 0, "n"], + [87542, 0, "t"], + [87543, 0, "o"], + [87544, 0, " "], + [87545, 0, "t"], + [87546, 0, "h"], + [87547, 0, "e"], + [87548, 0, " "], + [87549, 0, "i"], + [87550, 0, "n"], + [87551, 0, "s"], + [87552, 0, "e"], + [87553, 0, "r"], + [87554, 0, "t"], + [87555, 0, "i"], + [87556, 0, "o"], + [87557, 0, "n"], + [87558, 0, " "], + [87559, 0, "i"], + [87560, 0, "n"], + [87561, 0, "t"], + [87562, 0, "e"], + [87563, 0, "r"], + [87564, 0, "v"], + [87565, 0, "a"], + [87566, 0, "l"], + [87567, 0, " "], + [87568, 0, "a"], + [87569, 0, "f"], + [87570, 0, "t"], + [87571, 0, "e"], + [87572, 0, "r"], + [87573, 0, " "], + [87574, 0, "t"], + [87575, 0, "h"], + [87576, 0, "e"], + [87577, 0, " "], + [87578, 0, "c"], + [87579, 0, "o"], + [87580, 0, "m"], + [87581, 0, "m"], + [87582, 0, "o"], + [87583, 0, "n"], + [87584, 0, " "], + [87585, 0, "a"], + [87586, 0, "n"], + [87587, 0, "c"], + [87588, 0, "e"], + [87589, 0, "s"], + [87590, 0, "t"], + [87591, 0, "o"], + [87592, 0, "r"], + [87577, 0, "i"], + [87578, 0, "r"], + [87595, 1], + [87595, 0, ","], + [87596, 0, " "], + [87597, 0, "i"], + [87598, 0, "n"], + [87599, 0, " "], + [87600, 0, "t"], + [87601, 0, "h"], + [87602, 0, "e"], + [87603, 0, " "], + [87604, 0, "c"], + [87605, 0, "h"], + [87606, 0, "a"], + [87607, 0, "i"], + [87608, 0, "n"], + [87609, 0, " "], + [87610, 0, "o"], + [87611, 0, "f"], + [87612, 0, " "], + [87613, 0, "c"], + [87614, 0, "u"], + [87615, 0, "r"], + [87616, 0, "s"], + [87617, 0, "o"], + [87618, 0, "r"], + [87619, 0, " "], + [87620, 0, "r"], + [87621, 0, "e"], + [87622, 0, "v"], + [87622, 1], + [87622, 0, "f"], + [87623, 0, "e"], + [87624, 0, "r"], + [87625, 0, "e"], + [87626, 0, "n"], + [87627, 0, "c"], + [87628, 0, "e"], + [87629, 0, "s"], + [87630, 0, " "], + [87631, 0, "o"], + [87632, 0, "f"], + [87633, 0, " "], + [87609, 0, "s"], + [87635, 0, "t"], + [87636, 0, "h"], + [87637, 0, "e"], + [87638, 0, " "], + [87639, 0, "t"], + [87640, 0, "w"], + [87641, 0, "o"], + [87642, 0, " "], + [87643, 0, "o"], + [87644, 0, "p"], + [87645, 0, "e"], + [87646, 0, "r"], + [87647, 0, "a"], + [87648, 0, "t"], + [87649, 0, "i"], + [87650, 0, "o"], + [87651, 0, "n"], + [87652, 0, "s"], + [87653, 0, "."], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [88017, 1], + [97428, 1], + [97427, 1], + [97426, 1], + [97425, 1], + [97424, 1], + [97423, 1], + [97422, 1], + [97421, 1], + [97420, 1], + [97419, 1], + [97418, 1], + [97417, 1], + [97416, 1], + [97415, 1], + [97414, 1], + [97413, 1], + [97412, 1], + [97411, 1], + [97410, 1], + [97409, 1], + [97408, 1], + [97407, 1], + [97406, 1], + [97405, 1], + [97404, 1], + [97403, 1], + [97402, 1], + [97401, 1], + [97400, 1], + [97399, 1], + [97398, 1], + [97397, 1], + [97396, 1], + [97395, 1], + [97394, 1], + [97393, 1], + [97392, 1], + [97391, 1], + [97390, 1], + [97389, 1], + [97388, 1], + [97387, 1], + [97386, 1], + [97385, 1], + [97384, 1], + [97383, 1], + [97382, 1], + [97381, 1], + [97380, 1], + [97379, 1], + [97378, 1], + [97377, 1], + [97376, 1], + [97375, 1], + [97374, 1], + [97373, 1], + [97372, 1], + [97371, 1], + [97370, 1], + [97369, 1], + [97368, 1], + [97367, 1], + [97366, 1], + [97365, 1], + [97364, 1], + [97363, 1], + [97362, 1], + [97361, 1], + [97360, 1], + [97359, 1], + [97358, 1], + [97357, 1], + [97356, 1], + [97355, 1], + [97354, 1], + [97353, 1], + [97352, 1], + [97351, 1], + [97350, 1], + [97349, 1], + [97348, 1], + [97347, 1], + [97346, 1], + [97345, 1], + [97344, 1], + [97343, 1], + [97342, 1], + [97341, 1], + [97340, 1], + [97339, 1], + [97338, 1], + [97337, 1], + [97336, 1], + [97335, 1], + [97334, 1], + [97333, 1], + [97332, 1], + [97331, 1], + [97330, 1], + [97329, 1], + [97328, 1], + [97327, 1], + [97326, 1], + [97325, 1], + [97324, 1], + [97323, 1], + [97322, 1], + [97321, 1], + [97320, 1], + [97319, 1], + [97318, 1], + [97317, 1], + [97316, 1], + [97315, 1], + [97314, 1], + [97313, 1], + [97312, 1], + [97311, 1], + [97310, 1], + [97309, 1], + [97308, 1], + [97307, 1], + [97306, 1], + [97305, 1], + [97304, 1], + [97303, 1], + [97302, 1], + [97301, 1], + [97300, 1], + [97299, 1], + [97298, 1], + [97297, 1], + [97296, 1], + [97295, 1], + [97294, 1], + [97293, 1], + [97292, 1], + [97291, 1], + [97290, 1], + [97289, 1], + [97288, 1], + [97287, 1], + [97286, 1], + [97285, 1], + [97284, 1], + [97283, 1], + [97282, 1], + [97281, 1], + [97280, 1], + [97279, 1], + [97278, 1], + [97277, 1], + [97276, 1], + [97275, 1], + [97274, 1], + [97273, 1], + [97272, 1], + [97271, 1], + [97270, 1], + [97269, 1], + [97268, 1], + [97267, 1], + [97266, 1], + [97265, 1], + [97264, 1], + [97263, 1], + [97262, 1], + [97261, 1], + [97260, 1], + [97259, 1], + [97258, 1], + [97257, 1], + [97256, 1], + [97255, 1], + [97254, 1], + [97253, 1], + [97252, 1], + [97251, 1], + [97250, 1], + [97249, 1], + [97248, 1], + [97247, 1], + [97246, 1], + [97245, 1], + [97244, 1], + [97243, 1], + [97242, 1], + [97241, 1], + [97240, 1], + [97239, 1], + [97238, 1], + [97237, 1], + [97236, 1], + [97235, 1], + [97234, 1], + [97233, 1], + [97232, 1], + [97231, 1], + [97230, 1], + [97229, 1], + [97228, 1], + [97227, 1], + [97226, 1], + [97225, 1], + [97224, 1], + [97223, 1], + [97222, 1], + [97221, 1], + [97220, 1], + [97219, 1], + [97218, 1], + [97217, 1], + [97216, 1], + [97215, 1], + [97214, 1], + [97213, 1], + [97212, 1], + [97211, 1], + [97210, 1], + [97209, 1], + [97208, 1], + [97207, 1], + [97206, 1], + [97205, 1], + [97204, 1], + [97203, 1], + [97202, 1], + [97201, 1], + [97200, 1], + [97199, 1], + [97198, 1], + [97197, 1], + [97196, 1], + [97195, 1], + [97194, 1], + [97193, 1], + [97192, 1], + [97191, 1], + [97190, 1], + [97189, 1], + [97188, 1], + [97187, 1], + [97186, 1], + [97185, 1], + [97184, 1], + [97183, 1], + [97182, 1], + [97181, 1], + [97180, 1], + [97179, 1], + [97178, 1], + [97177, 1], + [97176, 1], + [97175, 1], + [97174, 1], + [97173, 1], + [97172, 1], + [97171, 1], + [97170, 1], + [97169, 1], + [97168, 1], + [97167, 1], + [97166, 1], + [97165, 1], + [97164, 1], + [97163, 1], + [97162, 1], + [97161, 1], + [97160, 1], + [97159, 1], + [97158, 1], + [97157, 1], + [97156, 1], + [97155, 1], + [97154, 1], + [97153, 1], + [97152, 1], + [97151, 1], + [97150, 1], + [97149, 1], + [97148, 1], + [97147, 1], + [97146, 1], + [97145, 1], + [97144, 1], + [97143, 1], + [97142, 1], + [97141, 1], + [97140, 1], + [97139, 1], + [97138, 1], + [97137, 1], + [97136, 1], + [97135, 1], + [97134, 1], + [97133, 1], + [97132, 1], + [97131, 1], + [97130, 1], + [97129, 1], + [97128, 1], + [97127, 1], + [97126, 1], + [97125, 1], + [97124, 1], + [97123, 1], + [97122, 1], + [97121, 1], + [97120, 1], + [97119, 1], + [97118, 1], + [97117, 1], + [97116, 1], + [97115, 1], + [97114, 1], + [97113, 1], + [97112, 1], + [97111, 1], + [97110, 1], + [97109, 1], + [97108, 1], + [97107, 1], + [97106, 1], + [97105, 1], + [97104, 1], + [97103, 1], + [97102, 1], + [97101, 1], + [97100, 1], + [97099, 1], + [97098, 1], + [97097, 1], + [97096, 1], + [97095, 1], + [97094, 1], + [97093, 1], + [97092, 1], + [97091, 1], + [97090, 1], + [97089, 1], + [97088, 1], + [97087, 1], + [97086, 1], + [97085, 1], + [97084, 1], + [97083, 1], + [97082, 1], + [97081, 1], + [97080, 1], + [97079, 1], + [97078, 1], + [97077, 1], + [97076, 1], + [97075, 1], + [97074, 1], + [97073, 1], + [97072, 1], + [97071, 1], + [97070, 1], + [97069, 1], + [97068, 1], + [97067, 1], + [97066, 1], + [97065, 1], + [97064, 1], + [97063, 1], + [97062, 1], + [97061, 1], + [97060, 1], + [97059, 1], + [97058, 1], + [97057, 1], + [97056, 1], + [97055, 1], + [97054, 1], + [97053, 1], + [97052, 1], + [97051, 1], + [97050, 1], + [97049, 1], + [97048, 1], + [97047, 1], + [97046, 1], + [97045, 1], + [97044, 1], + [97043, 1], + [97042, 1], + [97041, 1], + [97040, 1], + [97039, 1], + [97038, 1], + [97037, 1], + [97036, 1], + [97035, 1], + [97034, 1], + [97033, 1], + [97032, 1], + [97031, 1], + [97030, 1], + [97029, 1], + [97028, 1], + [97027, 1], + [97026, 1], + [97025, 1], + [97024, 1], + [97023, 1], + [97022, 1], + [97021, 1], + [97020, 1], + [97019, 1], + [97018, 1], + [97017, 1], + [97016, 1], + [97015, 1], + [97014, 1], + [97013, 1], + [97012, 1], + [97011, 1], + [97010, 1], + [97009, 1], + [97008, 1], + [97007, 1], + [97006, 1], + [97005, 1], + [97004, 1], + [97003, 1], + [97002, 1], + [97001, 1], + [97000, 1], + [96999, 1], + [96998, 1], + [96997, 1], + [96996, 1], + [96995, 1], + [96994, 1], + [96993, 1], + [96992, 1], + [96991, 1], + [96990, 1], + [96989, 1], + [96988, 1], + [96987, 1], + [96986, 1], + [96985, 1], + [96984, 1], + [96983, 1], + [96982, 1], + [96981, 1], + [96980, 1], + [96979, 1], + [96978, 1], + [96977, 1], + [96976, 1], + [96975, 1], + [96974, 1], + [96973, 1], + [96972, 1], + [96971, 1], + [96970, 1], + [96969, 1], + [96968, 1], + [96967, 1], + [96966, 1], + [96965, 1], + [96964, 1], + [96963, 1], + [96962, 1], + [96961, 1], + [96960, 1], + [96959, 1], + [96958, 1], + [96957, 1], + [96956, 1], + [96955, 1], + [96954, 1], + [96953, 1], + [96952, 1], + [96951, 1], + [96950, 1], + [96949, 1], + [96948, 1], + [96947, 1], + [96946, 1], + [96945, 1], + [96944, 1], + [96943, 1], + [96942, 1], + [96941, 1], + [96940, 1], + [96939, 1], + [96938, 1], + [96937, 1], + [96936, 1], + [96935, 1], + [96934, 1], + [96933, 1], + [96932, 1], + [96931, 1], + [96930, 1], + [96929, 1], + [96928, 1], + [96927, 1], + [96926, 1], + [96925, 1], + [96924, 1], + [96923, 1], + [96922, 1], + [96921, 1], + [96920, 1], + [96919, 1], + [96918, 1], + [96917, 1], + [96916, 1], + [96915, 1], + [96914, 1], + [96913, 1], + [96912, 1], + [96911, 1], + [96910, 1], + [96909, 1], + [96908, 1], + [96907, 1], + [96906, 1], + [96905, 1], + [96904, 1], + [96903, 1], + [96902, 1], + [96901, 1], + [96900, 1], + [96899, 1], + [96898, 1], + [96897, 1], + [96896, 1], + [96895, 1], + [96894, 1], + [96893, 1], + [96892, 1], + [96891, 1], + [96890, 1], + [96889, 1], + [96888, 1], + [96887, 1], + [96886, 1], + [96885, 1], + [96884, 1], + [96883, 1], + [96882, 1], + [96881, 1], + [96880, 1], + [96879, 1], + [96878, 1], + [96877, 1], + [96876, 1], + [96875, 1], + [96874, 1], + [96873, 1], + [96872, 1], + [96871, 1], + [96870, 1], + [96869, 1], + [96868, 1], + [96867, 1], + [96866, 1], + [96865, 1], + [96864, 1], + [96863, 1], + [96862, 1], + [96861, 1], + [96860, 1], + [96859, 1], + [96858, 1], + [96857, 1], + [96856, 1], + [96855, 1], + [96854, 1], + [96853, 1], + [96852, 1], + [96851, 1], + [96850, 1], + [96849, 1], + [96848, 1], + [96847, 1], + [96846, 1], + [96845, 1], + [96844, 1], + [96843, 1], + [96842, 1], + [96841, 1], + [96840, 1], + [96839, 1], + [96838, 1], + [96837, 1], + [96836, 1], + [96835, 1], + [96834, 1], + [96833, 1], + [96832, 1], + [96831, 1], + [96830, 1], + [96829, 1], + [96828, 1], + [96827, 1], + [96826, 1], + [96825, 1], + [96824, 1], + [96823, 1], + [96822, 1], + [96821, 1], + [96820, 1], + [96819, 1], + [96818, 1], + [96817, 1], + [96816, 1], + [96815, 1], + [96814, 1], + [96813, 1], + [96812, 1], + [96811, 1], + [96810, 1], + [96809, 1], + [96808, 1], + [96807, 1], + [96806, 1], + [96805, 1], + [96804, 1], + [96803, 1], + [96802, 1], + [96801, 1], + [96800, 1], + [96799, 1], + [96798, 1], + [96797, 1], + [96796, 1], + [96795, 1], + [96794, 1], + [96793, 1], + [96792, 1], + [96791, 1], + [96790, 1], + [96789, 1], + [96788, 1], + [96787, 1], + [96786, 1], + [96785, 1], + [96784, 1], + [96783, 1], + [96782, 1], + [96781, 1], + [96780, 1], + [96779, 1], + [96778, 1], + [96777, 1], + [96776, 1], + [96775, 1], + [96774, 1], + [96773, 1], + [96772, 1], + [96771, 1], + [96770, 1], + [96769, 1], + [96768, 1], + [96767, 1], + [96766, 1], + [96765, 1], + [96764, 1], + [96763, 1], + [96762, 1], + [96761, 1], + [96760, 1], + [96759, 1], + [96758, 1], + [96757, 1], + [96756, 1], + [96755, 1], + [96754, 1], + [96753, 1], + [96752, 1], + [96751, 1], + [96750, 1], + [96749, 1], + [96748, 1], + [96747, 1], + [96746, 1], + [96745, 1], + [96744, 1], + [96743, 1], + [96742, 1], + [96741, 1], + [96740, 1], + [96739, 1], + [96738, 1], + [96737, 1], + [96736, 1], + [96735, 1], + [96734, 1], + [96733, 1], + [96732, 1], + [96731, 1], + [96730, 1], + [96729, 1], + [96728, 1], + [96727, 1], + [96726, 1], + [96725, 1], + [96724, 1], + [96723, 1], + [96722, 1], + [96721, 1], + [96720, 1], + [96719, 1], + [96718, 1], + [96717, 1], + [96716, 1], + [96715, 1], + [96714, 1], + [96713, 1], + [96712, 1], + [96711, 1], + [96710, 1], + [96709, 1], + [96708, 1], + [96707, 1], + [96706, 1], + [96705, 1], + [96704, 1], + [96703, 1], + [96702, 1], + [96701, 1], + [96700, 1], + [96699, 1], + [96698, 1], + [96697, 1], + [96696, 1], + [96695, 1], + [96694, 1], + [96693, 1], + [96692, 1], + [96691, 1], + [96690, 1], + [96689, 1], + [96688, 1], + [96687, 1], + [96686, 1], + [96685, 1], + [96684, 1], + [96683, 1], + [96682, 1], + [96681, 1], + [96680, 1], + [96679, 1], + [96678, 1], + [96677, 1], + [96676, 1], + [96675, 1], + [96674, 1], + [96673, 1], + [96672, 1], + [96671, 1], + [96670, 1], + [96669, 1], + [96668, 1], + [96667, 1], + [96666, 1], + [96665, 1], + [96664, 1], + [96663, 1], + [96662, 1], + [96661, 1], + [96660, 1], + [96659, 1], + [96658, 1], + [96657, 1], + [96656, 1], + [96655, 1], + [96654, 1], + [96653, 1], + [96652, 1], + [96651, 1], + [96650, 1], + [96649, 1], + [96648, 1], + [96647, 1], + [96646, 1], + [96645, 1], + [96644, 1], + [96643, 1], + [96642, 1], + [96641, 1], + [96640, 1], + [96639, 1], + [96638, 1], + [96637, 1], + [96636, 1], + [96635, 1], + [96634, 1], + [96633, 1], + [96632, 1], + [96631, 1], + [96630, 1], + [96629, 1], + [96628, 1], + [96627, 1], + [96626, 1], + [96625, 1], + [96624, 1], + [96623, 1], + [96622, 1], + [96621, 1], + [96620, 1], + [96619, 1], + [96618, 1], + [96617, 1], + [96616, 1], + [96615, 1], + [96614, 1], + [96613, 1], + [96612, 1], + [96611, 1], + [96610, 1], + [96609, 1], + [96608, 1], + [96607, 1], + [96606, 1], + [96605, 1], + [96604, 1], + [96603, 1], + [96602, 1], + [96601, 1], + [96600, 1], + [96599, 1], + [96598, 1], + [96597, 1], + [96596, 1], + [96595, 1], + [96594, 1], + [96593, 1], + [96592, 1], + [96591, 1], + [96590, 1], + [96589, 1], + [96588, 1], + [96587, 1], + [96586, 1], + [96585, 1], + [96584, 1], + [96583, 1], + [96582, 1], + [96581, 1], + [96580, 1], + [96579, 1], + [96578, 1], + [96577, 1], + [96576, 1], + [96575, 1], + [96574, 1], + [96573, 1], + [96572, 1], + [96571, 1], + [96570, 1], + [96569, 1], + [96568, 1], + [96567, 1], + [96566, 1], + [96565, 1], + [96564, 1], + [96563, 1], + [96562, 1], + [96561, 1], + [96560, 1], + [96559, 1], + [96558, 1], + [96557, 1], + [96556, 1], + [96555, 1], + [96554, 1], + [96553, 1], + [96552, 1], + [96551, 1], + [96550, 1], + [96549, 1], + [96548, 1], + [96547, 1], + [96546, 1], + [96545, 1], + [96544, 1], + [96543, 1], + [96542, 1], + [96541, 1], + [96540, 1], + [96539, 1], + [96538, 1], + [96537, 1], + [96536, 1], + [96535, 1], + [96534, 1], + [96533, 1], + [96532, 1], + [96531, 1], + [96530, 1], + [96529, 1], + [96528, 1], + [96527, 1], + [96526, 1], + [96525, 1], + [96524, 1], + [96523, 1], + [96522, 1], + [96521, 1], + [96520, 1], + [96519, 1], + [96518, 1], + [96517, 1], + [96516, 1], + [96515, 1], + [96514, 1], + [96513, 1], + [96512, 1], + [96511, 1], + [96510, 1], + [96509, 1], + [96508, 1], + [96507, 1], + [96506, 1], + [96505, 1], + [96504, 1], + [96503, 1], + [96502, 1], + [96501, 1], + [96500, 1], + [96499, 1], + [96498, 1], + [96497, 1], + [96496, 1], + [96495, 1], + [96494, 1], + [96493, 1], + [96492, 1], + [96491, 1], + [96490, 1], + [96489, 1], + [96488, 1], + [96487, 1], + [96486, 1], + [96485, 1], + [96484, 1], + [96483, 1], + [96482, 1], + [96481, 1], + [96480, 1], + [96479, 1], + [96478, 1], + [96477, 1], + [96476, 1], + [96475, 1], + [96474, 1], + [96473, 1], + [96472, 1], + [96471, 1], + [96470, 1], + [96469, 1], + [96468, 1], + [96467, 1], + [96466, 1], + [96465, 1], + [96464, 1], + [96463, 1], + [96462, 1], + [96461, 1], + [96460, 1], + [96459, 1], + [96458, 1], + [96457, 1], + [96456, 1], + [96455, 1], + [96454, 1], + [96453, 1], + [96452, 1], + [96451, 1], + [96450, 1], + [96449, 1], + [96448, 1], + [96447, 1], + [96446, 1], + [96445, 1], + [96444, 1], + [96443, 1], + [96442, 1], + [96441, 1], + [96440, 1], + [96439, 1], + [96438, 1], + [96437, 1], + [96436, 1], + [96435, 1], + [96434, 1], + [96433, 1], + [96432, 1], + [96431, 1], + [96430, 1], + [96429, 1], + [96428, 1], + [96427, 1], + [96426, 1], + [96425, 1], + [96424, 1], + [96423, 1], + [96422, 1], + [96421, 1], + [96420, 1], + [96419, 1], + [96418, 1], + [96417, 1], + [96416, 1], + [96415, 1], + [96414, 1], + [96413, 1], + [96412, 1], + [96411, 1], + [96410, 1], + [96409, 1], + [96408, 1], + [96407, 1], + [96406, 1], + [96405, 1], + [96404, 1], + [96403, 1], + [96402, 1], + [96401, 1], + [96400, 1], + [96399, 1], + [96398, 1], + [96397, 1], + [96396, 1], + [96395, 1], + [96394, 1], + [96393, 1], + [96392, 1], + [96391, 1], + [96390, 1], + [96389, 1], + [96388, 1], + [96387, 1], + [96386, 1], + [96385, 1], + [96384, 1], + [96383, 1], + [96382, 1], + [96381, 1], + [96380, 1], + [96379, 1], + [96378, 1], + [96377, 1], + [96376, 1], + [96375, 1], + [96374, 1], + [96373, 1], + [96372, 1], + [96371, 1], + [96370, 1], + [96369, 1], + [96368, 1], + [96367, 1], + [96366, 1], + [96365, 1], + [96364, 1], + [96363, 1], + [96362, 1], + [96361, 1], + [96360, 1], + [96359, 1], + [96358, 1], + [96357, 1], + [96356, 1], + [96355, 1], + [96354, 1], + [96353, 1], + [96352, 1], + [96351, 1], + [96350, 1], + [96349, 1], + [96348, 1], + [96347, 1], + [96346, 1], + [96345, 1], + [96344, 1], + [96343, 1], + [96342, 1], + [96341, 1], + [96340, 1], + [96339, 1], + [96338, 1], + [96337, 1], + [96336, 1], + [96335, 1], + [96334, 1], + [96333, 1], + [96332, 1], + [96331, 1], + [96330, 1], + [96329, 1], + [96328, 1], + [96327, 1], + [96326, 1], + [96325, 1], + [96324, 1], + [96323, 1], + [96322, 1], + [96321, 1], + [96320, 1], + [96319, 1], + [96318, 1], + [96317, 1], + [96316, 1], + [96315, 1], + [96314, 1], + [96313, 1], + [96312, 1], + [96311, 1], + [96310, 1], + [96309, 1], + [96308, 1], + [96307, 1], + [96306, 1], + [96305, 1], + [96304, 1], + [96303, 1], + [96302, 1], + [96301, 1], + [96300, 1], + [96299, 1], + [96298, 1], + [96297, 1], + [96296, 1], + [96295, 1], + [96294, 1], + [96293, 1], + [96292, 1], + [96291, 1], + [96290, 1], + [96289, 1], + [96288, 1], + [96287, 1], + [96286, 1], + [96285, 1], + [96284, 1], + [96283, 1], + [96282, 1], + [96281, 1], + [96280, 1], + [96279, 1], + [96278, 1], + [96277, 1], + [96276, 1], + [96275, 1], + [96274, 1], + [96273, 1], + [96272, 1], + [96271, 1], + [96270, 1], + [96269, 1], + [96268, 1], + [96267, 1], + [96266, 1], + [96265, 1], + [96264, 1], + [96263, 1], + [96262, 1], + [96261, 1], + [96260, 1], + [96259, 1], + [96258, 1], + [96257, 1], + [96256, 1], + [96255, 1], + [96254, 1], + [96253, 1], + [96252, 1], + [96251, 1], + [96250, 1], + [96249, 1], + [96248, 1], + [96247, 1], + [96246, 1], + [96245, 1], + [96244, 1], + [96243, 1], + [96242, 1], + [96241, 1], + [96240, 1], + [96239, 1], + [96238, 1], + [96237, 1], + [96236, 1], + [96235, 1], + [96234, 1], + [96233, 1], + [96232, 1], + [96231, 1], + [96230, 1], + [96229, 1], + [96228, 1], + [96227, 1], + [96226, 1], + [96225, 1], + [96224, 1], + [96223, 1], + [96222, 1], + [96221, 1], + [96220, 1], + [96219, 1], + [96218, 1], + [96217, 1], + [96216, 1], + [96215, 1], + [96214, 1], + [96213, 1], + [96212, 1], + [96211, 1], + [96210, 1], + [96209, 1], + [96208, 1], + [96207, 1], + [96206, 1], + [96205, 1], + [96204, 1], + [96203, 1], + [96202, 1], + [96201, 1], + [96200, 1], + [96199, 1], + [96198, 1], + [96197, 1], + [96196, 1], + [96195, 1], + [96194, 1], + [96193, 1], + [96192, 1], + [96191, 1], + [96190, 1], + [96189, 1], + [96188, 1], + [96187, 1], + [96186, 1], + [96185, 1], + [96184, 1], + [96183, 1], + [96182, 1], + [96181, 1], + [96180, 1], + [96179, 1], + [96178, 1], + [96177, 1], + [96176, 1], + [96175, 1], + [96174, 1], + [96173, 1], + [96172, 1], + [96171, 1], + [96170, 1], + [96169, 1], + [96168, 1], + [96167, 1], + [96166, 1], + [96165, 1], + [96164, 1], + [96163, 1], + [96162, 1], + [96161, 1], + [96160, 1], + [96159, 1], + [96158, 1], + [96157, 1], + [96156, 1], + [96155, 1], + [96154, 1], + [96153, 1], + [96152, 1], + [96151, 1], + [96150, 1], + [96149, 1], + [96148, 1], + [96147, 1], + [96146, 1], + [96145, 1], + [96144, 1], + [96143, 1], + [96142, 1], + [96141, 1], + [96140, 1], + [96139, 1], + [96138, 1], + [96137, 1], + [96136, 1], + [96135, 1], + [96134, 1], + [96133, 1], + [96132, 1], + [96131, 1], + [96130, 1], + [96129, 1], + [96128, 1], + [96127, 1], + [96126, 1], + [96125, 1], + [96124, 1], + [96123, 1], + [96122, 1], + [96121, 1], + [96120, 1], + [96119, 1], + [96118, 1], + [96117, 1], + [96116, 1], + [96115, 1], + [96114, 1], + [96113, 1], + [96112, 1], + [96111, 1], + [96110, 1], + [96109, 1], + [96108, 1], + [96107, 1], + [96106, 1], + [96105, 1], + [96104, 1], + [96103, 1], + [96102, 1], + [96101, 1], + [96100, 1], + [96099, 1], + [96098, 1], + [96097, 1], + [96096, 1], + [96095, 1], + [96094, 1], + [96093, 1], + [96092, 1], + [96091, 1], + [96090, 1], + [96089, 1], + [96088, 1], + [96087, 1], + [96086, 1], + [96085, 1], + [96084, 1], + [96083, 1], + [96082, 1], + [96081, 1], + [96080, 1], + [96079, 1], + [96078, 1], + [96077, 1], + [96076, 1], + [96075, 1], + [96074, 1], + [96073, 1], + [96072, 1], + [96071, 1], + [96070, 1], + [96069, 1], + [96068, 1], + [96067, 1], + [96066, 1], + [96065, 1], + [96064, 1], + [96063, 1], + [96062, 1], + [96061, 1], + [96060, 1], + [96059, 1], + [96058, 1], + [96057, 1], + [96056, 1], + [96055, 1], + [96054, 1], + [96053, 1], + [96052, 1], + [96051, 1], + [96050, 1], + [96049, 1], + [96048, 1], + [96047, 1], + [96046, 1], + [96045, 1], + [96044, 1], + [96043, 1], + [96042, 1], + [96041, 1], + [96040, 1], + [96039, 1], + [96038, 1], + [96037, 1], + [96036, 1], + [96035, 1], + [96034, 1], + [96033, 1], + [96032, 1], + [96031, 1], + [96030, 1], + [96029, 1], + [96028, 1], + [96027, 1], + [96026, 1], + [96025, 1], + [96024, 1], + [96023, 1], + [96022, 1], + [96021, 1], + [96020, 1], + [96019, 1], + [96018, 1], + [96017, 1], + [96016, 1], + [96015, 1], + [96014, 1], + [96013, 1], + [96012, 1], + [96011, 1], + [96010, 1], + [96009, 1], + [96008, 1], + [96007, 1], + [96006, 1], + [96005, 1], + [96004, 1], + [96003, 1], + [96002, 1], + [96001, 1], + [96000, 1], + [95999, 1], + [95998, 1], + [95997, 1], + [95996, 1], + [95995, 1], + [95994, 1], + [95993, 1], + [95992, 1], + [95991, 1], + [95990, 1], + [95989, 1], + [95988, 1], + [95987, 1], + [95986, 1], + [95985, 1], + [95984, 1], + [95983, 1], + [95982, 1], + [95981, 1], + [95980, 1], + [95979, 1], + [95978, 1], + [95977, 1], + [95976, 1], + [95975, 1], + [95974, 1], + [95973, 1], + [95972, 1], + [95971, 1], + [95970, 1], + [95969, 1], + [95968, 1], + [95967, 1], + [95966, 1], + [95965, 1], + [95964, 1], + [95963, 1], + [95962, 1], + [95961, 1], + [95960, 1], + [95959, 1], + [95958, 1], + [95957, 1], + [95956, 1], + [95955, 1], + [95954, 1], + [95953, 1], + [95952, 1], + [95951, 1], + [95950, 1], + [95949, 1], + [95948, 1], + [95947, 1], + [95946, 1], + [95945, 1], + [95944, 1], + [95943, 1], + [95942, 1], + [95941, 1], + [95940, 1], + [95939, 1], + [95938, 1], + [95937, 1], + [95936, 1], + [95935, 1], + [95934, 1], + [95933, 1], + [95932, 1], + [95931, 1], + [95930, 1], + [95929, 1], + [95928, 1], + [95927, 1], + [95926, 1], + [95925, 1], + [95924, 1], + [95923, 1], + [95922, 1], + [95921, 1], + [95920, 1], + [95919, 1], + [95918, 1], + [95917, 1], + [95916, 1], + [95915, 1], + [95914, 1], + [95913, 1], + [95912, 1], + [95911, 1], + [95910, 1], + [95909, 1], + [95908, 1], + [95907, 1], + [95906, 1], + [95905, 1], + [95904, 1], + [95903, 1], + [95902, 1], + [95901, 1], + [95900, 1], + [95899, 1], + [95898, 1], + [95897, 1], + [95896, 1], + [95895, 1], + [95894, 1], + [95893, 1], + [95892, 1], + [95891, 1], + [95890, 1], + [95889, 1], + [95888, 1], + [95887, 1], + [95886, 1], + [95885, 1], + [95884, 1], + [95883, 1], + [95882, 1], + [95881, 1], + [95880, 1], + [95879, 1], + [95878, 1], + [95877, 1], + [95876, 1], + [95875, 1], + [95874, 1], + [95873, 1], + [95872, 1], + [95871, 1], + [95870, 1], + [95869, 1], + [95868, 1], + [95867, 1], + [95866, 1], + [95865, 1], + [95864, 1], + [95863, 1], + [95862, 1], + [95861, 1], + [95860, 1], + [95859, 1], + [95858, 1], + [95857, 1], + [95856, 1], + [95855, 1], + [95854, 1], + [95853, 1], + [95852, 1], + [95851, 1], + [95850, 1], + [95849, 1], + [95848, 1], + [95847, 1], + [95846, 1], + [95845, 1], + [95844, 1], + [95843, 1], + [95842, 1], + [95841, 1], + [95840, 1], + [95839, 1], + [95838, 1], + [95837, 1], + [95836, 1], + [95835, 1], + [95834, 1], + [95833, 1], + [95832, 1], + [95831, 1], + [95830, 1], + [95829, 1], + [95828, 1], + [95827, 1], + [95826, 1], + [95825, 1], + [95824, 1], + [95823, 1], + [95822, 1], + [95821, 1], + [95820, 1], + [95819, 1], + [95818, 1], + [95817, 1], + [95816, 1], + [95815, 1], + [95814, 1], + [95813, 1], + [95812, 1], + [95811, 1], + [95810, 1], + [95809, 1], + [95808, 1], + [95807, 1], + [95806, 1], + [95805, 1], + [95804, 1], + [95803, 1], + [95802, 1], + [95801, 1], + [95800, 1], + [95799, 1], + [95798, 1], + [95797, 1], + [95796, 1], + [95795, 1], + [95794, 1], + [95793, 1], + [95792, 1], + [95791, 1], + [95790, 1], + [95789, 1], + [95788, 1], + [95787, 1], + [95786, 1], + [95785, 1], + [95784, 1], + [95783, 1], + [95782, 1], + [95781, 1], + [95780, 1], + [95779, 1], + [95778, 1], + [95777, 1], + [95776, 1], + [95775, 1], + [95774, 1], + [95773, 1], + [95772, 1], + [95771, 1], + [95770, 1], + [95769, 1], + [95768, 1], + [95767, 1], + [95766, 1], + [95765, 1], + [95764, 1], + [95763, 1], + [95762, 1], + [95761, 1], + [95760, 1], + [95759, 1], + [95758, 1], + [95757, 1], + [95756, 1], + [95755, 1], + [95754, 1], + [95753, 1], + [95752, 1], + [95751, 1], + [95750, 1], + [95749, 1], + [95748, 1], + [95747, 1], + [95746, 1], + [95745, 1], + [95744, 1], + [95743, 1], + [95742, 1], + [95741, 1], + [95740, 1], + [95739, 1], + [95738, 1], + [95737, 1], + [95736, 1], + [95735, 1], + [95734, 1], + [95733, 1], + [95732, 1], + [95731, 1], + [95730, 1], + [95729, 1], + [95728, 1], + [95727, 1], + [95726, 1], + [95725, 1], + [95724, 1], + [95723, 1], + [95722, 1], + [95721, 1], + [95720, 1], + [95719, 1], + [95718, 1], + [95717, 1], + [95716, 1], + [95715, 1], + [95714, 1], + [95713, 1], + [95712, 1], + [95711, 1], + [95710, 1], + [95709, 1], + [95708, 1], + [95707, 1], + [95706, 1], + [95705, 1], + [95704, 1], + [95703, 1], + [95702, 1], + [95701, 1], + [95700, 1], + [95699, 1], + [95698, 1], + [95697, 1], + [95696, 1], + [95695, 1], + [95694, 1], + [95693, 1], + [95692, 1], + [95691, 1], + [95690, 1], + [95689, 1], + [95688, 1], + [95687, 1], + [95686, 1], + [95685, 1], + [95684, 1], + [95683, 1], + [95682, 1], + [95681, 1], + [95680, 1], + [95679, 1], + [95678, 1], + [95677, 1], + [95676, 1], + [95675, 1], + [95674, 1], + [95673, 1], + [95672, 1], + [95671, 1], + [95670, 1], + [95669, 1], + [95668, 1], + [95667, 1], + [95666, 1], + [95665, 1], + [95664, 1], + [95663, 1], + [95662, 1], + [95661, 1], + [95660, 1], + [95659, 1], + [95658, 1], + [95657, 1], + [95656, 1], + [95655, 1], + [95654, 1], + [95653, 1], + [95652, 1], + [95651, 1], + [95650, 1], + [95649, 1], + [95648, 1], + [95647, 1], + [95646, 1], + [95645, 1], + [95644, 1], + [95643, 1], + [95642, 1], + [95641, 1], + [95640, 1], + [95639, 1], + [95638, 1], + [95637, 1], + [95636, 1], + [95635, 1], + [95634, 1], + [95633, 1], + [95632, 1], + [95631, 1], + [95630, 1], + [95629, 1], + [95628, 1], + [95627, 1], + [95626, 1], + [95625, 1], + [95624, 1], + [95623, 1], + [95622, 1], + [95621, 1], + [95620, 1], + [95619, 1], + [95618, 1], + [95617, 1], + [95616, 1], + [95615, 1], + [95614, 1], + [95613, 1], + [95612, 1], + [95611, 1], + [95610, 1], + [95609, 1], + [95608, 1], + [95607, 1], + [95606, 1], + [95605, 1], + [95604, 1], + [95603, 1], + [95602, 1], + [95601, 1], + [95600, 1], + [95599, 1], + [95598, 1], + [95597, 1], + [95596, 1], + [95595, 1], + [95594, 1], + [95593, 1], + [95592, 1], + [95591, 1], + [95590, 1], + [95589, 1], + [95588, 1], + [95587, 1], + [95586, 1], + [95585, 1], + [95584, 1], + [95583, 1], + [95582, 1], + [95581, 1], + [95580, 1], + [95579, 1], + [95578, 1], + [95577, 1], + [95576, 1], + [95575, 1], + [95574, 1], + [95573, 1], + [95572, 1], + [95571, 1], + [95570, 1], + [95569, 1], + [95568, 1], + [95567, 1], + [95566, 1], + [95565, 1], + [95564, 1], + [95563, 1], + [95562, 1], + [95561, 1], + [95560, 1], + [95559, 1], + [95558, 1], + [95557, 1], + [95556, 1], + [95555, 1], + [95554, 1], + [95553, 1], + [95552, 1], + [95551, 1], + [95550, 1], + [95549, 1], + [95548, 1], + [95547, 1], + [95546, 1], + [95545, 1], + [95544, 1], + [95543, 1], + [95542, 1], + [95541, 1], + [95540, 1], + [95539, 1], + [95538, 1], + [95537, 1], + [95536, 1], + [95535, 1], + [95534, 1], + [95533, 1], + [95532, 1], + [95531, 1], + [95530, 1], + [95529, 1], + [95528, 1], + [95527, 1], + [95526, 1], + [95525, 1], + [95524, 1], + [95523, 1], + [95522, 1], + [95521, 1], + [95520, 1], + [95519, 1], + [95518, 1], + [95517, 1], + [95516, 1], + [95515, 1], + [95514, 1], + [95513, 1], + [95512, 1], + [95511, 1], + [95510, 1], + [95509, 1], + [95508, 1], + [95507, 1], + [95506, 1], + [95505, 1], + [95504, 1], + [95503, 1], + [95502, 1], + [95501, 1], + [95500, 1], + [95499, 1], + [95498, 1], + [95497, 1], + [95496, 1], + [95495, 1], + [95494, 1], + [95493, 1], + [95492, 1], + [95491, 1], + [95490, 1], + [95489, 1], + [95488, 1], + [95487, 1], + [95486, 1], + [95485, 1], + [95484, 1], + [95483, 1], + [95482, 1], + [95481, 1], + [95480, 1], + [95479, 1], + [95478, 1], + [95477, 1], + [95476, 1], + [95475, 1], + [95474, 1], + [95473, 1], + [95472, 1], + [95471, 1], + [95470, 1], + [95469, 1], + [95468, 1], + [95467, 1], + [95466, 1], + [95465, 1], + [95464, 1], + [95463, 1], + [95462, 1], + [95461, 1], + [95460, 1], + [95459, 1], + [95458, 1], + [95457, 1], + [95456, 1], + [95455, 1], + [95454, 1], + [95453, 1], + [95452, 1], + [95451, 1], + [95450, 1], + [95449, 1], + [95448, 1], + [95447, 1], + [95446, 1], + [95445, 1], + [95444, 1], + [95443, 1], + [95442, 1], + [95441, 1], + [95440, 1], + [95439, 1], + [95438, 1], + [95437, 1], + [95436, 1], + [95435, 1], + [95434, 1], + [95433, 1], + [95432, 1], + [95431, 1], + [95430, 1], + [95429, 1], + [95428, 1], + [95427, 1], + [95426, 1], + [95425, 1], + [95424, 1], + [95423, 1], + [95422, 1], + [95421, 1], + [95420, 1], + [95419, 1], + [95418, 1], + [95417, 1], + [95416, 1], + [95415, 1], + [95414, 1], + [95413, 1], + [95412, 1], + [95411, 1], + [95410, 1], + [95409, 1], + [95408, 1], + [95407, 1], + [95406, 1], + [95405, 1], + [95404, 1], + [95403, 1], + [95402, 1], + [95401, 1], + [95400, 1], + [95399, 1], + [95398, 1], + [95397, 1], + [95396, 1], + [95395, 1], + [95394, 1], + [95393, 1], + [95392, 1], + [95391, 1], + [95390, 1], + [95389, 1], + [95388, 1], + [95387, 1], + [95386, 1], + [95385, 1], + [95384, 1], + [95383, 1], + [95382, 1], + [95381, 1], + [95380, 1], + [95379, 1], + [95378, 1], + [95377, 1], + [95376, 1], + [95375, 1], + [95374, 1], + [95373, 1], + [95372, 1], + [95371, 1], + [95370, 1], + [95369, 1], + [95368, 1], + [95367, 1], + [95366, 1], + [95365, 1], + [95364, 1], + [95363, 1], + [95362, 1], + [95361, 1], + [95360, 1], + [95359, 1], + [95358, 1], + [95357, 1], + [95356, 1], + [95355, 1], + [95354, 1], + [95353, 1], + [95352, 1], + [95351, 1], + [95350, 1], + [95349, 1], + [95348, 1], + [95347, 1], + [95346, 1], + [95345, 1], + [95344, 1], + [95343, 1], + [95342, 1], + [95341, 1], + [95340, 1], + [95339, 1], + [95338, 1], + [95337, 1], + [95336, 1], + [95335, 1], + [95334, 1], + [95333, 1], + [95332, 1], + [95331, 1], + [95330, 1], + [95329, 1], + [95328, 1], + [95327, 1], + [95326, 1], + [95325, 1], + [95324, 1], + [95323, 1], + [95322, 1], + [95321, 1], + [95320, 1], + [95319, 1], + [95318, 1], + [95317, 1], + [95316, 1], + [95315, 1], + [95314, 1], + [95313, 1], + [95312, 1], + [95311, 1], + [95310, 1], + [95309, 1], + [95308, 1], + [95307, 1], + [95306, 1], + [95305, 1], + [95304, 1], + [95303, 1], + [95302, 1], + [95301, 1], + [95300, 1], + [95299, 1], + [95298, 1], + [95297, 1], + [95296, 1], + [95295, 1], + [95294, 1], + [95293, 1], + [95292, 1], + [95291, 1], + [95290, 1], + [95289, 1], + [95288, 1], + [95287, 1], + [95286, 1], + [95285, 1], + [95284, 1], + [95283, 1], + [95282, 1], + [95281, 1], + [95280, 1], + [95279, 1], + [95278, 1], + [95277, 1], + [95276, 1], + [95275, 1], + [95274, 1], + [95273, 1], + [95272, 1], + [95271, 1], + [95270, 1], + [95269, 1], + [95268, 1], + [95267, 1], + [95266, 1], + [95265, 1], + [95264, 1], + [95263, 1], + [95262, 1], + [95261, 1], + [95260, 1], + [95259, 1], + [95258, 1], + [95257, 1], + [95256, 1], + [95255, 1], + [95254, 1], + [95253, 1], + [95252, 1], + [95251, 1], + [95250, 1], + [95249, 1], + [95248, 1], + [95247, 1], + [95246, 1], + [95245, 1], + [95244, 1], + [95243, 1], + [95242, 1], + [95241, 1], + [95240, 1], + [95239, 1], + [95238, 1], + [95237, 1], + [95236, 1], + [95235, 1], + [95234, 1], + [95233, 1], + [95232, 1], + [95231, 1], + [95230, 1], + [95229, 1], + [95228, 1], + [95227, 1], + [95226, 1], + [95225, 1], + [95224, 1], + [95223, 1], + [95222, 1], + [95221, 1], + [95220, 1], + [95219, 1], + [95218, 1], + [95217, 1], + [95216, 1], + [95215, 1], + [95214, 1], + [95213, 1], + [95212, 1], + [95211, 1], + [95210, 1], + [95209, 1], + [95208, 1], + [95207, 1], + [95206, 1], + [95205, 1], + [95204, 1], + [95203, 1], + [95202, 1], + [95201, 1], + [95200, 1], + [95199, 1], + [95198, 1], + [95197, 1], + [95196, 1], + [95195, 1], + [95194, 1], + [95193, 1], + [95192, 1], + [95191, 1], + [95190, 1], + [95189, 1], + [95188, 1], + [95187, 1], + [95186, 1], + [95185, 1], + [95184, 1], + [95183, 1], + [95182, 1], + [95181, 1], + [95180, 1], + [95179, 1], + [95178, 1], + [95177, 1], + [95176, 1], + [95175, 1], + [95174, 1], + [95173, 1], + [95172, 1], + [95171, 1], + [95170, 1], + [95169, 1], + [95168, 1], + [95167, 1], + [95166, 1], + [95165, 1], + [95164, 1], + [95163, 1], + [95162, 1], + [95161, 1], + [95160, 1], + [95159, 1], + [95158, 1], + [95157, 1], + [95156, 1], + [95155, 1], + [95154, 1], + [95153, 1], + [95152, 1], + [95151, 1], + [95150, 1], + [95149, 1], + [95148, 1], + [95147, 1], + [95146, 1], + [95145, 1], + [95144, 1], + [95143, 1], + [95142, 1], + [95141, 1], + [95140, 1], + [95139, 1], + [95138, 1], + [95137, 1], + [95136, 1], + [95135, 1], + [95134, 1], + [95133, 1], + [95132, 1], + [95131, 1], + [95130, 1], + [95129, 1], + [95128, 1], + [95127, 1], + [95126, 1], + [95125, 1], + [95124, 1], + [95123, 1], + [95122, 1], + [95121, 1], + [95120, 1], + [95119, 1], + [95118, 1], + [95117, 1], + [95116, 1], + [95115, 1], + [95114, 1], + [95113, 1], + [95112, 1], + [95111, 1], + [95110, 1], + [95109, 1], + [95108, 1], + [95107, 1], + [95106, 1], + [95105, 1], + [95104, 1], + [95103, 1], + [95102, 1], + [95101, 1], + [95100, 1], + [95099, 1], + [95098, 1], + [95097, 1], + [95096, 1], + [95095, 1], + [95094, 1], + [95093, 1], + [95092, 1], + [95091, 1], + [95090, 1], + [95089, 1], + [95088, 1], + [95087, 1], + [95086, 1], + [95085, 1], + [95084, 1], + [95083, 1], + [95082, 1], + [95081, 1], + [95080, 1], + [95079, 1], + [95078, 1], + [95077, 1], + [95076, 1], + [95075, 1], + [95074, 1], + [95073, 1], + [95072, 1], + [95071, 1], + [95070, 1], + [95069, 1], + [95068, 1], + [95067, 1], + [95066, 1], + [95065, 1], + [95064, 1], + [95063, 1], + [95062, 1], + [95061, 1], + [95060, 1], + [95059, 1], + [95058, 1], + [95057, 1], + [95056, 1], + [95055, 1], + [95054, 1], + [95053, 1], + [95052, 1], + [95051, 1], + [95050, 1], + [95049, 1], + [95048, 1], + [95047, 1], + [95046, 1], + [95045, 1], + [95044, 1], + [95043, 1], + [95042, 1], + [95041, 1], + [95040, 1], + [95039, 1], + [95038, 1], + [95037, 1], + [95036, 1], + [95035, 1], + [95034, 1], + [95033, 1], + [95032, 1], + [95031, 1], + [95030, 1], + [95029, 1], + [95028, 1], + [95027, 1], + [95026, 1], + [95025, 1], + [95024, 1], + [95023, 1], + [95022, 1], + [95021, 1], + [95020, 1], + [95019, 1], + [95018, 1], + [95017, 1], + [95016, 1], + [95015, 1], + [95014, 1], + [95013, 1], + [95012, 1], + [95011, 1], + [95010, 1], + [95009, 1], + [95008, 1], + [95007, 1], + [95006, 1], + [95005, 1], + [95004, 1], + [95003, 1], + [95002, 1], + [95001, 1], + [95000, 1], + [94999, 1], + [94998, 1], + [94997, 1], + [94996, 1], + [94995, 1], + [94994, 1], + [94993, 1], + [94992, 1], + [94991, 1], + [94990, 1], + [94989, 1], + [94988, 1], + [94987, 1], + [94986, 1], + [94985, 1], + [94984, 1], + [94983, 1], + [94982, 1], + [94981, 1], + [94980, 1], + [94979, 1], + [94978, 1], + [94977, 1], + [94976, 1], + [94975, 1], + [94974, 1], + [94973, 1], + [94972, 1], + [94971, 1], + [94970, 1], + [94969, 1], + [94968, 1], + [94967, 1], + [94966, 1], + [94965, 1], + [94964, 1], + [94963, 1], + [94962, 1], + [94961, 1], + [94960, 1], + [94959, 1], + [94958, 1], + [94957, 1], + [94956, 1], + [94955, 1], + [94954, 1], + [94953, 1], + [94952, 1], + [94951, 1], + [94950, 1], + [94949, 1], + [94948, 1], + [94947, 1], + [94946, 1], + [94945, 1], + [94944, 1], + [94943, 1], + [94942, 1], + [94941, 1], + [94940, 1], + [94939, 1], + [94938, 1], + [94937, 1], + [94936, 1], + [94935, 1], + [94934, 1], + [94933, 1], + [94932, 1], + [94931, 1], + [94930, 1], + [94929, 1], + [94928, 1], + [94927, 1], + [94926, 1], + [94925, 1], + [94924, 1], + [94923, 1], + [94922, 1], + [94921, 1], + [94920, 1], + [94919, 1], + [94918, 1], + [94917, 1], + [94916, 1], + [94915, 1], + [94914, 1], + [94913, 1], + [94912, 1], + [94911, 1], + [94910, 1], + [94909, 1], + [94908, 1], + [94907, 1], + [94906, 1], + [94905, 1], + [94904, 1], + [94903, 1], + [94902, 1], + [94901, 1], + [94900, 1], + [94899, 1], + [94898, 1], + [94897, 1], + [94896, 1], + [94895, 1], + [94894, 1], + [94893, 1], + [94892, 1], + [94891, 1], + [94890, 1], + [94889, 1], + [94888, 1], + [94887, 1], + [94886, 1], + [94885, 1], + [94884, 1], + [94883, 1], + [94882, 1], + [94881, 1], + [94880, 1], + [94879, 1], + [94878, 1], + [94877, 1], + [94876, 1], + [94875, 1], + [94874, 1], + [94873, 1], + [94872, 1], + [94871, 1], + [94870, 1], + [94869, 1], + [94868, 1], + [94867, 1], + [94866, 1], + [94865, 1], + [94864, 1], + [94863, 1], + [94862, 1], + [94861, 1], + [94860, 1], + [94859, 1], + [94858, 1], + [94857, 1], + [94856, 1], + [94855, 1], + [94854, 1], + [94853, 1], + [94852, 1], + [94851, 1], + [94850, 1], + [94849, 1], + [94848, 1], + [94847, 1], + [94846, 1], + [94845, 1], + [94844, 1], + [94843, 1], + [94842, 1], + [94841, 1], + [94840, 1], + [94839, 1], + [94838, 1], + [94837, 1], + [94836, 1], + [94835, 1], + [94834, 1], + [94833, 1], + [94832, 1], + [94831, 1], + [94830, 1], + [94829, 1], + [94828, 1], + [94827, 1], + [94826, 1], + [94825, 1], + [94824, 1], + [94823, 1], + [94822, 1], + [94821, 1], + [94820, 1], + [94819, 1], + [94818, 1], + [94817, 1], + [94816, 1], + [94815, 1], + [94814, 1], + [94813, 1], + [94812, 1], + [94811, 1], + [94810, 1], + [94809, 1], + [94808, 1], + [94807, 1], + [94806, 1], + [94805, 1], + [94804, 1], + [94803, 1], + [94802, 1], + [94801, 1], + [94800, 1], + [94799, 1], + [94798, 1], + [94797, 1], + [94796, 1], + [94795, 1], + [94794, 1], + [94793, 1], + [94792, 1], + [94791, 1], + [94790, 1], + [94789, 1], + [94788, 1], + [94787, 1], + [94786, 1], + [94785, 1], + [94784, 1], + [94783, 1], + [94782, 1], + [94781, 1], + [94780, 1], + [94779, 1], + [94778, 1], + [94777, 1], + [94776, 1], + [94775, 1], + [94774, 1], + [94773, 1], + [94772, 1], + [94771, 1], + [94770, 1], + [94769, 1], + [94768, 1], + [94767, 1], + [94766, 1], + [94765, 1], + [94764, 1], + [94763, 1], + [94762, 1], + [94761, 1], + [94760, 1], + [94759, 1], + [94758, 1], + [94757, 1], + [94756, 1], + [94755, 1], + [94754, 1], + [94753, 1], + [94752, 1], + [94751, 1], + [94750, 1], + [94749, 1], + [94748, 1], + [94747, 1], + [94746, 1], + [94745, 1], + [94744, 1], + [94743, 1], + [94742, 1], + [94741, 1], + [94740, 1], + [94739, 1], + [94738, 1], + [94737, 1], + [94736, 1], + [94735, 1], + [94734, 1], + [94733, 1], + [94732, 1], + [94731, 1], + [94730, 1], + [94729, 1], + [94728, 1], + [94727, 1], + [94726, 1], + [94725, 1], + [94724, 1], + [94723, 1], + [94722, 1], + [94721, 1], + [94720, 1], + [94719, 1], + [94718, 1], + [94717, 1], + [94716, 1], + [94715, 1], + [94714, 1], + [94713, 1], + [94712, 1], + [94711, 1], + [94710, 1], + [94709, 1], + [94708, 1], + [94707, 1], + [94706, 1], + [94705, 1], + [94704, 1], + [94703, 1], + [94702, 1], + [94701, 1], + [94700, 1], + [94699, 1], + [94698, 1], + [94697, 1], + [94696, 1], + [94695, 1], + [94694, 1], + [94693, 1], + [94692, 1], + [94691, 1], + [94690, 1], + [94689, 1], + [94688, 1], + [94687, 1], + [94686, 1], + [94685, 1], + [94684, 1], + [94683, 1], + [94682, 1], + [94681, 1], + [94680, 1], + [94679, 1], + [94678, 1], + [94677, 1], + [94676, 1], + [94675, 1], + [94674, 1], + [94673, 1], + [94672, 1], + [94671, 1], + [94670, 1], + [94669, 1], + [94668, 1], + [94667, 1], + [94666, 1], + [94665, 1], + [94664, 1], + [94663, 1], + [94662, 1], + [94661, 1], + [94660, 1], + [94659, 1], + [94658, 1], + [94657, 1], + [94656, 1], + [94655, 1], + [94654, 1], + [94653, 1], + [94652, 1], + [94651, 1], + [94650, 1], + [94649, 1], + [94648, 1], + [94647, 1], + [94646, 1], + [94645, 1], + [94644, 1], + [94643, 1], + [94642, 1], + [94641, 1], + [94640, 1], + [94639, 1], + [94638, 1], + [94637, 1], + [94636, 1], + [94635, 1], + [94634, 1], + [94633, 1], + [94632, 1], + [94631, 1], + [94630, 1], + [94629, 1], + [94628, 1], + [94627, 1], + [94626, 1], + [94625, 1], + [94624, 1], + [94623, 1], + [94622, 1], + [94621, 1], + [94620, 1], + [94619, 1], + [94618, 1], + [94617, 1], + [94616, 1], + [94615, 1], + [94614, 1], + [94613, 1], + [94612, 1], + [94611, 1], + [94610, 1], + [94609, 1], + [94608, 1], + [94607, 1], + [94606, 1], + [94605, 1], + [94604, 1], + [94603, 1], + [94602, 1], + [94601, 1], + [94600, 1], + [94599, 1], + [94598, 1], + [94597, 1], + [94596, 1], + [94595, 1], + [94594, 1], + [94593, 1], + [94592, 1], + [94591, 1], + [94590, 1], + [94589, 1], + [94588, 1], + [94587, 1], + [94586, 1], + [94585, 1], + [94584, 1], + [94583, 1], + [94582, 1], + [94581, 1], + [94580, 1], + [94579, 1], + [94578, 1], + [94577, 1], + [94576, 1], + [94575, 1], + [94574, 1], + [94573, 1], + [94572, 1], + [94571, 1], + [94570, 1], + [94569, 1], + [94568, 1], + [94567, 1], + [94566, 1], + [94565, 1], + [94564, 1], + [94563, 1], + [94562, 1], + [94561, 1], + [94560, 1], + [94559, 1], + [94558, 1], + [94557, 1], + [94556, 1], + [94555, 1], + [94554, 1], + [94553, 1], + [94552, 1], + [94551, 1], + [94550, 1], + [94549, 1], + [94548, 1], + [94547, 1], + [94546, 1], + [94545, 1], + [94544, 1], + [94543, 1], + [94542, 1], + [94541, 1], + [94540, 1], + [94539, 1], + [94538, 1], + [94537, 1], + [94536, 1], + [94535, 1], + [94534, 1], + [94533, 1], + [94532, 1], + [94531, 1], + [94530, 1], + [94529, 1], + [94528, 1], + [94527, 1], + [94526, 1], + [94525, 1], + [94524, 1], + [94523, 1], + [94522, 1], + [94521, 1], + [94520, 1], + [94519, 1], + [94518, 1], + [94517, 1], + [94516, 1], + [94515, 1], + [94514, 1], + [94513, 1], + [94512, 1], + [94511, 1], + [94510, 1], + [94509, 1], + [94508, 1], + [94507, 1], + [94506, 1], + [94505, 1], + [94504, 1], + [94503, 1], + [94502, 1], + [94501, 1], + [94500, 1], + [94499, 1], + [94498, 1], + [94497, 1], + [94496, 1], + [94495, 1], + [94494, 1], + [94493, 1], + [94492, 1], + [94491, 1], + [94490, 1], + [94489, 1], + [94488, 1], + [94487, 1], + [94486, 1], + [94485, 1], + [94484, 1], + [94483, 1], + [94482, 1], + [94481, 1], + [94480, 1], + [94479, 1], + [94478, 1], + [94477, 1], + [94476, 1], + [94475, 1], + [94474, 1], + [94473, 1], + [94472, 1], + [94471, 1], + [94470, 1], + [94469, 1], + [94468, 1], + [94467, 1], + [94466, 1], + [94465, 1], + [94464, 1], + [94463, 1], + [94462, 1], + [94461, 1], + [94460, 1], + [94459, 1], + [94458, 1], + [94457, 1], + [94456, 1], + [94455, 1], + [94454, 1], + [94453, 1], + [94452, 1], + [94451, 1], + [94450, 1], + [94449, 1], + [94448, 1], + [94447, 1], + [94446, 1], + [94445, 1], + [94444, 1], + [94443, 1], + [94442, 1], + [94441, 1], + [94440, 1], + [94439, 1], + [94438, 1], + [94437, 1], + [94436, 1], + [94435, 1], + [94434, 1], + [94433, 1], + [94432, 1], + [94431, 1], + [94430, 1], + [94429, 1], + [94428, 1], + [94427, 1], + [94426, 1], + [94425, 1], + [94424, 1], + [94423, 1], + [94422, 1], + [94421, 1], + [94420, 1], + [94419, 1], + [94418, 1], + [94417, 1], + [94416, 1], + [94415, 1], + [94414, 1], + [94413, 1], + [94412, 1], + [94411, 1], + [94410, 1], + [94409, 1], + [94408, 1], + [94407, 1], + [94406, 1], + [94405, 1], + [94404, 1], + [94403, 1], + [94402, 1], + [94401, 1], + [94400, 1], + [94399, 1], + [94398, 1], + [94397, 1], + [94396, 1], + [94395, 1], + [94394, 1], + [94393, 1], + [94392, 1], + [94391, 1], + [94390, 1], + [94389, 1], + [94388, 1], + [94387, 1], + [94386, 1], + [94385, 1], + [94384, 1], + [94383, 1], + [94382, 1], + [94381, 1], + [94380, 1], + [94379, 1], + [94378, 1], + [94377, 1], + [94376, 1], + [94375, 1], + [94374, 1], + [94373, 1], + [94372, 1], + [94371, 1], + [94370, 1], + [94369, 1], + [94368, 1], + [94367, 1], + [94366, 1], + [94365, 1], + [94364, 1], + [94363, 1], + [94362, 1], + [94361, 1], + [94360, 1], + [94359, 1], + [94358, 1], + [94357, 1], + [94356, 1], + [94355, 1], + [94354, 1], + [94353, 1], + [94352, 1], + [94351, 1], + [94350, 1], + [94349, 1], + [94348, 1], + [94347, 1], + [94346, 1], + [94345, 1], + [94344, 1], + [94343, 1], + [94342, 1], + [94341, 1], + [94340, 1], + [94339, 1], + [94338, 1], + [94337, 1], + [94336, 1], + [94335, 1], + [94334, 1], + [94333, 1], + [94332, 1], + [94331, 1], + [94330, 1], + [94329, 1], + [94328, 1], + [94327, 1], + [94326, 1], + [94325, 1], + [94324, 1], + [94323, 1], + [94322, 1], + [94321, 1], + [94320, 1], + [94319, 1], + [94318, 1], + [94317, 1], + [94316, 1], + [94315, 1], + [94314, 1], + [94313, 1], + [94312, 1], + [94311, 1], + [94310, 1], + [94309, 1], + [94308, 1], + [94307, 1], + [94306, 1], + [94305, 1], + [94304, 1], + [94303, 1], + [94302, 1], + [94301, 1], + [94300, 1], + [94299, 1], + [94298, 1], + [94297, 1], + [94296, 1], + [94295, 1], + [94294, 1], + [94293, 1], + [94292, 1], + [94291, 1], + [94290, 1], + [94289, 1], + [94288, 1], + [94287, 1], + [94286, 1], + [94285, 1], + [94284, 1], + [94283, 1], + [94282, 1], + [94281, 1], + [94280, 1], + [94279, 1], + [94278, 1], + [94277, 1], + [94276, 1], + [94275, 1], + [94274, 1], + [94273, 1], + [94272, 1], + [94271, 1], + [94270, 1], + [94269, 1], + [94268, 1], + [94267, 1], + [94266, 1], + [94265, 1], + [94264, 1], + [94263, 1], + [94262, 1], + [94261, 1], + [94260, 1], + [94259, 1], + [94258, 1], + [94257, 1], + [94256, 1], + [94255, 1], + [94254, 1], + [94253, 1], + [94252, 1], + [94251, 1], + [94250, 1], + [94249, 1], + [94248, 1], + [94247, 1], + [94246, 1], + [94245, 1], + [94244, 1], + [94243, 1], + [94242, 1], + [94241, 1], + [94240, 1], + [94239, 1], + [94238, 1], + [94237, 1], + [94236, 1], + [94235, 1], + [94234, 1], + [94233, 1], + [94232, 1], + [94231, 1], + [94230, 1], + [94229, 1], + [94228, 1], + [94227, 1], + [94226, 1], + [94225, 1], + [94224, 1], + [94223, 1], + [94222, 1], + [94221, 1], + [94220, 1], + [94219, 1], + [94218, 1], + [94217, 1], + [94216, 1], + [94215, 1], + [94214, 1], + [94213, 1], + [94212, 1], + [94211, 1], + [94210, 1], + [94209, 1], + [94208, 1], + [94207, 1], + [94206, 1], + [94205, 1], + [94204, 1], + [94203, 1], + [94202, 1], + [94201, 1], + [94200, 1], + [94199, 1], + [94198, 1], + [94197, 1], + [94196, 1], + [94195, 1], + [94194, 1], + [94193, 1], + [94192, 1], + [94191, 1], + [94190, 1], + [94189, 1], + [94188, 1], + [94187, 1], + [94186, 1], + [94185, 1], + [94184, 1], + [94183, 1], + [94182, 1], + [94181, 1], + [94180, 1], + [94179, 1], + [94178, 1], + [94177, 1], + [94176, 1], + [94175, 1], + [94174, 1], + [94173, 1], + [94172, 1], + [94171, 1], + [94170, 1], + [94169, 1], + [94168, 1], + [94167, 1], + [94166, 1], + [94165, 1], + [94164, 1], + [94163, 1], + [94162, 1], + [94161, 1], + [94160, 1], + [94159, 1], + [94158, 1], + [94157, 1], + [94156, 1], + [94155, 1], + [94154, 1], + [94153, 1], + [94152, 1], + [94151, 1], + [94150, 1], + [94149, 1], + [94148, 1], + [94147, 1], + [94146, 1], + [94145, 1], + [94144, 1], + [94143, 1], + [94142, 1], + [94141, 1], + [94140, 1], + [94139, 1], + [94138, 1], + [94137, 1], + [94136, 1], + [94135, 1], + [94134, 1], + [94133, 1], + [94132, 1], + [94131, 1], + [94130, 1], + [94129, 1], + [94128, 1], + [94127, 1], + [94126, 1], + [94125, 1], + [94124, 1], + [94123, 1], + [94122, 1], + [94121, 1], + [94120, 1], + [94119, 1], + [94118, 1], + [94117, 1], + [94116, 1], + [94115, 1], + [94114, 1], + [94113, 1], + [94112, 1], + [94111, 1], + [94110, 1], + [94109, 1], + [94108, 1], + [94107, 1], + [94106, 1], + [94105, 1], + [94104, 1], + [94103, 1], + [94102, 1], + [94101, 1], + [94100, 1], + [94099, 1], + [94098, 1], + [94097, 1], + [94096, 1], + [94095, 1], + [94094, 1], + [94093, 1], + [94092, 1], + [94091, 1], + [94090, 1], + [94089, 1], + [94088, 1], + [94087, 1], + [94086, 1], + [94085, 1], + [94084, 1], + [94083, 1], + [94082, 1], + [94081, 1], + [94080, 1], + [94079, 1], + [94078, 1], + [94077, 1], + [94076, 1], + [94075, 1], + [94074, 1], + [94073, 1], + [94072, 1], + [94071, 1], + [94070, 1], + [94069, 1], + [94068, 1], + [94067, 1], + [94066, 1], + [94065, 1], + [94064, 1], + [94063, 1], + [94062, 1], + [94061, 1], + [94060, 1], + [94059, 1], + [94058, 1], + [94057, 1], + [94056, 1], + [94055, 1], + [94054, 1], + [94053, 1], + [94052, 1], + [94051, 1], + [94050, 1], + [94049, 1], + [94048, 1], + [94047, 1], + [94046, 1], + [94045, 1], + [94044, 1], + [94043, 1], + [94042, 1], + [94041, 1], + [94040, 1], + [94039, 1], + [94038, 1], + [94037, 1], + [94036, 1], + [94035, 1], + [94034, 1], + [94033, 1], + [94032, 1], + [94031, 1], + [94030, 1], + [94029, 1], + [94028, 1], + [94027, 1], + [94026, 1], + [94025, 1], + [94024, 1], + [94023, 1], + [94022, 1], + [94021, 1], + [94020, 1], + [94019, 1], + [94018, 1], + [94017, 1], + [94016, 1], + [94015, 1], + [94014, 1], + [94013, 1], + [94012, 1], + [94011, 1], + [94010, 1], + [94009, 1], + [94008, 1], + [94007, 1], + [94006, 1], + [94005, 1], + [94004, 1], + [94003, 1], + [94002, 1], + [94001, 1], + [94000, 1], + [93999, 1], + [93998, 1], + [93997, 1], + [93996, 1], + [93995, 1], + [93994, 1], + [93993, 1], + [93992, 1], + [93991, 1], + [93990, 1], + [93989, 1], + [93988, 1], + [93987, 1], + [93986, 1], + [93985, 1], + [93984, 1], + [93983, 1], + [93982, 1], + [93981, 1], + [93980, 1], + [93979, 1], + [93978, 1], + [93977, 1], + [93976, 1], + [93975, 1], + [93974, 1], + [93973, 1], + [93972, 1], + [93971, 1], + [93970, 1], + [93969, 1], + [93968, 1], + [93967, 1], + [93966, 1], + [93965, 1], + [93964, 1], + [93963, 1], + [93962, 1], + [93961, 1], + [93960, 1], + [93959, 1], + [93958, 1], + [93957, 1], + [93956, 1], + [93955, 1], + [93954, 1], + [93953, 1], + [93952, 1], + [93951, 1], + [93950, 1], + [93949, 1], + [93948, 1], + [93947, 1], + [93946, 1], + [93945, 1], + [93944, 1], + [93943, 1], + [93942, 1], + [93941, 1], + [93940, 1], + [93939, 1], + [93938, 1], + [93937, 1], + [93936, 1], + [93935, 1], + [93934, 1], + [93933, 1], + [93932, 1], + [93931, 1], + [93930, 1], + [93929, 1], + [93928, 1], + [93927, 1], + [93926, 1], + [93925, 1], + [93924, 1], + [93923, 1], + [93922, 1], + [93921, 1], + [93920, 1], + [93919, 1], + [93918, 1], + [93917, 1], + [93916, 1], + [93915, 1], + [93914, 1], + [93913, 1], + [93912, 1], + [93911, 1], + [93910, 1], + [93909, 1], + [93908, 1], + [93907, 1], + [93906, 1], + [93905, 1], + [93904, 1], + [93903, 1], + [93902, 1], + [93901, 1], + [93900, 1], + [93899, 1], + [93898, 1], + [93897, 1], + [93896, 1], + [93895, 1], + [93894, 1], + [93893, 1], + [93892, 1], + [93891, 1], + [93890, 1], + [93889, 1], + [93888, 1], + [93887, 1], + [93886, 1], + [93885, 1], + [93884, 1], + [93883, 1], + [93882, 1], + [93881, 1], + [93880, 1], + [93879, 1], + [93878, 1], + [93877, 1], + [93876, 1], + [93875, 1], + [93874, 1], + [93873, 1], + [93872, 1], + [93871, 1], + [93870, 1], + [93869, 1], + [93868, 1], + [93867, 1], + [93866, 1], + [93865, 1], + [93864, 1], + [93863, 1], + [93862, 1], + [93861, 1], + [93860, 1], + [93859, 1], + [93858, 1], + [93857, 1], + [93856, 1], + [93855, 1], + [93854, 1], + [93853, 1], + [93852, 1], + [93851, 1], + [93850, 1], + [93849, 1], + [93848, 1], + [93847, 1], + [93846, 1], + [93845, 1], + [93844, 1], + [93843, 1], + [93842, 1], + [93841, 1], + [93840, 1], + [93839, 1], + [93838, 1], + [93837, 1], + [93836, 1], + [93835, 1], + [93834, 1], + [93833, 1], + [93832, 1], + [93831, 1], + [93830, 1], + [93829, 1], + [93828, 1], + [93827, 1], + [93826, 1], + [93825, 1], + [93824, 1], + [93823, 1], + [93822, 1], + [93821, 1], + [93820, 1], + [93819, 1], + [93818, 1], + [93817, 1], + [93816, 1], + [93815, 1], + [93814, 1], + [93813, 1], + [93812, 1], + [93811, 1], + [93810, 1], + [93809, 1], + [93808, 1], + [93807, 1], + [93806, 1], + [93805, 1], + [93804, 1], + [93803, 1], + [93802, 1], + [93801, 1], + [93800, 1], + [93799, 1], + [93798, 1], + [93797, 1], + [93796, 1], + [93795, 1], + [93794, 1], + [93793, 1], + [93792, 1], + [93791, 1], + [93790, 1], + [93789, 1], + [93788, 1], + [93787, 1], + [93786, 1], + [93785, 1], + [93784, 1], + [93783, 1], + [93782, 1], + [93781, 1], + [93780, 1], + [93779, 1], + [93778, 1], + [93777, 1], + [93776, 1], + [93775, 1], + [93774, 1], + [93773, 1], + [93772, 1], + [93771, 1], + [93770, 1], + [93769, 1], + [93768, 1], + [93767, 1], + [93766, 1], + [93765, 1], + [93764, 1], + [93763, 1], + [93762, 1], + [93761, 1], + [93760, 1], + [93759, 1], + [93758, 1], + [93757, 1], + [93756, 1], + [93755, 1], + [93754, 1], + [93753, 1], + [93752, 1], + [93751, 1], + [93750, 1], + [93749, 1], + [93748, 1], + [93747, 1], + [93746, 1], + [93745, 1], + [93744, 1], + [93743, 1], + [93742, 1], + [93741, 1], + [93740, 1], + [93739, 1], + [93738, 1], + [93737, 1], + [93736, 1], + [93735, 1], + [93734, 1], + [93733, 1], + [93732, 1], + [93731, 1], + [93730, 1], + [93729, 1], + [93728, 1], + [93727, 1], + [93726, 1], + [93725, 1], + [93724, 1], + [93723, 1], + [93722, 1], + [93721, 1], + [93720, 1], + [93719, 1], + [93718, 1], + [93717, 1], + [93716, 1], + [93715, 1], + [93714, 1], + [93713, 1], + [93712, 1], + [93711, 1], + [93710, 1], + [93709, 1], + [93708, 1], + [93707, 1], + [93706, 1], + [93705, 1], + [93704, 1], + [93703, 1], + [93702, 1], + [93701, 1], + [93700, 1], + [93699, 1], + [93698, 1], + [93697, 1], + [93696, 1], + [93695, 1], + [93694, 1], + [93693, 1], + [93692, 1], + [93691, 1], + [93690, 1], + [93689, 1], + [93688, 1], + [93687, 1], + [93686, 1], + [93685, 1], + [93684, 1], + [93683, 1], + [93682, 1], + [93681, 1], + [93680, 1], + [93679, 1], + [93678, 1], + [93677, 1], + [93676, 1], + [93675, 1], + [93674, 1], + [93673, 1], + [93672, 1], + [93671, 1], + [93670, 1], + [93669, 1], + [93668, 1], + [93667, 1], + [93666, 1], + [93665, 1], + [93664, 1], + [93663, 1], + [93662, 1], + [93661, 1], + [93660, 1], + [93659, 1], + [93658, 1], + [93657, 1], + [93656, 1], + [93655, 1], + [93654, 1], + [93653, 1], + [93652, 1], + [93651, 1], + [93650, 1], + [93649, 1], + [93648, 1], + [93647, 1], + [93646, 1], + [93645, 1], + [93644, 1], + [93643, 1], + [93642, 1], + [93641, 1], + [93639, 1], + [93638, 1], + [93637, 1], + [93636, 1], + [93635, 1], + [93634, 1], + [93633, 1], + [93632, 1], + [93631, 1], + [93630, 1], + [93629, 1], + [93628, 1], + [93627, 1], + [93626, 1], + [93625, 1], + [93624, 1], + [93623, 1], + [93622, 1], + [93621, 1], + [93620, 1], + [93619, 1], + [93618, 1], + [93617, 1], + [93616, 1], + [93615, 1], + [93614, 1], + [93613, 1], + [93612, 1], + [93611, 1], + [93610, 1], + [93609, 1], + [93608, 1], + [93607, 1], + [93606, 1], + [93605, 1], + [93604, 1], + [93603, 1], + [93602, 1], + [93601, 1], + [93600, 1], + [93599, 1], + [93598, 1], + [93597, 1], + [93596, 1], + [93595, 1], + [93594, 1], + [93593, 1], + [93592, 1], + [93591, 1], + [93590, 1], + [93589, 1], + [93588, 1], + [93587, 1], + [93586, 1], + [93585, 1], + [93584, 1], + [93583, 1], + [93582, 1], + [93581, 1], + [93580, 1], + [93579, 1], + [93578, 1], + [93577, 1], + [93576, 1], + [93575, 1], + [93574, 1], + [93573, 1], + [93572, 1], + [93571, 1], + [93570, 1], + [93569, 1], + [93568, 1], + [93567, 1], + [93566, 1], + [93565, 1], + [93564, 1], + [93563, 1], + [93562, 1], + [93561, 1], + [93560, 1], + [93559, 1], + [93558, 1], + [93557, 1], + [93556, 1], + [93555, 1], + [93554, 1], + [93553, 1], + [93552, 1], + [93551, 1], + [93550, 1], + [93549, 1], + [93548, 1], + [93547, 1], + [93546, 1], + [93545, 1], + [93544, 1], + [93543, 1], + [93542, 1], + [93541, 1], + [93540, 1], + [93539, 1], + [93538, 1], + [93537, 1], + [93536, 1], + [93535, 1], + [93534, 1], + [93533, 1], + [93532, 1], + [93531, 1], + [93530, 1], + [93529, 1], + [93528, 1], + [93527, 1], + [93526, 1], + [93525, 1], + [93524, 1], + [93523, 1], + [93522, 1], + [93521, 1], + [93520, 1], + [93519, 1], + [93518, 1], + [93517, 1], + [93516, 1], + [93515, 1], + [93514, 1], + [93513, 1], + [93512, 1], + [93511, 1], + [93510, 1], + [93509, 1], + [93508, 1], + [93507, 1], + [93506, 1], + [93505, 1], + [93504, 1], + [93503, 1], + [93502, 1], + [93501, 1], + [93500, 1], + [93499, 1], + [93498, 1], + [93497, 1], + [93496, 1], + [93495, 1], + [93494, 1], + [93493, 1], + [93492, 1], + [93491, 1], + [93490, 1], + [93489, 1], + [93488, 1], + [93487, 1], + [93486, 1], + [93485, 1], + [93484, 1], + [93483, 1], + [93482, 1], + [93481, 1], + [93480, 1], + [93479, 1], + [93478, 1], + [93477, 1], + [93476, 1], + [93475, 1], + [93474, 1], + [93473, 1], + [93472, 1], + [93471, 1], + [93470, 1], + [93469, 1], + [93468, 1], + [93467, 1], + [93466, 1], + [93465, 1], + [93464, 1], + [93463, 1], + [93462, 1], + [93461, 1], + [93460, 1], + [93459, 1], + [93458, 1], + [93457, 1], + [93456, 1], + [93455, 1], + [93454, 1], + [93453, 1], + [93452, 1], + [93451, 1], + [93450, 1], + [93449, 1], + [93448, 1], + [93447, 1], + [93446, 1], + [93445, 1], + [93444, 1], + [93443, 1], + [93442, 1], + [93441, 1], + [93440, 1], + [93439, 1], + [93438, 1], + [93437, 1], + [93436, 1], + [93435, 1], + [93434, 1], + [93433, 1], + [93432, 1], + [93431, 1], + [93430, 1], + [93429, 1], + [93428, 1], + [93427, 1], + [93426, 1], + [93425, 1], + [93424, 1], + [93423, 1], + [93422, 1], + [93421, 1], + [93420, 1], + [93419, 1], + [93418, 1], + [93417, 1], + [93416, 1], + [93415, 1], + [93414, 1], + [93413, 1], + [93412, 1], + [93411, 1], + [93410, 1], + [93409, 1], + [93408, 1], + [93407, 1], + [93406, 1], + [93405, 1], + [93404, 1], + [93403, 1], + [93402, 1], + [93401, 1], + [93400, 1], + [93399, 1], + [93398, 1], + [93397, 1], + [93396, 1], + [93395, 1], + [93394, 1], + [93393, 1], + [93392, 1], + [93391, 1], + [93390, 1], + [93389, 1], + [93388, 1], + [93387, 1], + [93386, 1], + [93385, 1], + [93384, 1], + [93383, 1], + [93382, 1], + [93381, 1], + [93380, 1], + [93379, 1], + [93378, 1], + [93377, 1], + [93376, 1], + [93375, 1], + [93374, 1], + [93373, 1], + [93372, 1], + [93371, 1], + [93370, 1], + [93369, 1], + [93368, 1], + [93367, 1], + [93366, 1], + [93365, 1], + [93364, 1], + [93363, 1], + [93362, 1], + [93361, 1], + [93360, 1], + [93359, 1], + [93358, 1], + [93357, 1], + [93356, 1], + [93355, 1], + [93354, 1], + [93353, 1], + [93352, 1], + [93351, 1], + [93350, 1], + [93349, 1], + [93348, 1], + [93347, 1], + [93346, 1], + [93345, 1], + [93344, 1], + [93343, 1], + [93342, 1], + [93341, 1], + [93340, 1], + [93339, 1], + [93338, 1], + [93337, 1], + [93336, 1], + [93335, 1], + [93334, 1], + [93333, 1], + [93332, 1], + [93331, 1], + [93330, 1], + [93329, 1], + [93328, 1], + [93327, 1], + [93326, 1], + [93325, 1], + [93324, 1], + [93323, 1], + [93322, 1], + [93321, 1], + [93320, 1], + [93319, 1], + [93318, 1], + [93317, 1], + [93316, 1], + [93315, 1], + [93314, 1], + [93313, 1], + [93312, 1], + [93311, 1], + [93310, 1], + [93309, 1], + [93308, 1], + [93307, 1], + [93306, 1], + [93305, 1], + [93304, 1], + [93303, 1], + [93302, 1], + [93301, 1], + [93300, 1], + [93299, 1], + [93298, 1], + [93297, 1], + [93296, 1], + [93295, 1], + [93294, 1], + [93293, 1], + [93292, 1], + [93291, 1], + [93290, 1], + [93289, 1], + [93288, 1], + [93287, 1], + [93286, 1], + [93285, 1], + [93284, 1], + [93283, 1], + [93282, 1], + [93281, 1], + [93280, 1], + [93279, 1], + [93278, 1], + [93277, 1], + [93276, 1], + [93275, 1], + [93274, 1], + [93273, 1], + [93272, 1], + [93271, 1], + [93270, 1], + [93269, 1], + [93268, 1], + [93267, 1], + [93266, 1], + [93265, 1], + [93264, 1], + [93263, 1], + [93262, 1], + [93261, 1], + [93260, 1], + [93259, 1], + [93258, 1], + [93257, 1], + [93256, 1], + [93255, 1], + [93254, 1], + [93253, 1], + [93252, 1], + [93251, 1], + [93250, 1], + [93249, 1], + [93248, 1], + [93247, 1], + [93246, 1], + [93245, 1], + [93244, 1], + [93243, 1], + [93242, 1], + [93241, 1], + [93240, 1], + [93239, 1], + [93238, 1], + [93237, 1], + [93236, 1], + [93235, 1], + [93234, 1], + [93233, 1], + [93232, 1], + [93231, 1], + [93230, 1], + [93229, 1], + [93228, 1], + [93227, 1], + [93226, 1], + [93225, 1], + [93224, 1], + [93223, 1], + [93222, 1], + [93221, 1], + [93220, 1], + [93219, 1], + [93218, 1], + [93217, 1], + [93216, 1], + [93215, 1], + [93214, 1], + [93213, 1], + [93212, 1], + [93211, 1], + [93210, 1], + [93209, 1], + [93208, 1], + [93207, 1], + [93206, 1], + [93205, 1], + [93204, 1], + [93203, 1], + [93202, 1], + [93201, 1], + [93200, 1], + [93199, 1], + [93198, 1], + [93197, 1], + [93196, 1], + [93195, 1], + [93194, 1], + [93193, 1], + [93192, 1], + [93191, 1], + [93190, 1], + [93189, 1], + [93188, 1], + [93187, 1], + [93186, 1], + [93185, 1], + [93184, 1], + [93183, 1], + [93182, 1], + [93181, 1], + [93180, 1], + [93179, 1], + [93178, 1], + [93177, 1], + [93176, 1], + [93175, 1], + [93174, 1], + [93173, 1], + [93172, 1], + [93171, 1], + [93170, 1], + [93169, 1], + [93168, 1], + [93167, 1], + [93166, 1], + [93165, 1], + [93164, 1], + [93163, 1], + [93162, 1], + [93161, 1], + [93160, 1], + [93159, 1], + [93158, 1], + [93157, 1], + [93156, 1], + [93155, 1], + [93154, 1], + [93153, 1], + [93152, 1], + [93151, 1], + [93150, 1], + [93149, 1], + [93148, 1], + [93147, 1], + [93146, 1], + [93145, 1], + [93144, 1], + [93143, 1], + [93142, 1], + [93141, 1], + [93140, 1], + [93139, 1], + [93138, 1], + [93137, 1], + [93136, 1], + [93135, 1], + [93134, 1], + [93133, 1], + [93132, 1], + [93131, 1], + [93130, 1], + [93129, 1], + [93128, 1], + [93127, 1], + [93126, 1], + [93125, 1], + [93124, 1], + [93123, 1], + [93122, 1], + [93121, 1], + [93120, 1], + [93119, 1], + [93118, 1], + [93117, 1], + [93116, 1], + [93115, 1], + [93114, 1], + [93113, 1], + [93112, 1], + [93111, 1], + [93110, 1], + [93109, 1], + [93108, 1], + [93107, 1], + [93106, 1], + [93105, 1], + [93104, 1], + [93103, 1], + [93102, 1], + [93101, 1], + [93100, 1], + [93099, 1], + [93098, 1], + [93097, 1], + [93096, 1], + [93095, 1], + [93094, 1], + [93093, 1], + [93092, 1], + [93091, 1], + [93090, 1], + [93089, 1], + [93088, 1], + [93087, 1], + [93086, 1], + [93085, 1], + [93084, 1], + [93083, 1], + [93082, 1], + [93081, 1], + [93080, 1], + [93079, 1], + [93078, 1], + [93077, 1], + [93076, 1], + [93075, 1], + [93074, 1], + [93073, 1], + [93072, 1], + [93071, 1], + [93070, 1], + [93069, 1], + [93068, 1], + [93067, 1], + [93066, 1], + [93065, 1], + [93064, 1], + [93063, 1], + [93062, 1], + [93061, 1], + [93060, 1], + [93059, 1], + [93058, 1], + [93057, 1], + [93056, 1], + [93055, 1], + [93054, 1], + [93053, 1], + [93052, 1], + [93051, 1], + [93050, 1], + [93049, 1], + [93048, 1], + [93047, 1], + [93046, 1], + [93045, 1], + [93044, 1], + [93043, 1], + [93042, 1], + [93041, 1], + [93040, 1], + [93039, 1], + [93038, 1], + [93037, 1], + [93036, 1], + [93035, 1], + [93034, 1], + [93033, 1], + [93032, 1], + [93031, 1], + [93030, 1], + [93029, 1], + [93028, 1], + [93027, 1], + [93026, 1], + [93025, 1], + [93024, 1], + [93023, 1], + [93022, 1], + [93021, 1], + [93020, 1], + [93019, 1], + [93018, 1], + [93017, 1], + [93016, 1], + [93015, 1], + [93014, 1], + [93013, 1], + [93012, 1], + [93011, 1], + [93010, 1], + [93009, 1], + [93008, 1], + [93007, 1], + [93006, 1], + [93005, 1], + [93004, 1], + [93003, 1], + [93002, 1], + [93001, 1], + [93000, 1], + [92999, 1], + [92998, 1], + [92997, 1], + [92996, 1], + [92995, 1], + [92994, 1], + [92993, 1], + [92992, 1], + [92991, 1], + [92990, 1], + [92989, 1], + [92988, 1], + [92987, 1], + [92986, 1], + [92985, 1], + [92984, 1], + [92983, 1], + [92982, 1], + [92981, 1], + [92980, 1], + [92979, 1], + [92978, 1], + [92977, 1], + [92976, 1], + [92975, 1], + [92974, 1], + [92973, 1], + [92972, 1], + [92971, 1], + [92970, 1], + [92969, 1], + [92968, 1], + [92967, 1], + [92966, 1], + [92965, 1], + [92964, 1], + [92963, 1], + [92962, 1], + [92961, 1], + [92960, 1], + [92959, 1], + [92958, 1], + [92957, 1], + [92956, 1], + [92955, 1], + [92954, 1], + [92953, 1], + [92952, 1], + [92951, 1], + [92950, 1], + [92949, 1], + [92948, 1], + [92947, 1], + [92946, 1], + [92945, 1], + [92944, 1], + [92943, 1], + [92942, 1], + [92941, 1], + [92940, 1], + [92939, 1], + [92938, 1], + [92937, 1], + [92936, 1], + [92935, 1], + [92934, 1], + [92933, 1], + [92932, 1], + [92931, 1], + [92930, 1], + [92929, 1], + [92928, 1], + [92927, 1], + [92926, 1], + [92925, 1], + [92924, 1], + [92923, 1], + [92922, 1], + [92921, 1], + [92920, 1], + [92919, 1], + [92918, 1], + [92917, 1], + [92916, 1], + [92915, 1], + [92914, 1], + [92913, 1], + [92912, 1], + [92911, 1], + [92910, 1], + [92909, 1], + [92908, 1], + [92907, 1], + [92906, 1], + [92905, 1], + [92904, 1], + [92903, 1], + [92902, 1], + [92901, 1], + [92900, 1], + [92899, 1], + [92898, 1], + [92897, 1], + [92896, 1], + [92895, 1], + [92894, 1], + [92893, 1], + [92892, 1], + [92891, 1], + [92890, 1], + [92889, 1], + [92888, 1], + [92887, 1], + [92886, 1], + [92885, 1], + [92884, 1], + [92883, 1], + [92882, 1], + [92881, 1], + [92880, 1], + [92879, 1], + [92878, 1], + [92877, 1], + [92876, 1], + [92875, 1], + [92874, 1], + [92873, 1], + [92872, 1], + [92871, 1], + [92870, 1], + [92869, 1], + [92868, 1], + [92867, 1], + [92866, 1], + [92865, 1], + [92864, 1], + [92863, 1], + [92862, 1], + [92861, 1], + [92860, 1], + [92859, 1], + [92858, 1], + [92857, 1], + [92856, 1], + [92855, 1], + [92854, 1], + [92853, 1], + [92852, 1], + [92851, 1], + [92850, 1], + [92849, 1], + [92848, 1], + [92847, 1], + [92846, 1], + [92845, 1], + [92844, 1], + [92843, 1], + [92842, 1], + [92841, 1], + [92840, 1], + [92839, 1], + [92838, 1], + [92837, 1], + [92836, 1], + [92835, 1], + [92834, 1], + [92833, 1], + [92832, 1], + [92831, 1], + [92830, 1], + [92829, 1], + [92828, 1], + [92827, 1], + [92826, 1], + [92825, 1], + [92824, 1], + [92823, 1], + [92822, 1], + [92821, 1], + [92820, 1], + [92819, 1], + [92818, 1], + [92817, 1], + [92816, 1], + [92815, 1], + [92814, 1], + [92813, 1], + [92812, 1], + [92811, 1], + [92810, 1], + [92809, 1], + [92808, 1], + [92807, 1], + [92806, 1], + [92805, 1], + [92804, 1], + [92803, 1], + [92802, 1], + [92801, 1], + [92800, 1], + [92799, 1], + [92798, 1], + [92797, 1], + [92796, 1], + [92795, 1], + [92794, 1], + [92793, 1], + [92792, 1], + [92791, 1], + [92790, 1], + [92789, 1], + [92788, 1], + [92787, 1], + [92786, 1], + [92785, 1], + [92784, 1], + [92783, 1], + [92782, 1], + [92781, 1], + [92780, 1], + [92779, 1], + [92778, 1], + [92777, 1], + [92776, 1], + [92775, 1], + [92774, 1], + [92773, 1], + [92772, 1], + [92771, 1], + [92770, 1], + [92769, 1], + [92768, 1], + [92767, 1], + [92766, 1], + [92765, 1], + [92764, 1], + [92763, 1], + [92762, 1], + [92761, 1], + [92760, 1], + [92759, 1], + [92758, 1], + [92757, 1], + [92756, 1], + [92755, 1], + [92754, 1], + [92753, 1], + [92752, 1], + [92751, 1], + [92750, 1], + [92749, 1], + [92748, 1], + [92747, 1], + [92746, 1], + [92745, 1], + [92744, 1], + [92743, 1], + [92742, 1], + [92741, 1], + [92740, 1], + [92739, 1], + [92738, 1], + [92737, 1], + [92736, 1], + [92735, 1], + [92734, 1], + [92733, 1], + [92732, 1], + [92731, 1], + [92730, 1], + [92729, 1], + [92728, 1], + [92727, 1], + [92726, 1], + [92725, 1], + [92724, 1], + [92723, 1], + [92722, 1], + [92721, 1], + [92720, 1], + [92719, 1], + [92718, 1], + [92717, 1], + [92716, 1], + [92715, 1], + [92714, 1], + [92713, 1], + [92712, 1], + [92711, 1], + [92710, 1], + [92709, 1], + [92708, 1], + [92707, 1], + [92706, 1], + [92705, 1], + [92704, 1], + [92703, 1], + [92702, 1], + [92701, 1], + [92700, 1], + [92699, 1], + [92698, 1], + [92697, 1], + [92696, 1], + [92695, 1], + [92694, 1], + [92693, 1], + [92692, 1], + [92691, 1], + [92690, 1], + [92689, 1], + [92688, 1], + [92687, 1], + [92686, 1], + [92685, 1], + [92684, 1], + [92683, 1], + [92682, 1], + [92681, 1], + [92680, 1], + [92679, 1], + [92678, 1], + [92677, 1], + [92676, 1], + [92675, 1], + [92674, 1], + [92673, 1], + [92672, 1], + [92671, 1], + [92670, 1], + [92669, 1], + [92668, 1], + [92667, 1], + [92666, 1], + [92665, 1], + [92664, 1], + [92663, 1], + [92662, 1], + [92661, 1], + [92660, 1], + [92659, 1], + [92658, 1], + [92657, 1], + [92656, 1], + [92655, 1], + [92654, 1], + [92653, 1], + [92652, 1], + [92651, 1], + [92650, 1], + [92649, 1], + [92648, 1], + [92647, 1], + [92646, 1], + [92645, 1], + [92644, 1], + [92643, 1], + [92642, 1], + [92641, 1], + [92640, 1], + [92639, 1], + [92638, 1], + [92637, 1], + [92636, 1], + [92635, 1], + [92634, 1], + [92633, 1], + [92632, 1], + [92631, 1], + [92630, 1], + [92629, 1], + [92628, 1], + [92627, 1], + [92626, 1], + [92625, 1], + [92624, 1], + [92623, 1], + [92622, 1], + [92621, 1], + [92620, 1], + [92619, 1], + [92618, 1], + [92617, 1], + [92616, 1], + [92615, 1], + [92614, 1], + [92613, 1], + [92612, 1], + [92611, 1], + [92610, 1], + [92609, 1], + [92608, 1], + [92607, 1], + [92606, 1], + [92605, 1], + [92604, 1], + [92603, 1], + [92602, 1], + [92601, 1], + [92600, 1], + [92599, 1], + [92598, 1], + [92597, 1], + [92596, 1], + [92595, 1], + [92594, 1], + [92593, 1], + [92592, 1], + [92591, 1], + [92590, 1], + [92589, 1], + [92588, 1], + [92587, 1], + [92586, 1], + [92585, 1], + [92584, 1], + [92583, 1], + [92582, 1], + [92581, 1], + [92580, 1], + [92579, 1], + [92578, 1], + [92577, 1], + [92576, 1], + [92575, 1], + [92574, 1], + [92573, 1], + [92572, 1], + [92571, 1], + [92570, 1], + [92569, 1], + [92568, 1], + [92567, 1], + [92566, 1], + [92565, 1], + [92564, 1], + [92563, 1], + [92562, 1], + [92561, 1], + [92560, 1], + [92559, 1], + [92558, 1], + [92557, 1], + [92556, 1], + [92555, 1], + [92554, 1], + [92553, 1], + [92552, 1], + [92551, 1], + [92550, 1], + [92549, 1], + [92548, 1], + [92547, 1], + [92546, 1], + [92545, 1], + [92544, 1], + [92543, 1], + [92542, 1], + [92541, 1], + [92540, 1], + [92539, 1], + [92538, 1], + [92537, 1], + [92536, 1], + [92535, 1], + [92534, 1], + [92533, 1], + [92532, 1], + [92531, 1], + [92530, 1], + [92529, 1], + [92528, 1], + [92527, 1], + [92526, 1], + [92525, 1], + [92524, 1], + [92523, 1], + [92522, 1], + [92521, 1], + [92520, 1], + [92519, 1], + [92518, 1], + [92517, 1], + [92516, 1], + [92515, 1], + [92514, 1], + [92513, 1], + [92512, 1], + [92511, 1], + [92510, 1], + [92509, 1], + [92508, 1], + [92507, 1], + [92506, 1], + [92505, 1], + [92504, 1], + [92503, 1], + [92502, 1], + [92501, 1], + [92500, 1], + [92499, 1], + [92498, 1], + [92497, 1], + [92496, 1], + [92495, 1], + [92494, 1], + [92493, 1], + [92492, 1], + [92491, 1], + [92490, 1], + [92489, 1], + [92488, 1], + [92487, 1], + [92486, 1], + [92485, 1], + [92484, 1], + [92483, 1], + [92482, 1], + [92481, 1], + [92480, 1], + [92479, 1], + [92478, 1], + [92477, 1], + [92476, 1], + [92475, 1], + [92474, 1], + [92473, 1], + [92472, 1], + [92471, 1], + [92470, 1], + [92469, 1], + [92468, 1], + [92467, 1], + [92466, 1], + [92465, 1], + [92464, 1], + [92463, 1], + [92462, 1], + [92461, 1], + [92460, 1], + [92459, 1], + [92458, 1], + [92457, 1], + [92456, 1], + [92455, 1], + [92454, 1], + [92453, 1], + [92452, 1], + [92451, 1], + [92450, 1], + [92449, 1], + [92448, 1], + [92447, 1], + [92446, 1], + [92445, 1], + [92444, 1], + [92443, 1], + [92442, 1], + [92441, 1], + [92440, 1], + [92439, 1], + [92438, 1], + [92437, 1], + [92436, 1], + [92435, 1], + [92434, 1], + [92433, 1], + [92432, 1], + [92431, 1], + [92430, 1], + [92429, 1], + [92428, 1], + [92427, 1], + [92426, 1], + [92425, 1], + [92424, 1], + [92423, 1], + [92422, 1], + [92421, 1], + [92420, 1], + [92419, 1], + [92418, 1], + [92417, 1], + [92416, 1], + [92415, 1], + [92414, 1], + [92413, 1], + [92412, 1], + [92411, 1], + [92410, 1], + [92409, 1], + [92408, 1], + [92407, 1], + [92406, 1], + [92405, 1], + [92404, 1], + [92403, 1], + [92402, 1], + [92401, 1], + [92400, 1], + [92399, 1], + [92398, 1], + [92397, 1], + [92396, 1], + [92395, 1], + [92394, 1], + [92393, 1], + [92392, 1], + [92391, 1], + [92390, 1], + [92389, 1], + [92388, 1], + [92387, 1], + [92386, 1], + [92385, 1], + [92384, 1], + [92383, 1], + [92382, 1], + [92381, 1], + [92380, 1], + [92379, 1], + [92378, 1], + [92377, 1], + [92376, 1], + [92375, 1], + [92374, 1], + [92373, 1], + [92372, 1], + [92371, 1], + [92370, 1], + [92369, 1], + [92368, 1], + [92367, 1], + [92366, 1], + [92365, 1], + [92364, 1], + [92363, 1], + [92362, 1], + [92361, 1], + [92360, 1], + [92359, 1], + [92358, 1], + [92357, 1], + [92356, 1], + [92355, 1], + [92354, 1], + [92353, 1], + [92352, 1], + [92351, 1], + [92350, 1], + [92349, 1], + [92348, 1], + [92347, 1], + [92346, 1], + [92345, 1], + [92344, 1], + [92343, 1], + [92342, 1], + [92341, 1], + [92340, 1], + [92339, 1], + [92338, 1], + [92337, 1], + [92336, 1], + [92335, 1], + [92334, 1], + [92333, 1], + [92332, 1], + [92331, 1], + [92330, 1], + [92329, 1], + [92328, 1], + [92327, 1], + [92326, 1], + [92325, 1], + [92324, 1], + [92323, 1], + [92322, 1], + [92321, 1], + [92320, 1], + [92319, 1], + [92318, 1], + [92317, 1], + [92316, 1], + [92315, 1], + [92314, 1], + [92313, 1], + [92312, 1], + [92311, 1], + [92310, 1], + [92309, 1], + [92308, 1], + [92307, 1], + [92306, 1], + [92305, 1], + [92304, 1], + [92303, 1], + [92302, 1], + [92301, 1], + [92300, 1], + [92299, 1], + [92298, 1], + [92297, 1], + [92296, 1], + [92295, 1], + [92294, 1], + [92293, 1], + [92292, 1], + [92291, 1], + [92290, 1], + [92289, 1], + [92288, 1], + [92287, 1], + [92286, 1], + [92285, 1], + [92284, 1], + [92283, 1], + [92282, 1], + [92281, 1], + [92280, 1], + [92279, 1], + [92278, 1], + [92277, 1], + [92276, 1], + [92275, 1], + [92274, 1], + [92273, 1], + [92272, 1], + [92271, 1], + [92270, 1], + [92269, 1], + [92268, 1], + [92267, 1], + [92266, 1], + [92265, 1], + [92264, 1], + [92263, 1], + [92262, 1], + [92261, 1], + [92260, 1], + [92259, 1], + [92258, 1], + [92257, 1], + [92256, 1], + [92255, 1], + [92254, 1], + [92253, 1], + [92252, 1], + [92251, 1], + [92250, 1], + [92249, 1], + [92248, 1], + [92247, 1], + [92246, 1], + [92245, 1], + [92244, 1], + [92243, 1], + [92242, 1], + [92241, 1], + [92240, 1], + [92239, 1], + [92238, 1], + [92237, 1], + [92236, 1], + [92235, 1], + [92234, 1], + [92233, 1], + [92232, 1], + [92231, 1], + [92230, 1], + [92229, 1], + [92228, 1], + [92227, 1], + [92226, 1], + [92225, 1], + [92224, 1], + [92223, 1], + [92222, 1], + [92221, 1], + [92220, 1], + [92219, 1], + [92218, 1], + [92217, 1], + [92216, 1], + [92215, 1], + [92214, 1], + [92213, 1], + [92212, 1], + [92211, 1], + [92210, 1], + [92209, 1], + [92208, 1], + [92207, 1], + [92206, 1], + [92205, 1], + [92204, 1], + [92203, 1], + [92202, 1], + [92201, 1], + [92200, 1], + [92199, 1], + [92198, 1], + [92197, 1], + [92196, 1], + [92195, 1], + [92194, 1], + [92193, 1], + [92192, 1], + [92191, 1], + [92190, 1], + [92189, 1], + [92188, 1], + [92187, 1], + [92186, 1], + [92185, 1], + [92184, 1], + [92183, 1], + [92182, 1], + [92181, 1], + [92180, 1], + [92179, 1], + [92178, 1], + [92177, 1], + [92176, 1], + [92175, 1], + [92174, 1], + [92173, 1], + [92172, 1], + [92171, 1], + [92170, 1], + [92169, 1], + [92168, 1], + [92167, 1], + [92166, 1], + [92165, 1], + [92164, 1], + [92163, 1], + [92162, 1], + [92161, 1], + [92160, 1], + [92159, 1], + [92158, 1], + [92157, 1], + [92156, 1], + [92155, 1], + [92154, 1], + [92153, 1], + [92152, 1], + [92151, 1], + [92150, 1], + [92149, 1], + [92148, 1], + [92147, 1], + [92146, 1], + [92145, 1], + [92144, 1], + [92143, 1], + [92142, 1], + [92141, 1], + [92140, 1], + [92139, 1], + [92138, 1], + [92137, 1], + [92136, 1], + [92135, 1], + [92134, 1], + [92133, 1], + [92132, 1], + [92131, 1], + [92130, 1], + [92129, 1], + [92128, 1], + [92127, 1], + [92126, 1], + [92125, 1], + [92124, 1], + [92123, 1], + [92122, 1], + [92121, 1], + [92120, 1], + [92119, 1], + [92118, 1], + [92117, 1], + [92116, 1], + [92115, 1], + [92114, 1], + [92113, 1], + [92112, 1], + [92111, 1], + [92110, 1], + [92109, 1], + [92108, 1], + [92107, 1], + [92106, 1], + [92105, 1], + [92104, 1], + [92103, 1], + [92102, 1], + [92101, 1], + [92100, 1], + [92099, 1], + [92098, 1], + [92097, 1], + [92096, 1], + [92095, 1], + [92094, 1], + [92093, 1], + [92092, 1], + [92091, 1], + [92090, 1], + [92089, 1], + [92088, 1], + [92087, 1], + [92086, 1], + [92085, 1], + [92084, 1], + [92083, 1], + [92082, 1], + [92081, 1], + [92080, 1], + [92079, 1], + [92078, 1], + [92077, 1], + [92076, 1], + [92075, 1], + [92074, 1], + [92073, 1], + [92072, 1], + [92071, 1], + [92070, 1], + [92069, 1], + [92068, 1], + [92067, 1], + [92066, 1], + [92065, 1], + [92064, 1], + [92063, 1], + [92062, 1], + [92061, 1], + [92060, 1], + [92059, 1], + [92058, 1], + [92057, 1], + [92056, 1], + [92055, 1], + [92054, 1], + [92053, 1], + [92052, 1], + [92051, 1], + [92050, 1], + [92049, 1], + [92048, 1], + [92047, 1], + [92046, 1], + [92045, 1], + [92044, 1], + [92043, 1], + [92042, 1], + [92041, 1], + [92040, 1], + [92039, 1], + [92038, 1], + [92037, 1], + [92036, 1], + [92035, 1], + [92034, 1], + [92033, 1], + [92032, 1], + [92031, 1], + [92030, 1], + [92029, 1], + [92028, 1], + [92027, 1], + [92026, 1], + [92025, 1], + [92024, 1], + [92023, 1], + [92022, 1], + [92021, 1], + [92020, 1], + [92019, 1], + [92018, 1], + [92017, 1], + [92016, 1], + [92015, 1], + [92014, 1], + [92013, 1], + [92012, 1], + [92011, 1], + [92010, 1], + [92009, 1], + [92008, 1], + [92007, 1], + [92006, 1], + [92005, 1], + [92004, 1], + [92003, 1], + [92002, 1], + [92001, 1], + [92000, 1], + [91999, 1], + [91998, 1], + [91997, 1], + [91996, 1], + [91995, 1], + [91994, 1], + [91993, 1], + [91992, 1], + [91991, 1], + [91990, 1], + [91989, 1], + [91988, 1], + [91987, 1], + [91986, 1], + [91985, 1], + [91984, 1], + [91983, 1], + [91982, 1], + [91981, 1], + [91980, 1], + [91979, 1], + [91978, 1], + [91977, 1], + [91976, 1], + [91975, 1], + [91974, 1], + [91973, 1], + [91972, 1], + [91971, 1], + [91970, 1], + [91969, 1], + [91968, 1], + [91967, 1], + [91966, 1], + [91965, 1], + [91964, 1], + [91963, 1], + [91962, 1], + [91961, 1], + [91960, 1], + [91959, 1], + [91958, 1], + [91957, 1], + [91956, 1], + [91955, 1], + [91954, 1], + [91953, 1], + [91952, 1], + [91951, 1], + [91950, 1], + [91949, 1], + [91948, 1], + [91947, 1], + [91946, 1], + [91945, 1], + [91944, 1], + [91943, 1], + [91942, 1], + [91941, 1], + [91940, 1], + [91939, 1], + [91938, 1], + [91937, 1], + [91936, 1], + [91935, 1], + [91934, 1], + [91933, 1], + [91932, 1], + [91931, 1], + [91930, 1], + [91929, 1], + [91928, 1], + [91927, 1], + [91926, 1], + [91925, 1], + [91924, 1], + [91923, 1], + [91922, 1], + [91921, 1], + [91920, 1], + [91919, 1], + [91918, 1], + [91917, 1], + [91916, 1], + [91915, 1], + [91914, 1], + [91913, 1], + [91912, 1], + [91911, 1], + [91910, 1], + [91909, 1], + [91908, 1], + [91907, 1], + [91906, 1], + [91905, 1], + [91904, 1], + [91903, 1], + [91902, 1], + [91901, 1], + [91900, 1], + [91899, 1], + [91898, 1], + [91897, 1], + [91896, 1], + [91895, 1], + [91894, 1], + [91893, 1], + [91892, 1], + [91891, 1], + [91890, 1], + [91889, 1], + [91888, 1], + [91887, 1], + [91886, 1], + [91885, 1], + [91884, 1], + [91883, 1], + [91882, 1], + [91881, 1], + [91880, 1], + [91879, 1], + [91878, 1], + [91877, 1], + [91876, 1], + [91875, 1], + [91874, 1], + [91873, 1], + [91872, 1], + [91871, 1], + [91870, 1], + [91869, 1], + [91868, 1], + [91867, 1], + [91866, 1], + [91865, 1], + [91864, 1], + [91863, 1], + [91862, 1], + [91861, 1], + [91860, 1], + [91859, 1], + [91858, 1], + [91857, 1], + [91856, 1], + [91855, 1], + [91854, 1], + [91853, 1], + [91852, 1], + [91851, 1], + [91850, 1], + [91849, 1], + [91848, 1], + [91847, 1], + [91846, 1], + [91845, 1], + [91844, 1], + [91843, 1], + [91842, 1], + [91841, 1], + [91840, 1], + [91839, 1], + [91838, 1], + [91837, 1], + [91836, 1], + [91835, 1], + [91834, 1], + [91833, 1], + [91832, 1], + [91831, 1], + [91830, 1], + [91829, 1], + [91828, 1], + [91827, 1], + [91826, 1], + [91825, 1], + [91824, 1], + [91823, 1], + [91822, 1], + [91821, 1], + [91820, 1], + [91819, 1], + [91818, 1], + [91817, 1], + [91816, 1], + [91815, 1], + [91814, 1], + [91813, 1], + [91812, 1], + [91811, 1], + [91810, 1], + [91809, 1], + [91808, 1], + [91807, 1], + [91806, 1], + [91805, 1], + [91804, 1], + [91803, 1], + [91802, 1], + [91801, 1], + [91800, 1], + [91799, 1], + [91798, 1], + [91797, 1], + [91796, 1], + [91795, 1], + [91794, 1], + [91793, 1], + [91792, 1], + [91791, 1], + [91790, 1], + [91789, 1], + [91788, 1], + [91787, 1], + [91786, 1], + [91785, 1], + [91784, 1], + [91783, 1], + [91782, 1], + [91781, 1], + [91780, 1], + [91779, 1], + [91778, 1], + [91777, 1], + [91776, 1], + [91775, 1], + [91774, 1], + [91773, 1], + [91772, 1], + [91771, 1], + [91770, 1], + [91769, 1], + [91768, 1], + [91767, 1], + [91766, 1], + [91765, 1], + [91764, 1], + [91763, 1], + [91762, 1], + [91761, 1], + [91760, 1], + [91759, 1], + [91758, 1], + [91757, 1], + [91756, 1], + [91755, 1], + [91754, 1], + [91753, 1], + [91752, 1], + [91751, 1], + [91750, 1], + [91749, 1], + [91748, 1], + [91747, 1], + [91746, 1], + [91745, 1], + [91744, 1], + [91743, 1], + [91742, 1], + [91741, 1], + [91740, 1], + [91739, 1], + [91738, 1], + [91737, 1], + [91736, 1], + [91735, 1], + [91734, 1], + [91733, 1], + [91732, 1], + [91731, 1], + [91730, 1], + [91729, 1], + [91728, 1], + [91727, 1], + [91726, 1], + [91725, 1], + [91724, 1], + [91723, 1], + [91722, 1], + [91721, 1], + [91720, 1], + [91719, 1], + [91718, 1], + [91717, 1], + [91716, 1], + [91715, 1], + [91714, 1], + [91713, 1], + [91712, 1], + [91711, 1], + [91710, 1], + [91709, 1], + [91708, 1], + [91707, 1], + [91706, 1], + [91705, 1], + [91704, 1], + [91703, 1], + [91702, 1], + [91701, 1], + [91700, 1], + [91699, 1], + [91698, 1], + [91697, 1], + [91696, 1], + [91695, 1], + [91694, 1], + [91693, 1], + [91692, 1], + [91691, 1], + [91690, 1], + [91689, 1], + [91688, 1], + [91687, 1], + [91686, 1], + [91685, 1], + [91684, 1], + [91683, 1], + [91682, 1], + [91681, 1], + [91680, 1], + [91679, 1], + [91678, 1], + [91677, 1], + [91676, 1], + [91675, 1], + [91674, 1], + [91673, 1], + [91672, 1], + [91671, 1], + [91670, 1], + [91669, 1], + [91668, 1], + [91667, 1], + [91666, 1], + [91665, 1], + [91664, 1], + [91663, 1], + [91662, 1], + [91661, 1], + [91660, 1], + [91659, 1], + [91658, 1], + [91657, 1], + [91656, 1], + [91655, 1], + [91654, 1], + [91653, 1], + [91652, 1], + [91651, 1], + [91650, 1], + [91649, 1], + [91648, 1], + [91647, 1], + [91646, 1], + [91645, 1], + [91644, 1], + [91643, 1], + [91642, 1], + [91641, 1], + [91640, 1], + [91639, 1], + [91638, 1], + [91637, 1], + [91636, 1], + [91635, 1], + [91634, 1], + [91633, 1], + [91632, 1], + [91631, 1], + [91630, 1], + [91629, 1], + [91628, 1], + [91627, 1], + [91626, 1], + [91625, 1], + [91624, 1], + [91623, 1], + [91622, 1], + [91621, 1], + [91620, 1], + [91619, 1], + [91618, 1], + [91617, 1], + [91616, 1], + [91615, 1], + [91614, 1], + [91613, 1], + [91612, 1], + [91611, 1], + [91610, 1], + [91609, 1], + [91608, 1], + [91607, 1], + [91606, 1], + [91605, 1], + [91604, 1], + [91603, 1], + [91602, 1], + [91601, 1], + [91600, 1], + [91599, 1], + [91598, 1], + [91597, 1], + [91596, 1], + [91595, 1], + [91594, 1], + [91593, 1], + [91592, 1], + [91591, 1], + [91590, 1], + [91589, 1], + [91588, 1], + [91587, 1], + [91586, 1], + [91585, 1], + [91584, 1], + [91583, 1], + [91582, 1], + [91581, 1], + [91580, 1], + [91579, 1], + [91578, 1], + [91577, 1], + [91576, 1], + [91575, 1], + [91574, 1], + [91573, 1], + [91572, 1], + [91571, 1], + [91570, 1], + [91569, 1], + [91568, 1], + [91567, 1], + [91566, 1], + [91565, 1], + [91564, 1], + [91563, 1], + [91562, 1], + [91561, 1], + [91560, 1], + [91559, 1], + [91558, 1], + [91557, 1], + [91556, 1], + [91555, 1], + [91554, 1], + [91553, 1], + [91552, 1], + [91551, 1], + [91550, 1], + [91549, 1], + [91548, 1], + [91547, 1], + [91546, 1], + [91545, 1], + [91544, 1], + [91543, 1], + [91542, 1], + [91541, 1], + [91540, 1], + [91539, 1], + [91538, 1], + [91537, 1], + [91536, 1], + [91535, 1], + [91534, 1], + [91533, 1], + [91532, 1], + [91531, 1], + [91530, 1], + [91529, 1], + [91528, 1], + [91527, 1], + [91526, 1], + [91525, 1], + [91524, 1], + [91523, 1], + [91522, 1], + [91521, 1], + [91520, 1], + [91519, 1], + [91518, 1], + [91517, 1], + [91516, 1], + [91515, 1], + [91514, 1], + [91513, 1], + [91512, 1], + [91511, 1], + [91510, 1], + [91509, 1], + [91508, 1], + [91507, 1], + [91506, 1], + [91505, 1], + [91504, 1], + [91503, 1], + [91502, 1], + [91501, 1], + [91500, 1], + [91499, 1], + [91498, 1], + [91497, 1], + [91496, 1], + [91495, 1], + [91494, 1], + [91493, 1], + [91492, 1], + [91491, 1], + [91490, 1], + [91489, 1], + [91488, 1], + [91487, 1], + [91486, 1], + [91485, 1], + [91484, 1], + [91483, 1], + [91482, 1], + [91481, 1], + [91480, 1], + [91479, 1], + [91478, 1], + [91477, 1], + [91476, 1], + [91475, 1], + [91474, 1], + [91473, 1], + [91472, 1], + [91471, 1], + [91470, 1], + [91469, 1], + [91468, 1], + [91467, 1], + [91466, 1], + [91465, 1], + [91464, 1], + [91463, 1], + [91462, 1], + [91461, 1], + [91460, 1], + [91459, 1], + [91458, 1], + [91457, 1], + [91456, 1], + [91455, 1], + [91454, 1], + [91453, 1], + [91452, 1], + [91451, 1], + [91450, 1], + [91449, 1], + [91448, 1], + [91447, 1], + [91446, 1], + [91445, 1], + [91444, 1], + [91443, 1], + [91442, 1], + [91441, 1], + [91440, 1], + [91439, 1], + [91438, 1], + [91437, 1], + [91436, 1], + [91435, 1], + [91434, 1], + [91433, 1], + [91432, 1], + [91431, 1], + [91430, 1], + [91429, 1], + [91428, 1], + [91427, 1], + [91426, 1], + [91425, 1], + [91424, 1], + [91423, 1], + [91422, 1], + [91421, 1], + [91420, 1], + [91419, 1], + [91418, 1], + [91417, 1], + [91416, 1], + [91415, 1], + [91414, 1], + [91413, 1], + [91412, 1], + [91411, 1], + [91410, 1], + [91409, 1], + [91408, 1], + [91407, 1], + [91406, 1], + [91405, 1], + [91404, 1], + [91403, 1], + [91402, 1], + [91401, 1], + [91400, 1], + [91399, 1], + [91398, 1], + [91397, 1], + [91396, 1], + [91395, 1], + [91394, 1], + [91393, 1], + [91392, 1], + [91391, 1], + [91390, 1], + [91389, 1], + [91388, 1], + [91387, 1], + [91386, 1], + [91385, 1], + [91384, 1], + [91383, 1], + [91382, 1], + [91381, 1], + [91380, 1], + [91379, 1], + [91378, 1], + [91377, 1], + [91376, 1], + [91375, 1], + [91374, 1], + [91373, 1], + [91372, 1], + [91371, 1], + [91370, 1], + [91369, 1], + [91368, 1], + [91367, 1], + [91366, 1], + [91365, 1], + [91364, 1], + [91363, 1], + [91362, 1], + [91361, 1], + [91360, 1], + [91359, 1], + [91358, 1], + [91357, 1], + [91356, 1], + [91355, 1], + [91354, 1], + [91353, 1], + [91352, 1], + [91351, 1], + [91350, 1], + [91349, 1], + [91348, 1], + [91347, 1], + [91346, 1], + [91345, 1], + [91344, 1], + [91343, 1], + [91342, 1], + [91341, 1], + [91340, 1], + [91339, 1], + [91338, 1], + [91337, 1], + [91336, 1], + [91335, 1], + [91334, 1], + [91333, 1], + [91332, 1], + [91331, 1], + [91330, 1], + [91329, 1], + [91328, 1], + [91327, 1], + [91326, 1], + [91325, 1], + [91324, 1], + [91323, 1], + [91322, 1], + [91321, 1], + [91320, 1], + [91319, 1], + [91318, 1], + [91317, 1], + [91316, 1], + [91315, 1], + [91314, 1], + [91313, 1], + [91312, 1], + [91311, 1], + [91310, 1], + [91309, 1], + [91308, 1], + [91307, 1], + [91306, 1], + [91305, 1], + [91304, 1], + [91303, 1], + [91302, 1], + [91301, 1], + [91300, 1], + [91299, 1], + [91298, 1], + [91297, 1], + [91296, 1], + [91295, 1], + [91294, 1], + [91293, 1], + [91292, 1], + [91291, 1], + [91290, 1], + [91289, 1], + [91288, 1], + [91287, 1], + [91286, 1], + [91285, 1], + [91284, 1], + [91283, 1], + [91282, 1], + [91281, 1], + [91280, 1], + [91279, 1], + [91278, 1], + [91277, 1], + [91276, 1], + [91275, 1], + [91274, 1], + [91273, 1], + [91272, 1], + [91271, 1], + [91270, 1], + [91269, 1], + [91268, 1], + [91267, 1], + [91266, 1], + [91265, 1], + [91264, 1], + [91263, 1], + [91262, 1], + [91261, 1], + [91260, 1], + [91259, 1], + [91258, 1], + [91257, 1], + [91256, 1], + [91255, 1], + [91254, 1], + [91253, 1], + [91252, 1], + [91251, 1], + [91250, 1], + [91249, 1], + [91248, 1], + [91247, 1], + [91246, 1], + [91245, 1], + [91244, 1], + [91243, 1], + [91242, 1], + [91241, 1], + [91240, 1], + [91239, 1], + [91238, 1], + [91237, 1], + [91236, 1], + [91235, 1], + [91234, 1], + [91233, 1], + [91232, 1], + [91231, 1], + [91230, 1], + [91229, 1], + [91228, 1], + [91227, 1], + [91226, 1], + [91225, 1], + [91224, 1], + [91223, 1], + [91222, 1], + [91221, 1], + [91220, 1], + [91219, 1], + [91218, 1], + [91217, 1], + [91216, 1], + [91215, 1], + [91214, 1], + [91213, 1], + [91212, 1], + [91211, 1], + [91210, 1], + [91209, 1], + [91208, 1], + [91207, 1], + [91206, 1], + [91205, 1], + [91204, 1], + [91203, 1], + [91202, 1], + [91201, 1], + [91200, 1], + [91199, 1], + [91198, 1], + [91197, 1], + [91196, 1], + [91195, 1], + [91194, 1], + [91193, 1], + [91192, 1], + [91191, 1], + [91190, 1], + [91189, 1], + [91188, 1], + [91187, 1], + [91186, 1], + [91185, 1], + [91184, 1], + [91183, 1], + [91182, 1], + [91181, 1], + [91180, 1], + [91179, 1], + [91178, 1], + [91177, 1], + [91176, 1], + [91175, 1], + [91174, 1], + [91173, 1], + [91172, 1], + [91171, 1], + [91170, 1], + [91169, 1], + [91168, 1], + [91167, 1], + [91166, 1], + [91165, 1], + [91164, 1], + [91163, 1], + [91162, 1], + [91161, 1], + [91160, 1], + [91159, 1], + [91158, 1], + [91157, 1], + [91156, 1], + [91155, 1], + [91154, 1], + [91153, 1], + [91152, 1], + [91151, 1], + [91150, 1], + [91149, 1], + [91148, 1], + [91147, 1], + [91146, 1], + [91145, 1], + [91144, 1], + [91143, 1], + [91142, 1], + [91141, 1], + [91140, 1], + [91139, 1], + [91138, 1], + [91137, 1], + [91136, 1], + [91135, 1], + [91134, 1], + [91133, 1], + [91132, 1], + [91131, 1], + [91130, 1], + [91129, 1], + [91128, 1], + [91127, 1], + [91126, 1], + [91125, 1], + [91124, 1], + [91123, 1], + [91122, 1], + [91121, 1], + [91120, 1], + [91119, 1], + [91118, 1], + [91117, 1], + [91116, 1], + [91115, 1], + [91114, 1], + [91113, 1], + [91112, 1], + [91111, 1], + [91110, 1], + [91109, 1], + [91108, 1], + [91107, 1], + [91106, 1], + [91105, 1], + [91104, 1], + [91103, 1], + [91102, 1], + [91101, 1], + [91100, 1], + [91099, 1], + [91098, 1], + [91097, 1], + [91096, 1], + [91095, 1], + [91094, 1], + [91093, 1], + [91092, 1], + [91091, 1], + [91090, 1], + [91089, 1], + [91088, 1], + [91087, 1], + [91086, 1], + [91085, 1], + [91084, 1], + [91083, 1], + [91082, 1], + [91081, 1], + [91080, 1], + [91079, 1], + [91078, 1], + [91077, 1], + [91076, 1], + [91075, 1], + [91074, 1], + [91073, 1], + [91072, 1], + [91071, 1], + [91070, 1], + [91069, 1], + [91068, 1], + [91067, 1], + [91066, 1], + [91065, 1], + [91064, 1], + [91063, 1], + [91062, 1], + [91061, 1], + [91060, 1], + [91059, 1], + [91058, 1], + [91057, 1], + [91056, 1], + [91055, 1], + [91054, 1], + [91053, 1], + [91052, 1], + [91051, 1], + [91050, 1], + [91049, 1], + [91048, 1], + [91047, 1], + [91046, 1], + [91045, 1], + [91044, 1], + [91043, 1], + [91042, 1], + [91041, 1], + [91040, 1], + [91039, 1], + [91038, 1], + [91037, 1], + [91036, 1], + [91035, 1], + [91034, 1], + [91033, 1], + [91032, 1], + [91031, 1], + [91030, 1], + [91029, 1], + [91028, 1], + [91027, 1], + [91026, 1], + [91025, 1], + [91024, 1], + [91023, 1], + [91022, 1], + [91021, 1], + [91020, 1], + [91019, 1], + [91018, 1], + [91017, 1], + [91016, 1], + [91015, 1], + [91014, 1], + [91013, 1], + [91012, 1], + [91011, 1], + [91010, 1], + [91009, 1], + [91008, 1], + [91007, 1], + [91006, 1], + [91005, 1], + [91004, 1], + [91003, 1], + [91002, 1], + [91001, 1], + [91000, 1], + [90999, 1], + [90998, 1], + [90997, 1], + [90996, 1], + [90995, 1], + [90994, 1], + [90993, 1], + [90992, 1], + [90991, 1], + [90990, 1], + [90989, 1], + [90988, 1], + [90987, 1], + [90986, 1], + [90985, 1], + [90984, 1], + [90983, 1], + [90982, 1], + [90981, 1], + [90980, 1], + [90979, 1], + [90978, 1], + [90977, 1], + [90976, 1], + [90975, 1], + [90974, 1], + [90973, 1], + [90972, 1], + [90971, 1], + [90970, 1], + [90969, 1], + [90968, 1], + [90967, 1], + [90966, 1], + [90965, 1], + [90964, 1], + [90963, 1], + [90962, 1], + [90961, 1], + [90960, 1], + [90959, 1], + [90958, 1], + [90957, 1], + [90956, 1], + [90955, 1], + [90954, 1], + [90953, 1], + [90952, 1], + [90951, 1], + [90950, 1], + [90949, 1], + [90948, 1], + [90947, 1], + [90946, 1], + [90945, 1], + [90944, 1], + [90943, 1], + [90942, 1], + [90941, 1], + [90940, 1], + [90939, 1], + [90938, 1], + [90937, 1], + [90936, 1], + [90935, 1], + [90934, 1], + [90933, 1], + [90932, 1], + [90931, 1], + [90930, 1], + [90929, 1], + [90928, 1], + [90927, 1], + [90926, 1], + [90925, 1], + [90924, 1], + [90923, 1], + [90922, 1], + [90921, 1], + [90920, 1], + [90919, 1], + [90918, 1], + [90917, 1], + [90916, 1], + [90915, 1], + [90914, 1], + [90913, 1], + [90912, 1], + [90911, 1], + [90910, 1], + [90909, 1], + [90908, 1], + [90907, 1], + [90906, 1], + [90905, 1], + [90904, 1], + [90903, 1], + [90902, 1], + [90901, 1], + [90900, 1], + [90899, 1], + [90898, 1], + [90897, 1], + [90896, 1], + [90895, 1], + [90894, 1], + [90893, 1], + [90892, 1], + [90891, 1], + [90890, 1], + [90889, 1], + [90888, 1], + [90887, 1], + [90886, 1], + [90885, 1], + [90884, 1], + [90883, 1], + [90882, 1], + [90881, 1], + [90880, 1], + [90879, 1], + [90878, 1], + [90877, 1], + [90876, 1], + [90875, 1], + [90874, 1], + [90873, 1], + [90872, 1], + [90871, 1], + [90870, 1], + [90869, 1], + [90868, 1], + [90867, 1], + [90866, 1], + [90865, 1], + [90864, 1], + [90863, 1], + [90862, 1], + [90861, 1], + [90860, 1], + [90859, 1], + [90858, 1], + [90857, 1], + [90856, 1], + [90855, 1], + [90854, 1], + [90853, 1], + [90852, 1], + [90851, 1], + [90850, 1], + [90849, 1], + [90848, 1], + [90847, 1], + [90846, 1], + [90845, 1], + [90844, 1], + [90843, 1], + [90842, 1], + [90841, 1], + [90840, 1], + [90839, 1], + [90838, 1], + [90837, 1], + [90836, 1], + [90835, 1], + [90834, 1], + [90833, 1], + [90832, 1], + [90831, 1], + [90830, 1], + [90829, 1], + [90828, 1], + [90827, 1], + [90826, 1], + [90825, 1], + [90824, 1], + [90823, 1], + [90822, 1], + [90821, 1], + [90820, 1], + [90819, 1], + [90818, 1], + [90817, 1], + [90816, 1], + [90815, 1], + [90814, 1], + [90813, 1], + [90812, 1], + [90811, 1], + [90810, 1], + [90809, 1], + [90808, 1], + [90807, 1], + [90806, 1], + [90805, 1], + [90804, 1], + [90803, 1], + [90802, 1], + [90801, 1], + [90800, 1], + [90799, 1], + [90798, 1], + [90797, 1], + [90796, 1], + [90795, 1], + [90794, 1], + [90793, 1], + [90792, 1], + [90791, 1], + [90790, 1], + [90789, 1], + [90788, 1], + [90787, 1], + [90786, 1], + [90785, 1], + [90784, 1], + [90783, 1], + [90782, 1], + [90781, 1], + [90780, 1], + [90779, 1], + [90778, 1], + [90777, 1], + [90776, 1], + [90775, 1], + [90774, 1], + [90773, 1], + [90772, 1], + [90771, 1], + [90770, 1], + [90769, 1], + [90768, 1], + [90767, 1], + [90766, 1], + [90765, 1], + [90764, 1], + [90763, 1], + [90762, 1], + [90761, 1], + [90760, 1], + [90759, 1], + [90758, 1], + [90757, 1], + [90756, 1], + [90755, 1], + [90754, 1], + [90753, 1], + [90752, 1], + [90751, 1], + [90750, 1], + [90749, 1], + [90748, 1], + [90747, 1], + [90746, 1], + [90745, 1], + [90744, 1], + [90743, 1], + [90742, 1], + [90741, 1], + [90740, 1], + [90739, 1], + [90738, 1], + [90737, 1], + [90736, 1], + [90735, 1], + [90734, 1], + [90733, 1], + [90732, 1], + [90731, 1], + [90730, 1], + [90729, 1], + [90728, 1], + [90727, 1], + [90726, 1], + [90725, 1], + [90724, 1], + [90723, 1], + [90722, 1], + [90721, 1], + [90720, 1], + [90719, 1], + [90718, 1], + [90717, 1], + [90716, 1], + [90715, 1], + [90714, 1], + [90713, 1], + [90712, 1], + [90711, 1], + [90710, 1], + [90709, 1], + [90708, 1], + [90707, 1], + [90706, 1], + [90705, 1], + [90704, 1], + [90703, 1], + [90702, 1], + [90701, 1], + [90700, 1], + [90699, 1], + [90698, 1], + [90697, 1], + [90696, 1], + [90695, 1], + [90694, 1], + [90693, 1], + [90692, 1], + [90691, 1], + [90690, 1], + [90689, 1], + [90688, 1], + [90687, 1], + [90686, 1], + [90685, 1], + [90684, 1], + [90683, 1], + [90682, 1], + [90681, 1], + [90680, 1], + [90679, 1], + [90678, 1], + [90677, 1], + [90676, 1], + [90675, 1], + [90674, 1], + [90673, 1], + [90672, 1], + [90671, 1], + [90670, 1], + [90669, 1], + [90668, 1], + [90667, 1], + [90666, 1], + [90665, 1], + [90664, 1], + [90663, 1], + [90662, 1], + [90661, 1], + [90660, 1], + [90659, 1], + [90658, 1], + [90657, 1], + [90656, 1], + [90655, 1], + [90654, 1], + [90653, 1], + [90652, 1], + [90651, 1], + [90650, 1], + [90649, 1], + [90648, 1], + [90647, 1], + [90646, 1], + [90645, 1], + [90644, 1], + [90643, 1], + [90642, 1], + [90641, 1], + [90640, 1], + [90639, 1], + [90638, 1], + [90637, 1], + [90636, 1], + [90635, 1], + [90634, 1], + [90633, 1], + [90632, 1], + [90631, 1], + [90630, 1], + [90629, 1], + [90628, 1], + [90627, 1], + [90626, 1], + [90625, 1], + [90624, 1], + [90623, 1], + [90622, 1], + [90621, 1], + [90620, 1], + [90619, 1], + [90618, 1], + [90617, 1], + [90616, 1], + [90615, 1], + [90614, 1], + [90613, 1], + [90612, 1], + [90611, 1], + [90610, 1], + [90609, 1], + [90608, 1], + [90607, 1], + [90606, 1], + [90605, 1], + [90604, 1], + [90603, 1], + [90602, 1], + [90601, 1], + [90600, 1], + [90599, 1], + [90598, 1], + [90597, 1], + [90596, 1], + [90595, 1], + [90594, 1], + [90593, 1], + [90592, 1], + [90591, 1], + [90590, 1], + [90589, 1], + [90588, 1], + [90587, 1], + [90586, 1], + [90585, 1], + [90584, 1], + [90583, 1], + [90582, 1], + [90581, 1], + [90580, 1], + [90579, 1], + [90578, 1], + [90577, 1], + [90576, 1], + [90575, 1], + [90574, 1], + [90573, 1], + [90572, 1], + [90571, 1], + [90570, 1], + [90569, 1], + [90568, 1], + [90567, 1], + [90566, 1], + [90565, 1], + [90564, 1], + [90563, 1], + [90562, 1], + [90561, 1], + [90560, 1], + [90559, 1], + [90558, 1], + [90557, 1], + [90556, 1], + [90555, 1], + [90554, 1], + [90553, 1], + [90552, 1], + [90551, 1], + [90550, 1], + [90549, 1], + [90548, 1], + [90547, 1], + [90546, 1], + [90545, 1], + [90544, 1], + [90543, 1], + [90542, 1], + [90541, 1], + [90540, 1], + [90539, 1], + [90538, 1], + [90537, 1], + [90536, 1], + [90535, 1], + [90534, 1], + [90533, 1], + [90532, 1], + [90531, 1], + [90530, 1], + [90529, 1], + [90528, 1], + [90527, 1], + [90526, 1], + [90525, 1], + [90524, 1], + [90523, 1], + [90522, 1], + [90521, 1], + [90520, 1], + [90519, 1], + [90518, 1], + [90517, 1], + [90516, 1], + [90515, 1], + [90514, 1], + [90513, 1], + [90512, 1], + [90511, 1], + [90510, 1], + [90509, 1], + [90508, 1], + [90507, 1], + [90506, 1], + [90505, 1], + [90504, 1], + [90503, 1], + [90502, 1], + [90501, 1], + [90500, 1], + [90499, 1], + [90498, 1], + [90497, 1], + [90496, 1], + [90495, 1], + [90494, 1], + [90493, 1], + [90492, 1], + [90491, 1], + [90490, 1], + [90489, 1], + [90488, 1], + [90487, 1], + [90486, 1], + [90485, 1], + [90484, 1], + [90483, 1], + [90482, 1], + [90481, 1], + [90480, 1], + [90479, 1], + [90478, 1], + [90477, 1], + [90476, 1], + [90475, 1], + [90474, 1], + [90473, 1], + [90472, 1], + [90471, 1], + [90470, 1], + [90469, 1], + [90468, 1], + [90467, 1], + [90466, 1], + [90465, 1], + [90464, 1], + [90463, 1], + [88131, 0, "\n"], + [88132, 0, "\n"], + [88133, 0, "\\"], + [88134, 0, "b"], + [88135, 0, "e"], + [88136, 0, "g"], + [88137, 0, "i"], + [88138, 0, "n"], + [88139, 0, "{"], + [88140, 0, "p"], + [88141, 0, "r"], + [88142, 0, "o"], + [88143, 0, "o"], + [88144, 0, "f"], + [88145, 0, "}"], + [88146, 0, "\n"], + [88147, 0, "\\"], + [88148, 0, "e"], + [88149, 0, "n"], + [88150, 0, "d"], + [88151, 0, "{"], + [88152, 0, "p"], + [88153, 0, "r"], + [88154, 0, "o"], + [88155, 0, "o"], + [88156, 0, "f"], + [88157, 0, "}"], + [88146, 0, "\n"], + [88147, 0, "T"], + [88148, 0, "h"], + [88149, 0, "e"], + [88150, 0, " "], + [88151, 0, "r"], + [88152, 0, "u"], + [88153, 0, "l"], + [88154, 0, "e"], + [88155, 0, "s"], + [88156, 0, " "], + [88157, 0, "i"], + [88158, 0, "n"], + [88159, 0, " "], + [88160, 0, "F"], + [88161, 0, "i"], + [88162, 0, "g"], + [88163, 0, "u"], + [88164, 0, "r"], + [88165, 0, "e"], + [88166, 0, "~"], + [88167, 0, "\\"], + [88168, 0, "r"], + [88169, 0, "e"], + [88170, 0, "f"], + [88171, 0, "{"], + [88172, 0, "f"], + [88173, 0, "i"], + [88174, 0, "g"], + [88175, 0, ":"], + [88176, 0, "c"], + [88177, 0, "l"], + [88178, 0, "e"], + [88179, 0, "a"], + [88180, 0, "r"], + [88181, 0, "_"], + [88181, 1], + [88181, 0, "-"], + [88182, 0, "r"], + [88183, 0, "u"], + [88184, 0, "o"], + [88185, 0, "e"], + [88186, 0, "s"], + [88186, 1], + [88185, 1], + [88184, 1], + [88184, 0, "l"], + [88185, 0, "e"], + [88186, 0, "s"], + [88187, 0, "}"], + [88188, 0, " "], + [88189, 0, "d"], + [88190, 0, "e"], + [88191, 0, "f"], + [88192, 0, "i"], + [88193, 0, "n"], + [88194, 0, "e"], + [88195, 0, " "], + [88196, 0, "h"], + [88197, 0, "o"], + [88198, 0, "w"], + [88199, 0, " "], + [88200, 0, "a"], + [88201, 0, " "], + [88202, 0, "d"], + [88203, 0, "e"], + [88204, 0, "l"], + [88205, 0, "e"], + [88206, 0, "t"], + [88207, 0, "i"], + [88208, 0, "o"], + [88209, 0, "n"], + [88210, 0, " "], + [88211, 0, "o"], + [88212, 0, "p"], + [88213, 0, "e"], + [88214, 0, "r"], + [88215, 0, "a"], + [88216, 0, "t"], + [88217, 0, "i"], + [88218, 0, "o"], + [88219, 0, "n"], + [88220, 0, " "], + [88221, 0, "i"], + [88222, 0, "s"], + [88223, 0, " "], + [88224, 0, "a"], + [88225, 0, "p"], + [88226, 0, "p"], + [88227, 0, "l"], + [88228, 0, "i"], + [88229, 0, "e"], + [88230, 0, "d"], + [88231, 0, ":"], + [88232, 0, " "], + [88233, 0, "s"], + [88234, 0, "t"], + [88235, 0, "a"], + [88236, 0, "r"], + [88237, 0, "t"], + [88238, 0, "i"], + [88239, 0, "n"], + [88240, 0, "g"], + [88241, 0, " "], + [88242, 0, "a"], + [88243, 0, "t"], + [88244, 0, " "], + [88245, 0, "t"], + [88246, 0, "h"], + [88247, 0, "e"], + [88248, 0, " "], + [88249, 0, "c"], + [88250, 0, "u"], + [88251, 0, "r"], + [88252, 0, "s"], + [88253, 0, "o"], + [88254, 0, "r"], + [88255, 0, " "], + [88256, 0, "p"], + [88257, 0, "o"], + [88258, 0, "s"], + [88259, 0, "i"], + [88260, 0, "t"], + [88261, 0, "i"], + [88262, 0, "o"], + [88263, 0, "n"], + [88264, 0, " "], + [88265, 0, "i"], + [88266, 0, "d"], + [88267, 0, "e"], + [88268, 0, "n"], + [88269, 0, "t"], + [88270, 0, "i"], + [88271, 0, "f"], + [88272, 0, "i"], + [88273, 0, "e"], + [88274, 0, "d"], + [88275, 0, " "], + [88276, 0, "i"], + [88277, 0, "n"], + [88278, 0, " "], + [88278, 1], + [88277, 1], + [88276, 1], + [88275, 1], + [88274, 1], + [88273, 1], + [88272, 1], + [88271, 1], + [88270, 1], + [88269, 1], + [88268, 1], + [88267, 1], + [88266, 1], + [88265, 1], + [88264, 1], + [88263, 1], + [88262, 1], + [88261, 1], + [88260, 1], + [88259, 1], + [88258, 1], + [88257, 1], + [88256, 1], + [88256, 0, "i"], + [88257, 0, "n"], + [88258, 0, " "], + [88259, 0, "t"], + [88260, 0, "h"], + [88261, 0, "e"], + [88262, 0, " "], + [88263, 0, "o"], + [88264, 0, "p"], + [88265, 0, "e"], + [88266, 0, "r"], + [88267, 0, "a"], + [88268, 0, "t"], + [88269, 0, "i"], + [88270, 0, "o"], + [88271, 0, "n"], + [88272, 0, ","], + [88273, 0, " "], + [88274, 0, "t"], + [88275, 0, "h"], + [88276, 0, "e"], + [88277, 0, "y"], + [88278, 0, " "], + [88279, 0, "r"], + [88280, 0, "e"], + [88281, 0, "c"], + [88282, 0, "u"], + [88283, 0, "r"], + [88284, 0, "s"], + [88285, 0, "i"], + [88286, 0, "v"], + [88287, 0, "e"], + [88288, 0, "l"], + [88289, 0, "y"], + [88290, 0, " "], + [88291, 0, "d"], + [88292, 0, "e"], + [88293, 0, "s"], + [88294, 0, "c"], + [88295, 0, "e"], + [88296, 0, "n"], + [88297, 0, "d"], + [88298, 0, " "], + [88299, 0, "t"], + [88300, 0, "h"], + [88301, 0, "e"], + [88302, 0, " "], + [88303, 0, "t"], + [88304, 0, "r"], + [88305, 0, "e"], + [88306, 0, "e"], + [88220, 0, " "], + [88221, 0, "$"], + [88222, 0, "o"], + [88223, 0, "_"], + [88224, 0, "\\"], + [88225, 0, "m"], + [88226, 0, "a"], + [88227, 0, "t"], + [88228, 0, "h"], + [88229, 0, "r"], + [88230, 0, "m"], + [88231, 0, "{"], + [88232, 0, "d"], + [88233, 0, "e"], + [88234, 0, "l"], + [88235, 0, "}"], + [88236, 0, "$"], + [88324, 0, ","], + [88325, 0, " "], + [88326, 0, "r"], + [88327, 0, "e"], + [88328, 0, "m"], + [88329, 0, "o"], + [88330, 0, "v"], + [88331, 0, "i"], + [88332, 0, "n"], + [88333, 0, "g"], + [88334, 0, " "], + [88335, 0, "$"], + [88336, 0, "o"], + [88337, 0, "_"], + [88338, 0, "\\"], + [88339, 0, "m"], + [88340, 0, "a"], + [88341, 0, "t"], + [88342, 0, "h"], + [88343, 0, "r"], + [88344, 0, "m"], + [88345, 0, "{"], + [88346, 0, "d"], + [88347, 0, "e"], + [88348, 0, "l"], + [88349, 0, "}"], + [88350, 0, "."], + [88351, 0, "\\"], + [88352, 0, "m"], + [88353, 0, "a"], + [88354, 0, "t"], + [88355, 0, "h"], + [88356, 0, "i"], + [88357, 0, "t"], + [88358, 0, "{"], + [88359, 0, "d"], + [88360, 0, "e"], + [88361, 0, "p"], + [88362, 0, "s"], + [88363, 0, "}"], + [88364, 0, "$"], + [88365, 0, " "], + [88366, 0, "f"], + [88367, 0, "r"], + [88368, 0, "o"], + [88369, 0, "m"], + [88370, 0, " "], + [88320, 0, "s"], + [88321, 0, "u"], + [88322, 0, "b"], + [88374, 0, "a"], + [88375, 0, "l"], + [88376, 0, "l"], + [88377, 0, " "], + [88378, 0, "b"], + [88379, 0, "r"], + [88380, 0, "a"], + [88381, 0, "n"], + [88373, 0, " "], + [88374, 0, "t"], + [88375, 0, "h"], + [88376, 0, "e"], + [88377, 0, " "], + [88378, 0, "p"], + [88379, 0, "r"], + [88380, 0, "e"], + [88381, 0, "s"], + [88382, 0, "e"], + [88383, 0, "n"], + [88384, 0, "c"], + [88385, 0, "e"], + [88386, 0, " "], + [88387, 0, "s"], + [88388, 0, "e"], + [88389, 0, "t"], + [88390, 0, " "], + [88391, 0, "$"], + [88392, 0, "\\"], + [88393, 0, "m"], + [88394, 0, "a"], + [88395, 0, "t"], + [88396, 0, "h"], + [88397, 0, "s"], + [88398, 0, "f"], + [88399, 0, "{"], + [88400, 0, "p"], + [88401, 0, "r"], + [88402, 0, "e"], + [88403, 0, "s"], + [88404, 0, "}"], + [88405, 0, "("], + [88406, 0, "k"], + [88407, 0, ")"], + [88408, 0, "$"], + [88409, 0, " "], + [88410, 0, "a"], + [88411, 0, "t"], + [88421, 0, "c"], + [88422, 0, "h"], + [88423, 0, " "], + [88424, 0, "n"], + [88425, 0, "o"], + [88426, 0, "d"], + [88427, 0, "e"], + [88428, 0, "s"], + [88429, 0, " "], + [88430, 0, "i"], + [88431, 0, "n"], + [88432, 0, " "], + [88433, 0, "t"], + [88434, 0, "h"], + [88435, 0, "e"], + [88436, 0, " "], + [88437, 0, "s"], + [88438, 0, "u"], + [88439, 0, "b"], + [88440, 0, "t"], + [88441, 0, "r"], + [88442, 0, "e"], + [88443, 0, "e"], + [88014, 1], + [88013, 1], + [88012, 1], + [88011, 1], + [88010, 1], + [88009, 1], + [88008, 1], + [88007, 1], + [88006, 1], + [88005, 1], + [88004, 1], + [88003, 1], + [88002, 1], + [88001, 1], + [88000, 1], + [87999, 1], + [87998, 1], + [87997, 1], + [87996, 1], + [87995, 1], + [87994, 1], + [87993, 1], + [87992, 1], + [87991, 1], + [87990, 1], + [87989, 1], + [87988, 1], + [87987, 1], + [87986, 1], + [87985, 1], + [87984, 1], + [87983, 1], + [87982, 1], + [87981, 1], + [87980, 1], + [87979, 1], + [87978, 1], + [87977, 1], + [87976, 1], + [87975, 1], + [87974, 1], + [87973, 1], + [87972, 1], + [87971, 1], + [87970, 1], + [87969, 1], + [87968, 1], + [87967, 1], + [87966, 1], + [87965, 1], + [87964, 1], + [87963, 1], + [87962, 1], + [87961, 1], + [87960, 1], + [87959, 1], + [87958, 1], + [87957, 1], + [87956, 1], + [87955, 1], + [87954, 1], + [87953, 1], + [87952, 1], + [88381, 0, ","], + [88382, 0, " "], + [88383, 0, "a"], + [88384, 0, "n"], + [88385, 0, "d"], + [88386, 0, " "], + [88387, 0, "u"], + [88388, 0, "p"], + [88389, 0, "d"], + [88390, 0, "a"], + [88391, 0, "t"], + [88392, 0, "i"], + [88393, 0, "n"], + [88394, 0, "g"], + [88395, 0, " "], + [88396, 0, "a"], + [88397, 0, "l"], + [88398, 0, "l"], + [88399, 0, " "], + [88400, 0, "r"], + [88401, 0, "e"], + [88402, 0, "g"], + [88403, 0, "i"], + [88404, 0, "s"], + [88405, 0, "t"], + [88406, 0, "e"], + [88407, 0, "r"], + [88408, 0, "s"], + [88409, 0, " "], + [88410, 0, "t"], + [88411, 0, "o"], + [88412, 0, " "], + [88413, 0, "r"], + [88414, 0, "e"], + [88415, 0, "m"], + [88416, 0, "o"], + [88417, 0, "v"], + [88418, 0, "e"], + [88419, 0, " "], + [88420, 0, "a"], + [88421, 0, "n"], + [88422, 0, "y"], + [88423, 0, " "], + [88424, 0, "v"], + [88425, 0, "a"], + [88426, 0, "l"], + [88427, 0, "u"], + [88428, 0, "e"], + [88429, 0, "s"], + [88430, 0, " "], + [88431, 0, "w"], + [88432, 0, "r"], + [88433, 0, "i"], + [88434, 0, "t"], + [88435, 0, "t"], + [88436, 0, "e"], + [88437, 0, "n"], + [88438, 0, " "], + [88439, 0, "b"], + [88440, 0, "y"], + [88441, 0, " "], + [88442, 0, "o"], + [88443, 0, "p"], + [88444, 0, "e"], + [88445, 0, "r"], + [88446, 0, "a"], + [88447, 0, "t"], + [88448, 0, "i"], + [88449, 0, "o"], + [88450, 0, "n"], + [88451, 0, "s"], + [88452, 0, " "], + [88453, 0, "i"], + [88454, 0, "n"], + [88455, 0, " "], + [88456, 0, "$"], + [88457, 0, "o"], + [88458, 0, "_"], + [88459, 0, "\\"], + [88460, 0, "m"], + [88461, 0, "a"], + [88462, 0, "t"], + [88463, 0, "h"], + [88464, 0, "r"], + [88465, 0, "m"], + [88466, 0, "{"], + [88467, 0, "d"], + [88468, 0, "e"], + [88469, 0, "l"], + [88470, 0, "}"], + [88471, 0, "."], + [88472, 0, "\\"], + [88473, 0, "m"], + [88474, 0, "a"], + [88475, 0, "t"], + [88476, 0, "h"], + [88477, 0, "i"], + [88478, 0, "t"], + [88479, 0, "{"], + [88480, 0, "d"], + [88481, 0, "e"], + [88482, 0, "p"], + [88483, 0, "s"], + [88484, 0, "}"], + [88485, 0, "$"], + [88486, 0, "."], + [53419, 0, ","], + [53420, 0, " "], + [53421, 0, "\\"], + [53422, 0, "m"], + [53423, 0, "a"], + [53424, 0, "t"], + [53425, 0, "h"], + [53426, 0, "i"], + [53427, 0, "t"], + [53428, 0, "{"], + [53429, 0, "m"], + [53430, 0, "u"], + [53431, 0, "t"], + [53432, 0, "}"], + [54999, 1], + [54998, 1], + [54997, 1], + [54996, 1], + [54995, 1], + [54994, 1], + [54993, 1], + [54992, 1], + [54991, 1], + [54991, 0, "c"], + [54992, 0, "e"], + [54993, 0, "n"], + [54994, 0, "t"], + [54995, 0, "e"], + [54996, 0, "r"], + [55369, 1], + [55368, 1], + [55367, 1], + [55366, 1], + [55365, 1], + [55364, 1], + [55363, 1], + [55362, 1], + [55361, 1], + [55361, 0, "c"], + [55362, 0, "e"], + [55363, 0, "n"], + [55364, 0, "t"], + [55365, 0, "e"], + [55366, 0, "r"], + [55355, 0, "\n"], + [55356, 0, "\\"], + [55357, 0, "D"], + [55358, 0, "i"], + [55359, 0, "s"], + [55360, 0, "p"], + [55361, 0, "l"], + [55362, 0, "a"], + [55363, 0, "u"], + [55364, 0, "y"], + [55364, 1], + [55363, 1], + [55363, 0, "y"], + [55364, 0, "P"], + [55365, 0, "r"], + [55366, 0, "o"], + [55367, 0, "o"], + [55368, 0, "f"], + [55369, 0, "\\"], + [55370, 0, "h"], + [55371, 0, "s"], + [55372, 0, "p"], + [55373, 0, "a"], + [55374, 0, "c"], + [55375, 0, "e"], + [55376, 0, "{"], + [55377, 0, "3"], + [55378, 0, "e"], + [55379, 0, "m"], + [55380, 0, "}"], + [55381, 0, "\n"], + [55382, 0, "%"], + [55383, 0, "\n"], + [55252, 0, ","], + [55253, 0, " "], + [55254, 0, "\\"], + [55255, 0, "m"], + [55256, 0, "a"], + [55257, 0, "t"], + [55258, 0, "h"], + [55259, 0, "i"], + [55260, 0, "t"], + [55261, 0, "{"], + [55262, 0, "m"], + [55263, 0, "u"], + [55264, 0, "t"], + [55265, 0, "}"], + [55182, 1], + [55182, 0, "T"], + [55183, 0, "r"], + [54998, 0, "\n"], + [54999, 0, "\\"], + [55000, 0, "A"], + [55001, 0, "x"], + [55002, 0, "i"], + [55003, 0, "o"], + [55004, 0, "m"], + [55005, 0, "C"], + [55006, 0, "{"], + [55007, 0, "$"], + [55008, 0, "\\"], + [55009, 0, "m"], + [55010, 0, "a"], + [55011, 0, "t"], + [55012, 0, "h"], + [55013, 0, "i"], + [55014, 0, "t"], + [55015, 0, "{"], + [55016, 0, "m"], + [55017, 0, "u"], + [55018, 0, "t"], + [55019, 0, "}"], + [55020, 0, " "], + [55021, 0, "\\"], + [55022, 0, "n"], + [55023, 0, "o"], + [55024, 0, "t"], + [55025, 0, "="], + [55026, 0, " "], + [55027, 0, "\\"], + [55028, 0, "m"], + [55029, 0, "a"], + [55030, 0, "t"], + [55031, 0, "h"], + [55032, 0, "s"], + [55033, 0, "f"], + [55034, 0, "{"], + [55035, 0, "d"], + [55036, 0, "e"], + [55037, 0, "l"], + [55038, 0, "e"], + [55039, 0, "t"], + [55040, 0, "e"], + [55041, 0, "}"], + [55042, 0, "$"], + [55043, 0, "}"], + [55445, 0, "\\"], + [55446, 0, "A"], + [55447, 0, "x"], + [55448, 0, "i"], + [55449, 0, "o"], + [55450, 0, "m"], + [55451, 0, "C"], + [55452, 0, "{"], + [55453, 0, "$"], + [55454, 0, "\\"], + [55455, 0, "m"], + [55456, 0, "a"], + [55457, 0, "t"], + [55458, 0, "h"], + [55459, 0, "i"], + [55460, 0, "t"], + [55461, 0, "{"], + [55462, 0, "m"], + [55463, 0, "u"], + [55464, 0, "t"], + [55465, 0, "}"], + [55466, 0, " "], + [55467, 0, "="], + [55468, 0, " "], + [55469, 0, "\\"], + [55470, 0, "m"], + [55471, 0, "a"], + [55472, 0, "t"], + [55473, 0, "h"], + [55474, 0, "s"], + [55475, 0, "f"], + [55476, 0, "{"], + [55477, 0, "d"], + [55478, 0, "e"], + [55479, 0, "l"], + [55480, 0, "e"], + [55481, 0, "t"], + [55482, 0, "e"], + [55483, 0, "}"], + [55484, 0, "$"], + [55485, 0, "}"], + [55486, 0, "\n"], + [55487, 0, "\\"], + [55210, 0, "$"], + [55226, 0, "_"], + [55227, 0, "1"], + [55228, 0, "$"], + [55492, 0, "L"], + [55493, 0, "e"], + [55494, 0, "f"], + [55495, 0, "t"], + [55496, 0, "L"], + [55497, 0, "a"], + [55498, 0, "b"], + [55499, 0, "e"], + [55500, 0, "l"], + [55501, 0, "{"], + [55502, 0, "$"], + [55503, 0, "\\"], + [55504, 0, "T"], + [55505, 0, "e"], + [55506, 0, "x"], + [55507, 0, "t"], + [55507, 1], + [55506, 1], + [55505, 1], + [55504, 1], + [55504, 0, "t"], + [55505, 0, "e"], + [55506, 0, "x"], + [55507, 0, "t"], + [55508, 0, "s"], + [55509, 0, "c"], + [55510, 0, "{"], + [55511, 0, "A"], + [55512, 0, "d"], + [55513, 0, "d"], + [55514, 0, "-"], + [55515, 0, "I"], + [55516, 0, "D"], + [55517, 0, "}"], + [55518, 0, "_"], + [55519, 0, "2"], + [55520, 0, "$"], + [55521, 0, "}"], + [55522, 0, "\n"], + [55523, 0, "\\"], + [55524, 0, "U"], + [55525, 0, "n"], + [55526, 0, "a"], + [55527, 0, "r"], + [55528, 0, "y"], + [55529, 0, "I"], + [55530, 0, "n"], + [55531, 0, "f"], + [55532, 0, "C"], + [55533, 0, "{"], + [55534, 0, "$"], + [55535, 0, "\\"], + [55536, 0, "m"], + [55537, 0, "a"], + [55538, 0, "t"], + [55539, 0, "h"], + [55540, 0, "i"], + [55541, 0, "t"], + [55542, 0, "{"], + [55543, 0, "c"], + [55544, 0, "t"], + [55545, 0, "x"], + [55546, 0, "}"], + [55547, 0, ","], + [55548, 0, "\\"], + [55549, 0, ","], + [55550, 0, " "], + [55551, 0, "\\"], + [55552, 0, "m"], + [55553, 0, "a"], + [55554, 0, "t"], + [55555, 0, "h"], + [55556, 0, "s"], + [55557, 0, "f"], + [55558, 0, "{"], + [55559, 0, "a"], + [55560, 0, "d"], + [55561, 0, "d"], + [55562, 0, "I"], + [55563, 0, "d"], + [55564, 0, "}"], + [55565, 0, "("], + [55566, 0, "k"], + [55567, 0, "_"], + [55568, 0, "\\"], + [55569, 0, "m"], + [55570, 0, "a"], + [55571, 0, "t"], + [55572, 0, "h"], + [55573, 0, "i"], + [55574, 0, "t"], + [55575, 0, "{"], + [55576, 0, "t"], + [55577, 0, "a"], + [55578, 0, "g"], + [55579, 0, "}"], + [55580, 0, ","], + [55581, 0, " "], + [55582, 0, "\\"], + [55583, 0, "m"], + [55584, 0, "a"], + [55585, 0, "t"], + [55586, 0, "h"], + [55587, 0, "i"], + [55588, 0, "t"], + [55589, 0, "{"], + [55590, 0, "i"], + [55591, 0, "d"], + [55592, 0, "}"], + [55593, 0, ","], + [55594, 0, " "], + [55595, 0, "\\"], + [55596, 0, "m"], + [55597, 0, "a"], + [55598, 0, "t"], + [55599, 0, "h"], + [55600, 0, "i"], + [55601, 0, "t"], + [55602, 0, "{"], + [55603, 0, "m"], + [55604, 0, "u"], + [55605, 0, "t"], + [55606, 0, "}"], + [55607, 0, ")"], + [55608, 0, " "], + [55609, 0, "\\"], + [55610, 0, "e"], + [55611, 0, "v"], + [55612, 0, "a"], + [55613, 0, "l"], + [55614, 0, "t"], + [55615, 0, "o"], + [55616, 0, " "], + [55617, 0, "\\"], + [55618, 0, "m"], + [55619, 0, "a"], + [55620, 0, "t"], + [55621, 0, "h"], + [55622, 0, "i"], + [55623, 0, "t"], + [55624, 0, "{"], + [55625, 0, "c"], + [55626, 0, "t"], + [55627, 0, "x"], + [55628, 0, "}"], + [55629, 0, "$"], + [55630, 0, "}"], + [55631, 0, "\n"], + [55632, 0, "\\"], + [55633, 0, "D"], + [55634, 0, "i"], + [55635, 0, "s"], + [55636, 0, "p"], + [55637, 0, "l"], + [55638, 0, "a"], + [55639, 0, "y"], + [55640, 0, "P"], + [55641, 0, "r"], + [55642, 0, "o"], + [55643, 0, "o"], + [55644, 0, "f"], + [55645, 0, "\\"], + [55646, 0, "p"], + [55647, 0, "r"], + [55648, 0, "o"], + [55649, 0, "o"], + [55650, 0, "f"], + [55651, 0, "S"], + [55652, 0, "k"], + [55653, 0, "i"], + [55654, 0, "p"], + [55655, 0, "A"], + [55656, 0, "m"], + [55657, 0, "o"], + [55658, 0, "u"], + [55659, 0, "n"], + [55660, 0, "t"], + [55988, 0, ","], + [55989, 0, " "], + [55990, 0, "\\"], + [55991, 0, "m"], + [55992, 0, "a"], + [55993, 0, "t"], + [55994, 0, "h"], + [55995, 0, "s"], + [55996, 0, "f"], + [55997, 0, "{"], + [55998, 0, "a"], + [55999, 0, "s"], + [56000, 0, "s"], + [56001, 0, "i"], + [56002, 0, "g"], + [56003, 0, "n"], + [56004, 0, "}"], + [56005, 0, "("], + [56006, 0, "\\"], + [56007, 0, "m"], + [56008, 0, "a"], + [56009, 0, "t"], + [56010, 0, "h"], + [56011, 0, "i"], + [56012, 0, "t"], + [56013, 0, "{"], + [56014, 0, "v"], + [56015, 0, "a"], + [56016, 0, "l"], + [56017, 0, "}"], + [56018, 0, ")"], + [56020, 0, "\n"], + [56021, 0, " "], + [56022, 0, " "], + [56023, 0, " "], + [56692, 0, ","], + [56693, 0, " "], + [56694, 0, "\\"], + [56695, 0, "m"], + [56696, 0, "a"], + [56697, 0, "t"], + [56698, 0, "h"], + [56699, 0, "s"], + [56700, 0, "f"], + [56701, 0, "{"], + [56702, 0, "a"], + [56703, 0, "s"], + [56704, 0, "s"], + [56705, 0, "i"], + [56706, 0, "g"], + [56707, 0, "n"], + [56708, 0, "}"], + [56709, 0, "("], + [56710, 0, "\\"], + [56711, 0, "m"], + [56712, 0, "a"], + [56713, 0, "t"], + [56714, 0, "h"], + [56715, 0, "i"], + [56716, 0, "t"], + [56717, 0, "{"], + [56718, 0, "v"], + [56719, 0, "a"], + [56720, 0, "l"], + [56721, 0, "}"], + [56722, 0, ")"], + [56724, 0, "\n"], + [56725, 0, " "], + [56726, 0, " "], + [56727, 0, " "], + [57339, 0, ","], + [57340, 0, " "], + [57341, 0, "\\"], + [57342, 0, "m"], + [57343, 0, "a"], + [57344, 0, "t"], + [57345, 0, "h"], + [57346, 0, "s"], + [57347, 0, "f"], + [57348, 0, "{"], + [57349, 0, "a"], + [57350, 0, "s"], + [57351, 0, "s"], + [57352, 0, "i"], + [57353, 0, "g"], + [57354, 0, "n"], + [57355, 0, "}"], + [57356, 0, "("], + [57357, 0, "\\"], + [57358, 0, "m"], + [57359, 0, "a"], + [57360, 0, "t"], + [57361, 0, "h"], + [57362, 0, "i"], + [57363, 0, "t"], + [57364, 0, "{"], + [57365, 0, "v"], + [57366, 0, "a"], + [57367, 0, "l"], + [57368, 0, "}"], + [57369, 0, ")"], + [57371, 0, "\n"], + [57372, 0, " "], + [57373, 0, " "], + [57374, 0, " "], + [78293, 1], + [78292, 1], + [78291, 1], + [78290, 1], + [78289, 1], + [78288, 1], + [78287, 1], + [78287, 0, "r"], + [78288, 0, "e"], + [78289, 0, "o"], + [78290, 0, "r"], + [78291, 0, "d"], + [78292, 0, "e"], + [78293, 0, "r"], + [59993, 0, "$"], + [60009, 0, "_"], + [60010, 0, "{"], + [60011, 0, "1"], + [60012, 0, ","], + [60013, 0, "2"], + [60014, 0, "}"], + [60015, 0, "$"], + [88510, 0, "\n"], + [88511, 0, "G"], + [88512, 0, "i"], + [88513, 0, "v"], + [88514, 0, "e"], + [88515, 0, "n"], + [88516, 0, " "], + [88517, 0, "a"], + [88518, 0, " "], + [88519, 0, "d"], + [88520, 0, "e"], + [88521, 0, "l"], + [88522, 0, "e"], + [88523, 0, "t"], + [88524, 0, "i"], + [88525, 0, "o"], + [88526, 0, "n"], + [88527, 0, " "], + [88528, 0, "o"], + [88529, 0, "p"], + [88530, 0, "e"], + [88531, 0, "r"], + [88532, 0, "a"], + [88533, 0, "t"], + [88534, 0, "i"], + [88535, 0, "o"], + [88536, 0, "n"], + [88537, 0, " "], + [88538, 0, "$"], + [88539, 0, "o"], + [88540, 0, "_"], + [88541, 0, "d"], + [88542, 0, "$"], + [88543, 0, " "], + [88541, 1], + [88541, 0, "\\"], + [88542, 0, "m"], + [88543, 0, "a"], + [88544, 0, "t"], + [88545, 0, "h"], + [88546, 0, "r"], + [88547, 0, "m"], + [88548, 0, "{"], + [88549, 0, "d"], + [88550, 0, "e"], + [88551, 0, "l"], + [88552, 0, "}"], + [88421, 0, "I"], + [88422, 0, "n"], + [88423, 0, " "], + [88424, 0, "a"], + [88425, 0, "n"], + [88426, 0, " "], + [88427, 0, "o"], + [88428, 0, "p"], + [88429, 0, "e"], + [88430, 0, "r"], + [88431, 0, "a"], + [88432, 0, "t"], + [88433, 0, "i"], + [88434, 0, "o"], + [88435, 0, "n"], + [88436, 0, " "], + [88437, 0, "h"], + [88438, 0, "i"], + [88439, 0, "s"], + [88440, 0, "t"], + [88441, 0, "o"], + [88442, 0, "r"], + [88443, 0, "y"], + [88444, 0, " "], + [88445, 0, "$"], + [88446, 0, "H"], + [88447, 0, "$"], + [88448, 0, ","], + [88449, 0, " "], + [88450, 1], + [88450, 0, "d"], + [88450, 0, "a"], + [88451, 0, " "], + [88460, 0, " "], + [88461, 0, "o"], + [88462, 0, "p"], + [88463, 0, "e"], + [88464, 0, "r"], + [88465, 0, "a"], + [88466, 0, "t"], + [88467, 0, "i"], + [88468, 0, "o"], + [88469, 0, "n"], + [88435, 1], + [88434, 1], + [88433, 1], + [88432, 1], + [88431, 1], + [88430, 1], + [88429, 1], + [88428, 1], + [88427, 1], + [88426, 1], + [88425, 1], + [88585, 0, "a"], + [88586, 0, "n"], + [88587, 0, "d"], + [88588, 0, " "], + [88589, 0, "a"], + [88590, 0, "n"], + [88591, 0, "y"], + [88592, 0, " "], + [88593, 0, "o"], + [88594, 0, "t"], + [88595, 0, "h"], + [88596, 0, "e"], + [88597, 0, "r"], + [88598, 0, " "], + [88599, 0, "c"], + [88600, 0, "o"], + [88601, 0, "n"], + [88602, 0, "c"], + [88603, 0, "u"], + [88604, 0, "r"], + [88605, 0, "r"], + [88606, 0, "e"], + [88607, 0, "n"], + [88608, 0, "t"], + [88609, 0, " "], + [88610, 0, "o"], + [88611, 0, "p"], + [88612, 0, "e"], + [88613, 0, "r"], + [88614, 0, "a"], + [88615, 0, "t"], + [88616, 0, "i"], + [88617, 0, "o"], + [88618, 0, "n"], + [88619, 0, " "], + [88620, 0, "$"], + [88621, 0, "o"], + [88622, 0, "_"], + [88623, 0, "c"], + [88624, 0, "$"], + [88625, 0, "\n"], + [88577, 1], + [88576, 1], + [88576, 0, "i"], + [88577, 0, "t"], + [89008, 1], + [89007, 1], + [89007, 0, "i"], + [89008, 0, "t"], + [88710, 1], + [88709, 1], + [88582, 1], + [88581, 1], + [88580, 1], + [88578, 1], + [88577, 1], + [88576, 1], + [88575, 1], + [88574, 1], + [88573, 1], + [88572, 1], + [88571, 1], + [88698, 1], + [88697, 1], + [88696, 1], + [88695, 1], + [88694, 1], + [88693, 1], + [88696, 1], + [88695, 1], + [88694, 1], + [88810, 1], + [88809, 1], + [88808, 1], + [88806, 1], + [88805, 1], + [88804, 1], + [88803, 1], + [88802, 1], + [88801, 1], + [88800, 1], + [88799, 1], + [88976, 1], + [88975, 1], + [88974, 1], + [88973, 1], + [88972, 1], + [88971, 1], + [88970, 1], + [88969, 1], + [88970, 1], + [88970, 1], + [88970, 1], + [88614, 0, ","], + [88615, 0, " "], + [88616, 0, "w"], + [88617, 0, "e"], + [88618, 0, " "], + [88619, 0, "m"], + [88620, 0, "u"], + [88621, 0, "s"], + [88622, 0, "t"], + [88623, 0, " "], + [88624, 0, "s"], + [88625, 0, "h"], + [88626, 0, "o"], + [88627, 0, "w"], + [88628, 0, " "], + [88629, 0, "t"], + [88630, 0, "h"], + [88631, 0, "a"], + [88632, 0, "t"], + [88633, 0, " "], + [88634, 0, "t"], + [88635, 0, "h"], + [88636, 0, "e"], + [88637, 0, " "], + [88638, 0, "d"], + [88639, 0, "o"], + [88640, 0, "c"], + [88641, 0, "u"], + [88642, 0, "m"], + [88643, 0, "e"], + [88644, 0, "n"], + [88645, 0, "t"], + [88646, 0, " "], + [88647, 0, "s"], + [88648, 0, "t"], + [88649, 0, "a"], + [88650, 0, "t"], + [88651, 0, "e"], + [88652, 0, " "], + [88653, 0, "a"], + [88654, 0, "f"], + [88655, 0, "t"], + [88656, 0, "e"], + [88657, 0, "r"], + [88658, 0, " "], + [88659, 0, "a"], + [88660, 0, "p"], + [88661, 0, "p"], + [88662, 0, "l"], + [88663, 0, "y"], + [88664, 0, "i"], + [88665, 0, "n"], + [88666, 0, "g"], + [88667, 0, " "], + [88668, 0, "b"], + [88669, 0, "o"], + [88670, 0, "t"], + [88671, 0, "h"], + [88672, 0, " "], + [88673, 0, "o"], + [88674, 0, "p"], + [88675, 0, "e"], + [88676, 0, "r"], + [88677, 0, "a"], + [88678, 0, "t"], + [88679, 0, "i"], + [88680, 0, "o"], + [88681, 0, "n"], + [88682, 0, "s"], + [88683, 0, " "], + [88684, 0, "d"], + [88685, 0, "o"], + [88686, 0, "e"], + [88687, 0, "s"], + [88688, 0, " "], + [88689, 0, "n"], + [88690, 0, "o"], + [88691, 0, "t"], + [88692, 0, " "], + [88693, 0, "d"], + [88694, 0, "e"], + [88695, 0, "p"], + [88696, 0, "e"], + [88697, 0, "n"], + [88698, 0, "d"], + [88699, 0, " "], + [88700, 0, "o"], + [88701, 0, "n"], + [88702, 0, " "], + [88703, 0, "t"], + [88704, 0, "h"], + [88705, 0, "e"], + [88706, 0, " "], + [88707, 0, "o"], + [88708, 0, "r"], + [88709, 0, "d"], + [88710, 0, "e"], + [88711, 0, "r"], + [88712, 0, " "], + [88713, 0, "i"], + [88714, 0, "n"], + [88715, 0, " "], + [88716, 0, "w"], + [88717, 0, "h"], + [88718, 0, "i"], + [88719, 0, "c"], + [88720, 0, "h"], + [88721, 0, " "], + [88722, 0, "$"], + [88723, 0, "o"], + [88724, 0, "_"], + [88725, 0, "d"], + [88726, 0, "$"], + [88727, 0, " "], + [88728, 0, "a"], + [88729, 0, "n"], + [88730, 0, "d"], + [88731, 0, " "], + [88732, 0, "$"], + [88733, 0, "o"], + [88734, 0, "_"], + [88735, 0, "c"], + [88736, 0, "$"], + [88737, 0, " "], + [88738, 0, "w"], + [88739, 0, "e"], + [88740, 0, "r"], + [88741, 0, "e"], + [88742, 0, " "], + [88743, 0, "a"], + [88744, 0, "p"], + [88745, 0, "p"], + [88746, 0, "l"], + [88747, 0, "i"], + [88748, 0, "e"], + [88749, 0, "d"], + [88750, 0, "."], + [89123, 0, " "], + [89123, 1], + [89123, 0, "\n"], + [89124, 0, "\n"], + [89125, 0, "S"], + [89126, 0, "i"], + [89127, 0, "n"], + [89128, 0, "c"], + [89129, 0, "e"], + [89130, 0, " "], + [89131, 0, "$"], + [89132, 0, "o"], + [89133, 0, "_"], + [89134, 0, "c"], + [89135, 0, "$"], + [89136, 0, " "], + [89137, 0, "i"], + [89138, 0, "s"], + [89139, 0, " "], + [89140, 0, "c"], + [89141, 0, "o"], + [89142, 0, "n"], + [89143, 0, "c"], + [89144, 0, "u"], + [89145, 0, "r"], + [89146, 0, "r"], + [89147, 0, "e"], + [89148, 0, "n"], + [89149, 0, "t"], + [89150, 0, " "], + [89151, 0, "w"], + [89152, 0, "i"], + [89153, 0, "t"], + [89154, 0, "h"], + [89155, 0, " "], + [89156, 0, "$"], + [89157, 0, "o"], + [89158, 0, "_"], + [89159, 0, "d"], + [89160, 0, "$"], + [89161, 0, ","], + [89162, 0, " "], + [89163, 0, "w"], + [89164, 0, "e"], + [89165, 0, " "], + [89166, 0, "k"], + [89167, 0, "n"], + [89168, 0, "o"], + [89169, 0, "w"], + [89170, 0, " "], + [89171, 0, "t"], + [89172, 0, "h"], + [89173, 0, "a"], + [89174, 0, "t"], + [89175, 0, " "], + [89176, 0, "$"], + [89177, 0, "o"], + [89178, 0, "_"], + [89179, 0, "c"], + [89180, 0, "."], + [89181, 0, "\\"], + [89182, 0, "m"], + [89183, 0, "a"], + [89184, 0, "t"], + [89185, 0, "h"], + [89186, 0, "i"], + [89187, 0, "t"], + [89188, 0, "{"], + [89189, 0, "i"], + [89190, 0, "d"], + [89191, 0, "}"], + [89192, 0, " "], + [89193, 0, "\\"], + [89194, 0, "n"], + [89195, 0, "o"], + [89196, 0, "t"], + [89197, 0, "i"], + [89198, 0, "n"], + [89199, 0, " "], + [89200, 0, "o"], + [89201, 0, "_"], + [89202, 0, "d"], + [89203, 0, "."], + [89204, 0, "\\"], + [89205, 0, "m"], + [89206, 0, "a"], + [89207, 0, "t"], + [89208, 0, "h"], + [89209, 0, "i"], + [89210, 0, "t"], + [89211, 0, "{"], + [89212, 0, "d"], + [89213, 0, "e"], + [89214, 0, "p"], + [89215, 0, "s"], + [89216, 0, "}"], + [89217, 0, "$"], + [89218, 0, "."], + [89219, 0, " "], + [89220, 0, "I"], + [89221, 0, "f"], + [89222, 0, " "], + [89223, 0, "$"], + [89224, 0, "o"], + [89225, 0, "_"], + [89226, 0, "c"], + [89227, 0, "$"], + [89228, 0, " "], + [89229, 0, "i"], + [89230, 0, "s"], + [89231, 0, " "], + [89232, 0, "a"], + [89233, 0, "n"], + [89234, 0, " "], + [89235, 0, "a"], + [89236, 0, "s"], + [89237, 0, "s"], + [89238, 0, "i"], + [89239, 0, "g"], + [89240, 0, "n"], + [89241, 0, "m"], + [89242, 0, "e"], + [89243, 0, "n"], + [89244, 0, "t"], + [89245, 0, " "], + [89246, 0, "o"], + [89247, 0, "r"], + [89248, 0, " "], + [89249, 0, "i"], + [89250, 0, "n"], + [89251, 0, "s"], + [89252, 0, "e"], + [89253, 0, "r"], + [89254, 0, "t"], + [89255, 0, "i"], + [89256, 0, "o"], + [89257, 0, "n"], + [89258, 0, " "], + [89259, 0, "o"], + [89260, 0, "p"], + [89261, 0, "e"], + [89262, 0, "r"], + [89263, 0, "a"], + [89264, 0, "t"], + [89265, 0, "i"], + [89266, 0, "o"], + [89267, 0, "n"], + [89268, 0, ","], + [89269, 0, " "], + [89270, 0, "t"], + [89271, 0, "h"], + [89272, 0, "e"], + [89273, 0, " "], + [89274, 0, "\\"], + [89275, 0, "t"], + [89276, 0, "e"], + [89277, 0, "x"], + [89278, 0, "t"], + [89279, 0, "s"], + [89280, 0, "c"], + [89281, 0, "{"], + [89282, 0, "A"], + [89283, 0, "s"], + [89284, 0, "s"], + [89285, 0, "i"], + [89286, 0, "g"], + [89287, 0, "n"], + [89288, 0, "}"], + [89289, 0, ","], + [89290, 0, " "], + [89291, 0, "\\"], + [89292, 0, "t"], + [89293, 0, "e"], + [89294, 0, "x"], + [89295, 0, "t"], + [89296, 0, "s"], + [89297, 0, "c"], + [89298, 0, "{"], + [89299, 0, "E"], + [89300, 0, "m"], + [89301, 0, "p"], + [89302, 0, "t"], + [89303, 0, "y"], + [89304, 0, "-"], + [89305, 0, "M"], + [89306, 0, "a"], + [89307, 0, "p"], + [89308, 0, "}"], + [89309, 0, " "], + [89310, 0, "a"], + [89311, 0, "n"], + [89312, 0, "d"], + [89313, 0, " "], + [89314, 0, "\\"], + [89315, 0, "t"], + [89316, 0, "e"], + [89317, 0, "x"], + [89318, 0, "t"], + [89319, 0, "s"], + [89320, 0, "c"], + [89321, 0, "{"], + [89289, 1], + [89289, 0, " "], + [89290, 0, "r"], + [89291, 0, "u"], + [89292, 0, "l"], + [89293, 0, "e"], + [89294, 0, " "], + [89295, 0, "a"], + [89296, 0, "d"], + [89297, 0, "d"], + [89298, 0, "s"], + [89299, 0, " "], + [89300, 0, "$"], + [89301, 0, "o"], + [89302, 0, "_"], + [89303, 0, "c"], + [89304, 0, "."], + [89305, 0, "\\"], + [89306, 0, "m"], + [89307, 0, "a"], + [89308, 0, "t"], + [89309, 0, "h"], + [89310, 0, "i"], + [89311, 0, "t"], + [89312, 0, "{"], + [89313, 0, "i"], + [89314, 0, "d"], + [89315, 0, "}"], + [89316, 0, "$"], + [89317, 0, " "], + [89318, 0, "t"], + [89319, 0, "o"], + [89320, 0, " "], + [89321, 0, "h"], + [89322, 0, "e"], + [89323, 0, " "], + [89323, 1], + [89322, 1], + [89321, 1], + [89321, 0, "t"], + [89322, 0, "h"], + [89323, 0, "e"], + [89324, 0, " "], + [89325, 0, "s"], + [89326, 0, "e"], + [89327, 0, "t"], + [89328, 0, " "], + [89329, 0, "o"], + [89330, 0, "f"], + [89331, 0, " "], + [89331, 1], + [89330, 1], + [89329, 1], + [89328, 1], + [89327, 1], + [89326, 1], + [89325, 1], + [89325, 0, "m"], + [89326, 0, "a"], + [89327, 0, "p"], + [89328, 0, "p"], + [89329, 0, "i"], + [89330, 0, "n"], + [89331, 0, "g"], + [89332, 0, " "], + [89333, 0, "f"], + [89334, 0, "r"], + [89335, 0, "o"], + [89336, 0, "m"], + [89337, 0, " "], + [89338, 0, "o"], + [89339, 0, "p"], + [89340, 0, "e"], + [89341, 0, "r"], + [89342, 0, "a"], + [89343, 0, "t"], + [89344, 0, "i"], + [89345, 0, "o"], + [89346, 0, "n"], + [89347, 0, " "], + [89348, 0, "I"], + [89349, 0, "D"], + [89350, 0, " "], + [89351, 0, "t"], + [89352, 0, "o"], + [89353, 0, " "], + [89354, 0, "v"], + [89355, 0, "a"], + [89356, 0, "l"], + [89357, 0, "u"], + [89358, 0, "e"], + [89359, 0, " "], + [89360, 0, "f"], + [89361, 0, "o"], + [89362, 0, "r"], + [89363, 0, " "], + [89364, 0, "a"], + [89365, 0, " "], + [89366, 0, "r"], + [89367, 0, "e"], + [89368, 0, "g"], + [89369, 0, "i"], + [89370, 0, "s"], + [89371, 0, "t"], + [89372, 0, "e"], + [89373, 0, "r"], + [89374, 0, ","], + [89375, 0, " "], + [89376, 0, "a"], + [89377, 0, "n"], + [89378, 0, "d"], + [89379, 0, " "], + [89380, 0, "t"], + [89381, 0, "h"], + [89382, 0, "e"], + [89383, 0, " "], + [89384, 0, "\\"], + [89385, 0, "t"], + [89386, 0, "e"], + [89387, 0, "x"], + [89388, 0, "t"], + [89389, 0, "s"], + [89390, 0, "c"], + [89391, 0, "{"], + [89392, 0, "D"], + [89393, 0, "e"], + [89394, 0, "s"], + [89395, 0, "c"], + [89396, 0, "e"], + [89397, 0, "n"], + [89398, 0, "d"], + [89399, 0, "}"], + [89400, 0, ","], + [89401, 0, " "], + [89402, 0, "\\"], + [89403, 0, "t"], + [89404, 0, "e"], + [89405, 0, "x"], + [89406, 0, "t"], + [89407, 0, "s"], + [89408, 0, "c"], + [89409, 0, "{"], + [89410, 0, "A"], + [89411, 0, "s"], + [89412, 0, "s"], + [89413, 0, "i"], + [89414, 0, "g"], + [89415, 0, "n"], + [89416, 0, "}"], + [89417, 0, ","], + [89450, 0, "E"], + [89451, 0, "m"], + [89452, 0, "p"], + [89453, 0, "t"], + [89454, 0, "y"], + [89455, 0, "-"], + [89456, 0, "L"], + [89457, 0, "i"], + [89458, 0, "s"], + [89459, 0, "t"], + [89460, 0, "}"], + [89461, 0, " "], + [89462, 0, "r"], + [89463, 0, "u"], + [89464, 0, "l"], + [89465, 0, "e"], + [89466, 0, "s"], + [89467, 0, " "], + [89468, 0, "a"], + [89469, 0, "d"], + [89470, 0, "d"], + [89471, 0, " "], + [89472, 0, "$"], + [89473, 0, "o"], + [89474, 0, "_"], + [89475, 0, "c"], + [89476, 0, "."], + [89477, 0, "\\"], + [89478, 0, "m"], + [89479, 0, "a"], + [89480, 0, "t"], + [89481, 0, "h"], + [89482, 0, "i"], + [89483, 0, "t"], + [89484, 0, "{"], + [89485, 0, "i"], + [89486, 0, "d"], + [89487, 0, "}"], + [89488, 0, "$"], + [89489, 0, " "], + [89490, 0, "t"], + [89491, 0, "o"], + [89492, 0, " "], + [89493, 0, "t"], + [89494, 0, "h"], + [89495, 0, "e"], + [89496, 0, " "], + [89497, 0, "p"], + [89498, 0, "r"], + [89499, 0, "e"], + [89500, 0, "s"], + [89501, 0, "e"], + [89502, 0, "n"], + [89503, 0, "c"], + [89504, 0, "e"], + [89505, 0, " "], + [89506, 0, "s"], + [89507, 0, "e"], + [89508, 0, "t"], + [89509, 0, "s"], + [89510, 0, " "], + [89511, 0, "$"], + [89512, 0, "\\"], + [89513, 0, "m"], + [89514, 0, "a"], + [89515, 0, "t"], + [89516, 0, "h"], + [89517, 0, "s"], + [89518, 0, "f"], + [89519, 0, "{"], + [89520, 0, "p"], + [89521, 0, "r"], + [89522, 0, "e"], + [89523, 0, "s"], + [89524, 0, "}"], + [89525, 0, "("], + [89526, 0, "k"], + [89527, 0, ")"], + [89528, 0, "$"], + [89529, 0, " "], + [89530, 0, "a"], + [89531, 0, "l"], + [89532, 0, "o"], + [89533, 0, "n"], + [89534, 0, "g"], + [89535, 0, " "], + [89536, 0, "t"], + [89537, 0, "h"], + [89538, 0, "e"], + [89539, 0, " "], + [89540, 0, "p"], + [89541, 0, "a"], + [89542, 0, "t"], + [89543, 0, "h"], + [89544, 0, " "], + [89545, 0, "t"], + [89546, 0, "h"], + [89547, 0, "r"], + [89548, 0, "o"], + [89549, 0, "u"], + [89550, 0, "g"], + [89551, 0, "h"], + [89552, 0, " "], + [89553, 0, "t"], + [89554, 0, "h"], + [89555, 0, "e"], + [89556, 0, " "], + [89557, 0, "d"], + [89558, 0, "o"], + [89559, 0, "c"], + [89560, 0, "u"], + [89561, 0, "m"], + [89562, 0, "e"], + [89563, 0, "n"], + [89564, 0, "t"], + [89565, 0, " "], + [89566, 0, "t"], + [89567, 0, "r"], + [89568, 0, "e"], + [89569, 0, "e"], + [89570, 0, " "], + [89571, 0, "d"], + [89572, 0, "e"], + [89573, 0, "s"], + [89574, 0, "c"], + [89575, 0, "r"], + [89576, 0, "i"], + [89577, 0, "b"], + [89578, 0, "e"], + [89579, 0, "d"], + [89580, 0, " "], + [89581, 0, "b"], + [89582, 0, "h"], + [89583, 0, " "], + [89583, 1], + [89582, 1], + [89582, 0, "y"], + [89583, 0, " "], + [89584, 0, "t"], + [89585, 0, "h"], + [89586, 0, "e"], + [89587, 0, " "], + [89588, 0, "c"], + [89589, 0, "u"], + [89590, 0, "r"], + [89591, 0, "s"], + [89592, 0, "o"], + [89593, 0, "r"], + [89594, 0, "."], + [89595, 0, "\n"], + [89596, 0, "\n"], + [89597, 0, "S"], + [89598, 0, "i"], + [89599, 0, "n"], + [89600, 0, "c"], + [89601, 0, "e"], + [89602, 0, " "], + [89603, 0, "$"], + [89604, 0, "o"], + [89605, 0, "_"], + [89606, 0, "c"], + [89607, 0, "$"], + [89608, 0, " "], + [89609, 0, "i"], + [89610, 0, "s"], + [89611, 0, " "], + [89612, 0, "c"], + [89613, 0, "o"], + [89614, 0, "n"], + [89615, 0, "c"], + [89616, 0, "u"], + [89617, 0, "r"], + [89618, 0, "r"], + [89619, 0, "e"], + [89620, 0, "n"], + [89621, 0, "t"], + [89622, 0, " "], + [89623, 0, "w"], + [89624, 0, "i"], + [89625, 0, "t"], + [89626, 0, "h"], + [89627, 0, " "], + [89628, 0, "$"], + [89629, 0, "o"], + [89630, 0, "_"], + [89631, 0, "d"], + [89632, 0, "$"], + [89633, 0, ","], + [89634, 0, " "], + [89635, 0, "w"], + [89636, 0, "e"], + [89637, 0, " "], + [89638, 0, "k"], + [89639, 0, "n"], + [89640, 0, "o"], + [89641, 0, "w"], + [89642, 0, " "], + [89643, 0, "t"], + [89644, 0, "h"], + [89645, 0, "a"], + [89646, 0, "t"], + [89647, 0, " "], + [89648, 0, "$"], + [89649, 0, "o"], + [89650, 0, "_"], + [89651, 0, "c"], + [89652, 0, "."], + [89653, 0, "\\"], + [89654, 0, "m"], + [89655, 0, "a"], + [89656, 0, "t"], + [89657, 0, "h"], + [89658, 0, "i"], + [89659, 0, "t"], + [89660, 0, "{"], + [89661, 0, "i"], + [89662, 0, "d"], + [89663, 0, "}"], + [89664, 0, " "], + [89665, 0, "\\"], + [89666, 0, "n"], + [89667, 0, "o"], + [89668, 0, "t"], + [89669, 0, "i"], + [89670, 0, "n"], + [89671, 0, " "], + [89672, 0, "o"], + [89673, 0, "_"], + [89674, 0, "d"], + [89675, 0, "."], + [89676, 0, "\\"], + [89677, 0, "m"], + [89678, 0, "a"], + [89679, 0, "t"], + [89680, 0, "h"], + [89681, 0, "i"], + [89682, 0, "t"], + [89683, 0, "{"], + [89684, 0, "d"], + [89685, 0, "e"], + [89686, 0, "p"], + [89687, 0, "s"], + [89688, 0, "}"], + [89689, 0, "$"], + [89690, 0, "."], + [89219, 1], + [89218, 1], + [89217, 1], + [89216, 1], + [89215, 1], + [89214, 1], + [89213, 1], + [89212, 1], + [89211, 1], + [89210, 1], + [89209, 1], + [89208, 1], + [89207, 1], + [89206, 1], + [89205, 1], + [89204, 1], + [89203, 1], + [89202, 1], + [89201, 1], + [89200, 1], + [89199, 1], + [89198, 1], + [89197, 1], + [89196, 1], + [89195, 1], + [89194, 1], + [89193, 1], + [89192, 1], + [89191, 1], + [89190, 1], + [89189, 1], + [89188, 1], + [89187, 1], + [89186, 1], + [89185, 1], + [89184, 1], + [89183, 1], + [89182, 1], + [89181, 1], + [89180, 1], + [89179, 1], + [89178, 1], + [89177, 1], + [89176, 1], + [89175, 1], + [89174, 1], + [89173, 1], + [89172, 1], + [89171, 1], + [89170, 1], + [89169, 1], + [89168, 1], + [89167, 1], + [89166, 1], + [89165, 1], + [89164, 1], + [89163, 1], + [89162, 1], + [89161, 1], + [89160, 1], + [89159, 1], + [89158, 1], + [89157, 1], + [89156, 1], + [89155, 1], + [89154, 1], + [89153, 1], + [89152, 1], + [89151, 1], + [89150, 1], + [89149, 1], + [89148, 1], + [89147, 1], + [89146, 1], + [89145, 1], + [89144, 1], + [89143, 1], + [89142, 1], + [89141, 1], + [89140, 1], + [89139, 1], + [89138, 1], + [89137, 1], + [89136, 1], + [89135, 1], + [89134, 1], + [89133, 1], + [89132, 1], + [89131, 1], + [89130, 1], + [89129, 1], + [89128, 1], + [89127, 1], + [89126, 1], + [89125, 1], + [89596, 0, " "], + [89597, 0, "T"], + [89598, 0, "h"], + [89599, 0, "u"], + [89600, 0, "s"], + [89601, 0, ","], + [89602, 0, " "], + [89603, 0, "i"], + [89604, 0, "f"], + [89605, 0, " "], + [89606, 0, "$"], + [89607, 0, "o"], + [89608, 0, "_"], + [89609, 0, "c"], + [89610, 0, "$"], + [89611, 0, " "], + [89612, 0, "i"], + [89613, 0, "s"], + [89614, 0, " "], + [89615, 0, "a"], + [89616, 0, "p"], + [89617, 0, "p"], + [89618, 0, "l"], + [89619, 0, "i"], + [89620, 0, "e"], + [89621, 0, "d"], + [89622, 0, " "], + [89623, 0, "b"], + [89624, 0, "e"], + [89625, 0, "f"], + [89626, 0, "o"], + [89627, 0, "r"], + [89628, 0, "e"], + [89629, 0, " "], + [89630, 0, "$"], + [89631, 0, "o"], + [89632, 0, "_"], + [89633, 0, "d"], + [89634, 0, "$"], + [89635, 0, " "], + [89636, 0, "i"], + [89637, 0, "n"], + [89638, 0, " "], + [89639, 0, "h"], + [89639, 1], + [89639, 0, "t"], + [89640, 0, "h"], + [89641, 0, "e"], + [89642, 0, " "], + [89643, 0, "h"], + [89644, 0, "i"], + [89645, 0, "s"], + [89646, 0, "t"], + [89647, 0, "o"], + [89648, 0, "r"], + [89649, 0, "y"], + [89500, 0, "\n"], + [89501, 0, "\n"], + [89502, 0, "I"], + [89503, 0, "f"], + [89504, 0, " "], + [89505, 0, "$"], + [89506, 0, "o"], + [89507, 0, "_"], + [89508, 0, "c"], + [89509, 0, "$"], + [89510, 0, " "], + [89511, 0, "d"], + [89509, 0, "."], + [89510, 0, "\\"], + [89511, 0, "m"], + [89512, 0, "a"], + [89513, 0, "t"], + [89514, 0, "h"], + [89515, 0, "i"], + [89516, 0, "t"], + [89517, 0, "{"], + [89518, 0, "c"], + [89519, 0, "u"], + [89520, 0, "r"], + [89521, 0, "}"], + [89525, 0, "o"], + [89526, 0, "e"], + [89527, 0, "s"], + [89528, 0, " "], + [89529, 0, "n"], + [89530, 0, "o"], + [89531, 0, "t"], + [89532, 0, " "], + [89533, 0, "f"], + [89534, 0, "a"], + [89535, 0, "l"], + [89536, 0, "l"], + [89537, 0, " "], + [89538, 0, "w"], + [89539, 0, "i"], + [89540, 0, "t"], + [89541, 0, "h"], + [89542, 0, "i"], + [89543, 0, "n"], + [89544, 0, " "], + [89504, 0, " "], + [89504, 1], + [89504, 0, " "], + [89505, 0, "$"], + [89506, 0, "o"], + [89507, 0, "_"], + [89508, 0, "d"], + [89509, 0, "."], + [89510, 0, "\\"], + [89511, 0, "m"], + [89512, 0, "a"], + [89513, 0, "t"], + [89514, 0, "h"], + [89515, 0, "i"], + [89516, 0, "t"], + [89517, 0, "{"], + [89518, 0, "c"], + [89519, 0, "u"], + [89520, 0, "r"], + [89521, 0, "}"], + [89522, 0, "$"], + [89523, 0, " "], + [89524, 0, "i"], + [89525, 0, "s"], + [89526, 0, " "], + [89527, 0, "n"], + [89528, 0, "o"], + [89529, 0, "t"], + [89530, 0, " "], + [89531, 0, "a"], + [89532, 0, " "], + [89533, 0, "p"], + [89534, 0, "r"], + [89535, 0, "e"], + [89536, 0, "f"], + [89537, 0, "i"], + [89538, 0, "x"], + [89539, 0, " "], + [89540, 0, "o"], + [89541, 0, "f"], + [89582, 1], + [89581, 1], + [89580, 1], + [89579, 1], + [89578, 1], + [89577, 1], + [89576, 1], + [89575, 1], + [89574, 1], + [89573, 1], + [89572, 1], + [89571, 1], + [89570, 1], + [89569, 1], + [89568, 1], + [89567, 1], + [89566, 1], + [89565, 1], + [89564, 1], + [89563, 1], + [89562, 1], + [89561, 1], + [89561, 0, ","], + [89562, 0, " "], + [89563, 0, "t"], + [89564, 0, "h"], + [89565, 0, "e"], + [89566, 0, " "], + [89567, 0, "o"], + [89567, 1], + [89567, 0, "o"], + [89568, 0, "p"], + [89569, 0, "e"], + [89570, 0, "r"], + [89571, 0, "a"], + [89572, 0, "t"], + [89573, 0, "i"], + [89574, 0, "o"], + [89575, 0, "n"], + [89576, 0, "s"], + [89577, 0, " "], + [89578, 0, "a"], + [89579, 0, "f"], + [89580, 0, "f"], + [89581, 0, "e"], + [89582, 0, "c"], + [89583, 0, "t"], + [89584, 0, " "], + [89585, 0, "d"], + [89586, 0, "i"], + [89587, 0, "s"], + [89588, 0, "j"], + [89589, 0, "o"], + [89590, 0, "i"], + [89591, 0, "n"], + [89592, 0, "t"], + [89593, 0, " "], + [89594, 0, "s"], + [89595, 0, "u"], + [89596, 0, "b"], + [89597, 0, "t"], + [89598, 0, "r"], + [89599, 0, "e"], + [89600, 0, "e"], + [89601, 0, "s"], + [89602, 0, " "], + [89603, 0, "o"], + [89604, 0, "f"], + [89605, 0, " "], + [89606, 0, "t"], + [89607, 0, "h"], + [89608, 0, "e"], + [89609, 0, " "], + [89610, 0, "d"], + [89611, 0, "o"], + [89612, 0, "c"], + [89613, 0, "u"], + [89614, 0, "m"], + [89615, 0, "e"], + [89616, 0, "n"], + [89617, 0, "t"], + [89618, 0, ","], + [89619, 0, " "], + [89620, 0, "a"], + [89621, 0, "n"], + [89622, 0, "d"], + [89623, 0, " "], + [89624, 0, "s"], + [89625, 0, "o"], + [89626, 0, " "], + [89627, 0, "t"], + [89628, 0, "h"], + [89629, 0, "e"], + [89630, 0, "y"], + [89631, 0, " "], + [89632, 0, "a"], + [89633, 0, "r"], + [89634, 0, "e"], + [89635, 0, " "], + [89636, 0, "t"], + [89637, 0, "r"], + [89638, 0, "i"], + [89639, 0, "v"], + [89640, 0, "i"], + [89641, 0, "a"], + [89642, 0, "l"], + [89643, 0, "l"], + [89644, 0, "y"], + [89645, 0, " "], + [89646, 0, "c"], + [89647, 0, "o"], + [89648, 0, "m"], + [89649, 0, "m"], + [89650, 0, "u"], + [89651, 0, "t"], + [89652, 0, "a"], + [89653, 0, "t"], + [89654, 0, "i"], + [89655, 0, "v"], + [89656, 0, "e"], + [89657, 0, "."], + [89658, 0, " "], + [89659, 0, "F"], + [89660, 0, "o"], + [89661, 0, "r"], + [89662, 0, " "], + [89663, 0, "t"], + [89664, 0, "h"], + [89665, 0, "e"], + [89666, 0, " "], + [89667, 0, "r"], + [89668, 0, "e"], + [89669, 0, "s"], + [89670, 0, "t"], + [89671, 0, " "], + [89672, 0, "o"], + [89673, 0, "f"], + [89674, 0, " "], + [89675, 0, "t"], + [89676, 0, "h"], + [89677, 0, "i"], + [89678, 0, "s"], + [89679, 0, " "], + [89680, 0, "p"], + [89681, 0, "r"], + [89682, 0, "o"], + [89683, 0, "o"], + [89684, 0, "f"], + [89685, 0, " "], + [89685, 1], + [89685, 0, ","], + [89686, 0, " "], + [89687, 0, "w"], + [89688, 0, "e"], + [89689, 0, " "], + [89690, 0, "f"], + [89691, 0, "o"], + [89692, 0, "c"], + [89693, 0, "u"], + [89694, 0, "s"], + [89695, 0, " "], + [89696, 0, "o"], + [89697, 0, "n"], + [89698, 0, " "], + [89699, 0, "t"], + [89700, 0, "h"], + [89701, 0, "e"], + [89702, 0, " "], + [89703, 0, "c"], + [89704, 0, "a"], + [89705, 0, "s"], + [89706, 0, "e"], + [89707, 0, " "], + [89708, 0, "w"], + [89709, 0, "h"], + [89710, 0, "e"], + [89711, 0, "r"], + [89712, 0, "e"], + [89713, 0, " "], + [89714, 0, "$"], + [89715, 0, "o"], + [89716, 0, "_"], + [89717, 0, "d"], + [89718, 0, "."], + [89719, 0, "\\"], + [89720, 0, "m"], + [89721, 0, "a"], + [89722, 0, "t"], + [89723, 0, "h"], + [89724, 0, "i"], + [89725, 0, "t"], + [89726, 0, "{"], + [89727, 0, "c"], + [89728, 0, "u"], + [89729, 0, "r"], + [89730, 0, "}"], + [89731, 0, " "], + [89732, 0, "i"], + [89733, 0, "s"], + [89734, 0, " "], + [89734, 1], + [89733, 1], + [89732, 1], + [89731, 1], + [89731, 0, "$"], + [89732, 0, " "], + [89733, 0, "i"], + [89734, 0, "s"], + [89735, 0, " "], + [89736, 0, "a"], + [89737, 0, " "], + [89738, 0, "p"], + [89739, 0, "r"], + [89740, 0, "e"], + [89741, 0, "f"], + [89742, 0, "i"], + [89743, 0, "x"], + [89744, 0, " "], + [89745, 0, "o"], + [89746, 0, "f"], + [89747, 0, " "], + [89748, 0, "$"], + [89749, 0, "o"], + [89750, 0, "_"], + [89751, 0, "c"], + [89752, 0, "."], + [89753, 0, "\\"], + [89754, 0, "m"], + [89755, 0, "a"], + [89756, 0, "t"], + [89757, 0, "h"], + [89758, 0, "i"], + [89759, 0, "t"], + [89760, 0, "{"], + [89761, 0, "c"], + [89762, 0, "u"], + [89763, 0, "r"], + [89764, 0, "}"], + [89765, 0, "$"], + [89766, 0, "."], + [89917, 0, ","], + [89918, 0, " "], + [89919, 0, "t"], + [89920, 0, "h"], + [89921, 0, "e"], + [89922, 0, " "], + [89923, 0, "\\"], + [89924, 0, "t"], + [89925, 0, "e"], + [89926, 0, "x"], + [89927, 0, "t"], + [89928, 0, "s"], + [89929, 0, "c"], + [89930, 0, "{"], + [89931, 0, "C"], + [89932, 0, "l"], + [89933, 0, "e"], + [89934, 0, "a"], + [89935, 0, "r"], + [89936, 0, "-"], + [89937, 0, "*"], + [89938, 0, "}"], + [89939, 0, " "], + [89940, 0, "r"], + [89941, 0, "u"], + [89942, 0, "l"], + [89943, 0, "e"], + [89944, 0, "s"], + [89945, 0, " "], + [89946, 0, "a"], + [89947, 0, "p"], + [89948, 0, "p"], + [89949, 0, "l"], + [89950, 0, "y"], + [89951, 0, "i"], + [89952, 0, "n"], + [89953, 0, "g"], + [89954, 0, " "], + [89955, 0, "$"], + [89955, 1], + [89954, 1], + [89953, 1], + [89952, 1], + [89951, 1], + [89950, 1], + [89949, 1], + [89948, 1], + [89947, 1], + [89946, 1], + [89946, 0, "e"], + [89947, 0, "v"], + [89948, 0, "a"], + [89949, 0, "l"], + [89950, 0, "u"], + [89951, 0, "a"], + [89952, 0, "t"], + [89953, 0, "i"], + [89954, 0, "n"], + [89955, 0, "g"], + [89956, 0, " "], + [89957, 0, "$"], + [89958, 0, "o"], + [89959, 0, "_"], + [89960, 0, "d"], + [89961, 0, "$"], + [89962, 0, " "], + [89963, 0, "w"], + [89964, 0, "i"], + [89965, 0, "l"], + [89966, 0, "l"], + [89967, 0, " "], + [89968, 0, "l"], + [89969, 0, "e"], + [89970, 0, "a"], + [89971, 0, "v"], + [89972, 0, "e"], + [89973, 0, " "], + [89974, 0, "a"], + [89975, 0, "n"], + [89976, 0, "y"], + [89977, 0, " "], + [89978, 0, "o"], + [89979, 0, "c"], + [89980, 0, "c"], + [89981, 0, "u"], + [89982, 0, "r"], + [89983, 0, "r"], + [89984, 0, "e"], + [89985, 0, "n"], + [89986, 0, "c"], + [89987, 0, "e"], + [89988, 0, "s"], + [89989, 0, " "], + [89990, 0, "o"], + [89991, 0, "f"], + [89992, 0, " "], + [89993, 0, "$"], + [89994, 0, "o"], + [89995, 0, "_"], + [89996, 0, "c"], + [89997, 0, "."], + [89998, 0, "\\"], + [89999, 0, "m"], + [90000, 0, "a"], + [90001, 0, "t"], + [90002, 0, "h"], + [90003, 0, "i"], + [90004, 0, "t"], + [90005, 0, "{"], + [90006, 0, "i"], + [90007, 0, "d"], + [90008, 0, "}"], + [90009, 0, "$"], + [90010, 0, " "], + [90011, 0, "u"], + [90012, 0, "n"], + [90013, 0, "d"], + [90014, 0, "i"], + [90015, 0, "s"], + [90016, 0, "t"], + [90011, 0, "i"], + [90012, 0, "n"], + [90013, 0, " "], + [90014, 0, "t"], + [90015, 0, "h"], + [90016, 0, "e"], + [90017, 0, " "], + [90018, 0, "d"], + [90019, 0, "o"], + [90020, 0, "c"], + [90021, 0, "u"], + [90022, 0, "m"], + [90023, 0, "e"], + [90024, 0, "n"], + [90025, 0, "t"], + [90026, 0, " "], + [90027, 0, "s"], + [90028, 0, "t"], + [90029, 0, "a"], + [90030, 0, "t"], + [90031, 0, "e"], + [90032, 0, " "], + [90039, 0, "u"], + [90040, 0, "r"], + [90041, 0, "b"], + [90042, 0, "e"], + [90043, 0, "d"], + [90044, 0, "."], + [90045, 0, " "], + [90046, 0, "T"], + [90047, 0, "h"], + [90048, 0, "e"], + [90049, 0, " "], + [90050, 0, "e"], + [90051, 0, "f"], + [90052, 0, "f"], + [90053, 0, "e"], + [90054, 0, "c"], + [90055, 0, "t"], + [90056, 0, " "], + [90057, 0, "o"], + [90058, 0, "f"], + [90059, 0, " "], + [90060, 0, "o"], + [90061, 0, "f"], + [90062, 0, " "], + [90063, 0, "a"], + [90064, 0, "p"], + [90065, 0, "p"], + [90065, 1], + [90064, 1], + [90063, 1], + [90062, 1], + [90061, 1], + [90060, 1], + [90060, 0, "a"], + [90061, 0, "p"], + [90062, 0, "p"], + [90063, 0, "l"], + [90064, 0, "y"], + [90065, 0, "i"], + [90066, 0, "n"], + [90067, 0, "g"], + [90068, 0, " "], + [89966, 1], + [89965, 1], + [89965, 0, "l"], + [89966, 0, "l"], + [90069, 0, "$"], + [90070, 0, "o"], + [90071, 0, "_"], + [90072, 0, "c"], + [90073, 0, "$"], + [90074, 0, " "], + [90075, 0, "b"], + [90076, 0, "e"], + [90077, 0, "f"], + [90078, 0, "o"], + [90079, 0, "r"], + [90080, 0, "e"], + [90081, 0, " "], + [90082, 0, "$"], + [90083, 0, "o"], + [90084, 0, "_"], + [90085, 0, "d"], + [90086, 0, "$"], + [90087, 0, " "], + [90088, 0, "i"], + [90089, 0, "s"], + [90090, 0, " "], + [90091, 0, "t"], + [90092, 0, "h"], + [90093, 0, "u"], + [90094, 0, "s"], + [90095, 0, " "], + [90096, 0, "t"], + [90097, 0, "h"], + [90098, 0, "e"], + [90099, 0, " "], + [90100, 0, "s"], + [90101, 0, "a"], + [90102, 0, "m"], + [90103, 0, "e"], + [90104, 0, " "], + [90105, 0, "a"], + [90106, 0, "s"], + [90107, 0, " "], + [90108, 0, "a"], + [90109, 0, "p"], + [90110, 0, "p"], + [90111, 0, "l"], + [90112, 0, "y"], + [90113, 0, "i"], + [90114, 0, "n"], + [90115, 0, "g"], + [90116, 0, " "], + [90117, 0, "$"], + [90118, 0, "o"], + [90119, 0, "_"], + [90120, 0, "d"], + [90121, 0, "$"], + [90122, 0, " "], + [90123, 0, "b"], + [90124, 0, "e"], + [90125, 0, "f"], + [90126, 0, "o"], + [90127, 0, "r"], + [90128, 0, "e"], + [90129, 0, " "], + [90130, 0, "$"], + [90131, 0, "o"], + [90132, 0, "_"], + [90133, 0, "c"], + [90134, 0, "$"], + [90135, 0, ","], + [90136, 0, " "], + [90137, 0, "s"], + [90138, 0, "o"], + [90139, 0, " "], + [90140, 0, "t"], + [90141, 0, "h"], + [90142, 0, "e"], + [90143, 0, " "], + [90144, 0, "o"], + [90145, 0, "p"], + [90146, 0, "e"], + [90147, 0, "r"], + [90148, 0, "a"], + [90149, 0, "t"], + [90150, 0, "i"], + [90151, 0, "o"], + [90152, 0, "n"], + [90153, 0, "s"], + [90154, 0, " "], + [90155, 0, "c"], + [90156, 0, "o"], + [90157, 0, "m"], + [90158, 0, "m"], + [90159, 0, "u"], + [90160, 0, "t"], + [90161, 0, "e"], + [90162, 0, "."], + [89867, 1], + [89866, 1], + [89866, 0, "e"], + [89867, 0, "r"], + [89868, 0, "e"], + [89869, 0, "f"], + [89870, 0, "o"], + [89871, 0, "r"], + [89872, 0, "e"], + [90049, 0, ","], + [90050, 0, " "], + [90051, 0, "w"], + [90052, 0, "h"], + [90053, 0, "i"], + [90054, 0, "l"], + [90055, 0, "e"], + [90056, 0, " "], + [90057, 0, "r"], + [90058, 0, "e"], + [90059, 0, "m"], + [90060, 0, "o"], + [90061, 0, "v"], + [90062, 0, "i"], + [90063, 0, "n"], + [90064, 0, "g"], + [90065, 0, " "], + [90066, 0, "a"], + [90067, 0, "n"], + [90068, 0, "y"], + [90069, 0, " "], + [90070, 0, "o"], + [90071, 0, "c"], + [90072, 0, "c"], + [90073, 0, "u"], + [90074, 0, "r"], + [90075, 0, "r"], + [90076, 0, "e"], + [90077, 0, "n"], + [90078, 0, "c"], + [90079, 0, "e"], + [90080, 0, "s"], + [90081, 0, " "], + [90082, 0, "o"], + [90083, 0, "f"], + [90084, 0, " "], + [90085, 0, "o"], + [90086, 0, "p"], + [90087, 0, "e"], + [90088, 0, "r"], + [90089, 0, "a"], + [90090, 0, "t"], + [90091, 0, "i"], + [90092, 0, "o"], + [90093, 0, "n"], + [90094, 0, "s"], + [90095, 0, " "], + [90096, 0, "i"], + [90097, 0, "n"], + [90098, 0, " "], + [90099, 0, "$"], + [90100, 0, "o"], + [90101, 0, "_"], + [90102, 0, "d"], + [90103, 0, "."], + [90104, 0, "\\"], + [90105, 0, "m"], + [90106, 0, "a"], + [90107, 0, "t"], + [90108, 0, "h"], + [90109, 0, "i"], + [90110, 0, "t"], + [90111, 0, "{"], + [90112, 0, "d"], + [90113, 0, "e"], + [90114, 0, "p"], + [90115, 0, "s"], + [90116, 0, "}"], + [90117, 0, "$"], + [89658, 0, " "], + [89659, 0, "A"], + [89660, 0, "n"], + [89661, 0, "y"], + [89662, 0, " "], + [89663, 0, "s"], + [89664, 0, "t"], + [89665, 0, "a"], + [89666, 0, "t"], + [89667, 0, "e"], + [89668, 0, " "], + [89669, 0, "c"], + [89670, 0, "h"], + [89671, 0, "a"], + [89672, 0, "n"], + [89673, 0, "g"], + [89674, 0, "e"], + [89675, 0, "s"], + [89676, 0, " "], + [89677, 0, "b"], + [89678, 0, "y"], + [89679, 0, " "], + [89680, 0, "\\"], + [89681, 0, "t"], + [89682, 0, "e"], + [89683, 0, "x"], + [89684, 0, "t"], + [89685, 0, "s"], + [89686, 0, "c"], + [89687, 0, "{"], + [89688, 0, "D"], + [89689, 0, "e"], + [89690, 0, "s"], + [89691, 0, "c"], + [89692, 0, "e"], + [89693, 0, "n"], + [89694, 0, "d"], + [89695, 0, "}"], + [89696, 0, " "], + [89697, 0, "a"], + [89698, 0, "n"], + [89699, 0, "d"], + [89700, 0, " "], + [89701, 0, "$"], + [89702, 0, "\\"], + [89703, 0, "t"], + [89704, 0, "e"], + [89705, 0, "x"], + [89706, 0, "t"], + [89707, 0, "s"], + [89708, 0, "c"], + [89709, 0, "{"], + [89710, 0, "A"], + [89711, 0, "d"], + [89712, 0, "d"], + [89713, 0, "-"], + [89714, 0, "I"], + [89715, 0, "D"], + [89716, 0, "}"], + [89717, 0, "_"], + [89718, 0, "1"], + [89719, 0, "$"], + [89720, 0, " "], + [89721, 0, "a"], + [89722, 0, "l"], + [89723, 0, "o"], + [89724, 0, "n"], + [89725, 0, "g"], + [89726, 0, " "], + [89727, 0, "t"], + [89728, 0, "h"], + [89729, 0, "e"], + [89730, 0, " "], + [89731, 0, "s"], + [89732, 0, "h"], + [89732, 1], + [89731, 1], + [89731, 0, "s"], + [89732, 0, "h"], + [89733, 0, "a"], + [89734, 0, "r"], + [89735, 0, "e"], + [89736, 0, "d"], + [89737, 0, " "], + [89738, 0, "p"], + [89739, 0, "a"], + [89740, 0, "r"], + [89741, 0, "t"], + [89742, 0, " "], + [89743, 0, "o"], + [89744, 0, "f"], + [89745, 0, " "], + [89746, 0, "t"], + [89747, 0, "h"], + [89748, 0, "e"], + [89749, 0, " "], + [89750, 0, "c"], + [89751, 0, "u"], + [89752, 0, "r"], + [89753, 0, "s"], + [89754, 0, "o"], + [89755, 0, "r"], + [89756, 0, " "], + [89757, 0, "p"], + [89758, 0, "a"], + [89759, 0, "t"], + [89760, 0, "h"], + [89761, 0, " "], + [89762, 0, "a"], + [89763, 0, "r"], + [89764, 0, "e"], + [89765, 0, " "], + [89766, 0, "a"], + [89767, 0, "p"], + [89768, 0, "p"], + [89769, 0, "l"], + [89770, 0, "i"], + [89771, 0, "e"], + [89772, 0, "d"], + [89773, 0, " "], + [89774, 0, "u"], + [89775, 0, "s"], + [89776, 0, "i"], + [89777, 0, "n"], + [89778, 0, "g"], + [89779, 0, " "], + [89780, 0, "t"], + [89781, 0, "h"], + [89782, 0, "e"], + [89783, 0, " "], + [89784, 0, "s"], + [89785, 0, "e"], + [89786, 0, "t"], + [89787, 0, " "], + [89788, 0, "u"], + [89789, 0, "n"], + [89790, 0, "i"], + [89791, 0, "o"], + [89792, 0, "n"], + [89793, 0, " "], + [89794, 0, "o"], + [89795, 0, "p"], + [89796, 0, "e"], + [89797, 0, "r"], + [89798, 0, "a"], + [89799, 0, "t"], + [89800, 0, "o"], + [89801, 0, "r"], + [89802, 0, " "], + [89803, 0, "$"], + [89804, 0, "\\"], + [89805, 0, "c"], + [89806, 0, "u"], + [89807, 0, "p"], + [89808, 0, "$"], + [89809, 0, ","], + [89810, 0, " "], + [89811, 0, "w"], + [89812, 0, "h"], + [89813, 0, "i"], + [89814, 0, "c"], + [89815, 0, "h"], + [89816, 0, " "], + [89817, 0, "i"], + [89818, 0, "s"], + [89819, 0, " "], + [89820, 0, "c"], + [89821, 0, "o"], + [89822, 0, "m"], + [89823, 0, "m"], + [89824, 0, "u"], + [89825, 0, "t"], + [89826, 0, "a"], + [89827, 0, "t"], + [89828, 0, "i"], + [89829, 0, "v"], + [89830, 0, "e"], + [89831, 0, "."], + [89832, 0, "\n"], + [89833, 0, "\n"], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 1], + [89834, 0, "N"], + [89835, 0, "o"], + [89836, 0, "w"], + [89837, 0, " "], + [89838, 0, "c"], + [89839, 0, "o"], + [89840, 0, "n"], + [89841, 0, "s"], + [89842, 0, "i"], + [89843, 0, "d"], + [89844, 0, "e"], + [89845, 0, "r"], + [89916, 1], + [89915, 1], + [89915, 0, " "], + [90266, 1], + [90266, 0, "\n"], + [90267, 0, "\n"], + [90266, 0, "\n"], + [90267, 0, "\n"], + [90268, 0, "I"], + [90269, 0, "f"], + [90270, 0, " "], + [90271, 0, "$"], + [90272, 0, "o"], + [90273, 0, "_"], + [90274, 0, "c"], + [90275, 0, "$"], + [90276, 0, " "], + [90277, 0, "i"], + [90278, 0, "s"], + [90279, 0, " "], + [90280, 0, "a"], + [90281, 0, "p"], + [90282, 0, "p"], + [90283, 0, "l"], + [90284, 0, "i"], + [90285, 0, "e"], + [90286, 0, "d"], + [90287, 0, " "], + [90288, 0, "a"], + [90289, 0, "f"], + [90290, 0, "t"], + [90291, 0, "e"], + [90292, 0, "r"], + [90293, 0, " "], + [90294, 0, "$"], + [90295, 0, "o"], + [90296, 0, "_"], + [90297, 0, "d"], + [90298, 0, "$"], + [90299, 0, ","], + [90300, 0, " "], + [90274, 1], + [90274, 0, "d"], + [90292, 1], + [90291, 1], + [90290, 1], + [90289, 1], + [90288, 1], + [90288, 0, "b"], + [90289, 0, "e"], + [90290, 0, "f"], + [90291, 0, "o"], + [90292, 0, "r"], + [90293, 0, "e"], + [90298, 1], + [90298, 0, "c"], + [90302, 0, "t"], + [90303, 0, "h"], + [90304, 0, "e"], + [90305, 0, " "], + [90306, 0, "e"], + [90307, 0, "f"], + [90308, 0, "f"], + [90309, 0, "e"], + [90310, 0, "c"], + [90311, 0, "t"], + [90312, 0, " "], + [90313, 0, "o"], + [90314, 0, "n"], + [90315, 0, " "], + [90316, 0, "p"], + [90317, 0, "r"], + [90318, 0, "e"], + [90319, 0, "s"], + [90320, 0, "e"], + [90321, 0, "n"], + [90322, 0, "c"], + [90323, 0, "e"], + [90324, 0, " "], + [90325, 0, "s"], + [90326, 0, "e"], + [90327, 0, "t"], + [90328, 0, "s"], + [90329, 0, " "], + [90330, 0, "a"], + [90331, 0, "n"], + [90332, 0, "d"], + [90333, 0, " "], + [90334, 0, "r"], + [90335, 0, "e"], + [90336, 0, "g"], + [90337, 0, "i"], + [90338, 0, "s"], + [90339, 0, "t"], + [90340, 0, "e"], + [90341, 0, "r"], + [90342, 0, "s"], + [90343, 0, " "], + [90344, 0, "i"], + [90345, 0, "s"], + [90346, 0, " "], + [90347, 0, "t"], + [90348, 0, "h"], + [90349, 0, "e"], + [90350, 0, " "], + [90351, 0, "s"], + [90352, 0, "a"], + [90353, 0, "m"], + [90354, 0, "e"], + [90355, 0, " "], + [90356, 0, "a"], + [90357, 0, "s"], + [90358, 0, " "], + [90359, 0, "i"], + [90360, 0, "f"], + [90361, 0, " "], + [90362, 0, "t"], + [90363, 0, "h"], + [90364, 0, "e"], + [90365, 0, "y"], + [90366, 0, " "], + [90367, 0, "h"], + [90368, 0, "a"], + [90369, 0, "d"], + [90370, 0, " "], + [90371, 0, "b"], + [90372, 0, "e"], + [90373, 0, "e"], + [90374, 0, "n"], + [90375, 0, " "], + [90376, 0, "e"], + [90377, 0, "x"], + [90378, 0, "e"], + [90379, 0, "c"], + [90380, 0, "u"], + [90381, 0, "t"], + [90382, 0, "e"], + [90382, 1], + [90381, 1], + [90380, 1], + [90379, 1], + [90378, 1], + [90377, 1], + [90376, 1], + [90376, 0, "a"], + [90377, 0, "p"], + [90378, 0, "p"], + [90379, 0, "l"], + [90380, 0, "i"], + [90381, 0, "e"], + [90382, 0, "d"], + [90383, 0, " "], + [90384, 0, "i"], + [90385, 0, "n"], + [90386, 0, " "], + [90387, 0, "t"], + [90388, 0, "h"], + [90389, 0, "e"], + [90390, 0, " "], + [90391, 0, "r"], + [90392, 0, "e"], + [90393, 0, "v"], + [90394, 0, "e"], + [90395, 0, "r"], + [90396, 0, "s"], + [90397, 0, "e"], + [90398, 0, " "], + [90399, 0, "o"], + [90400, 0, "r"], + [90401, 0, "d"], + [90402, 0, "e"], + [90403, 0, "r"], + [90404, 0, ","], + [90405, 0, " "], + [90406, 0, "d"], + [90407, 0, "u"], + [90408, 0, "e"], + [90409, 0, " "], + [90410, 0, "t"], + [90411, 0, "o"], + [90412, 0, " "], + [90413, 0, "t"], + [90414, 0, "h"], + [90415, 0, "e"], + [90416, 0, " "], + [90416, 1], + [90415, 1], + [90414, 1], + [90413, 1], + [90412, 1], + [90411, 1], + [90410, 1], + [90409, 1], + [90408, 1], + [90407, 1], + [90406, 1], + [90405, 1], + [90404, 1], + [90403, 1], + [90403, 0, "r"], + [90404, 0, "."], + [90405, 0, " "], + [90406, 0, "M"], + [90407, 0, "o"], + [90408, 0, "r"], + [90409, 0, "e"], + [90410, 0, "o"], + [90411, 0, "v"], + [90412, 0, "e"], + [90413, 0, "r"], + [90414, 0, " "], + [90414, 1], + [90414, 0, ","], + [90415, 0, " "], + [90416, 0, "$"], + [90417, 0, "o"], + [90418, 0, "_"], + [90419, 0, "c"], + [90420, 0, "$"], + [90421, 0, " "], + [90422, 0, "i"], + [90423, 0, "s"], + [90424, 0, " "], + [90425, 0, "s"], + [90426, 0, "t"], + [90427, 0, "i"], + [90428, 0, "l"], + [90429, 0, "l"], + [90430, 0, " "], + [90431, 0, "a"], + [90432, 0, "b"], + [90433, 0, "l"], + [90434, 0, "e"], + [90435, 0, " "], + [90436, 0, "t"], + [90437, 0, "o"], + [90438, 0, " "], + [90439, 0, "e"], + [90440, 0, "x"], + [90441, 0, "e"], + [90442, 0, "c"], + [90443, 0, "u"], + [90444, 0, "t"], + [90445, 0, "e"], + [90445, 1], + [90444, 1], + [90443, 1], + [90442, 1], + [90441, 1], + [90440, 1], + [90439, 1], + [90438, 1], + [90437, 1], + [90436, 1], + [90435, 1], + [90434, 1], + [90433, 1], + [90432, 1], + [90431, 1], + [90430, 1], + [90429, 1], + [90428, 1], + [90427, 1], + [90426, 1], + [90425, 1], + [90424, 1], + [90423, 1], + [90422, 1], + [90422, 0, "a"], + [90423, 0, "p"], + [90424, 0, "p"], + [90425, 0, "l"], + [90426, 0, "i"], + [90427, 0, "e"], + [90428, 0, "s"], + [90429, 0, " "], + [90430, 0, "i"], + [90431, 0, "n"], + [90432, 0, " "], + [90433, 0, "t"], + [90434, 0, "h"], + [90435, 0, "e"], + [90436, 0, " "], + [90437, 0, "s"], + [90438, 0, "a"], + [90439, 0, "m"], + [90440, 0, "e"], + [90441, 0, " "], + [90442, 0, "w"], + [90443, 0, "a"], + [90444, 0, "s"], + [90444, 1], + [90444, 0, "y"], + [90445, 0, " "], + [90446, 0, "a"], + [90447, 0, "s"], + [90448, 0, " "], + [90449, 0, "i"], + [90450, 0, "f"], + [90451, 0, " "], + [90452, 0, "$"], + [90453, 0, "o"], + [90454, 0, "_"], + [90455, 0, "d"], + [90456, 0, "$"], + [90457, 0, " "], + [90458, 0, "h"], + [90459, 0, "a"], + [90460, 0, "d"], + [90461, 0, " "], + [90462, 0, "n"], + [90463, 0, "o"], + [90464, 0, "t"], + [90465, 0, " "], + [90466, 0, "b"], + [90467, 0, "e"], + [90468, 0, "e"], + [90469, 0, "n"], + [90470, 0, " "], + [90471, 0, "a"], + [90472, 0, "p"], + [90473, 0, "p"], + [90474, 0, "l"], + [90475, 0, "i"], + [90476, 0, "e"], + [90477, 0, "d"], + [90478, 0, " "], + [90479, 0, "p"], + [90480, 0, "r"], + [90481, 0, "e"], + [90482, 0, "v"], + [90483, 0, "i"], + [90484, 0, "o"], + [90485, 0, "u"], + [90486, 0, "s"], + [90487, 0, "l"], + [90488, 0, "y"], + [90489, 0, ","], + [90490, 0, " "], + [90491, 0, "b"], + [90492, 0, "e"], + [90493, 0, "c"], + [90494, 0, "a"], + [90495, 0, "u"], + [90496, 0, "s"], + [90497, 0, "e"], + [90498, 0, " "], + [90499, 0, "$"], + [90500, 0, "o"], + [90501, 0, "_"], + [90502, 0, "d"], + [90503, 0, "$"], + [90504, 0, " "], + [90504, 1], + [90503, 1], + [90502, 1], + [90501, 1], + [90500, 1], + [90499, 1], + [90499, 0, "a"], + [90500, 0, " "], + [90500, 1], + [90499, 1], + [90499, 0, "$"], + [90500, 0, "o"], + [90501, 0, "_"], + [90502, 0, "d"], + [90503, 0, "$"], + [90504, 0, " "], + [90504, 1], + [90503, 1], + [90502, 1], + [90501, 1], + [90500, 1], + [90499, 1], + [90499, 0, "a"], + [90500, 0, "p"], + [90501, 0, "p"], + [90502, 0, "l"], + [90503, 0, "y"], + [90504, 0, "i"], + [90505, 0, "n"], + [90506, 0, "g"], + [90507, 0, " "], + [90508, 0, "a"], + [90509, 0, " "], + [90510, 0, "d"], + [90511, 0, "e"], + [90512, 0, "l"], + [90513, 0, "e"], + [90514, 0, "t"], + [90515, 0, "i"], + [90516, 0, "o"], + [90517, 0, "n"], + [90518, 0, " "], + [90519, 0, "o"], + [90520, 0, "n"], + [90521, 0, "l"], + [90522, 0, "y"], + [90523, 0, " "], + [90524, 0, "m"], + [90525, 0, "o"], + [90526, 0, "d"], + [90527, 0, "i"], + [90528, 0, "f"], + [90529, 0, "i"], + [90530, 0, "e"], + [90531, 0, "s"], + [90532, 0, " "], + [90533, 0, "p"], + [90534, 0, "r"], + [90535, 0, "e"], + [90536, 0, "s"], + [90537, 0, "e"], + [90538, 0, "n"], + [90539, 0, "c"], + [90540, 0, "e"], + [90541, 0, " "], + [90542, 0, "s"], + [90543, 0, "e"], + [90544, 0, "t"], + [90545, 0, "s"], + [90546, 0, " "], + [90547, 0, "a"], + [90548, 0, "n"], + [90549, 0, "d"], + [90550, 0, " "], + [90551, 0, "r"], + [90552, 0, "e"], + [90553, 0, "g"], + [90554, 0, "i"], + [90555, 0, "s"], + [90556, 0, "t"], + [90557, 0, "e"], + [90558, 0, "r"], + [90559, 0, "s"], + [90560, 0, ","], + [90561, 0, " "], + [90562, 0, "b"], + [90563, 0, "u"], + [90564, 0, "t"], + [90565, 0, " "], + [90566, 0, "d"], + [90567, 0, "o"], + [90568, 0, "e"], + [90569, 0, "s"], + [90570, 0, " "], + [90571, 0, "n"], + [90572, 0, "o"], + [90573, 0, "t"], + [90574, 0, " "], + [90575, 0, "a"], + [90576, 0, "c"], + [90577, 0, "t"], + [90578, 0, "u"], + [90579, 0, "a"], + [90580, 0, "l"], + [90581, 0, "l"], + [90582, 0, "y"], + [90583, 0, " "], + [90584, 0, "r"], + [90585, 0, "e"], + [90586, 0, "m"], + [90587, 0, "o"], + [90588, 0, "v"], + [90589, 0, "e"], + [90590, 0, " "], + [90591, 0, "a"], + [90592, 0, "n"], + [90593, 0, "y"], + [90594, 0, " "], + [90595, 0, "m"], + [90596, 0, "a"], + [90597, 0, "p"], + [90598, 0, " "], + [90599, 0, "k"], + [90600, 0, "e"], + [90601, 0, "y"], + [90602, 0, "s"], + [90603, 0, " "], + [90604, 0, "o"], + [90605, 0, "r"], + [90606, 0, " "], + [90607, 0, "l"], + [90608, 0, "i"], + [90609, 0, "s"], + [90610, 0, "t"], + [90611, 0, " "], + [90612, 0, "i"], + [90613, 0, "t"], + [90614, 0, "e"], + [90615, 0, "m"], + [90616, 0, "s"], + [90616, 1], + [90615, 1], + [90614, 1], + [90613, 1], + [90612, 1], + [90612, 0, "e"], + [90613, 0, "l"], + [90614, 0, "e"], + [90615, 0, "m"], + [90616, 0, "e"], + [90617, 0, "n"], + [90618, 0, "t"], + [90619, 0, "s"], + [90620, 0, "."], + [90620, 0, ","], + [90621, 0, " "], + [90622, 0, "a"], + [90623, 0, "n"], + [90624, 0, "d"], + [90625, 0, " "], + [90626, 0, "b"], + [90627, 0, "e"], + [90628, 0, "c"], + [90629, 0, "a"], + [90630, 0, "u"], + [90631, 0, "s"], + [90632, 0, "e"], + [90633, 0, " "], + [90634, 0, "t"], + [90635, 0, "h"], + [90636, 0, "e"], + [90637, 0, " "], + [90638, 0, "r"], + [90639, 0, "u"], + [90640, 0, "l"], + [90641, 0, "e"], + [90642, 0, "s"], + [90643, 0, " "], + [90644, 0, "f"], + [90645, 0, "o"], + [90646, 0, "r"], + [90647, 0, " "], + [90648, 0, "a"], + [90649, 0, "p"], + [90650, 0, "p"], + [90651, 0, "l"], + [90652, 0, "y"], + [90653, 0, "i"], + [90654, 0, "n"], + [90655, 0, "g"], + [90656, 0, " "], + [90657, 0, "a"], + [90658, 0, "n"], + [90659, 0, " "], + [90660, 0, "o"], + [90661, 0, "p"], + [90662, 0, "e"], + [90663, 0, "r"], + [90664, 0, "a"], + [90665, 0, "t"], + [90666, 0, "i"], + [90667, 0, "o"], + [90668, 0, "n"], + [90669, 0, " "], + [90670, 0, "a"], + [90671, 0, "r"], + [90672, 0, "e"], + [90673, 0, " "], + [90674, 0, "n"], + [90675, 0, "o"], + [90676, 0, "t"], + [90677, 0, " "], + [90678, 0, "c"], + [90679, 0, "o"], + [90680, 0, "n"], + [90681, 0, "d"], + [90682, 0, "i"], + [90683, 0, "t"], + [90684, 0, "i"], + [90685, 0, "o"], + [90686, 0, "n"], + [90687, 0, "a"], + [90688, 0, "l"], + [90689, 0, " "], + [90690, 0, "o"], + [90691, 0, "n"], + [90692, 0, " "], + [90693, 0, "t"], + [90694, 0, "h"], + [90695, 0, "e"], + [90696, 0, " "], + [90697, 0, "p"], + [90698, 0, "r"], + [90699, 0, "e"], + [90700, 0, "v"], + [90701, 0, "i"], + [90702, 0, "o"], + [90703, 0, "u"], + [90704, 0, "s"], + [90705, 0, " "], + [90706, 0, "c"], + [90707, 0, "o"], + [90708, 0, "n"], + [90709, 0, "t"], + [90710, 0, "e"], + [90711, 0, "n"], + [90712, 0, "t"], + [90713, 0, " "], + [90714, 0, "o"], + [90715, 0, "f"], + [90716, 0, " "], + [90717, 0, "p"], + [90718, 0, "r"], + [90719, 0, "e"], + [90720, 0, "s"], + [90721, 0, "e"], + [90722, 0, "n"], + [90723, 0, "c"], + [90724, 0, "e"], + [90725, 0, " "], + [90726, 0, "s"], + [90727, 0, "e"], + [90728, 0, "t"], + [90729, 0, "s"], + [90730, 0, " "], + [90731, 0, "a"], + [90732, 0, "n"], + [90733, 0, "d"], + [90734, 0, " "], + [90735, 0, "r"], + [90736, 0, "e"], + [90737, 0, "g"], + [90738, 0, "i"], + [90739, 0, "s"], + [90740, 0, "t"], + [90741, 0, "e"], + [90742, 0, "r"], + [90743, 0, "s"], + [90573, 1], + [90572, 1], + [90571, 1], + [90570, 1], + [90569, 1], + [90568, 1], + [90567, 1], + [90566, 1], + [90565, 1], + [90564, 1], + [90563, 1], + [90562, 1], + [90562, 0, "w"], + [90563, 0, "i"], + [90564, 0, "t"], + [90565, 0, "h"], + [90566, 0, "o"], + [90567, 0, "u"], + [90568, 0, "t"], + [90584, 1], + [90584, 0, "i"], + [90585, 0, "n"], + [90586, 0, "g"], + [90587, 1], + [90587, 1], + [90587, 1], + [90587, 1], + [90740, 0, "T"], + [90741, 0, "h"], + [90742, 0, "u"], + [90743, 0, "s"], + [90744, 0, ","], + [90745, 0, " "], + [90746, 1], + [90746, 0, "t"], + [90790, 1], + [90790, 1], + [90790, 1], + [90790, 1], + [90790, 1], + [93202, 1], + [93201, 1], + [93200, 1], + [93199, 1], + [93198, 1], + [93197, 1], + [93196, 1], + [93195, 1], + [93194, 1], + [93193, 1], + [93192, 1], + [93191, 1], + [93190, 1], + [93189, 1], + [93188, 1], + [93187, 1], + [93186, 1], + [93185, 1], + [93184, 1], + [93183, 1], + [93182, 1], + [93181, 1], + [93180, 1], + [93179, 1], + [93178, 1], + [93177, 1], + [93176, 1], + [93175, 1], + [93174, 1], + [93173, 1], + [93172, 1], + [93171, 1], + [93170, 1], + [93169, 1], + [93168, 1], + [93167, 1], + [93166, 1], + [93165, 1], + [93164, 1], + [93163, 1], + [93162, 1], + [93161, 1], + [93160, 1], + [93159, 1], + [93158, 1], + [93157, 1], + [93156, 1], + [93155, 1], + [93154, 1], + [93153, 1], + [93152, 1], + [93151, 1], + [93150, 1], + [93149, 1], + [93148, 1], + [93147, 1], + [93146, 1], + [93145, 1], + [93144, 1], + [93143, 1], + [93142, 1], + [93141, 1], + [93140, 1], + [93139, 1], + [93138, 1], + [93137, 1], + [93136, 1], + [93135, 1], + [93134, 1], + [93133, 1], + [93132, 1], + [93131, 1], + [93130, 1], + [93129, 1], + [93128, 1], + [93127, 1], + [93126, 1], + [93125, 1], + [93124, 1], + [93123, 1], + [93122, 1], + [93121, 1], + [93120, 1], + [93119, 1], + [93118, 1], + [93117, 1], + [93116, 1], + [93115, 1], + [93114, 1], + [93113, 1], + [93112, 1], + [93111, 1], + [93110, 1], + [93109, 1], + [93108, 1], + [93107, 1], + [93106, 1], + [93105, 1], + [93104, 1], + [93103, 1], + [93102, 1], + [93101, 1], + [93100, 1], + [93099, 1], + [93098, 1], + [93097, 1], + [93096, 1], + [93095, 1], + [93094, 1], + [93093, 1], + [93092, 1], + [93091, 1], + [93090, 1], + [93089, 1], + [93088, 1], + [93087, 1], + [93086, 1], + [93085, 1], + [93084, 1], + [93083, 1], + [93082, 1], + [93081, 1], + [93080, 1], + [93079, 1], + [93078, 1], + [93077, 1], + [93076, 1], + [93075, 1], + [93074, 1], + [93073, 1], + [93072, 1], + [93071, 1], + [93070, 1], + [93069, 1], + [93068, 1], + [93067, 1], + [93066, 1], + [93065, 1], + [93064, 1], + [93063, 1], + [93062, 1], + [93061, 1], + [93060, 1], + [93059, 1], + [93058, 1], + [93057, 1], + [93056, 1], + [93055, 1], + [93054, 1], + [93053, 1], + [93052, 1], + [93051, 1], + [93050, 1], + [93049, 1], + [93048, 1], + [93047, 1], + [93046, 1], + [93045, 1], + [93044, 1], + [93043, 1], + [93042, 1], + [93041, 1], + [93040, 1], + [93039, 1], + [93038, 1], + [93037, 1], + [93036, 1], + [93035, 1], + [93034, 1], + [93033, 1], + [93032, 1], + [93031, 1], + [93030, 1], + [93029, 1], + [93028, 1], + [93027, 1], + [93026, 1], + [93025, 1], + [93024, 1], + [93023, 1], + [93022, 1], + [93021, 1], + [93020, 1], + [93019, 1], + [93018, 1], + [93017, 1], + [93016, 1], + [93015, 1], + [93014, 1], + [93013, 1], + [93012, 1], + [93011, 1], + [93010, 1], + [93009, 1], + [93008, 1], + [93007, 1], + [93006, 1], + [93005, 1], + [93004, 1], + [93003, 1], + [93002, 1], + [93001, 1], + [93000, 1], + [92999, 1], + [92998, 1], + [92997, 1], + [92996, 1], + [92995, 1], + [92994, 1], + [92993, 1], + [92992, 1], + [92991, 1], + [92990, 1], + [92989, 1], + [92988, 1], + [92987, 1], + [92986, 1], + [92985, 1], + [92984, 1], + [92983, 1], + [92982, 1], + [92981, 1], + [92980, 1], + [92979, 1], + [92978, 1], + [92977, 1], + [92976, 1], + [92975, 1], + [92974, 1], + [92973, 1], + [92972, 1], + [92971, 1], + [92970, 1], + [92969, 1], + [92968, 1], + [92967, 1], + [92966, 1], + [92965, 1], + [92964, 1], + [92963, 1], + [92962, 1], + [92961, 1], + [92960, 1], + [92959, 1], + [92958, 1], + [92957, 1], + [92956, 1], + [92955, 1], + [92954, 1], + [92953, 1], + [92952, 1], + [92951, 1], + [92950, 1], + [92949, 1], + [92948, 1], + [92947, 1], + [92946, 1], + [92945, 1], + [92944, 1], + [92943, 1], + [92942, 1], + [92941, 1], + [92940, 1], + [92939, 1], + [92938, 1], + [92937, 1], + [92936, 1], + [92935, 1], + [92934, 1], + [92933, 1], + [92932, 1], + [92931, 1], + [92930, 1], + [92929, 1], + [92928, 1], + [92927, 1], + [92926, 1], + [92925, 1], + [92924, 1], + [92923, 1], + [92922, 1], + [92921, 1], + [92920, 1], + [92919, 1], + [92918, 1], + [92917, 1], + [92916, 1], + [92915, 1], + [92914, 1], + [92913, 1], + [92912, 1], + [92911, 1], + [92910, 1], + [92909, 1], + [92908, 1], + [92907, 1], + [92906, 1], + [92905, 1], + [92904, 1], + [92903, 1], + [92902, 1], + [92901, 1], + [92900, 1], + [92899, 1], + [92898, 1], + [92897, 1], + [92896, 1], + [92895, 1], + [92894, 1], + [92893, 1], + [92892, 1], + [92891, 1], + [92890, 1], + [92889, 1], + [92888, 1], + [92887, 1], + [92886, 1], + [92885, 1], + [92884, 1], + [92883, 1], + [92882, 1], + [92881, 1], + [92880, 1], + [92879, 1], + [92878, 1], + [92877, 1], + [92876, 1], + [92875, 1], + [92874, 1], + [92873, 1], + [92872, 1], + [92871, 1], + [92870, 1], + [92869, 1], + [92868, 1], + [92867, 1], + [92866, 1], + [92865, 1], + [92864, 1], + [92863, 1], + [92862, 1], + [92861, 1], + [92860, 1], + [92859, 1], + [92858, 1], + [92857, 1], + [92856, 1], + [92855, 1], + [92854, 1], + [92853, 1], + [92852, 1], + [92851, 1], + [92850, 1], + [92849, 1], + [92848, 1], + [92847, 1], + [92846, 1], + [92845, 1], + [92844, 1], + [92843, 1], + [92842, 1], + [92841, 1], + [92840, 1], + [92839, 1], + [92838, 1], + [92837, 1], + [92836, 1], + [92835, 1], + [92834, 1], + [92833, 1], + [92832, 1], + [92831, 1], + [92830, 1], + [92829, 1], + [92828, 1], + [92827, 1], + [92826, 1], + [92825, 1], + [92824, 1], + [92823, 1], + [92822, 1], + [92821, 1], + [92820, 1], + [92819, 1], + [92818, 1], + [92817, 1], + [92816, 1], + [92815, 1], + [92814, 1], + [92813, 1], + [92812, 1], + [92811, 1], + [92810, 1], + [92809, 1], + [92808, 1], + [92807, 1], + [92806, 1], + [92805, 1], + [92804, 1], + [92803, 1], + [92802, 1], + [92801, 1], + [92800, 1], + [92799, 1], + [92798, 1], + [92797, 1], + [92796, 1], + [92795, 1], + [92794, 1], + [92793, 1], + [92792, 1], + [92791, 1], + [92790, 1], + [92789, 1], + [92788, 1], + [92787, 1], + [92786, 1], + [92785, 1], + [92784, 1], + [92783, 1], + [92782, 1], + [92781, 1], + [92780, 1], + [92779, 1], + [92778, 1], + [92777, 1], + [92776, 1], + [92775, 1], + [92774, 1], + [92773, 1], + [92772, 1], + [92771, 1], + [92770, 1], + [92769, 1], + [92768, 1], + [92767, 1], + [92766, 1], + [92765, 1], + [92764, 1], + [92763, 1], + [92762, 1], + [92761, 1], + [92760, 1], + [92759, 1], + [92758, 1], + [92757, 1], + [92756, 1], + [92755, 1], + [92754, 1], + [92753, 1], + [92752, 1], + [92751, 1], + [92750, 1], + [92749, 1], + [92748, 1], + [92747, 1], + [92746, 1], + [92745, 1], + [92744, 1], + [92743, 1], + [92742, 1], + [92741, 1], + [92740, 1], + [92739, 1], + [92738, 1], + [92737, 1], + [92736, 1], + [92735, 1], + [92734, 1], + [92733, 1], + [92732, 1], + [92731, 1], + [92730, 1], + [92729, 1], + [92728, 1], + [92727, 1], + [92726, 1], + [92725, 1], + [92724, 1], + [92723, 1], + [92722, 1], + [92721, 1], + [92720, 1], + [92719, 1], + [92718, 1], + [92717, 1], + [92716, 1], + [92715, 1], + [92714, 1], + [92713, 1], + [92712, 1], + [92711, 1], + [92710, 1], + [92709, 1], + [92708, 1], + [92707, 1], + [92706, 1], + [92705, 1], + [92704, 1], + [92703, 1], + [92702, 1], + [92701, 1], + [92700, 1], + [92699, 1], + [92698, 1], + [92697, 1], + [92696, 1], + [92695, 1], + [92694, 1], + [92693, 1], + [92692, 1], + [92691, 1], + [92690, 1], + [92689, 1], + [92688, 1], + [92687, 1], + [92686, 1], + [92685, 1], + [92684, 1], + [92683, 1], + [92682, 1], + [92681, 1], + [92680, 1], + [92679, 1], + [92678, 1], + [92677, 1], + [92676, 1], + [92675, 1], + [92674, 1], + [92673, 1], + [92672, 1], + [92671, 1], + [92670, 1], + [92669, 1], + [92668, 1], + [92667, 1], + [92666, 1], + [92665, 1], + [92664, 1], + [92663, 1], + [92662, 1], + [92661, 1], + [92660, 1], + [92659, 1], + [92658, 1], + [92657, 1], + [92656, 1], + [92655, 1], + [92654, 1], + [92653, 1], + [92652, 1], + [92651, 1], + [92650, 1], + [92649, 1], + [92648, 1], + [92647, 1], + [92646, 1], + [92645, 1], + [92644, 1], + [92643, 1], + [92642, 1], + [92641, 1], + [92640, 1], + [92639, 1], + [92638, 1], + [92637, 1], + [92636, 1], + [92635, 1], + [92634, 1], + [92633, 1], + [92632, 1], + [92631, 1], + [92630, 1], + [92629, 1], + [92628, 1], + [92627, 1], + [92626, 1], + [92625, 1], + [92624, 1], + [92623, 1], + [92622, 1], + [92621, 1], + [92620, 1], + [92619, 1], + [92618, 1], + [92617, 1], + [92616, 1], + [92615, 1], + [92614, 1], + [92613, 1], + [92612, 1], + [92611, 1], + [92610, 1], + [92609, 1], + [92608, 1], + [92607, 1], + [92606, 1], + [92605, 1], + [92604, 1], + [92603, 1], + [92602, 1], + [92601, 1], + [92600, 1], + [92599, 1], + [92598, 1], + [92597, 1], + [92596, 1], + [92595, 1], + [92594, 1], + [92593, 1], + [92592, 1], + [92591, 1], + [92590, 1], + [92589, 1], + [92588, 1], + [92587, 1], + [92586, 1], + [92585, 1], + [92584, 1], + [92583, 1], + [92582, 1], + [92581, 1], + [92580, 1], + [92579, 1], + [92578, 1], + [92577, 1], + [92576, 1], + [92575, 1], + [92574, 1], + [92573, 1], + [92572, 1], + [92571, 1], + [92570, 1], + [92569, 1], + [92568, 1], + [92567, 1], + [92566, 1], + [92565, 1], + [92564, 1], + [92563, 1], + [92562, 1], + [92561, 1], + [92560, 1], + [92559, 1], + [92558, 1], + [92557, 1], + [92556, 1], + [92555, 1], + [92554, 1], + [92553, 1], + [92552, 1], + [92551, 1], + [92550, 1], + [92549, 1], + [92548, 1], + [92547, 1], + [92546, 1], + [92545, 1], + [92544, 1], + [92543, 1], + [92542, 1], + [92541, 1], + [92540, 1], + [92539, 1], + [92538, 1], + [92537, 1], + [92536, 1], + [92535, 1], + [92534, 1], + [92533, 1], + [92532, 1], + [92531, 1], + [92530, 1], + [92529, 1], + [92528, 1], + [92527, 1], + [92526, 1], + [92525, 1], + [92524, 1], + [92523, 1], + [92522, 1], + [92521, 1], + [92520, 1], + [92519, 1], + [92518, 1], + [92517, 1], + [92516, 1], + [92515, 1], + [92514, 1], + [92513, 1], + [92512, 1], + [92511, 1], + [92510, 1], + [92509, 1], + [92508, 1], + [92507, 1], + [92506, 1], + [92505, 1], + [92504, 1], + [92503, 1], + [92502, 1], + [92501, 1], + [92500, 1], + [92499, 1], + [92498, 1], + [92497, 1], + [92496, 1], + [92495, 1], + [92494, 1], + [92493, 1], + [92492, 1], + [92491, 1], + [92490, 1], + [92489, 1], + [92488, 1], + [92487, 1], + [92486, 1], + [92485, 1], + [92484, 1], + [92483, 1], + [92482, 1], + [92481, 1], + [92480, 1], + [92479, 1], + [92478, 1], + [92477, 1], + [92476, 1], + [92475, 1], + [92474, 1], + [92473, 1], + [92472, 1], + [92471, 1], + [92470, 1], + [92469, 1], + [92468, 1], + [92467, 1], + [92466, 1], + [92465, 1], + [92464, 1], + [92463, 1], + [92462, 1], + [92461, 1], + [92460, 1], + [92459, 1], + [92458, 1], + [92457, 1], + [92456, 1], + [92455, 1], + [92454, 1], + [92453, 1], + [92452, 1], + [92451, 1], + [92450, 1], + [92449, 1], + [92448, 1], + [92447, 1], + [92446, 1], + [92445, 1], + [92444, 1], + [92443, 1], + [92442, 1], + [92441, 1], + [92440, 1], + [92439, 1], + [92438, 1], + [92437, 1], + [92436, 1], + [92435, 1], + [92434, 1], + [92433, 1], + [92432, 1], + [92431, 1], + [92430, 1], + [92429, 1], + [92428, 1], + [92427, 1], + [92426, 1], + [92425, 1], + [92424, 1], + [92423, 1], + [92422, 1], + [92421, 1], + [92420, 1], + [92419, 1], + [92418, 1], + [92417, 1], + [92416, 1], + [92415, 1], + [92414, 1], + [92413, 1], + [92412, 1], + [92411, 1], + [92410, 1], + [92409, 1], + [92408, 1], + [92407, 1], + [92406, 1], + [92405, 1], + [92404, 1], + [92403, 1], + [92402, 1], + [92401, 1], + [92400, 1], + [92399, 1], + [92398, 1], + [92397, 1], + [92396, 1], + [92395, 1], + [92394, 1], + [92393, 1], + [92392, 1], + [92391, 1], + [92390, 1], + [92389, 1], + [92388, 1], + [92387, 1], + [92386, 1], + [92385, 1], + [92384, 1], + [92383, 1], + [92382, 1], + [92381, 1], + [92380, 1], + [92379, 1], + [92378, 1], + [92377, 1], + [92376, 1], + [92375, 1], + [92374, 1], + [92373, 1], + [92372, 1], + [92371, 1], + [92370, 1], + [92369, 1], + [92368, 1], + [92367, 1], + [92366, 1], + [92365, 1], + [92364, 1], + [92363, 1], + [92362, 1], + [92361, 1], + [92360, 1], + [92359, 1], + [92358, 1], + [92357, 1], + [92356, 1], + [92355, 1], + [92354, 1], + [92353, 1], + [92352, 1], + [92351, 1], + [92350, 1], + [92349, 1], + [92348, 1], + [92347, 1], + [92346, 1], + [92345, 1], + [92344, 1], + [92343, 1], + [92342, 1], + [92341, 1], + [92340, 1], + [92339, 1], + [92338, 1], + [92337, 1], + [92336, 1], + [92335, 1], + [92334, 1], + [92333, 1], + [92332, 1], + [92331, 1], + [92330, 1], + [92329, 1], + [92328, 1], + [92327, 1], + [92326, 1], + [92325, 1], + [92324, 1], + [92323, 1], + [92322, 1], + [92321, 1], + [92320, 1], + [92319, 1], + [92318, 1], + [92317, 1], + [92316, 1], + [92315, 1], + [92314, 1], + [92313, 1], + [92312, 1], + [92311, 1], + [92310, 1], + [92309, 1], + [92308, 1], + [92307, 1], + [92306, 1], + [92305, 1], + [92304, 1], + [92303, 1], + [92302, 1], + [92301, 1], + [92300, 1], + [92299, 1], + [92298, 1], + [92297, 1], + [92296, 1], + [92295, 1], + [92294, 1], + [92293, 1], + [92292, 1], + [92291, 1], + [92290, 1], + [92289, 1], + [92288, 1], + [92287, 1], + [92286, 1], + [92285, 1], + [92284, 1], + [92283, 1], + [92282, 1], + [92281, 1], + [92280, 1], + [92279, 1], + [92278, 1], + [92277, 1], + [92276, 1], + [92275, 1], + [92274, 1], + [92273, 1], + [92272, 1], + [92271, 1], + [92270, 1], + [92269, 1], + [92268, 1], + [92267, 1], + [92266, 1], + [92265, 1], + [92264, 1], + [92263, 1], + [92262, 1], + [92261, 1], + [92260, 1], + [92259, 1], + [92258, 1], + [92257, 1], + [92256, 1], + [92255, 1], + [92254, 1], + [92253, 1], + [92252, 1], + [92251, 1], + [92250, 1], + [92249, 1], + [92248, 1], + [92247, 1], + [92246, 1], + [92245, 1], + [92244, 1], + [92243, 1], + [92242, 1], + [92241, 1], + [92240, 1], + [92239, 1], + [92238, 1], + [92237, 1], + [92236, 1], + [92235, 1], + [92234, 1], + [92233, 1], + [92232, 1], + [92231, 1], + [92230, 1], + [92229, 1], + [92228, 1], + [92227, 1], + [92226, 1], + [92225, 1], + [92224, 1], + [92223, 1], + [92222, 1], + [92221, 1], + [92220, 1], + [92219, 1], + [92218, 1], + [92217, 1], + [92216, 1], + [92215, 1], + [92214, 1], + [92213, 1], + [92212, 1], + [92211, 1], + [92210, 1], + [92209, 1], + [92208, 1], + [92207, 1], + [92206, 1], + [92205, 1], + [92204, 1], + [92203, 1], + [92202, 1], + [92201, 1], + [92200, 1], + [92199, 1], + [92198, 1], + [92197, 1], + [92196, 1], + [92195, 1], + [92194, 1], + [92193, 1], + [92192, 1], + [92191, 1], + [92190, 1], + [92189, 1], + [92188, 1], + [92187, 1], + [92186, 1], + [92185, 1], + [92184, 1], + [92183, 1], + [92182, 1], + [92181, 1], + [92180, 1], + [92179, 1], + [92178, 1], + [92177, 1], + [92176, 1], + [92175, 1], + [92174, 1], + [92173, 1], + [92172, 1], + [92171, 1], + [92170, 1], + [92169, 1], + [92168, 1], + [92167, 1], + [92166, 1], + [92165, 1], + [92164, 1], + [92163, 1], + [92162, 1], + [92161, 1], + [92160, 1], + [92159, 1], + [92158, 1], + [92157, 1], + [92156, 1], + [92155, 1], + [92154, 1], + [92153, 1], + [92152, 1], + [92151, 1], + [92150, 1], + [92149, 1], + [92148, 1], + [92147, 1], + [92146, 1], + [92145, 1], + [92144, 1], + [92143, 1], + [92142, 1], + [92141, 1], + [92140, 1], + [92139, 1], + [92138, 1], + [92137, 1], + [92136, 1], + [92135, 1], + [92134, 1], + [92133, 1], + [92132, 1], + [92131, 1], + [92130, 1], + [92129, 1], + [92128, 1], + [92127, 1], + [92126, 1], + [92125, 1], + [92124, 1], + [92123, 1], + [92122, 1], + [92121, 1], + [92120, 1], + [92119, 1], + [92118, 1], + [92117, 1], + [92116, 1], + [92115, 1], + [92114, 1], + [92113, 1], + [92112, 1], + [92111, 1], + [92110, 1], + [92109, 1], + [92108, 1], + [92107, 1], + [92106, 1], + [92105, 1], + [92104, 1], + [92103, 1], + [92102, 1], + [92101, 1], + [92100, 1], + [92099, 1], + [92098, 1], + [92097, 1], + [92096, 1], + [92095, 1], + [92094, 1], + [92093, 1], + [92092, 1], + [92091, 1], + [92090, 1], + [92089, 1], + [92088, 1], + [92087, 1], + [92086, 1], + [92085, 1], + [92084, 1], + [92083, 1], + [92082, 1], + [92081, 1], + [92080, 1], + [92079, 1], + [92078, 1], + [92077, 1], + [92076, 1], + [92075, 1], + [92074, 1], + [92073, 1], + [92072, 1], + [92071, 1], + [92070, 1], + [92069, 1], + [92068, 1], + [92067, 1], + [92066, 1], + [92065, 1], + [92064, 1], + [92063, 1], + [92062, 1], + [92061, 1], + [92060, 1], + [92059, 1], + [92058, 1], + [92057, 1], + [92056, 1], + [92055, 1], + [92054, 1], + [92053, 1], + [92052, 1], + [92051, 1], + [92050, 1], + [92049, 1], + [92048, 1], + [92047, 1], + [92046, 1], + [92045, 1], + [92044, 1], + [92043, 1], + [92042, 1], + [92041, 1], + [92040, 1], + [92039, 1], + [92038, 1], + [92037, 1], + [92036, 1], + [92035, 1], + [92034, 1], + [92033, 1], + [92032, 1], + [92031, 1], + [92030, 1], + [92029, 1], + [92028, 1], + [92027, 1], + [92026, 1], + [92025, 1], + [92024, 1], + [92023, 1], + [92022, 1], + [92021, 1], + [92020, 1], + [92019, 1], + [92018, 1], + [92017, 1], + [92016, 1], + [92015, 1], + [92014, 1], + [92013, 1], + [92012, 1], + [92011, 1], + [92010, 1], + [92009, 1], + [92008, 1], + [92007, 1], + [92006, 1], + [92005, 1], + [92004, 1], + [92003, 1], + [92002, 1], + [92001, 1], + [92000, 1], + [91999, 1], + [91998, 1], + [91997, 1], + [91996, 1], + [91995, 1], + [91994, 1], + [91993, 1], + [91992, 1], + [91991, 1], + [91990, 1], + [91989, 1], + [91988, 1], + [91987, 1], + [91986, 1], + [91985, 1], + [91984, 1], + [91983, 1], + [91982, 1], + [91981, 1], + [91980, 1], + [91979, 1], + [91978, 1], + [91977, 1], + [91976, 1], + [91975, 1], + [91974, 1], + [91973, 1], + [91972, 1], + [91971, 1], + [91970, 1], + [91969, 1], + [91968, 1], + [91967, 1], + [91966, 1], + [91965, 1], + [91964, 1], + [91963, 1], + [91962, 1], + [91961, 1], + [91960, 1], + [91959, 1], + [91958, 1], + [91957, 1], + [91956, 1], + [91955, 1], + [91954, 1], + [91953, 1], + [91952, 1], + [91951, 1], + [91950, 1], + [91949, 1], + [91948, 1], + [91947, 1], + [91946, 1], + [91945, 1], + [91944, 1], + [91943, 1], + [91942, 1], + [91941, 1], + [91940, 1], + [91939, 1], + [91938, 1], + [91937, 1], + [91936, 1], + [91935, 1], + [91934, 1], + [91933, 1], + [91932, 1], + [91931, 1], + [91930, 1], + [91929, 1], + [91928, 1], + [91927, 1], + [91926, 1], + [91925, 1], + [91924, 1], + [91923, 1], + [91922, 1], + [91921, 1], + [91920, 1], + [91919, 1], + [91918, 1], + [91917, 1], + [91916, 1], + [91915, 1], + [91914, 1], + [91913, 1], + [91912, 1], + [91911, 1], + [91910, 1], + [91909, 1], + [91908, 1], + [91907, 1], + [91906, 1], + [91905, 1], + [91904, 1], + [91903, 1], + [91902, 1], + [91901, 1], + [91900, 1], + [91899, 1], + [91898, 1], + [91897, 1], + [91896, 1], + [91895, 1], + [91894, 1], + [91893, 1], + [91892, 1], + [91891, 1], + [91890, 1], + [91889, 1], + [91888, 1], + [91887, 1], + [91886, 1], + [91885, 1], + [91884, 1], + [91883, 1], + [91882, 1], + [91881, 1], + [91880, 1], + [91879, 1], + [91878, 1], + [91877, 1], + [91876, 1], + [91875, 1], + [91874, 1], + [91873, 1], + [91872, 1], + [91871, 1], + [91870, 1], + [91869, 1], + [91868, 1], + [91867, 1], + [91866, 1], + [91865, 1], + [91864, 1], + [91863, 1], + [91862, 1], + [91861, 1], + [91860, 1], + [91859, 1], + [91858, 1], + [91857, 1], + [91856, 1], + [91855, 1], + [91854, 1], + [91853, 1], + [91852, 1], + [91851, 1], + [91850, 1], + [91849, 1], + [91848, 1], + [91847, 1], + [91846, 1], + [91845, 1], + [91844, 1], + [91843, 1], + [91842, 1], + [91841, 1], + [91840, 1], + [91839, 1], + [91838, 1], + [91837, 1], + [91836, 1], + [91835, 1], + [91834, 1], + [91833, 1], + [91832, 1], + [91831, 1], + [91830, 1], + [91829, 1], + [91828, 1], + [91827, 1], + [91826, 1], + [91825, 1], + [91824, 1], + [91823, 1], + [91822, 1], + [91821, 1], + [91820, 1], + [91819, 1], + [91818, 1], + [91817, 1], + [91816, 1], + [91815, 1], + [91814, 1], + [91813, 1], + [91812, 1], + [91811, 1], + [91810, 1], + [91809, 1], + [91808, 1], + [91807, 1], + [91806, 1], + [91805, 1], + [91804, 1], + [91803, 1], + [91802, 1], + [91801, 1], + [91800, 1], + [91799, 1], + [91798, 1], + [91797, 1], + [91796, 1], + [91795, 1], + [91794, 1], + [91793, 1], + [91792, 1], + [91791, 1], + [91790, 1], + [91789, 1], + [91788, 1], + [91787, 1], + [91786, 1], + [91785, 1], + [91784, 1], + [91783, 1], + [91782, 1], + [91781, 1], + [91780, 1], + [91779, 1], + [91778, 1], + [91777, 1], + [91776, 1], + [91775, 1], + [91774, 1], + [91773, 1], + [91772, 1], + [91771, 1], + [91770, 1], + [91769, 1], + [91768, 1], + [91767, 1], + [91766, 1], + [91765, 1], + [91764, 1], + [91763, 1], + [91762, 1], + [91761, 1], + [91760, 1], + [91759, 1], + [91758, 1], + [91757, 1], + [91756, 1], + [91755, 1], + [91754, 1], + [91753, 1], + [91752, 1], + [91751, 1], + [91750, 1], + [91749, 1], + [91748, 1], + [91747, 1], + [91746, 1], + [91745, 1], + [91744, 1], + [91743, 1], + [91742, 1], + [91741, 1], + [91740, 1], + [91739, 1], + [91738, 1], + [91737, 1], + [91736, 1], + [91735, 1], + [91734, 1], + [91733, 1], + [91732, 1], + [91731, 1], + [91730, 1], + [91729, 1], + [91728, 1], + [91727, 1], + [91726, 1], + [91725, 1], + [91724, 1], + [91723, 1], + [91722, 1], + [91721, 1], + [91720, 1], + [91719, 1], + [91718, 1], + [91717, 1], + [91716, 1], + [91715, 1], + [91714, 1], + [91713, 1], + [91712, 1], + [91711, 1], + [91710, 1], + [91709, 1], + [91708, 1], + [91707, 1], + [91706, 1], + [91705, 1], + [91704, 1], + [91703, 1], + [91702, 1], + [91701, 1], + [91700, 1], + [91699, 1], + [91698, 1], + [91697, 1], + [91696, 1], + [91695, 1], + [91694, 1], + [91693, 1], + [91692, 1], + [91691, 1], + [91690, 1], + [91689, 1], + [91688, 1], + [91687, 1], + [91686, 1], + [91685, 1], + [91684, 1], + [91683, 1], + [91682, 1], + [91681, 1], + [91680, 1], + [91679, 1], + [91678, 1], + [91677, 1], + [91676, 1], + [91675, 1], + [91674, 1], + [91673, 1], + [91672, 1], + [91671, 1], + [91670, 1], + [91669, 1], + [91668, 1], + [91667, 1], + [91666, 1], + [91665, 1], + [91664, 1], + [91663, 1], + [91662, 1], + [91661, 1], + [91660, 1], + [91659, 1], + [91658, 1], + [91657, 1], + [91656, 1], + [91655, 1], + [91654, 1], + [91653, 1], + [91652, 1], + [91651, 1], + [91650, 1], + [91649, 1], + [91648, 1], + [91647, 1], + [91646, 1], + [91645, 1], + [91644, 1], + [91643, 1], + [91642, 1], + [91641, 1], + [91640, 1], + [91639, 1], + [91638, 1], + [91637, 1], + [91636, 1], + [91635, 1], + [91634, 1], + [91633, 1], + [91632, 1], + [91631, 1], + [91630, 1], + [91629, 1], + [91628, 1], + [91627, 1], + [91626, 1], + [91625, 1], + [91624, 1], + [91623, 1], + [91622, 1], + [91621, 1], + [91620, 1], + [91619, 1], + [91618, 1], + [91617, 1], + [91616, 1], + [91615, 1], + [91614, 1], + [91613, 1], + [91612, 1], + [91611, 1], + [91610, 1], + [91609, 1], + [91608, 1], + [91607, 1], + [91606, 1], + [91605, 1], + [91604, 1], + [91603, 1], + [91602, 1], + [91601, 1], + [91600, 1], + [91599, 1], + [91598, 1], + [91597, 1], + [91596, 1], + [91595, 1], + [91594, 1], + [91593, 1], + [91592, 1], + [91591, 1], + [91590, 1], + [91589, 1], + [91588, 1], + [91587, 1], + [91586, 1], + [91585, 1], + [91584, 1], + [91583, 1], + [91582, 1], + [91581, 1], + [91580, 1], + [91579, 1], + [91578, 1], + [91577, 1], + [91576, 1], + [91575, 1], + [91574, 1], + [91573, 1], + [91572, 1], + [91571, 1], + [91570, 1], + [91569, 1], + [91568, 1], + [91567, 1], + [91566, 1], + [91565, 1], + [91564, 1], + [91563, 1], + [91562, 1], + [91561, 1], + [91560, 1], + [91559, 1], + [91558, 1], + [91557, 1], + [91556, 1], + [91555, 1], + [91554, 1], + [91553, 1], + [91552, 1], + [91551, 1], + [91550, 1], + [91549, 1], + [91548, 1], + [91547, 1], + [91546, 1], + [91545, 1], + [91544, 1], + [91543, 1], + [91542, 1], + [91541, 1], + [91540, 1], + [91539, 1], + [91538, 1], + [91537, 1], + [91536, 1], + [91535, 1], + [91534, 1], + [91533, 1], + [91532, 1], + [91531, 1], + [91530, 1], + [91529, 1], + [91528, 1], + [91527, 1], + [91526, 1], + [91525, 1], + [91524, 1], + [91523, 1], + [91522, 1], + [91521, 1], + [91520, 1], + [91519, 1], + [91518, 1], + [91517, 1], + [91516, 1], + [91515, 1], + [91514, 1], + [91513, 1], + [91512, 1], + [91511, 1], + [91510, 1], + [91509, 1], + [91508, 1], + [91507, 1], + [91506, 1], + [91505, 1], + [91504, 1], + [91503, 1], + [91502, 1], + [91501, 1], + [91500, 1], + [91499, 1], + [91498, 1], + [91497, 1], + [91496, 1], + [91495, 1], + [91494, 1], + [91493, 1], + [91492, 1], + [91491, 1], + [91490, 1], + [91489, 1], + [91488, 1], + [91487, 1], + [91486, 1], + [91485, 1], + [91484, 1], + [91483, 1], + [91482, 1], + [91481, 1], + [91480, 1], + [91479, 1], + [91478, 1], + [91477, 1], + [91476, 1], + [91475, 1], + [91474, 1], + [91473, 1], + [91472, 1], + [91471, 1], + [91470, 1], + [91469, 1], + [91468, 1], + [91467, 1], + [91466, 1], + [91465, 1], + [91464, 1], + [91463, 1], + [91462, 1], + [91461, 1], + [91460, 1], + [91459, 1], + [91458, 1], + [91457, 1], + [91456, 1], + [91455, 1], + [91454, 1], + [91453, 1], + [91452, 1], + [91451, 1], + [91450, 1], + [91449, 1], + [91448, 1], + [91447, 1], + [91446, 1], + [91445, 1], + [91444, 1], + [91443, 1], + [91442, 1], + [91441, 1], + [91440, 1], + [91439, 1], + [91438, 1], + [91437, 1], + [91436, 1], + [91435, 1], + [91434, 1], + [91433, 1], + [91432, 1], + [91431, 1], + [91430, 1], + [91429, 1], + [91428, 1], + [91427, 1], + [91426, 1], + [91425, 1], + [91424, 1], + [91423, 1], + [91422, 1], + [91421, 1], + [91420, 1], + [91419, 1], + [91418, 1], + [91417, 1], + [91416, 1], + [91415, 1], + [91414, 1], + [91413, 1], + [91412, 1], + [91411, 1], + [91410, 1], + [91409, 1], + [91408, 1], + [91407, 1], + [91406, 1], + [91405, 1], + [91404, 1], + [91403, 1], + [91402, 1], + [91401, 1], + [91400, 1], + [91399, 1], + [91398, 1], + [91397, 1], + [91396, 1], + [91395, 1], + [91394, 1], + [91393, 1], + [91392, 1], + [91391, 1], + [91390, 1], + [91389, 1], + [91388, 1], + [91387, 1], + [91386, 1], + [91385, 1], + [91384, 1], + [91383, 1], + [91382, 1], + [91381, 1], + [91380, 1], + [91379, 1], + [91378, 1], + [91377, 1], + [91376, 1], + [91375, 1], + [91374, 1], + [91373, 1], + [91372, 1], + [91371, 1], + [91370, 1], + [91369, 1], + [91368, 1], + [91367, 1], + [91366, 1], + [91365, 1], + [91364, 1], + [91363, 1], + [91362, 1], + [91361, 1], + [91360, 1], + [91359, 1], + [91358, 1], + [91357, 1], + [91356, 1], + [91355, 1], + [91354, 1], + [91353, 1], + [91352, 1], + [91351, 1], + [91350, 1], + [91349, 1], + [91348, 1], + [91347, 1], + [91346, 1], + [91345, 1], + [91344, 1], + [91343, 1], + [91342, 1], + [91341, 1], + [91340, 1], + [91339, 1], + [91338, 1], + [91337, 1], + [91336, 1], + [91335, 1], + [91334, 1], + [91333, 1], + [91332, 1], + [91331, 1], + [91330, 1], + [91329, 1], + [91328, 1], + [91327, 1], + [91326, 1], + [91325, 1], + [91324, 1], + [91323, 1], + [91322, 1], + [91321, 1], + [91320, 1], + [91319, 1], + [91318, 1], + [91317, 1], + [91316, 1], + [91315, 1], + [91314, 1], + [91313, 1], + [91312, 1], + [91311, 1], + [91310, 1], + [91309, 1], + [91308, 1], + [91307, 1], + [91306, 1], + [91305, 1], + [91304, 1], + [91303, 1], + [91302, 1], + [91301, 1], + [91300, 1], + [91299, 1], + [91298, 1], + [91297, 1], + [91296, 1], + [91295, 1], + [91294, 1], + [91293, 1], + [91292, 1], + [91291, 1], + [91290, 1], + [91289, 1], + [91288, 1], + [91287, 1], + [91286, 1], + [91285, 1], + [91284, 1], + [91283, 1], + [91282, 1], + [91281, 1], + [91280, 1], + [91279, 1], + [91278, 1], + [91277, 1], + [91276, 1], + [91275, 1], + [91274, 1], + [91273, 1], + [91272, 1], + [91271, 1], + [91270, 1], + [91269, 1], + [91268, 1], + [91267, 1], + [91266, 1], + [91265, 1], + [91264, 1], + [91263, 1], + [91262, 1], + [91261, 1], + [91260, 1], + [91259, 1], + [91258, 1], + [91257, 1], + [91256, 1], + [91255, 1], + [91254, 1], + [91253, 1], + [91252, 1], + [91251, 1], + [91250, 1], + [91249, 1], + [91248, 1], + [91247, 1], + [91246, 1], + [91245, 1], + [91244, 1], + [91243, 1], + [91242, 1], + [91241, 1], + [91240, 1], + [91239, 1], + [91238, 1], + [91237, 1], + [91236, 1], + [91235, 1], + [91234, 1], + [91233, 1], + [91232, 1], + [91231, 1], + [91230, 1], + [91229, 1], + [91228, 1], + [91227, 1], + [91226, 1], + [91225, 1], + [91224, 1], + [91223, 1], + [91222, 1], + [91221, 1], + [91220, 1], + [91219, 1], + [91218, 1], + [91217, 1], + [91216, 1], + [91215, 1], + [91214, 1], + [91213, 1], + [91212, 1], + [91211, 1], + [91210, 1], + [91209, 1], + [91208, 1], + [91207, 1], + [91206, 1], + [91205, 1], + [91204, 1], + [91203, 1], + [91202, 1], + [91201, 1], + [91200, 1], + [91199, 1], + [91198, 1], + [91197, 1], + [91196, 1], + [91195, 1], + [91194, 1], + [91193, 1], + [91192, 1], + [91191, 1], + [91190, 1], + [91189, 1], + [91188, 1], + [91187, 1], + [91186, 1], + [91185, 1], + [91184, 1], + [91183, 1], + [91182, 1], + [91181, 1], + [91180, 1], + [91179, 1], + [91178, 1], + [91177, 1], + [91176, 1], + [91175, 1], + [91174, 1], + [91173, 1], + [91172, 1], + [91171, 1], + [91170, 1], + [91169, 1], + [91168, 1], + [91167, 1], + [91166, 1], + [91165, 1], + [91164, 1], + [91163, 1], + [91162, 1], + [91161, 1], + [91160, 1], + [91159, 1], + [91158, 1], + [91157, 1], + [91156, 1], + [91155, 1], + [91154, 1], + [91153, 1], + [91152, 1], + [91151, 1], + [91150, 1], + [91149, 1], + [91148, 1], + [91147, 1], + [91146, 1], + [91145, 1], + [91144, 1], + [91143, 1], + [91142, 1], + [91141, 1], + [91140, 1], + [91139, 1], + [91138, 1], + [91137, 1], + [91136, 1], + [91135, 1], + [91134, 1], + [91133, 1], + [91132, 1], + [91131, 1], + [91130, 1], + [91129, 1], + [91128, 1], + [91127, 1], + [91126, 1], + [91125, 1], + [91124, 1], + [91123, 1], + [91122, 1], + [91121, 1], + [91120, 1], + [91119, 1], + [91118, 1], + [91117, 1], + [91116, 1], + [91115, 1], + [91114, 1], + [91113, 1], + [91112, 1], + [91111, 1], + [91110, 1], + [91109, 1], + [91108, 1], + [91107, 1], + [91106, 1], + [91105, 1], + [91104, 1], + [91103, 1], + [91102, 1], + [91101, 1], + [91100, 1], + [91099, 1], + [91098, 1], + [91097, 1], + [91096, 1], + [91095, 1], + [91094, 1], + [91093, 1], + [91092, 1], + [91091, 1], + [91090, 1], + [91089, 1], + [91088, 1], + [91087, 1], + [91086, 1], + [91085, 1], + [91084, 1], + [91083, 1], + [91082, 1], + [91081, 1], + [91080, 1], + [91079, 1], + [91078, 1], + [91077, 1], + [91076, 1], + [91075, 1], + [91074, 1], + [91073, 1], + [91072, 1], + [91071, 1], + [91070, 1], + [91069, 1], + [91068, 1], + [91067, 1], + [91066, 1], + [91065, 1], + [91064, 1], + [91063, 1], + [91062, 1], + [91061, 1], + [91060, 1], + [91059, 1], + [91058, 1], + [91057, 1], + [91056, 1], + [91055, 1], + [91054, 1], + [91053, 1], + [91052, 1], + [91051, 1], + [91050, 1], + [91049, 1], + [91048, 1], + [91047, 1], + [91046, 1], + [91045, 1], + [91044, 1], + [91043, 1], + [91042, 1], + [91041, 1], + [91040, 1], + [91039, 1], + [91038, 1], + [91037, 1], + [91036, 1], + [91035, 1], + [91034, 1], + [91033, 1], + [91032, 1], + [91031, 1], + [91030, 1], + [91029, 1], + [91028, 1], + [91027, 1], + [91026, 1], + [91025, 1], + [91024, 1], + [91023, 1], + [91022, 1], + [91021, 1], + [91020, 1], + [91019, 1], + [91018, 1], + [91017, 1], + [91016, 1], + [91015, 1], + [91014, 1], + [91013, 1], + [91012, 1], + [91011, 1], + [91010, 1], + [91009, 1], + [91008, 1], + [91007, 1], + [91006, 1], + [91005, 1], + [91004, 1], + [91003, 1], + [91002, 1], + [91001, 1], + [91000, 1], + [90999, 1], + [90998, 1], + [90997, 1], + [90996, 1], + [90995, 1], + [90994, 1], + [90993, 1], + [90992, 1], + [90991, 1], + [90990, 1], + [90989, 1], + [90988, 1], + [90988, 0, "\n"], + [91005, 1], + [91004, 1], + [91003, 1], + [91002, 1], + [91001, 1], + [91000, 1], + [90999, 1], + [90998, 1], + [90997, 1], + [90996, 1], + [90995, 1], + [90995, 0, " "], + [90996, 0, "i"], + [90997, 0, "n"], + [90998, 0, "c"], + [90999, 0, "l"], + [91000, 0, "u"], + [91001, 0, "d"], + [91002, 0, "e"], + [91003, 0, " "], + [91003, 1], + [91003, 0, "a"], + [91004, 0, "p"], + [91005, 0, "p"], + [91006, 0, "e"], + [91007, 0, "n"], + [91008, 0, "d"], + [91009, 0, "i"], + [91010, 0, "x"], + [640, 1], + [639, 1], + [638, 1], + [637, 1], + [636, 1], + [635, 1], + [634, 1], + [633, 1], + [632, 1], + [631, 1], + [631, 0, "i"], + [632, 0, "n"], + [633, 0, "c"], + [634, 0, "l"], + [635, 0, "u"], + [636, 0, "d"], + [637, 0, "e"], + [638, 0, "a"], + [639, 0, "p"], + [640, 0, "p"], + [641, 0, "e"], + [642, 0, "n"], + [643, 0, "d"], + [644, 0, "i"], + [645, 0, "x"], + [657, 1], + [656, 1], + [655, 1], + [654, 1], + [653, 1], + [652, 1], + [651, 1], + [650, 1], + [649, 1], + [648, 1], + [648, 0, "i"], + [649, 0, "n"], + [650, 0, "c"], + [651, 0, "l"], + [652, 0, "u"], + [653, 0, "d"], + [654, 0, "e"], + [655, 0, "a"], + [656, 0, "p"], + [657, 0, "p"], + [658, 0, "e"], + [659, 0, "n"], + [660, 0, "d"], + [661, 0, "i"], + [662, 0, "x"], + [74837, 1], + [74836, 1], + [74835, 1], + [74834, 1], + [74833, 1], + [74832, 1], + [74831, 1], + [74830, 1], + [74829, 1], + [74828, 1], + [74828, 0, "i"], + [74829, 0, "n"], + [74830, 0, "c"], + [74831, 0, "l"], + [74832, 0, "u"], + [74833, 0, "d"], + [74834, 0, "e"], + [74835, 0, "a"], + [74836, 0, "p"], + [74837, 0, "p"], + [74838, 0, "e"], + [74839, 0, "n"], + [74840, 0, "d"], + [74841, 0, "i"], + [74842, 0, "x"], + [90927, 0, "I"], + [90928, 0, "n"], + [90929, 0, " "], + [90930, 0, "a"], + [90931, 0, " "], + [90932, 0, "h"], + [90933, 0, "i"], + [90934, 0, "s"], + [90935, 0, "t"], + [90936, 0, "o"], + [90937, 0, "r"], + [90938, 0, "y"], + [90939, 0, " "], + [90940, 0, "$"], + [90941, 0, "H"], + [90942, 0, "$"], + [90943, 0, ","], + [90944, 0, " "], + [90945, 0, "a"], + [90946, 0, "n"], + [90947, 0, " "], + [90948, 1], + [90948, 0, "a"], + [90958, 0, " "], + [90959, 0, "o"], + [90960, 0, "p"], + [90961, 0, "e"], + [90962, 0, "r"], + [90963, 0, "a"], + [90964, 0, "t"], + [90965, 0, "i"], + [90966, 0, "o"], + [90967, 0, "n"], + [91034, 0, "\n"], + [91035, 0, "\n"], + [91036, 0, "\\"], + [91037, 0, "b"], + [91038, 0, "e"], + [91039, 0, "g"], + [91040, 0, "i"], + [91041, 0, "n"], + [91042, 0, "{"], + [91043, 0, "p"], + [91044, 0, "r"], + [91045, 0, "o"], + [91046, 0, "o"], + [91047, 0, "f"], + [91048, 0, "}"], + [91049, 0, "\n"], + [91050, 0, "\\"], + [91051, 0, "e"], + [91052, 0, "n"], + [91053, 0, "d"], + [91054, 0, "{"], + [91055, 0, "p"], + [91056, 0, "r"], + [91057, 0, "o"], + [91058, 0, "o"], + [91059, 0, "f"], + [91060, 0, "}"], + [91049, 0, "\n"], + [91050, 0, "G"], + [91051, 0, "i"], + [91052, 0, "v"], + [91053, 0, "e"], + [91054, 0, "n"], + [91055, 0, " "], + [91056, 0, "a"], + [91057, 0, "n"], + [91058, 0, " "], + [91059, 0, "a"], + [91060, 0, "s"], + [91061, 0, "s"], + [91062, 0, "i"], + [91063, 0, "g"], + [91064, 0, "n"], + [91065, 0, "m"], + [91066, 0, "e"], + [91067, 0, "n"], + [91068, 0, "t"], + [91069, 0, " "], + [91070, 0, "$"], + [91071, 0, "o"], + [91072, 0, "_"], + [91073, 0, "a"], + [91074, 0, "$"], + [91075, 0, " "], + [91076, 0, "a"], + [91077, 0, "n"], + [91078, 0, "d"], + [91079, 0, " "], + [91080, 0, "a"], + [91081, 0, "n"], + [91082, 0, "y"], + [91083, 0, " "], + [91084, 0, "o"], + [91085, 0, "t"], + [91086, 0, "h"], + [91087, 0, "e"], + [91088, 0, "r"], + [91089, 0, " "], + [91090, 0, "c"], + [91091, 0, "o"], + [91092, 0, "n"], + [91093, 0, "c"], + [91094, 0, "u"], + [91095, 0, "r"], + [91096, 0, "r"], + [91097, 0, "e"], + [91098, 0, "n"], + [91099, 0, "t"], + [91100, 0, " "], + [91101, 0, "o"], + [91102, 0, "p"], + [91103, 0, "e"], + [91104, 0, "r"], + [91105, 0, "a"], + [91106, 0, "t"], + [91107, 0, "i"], + [91108, 0, "o"], + [91109, 0, "n"], + [91110, 0, " "], + [91111, 0, "$"], + [91112, 0, "o"], + [91113, 0, "_"], + [91114, 0, "c"], + [91115, 0, "$"], + [91116, 0, ","], + [91117, 0, " "], + [91118, 0, "w"], + [91119, 0, "e"], + [91120, 0, " "], + [91121, 0, "m"], + [91122, 0, "u"], + [91123, 0, "s"], + [91124, 0, "t"], + [91125, 0, " "], + [91126, 0, "s"], + [91127, 0, "h"], + [91128, 0, "o"], + [91129, 0, "w"], + [91130, 0, " "], + [91131, 0, "t"], + [91132, 0, "h"], + [91133, 0, "a"], + [91134, 0, "t"], + [91135, 0, " "], + [91136, 0, "t"], + [91137, 0, "h"], + [91138, 0, "e"], + [91139, 0, " "], + [91140, 0, "d"], + [91141, 0, "o"], + [91142, 0, "c"], + [91143, 0, "u"], + [91144, 0, "m"], + [91145, 0, "e"], + [91146, 0, "n"], + [91147, 0, "t"], + [91148, 0, " "], + [91149, 0, "s"], + [91150, 0, "t"], + [91151, 0, "a"], + [91152, 0, "t"], + [91153, 0, "e"], + [91154, 0, " "], + [91155, 0, "a"], + [91156, 0, "f"], + [91157, 0, "t"], + [91158, 0, "e"], + [91159, 0, "r"], + [91160, 0, " "], + [91161, 0, "a"], + [91162, 0, "p"], + [91163, 0, "p"], + [91164, 0, "l"], + [91165, 0, "y"], + [91166, 0, "i"], + [91167, 0, "n"], + [91168, 0, "g"], + [91169, 0, " "], + [91170, 0, "b"], + [91171, 0, "o"], + [91172, 0, "t"], + [91173, 0, "h"], + [91174, 0, " "], + [91175, 0, "o"], + [91176, 0, "p"], + [91177, 0, "e"], + [91178, 0, "r"], + [91179, 0, "a"], + [91180, 0, "t"], + [91181, 0, "i"], + [91182, 0, "o"], + [91183, 0, "n"], + [91184, 0, "s"], + [91185, 0, " "], + [91186, 0, "d"], + [91187, 0, "o"], + [91188, 0, "e"], + [91189, 0, "s"], + [91190, 0, " "], + [91191, 0, "n"], + [91192, 0, "o"], + [91193, 0, "t"], + [91194, 0, " "], + [91195, 0, "d"], + [91196, 0, "e"], + [91197, 0, "p"], + [91198, 0, "e"], + [91199, 0, "n"], + [91200, 0, "d"], + [91201, 0, " "], + [91202, 0, "o"], + [91203, 0, "n"], + [91204, 0, " "], + [91205, 0, "t"], + [91206, 0, "h"], + [91207, 0, "e"], + [91208, 0, " "], + [91209, 0, "o"], + [91210, 0, "r"], + [91211, 0, "d"], + [91212, 0, "e"], + [91213, 0, "r"], + [91214, 0, " "], + [91215, 0, "i"], + [91216, 0, "n"], + [91217, 0, " "], + [91218, 0, "w"], + [91219, 0, "h"], + [91220, 0, "i"], + [91221, 0, "c"], + [91222, 0, "h"], + [91223, 0, " "], + [91224, 0, "o"], + [91224, 1], + [91224, 0, "$"], + [91225, 0, "o"], + [91226, 0, "_"], + [91227, 0, "a"], + [91228, 0, "$"], + [91229, 0, " "], + [91230, 0, "a"], + [91231, 0, "n"], + [91232, 0, "d"], + [91233, 0, " "], + [91234, 0, "$"], + [91235, 0, "o"], + [91236, 0, "_"], + [91237, 0, "c"], + [91238, 0, "$"], + [91239, 0, " "], + [91240, 0, "w"], + [91241, 0, "e"], + [91242, 0, "r"], + [91243, 0, "e"], + [91244, 0, " "], + [91245, 0, "a"], + [91246, 0, "p"], + [91247, 0, "p"], + [91248, 0, "l"], + [91249, 0, "i"], + [91250, 0, "e"], + [91251, 0, "d"], + [91252, 0, "."], + [91253, 0, "\n"], + [91254, 0, "\n"], + [91255, 0, "T"], + [91256, 0, "h"], + [91257, 0, "e"], + [91258, 0, " "], + [91259, 0, "r"], + [91260, 0, "u"], + [91261, 0, "l"], + [91262, 0, "e"], + [91263, 0, "s"], + [91264, 0, " "], + [91265, 0, "\\"], + [91266, 0, "t"], + [91267, 0, "e"], + [91268, 0, "x"], + [91269, 0, "t"], + [91270, 0, "s"], + [91271, 0, "c"], + [91272, 0, "{"], + [91273, 0, "A"], + [91274, 0, "s"], + [91275, 0, "s"], + [91276, 0, "i"], + [91277, 0, "g"], + [91278, 0, "n"], + [91279, 0, "}"], + [91280, 0, ","], + [91281, 0, " "], + [91282, 0, "\\"], + [91283, 0, "t"], + [91284, 0, "e"], + [91285, 0, "x"], + [91286, 0, "t"], + [91287, 0, "s"], + [91288, 0, "c"], + [91289, 0, "{"], + [91290, 0, "E"], + [91291, 0, "m"], + [91292, 0, "p"], + [91293, 0, "t"], + [91294, 0, "y"], + [91295, 0, "-"], + [91296, 0, "M"], + [91297, 0, "a"], + [91298, 0, "p"], + [91299, 0, "}"], + [91300, 0, " "], + [91301, 0, "a"], + [91302, 0, "n"], + [91303, 0, "d"], + [91304, 0, " "], + [91305, 0, "\\"], + [91306, 0, "t"], + [91307, 0, "e"], + [91308, 0, "x"], + [91309, 0, "t"], + [91310, 0, "s"], + [91311, 0, "c"], + [91312, 0, "{"], + [91313, 0, "E"], + [91314, 0, "m"], + [91315, 0, "p"], + [91316, 0, "t"], + [91317, 0, "y"], + [91318, 0, "-"], + [91319, 0, "L"], + [91320, 0, "i"], + [91321, 0, "s"], + [91322, 0, "t"], + [91323, 0, "}"], + [91324, 0, " "], + [91325, 0, "d"], + [91326, 0, "e"], + [91327, 0, "f"], + [91328, 0, "i"], + [91329, 0, "n"], + [91330, 0, "e"], + [91331, 0, " "], + [91332, 0, "h"], + [91333, 0, "o"], + [91334, 0, "w"], + [91335, 0, " "], + [91336, 0, "a"], + [91337, 0, "n"], + [91338, 0, " "], + [91339, 0, "a"], + [91340, 0, "s"], + [91341, 0, "s"], + [91342, 0, "i"], + [91343, 0, "g"], + [91344, 0, "n"], + [91345, 0, "m"], + [91346, 0, "e"], + [91347, 0, "n"], + [91348, 0, "t"], + [91349, 0, " "], + [91350, 0, "o"], + [91351, 0, "p"], + [91352, 0, "e"], + [91353, 0, "r"], + [91354, 0, "a"], + [91355, 0, "t"], + [91356, 0, "i"], + [91357, 0, "o"], + [91358, 0, "n"], + [91359, 0, " "], + [91360, 0, "$"], + [91361, 0, "o"], + [91362, 0, "_"], + [91363, 0, "a"], + [91364, 0, "$"], + [91365, 0, " "], + [91366, 0, "i"], + [91367, 0, "s"], + [91368, 0, " "], + [91369, 0, "a"], + [91370, 0, "p"], + [91371, 0, "p"], + [91372, 0, "l"], + [91373, 0, "i"], + [91374, 0, "e"], + [91375, 0, "d"], + [91376, 0, ","], + [91377, 0, " "], + [91378, 0, "d"], + [91379, 0, "e"], + [91380, 0, "p"], + [91381, 0, "e"], + [91382, 0, "n"], + [91383, 0, "d"], + [91384, 0, "i"], + [91385, 0, "n"], + [91386, 0, "g"], + [91387, 0, " "], + [91388, 0, "o"], + [91389, 0, "n"], + [91390, 0, " "], + [91391, 0, "t"], + [91392, 0, "h"], + [91393, 0, "e"], + [91394, 0, " "], + [91395, 0, "v"], + [91396, 0, "a"], + [91397, 0, "l"], + [91398, 0, "u"], + [91399, 0, "e"], + [91400, 0, " "], + [91401, 0, "b"], + [91402, 0, "e"], + [91403, 0, "i"], + [91404, 0, "n"], + [91405, 0, "g"], + [91406, 0, " "], + [91407, 0, "a"], + [91408, 0, "s"], + [91409, 0, "s"], + [91410, 0, "i"], + [91411, 0, "g"], + [91412, 0, "n"], + [91413, 0, "e"], + [91414, 0, "d"], + [91415, 0, "."], + [91416, 0, " "], + [91417, 0, "A"], + [91418, 0, "l"], + [91419, 0, "l"], + [91420, 0, " "], + [91421, 0, "t"], + [91422, 0, "h"], + [91423, 0, "r"], + [91424, 0, "e"], + [91425, 0, "e"], + [91426, 0, " "], + [91427, 0, "r"], + [91428, 0, "u"], + [91429, 0, "l"], + [91430, 0, "e"], + [91431, 0, "s"], + [91432, 0, " "], + [91433, 0, "f"], + [91434, 0, "i"], + [91435, 0, "r"], + [91436, 0, "s"], + [91437, 0, "t"], + [91438, 0, " "], + [91439, 0, "c"], + [91440, 0, "l"], + [91441, 0, "e"], + [91442, 0, "a"], + [91443, 0, "r"], + [91444, 0, " "], + [91445, 0, "a"], + [91446, 0, "n"], + [91447, 0, "y"], + [91448, 0, " "], + [91449, 0, "c"], + [91450, 0, "a"], + [91451, 0, "u"], + [91452, 0, "s"], + [91453, 0, "a"], + [91454, 0, "l"], + [91455, 0, "l"], + [91456, 0, "y"], + [91457, 0, " "], + [91458, 0, "p"], + [91459, 0, "r"], + [91460, 0, "i"], + [91461, 0, "o"], + [91462, 0, "r"], + [91463, 0, " "], + [91464, 0, "s"], + [91465, 0, "t"], + [91466, 0, "a"], + [91467, 0, "t"], + [91468, 0, "e"], + [91469, 0, " "], + [91470, 0, "f"], + [91471, 0, "r"], + [91472, 0, "o"], + [91473, 0, "m"], + [91474, 0, " "], + [91475, 0, "t"], + [91476, 0, "h"], + [91477, 0, "e"], + [91478, 0, " "], + [91479, 0, "c"], + [91480, 0, "u"], + [91481, 0, "r"], + [91482, 0, "s"], + [91483, 0, "o"], + [91484, 0, "r"], + [91485, 0, " "], + [91486, 0, "a"], + [91487, 0, "t"], + [91488, 0, " "], + [91489, 0, "w"], + [91490, 0, "h"], + [91491, 0, "i"], + [91492, 0, "c"], + [91493, 0, "h"], + [91494, 0, " "], + [91495, 0, "t"], + [91496, 0, "h"], + [91497, 0, "e"], + [91498, 0, " "], + [91499, 0, "a"], + [91500, 0, "s"], + [91501, 0, "s"], + [91502, 0, "i"], + [91503, 0, "g"], + [91504, 0, "n"], + [91505, 0, "m"], + [91506, 0, "e"], + [91507, 0, "n"], + [91508, 0, "t"], + [91509, 0, " "], + [91510, 0, "i"], + [91511, 0, "s"], + [91512, 0, " "], + [91513, 0, "o"], + [91514, 0, "c"], + [91515, 0, "c"], + [91516, 0, "u"], + [91517, 0, "r"], + [91518, 0, "r"], + [91519, 0, "i"], + [91520, 0, "n"], + [91521, 0, "g"], + [91522, 0, ";"], + [91523, 0, " "], + [91524, 0, "b"], + [91525, 0, "y"], + [91526, 0, " "], + [91527, 0, "L"], + [91528, 0, "e"], + [91529, 0, "m"], + [91530, 0, "m"], + [91531, 0, "a"], + [91532, 0, "~"], + [91533, 0, "\\"], + [91534, 0, "r"], + [91535, 0, "e"], + [91536, 0, "f"], + [91537, 0, "{"], + [91538, 0, "l"], + [91539, 0, "e"], + [91540, 0, "m"], + [91541, 0, ":"], + [91542, 0, "d"], + [91543, 0, "e"], + [91544, 0, "l"], + [91545, 0, "e"], + [91546, 0, "t"], + [91547, 0, "e"], + [91548, 0, "-"], + [91549, 0, "c"], + [91550, 0, "o"], + [91551, 0, "m"], + [91552, 0, "m"], + [91553, 0, "u"], + [91554, 0, "t"], + [91555, 0, "e"], + [91556, 0, "}"], + [91557, 0, ","], + [91558, 0, " "], + [91559, 0, "t"], + [91560, 0, "h"], + [91561, 0, "i"], + [91562, 0, "s"], + [91563, 0, " "], + [91564, 0, "c"], + [91565, 0, "l"], + [91566, 0, "e"], + [91567, 0, "a"], + [91568, 0, "r"], + [91569, 0, "i"], + [91570, 0, "n"], + [91571, 0, "g"], + [91572, 0, " "], + [91573, 0, "o"], + [91574, 0, "p"], + [91575, 0, "e"], + [91576, 0, "r"], + [91577, 0, "a"], + [91578, 0, "t"], + [91579, 0, "i"], + [91580, 0, "o"], + [91581, 0, "n"], + [91582, 0, " "], + [91583, 0, "i"], + [91584, 0, "s"], + [91585, 0, " "], + [91586, 0, "c"], + [91587, 0, "o"], + [91588, 0, "m"], + [91589, 0, "m"], + [91590, 0, "u"], + [91591, 0, "t"], + [91592, 0, "a"], + [91593, 0, "t"], + [91594, 0, "i"], + [91595, 0, "v"], + [91596, 0, "e"], + [91597, 0, " "], + [91598, 0, "w"], + [91599, 0, "i"], + [91600, 0, "t"], + [91601, 0, "h"], + [91602, 0, " "], + [91603, 0, "c"], + [91604, 0, "o"], + [91605, 0, "n"], + [91606, 0, "c"], + [91607, 0, "u"], + [91608, 0, "r"], + [91609, 0, "r"], + [91610, 0, "e"], + [91611, 0, "n"], + [91612, 0, "t"], + [91613, 0, " "], + [91614, 0, "o"], + [91615, 0, "p"], + [91616, 0, "e"], + [91617, 0, "r"], + [91618, 0, "a"], + [91619, 0, "t"], + [91620, 0, "i"], + [91621, 0, "o"], + [91622, 0, "n"], + [91623, 0, "s"], + [91624, 0, ","], + [91625, 0, " "], + [91626, 0, "a"], + [91627, 0, "n"], + [91628, 0, "d"], + [91629, 0, " "], + [91630, 0, "l"], + [91631, 0, "e"], + [91632, 0, "a"], + [91633, 0, "v"], + [91634, 0, "e"], + [91635, 0, "s"], + [91636, 0, " "], + [91637, 0, "u"], + [91638, 0, "p"], + [91639, 0, "d"], + [91640, 0, "a"], + [91641, 0, "t"], + [91642, 0, "e"], + [91643, 0, "s"], + [91644, 0, " "], + [91645, 0, "b"], + [91646, 0, "y"], + [91647, 0, " "], + [91648, 0, "c"], + [91649, 0, "o"], + [91650, 0, "n"], + [91651, 0, "c"], + [91652, 0, "u"], + [91653, 0, "r"], + [91654, 0, "r"], + [91655, 0, "e"], + [91656, 0, "n"], + [91657, 0, "t"], + [91658, 0, " "], + [91659, 0, "o"], + [91660, 0, "p"], + [91661, 0, "e"], + [91662, 0, "r"], + [91663, 0, "a"], + [91664, 0, "t"], + [91665, 0, "i"], + [91666, 0, "o"], + [91667, 0, "n"], + [91668, 0, "s"], + [91669, 0, " "], + [91670, 0, "u"], + [91671, 0, "n"], + [91672, 0, "t"], + [91673, 0, "o"], + [91674, 0, "u"], + [91675, 0, "c"], + [91676, 0, "h"], + [91677, 0, "e"], + [91678, 0, "d"], + [91679, 0, "."], + [91681, 0, "\n"], + [91681, 0, "\n"], + [33674, 1], + [33674, 0, "B"], + [33675, 0, "i"], + [33647, 0, "\n"], + [33648, 0, "\\"], + [33649, 0, "A"], + [33650, 0, "x"], + [33651, 0, "i"], + [33652, 0, "o"], + [33653, 0, "m"], + [33654, 0, "C"], + [33655, 0, "{"], + [33656, 0, "$"], + [33657, 0, "k"], + [33658, 0, "_"], + [33659, 0, "n"], + [33660, 0, " "], + [33661, 0, "\\"], + [33662, 0, "n"], + [33663, 0, "o"], + [33664, 0, "t"], + [33665, 0, "="], + [33666, 0, " "], + [33667, 0, "\\"], + [33668, 0, "m"], + [33669, 0, "a"], + [33670, 0, "t"], + [33671, 0, "h"], + [33672, 0, "s"], + [33673, 0, "f"], + [33674, 0, "{"], + [33675, 0, "h"], + [33676, 0, "e"], + [33677, 0, "a"], + [33678, 0, "d"], + [33679, 0, "}"], + [33680, 0, "$"], + [33681, 0, "}"], + [91718, 0, "T"], + [91719, 0, "h"], + [91720, 0, "e"], + [91721, 0, " "], + [91722, 0, "r"], + [91723, 0, "u"], + [91724, 0, "l"], + [91725, 0, "e"], + [91726, 0, "s"], + [91727, 0, " "], + [91728, 0, "a"], + [91729, 0, "l"], + [91730, 0, "s"], + [91731, 0, "o"], + [91732, 0, " "], + [91733, 0, "a"], + [91734, 0, "d"], + [91735, 0, "d"], + [91736, 0, " "], + [91737, 0, "$"], + [91738, 0, "o"], + [91739, 0, "_"], + [91740, 0, "a"], + [91741, 0, "."], + [91742, 0, "\\"], + [91743, 0, "m"], + [91744, 0, "a"], + [91745, 0, "t"], + [91746, 0, "h"], + [91747, 0, "i"], + [91748, 0, "t"], + [91749, 0, "{"], + [91750, 0, "i"], + [91751, 0, "d"], + [91752, 0, "}"], + [91753, 0, "$"], + [91754, 0, " "], + [91755, 0, "t"], + [91756, 0, "o"], + [91757, 0, " "], + [91758, 0, "t"], + [91759, 0, "h"], + [91760, 0, "e"], + [91761, 0, " "], + [91762, 0, "p"], + [91763, 0, "r"], + [91764, 0, "e"], + [91765, 0, "s"], + [91766, 0, "e"], + [91767, 0, "n"], + [91768, 0, "c"], + [91769, 0, "e"], + [91770, 0, " "], + [91771, 0, "s"], + [91772, 0, "e"], + [91773, 0, "t"], + [91774, 0, " "], + [91775, 0, "i"], + [91776, 0, "d"], + [91777, 0, "e"], + [91778, 0, "n"], + [91779, 0, "t"], + [91780, 0, "i"], + [91781, 0, "f"], + [91782, 0, "i"], + [91783, 0, "e"], + [91784, 0, "d"], + [91785, 0, " "], + [91786, 0, "b"], + [91787, 0, "y"], + [91788, 0, " "], + [91789, 0, "t"], + [91790, 0, "h"], + [91791, 0, "e"], + [91792, 0, " "], + [91793, 0, "c"], + [91794, 0, "u"], + [91795, 0, "r"], + [91796, 0, "s"], + [91797, 0, "o"], + [91798, 0, "r"], + [91799, 0, ","], + [91800, 0, " "], + [91801, 0, "a"], + [91802, 0, "n"], + [91803, 0, "d"], + [91804, 0, " "], + [91805, 0, "\\"], + [91806, 0, "t"], + [91807, 0, "e"], + [91808, 0, "x"], + [91809, 0, "t"], + [91810, 0, "s"], + [91811, 0, "c"], + [91812, 0, "{"], + [91813, 0, "D"], + [91814, 0, "e"], + [91815, 0, "s"], + [91816, 0, "c"], + [91817, 0, "e"], + [91818, 0, "n"], + [91819, 0, "d"], + [91820, 0, "}"], + [91821, 0, " "], + [91822, 0, "a"], + [91823, 0, "d"], + [91824, 0, "d"], + [91825, 0, "s"], + [91826, 0, " "], + [91827, 0, "$"], + [91828, 0, "o"], + [91829, 0, "_"], + [91830, 0, "a"], + [91831, 0, "."], + [91832, 0, "\\"], + [91833, 0, "m"], + [91834, 0, "a"], + [91835, 0, "t"], + [91836, 0, "h"], + [91837, 0, "i"], + [91838, 0, "t"], + [91839, 0, "{"], + [91840, 0, "i"], + [91841, 0, "d"], + [91842, 0, "}"], + [91843, 0, "$"], + [91844, 0, " "], + [91845, 0, "t"], + [91846, 0, "o"], + [91847, 0, " "], + [91848, 0, "t"], + [91849, 0, "h"], + [91850, 0, "e"], + [91851, 0, " "], + [91852, 0, "p"], + [91853, 0, "r"], + [91854, 0, "e"], + [91855, 0, "s"], + [91856, 0, "e"], + [91857, 0, "n"], + [91858, 0, "c"], + [91859, 0, "e"], + [91860, 0, " "], + [91861, 0, "s"], + [91862, 0, "e"], + [91863, 0, "t"], + [91864, 0, "s"], + [91865, 0, " "], + [91866, 0, "a"], + [91867, 0, "l"], + [91867, 1], + [91866, 1], + [91866, 0, "o"], + [91867, 0, "n"], + [91868, 0, " "], + [91869, 0, "t"], + [91870, 0, "h"], + [91871, 0, "e"], + [91872, 0, " "], + [91873, 0, "p"], + [91874, 0, "a"], + [91875, 0, "t"], + [91876, 0, "h"], + [91877, 0, " "], + [91878, 0, "f"], + [91879, 0, "r"], + [91880, 0, "o"], + [91881, 0, "m"], + [91882, 0, " "], + [91883, 0, "t"], + [91884, 0, "h"], + [91885, 0, "e"], + [91886, 0, " "], + [91887, 0, "r"], + [91888, 0, "o"], + [91889, 0, "o"], + [91890, 0, "t"], + [91891, 0, " "], + [91892, 0, "o"], + [91893, 0, "f"], + [91894, 0, " "], + [91895, 0, "t"], + [91896, 0, "h"], + [91897, 0, "e"], + [91898, 0, " "], + [91899, 0, "d"], + [91900, 0, "o"], + [91901, 0, "c"], + [91902, 0, "u"], + [91903, 0, "m"], + [91904, 0, "e"], + [91905, 0, "n"], + [91906, 0, "t"], + [91907, 0, " "], + [91908, 0, "t"], + [91909, 0, "r"], + [91910, 0, "e"], + [91911, 0, "e"], + [91912, 0, " "], + [91913, 0, "d"], + [91914, 0, "e"], + [91915, 0, "s"], + [91916, 0, "c"], + [91917, 0, "r"], + [91918, 0, "i"], + [91919, 0, "b"], + [91920, 0, "e"], + [91921, 0, "d"], + [91922, 0, " "], + [91923, 0, "b"], + [91924, 0, "y"], + [91925, 0, " "], + [91926, 0, "t"], + [91927, 0, "h"], + [91928, 0, "e"], + [91929, 0, " "], + [91930, 0, "c"], + [91931, 0, "u"], + [91932, 0, "r"], + [91933, 0, "s"], + [91934, 0, "o"], + [91935, 0, "r"], + [91936, 0, "."], + [91937, 0, " "], + [91938, 0, "T"], + [91939, 0, "h"], + [91940, 0, "e"], + [91941, 0, "s"], + [91942, 0, "e"], + [91943, 0, " "], + [91944, 0, "s"], + [91945, 0, "t"], + [91946, 0, "a"], + [91947, 0, "t"], + [91948, 0, "e"], + [91949, 0, " "], + [91950, 0, "c"], + [91951, 0, "h"], + [91952, 0, "a"], + [91953, 0, "n"], + [91954, 0, "g"], + [91955, 0, "e"], + [91956, 0, "s"], + [91957, 0, " "], + [91958, 0, "a"], + [91959, 0, "r"], + [91960, 0, "e"], + [91961, 0, " "], + [91962, 0, "a"], + [91963, 0, "p"], + [91964, 0, "p"], + [91965, 0, "l"], + [91966, 0, "i"], + [91967, 0, "e"], + [91968, 0, "d"], + [91969, 0, " "], + [91970, 0, "u"], + [91971, 0, "s"], + [91972, 0, "i"], + [91973, 0, "n"], + [91974, 0, "g"], + [91975, 0, " "], + [91976, 0, "t"], + [91977, 0, "h"], + [91978, 0, "e"], + [91979, 0, " "], + [91980, 0, "s"], + [91981, 0, "e"], + [91982, 0, "t"], + [91983, 0, " "], + [91984, 0, "u"], + [91985, 0, "n"], + [91986, 0, "i"], + [91987, 0, "o"], + [91988, 0, "n"], + [91989, 0, " "], + [91990, 0, "o"], + [91991, 0, "p"], + [91992, 0, "e"], + [91993, 0, "r"], + [91994, 0, "a"], + [91995, 0, "t"], + [91996, 0, "o"], + [91997, 0, "r"], + [91998, 0, " "], + [91999, 0, "$"], + [92000, 0, "\\"], + [92001, 0, "c"], + [92002, 0, "u"], + [92003, 0, "p"], + [92004, 0, "$"], + [92005, 0, ","], + [92006, 0, " "], + [92007, 0, "w"], + [92008, 0, "h"], + [92009, 0, "i"], + [92010, 0, "c"], + [92011, 0, "h"], + [92012, 0, " "], + [92013, 0, "i"], + [92014, 0, "s"], + [92015, 0, " "], + [92016, 0, "c"], + [92017, 0, "o"], + [92018, 0, "m"], + [92019, 0, "m"], + [92020, 0, "u"], + [92021, 0, "t"], + [92022, 0, "a"], + [92023, 0, "t"], + [92024, 0, "i"], + [92025, 0, "v"], + [92026, 0, "e"], + [92027, 0, "."], + [92028, 0, "\n"], + [92029, 0, "\n"], + [92030, 0, "F"], + [92031, 0, "i"], + [92032, 0, "n"], + [92033, 0, "a"], + [92034, 0, "l"], + [92035, 0, "l"], + [92036, 0, "y"], + [92037, 0, " "], + [92037, 1], + [92037, 0, ","], + [92038, 0, " "], + [92039, 0, "i"], + [92040, 0, "n"], + [92041, 0, " "], + [92042, 0, "t"], + [92043, 0, "h"], + [92044, 0, "e"], + [92045, 0, " "], + [92046, 0, "c"], + [92047, 0, "a"], + [92048, 0, "s"], + [92049, 0, "e"], + [92050, 0, " "], + [92051, 0, "w"], + [92052, 0, "h"], + [92053, 0, "e"], + [92054, 0, "r"], + [92055, 0, "e"], + [92056, 0, " "], + [92057, 0, "t"], + [92058, 0, "h"], + [92059, 0, "e"], + [92060, 0, " "], + [92061, 0, "a"], + [92062, 0, "s"], + [92063, 0, "s"], + [92064, 0, "i"], + [92065, 0, "g"], + [92066, 0, "n"], + [92067, 0, "e"], + [92068, 0, "d"], + [92069, 0, " "], + [92070, 0, "v"], + [92071, 0, "a"], + [92072, 0, "l"], + [92073, 0, "u"], + [92074, 0, "e"], + [92075, 0, " "], + [92076, 0, "i"], + [92077, 0, "s"], + [92078, 0, " "], + [92079, 0, "a"], + [92080, 0, " "], + [92081, 0, "p"], + [92082, 0, "r"], + [92083, 0, "i"], + [92084, 0, "m"], + [92085, 0, "i"], + [92086, 0, "t"], + [92087, 0, "i"], + [92088, 0, "v"], + [92089, 0, "e"], + [92090, 0, " "], + [92091, 0, "a"], + [92092, 0, "n"], + [92093, 0, "d"], + [92094, 0, " "], + [92095, 0, "t"], + [92096, 0, "h"], + [92097, 0, "e"], + [92098, 0, " "], + [92099, 0, "\\"], + [92100, 0, "t"], + [92101, 0, "e"], + [92102, 0, "x"], + [92103, 0, "t"], + [92104, 0, "s"], + [92105, 0, "c"], + [92106, 0, "{"], + [92107, 0, "A"], + [92108, 0, "s"], + [92109, 0, "s"], + [92110, 0, "i"], + [92111, 0, "g"], + [92112, 0, "n"], + [92113, 0, "}"], + [92114, 0, " "], + [92115, 0, "r"], + [92116, 0, "u"], + [92117, 0, "l"], + [92118, 0, "e"], + [92119, 0, " "], + [92120, 0, "a"], + [92121, 0, "p"], + [92122, 0, "p"], + [92123, 0, "l"], + [92124, 0, "i"], + [92125, 0, "e"], + [92126, 0, "s"], + [92056, 0, " "], + [92057, 0, "v"], + [92058, 0, "a"], + [92059, 0, "l"], + [92060, 0, "u"], + [92061, 0, "e"], + [92062, 0, " "], + [92063, 0, "a"], + [92064, 0, "s"], + [92065, 0, "s"], + [92066, 0, "i"], + [92067, 0, "g"], + [92068, 0, "n"], + [92069, 0, "e"], + [92070, 0, "d"], + [92071, 0, " "], + [92072, 0, "b"], + [92073, 0, "y"], + [92074, 0, " "], + [92075, 0, "$"], + [92076, 0, "o"], + [92077, 0, "_"], + [92078, 0, "a"], + [92079, 0, "$"], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92081, 1], + [92132, 0, ","], + [92133, 0, " "], + [92134, 0, "t"], + [92135, 0, "h"], + [92136, 0, "e"], + [92137, 0, " "], + [92138, 0, "m"], + [92139, 0, "a"], + [92140, 0, "p"], + [92141, 0, "p"], + [92142, 0, "i"], + [92143, 0, "n"], + [92144, 0, "g"], + [92145, 0, " "], + [92146, 0, "f"], + [92147, 0, "r"], + [92148, 0, "o"], + [92149, 0, "m"], + [92150, 0, " "], + [92151, 0, "o"], + [92152, 0, "p"], + [92153, 0, "e"], + [92154, 0, "r"], + [92155, 0, "a"], + [92156, 0, "t"], + [92157, 0, "i"], + [92158, 0, "o"], + [92159, 0, "n"], + [92160, 0, " "], + [92161, 0, "I"], + [92162, 0, "D"], + [92163, 0, " "], + [92164, 0, "t"], + [92165, 0, "o"], + [92166, 0, " "], + [92167, 0, "v"], + [92168, 0, "a"], + [92169, 0, "l"], + [92170, 0, "u"], + [92171, 0, "e"], + [92172, 0, " "], + [92173, 0, "i"], + [92174, 0, "s"], + [92175, 0, " "], + [92176, 0, "a"], + [92177, 0, "d"], + [92178, 0, "d"], + [92179, 0, "e"], + [92180, 0, "d"], + [92181, 0, " "], + [92182, 0, "t"], + [92183, 0, "o"], + [92184, 0, " "], + [92185, 0, "t"], + [92186, 0, "h"], + [92187, 0, "e"], + [92188, 0, " "], + [92189, 0, "r"], + [92190, 0, "e"], + [92191, 0, "g"], + [92192, 0, "i"], + [92193, 0, "s"], + [92194, 0, "t"], + [92195, 0, "e"], + [92196, 0, "r"], + [92197, 0, " "], + [92198, 0, "u"], + [92199, 0, "s"], + [92200, 0, "i"], + [92201, 0, "n"], + [92202, 0, "g"], + [92203, 0, " "], + [92203, 1], + [92202, 1], + [92201, 1], + [92200, 1], + [92199, 1], + [92198, 1], + [92197, 1], + [92197, 0, ":"], + [92198, 0, " "], + [92199, 0, "#"], + [92199, 1], + [92199, 0, "$"], + [92200, 0, "\\"], + [92201, 0, "m"], + [92202, 0, "a"], + [92203, 0, "t"], + [92204, 0, "h"], + [92205, 0, "i"], + [92206, 0, "t"], + [92207, 0, "{"], + [92208, 0, "c"], + [92209, 0, "h"], + [92210, 0, "i"], + [92211, 0, "l"], + [92212, 0, "d"], + [92213, 0, "}"], + [92214, 0, "["], + [92215, 0, "\\"], + [92216, 0, ","], + [92217, 0, "\\"], + [92218, 0, "m"], + [92219, 0, "a"], + [92220, 0, "t"], + [92221, 0, "h"], + [92222, 0, "i"], + [92223, 0, "t"], + [92224, 0, "{"], + [92225, 0, "i"], + [92226, 0, "d"], + [92227, 0, "}"], + [92228, 0, " "], + [92229, 0, "\\"], + [92230, 0, "m"], + [92231, 0, "a"], + [92232, 0, "p"], + [92233, 0, "s"], + [92234, 0, "t"], + [92235, 0, "o"], + [92236, 0, " "], + [92237, 0, "\\"], + [92238, 0, "m"], + [92239, 0, "a"], + [92240, 0, "t"], + [92241, 0, "h"], + [92242, 0, "i"], + [92243, 0, "t"], + [92244, 0, "{"], + [92245, 0, "v"], + [92246, 0, "a"], + [92247, 0, "l"], + [92248, 0, "}"], + [92249, 0, "\\"], + [92250, 0, ","], + [92251, 0, "]"], + [92252, 0, "$"], + [92253, 0, "."], + [92197, 1], + [92197, 0, " "], + [92198, 0, "b"], + [92199, 0, "y"], + [92200, 0, " "], + [92201, 0, "t"], + [92202, 0, "h"], + [92203, 0, "e"], + [92204, 0, " "], + [92205, 0, "e"], + [92206, 0, "x"], + [92207, 0, "p"], + [92208, 0, "r"], + [92209, 0, "e"], + [92210, 0, "s"], + [92211, 0, "s"], + [92212, 0, "i"], + [92213, 0, "o"], + [92214, 0, "n"], + [92271, 0, " "], + [92272, 0, "S"], + [92273, 0, "i"], + [92274, 0, "n"], + [92275, 0, "c"], + [92276, 0, "e"], + [92277, 0, " "], + [92278, 0, "o"], + [92279, 0, "p"], + [92280, 0, "e"], + [92281, 0, "r"], + [92282, 0, "a"], + [92283, 0, "t"], + [92284, 0, "i"], + [92285, 0, "o"], + [92286, 0, "n"], + [92287, 0, " "], + [92288, 0, "I"], + [92289, 0, "D"], + [92290, 0, "s"], + [92291, 0, " "], + [92292, 0, "("], + [92293, 0, "L"], + [92294, 0, "a"], + [92295, 0, "m"], + [92296, 0, "p"], + [92297, 0, "o"], + [92298, 0, "r"], + [92299, 0, "t"], + [92300, 0, " "], + [92301, 0, "t"], + [92302, 0, "i"], + [92303, 0, "m"], + [92304, 0, "e"], + [92305, 0, "s"], + [92306, 0, "t"], + [92307, 0, "a"], + [92308, 0, "m"], + [92309, 0, "p"], + [92310, 0, "s"], + [92311, 0, ")"], + [92312, 0, " "], + [92313, 0, "a"], + [92314, 0, "r"], + [92315, 0, "e"], + [92316, 0, " "], + [92317, 0, "u"], + [92318, 0, "n"], + [92319, 0, "i"], + [92320, 0, "q"], + [92321, 0, "u"], + [92322, 0, "e"], + [92323, 0, ","], + [92324, 0, " "], + [92325, 0, "a"], + [92326, 0, "n"], + [92327, 0, "d"], + [92328, 0, " "], + [92329, 0, "c"], + [92330, 0, "o"], + [92331, 0, "n"], + [92332, 0, "c"], + [92333, 0, "u"], + [92334, 0, "r"], + [92335, 0, "r"], + [92336, 0, "e"], + [92337, 0, "n"], + [92338, 0, "t"], + [92339, 0, " "], + [92340, 0, "d"], + [92341, 0, "e"], + [92342, 0, "l"], + [92343, 0, "e"], + [92344, 0, "t"], + [92345, 0, "i"], + [92346, 0, "o"], + [92347, 0, "n"], + [92348, 0, " "], + [92349, 0, "o"], + [92350, 0, "p"], + [92351, 0, "e"], + [92352, 0, "r"], + [92353, 0, "a"], + [92354, 0, "t"], + [92355, 0, "i"], + [92356, 0, "o"], + [92357, 0, "n"], + [92358, 0, "s"], + [92359, 0, " "], + [92360, 0, "d"], + [92361, 0, "o"], + [92362, 0, " "], + [92363, 0, "n"], + [92364, 0, "o"], + [92365, 0, "t"], + [92366, 0, " "], + [92367, 0, "r"], + [92368, 0, "e"], + [92369, 0, "m"], + [92370, 0, "o"], + [92371, 0, "v"], + [92372, 0, "e"], + [92373, 0, " "], + [92374, 0, "\\"], + [92375, 0, "m"], + [92376, 0, "a"], + [92377, 0, "t"], + [92378, 0, "h"], + [92379, 0, "i"], + [92380, 0, "t"], + [92381, 0, "{"], + [92382, 0, "i"], + [92383, 0, "d"], + [92384, 0, "}"], + [92385, 0, " "], + [92386, 0, "f"], + [92387, 0, "r"], + [92388, 0, "o"], + [92389, 0, "m"], + [92390, 0, " "], + [92391, 0, "t"], + [92392, 0, "h"], + [92393, 0, "e"], + [92394, 0, " "], + [92395, 0, "m"], + [92396, 0, "a"], + [92397, 0, "p"], + [92398, 0, "p"], + [92399, 0, "i"], + [92400, 0, "n"], + [92401, 0, "g"], + [92402, 0, ","], + [92403, 0, " "], + [92404, 0, "a"], + [92405, 0, " "], + [92406, 0, "c"], + [92407, 0, "o"], + [92408, 0, "n"], + [92409, 0, "c"], + [92410, 0, "u"], + [92411, 0, "r"], + [92412, 0, "r"], + [92413, 0, "e"], + [92414, 0, "n"], + [92415, 0, "t"], + [92416, 0, " "], + [92417, 0, "o"], + [92418, 0, "p"], + [92419, 0, "e"], + [92420, 0, "r"], + [92421, 0, "a"], + [92422, 0, "t"], + [92423, 0, "i"], + [92424, 0, "o"], + [92425, 0, "n"], + [92426, 0, " "], + [92427, 0, "c"], + [92428, 0, "a"], + [92429, 0, "n"], + [92430, 0, "n"], + [92431, 0, "o"], + [92432, 0, "t"], + [92433, 0, " "], + [92434, 0, "a"], + [92435, 0, "f"], + [92436, 0, "f"], + [92437, 0, "e"], + [92438, 0, "c"], + [92439, 0, "t"], + [92440, 0, " "], + [92441, 0, "t"], + [92442, 0, "h"], + [92443, 0, "e"], + [92444, 0, " "], + [92445, 0, "m"], + [92446, 0, "a"], + [92447, 0, "p"], + [92448, 0, "p"], + [92449, 0, "i"], + [92450, 0, "n"], + [92451, 0, "g"], + [92452, 0, " "], + [92453, 0, "o"], + [92454, 0, "f"], + [92455, 0, " "], + [92456, 0, "#"], + [92456, 1], + [92456, 0, "$"], + [92457, 0, "\\"], + [92458, 0, "m"], + [92459, 0, "a"], + [92460, 0, "t"], + [92461, 0, "h"], + [92462, 0, "i"], + [92463, 0, "t"], + [92464, 0, "{"], + [92465, 0, "i"], + [92466, 0, "d"], + [92467, 0, "}"], + [92468, 0, "$"], + [92469, 0, "."], + [92271, 0, " "], + [92271, 1], + [92469, 0, ","], + [92470, 0, " "], + [92471, 0, "r"], + [92472, 0, "e"], + [92473, 0, "g"], + [92474, 0, "a"], + [92475, 0, "r"], + [92476, 0, "d"], + [92477, 0, "l"], + [92478, 0, "e"], + [92479, 0, "s"], + [92480, 0, "s"], + [92481, 0, " "], + [92482, 0, "o"], + [92483, 0, "f"], + [92484, 0, " "], + [92485, 0, "w"], + [92486, 0, "h"], + [92487, 0, "e"], + [92488, 0, "t"], + [92489, 0, "h"], + [92490, 0, "e"], + [92491, 0, "r"], + [92492, 0, " "], + [92493, 0, "i"], + [92494, 0, "t"], + [92495, 0, " "], + [92496, 0, "i"], + [92497, 0, "s"], + [92498, 0, " "], + [92499, 0, "a"], + [92500, 0, "p"], + [92501, 0, "p"], + [92502, 0, "l"], + [92503, 0, "i"], + [92504, 0, "e"], + [92505, 0, "d"], + [92506, 0, " "], + [92507, 0, "b"], + [92508, 0, "e"], + [92509, 0, "f"], + [92510, 0, "o"], + [92511, 0, "r"], + [92512, 0, "e"], + [92513, 0, " "], + [92514, 0, "o"], + [92515, 0, "r"], + [92516, 0, " "], + [92517, 0, "a"], + [92518, 0, "f"], + [92519, 0, "t"], + [92520, 0, "e"], + [92521, 0, "r"], + [92432, 1], + [92431, 1], + [92430, 1], + [92429, 1], + [92428, 1], + [92427, 1], + [92427, 0, "d"], + [92428, 0, "o"], + [92429, 0, "e"], + [92430, 0, "s"], + [92520, 0, " "], + [92521, 0, "$"], + [92522, 0, "o"], + [92523, 0, "_"], + [92524, 0, "a"], + [92525, 0, "$"], + [92527, 0, "\n"], + [92528, 0, "\n"], + [92529, 0, "I"], + [92530, 0, "f"], + [92531, 0, " "], + [92532, 0, "$"], + [92533, 0, "o"], + [92534, 0, "_"], + [92535, 0, "a"], + [92536, 0, "."], + [92537, 0, "\\"], + [92538, 0, "m"], + [92539, 0, "a"], + [92540, 0, "t"], + [92541, 0, "h"], + [92542, 0, "i"], + [92543, 0, "t"], + [92544, 0, "{"], + [92545, 0, "c"], + [92546, 0, "u"], + [92547, 0, "r"], + [92548, 0, "s"], + [92549, 0, "o"], + [92550, 0, "r"], + [92551, 0, "}"], + [92552, 0, " "], + [92553, 0, "\\"], + [92554, 0, "n"], + [92555, 0, "o"], + [92556, 0, "t"], + [92557, 0, "="], + [92558, 0, " "], + [92559, 0, "o"], + [92560, 0, "_"], + [92561, 0, "c"], + [92562, 0, "."], + [92563, 0, "\\"], + [92564, 0, "m"], + [92565, 0, "a"], + [92566, 0, "t"], + [92567, 0, "h"], + [92568, 0, "i"], + [92569, 0, "t"], + [92570, 0, "{"], + [92571, 0, "c"], + [92572, 0, "u"], + [92573, 0, "r"], + [92574, 0, "s"], + [92575, 0, "o"], + [92576, 0, "r"], + [92577, 0, "}"], + [92578, 0, "$"], + [92579, 0, ","], + [92580, 0, " "], + [92581, 0, "t"], + [92582, 0, "h"], + [92583, 0, "e"], + [92584, 0, " "], + [92585, 0, "u"], + [92586, 0, "p"], + [92587, 0, "d"], + [92588, 0, "a"], + [92589, 0, "t"], + [92590, 0, "e"], + [92591, 0, "s"], + [92592, 0, " "], + [92592, 1], + [92591, 1], + [92590, 1], + [92589, 1], + [92588, 1], + [92587, 1], + [92586, 1], + [92585, 1], + [92585, 0, "o"], + [92586, 0, "p"], + [92587, 0, "e"], + [92588, 0, "r"], + [92589, 0, "a"], + [92590, 0, "t"], + [92591, 0, "i"], + [92592, 0, "o"], + [92593, 0, "n"], + [92594, 0, "s"], + [92595, 0, " "], + [92596, 0, "a"], + [92597, 0, "p"], + [92598, 0, "p"], + [92599, 0, "l"], + [92600, 0, "y"], + [92601, 0, " "], + [92602, 0, "t"], + [92603, 0, "o"], + [92604, 0, " "], + [92531, 0, " "], + [92532, 0, "$"], + [92533, 0, "o"], + [92534, 0, "_"], + [92535, 0, "c"], + [92536, 0, "$"], + [92537, 0, " "], + [92538, 0, "i"], + [92539, 0, "s"], + [92540, 0, " "], + [92541, 0, "n"], + [92542, 0, "o"], + [92543, 0, "t"], + [92544, 0, " "], + [92545, 0, "a"], + [92546, 0, "n"], + [92547, 0, " "], + [92548, 0, "a"], + [92549, 0, "s"], + [92550, 0, "s"], + [92551, 0, "i"], + [92552, 0, "g"], + [92553, 0, "n"], + [92554, 0, "m"], + [92555, 0, "e"], + [92556, 0, "n"], + [92557, 0, "t"], + [92558, 0, " "], + [92559, 0, "o"], + [92560, 0, "p"], + [92561, 0, "e"], + [92562, 0, "r"], + [92563, 0, "a"], + [92564, 0, "t"], + [92565, 0, "i"], + [92566, 0, "o"], + [92567, 0, "n"], + [92568, 0, " "], + [92569, 0, "o"], + [92570, 0, "r"], + [92571, 0, " "], + [92572, 0, "i"], + [92573, 0, "f"], + [92647, 1], + [92646, 1], + [92645, 1], + [92644, 1], + [92643, 1], + [92642, 1], + [92641, 1], + [92640, 1], + [92639, 1], + [92639, 0, "a"], + [92640, 0, "r"], + [92641, 0, "e"], + [92642, 0, " "], + [92643, 0, "i"], + [92644, 0, "n"], + [92645, 0, "d"], + [92646, 0, "e"], + [92647, 0, "p"], + [92648, 0, "e"], + [92649, 0, "n"], + [92650, 0, "d"], + [92651, 0, "e"], + [92652, 0, "n"], + [92653, 0, "t"], + [92654, 0, " "], + [92655, 0, "a"], + [92656, 0, "n"], + [92657, 0, "d"], + [92658, 0, " "], + [92659, 0, "t"], + [92660, 0, "h"], + [92661, 0, "u"], + [92662, 0, "s"], + [92663, 0, " "], + [92664, 0, "t"], + [92665, 0, "r"], + [92666, 0, "i"], + [92667, 0, "v"], + [92668, 0, "i"], + [92669, 0, "a"], + [92670, 0, "l"], + [92671, 0, "l"], + [92672, 0, "y"], + [92673, 0, " "], + [92674, 0, "c"], + [92675, 0, "o"], + [92676, 0, "m"], + [92677, 0, "m"], + [92678, 0, "u"], + [92679, 0, "t"], + [92680, 0, "a"], + [92681, 0, "t"], + [92682, 0, "i"], + [92683, 0, "v"], + [92684, 0, "e"], + [92685, 0, "."], + [92686, 0, " "], + [92687, 0, "I"], + [92688, 0, "f"], + [92689, 0, " "], + [92690, 0, "$"], + [92691, 0, "o"], + [92692, 0, "_"], + [92693, 0, "a"], + [92694, 0, "$"], + [92695, 0, " "], + [92696, 0, "a"], + [92697, 0, "n"], + [92698, 0, "d"], + [92699, 0, " "], + [92700, 0, "$"], + [92701, 0, "o"], + [92702, 0, "_"], + [92703, 0, "c"], + [92704, 0, "$"], + [92705, 0, " "], + [92706, 0, "a"], + [92707, 0, "r"], + [92708, 0, "e"], + [92709, 0, " "], + [92710, 0, "a"], + [92711, 0, "s"], + [92712, 0, "s"], + [92713, 0, "i"], + [92714, 0, "g"], + [92715, 0, "n"], + [92716, 0, "m"], + [92717, 0, "e"], + [92718, 0, "n"], + [92719, 0, "t"], + [92720, 0, "s"], + [92721, 0, " "], + [92722, 0, "t"], + [92723, 0, "o"], + [92724, 0, " "], + [92725, 0, "t"], + [92726, 0, "h"], + [92727, 0, "e"], + [92728, 0, " "], + [92729, 0, "s"], + [92730, 0, "a"], + [92731, 0, "m"], + [92732, 0, "e"], + [92733, 0, " "], + [92734, 0, "c"], + [92735, 0, "u"], + [92736, 0, "r"], + [92737, 0, "s"], + [92738, 0, "o"], + [92739, 0, "r"], + [92740, 0, ","], + [92741, 0, " "], + [92742, 0, "w"], + [92743, 0, "e"], + [92744, 0, " "], + [92745, 0, "u"], + [92746, 0, "s"], + [92747, 0, "e"], + [92748, 0, " "], + [92749, 0, "t"], + [92750, 0, "h"], + [92751, 0, "e"], + [92752, 0, " "], + [92753, 0, "f"], + [92754, 0, "a"], + [92755, 0, "c"], + [92756, 0, "t"], + [92757, 0, " "], + [92758, 0, "t"], + [92759, 0, "h"], + [92760, 0, "a"], + [92761, 0, "t"], + [92762, 0, " "], + [92763, 0, "t"], + [92764, 0, "h"], + [92765, 0, "e"], + [92766, 0, " "], + [92767, 0, "o"], + [92768, 0, "r"], + [92769, 0, "d"], + [92770, 0, "e"], + [92771, 0, "r"], + [92772, 0, " "], + [92773, 0, "o"], + [92774, 0, "f"], + [92775, 0, " "], + [92776, 0, "u"], + [92777, 0, "p"], + [92778, 0, "d"], + [92779, 0, "a"], + [92780, 0, "t"], + [92781, 0, "e"], + [92782, 0, "s"], + [92783, 0, " "], + [92784, 0, "t"], + [92785, 0, "o"], + [92786, 0, " "], + [92787, 0, "a"], + [92788, 0, " "], + [92789, 0, "p"], + [92790, 0, "a"], + [92791, 0, "r"], + [92792, 0, "t"], + [92793, 0, "i"], + [92794, 0, "a"], + [92795, 0, "l"], + [92796, 0, " "], + [92797, 0, "f"], + [92798, 0, "u"], + [92799, 0, "n"], + [92800, 0, "c"], + [92801, 0, "t"], + [92802, 0, "i"], + [92803, 0, "o"], + [92804, 0, "n"], + [92775, 1], + [92774, 1], + [92773, 1], + [92772, 1], + [92771, 1], + [92770, 1], + [92769, 1], + [92768, 1], + [92767, 1], + [92766, 1], + [92765, 1], + [92764, 1], + [92763, 1], + [92791, 1], + [92790, 1], + [92789, 1], + [92788, 1], + [92787, 1], + [92786, 1], + [92785, 1], + [92784, 1], + [92783, 1], + [92782, 1], + [92781, 1], + [92780, 1], + [92779, 1], + [92778, 1], + [92777, 1], + [92776, 1], + [92775, 1], + [92774, 1], + [92773, 1], + [92772, 1], + [92771, 1], + [92770, 1], + [92769, 1], + [92768, 1], + [92767, 1], + [92766, 1], + [92765, 1], + [92764, 1], + [92763, 1], + [92763, 0, "$"], + [92764, 0, "\\"], + [92765, 0, "m"], + [92766, 0, "a"], + [92767, 0, "t"], + [92768, 0, "h"], + [92769, 0, "i"], + [92770, 0, "t"], + [92771, 0, "{"], + [92772, 0, "c"], + [92773, 0, "h"], + [92774, 0, "i"], + [92775, 0, "l"], + [92776, 0, "d"], + [92777, 0, "}"], + [92778, 0, "["], + [92779, 0, "\\"], + [92780, 0, ","], + [92781, 0, "\\"], + [92782, 0, "m"], + [92783, 0, "a"], + [92784, 0, "t"], + [92785, 0, "h"], + [92786, 0, "i"], + [92787, 0, "t"], + [92788, 0, "{"], + [92789, 0, "i"], + [92790, 0, "d"], + [92791, 0, "}"], + [92792, 0, "_"], + [92793, 0, "1"], + [92794, 0, " "], + [92795, 0, "\\"], + [92796, 0, "m"], + [92797, 0, "a"], + [92798, 0, "p"], + [92799, 0, "s"], + [92800, 0, "t"], + [92801, 0, "o"], + [92802, 0, " "], + [92803, 0, "\\"], + [92804, 0, "m"], + [92805, 0, "a"], + [92806, 0, "t"], + [92807, 0, "h"], + [92808, 0, "i"], + [92809, 0, "t"], + [92810, 0, "{"], + [92811, 0, "v"], + [92812, 0, "a"], + [92813, 0, "l"], + [92814, 0, "_"], + [92814, 1], + [92814, 0, "}"], + [92815, 0, "_"], + [92816, 0, "1"], + [92817, 0, "\\"], + [92818, 0, ","], + [92819, 0, "]"], + [92820, 0, "["], + [92821, 0, ","], + [92821, 1], + [92821, 0, "\\"], + [92822, 0, ","], + [92823, 0, "\\"], + [92824, 0, "m"], + [92825, 0, "a"], + [92826, 0, "t"], + [92827, 0, "h"], + [92828, 0, "i"], + [92829, 0, "t"], + [92830, 0, "{"], + [92831, 0, "i"], + [92832, 0, "d"], + [92833, 0, "}"], + [92834, 0, "_"], + [92835, 0, "2"], + [92836, 0, " "], + [92837, 0, "\\"], + [92838, 0, "m"], + [92839, 0, "a"], + [92840, 0, "p"], + [92841, 0, "s"], + [92842, 0, "t"], + [92843, 0, "o"], + [92844, 0, " "], + [92845, 0, "\\"], + [92846, 0, "m"], + [92847, 0, "a"], + [92848, 0, "t"], + [92849, 0, "h"], + [92850, 0, "i"], + [92851, 0, "t"], + [92852, 0, "{"], + [92853, 0, "v"], + [92854, 0, "a"], + [92855, 0, "l"], + [92856, 0, "}"], + [92857, 0, "_"], + [92858, 0, "2"], + [92859, 0, "\\"], + [92860, 0, ","], + [92861, 0, "]"], + [92862, 0, " "], + [92863, 0, "="], + [92864, 0, " "], + [92865, 0, "\\"], + [92866, 0, "m"], + [92867, 0, "a"], + [92868, 0, "t"], + [92869, 0, "h"], + [92870, 0, "i"], + [92871, 0, "t"], + [92872, 0, "{"], + [92873, 0, "c"], + [92874, 0, "h"], + [92875, 0, "i"], + [92876, 0, "l"], + [92877, 0, "d"], + [92878, 0, "}"], + [92879, 0, "["], + [92880, 0, "\\"], + [92881, 0, ","], + [92882, 0, "\\"], + [92883, 0, "m"], + [92884, 0, "a"], + [92885, 0, "t"], + [92886, 0, "h"], + [92887, 0, "i"], + [92888, 0, "t"], + [92889, 0, "{"], + [92890, 0, "i"], + [92891, 0, "d"], + [92892, 0, "}"], + [92893, 0, "_"], + [92894, 0, "2"], + [92895, 0, " "], + [92896, 0, "\\"], + [92897, 0, "m"], + [92898, 0, "a"], + [92899, 0, "p"], + [92900, 0, "s"], + [92901, 0, "t"], + [92902, 0, "o"], + [92903, 0, " "], + [92904, 0, "\\"], + [92905, 0, "m"], + [92906, 0, "a"], + [92907, 0, "t"], + [92908, 0, "h"], + [92909, 0, "i"], + [92910, 0, "t"], + [92911, 0, "{"], + [92912, 0, "v"], + [92913, 0, "a"], + [92914, 0, "l"], + [92915, 0, "}"], + [92916, 0, "_"], + [92917, 0, "2"], + [92918, 0, "\\"], + [92919, 0, ","], + [92920, 0, "]"], + [92921, 0, "["], + [92820, 0, "\\"], + [92821, 0, ","], + [92923, 0, "\\"], + [92924, 0, ","], + [92926, 0, "\\"], + [92927, 0, ","], + [92928, 0, "\\"], + [92929, 0, "m"], + [92930, 0, "a"], + [92931, 0, "t"], + [92932, 0, "h"], + [92933, 0, "i"], + [92934, 0, "t"], + [92935, 0, "{"], + [92936, 0, "i"], + [92937, 0, "d"], + [92938, 0, "}"], + [92939, 0, "_"], + [92940, 0, "1"], + [92941, 0, " "], + [92942, 0, "\\"], + [92943, 0, "m"], + [92944, 0, "a"], + [92945, 0, "p"], + [92946, 0, "s"], + [92947, 0, "t"], + [92948, 0, "o"], + [92949, 0, " "], + [92950, 0, "\\"], + [92951, 0, "m"], + [92952, 0, "a"], + [92953, 0, "t"], + [92954, 0, "h"], + [92955, 0, "i"], + [92956, 0, "t"], + [92957, 0, "{"], + [92958, 0, "v"], + [92959, 0, "a"], + [92960, 0, "l"], + [92961, 0, "}"], + [92962, 0, "_"], + [92963, 0, "1"], + [92964, 0, "]"], + [92964, 1], + [92964, 0, "\\"], + [92965, 0, ","], + [92966, 0, "]"], + [92967, 0, "$"], + [92968, 0, " "], + [92969, 0, "p"], + [92970, 0, "r"], + [92971, 0, "o"], + [92972, 0, "v"], + [92973, 0, "i"], + [92974, 0, "d"], + [92975, 0, "e"], + [92976, 0, "d"], + [92977, 0, " "], + [92978, 0, "t"], + [92979, 0, "h"], + [92980, 0, "a"], + [92981, 0, "t"], + [92982, 0, " "], + [92983, 0, "$"], + [92984, 0, "\\"], + [92985, 0, "m"], + [92986, 0, "a"], + [92987, 0, "t"], + [92988, 0, "h"], + [92989, 0, "i"], + [92990, 0, "t"], + [92991, 0, "{"], + [92992, 0, "i"], + [92993, 0, "d"], + [92994, 0, "}"], + [92995, 0, "_"], + [92996, 0, "1"], + [92997, 0, " "], + [92998, 0, "\\"], + [92999, 0, "n"], + [93000, 0, "o"], + [93001, 0, "t"], + [93002, 0, "="], + [93003, 0, " "], + [93004, 0, "\\"], + [93005, 0, "m"], + [93006, 0, "a"], + [93007, 0, "t"], + [93008, 0, "h"], + [93009, 0, "i"], + [93010, 0, "t"], + [93011, 0, "{"], + [93012, 0, "k"], + [93013, 0, "i"], + [93014, 0, "d"], + [93014, 1], + [93013, 1], + [93012, 1], + [93012, 0, "i"], + [93013, 0, "d"], + [93014, 0, "}"], + [93015, 0, "_"], + [93016, 0, "2"], + [93017, 0, "$"], + [93018, 0, "."], + [92374, 0, "$"], + [92386, 0, "$"], + [92763, 1], + [92762, 1], + [92761, 1], + [92760, 1], + [92759, 1], + [92758, 1], + [92757, 1], + [92756, 1], + [92755, 1], + [92755, 0, "c"], + [92756, 0, "o"], + [92757, 0, "m"], + [92758, 0, "m"], + [92759, 0, "u"], + [92760, 0, "t"], + [92761, 0, "a"], + [92762, 0, "t"], + [92763, 0, "i"], + [92764, 0, "v"], + [92765, 0, "i"], + [92766, 0, "t"], + [92767, 0, "y"], + [92768, 0, " "], + [92769, 0, "o"], + [92770, 0, "f"], + [92771, 0, " "], + [92772, 0, "i"], + [92773, 0, "n"], + [92774, 0, "d"], + [92775, 0, "e"], + [92776, 0, "p"], + [92777, 0, "d"], + [92777, 1], + [92777, 0, "e"], + [92778, 0, "n"], + [92779, 0, "d"], + [92780, 0, "e"], + [92781, 0, "n"], + [92782, 0, "t"], + [92783, 0, " "], + [92784, 0, "u"], + [92785, 0, "p"], + [92786, 0, "d"], + [92787, 0, "a"], + [92788, 0, "t"], + [92789, 0, "e"], + [92790, 0, "s"], + [92791, 0, " "], + [92792, 0, "t"], + [92793, 0, "o"], + [92794, 0, " "], + [92795, 0, "a"], + [92796, 0, " "], + [92797, 0, "p"], + [92798, 0, "a"], + [92799, 0, "r"], + [92800, 0, "t"], + [92801, 0, "i"], + [92802, 0, "a"], + [92803, 0, "l"], + [92804, 0, " "], + [92805, 0, "f"], + [92806, 0, "u"], + [92807, 0, "n"], + [92808, 0, "c"], + [92809, 0, "t"], + [92810, 0, "i"], + [92811, 0, "o"], + [92812, 0, "n"], + [92813, 0, ":"], + [93071, 0, "\n"], + [93072, 0, "\n"], + [93073, 0, "T"], + [93074, 0, "h"], + [93075, 0, "u"], + [93076, 0, "s"], + [93077, 0, ","], + [93078, 0, " "], + [93079, 0, "f"], + [93080, 0, "o"], + [93081, 0, "r"], + [93082, 0, " "], + [93083, 0, "a"], + [93084, 0, "l"], + [93085, 0, "l"], + [93086, 0, " "], + [93086, 1], + [93085, 1], + [93084, 1], + [93083, 1], + [93082, 1], + [93081, 1], + [93080, 1], + [93079, 1], + [93079, 0, "a"], + [93080, 0, "l"], + [93081, 0, "l"], + [93082, 0, " "], + [93083, 0, "p"], + [93084, 0, "a"], + [93085, 0, "r"], + [93086, 0, "t"], + [93087, 0, "s"], + [93088, 0, " "], + [93089, 0, "o"], + [93090, 0, "f"], + [93091, 0, " "], + [93092, 0, "t"], + [93093, 0, "h"], + [93094, 0, "e"], + [93095, 0, " "], + [93096, 0, "p"], + [93097, 0, "r"], + [93098, 0, "o"], + [93099, 0, "c"], + [93100, 0, "e"], + [93101, 0, "s"], + [93102, 0, "s"], + [93103, 0, " "], + [93104, 0, "o"], + [93105, 0, "f"], + [93106, 0, " "], + [93107, 0, "a"], + [93108, 0, "p"], + [93109, 0, "p"], + [93110, 0, "l"], + [93111, 0, "y"], + [93112, 0, "i"], + [93113, 0, "n"], + [93114, 0, "g"], + [93115, 0, " "], + [93116, 0, "$"], + [93117, 0, "o"], + [93118, 0, "_"], + [93119, 0, "c"], + [93119, 1], + [93119, 0, "a"], + [93120, 0, "$"], + [93121, 0, " "], + [93122, 0, "h"], + [93123, 0, "a"], + [93124, 0, "v"], + [93125, 0, "e"], + [93126, 0, " "], + [93127, 0, "t"], + [93128, 0, "h"], + [93129, 0, "e"], + [93130, 0, " "], + [93131, 0, "s"], + [93132, 0, "a"], + [93133, 0, "m"], + [93134, 0, "e"], + [93135, 0, " "], + [93136, 0, "e"], + [93137, 0, "f"], + [93138, 0, "f"], + [93139, 0, "e"], + [93140, 0, "c"], + [93141, 0, "t"], + [93142, 0, ","], + [93143, 0, " "], + [93144, 0, "r"], + [93145, 0, "e"], + [93146, 0, "g"], + [93147, 0, "a"], + [93148, 0, "r"], + [93149, 0, "d"], + [93150, 0, "l"], + [93151, 0, "e"], + [93152, 0, "s"], + [93153, 0, "s"], + [93154, 0, " "], + [93155, 0, "o"], + [93156, 0, "f"], + [93157, 0, " "], + [93158, 0, "w"], + [93159, 0, "h"], + [93160, 0, "e"], + [93161, 0, "t"], + [93162, 0, "h"], + [93163, 0, "e"], + [93164, 0, "r"], + [93165, 0, " "], + [93166, 0, "$"], + [93167, 0, "o"], + [93168, 0, "_"], + [93169, 0, "c"], + [93170, 0, "$"], + [93171, 0, " "], + [93172, 0, "w"], + [93173, 0, "a"], + [93174, 0, "s"], + [93175, 0, " "], + [93176, 0, "a"], + [93177, 0, "p"], + [93178, 0, "p"], + [93179, 0, "l"], + [93180, 0, "i"], + [93181, 0, "e"], + [93182, 0, "d"], + [93183, 0, " "], + [93184, 0, "b"], + [93185, 0, "e"], + [93186, 0, "f"], + [93187, 0, "o"], + [93188, 0, "r"], + [93189, 0, "e"], + [93190, 0, " "], + [93191, 0, "o"], + [93192, 0, "r"], + [93193, 0, " "], + [93194, 0, "a"], + [93195, 0, "f"], + [93196, 0, "t"], + [93197, 0, "e"], + [93198, 0, "r"], + [93199, 0, " "], + [93200, 0, "$"], + [93201, 0, "o"], + [93202, 0, "_"], + [93203, 0, "a"], + [93204, 0, "$"], + [93205, 0, "."], + [93142, 0, " "], + [93143, 0, "o"], + [93144, 0, "n"], + [93145, 0, " "], + [93146, 0, "t"], + [93147, 0, "h"], + [93148, 0, "e"], + [93149, 0, " "], + [93150, 0, "d"], + [93151, 0, "o"], + [93152, 0, "c"], + [93153, 0, "u"], + [93154, 0, "m"], + [93155, 0, "e"], + [93156, 0, "n"], + [93157, 0, "t"], + [93158, 0, " "], + [93159, 0, "s"], + [93160, 0, "t"], + [93161, 0, "a"], + [93162, 0, "t"], + [93163, 0, "e"], + [93196, 1], + [93195, 1], + [93194, 1], + [93194, 0, "i"], + [93195, 0, "s"], + [93226, 0, ","], + [93227, 0, " "], + [93228, 0, "s"], + [93229, 0, "o"], + [93230, 0, " "], + [93231, 0, "t"], + [93232, 0, "h"], + [93233, 0, "e"], + [93234, 0, " "], + [93235, 0, "o"], + [93236, 0, "p"], + [93237, 0, "p"], + [93237, 1], + [93237, 0, "e"], + [93238, 0, "r"], + [93239, 0, "a"], + [93240, 0, "t"], + [93241, 0, "i"], + [93242, 0, "o"], + [93243, 0, "n"], + [93244, 0, "s"], + [93245, 0, " "], + [93246, 0, "c"], + [93247, 0, "o"], + [93248, 0, "m"], + [93249, 0, "m"], + [93250, 0, "u"], + [93251, 0, "t"], + [93252, 0, "e"], + [93071, 0, " "], + [93072, 0, "S"], + [93073, 0, "i"], + [93074, 0, "n"], + [93075, 0, "c"], + [93076, 0, "e"], + [93077, 0, " "], + [93078, 0, "o"], + [93079, 0, "p"], + [93080, 0, "e"], + [93081, 0, "r"], + [93082, 0, "a"], + [93083, 0, "t"], + [93084, 0, "i"], + [93085, 0, "o"], + [93086, 0, "n"], + [93087, 0, " "], + [93088, 0, "I"], + [93089, 0, "D"], + [93090, 0, "s"], + [93091, 0, " "], + [93092, 0, "("], + [93093, 0, "L"], + [93094, 0, "a"], + [93095, 0, "m"], + [93096, 0, "p"], + [93097, 0, "o"], + [93098, 0, "r"], + [93099, 0, "t"], + [93100, 0, " "], + [93101, 0, "t"], + [93102, 0, "i"], + [93103, 0, "m"], + [93104, 0, "e"], + [93105, 0, "s"], + [93106, 0, "t"], + [93107, 0, "a"], + [93108, 0, "m"], + [93109, 0, "p"], + [93110, 0, "s"], + [93111, 0, ")"], + [93112, 0, " "], + [93113, 0, "a"], + [93114, 0, "r"], + [93115, 0, "e"], + [93116, 0, " "], + [93117, 0, "u"], + [93118, 0, "n"], + [93119, 0, "i"], + [93120, 0, "q"], + [93121, 0, "u"], + [93122, 0, "e"], + [93123, 0, ","], + [93124, 0, " "], + [93125, 0, "t"], + [93126, 0, "w"], + [93127, 0, "o"], + [93128, 0, " "], + [93129, 0, "c"], + [93130, 0, "o"], + [93131, 0, "n"], + [93132, 0, "c"], + [93133, 0, "u"], + [93134, 0, "r"], + [93135, 0, "r"], + [93136, 0, "e"], + [93137, 0, "n"], + [93138, 0, "t"], + [93139, 0, " "], + [93140, 0, "a"], + [93141, 0, "s"], + [93142, 0, "s"], + [93143, 0, "i"], + [93144, 0, "g"], + [93145, 0, "n"], + [93146, 0, "m"], + [93147, 0, "e"], + [93148, 0, "n"], + [93149, 0, "t"], + [93150, 0, "s"], + [93151, 0, " "], + [93152, 0, "a"], + [93153, 0, "d"], + [93154, 0, "d"], + [93155, 0, " "], + [93156, 0, "t"], + [93157, 0, "w"], + [93158, 0, "o"], + [93159, 0, " "], + [93160, 0, "d"], + [93161, 0, "i"], + [93162, 0, "f"], + [93163, 0, "f"], + [93164, 0, "e"], + [93165, 0, "r"], + [93166, 0, "e"], + [93167, 0, "n"], + [93168, 0, "t"], + [93169, 0, " "], + [93170, 0, "k"], + [93171, 0, "e"], + [93172, 0, "y"], + [93173, 0, "s"], + [93174, 0, " "], + [93175, 0, "t"], + [93176, 0, "o"], + [93177, 0, " "], + [93178, 0, "t"], + [93179, 0, "h"], + [93180, 0, "e"], + [93181, 0, " "], + [93182, 0, "m"], + [93183, 0, "a"], + [93184, 0, "p"], + [93185, 0, "p"], + [93186, 0, "i"], + [93187, 0, "n"], + [93188, 0, "g"], + [93189, 0, "."], + [93189, 0, ","], + [93190, 0, " "], + [93191, 0, "a"], + [93192, 0, "n"], + [93193, 0, "d"], + [93194, 0, " "], + [93195, 0, "t"], + [93196, 0, "h"], + [93197, 0, "e"], + [93198, 0, "i"], + [93199, 0, "r"], + [93200, 0, " "], + [93201, 0, "o"], + [93202, 0, "r"], + [93203, 0, "d"], + [93204, 0, "e"], + [93205, 0, "r"], + [93206, 0, " "], + [93207, 0, "i"], + [93208, 0, "s"], + [93209, 0, " "], + [93210, 0, "i"], + [93211, 0, "m"], + [93212, 0, "m"], + [93213, 0, "a"], + [93214, 0, "t"], + [93215, 0, "e"], + [93216, 0, "r"], + [93217, 0, "i"], + [93218, 0, "a"], + [93219, 0, "l"], + [92530, 1], + [92529, 1], + [92528, 1], + [92527, 1], + [92526, 1], + [92525, 1], + [92524, 1], + [92523, 1], + [92522, 1], + [92521, 1], + [92520, 1], + [92519, 1], + [92518, 1], + [92517, 1], + [92516, 1], + [92515, 1], + [92514, 1], + [92513, 1], + [92512, 1], + [92511, 1], + [92510, 1], + [92509, 1], + [92508, 1], + [92507, 1], + [92506, 1], + [92505, 1], + [92504, 1], + [92503, 1], + [92502, 1], + [92501, 1], + [92500, 1], + [92499, 1], + [92498, 1], + [92497, 1], + [92496, 1], + [92495, 1], + [92494, 1], + [92493, 1], + [92492, 1], + [92491, 1], + [92490, 1], + [92489, 1], + [92488, 1], + [92487, 1], + [92486, 1], + [92485, 1], + [92484, 1], + [92483, 1], + [92482, 1], + [92481, 1], + [92480, 1], + [92479, 1], + [92478, 1], + [92477, 1], + [92476, 1], + [92475, 1], + [92474, 1], + [92473, 1], + [92472, 1], + [92471, 1], + [92470, 1], + [92469, 1], + [92468, 1], + [92467, 1], + [92466, 1], + [92465, 1], + [92464, 1], + [92463, 1], + [92462, 1], + [92461, 1], + [92460, 1], + [92459, 1], + [92458, 1], + [92457, 1], + [92456, 1], + [92455, 1], + [92454, 1], + [92453, 1], + [92452, 1], + [92451, 1], + [92450, 1], + [92449, 1], + [92448, 1], + [92447, 1], + [92446, 1], + [92445, 1], + [92444, 1], + [92443, 1], + [92442, 1], + [92441, 1], + [92440, 1], + [92439, 1], + [92438, 1], + [92437, 1], + [92436, 1], + [92435, 1], + [92434, 1], + [92433, 1], + [92432, 1], + [92431, 1], + [92430, 1], + [92429, 1], + [92428, 1], + [92427, 1], + [92426, 1], + [92425, 1], + [92424, 1], + [92423, 1], + [92422, 1], + [92421, 1], + [92420, 1], + [92419, 1], + [92418, 1], + [92417, 1], + [92416, 1], + [92415, 1], + [92414, 1], + [92413, 1], + [92412, 1], + [92411, 1], + [92410, 1], + [92409, 1], + [92408, 1], + [92407, 1], + [92406, 1], + [92405, 1], + [92404, 1], + [92403, 1], + [92402, 1], + [92401, 1], + [92400, 1], + [92399, 1], + [92398, 1], + [92397, 1], + [92396, 1], + [92395, 1], + [92394, 1], + [92393, 1], + [92392, 1], + [92391, 1], + [92390, 1], + [92389, 1], + [92388, 1], + [92387, 1], + [92386, 1], + [92385, 1], + [92384, 1], + [92383, 1], + [92382, 1], + [92381, 1], + [92380, 1], + [92379, 1], + [92378, 1], + [92377, 1], + [92376, 1], + [92375, 1], + [92374, 1], + [92373, 1], + [92372, 1], + [92371, 1], + [92370, 1], + [92369, 1], + [92368, 1], + [92367, 1], + [92366, 1], + [92365, 1], + [92364, 1], + [92363, 1], + [92362, 1], + [92361, 1], + [92360, 1], + [92359, 1], + [92358, 1], + [92357, 1], + [92356, 1], + [92355, 1], + [92354, 1], + [92353, 1], + [92352, 1], + [92351, 1], + [92350, 1], + [92349, 1], + [92348, 1], + [92347, 1], + [92346, 1], + [92345, 1], + [92344, 1], + [92343, 1], + [92342, 1], + [92341, 1], + [92340, 1], + [92339, 1], + [92338, 1], + [92337, 1], + [92336, 1], + [92335, 1], + [92334, 1], + [92333, 1], + [92332, 1], + [92331, 1], + [92330, 1], + [92329, 1], + [92328, 1], + [92327, 1], + [92326, 1], + [92325, 1], + [92324, 1], + [92323, 1], + [92322, 1], + [92321, 1], + [92320, 1], + [92319, 1], + [92318, 1], + [92317, 1], + [92316, 1], + [92315, 1], + [92314, 1], + [92313, 1], + [92312, 1], + [92311, 1], + [92310, 1], + [92309, 1], + [92308, 1], + [92307, 1], + [92306, 1], + [92305, 1], + [92304, 1], + [92303, 1], + [92302, 1], + [92301, 1], + [92300, 1], + [92299, 1], + [92298, 1], + [92297, 1], + [92296, 1], + [92295, 1], + [92294, 1], + [92293, 1], + [92292, 1], + [92291, 1], + [92290, 1], + [92289, 1], + [92288, 1], + [92287, 1], + [92286, 1], + [92285, 1], + [92284, 1], + [92283, 1], + [92282, 1], + [92281, 1], + [92280, 1], + [92279, 1], + [92278, 1], + [92277, 1], + [92276, 1], + [92275, 1], + [92274, 1], + [92273, 1], + [92272, 1], + [92429, 1], + [92429, 0, "\n"], + [92430, 0, "\n"], + [92525, 1], + [92524, 1], + [92523, 1], + [92522, 1], + [92521, 1], + [92520, 1], + [92519, 1], + [92518, 1], + [92517, 1], + [92516, 1], + [92515, 1], + [92514, 1], + [93146, 0, "\n"], + [93147, 0, "\n"], + [93148, 0, "\\"], + [93149, 0, "b"], + [93150, 0, "e"], + [93151, 0, "g"], + [93152, 0, "i"], + [93153, 0, "n"], + [93154, 0, "{"], + [93155, 0, "l"], + [93156, 0, "e"], + [93157, 0, "m"], + [93158, 0, "m"], + [93159, 0, "a"], + [93160, 0, "}"], + [93161, 0, "\\"], + [93162, 0, "l"], + [93163, 0, "a"], + [93164, 0, "b"], + [93165, 0, "e"], + [93166, 0, "l"], + [93167, 0, "{"], + [93168, 0, "l"], + [93169, 0, "e"], + [93170, 0, "m"], + [93171, 0, ":"], + [93172, 0, "o"], + [93173, 0, "p"], + [93174, 0, "-"], + [93175, 0, "c"], + [93176, 0, "o"], + [93177, 0, "m"], + [93178, 0, "m"], + [93179, 0, "u"], + [93180, 0, "t"], + [93181, 0, "e"], + [93182, 0, "}"], + [93183, 0, "\n"], + [93184, 0, "\\"], + [93185, 0, "e"], + [93186, 0, "n"], + [93187, 0, "d"], + [93188, 0, "{"], + [93189, 0, "l"], + [93190, 0, "e"], + [93191, 0, "m"], + [93192, 0, "m"], + [93193, 0, "a"], + [93194, 0, "}"], + [93183, 0, "\n"], + [93184, 0, "i"], + [93185, 0, "n"], + [93186, 0, "s"], + [93187, 0, "e"], + [93188, 0, "r"], + [93189, 0, "t"], + [93190, 0, "i"], + [93191, 0, "o"], + [93192, 0, "n"], + [93193, 0, " "], + [93194, 0, "t"], + [93195, 0, "o"], + [93196, 0, " "], + [93197, 0, "t"], + [93198, 0, "h"], + [93199, 0, "e"], + [93200, 0, " "], + [93201, 0, "s"], + [93202, 0, "a"], + [93203, 0, "m"], + [93204, 0, "e"], + [93205, 0, " "], + [93206, 0, "l"], + [93207, 0, "i"], + [93208, 0, "s"], + [93209, 0, "t"], + [93210, 0, ":"], + [93211, 0, " "], + [93212, 0, "L"], + [93213, 0, "e"], + [93214, 0, "m"], + [93215, 0, "m"], + [93216, 0, "a"], + [93217, 0, "~"], + [93218, 0, "\\"], + [93219, 0, "r"], + [93220, 0, "e"], + [93221, 0, "f"], + [93222, 0, "{"], + [93223, 0, "l"], + [93224, 0, "e"], + [93225, 0, "m"], + [93226, 0, ":"], + [93227, 0, "i"], + [93228, 0, "n"], + [93229, 0, "s"], + [93230, 0, "e"], + [93231, 0, "r"], + [93232, 0, "t"], + [93233, 0, "-"], + [93234, 0, "r"], + [93235, 0, "e"], + [93236, 0, "o"], + [93237, 0, "r"], + [93238, 0, "d"], + [93239, 0, "e"], + [93240, 0, "r"], + [93241, 0, "}"], + [93242, 0, ";"], + [93243, 0, " "], + [93244, 0, "d"], + [93245, 0, "e"], + [93246, 0, "l"], + [93247, 0, "e"], + [93248, 0, "t"], + [93249, 0, "i"], + [93250, 0, "o"], + [93251, 0, "n"], + [93252, 0, ":"], + [93253, 0, " "], + [93254, 0, "L"], + [93255, 0, "e"], + [93256, 0, "m"], + [93257, 0, "m"], + [93258, 0, "a"], + [93259, 0, "~"], + [93260, 0, "\\"], + [93261, 0, "r"], + [93262, 0, "e"], + [93263, 0, "f"], + [93264, 0, "{"], + [93265, 0, ":"], + [93265, 1], + [93265, 0, "l"], + [93266, 0, "e"], + [93267, 0, "m"], + [93268, 0, ":"], + [93269, 0, "d"], + [93270, 0, "e"], + [93271, 0, "l"], + [93272, 0, "e"], + [93273, 0, "t"], + [93274, 0, "e"], + [93275, 0, "-"], + [93276, 0, "c"], + [93277, 0, "o"], + [93278, 0, "m"], + [93279, 0, "m"], + [93280, 0, "u"], + [93281, 0, "t"], + [93282, 0, "e"], + [93283, 0, "}"], + [93284, 0, ";"], + [93285, 0, " "], + [93286, 0, "a"], + [93287, 0, "s"], + [93288, 0, "s"], + [93289, 0, "i"], + [93290, 0, "g"], + [93291, 0, "n"], + [93292, 0, "m"], + [93293, 0, "e"], + [93294, 0, "n"], + [93295, 0, "t"], + [93296, 0, ":"], + [93297, 0, " "], + [93298, 0, "L"], + [93299, 0, "e"], + [93300, 0, "m"], + [93301, 0, "m"], + [93302, 0, "a"], + [93303, 0, "~"], + [93304, 0, "\\"], + [93305, 0, "r"], + [93306, 0, "e"], + [93307, 0, "f"], + [93308, 0, "{"], + [93309, 0, "l"], + [93310, 0, "e"], + [93311, 0, "m"], + [93312, 0, ":"], + [93313, 0, "a"], + [93314, 0, "s"], + [93315, 0, "s"], + [93316, 0, "i"], + [93317, 0, "g"], + [93318, 0, "n"], + [93319, 0, "-"], + [93320, 0, "c"], + [93321, 0, "o"], + [93322, 0, "m"], + [93323, 0, "m"], + [93324, 0, "u"], + [93325, 0, "t"], + [93326, 0, "e"], + [93327, 0, "}"], + [93328, 0, "."], + [78214, 0, ","], + [78215, 0, " "], + [78216, 0, "i"], + [78217, 0, "n"], + [78218, 0, " "], + [78219, 0, "L"], + [78220, 0, "e"], + [78221, 0, "m"], + [78222, 0, "m"], + [78223, 0, "a"], + [78224, 0, "~"], + [78225, 0, "\\"], + [78226, 0, "r"], + [78227, 0, "e"], + [78228, 0, "f"], + [78229, 0, "{"], + [78058, 0, " "], + [78059, 0, "i"], + [78060, 0, "n"], + [78061, 0, " "], + [78062, 0, "L"], + [78063, 0, "e"], + [78064, 0, "m"], + [78065, 0, "m"], + [78066, 0, "a"], + [78067, 0, "~"], + [78068, 0, "\\"], + [78069, 0, "r"], + [78070, 0, "e"], + [78071, 0, "f"], + [78072, 0, "{"], + [78073, 0, "l"], + [78074, 0, "e"], + [78075, 0, "m"], + [78076, 0, ":"], + [78077, 0, "o"], + [78078, 0, "p"], + [78079, 0, "-"], + [78080, 0, "c"], + [78081, 0, "o"], + [78082, 0, "m"], + [78083, 0, "m"], + [78084, 0, "u"], + [78085, 0, "t"], + [78086, 0, "e"], + [78087, 0, "}"], + [78494, 1], + [78493, 1], + [78492, 1], + [78491, 1], + [78490, 1], + [78489, 1], + [78488, 1], + [78487, 1], + [78486, 1], + [78485, 1], + [78484, 1], + [78483, 1], + [78482, 1], + [78481, 1], + [78480, 1], + [78479, 1], + [78478, 1], + [78477, 1], + [78476, 1], + [78475, 1], + [78474, 1], + [78473, 1], + [78472, 1], + [78471, 1], + [78470, 1], + [78469, 1], + [78468, 1], + [78467, 1], + [78466, 1], + [78465, 1], + [78464, 1], + [78463, 1], + [78462, 1], + [78461, 1], + [78460, 1], + [78459, 1], + [78458, 1], + [78457, 1], + [78456, 1], + [78455, 1], + [78454, 1], + [78453, 1], + [78452, 1], + [78451, 1], + [78450, 1], + [78449, 1], + [78448, 1], + [78447, 1], + [78446, 1], + [78445, 1], + [78444, 1], + [78443, 1], + [78442, 1], + [78441, 1], + [78440, 1], + [78439, 1], + [78438, 1], + [78437, 1], + [78436, 1], + [78435, 1], + [78434, 1], + [78433, 1], + [78432, 1], + [78431, 1], + [78430, 1], + [78429, 1], + [78428, 1], + [78427, 1], + [78426, 1], + [78425, 1], + [78424, 1], + [78423, 1], + [78422, 1], + [78421, 1], + [78420, 1], + [78419, 1], + [78418, 1], + [78417, 1], + [78416, 1], + [78415, 1], + [78414, 1], + [78413, 1], + [78412, 1], + [78411, 1], + [78410, 1], + [78409, 1], + [78408, 1], + [78407, 1], + [78406, 1], + [78405, 1], + [78404, 1], + [78403, 1], + [78402, 1], + [78401, 1], + [78400, 1], + [78399, 1], + [78398, 1], + [78397, 1], + [78396, 1], + [78395, 1], + [78394, 1], + [78393, 1], + [78392, 1], + [78391, 1], + [78390, 1], + [78389, 1], + [78388, 1], + [78387, 1], + [78386, 1], + [78385, 1], + [78384, 1], + [78383, 1], + [78382, 1], + [78381, 1], + [78380, 1], + [78379, 1], + [78378, 1], + [78377, 1], + [78376, 1], + [78375, 1], + [78374, 1], + [78373, 1], + [78372, 1], + [78371, 1], + [78370, 1], + [78369, 1], + [78368, 1], + [78367, 1], + [78366, 1], + [78365, 1], + [78364, 1], + [78363, 1], + [78362, 1], + [78361, 1], + [78360, 1], + [78359, 1], + [78358, 1], + [78357, 1], + [78356, 1], + [78355, 1], + [78354, 1], + [78353, 1], + [78352, 1], + [78351, 1], + [78350, 1], + [78349, 1], + [78348, 1], + [78347, 1], + [78346, 1], + [78345, 1], + [78344, 1], + [78343, 1], + [78342, 1], + [78341, 1], + [78340, 1], + [78339, 1], + [78338, 1], + [78337, 1], + [78336, 1], + [78335, 1], + [78334, 1], + [78333, 1], + [78332, 1], + [78331, 1], + [78330, 1], + [78329, 1], + [78328, 1], + [78327, 1], + [78326, 1], + [78325, 1], + [78324, 1], + [78323, 1], + [78322, 1], + [78321, 1], + [78320, 1], + [78319, 1], + [78318, 1], + [78317, 1], + [78316, 1], + [78315, 1], + [78314, 1], + [78313, 1], + [78312, 1], + [78311, 1], + [78310, 1], + [78309, 1], + [78308, 1], + [78307, 1], + [78306, 1], + [78305, 1], + [78304, 1], + [78303, 1], + [78302, 1], + [78301, 1], + [78300, 1], + [78299, 1], + [78298, 1], + [78297, 1], + [78296, 1], + [78295, 1], + [78294, 1], + [78293, 1], + [78292, 1], + [78291, 1], + [78290, 1], + [78289, 1], + [78288, 1], + [78287, 1], + [78286, 1], + [78285, 1], + [78284, 1], + [78283, 1], + [78282, 1], + [78281, 1], + [78280, 1], + [78279, 1], + [78278, 1], + [78277, 1], + [78276, 1], + [78275, 1], + [78274, 1], + [78273, 1], + [78272, 1], + [78271, 1], + [78270, 1], + [78269, 1], + [78268, 1], + [78267, 1], + [78266, 1], + [78265, 1], + [78264, 1], + [78263, 1], + [78262, 1], + [78261, 1], + [78260, 1], + [78259, 1], + [78258, 1], + [78257, 1], + [78256, 1], + [78255, 1], + [78254, 1], + [78253, 1], + [78252, 1], + [78251, 1], + [78250, 1], + [78249, 1], + [78248, 1], + [78247, 1], + [78246, 1], + [78245, 1], + [78244, 1], + [78244, 0, "."], + [78333, 1], + [78332, 1], + [78331, 1], + [78330, 1], + [78329, 1], + [78328, 1], + [78327, 1], + [78326, 1], + [78325, 1], + [78324, 1], + [78323, 1], + [78322, 1], + [78321, 1], + [78320, 1], + [78319, 1], + [78318, 1], + [78317, 1], + [78316, 1], + [78315, 1], + [78314, 1], + [78313, 1], + [78312, 1], + [78311, 1], + [78310, 1], + [78309, 1], + [78308, 1], + [78307, 1], + [78306, 1], + [78305, 1], + [78304, 1], + [78303, 1], + [78302, 1], + [78301, 1], + [78300, 1], + [78300, 0, "o"], + [78301, 0, "p"], + [78302, 0, "e"], + [78303, 0, "r"], + [78304, 0, "a"], + [78305, 0, "t"], + [78306, 0, "i"], + [78307, 0, "o"], + [78308, 0, "n"], + [78309, 0, "s"], + [92955, 0, "\n"], + [92956, 0, "\\"], + [92957, 0, "e"], + [92958, 0, "n"], + [92959, 0, "d"], + [92960, 0, "{"], + [92961, 0, "l"], + [92962, 0, "e"], + [92963, 0, "m"], + [92964, 0, "m"], + [92965, 0, "a"], + [92966, 0, "}"], + [92967, 0, "\n"], + [92968, 0, "\n"], + [92969, 0, "\\"], + [92970, 0, "b"], + [92971, 0, "e"], + [92972, 0, "g"], + [92973, 0, "i"], + [92974, 0, "n"], + [92975, 0, "{"], + [92976, 0, "p"], + [92977, 0, "r"], + [92978, 0, "o"], + [92979, 0, "o"], + [92980, 0, "f"], + [92981, 0, "}"], + [93138, 1], + [93137, 1], + [93136, 1], + [93135, 1], + [93134, 1], + [93134, 0, "p"], + [93135, 0, "r"], + [93136, 0, "o"], + [93137, 0, "o"], + [93138, 0, "f"], + [92956, 0, "\n"], + [92956, 0, "G"], + [92957, 0, "i"], + [92958, 0, "v"], + [92959, 0, "e"], + [92960, 0, "n"], + [92961, 0, " "], + [92962, 0, "a"], + [92963, 0, "n"], + [92964, 0, " "], + [92965, 0, "o"], + [92966, 0, "p"], + [92967, 0, "e"], + [92968, 0, "r"], + [92969, 0, "a"], + [92970, 0, "t"], + [92971, 0, "i"], + [92972, 0, "o"], + [92973, 0, "n"], + [92974, 0, " "], + [92975, 0, "h"], + [92976, 0, "i"], + [92977, 0, "s"], + [92978, 0, "t"], + [92979, 0, "o"], + [92980, 0, "r"], + [92981, 0, "h"], + [92982, 0, " "], + [92983, 0, "$"], + [92983, 1], + [92982, 1], + [92981, 1], + [92981, 0, "y"], + [92982, 0, " "], + [92983, 0, "$"], + [92984, 0, "H"], + [92985, 0, "="], + [92986, 0, "\\"], + [92987, 0, "l"], + [92988, 0, "a"], + [92989, 0, "n"], + [92990, 0, "g"], + [92991, 0, "l"], + [92992, 0, "e"], + [92993, 0, " "], + [92994, 0, "o"], + [92995, 0, "_"], + [92996, 0, "1"], + [92997, 0, ","], + [92998, 0, " "], + [92999, 0, "\\"], + [93000, 0, "d"], + [93001, 0, "o"], + [93002, 0, "t"], + [93003, 0, "s"], + [93004, 0, ","], + [93005, 0, " "], + [93006, 0, "o"], + [93007, 0, "_"], + [93008, 0, "n"], + [93009, 0, " "], + [93010, 0, "\\"], + [93011, 0, "r"], + [93012, 0, "a"], + [93013, 0, "n"], + [93014, 0, "g"], + [93015, 0, "l"], + [93016, 0, "e"], + [93017, 0, "$"], + [93018, 0, ","], + [93019, 0, " "], + [93020, 0, "a"], + [93021, 0, " "], + [93022, 0, "n"], + [93023, 0, "e"], + [93024, 0, "w"], + [93025, 0, " "], + [93026, 0, "o"], + [93027, 0, "p"], + [93028, 0, "e"], + [93029, 0, "r"], + [93030, 0, "a"], + [93031, 0, "t"], + [93032, 0, "i"], + [93033, 0, "o"], + [93034, 0, "n"], + [93035, 0, " "], + [93018, 0, " "], + [93019, 0, "f"], + [93020, 0, "r"], + [93021, 0, "o"], + [93022, 0, "m"], + [93023, 0, " "], + [93024, 0, "a"], + [93025, 0, " "], + [93026, 0, "v"], + [93027, 0, "a"], + [93028, 0, "l"], + [93029, 0, "i"], + [93030, 0, "d"], + [93031, 0, " "], + [93032, 0, "e"], + [93033, 0, "x"], + [93034, 0, "e"], + [93035, 0, "c"], + [93036, 0, "u"], + [93037, 0, "t"], + [93038, 0, "i"], + [93039, 0, "o"], + [93040, 0, "n"], + [93059, 0, "$"], + [93060, 0, "o"], + [93061, 0, "_"], + [93062, 0, "{"], + [93063, 0, "n"], + [93064, 0, "+"], + [93065, 0, "1"], + [93066, 0, "}"], + [93067, 0, "$"], + [93068, 0, " "], + [93069, 0, "f"], + [93070, 0, "r"], + [93071, 0, "o"], + [93072, 0, "m"], + [93073, 0, " "], + [93074, 0, "t"], + [93075, 0, "h"], + [93076, 0, "a"], + [93077, 0, "t"], + [93078, 0, " "], + [93079, 0, "e"], + [93080, 0, "x"], + [93081, 0, "e"], + [93082, 0, "c"], + [93083, 0, "u"], + [93084, 0, "t"], + [93085, 0, "i"], + [93086, 0, "o"], + [93087, 0, "n"], + [93088, 0, " "], + [93089, 0, "c"], + [93090, 0, "a"], + [93091, 0, "n"], + [93092, 0, " "], + [93093, 0, "b"], + [93094, 0, "e"], + [93095, 0, " "], + [93096, 0, "i"], + [93097, 0, "n"], + [93098, 0, "s"], + [93099, 0, "e"], + [93100, 0, "r"], + [93101, 0, "t"], + [93102, 0, "e"], + [93103, 0, "d"], + [93104, 0, " "], + [93105, 0, "a"], + [93106, 0, "t"], + [93107, 0, " "], + [93108, 0, "a"], + [93109, 0, "n"], + [93110, 0, "y"], + [93111, 0, " "], + [93112, 0, "p"], + [93113, 0, "o"], + [93114, 0, "i"], + [93115, 0, "n"], + [93116, 0, "t"], + [93117, 0, " "], + [93118, 0, "i"], + [93119, 0, "n"], + [93120, 0, " "], + [93121, 0, "$"], + [93122, 0, "H"], + [93123, 0, "$"], + [93124, 0, " "], + [93125, 0, "w"], + [93126, 0, "h"], + [93127, 0, "e"], + [93128, 0, "r"], + [93129, 0, "e"], + [93130, 0, " "], + [93131, 0, "t"], + [93132, 0, "h"], + [93133, 0, "e"], + [93134, 0, " "], + [93135, 0, "c"], + [93136, 0, "a"], + [93137, 0, "u"], + [93138, 0, "s"], + [93139, 0, "a"], + [93140, 0, "l"], + [93141, 0, " "], + [93142, 0, "d"], + [93143, 0, "e"], + [93144, 0, "p"], + [93145, 0, "e"], + [93146, 0, "n"], + [93147, 0, "d"], + [93148, 0, "e"], + [93149, 0, "n"], + [93150, 0, "c"], + [93151, 0, "i"], + [93152, 0, "e"], + [93153, 0, "s"], + [93154, 0, " "], + [93154, 1], + [93153, 1], + [93152, 1], + [93151, 1], + [93150, 1], + [93149, 1], + [93148, 1], + [93147, 1], + [93146, 1], + [93145, 1], + [93144, 1], + [93143, 1], + [93142, 1], + [93141, 1], + [93140, 1], + [93139, 1], + [93138, 1], + [93137, 1], + [93136, 1], + [93135, 1], + [93134, 1], + [93133, 1], + [93132, 1], + [93131, 1], + [93130, 1], + [93129, 1], + [93128, 1], + [93127, 1], + [93126, 1], + [93125, 1], + [93124, 1], + [93124, 0, " "], + [93125, 0, "a"], + [93126, 0, "f"], + [93127, 0, "t"], + [93128, 0, "e"], + [93129, 0, "r"], + [93130, 0, " "], + [93131, 0, "$"], + [93132, 0, "o"], + [93133, 0, "{"], + [93133, 1], + [93133, 0, "_"], + [93134, 0, "{"], + [93135, 0, "n"], + [93136, 0, "+"], + [93137, 0, "1"], + [93138, 0, "}"], + [93139, 0, "."], + [93140, 0, "\\"], + [93141, 0, "m"], + [93142, 0, "a"], + [93143, 0, "t"], + [93144, 0, "h"], + [93145, 0, "i"], + [93146, 0, "t"], + [93147, 0, "{"], + [93148, 0, "d"], + [93149, 0, "e"], + [93150, 0, "p"], + [93151, 0, "s"], + [93152, 0, "}"], + [93153, 0, "$"], + [93154, 0, " "], + [93155, 0, "h"], + [93156, 0, "a"], + [93157, 0, "v"], + [93158, 0, "e"], + [93159, 0, " "], + [93160, 0, "b"], + [93161, 0, "e"], + [93162, 0, "e"], + [93163, 0, "n"], + [93164, 0, " "], + [93165, 0, "a"], + [93166, 0, "p"], + [93167, 0, "p"], + [93168, 0, "l"], + [93169, 0, "i"], + [93170, 0, "e"], + [93171, 0, "d"], + [93172, 0, "."], + [93173, 0, " "], + [93174, 0, "T"], + [93174, 1], + [93174, 0, "A"], + [93175, 0, "l"], + [93176, 0, "l"], + [93177, 0, " "], + [93178, 0, "r"], + [93179, 0, "e"], + [93180, 0, "s"], + [93181, 0, "u"], + [93182, 0, "l"], + [93183, 0, "t"], + [93184, 0, "i"], + [93185, 0, "n"], + [93186, 0, "g"], + [93187, 0, " "], + [93187, 1], + [93186, 1], + [93185, 1], + [93184, 1], + [93183, 1], + [93182, 1], + [93181, 1], + [93180, 1], + [93179, 1], + [93178, 1], + [93177, 1], + [93177, 0, " "], + [93178, 0, "h"], + [93179, 0, "i"], + [93180, 0, "s"], + [93181, 0, "t"], + [93182, 0, "o"], + [93183, 0, "r"], + [93184, 0, "i"], + [93185, 0, "e"], + [93186, 0, "s"], + [93187, 0, " "], + [93188, 0, "t"], + [93189, 0, "h"], + [93190, 0, "a"], + [93191, 0, "t"], + [93192, 0, " "], + [93174, 0, "F"], + [93175, 0, "o"], + [93176, 0, "r"], + [93177, 0, " "], + [93178, 1], + [93178, 0, "a"], + [93197, 0, "c"], + [93198, 0, "a"], + [93199, 0, "n"], + [93200, 0, " "], + [93201, 0, "b"], + [93202, 0, "e"], + [93203, 0, " "], + [93204, 0, "c"], + [93205, 0, "o"], + [93206, 0, "n"], + [93207, 0, "s"], + [93208, 0, "t"], + [93209, 0, "r"], + [93210, 0, "u"], + [93211, 0, "c"], + [93212, 0, "t"], + [93213, 0, "e"], + [93214, 0, "d"], + [93215, 0, " "], + [93216, 0, "t"], + [93217, 0, "h"], + [93218, 0, "i"], + [93219, 0, "s"], + [93220, 0, " "], + [93221, 0, "w"], + [93222, 0, "a"], + [93223, 0, "y"], + [93224, 0, ","], + [93225, 0, " "], + [93226, 0, "t"], + [93227, 0, "h"], + [93228, 0, "e"], + [93229, 0, " "], + [93230, 0, "d"], + [93231, 0, "o"], + [93232, 0, "c"], + [93233, 0, "u"], + [93234, 0, "m"], + [93235, 0, "e"], + [93236, 0, "n"], + [93237, 0, "t"], + [93238, 0, " "], + [93239, 0, "s"], + [93240, 0, "t"], + [93241, 0, "a"], + [93242, 0, "t"], + [93243, 0, "e"], + [93244, 0, " "], + [93245, 0, "r"], + [93246, 0, "e"], + [93247, 0, "s"], + [93248, 0, "u"], + [93249, 0, "l"], + [93250, 0, "t"], + [93251, 0, "i"], + [93252, 0, "n"], + [93253, 0, "g"], + [93254, 0, " "], + [93255, 0, "f"], + [93256, 0, "r"], + [93257, 0, "o"], + [93258, 0, "m"], + [93259, 0, " "], + [93192, 0, "$"], + [93193, 0, "H"], + [93194, 0, "'"], + [93195, 0, "$"], + [93196, 0, " "], + [93265, 0, "a"], + [93266, 0, "p"], + [93267, 0, "p"], + [93268, 0, "l"], + [93269, 0, "y"], + [93270, 0, "i"], + [93271, 0, "n"], + [93272, 0, "g"], + [93273, 0, " "], + [93274, 0, "t"], + [93275, 0, "h"], + [93276, 0, "e"], + [93277, 0, " "], + [93278, 0, "o"], + [93279, 0, "p"], + [93280, 0, "e"], + [93281, 0, "r"], + [93282, 0, "a"], + [93283, 0, "t"], + [93284, 0, "i"], + [93285, 0, "o"], + [93286, 0, "n"], + [93287, 0, "s"], + [93288, 0, " "], + [93289, 0, "i"], + [93290, 0, "n"], + [93291, 0, " "], + [93292, 0, "$"], + [93293, 0, "H"], + [93294, 0, "'"], + [93295, 0, "$"], + [93296, 0, " "], + [93297, 0, "i"], + [93298, 0, "n"], + [93299, 0, " "], + [93300, 0, "o"], + [93301, 0, "r"], + [93302, 0, "d"], + [93303, 0, "e"], + [93304, 0, "r"], + [93305, 0, " "], + [93306, 0, "i"], + [93307, 0, "s"], + [93308, 0, " "], + [93309, 0, "t"], + [93310, 0, "h"], + [93311, 0, "e"], + [93312, 0, " "], + [93313, 0, "s"], + [93314, 0, "a"], + [93315, 0, "m"], + [93316, 0, "e"], + [93317, 0, ","], + [93318, 0, " "], + [93319, 0, "a"], + [93320, 0, "n"], + [93321, 0, "d"], + [93322, 0, " "], + [93323, 0, "i"], + [93324, 0, "n"], + [93325, 0, "d"], + [93326, 0, "e"], + [93327, 0, "p"], + [93328, 0, "e"], + [93329, 0, "n"], + [93330, 0, "d"], + [93331, 0, "e"], + [93332, 0, "n"], + [93333, 0, "t"], + [93334, 0, " "], + [93335, 0, "o"], + [93336, 0, "f"], + [93337, 0, " "], + [93338, 0, "t"], + [93339, 0, "h"], + [93340, 0, "e"], + [93341, 0, " "], + [93342, 0, "o"], + [93343, 0, "r"], + [93344, 0, "d"], + [93345, 0, "e"], + [93346, 0, "r"], + [93347, 0, "i"], + [93348, 0, "n"], + [93349, 0, "g"], + [93350, 0, " "], + [93351, 0, "o"], + [93352, 0, "f"], + [93353, 0, " "], + [93354, 0, "a"], + [93355, 0, "n"], + [93356, 0, "y"], + [93357, 0, " "], + [93358, 0, "c"], + [93359, 0, "o"], + [93360, 0, "n"], + [93361, 0, "c"], + [93362, 0, "u"], + [93363, 0, "r"], + [93364, 0, "r"], + [93365, 0, "e"], + [93366, 0, "n"], + [93367, 0, "t"], + [93368, 0, " "], + [93369, 0, "o"], + [93370, 0, "p"], + [93371, 0, "e"], + [93372, 0, "r"], + [93373, 0, "a"], + [93374, 0, "t"], + [93375, 0, "i"], + [93376, 0, "o"], + [93377, 0, "n"], + [93378, 0, "s"], + [93379, 0, " "], + [93380, 0, "i"], + [93381, 0, "n"], + [93382, 0, " "], + [93383, 0, "$"], + [93384, 0, "H"], + [93385, 0, "$"], + [93386, 0, "."], + [93414, 0, "\n"], + [93415, 0, "\n"], + [93415, 0, "W"], + [93416, 0, "e"], + [93417, 0, " "], + [93418, 0, "p"], + [93419, 0, "r"], + [93420, 0, "o"], + [93421, 0, "v"], + [93422, 0, "e"], + [93423, 0, " "], + [93424, 0, "t"], + [93425, 0, "h"], + [93426, 0, "e"], + [93427, 0, " "], + [93428, 0, "l"], + [93429, 0, "e"], + [93430, 0, "m"], + [93431, 0, "m"], + [93432, 0, "a"], + [93433, 0, " "], + [93434, 0, "c"], + [93435, 0, "a"], + [93436, 0, "s"], + [93437, 0, "e"], + [93438, 0, "-"], + [93439, 0, "b"], + [93440, 0, "y"], + [93441, 0, "-"], + [93442, 0, "c"], + [93443, 0, "a"], + [93444, 0, "s"], + [93445, 0, "e"], + [93446, 0, ","], + [93447, 0, " "], + [93448, 0, "d"], + [93449, 0, "e"], + [93450, 0, "p"], + [93451, 0, "e"], + [93452, 0, "n"], + [93453, 0, "d"], + [93454, 0, "i"], + [93455, 0, "n"], + [93456, 0, "g"], + [93457, 0, " "], + [93458, 0, "o"], + [93459, 0, "n"], + [93460, 0, " "], + [93461, 0, "t"], + [93462, 0, "h"], + [93463, 0, "e"], + [93464, 0, " "], + [93465, 0, "t"], + [93466, 0, "h"], + [93467, 0, "y"], + [93468, 0, "p"], + [93469, 0, "e"], + [93470, 0, " "], + [93470, 1], + [93469, 1], + [93468, 1], + [93467, 1], + [93466, 1], + [93466, 0, "y"], + [93467, 0, "p"], + [93468, 0, "e"], + [93469, 0, " "], + [93470, 0, "o"], + [93471, 0, "f"], + [93472, 0, " "], + [93473, 0, "m"], + [93474, 0, "u"], + [93475, 0, "t"], + [93476, 0, "a"], + [93477, 0, "t"], + [93478, 0, "i"], + [93479, 0, "o"], + [93480, 0, "n"], + [93481, 0, " "], + [93482, 0, "i"], + [93483, 0, "n"], + [93484, 0, " "], + [93485, 0, "$"], + [93486, 0, "o"], + [93487, 0, "_"], + [93488, 0, "{"], + [93489, 0, "n"], + [93490, 0, "+"], + [93491, 0, "1"], + [93492, 0, "}"], + [93493, 0, "$"], + [93494, 0, "."], + [93495, 0, " "], + [93414, 0, "\n"], + [93415, 0, "$"], + [93416, 0, "H"], + [93417, 0, "$"], + [93418, 0, " "], + [93419, 0, "c"], + [93420, 0, "a"], + [93421, 0, "n"], + [93422, 0, " "], + [93423, 0, "b"], + [93424, 0, "e"], + [93425, 0, " "], + [93426, 0, "s"], + [93427, 0, "p"], + [93428, 0, "l"], + [93429, 0, "i"], + [93430, 0, "t"], + [93431, 0, " "], + [93432, 0, "i"], + [93433, 0, "n"], + [93434, 0, "t"], + [93435, 0, "o"], + [93436, 0, " "], + [93437, 0, "a"], + [93438, 0, " "], + [93439, 0, "p"], + [93440, 0, "r"], + [93441, 0, "e"], + [93442, 0, "f"], + [93443, 0, "i"], + [93444, 0, "x"], + [93445, 0, " "], + [93446, 0, "a"], + [93447, 0, "n"], + [93448, 0, "d"], + [93449, 0, " "], + [93450, 0, "a"], + [93451, 0, " "], + [93452, 0, "s"], + [93453, 0, "u"], + [93454, 0, "f"], + [93455, 0, "f"], + [93456, 0, "i"], + [93457, 0, "x"], + [93458, 0, ","], + [93459, 0, " "], + [93460, 0, "a"], + [93461, 0, "s"], + [93462, 0, " "], + [93463, 0, "d"], + [93464, 0, "e"], + [93465, 0, "s"], + [93466, 0, "c"], + [93467, 0, "r"], + [93468, 0, "i"], + [93469, 0, "b"], + [93470, 0, "e"], + [93471, 0, "d"], + [93472, 0, " "], + [93473, 0, "i"], + [93474, 0, "n"], + [93475, 0, " "], + [93476, 0, "t"], + [93477, 0, "h"], + [93478, 0, "e"], + [93479, 0, " "], + [93480, 0, "p"], + [93481, 0, "r"], + [93482, 0, "o"], + [93483, 0, "o"], + [93484, 0, "f"], + [93485, 0, " "], + [93486, 0, "o"], + [93487, 0, "f"], + [93488, 0, " "], + [93489, 0, "T"], + [93490, 0, "h"], + [93491, 0, "e"], + [93492, 0, "o"], + [93493, 0, "r"], + [93494, 0, "e"], + [93495, 0, "m"], + [93496, 0, "~"], + [93497, 0, "\\"], + [93498, 0, "r"], + [93499, 0, "e"], + [93500, 0, "f"], + [93501, 0, "{"], + [93502, 0, "t"], + [93503, 0, "h"], + [93504, 0, "m"], + [93505, 0, ":"], + [93506, 0, "c"], + [93507, 0, "o"], + [93508, 0, "n"], + [93509, 0, "v"], + [93510, 0, "e"], + [93511, 0, "r"], + [93512, 0, "g"], + [93513, 0, "e"], + [93514, 0, "n"], + [93515, 0, "c"], + [93516, 0, "e"], + [93517, 0, "}"], + [93518, 0, "."], + [93519, 0, " "], + [93520, 0, "W"], + [93521, 0, "e"], + [93522, 0, " "], + [93523, 0, "a"], + [93524, 0, "l"], + [93525, 0, "l"], + [93526, 0, "o"], + [93527, 0, "w"], + [93528, 0, " "], + [93529, 0, "$"], + [93530, 0, "o"], + [93531, 0, "_"], + [93532, 0, "{"], + [93533, 0, "n"], + [93534, 0, "+"], + [93535, 0, "1"], + [93536, 0, "}"], + [93537, 0, "$"], + [93538, 0, " "], + [93539, 0, "t"], + [93540, 0, "o"], + [93541, 0, " "], + [93542, 0, "b"], + [93543, 0, "e"], + [93544, 0, " "], + [93545, 0, "i"], + [93546, 0, "n"], + [93547, 0, "s"], + [93548, 0, "e"], + [93549, 0, "r"], + [93550, 0, "t"], + [93551, 0, "e"], + [93552, 0, "d"], + [93553, 0, " "], + [93554, 0, "a"], + [93555, 0, "t"], + [93556, 0, " "], + [93557, 0, "a"], + [93558, 0, "n"], + [93559, 0, "y"], + [93560, 0, " "], + [93561, 0, "p"], + [93562, 0, "o"], + [93563, 0, "i"], + [93564, 0, "n"], + [93565, 0, "t"], + [93566, 0, " "], + [93567, 0, "a"], + [93568, 0, "f"], + [93569, 0, "t"], + [93570, 0, "e"], + [93571, 0, "r"], + [93572, 0, " "], + [93573, 0, "t"], + [93574, 0, "h"], + [93575, 0, "e"], + [93576, 0, " "], + [93577, 0, "p"], + [93578, 0, "r"], + [93579, 0, "e"], + [93580, 0, "f"], + [93581, 0, "i"], + [93582, 0, "x"], + [93583, 0, ","], + [93584, 0, " "], + [93519, 0, " "], + [93520, 0, "T"], + [93521, 0, "h"], + [93522, 0, "e"], + [93523, 0, " "], + [93524, 0, "s"], + [93525, 0, "u"], + [93526, 0, "f"], + [93527, 0, "f"], + [93528, 0, "i"], + [93529, 0, "x"], + [93530, 0, " "], + [93531, 0, "c"], + [93532, 0, "o"], + [93533, 0, "n"], + [93534, 0, "t"], + [93535, 0, "a"], + [93536, 0, "i"], + [93537, 0, "n"], + [93538, 0, "s"], + [93539, 0, " "], + [93540, 0, "o"], + [93541, 0, "n"], + [93542, 0, "l"], + [93543, 0, "y"], + [93544, 0, " "], + [93545, 0, "o"], + [93546, 0, "p"], + [93547, 0, "e"], + [93548, 0, "r"], + [93549, 0, "a"], + [93550, 0, "t"], + [93551, 0, "i"], + [93552, 0, "o"], + [93553, 0, "n"], + [93554, 0, "s"], + [93555, 0, " "], + [93556, 0, "t"], + [93557, 0, "h"], + [93558, 0, "a"], + [93559, 0, "t"], + [93560, 0, " "], + [93561, 0, "a"], + [93562, 0, "r"], + [93563, 0, "e"], + [93564, 0, " "], + [93565, 0, "c"], + [93566, 0, "o"], + [93567, 0, "n"], + [93568, 0, "c"], + [93569, 0, "u"], + [93570, 0, "r"], + [93571, 0, "r"], + [93572, 0, "e"], + [93573, 0, "n"], + [93574, 0, "t"], + [93575, 0, " "], + [93576, 0, "w"], + [93577, 0, "i"], + [93578, 0, "t"], + [93579, 0, "h"], + [93580, 0, " "], + [93581, 0, "$"], + [93582, 0, "o"], + [93583, 0, "_"], + [93584, 0, "{"], + [93585, 0, "n"], + [93586, 0, "+"], + [93587, 0, "1"], + [93588, 0, "}"], + [93589, 0, "$"], + [93590, 0, "."], + [93592, 1], + [93591, 1], + [93590, 1], + [93590, 0, ","], + [93591, 0, " "], + [93592, 0, "a"], + [93593, 0, "n"], + [93594, 0, "d"], + [93595, 0, " "], + [93596, 0, "w"], + [93660, 1], + [93659, 1], + [93659, 0, "."], + [93660, 0, " "], + [93661, 1], + [93663, 0, " "], + [93664, 0, "t"], + [93665, 0, "h"], + [93666, 0, "e"], + [93667, 0, "n"], + [93748, 0, "\n"], + [93749, 0, "\n"], + [93749, 0, "I"], + [93750, 0, "f"], + [93751, 0, " "], + [93752, 0, "$"], + [93753, 0, "o"], + [93754, 0, "_"], + [93755, 0, "n"], + [93756, 0, "{"], + [93756, 1], + [93755, 1], + [93755, 0, "{"], + [93756, 0, "n"], + [93757, 0, "+"], + [93758, 0, "1"], + [93759, 0, "}"], + [93760, 0, "$"], + [93761, 0, " "], + [93762, 0, "i"], + [93763, 0, "s"], + [93764, 0, " "], + [93765, 0, "a"], + [93766, 0, " "], + [93767, 0, "d"], + [93768, 0, "e"], + [93769, 0, "l"], + [93770, 0, "e"], + [93771, 0, "t"], + [93772, 0, "i"], + [93773, 0, "o"], + [93774, 0, "n"], + [93775, 0, ","], + [93776, 0, " "], + [93777, 0, "b"], + [93778, 0, "y"], + [93779, 0, " "], + [93780, 0, "L"], + [93781, 0, "e"], + [93782, 0, "m"], + [93783, 0, "m"], + [93784, 0, "a"], + [93785, 0, "~"], + [93786, 0, "\\"], + [93787, 0, "r"], + [93788, 0, "e"], + [93789, 0, "f"], + [93790, 0, "{"], + [93791, 0, "l"], + [93792, 0, "e"], + [93793, 0, "m"], + [93794, 0, ":"], + [93795, 0, "d"], + [93796, 0, "e"], + [93797, 0, "l"], + [93798, 0, "e"], + [93799, 0, "t"], + [93800, 0, "e"], + [93801, 0, "-"], + [93802, 0, "c"], + [93803, 0, "o"], + [93804, 0, "m"], + [93805, 0, "m"], + [93806, 0, "u"], + [93807, 0, "t"], + [93808, 0, "e"], + [93809, 0, "}"], + [93810, 0, " "], + [93811, 0, "i"], + [93812, 0, "t"], + [93813, 0, " "], + [93814, 0, "i"], + [93815, 0, "s"], + [93816, 0, " "], + [93817, 0, "c"], + [93818, 0, "o"], + [93819, 0, "n"], + [93820, 0, "c"], + [93821, 0, "u"], + [93822, 0, "r"], + [93823, 0, "r"], + [93824, 0, "e"], + [93825, 0, "n"], + [93826, 0, "t"], + [93827, 0, " "], + [93828, 0, "w"], + [93829, 0, "i"], + [93830, 0, "t"], + [93831, 0, "h"], + [93832, 0, " "], + [93833, 0, "a"], + [93834, 0, "l"], + [93835, 0, "l"], + [93836, 0, " "], + [93837, 0, "o"], + [93838, 0, "p"], + [93839, 0, "e"], + [93839, 1], + [93838, 1], + [93837, 1], + [93836, 1], + [93835, 1], + [93834, 1], + [93833, 1], + [93832, 1], + [93831, 1], + [93830, 1], + [93829, 1], + [93828, 1], + [93827, 1], + [93826, 1], + [93825, 1], + [93824, 1], + [93823, 1], + [93822, 1], + [93821, 1], + [93820, 1], + [93819, 1], + [93819, 0, "m"], + [93820, 0, "m"], + [93821, 0, "u"], + [93822, 0, "t"], + [93823, 0, "a"], + [93824, 0, "t"], + [93825, 0, "i"], + [93826, 0, "v"], + [93827, 0, "e"], + [93828, 0, " "], + [93829, 0, "w"], + [93830, 0, "i"], + [93831, 0, "t"], + [93832, 0, "h"], + [93833, 0, " "], + [93834, 0, "a"], + [93835, 0, "l"], + [93836, 0, "l"], + [93837, 0, " "], + [93838, 0, "o"], + [93839, 0, "p"], + [93840, 0, "e"], + [93841, 0, "r"], + [93842, 0, "a"], + [93843, 0, "t"], + [93844, 0, "i"], + [93845, 0, "o"], + [93846, 0, "n"], + [93847, 0, "s"], + [93848, 0, " "], + [93849, 0, "i"], + [93850, 0, "n"], + [93851, 0, " "], + [93852, 0, "t"], + [93853, 0, "h"], + [93854, 0, "e"], + [93855, 0, " "], + [93856, 0, "s"], + [93857, 0, "u"], + [93858, 0, "f"], + [93859, 0, "f"], + [93860, 0, "i"], + [93861, 0, "x"], + [93862, 0, ","], + [93863, 0, " "], + [93864, 0, "a"], + [93865, 0, "n"], + [93866, 0, "d"], + [93867, 0, " "], + [93868, 0, "s"], + [93869, 0, "o"], + [93870, 0, " "], + [93871, 0, "$"], + [93872, 0, "#"], + [93872, 1], + [93872, 0, "o"], + [93873, 0, "_"], + [93874, 0, "{"], + [93875, 0, "n"], + [93876, 0, "+"], + [93877, 0, "1"], + [93878, 0, "}"], + [93879, 0, "$"], + [93880, 0, " "], + [93881, 0, "c"], + [93882, 0, "a"], + [93883, 0, "n"], + [93884, 0, " "], + [93885, 0, "b"], + [93886, 0, "e"], + [93887, 0, " "], + [93888, 0, "i"], + [93889, 0, "n"], + [93890, 0, "s"], + [93891, 0, "e"], + [93892, 0, "r"], + [93893, 0, "t"], + [93894, 0, "e"], + [93895, 0, "d"], + [93896, 0, " "], + [93897, 0, "a"], + [93898, 0, "t"], + [93899, 0, " "], + [93900, 0, "a"], + [93901, 0, "n"], + [93902, 0, "y"], + [93903, 0, " "], + [93904, 0, "p"], + [93905, 0, "o"], + [93906, 0, "i"], + [93907, 0, "n"], + [93908, 0, "t"], + [93909, 0, " "], + [93910, 0, "w"], + [93911, 0, "i"], + [93912, 0, "t"], + [93913, 0, "h"], + [93914, 0, "i"], + [93915, 0, "n"], + [93916, 0, ","], + [93917, 0, " "], + [93918, 0, "b"], + [93919, 0, "e"], + [93920, 0, "f"], + [93921, 0, "o"], + [93922, 0, "r"], + [93923, 0, "e"], + [93924, 0, ","], + [93925, 0, " "], + [93926, 0, "o"], + [93927, 0, "r"], + [93928, 0, " "], + [93929, 0, "a"], + [93930, 0, "f"], + [93931, 0, "t"], + [93932, 0, "e"], + [93933, 0, "r"], + [93934, 0, " "], + [93935, 0, "t"], + [93936, 0, "h"], + [93937, 0, "e"], + [93938, 0, " "], + [93939, 0, "s"], + [93940, 0, "u"], + [93941, 0, "f"], + [93942, 0, "f"], + [93943, 0, "i"], + [93944, 0, "x"], + [93945, 0, " "], + [93946, 0, "w"], + [93947, 0, "i"], + [93948, 0, "t"], + [93949, 0, "h"], + [93950, 0, "o"], + [93951, 0, "u"], + [93952, 0, "t"], + [93953, 0, " "], + [93954, 0, "c"], + [93955, 0, "h"], + [93956, 0, "a"], + [93957, 0, "n"], + [93958, 0, "g"], + [93959, 0, "i"], + [93960, 0, "n"], + [93961, 0, "g"], + [93962, 0, " "], + [93963, 0, "i"], + [93964, 0, "t"], + [93965, 0, "s"], + [93966, 0, "e"], + [93966, 1], + [93966, 0, " "], + [93967, 0, "e"], + [93968, 0, "f"], + [93969, 0, "f"], + [93970, 0, "e"], + [93971, 0, "c"], + [93972, 0, "t"], + [93973, 0, " "], + [93974, 0, "o"], + [93975, 0, "n"], + [93976, 0, " "], + [93977, 0, "t"], + [93978, 0, "h"], + [93979, 0, "e"], + [93980, 0, " "], + [93981, 0, "f"], + [93982, 0, "i"], + [93983, 0, "n"], + [93984, 0, "a"], + [93985, 0, "l"], + [93986, 0, " "], + [93987, 0, "d"], + [93988, 0, "o"], + [93989, 0, "c"], + [93990, 0, "u"], + [93991, 0, "m"], + [93992, 0, "e"], + [93993, 0, "n"], + [93994, 0, "t"], + [93995, 0, " "], + [93996, 0, "s"], + [93997, 0, "t"], + [93998, 0, "a"], + [93999, 0, "t"], + [94000, 0, "e"], + [94001, 0, "."], + [94002, 0, " "], + [94003, 0, "S"], + [94004, 0, "i"], + [94005, 0, "m"], + [94006, 0, "i"], + [94007, 0, "l"], + [94008, 0, "a"], + [94009, 0, "r"], + [94010, 0, "l"], + [94011, 0, "y"], + [94012, 0, ","], + [94013, 0, " "], + [94014, 0, "i"], + [94015, 0, "f"], + [94016, 0, " "], + [94017, 0, "$"], + [94018, 0, "o"], + [94019, 0, "_"], + [94020, 0, "{"], + [94021, 0, "n"], + [94022, 0, "+"], + [94023, 0, "1"], + [94024, 0, "}"], + [94025, 0, "$"], + [94026, 0, " "], + [94027, 0, "i"], + [94028, 0, "s"], + [94029, 0, " "], + [94030, 0, "a"], + [94031, 0, "n"], + [94032, 0, " "], + [94033, 0, "a"], + [94034, 0, "s"], + [94035, 0, "s"], + [94036, 0, "i"], + [94037, 0, "g"], + [94038, 0, "n"], + [94039, 0, "m"], + [94040, 0, "e"], + [94041, 0, "n"], + [94042, 0, "t"], + [94043, 0, ","], + [94044, 0, " "], + [94045, 0, "b"], + [94046, 0, "y"], + [94047, 0, " "], + [94048, 0, "L"], + [94049, 0, "e"], + [94050, 0, "m"], + [94051, 0, "m"], + [94052, 0, "a"], + [94053, 0, "~"], + [94054, 0, "\\"], + [94055, 0, "r"], + [94056, 0, "e"], + [94057, 0, "f"], + [94058, 0, "{"], + [94059, 0, "l"], + [94060, 0, "e"], + [94061, 0, "m"], + [94062, 0, ":"], + [94063, 0, "a"], + [94064, 0, "s"], + [94065, 0, "s"], + [94066, 0, "i"], + [94067, 0, "g"], + [94068, 0, "n"], + [94069, 0, "-"], + [94070, 0, "c"], + [94071, 0, "o"], + [94072, 0, "m"], + [94073, 0, "m"], + [94074, 0, "u"], + [94075, 0, "t"], + [94076, 0, "e"], + [94077, 0, "}"], + [94078, 0, " "], + [94079, 0, "i"], + [94080, 0, "t"], + [94081, 0, " "], + [94082, 0, "i"], + [94083, 0, "s"], + [94084, 0, " "], + [94085, 0, "c"], + [94086, 0, "o"], + [94087, 0, "m"], + [94088, 0, "m"], + [94089, 0, "u"], + [94090, 0, "t"], + [94091, 0, "a"], + [94092, 0, "t"], + [94093, 0, "i"], + [94094, 0, "v"], + [94095, 0, "e"], + [94096, 0, " "], + [94097, 0, "w"], + [94098, 0, "i"], + [94099, 0, "t"], + [94100, 0, "h"], + [94101, 0, " "], + [94102, 0, "a"], + [94103, 0, "l"], + [94104, 0, "l"], + [94105, 0, " "], + [94106, 0, "o"], + [94107, 0, "p"], + [94108, 0, "e"], + [94109, 0, "r"], + [94110, 0, "a"], + [94111, 0, "t"], + [94112, 0, "i"], + [94113, 0, "o"], + [94114, 0, "n"], + [94115, 0, "s"], + [94116, 0, " "], + [94117, 0, "i"], + [94118, 0, "n"], + [94119, 0, " "], + [94120, 0, "t"], + [94121, 0, "h"], + [94122, 0, "e"], + [94123, 0, " "], + [94124, 0, "s"], + [94125, 0, "u"], + [94126, 0, "f"], + [94127, 0, "f"], + [94128, 0, "i"], + [94129, 0, "x"], + [94130, 0, "."], + [94131, 0, "\n"], + [94132, 0, "\n"], + [94133, 0, "I"], + [94134, 0, "f"], + [94135, 0, " "], + [94136, 0, "$"], + [94137, 0, "o"], + [94138, 0, "_"], + [94139, 0, "["], + [94139, 1], + [94139, 0, "{"], + [94140, 0, "n"], + [94141, 0, "+"], + [94142, 0, "1"], + [94143, 0, "}"], + [94144, 0, "$"], + [94145, 0, " "], + [94146, 0, "i"], + [94147, 0, "s"], + [94148, 0, " "], + [94149, 0, "a"], + [94150, 0, "n"], + [94151, 0, " "], + [94152, 0, "i"], + [94153, 0, "n"], + [94154, 0, "s"], + [94155, 0, "e"], + [94156, 0, "r"], + [94157, 0, "t"], + [94158, 0, "i"], + [94159, 0, "o"], + [94160, 0, "n"], + [94161, 0, ","], + [94162, 0, " "], + [94163, 0, "l"], + [94164, 0, "e"], + [94165, 0, "t"], + [94166, 0, " "], + [94167, 0, "$"], + [94168, 0, "o"], + [94169, 0, "_"], + [94170, 0, "c"], + [94171, 0, "$"], + [94172, 0, " "], + [94173, 0, "b"], + [94174, 0, "e"], + [94175, 0, " "], + [94176, 0, "a"], + [94177, 0, "n"], + [94178, 0, "y"], + [94179, 0, " "], + [94180, 0, "o"], + [94181, 0, "p"], + [94182, 0, "e"], + [94183, 0, "r"], + [94184, 0, "a"], + [94185, 0, "t"], + [94186, 0, "i"], + [94187, 0, "o"], + [94188, 0, "n"], + [94189, 0, " "], + [94190, 0, "i"], + [94191, 0, "n"], + [94192, 0, " "], + [94193, 0, "t"], + [94194, 0, "h"], + [94195, 0, "e"], + [94196, 0, " "], + [94197, 0, "s"], + [94198, 0, "u"], + [94199, 0, "f"], + [94200, 0, "f"], + [94201, 0, "i"], + [94202, 0, "x"], + [94203, 0, ","], + [94204, 0, " "], + [94205, 0, "a"], + [94206, 0, "n"], + [94207, 0, "d"], + [94208, 0, " "], + [94209, 0, "c"], + [94210, 0, "o"], + [94211, 0, "n"], + [94212, 0, "s"], + [94213, 0, "i"], + [94214, 0, "d"], + [94215, 0, "e"], + [94216, 0, "r"], + [94217, 0, " "], + [94218, 0, "t"], + [94219, 0, "h"], + [94220, 0, "e"], + [94221, 0, " "], + [94222, 0, "c"], + [94223, 0, "a"], + [94224, 0, "s"], + [94225, 0, "e"], + [94226, 0, "s"], + [94227, 0, " "], + [94228, 0, "w"], + [94229, 0, "h"], + [94230, 0, "e"], + [94231, 0, "t"], + [94232, 0, "h"], + [94232, 1], + [94231, 1], + [94230, 1], + [94229, 1], + [94228, 1], + [94228, 0, "o"], + [94229, 0, "f"], + [94230, 0, " "], + [94231, 0, "$"], + [94232, 0, "o"], + [94233, 0, "_"], + [94234, 0, "{"], + [94235, 0, "n"], + [94236, 0, "+"], + [94237, 0, "1"], + [94238, 0, "}"], + [94239, 0, "$"], + [94240, 0, " "], + [94241, 0, "b"], + [94242, 0, "e"], + [94243, 0, "i"], + [94244, 0, "n"], + [94245, 0, "g"], + [94246, 0, " "], + [94247, 0, "i"], + [94248, 0, "n"], + [94249, 0, "s"], + [94250, 0, "e"], + [94251, 0, "r"], + [94252, 0, "t"], + [94253, 0, "e"], + [94254, 0, "d"], + [94255, 0, " "], + [94256, 0, "b"], + [94257, 0, "e"], + [94258, 0, "f"], + [94259, 0, "o"], + [94260, 0, "r"], + [94261, 0, "e"], + [94262, 0, " "], + [94263, 0, "a"], + [94264, 0, "n"], + [94265, 0, "d"], + [94266, 0, " "], + [94267, 0, "a"], + [94268, 0, "f"], + [94269, 0, "t"], + [94270, 0, "e"], + [94271, 0, "r"], + [94272, 0, " "], + [94273, 0, "$"], + [94274, 0, "o"], + [94275, 0, "_"], + [94276, 0, "c"], + [94277, 0, "$"], + [94278, 0, " "], + [94279, 0, "i"], + [94280, 0, "n"], + [94281, 0, " "], + [94282, 0, "t"], + [94283, 0, "h"], + [94284, 0, "e"], + [94285, 0, " "], + [94286, 0, "h"], + [94287, 0, "i"], + [94288, 0, "s"], + [94289, 0, "t"], + [94290, 0, "o"], + [94291, 0, "r"], + [94292, 0, "y"], + [94293, 0, "."], + [94294, 0, " "], + [94295, 0, "I"], + [94296, 0, "f"], + [94297, 0, " "], + [94298, 0, "$"], + [94299, 0, "o"], + [94300, 0, "_"], + [94301, 0, "c"], + [94302, 0, "$"], + [94303, 0, " "], + [94304, 0, "i"], + [94305, 0, "s"], + [94306, 0, " "], + [94307, 0, "a"], + [94308, 0, " "], + [94309, 0, "d"], + [94310, 0, "e"], + [94311, 0, "l"], + [94312, 0, "e"], + [94313, 0, "t"], + [94314, 0, "i"], + [94315, 0, "o"], + [94316, 0, "n"], + [94317, 0, " "], + [94318, 0, "o"], + [94319, 0, "r"], + [94320, 0, " "], + [94321, 0, "a"], + [94322, 0, "s"], + [94323, 0, "s"], + [94324, 0, "i"], + [94325, 0, "g"], + [94326, 0, "n"], + [94327, 0, "m"], + [94328, 0, "e"], + [94329, 0, "n"], + [94330, 0, "t"], + [94331, 0, ","], + [94332, 0, " "], + [94333, 0, "i"], + [94334, 0, "t"], + [94335, 0, " "], + [94336, 0, "i"], + [94337, 0, "s"], + [94338, 0, " "], + [94339, 0, "c"], + [94340, 0, "o"], + [94341, 0, "m"], + [94342, 0, "m"], + [94343, 0, "u"], + [94344, 0, "t"], + [94345, 0, "a"], + [94346, 0, "t"], + [94347, 0, "i"], + [94348, 0, "v"], + [94349, 0, "e"], + [94350, 0, " "], + [94351, 0, "w"], + [94352, 0, "i"], + [94353, 0, "t"], + [94354, 0, "h"], + [94355, 0, " "], + [94356, 0, "$"], + [94357, 0, "o"], + [94358, 0, "_"], + [94359, 0, "{"], + [94360, 0, "n"], + [94361, 0, "+"], + [94362, 0, "1"], + [94363, 0, "}"], + [94364, 0, "$"], + [94365, 0, " "], + [94366, 0, "b"], + [94367, 0, "y"], + [94368, 0, " "], + [94369, 0, "L"], + [94370, 0, "e"], + [94371, 0, "m"], + [94372, 0, "m"], + [94373, 0, "a"], + [94374, 0, "~"], + [94375, 0, "\\"], + [94376, 0, "r"], + [94377, 0, "e"], + [94378, 0, "f"], + [94379, 0, "{"], + [94380, 0, "l"], + [94381, 0, "e"], + [94382, 0, "m"], + [94383, 0, ":"], + [94384, 0, "a"], + [94385, 0, "s"], + [94386, 0, "s"], + [94386, 1], + [94385, 1], + [94384, 1], + [94384, 0, "d"], + [94385, 0, "e"], + [94386, 0, "l"], + [94387, 0, "e"], + [94388, 0, "t"], + [94389, 0, "e"], + [94390, 0, "-"], + [94391, 0, "c"], + [94392, 0, "o"], + [94393, 0, "m"], + [94394, 0, "m"], + [94395, 0, "u"], + [94396, 0, "t"], + [94397, 0, "e"], + [94398, 0, "}"], + [94399, 0, " "], + [94400, 0, "o"], + [94401, 0, "r"], + [94402, 0, " "], + [94403, 0, "L"], + [94404, 0, "e"], + [94405, 0, "m"], + [94406, 0, "m"], + [94407, 0, "a"], + [94408, 0, "~"], + [94409, 0, "\\"], + [94410, 0, "r"], + [94411, 0, "e"], + [94412, 0, "f"], + [94413, 0, "{"], + [94414, 0, "l"], + [94415, 0, "e"], + [94416, 0, "m"], + [94417, 0, ":"], + [94418, 0, "a"], + [94419, 0, "s"], + [94420, 0, "s"], + [94421, 0, "i"], + [94422, 0, "g"], + [94423, 0, "n"], + [94424, 0, "-"], + [94425, 0, "c"], + [94426, 0, "o"], + [94427, 0, "m"], + [94428, 0, "m"], + [94429, 0, "u"], + [94430, 0, "t"], + [94431, 0, "e"], + [94432, 0, "}"], + [94433, 0, " "], + [94434, 0, "r"], + [94435, 0, "e"], + [94436, 0, "s"], + [94437, 0, "p"], + [94438, 0, "e"], + [94439, 0, "c"], + [94440, 0, "t"], + [94441, 0, "i"], + [94442, 0, "v"], + [94443, 0, "e"], + [94444, 0, "l"], + [94445, 0, "y"], + [94446, 0, "."], + [94447, 0, " "], + [94448, 0, "I"], + [94449, 0, "f"], + [94450, 0, " "], + [94451, 0, "$"], + [94452, 0, "o"], + [94453, 0, "_"], + [94454, 0, "c"], + [94455, 0, "$"], + [94456, 0, " "], + [94457, 0, "i"], + [94458, 0, "s"], + [94459, 0, " "], + [94460, 0, "a"], + [94461, 0, "n"], + [94462, 0, " "], + [94463, 0, "i"], + [94464, 0, "n"], + [94465, 0, "s"], + [94466, 0, "e"], + [94467, 0, "r"], + [94468, 0, "t"], + [94469, 0, "i"], + [94470, 0, "o"], + [94471, 0, "n"], + [94472, 0, " "], + [94473, 0, "i"], + [94474, 0, "n"], + [94475, 0, "t"], + [94476, 0, "o"], + [94477, 0, " "], + [94478, 0, "a"], + [94479, 0, " "], + [94480, 0, "d"], + [94481, 0, "i"], + [94482, 0, "f"], + [94483, 0, "f"], + [94484, 0, "e"], + [94485, 0, "r"], + [94486, 0, "e"], + [94487, 0, "n"], + [94488, 0, "t"], + [94489, 0, " "], + [94490, 0, "l"], + [94491, 0, "i"], + [94492, 0, "s"], + [94493, 0, "t"], + [94494, 0, " "], + [94495, 0, "i"], + [94496, 0, "n"], + [94497, 0, " "], + [94498, 0, "t"], + [94499, 0, "h"], + [94500, 0, "e"], + [94501, 0, " "], + [94502, 0, "d"], + [94503, 0, "o"], + [94504, 0, "c"], + [94505, 0, "u"], + [94506, 0, "m"], + [94507, 0, "e"], + [94508, 0, "n"], + [94509, 0, "t"], + [94510, 0, ","], + [94511, 0, " "], + [94512, 0, "i"], + [94513, 0, "t"], + [94514, 0, "s"], + [94515, 0, " "], + [94516, 0, "e"], + [94517, 0, "f"], + [94518, 0, "f"], + [94519, 0, "e"], + [94520, 0, "c"], + [94521, 0, "t"], + [94522, 0, " "], + [94523, 0, "i"], + [94524, 0, "s"], + [94525, 0, " "], + [94526, 0, "i"], + [94527, 0, "n"], + [94528, 0, "d"], + [94529, 0, "e"], + [94530, 0, "p"], + [94531, 0, "e"], + [94532, 0, "n"], + [94533, 0, "d"], + [94534, 0, "e"], + [94535, 0, "n"], + [94536, 0, "t"], + [94537, 0, " "], + [94538, 0, "f"], + [94539, 0, "r"], + [94540, 0, "o"], + [94541, 0, "m"], + [94542, 0, " "], + [94543, 0, "$"], + [94544, 0, "o"], + [94545, 0, "_"], + [94546, 0, "{"], + [94547, 0, "n"], + [94548, 0, "+"], + [94549, 0, "1"], + [94550, 0, "}"], + [94551, 0, "$"], + [94552, 0, " "], + [94553, 0, "a"], + [94554, 0, "n"], + [94555, 0, "d"], + [94556, 0, " "], + [94557, 0, "s"], + [94558, 0, "o"], + [94559, 0, " "], + [94560, 0, "t"], + [94561, 0, "h"], + [94562, 0, "e"], + [94563, 0, " "], + [94564, 0, "t"], + [94565, 0, "w"], + [94566, 0, "o"], + [94567, 0, " "], + [94568, 0, "o"], + [94569, 0, "p"], + [94570, 0, "e"], + [94571, 0, "r"], + [94572, 0, "a"], + [94573, 0, "t"], + [94574, 0, "i"], + [94575, 0, "o"], + [94576, 0, "n"], + [94577, 0, "s"], + [94578, 0, " "], + [94579, 0, "c"], + [94580, 0, "a"], + [94581, 0, "n"], + [94582, 0, " "], + [94583, 0, "b"], + [94584, 0, "e"], + [94585, 0, " "], + [94586, 0, "a"], + [94587, 0, "p"], + [94588, 0, "p"], + [94589, 0, "l"], + [94590, 0, "i"], + [94591, 0, "e"], + [94592, 0, "d"], + [94593, 0, " "], + [94594, 0, "i"], + [94595, 0, "n"], + [94596, 0, " "], + [94597, 0, "a"], + [94598, 0, "n"], + [94599, 0, "y"], + [94600, 0, " "], + [94601, 0, "o"], + [94602, 0, "r"], + [94603, 0, "d"], + [94604, 0, "e"], + [94605, 0, "r"], + [94606, 0, "."], + [94607, 0, " "], + [94608, 0, "I"], + [94609, 0, "f"], + [94610, 0, " "], + [94611, 0, "$"], + [94612, 0, "o"], + [94613, 0, "_"], + [94614, 0, "c"], + [94615, 0, "$"], + [94616, 0, " "], + [94617, 0, "i"], + [94618, 0, "s"], + [94619, 0, " "], + [94620, 0, "a"], + [94621, 0, "n"], + [94622, 0, " "], + [94623, 0, "i"], + [94624, 0, "n"], + [94625, 0, "s"], + [94626, 0, "e"], + [94627, 0, "r"], + [94628, 0, "t"], + [94629, 0, "i"], + [94630, 0, "o"], + [94631, 0, "n"], + [94632, 0, " "], + [94633, 0, "i"], + [94634, 0, "n"], + [94635, 0, "t"], + [94636, 0, "o"], + [94637, 0, " "], + [94510, 0, " "], + [94511, 0, "t"], + [94512, 0, "h"], + [94513, 0, "a"], + [94513, 1], + [94512, 1], + [94511, 1], + [94510, 1], + [94510, 0, " "], + [94510, 1], + [94447, 0, " "], + [94448, 0, "I"], + [94449, 0, "f"], + [94450, 0, " "], + [94451, 0, "$"], + [94452, 0, "o"], + [94453, 0, "_"], + [94454, 0, "c"], + [94455, 0, "$"], + [94456, 0, " "], + [94457, 0, "i"], + [94458, 0, "s"], + [94459, 0, " "], + [94460, 0, "a"], + [94461, 0, "n"], + [94462, 0, " "], + [94463, 0, "i"], + [94464, 0, "n"], + [94465, 0, "s"], + [94466, 0, "e"], + [94467, 0, "r"], + [94468, 0, "t"], + [94469, 0, "i"], + [94470, 0, "o"], + [94471, 0, "n"], + [94472, 0, " "], + [94473, 0, "i"], + [94474, 0, "n"], + [94475, 0, "t"], + [94476, 0, "o"], + [94477, 0, " "], + [94478, 0, "t"], + [94479, 0, "h"], + [94480, 0, "e"], + [94481, 0, " "], + [94482, 0, "s"], + [94483, 0, "a"], + [94484, 0, "m"], + [94485, 0, "e"], + [94486, 0, " "], + [94487, 0, "l"], + [94488, 0, "i"], + [94489, 0, "s"], + [94490, 0, "t"], + [94491, 0, " "], + [94492, 0, "a"], + [94493, 0, "s"], + [94494, 0, " "], + [94495, 0, "$"], + [94496, 0, "o"], + [94497, 0, "_"], + [94498, 0, "{"], + [94499, 0, "n"], + [94500, 0, "+"], + [94501, 0, "2"], + [94501, 1], + [94501, 0, "1"], + [94502, 0, "}"], + [94503, 0, "$"], + [94504, 0, ","], + [94505, 0, " "], + [94506, 0, "t"], + [94507, 0, "h"], + [94508, 0, "e"], + [94509, 0, "n"], + [94510, 0, " "], + [94511, 0, "b"], + [94512, 0, "y"], + [94513, 0, " "], + [94514, 0, "L"], + [94515, 0, "e"], + [94516, 0, "m"], + [94517, 0, "m"], + [94518, 0, "a"], + [94519, 0, "~"], + [94520, 0, "\\"], + [94521, 0, "r"], + [94522, 0, "e"], + [94523, 0, "f"], + [94524, 0, "{"], + [94525, 0, "l"], + [94526, 0, "e"], + [94527, 0, "m"], + [94528, 0, ":"], + [94529, 0, "i"], + [94530, 0, "n"], + [94531, 0, "s"], + [94532, 0, "e"], + [94533, 0, "r"], + [94534, 0, "t"], + [94535, 0, "-"], + [94536, 0, "r"], + [94537, 0, "e"], + [94538, 0, "o"], + [94539, 0, "r"], + [94540, 0, "d"], + [94541, 0, "e"], + [94542, 0, "r"], + [94543, 0, "}"], + [94544, 0, " "], + [94545, 0, "t"], + [94546, 0, "h"], + [94547, 0, "e"], + [94548, 0, " "], + [94549, 0, "o"], + [94550, 0, "p"], + [94551, 0, "e"], + [94552, 0, "r"], + [94553, 0, "a"], + [94554, 0, "t"], + [94555, 0, "i"], + [94556, 0, "o"], + [94557, 0, "n"], + [94558, 0, "s"], + [94559, 0, " "], + [94560, 0, "a"], + [94561, 0, "r"], + [94562, 0, "e"], + [94563, 0, " "], + [94564, 0, "c"], + [94565, 0, "o"], + [94566, 0, "m"], + [94567, 0, "m"], + [94568, 0, "u"], + [94569, 0, "t"], + [94570, 0, "a"], + [94571, 0, "t"], + [94572, 0, "i"], + [94573, 0, "v"], + [94574, 0, "e"], + [94575, 0, "."], + [94766, 1], + [94765, 1], + [94764, 1], + [94763, 1], + [94762, 1], + [94761, 1], + [94760, 1], + [94759, 1], + [94758, 1], + [94757, 1], + [94756, 1], + [94755, 1], + [94754, 1], + [94753, 1], + [94752, 1], + [94751, 1], + [94750, 1], + [94749, 1], + [94748, 1], + [94747, 1], + [94746, 1], + [94745, 1], + [94744, 1], + [94743, 1], + [94742, 1], + [94741, 1], + [94740, 1], + [94739, 1], + [94738, 1], + [94737, 1], + [94736, 1], + [94882, 1], + [94881, 1], + [94880, 1], + [94879, 1], + [94878, 1], + [94877, 1], + [94876, 1], + [94875, 1], + [94874, 1], + [94873, 1], + [94872, 1], + [94871, 1], + [94870, 1], + [94869, 1], + [94868, 1], + [94867, 1], + [94866, 1], + [94865, 1], + [94864, 1], + [94863, 1], + [94862, 1], + [94861, 1], + [94860, 1], + [94859, 1], + [94858, 1], + [94857, 1], + [94856, 1], + [94855, 1], + [94854, 1], + [94853, 1], + [94852, 1], + [94851, 1], + [94850, 1], + [94849, 1], + [94848, 1], + [94847, 1], + [94846, 1], + [94845, 1], + [94844, 1], + [94843, 1], + [94842, 1], + [94841, 1], + [94840, 1], + [94839, 1], + [94838, 1], + [94837, 1], + [94836, 1], + [94835, 1], + [94834, 1], + [94833, 1], + [94832, 1], + [94831, 1], + [94830, 1], + [94829, 1], + [94828, 1], + [94827, 1], + [94826, 1], + [94825, 1], + [94824, 1], + [94823, 1], + [94822, 1], + [94821, 1], + [94820, 1], + [94819, 1], + [94818, 1], + [94817, 1], + [94816, 1], + [94815, 1], + [94814, 1], + [94813, 1], + [94812, 1], + [94811, 1], + [94810, 1], + [94809, 1], + [94808, 1], + [94807, 1], + [94806, 1], + [94805, 1], + [94804, 1], + [94803, 1], + [94802, 1], + [94801, 1], + [94800, 1], + [94799, 1], + [94798, 1], + [94797, 1], + [94796, 1], + [94795, 1], + [94794, 1], + [94793, 1], + [94792, 1], + [94791, 1], + [94790, 1], + [94789, 1], + [94788, 1], + [94787, 1], + [94786, 1], + [94785, 1], + [94784, 1], + [94783, 1], + [94782, 1], + [94781, 1], + [94780, 1], + [94779, 1], + [94778, 1], + [94777, 1], + [94776, 1], + [94775, 1], + [94774, 1], + [94773, 1], + [94772, 1], + [94771, 1], + [94770, 1], + [94769, 1], + [94768, 1], + [94767, 1], + [94766, 1], + [94765, 1], + [94764, 1], + [94763, 1], + [94762, 1], + [94761, 1], + [94760, 1], + [94759, 1], + [94758, 1], + [94757, 1], + [94756, 1], + [94755, 1], + [94754, 1], + [94753, 1], + [94752, 1], + [94751, 1], + [94750, 1], + [94749, 1], + [94748, 1], + [94747, 1], + [94746, 1], + [94745, 1], + [94744, 1], + [94743, 1], + [94742, 1], + [94741, 1], + [94740, 1], + [94739, 1], + [94738, 1], + [94738, 0, "T"], + [94739, 0, "h"], + [94740, 0, "u"], + [94741, 0, "s"], + [94742, 0, ","], + [94743, 0, " "], + [94744, 0, "t"], + [94745, 0, "h"], + [94746, 0, "e"], + [94747, 0, " "], + [94747, 1], + [94746, 1], + [94745, 1], + [94744, 1], + [94743, 1], + [94743, 0, " "], + [94744, 0, "$"], + [94745, 0, "o"], + [94746, 0, "_"], + [94747, 0, "{"], + [94748, 0, "n"], + [94749, 0, "+"], + [94750, 0, "2"], + [94751, 0, "1"], + [94751, 1], + [94750, 1], + [94750, 0, "1"], + [94751, 0, "}"], + [94752, 0, "$"], + [94753, 0, " "], + [94754, 0, "i"], + [94755, 0, "s"], + [94756, 0, " "], + [94757, 0, "c"], + [94758, 0, "o"], + [94759, 0, "m"], + [94760, 0, "m"], + [94761, 0, "u"], + [94762, 0, "t"], + [94763, 0, "a"], + [94764, 0, "t"], + [94765, 0, "i"], + [94766, 0, "v"], + [94767, 0, "e"], + [94768, 0, " "], + [94769, 0, "w"], + [94770, 0, "i"], + [94771, 0, "t"], + [94772, 0, "h"], + [94773, 0, " "], + [94774, 0, "r"], + [94775, 0, "e"], + [94776, 0, "s"], + [94777, 0, "p"], + [94778, 0, "e"], + [94779, 0, "c"], + [94780, 0, "t"], + [94781, 0, " "], + [94782, 0, "t"], + [94783, 0, "o"], + [94784, 0, " "], + [94785, 0, "a"], + [94786, 0, "n"], + [94787, 0, "y"], + [94788, 0, " "], + [94789, 0, "c"], + [94790, 0, "o"], + [94791, 0, "n"], + [94792, 0, "c"], + [94793, 0, "u"], + [94794, 0, "r"], + [94795, 0, "r"], + [94796, 0, "e"], + [94797, 0, "n"], + [94798, 0, "t"], + [94799, 0, " "], + [94800, 0, "o"], + [94801, 0, "p"], + [94802, 0, "e"], + [94803, 0, "r"], + [94804, 0, "a"], + [94805, 0, "t"], + [94806, 0, "i"], + [94807, 0, "o"], + [94808, 0, "n"], + [94809, 0, " "], + [94810, 0, "i"], + [94811, 0, "n"], + [94812, 0, " "], + [94813, 0, "$"], + [94814, 0, "H"], + [94815, 0, "$"], + [94816, 0, ","], + [94817, 0, " "], + [94818, 0, "a"], + [94819, 0, "n"], + [94820, 0, "d"], + [94821, 0, " "], + [94822, 0, "t"], + [94823, 0, "h"], + [94824, 0, "e"], + [94825, 0, "r"], + [94826, 0, "e"], + [94827, 0, "f"], + [94828, 0, "o"], + [94829, 0, "r"], + [94830, 0, "e"], + [94831, 0, " "], + [94844, 0, "\n"], + [94845, 0, "\n"], + [94846, 0, "T"], + [94847, 0, "h"], + [94848, 0, "i"], + [94849, 0, "s"], + [94850, 0, " "], + [94851, 0, "c"], + [94852, 0, "o"], + [94853, 0, "m"], + [94854, 0, "p"], + [94855, 0, "l"], + [94856, 0, "e"], + [94857, 0, "t"], + [94858, 0, "e"], + [94859, 0, "s"], + [94860, 0, " "], + [94861, 0, "t"], + [94862, 0, "h"], + [94863, 0, "e"], + [94864, 0, " "], + [94865, 0, "i"], + [94866, 0, "n"], + [94867, 0, "d"], + [94868, 0, "u"], + [94869, 0, "c"], + [94870, 0, "t"], + [94871, 0, "i"], + [94872, 0, "o"], + [94873, 0, "n"], + [94874, 0, " "], + [94875, 0, "s"], + [94876, 0, "t"], + [94877, 0, "e"], + [94878, 0, "p"], + [94879, 0, " "], + [94880, 0, "i"], + [94881, 0, "n"], + [94882, 0, " "], + [94883, 0, "t"], + [94884, 0, "h"], + [94885, 0, "e"], + [94886, 0, " "], + [94887, 0, "p"], + [94888, 0, "r"], + [94889, 0, "o"], + [94890, 0, "o"], + [94891, 0, "f"], + [94892, 0, " "], + [94893, 0, "o"], + [94894, 0, "f"], + [94895, 0, " "], + [94896, 0, "T"], + [94897, 0, "h"], + [94898, 0, "e"], + [94899, 0, "o"], + [94900, 0, "r"], + [94901, 0, "e"], + [94902, 0, "m"], + [94903, 0, "~"], + [94904, 0, "\\"], + [94905, 0, "r"], + [94906, 0, "e"], + [94907, 0, "f"], + [94908, 0, "{"], + [94909, 0, "t"], + [94910, 0, "h"], + [94911, 0, "m"], + [94912, 0, ":"], + [94913, 0, "c"], + [94914, 0, "o"], + [94915, 0, "n"], + [94916, 0, "v"], + [94917, 0, "e"], + [94918, 0, "r"], + [94919, 0, "g"], + [94920, 0, "e"], + [94921, 0, "n"], + [94922, 0, "c"], + [94923, 0, "e"], + [94924, 0, "}"], + [94925, 0, ","], + [94926, 0, " "], + [94927, 0, "a"], + [94928, 0, "n"], + [94929, 0, "d"], + [94930, 0, " "], + [94931, 0, "t"], + [94932, 0, "h"], + [94933, 0, "u"], + [94934, 0, "s"], + [94935, 0, " "], + [94936, 0, "p"], + [94937, 0, "r"], + [94938, 0, "o"], + [94939, 0, "v"], + [94940, 0, "e"], + [94941, 0, "s"], + [94942, 0, " "], + [94943, 0, "c"], + [94944, 0, "o"], + [94945, 0, "n"], + [94946, 0, "v"], + [94947, 0, "e"], + [94948, 0, "r"], + [94949, 0, "g"], + [94950, 0, "e"], + [94951, 0, "n"], + [94952, 0, "c"], + [94953, 0, "e"], + [94954, 0, " "], + [94955, 0, "o"], + [94956, 0, "f"], + [94957, 0, " "], + [94958, 0, "o"], + [94959, 0, "u"], + [94960, 0, "r"], + [94961, 0, " "], + [94962, 0, "d"], + [94963, 0, "a"], + [94964, 0, "t"], + [94965, 0, "a"], + [94966, 0, "t"], + [94967, 0, "y"], + [94968, 0, "p"], + [94969, 0, "e"], + [94970, 0, "."], + [94832, 0, "$"], + [94821, 1], + [94820, 1], + [94819, 1], + [94818, 1], + [94817, 1], + [94816, 1], + [94816, 0, "."], + [94817, 0, " "], + [94818, 1], + [94818, 0, "T"], + [94827, 0, ","], + [94830, 0, "o"], + [94831, 0, "_"], + [94832, 0, "{"], + [94833, 0, "n"], + [94834, 0, "+"], + [94835, 0, "1"], + [94836, 0, "}"], + [94837, 0, "$"], + [94838, 0, " "], + [94839, 0, "c"], + [94840, 0, "a"], + [94841, 0, "n"], + [94842, 0, " "], + [94843, 0, "b"], + [94844, 0, "e"], + [94845, 0, " "], + [94846, 0, "i"], + [94847, 0, "n"], + [94848, 0, "s"], + [94849, 0, "e"], + [94850, 0, "r"], + [94851, 0, "t"], + [94852, 0, "e"], + [94853, 0, "d"], + [94854, 0, " "], + [94855, 0, "a"], + [94856, 0, "t"], + [94857, 0, " "], + [94858, 0, "a"], + [94859, 0, "n"], + [94860, 0, "y"], + [94861, 0, " "], + [94862, 0, "p"], + [94863, 0, "o"], + [94864, 0, "i"], + [94865, 0, "n"], + [94866, 0, "t"], + [94867, 0, " "], + [94868, 0, "a"], + [94869, 0, "f"], + [94870, 0, "t"], + [94871, 0, "e"], + [94872, 0, "r"], + [94873, 0, " "], + [94874, 0, "p"], + [94874, 1], + [94874, 0, "i"], + [94875, 0, "t"], + [94876, 0, "s"], + [94877, 0, " "], + [94878, 0, "c"], + [94879, 0, "a"], + [94880, 0, "u"], + [94881, 0, "s"], + [94882, 0, "a"], + [94883, 0, "l"], + [94884, 0, " "], + [94885, 0, "d"], + [94886, 0, "e"], + [94887, 0, "p"], + [94888, 0, "e"], + [94889, 0, "n"], + [94890, 0, "d"], + [94891, 0, "e"], + [94892, 0, "n"], + [94893, 0, "c"], + [94894, 0, "i"], + [94895, 0, "e"], + [94896, 0, "s"], + [94897, 0, ","], + [94898, 0, " "], + [94899, 0, "a"], + [94900, 0, "n"], + [94901, 0, "d"], + [94902, 0, " "], + [94903, 0, "t"], + [94904, 0, "h"], + [94905, 0, "e"], + [94906, 0, " "], + [94854, 0, " "], + [94855, 0, "i"], + [94856, 0, "n"], + [94857, 0, "t"], + [94858, 0, "o"], + [94859, 0, " "], + [94860, 0, "$"], + [94861, 0, "H"], + [94862, 0, "$"], + [94916, 0, "e"], + [94917, 0, "f"], + [94918, 0, "f"], + [94919, 0, "e"], + [94920, 0, "c"], + [94921, 0, "t"], + [94922, 0, " "], + [94923, 0, "o"], + [94924, 0, "n"], + [94925, 0, " "], + [94926, 0, "t"], + [94927, 0, "h"], + [94928, 0, "e"], + [94929, 0, " "], + [94930, 0, "f"], + [94931, 0, "i"], + [94932, 0, "n"], + [94933, 0, "a"], + [94934, 0, "l"], + [94935, 0, " "], + [94936, 0, "d"], + [94937, 0, "o"], + [94938, 0, "c"], + [94939, 0, "u"], + [94940, 0, "m"], + [94941, 0, "e"], + [94942, 0, "n"], + [94943, 0, "t"], + [94944, 0, " "], + [94945, 0, "s"], + [94946, 0, "t"], + [94947, 0, "a"], + [94948, 0, "t"], + [94949, 0, "e"], + [94950, 0, " "], + [94951, 0, "i"], + [94952, 0, "s"], + [94953, 0, " "], + [94954, 0, "i"], + [94955, 0, "n"], + [94956, 0, "d"], + [94957, 0, "e"], + [94958, 0, "p"], + [94959, 0, "e"], + [94960, 0, "n"], + [94961, 0, "d"], + [94962, 0, "e"], + [94963, 0, "n"], + [94964, 0, "t"], + [94965, 0, " "], + [94966, 0, "o"], + [94967, 0, "f"], + [94968, 0, " "], + [94969, 0, "t"], + [94970, 0, "h"], + [94971, 0, "e"], + [94972, 0, " "], + [94973, 0, "p"], + [94974, 0, "o"], + [94975, 0, "s"], + [94976, 0, "i"], + [94977, 0, "t"], + [94978, 0, "i"], + [94979, 0, "o"], + [94980, 0, "n"], + [94981, 0, " "], + [94982, 0, "a"], + [94983, 0, "t"], + [94984, 0, " "], + [94985, 0, "w"], + [94986, 0, "h"], + [94987, 0, "i"], + [94988, 0, "c"], + [94989, 0, "h"], + [94990, 0, " "], + [94991, 0, "t"], + [94992, 0, "h"], + [94993, 0, "e"], + [94994, 0, " "], + [94995, 0, "o"], + [94996, 0, "p"], + [94997, 0, "e"], + [94998, 0, "r"], + [94999, 0, "a"], + [95000, 0, "t"], + [95001, 0, "i"], + [95002, 0, "o"], + [95003, 0, "n"], + [95004, 0, " "], + [95005, 0, "i"], + [95006, 0, "s"], + [95007, 0, " "], + [95008, 0, "i"], + [95009, 0, "n"], + [95010, 0, "s"], + [95011, 0, "e"], + [95012, 0, "r"], + [95013, 0, "t"], + [95014, 0, "e"], + [95015, 0, "d"], + [95016, 0, "."], + [4630, 1], + [4629, 1], + [4628, 1], + [4627, 1], + [4626, 1], + [4625, 1], + [4624, 1], + [4623, 1], + [4622, 1], + [4621, 1], + [4620, 1], + [4619, 1], + [4618, 1], + [4617, 1], + [4616, 1], + [4615, 1], + [4614, 1], + [4613, 1], + [4612, 1], + [4611, 1], + [4610, 1], + [4609, 1], + [4608, 1], + [4607, 1], + [4606, 1], + [4606, 0, "s"], + [4607, 0, "u"], + [4608, 0, "p"], + [4609, 0, "p"], + [4610, 0, "o"], + [4611, 0, "r"], + [4612, 0, "t"], + [4613, 0, "s"], + [4614, 0, " "], + [5088, 1], + [5087, 1], + [5086, 1], + [5085, 1], + [5084, 1], + [5083, 1], + [5082, 1], + [5081, 1], + [5080, 1], + [5079, 1], + [5078, 1], + [5077, 1], + [5076, 1], + [5075, 1], + [5074, 1], + [5073, 1], + [5072, 1], + [5071, 1], + [5070, 1], + [5069, 1], + [5068, 1], + [5067, 1], + [5066, 1], + [5065, 1], + [5064, 1], + [5063, 1], + [5062, 1], + [5061, 1], + [5060, 1], + [5059, 1], + [5058, 1], + [5057, 1], + [5056, 1], + [5055, 1], + [5054, 1], + [5053, 1], + [5052, 1], + [5051, 1], + [5050, 1], + [5049, 1], + [5048, 1], + [5047, 1], + [5046, 1], + [5045, 1], + [5044, 1], + [5043, 1], + [5042, 1], + [5041, 1], + [5040, 1], + [5039, 1], + [5038, 1], + [5037, 1], + [5036, 1], + [5035, 1], + [5034, 1], + [5033, 1], + [5032, 1], + [5031, 1], + [5030, 1], + [5029, 1], + [5028, 1], + [5027, 1], + [5026, 1], + [5025, 1], + [5024, 1], + [5023, 1], + [5022, 1], + [5021, 1], + [5020, 1], + [5019, 1], + [5018, 1], + [5017, 1], + [5016, 1], + [5015, 1], + [5014, 1], + [5013, 1], + [5012, 1], + [5011, 1], + [5010, 1], + [5009, 1], + [5008, 1], + [5007, 1], + [5006, 1], + [5005, 1], + [5004, 1], + [5003, 1], + [5002, 1], + [5001, 1], + [5000, 1], + [4999, 1], + [4998, 1], + [4997, 1], + [4996, 1], + [4995, 1], + [4994, 1], + [4993, 1], + [4992, 1], + [4991, 1], + [4990, 1], + [4989, 1], + [4988, 1], + [4987, 1], + [4986, 1], + [4985, 1], + [4984, 1], + [4983, 1], + [4982, 1], + [4981, 1], + [4980, 1], + [4979, 1], + [4978, 1], + [4977, 1], + [4976, 1], + [4975, 1], + [4974, 1], + [4973, 1], + [4972, 1], + [4971, 1], + [4970, 1], + [4969, 1], + [4968, 1], + [4967, 1], + [4966, 1], + [4965, 1], + [4964, 1], + [4963, 1], + [4962, 1], + [4961, 1], + [4960, 1], + [4959, 1], + [4958, 1], + [4957, 1], + [4956, 1], + [4955, 1], + [4954, 1], + [4953, 1], + [4952, 1], + [4951, 1], + [4950, 1], + [4949, 1], + [4948, 1], + [4947, 1], + [4946, 1], + [4945, 1], + [4944, 1], + [4943, 1], + [4942, 1], + [4941, 1], + [4940, 1], + [4939, 1], + [4938, 1], + [4937, 1], + [4936, 1], + [4935, 1], + [4934, 1], + [4933, 1], + [4932, 1], + [4931, 1], + [4930, 1], + [4929, 1], + [4928, 1], + [4927, 1], + [4926, 1], + [4925, 1], + [4924, 1], + [4923, 1], + [4922, 1], + [4921, 1], + [4920, 1], + [4919, 1], + [4918, 1], + [4917, 1], + [4916, 1], + [4915, 1], + [4914, 1], + [4913, 1], + [4912, 1], + [4911, 1], + [4910, 1], + [4909, 1], + [4908, 1], + [4907, 1], + [4906, 1], + [4905, 1], + [4904, 1], + [4903, 1], + [4902, 1], + [4901, 1], + [4900, 1], + [4899, 1], + [4898, 1], + [4897, 1], + [4896, 1], + [4895, 1], + [4894, 1], + [4893, 1], + [4892, 1], + [4891, 1], + [4890, 1], + [4889, 1], + [4888, 1], + [4887, 1], + [4886, 1], + [4885, 1], + [4884, 1], + [4883, 1], + [4882, 1], + [4881, 1], + [4880, 1], + [4879, 1], + [4878, 1], + [4877, 1], + [4876, 1], + [4875, 1], + [4874, 1], + [4873, 1], + [4872, 1], + [4871, 1], + [4870, 1], + [4869, 1], + [4868, 1], + [4867, 1], + [4866, 1], + [4865, 1], + [4864, 1], + [4863, 1], + [4862, 1], + [4861, 1], + [4860, 1], + [4859, 1], + [4858, 1], + [4857, 1], + [4856, 1], + [4855, 1], + [4854, 1], + [4853, 1], + [4852, 1], + [4851, 1], + [4850, 1], + [4849, 1], + [4848, 1], + [4847, 1], + [4846, 1], + [4845, 1], + [4844, 1], + [4843, 1], + [4842, 1], + [4841, 1], + [4840, 1], + [4839, 1], + [4838, 1], + [4837, 1], + [4836, 1], + [4835, 1], + [4834, 1], + [4833, 1], + [4668, 0, "i"], + [4669, 0, " "], + [4669, 1], + [4668, 1], + [4668, 0, " "], + [4669, 0, "A"], + [4670, 0, "s"], + [4671, 0, " "], + [4672, 0, "w"], + [4673, 0, "e"], + [4674, 0, " "], + [4675, 0, "s"], + [4676, 0, "h"], + [4677, 0, "a"], + [4678, 0, "l"], + [4679, 0, "l"], + [4680, 0, " "], + [4681, 0, "s"], + [4682, 0, "e"], + [4683, 0, "e"], + [4684, 0, " "], + [4685, 0, "l"], + [4686, 0, "a"], + [4687, 0, "t"], + [4688, 0, "e"], + [4689, 0, "r"], + [4690, 0, ","], + [4691, 0, " "], + [4692, 0, "i"], + [4693, 0, "n"], + [4694, 0, " "], + [4695, 0, "s"], + [4696, 0, "o"], + [4697, 0, "m"], + [4698, 0, "e"], + [4699, 0, " "], + [4700, 0, "c"], + [4701, 0, "a"], + [4702, 0, "s"], + [4703, 0, "e"], + [4704, 0, "s"], + [4705, 0, " "], + [4706, 0, "w"], + [4707, 0, "e"], + [4708, 0, " "], + [4709, 0, "n"], + [4710, 0, "e"], + [4711, 0, "e"], + [4712, 0, "d"], + [4713, 0, " "], + [4714, 0, "t"], + [4715, 0, "o"], + [4716, 0, " "], + [4717, 0, "s"], + [4718, 0, "u"], + [4719, 0, "p"], + [4720, 0, "p"], + [4721, 0, "o"], + [4722, 0, "r"], + [4723, 0, "t"], + [4723, 1], + [4722, 1], + [4721, 1], + [4720, 1], + [4719, 1], + [4718, 1], + [4717, 1], + [4716, 1], + [4715, 1], + [4714, 1], + [4713, 1], + [4712, 1], + [4711, 1], + [4710, 1], + [4709, 1], + [4708, 1], + [4707, 1], + [4706, 1], + [4706, 0, "s"], + [4707, 0, "u"], + [4708, 0, "p"], + [4709, 0, "p"], + [4710, 0, "o"], + [4711, 0, "r"], + [4712, 0, "t"], + [4713, 0, " "], + [4714, 0, "a"], + [4714, 1], + [4713, 1], + [4712, 1], + [4711, 1], + [4710, 1], + [4709, 1], + [4708, 1], + [4707, 1], + [4706, 1], + [4705, 1], + [4704, 1], + [4703, 1], + [4702, 1], + [4701, 1], + [4700, 1], + [4699, 1], + [4698, 1], + [4697, 1], + [4696, 1], + [4695, 1], + [4694, 1], + [4693, 1], + [4692, 1], + [4692, 0, "o"], + [4693, 0, "u"], + [4694, 0, "r"], + [4695, 0, " "], + [4696, 0, "a"], + [4697, 0, "p"], + [4698, 0, "p"], + [4699, 0, "r"], + [4700, 0, "o"], + [4701, 0, "a"], + [4702, 0, "c"], + [4703, 0, "h"], + [4704, 0, " "], + [4705, 0, "r"], + [4706, 0, "e"], + [4707, 0, "q"], + [4708, 0, "u"], + [4709, 0, "i"], + [4710, 0, "r"], + [4711, 0, "e"], + [4712, 0, "s"], + [4713, 0, " "], + [4714, 0, "t"], + [4715, 0, "h"], + [4716, 0, "e"], + [4717, 0, " "], + [4718, 0, "u"], + [4719, 0, "s"], + [4720, 0, "e"], + [4721, 0, " "], + [4722, 0, "o"], + [4723, 0, "f"], + [4724, 0, " "], + [4725, 0, "a"], + [4726, 0, " "], + [4727, 0, "m"], + [4728, 0, "u"], + [4729, 0, "l"], + [4730, 0, "t"], + [4731, 0, "i"], + [4732, 0, "-"], + [4733, 0, "v"], + [4734, 0, "a"], + [4734, 1], + [4734, 0, "a"], + [4735, 0, "l"], + [4736, 0, "u"], + [4737, 0, "e"], + [4738, 0, " "], + [4739, 0, "r"], + [4740, 0, "e"], + [4741, 0, "g"], + [4742, 0, "i"], + [4743, 0, "t"], + [4744, 0, "e"], + [4744, 1], + [4743, 1], + [4743, 0, "s"], + [4744, 0, "t"], + [4745, 0, "e"], + [4746, 0, "r"], + [4746, 1], + [4745, 1], + [4744, 1], + [4743, 1], + [4742, 1], + [4741, 1], + [4740, 1], + [4739, 1], + [4738, 1], + [4737, 1], + [4736, 1], + [4735, 1], + [4734, 1], + [4733, 1], + [4732, 1], + [4731, 1], + [4730, 1], + [4729, 1], + [4728, 1], + [4727, 1], + [4726, 1], + [4725, 1], + [4724, 1], + [4723, 1], + [4722, 1], + [4721, 1], + [4720, 1], + [4719, 1], + [4718, 1], + [4717, 1], + [4716, 1], + [4715, 1], + [4714, 1], + [4713, 1], + [4712, 1], + [4711, 1], + [4710, 1], + [4709, 1], + [4708, 1], + [4707, 1], + [4706, 1], + [4705, 1], + [4705, 0, "m"], + [4706, 0, "a"], + [4707, 0, "y"], + [4708, 0, " "], + [4709, 0, "r"], + [4710, 0, "e"], + [4711, 0, "q"], + [4712, 0, "u"], + [4713, 0, "i"], + [4714, 0, "r"], + [4715, 0, "e"], + [4716, 0, " "], + [4717, 0, "a"], + [4718, 0, " "], + [4719, 0, "m"], + [4720, 0, "u"], + [4721, 0, "l"], + [4722, 0, "t"], + [4723, 0, "i"], + [4724, 0, "-"], + [4725, 0, "v"], + [4726, 0, "a"], + [4727, 0, "l"], + [4728, 0, "e"], + [4728, 1], + [4727, 1], + [4727, 0, "l"], + [4728, 0, "u"], + [4729, 0, "e"], + [4730, 0, " "], + [4731, 0, "r"], + [4732, 0, "e"], + [4733, 0, "s"], + [4734, 0, "g"], + [4734, 1], + [4733, 1], + [4733, 0, "g"], + [4734, 0, "i"], + [4735, 0, "s"], + [4736, 0, "t"], + [4737, 0, "e"], + [4738, 0, "r"], + [4739, 0, " "], + [4740, 0, "t"], + [4741, 0, "o"], + [4742, 0, " "], + [4743, 0, "r"], + [4744, 0, "e"], + [4745, 0, "c"], + [4746, 0, "o"], + [4747, 0, "r"], + [4748, 0, "d"], + [4749, 0, " "], + [4750, 0, "p"], + [4751, 0, "o"], + [4752, 0, "t"], + [4753, 0, "e"], + [4754, 0, "n"], + [4755, 0, "t"], + [4756, 0, "i"], + [4757, 0, "a"], + [4758, 0, "l"], + [4759, 0, " "], + [4760, 0, "c"], + [4761, 0, "o"], + [4762, 0, "n"], + [4763, 0, "f"], + [4764, 0, "l"], + [4765, 0, "i"], + [4766, 0, "c"], + [4767, 0, "t"], + [4768, 0, "s"], + [4704, 0, " "], + [4705, 0, "t"], + [4706, 0, "y"], + [4707, 0, "p"], + [4708, 0, "i"], + [4709, 0, "c"], + [4710, 0, "a"], + [4711, 0, "l"], + [4712, 0, "l"], + [4713, 0, "y"], + [4714, 0, " "], + [4715, 0, "s"], + [4715, 1], + [4715, 0, "s"], + [4716, 0, "u"], + [4717, 0, "p"], + [4718, 0, "p"], + [4719, 0, "o"], + [4720, 0, "r"], + [4721, 0, "t"], + [4722, 0, "s"], + [4723, 0, " "], + [4724, 0, "t"], + [4725, 0, "h"], + [4726, 0, "e"], + [4727, 0, " "], + [4728, 0, "m"], + [4729, 0, "e"], + [4730, 0, "r"], + [4731, 0, "g"], + [4732, 0, "i"], + [4733, 0, "n"], + [4733, 1], + [4732, 1], + [4731, 1], + [4730, 1], + [4729, 1], + [4728, 1], + [4728, 0, "a"], + [4729, 0, "u"], + [4730, 0, "t"], + [4731, 0, "o"], + [4732, 0, "m"], + [4733, 0, "a"], + [4734, 0, "t"], + [4735, 0, "i"], + [4736, 0, "c"], + [4737, 0, " "], + [4738, 0, "m"], + [4739, 0, "e"], + [4740, 0, "r"], + [4741, 0, "g"], + [4742, 0, "i"], + [4743, 0, "n"], + [4744, 0, "g"], + [4745, 0, " "], + [4746, 0, "o"], + [4747, 0, "f"], + [4748, 0, " "], + [4749, 0, "m"], + [4750, 0, "o"], + [4751, 0, "d"], + [4752, 0, "i"], + [4753, 0, "f"], + [4754, 0, "i"], + [4755, 0, "c"], + [4756, 0, "a"], + [4757, 0, "t"], + [4758, 0, "i"], + [4759, 0, "o"], + [4760, 0, "n"], + [4761, 0, "s"], + [4762, 0, " "], + [4763, 0, "i"], + [4764, 0, "n"], + [4765, 0, "t"], + [4766, 0, "o"], + [4767, 0, " "], + [4768, 0, "a"], + [4769, 0, " "], + [4770, 0, "J"], + [4771, 0, "S"], + [4772, 0, "O"], + [4773, 0, "N"], + [4774, 0, " "], + [4775, 0, "d"], + [4776, 0, "a"], + [4777, 0, "t"], + [4778, 0, "a"], + [4779, 0, " "], + [4780, 0, "s"], + [4781, 0, "t"], + [4782, 0, "r"], + [4783, 0, "u"], + [4784, 0, "c"], + [4785, 0, "t"], + [4786, 0, "u"], + [4787, 0, "r"], + [4788, 0, "e"], + [4789, 0, "."], + [4790, 0, " "], + [4791, 0, "O"], + [4792, 0, "u"], + [4793, 0, "r"], + [4794, 0, "a"], + [4795, 0, " "], + [4795, 1], + [4794, 1], + [4794, 0, " "], + [4795, 0, "a"], + [4796, 0, "p"], + [4797, 0, "p"], + [4798, 0, "r"], + [4799, 0, "o"], + [4800, 0, "a"], + [4801, 0, "c"], + [4802, 0, "h"], + [4806, 1], + [4805, 1], + [4804, 1], + [4813, 1], + [4812, 1], + [4811, 1], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4806, 1], + [4805, 1], + [4804, 1], + [4804, 0, "i"], + [4805, 0, "n"], + [4806, 0, "t"], + [4807, 0, "r"], + [4808, 0, "o"], + [4809, 0, "d"], + [4810, 0, "u"], + [4811, 0, "c"], + [4812, 0, "e"], + [4813, 0, "s"], + [4814, 0, " "], + [4815, 0, "a"], + [4856, 1], + [4855, 1], + [4854, 1], + [4853, 1], + [4852, 1], + [4851, 1], + [4850, 1], + [4849, 1], + [4848, 1], + [4847, 1], + [4856, 1], + [4856, 0, "i"], + [4857, 0, "n"], + [4858, 0, "g"], + [4859, 0, " "], + [4860, 0, "u"], + [4861, 0, "d"], + [4862, 0, "p"], + [4862, 1], + [4861, 1], + [4861, 0, "p"], + [4862, 0, "d"], + [4863, 0, "a"], + [4864, 0, "t"], + [4865, 0, "e"], + [4866, 0, "s"], + [4867, 0, " "], + [4813, 1], + [4812, 1], + [4811, 1], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4806, 1], + [4805, 1], + [4804, 1], + [4804, 0, "u"], + [4805, 0, "s"], + [4806, 0, "e"], + [4807, 0, "s"], + [4861, 0, " "], + [4862, 0, "t"], + [4863, 0, "o"], + [4864, 0, " "], + [4865, 0, "l"], + [4866, 0, "e"], + [4867, 0, "a"], + [4868, 0, "f"], + [4749, 0, "c"], + [4750, 0, "o"], + [4751, 0, "n"], + [4752, 0, "c"], + [4753, 0, "u"], + [4754, 0, "r"], + [4755, 0, "r"], + [4756, 0, "e"], + [4757, 0, "n"], + [4758, 0, "t"], + [4759, 0, " "], + [4821, 1], + [4820, 1], + [4819, 1], + [4818, 1], + [4817, 1], + [4816, 1], + [4815, 1], + [4815, 0, "i"], + [4816, 0, "n"], + [4817, 0, "t"], + [4818, 0, "r"], + [4819, 0, "o"], + [4820, 0, "d"], + [4821, 0, "u"], + [4822, 0, "c"], + [4823, 0, "e"], + [4824, 0, "s"], + [4825, 0, " "], + [4826, 0, "a"], + [4827, 0, " "], + [4828, 0, "g"], + [4829, 0, "e"], + [4830, 0, "n"], + [4831, 0, "e"], + [4832, 0, "r"], + [4833, 0, "a"], + [4834, 0, "l"], + [4835, 0, " "], + [4836, 0, "m"], + [4837, 0, "e"], + [4838, 0, "c"], + [4839, 0, "h"], + [4840, 0, "a"], + [4841, 0, "n"], + [4842, 0, "s"], + [4843, 0, "i"], + [4844, 0, "m"], + [4845, 0, " "], + [4846, 0, "("], + [4847, 0, "a"], + [4848, 0, " "], + [4869, 0, ")"], + [4908, 0, " "], + [4909, 0, "n"], + [4910, 0, "d"], + [4910, 1], + [4910, 0, "o"], + [4911, 0, "d"], + [4912, 0, "e"], + [4913, 0, "s"], + [4914, 0, ","], + [4915, 0, " "], + [4916, 0, "p"], + [4917, 0, "r"], + [4918, 0, "o"], + [4919, 0, "v"], + [4920, 0, "i"], + [4921, 0, "d"], + [4922, 0, "i"], + [4923, 0, "n"], + [4924, 0, "g"], + [4925, 0, " "], + [4926, 0, "a"], + [4927, 0, " "], + [4928, 0, "g"], + [4929, 0, "e"], + [4930, 0, "n"], + [4931, 0, "e"], + [4932, 0, "r"], + [4933, 0, "a"], + [4934, 0, "l"], + [4935, 0, " "], + [4936, 0, "a"], + [4937, 0, "b"], + [4938, 0, "s"], + [4939, 0, "t"], + [4940, 0, "r"], + [4941, 0, "a"], + [4942, 0, "c"], + [4943, 0, "t"], + [4944, 0, "i"], + [4945, 0, "o"], + [4946, 0, "n"], + [4947, 0, " "], + [4948, 0, "f"], + [4949, 0, "o"], + [4950, 0, "r"], + [4951, 0, " "], + [4914, 0, " "], + [4915, 0, "i"], + [4916, 0, "n"], + [4917, 0, " "], + [4918, 0, "t"], + [4919, 0, "h"], + [4920, 0, "e"], + [4921, 0, " "], + [4922, 0, "J"], + [4922, 1], + [4922, 0, "J"], + [4923, 0, "a"], + [4923, 1], + [4923, 0, "S"], + [4924, 0, "O"], + [4925, 0, "N"], + [4926, 0, " "], + [4927, 0, "d"], + [4928, 0, "a"], + [4929, 0, "t"], + [4930, 0, "a"], + [4931, 0, " "], + [4932, 0, "s"], + [4933, 0, "t"], + [4934, 0, "r"], + [4935, 0, "u"], + [4936, 0, "c"], + [4937, 0, "t"], + [4938, 0, "u"], + [4939, 0, "r"], + [4940, 0, "e"], + [4978, 1], + [4977, 1], + [4976, 1], + [4975, 1], + [4975, 0, "m"], + [4976, 0, "e"], + [4977, 0, "t"], + [4977, 1], + [4977, 0, "c"], + [4978, 0, "h"], + [4979, 0, "a"], + [4980, 0, "n"], + [4981, 0, "s"], + [4982, 0, "i"], + [4983, 0, "s"], + [4984, 0, "m"], + [4984, 1], + [4983, 1], + [4983, 0, "m"], + [4984, 0, "s"], + [4985, 0, " "], + [4986, 0, "w"], + [4987, 0, "h"], + [4988, 0, "i"], + [4989, 0, "c"], + [4990, 0, "h"], + [4991, 0, " "], + [4991, 1], + [4990, 1], + [4989, 1], + [4988, 1], + [4987, 1], + [4986, 1], + [4985, 1], + [4984, 1], + [4984, 0, " "], + [4985, 0, "w"], + [4986, 0, "h"], + [4987, 0, "i"], + [4988, 0, "c"], + [4989, 0, "h"], + [4990, 0, " "], + [4991, 0, "a"], + [4992, 0, "p"], + [4993, 0, "p"], + [4994, 0, "l"], + [4995, 0, "i"], + [4996, 0, "c"], + [4997, 0, "a"], + [4998, 0, "t"], + [4999, 0, "i"], + [5000, 0, "o"], + [5001, 0, "n"], + [5002, 0, "s"], + [5003, 0, " "], + [5004, 0, "c"], + [5005, 0, "a"], + [5006, 0, "n"], + [5007, 0, " "], + [5008, 0, "t"], + [5009, 0, "h"], + [5010, 0, "e"], + [5011, 0, "n"], + [5012, 0, " "], + [5013, 0, "r"], + [5014, 0, "e"], + [5015, 0, "s"], + [5016, 0, "o"], + [5017, 0, "l"], + [5018, 0, "v"], + [5019, 0, "e"], + [5020, 0, " "], + [5021, 0, "e"], + [5022, 0, "i"], + [5023, 0, "t"], + [5024, 0, "h"], + [5025, 0, "e"], + [5026, 0, "r"], + [5027, 0, " "], + [5028, 0, "a"], + [5029, 0, "u"], + [5030, 0, "t"], + [5031, 0, "h"], + [5031, 1], + [5031, 0, "o"], + [5032, 0, "m"], + [5033, 0, "t"], + [5033, 1], + [5033, 0, "a"], + [5034, 0, "t"], + [5035, 0, "i"], + [5036, 0, "c"], + [5037, 0, "a"], + [5038, 0, "l"], + [5039, 0, "l"], + [5040, 0, "y"], + [5041, 0, " "], + [5042, 0, "o"], + [5043, 0, "r"], + [5044, 0, " "], + [5045, 0, "m"], + [5046, 0, "a"], + [5047, 0, "n"], + [5048, 0, "u"], + [5049, 0, "a"], + [5050, 0, "l"], + [5051, 0, "l"], + [5052, 0, "y"], + [5053, 0, " "], + [5054, 0, "d"], + [5055, 0, "e"], + [5056, 0, "p"], + [5057, 0, "e"], + [5058, 0, "n"], + [5059, 0, "d"], + [5060, 0, "i"], + [5061, 0, "n"], + [5062, 0, "g"], + [5063, 0, " "], + [5064, 0, "o"], + [5065, 0, "n"], + [5066, 0, " "], + [5067, 0, "t"], + [5068, 0, "h"], + [5069, 0, "e"], + [5070, 0, "i"], + [5071, 0, "r"], + [5072, 0, " "], + [5073, 0, "s"], + [5074, 0, "e"], + [5075, 0, "m"], + [5076, 0, "a"], + [5077, 0, "n"], + [5078, 0, "t"], + [5079, 0, "i"], + [5080, 0, "c"], + [5081, 0, "s"], + [5082, 0, "."], + [4973, 1], + [4972, 1], + [4971, 1], + [4970, 1], + [4969, 1], + [4968, 1], + [4967, 1], + [4966, 1], + [4965, 1], + [4964, 1], + [4963, 1], + [4962, 1], + [4961, 1], + [4960, 1], + [4959, 1], + [4958, 1], + [4957, 1], + [4956, 1], + [4955, 1], + [4954, 1], + [4953, 1], + [4952, 1], + [4951, 1], + [4950, 1], + [4949, 1], + [4948, 1], + [4947, 1], + [4946, 1], + [4945, 1], + [4944, 1], + [4943, 1], + [4943, 0, "t"], + [4944, 0, "h"], + [4945, 0, "i"], + [4946, 0, "s"], + [4962, 1], + [4961, 1], + [4960, 1], + [4959, 1], + [4958, 1], + [4958, 0, "t"], + [4959, 0, "h"], + [4960, 0, "e"], + [4961, 0, "n"], + [4962, 0, " "], + [4963, 0, "p"], + [4964, 0, "r"], + [4965, 0, "o"], + [4966, 0, "i"], + [4966, 1], + [4966, 0, "v"], + [4967, 0, "i"], + [4968, 0, "d"], + [4969, 0, "e"], + [4970, 0, "s"], + [4971, 0, " "], + [4972, 0, "a"], + [4973, 0, " "], + [4974, 0, "s"], + [4975, 0, "t"], + [4976, 0, "r"], + [4977, 0, "c"], + [4978, 0, "t"], + [4979, 0, "u"], + [4979, 1], + [4978, 1], + [4977, 1], + [4977, 0, "u"], + [4978, 0, "c"], + [4979, 0, "t"], + [4980, 0, "u"], + [4981, 0, "r"], + [4982, 0, "e"], + [4983, 0, " "], + [4984, 0, "o"], + [4985, 0, "n"], + [4986, 0, " "], + [4987, 0, "w"], + [4988, 0, "h"], + [4989, 0, "i"], + [4990, 0, "c"], + [4991, 0, "h"], + [5028, 1], + [5027, 1], + [5026, 1], + [5025, 1], + [5024, 1], + [5023, 1], + [5023, 0, "s"], + [5024, 0, "u"], + [5025, 0, "c"], + [5026, 0, "h"], + [5027, 0, " "], + [5028, 0, "c"], + [5029, 0, "o"], + [5030, 0, "n"], + [5031, 0, "f"], + [5032, 0, "l"], + [5033, 0, "i"], + [5034, 0, "c"], + [5035, 0, "t"], + [5036, 0, "s"], + [5051, 0, ","], + [5064, 0, ","], + [5261, 1], + [4941, 1], + [4941, 0, "."], + [4943, 1], + [4943, 0, "T"], + [4982, 1], + [4981, 1], + [4980, 1], + [4979, 1], + [4978, 1], + [4977, 1], + [4976, 1], + [4975, 1], + [4974, 1], + [4974, 0, "c"], + [4975, 0, "o"], + [4976, 0, "n"], + [4977, 0, "s"], + [4978, 0, "i"], + [4979, 0, "s"], + [4980, 0, "t"], + [4981, 0, "e"], + [4982, 0, "n"], + [4983, 0, "t"], + [4984, 0, " "], + [4985, 0, "b"], + [4986, 0, "a"], + [4987, 0, "s"], + [4988, 0, "i"], + [4989, 0, "s"], + [5020, 1], + [5019, 1], + [5018, 1], + [5017, 1], + [5016, 1], + [5028, 1], + [5027, 1], + [5026, 1], + [5025, 1], + [5024, 1], + [5024, 0, " "], + [5025, 0, "a"], + [5026, 0, "n"], + [5027, 0, "y"], + [5028, 0, " "], + [5029, 0, "r"], + [5030, 0, "e"], + [5031, 0, "m"], + [5032, 0, "a"], + [5033, 0, "i"], + [5034, 0, "n"], + [5035, 0, "i"], + [5036, 0, "n"], + [5037, 0, "g"], + [5075, 1], + [5074, 1], + [5073, 1], + [5072, 1], + [5071, 1], + [5070, 1], + [5069, 1], + [5068, 1], + [5067, 1], + [5066, 1], + [5065, 1], + [5064, 1], + [5063, 1], + [5062, 1], + [5061, 1], + [5060, 1], + [5059, 1], + [5058, 1], + [5057, 1], + [5056, 1], + [5055, 1], + [5054, 1], + [5053, 1], + [5052, 1], + [5051, 1], + [5050, 1], + [5049, 1], + [5049, 0, "t"], + [5050, 0, "h"], + [5051, 0, "r"], + [5052, 0, "o"], + [5053, 0, "u"], + [5054, 0, "g"], + [5055, 0, " "], + [5055, 1], + [5055, 0, "h"], + [5056, 0, " "], + [5057, 0, "a"], + [5058, 0, "u"], + [5059, 0, "t"], + [5060, 0, "o"], + [5061, 0, "m"], + [5062, 0, "a"], + [5063, 0, "t"], + [5064, 0, "i"], + [5065, 0, "c"], + [5066, 0, " "], + [5067, 0, "o"], + [5068, 0, "r"], + [5069, 0, " "], + [5070, 0, "m"], + [5071, 0, "a"], + [5072, 0, "n"], + [5073, 0, "u"], + [5074, 0, "a"], + [5075, 0, "l"], + [5076, 0, " "], + [5077, 0, "m"], + [5078, 0, "e"], + [5079, 0, "a"], + [5080, 0, "n"], + [5081, 0, "s"], + [5110, 1], + [5109, 1], + [5108, 1], + [5107, 1], + [5106, 1], + [5105, 1], + [5104, 1], + [5103, 1], + [5102, 1], + [5101, 1], + [5100, 1], + [5099, 1], + [5098, 1], + [5097, 1], + [5096, 1], + [5095, 1], + [5094, 1], + [5093, 1], + [5092, 1], + [5091, 1], + [5090, 1], + [5089, 1], + [5088, 1], + [5087, 1], + [5086, 1], + [5085, 1], + [5084, 1], + [5083, 1], + [5082, 1], + [5066, 0, " "], + [5067, 0, "("], + [5068, 0, "p"], + [5069, 0, "r"], + [5070, 0, "o"], + [5071, 0, "g"], + [5072, 0, "r"], + [5073, 0, "a"], + [5074, 0, "m"], + [5075, 0, "m"], + [5076, 0, "a"], + [5077, 0, "t"], + [5078, 0, "i"], + [5079, 0, "c"], + [5080, 0, ")"], + [5083, 1], + [5082, 1], + [5081, 1], + [5080, 1], + [5079, 1], + [5078, 1], + [5077, 1], + [5076, 1], + [5075, 1], + [5074, 1], + [5073, 1], + [5072, 1], + [5071, 1], + [5070, 1], + [5069, 1], + [5068, 1], + [5067, 1], + [5066, 1], + [5065, 1], + [5064, 1], + [5063, 1], + [5062, 1], + [5061, 1], + [5060, 1], + [5059, 1], + [5058, 1], + [5057, 1], + [5057, 0, "p"], + [5058, 0, "r"], + [5059, 0, "o"], + [5060, 0, "g"], + [5061, 0, "r"], + [5062, 0, "a"], + [5063, 0, "m"], + [5064, 0, "m"], + [5065, 0, "a"], + [5066, 0, "t"], + [5067, 0, "i"], + [5068, 0, "c"], + [5069, 0, " "], + [5070, 0, "m"], + [5071, 0, "e"], + [5072, 0, "a"], + [5073, 0, "n"], + [5074, 0, "s"], + [5075, 0, " "], + [5076, 0, "o"], + [5077, 0, "r"], + [5090, 1], + [5089, 1], + [5088, 1], + [5087, 1], + [5086, 1], + [5085, 1], + [5084, 1], + [5083, 1], + [5082, 1], + [5081, 1], + [5080, 1], + [5079, 1], + [5079, 0, "f"], + [5080, 0, "u"], + [5081, 0, "r"], + [5082, 0, "t"], + [5083, 0, "h"], + [5084, 0, "e"], + [5085, 0, "r"], + [5086, 0, " "], + [5087, 0, "u"], + [5088, 0, "s"], + [5089, 0, "e"], + [5090, 0, "r"], + [5091, 0, " "], + [5092, 0, "i"], + [5093, 0, "n"], + [5094, 0, "p"], + [5095, 0, "u"], + [5096, 0, "t"], + [5079, 0, "v"], + [5080, 0, "i"], + [5081, 0, "a"], + [5082, 0, " "], + [4813, 1], + [4812, 1], + [4811, 1], + [4810, 1], + [4809, 1], + [4808, 1], + [4807, 1], + [4806, 1], + [4805, 1], + [4804, 1], + [4803, 1], + [4802, 1], + [4802, 0, "W"], + [4803, 0, "e"], + [4814, 1], + [4859, 0, " "], + [4860, 0, "i"], + [4861, 0, "n"], + [4862, 0, "t"], + [4863, 0, "o"], + [4864, 0, " "], + [4865, 0, "o"], + [4866, 0, "u"], + [4867, 0, "r"], + [4868, 0, " "], + [4869, 0, "m"], + [4870, 0, "o"], + [4871, 0, "d"], + [4872, 0, "e"], + [4873, 0, "l"], + [4816, 0, " "], + [4817, 0, "s"], + [4818, 0, "i"], + [4819, 0, "n"], + [4820, 0, "g"], + [4821, 0, "l"], + [4822, 0, "e"], + [4823, 0, ","], + [5087, 0, ","], + [6892, 1], + [6891, 1], + [6890, 1], + [6889, 1], + [6888, 1], + [6887, 1], + [6886, 1], + [6885, 1], + [6884, 1], + [6883, 1], + [6882, 1], + [6881, 1], + [6881, 0, "d"], + [6882, 0, "e"], + [6883, 0, "s"], + [6884, 0, "c"], + [6885, 0, "r"], + [6886, 0, "i"], + [6887, 0, "b"], + [6888, 0, "e"], + [6889, 0, " "], + [6890, 0, "f"], + [6891, 0, "o"], + [6892, 0, "u"], + [6893, 0, "r"], + [6894, 0, " "], + [6895, 0, "m"], + [6896, 0, "o"], + [6897, 0, "r"], + [6898, 0, "e"], + [6899, 0, " "], + [6900, 0, "c"], + [6901, 0, "o"], + [6902, 0, "m"], + [6903, 0, "p"], + [6904, 0, "l"], + [6905, 0, "e"], + [6906, 0, "x"], + [7931, 1], + [7930, 1], + [7929, 1], + [7929, 0, "o"], + [7930, 0, "r"], + [7929, 0, "a"], + [7930, 0, "n"], + [7931, 0, "d"], + [7933, 1], + [7932, 1], + [7931, 1], + [7930, 1], + [7929, 1], + [7929, 0, "a"], + [7930, 0, "s"], + [7931, 0, " "], + [7932, 0, "w"], + [7933, 0, "e"], + [7934, 0, "l"], + [7935, 0, "l"], + [7936, 0, " "], + [7937, 0, "a"], + [7938, 0, "s"], + [8025, 1], + [8024, 1], + [8023, 1], + [8022, 1], + [8021, 1], + [8020, 1], + [8019, 1], + [8018, 1], + [8017, 1], + [8016, 1], + [8015, 1], + [8014, 1], + [8014, 0, "."], + [8015, 0, " "], + [8016, 0, "T"], + [16736, 1], + [16735, 1], + [16734, 1], + [16733, 1], + [16732, 1], + [16733, 1], + [16733, 0, "`"], + [16734, 0, "`"], + [16738, 1], + [16738, 0, "'"], + [16739, 0, "'"], + [16741, 0, " "], + [16742, 1], + [16742, 0, "z"], + [16742, 1], + [16742, 0, "`"], + [16743, 0, "`"], + [16745, 1], + [16745, 0, "'"], + [16746, 0, "'"], + [16747, 0, "\\"], + [16749, 1], + [16784, 1], + [16783, 1], + [16782, 1], + [16781, 1], + [16780, 1], + [16781, 1], + [16781, 0, "`"], + [16782, 0, "`"], + [16786, 1], + [16786, 0, "'"], + [16787, 0, "'"], + [16789, 0, " "], + [16790, 1], + [16790, 0, "`"], + [16791, 0, "`"], + [16793, 1], + [16793, 0, "'"], + [16794, 0, "'"], + [16795, 0, "\\"], + [16797, 1], + [16844, 1], + [16843, 0, "\\"], + [16842, 1], + [16842, 0, "'"], + [16843, 0, "'"], + [16840, 1], + [16840, 0, " "], + [16841, 0, "`"], + [16842, 0, "`"], + [16838, 1], + [16838, 0, "'"], + [16839, 0, "'"], + [16834, 1], + [16834, 0, "`"], + [16835, 0, "`"], + [16832, 1], + [16831, 1], + [16830, 1], + [16829, 1], + [16828, 1], + [16878, 1], + [16877, 1], + [16876, 1], + [16875, 1], + [16874, 1], + [16921, 1], + [16921, 1], + [16921, 1], + [16921, 1], + [16921, 1], + [16875, 1], + [16875, 0, "`"], + [16876, 0, "`"], + [16923, 1], + [16923, 0, "'"], + [16924, 0, "'"], + [16880, 1], + [16880, 0, "`"], + [16881, 0, "`"], + [16881, 1], + [16880, 1], + [16880, 0, "'"], + [16881, 0, "'"], + [16925, 1], + [16924, 1], + [16924, 0, "`"], + [16925, 0, "`"], + [16929, 1], + [16929, 0, "'"], + [16930, 0, "'"], + [16932, 0, " "], + [16883, 0, " "], + [16885, 1], + [16885, 0, "`"], + [16886, 0, "`"], + [16936, 1], + [16936, 0, "`"], + [16937, 0, "`"], + [16888, 1], + [16888, 0, "'"], + [16889, 0, "'"], + [16940, 1], + [16940, 0, "'"], + [16941, 0, "'"], + [16943, 1], + [16891, 1], + [16891, 0, " "], + [16892, 0, "`"], + [16893, 0, "`"], + [16945, 0, " "], + [16946, 0, "`"], + [16947, 0, "`"], + [16949, 1], + [16949, 0, "'"], + [16950, 0, "'"], + [16895, 1], + [16895, 0, "'"], + [16896, 0, "'"], + [16897, 0, "\\"], + [16899, 0, "\\"], + [16901, 1], + [16955, 1], + [16954, 0, "\\"], + [16953, 0, "\\"], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17015, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [17104, 1], + [16725, 1], + [16725, 0, "0"], + [16718, 0, "1"], + [16720, 1], + [16751, 0, "\n"], + [16752, 0, "\\"], + [16753, 0, "n"], + [16754, 0, "o"], + [16755, 0, "d"], + [16756, 0, "e"], + [16757, 0, " "], + [16758, 0, "("], + [16759, 0, "s"], + [16760, 0, "t"], + [16761, 0, "a"], + [16762, 0, "r"], + [16763, 0, "t"], + [16764, 0, "2"], + [16765, 0, ")"], + [16766, 0, " "], + [16767, 0, "a"], + [16768, 0, "t"], + [16769, 0, " "], + [16770, 0, "("], + [16771, 0, "4"], + [16772, 0, ","], + [16773, 0, "3"], + [16774, 0, ")"], + [16775, 0, " "], + [16776, 0, "{"], + [16777, 0, "\\"], + [16778, 0, "{"], + [16779, 0, "`"], + [16780, 0, "`"], + [16781, 0, "k"], + [16782, 0, "e"], + [16783, 0, "y"], + [16784, 0, "'"], + [16785, 0, "'"], + [16786, 0, " "], + [16786, 1], + [16786, 0, ":"], + [16787, 0, " "], + [16788, 0, "`"], + [16789, 0, "`"], + [16790, 0, "A"], + [16791, 0, "'"], + [16792, 0, "'"], + [16793, 0, "]"], + [16793, 1], + [16793, 0, "\\"], + [16794, 0, "}"], + [16795, 0, "}"], + [16796, 0, ";"], + [17029, 0, "1"], + [16718, 1], + [16717, 1], + [16716, 1], + [16715, 1], + [16714, 1], + [16713, 1], + [16713, 0, "l"], + [16714, 0, "e"], + [16715, 0, "f"], + [16716, 0, "t"], + [16717, 0, "0"], + [16763, 1], + [16762, 1], + [16761, 1], + [16760, 1], + [16759, 1], + [16758, 1], + [16758, 0, "r"], + [16759, 0, "i"], + [16760, 0, "g"], + [16761, 0, "h"], + [16762, 0, "t"], + [16763, 0, "1"], + [16763, 1], + [16763, 0, "0"], + [17028, 1], + [17027, 1], + [17026, 1], + [17025, 1], + [17024, 1], + [17023, 1], + [17023, 0, "l"], + [17024, 0, "e"], + [17025, 0, "f"], + [17026, 0, "t"], + [17027, 0, "0"], + [17115, 1], + [17114, 1], + [17113, 1], + [17112, 1], + [17111, 1], + [17111, 0, "r"], + [17112, 0, "i"], + [17113, 0, "g"], + [17114, 0, "h"], + [17115, 0, "t"], + [17116, 0, "0"], + [16929, 0, "\\"], + [16986, 0, "\\"], + [17270, 0, ","], + [17271, 0, "d"], + [17272, 0, "a"], + [17273, 0, "s"], + [17274, 0, "h"], + [17275, 0, "e"], + [17276, 0, "d"], + [17316, 0, "d"], + [17317, 0, "a"], + [17318, 0, "s"], + [17319, 0, "h"], + [17320, 0, "e"], + [17321, 0, "d"], + [17322, 0, ","], + [17526, 0, "*"], + [16667, 0, "*"], + [16727, 1], + [16727, 0, "4"], + [16773, 1], + [16773, 0, "4"], + [16821, 1], + [16820, 1], + [16819, 1], + [16819, 0, "2"], + [16865, 1], + [16865, 1], + [16865, 1], + [16865, 0, "2"], + [17419, 0, "\n"], + [17419, 1], + [16706, 0, "\n"], + [16707, 0, "\\"], + [16708, 0, "p"], + [16709, 0, "a"], + [16710, 0, "t"], + [16711, 0, "h"], + [16712, 0, " "], + [16713, 0, "["], + [16714, 0, "d"], + [16715, 0, "r"], + [16716, 0, "a"], + [16717, 0, "w"], + [16718, 0, "="], + [16718, 1], + [16718, 0, "]"], + [16719, 0, " "], + [16720, 0, "("], + [16721, 0, "2"], + [16722, 0, ","], + [16723, 0, "0"], + [16724, 0, ")"], + [16725, 0, " "], + [16726, 0, "-"], + [16727, 0, "-"], + [16728, 0, " "], + [16729, 0, "("], + [16730, 0, "2"], + [16731, 0, ","], + [16732, 0, "4"], + [16733, 0, ")"], + [16734, 0, ";"], + [16718, 0, ","], + [16719, 0, "d"], + [16720, 0, "a"], + [16721, 0, "s"], + [16722, 0, "h"], + [16722, 1], + [16721, 1], + [16720, 1], + [16720, 0, "o"], + [16721, 0, "t"], + [16722, 0, "t"], + [16723, 0, "e"], + [16724, 0, "d"], + [17004, 1], + [17004, 0, "1"], + [16947, 1], + [16947, 0, "1"], + [16901, 1], + [16901, 0, "3"], + [16855, 1], + [16855, 0, "3"], + [16809, 1], + [16809, 0, "4"], + [16809, 1], + [16809, 0, "5"], + [16763, 1], + [16763, 0, "5"], + [16757, 0, " "], + [16739, 1], + [16739, 0, "6"], + [16742, 0, "\n"], + [16743, 0, "\\"], + [16744, 0, "n"], + [16745, 0, "o"], + [16746, 0, "d"], + [16747, 0, "e"], + [16748, 0, " "], + [16749, 0, "("], + [16750, 0, "r"], + [16751, 0, "e"], + [16752, 0, "p"], + [16752, 1], + [16751, 1], + [16750, 1], + [16750, 0, "l"], + [16751, 0, "e"], + [16752, 0, "f"], + [16753, 0, "t"], + [16754, 0, "R"], + [16755, 0, ")"], + [16756, 0, " "], + [16757, 0, " "], + [16758, 0, "a"], + [16759, 0, "t"], + [16760, 0, " "], + [16761, 0, "("], + [16762, 0, "0"], + [16763, 0, ","], + [16764, 0, "6"], + [16765, 0, ")"], + [16766, 0, " "], + [16767, 0, "{"], + [16768, 0, "R"], + [16769, 0, "p"], + [16769, 1], + [16769, 0, "e"], + [16770, 0, "p"], + [16771, 0, "l"], + [16772, 0, "i"], + [16773, 0, "c"], + [16774, 0, "a"], + [16775, 0, " "], + [16776, 0, "p"], + [16776, 1], + [16776, 0, "$"], + [16777, 0, "p"], + [16778, 0, "_"], + [16779, 0, "1"], + [16780, 0, "$"], + [16781, 0, ":"], + [16782, 0, "}"], + [16783, 0, "\n"], + [16784, 0, "\\"], + [16785, 0, "n"], + [16786, 0, "o"], + [16787, 0, "d"], + [16788, 0, "e"], + [16789, 0, " "], + [16790, 0, "("], + [16791, 0, "r"], + [16792, 0, "i"], + [16793, 0, "g"], + [16794, 0, "h"], + [16795, 0, "t"], + [16796, 0, "R"], + [16797, 0, ")"], + [16798, 0, " "], + [16799, 0, "a"], + [16800, 0, "t"], + [16801, 0, " "], + [16802, 0, "("], + [16803, 0, "4"], + [16804, 0, ","], + [16805, 0, "6"], + [16806, 0, ")"], + [16807, 0, " "], + [16808, 0, "{"], + [16809, 0, "R"], + [16810, 0, "e"], + [16811, 0, "p"], + [16812, 0, "l"], + [16813, 0, "i"], + [16814, 0, "c"], + [16815, 0, "a"], + [16816, 0, " "], + [16817, 0, "$"], + [16818, 0, "p"], + [16819, 0, "_"], + [16820, 0, "2"], + [16821, 0, "$"], + [16822, 0, ":"], + [16823, 0, "}"], + [16848, 0, " "], + [16849, 0, "["], + [16850, 0, "r"], + [16851, 0, "e"], + [16852, 0, "c"], + [16853, 0, "t"], + [16854, 0, "a"], + [16855, 0, "n"], + [16856, 0, "g"], + [16857, 0, "l"], + [16858, 0, "e"], + [16859, 0, ","], + [16860, 0, "d"], + [16861, 0, "r"], + [16862, 0, "a"], + [16863, 0, "w"], + [16864, 0, "]"], + [16911, 0, " "], + [16912, 0, "["], + [16913, 0, "r"], + [16914, 0, "e"], + [16915, 0, "c"], + [16916, 0, "t"], + [16917, 0, "a"], + [16918, 0, "n"], + [16919, 0, "g"], + [16920, 0, "l"], + [16921, 0, "e"], + [16922, 0, ","], + [16923, 0, "d"], + [16924, 0, "r"], + [16925, 0, "a"], + [16926, 0, "w"], + [16927, 0, "]"], + [16974, 0, " "], + [16975, 0, "["], + [16976, 0, "r"], + [16977, 0, "e"], + [16978, 0, "c"], + [16979, 0, "t"], + [16980, 0, "a"], + [16981, 0, "n"], + [16982, 0, "g"], + [16983, 0, "l"], + [16984, 0, "e"], + [16985, 0, ","], + [16986, 0, "d"], + [16987, 0, "r"], + [16988, 0, "a"], + [16989, 0, "w"], + [16990, 0, "]"], + [17037, 0, " "], + [17038, 0, "["], + [17039, 0, "r"], + [17040, 0, "e"], + [17041, 0, "c"], + [17042, 0, "t"], + [17043, 0, "a"], + [17044, 0, "n"], + [17045, 0, "g"], + [17046, 0, "l"], + [17047, 0, "e"], + [17048, 0, ","], + [17049, 0, "d"], + [17050, 0, "r"], + [17051, 0, "a"], + [17052, 0, "w"], + [17053, 0, "]"], + [17100, 0, " "], + [17101, 0, "["], + [17102, 0, "r"], + [17103, 0, "e"], + [17104, 0, "c"], + [17105, 0, "t"], + [17106, 0, "a"], + [17107, 0, "n"], + [17108, 0, "g"], + [17109, 0, "l"], + [17110, 0, "e"], + [17111, 0, ","], + [17112, 0, "d"], + [17113, 0, "r"], + [17114, 0, "a"], + [17115, 0, "w"], + [17116, 0, "]"], + [17174, 0, " "], + [17175, 0, "["], + [17176, 0, "r"], + [17177, 0, "e"], + [17178, 0, "c"], + [17179, 0, "t"], + [17180, 0, "a"], + [17181, 0, "n"], + [17182, 0, "g"], + [17183, 0, "l"], + [17184, 0, "e"], + [17185, 0, ","], + [17186, 0, "d"], + [17187, 0, "r"], + [17188, 0, "a"], + [17189, 0, "w"], + [17190, 0, "]"], + [16783, 0, ";"], + [16825, 0, ";"], + [16779, 1], + [16778, 1], + [16817, 1], + [16817, 1], + [16817, 1], + [16817, 0, "q"], + [17464, 1], + [17463, 1], + [17462, 1], + [17461, 1], + [17460, 1], + [17459, 1], + [17458, 1], + [17457, 1], + [17456, 1], + [17455, 1], + [17454, 1], + [17453, 1], + [17452, 1], + [17451, 1], + [17450, 1], + [17449, 1], + [17448, 1], + [17447, 1], + [17446, 1], + [17445, 1], + [17444, 1], + [17443, 1], + [17442, 1], + [17441, 1], + [17440, 1], + [17439, 1], + [17438, 1], + [17437, 1], + [17436, 1], + [17435, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [17568, 1], + [16737, 1], + [16737, 0, "3"], + [16728, 1], + [16728, 0, "3"], + [16802, 1], + [16802, 0, "6"], + [16905, 1], + [16905, 0, "6"], + [17031, 1], + [17031, 0, "6"], + [17168, 1], + [17168, 0, "6"], + [17486, 0, "."], + [17487, 0, "n"], + [17488, 0, "o"], + [17489, 0, "r"], + [17490, 0, "t"], + [17491, 0, "h"], + [17492, 0, " "], + [17493, 0, "e"], + [17494, 0, "a"], + [17495, 0, "s"], + [17496, 0, "t"], + [17542, 0, "."], + [17543, 0, "n"], + [17544, 0, "o"], + [17545, 0, "r"], + [17546, 0, "t"], + [17547, 0, "h"], + [17548, 0, " "], + [17549, 0, "w"], + [17550, 0, "e"], + [17551, 0, "s"], + [17552, 0, "t"], + [17433, 1], + [17432, 1], + [17431, 1], + [17430, 1], + [17429, 1], + [17428, 1], + [17427, 1], + [17427, 0, "-"], + [17428, 0, "-"], + [17472, 1], + [17471, 1], + [17471, 0, "-"], + [17472, 0, "-"], + [17529, 1], + [17528, 1], + [17528, 0, "-"], + [17529, 0, "-"], + [17583, 1], + [17582, 1], + [17581, 1], + [17580, 1], + [17579, 1], + [17578, 1], + [17577, 1], + [17577, 0, "-"], + [17578, 0, "-"], + [17491, 1], + [17490, 1], + [17489, 1], + [17488, 1], + [17488, 0, "w"], + [17489, 0, "e"], + [17490, 0, "s"], + [17491, 0, "t"], + [17547, 1], + [17546, 1], + [17545, 1], + [17544, 1], + [17544, 0, "e"], + [17545, 0, "a"], + [17546, 0, "s"], + [17547, 0, "t"], + [17469, 0, "."], + [17470, 0, "s"], + [17471, 0, "o"], + [17472, 0, "u"], + [17473, 0, "t"], + [17474, 0, "h"], + [17475, 0, " "], + [17476, 0, "e"], + [17477, 0, "a"], + [17478, 0, "s"], + [17479, 0, "t"], + [17537, 0, "."], + [17538, 0, "s"], + [17539, 0, "o"], + [17540, 0, "u"], + [17541, 0, "t"], + [17542, 0, "h"], + [17543, 0, " "], + [17544, 0, "w"], + [17545, 0, "e"], + [17546, 0, "s"], + [17547, 0, "t"], + [17222, 0, "\n"], + [17223, 0, "\\"], + [17224, 0, "n"], + [17225, 0, "o"], + [17226, 0, "d"], + [17227, 0, "e"], + [17228, 0, " "], + [17229, 0, "("], + [17230, 0, "c"], + [17231, 0, "o"], + [17232, 0, "m"], + [17233, 0, "m"], + [17234, 0, "s"], + [17235, 0, ")"], + [17236, 0, " "], + [17237, 0, " "], + [17238, 0, "a"], + [17239, 0, "t"], + [17240, 0, " "], + [17241, 0, "("], + [17242, 0, "3"], + [17243, 0, ","], + [17244, 0, "2"], + [17245, 0, "."], + [17246, 0, "5"], + [17247, 0, ")"], + [17248, 0, " "], + [17249, 0, "{"], + [17250, 0, "n"], + [17251, 0, "e"], + [17252, 0, "t"], + [17253, 0, "w"], + [17254, 0, "o"], + [17255, 0, "r"], + [17256, 0, "k"], + [17257, 0, " "], + [17258, 0, "c"], + [17259, 0, "o"], + [17260, 0, "m"], + [17261, 0, "m"], + [17262, 0, "u"], + [17263, 0, "n"], + [17264, 0, "i"], + [17265, 0, "c"], + [17266, 0, "a"], + [17267, 0, "t"], + [17268, 0, "i"], + [17269, 0, "o"], + [17270, 0, "n"], + [17271, 0, "}"], + [17272, 0, ";"], + [17257, 0, "\\"], + [17258, 0, "\\"], + [17259, 1], + [17250, 0, "\\"], + [17251, 0, "f"], + [17252, 0, "o"], + [17253, 0, "o"], + [17254, 0, "t"], + [17255, 0, "n"], + [17256, 0, "o"], + [17257, 0, "t"], + [17258, 0, "e"], + [17259, 0, "s"], + [17260, 0, "i"], + [17261, 0, "z"], + [17262, 0, "e"], + [17263, 0, " "], + [17272, 1], + [17271, 1], + [17271, 0, " "], + [17246, 1], + [17246, 0, "8"], + [17524, 0, "b"], + [17525, 0, "l"], + [17526, 0, "u"], + [17527, 0, "e"], + [17528, 0, ","], + [17596, 0, "b"], + [17597, 0, "l"], + [17598, 0, "u"], + [17599, 0, "e"], + [17600, 0, ","], + [17248, 0, " "], + [17249, 0, "["], + [17250, 0, "t"], + [17251, 0, "e"], + [17252, 0, "x"], + [17253, 0, "t"], + [17254, 0, "="], + [17255, 0, "b"], + [17256, 0, "l"], + [17257, 0, "u"], + [17258, 0, "e"], + [17259, 0, "]"], + [16731, 0, "."], + [16732, 0, "5"], + [16742, 0, "."], + [16743, 0, "5"], + [19837, 1], + [19836, 1], + [19835, 1], + [19834, 1], + [19833, 1], + [19832, 1], + [19831, 1], + [19830, 1], + [19829, 1], + [19828, 1], + [19827, 1], + [19826, 1], + [19825, 1], + [19824, 1], + [19823, 1], + [19822, 1], + [19821, 1], + [19820, 1], + [19819, 1], + [19818, 1], + [19817, 1], + [19816, 1], + [19815, 1], + [19814, 1], + [19813, 1], + [19812, 1], + [19811, 1], + [19810, 1], + [19809, 1], + [19808, 1], + [19807, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19851, 1], + [19789, 0, ","], + [19790, 0, "d"], + [19791, 0, "a"], + [19792, 0, "s"], + [19793, 0, "h"], + [19794, 0, "e"], + [19795, 0, "d"], + [19796, 0, ","], + [19797, 0, "b"], + [19798, 0, "l"], + [19799, 0, "u"], + [19800, 0, "e"], + [19844, 0, ","], + [19845, 0, "d"], + [19846, 0, "a"], + [19847, 0, "s"], + [19848, 0, "h"], + [19849, 0, "e"], + [19850, 0, "d"], + [19851, 0, ","], + [19852, 0, "b"], + [19853, 0, "l"], + [19854, 0, "u"], + [19855, 0, "e"], + [19789, 1], + [19788, 1], + [19787, 1], + [19839, 1], + [19839, 1], + [19839, 1], + [19798, 0, ","], + [19799, 0, "-"], + [19800, 0, ">"], + [19853, 0, ","], + [19854, 0, "-"], + [19855, 0, ">"], + [19345, 1], + [19344, 1], + [19343, 1], + [19342, 1], + [19341, 1], + [19389, 1], + [19389, 1], + [19389, 1], + [19389, 1], + [19389, 1], + [19389, 0, "{"], + [19342, 1], + [19342, 0, "`"], + [19343, 0, "`"], + [19391, 1], + [19391, 0, "`"], + [19392, 0, "`"], + [19398, 1], + [19398, 0, "'"], + [19399, 0, "'"], + [19350, 1], + [19350, 0, "'"], + [19351, 0, "'"], + [19354, 0, "\\"], + [19356, 1], + [19356, 0, "`"], + [19357, 0, "`"], + [19361, 1], + [19361, 0, "'"], + [19362, 0, "'"], + [19365, 1], + [19365, 0, "`"], + [19366, 0, "`"], + [19374, 1], + [19374, 0, "'"], + [19375, 0, "'"], + [19408, 1], + [19408, 0, "`"], + [19409, 0, "`"], + [19417, 1], + [19417, 0, "'"], + [19418, 0, "'"], + [19419, 0, "\\"], + [19421, 0, "\\"], + [19423, 1], + [19377, 1], + [19394, 1], + [19394, 1], + [19258, 1], + [19258, 1], + [19258, 1], + [19258, 1], + [19258, 1], + [19258, 1], + [19258, 1], + [19258, 0, "`"], + [19259, 0, "`"], + [19265, 1], + [19265, 0, "'"], + [19266, 0, "'"], + [19269, 1], + [19269, 0, "`"], + [19270, 0, "`"], + [19278, 1], + [19278, 0, "'"], + [19279, 0, "'"], + [19280, 0, "\\"], + [19282, 0, "\\"], + [19284, 1], + [19240, 1], + [19238, 1], + [19238, 0, "'"], + [19239, 0, "'"], + [19230, 1], + [19230, 0, "`"], + [19231, 0, "`"], + [19227, 1], + [19227, 0, "'"], + [19228, 0, "'"], + [19223, 1], + [19223, 0, "`"], + [19224, 0, "`"], + [19222, 0, "\\"], + [19219, 1], + [19219, 0, "'"], + [19220, 0, "'"], + [19212, 1], + [19212, 0, "`"], + [19213, 0, "`"], + [19210, 1], + [19209, 1], + [19208, 1], + [19207, 1], + [19206, 1], + [19123, 1], + [19122, 1], + [19121, 1], + [19120, 1], + [19119, 1], + [19120, 1], + [19120, 0, "`"], + [19121, 0, "`"], + [19128, 1], + [19128, 0, "'"], + [19129, 0, "'"], + [19132, 0, "\\"], + [19134, 1], + [19134, 0, "`"], + [19135, 0, "`"], + [19141, 1], + [19141, 0, "'"], + [19142, 0, "'"], + [19145, 1], + [19145, 0, "`"], + [19146, 0, "`"], + [19154, 1], + [19154, 0, "'"], + [19155, 0, "'"], + [19156, 0, "\\"], + [19158, 0, "\\"], + [19160, 1], + [19087, 1], + [19086, 0, "\\"], + [19085, 0, "\\"], + [19084, 0, "\\"], + [19074, 1], + [19074, 0, "`"], + [19075, 0, "`"], + [19082, 1], + [19082, 0, "'"], + [19083, 0, "'"], + [19072, 1], + [19071, 1], + [19070, 1], + [19069, 1], + [19068, 1], + [19032, 1], + [19031, 0, "\\"], + [19030, 0, "\\"], + [19029, 1], + [19029, 0, "'"], + [19030, 0, "'"], + [19021, 1], + [19021, 0, "`"], + [19022, 0, "`"], + [19014, 1], + [19013, 1], + [19012, 1], + [19011, 1], + [19010, 1], + [19009, 1], + [19008, 1], + [19008, 0, "`"], + [19009, 0, "`"], + [19013, 1], + [19013, 0, "'"], + [19014, 0, "'"], + [18959, 1], + [18958, 1], + [18957, 1], + [18956, 1], + [18955, 1], + [18956, 1], + [18956, 0, "`"], + [18957, 0, "`"], + [18964, 1], + [18964, 0, "'"], + [18965, 0, "'"], + [18968, 0, "\\"], + [18970, 1], + [18970, 0, "`"], + [18971, 0, "`"], + [18976, 1], + [18976, 0, "'"], + [18977, 0, "'"], + [18980, 1], + [18980, 0, "`"], + [18981, 0, "`"], + [18989, 1], + [18989, 0, "'"], + [18990, 0, "'"], + [18992, 1], + [18905, 1], + [18904, 0, "\\"], + [18903, 0, "\\"], + [18902, 1], + [18902, 0, "'"], + [18903, 0, "'"], + [18894, 1], + [18894, 0, "`"], + [18895, 0, "`"], + [18891, 1], + [18891, 0, "'"], + [18892, 0, "'"], + [18886, 1], + [18886, 0, "`"], + [18887, 0, "`"], + [18875, 1], + [18875, 0, "`"], + [18876, 0, "`"], + [18883, 1], + [18883, 0, "'"], + [18884, 0, "'"], + [18887, 0, "\\"], + [18873, 1], + [18872, 1], + [18871, 1], + [18870, 1], + [18869, 1], + [18896, 0, "\\"], + [18986, 0, "\\"], + [19025, 0, "\\"], + [19152, 0, "\\"], + [19153, 0, "\\"], + [19153, 1], + [19241, 0, "\\"], + [19242, 0, "\\"], + [19283, 0, "\\"], + [19242, 1], + [19378, 0, "\\"], + [19419, 0, "\\"], + [19514, 1], + [19513, 1], + [19512, 1], + [19511, 1], + [19510, 1], + [19509, 1], + [19508, 1], + [19507, 1], + [19506, 1], + [19505, 1], + [19504, 1], + [19503, 1], + [19502, 1], + [19501, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [19612, 1], + [18855, 1], + [18854, 1], + [18853, 1], + [18852, 1], + [18851, 1], + [18851, 0, "l"], + [18852, 0, "e"], + [18853, 0, "f"], + [18854, 0, "t"], + [18855, 0, "0"], + [18862, 1], + [18862, 0, "0"], + [18912, 0, "\n"], + [18913, 0, "\\"], + [18914, 0, "n"], + [18915, 0, "o"], + [18916, 0, "d"], + [18917, 0, "e"], + [18918, 0, " "], + [18919, 0, "("], + [18920, 0, "r"], + [18921, 0, "i"], + [18922, 0, "g"], + [18923, 0, "h"], + [18924, 0, "t"], + [18925, 0, "0"], + [18926, 0, ")"], + [18927, 0, " "], + [18928, 0, "a"], + [18929, 0, "t"], + [18930, 0, " "], + [18931, 0, "("], + [18932, 0, "8"], + [18933, 0, ","], + [18934, 0, "4"], + [18935, 0, ")"], + [18936, 0, " "], + [18937, 0, "{"], + [18938, 0, "["], + [18858, 0, " "], + [18939, 1], + [18939, 0, "\\"], + [18940, 0, "{"], + [18941, 0, "`"], + [18942, 0, "`"], + [18943, 0, "c"], + [18944, 0, "o"], + [18945, 0, "l"], + [18946, 0, "o"], + [18947, 0, "r"], + [18948, 0, "s"], + [18949, 0, "'"], + [18950, 0, "'"], + [18951, 0, ":"], + [18952, 0, " "], + [18953, 0, "\\"], + [18954, 0, "{"], + [18955, 0, "`"], + [18956, 0, "`"], + [18957, 0, "b"], + [18958, 0, "l"], + [18959, 0, "u"], + [18960, 0, "e"], + [18961, 0, "'"], + [18962, 0, "'"], + [18963, 0, ":"], + [18964, 0, " "], + [18965, 0, "`"], + [18966, 0, "`"], + [18967, 0, "\\"], + [18968, 0, "#"], + [18969, 0, "0"], + [18970, 0, "0"], + [18971, 0, "0"], + [18972, 0, "0"], + [18973, 0, "f"], + [18974, 0, "f"], + [18975, 0, "'"], + [18976, 0, "'"], + [18977, 0, "\\"], + [18978, 0, "}"], + [18979, 0, "\\"], + [18980, 0, "}"], + [18981, 0, "}"], + [18982, 0, ";"], + [19535, 1], + [19534, 1], + [19533, 1], + [19532, 1], + [19531, 1], + [19531, 0, "l"], + [19532, 0, "e"], + [19533, 0, "f"], + [19534, 0, "t"], + [19535, 0, "0"], + [19646, 1], + [19645, 1], + [19644, 1], + [19643, 1], + [19642, 1], + [19642, 0, "r"], + [19643, 0, "i"], + [19644, 0, "g"], + [19645, 0, "h"], + [19646, 0, "t"], + [19647, 0, "0"], + [19649, 1], + [19871, 1], + [19871, 1], + [19871, 1], + [19871, 1], + [19871, 1], + [19921, 1], + [19921, 1], + [19921, 1], + [19921, 1], + [19921, 1], + [19944, 0, "d"], + [19945, 0, "a"], + [19946, 0, "s"], + [19947, 0, "h"], + [19948, 0, "e"], + [19949, 0, "d"], + [19950, 0, ","], + [19951, 0, "b"], + [19952, 0, "l"], + [19953, 0, "u"], + [19954, 0, "e"], + [19955, 0, ","], + [19956, 0, "-"], + [19956, 1], + [19904, 1], + [19903, 1], + [19902, 1], + [19901, 1], + [19900, 1], + [19899, 1], + [19898, 1], + [19897, 1], + [19896, 1], + [19895, 1], + [19894, 1], + [19893, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19843, 1], + [19971, 0, "d"], + [19972, 0, "a"], + [19973, 0, "s"], + [19974, 0, "h"], + [19975, 0, "e"], + [19976, 0, "d"], + [19977, 0, ","], + [19978, 0, "b"], + [19979, 0, "l"], + [19980, 0, "u"], + [19981, 0, "e"], + [19982, 0, ","], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [19761, 1], + [18867, 0, " "], + [18868, 0, "["], + [18869, 0, "r"], + [18870, 0, "e"], + [18871, 0, "c"], + [18872, 0, "t"], + [18873, 0, "a"], + [18874, 0, "n"], + [18875, 0, "g"], + [18876, 0, "l"], + [18877, 0, "e"], + [18878, 0, ","], + [18879, 0, "d"], + [18880, 0, "r"], + [18881, 0, "a"], + [18882, 0, "w"], + [18883, 0, "]"], + [18954, 0, " "], + [18955, 0, "["], + [18956, 0, "r"], + [18957, 0, "e"], + [18958, 0, "c"], + [18959, 0, "t"], + [18960, 0, "a"], + [18961, 0, "n"], + [18962, 0, "g"], + [18963, 0, "l"], + [18964, 0, "e"], + [18965, 0, ","], + [18966, 0, "d"], + [18967, 0, "r"], + [18968, 0, "a"], + [18969, 0, "w"], + [18970, 0, "]"], + [19049, 0, " "], + [19050, 0, "["], + [19051, 0, "r"], + [19052, 0, "e"], + [19053, 0, "c"], + [19054, 0, "t"], + [19055, 0, "a"], + [19056, 0, "n"], + [19057, 0, "g"], + [19058, 0, "l"], + [19059, 0, "e"], + [19060, 0, ","], + [19061, 0, "d"], + [19062, 0, "r"], + [19063, 0, "a"], + [19064, 0, "w"], + [19065, 0, "]"], + [19193, 0, " "], + [19194, 0, "["], + [19195, 0, "r"], + [19196, 0, "e"], + [19197, 0, "c"], + [19198, 0, "t"], + [19199, 0, "a"], + [19200, 0, "n"], + [19201, 0, "g"], + [19202, 0, "l"], + [19203, 0, "e"], + [19204, 0, ","], + [19205, 0, "d"], + [19206, 0, "r"], + [19207, 0, "a"], + [19208, 0, "w"], + [19209, 0, "]"], + [19260, 0, " "], + [19261, 0, "["], + [19262, 0, "r"], + [19263, 0, "e"], + [19264, 0, "c"], + [19265, 0, "t"], + [19266, 0, "a"], + [19267, 0, "n"], + [19268, 0, "g"], + [19269, 0, "l"], + [19270, 0, "e"], + [19271, 0, ","], + [19272, 0, "d"], + [19273, 0, "r"], + [19274, 0, "a"], + [19275, 0, "w"], + [19276, 0, "]"], + [19356, 0, " "], + [19357, 0, "["], + [19358, 0, "r"], + [19359, 0, "e"], + [19360, 0, "c"], + [19361, 0, "t"], + [19362, 0, "a"], + [19363, 0, "n"], + [19364, 0, "g"], + [19365, 0, "l"], + [19366, 0, "e"], + [19367, 0, ","], + [19368, 0, "d"], + [19369, 0, "r"], + [19370, 0, "a"], + [19371, 0, "w"], + [19372, 0, "]"], + [19510, 0, " "], + [19511, 0, "["], + [19512, 0, "r"], + [19513, 0, "e"], + [19514, 0, "c"], + [19515, 0, "t"], + [19516, 0, "a"], + [19517, 0, "n"], + [19518, 0, "g"], + [19519, 0, "l"], + [19520, 0, "e"], + [19521, 0, ","], + [19522, 0, "d"], + [19523, 0, "r"], + [19524, 0, "a"], + [19525, 0, "w"], + [19526, 0, "]"], + [20047, 0, "."], + [20048, 0, "s"], + [20049, 0, "o"], + [20050, 0, "u"], + [20051, 0, "t"], + [20052, 0, "h"], + [20053, 0, " "], + [20054, 0, "e"], + [20055, 0, "a"], + [20056, 0, "s"], + [20057, 0, "t"], + [20110, 0, "."], + [20111, 0, "s"], + [20112, 0, "o"], + [20113, 0, "u"], + [20114, 0, "t"], + [20115, 0, "h"], + [20116, 0, " "], + [20117, 0, "w"], + [20118, 0, "e"], + [20119, 0, "s"], + [20120, 0, "t"], + [20071, 0, "."], + [20072, 0, "n"], + [20073, 0, "o"], + [20074, 0, "r"], + [20075, 0, "t"], + [20076, 0, "h"], + [20077, 0, " "], + [20078, 0, "w"], + [20079, 0, "e"], + [20080, 0, "s"], + [20081, 0, "t"], + [20143, 0, "."], + [20144, 0, "n"], + [20145, 0, "o"], + [20146, 0, "r"], + [20147, 0, "t"], + [20148, 0, "h"], + [20149, 0, " "], + [20150, 0, "e"], + [20151, 0, "a"], + [20152, 0, "s"], + [20153, 0, "t"], + [18950, 1], + [18950, 0, "6"], + [19189, 1], + [19189, 0, "6"], + [19254, 1], + [19254, 0, "6"], + [19506, 1], + [19506, 0, "6"], + [18843, 0, "\n"], + [18844, 0, "\\"], + [18845, 0, "p"], + [18846, 0, "a"], + [18847, 0, "t"], + [18848, 0, "h"], + [18849, 0, " "], + [18850, 0, "["], + [18851, 0, "d"], + [18852, 0, "r"], + [18853, 0, "a"], + [18854, 0, "w"], + [18855, 0, ","], + [18856, 0, "d"], + [18857, 0, "o"], + [18858, 0, "t"], + [18859, 0, "t"], + [18860, 0, "e"], + [18861, 0, "d"], + [18862, 0, "]"], + [18863, 0, " "], + [18864, 0, "("], + [18865, 0, "3"], + [18866, 0, ","], + [18867, 0, "-"], + [18868, 0, "0"], + [18869, 0, "."], + [18870, 0, "5"], + [18871, 0, ")"], + [18872, 0, " "], + [18873, 0, "-"], + [18874, 0, "-"], + [18875, 0, " "], + [18876, 0, "("], + [18877, 0, "3"], + [18878, 0, ","], + [18879, 0, "5"], + [18880, 0, ")"], + [18881, 0, ";"], + [19297, 1], + [19296, 1], + [19295, 1], + [19295, 0, "2"], + [19230, 1], + [19230, 0, "4"], + [18991, 1], + [18991, 0, "6"], + [18904, 1], + [18904, 0, "6"], + [19086, 1], + [19086, 0, "3"], + [18842, 0, ","], + [18843, 0, "s"], + [18844, 0, "c"], + [18845, 0, "a"], + [18846, 0, "l"], + [18847, 0, "e"], + [18848, 0, "="], + [18849, 0, "0"], + [18850, 0, "."], + [18851, 0, "8"], + [16705, 0, ","], + [16706, 0, "s"], + [16707, 0, "c"], + [16708, 0, "a"], + [16709, 0, "l"], + [16710, 0, "e"], + [16711, 0, "="], + [16712, 0, "0"], + [16713, 0, "."], + [16714, 0, "8"], + [16816, 1], + [16816, 0, "8"], + [16919, 1], + [16919, 0, "8"], + [17045, 1], + [17045, 0, "8"], + [17182, 1], + [17182, 0, "8"], + [17256, 1], + [17256, 0, "4"], + [18885, 1], + [18885, 0, "4"], + [18897, 1], + [18897, 0, "4"], + [18890, 1], + [18889, 1], + [18888, 1], + [18888, 0, "1"], + [18897, 1], + [18897, 0, "6"], + [18898, 0, "."], + [18899, 0, "5"], + [19009, 1], + [19009, 0, "8"], + [19248, 1], + [19248, 0, "8"], + [19313, 1], + [19313, 0, "8"], + [19563, 1], + [19563, 0, "8"], + [20865, 0, ","], + [20866, 0, "s"], + [20867, 0, "c"], + [20868, 0, "a"], + [20869, 0, "l"], + [20870, 0, "e"], + [20871, 0, "="], + [20872, 0, "0"], + [20873, 0, "."], + [20874, 0, "8"], + [20909, 1], + [20908, 1], + [20907, 1], + [20906, 1], + [20905, 1], + [20904, 1], + [20904, 0, "\\"], + [20906, 0, "\\"], + [20908, 1], + [20888, 1], + [20887, 1], + [20886, 1], + [20885, 1], + [20884, 1], + [20884, 0, "l"], + [20885, 0, "e"], + [20886, 0, "f"], + [20887, 0, "t"], + [20888, 0, "0"], + [20910, 0, "\n"], + [20911, 0, "\\"], + [20912, 0, "n"], + [20913, 0, "o"], + [20914, 0, "d"], + [20915, 0, "e"], + [20916, 0, " "], + [20917, 0, "("], + [20918, 0, "r"], + [20919, 0, "i"], + [20920, 0, "g"], + [20921, 0, "h"], + [20922, 0, "t"], + [20923, 0, "0"], + [20924, 0, ")"], + [20925, 0, " "], + [20926, 0, "a"], + [20927, 0, "t"], + [20928, 0, " "], + [20929, 0, "("], + [20930, 0, "8"], + [20931, 0, ","], + [20932, 0, "6"], + [20933, 0, "."], + [20934, 0, "0"], + [20935, 0, ")"], + [20936, 0, " "], + [20937, 0, "{"], + [20938, 0, "\\"], + [20939, 0, "{"], + [20940, 0, "\\"], + [20941, 0, "}"], + [20942, 0, "}"], + [20943, 0, ";"], + [20896, 1], + [20896, 0, "0"], + [21435, 1], + [21434, 1], + [21433, 1], + [21432, 1], + [21431, 1], + [21431, 0, "l"], + [21432, 0, "e"], + [21433, 0, "f"], + [21434, 0, "t"], + [21435, 0, "0"], + [21538, 1], + [21537, 1], + [21536, 1], + [21535, 1], + [21534, 1], + [21534, 0, "r"], + [21535, 0, "i"], + [21536, 0, "g"], + [21537, 0, "h"], + [21538, 0, "t"], + [21539, 0, "0"], + [21541, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19840, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19728, 1], + [19729, 0, " "], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17352, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17428, 1], + [17352, 0, ","], + [17353, 0, " "], + [17354, 0, "i"], + [17355, 0, "n"], + [17356, 0, "n"], + [17357, 0, "e"], + [17358, 0, "r"], + [17359, 0, " "], + [17360, 0, "s"], + [17361, 0, "e"], + [17362, 0, "p"], + [17363, 0, "="], + [17364, 0, "8"], + [17365, 0, "p"], + [17366, 0, "t"], + [17353, 1], + [17442, 0, ","], + [17443, 0, "i"], + [17444, 0, "n"], + [17445, 0, "n"], + [17446, 0, "e"], + [17447, 0, "r"], + [17448, 0, " "], + [17449, 0, "s"], + [17450, 0, "e"], + [17451, 0, "p"], + [17452, 0, "="], + [17453, 0, "8"], + [17454, 0, "p"], + [17455, 0, "t"], + [20941, 1], + [20941, 1], + [20941, 1], + [20941, 1], + [20941, 1], + [20942, 1], + [20942, 0, "`"], + [20943, 0, "`"], + [20947, 1], + [20947, 0, "'"], + [20948, 0, "'"], + [20950, 0, " "], + [20953, 0, "\\"], + [20955, 1], + [21000, 0, "\\"], + [20998, 0, " "], + [20996, 1], + [20996, 0, "'"], + [20997, 0, "'"], + [20992, 1], + [20992, 0, "`"], + [20993, 0, "`"], + [20990, 1], + [20989, 1], + [20988, 1], + [20987, 1], + [20986, 1], + [21032, 1], + [21032, 1], + [21032, 1], + [21032, 1], + [21032, 1], + [21033, 1], + [21033, 0, "`"], + [21034, 0, "`"], + [21081, 1], + [21081, 1], + [21081, 1], + [21081, 1], + [21081, 1], + [21135, 1], + [21135, 1], + [21135, 1], + [21135, 1], + [21135, 1], + [21183, 1], + [21183, 1], + [21183, 1], + [21183, 1], + [21183, 1], + [21239, 1], + [21239, 1], + [21239, 1], + [21239, 1], + [21239, 1], + [21308, 1], + [21308, 1], + [21308, 1], + [21308, 1], + [21308, 1], + [21082, 1], + [21135, 1], + [21182, 1], + [21237, 1], + [21305, 1], + [21082, 0, "`"], + [21083, 0, "`"], + [21137, 0, "`"], + [21138, 0, "`"], + [21186, 0, "`"], + [21187, 0, "`"], + [21243, 0, "`"], + [21244, 0, "`"], + [21313, 0, "`"], + [21314, 0, "`"], + [21038, 1], + [21038, 0, "'"], + [21039, 0, "'"], + [21088, 1], + [21088, 0, "'"], + [21089, 0, "'"], + [21144, 1], + [21144, 0, "'"], + [21145, 0, "'"], + [21194, 1], + [21194, 0, "'"], + [21195, 0, "'"], + [21252, 1], + [21252, 0, "'"], + [21253, 0, "'"], + [21323, 1], + [21323, 0, "'"], + [21324, 0, "'"], + [21041, 0, " "], + [21092, 0, " "], + [21149, 0, " "], + [21200, 0, " "], + [21259, 0, " "], + [21331, 0, " "], + [21043, 1], + [21043, 0, "`"], + [21044, 0, "`"], + [21095, 1], + [21095, 0, "`"], + [21096, 0, "`"], + [21153, 1], + [21153, 0, "`"], + [21154, 0, "`"], + [21205, 1], + [21205, 0, "`"], + [21206, 0, "`"], + [21265, 1], + [21265, 0, "`"], + [21266, 0, "`"], + [21338, 1], + [21338, 0, "`"], + [21339, 0, "`"], + [21049, 1], + [21049, 0, "'"], + [21050, 0, "'"], + [21102, 1], + [21102, 0, "'"], + [21103, 0, "'"], + [21105, 0, " "], + [21106, 1], + [21106, 0, "`"], + [21107, 0, "`"], + [21111, 1], + [21111, 0, "'"], + [21112, 0, "'"], + [21164, 1], + [21164, 0, "'"], + [21165, 0, "'"], + [21217, 1], + [21217, 0, "'"], + [21218, 0, "'"], + [21220, 0, " "], + [21221, 1], + [21221, 0, "`"], + [21222, 0, "`"], + [21228, 1], + [21228, 0, "'"], + [21229, 0, "'"], + [21281, 1], + [21281, 0, "'"], + [21282, 0, "'"], + [21284, 0, " "], + [21285, 1], + [21285, 0, "`"], + [21286, 0, "`"], + [21290, 1], + [21290, 0, "'"], + [21291, 0, "'"], + [21293, 0, " "], + [21294, 1], + [21294, 0, "`"], + [21295, 0, "`"], + [21300, 1], + [21300, 0, "'"], + [21301, 0, "'"], + [21303, 0, " "], + [21304, 1], + [21304, 0, "`"], + [21305, 0, "`"], + [21311, 1], + [21311, 0, "'"], + [21312, 0, "'"], + [21364, 1], + [21364, 0, "'"], + [21365, 0, "'"], + [21367, 0, " "], + [21368, 1], + [21368, 0, "`"], + [21369, 0, "`"], + [21373, 1], + [21373, 0, "'"], + [21374, 0, "'"], + [21375, 0, " "], + [21375, 1], + [21376, 0, " "], + [21377, 1], + [21377, 0, "`"], + [21378, 0, "`"], + [21383, 1], + [21383, 0, "'"], + [21384, 0, "'"], + [21386, 0, " "], + [21387, 1], + [21387, 0, "`"], + [21388, 0, "`"], + [21394, 1], + [21394, 0, "'"], + [21395, 0, "'"], + [21397, 0, "\\"], + [21314, 0, "\\"], + [21316, 1], + [21399, 1], + [21232, 1], + [21231, 0, "\\"], + [21168, 1], + [21167, 0, "\\"], + [21115, 1], + [21114, 0, "\\"], + [21053, 1], + [21052, 0, "\\"], + [21000, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21440, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21527, 1], + [21442, 0, " "], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21444, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21517, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21591, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21680, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21770, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21845, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21909, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21947, 1], + [21970, 0, "d"], + [21971, 0, "a"], + [21972, 0, "s"], + [21973, 0, "h"], + [21974, 0, "e"], + [21975, 0, "d"], + [21976, 0, ","], + [21977, 0, "b"], + [21978, 0, "l"], + [21979, 0, "u"], + [21980, 0, "e"], + [21981, 0, ","], + [22021, 0, "d"], + [22022, 0, "a"], + [22023, 0, "s"], + [22024, 0, "h"], + [22025, 0, "e"], + [22026, 0, "d"], + [22027, 0, ","], + [22028, 0, "b"], + [22029, 0, "l"], + [22030, 0, "u"], + [22031, 0, "e"], + [22032, 0, ","], + [20870, 0, " "], + [20871, 0, "["], + [20872, 0, "r"], + [20873, 0, "e"], + [20874, 0, "c"], + [20875, 0, "t"], + [20876, 0, "a"], + [20877, 0, "n"], + [20878, 0, "g"], + [20879, 0, "l"], + [20880, 0, "e"], + [20881, 0, ","], + [20882, 0, "d"], + [20883, 0, "r"], + [20884, 0, "a"], + [20885, 0, "w"], + [20886, 0, "]"], + [20921, 0, " "], + [20922, 0, "["], + [20923, 0, "r"], + [20924, 0, "e"], + [20925, 0, "c"], + [20926, 0, "t"], + [20927, 0, "a"], + [20928, 0, "n"], + [20929, 0, "g"], + [20930, 0, "l"], + [20931, 0, "e"], + [20932, 0, ","], + [20933, 0, "d"], + [20934, 0, "r"], + [20935, 0, "a"], + [20936, 0, "w"], + [20937, 0, "]"], + [20972, 0, " "], + [20973, 0, "["], + [20974, 0, "r"], + [20975, 0, "e"], + [20976, 0, "c"], + [20977, 0, "t"], + [20978, 0, "a"], + [20979, 0, "n"], + [20980, 0, "g"], + [20981, 0, "l"], + [20982, 0, "e"], + [20983, 0, ","], + [20984, 0, "d"], + [20985, 0, "r"], + [20986, 0, "a"], + [20987, 0, "w"], + [20988, 0, "]"], + [21034, 0, " "], + [21035, 0, "["], + [21036, 0, "r"], + [21037, 0, "e"], + [21038, 0, "c"], + [21039, 0, "t"], + [21040, 0, "a"], + [21041, 0, "n"], + [21042, 0, "g"], + [21043, 0, "l"], + [21044, 0, "e"], + [21045, 0, ","], + [21046, 0, "d"], + [21047, 0, "r"], + [21048, 0, "a"], + [21049, 0, "w"], + [21050, 0, "]"], + [21096, 0, " "], + [21097, 0, "["], + [21098, 0, "r"], + [21099, 0, "e"], + [21100, 0, "c"], + [21101, 0, "t"], + [21102, 0, "a"], + [21103, 0, "n"], + [21104, 0, "g"], + [21105, 0, "l"], + [21106, 0, "e"], + [21107, 0, ","], + [21108, 0, "d"], + [21109, 0, "r"], + [21110, 0, "a"], + [21111, 0, "w"], + [21112, 0, "]"], + [21166, 0, " "], + [21167, 0, "["], + [21168, 0, "r"], + [21169, 0, "e"], + [21170, 0, "c"], + [21171, 0, "t"], + [21172, 0, "a"], + [21173, 0, "n"], + [21174, 0, "g"], + [21175, 0, "l"], + [21176, 0, "e"], + [21177, 0, ","], + [21178, 0, "d"], + [21179, 0, "r"], + [21180, 0, "a"], + [21181, 0, "w"], + [21182, 0, "]"], + [21246, 0, "["], + [21247, 0, "r"], + [21248, 0, "e"], + [21249, 0, "c"], + [21250, 0, "t"], + [21251, 0, "a"], + [21252, 0, "n"], + [21253, 0, "g"], + [21254, 0, "l"], + [21255, 0, "e"], + [21256, 0, ","], + [21257, 0, "d"], + [21258, 0, "r"], + [21259, 0, "a"], + [21260, 0, "w"], + [21261, 0, "]"], + [21262, 0, " "], + [21315, 0, " "], + [21316, 0, "["], + [21317, 0, "r"], + [21318, 0, "e"], + [21319, 0, "c"], + [21320, 0, "t"], + [21321, 0, "n"], + [21322, 0, "a"], + [21322, 1], + [21321, 1], + [21321, 0, "a"], + [21322, 0, "n"], + [21323, 0, "g"], + [21324, 0, "l"], + [21325, 0, "e"], + [21326, 0, ","], + [21327, 0, "d"], + [21328, 0, "r"], + [21329, 0, "a"], + [21330, 0, "w"], + [21331, 0, "]"], + [21397, 0, " "], + [21397, 1], + [21397, 0, "["], + [21398, 0, "r"], + [21399, 0, "e"], + [21400, 0, "c"], + [21401, 0, "t"], + [21402, 0, "a"], + [21403, 0, "n"], + [21404, 0, "g"], + [21405, 0, "l"], + [21406, 0, "e"], + [21407, 0, ","], + [21408, 0, "d"], + [21409, 0, "r"], + [21410, 0, "a"], + [21411, 0, "w"], + [21412, 0, "]"], + [21413, 0, " "], + [21496, 0, " "], + [21497, 0, "["], + [21498, 0, "r"], + [21499, 0, "e"], + [21500, 0, "c"], + [21501, 0, "t"], + [21502, 0, "a"], + [21503, 0, "n"], + [21504, 0, "g"], + [21505, 0, "l"], + [21506, 0, "e"], + [21507, 0, ","], + [21508, 0, "d"], + [21509, 0, "r"], + [21510, 0, "a"], + [21511, 0, "w"], + [21512, 0, "]"], + [21494, 1], + [21493, 1], + [21393, 1], + [21393, 1], + [21311, 1], + [21311, 1], + [21311, 1], + [21311, 0, "2"], + [21241, 1], + [21241, 1], + [21241, 1], + [21241, 0, "4"], + [21162, 1], + [21162, 1], + [21162, 1], + [21162, 0, "2"], + [21092, 1], + [21092, 1], + [21092, 1], + [21092, 0, "4"], + [21030, 1], + [21030, 1], + [21030, 1], + [21030, 0, "6"], + [20968, 1], + [20968, 1], + [20968, 1], + [20968, 0, "6"], + [20917, 1], + [20917, 1], + [20917, 1], + [20917, 0, "8"], + [20866, 1], + [20866, 1], + [20866, 1], + [20866, 0, "8"], + [20913, 1], + [20913, 0, "1"], + [20914, 0, "0"], + [20864, 0, " "], + [20964, 0, " "], + [21025, 1], + [21025, 0, "2"], + [21026, 0, "0"], + [21026, 1], + [21025, 1], + [21025, 0, "1"], + [21026, 0, "0"], + [21086, 0, " "], + [21086, 1], + [21085, 0, " "], + [20964, 1], + [20963, 0, " "], + [20864, 1], + [20863, 0, " "], + [21154, 0, " "], + [21233, 1], + [21233, 0, "1"], + [21234, 0, "0"], + [21302, 1], + [21302, 0, "2"], + [21303, 0, "0"], + [21303, 1], + [21302, 1], + [21302, 0, "1"], + [21303, 0, "0"], + [21381, 0, " "], + [21481, 1], + [21481, 0, "1"], + [21482, 0, "0"], + [22152, 0, "."], + [22153, 0, "s"], + [22154, 0, "o"], + [22155, 0, "u"], + [22156, 0, "t"], + [22157, 0, "h"], + [22158, 0, " "], + [22159, 0, "e"], + [22160, 0, "a"], + [22161, 0, "s"], + [22162, 0, "t"], + [22176, 0, "."], + [22177, 0, "s"], + [22178, 0, "o"], + [22179, 0, "u"], + [22180, 0, "t"], + [22181, 0, "h"], + [22182, 0, " "], + [22183, 0, "w"], + [22184, 0, "e"], + [22185, 0, "s"], + [22186, 0, "t"], + [22226, 0, "."], + [22227, 0, "n"], + [22228, 0, "o"], + [22229, 0, "r"], + [22230, 0, "t"], + [22231, 0, "h"], + [22232, 0, " "], + [22233, 0, "w"], + [22234, 0, "e"], + [22235, 0, "s"], + [22236, 0, "t"], + [22236, 1], + [22235, 1], + [22234, 1], + [22233, 1], + [22233, 0, "e"], + [22234, 0, "a"], + [22235, 0, "s"], + [22236, 0, "t"], + [22248, 0, "."], + [22249, 0, "n"], + [22250, 0, "o"], + [22181, 1], + [22180, 1], + [22179, 1], + [22178, 1], + [22177, 1], + [22177, 0, "n"], + [22178, 0, "o"], + [22179, 0, "r"], + [22180, 0, "t"], + [22181, 0, "h"], + [22231, 1], + [22230, 1], + [22229, 1], + [22228, 1], + [22227, 1], + [22227, 0, "s"], + [22228, 0, "o"], + [22229, 0, "u"], + [22230, 0, "t"], + [22231, 0, "h"], + [22232, 0, " "], + [22233, 0, "w"], + [22234, 0, "e"], + [22235, 0, "s"], + [22236, 0, "t"], + [22237, 1], + [22237, 1], + [22237, 1], + [22237, 1], + [22237, 1], + [22251, 0, "r"], + [22252, 0, "t"], + [22253, 0, "h"], + [22254, 0, " "], + [22255, 0, "e"], + [22256, 0, "a"], + [22257, 0, "s"], + [22258, 0, "t"], + [20844, 0, "\n"], + [20845, 0, "\\"], + [20846, 0, "p"], + [20847, 0, "a"], + [20848, 0, "t"], + [20849, 0, "h"], + [20850, 0, " "], + [20851, 0, "["], + [20852, 0, "d"], + [20853, 0, "r"], + [20854, 0, "a"], + [20855, 0, "w"], + [20856, 0, ","], + [20857, 0, "d"], + [20858, 0, "o"], + [20859, 0, "t"], + [20860, 0, "t"], + [20861, 0, "e"], + [20862, 0, "d"], + [20863, 0, "]"], + [20864, 0, " "], + [20865, 0, "("], + [20866, 0, "5"], + [20867, 0, ","], + [20868, 0, "-"], + [20869, 0, "0"], + [20870, 0, "."], + [20871, 0, "5"], + [20872, 0, ")"], + [20873, 0, " "], + [20874, 0, "-"], + [20875, 0, "-"], + [20876, 0, " "], + [20877, 0, "("], + [20878, 0, "5"], + [20879, 0, ","], + [20880, 0, "8"], + [20881, 0, "."], + [20882, 0, "5"], + [20883, 0, ")"], + [20884, 0, ";"], + [22203, 1], + [22202, 1], + [22201, 1], + [22200, 1], + [22199, 1], + [22268, 1], + [22268, 1], + [22268, 1], + [22268, 1], + [22268, 1], + [22204, 0, " "], + [22205, 0, "["], + [22206, 0, "o"], + [22207, 0, "u"], + [22208, 0, "t"], + [22209, 0, "="], + [22210, 0, "1"], + [22211, 0, "8"], + [22212, 0, "0"], + [22213, 0, "]"], + [22282, 0, " "], + [22283, 0, "["], + [22284, 0, "o"], + [22285, 0, "u"], + [22286, 0, "t"], + [22287, 0, "="], + [22288, 0, "1"], + [22289, 0, "8"], + [22290, 0, "0"], + [22291, 0, "]"], + [22211, 1], + [22210, 1], + [22210, 0, "9"], + [22288, 1], + [22287, 1], + [22287, 0, "9"], + [22287, 1], + [22287, 0, "2"], + [22288, 0, "7"], + [22210, 1], + [22210, 0, "2"], + [22211, 0, "7"], + [22213, 0, ","], + [22214, 0, "i"], + [22215, 0, "n"], + [22216, 0, "="], + [22217, 0, "4"], + [22218, 0, "5"], + [22297, 0, ","], + [22298, 0, "i"], + [22299, 0, "n"], + [22300, 0, "="], + [22301, 0, "1"], + [22302, 0, "3"], + [22303, 0, "5"], + [22218, 1], + [22217, 1], + [22217, 0, "1"], + [22218, 0, "3"], + [22219, 0, "5"], + [22304, 1], + [22303, 1], + [22302, 1], + [22302, 0, "4"], + [22303, 0, "5"], + [20082, 1], + [20081, 1], + [20080, 1], + [20079, 1], + [20078, 1], + [20147, 1], + [20147, 1], + [20147, 1], + [20147, 1], + [20147, 1], + [20083, 0, " "], + [20084, 0, "["], + [20085, 0, "o"], + [20086, 0, "u"], + [20087, 0, "t"], + [20088, 0, "="], + [20089, 0, "2"], + [20090, 0, "7"], + [20091, 0, "0"], + [20092, 0, ","], + [20093, 0, "i"], + [20094, 0, "n"], + [20095, 0, "="], + [20096, 0, "1"], + [20097, 0, "3"], + [20098, 0, "5"], + [20099, 0, "]"], + [20168, 0, " "], + [20169, 0, "["], + [20170, 0, "o"], + [20171, 0, "u"], + [20172, 0, "t"], + [20172, 1], + [20172, 0, "="], + [20172, 1], + [20172, 0, "t"], + [20173, 0, "="], + [20174, 0, "2"], + [20175, 0, "7"], + [20176, 0, "8"], + [20176, 1], + [20176, 0, "0"], + [20177, 0, ","], + [20178, 0, "i"], + [20179, 0, "n"], + [20180, 0, "="], + [20181, 0, "4"], + [20182, 0, "5"], + [20183, 0, "]"], + [20184, 0, " "], + [22330, 0, " "], + [19315, 1], + [19315, 0, "3"], + [19250, 1], + [19250, 0, "5"], + [19106, 1], + [19106, 0, "4"], + [19011, 1], + [19011, 0, "7"], + [18924, 1], + [18924, 0, "7"], + [18897, 1], + [18897, 0, "7"], + [17579, 1], + [17578, 1], + [17578, 0, " "], + [17579, 0, "t"], + [17580, 0, "o"], + [17581, 0, " "], + [17581, 1], + [17653, 1], + [17652, 1], + [17652, 0, "t"], + [17653, 0, "o"], + [17581, 0, " "], + [17582, 0, "["], + [17583, 0, "o"], + [17584, 0, "u"], + [17585, 0, "t"], + [17586, 0, "="], + [17587, 0, "2"], + [17588, 0, "8"], + [17589, 0, "0"], + [17589, 1], + [17588, 1], + [17587, 1], + [17587, 0, "1"], + [17588, 0, "8"], + [17589, 0, "0"], + [17590, 0, "]"], + [17575, 1], + [17574, 1], + [17573, 1], + [17572, 1], + [17571, 1], + [17650, 1], + [17650, 1], + [17650, 1], + [17650, 1], + [17650, 1], + [17654, 0, " "], + [17655, 0, "["], + [17656, 0, "o"], + [17657, 0, "u"], + [17658, 0, "t"], + [17659, 0, "="], + [17659, 1], + [17659, 0, "="], + [17660, 0, "1"], + [17661, 0, "8"], + [17662, 0, "0"], + [17663, 0, "]"], + [17585, 0, ","], + [17586, 0, "i"], + [17587, 0, "n"], + [17588, 0, "="], + [17589, 0, "1"], + [17590, 0, "3"], + [17591, 0, "5"], + [17670, 0, ","], + [17671, 0, "i"], + [17672, 0, "n"], + [17673, 0, "="], + [17674, 0, "4"], + [17675, 0, "5"], + [17677, 0, " "], + [17260, 1], + [17260, 0, "5"], + [17582, 1], + [17582, 1], + [17582, 0, "2"], + [17583, 0, "7"], + [17668, 1], + [17667, 1], + [17667, 0, "2"], + [17668, 0, "7"], + [17110, 1], + [17110, 0, "0"], + [17111, 0, "."], + [17112, 0, "5"], + [17186, 1], + [17186, 0, "0"], + [17187, 0, "."], + [17188, 0, "5"], + [16738, 1], + [16738, 0, "4"], + [16741, 1], + [16741, 1], + [16747, 1], + [16747, 0, "4"], + [17262, 1], + [17261, 1], + [17110, 1], + [17109, 1], + [17183, 1], + [17183, 1], + [16740, 0, "-"], + [16742, 0, "."], + [16743, 0, "5"], + [17259, 1], + [17259, 0, "1"], + [17260, 0, "."], + [17261, 0, "8"], + [19714, 0, "\n"], + [19715, 0, "\\"], + [19716, 0, "n"], + [19717, 0, "o"], + [19718, 0, "d"], + [19719, 0, "e"], + [19720, 0, " "], + [19721, 0, "("], + [19722, 0, "c"], + [19723, 0, "o"], + [19724, 0, "m"], + [19725, 0, "m"], + [19726, 0, "s"], + [19727, 0, ")"], + [19728, 0, " "], + [19729, 0, " "], + [19730, 0, "a"], + [19731, 0, "t"], + [19732, 0, " "], + [19733, 0, "("], + [19734, 0, "4"], + [19735, 0, ","], + [19736, 0, "1"], + [19737, 0, "."], + [19738, 0, "8"], + [19739, 0, ")"], + [19740, 0, " "], + [19741, 0, "["], + [19742, 0, "t"], + [19743, 0, "e"], + [19744, 0, "x"], + [19745, 0, "t"], + [19746, 0, "="], + [19747, 0, "b"], + [19748, 0, "l"], + [19749, 0, "u"], + [19750, 0, "e"], + [19751, 0, "]"], + [19752, 0, " "], + [19753, 0, "{"], + [19754, 0, "\\"], + [19755, 0, "f"], + [19756, 0, "o"], + [19757, 0, "o"], + [19758, 0, "t"], + [19759, 0, "n"], + [19760, 0, "o"], + [19761, 0, "t"], + [19762, 0, "e"], + [19763, 0, "s"], + [19764, 0, "i"], + [19765, 0, "z"], + [19766, 0, "e"], + [19767, 0, " "], + [19768, 0, "n"], + [19769, 0, "e"], + [19770, 0, "t"], + [19771, 0, "w"], + [19772, 0, "o"], + [19773, 0, "r"], + [19774, 0, "k"], + [19775, 0, " "], + [19776, 0, "c"], + [19777, 0, "o"], + [19778, 0, "m"], + [19779, 0, "m"], + [19780, 0, "u"], + [19781, 0, "n"], + [19782, 0, "i"], + [19783, 0, "c"], + [19784, 0, "a"], + [19785, 0, "t"], + [19786, 0, "i"], + [19787, 0, "o"], + [19788, 0, "n"], + [19789, 0, "}"], + [19790, 0, ";"], + [19729, 1], + [19735, 1], + [19735, 1], + [19735, 1], + [19735, 0, "2"], + [19736, 0, "."], + [19737, 0, "5"], + [19737, 1], + [19736, 1], + [19736, 0, "."], + [19737, 0, "1"], + [21727, 0, "\n"], + [21728, 0, "\\"], + [21729, 0, "n"], + [21730, 0, "o"], + [21731, 0, "d"], + [21732, 0, "e"], + [21733, 0, " "], + [21734, 0, "("], + [21735, 0, "c"], + [21736, 0, "o"], + [21737, 0, "m"], + [21738, 0, "m"], + [21739, 0, "s"], + [21740, 0, ")"], + [21741, 0, " "], + [21742, 0, "a"], + [21743, 0, "t"], + [21744, 0, " "], + [21745, 0, "("], + [21745, 1], + [21745, 0, " "], + [21742, 0, " "], + [21746, 1], + [21746, 0, " "], + [21747, 0, "("], + [21748, 0, "5"], + [21749, 0, ","], + [21750, 0, "1"], + [21751, 0, "."], + [21752, 0, "8"], + [21753, 0, ")"], + [21754, 0, " "], + [21755, 0, "["], + [21756, 0, "t"], + [21757, 0, "e"], + [21758, 0, "x"], + [21759, 0, "t"], + [21760, 0, "="], + [21761, 0, "b"], + [21762, 0, "l"], + [21763, 0, "u"], + [21764, 0, "e"], + [21765, 0, "]"], + [21766, 0, " "], + [21767, 0, "{"], + [21768, 0, "\\"], + [21769, 0, "f"], + [21770, 0, "o"], + [21771, 0, "o"], + [21772, 0, "t"], + [21773, 0, "n"], + [21774, 0, "o"], + [21775, 0, "t"], + [21776, 0, "e"], + [21777, 0, "s"], + [21778, 0, "i"], + [21779, 0, "z"], + [21780, 0, "e"], + [21781, 0, " "], + [21782, 0, "n"], + [21783, 0, "e"], + [21784, 0, "t"], + [21785, 0, "w"], + [21786, 0, "o"], + [21787, 0, "r"], + [21788, 0, "k"], + [21789, 0, " "], + [21790, 0, "c"], + [21791, 0, "o"], + [21792, 0, "m"], + [21793, 0, "m"], + [21794, 0, "u"], + [21795, 0, "n"], + [21796, 0, "i"], + [21797, 0, "c"], + [21798, 0, "a"], + [21799, 0, "t"], + [21800, 0, "i"], + [21801, 0, "o"], + [21802, 0, "n"], + [21803, 0, "}"], + [21804, 0, ";"], + [21752, 1], + [21752, 0, "2"], + [21752, 1], + [21752, 0, "4"], + [17261, 1], + [17261, 0, "6"], + [23374, 0, ","], + [23375, 0, "s"], + [23376, 0, "c"], + [23377, 0, "a"], + [23378, 0, "l"], + [23379, 0, "e"], + [23380, 0, "="], + [23381, 0, "0"], + [23382, 0, "."], + [23383, 0, "8"], + [23409, 1], + [23408, 1], + [23407, 1], + [23407, 0, "4"], + [23490, 1], + [23490, 1], + [23490, 1], + [23490, 0, "2"], + [23537, 1], + [23537, 1], + [23537, 1], + [23537, 0, "2"], + [23620, 1], + [23620, 1], + [23681, 1], + [23681, 1], + [23416, 1], + [23415, 1], + [23414, 1], + [23413, 1], + [23412, 1], + [23490, 1], + [23490, 1], + [23490, 1], + [23490, 1], + [23490, 1], + [23532, 1], + [23532, 1], + [23532, 1], + [23532, 1], + [23532, 1], + [23609, 1], + [23609, 1], + [23609, 1], + [23609, 1], + [23609, 1], + [23665, 1], + [23665, 1], + [23665, 1], + [23665, 1], + [23665, 1], + [23413, 1], + [23413, 0, "`"], + [23414, 0, "`"], + [23492, 1], + [23492, 0, "`"], + [23493, 0, "`"], + [23535, 1], + [23535, 0, "`"], + [23536, 0, "`"], + [23613, 1], + [23613, 0, "`"], + [23614, 0, "`"], + [23670, 1], + [23670, 0, "`"], + [23671, 0, "`"], + [23419, 1], + [23419, 0, "'"], + [23420, 0, "'"], + [23499, 1], + [23499, 0, "'"], + [23500, 0, "'"], + [23543, 1], + [23543, 0, "'"], + [23544, 0, "'"], + [23622, 1], + [23622, 0, "'"], + [23623, 0, "'"], + [23680, 1], + [23680, 0, "'"], + [23681, 0, "'"], + [23424, 0, "\\"], + [23426, 1], + [23426, 0, "`"], + [23427, 0, "`"], + [23433, 1], + [23433, 0, "'"], + [23434, 0, "'"], + [23437, 1], + [23437, 0, "`"], + [23438, 0, "`"], + [23447, 1], + [23447, 0, "'"], + [23448, 0, "'"], + [23451, 1], + [23451, 0, "`"], + [23452, 0, "`"], + [23457, 1], + [23457, 0, "'"], + [23458, 0, "'"], + [23466, 0, "\\"], + [23469, 0, "\\"], + [23471, 1], + [23514, 1], + [23513, 0, "\\"], + [23556, 0, "\\"], + [23558, 1], + [23558, 0, "`"], + [23559, 0, "`"], + [23565, 1], + [23565, 0, "'"], + [23566, 0, "'"], + [23569, 1], + [23569, 0, "`"], + [23570, 0, "`"], + [23579, 1], + [23579, 0, "'"], + [23580, 0, "'"], + [23583, 1], + [23583, 0, "`"], + [23584, 0, "`"], + [23589, 1], + [23589, 0, "'"], + [23590, 0, "'"], + [23597, 0, "\\"], + [23600, 0, "\\"], + [23602, 1], + [23643, 0, "\\"], + [23702, 0, "\\"], + [23645, 1], + [23645, 0, "`"], + [23646, 0, "`"], + [23705, 1], + [23705, 0, "`"], + [23706, 0, "`"], + [23651, 1], + [23651, 0, "'"], + [23652, 0, "'"], + [23713, 0, "="], + [23713, 1], + [23712, 1], + [23712, 0, "'"], + [23713, 0, "'"], + [23659, 0, "\\"], + [23721, 0, "\\"], + [23662, 0, "\\"], + [23725, 0, "\\"], + [23727, 1], + [23664, 1], + [23784, 1], + [23783, 1], + [23782, 1], + [23781, 1], + [23780, 1], + [23779, 1], + [23778, 1], + [23777, 1], + [23776, 1], + [23775, 1], + [23774, 1], + [23773, 1], + [23772, 1], + [23771, 1], + [23770, 1], + [23769, 1], + [23768, 1], + [23769, 0, " "], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23868, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23772, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23857, 1], + [23954, 1], + [23954, 1], + [23954, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23940, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [23978, 1], + [24001, 0, "d"], + [24002, 0, "a"], + [24003, 0, "s"], + [24004, 0, "h"], + [24005, 0, "e"], + [24006, 0, "d"], + [24007, 0, ","], + [24008, 0, "b"], + [24009, 0, "l"], + [24010, 0, "u"], + [24011, 0, "e"], + [24012, 0, ","], + [24052, 0, "d"], + [24053, 0, "a"], + [24054, 0, "s"], + [24055, 0, "h"], + [24056, 0, "e"], + [24057, 0, "d"], + [24058, 0, ","], + [24059, 0, "b"], + [24060, 0, "l"], + [24061, 0, "u"], + [24062, 0, "e"], + [24063, 0, ","], + [24023, 0, "."], + [24024, 0, "s"], + [24025, 0, "o"], + [24026, 0, "u"], + [24027, 0, "t"], + [24028, 0, "h"], + [24081, 0, "."], + [24082, 0, "s"], + [24083, 0, "o"], + [24084, 0, "u"], + [24085, 0, "t"], + [24086, 0, "h"], + [24034, 0, " "], + [24035, 0, "["], + [24036, 0, "o"], + [24037, 0, "u"], + [24038, 0, "t"], + [24039, 0, "="], + [24040, 0, "2"], + [24041, 0, "8"], + [24042, 0, "0"], + [24042, 1], + [24041, 1], + [24041, 0, "7"], + [24042, 0, "0"], + [24043, 0, "]"], + [24043, 1], + [24043, 0, ","], + [24044, 0, "i"], + [24045, 0, "n"], + [24046, 0, "="], + [24047, 0, "1"], + [24048, 0, "3"], + [24049, 0, "5"], + [24050, 0, "]"], + [24108, 0, " "], + [24109, 0, "["], + [24110, 0, "o"], + [24111, 0, "u"], + [24112, 0, "t"], + [24113, 0, "="], + [24114, 0, "2"], + [24115, 0, "7"], + [24116, 0, "0"], + [24117, 0, ","], + [24118, 0, "i"], + [24119, 0, "n"], + [24120, 0, "="], + [24121, 0, "4"], + [24122, 0, "5"], + [24123, 0, "]"], + [24124, 0, " "], + [24059, 0, "."], + [24060, 0, "n"], + [24061, 0, "o"], + [24062, 0, "r"], + [24063, 0, "t"], + [24064, 0, "h"], + [24065, 0, " "], + [24066, 0, "w"], + [24067, 0, "e"], + [24068, 0, "s"], + [24069, 0, "t"], + [24143, 0, "."], + [24144, 0, "n"], + [24145, 0, "o"], + [24146, 0, "r"], + [24147, 0, "t"], + [24148, 0, "h"], + [24149, 0, " "], + [24150, 0, "e"], + [24151, 0, "a"], + [24152, 0, "s"], + [24153, 0, "t"], + [23409, 0, " "], + [23410, 0, "["], + [23411, 0, "r"], + [23412, 0, "e"], + [23413, 0, "c"], + [23414, 0, "t"], + [23415, 0, "a"], + [23416, 0, "n"], + [23417, 0, "g"], + [23418, 0, "l"], + [23419, 0, "e"], + [23420, 0, ","], + [23421, 0, "d"], + [23422, 0, "r"], + [23423, 0, "a"], + [23424, 0, "w"], + [23425, 0, "]"], + [23514, 0, " "], + [23515, 0, "["], + [23516, 0, "r"], + [23517, 0, "e"], + [23518, 0, "c"], + [23519, 0, "t"], + [23520, 0, "a"], + [23521, 0, "n"], + [23522, 0, "g"], + [23523, 0, "l"], + [23524, 0, "e"], + [23525, 0, ","], + [23526, 0, "d"], + [23527, 0, "r"], + [23528, 0, "a"], + [23529, 0, "w"], + [23530, 0, "]"], + [23575, 0, " "], + [23576, 0, "["], + [23577, 0, "r"], + [23578, 0, "e"], + [23579, 0, "c"], + [23580, 0, "t"], + [23581, 0, "a"], + [23582, 0, "n"], + [23583, 0, "g"], + [23584, 0, "l"], + [23585, 0, "e"], + [23586, 0, ","], + [23587, 0, "d"], + [23588, 0, "r"], + [23589, 0, "a"], + [23590, 0, "w"], + [23591, 0, "]"], + [23679, 0, " "], + [23680, 0, "["], + [23681, 0, "r"], + [23682, 0, "e"], + [23683, 0, "c"], + [23684, 0, "t"], + [23685, 0, "a"], + [23686, 0, "n"], + [23687, 0, "g"], + [23688, 0, "l"], + [23689, 0, "e"], + [23690, 0, ","], + [23691, 0, "d"], + [23692, 0, "r"], + [23693, 0, "a"], + [23694, 0, "w"], + [23695, 0, "]"], + [23758, 0, " "], + [23759, 0, "["], + [23760, 0, "r"], + [23761, 0, "e"], + [23762, 0, "c"], + [23763, 0, "t"], + [23764, 0, "a"], + [23765, 0, "n"], + [23766, 0, "g"], + [23767, 0, "l"], + [23768, 0, "e"], + [23769, 0, ","], + [23770, 0, "d"], + [23771, 0, "r"], + [23772, 0, "a"], + [23773, 0, "w"], + [23774, 0, "]"], + [23405, 1], + [23405, 0, "0"], + [23407, 1], + [23407, 0, "4"], + [23490, 0, "\n"], + [23491, 0, "\\"], + [23492, 0, "n"], + [23493, 0, "o"], + [23494, 0, "d"], + [23495, 0, "e"], + [23496, 0, " "], + [23497, 0, "("], + [23498, 0, "r"], + [23499, 0, "i"], + [23500, 0, "g"], + [23501, 0, "h"], + [23502, 0, "t"], + [23503, 0, "0"], + [23504, 0, ")"], + [23397, 1], + [23396, 1], + [23395, 1], + [23394, 1], + [23393, 1], + [23393, 0, "l"], + [23394, 0, "e"], + [23395, 0, "f"], + [23396, 0, "t"], + [23397, 0, "0"], + [23505, 0, " "], + [23506, 0, "a"], + [23507, 0, "t"], + [23508, 0, " "], + [23509, 0, "("], + [23510, 0, "8"], + [23511, 0, ","], + [23512, 0, "4"], + [23513, 0, ")"], + [23514, 0, " "], + [23515, 0, "["], + [23516, 0, "r"], + [23517, 0, "e"], + [23518, 0, "c"], + [23519, 0, "t"], + [23520, 0, "a"], + [23521, 0, "n"], + [23522, 0, "g"], + [23523, 0, "l"], + [23524, 0, "e"], + [23525, 0, ","], + [23526, 0, "d"], + [23527, 0, "r"], + [23528, 0, "a"], + [23529, 0, "w"], + [23530, 0, "]"], + [23531, 0, " "], + [23532, 0, "{"], + [23533, 0, "\\"], + [23534, 0, "{"], + [23535, 0, "`"], + [23536, 0, "`"], + [23537, 0, "t"], + [23538, 0, "o"], + [23539, 0, "d"], + [23540, 0, "o"], + [23541, 0, "'"], + [23542, 0, "'"], + [23543, 0, ":"], + [23544, 0, " "], + [23545, 0, "["], + [23546, 0, "\\"], + [23547, 0, "{"], + [23548, 0, "`"], + [23549, 0, "`"], + [23550, 0, "t"], + [23551, 0, "i"], + [23552, 0, "t"], + [23553, 0, "l"], + [23554, 0, "e"], + [23555, 0, "'"], + [23556, 0, "'"], + [23557, 0, ":"], + [23558, 0, " "], + [23559, 0, "`"], + [23560, 0, "`"], + [23561, 0, "b"], + [23562, 0, "u"], + [23563, 0, "y"], + [23564, 0, " "], + [23565, 0, "m"], + [23566, 0, "i"], + [23567, 0, "l"], + [23568, 0, "k"], + [23569, 0, "'"], + [23570, 0, "'"], + [23571, 0, ","], + [23572, 0, " "], + [23573, 0, "`"], + [23574, 0, "`"], + [23575, 0, "d"], + [23576, 0, "o"], + [23577, 0, "n"], + [23578, 0, "e"], + [23579, 0, "'"], + [23580, 0, "'"], + [23581, 0, ":"], + [23582, 0, " "], + [23583, 0, "f"], + [23584, 0, "a"], + [23585, 0, "l"], + [23586, 0, "s"], + [23587, 0, "e"], + [23588, 0, "\\"], + [23589, 0, "}"], + [23590, 0, "]"], + [23591, 0, "\\"], + [23592, 0, "}"], + [23593, 0, "]"], + [23593, 1], + [23593, 0, "}"], + [23594, 0, "'"], + [23594, 1], + [23594, 0, ";"], + [23941, 1], + [23940, 1], + [23939, 1], + [23938, 1], + [23937, 1], + [23937, 0, "l"], + [23938, 0, "e"], + [23939, 0, "f"], + [23940, 0, "t"], + [23941, 0, "0"], + [24026, 1], + [24025, 1], + [24024, 1], + [24023, 1], + [24022, 1], + [24022, 0, "r"], + [24023, 0, "i"], + [24024, 0, "g"], + [24025, 0, "h"], + [24026, 0, "t"], + [24027, 0, "0"], + [24029, 1], + [23391, 0, " "], + [23392, 0, "["], + [23393, 0, "m"], + [23394, 0, "a"], + [23395, 0, "t"], + [23396, 0, "r"], + [23397, 0, "i"], + [23398, 0, "x"], + [23399, 0, "]"], + [23505, 0, " "], + [23506, 0, "["], + [23507, 0, "m"], + [23508, 0, "a"], + [23509, 0, "t"], + [23510, 0, "r"], + [23511, 0, "i"], + [23512, 0, "x"], + [23513, 0, "]"], + [23408, 1], + [23436, 0, "\n"], + [23437, 0, " "], + [23438, 0, " "], + [23439, 0, " "], + [23440, 0, " "], + [23441, 0, "\\"], + [23442, 0, "n"], + [23443, 0, "o"], + [23444, 0, "d"], + [23445, 0, "e"], + [23446, 0, " "], + [23447, 0, "{"], + [23487, 0, "}"], + [23488, 0, ";"], + [23489, 0, " "], + [23490, 0, "\\"], + [23491, 0, "\\"], + [23492, 0, "\n"], + [23493, 0, " "], + [23494, 0, " "], + [23495, 0, " "], + [23496, 0, " "], + [23497, 0, "\\"], + [23498, 0, "\\"], + [23499, 0, "n"], + [23500, 0, "o"], + [23501, 0, "d"], + [23501, 1], + [23500, 1], + [23499, 1], + [23498, 1], + [23498, 0, "n"], + [23499, 0, "o"], + [23500, 0, "d"], + [23501, 0, "e"], + [23502, 0, " "], + [23503, 0, "{"], + [23504, 1], + [23526, 0, " "], + [23527, 0, "\\"], + [23528, 0, "\\"], + [23529, 0, "\n"], + [23530, 0, "}"], + [23531, 0, ";"], + [23584, 0, "\n"], + [23585, 0, " "], + [23586, 0, " "], + [23587, 0, " "], + [23588, 0, " "], + [23589, 0, "\\"], + [23590, 0, "n"], + [23591, 0, "o"], + [23592, 0, "d"], + [23593, 0, "e"], + [23594, 0, " "], + [23595, 0, "{"], + [23635, 0, "}"], + [23636, 0, ";"], + [23637, 0, " "], + [23638, 0, "\\"], + [23639, 0, "\\"], + [23640, 0, "\n"], + [23641, 0, " "], + [23642, 0, " "], + [23644, 0, " "], + [23645, 0, "\\"], + [23646, 0, "n"], + [23647, 0, "o"], + [23648, 0, "d"], + [23649, 0, "e"], + [23650, 0, " "], + [23651, 0, "{"], + [23674, 0, " "], + [23675, 0, "\\"], + [23676, 0, "\\"], + [23677, 0, "\n"], + [23678, 0, "}"], + [23679, 0, ";"], + [23563, 1], + [23563, 0, "5"], + [23415, 1], + [23415, 0, "5"], + [23763, 1], + [23763, 0, "3"], + [23702, 1], + [23702, 0, "3"], + [23563, 1], + [23563, 0, "6"], + [23415, 1], + [23415, 0, "6"], + [23747, 0, " "], + [23748, 0, "["], + [23749, 0, "m"], + [23750, 0, "a"], + [23751, 0, "t"], + [23752, 0, "r"], + [23753, 0, "i"], + [23754, 0, "x"], + [23755, 0, "]"], + [23793, 0, "\n"], + [23794, 0, " "], + [23795, 0, " "], + [23796, 0, " "], + [23797, 0, " "], + [23798, 0, "\\"], + [23799, 0, "n"], + [23800, 0, "o"], + [23801, 0, "d"], + [23802, 0, "e"], + [23803, 0, " "], + [23804, 0, "{"], + [23844, 1], + [23844, 0, "}"], + [23845, 0, ";"], + [23846, 0, " "], + [23847, 0, "\\"], + [23848, 0, "\\"], + [23849, 0, "\n"], + [23850, 0, " "], + [23851, 0, " "], + [23852, 0, " "], + [23853, 0, " "], + [23854, 0, "\\"], + [23855, 0, "n"], + [23856, 0, "o"], + [23857, 0, "d"], + [23858, 0, "e"], + [23859, 0, " "], + [23860, 0, "{"], + [23882, 0, " "], + [23883, 0, "\\"], + [23884, 0, "\\"], + [23885, 0, "\n"], + [23886, 0, "}"], + [23887, 0, ";"], + [23385, 0, "\n"], + [23386, 0, "\\"], + [23387, 0, "n"], + [23388, 0, "o"], + [23389, 0, "d"], + [23390, 0, "e"], + [23391, 0, " "], + [23392, 0, "("], + [23393, 0, "l"], + [23394, 0, "e"], + [23395, 0, "f"], + [23396, 0, "t"], + [23397, 0, "R"], + [23398, 0, ")"], + [23399, 0, " "], + [23400, 0, "a"], + [23401, 0, "t"], + [23402, 0, " "], + [23403, 0, "9"], + [23403, 1], + [23403, 0, "("], + [23404, 0, "0"], + [23405, 0, "."], + [23405, 1], + [23405, 0, ","], + [23406, 0, "8"], + [23407, 0, ")"], + [23408, 0, " "], + [23409, 0, "{"], + [23410, 0, "R"], + [23411, 0, "e"], + [23412, 0, "p"], + [23413, 0, "l"], + [23414, 0, "i"], + [23415, 0, "c"], + [23416, 0, "a"], + [23417, 0, " "], + [23418, 0, "$"], + [23419, 0, "p"], + [23420, 0, "$"], + [23421, 0, ":"], + [23422, 0, "}"], + [23423, 0, ";"], + [23424, 0, "\n"], + [23425, 0, "\\"], + [23426, 0, "n"], + [23427, 0, "o"], + [23428, 0, "d"], + [23429, 0, "e"], + [23430, 0, " "], + [23431, 0, "("], + [23432, 0, "r"], + [23433, 0, "i"], + [23434, 0, "g"], + [23435, 0, "h"], + [23436, 0, "t"], + [23437, 0, "R"], + [23438, 0, ")"], + [23439, 0, " "], + [23400, 0, " "], + [23441, 0, "a"], + [23442, 0, "t"], + [23443, 0, " "], + [23444, 0, "("], + [23445, 0, "8"], + [23446, 0, ","], + [23447, 0, "8"], + [23448, 0, ")"], + [23449, 0, " "], + [23450, 0, "{"], + [23451, 0, "R"], + [23452, 0, "e"], + [23453, 0, "p"], + [23454, 0, "l"], + [23455, 0, "i"], + [23456, 0, "c"], + [23457, 0, "a"], + [23458, 0, " "], + [23459, 0, "$"], + [23460, 0, "q"], + [23461, 0, "$"], + [23462, 0, ":"], + [23463, 0, "}"], + [23464, 0, ";"], + [23447, 1], + [23447, 0, "7"], + [23448, 0, "."], + [23449, 0, "5"], + [23407, 1], + [23407, 0, "7"], + [23408, 0, "."], + [23409, 0, "5"], + [23469, 0, "\n"], + [23470, 0, "\\"], + [23470, 1], + [23469, 1], + [23385, 0, "\n"], + [23386, 0, "\\"], + [23387, 0, "p"], + [23388, 0, "a"], + [23389, 0, "t"], + [23390, 0, "h"], + [23391, 0, " "], + [23392, 0, "["], + [23393, 0, "d"], + [23394, 0, "r"], + [23395, 0, "a"], + [23396, 0, "w"], + [23397, 0, ","], + [23398, 0, "d"], + [23399, 0, "o"], + [23400, 0, "t"], + [23401, 0, "t"], + [23402, 0, "e"], + [23403, 0, "d"], + [23404, 0, "]"], + [23405, 0, " "], + [23406, 0, "("], + [23407, 0, "4"], + [23408, 0, ","], + [23409, 0, "-"], + [23410, 0, "0"], + [23411, 0, "."], + [23412, 0, "5"], + [23413, 0, ")"], + [23414, 0, " "], + [23415, 0, "-"], + [23416, 0, "-"], + [23417, 0, " "], + [23418, 0, "("], + [23419, 0, "4"], + [23420, 0, ","], + [23421, 0, "8"], + [23422, 0, ")"], + [23423, 0, ";"], + [24169, 0, "\n"], + [24170, 0, "\\"], + [24171, 0, "n"], + [24172, 0, "o"], + [24173, 0, "d"], + [24174, 0, "e"], + [24175, 0, " "], + [24176, 0, "("], + [24177, 0, "c"], + [24178, 0, "o"], + [24179, 0, "m"], + [24180, 0, "m"], + [24181, 0, "s"], + [24182, 0, ")"], + [24183, 0, " "], + [24184, 0, " "], + [24185, 0, "a"], + [24186, 0, "t"], + [24187, 0, " "], + [24188, 0, "("], + [24189, 0, "4"], + [24190, 0, ","], + [24191, 0, "1"], + [24192, 0, "."], + [24193, 0, "4"], + [24194, 0, ")"], + [24195, 0, " "], + [24196, 0, "["], + [24197, 0, "t"], + [24198, 0, "e"], + [24199, 0, "x"], + [24200, 0, "t"], + [24201, 0, "="], + [24202, 0, "b"], + [24203, 0, "l"], + [24204, 0, "u"], + [24205, 0, "e"], + [24206, 0, "]"], + [24207, 0, " "], + [24208, 0, "{"], + [24209, 0, "\\"], + [24210, 0, "f"], + [24211, 0, "o"], + [24212, 0, "o"], + [24213, 0, "t"], + [24214, 0, "n"], + [24215, 0, "o"], + [24216, 0, "t"], + [24217, 0, "e"], + [24218, 0, "s"], + [24219, 0, "i"], + [24220, 0, "z"], + [24221, 0, "e"], + [24222, 0, " "], + [24223, 0, "n"], + [24224, 0, "e"], + [24225, 0, "t"], + [24226, 0, "w"], + [24227, 0, "o"], + [24228, 0, "r"], + [24229, 0, "k"], + [24230, 0, " "], + [24231, 0, "c"], + [24232, 0, "o"], + [24233, 0, "m"], + [24234, 0, "m"], + [24235, 0, "u"], + [24236, 0, "n"], + [24237, 0, "i"], + [24238, 0, "c"], + [24239, 0, "a"], + [24240, 0, "t"], + [24241, 0, "i"], + [24242, 0, "o"], + [24243, 0, "n"], + [24244, 0, "}"], + [24245, 0, ";"], + [24193, 1], + [24193, 0, "6"], + [4966, 0, "i"], + [4968, 1], + [18031, 0, " "], + [18032, 0, "I"], + [18033, 0, "n"], + [18034, 0, " "], + [18035, 0, "t"], + [18036, 0, "h"], + [18037, 0, "e"], + [18038, 0, " "], + [18039, 0, "e"], + [18040, 0, "x"], + [18041, 0, "a"], + [18042, 0, "m"], + [18043, 0, "p"], + [18044, 0, "l"], + [18045, 0, "e"], + [18046, 0, " "], + [18047, 0, "t"], + [18048, 0, "h"], + [18049, 0, "e"], + [18050, 0, "r"], + [18051, 0, "e"], + [18052, 0, " "], + [18053, 0, "a"], + [18054, 0, "r"], + [18055, 0, "e"], + [18056, 0, " "], + [18057, 0, "t"], + [18058, 0, "w"], + [18059, 0, "o"], + [18060, 0, " "], + [18061, 0, "r"], + [18062, 0, "e"], + [18062, 1], + [18061, 1], + [18060, 1], + [18059, 1], + [18058, 1], + [18057, 1], + [18056, 1], + [18055, 1], + [18054, 1], + [18053, 1], + [18052, 1], + [18051, 1], + [18050, 1], + [18049, 1], + [18048, 1], + [18047, 1], + [18046, 1], + [18045, 1], + [18044, 1], + [18043, 1], + [18042, 1], + [18041, 1], + [18040, 1], + [18039, 1], + [18038, 1], + [18037, 1], + [18036, 1], + [18035, 1], + [18035, 0, "a"], + [18036, 0, "l"], + [18037, 0, "l"], + [18038, 0, " "], + [18039, 0, "e"], + [18040, 0, "x"], + [18041, 0, "a"], + [18042, 0, "m"], + [18043, 0, "p"], + [18044, 0, "l"], + [18045, 0, "e"], + [18046, 0, "s"], + [18047, 0, " "], + [18047, 1], + [18046, 1], + [18045, 1], + [18044, 1], + [18043, 1], + [18042, 1], + [18041, 1], + [18040, 1], + [18039, 1], + [18038, 1], + [18037, 1], + [18036, 1], + [18035, 1], + [18035, 0, "a"], + [18036, 0, "l"], + [18037, 0, " "], + [18038, 0, "o"], + [18039, 0, "u"], + [18040, 0, "r"], + [18040, 1], + [18039, 1], + [18038, 1], + [18037, 1], + [18037, 0, "l"], + [18038, 0, " "], + [18039, 0, "a"], + [18039, 1], + [18039, 0, "o"], + [18040, 0, "u"], + [18041, 0, "r"], + [18042, 0, " "], + [18043, 0, "e"], + [18044, 0, "x"], + [18045, 0, "a"], + [18046, 0, "m"], + [18047, 0, "p"], + [18048, 0, "l"], + [18049, 0, "e"], + [18050, 0, "s"], + [18051, 0, " "], + [18052, 0, "i"], + [18053, 0, "n"], + [18054, 0, "t"], + [18055, 0, "h"], + [18056, 0, "i"], + [18057, 0, "s"], + [18058, 0, " "], + [18058, 1], + [18057, 1], + [18056, 1], + [18055, 1], + [18054, 1], + [18054, 0, " "], + [18055, 0, "t"], + [18056, 0, "h"], + [18057, 0, "i"], + [18058, 0, "s"], + [18059, 0, " "], + [18060, 0, "p"], + [18061, 0, "a"], + [18062, 0, "p"], + [18063, 0, "e"], + [18064, 0, "r"], + [18065, 0, " "], + [18066, 0, "w"], + [18067, 0, "e"], + [18068, 0, " "], + [18069, 0, "a"], + [18070, 0, "s"], + [18071, 0, "s"], + [18072, 0, "u"], + [18073, 0, "m"], + [18074, 0, "e"], + [18075, 0, " "], + [18076, 0, "t"], + [18077, 0, "w"], + [18078, 0, "o"], + [18079, 0, " "], + [18080, 0, "d"], + [18081, 0, "e"], + [18082, 0, "v"], + [18083, 0, "i"], + [18084, 0, "c"], + [18085, 0, "e"], + [18086, 0, "s"], + [18086, 1], + [18085, 1], + [18084, 1], + [18083, 1], + [18082, 1], + [18081, 1], + [18080, 1], + [18080, 0, "c"], + [18081, 0, "o"], + [18082, 0, "m"], + [18083, 0, "p"], + [18084, 0, "t"], + [18085, 0, "u"], + [18085, 1], + [18084, 1], + [18084, 0, "u"], + [18085, 0, "t"], + [18086, 0, "e"], + [18087, 0, "r"], + [18088, 0, " "], + [18089, 0, "d"], + [18089, 1], + [18088, 1], + [18087, 1], + [18086, 1], + [18086, 0, "i"], + [18087, 0, "n"], + [18088, 0, "g"], + [18089, 0, " "], + [18090, 0, "d"], + [18091, 0, "e"], + [18092, 0, "v"], + [18093, 0, "i"], + [18094, 0, "c"], + [18095, 0, "e"], + [18096, 0, "s"], + [18097, 0, " "], + [18098, 0, "l"], + [18099, 0, "a"], + [18100, 0, "b"], + [18101, 0, "e"], + [18102, 0, "l"], + [18103, 0, "l"], + [18104, 0, "e"], + [18105, 0, "d"], + [18106, 0, " "], + [18107, 0, "a"], + [18108, 0, "s"], + [18109, 0, " "], + [18110, 0, "r"], + [18111, 0, "e"], + [18112, 0, "p"], + [18113, 0, "l"], + [18114, 0, "i"], + [18115, 0, "c"], + [18116, 0, "a"], + [18117, 0, "'"], + [18118, 0, "s"], + [18119, 0, " "], + [18120, 0, "$"], + [18121, 0, "p"], + [18122, 0, "$"], + [18123, 0, " "], + [18124, 0, "a"], + [18125, 0, "n"], + [18126, 0, "d"], + [18127, 0, " "], + [18128, 0, "$"], + [18129, 0, "q"], + [18130, 0, "$"], + [18131, 0, "."], + [18064, 1], + [18063, 1], + [18062, 1], + [18061, 1], + [18060, 1], + [18060, 0, "s"], + [18061, 0, "e"], + [18062, 0, "c"], + [18063, 0, "t"], + [18064, 0, "i"], + [18065, 0, "o"], + [18066, 0, "n"], + [18066, 1], + [18065, 1], + [18064, 1], + [18063, 1], + [18062, 1], + [18061, 1], + [18060, 1], + [18059, 1], + [18058, 1], + [18057, 1], + [18056, 1], + [18055, 1], + [18054, 1], + [18053, 1], + [18052, 1], + [18051, 1], + [18117, 1], + [18116, 1], + [18115, 1], + [18114, 1], + [18113, 1], + [18112, 1], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18106, 1], + [18105, 1], + [18104, 1], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18096, 1], + [18095, 1], + [18094, 1], + [18093, 1], + [18092, 1], + [18091, 1], + [18090, 1], + [18089, 1], + [18088, 1], + [18087, 1], + [18086, 1], + [18085, 1], + [18084, 1], + [18083, 1], + [18082, 1], + [18081, 1], + [18080, 1], + [18079, 1], + [18078, 1], + [18077, 1], + [18076, 1], + [18075, 1], + [18074, 1], + [18073, 1], + [18072, 1], + [18071, 1], + [18070, 1], + [18069, 1], + [18068, 1], + [18067, 1], + [18066, 1], + [18065, 1], + [18064, 1], + [18063, 1], + [18062, 1], + [18061, 1], + [18060, 1], + [18059, 1], + [18058, 1], + [18057, 1], + [18056, 1], + [18055, 1], + [18054, 1], + [18053, 1], + [18052, 1], + [18051, 1], + [18050, 1], + [18049, 1], + [18048, 1], + [18047, 1], + [18046, 1], + [18045, 1], + [18044, 1], + [18043, 1], + [18042, 1], + [18041, 1], + [18040, 1], + [18039, 1], + [18038, 1], + [18037, 1], + [18036, 1], + [18035, 1], + [18034, 1], + [18033, 1], + [18032, 1], + [18031, 1], + [17966, 0, " "], + [17966, 1], + [17966, 0, " "], + [17967, 0, "I"], + [17968, 0, "n"], + [17969, 0, " "], + [17970, 0, "a"], + [17971, 0, "l"], + [17972, 0, "l"], + [17973, 0, " "], + [17974, 0, "e"], + [17975, 0, "x"], + [17976, 0, "a"], + [17977, 0, "m"], + [17978, 0, "p"], + [17979, 0, "l"], + [17980, 0, "e"], + [17981, 0, "s"], + [17982, 0, " "], + [17983, 0, "w"], + [17984, 0, "e"], + [17985, 0, " "], + [17986, 0, "a"], + [17987, 0, "s"], + [17988, 0, "s"], + [17989, 0, "u"], + [17990, 0, "m"], + [17991, 0, "e"], + [17992, 0, " "], + [17993, 0, "t"], + [17994, 0, "w"], + [17995, 0, "o"], + [17996, 0, " "], + [17997, 0, "c"], + [17998, 0, "o"], + [17999, 0, "m"], + [18000, 0, "p"], + [18001, 0, "u"], + [18002, 0, "t"], + [18003, 0, "i"], + [18004, 0, "n"], + [18005, 0, "g"], + [18006, 0, " "], + [18007, 0, "d"], + [18008, 0, "e"], + [18009, 0, "v"], + [18010, 0, "i"], + [18011, 0, "c"], + [18012, 0, "e"], + [18013, 0, "s"], + [18014, 0, " "], + [18014, 1], + [18014, 0, ","], + [18015, 0, " "], + [18016, 0, "o"], + [18017, 0, "r"], + [18018, 0, " "], + [18019, 0, "'"], + [18019, 1], + [18019, 0, "\\"], + [18020, 0, "e"], + [18021, 0, "m"], + [18022, 0, "p"], + [18023, 0, "h"], + [18024, 0, "{"], + [18025, 0, "r"], + [18026, 0, "e"], + [18027, 0, "p"], + [18028, 0, "l"], + [18029, 0, "i"], + [18030, 0, "c"], + [18031, 0, "a"], + [18032, 0, "s"], + [18033, 0, "}"], + [18034, 0, " "], + [18035, 0, "w"], + [18036, 0, "i"], + [18037, 0, "t"], + [18038, 0, "h"], + [18039, 0, " "], + [18039, 1], + [18038, 1], + [18037, 1], + [18036, 1], + [18035, 1], + [18035, 0, "l"], + [18036, 0, "a"], + [18037, 0, "b"], + [18038, 0, "e"], + [18039, 0, "l"], + [18040, 0, "l"], + [18041, 0, "e"], + [18042, 0, "d"], + [18043, 0, " "], + [18044, 0, "a"], + [18045, 0, "s"], + [18046, 0, " "], + [18047, 0, "$"], + [18048, 0, "p"], + [18049, 0, "$"], + [18050, 0, " "], + [18051, 0, "a"], + [18052, 0, "n"], + [18053, 0, "d"], + [18053, 1], + [18052, 1], + [18051, 1], + [18051, 0, "("], + [18052, 0, "d"], + [18053, 0, "r"], + [18054, 0, "a"], + [18055, 0, "w"], + [18056, 0, "n"], + [18057, 0, " "], + [18058, 0, "o"], + [18059, 0, "n"], + [18060, 0, " "], + [18061, 0, "t"], + [18062, 0, "h"], + [18063, 0, "e"], + [18064, 0, " "], + [18065, 0, "l"], + [18066, 0, "e"], + [18067, 0, "f"], + [18068, 0, "t"], + [18069, 0, "-"], + [18070, 0, "h"], + [18071, 0, "a"], + [18072, 0, "n"], + [18073, 0, "d"], + [18074, 0, " "], + [18075, 0, "s"], + [18076, 0, "i"], + [18077, 0, "z"], + [18078, 0, "e"], + [18079, 0, ")"], + [18079, 1], + [18078, 1], + [18077, 1], + [18077, 0, "d"], + [18078, 0, "e"], + [18079, 0, ")"], + [18080, 0, " "], + [18081, 0, "a"], + [18082, 0, "n"], + [18083, 0, "d"], + [18084, 0, " "], + [18085, 0, "$"], + [18086, 0, "q"], + [18087, 0, "$"], + [18088, 0, " "], + [18089, 0, "("], + [18090, 0, "r"], + [18091, 0, "i"], + [18092, 0, "g"], + [18093, 0, "h"], + [18094, 0, "t"], + [18095, 0, "-"], + [18096, 0, "h"], + [18097, 0, "a"], + [18098, 0, "n"], + [18099, 0, "d"], + [18100, 0, " "], + [18101, 0, "s"], + [18102, 0, "i"], + [18103, 0, "z"], + [18104, 0, "e"], + [18104, 1], + [18103, 1], + [18102, 1], + [18102, 0, "d"], + [18103, 0, "e"], + [18103, 1], + [18102, 1], + [18102, 0, "i"], + [18103, 0, "d"], + [18104, 0, "e"], + [18105, 0, ")"], + [18106, 0, "."], + [18107, 0, " "], + [18108, 0, "R"], + [18109, 0, "e"], + [18110, 0, "p"], + [18111, 0, "l"], + [18112, 0, "i"], + [18113, 0, "c"], + [18114, 0, "a"], + [18115, 0, "s"], + [18116, 0, " "], + [18117, 0, "p"], + [18118, 0, "r"], + [18119, 0, "o"], + [18120, 0, "c"], + [18121, 0, "e"], + [18122, 0, "s"], + [18123, 0, "s"], + [18124, 0, " "], + [18125, 0, "d"], + [18126, 0, "a"], + [18127, 0, "t"], + [18128, 0, "a"], + [18129, 0, " "], + [18130, 0, "l"], + [18131, 0, "o"], + [18132, 0, "c"], + [18133, 0, "a"], + [18134, 0, "l"], + [18135, 0, "l"], + [18136, 0, "y"], + [18137, 0, " "], + [18137, 1], + [18136, 1], + [18135, 1], + [18134, 1], + [18133, 1], + [18132, 1], + [18131, 1], + [18130, 1], + [18129, 1], + [18128, 1], + [18127, 1], + [18126, 1], + [18125, 1], + [18124, 1], + [18123, 1], + [18122, 1], + [18121, 1], + [18120, 1], + [18119, 1], + [18118, 1], + [18117, 1], + [18117, 0, "m"], + [18118, 0, "u"], + [18119, 0, "t"], + [18120, 0, "a"], + [18121, 0, "t"], + [18122, 0, "e"], + [18123, 0, " "], + [18124, 0, "s"], + [18125, 0, "t"], + [18126, 0, "a"], + [18127, 0, "t"], + [18128, 0, "e"], + [18129, 0, " "], + [18130, 0, "l"], + [18131, 0, "o"], + [18132, 0, "c"], + [18133, 0, "a"], + [18134, 0, "l"], + [18135, 0, "l"], + [18136, 0, "y"], + [18136, 1], + [18135, 1], + [18134, 1], + [18134, 0, "l"], + [18135, 0, "l"], + [18136, 0, "y"], + [18137, 0, " "], + [18138, 0, "a"], + [18139, 0, "n"], + [18140, 0, "d"], + [18141, 0, " "], + [18141, 1], + [18140, 1], + [18139, 1], + [18138, 1], + [18138, 0, "c"], + [18139, 0, "h"], + [18140, 0, "o"], + [18141, 0, "o"], + [18142, 0, "s"], + [18143, 0, "e"], + [18144, 0, " "], + [18145, 0, "w"], + [18146, 0, "h"], + [18147, 0, "e"], + [18148, 0, "n"], + [18149, 0, " "], + [18150, 0, "t"], + [18151, 0, "o"], + [18152, 0, " "], + [18153, 0, "p"], + [18154, 0, "e"], + [18155, 0, "r"], + [18156, 0, "f"], + [18157, 0, "m"], + [18157, 1], + [18157, 0, "o"], + [18158, 0, "r"], + [18159, 0, "m"], + [18160, 0, " "], + [18161, 0, "n"], + [18162, 0, "e"], + [18163, 0, "t"], + [18164, 0, "w"], + [18165, 0, "o"], + [18166, 0, "r"], + [18167, 0, "k"], + [18168, 0, " "], + [18169, 0, "c"], + [18170, 0, "o"], + [18171, 0, "n"], + [18172, 0, "n"], + [18173, 0, "e"], + [18174, 0, "c"], + [18175, 0, "t"], + [18176, 0, "i"], + [18177, 0, "o"], + [18178, 0, "n"], + [18179, 0, " "], + [18180, 0, "w"], + [18181, 0, "i"], + [18182, 0, "t"], + [18183, 0, "h"], + [18184, 0, " "], + [18185, 0, "t"], + [18186, 0, "h"], + [18187, 0, "e"], + [18188, 0, "i"], + [18189, 0, "r"], + [18190, 0, " "], + [18191, 0, "p"], + [18192, 0, "i"], + [18193, 0, "e"], + [18193, 1], + [18192, 1], + [18192, 0, "e"], + [18193, 0, "e"], + [18194, 0, "r"], + [18195, 0, "s"], + [18107, 0, " "], + [18108, 0, "T"], + [18109, 0, "h"], + [18110, 0, "e"], + [18111, 0, " "], + [18112, 0, "c"], + [18113, 0, "h"], + [18114, 0, "o"], + [18115, 0, "i"], + [18116, 0, "c"], + [18117, 0, "e"], + [18118, 0, " "], + [18119, 0, "o"], + [18120, 0, "f"], + [18121, 0, " "], + [18122, 0, "t"], + [18123, 0, "w"], + [18124, 0, "o"], + [18125, 0, " "], + [18126, 0, "r"], + [18127, 0, "e"], + [18128, 0, "l"], + [18128, 1], + [18128, 0, "p"], + [18129, 0, "l"], + [18130, 0, "i"], + [18131, 0, "c"], + [18132, 0, "a"], + [18133, 0, "s"], + [18134, 0, " "], + [18135, 0, "i"], + [18136, 0, "s"], + [18137, 0, " "], + [18138, 0, "p"], + [18139, 0, "u"], + [18140, 0, "r"], + [18141, 0, "e"], + [18142, 0, "l"], + [18143, 0, "y"], + [18144, 0, " "], + [18145, 0, "f"], + [18146, 0, "o"], + [18147, 0, "r"], + [18148, 0, " "], + [18149, 0, "p"], + [18150, 0, "r"], + [18151, 0, "e"], + [18152, 0, "s"], + [18153, 0, "e"], + [18154, 0, "n"], + [18155, 0, "t"], + [18156, 0, "a"], + [18157, 0, "t"], + [18158, 0, "i"], + [18159, 0, "o"], + [18160, 0, "n"], + [18161, 0, "a"], + [18162, 0, "l"], + [18163, 0, " "], + [18164, 0, "p"], + [18165, 0, "u"], + [18166, 0, "r"], + [18167, 0, "p"], + [18168, 0, "o"], + [18169, 0, "s"], + [18170, 0, "e"], + [18171, 0, "s"], + [18172, 0, ","], + [18173, 0, " "], + [18174, 0, "o"], + [18175, 0, "u"], + [18176, 0, "r"], + [18177, 0, " "], + [18177, 1], + [18176, 1], + [18175, 1], + [18174, 1], + [18173, 1], + [18172, 1], + [18172, 0, " "], + [18173, 0, "a"], + [18174, 0, "n"], + [18175, 0, "d"], + [18176, 0, " "], + [18177, 0, "o"], + [18178, 0, "u"], + [18179, 0, "r"], + [18180, 0, " "], + [18181, 0, "a"], + [18182, 0, "l"], + [18183, 0, "g"], + [18184, 0, "o"], + [18185, 0, "r"], + [18186, 0, "i"], + [18187, 0, "t"], + [18188, 0, "h"], + [18189, 0, "m"], + [18190, 0, " "], + [18191, 0, "f"], + [18192, 0, "u"], + [18193, 0, "n"], + [18194, 0, "c"], + [18195, 0, "t"], + [18196, 0, "i"], + [18197, 0, "o"], + [18198, 0, "n"], + [18199, 0, "s"], + [18200, 0, " "], + [18201, 0, "f"], + [18202, 0, "o"], + [18203, 0, "r"], + [18203, 1], + [18202, 1], + [18201, 1], + [18200, 1], + [18199, 1], + [18198, 1], + [18197, 1], + [18196, 1], + [18195, 1], + [18194, 1], + [18193, 1], + [18192, 1], + [18191, 1], + [18191, 0, "w"], + [18192, 0, "o"], + [18193, 0, "r"], + [18194, 0, "k"], + [18195, 0, "s"], + [18196, 0, " "], + [18197, 0, "w"], + [18198, 0, "i"], + [18199, 0, "t"], + [18200, 0, "h"], + [18201, 0, " "], + [18202, 0, "a"], + [18203, 0, "n"], + [18204, 0, " "], + [18204, 1], + [18203, 1], + [18202, 1], + [18201, 1], + [18200, 1], + [18199, 1], + [18198, 1], + [18197, 1], + [18196, 1], + [18195, 1], + [18194, 1], + [18193, 1], + [18192, 1], + [18191, 1], + [18190, 1], + [18189, 1], + [18188, 1], + [18187, 1], + [18186, 1], + [18185, 1], + [18184, 1], + [18183, 1], + [18182, 1], + [18181, 1], + [18180, 1], + [18179, 1], + [18178, 1], + [18177, 1], + [18176, 1], + [18175, 1], + [18174, 1], + [18173, 1], + [18172, 1], + [18171, 1], + [18170, 1], + [18169, 1], + [18168, 1], + [18167, 1], + [18166, 1], + [18165, 1], + [18164, 1], + [18163, 1], + [18162, 1], + [18161, 1], + [18160, 1], + [18159, 1], + [18158, 1], + [18157, 1], + [18156, 1], + [18155, 1], + [18154, 1], + [18153, 1], + [18152, 1], + [18151, 1], + [18150, 1], + [18149, 1], + [18148, 1], + [18147, 1], + [18146, 1], + [18145, 1], + [18144, 1], + [18143, 1], + [18142, 1], + [18141, 1], + [18140, 1], + [18139, 1], + [18138, 1], + [18137, 1], + [18136, 1], + [18135, 1], + [18134, 1], + [18133, 1], + [18132, 1], + [18131, 1], + [18130, 1], + [18129, 1], + [18128, 1], + [18127, 1], + [18126, 1], + [18125, 1], + [18124, 1], + [18123, 1], + [18122, 1], + [18121, 1], + [18120, 1], + [18119, 1], + [18118, 1], + [18117, 1], + [18116, 1], + [18115, 1], + [18114, 1], + [18113, 1], + [18112, 1], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18095, 1], + [18069, 1], + [18135, 0, " "], + [18136, 0, "a"], + [18137, 0, "n"], + [18138, 0, "d"], + [18139, 0, " "], + [18140, 0, "c"], + [18141, 0, "a"], + [18142, 0, "n"], + [18202, 0, " "], + [18203, 0, "i"], + [18204, 0, "n"], + [18205, 0, " "], + [18206, 0, "o"], + [18207, 0, "r"], + [18208, 0, "d"], + [18209, 0, "e"], + [18210, 0, "r"], + [18211, 0, " "], + [18212, 0, "t"], + [18213, 0, "o"], + [18214, 0, " "], + [18215, 0, "s"], + [18216, 0, "h"], + [18217, 0, "a"], + [18218, 0, "r"], + [18219, 0, "e"], + [18220, 0, " "], + [18221, 0, "a"], + [18222, 0, "n"], + [18223, 0, "y"], + [18224, 0, " "], + [18024, 1], + [18023, 1], + [18022, 1], + [18021, 1], + [18020, 1], + [18019, 1], + [18018, 1], + [18017, 1], + [18016, 1], + [18015, 1], + [18014, 1], + [18013, 1], + [18012, 1], + [18011, 1], + [18010, 1], + [18009, 1], + [18008, 1], + [18007, 1], + [18006, 1], + [18005, 1], + [18004, 1], + [18003, 1], + [18002, 1], + [18001, 1], + [18000, 1], + [17999, 1], + [17998, 1], + [17997, 1], + [17996, 1], + [17995, 1], + [17994, 1], + [17993, 1], + [18001, 1], + [17993, 0, "t"], + [17994, 0, "w"], + [17995, 0, "o"], + [17996, 0, " "], + [18005, 0, ","], + [18017, 1], + [18016, 1], + [18015, 1], + [18193, 1], + [18192, 1], + [18191, 1], + [18190, 1], + [18189, 1], + [18188, 1], + [18187, 1], + [18186, 1], + [18185, 1], + [18184, 1], + [18183, 1], + [18182, 1], + [18181, 1], + [18180, 1], + [18179, 1], + [18178, 1], + [18177, 1], + [18176, 1], + [18175, 1], + [18174, 1], + [18173, 1], + [18172, 1], + [18171, 1], + [18170, 1], + [18169, 1], + [18168, 1], + [18167, 1], + [18166, 1], + [18165, 1], + [18164, 1], + [18163, 1], + [18162, 1], + [18161, 1], + [18160, 1], + [18159, 1], + [18158, 1], + [18157, 1], + [18156, 1], + [18155, 1], + [18154, 1], + [18153, 1], + [18152, 1], + [18151, 1], + [18150, 1], + [18149, 1], + [18148, 1], + [18147, 1], + [18146, 1], + [18145, 1], + [18144, 1], + [18143, 1], + [18142, 1], + [18141, 1], + [18140, 1], + [18139, 1], + [18138, 1], + [18137, 1], + [18136, 1], + [18135, 1], + [18134, 1], + [18133, 1], + [18132, 1], + [18131, 1], + [18130, 1], + [18129, 1], + [18128, 1], + [18127, 1], + [18126, 1], + [18125, 1], + [18124, 1], + [18123, 1], + [18122, 1], + [18121, 1], + [18120, 1], + [18119, 1], + [18118, 1], + [18117, 1], + [18116, 1], + [18115, 1], + [18114, 1], + [18113, 1], + [18112, 1], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18106, 1], + [18105, 1], + [18104, 1], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18096, 1], + [18095, 1], + [18094, 1], + [18094, 0, "t"], + [18095, 0, "e"], + [18096, 0, " "], + [18097, 0, "l"], + [18098, 0, "o"], + [18099, 0, "c"], + [18100, 0, "a"], + [18101, 0, "l"], + [18102, 0, "l"], + [18103, 0, "y"], + [18104, 0, " "], + [18105, 0, "a"], + [18106, 0, "n"], + [18107, 0, "d"], + [18108, 0, " "], + [18109, 0, "n"], + [18110, 0, "e"], + [18111, 0, "t"], + [18112, 0, "o"], + [18112, 1], + [18112, 0, "w"], + [18113, 0, "o"], + [18114, 0, "r"], + [18115, 0, "k"], + [18116, 0, " "], + [18116, 1], + [18115, 1], + [18114, 1], + [18113, 1], + [18112, 1], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18106, 1], + [18105, 1], + [18104, 1], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18097, 0, "o"], + [18098, 0, "n"], + [18099, 0, " "], + [18100, 0, "t"], + [18101, 0, "h"], + [18102, 0, "e"], + [18103, 0, "i"], + [18104, 0, "r"], + [18105, 0, " "], + [18106, 0, "l"], + [18107, 0, "o"], + [18108, 0, "c"], + [18109, 0, "a"], + [18110, 0, "l"], + [18111, 0, " "], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18106, 1], + [18105, 1], + [18104, 1], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18096, 1], + [18095, 1], + [18094, 1], + [18093, 1], + [18092, 1], + [18091, 1], + [18090, 1], + [18089, 1], + [18088, 1], + [18087, 1], + [18086, 1], + [18085, 1], + [18084, 1], + [18083, 1], + [18082, 1], + [18081, 1], + [18080, 1], + [18079, 1], + [18078, 1], + [18077, 1], + [18076, 1], + [18075, 1], + [18075, 0, "S"], + [18076, 0, "i"], + [18077, 0, "n"], + [18078, 0, "c"], + [18079, 0, "e"], + [18080, 0, " "], + [18081, 0, "r"], + [18082, 0, "e"], + [18083, 0, "p"], + [18084, 0, "l"], + [18085, 0, "i"], + [18086, 0, "c"], + [18087, 0, "a"], + [18088, 0, "s"], + [18089, 0, " "], + [18090, 0, "m"], + [18091, 0, "u"], + [18092, 0, "t"], + [18093, 0, "a"], + [18094, 0, "t"], + [18095, 0, "e"], + [18096, 0, " "], + [18097, 0, "t"], + [18098, 0, "e"], + [18098, 1], + [18098, 0, "h"], + [18099, 0, "e"], + [18100, 0, "i"], + [18101, 0, "r"], + [18102, 0, " "], + [18103, 0, "l"], + [18104, 0, "o"], + [18105, 0, "c"], + [18106, 0, "a"], + [18107, 0, "l"], + [18108, 0, " "], + [18109, 0, "s"], + [18110, 0, "t"], + [18111, 0, "a"], + [18112, 0, "t"], + [18113, 0, "e"], + [18113, 1], + [18112, 1], + [18111, 1], + [18110, 1], + [18109, 1], + [18108, 1], + [18107, 1], + [18106, 1], + [18105, 1], + [18104, 1], + [18103, 1], + [18102, 1], + [18101, 1], + [18100, 1], + [18099, 1], + [18098, 1], + [18097, 1], + [18097, 0, "o"], + [18098, 0, "n"], + [18099, 0, "l"], + [18100, 0, "y"], + [18101, 0, " "], + [18102, 0, "t"], + [18103, 0, "h"], + [18104, 0, "e"], + [18105, 0, "i"], + [18106, 0, "r"], + [18107, 0, " "], + [18108, 0, "l"], + [18109, 0, "o"], + [18110, 0, "c"], + [18111, 0, "a"], + [18112, 0, "l"], + [18113, 0, " "], + [18114, 0, "s"], + [18115, 0, "t"], + [18116, 0, "a"], + [18117, 0, "t"], + [18118, 0, "e"], + [18119, 0, ","], + [18120, 0, " "], + [18121, 0, "e"], + [18122, 0, "n"], + [18122, 1], + [18121, 1], + [18121, 0, "n"], + [18122, 0, "e"], + [18123, 0, "t"], + [18124, 0, "w"], + [18125, 0, "o"], + [18126, 0, "r"], + [18127, 0, "k"], + [18128, 0, " "], + [18128, 1], + [18127, 1], + [18126, 1], + [18125, 1], + [18124, 1], + [18123, 1], + [18122, 1], + [18121, 1], + [18121, 0, "p"], + [18122, 0, "e"], + [18123, 0, "r"], + [18124, 0, "i"], + [18125, 0, "o"], + [18126, 0, "d"], + [18127, 0, "s"], + [18128, 0, " "], + [18129, 0, "o"], + [18130, 0, "d"], + [18131, 0, " "], + [18131, 1], + [18130, 1], + [18130, 0, "f"], + [18131, 0, " "], + [18132, 0, "n"], + [18133, 0, "e"], + [18134, 0, "t"], + [18135, 0, "w"], + [18136, 0, "o"], + [18137, 0, "r"], + [18138, 0, "k"], + [18139, 0, " "], + [18140, 0, "c"], + [18141, 0, "o"], + [18142, 0, "m"], + [18143, 0, "m"], + [18144, 0, "u"], + [18145, 0, "n"], + [18146, 0, "i"], + [18147, 0, "c"], + [18148, 0, "a"], + [18149, 0, "t"], + [18150, 0, "i"], + [18151, 0, "o"], + [18152, 0, "n"], + [18153, 0, " "], + [18154, 0, "a"], + [18155, 0, "r"], + [18155, 1], + [18154, 1], + [18154, 0, "b"], + [18154, 1], + [18153, 1], + [18153, 0, ","], + [18154, 0, " "], + [18155, 0, "w"], + [18156, 0, "h"], + [18157, 0, "e"], + [18158, 0, "n"], + [18159, 0, " "], + [18160, 0, "c"], + [18161, 0, "h"], + [18162, 0, "a"], + [18163, 0, "n"], + [18164, 0, "g"], + [18165, 0, "e"], + [18166, 0, "s"], + [18167, 0, " "], + [18168, 0, "p"], + [18169, 0, "r"], + [18170, 0, "o"], + [18171, 0, "p"], + [18172, 0, "e"], + [18172, 1], + [18172, 0, "a"], + [18173, 0, "g"], + [18174, 0, "e"], + [18174, 1], + [18173, 1], + [18173, 0, "g"], + [18174, 0, "a"], + [18175, 0, "t"], + [18176, 0, "e"], + [18177, 0, " "], + [18178, 0, "b"], + [18179, 0, "e"], + [18180, 0, "t"], + [18181, 0, "w"], + [18182, 0, "e"], + [18183, 0, "e"], + [18184, 0, "n"], + [18185, 0, " "], + [18186, 0, "r"], + [18187, 0, "e"], + [18188, 0, "p"], + [18189, 0, "l"], + [18190, 0, "i"], + [18191, 0, "c"], + [18192, 0, "a"], + [18193, 0, "s"], + [18194, 0, ","], + [18195, 0, " "], + [18196, 0, "a"], + [18197, 0, "r"], + [18198, 0, "e"], + [18199, 0, " "], + [18200, 0, "s"], + [18201, 0, "h"], + [18202, 0, "o"], + [18203, 0, "w"], + [18204, 0, "n"], + [18205, 0, " "], + [18206, 0, "s"], + [18207, 0, "e"], + [18208, 0, "p"], + [18209, 0, "a"], + [18210, 0, "r"], + [18211, 0, "a"], + [18212, 0, "t"], + [18213, 0, "e"], + [18214, 0, "l"], + [18215, 0, "y"], + [18216, 0, " "], + [18217, 0, "o"], + [18218, 0, "n"], + [18219, 0, " "], + [18220, 0, "t"], + [18221, 0, "h"], + [18222, 0, "e"], + [18223, 0, " "], + [18223, 1], + [18222, 1], + [18221, 1], + [18220, 1], + [18219, 1], + [18218, 1], + [18217, 1], + [18217, 0, "i"], + [18218, 0, "n"], + [18219, 0, " "], + [18220, 0, "t"], + [18221, 0, "h"], + [18222, 0, "e"], + [18223, 0, " "], + [18224, 0, "e"], + [18225, 0, "x"], + [18226, 0, "a"], + [18227, 0, "m"], + [18228, 0, "p"], + [18229, 0, "l"], + [18230, 0, "e"], + [18231, 0, "s"], + [18232, 0, "."], + [18073, 1], + [18073, 0, ","], + [18074, 0, " "], + [18075, 0, "w"], + [18076, 0, "i"], + [18077, 0, "t"], + [18078, 0, "h"], + [18079, 0, " "], + [18080, 0, "s"], + [18081, 0, "t"], + [18082, 0, "a"], + [18083, 0, "t"], + [18084, 0, "e"], + [18085, 0, "s"], + [18086, 0, " "], + [18087, 0, "d"], + [18088, 0, "r"], + [18089, 0, "a"], + [18090, 0, "w"], + [18091, 0, "n"], + [18092, 0, " "], + [18092, 1], + [18091, 1], + [18090, 1], + [18089, 1], + [18088, 1], + [18087, 1], + [18086, 1], + [18085, 1], + [18084, 1], + [18083, 1], + [18082, 1], + [18081, 1], + [18080, 1], + [18080, 0, "l"], + [18081, 0, "o"], + [18082, 0, "c"], + [18083, 0, "a"], + [18084, 0, "l"], + [18085, 0, " "], + [18086, 0, "s"], + [18087, 0, "t"], + [18088, 0, "a"], + [18089, 0, "t"], + [18090, 0, "e"], + [18091, 0, " "], + [18092, 0, "d"], + [18092, 1], + [18091, 1], + [18091, 0, " "], + [18092, 0, "d"], + [18093, 0, "r"], + [18094, 0, "a"], + [18095, 0, "w"], + [18096, 0, "n"], + [18097, 0, " "], + [18098, 0, "i"], + [18099, 0, "n"], + [18100, 0, " "], + [18101, 0, "b"], + [18102, 0, "o"], + [18103, 0, "x"], + [18104, 0, "e"], + [18105, 0, "d"], + [18105, 1], + [18105, 0, "s"], + [18106, 0, " "], + [18107, 0, "a"], + [18108, 0, "n"], + [18109, 0, "d"], + [18110, 0, " "], + [18111, 0, "m"], + [18112, 0, "o"], + [18113, 0, "d"], + [18114, 0, "i"], + [18115, 0, "f"], + [18116, 0, "i"], + [18117, 0, "c"], + [18118, 0, "a"], + [18119, 0, "t"], + [18120, 0, "i"], + [18121, 0, "o"], + [18122, 0, "n"], + [18123, 0, "s"], + [18124, 0, " "], + [18125, 0, "s"], + [18126, 0, "h"], + [18127, 0, "o"], + [18128, 0, "w"], + [18129, 0, "n"], + [18130, 0, " "], + [18131, 0, "w"], + [18132, 0, "i"], + [18133, 0, "t"], + [18134, 0, "h"], + [18135, 0, " "], + [18136, 0, "l"], + [18137, 0, "a"], + [18138, 0, "b"], + [18139, 0, "e"], + [18140, 0, "l"], + [18141, 0, "l"], + [18142, 0, "e"], + [18143, 0, "d"], + [18144, 0, " "], + [18145, 0, "s"], + [18146, 0, "l"], + [18147, 0, "o"], + [18147, 1], + [18146, 1], + [18146, 0, "o"], + [18147, 0, "l"], + [18148, 0, "i"], + [18149, 0, "d"], + [18150, 0, " "], + [18151, 0, "a"], + [18152, 0, "r"], + [18153, 0, "r"], + [18154, 0, "o"], + [18155, 0, "w"], + [18156, 0, "s"], + [18157, 0, " "], + [18158, 0, "a"], + [18159, 0, "n"], + [18160, 0, "d"], + [18161, 0, " "], + [18162, 0, "t"], + [18163, 0, "i"], + [18164, 0, "m"], + [18165, 0, "e"], + [18166, 0, " "], + [18167, 0, "r"], + [18168, 0, "u"], + [18169, 0, "n"], + [18170, 0, "n"], + [18171, 0, "i"], + [18172, 0, "n"], + [18173, 0, "g"], + [18174, 0, " "], + [18175, 0, "d"], + [18176, 0, "o"], + [18177, 0, "w"], + [18178, 0, "n"], + [18179, 0, " "], + [18180, 0, "t"], + [18181, 0, "h"], + [18182, 0, "e"], + [18183, 0, " "], + [18184, 0, "a"], + [18185, 0, "p"], + [18186, 0, "g"], + [18187, 0, "e"], + [18188, 0, "."], + [18188, 1], + [18187, 1], + [18186, 1], + [18185, 1], + [18184, 1], + [18184, 0, "p"], + [18185, 0, "a"], + [18186, 0, "g"], + [18187, 0, "e"], + [18188, 0, "."], + [18222, 1], + [18221, 1], + [18220, 1], + [18219, 1], + [18218, 1], + [18217, 1], + [18216, 1], + [18215, 1], + [18214, 1], + [18213, 1], + [18212, 1], + [18211, 1], + [18211, 0, " "], + [18205, 0, "o"], + [18206, 0, "n"], + [18207, 0, "l"], + [18208, 0, "y"], + [18209, 0, " "], + [18228, 1], + [18228, 0, ","], + [18229, 0, " "], + [18125, 0, "t"], + [18126, 0, "o"], + [18127, 0, " "], + [18128, 0, "l"], + [18129, 0, "o"], + [18130, 0, "c"], + [18131, 0, "a"], + [18132, 0, "l"], + [18133, 0, " "], + [18134, 0, "s"], + [18135, 0, "t"], + [18136, 0, "a"], + [18137, 0, "t"], + [18138, 0, " "], + [18138, 1], + [18138, 0, "e"], + [18139, 0, " "], + [18175, 1], + [18174, 1], + [18173, 1], + [18172, 1], + [18172, 0, ";"], + [18185, 1], + [18184, 1], + [18183, 1], + [18182, 1], + [18182, 0, "s"], + [18238, 0, " "], + [18239, 0, "c"], + [18240, 0, "o"], + [18241, 0, "m"], + [18242, 0, "m"], + [18243, 0, "u"], + [18244, 0, "n"], + [18245, 0, "i"], + [18246, 0, "c"], + [18247, 0, "a"], + [18248, 0, "t"], + [18249, 0, "i"], + [18250, 0, "o"], + [18251, 0, "n"], + [18252, 0, " "], + [18253, 0, "o"], + [18254, 0, "f"], + [18255, 0, " "], + [18256, 0, "t"], + [18257, 0, "h"], + [18258, 0, "e"], + [18259, 0, "s"], + [18260, 0, "e"], + [18261, 0, " "], + [18262, 0, "c"], + [18263, 0, "h"], + [18264, 0, "a"], + [18265, 0, "n"], + [18266, 0, "g"], + [18267, 0, "e"], + [18268, 0, "s"], + [18269, 0, " "], + [18270, 0, "i"], + [18271, 0, "s"], + [18272, 0, " "], + [18078, 1], + [18077, 1], + [18076, 1], + [18075, 1], + [18074, 1], + [18073, 1], + [18073, 0, "."], + [18074, 0, " "], + [18077, 1], + [18076, 1], + [18075, 1], + [18075, 0, "L"], + [18076, 0, "o"], + [18087, 0, "f"], + [18088, 0, "o"], + [18089, 0, "r"], + [18090, 0, " "], + [18091, 0, "a"], + [18092, 0, " "], + [18093, 0, "r"], + [18094, 0, "e"], + [18095, 0, "p"], + [18096, 0, "l"], + [18097, 0, "i"], + [18098, 0, "c"], + [18099, 0, "a"], + [18100, 0, " "], + [18101, 0, "i"], + [18102, 0, "s"], + [18103, 0, " "], + [18285, 0, "e"], + [18286, 0, "x"], + [18287, 0, "m"], + [18288, 0, "p"], + [18289, 0, "l"], + [18289, 1], + [18288, 1], + [18287, 1], + [18287, 0, "p"], + [18288, 0, "i"], + [18289, 0, "c"], + [18290, 0, "i"], + [18291, 0, "t"], + [18291, 1], + [18290, 1], + [18289, 1], + [18288, 1], + [18287, 1], + [18287, 0, "p"], + [18288, 0, "l"], + [18289, 0, "i"], + [18290, 0, "c"], + [18291, 0, "i"], + [18292, 0, "t"], + [18293, 0, " "], + [18294, 0, "i"], + [18295, 0, "n"], + [18296, 0, " "], + [18297, 0, "o"], + [18298, 0, "u"], + [18299, 0, "r"], + [18300, 0, " "], + [18301, 0, "m"], + [18302, 0, "o"], + [18303, 0, "d"], + [18304, 0, "e"], + [18305, 0, "l"], + [18306, 0, " "], + [18307, 0, "a"], + [18308, 0, "n"], + [18309, 0, "d"], + [18310, 0, " "], + [18311, 0, "i"], + [18312, 0, "s"], + [18313, 0, " "], + [18314, 0, "s"], + [18315, 0, "h"], + [18316, 0, "o"], + [18317, 0, "w"], + [18318, 0, "n"], + [18319, 0, " "], + [18320, 0, "w"], + [18321, 0, "i"], + [18322, 0, "t"], + [18323, 0, "h"], + [18324, 0, " "], + [18324, 1], + [18323, 1], + [18322, 1], + [18321, 1], + [18320, 1], + [18319, 1], + [18318, 1], + [18317, 1], + [18316, 1], + [18315, 1], + [18314, 1], + [18314, 0, "d"], + [18315, 0, "e"], + [18316, 0, "p"], + [18317, 0, "i"], + [18318, 0, "c"], + [18319, 0, "t"], + [18320, 0, "e"], + [18321, 0, "d"], + [18322, 0, " "], + [18323, 0, "w"], + [18324, 0, "i"], + [18325, 0, "t"], + [18326, 0, "h"], + [18327, 0, " "], + [18328, 0, "d"], + [18329, 0, "a"], + [18330, 0, "s"], + [18331, 0, "h"], + [18332, 0, "e"], + [18333, 0, "d"], + [18334, 0, " "], + [18335, 0, "a"], + [18336, 0, "r"], + [18337, 0, "r"], + [18338, 0, "o"], + [18339, 0, "w"], + [18340, 0, "s"], + [18341, 0, "."], + [18342, 0, "\n"], + [18343, 0, "\n"], + [18457, 1], + [18456, 1], + [18455, 1], + [18454, 1], + [18453, 1], + [18452, 1], + [18451, 1], + [18450, 1], + [18449, 1], + [18448, 1], + [18447, 1], + [18446, 1], + [18445, 1], + [18444, 1], + [18443, 1], + [18442, 1], + [18441, 1], + [18440, 1], + [18439, 1], + [18438, 1], + [18437, 1], + [18436, 1], + [18435, 1], + [18434, 1], + [18433, 1], + [18432, 1], + [18431, 1], + [18430, 1], + [18429, 1], + [18428, 1], + [18427, 1], + [18426, 1], + [18425, 1], + [18424, 1], + [18423, 1], + [18422, 1], + [18421, 1], + [18420, 1], + [18419, 1], + [18418, 1], + [18417, 1], + [18416, 1], + [18415, 1], + [18414, 1], + [18413, 1], + [18412, 1], + [18411, 1], + [18410, 1], + [18409, 1], + [18408, 1], + [18407, 1], + [18406, 1], + [18405, 1], + [18404, 1], + [18403, 1], + [18402, 1], + [18401, 1], + [18400, 1], + [18399, 1], + [18398, 1], + [18397, 1], + [18396, 1], + [18395, 1], + [18394, 1], + [18393, 1], + [18392, 1], + [18391, 1], + [18390, 1], + [18389, 1], + [18388, 1], + [18387, 1], + [18386, 1], + [18385, 1], + [18384, 1], + [18383, 1], + [18382, 1], + [18381, 1], + [18380, 1], + [18379, 1], + [18378, 1], + [18377, 1], + [18376, 1], + [18375, 1], + [18374, 1], + [18373, 1], + [18372, 1], + [18371, 1], + [18370, 1], + [18369, 1], + [18368, 1], + [18367, 1], + [18366, 1], + [18365, 1], + [18364, 1], + [18363, 1], + [18362, 1], + [18361, 1], + [18360, 1], + [18359, 1], + [18358, 1], + [18357, 1], + [18356, 1], + [18355, 1], + [18354, 1], + [18353, 1], + [18352, 1], + [18351, 1], + [18350, 1], + [18349, 1], + [18348, 1], + [18347, 1], + [18346, 1], + [18345, 1], + [18344, 1], + [18343, 1], + [18342, 1], + [18272, 1], + [18271, 1], + [18279, 0, " "], + [18280, 0, "t"], + [18281, 0, "o"], + [18282, 0, " "], + [18283, 0, "l"], + [18284, 0, "o"], + [18285, 0, "c"], + [18286, 0, "a"], + [18287, 0, "l"], + [18288, 0, " "], + [18289, 0, "s"], + [18290, 0, "t"], + [18291, 0, "a"], + [18292, 0, "t"], + [18293, 0, "e"], + [18294, 0, " "], + [18295, 0, "b"], + [18296, 0, "e"], + [18297, 0, "t"], + [18298, 0, "w"], + [18299, 0, "e"], + [18299, 1], + [18298, 1], + [18297, 1], + [18296, 1], + [18295, 1], + [18294, 1], + [18293, 1], + [18293, 0, "e"], + [18264, 0, " "], + [18265, 0, "b"], + [18266, 0, "e"], + [18267, 0, "t"], + [18268, 0, "w"], + [18269, 0, "e"], + [18270, 0, "e"], + [18271, 0, "n"], + [18272, 0, " "], + [18273, 0, "r"], + [18274, 0, "e"], + [18275, 0, "p"], + [18276, 0, "l"], + [18277, 0, "i"], + [18278, 0, "c"], + [18279, 0, "a"], + [18280, 0, "s"], + [18643, 0, " "], + [18644, 0, "v"], + [18645, 0, "i"], + [18646, 0, "a"], + [18647, 0, " "], + [18648, 0, "n"], + [18649, 0, "e"], + [18650, 0, "t"], + [18651, 0, "w"], + [18652, 0, "o"], + [18653, 0, "r"], + [18654, 0, "k"], + [18655, 0, " "], + [18656, 0, "c"], + [18657, 0, "o"], + [18658, 0, "m"], + [18659, 0, "m"], + [18660, 0, "u"], + [18661, 0, "n"], + [18662, 0, "i"], + [18663, 0, "c"], + [18664, 0, "a"], + [18665, 0, "t"], + [18666, 0, "i"], + [18667, 0, "o"], + [18668, 0, "n"], + [19213, 0, " "], + [19214, 0, "t"], + [19215, 0, "h"], + [19216, 0, "e"], + [19217, 0, " "], + [19218, 0, "d"], + [19219, 0, "e"], + [19220, 0, "v"], + [19221, 0, "e"], + [19222, 0, "l"], + [19223, 0, "o"], + [19224, 0, "p"], + [19225, 0, "e"], + [19226, 0, "r"], + [19227, 0, " "], + [19228, 0, "i"], + [19229, 0, "n"], + [19230, 0, " "], + [19231, 0, "a"], + [19232, 0, "u"], + [19233, 0, "t"], + [19234, 0, "o"], + [19235, 0, "m"], + [19236, 0, "a"], + [19237, 0, "t"], + [19238, 0, "i"], + [19239, 0, "c"], + [19240, 0, "a"], + [19241, 0, "l"], + [19242, 0, "l"], + [19243, 0, "y"], + [19244, 0, " "], + [19245, 0, "r"], + [19246, 0, "e"], + [19247, 0, "s"], + [19248, 0, "o"], + [19249, 0, "l"], + [19250, 0, "v"], + [19251, 0, "i"], + [19252, 0, "n"], + [19253, 0, "g"], + [19254, 0, " "], + [19255, 0, "s"], + [19256, 0, "u"], + [19257, 0, "c"], + [19258, 0, "h"], + [19259, 0, " "], + [19260, 0, "c"], + [19261, 0, "o"], + [19262, 0, "n"], + [19263, 0, "f"], + [19264, 0, "i"], + [19265, 0, "c"], + [19265, 1], + [19264, 1], + [19264, 0, "l"], + [19265, 0, "i"], + [19266, 0, "c"], + [19267, 0, "s"], + [19268, 0, "t"], + [19268, 1], + [19267, 1], + [19267, 0, "t"], + [19268, 0, "s"], + [19269, 0, " "], + [19270, 0, "o"], + [19271, 0, "r"], + [19272, 0, " "], + [19273, 0, "p"], + [19274, 0, "t"], + [19275, 0, "e"], + [19276, 0, "n"], + [19276, 1], + [19275, 1], + [19274, 1], + [19274, 0, "o"], + [19275, 0, "t"], + [19276, 0, "e"], + [19277, 0, "n"], + [19278, 0, "t"], + [19279, 0, "i"], + [19280, 0, "a"], + [19281, 0, "l"], + [19282, 0, "l"], + [19283, 0, "y"], + [19284, 0, " "], + [19285, 0, "d"], + [19286, 0, "e"], + [19287, 0, "f"], + [19288, 0, "e"], + [19289, 0, "r"], + [19290, 0, "i"], + [19291, 0, "n"], + [19292, 0, "g"], + [19293, 0, " "], + [19294, 0, "t"], + [19295, 0, "o"], + [19306, 1], + [19305, 1], + [19304, 1], + [19303, 1], + [19303, 0, "f"], + [19304, 0, "o"], + [19305, 0, "r"], + [19313, 0, " "], + [19314, 0, "r"], + [19315, 0, "e"], + [19316, 0, "o"], + [19317, 0, "l"], + [19317, 1], + [19316, 1], + [19316, 0, "s"], + [19317, 0, "o"], + [19318, 0, "l"], + [19319, 0, "i"], + [19319, 1], + [19319, 0, "u"], + [19320, 0, "t"], + [19321, 0, "i"], + [19322, 0, "o"], + [19323, 0, "n"], + [19324, 0, "."], + [19325, 0, "\n"], + [19351, 1], + [19350, 1], + [19349, 1], + [19348, 1], + [19347, 1], + [19346, 1], + [19345, 1], + [19344, 1], + [19343, 1], + [19342, 1], + [19341, 1], + [19340, 1], + [19339, 1], + [19338, 1], + [19337, 1], + [19336, 1], + [19335, 1], + [19334, 1], + [19333, 1], + [19332, 1], + [19331, 1], + [19330, 1], + [19329, 1], + [19328, 1], + [19327, 1], + [19326, 1], + [19325, 1], + [19269, 0, " "], + [19270, 0, "i"], + [19271, 0, "n"], + [19272, 0, " "], + [19273, 0, "a"], + [19274, 0, "n"], + [19275, 0, " "], + [19276, 0, "a"], + [19277, 0, "p"], + [19278, 0, "p"], + [19279, 0, "l"], + [19280, 0, "i"], + [19281, 0, "c"], + [19282, 0, "a"], + [19283, 0, "t"], + [19284, 0, "i"], + [19285, 0, "o"], + [19286, 0, "n"], + [19287, 0, "-"], + [19288, 0, "s"], + [19289, 0, "p"], + [19290, 0, "e"], + [19291, 0, "c"], + [19292, 0, "i"], + [19293, 0, "f"], + [19294, 0, "i"], + [19295, 0, "c"], + [19296, 0, " "], + [19297, 0, "w"], + [19298, 0, "a"], + [19299, 0, "y"], + [19300, 0, ","], + [19315, 1], + [19314, 1], + [19313, 1], + [19312, 1], + [19311, 1], + [19310, 1], + [19309, 1], + [19308, 1], + [19307, 1], + [19306, 1], + [19305, 1], + [19304, 1], + [19309, 0, "r"], + [18504, 1], + [18503, 1], + [18502, 1], + [18501, 1], + [18509, 0, " "], + [18510, 0, "$"], + [18511, 0, "p"], + [18512, 0, "$"], + [18567, 1], + [18566, 1], + [18565, 1], + [18564, 1], + [18563, 1], + [18562, 1], + [18561, 1], + [18561, 0, "r"], + [18562, 0, "e"], + [18563, 0, "p"], + [18564, 0, "l"], + [18565, 0, "i"], + [18566, 0, "c"], + [18567, 0, "a"], + [18568, 0, " "], + [18569, 0, "$"], + [18570, 0, "q"], + [18571, 0, "$"], + [18250, 0, " "], + [18251, 0, "w"], + [18252, 0, "e"], + [18253, 0, " "], + [18254, 0, "m"], + [18255, 0, "a"], + [18256, 0, "k"], + [18257, 0, "e"], + [18273, 0, "o"], + [18274, 0, "f"], + [18275, 0, " "], + [18276, 0, "s"], + [18277, 0, "t"], + [18278, 0, "a"], + [18279, 0, "t"], + [18280, 0, "e"], + [18281, 0, " "], + [18282, 0, "c"], + [18283, 0, "a"], + [18284, 0, "h"], + [18284, 1], + [18283, 1], + [18283, 0, "h"], + [18284, 0, "a"], + [18285, 0, "n"], + [18286, 0, "g"], + [18287, 0, "e"], + [18288, 0, "s"], + [18289, 0, " "], + [18338, 1], + [18337, 1], + [18336, 1], + [18335, 1], + [18334, 1], + [18333, 1], + [18332, 1], + [18331, 1], + [18330, 1], + [18329, 1], + [18328, 1], + [18327, 1], + [18326, 1], + [18325, 1], + [18324, 1], + [18323, 1], + [18322, 1], + [18321, 1], + [18320, 1], + [18319, 1], + [18318, 1], + [18317, 1], + [18316, 1], + [18315, 1], + [18314, 1], + [18313, 1], + [18312, 1], + [18311, 1], + [18310, 1], + [18309, 1], + [18308, 1], + [18307, 1], + [18306, 1], + [18328, 0, "."], + [18332, 1], + [18331, 1], + [18330, 1], + [18330, 0, "T"], + [18331, 0, "h"], + [18332, 0, "i"], + [18333, 0, "s"], + [18333, 1], + [18332, 1], + [18331, 1], + [18330, 1], + [18330, 0, "N"], + [18331, 0, "e"], + [18332, 0, "t"], + [18333, 0, "o"], + [18333, 1], + [18333, 0, "w"], + [18334, 0, "o"], + [18335, 0, "r"], + [18336, 0, "k"], + [18337, 0, " "], + [18338, 0, "c"], + [18339, 0, "o"], + [18340, 0, "m"], + [18341, 0, "m"], + [18342, 0, "u"], + [18343, 0, "n"], + [18344, 0, "i"], + [18345, 0, "c"], + [18346, 0, "a"], + [18347, 0, "t"], + [18348, 0, "i"], + [18349, 0, "o"], + [18350, 0, "n"], + [17792, 1], + [17791, 1], + [17799, 0, " "], + [17800, 0, "\\"], + [17801, 0, "{"], + [17802, 0, "`"], + [17803, 0, "`"], + [17804, 0, "k"], + [17805, 0, "e"], + [17806, 0, "y"], + [17807, 0, "'"], + [17808, 0, "'"], + [17809, 0, ":"], + [17810, 0, " "], + [17811, 0, "`"], + [17812, 0, "`"], + [17813, 0, "A"], + [17814, 0, "'"], + [17815, 0, "'"], + [17816, 0, "\\"], + [17817, 0, "}"], + [17817, 1], + [17816, 1], + [17815, 1], + [17814, 1], + [17813, 1], + [17812, 1], + [17811, 1], + [17810, 1], + [17809, 1], + [17808, 1], + [17807, 1], + [17806, 1], + [17805, 1], + [17804, 1], + [17803, 1], + [17802, 1], + [17801, 1], + [17800, 1], + [17800, 0, "a"], + [17801, 0, "t"], + [17802, 0, " "], + [17802, 1], + [17801, 1], + [17800, 1], + [17799, 1], + [17798, 1], + [17797, 1], + [17796, 1], + [17795, 1], + [17794, 1], + [17793, 1], + [17792, 1], + [17791, 1], + [17791, 0, "t"], + [17792, 0, "h"], + [17793, 0, "e"], + [17794, 0, " "], + [17795, 0, "r"], + [17796, 0, "e"], + [17797, 0, "g"], + [17798, 0, "i"], + [17799, 0, "s"], + [17800, 0, "t"], + [17801, 0, "e"], + [17802, 0, "r"], + [17803, 0, " "], + [17804, 0, "a"], + [17805, 0, "t"], + [17806, 0, " "], + [17807, 0, "d"], + [17808, 0, "o"], + [17809, 0, "c"], + [17810, 0, "["], + [17811, 0, "`"], + [17812, 0, "`"], + [17813, 0, "k"], + [17814, 0, "e"], + [17815, 0, "y"], + [17816, 0, "'"], + [17817, 0, "'"], + [17818, 0, "]"], + [17819, 0, " "], + [17820, 0, "b"], + [17821, 0, "y"], + [17822, 0, " "], + [17823, 0, "r"], + [17824, 0, "e"], + [17825, 0, "g"], + [17826, 0, "i"], + [17827, 0, "s"], + [17828, 0, "t"], + [17829, 0, "e"], + [17830, 0, "r"], + [17830, 1], + [17829, 1], + [17828, 1], + [17827, 1], + [17826, 1], + [17825, 1], + [17825, 0, "p"], + [17826, 0, "l"], + [17827, 0, "i"], + [17828, 0, "c"], + [17829, 0, "a"], + [17830, 0, "s"], + [17831, 0, " "], + [17832, 0, "$"], + [17833, 0, "p"], + [17834, 0, "$"], + [17835, 0, " "], + [17836, 0, "a"], + [17837, 0, "n"], + [17838, 0, "d"], + [17839, 0, " "], + [17840, 0, "$"], + [17841, 0, "q"], + [17842, 0, "$"], + [15776, 0, "i"], + [15776, 1], + [15776, 0, " "], + [15777, 0, "F"], + [15778, 0, "o"], + [15779, 0, "r"], + [15780, 0, " "], + [15781, 0, "e"], + [15782, 0, "x"], + [15783, 0, "a"], + [15784, 0, "m"], + [15785, 0, "p"], + [15786, 0, "l"], + [15787, 0, "e"], + [15788, 0, ","], + [15789, 0, " "], + [15790, 0, "c"], + [15791, 0, "o"], + [15792, 0, "n"], + [15793, 0, "c"], + [15794, 0, "u"], + [15795, 0, "r"], + [15796, 0, "r"], + [15797, 0, "e"], + [15798, 0, "n"], + [15799, 0, "t"], + [15800, 0, " "], + [15801, 0, "e"], + [15802, 0, "d"], + [15803, 0, "i"], + [15804, 0, "t"], + [15805, 0, " "], + [15805, 1], + [15805, 0, "s"], + [15806, 0, " "], + [15807, 0, "t"], + [15808, 0, "o"], + [15809, 0, " "], + [15810, 0, "a"], + [15811, 0, " "], + [15812, 0, "p"], + [15813, 0, "a"], + [15814, 0, "s"], + [15815, 0, "s"], + [15816, 0, "w"], + [15817, 0, "o"], + [15818, 0, "r"], + [15819, 0, "d"], + [15820, 0, " "], + [15821, 0, "m"], + [15822, 0, "a"], + [15823, 0, "n"], + [15824, 0, "a"], + [15825, 0, "g"], + [15826, 0, "e"], + [15827, 0, " "], + [15827, 1], + [15827, 0, "r"], + [15828, 0, " "], + [15829, 0, "o"], + [15830, 0, "n"], + [15831, 0, " "], + [15832, 0, "t"], + [15833, 0, "w"], + [15834, 0, "o"], + [15835, 0, " "], + [15836, 0, "d"], + [15837, 0, "e"], + [15838, 0, "v"], + [15839, 0, "i"], + [15840, 0, "c"], + [15841, 0, "e"], + [15842, 0, "s"], + [15842, 1], + [15841, 1], + [15840, 1], + [15839, 1], + [15838, 1], + [15837, 1], + [15836, 1], + [15835, 1], + [15834, 1], + [15833, 1], + [15832, 1], + [15831, 1], + [15830, 1], + [15829, 1], + [15828, 1], + [15827, 1], + [15826, 1], + [15825, 1], + [15824, 1], + [15823, 1], + [15822, 1], + [15821, 1], + [15820, 1], + [15819, 1], + [15818, 1], + [15817, 1], + [15816, 1], + [15815, 1], + [15814, 1], + [15813, 1], + [15812, 1], + [15811, 1], + [15810, 1], + [15809, 1], + [15808, 1], + [15807, 1], + [15806, 1], + [15805, 1], + [15804, 1], + [15803, 1], + [15802, 1], + [15801, 1], + [15800, 1], + [15799, 1], + [15798, 1], + [15797, 1], + [15796, 1], + [15795, 1], + [15794, 1], + [15793, 1], + [15792, 1], + [15791, 1], + [15790, 1], + [15789, 1], + [15788, 1], + [15787, 1], + [15786, 1], + [15785, 1], + [15784, 1], + [15783, 1], + [15782, 1], + [15781, 1], + [15780, 1], + [15779, 1], + [15778, 1], + [15777, 1], + [15776, 1], + [26009, 1], + [26008, 1], + [26007, 1], + [26006, 1], + [26005, 1], + [26004, 1], + [26003, 1], + [26002, 1], + [26001, 1], + [26184, 0, " "], + [26185, 0, "W"], + [26186, 0, "e"], + [26187, 0, " "], + [26188, 0, "l"], + [26189, 0, "e"], + [26190, 0, "a"], + [26191, 0, "v"], + [26192, 0, "e"], + [26193, 0, " "], + [26194, 0, "t"], + [26195, 0, "e"], + [26195, 1], + [26195, 0, "h"], + [26196, 0, "e"], + [26197, 0, " "], + [26198, 0, "d"], + [26199, 0, "e"], + [26200, 0, "s"], + [26201, 0, "i"], + [26202, 0, "g"], + [26203, 0, "n"], + [26204, 0, " "], + [26205, 0, "o"], + [26206, 0, "f"], + [26207, 0, " "], + [26208, 0, "a"], + [26208, 1], + [26208, 0, "s"], + [26209, 0, "u"], + [26210, 0, "c"], + [26211, 0, "h"], + [26212, 0, " "], + [26213, 0, "a"], + [26214, 0, " "], + [26215, 0, "a"], + [26216, 0, "s"], + [26217, 0, "c"], + [26218, 0, "h"], + [26219, 0, "e"], + [26220, 0, "m"], + [26220, 1], + [26219, 1], + [26218, 1], + [26217, 1], + [26216, 1], + [26215, 1], + [26215, 0, "s"], + [26216, 0, "c"], + [26217, 0, "h"], + [26218, 0, "e"], + [26219, 0, "m"], + [26220, 0, "a"], + [26221, 0, " "], + [26222, 0, "l"], + [26223, 0, "a"], + [26224, 0, "n"], + [26225, 0, "a"], + [26226, 0, "g"], + [26227, 0, "u"], + [26227, 1], + [26226, 1], + [26225, 1], + [26225, 0, "g"], + [26226, 0, "u"], + [26227, 0, "a"], + [26228, 0, "g"], + [26229, 0, "e"], + [26230, 0, " "], + [26231, 0, "t"], + [26231, 1], + [26231, 0, "a"], + [26232, 0, "s"], + [26233, 0, " "], + [26234, 0, "f"], + [26235, 0, "u"], + [26236, 0, "t"], + [26237, 0, "u"], + [26238, 0, "r"], + [26239, 0, "e"], + [26240, 0, " "], + [26241, 0, "w"], + [26242, 0, "o"], + [26243, 0, "r"], + [26244, 0, "k"], + [26245, 0, "."], + [26197, 0, " "], + [26198, 0, "a"], + [26199, 0, "n"], + [26200, 0, "a"], + [26201, 0, "l"], + [26202, 0, "y"], + [26203, 0, "s"], + [26204, 0, "i"], + [26205, 0, "s"], + [26206, 0, " "], + [26207, 0, "o"], + [26208, 0, "f"], + [26209, 0, " "], + [26210, 0, "w"], + [26211, 0, "h"], + [26212, 0, "e"], + [26213, 0, "t"], + [26214, 0, "h"], + [26215, 0, "e"], + [26216, 0, "r"], + [26217, 0, " "], + [26218, 0, "e"], + [26219, 0, "x"], + [26220, 0, "["], + [26221, 0, "l"], + [26221, 1], + [26220, 1], + [26220, 0, "p"], + [26221, 0, "l"], + [26222, 0, "c"], + [26223, 0, "i"], + [26223, 1], + [26222, 1], + [26222, 0, "i"], + [26223, 0, "c"], + [26224, 0, "i"], + [26225, 0, "t"], + [26226, 0, " "], + [26226, 1], + [26225, 1], + [26224, 1], + [26223, 1], + [26222, 1], + [26221, 1], + [26220, 1], + [26219, 1], + [26218, 1], + [26217, 1], + [26216, 1], + [26215, 1], + [26214, 1], + [26213, 1], + [26212, 1], + [26211, 1], + [26210, 1], + [26209, 1], + [26208, 1], + [26207, 1], + [26207, 0, "a"], + [26208, 0, "n"], + [26209, 0, "d"], + [26210, 0, " "], + [26210, 1], + [26206, 0, " "], + [26207, 0, "o"], + [26208, 0, "f"], + [26209, 0, " "], + [26210, 0, "d"], + [26211, 0, "e"], + [26212, 0, "v"], + [26213, 0, "e"], + [26214, 0, "l"], + [26215, 0, "o"], + [26216, 0, "p"], + [26217, 0, "e"], + [26218, 0, "r"], + [26219, 0, " "], + [26220, 0, "e"], + [26221, 0, "x"], + [26222, 0, "p"], + [26223, 0, "e"], + [26224, 0, "c"], + [26225, 0, "t"], + [26226, 0, "a"], + [26227, 0, "t"], + [26228, 0, "i"], + [26229, 0, "o"], + [26230, 0, "n"], + [26235, 0, " "], + [26236, 0, "t"], + [26237, 0, "h"], + [26238, 0, "e"], + [26238, 1], + [26237, 1], + [26236, 1], + [26235, 1], + [26249, 1], + [26248, 1], + [26247, 1], + [26246, 1], + [26245, 1], + [26244, 1], + [26243, 1], + [26242, 1], + [26241, 1], + [26240, 1], + [26239, 1], + [26238, 1], + [26237, 1], + [26236, 1], + [26236, 0, "t"], + [26237, 0, "h"], + [26238, 0, "e"], + [26239, 0, " "], + [26240, 0, "n"], + [26241, 0, "e"], + [26242, 0, "e"], + [26243, 0, "d"], + [26244, 0, " "], + [26245, 0, "f"], + [26246, 0, "o"], + [26247, 0, "r"], + [26248, 0, " "], + [26249, 0, "s"], + [26250, 0, "u"], + [26251, 0, "c"], + [26252, 0, "h"], + [26231, 0, "s"], + [26245, 0, " "], + [26246, 0, "("], + [26247, 0, "o"], + [26248, 0, "r"], + [26249, 0, " "], + [26250, 0, "o"], + [26251, 0, "t"], + [26252, 0, "h"], + [26253, 0, "e"], + [26254, 0, "r"], + [26255, 0, "w"], + [26256, 0, "i"], + [26257, 0, "s"], + [26258, 0, "e"], + [26259, 0, ")"], + [26268, 1], + [26267, 1], + [26266, 1], + [26265, 1], + [26264, 1], + [26556, 1], + [26555, 1], + [26554, 1], + [26553, 1], + [26552, 1], + [26551, 1], + [26550, 1], + [26549, 1], + [26548, 1], + [26547, 1], + [26546, 1], + [26545, 1], + [26544, 1], + [26543, 1], + [26542, 1], + [26541, 1], + [26540, 1], + [26539, 1], + [26538, 1], + [26537, 1], + [26536, 1], + [26535, 1], + [26534, 1], + [26533, 1], + [26532, 1], + [26531, 1], + [26530, 1], + [26529, 1], + [26528, 1], + [26527, 1], + [26526, 1], + [26525, 1], + [26524, 1], + [26523, 1], + [26522, 1], + [26521, 1], + [26520, 1], + [26519, 1], + [26518, 1], + [26517, 1], + [26516, 1], + [26515, 1], + [26514, 1], + [26513, 1], + [26512, 1], + [26511, 1], + [26510, 1], + [26509, 1], + [26508, 1], + [26507, 1], + [26506, 1], + [26505, 1], + [26504, 1], + [26503, 1], + [26502, 1], + [26501, 1], + [26500, 1], + [26499, 1], + [26498, 1], + [26497, 1], + [26496, 1], + [26495, 1], + [26494, 1], + [26493, 1], + [26492, 1], + [26491, 1], + [26490, 1], + [26489, 1], + [26488, 1], + [26487, 1], + [26486, 1], + [26485, 1], + [26484, 1], + [26483, 1], + [26482, 1], + [26481, 1], + [26480, 1], + [26479, 1], + [26478, 1], + [26477, 1], + [26476, 1], + [26475, 1], + [26474, 1], + [26473, 1], + [26472, 1], + [26471, 1], + [26470, 1], + [26469, 1], + [26468, 1], + [26467, 1], + [26466, 1], + [26465, 1], + [26464, 1], + [26463, 1], + [26462, 1], + [26461, 1], + [26460, 1], + [26459, 1], + [26458, 1], + [26457, 1], + [26456, 1], + [26455, 1], + [26454, 1], + [26453, 1], + [26452, 1], + [26451, 1], + [26450, 1], + [26449, 1], + [26448, 1], + [26447, 1], + [26446, 1], + [26445, 1], + [26444, 1], + [26443, 1], + [26442, 1], + [26441, 1], + [26440, 1], + [26439, 1], + [26438, 1], + [26437, 1], + [26436, 1], + [26435, 1], + [26434, 1], + [26433, 1], + [26432, 1], + [26431, 1], + [26430, 1], + [26429, 1], + [26428, 1], + [26427, 1], + [26426, 1], + [26425, 1], + [26424, 1], + [26423, 1], + [26422, 1], + [26421, 1], + [26420, 1], + [26419, 1], + [26418, 1], + [26417, 1], + [26416, 1], + [26415, 1], + [26414, 1], + [26413, 1], + [26412, 1], + [26411, 1], + [26410, 1], + [26409, 1], + [26408, 1], + [26407, 1], + [26406, 1], + [26405, 1], + [26404, 1], + [26403, 1], + [26402, 1], + [26401, 1], + [26400, 1], + [26399, 1], + [26398, 1], + [26397, 1], + [26396, 1], + [26395, 1], + [26394, 1], + [26393, 1], + [26392, 1], + [26391, 1], + [26390, 1], + [26389, 1], + [26388, 1], + [26387, 1], + [26386, 1], + [26385, 1], + [26384, 1], + [26383, 1], + [26382, 1], + [26381, 1], + [26380, 1], + [26379, 1], + [26378, 1], + [26377, 1], + [26376, 1], + [26375, 1], + [26374, 1], + [26373, 1], + [26372, 1], + [26371, 1], + [26370, 1], + [26369, 1], + [26368, 1], + [26367, 1], + [26366, 1], + [26365, 1], + [26364, 1], + [26363, 1], + [26362, 1], + [26361, 1], + [26360, 1], + [26359, 1], + [26358, 1], + [26357, 1], + [26356, 1], + [26355, 1], + [26354, 1], + [26353, 1], + [26352, 1], + [26351, 1], + [26350, 1], + [26349, 1], + [26348, 1], + [26347, 1], + [26346, 1], + [26345, 1], + [26344, 1], + [26343, 1], + [26342, 1], + [26341, 1], + [26340, 1], + [26339, 1], + [26338, 1], + [26337, 1], + [26336, 1], + [26335, 1], + [26334, 1], + [26333, 1], + [26332, 1], + [26331, 1], + [26330, 1], + [26329, 1], + [26328, 1], + [26327, 1], + [26326, 1], + [26325, 1], + [26324, 1], + [26323, 1], + [26322, 1], + [26321, 1], + [26320, 1], + [26319, 1], + [26318, 1], + [26317, 1], + [26316, 1], + [26315, 1], + [26314, 1], + [26313, 1], + [26312, 1], + [26311, 1], + [26310, 1], + [26309, 1], + [26308, 1], + [26307, 1], + [26306, 1], + [26305, 1], + [26304, 1], + [26303, 1], + [26302, 1], + [26301, 1], + [26300, 1], + [26299, 1], + [26298, 1], + [28220, 1], + [28219, 1], + [28218, 1], + [28217, 1], + [28216, 1], + [28216, 0, "$"], + [28217, 0, "$"], + [28217, 0, "\\"], + [28218, 0, "m"], + [28219, 0, "a"], + [28220, 0, "t"], + [28221, 0, "h"], + [28222, 0, "t"], + [28223, 0, "t"], + [28224, 0, "{"], + [28225, 0, "k"], + [28226, 0, "e"], + [28227, 0, "y"], + [28228, 0, "}"], + [28214, 1], + [28213, 1], + [28212, 1], + [28211, 1], + [28210, 1], + [28209, 1], + [28209, 1], + [28210, 0, "["], + [28223, 0, "["], + [28226, 1], + [28225, 1], + [28223, 1], + [28223, 0, "]"], + [27859, 1], + [27858, 1], + [27858, 0, "t"], + [27859, 0, "t"], + [27926, 0, "\\"], + [27927, 0, "t"], + [27928, 0, "e"], + [27929, 0, "x"], + [27930, 0, "t"], + [27931, 0, "t"], + [27932, 0, "t"], + [27933, 0, "{"], + [27936, 0, "}"], + [27990, 0, "$"], + [27997, 1], + [27996, 1], + [27995, 1], + [27994, 1], + [27993, 1], + [27992, 1], + [27992, 0, "t"], + [27993, 0, "e"], + [27994, 0, "x"], + [27995, 0, "t"], + [27996, 0, "t"], + [27997, 0, "t"], + [28007, 0, "$"], + [28009, 0, "$"], + [28011, 1], + [27990, 1], + [27989, 1], + [27989, 0, "$"], + [27998, 0, "."], + [28060, 1], + [28060, 0, "$"], + [28067, 1], + [28066, 1], + [28065, 1], + [28064, 1], + [28063, 1], + [28062, 1], + [28062, 0, "t"], + [28063, 0, "e"], + [28064, 0, "x"], + [28065, 0, "t"], + [28066, 0, "t"], + [28067, 0, "t"], + [28069, 0, "."], + [28077, 1], + [28095, 1], + [28094, 1], + [28094, 0, "t"], + [28095, 0, "t"], + [28159, 1], + [28159, 0, "t"], + [28160, 1], + [28160, 0, "t"], + [28228, 1], + [28227, 1], + [28227, 0, "r"], + [28228, 0, "m"], + [28246, 1], + [28245, 1], + [28245, 0, "r"], + [28246, 0, "m"], + [28289, 1], + [28295, 1], + [28294, 1], + [28294, 0, "t"], + [28295, 0, "t"], + [28297, 0, "."], + [28328, 0, "."], + [28359, 0, "."], + [28326, 1], + [28325, 1], + [28325, 0, "t"], + [28326, 0, "t"], + [28357, 1], + [28357, 0, "t"], + [28358, 0, "t"], + [28358, 1], + [28357, 1], + [28356, 1], + [28356, 0, "t"], + [28357, 0, "t"], + [28388, 1], + [28387, 1], + [28387, 0, "t"], + [28388, 0, "t"], + [28319, 1], + [28349, 1], + [28379, 1], + [28457, 1], + [28456, 1], + [28455, 1], + [28454, 1], + [28453, 1], + [28452, 1], + [28451, 1], + [28450, 1], + [28449, 1], + [28448, 1], + [28447, 1], + [28446, 1], + [28445, 1], + [28444, 1], + [28444, 0, "&"], + [28445, 0, " "], + [28446, 0, "$"], + [28447, 0, "x"], + [28448, 0, "_"], + [28449, 0, "1"], + [28450, 0, "$"], + [28434, 1], + [28433, 1], + [28432, 1], + [28431, 1], + [28430, 1], + [28428, 1], + [28427, 1], + [28425, 1], + [28433, 1], + [28432, 1], + [28431, 1], + [28430, 1], + [28429, 1], + [28428, 1], + [28427, 1], + [28426, 1], + [28433, 1], + [28432, 1], + [28431, 1], + [28431, 0, "x"], + [28432, 0, " "], + [28433, 0, "\\"], + [28434, 0, "i"], + [28435, 0, "n"], + [28436, 0, " "], + [28437, 0, "\\"], + [28438, 0, "m"], + [28439, 0, "a"], + [28440, 0, "t"], + [28441, 0, "h"], + [28442, 0, "r"], + [28443, 0, "m"], + [28444, 0, "{"], + [28445, 0, "S"], + [28446, 0, "t"], + [28447, 0, "r"], + [28448, 0, "i"], + [28449, 0, "n"], + [28450, 0, "g"], + [28451, 0, "}"], + [28445, 0, "V"], + [28446, 0, "a"], + [28447, 0, "r"], + [28523, 1], + [28523, 0, "}"], + [28522, 1], + [28518, 1], + [28517, 1], + [28516, 1], + [28515, 1], + [28514, 1], + [28513, 1], + [28513, 0, "m"], + [28514, 0, "a"], + [28515, 0, "t"], + [28516, 0, "h"], + [28517, 0, "r"], + [28518, 0, "m"], + [28519, 0, "{"], + [28512, 0, "$"], + [28525, 0, "$"], + [28536, 1], + [28535, 1], + [28535, 0, "r"], + [28536, 0, "m"], + [28580, 1], + [28579, 1], + [28578, 1], + [28577, 1], + [28576, 1], + [28576, 0, "t"], + [28577, 0, "e"], + [28578, 0, "x"], + [28579, 0, "t"], + [28580, 0, "t"], + [28581, 0, "t"], + [28582, 0, "{"], + [28587, 1], + [28587, 0, "}"], + [28597, 1], + [28596, 1], + [28595, 1], + [28594, 1], + [28594, 0, "t"], + [28595, 0, "e"], + [28596, 0, "x"], + [28597, 0, "t"], + [28598, 0, "t"], + [28599, 0, "t"], + [28600, 1], + [28600, 0, "{"], + [28606, 1], + [28606, 0, "}"], + [28616, 1], + [28615, 1], + [28614, 1], + [28613, 1], + [28613, 0, "t"], + [28614, 0, "e"], + [28615, 0, "x"], + [28616, 0, "t"], + [28617, 0, "t"], + [28618, 0, "t"], + [28619, 1], + [28619, 0, "{"], + [28624, 1], + [28624, 0, "}"], + [27870, 0, "\\"], + [27871, 0, "t"], + [27872, 0, "e"], + [27873, 0, "x"], + [27874, 0, "t"], + [27875, 0, "t"], + [27876, 0, "t"], + [27877, 0, "{"], + [27879, 0, "}"], + [27934, 0, "$"], + [27948, 0, "$"], + [28016, 0, "("], + [28018, 1], + [28021, 0, "\\"], + [28022, 0, "t"], + [28023, 0, "e"], + [28024, 0, "x"], + [28025, 0, "t"], + [28026, 0, "t"], + [28027, 0, "t"], + [28028, 0, "{"], + [28030, 0, "}"], + [28240, 1], + [28240, 0, "\\"], + [28241, 0, "t"], + [28242, 0, "e"], + [28243, 0, "x"], + [28244, 0, "t"], + [28245, 0, "t"], + [28246, 0, "t"], + [28247, 0, "{"], + [28249, 0, "}"], + [28250, 0, "$"], + [28263, 0, "$"], + [28265, 1], + [28264, 0, "\\"], + [28265, 0, "t"], + [28266, 0, "e"], + [28267, 0, "t"], + [28267, 1], + [28267, 0, "x"], + [28268, 0, "t"], + [28269, 0, "t"], + [28270, 0, "t"], + [28271, 0, "{"], + [28273, 0, "}"], + [28425, 0, "."], + [28138, 0, "\\"], + [28139, 0, "t"], + [28140, 0, "x"], + [28141, 0, "t"], + [28141, 1], + [28140, 1], + [28140, 0, "e"], + [28141, 0, "x"], + [28142, 0, "t"], + [28143, 0, "t"], + [28144, 0, "t"], + [28145, 0, "{"], + [28147, 0, "}"], + [30614, 1], + [30613, 1], + [30613, 0, "t"], + [30614, 0, "t"], + [30727, 1], + [30726, 1], + [30726, 0, "t"], + [30727, 0, "t"], + [30858, 1], + [30857, 1], + [30856, 1], + [30855, 1], + [30854, 1], + [30854, 0, "t"], + [30855, 0, "e"], + [30856, 0, "x"], + [30857, 0, "t"], + [30858, 0, "t"], + [30859, 0, "t"], + [30860, 0, "{"], + [30862, 0, "}"], + [30863, 0, "$"], + [30864, 0, "l"], + [30864, 1], + [30864, 0, "m"], + [30864, 1], + [30864, 0, "\\"], + [30865, 0, "m"], + [30866, 0, "a"], + [30867, 0, "t"], + [30868, 0, "h"], + [30869, 0, "r"], + [30870, 0, "m"], + [30871, 0, "{"], + [30872, 1], + [30875, 1], + [30875, 0, "}"], + [30876, 0, "\\"], + [30877, 0, "t"], + [30878, 0, "e"], + [30879, 0, "x"], + [30880, 0, "t"], + [30881, 0, "t"], + [30882, 0, "t"], + [30883, 0, "{"], + [30885, 0, "}"], + [30886, 1], + [30876, 0, "$"], + [30922, 1], + [30921, 1], + [30921, 0, "t"], + [30922, 0, "t"], + [30978, 1], + [30977, 1], + [30977, 0, "t"], + [30978, 0, "t"], + [31111, 1], + [31110, 1], + [31110, 0, "t"], + [31111, 0, "t"], + [31187, 1], + [31186, 1], + [31186, 0, "t"], + [31187, 0, "t"], + [31261, 1], + [31260, 1], + [31260, 0, "t"], + [31261, 0, "t"], + [31390, 1], + [31389, 1], + [31389, 0, "t"], + [31390, 0, "t"], + [31437, 1], + [31436, 1], + [31436, 0, "t"], + [31437, 0, "t"], + [31569, 0, "\\"], + [31570, 0, "t"], + [31571, 0, "e"], + [31572, 0, "x"], + [31573, 0, "t"], + [31574, 0, "t"], + [31575, 0, "t"], + [31576, 0, "{"], + [31579, 0, "}"], + [31626, 1], + [31625, 1], + [31625, 0, "t"], + [31626, 0, "t"], + [31692, 1], + [31691, 1], + [31691, 0, "t"], + [31692, 0, "t"], + [31948, 1], + [31947, 1], + [31947, 0, "t"], + [31948, 0, "t"], + [31970, 1], + [31969, 1], + [31968, 1], + [31967, 1], + [31966, 1], + [31966, 0, "t"], + [31967, 0, "e"], + [31968, 0, "x"], + [31969, 0, "t"], + [31970, 0, "t"], + [31971, 0, "t"], + [31972, 0, "{"], + [31972, 1], + [31971, 1], + [31970, 1], + [31969, 1], + [31968, 1], + [31967, 1], + [31966, 1], + [31966, 0, "v"], + [31967, 0, "e"], + [31968, 0, "r"], + [31969, 0, "b"], + [31970, 0, "|"], + [32041, 1], + [32040, 1], + [32039, 1], + [32038, 1], + [32037, 1], + [32037, 0, "t"], + [32038, 0, "e"], + [32039, 0, "x"], + [32040, 0, "t"], + [32041, 0, "t"], + [32042, 0, "t"], + [32043, 0, "{"], + [32054, 1], + [32054, 0, "}"], + [32072, 1], + [32071, 1], + [32071, 0, "t"], + [32072, 0, "t"], + [32298, 1], + [32297, 1], + [32297, 0, "t"], + [32298, 0, "t"], + [32457, 1], + [32456, 1], + [32455, 1], + [32454, 1], + [32453, 1], + [32453, 0, "t"], + [32454, 0, "e"], + [32455, 0, "x"], + [32456, 0, "t"], + [32457, 0, "t"], + [32458, 0, "t"], + [32459, 0, "{"], + [32464, 1], + [32464, 0, "}"], + [32548, 1], + [32548, 0, "}"], + [32543, 1], + [32542, 1], + [32541, 1], + [32540, 1], + [32539, 1], + [32539, 0, "t"], + [32540, 0, "e"], + [32541, 0, "x"], + [32542, 0, "t"], + [32543, 0, "t"], + [32544, 0, "t"], + [32545, 0, "{"], + [32906, 1], + [32905, 1], + [32905, 0, "t"], + [32906, 0, "t"], + [30786, 1], + [30785, 1], + [30784, 1], + [30783, 1], + [30782, 1], + [30781, 1], + [30780, 1], + [30779, 1], + [30778, 1], + [30777, 1], + [30776, 1], + [30775, 1], + [30774, 1], + [30773, 1], + [30772, 1], + [30771, 1], + [30770, 1], + [30769, 1], + [30768, 1], + [30767, 1], + [30766, 1], + [30765, 1], + [30764, 1], + [30763, 1], + [30762, 1], + [30761, 1], + [30760, 1], + [30759, 1], + [30758, 1], + [30757, 1], + [30756, 1], + [30755, 1], + [30754, 1], + [30753, 1], + [30752, 1], + [30751, 1], + [30750, 1], + [30749, 1], + [30748, 1], + [30747, 1], + [30746, 1], + [30745, 1], + [30744, 1], + [30743, 1], + [30743, 0, "T"], + [30744, 0, "h"], + [30745, 0, "e"], + [30746, 0, " "], + [30747, 0, "e"], + [30748, 0, "x"], + [30749, 0, "p"], + [30750, 0, "r"], + [30751, 0, "e"], + [30752, 0, "s"], + [30753, 0, "s"], + [30754, 0, "i"], + [30755, 0, "o"], + [30756, 0, "n"], + [30757, 0, " "], + [30758, 0, "d"], + [30759, 0, "e"], + [30760, 0, "f"], + [30761, 0, "i"], + [30762, 0, "n"], + [30763, 0, "e"], + [30764, 0, "s"], + [30765, 0, " "], + [30766, 0, "t"], + [30767, 0, "h"], + [30768, 0, "e"], + [30769, 0, " "], + [30770, 0, "p"], + [30771, 0, "a"], + [30772, 0, "t"], + [30773, 0, "h"], + [30787, 1], + [30786, 1], + [30786, 0, "t"], + [30787, 0, "a"], + [30788, 0, "k"], + [30789, 0, "e"], + [30790, 0, "s"], + [30791, 0, " "], + [30792, 0, "a"], + [30793, 0, "s"], + [30794, 0, " "], + [30795, 0, "i"], + [30796, 0, "t"], + [30806, 1], + [30806, 0, "s"], + [30765, 0, ","], + [30766, 0, " "], + [30767, 0, "l"], + [30768, 0, "e"], + [30769, 0, "f"], + [30770, 0, " "], + [30770, 1], + [30770, 0, "t"], + [30771, 0, " "], + [30772, 0, "t"], + [30773, 0, "o"], + [30774, 0, " "], + [30775, 0, "r"], + [30776, 0, "i"], + [30777, 0, "g"], + [30778, 0, "h"], + [30779, 0, ","], + [30779, 0, "t"], + [30807, 0, ","], + [30808, 0, " "], + [30809, 0, "r"], + [30810, 0, "o"], + [30811, 0, "o"], + [30812, 0, "t"], + [30813, 0, " "], + [30814, 0, "t"], + [30815, 0, "o"], + [30816, 0, "w"], + [30817, 0, "a"], + [30818, 0, "r"], + [30819, 0, "d"], + [30820, 0, "s"], + [30821, 0, " "], + [30822, 0, "l"], + [30823, 0, "e"], + [30824, 0, "a"], + [30825, 0, "f"], + [30826, 0, ","], + [30826, 1], + [30825, 1], + [30824, 1], + [30823, 1], + [30822, 1], + [30821, 1], + [30820, 1], + [30819, 1], + [30818, 1], + [30817, 1], + [30816, 1], + [30815, 1], + [30814, 1], + [30813, 1], + [30812, 1], + [30811, 1], + [30810, 1], + [30809, 1], + [30808, 1], + [30807, 1], + [30840, 0, " "], + [30841, 0, "f"], + [30842, 0, "r"], + [30843, 0, "o"], + [30844, 0, "m"], + [30845, 0, " "], + [30846, 0, "t"], + [30846, 1], + [30845, 1], + [30844, 1], + [30843, 1], + [30842, 1], + [30841, 1], + [30841, 0, "t"], + [30842, 0, "w"], + [30842, 1], + [30842, 0, "o"], + [30843, 0, "w"], + [30844, 0, "a"], + [30845, 0, "r"], + [30846, 0, "d"], + [30847, 0, "s"], + [30848, 0, " "], + [30849, 0, "t"], + [30850, 0, "h"], + [30851, 0, "e"], + [30852, 0, " "], + [30852, 1], + [30851, 1], + [30850, 1], + [30849, 1], + [30849, 0, "t"], + [30850, 0, "h"], + [30851, 0, "e"], + [30852, 0, " "], + [30853, 0, "l"], + [30854, 0, "e"], + [30855, 0, "a"], + [30856, 0, "v"], + [30857, 0, "e"], + [30858, 0, "s"], + [32095, 1], + [32094, 1], + [32093, 1], + [32092, 1], + [32091, 1], + [32091, 0, "e"], + [32092, 0, "x"], + [32093, 0, "e"], + [32094, 0, "c"], + [32095, 0, "u"], + [32096, 0, "t"], + [32097, 0, "e"], + [32098, 0, "s"], + [32098, 1], + [32097, 1], + [32096, 1], + [32095, 1], + [32094, 1], + [32093, 1], + [32092, 1], + [32091, 1], + [32091, 0, "p"], + [32092, 0, "e"], + [32093, 0, "r"], + [32094, 0, "f"], + [32095, 0, "o"], + [32096, 0, "r"], + [32097, 0, "m"], + [32098, 0, "s"], + [32195, 1], + [32194, 1], + [32194, 0, "S"], + [32195, 0, "i"], + [32196, 0, "n"], + [32197, 0, "c"], + [32198, 0, "e"], + [42901, 1], + [42924, 1], + [55210, 1], + [55209, 1], + [55208, 1], + [55207, 1], + [55206, 1], + [55205, 1], + [55204, 1], + [55203, 1], + [55202, 1], + [55201, 1], + [55200, 1], + [55199, 1], + [55198, 1], + [55197, 1], + [55196, 1], + [55195, 1], + [55194, 1], + [55193, 1], + [55192, 1], + [55192, 0, "n"], + [55193, 0, "e"], + [55194, 0, "x"], + [55195, 0, "t"], + [71455, 1], + [71454, 1], + [71453, 1], + [71452, 1], + [71451, 1], + [71450, 1], + [71449, 1], + [71448, 1], + [71447, 1], + [71446, 1], + [71445, 1], + [71444, 1], + [71443, 1], + [71442, 1], + [71441, 1], + [71440, 1], + [71439, 1], + [71438, 1], + [71437, 1], + [71436, 1], + [71435, 1], + [71434, 1], + [75547, 0, "\n"], + [75548, 0, "%"], + [75549, 0, "T"], + [75550, 0, "O"], + [75551, 0, "D"], + [75552, 0, "O"], + [75553, 0, ":"], + [75554, 0, " "], + [75555, 0, "w"], + [75556, 0, "w"], + [75556, 1], + [75556, 0, "e"], + [75557, 0, " "], + [75558, 0, "s"], + [75559, 0, "h"], + [75560, 0, "o"], + [75561, 0, "u"], + [75562, 0, "l"], + [75563, 0, "d"], + [75564, 0, " "], + [75565, 0, "p"], + [75566, 0, "u"], + [75567, 0, "t"], + [75568, 0, " "], + [75569, 0, "t"], + [75570, 0, "h"], + [75571, 0, "i"], + [75572, 0, "s"], + [75573, 0, " "], + [75574, 0, "i"], + [75575, 0, "n"], + [75576, 0, " "], + [75577, 0, "a"], + [75578, 0, "s"], + [75579, 0, " "], + [75580, 0, "p"], + [75581, 0, "a"], + [75582, 0, "r"], + [75583, 0, "t"], + [75583, 1], + [75582, 1], + [75581, 1], + [75580, 1], + [75579, 1], + [75578, 1], + [75577, 1], + [75576, 1], + [75575, 1], + [75574, 1], + [75573, 1], + [75572, 1], + [75571, 1], + [75570, 1], + [75569, 1], + [75568, 1], + [75567, 1], + [75566, 1], + [75565, 1], + [75564, 1], + [75563, 1], + [75562, 1], + [75561, 1], + [75560, 1], + [75559, 1], + [75558, 1], + [75557, 1], + [75556, 1], + [75555, 1], + [75555, 0, "t"], + [75556, 0, "h"], + [75557, 0, "i"], + [75558, 0, "s"], + [75559, 0, " "], + [75560, 0, "d"], + [75561, 0, "o"], + [75562, 0, "e"], + [75563, 0, "s"], + [75564, 0, "n"], + [75565, 0, "'"], + [75566, 0, "t"], + [75567, 0, " "], + [75568, 0, "s"], + [75569, 0, "e"], + [75570, 0, "e"], + [75571, 0, "m"], + [75572, 0, " "], + [75573, 0, "t"], + [75574, 0, "o"], + [75575, 0, " "], + [75576, 0, "b"], + [75577, 0, "e"], + [75578, 0, " "], + [75579, 0, "p"], + [75580, 0, "a"], + [75581, 0, "r"], + [75582, 0, "t"], + [75583, 0, "i"], + [75584, 0, "c"], + [75585, 0, "u"], + [75586, 0, "l"], + [75587, 0, "a"], + [75588, 0, "r"], + [75589, 0, "l"], + [75590, 0, "y"], + [75591, 0, " "], + [75592, 0, "r"], + [75593, 0, "e"], + [75594, 0, "l"], + [75595, 0, "e"], + [75596, 0, "v"], + [75597, 0, "a"], + [75598, 0, "n"], + [75599, 0, "t"], + [75600, 0, " "], + [75601, 0, "t"], + [75602, 0, "o"], + [75603, 0, " "], + [75604, 0, "t"], + [75605, 0, "h"], + [75606, 0, "i"], + [75607, 0, "s"], + [75608, 0, " "], + [75609, 0, "p"], + [75610, 0, "a"], + [75611, 0, "p"], + [75612, 0, "e"], + [75613, 0, "r"], + [75614, 0, " "], + [75615, 0, "i"], + [75615, 1], + [75615, 0, "u"], + [75616, 0, "n"], + [75617, 0, "l"], + [75618, 0, "e"], + [75619, 0, "s"], + [75620, 0, "s"], + [75621, 0, " "], + [75622, 0, "w"], + [75623, 0, "e"], + [75624, 0, " "], + [75625, 0, "a"], + [75626, 0, "n"], + [75627, 0, "a"], + [75628, 0, "l"], + [75629, 0, "y"], + [75630, 0, "s"], + [75631, 0, "e"], + [75632, 0, " "], + [75633, 0, "s"], + [75634, 0, "o"], + [75635, 0, "m"], + [75636, 0, "e"], + [75637, 0, " "], + [75638, 0, "o"], + [75639, 0, "f"], + [75640, 0, " "], + [75641, 0, "t"], + [75642, 0, "h"], + [75643, 0, "e"], + [75644, 0, " "], + [75645, 0, "d"], + [75646, 0, "a"], + [75647, 0, "t"], + [75648, 0, "a"], + [75649, 0, "?"], + [75650, 0, " "], + [75651, 0, "\""], + [75860, 0, "\""], + [76308, 0, " "], + [76309, 0, "I"], + [76310, 0, "t"], + [76311, 0, " "], + [76312, 0, "i"], + [76313, 0, "s"], + [76314, 0, " "], + [76315, 0, "p"], + [76316, 0, "o"], + [76317, 0, "s"], + [76318, 0, "s"], + [76319, 0, "i"], + [76320, 0, "b"], + [76321, 0, "l"], + [76322, 0, "e"], + [76323, 0, " "], + [76324, 0, "t"], + [76325, 0, "h"], + [76326, 0, "a"], + [76327, 0, "t"], + [76328, 0, " "], + [76329, 0, "a"], + [76330, 0, " "], + [76331, 0, "s"], + [76332, 0, "c"], + [76333, 0, "h"], + [76334, 0, "e"], + [76335, 0, "m"], + [76336, 0, "a"], + [76337, 0, " "], + [76338, 0, "l"], + [76339, 0, "a"], + [76340, 0, "n"], + [76341, 0, "g"], + [76342, 0, "u"], + [76343, 0, "a"], + [76344, 0, "g"], + [76345, 0, "e"], + [76346, 0, " "], + [76347, 0, "i"], + [76348, 0, "s"], + [76349, 0, " "], + [76350, 0, "r"], + [76351, 0, "e"], + [76352, 0, "q"], + [76353, 0, "u"], + [76354, 0, "i"], + [76355, 0, "r"], + [76356, 0, "e"], + [76357, 0, "d"], + [76357, 1], + [76356, 1], + [76355, 1], + [76354, 1], + [76353, 1], + [76352, 1], + [76351, 1], + [76350, 1], + [76349, 1], + [76348, 1], + [76347, 1], + [76347, 0, "w"], + [76348, 0, "i"], + [76349, 0, "l"], + [76350, 0, "l"], + [76351, 0, " "], + [76352, 0, "b"], + [76353, 0, "e"], + [76354, 0, " "], + [76355, 0, "r"], + [76356, 0, "e"], + [76357, 0, "q"], + [76358, 0, "u"], + [76359, 0, "i"], + [76360, 0, "r"], + [76361, 0, "e"], + [76362, 0, "d"], + [76363, 0, " "], + [76364, 0, "i"], + [76365, 0, "n"], + [76366, 0, "o"], + [76366, 1], + [76366, 0, " "], + [76367, 0, "o"], + [76367, 1], + [76366, 1], + [76365, 1], + [76364, 1], + [76364, 0, "t"], + [76365, 0, "o"], + [76366, 0, " "], + [76367, 0, "h"], + [76368, 0, "e"], + [76369, 0, "l"], + [76370, 0, "p"], + [76370, 1], + [76369, 1], + [76368, 1], + [76367, 1], + [76367, 0, "m"], + [76368, 0, "a"], + [76369, 0, "n"], + [76370, 0, "a"], + [76371, 0, "g"], + [76372, 0, "e"], + [76373, 0, " "], + [76374, 0, "c"], + [76375, 0, "o"], + [76376, 0, "m"], + [76377, 0, "p"], + [76378, 0, "l"], + [76379, 0, "e"], + [76380, 0, "x"], + [76381, 0, "i"], + [76382, 0, "t"], + [76383, 0, "y"], + [76384, 0, "."], + [76384, 1], + [76383, 1], + [76382, 1], + [76381, 1], + [76380, 1], + [76379, 1], + [76378, 1], + [76377, 1], + [76376, 1], + [76375, 1], + [76374, 1], + [76373, 1], + [76372, 1], + [76371, 1], + [76370, 1], + [76369, 1], + [76368, 1], + [76367, 1], + [76366, 1], + [76365, 1], + [76364, 1], + [76363, 1], + [76362, 1], + [76361, 1], + [76360, 1], + [76359, 1], + [76358, 1], + [76357, 1], + [76356, 1], + [76355, 1], + [76354, 1], + [76353, 1], + [76352, 1], + [76352, 0, "h"], + [76353, 0, "e"], + [76354, 0, "l"], + [76355, 0, "p"], + [76356, 0, " "], + [76357, 0, "m"], + [76358, 0, "a"], + [76359, 0, "n"], + [76360, 0, "a"], + [76361, 0, "g"], + [76362, 0, "e"], + [76363, 0, " "], + [76364, 0, "c"], + [76365, 0, "o"], + [76366, 0, "m"], + [76367, 0, "p"], + [76368, 0, "l"], + [76369, 0, "e"], + [76370, 0, "i"], + [76371, 0, "x"], + [76372, 0, "t"], + [76373, 0, "y"], + [76373, 1], + [76372, 1], + [76371, 1], + [76370, 1], + [76370, 0, "x"], + [76371, 0, "i"], + [76372, 0, "t"], + [76373, 0, "y"], + [76374, 0, "."], + [76322, 1], + [76321, 1], + [76320, 1], + [76319, 1], + [76318, 1], + [76317, 1], + [76316, 1], + [76315, 1], + [76314, 1], + [76313, 1], + [76312, 1], + [76312, 0, "m"], + [76313, 0, "a"], + [76314, 0, "y"], + [76315, 0, " "], + [76316, 0, "t"], + [76317, 0, "i"], + [76317, 1], + [76317, 0, "u"], + [76318, 0, "r"], + [76319, 0, "n"], + [76320, 0, " "], + [76321, 0, "o"], + [76322, 0, "u"], + [76323, 0, "t"], + [76356, 1], + [76355, 1], + [76354, 1], + [76353, 1], + [76353, 0, "b"], + [76354, 0, "e"], + [76355, 0, " "], + [76356, 0, "i"], + [76357, 0, "n"], + [76358, 0, "s"], + [76359, 0, "t"], + [76360, 0, "r"], + [76361, 0, "u"], + [76362, 0, "c"], + [76362, 1], + [76362, 0, "m"], + [76363, 0, "e"], + [76364, 0, "n"], + [76365, 0, "t"], + [76366, 0, "a"], + [76367, 0, "l"], + [76368, 0, " "], + [76369, 0, "i"], + [76370, 0, "n"], + [76371, 0, " "], + [76372, 0, "t"], + [76373, 0, "h"], + [76374, 0, "e"], + [76382, 0, "m"], + [76383, 0, "e"], + [76384, 0, "n"], + [76385, 0, "t"], + [76386, 0, " "], + [76387, 0, "o"], + [76388, 0, "f"], + [76389, 0, " "], + [76390, 0, "u"], + [76391, 0, "p"], + [76392, 0, "d"], + [76393, 0, "a"], + [76393, 1], + [76392, 1], + [76391, 1], + [76390, 1], + [76389, 1], + [76388, 1], + [76387, 1], + [76387, 0, "s"], + [76388, 0, "u"], + [76389, 0, "c"], + [76390, 0, "h"], + [76391, 0, " "], + [76391, 1], + [76390, 1], + [76389, 1], + [76388, 1], + [76387, 1], + [76386, 1], + [76385, 1], + [76384, 1], + [76383, 1], + [76382, 1], + [76381, 1], + [76380, 1], + [76379, 1], + [76378, 1], + [76377, 1], + [76376, 1], + [76375, 1], + [76374, 1], + [76373, 1], + [76372, 1], + [76371, 1], + [76370, 1], + [76369, 1], + [76368, 1], + [76367, 1], + [76366, 1], + [76365, 1], + [76364, 1], + [76363, 1], + [76362, 1], + [76361, 1], + [76360, 1], + [76359, 1], + [76358, 1], + [76357, 1], + [76356, 1], + [76356, 0, "r"], + [76357, 0, "e"], + [76358, 0, "q"], + [76359, 0, "u"], + [76360, 0, "i"], + [76361, 0, "r"], + [76362, 0, "e"], + [76363, 0, "d"], + [76364, 0, " "], + [76365, 0, "f"], + [76366, 0, "o"], + [76367, 0, "r"], + [76368, 0, " "], + [76369, 0, "m"], + [76370, 0, "o"], + [76371, 0, "r"], + [76372, 0, "e"], + [76373, 0, " "], + [76374, 1], + [76383, 1], + [76382, 1], + [76381, 1], + [76381, 0, " "], + [76382, 0, "a"], + [76383, 0, "p"], + [76384, 0, "p"], + [76385, 0, "l"], + [76386, 0, "i"], + [76387, 0, "c"], + [76388, 0, "a"], + [76389, 0, "t"], + [76390, 0, "i"], + [76391, 0, "o"], + [76392, 0, "n"], + [76393, 0, "s"], + [76372, 1], + [76371, 1], + [76370, 1], + [76369, 1], + [76368, 1], + [76367, 1], + [76366, 1], + [76365, 1], + [76365, 0, "t"], + [76366, 0, "o"], + [76367, 0, " "], + [76368, 0, "s"], + [76369, 0, "u"], + [76370, 0, "p"], + [76371, 0, "p"], + [76372, 0, "o"], + [76373, 0, "r"], + [76374, 0, "t"], + [76375, 0, " "], + [76376, 0, "m"], + [76377, 0, "o"], + [76378, 0, "r"], + [76379, 0, "e"], + [75651, 1], + [75650, 1], + [75649, 1], + [75648, 1], + [75647, 1], + [75646, 1], + [75645, 1], + [75644, 1], + [75643, 1], + [75642, 1], + [75641, 1], + [75640, 1], + [75639, 1], + [75638, 1], + [75637, 1], + [75636, 1], + [75635, 1], + [75634, 1], + [75633, 1], + [75632, 1], + [75631, 1], + [75630, 1], + [75629, 1], + [75628, 1], + [75627, 1], + [75626, 1], + [75625, 1], + [75624, 1], + [75623, 1], + [75622, 1], + [75621, 1], + [75620, 1], + [75619, 1], + [75618, 1], + [75617, 1], + [75616, 1], + [75615, 1], + [75614, 1], + [75613, 1], + [75612, 1], + [75611, 1], + [75610, 1], + [75609, 1], + [75608, 1], + [75607, 1], + [75606, 1], + [75605, 1], + [75604, 1], + [75603, 1], + [75602, 1], + [75601, 1], + [75600, 1], + [75599, 1], + [75598, 1], + [75597, 1], + [75596, 1], + [75595, 1], + [75594, 1], + [75593, 1], + [75592, 1], + [75591, 1], + [75590, 1], + [75589, 1], + [75588, 1], + [75587, 1], + [75586, 1], + [75585, 1], + [75584, 1], + [75583, 1], + [75582, 1], + [75581, 1], + [75580, 1], + [75579, 1], + [75578, 1], + [75577, 1], + [75576, 1], + [75575, 1], + [75574, 1], + [75573, 1], + [75572, 1], + [75571, 1], + [75570, 1], + [75569, 1], + [75568, 1], + [75567, 1], + [75566, 1], + [75565, 1], + [75564, 1], + [75563, 1], + [75562, 1], + [75561, 1], + [75560, 1], + [75559, 1], + [75558, 1], + [75557, 1], + [75556, 1], + [75555, 1], + [75554, 1], + [75553, 1], + [75552, 1], + [75551, 1], + [75550, 1], + [75549, 1], + [75548, 1], + [75547, 1], + [75755, 1], + [71434, 0, "$"], + [18080, 0, "-"], + [18106, 0, "-"], + [21741, 1], + [21740, 1], + [21739, 1], + [21739, 0, "g"], + [21740, 0, "r"], + [21741, 0, "i"], + [21741, 1], + [21741, 0, "o"], + [21742, 0, "c"], + [21743, 0, "e"], + [21744, 0, "r"], + [21745, 0, "i"], + [21746, 0, "e"], + [21747, 0, "s"], + [21806, 1], + [21806, 1], + [21806, 1], + [21806, 0, "g"], + [21807, 0, "r"], + [21808, 0, "o"], + [21809, 0, "c"], + [21810, 0, "e"], + [21811, 0, "r"], + [21812, 0, "i"], + [21813, 0, "e"], + [21814, 0, "s"], + [21873, 1], + [21873, 1], + [21873, 1], + [21873, 0, "g"], + [21874, 0, "r"], + [21875, 0, "o"], + [21876, 0, "c"], + [21877, 0, "e"], + [21878, 0, "r"], + [21879, 0, "i"], + [21880, 0, "e"], + [21881, 0, "s"], + [21948, 1], + [21948, 1], + [21948, 1], + [21948, 0, "g"], + [21949, 0, "r"], + [21950, 0, "o"], + [21951, 0, "c"], + [21952, 0, "e"], + [21953, 0, "r"], + [21954, 0, "i"], + [21955, 0, "e"], + [21956, 0, "s"], + [22032, 1], + [22032, 1], + [22032, 1], + [22032, 0, "g"], + [22033, 0, "r"], + [22034, 0, "o"], + [22035, 0, "c"], + [22036, 0, "e"], + [22037, 0, "r"], + [22038, 0, "i"], + [22039, 0, "e"], + [22040, 0, "s"], + [22107, 1], + [22107, 1], + [22107, 1], + [22107, 0, "g"], + [22108, 0, "r"], + [22109, 0, "o"], + [22110, 0, "c"], + [22111, 0, "e"], + [22112, 0, "r"], + [22113, 0, "i"], + [22114, 0, "e"], + [22115, 0, "s"], + [22193, 1], + [22193, 1], + [22193, 1], + [22193, 0, "c"], + [22194, 0, "r"], + [22195, 0, "o"], + [22195, 1], + [22194, 1], + [22193, 1], + [22193, 0, "g"], + [22194, 0, "r"], + [22195, 0, "o"], + [22196, 0, "c"], + [22197, 0, "e"], + [22198, 0, "r"], + [22199, 0, "i"], + [22200, 0, "e"], + [22201, 0, "s"], + [22298, 1], + [22298, 1], + [22298, 1], + [22298, 0, "g"], + [22299, 0, "r"], + [22300, 0, "o"], + [22301, 0, "c"], + [22302, 0, "e"], + [22303, 0, "r"], + [22304, 0, "i"], + [22305, 0, "e"], + [22306, 0, "s"], + [22483, 1], + [22483, 1], + [22483, 1], + [22483, 0, "g"], + [22484, 0, "r"], + [22485, 0, "o"], + [22486, 0, "c"], + [22487, 0, "e"], + [22488, 0, "r"], + [22489, 0, "i"], + [22490, 0, "e"], + [22491, 0, "s"], + [22563, 1], + [22562, 1], + [22562, 1], + [22562, 0, "g"], + [22563, 0, "r"], + [22564, 0, "o"], + [22565, 0, "c"], + [22566, 0, "e"], + [22567, 0, "r"], + [22568, 0, "i"], + [22569, 0, "e"], + [22570, 0, "s"], + [22642, 1], + [22642, 1], + [22642, 1], + [22642, 0, "g"], + [22643, 0, "r"], + [22644, 0, "o"], + [22645, 0, "c"], + [22646, 0, "e"], + [22647, 0, "r"], + [22648, 0, "i"], + [22649, 0, "e"], + [22650, 0, "s"], + [22737, 1], + [22737, 1], + [22737, 1], + [22737, 0, "g"], + [22738, 0, "r"], + [22739, 0, "o"], + [22740, 0, "c"], + [22741, 0, "e"], + [22742, 0, "r"], + [22743, 0, "i"], + [22744, 0, "e"], + [22745, 0, "s"], + [23448, 1], + [23447, 1], + [23446, 1], + [23446, 0, "g"], + [23447, 0, "r"], + [23448, 0, "o"], + [23449, 0, "c"], + [23450, 0, "e"], + [23451, 0, "r"], + [23452, 0, "i"], + [23453, 0, "e"], + [23454, 0, "s"], + [23516, 1], + [23515, 1], + [23514, 1], + [23513, 1], + [23512, 1], + [23511, 1], + [23510, 1], + [23509, 1], + [23508, 1], + [23507, 1], + [23507, 0, "c"], + [23508, 0, "o"], + [23509, 0, "m"], + [23510, 0, "m"], + [23511, 0, "u"], + [23512, 0, "n"], + [23513, 0, "i"], + [23514, 0, "c"], + [23515, 0, "a"], + [23516, 0, "t"], + [23517, 0, "e"], + [23517, 1], + [23516, 1], + [23515, 1], + [23514, 1], + [23513, 1], + [23512, 1], + [23511, 1], + [23510, 1], + [23509, 1], + [23508, 1], + [23507, 1], + [23506, 1], + [23505, 1], + [23504, 1], + [23503, 1], + [23502, 1], + [23501, 1], + [23500, 1], + [23499, 1], + [23498, 1], + [23498, 0, "m"], + [23499, 0, "o"], + [23500, 0, "d"], + [23501, 0, "i"], + [23502, 0, "f"], + [23503, 0, "i"], + [23504, 0, "c"], + [23505, 0, "a"], + [23506, 0, "t"], + [23507, 0, "i"], + [23508, 0, "o"], + [23509, 0, "n"], + [23510, 0, "s"], + [23511, 0, " "], + [23512, 0, "a"], + [23513, 0, "r"], + [23514, 0, "e"], + [23515, 0, " "], + [23516, 0, "c"], + [23517, 0, "o"], + [23518, 0, "m"], + [23519, 0, "b"], + [23520, 0, "i"], + [23521, 0, "n"], + [23522, 0, "e"], + [23523, 0, "d"], + [23557, 1], + [23556, 1], + [23555, 1], + [23554, 1], + [23553, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 1], + [26323, 0, "d"], + [26324, 0, "e"], + [26325, 0, "v"], + [26326, 0, "e"], + [26327, 0, "l"], + [26328, 0, "o"], + [26329, 0, "p"], + [26330, 0, "m"], + [26331, 0, "e"], + [26332, 0, "n"], + [26333, 0, "t"], + [26334, 0, " "], + [26335, 0, "o"], + [26336, 0, "f"], + [28339, 1], + [28338, 1], + [28338, 0, "i"], + [28339, 0, "t"], + [28366, 1], + [28365, 1], + [28365, 0, "i"], + [28366, 0, "t"], + [28657, 1], + [28656, 1], + [28656, 0, "i"], + [28657, 0, "t"], + [28640, 1], + [28639, 1], + [28639, 0, "i"], + [28640, 0, "t"], + [30974, 1], + [30973, 1], + [30973, 0, "i"], + [30974, 0, "t"], + [31318, 0, "s"], + [31318, 1], + [31317, 1], + [31316, 1], + [31315, 1], + [31314, 1], + [31313, 1], + [31313, 0, "c"], + [31314, 0, "o"], + [31315, 0, "n"], + [31316, 0, "t"], + [31317, 0, "e"], + [31318, 0, "n"], + [31319, 0, "t"], + [31320, 0, "s"], + [31328, 0, " "], + [31329, 0, "m"], + [31330, 0, "u"], + [31331, 0, "l"], + [31332, 0, "t"], + [31333, 0, "i"], + [31334, 0, "-"], + [31335, 0, "v"], + [31336, 0, "a"], + [31337, 0, "l"], + [31338, 0, "u"], + [31339, 0, "e"], + [76385, 0, " "], + [76386, 0, "A"], + [76387, 0, " "], + [76388, 0, "s"], + [76389, 0, "c"], + [76390, 0, "h"], + [76391, 0, "e"], + [76392, 0, "m"], + [76393, 0, "a"], + [76394, 0, " "], + [76395, 0, "l"], + [76396, 0, "a"], + [76397, 0, "n"], + [76398, 0, "g"], + [76399, 0, "u"], + [76400, 0, "a"], + [76401, 0, "g"], + [76402, 0, "e"], + [76403, 0, " "], + [76404, 0, "c"], + [76405, 0, "o"], + [76406, 0, "u"], + [76407, 0, "l"], + [76408, 0, "d"], + [76409, 0, " "], + [76410, 0, "a"], + [76411, 0, "l"], + [76412, 0, "s"], + [76413, 0, "o"], + [76414, 0, " "], + [76415, 0, "s"], + [76416, 0, "u"], + [76417, 0, "p"], + [76418, 0, "p"], + [76419, 0, "o"], + [76420, 0, "r"], + [76421, 0, "t"], + [76422, 0, " "], + [76423, 0, "s"], + [76424, 0, "e"], + [76425, 0, "m"], + [76426, 0, "a"], + [76427, 0, "n"], + [76428, 0, "t"], + [76429, 0, "i"], + [76430, 0, "c"], + [76431, 0, " "], + [76432, 0, "a"], + [76433, 0, "n"], + [76434, 0, "n"], + [76435, 0, "o"], + [76436, 0, "t"], + [76437, 0, "a"], + [76438, 0, "t"], + [76439, 0, "i"], + [76440, 0, "o"], + [76441, 0, "n"], + [76442, 0, "s"], + [76443, 0, ","], + [76444, 0, " "], + [76445, 0, "s"], + [76446, 0, "u"], + [76447, 0, "c"], + [76448, 0, "h"], + [76449, 0, " "], + [76450, 0, "a"], + [76451, 0, "s"], + [76452, 0, " "], + [76453, 0, "i"], + [76454, 0, "n"], + [76455, 0, "d"], + [76456, 0, "i"], + [76457, 0, "c"], + [76458, 0, "a"], + [76459, 0, "t"], + [76460, 0, "i"], + [76461, 0, "n"], + [76462, 0, "g"], + [76463, 0, " "], + [76464, 0, "t"], + [76465, 0, "h"], + [76466, 0, "a"], + [76467, 0, "t"], + [76468, 0, " "], + [76469, 0, "a"], + [76470, 0, " "], + [76471, 0, "n"], + [76472, 0, "u"], + [76473, 0, "m"], + [76474, 0, "b"], + [76475, 0, "e"], + [76476, 0, "r"], + [76477, 0, " "], + [76478, 0, "s"], + [76479, 0, "h"], + [76480, 0, "o"], + [76481, 0, "u"], + [76482, 0, "l"], + [76483, 0, "d"], + [76484, 0, " "], + [76485, 0, "b"], + [76486, 0, "e"], + [76487, 0, " "], + [76488, 0, "t"], + [76489, 0, "r"], + [76490, 0, "e"], + [76491, 0, "a"], + [76492, 0, "t"], + [76493, 0, "e"], + [76494, 0, "d"], + [76495, 0, " "], + [76496, 0, "a"], + [76497, 0, "s"], + [76498, 0, " "], + [76499, 0, "a"], + [76500, 0, " "], + [76501, 0, "c"], + [76502, 0, "o"], + [76503, 0, "u"], + [76504, 0, "n"], + [76505, 0, "t"], + [76506, 0, "e"], + [76507, 0, "r"], + [76508, 0, " "], + [76509, 0, "r"], + [76510, 0, "a"], + [76511, 0, "t"], + [76512, 0, "h"], + [76513, 0, "e"], + [76514, 0, "r"], + [76515, 0, " "], + [76516, 0, "t"], + [76517, 0, "h"], + [76518, 0, "a"], + [76519, 0, "n"], + [76520, 0, " "], + [76521, 0, "a"], + [76522, 0, " "], + [76523, 0, "r"], + [76524, 0, "e"], + [76525, 0, "g"], + [76526, 0, "i"], + [76527, 0, "s"], + [76528, 0, "t"], + [76529, 0, "e"], + [76530, 0, "r"], + [76531, 0, "."], + [2284, 0, " "], + [2285, 0, "m"], + [2286, 0, "a"], + [2287, 0, "k"], + [2288, 0, "i"], + [2289, 0, "n"], + [2290, 0, "g"], + [2291, 0, " "], + [2292, 0, "i"], + [2293, 0, "s"], + [2294, 0, " "], + [2294, 1], + [2293, 1], + [2293, 0, "t"], + [2294, 0, " "], + [2295, 0, "s"], + [2296, 0, "u"], + [2297, 0, "i"], + [2298, 0, "t"], + [2299, 0, "a"], + [2300, 0, "b"], + [2301, 0, "l"], + [2302, 0, "e"], + [2303, 0, " "], + [2304, 0, "f"], + [2305, 0, "o"], + [2306, 0, "r"], + [2307, 0, " "], + [2308, 0, "m"], + [2309, 0, "o"], + [2310, 0, "b"], + [2311, 0, "i"], + [2312, 0, "l"], + [2313, 0, "e"], + [2314, 0, " "], + [2315, 0, "d"], + [2316, 0, "e"], + [2317, 0, "v"], + [2318, 0, "i"], + [2319, 0, "c"], + [2320, 0, "e"], + [2321, 0, "s"], + [2322, 0, " "], + [2323, 0, "t"], + [2324, 0, "h"], + [2325, 0, "a"], + [2326, 0, "t"], + [2327, 0, " "], + [2328, 0, "s"], + [2329, 0, "u"], + [2330, 0, "f"], + [2331, 0, "f"], + [2332, 0, "e"], + [2333, 0, "r"], + [2334, 0, " "], + [2335, 0, "p"], + [2336, 0, "e"], + [2337, 0, "r"], + [2338, 0, "i"], + [2339, 0, "o"], + [2340, 0, "d"], + [2341, 0, "s"], + [2341, 1], + [2340, 1], + [2339, 1], + [2338, 1], + [2337, 1], + [2336, 1], + [2335, 1], + [2334, 1], + [2333, 1], + [2332, 1], + [2331, 1], + [2330, 1], + [2329, 1], + [2328, 1], + [2327, 1], + [2326, 1], + [2325, 1], + [2324, 1], + [2323, 1], + [2323, 0, "w"], + [2324, 0, "i"], + [2325, 0, "t"], + [2326, 0, "h"], + [2327, 0, " "], + [2328, 0, "p"], + [2329, 0, "o"], + [2330, 0, "o"], + [2331, 0, "r"], + [2332, 0, " "], + [2333, 0, "n"], + [2334, 0, "e"], + [2335, 0, "t"], + [2336, 0, "w"], + [2337, 0, "o"], + [2338, 0, "r"], + [2339, 0, "k"], + [2340, 0, " "], + [2341, 0, "c"], + [2342, 0, "o"], + [2343, 0, "n"], + [2344, 0, "n"], + [2345, 0, "e"], + [2346, 0, "c"], + [2347, 0, "t"], + [2348, 0, "i"], + [2349, 0, "v"], + [2350, 0, "i"], + [2351, 0, "t"], + [2352, 0, "y"], + [2308, 0, "c"], + [2309, 0, "e"], + [2310, 0, "p"], + [2310, 1], + [2309, 1], + [2308, 1], + [2308, 0, "d"], + [2309, 0, "e"], + [2310, 0, "p"], + [2311, 0, "l"], + [2312, 0, "o"], + [2313, 0, "y"], + [2314, 0, "m"], + [2315, 0, "e"], + [2316, 0, "n"], + [2317, 0, "t"], + [2318, 0, " "], + [2319, 0, "o"], + [2320, 0, "n"], + [2321, 0, " "], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 1], + [2367, 0, ","], + [2620, 1], + [2619, 1], + [2618, 1], + [2617, 1], + [2616, 1], + [2615, 1], + [2614, 1], + [2613, 1], + [2612, 1], + [2611, 1], + [2610, 1], + [2609, 1], + [2608, 1], + [2607, 1], + [2606, 1], + [2605, 1], + [2604, 1], + [2603, 1], + [2602, 1], + [2601, 1], + [2600, 1], + [2599, 1], + [2598, 1], + [2597, 1], + [2596, 1], + [2595, 1], + [2594, 1], + [2593, 1], + [2592, 1], + [2591, 1], + [2590, 1], + [2589, 1], + [2588, 1], + [2587, 1], + [2586, 1], + [2585, 1], + [2584, 1], + [2583, 1], + [2582, 1], + [2581, 1], + [2580, 1], + [2579, 1], + [2578, 1], + [2577, 1], + [2576, 1], + [2575, 1], + [2574, 1], + [2573, 1], + [2572, 1], + [2571, 1], + [2570, 1], + [2569, 1], + [2568, 1], + [2567, 1], + [2566, 1], + [2565, 1], + [2564, 1], + [2563, 1], + [2562, 1], + [2561, 1], + [2560, 1], + [2559, 1], + [2558, 1], + [2557, 1], + [2556, 1], + [2555, 1], + [2554, 1], + [2553, 1], + [2552, 1], + [2551, 1], + [2550, 1], + [2549, 1], + [2548, 1], + [2547, 1], + [2546, 1], + [2545, 1], + [2544, 1], + [2543, 1], + [2542, 1], + [2541, 1], + [2540, 1], + [2539, 1], + [2538, 1], + [2537, 1], + [2536, 1], + [2535, 1], + [2534, 1], + [2533, 1], + [2532, 1], + [2531, 1], + [2530, 1], + [2529, 1], + [2528, 1], + [2527, 1], + [2526, 1], + [2525, 1], + [2524, 1], + [2523, 1], + [2522, 1], + [2521, 1], + [2520, 1], + [2519, 1], + [2518, 1], + [2517, 1], + [2516, 1], + [2515, 1], + [2514, 1], + [2513, 1], + [2512, 1], + [2511, 1], + [2510, 1], + [2509, 1], + [2508, 1], + [2507, 1], + [2506, 1], + [2505, 1], + [2504, 1], + [2503, 1], + [2502, 1], + [2501, 1], + [2500, 1], + [2499, 1], + [2498, 1], + [2497, 1], + [2496, 1], + [2495, 1], + [2494, 1], + [2493, 1], + [2492, 1], + [2491, 1], + [2490, 1], + [2489, 1], + [2488, 1], + [2487, 1], + [2486, 1], + [2485, 1], + [2484, 1], + [2483, 1], + [2482, 1], + [2481, 1], + [2480, 1], + [2479, 1], + [2478, 1], + [2477, 1], + [2476, 1], + [2475, 1], + [2474, 1], + [2473, 1], + [2472, 1], + [2471, 1], + [2470, 1], + [2469, 1], + [2468, 1], + [2467, 1], + [2466, 1], + [2465, 1], + [2464, 1], + [2463, 1], + [2462, 1], + [2461, 1], + [2460, 1], + [2459, 1], + [2458, 1], + [2457, 1], + [2456, 1], + [2455, 1], + [2454, 1], + [2453, 1], + [2452, 1], + [2451, 1], + [2450, 1], + [2449, 1], + [2448, 1], + [2447, 1], + [3378, 1], + [3377, 1], + [3376, 1], + [3375, 1], + [3374, 1], + [3373, 1], + [3372, 1], + [3371, 1], + [3370, 1], + [3369, 1], + [3368, 1], + [3367, 1], + [3366, 1], + [3365, 1], + [3364, 1], + [3363, 1], + [3362, 1], + [3361, 1], + [3360, 1], + [3359, 1], + [3358, 1], + [3357, 1], + [3356, 1], + [3355, 1], + [3354, 1], + [3353, 1], + [3352, 1], + [3351, 1], + [3350, 1], + [3349, 1], + [3348, 1], + [3347, 1], + [3346, 1], + [3345, 1], + [3344, 1], + [3343, 1], + [3342, 1], + [3341, 1], + [3340, 1], + [3339, 1], + [3338, 1], + [3337, 1], + [3336, 1], + [3335, 1], + [3334, 1], + [3333, 1], + [3332, 1], + [3331, 1], + [3330, 1], + [3329, 1], + [3328, 1], + [3327, 1], + [3326, 1], + [3325, 1], + [3324, 1], + [3323, 1], + [3322, 1], + [3321, 1], + [3320, 1], + [3319, 1], + [3318, 1], + [3317, 1], + [3316, 1], + [3315, 1], + [3314, 1], + [3313, 1], + [3312, 1], + [3311, 1], + [3310, 1], + [3309, 1], + [3308, 1], + [3307, 1], + [3306, 1], + [3305, 1], + [3304, 1], + [3303, 1], + [3302, 1], + [3301, 1], + [3300, 1], + [3299, 1], + [3298, 1], + [3297, 1], + [3296, 1], + [3295, 1], + [3294, 1], + [3293, 1], + [3292, 1], + [3291, 1], + [3290, 1], + [3289, 1], + [3288, 1], + [3287, 1], + [3286, 1], + [3285, 1], + [3284, 1], + [3283, 1], + [3282, 1], + [3281, 1], + [3280, 1], + [3279, 1], + [3278, 1], + [3277, 1], + [3276, 1], + [3275, 1], + [3274, 1], + [3273, 1], + [3272, 1], + [3271, 1], + [3270, 1], + [3269, 1], + [3268, 1], + [3267, 1], + [3266, 1], + [3265, 1], + [3264, 1], + [3263, 1], + [3262, 1], + [3261, 1], + [3260, 1], + [3259, 1], + [3258, 1], + [3257, 1], + [3256, 1], + [3255, 1], + [3254, 1], + [3253, 1], + [3252, 1], + [3251, 1], + [3250, 1], + [3249, 1], + [3248, 1], + [3247, 1], + [3246, 1], + [3245, 1], + [3244, 1], + [3243, 1], + [3242, 1], + [3241, 1], + [3240, 1], + [3239, 1], + [3238, 1], + [3237, 1], + [3236, 1], + [3235, 1], + [3234, 1], + [3233, 1], + [3232, 1], + [3231, 1], + [3230, 1], + [3229, 1], + [3228, 1], + [3227, 1], + [3226, 1], + [3225, 1], + [3224, 1], + [3223, 1], + [3222, 1], + [3221, 1], + [3220, 1], + [3219, 1], + [3218, 1], + [3217, 1], + [3216, 1], + [3130, 1], + [3129, 1], + [3128, 1], + [3127, 1], + [3126, 1], + [3125, 1], + [3124, 1], + [3123, 1], + [3122, 1], + [3121, 1], + [3120, 1], + [3119, 1], + [3118, 1], + [3117, 1], + [3116, 1], + [3115, 1], + [3115, 0, "i"], + [3116, 0, "v"], + [3117, 0, "e"], + [3118, 0, " "], + [3119, 0, "e"], + [3120, 0, "d"], + [3121, 0, "i"], + [3122, 0, "t"], + [3123, 0, "i"], + [3124, 0, "n"], + [3125, 0, "g"], + [3126, 0, " "], + [3127, 0, "o"], + [3128, 0, "f"], + [3103, 1], + [3102, 1], + [3101, 1], + [3100, 1], + [3099, 1], + [3098, 1], + [3097, 1], + [3096, 1], + [3095, 1], + [3094, 1], + [3093, 1], + [3092, 1], + [3091, 1], + [3090, 1], + [3089, 1], + [3088, 1], + [3087, 1], + [3086, 1], + [3085, 1], + [3084, 1], + [3083, 1], + [3082, 1], + [3081, 1], + [3080, 1], + [3079, 1], + [3078, 1], + [3077, 1], + [3076, 1], + [3075, 1], + [3075, 0, "S"], + [3076, 0, "i"], + [3077, 0, "m"], + [3078, 0, "i"], + [3079, 0, "l"], + [3080, 0, "a"], + [3081, 0, "r"], + [3082, 0, "l"], + [3083, 0, "y"], + [3084, 0, ","], + [3194, 0, " "], + [3195, 0, "i"], + [3196, 0, "s"], + [3197, 0, " "], + [3098, 1], + [3097, 1], + [3097, 0, "v"], + [3098, 0, "e"], + [3099, 0, " "], + [3100, 0, "w"], + [3101, 0, "o"], + [3102, 0, "r"], + [3103, 0, "k"], + [3104, 0, " "], + [3105, 0, "o"], + [3106, 0, "f"], + [3107, 0, "t"], + [3108, 0, "e"], + [3109, 0, "n"], + [3110, 0, " "], + [3111, 0, "r"], + [3112, 0, "e"], + [3113, 0, "q"], + [3114, 0, "u"], + [3115, 0, "i"], + [3116, 0, "r"], + [3117, 0, "e"], + [3118, 0, "s"], + [3119, 0, " "], + [3120, 0, "s"], + [3121, 0, "e"], + [3122, 0, "v"], + [3123, 0, "e"], + [3124, 0, "r"], + [3125, 0, "a"], + [3126, 0, "l"], + [3127, 0, " "], + [3128, 0, "p"], + [3129, 0, "e"], + [3130, 0, "o"], + [3131, 0, "p"], + [3132, 0, "l"], + [3133, 0, "e"], + [3134, 0, " "], + [3135, 0, "t"], + [3136, 0, "o"], + [3137, 0, " "], + [3138, 0, "w"], + [3139, 0, "o"], + [3140, 0, "r"], + [3141, 0, "k"], + [3142, 0, " "], + [3143, 0, "o"], + [3144, 0, "n"], + [3145, 0, " "], + [3146, 0, "t"], + [3147, 0, "h"], + [3148, 0, "e"], + [3149, 0, " "], + [3150, 0, "s"], + [3151, 0, "a"], + [3152, 0, "m"], + [3153, 0, "e"], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3154, 1], + [3241, 1], + [3240, 1], + [3239, 1], + [3238, 1], + [3238, 0, ";"], + [3239, 0, " "], + [3144, 1], + [3143, 1], + [3142, 1], + [3141, 1], + [3140, 1], + [3139, 1], + [3138, 1], + [3138, 0, "e"], + [3139, 0, "d"], + [3140, 0, "i"], + [3141, 0, "t"], + [3237, 0, "i"], + [3238, 0, "f"], + [3239, 0, " "], + [3240, 0, "e"], + [3241, 0, "a"], + [3242, 0, "c"], + [3243, 0, "h"], + [3244, 0, " "], + [3245, 0, "p"], + [3246, 0, "e"], + [3247, 0, "r"], + [3248, 0, "s"], + [3249, 0, "o"], + [3250, 0, "n"], + [3251, 0, " "], + [3252, 0, "u"], + [3253, 0, "s"], + [3254, 0, "e"], + [3255, 0, "s"], + [3256, 0, " "], + [3257, 0, "t"], + [3258, 0, "h"], + [3259, 0, "e"], + [3260, 0, "i"], + [3261, 0, "r"], + [3262, 0, " "], + [3263, 0, "o"], + [3264, 0, "w"], + [3265, 0, "n"], + [3266, 0, " "], + [3267, 0, "d"], + [3268, 0, "e"], + [3269, 0, "v"], + [3270, 0, "i"], + [3271, 0, "c"], + [3272, 0, "e"], + [3273, 0, ","], + [3274, 0, " "], + [3275, 0, "e"], + [3276, 0, "d"], + [3277, 0, "i"], + [3278, 0, "t"], + [3279, 0, "s"], + [3280, 0, " "], + [3281, 0, "m"], + [3282, 0, "a"], + [3138, 0, "s"], + [3139, 0, "i"], + [3140, 0, "m"], + [3141, 0, "u"], + [3142, 0, "l"], + [3143, 0, "t"], + [3144, 0, "a"], + [3145, 0, "n"], + [3146, 0, "e"], + [3147, 0, "o"], + [3148, 0, "u"], + [3149, 0, "s"], + [3150, 0, "l"], + [3151, 0, "y"], + [3152, 0, " "], + [3180, 1], + [3193, 1], + [3207, 1], + [3216, 1], + [3245, 1], + [3282, 1], + [3281, 1], + [3280, 1], + [3279, 1], + [3278, 1], + [3277, 1], + [3276, 1], + [3275, 1], + [3274, 1], + [3273, 1], + [3272, 1], + [3271, 1], + [3270, 1], + [3269, 1], + [3268, 1], + [3267, 1], + [3266, 1], + [3265, 1], + [3264, 1], + [3263, 1], + [3262, 1], + [3261, 1], + [3260, 1], + [3259, 1], + [3258, 1], + [3257, 1], + [3256, 1], + [3255, 1], + [3254, 1], + [3253, 1], + [3252, 1], + [3251, 1], + [3250, 1], + [3249, 1], + [3248, 1], + [3247, 1], + [3246, 1], + [3245, 1], + [3246, 0, " "], + [3247, 0, "w"], + [3248, 0, "i"], + [3249, 0, "t"], + [3250, 0, "h"], + [3251, 0, " "], + [3252, 0, "o"], + [3253, 0, "n"], + [3254, 0, "e"], + [3255, 0, " "], + [3256, 0, "p"], + [3257, 0, "e"], + [3258, 0, "r"], + [3259, 0, "s"], + [3259, 1], + [3258, 1], + [3257, 1], + [3256, 1], + [3255, 1], + [3254, 1], + [3253, 1], + [3252, 1], + [3252, 0, "e"], + [3253, 0, "a"], + [3254, 0, "c"], + [3255, 0, "h"], + [3256, 0, " "], + [3257, 0, "p"], + [3258, 0, "e"], + [3259, 0, "r"], + [3260, 0, "s"], + [3261, 0, "o"], + [3262, 0, "n"], + [3263, 0, "'"], + [3264, 0, "s"], + [3265, 0, " "], + [3265, 1], + [3273, 1], + [3272, 1], + [3272, 0, "s"], + [3273, 0, "y"], + [3274, 0, "n"], + [3275, 0, "c"], + [3276, 0, "h"], + [3277, 0, "r"], + [3278, 0, "o"], + [3279, 0, "n"], + [3280, 0, "i"], + [3281, 0, "z"], + [3281, 1], + [3280, 1], + [3279, 1], + [3278, 1], + [3277, 1], + [3276, 1], + [3275, 1], + [3274, 1], + [3273, 1], + [3272, 1], + [3272, 0, "r"], + [3273, 0, "e"], + [3274, 0, "f"], + [3275, 0, "l"], + [3276, 0, "e"], + [3277, 0, "c"], + [3278, 0, "t"], + [3279, 0, "e"], + [3280, 0, "d"], + [3281, 0, " "], + [3282, 0, "o"], + [3283, 0, "n"], + [3284, 0, " "], + [3285, 0, "t"], + [3286, 0, "h"], + [3287, 0, "e"], + [3288, 0, " "], + [3289, 0, "o"], + [3290, 0, "t"], + [3291, 0, "h"], + [3292, 0, "e"], + [3293, 0, "r"], + [3294, 0, " "], + [3295, 0, "c"], + [3296, 0, "o"], + [3297, 0, "l"], + [3298, 0, "l"], + [3299, 0, "a"], + [3300, 0, "b"], + [3301, 0, "o"], + [3302, 0, "r"], + [3303, 0, "a"], + [3304, 0, "t"], + [3305, 0, "o"], + [3306, 0, "r"], + [3307, 0, "s"], + [3308, 0, "'"], + [3309, 0, " "], + [3310, 0, "c"], + [3311, 0, "o"], + [3312, 0, "p"], + [3313, 0, "i"], + [3314, 0, "e"], + [3315, 0, "s"], + [3316, 0, " "], + [3317, 0, "o"], + [3318, 0, "f"], + [3319, 0, " "], + [3320, 0, "t"], + [3321, 0, "h"], + [3322, 0, "e"], + [3323, 0, " "], + [3324, 0, "d"], + [3325, 0, "o"], + [3326, 0, "c"], + [3327, 0, "u"], + [3328, 0, "m"], + [3329, 0, "e"], + [3330, 0, "n"], + [3331, 0, "t"], + [3332, 0, " "], + [3333, 0, "w"], + [3334, 0, "i"], + [3335, 0, "t"], + [3336, 0, "h"], + [3337, 0, " "], + [3338, 0, "m"], + [3339, 0, "i"], + [3340, 0, "n"], + [3341, 0, "i"], + [3342, 0, "m"], + [3343, 0, "a"], + [3344, 0, "l"], + [3345, 0, " "], + [3346, 0, "d"], + [3347, 0, "e"], + [3348, 0, "l"], + [3349, 0, "a"], + [3350, 0, "y"], + [9033, 0, "\n"], + [9034, 0, "\n"], + [9035, 0, "I"], + [9036, 0, "n"], + [9037, 0, " "], + [9038, 0, "S"], + [9039, 0, "e"], + [9040, 0, "c"], + [9041, 0, "t"], + [9042, 0, "i"], + [9043, 0, "o"], + [9044, 0, "n"], + [9045, 0, "~"], + [9046, 0, "\\"], + [9047, 0, "r"], + [9048, 0, "e"], + [9049, 0, "f"], + [9050, 0, "{"], + [9051, 0, "s"], + [9052, 0, "e"], + [9053, 0, "c"], + [9054, 0, ":"], + [9055, 0, "c"], + [9056, 0, "o"], + [9057, 0, "n"], + [9058, 0, "v"], + [9059, 0, "e"], + [9060, 0, "r"], + [9061, 0, "g"], + [9062, 0, "e"], + [9063, 0, "n"], + [9064, 0, "c"], + [9065, 0, "e"], + [9066, 0, "}"], + [9067, 0, " "], + [9068, 0, "a"], + [9069, 0, "n"], + [9070, 0, "d"], + [9071, 0, " "], + [9072, 0, "t"], + [9073, 0, "h"], + [9074, 0, "e"], + [9075, 0, " "], + [9076, 0, "a"], + [9077, 0, "p"], + [9078, 0, "p"], + [9079, 0, "e"], + [9080, 0, "n"], + [9081, 0, "d"], + [9082, 0, "i"], + [9083, 0, "x"], + [9084, 0, " "], + [9084, 1], + [9084, 0, "."], + [9035, 0, " "], + [9035, 0, "A"], + [9036, 0, " "], + [9037, 0, "k"], + [9038, 0, "e"], + [9039, 0, "y"], + [9040, 0, " "], + [9041, 0, "r"], + [9042, 0, "e"], + [9043, 0, "q"], + [9044, 0, "u"], + [9045, 0, "i"], + [9046, 0, "r"], + [9047, 0, "e"], + [9048, 0, "m"], + [9049, 0, "e"], + [9050, 0, "n"], + [9051, 0, "t"], + [9052, 0, " "], + [9053, 0, "o"], + [9054, 0, "f"], + [9055, 0, " "], + [9056, 0, "c"], + [9057, 0, "o"], + [9058, 0, "n"], + [9059, 0, "f"], + [9060, 0, "l"], + [9061, 0, "i"], + [9062, 0, "c"], + [9063, 0, "t"], + [9064, 0, " "], + [9065, 0, "r"], + [9066, 0, "e"], + [9067, 0, "s"], + [9068, 0, "o"], + [9069, 0, "l"], + [9070, 0, "u"], + [9071, 0, "t"], + [9072, 0, "i"], + [9073, 0, "o"], + [9074, 0, "n"], + [9075, 0, " "], + [9076, 0, "i"], + [9077, 0, "s"], + [9078, 0, " "], + [9079, 0, "t"], + [9080, 0, "h"], + [9081, 0, "a"], + [9082, 0, "t"], + [9083, 0, " "], + [9084, 0, "r"], + [9085, 0, "e"], + [9086, 0, "p"], + [9087, 0, "l"], + [9088, 0, "i"], + [9089, 0, "c"], + [9090, 0, "a"], + [9091, 0, "s"], + [9092, 0, " "], + [9093, 0, "c"], + [9094, 0, "o"], + [9095, 0, "n"], + [9096, 0, "v"], + [9097, 0, "e"], + [9098, 0, "r"], + [9099, 0, "g"], + [9100, 0, "e"], + [9101, 0, " "], + [9102, 0, "t"], + [9103, 0, "o"], + [9104, 0, "w"], + [9105, 0, "a"], + [9106, 0, "r"], + [9107, 0, "d"], + [9108, 0, "s"], + [9109, 0, " "], + [9110, 0, "t"], + [9111, 0, "h"], + [9112, 0, "e"], + [9113, 0, " "], + [9114, 0, "s"], + [9115, 0, "a"], + [9116, 0, "m"], + [9117, 0, "e"], + [9118, 0, " "], + [9119, 0, "s"], + [9120, 0, "t"], + [9121, 0, "a"], + [9122, 0, "t"], + [9123, 0, "e"], + [9124, 0, ","], + [9125, 0, " "], + [9126, 0, "o"], + [9127, 0, "r"], + [9128, 0, " "], + [9129, 0, "m"], + [9130, 0, "o"], + [9131, 0, "r"], + [9132, 0, "e"], + [9133, 0, " "], + [9134, 0, "f"], + [9135, 0, "o"], + [9136, 0, "r"], + [9137, 0, "m"], + [9138, 0, "a"], + [9139, 0, "l"], + [9140, 0, "l"], + [9141, 0, "y"], + [9142, 0, ","], + [9143, 0, " "], + [9144, 0, "a"], + [9145, 0, "n"], + [9146, 0, "y"], + [9147, 0, " "], + [9148, 0, "t"], + [9149, 0, "w"], + [9150, 0, "o"], + [9151, 0, " "], + [9152, 0, "r"], + [9153, 0, "e"], + [9154, 0, "p"], + [9155, 0, "l"], + [9156, 0, "i"], + [9157, 0, "c"], + [9158, 0, "a"], + [9159, 0, "s"], + [9160, 0, " "], + [9161, 0, "t"], + [9162, 0, "h"], + [9163, 0, "a"], + [9164, 0, "t"], + [9165, 0, " "], + [9166, 0, "h"], + [9167, 0, "a"], + [9168, 0, "v"], + [9169, 0, "e"], + [9170, 0, " "], + [9171, 0, "p"], + [9172, 0, "r"], + [9173, 0, "o"], + [9174, 0, "c"], + [9175, 0, "e"], + [9176, 0, "s"], + [9177, 0, "s"], + [9178, 0, "e"], + [9179, 0, "d"], + [9180, 0, " "], + [9181, 0, "t"], + [9182, 0, "h"], + [9183, 0, "e"], + [9184, 0, " "], + [9185, 0, "s"], + [9186, 0, "a"], + [9187, 0, "m"], + [9188, 0, "e"], + [9189, 0, " "], + [9190, 0, "s"], + [9191, 0, "e"], + [9192, 0, "t"], + [9193, 0, " "], + [9194, 0, "o"], + [9195, 0, "f"], + [9196, 0, " "], + [9197, 0, "o"], + [9198, 0, "p"], + [9199, 0, "e"], + [9200, 0, "r"], + [9084, 0, "a"], + [9085, 0, "l"], + [9086, 0, "l"], + [9087, 0, " "], + [9096, 0, " "], + [9097, 0, "e"], + [9098, 0, "v"], + [9099, 0, "e"], + [9100, 0, "n"], + [9101, 0, "t"], + [9102, 0, "u"], + [9103, 0, "a"], + [9104, 0, "l"], + [9105, 0, "l"], + [9106, 0, "y"], + [9215, 1], + [9214, 1], + [9213, 1], + [9212, 1], + [9211, 1], + [9210, 1], + [9209, 1], + [9208, 1], + [9207, 1], + [9206, 1], + [9205, 1], + [9204, 1], + [9203, 1], + [9202, 1], + [9201, 1], + [9200, 1], + [9199, 1], + [9198, 1], + [9197, 1], + [9196, 1], + [9195, 1], + [9194, 1], + [9193, 1], + [9192, 1], + [9191, 1], + [9190, 1], + [9189, 1], + [9188, 1], + [9187, 1], + [9186, 1], + [9185, 1], + [9184, 1], + [9183, 1], + [9182, 1], + [9181, 1], + [9180, 1], + [9179, 1], + [9178, 1], + [9177, 1], + [9176, 1], + [9175, 1], + [9174, 1], + [9173, 1], + [9172, 1], + [9171, 1], + [9170, 1], + [9169, 1], + [9168, 1], + [9167, 1], + [9166, 1], + [9165, 1], + [9164, 1], + [9163, 1], + [9162, 1], + [9161, 1], + [9160, 1], + [9159, 1], + [9158, 1], + [9157, 1], + [9156, 1], + [9155, 1], + [9154, 1], + [9153, 1], + [9152, 1], + [9151, 1], + [9150, 1], + [9149, 1], + [9148, 1], + [9147, 1], + [9146, 1], + [9145, 1], + [9144, 1], + [9143, 1], + [9142, 1], + [9141, 1], + [9083, 0, " "], + [9084, 0, "a"], + [9085, 0, "f"], + [9086, 0, "t"], + [9087, 0, "e"], + [9088, 0, "r"], + [9089, 0, " "], + [9090, 0, "a"], + [9091, 0, "n"], + [9092, 0, "y"], + [9093, 0, " "], + [9094, 0, "s"], + [9095, 0, "e"], + [9096, 0, "q"], + [9097, 0, "u"], + [9098, 0, "e"], + [9099, 0, "n"], + [9100, 0, "c"], + [9101, 0, "e"], + [9102, 0, " "], + [9103, 0, "o"], + [9104, 0, "f"], + [9105, 0, " "], + [9106, 0, "c"], + [9107, 0, "o"], + [9108, 0, "n"], + [9109, 0, "c"], + [9110, 0, "u"], + [9111, 0, "r"], + [9112, 0, "r"], + [9113, 0, "e"], + [9114, 0, "n"], + [9115, 0, "t"], + [9116, 0, " "], + [9117, 0, "m"], + [9118, 0, "o"], + [9119, 0, "d"], + [9120, 0, "i"], + [9121, 0, "f"], + [9122, 0, "i"], + [9123, 0, "c"], + [9124, 0, "a"], + [9125, 0, "t"], + [9126, 0, "i"], + [9127, 0, "o"], + [9128, 0, "n"], + [9129, 0, "s"], + [9130, 0, ","], + [9188, 1], + [9187, 1], + [9187, 0, "."], + [9238, 0, " "], + [9239, 0, "w"], + [9240, 0, "e"], + [9241, 0, " "], + [9242, 0, "p"], + [9243, 0, "r"], + [9244, 0, "o"], + [9245, 0, "v"], + [9246, 0, "e"], + [9247, 0, " "], + [9248, 0, "t"], + [9249, 0, "h"], + [9250, 0, "a"], + [9251, 0, "t"], + [9252, 0, " "], + [9253, 0, "o"], + [9254, 0, "u"], + [9255, 0, "r"], + [9256, 0, " "], + [9257, 0, "a"], + [9258, 0, "l"], + [9259, 0, "g"], + [9260, 0, "o"], + [9261, 0, "r"], + [9262, 0, "i"], + [9263, 0, "t"], + [9264, 0, "h"], + [9265, 0, "m"], + [9266, 0, " "], + [9267, 0, "s"], + [9268, 0, "a"], + [9269, 0, "t"], + [9270, 0, "i"], + [9271, 0, "s"], + [9272, 0, "f"], + [9273, 0, "i"], + [9274, 0, "e"], + [9275, 0, "s"], + [9276, 0, " "], + [9277, 0, "t"], + [9278, 0, "h"], + [9279, 0, "i"], + [9280, 0, "s"], + [9281, 0, " "], + [9282, 0, "r"], + [9283, 0, "e"], + [9284, 0, "q"], + [9285, 0, "u"], + [9286, 0, "i"], + [9287, 0, "r"], + [9288, 0, "e"], + [9289, 0, "m"], + [9290, 0, "e"], + [9291, 0, "n"], + [9292, 0, "t"], + [9247, 0, " "], + [9248, 0, "a"], + [9249, 0, " "], + [9250, 0, "t"], + [9251, 0, "h"], + [9252, 0, "e"], + [9253, 0, "o"], + [9254, 0, "r"], + [9255, 0, "e"], + [9256, 0, "m"], + [9257, 0, " "], + [9258, 0, "t"], + [9259, 0, "o"], + [9260, 0, " "], + [9261, 0, "s"], + [9262, 0, "h"], + [9263, 0, "o"], + [9264, 0, "w"], + [9032, 0, " "], + [9033, 0, "t"], + [9034, 0, "h"], + [9035, 0, "a"], + [9036, 0, "t"], + [9037, 0, " "], + [9038, 0, "c"], + [9039, 0, "a"], + [9040, 0, "n"], + [9041, 0, " "], + [9042, 0, "b"], + [9043, 0, "e"], + [9044, 0, " "], + [9045, 0, "d"], + [9046, 0, "e"], + [9047, 0, "p"], + [9048, 0, "l"], + [9049, 0, "o"], + [9050, 0, "y"], + [9051, 0, "e"], + [9052, 0, "d"], + [9053, 0, " "], + [9054, 0, "o"], + [9055, 0, "n"], + [9056, 0, " "], + [9057, 0, "a"], + [9058, 0, "n"], + [9059, 0, "y"], + [9060, 0, " "], + [9061, 0, "n"], + [9062, 0, "e"], + [9063, 0, "t"], + [9064, 0, "w"], + [9065, 0, "o"], + [9066, 0, "r"], + [9067, 0, "k"], + [9068, 0, " "], + [9069, 0, "t"], + [9070, 0, "o"], + [9071, 0, "p"], + [9072, 0, "o"], + [9073, 0, "l"], + [9074, 0, "o"], + [9075, 0, "g"], + [9076, 0, "y"], + [9710, 1], + [9710, 0, " "], + [9723, 0, ","], + [15315, 0, " "], + [15316, 0, "-"], + [15317, 0, "-"], + [15318, 0, " "], + [15319, 0, "i"], + [15320, 0, "n"], + [15321, 0, " "], + [15322, 0, "o"], + [15323, 0, "t"], + [15324, 0, "h"], + [15325, 0, "e"], + [15326, 0, "r"], + [15327, 0, " "], + [15328, 0, "w"], + [15329, 0, "o"], + [15330, 0, "r"], + [15331, 0, "d"], + [15332, 0, "s"], + [15333, 0, ","], + [15334, 0, " "], + [15335, 0, "t"], + [15336, 0, "h"], + [15337, 0, "e"], + [15338, 0, " "], + [15339, 0, "o"], + [15340, 0, "n"], + [15341, 0, "l"], + [15342, 0, "y"], + [15343, 0, " "], + [15344, 0, "d"], + [15345, 0, "a"], + [15346, 0, "t"], + [15347, 0, "a"], + [15348, 0, "t"], + [15349, 0, "y"], + [15350, 0, "p"], + [15351, 0, "e"], + [15352, 0, " "], + [15353, 0, "i"], + [15354, 0, "t"], + [15355, 0, " "], + [15356, 0, "s"], + [15357, 0, "u"], + [15358, 0, "p"], + [15359, 0, "p"], + [15360, 0, "o"], + [15361, 0, "r"], + [15362, 0, "t"], + [15363, 0, "s"], + [15364, 0, " "], + [15365, 0, "i"], + [15366, 0, "s"], + [15367, 0, " "], + [15368, 0, "a"], + [15369, 0, " "], + [15370, 0, "m"], + [15371, 0, "u"], + [15372, 0, "l"], + [15373, 0, "t"], + [15374, 0, "i"], + [15375, 0, "-"], + [15376, 0, "v"], + [15377, 0, "a"], + [15378, 0, "l"], + [15379, 0, "u"], + [15380, 0, "e"], + [15381, 0, " "], + [15382, 0, "r"], + [15383, 0, "e"], + [15384, 0, "g"], + [15385, 0, "i"], + [15386, 0, "s"], + [15387, 0, "t"], + [15388, 0, "e"], + [15389, 0, "r"], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 1], + [21995, 0, "s"], + [21996, 0, "h"], + [21997, 0, "o"], + [21998, 0, "p"], + [21999, 0, "p"], + [22000, 0, "i"], + [22001, 0, "n"], + [22002, 0, "g"], + [22069, 1], + [22068, 1], + [22067, 1], + [22066, 1], + [22065, 1], + [22064, 1], + [22063, 1], + [22062, 1], + [22061, 1], + [22061, 0, "s"], + [22062, 0, "h"], + [22063, 0, "o"], + [22064, 0, "p"], + [22065, 0, "p"], + [22066, 0, "i"], + [22067, 0, "n"], + [22068, 0, "g"], + [22135, 1], + [22134, 1], + [22133, 1], + [22132, 1], + [22131, 1], + [22130, 1], + [22129, 1], + [22128, 1], + [22127, 1], + [22127, 0, "s"], + [22128, 0, "h"], + [22129, 0, "o"], + [22130, 0, "p"], + [22131, 0, "p"], + [22132, 0, "i"], + [22133, 0, "n"], + [22134, 0, "g"], + [22209, 1], + [22208, 1], + [22207, 1], + [22206, 1], + [22205, 1], + [22204, 1], + [22203, 1], + [22202, 1], + [22201, 1], + [22201, 0, "s"], + [22202, 0, "h"], + [22203, 0, "o"], + [22204, 0, "p"], + [22205, 0, "p"], + [22206, 0, "i"], + [22207, 0, "n"], + [22208, 0, "g"], + [22292, 1], + [22291, 1], + [22290, 1], + [22289, 1], + [22288, 1], + [22287, 1], + [22286, 1], + [22285, 1], + [22284, 1], + [22284, 0, "s"], + [22285, 0, "h"], + [22286, 0, "o"], + [22287, 0, "p"], + [22288, 0, "p"], + [22289, 0, "i"], + [22290, 0, "n"], + [22291, 0, "g"], + [22366, 1], + [22365, 1], + [22364, 1], + [22363, 1], + [22362, 1], + [22361, 1], + [22360, 1], + [22359, 1], + [22358, 1], + [22358, 0, "s"], + [22359, 0, "h"], + [22360, 0, "o"], + [22361, 0, "p"], + [22362, 0, "p"], + [22363, 0, "i"], + [22364, 0, "n"], + [22365, 0, "g"], + [22451, 1], + [22450, 1], + [22449, 1], + [22448, 1], + [22447, 1], + [22446, 1], + [22445, 1], + [22444, 1], + [22443, 1], + [22443, 0, "s"], + [22444, 0, "h"], + [22445, 0, "o"], + [22446, 0, "p"], + [22447, 0, "p"], + [22448, 0, "i"], + [22449, 0, "n"], + [22450, 0, "g"], + [22555, 1], + [22554, 1], + [22553, 1], + [22552, 1], + [22551, 1], + [22550, 1], + [22549, 1], + [22548, 1], + [22547, 1], + [22547, 0, "s"], + [22548, 0, "h"], + [22549, 0, "o"], + [22550, 0, "p"], + [22551, 0, "p"], + [22552, 0, "i"], + [22553, 0, "n"], + [22554, 0, "g"], + [22739, 1], + [22738, 1], + [22737, 1], + [22736, 1], + [22735, 1], + [22734, 1], + [22733, 1], + [22732, 1], + [22731, 1], + [22731, 0, "s"], + [22732, 0, "h"], + [22733, 0, "o"], + [22734, 0, "p"], + [22735, 0, "p"], + [22736, 0, "i"], + [22737, 0, "n"], + [22738, 0, "g"], + [22817, 1], + [22816, 1], + [22815, 1], + [22814, 1], + [22813, 1], + [22812, 1], + [22811, 1], + [22810, 1], + [22809, 1], + [22809, 0, "s"], + [22810, 0, "h"], + [22811, 0, "o"], + [22812, 0, "p"], + [22813, 0, "p"], + [22814, 0, "i"], + [22815, 0, "n"], + [22816, 0, "g"], + [22896, 1], + [22895, 1], + [22894, 1], + [22893, 1], + [22892, 1], + [22891, 1], + [22890, 1], + [22889, 1], + [22888, 1], + [22888, 0, "s"], + [22889, 0, "h"], + [22890, 0, "o"], + [22891, 0, "p"], + [22892, 0, "p"], + [22893, 0, "i"], + [22894, 0, "n"], + [22895, 0, "g"], + [22990, 1], + [22989, 1], + [22988, 1], + [22987, 1], + [22986, 1], + [22985, 1], + [22984, 1], + [22983, 1], + [22982, 1], + [22982, 0, "s"], + [22983, 0, "h"], + [22984, 0, "o"], + [22985, 0, "p"], + [22986, 0, "p"], + [22987, 0, "i"], + [22988, 0, "n"], + [22989, 0, "g"], + [23698, 1], + [23697, 1], + [23696, 1], + [23695, 1], + [23694, 1], + [23693, 1], + [23692, 1], + [23691, 1], + [23690, 1], + [23690, 0, "s"], + [23691, 0, "h"], + [23692, 0, "o"], + [23693, 0, "p"], + [23694, 0, "p"], + [23695, 0, "i"], + [23696, 0, "n"], + [23697, 0, "g"], + [23697, 1], + [23696, 1], + [23695, 1], + [23694, 1], + [23693, 1], + [23692, 1], + [23691, 1], + [23690, 1], + [23690, 0, "g"], + [23691, 0, "r"], + [23692, 0, "o"], + [23693, 0, "c"], + [23694, 0, "e"], + [23695, 0, "r"], + [23696, 0, "y"], + [23697, 0, "t"], + [23697, 1], + [22989, 1], + [22988, 1], + [22987, 1], + [22986, 1], + [22985, 1], + [22984, 1], + [22983, 1], + [22982, 1], + [22982, 0, "g"], + [22983, 0, "r"], + [22984, 0, "o"], + [22985, 0, "c"], + [22986, 0, "e"], + [22987, 0, "r"], + [22988, 0, "y"], + [22895, 1], + [22894, 1], + [22893, 1], + [22892, 1], + [22891, 1], + [22890, 1], + [22889, 1], + [22888, 1], + [22888, 0, "g"], + [22889, 0, "r"], + [22890, 0, "o"], + [22891, 0, "c"], + [22892, 0, "e"], + [22893, 0, "r"], + [22894, 0, "y"], + [22816, 1], + [22815, 1], + [22814, 1], + [22813, 1], + [22812, 1], + [22811, 1], + [22810, 1], + [22809, 1], + [22809, 0, "g"], + [22810, 0, "r"], + [22811, 0, "o"], + [22812, 0, "c"], + [22813, 0, "e"], + [22814, 0, "r"], + [22815, 0, "y"], + [22738, 1], + [22737, 1], + [22736, 1], + [22735, 1], + [22734, 1], + [22733, 1], + [22732, 1], + [22731, 1], + [22731, 0, "g"], + [22732, 0, "r"], + [22733, 0, "o"], + [22734, 0, "c"], + [22735, 0, "e"], + [22736, 0, "r"], + [22737, 0, "y"], + [22554, 1], + [22553, 1], + [22552, 1], + [22551, 1], + [22550, 1], + [22549, 1], + [22548, 1], + [22547, 1], + [22547, 0, "g"], + [22548, 0, "r"], + [22549, 0, "o"], + [22550, 0, "c"], + [22551, 0, "e"], + [22552, 0, "r"], + [22553, 0, "y"], + [22450, 1], + [22449, 1], + [22448, 1], + [22447, 1], + [22446, 1], + [22445, 1], + [22444, 1], + [22443, 1], + [22443, 0, "g"], + [22444, 0, "r"], + [22445, 0, "o"], + [22446, 0, "c"], + [22447, 0, "e"], + [22448, 0, "r"], + [22449, 0, "y"], + [22365, 1], + [22364, 1], + [22363, 1], + [22362, 1], + [22361, 1], + [22360, 1], + [22359, 1], + [22358, 1], + [22358, 0, "g"], + [22359, 0, "r"], + [22360, 0, "o"], + [22361, 0, "c"], + [22362, 0, "e"], + [22363, 0, "r"], + [22364, 0, "y"], + [22291, 1], + [22290, 1], + [22289, 1], + [22288, 1], + [22287, 1], + [22286, 1], + [22285, 1], + [22284, 1], + [22284, 0, "g"], + [22285, 0, "r"], + [22286, 0, "o"], + [22287, 0, "c"], + [22288, 0, "e"], + [22289, 0, "r"], + [22290, 0, "y"], + [22208, 1], + [22207, 1], + [22206, 1], + [22205, 1], + [22204, 1], + [22203, 1], + [22202, 1], + [22201, 1], + [22201, 0, "g"], + [22202, 0, "r"], + [22203, 0, "o"], + [22204, 0, "c"], + [22205, 0, "e"], + [22206, 0, "r"], + [22207, 0, "y"], + [22134, 1], + [22133, 1], + [22132, 1], + [22131, 1], + [22130, 1], + [22129, 1], + [22128, 1], + [22127, 1], + [22127, 0, "g"], + [22128, 0, "r"], + [22129, 0, "o"], + [22130, 0, "c"], + [22131, 0, "e"], + [22132, 0, "r"], + [22133, 0, "y"], + [22068, 1], + [22067, 1], + [22066, 1], + [22065, 1], + [22064, 1], + [22063, 1], + [22062, 1], + [22061, 1], + [22061, 0, "g"], + [22062, 0, "r"], + [22063, 0, "o"], + [22064, 0, "c"], + [22065, 0, "e"], + [22066, 0, "r"], + [22067, 0, "y"], + [22002, 1], + [22001, 1], + [22000, 1], + [21999, 1], + [21998, 1], + [21997, 1], + [21996, 1], + [21995, 1], + [21995, 0, "g"], + [21996, 0, "r"], + [21997, 0, "o"], + [21998, 0, "c"], + [21999, 0, "e"], + [22000, 0, "r"], + [22001, 0, "y"], + [26092, 1], + [26091, 1], + [26090, 1], + [26089, 1], + [26088, 1], + [26087, 1], + [26086, 1], + [26085, 1], + [26084, 1], + [26092, 0, " "], + [26093, 0, "$"], + [26094, 0, "p"], + [26095, 0, "$"], + [26107, 1], + [26106, 1], + [26105, 1], + [26104, 1], + [26103, 1], + [26102, 1], + [26101, 1], + [26101, 0, "v"], + [26102, 0, "i"], + [26103, 0, "n"], + [26104, 0, "g"], + [26321, 1], + [26320, 1], + [26319, 1], + [26318, 1], + [26317, 1], + [26316, 1], + [26315, 1], + [26315, 0, "c"], + [26316, 0, "a"], + [26317, 0, "s"], + [26318, 0, "e"], + [25718, 1], + [25717, 1], + [25716, 1], + [25715, 1], + [25714, 1], + [25714, 0, "F"], + [25719, 0, "l"], + [25720, 0, "y"], + [25721, 0, ","], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [25723, 1], + [26564, 1], + [26563, 1], + [26563, 0, "f"], + [26564, 0, "o"], + [26565, 0, "r"], + [30028, 0, " "], + [30029, 0, "a"], + [30030, 0, "s"], + [30031, 0, "y"], + [30032, 0, "n"], + [30033, 0, "c"], + [30034, 0, "h"], + [30035, 0, "r"], + [30036, 0, "o"], + [30037, 0, "n"], + [30038, 0, "o"], + [30039, 0, "u"], + [30040, 0, "s"], + [30074, 0, "b"], + [30074, 1], + [29964, 0, "i"], + [29965, 0, "m"], + [29966, 0, "m"], + [29967, 0, "e"], + [29968, 0, "d"], + [29969, 0, "i"], + [29970, 0, "a"], + [29971, 0, "t"], + [29972, 0, "e"], + [29973, 0, "l"], + [29974, 0, "y"], + [29975, 0, " "], + [46, 0, "\n"], + [47, 0, "\\"], + [48, 0, "P"], + [49, 0, "a"], + [50, 0, "s"], + [51, 0, "s"], + [52, 0, "O"], + [53, 0, "p"], + [54, 0, "t"], + [55, 0, "i"], + [56, 0, "o"], + [57, 0, "n"], + [58, 0, "s"], + [59, 0, "T"], + [60, 0, "o"], + [61, 0, "P"], + [62, 0, "a"], + [63, 0, "c"], + [64, 0, "k"], + [65, 0, "a"], + [66, 0, "g"], + [67, 0, "e"], + [68, 0, "{"], + [69, 0, "h"], + [70, 0, "y"], + [71, 0, "p"], + [72, 0, "h"], + [73, 0, "e"], + [74, 0, "n"], + [75, 0, "s"], + [76, 0, "}"], + [77, 0, "{"], + [78, 0, "u"], + [79, 0, "r"], + [80, 0, "l"], + [81, 0, "}"], + [300, 1], + [299, 1], + [298, 1], + [297, 1], + [296, 1], + [295, 1], + [294, 1], + [293, 1], + [292, 1], + [291, 1], + [290, 1], + [289, 1], + [288, 1], + [287, 1], + [286, 1], + [285, 1], + [284, 1], + [283, 1], + [282, 1], + [281, 1], + [280, 1], + [279, 1], + [278, 1], + [277, 1], + [276, 1], + [275, 1], + [275, 0, "\n"], + [276, 0, "\\"], + [277, 0, "u"], + [278, 0, "s"], + [279, 0, "e"], + [280, 0, "p"], + [281, 0, "a"], + [282, 0, "c"], + [283, 0, "k"], + [284, 0, "a"], + [285, 0, "g"], + [286, 0, "e"], + [287, 0, "{"], + [288, 0, "u"], + [289, 0, "r"], + [290, 0, "l"], + [291, 0, "}"], + [287, 0, "["], + [288, 0, "h"], + [289, 0, "y"], + [290, 0, "p"], + [291, 0, "h"], + [292, 0, "e"], + [293, 0, "n"], + [294, 0, "s"], + [295, 0, "]"], + [47, 0, "%"], + [82, 1], + [81, 1], + [80, 1], + [79, 1], + [78, 1], + [77, 1], + [76, 1], + [75, 1], + [74, 1], + [73, 1], + [72, 1], + [71, 1], + [70, 1], + [69, 1], + [68, 1], + [67, 1], + [66, 1], + [65, 1], + [64, 1], + [63, 1], + [62, 1], + [61, 1], + [60, 1], + [59, 1], + [58, 1], + [57, 1], + [56, 1], + [55, 1], + [54, 1], + [53, 1], + [52, 1], + [51, 1], + [50, 1], + [49, 1], + [48, 1], + [47, 1], + [46, 1], + [239, 0, "\n"], + [240, 0, "\\"], + [241, 0, "u"], + [242, 0, "s"], + [243, 0, "e"], + [244, 0, "p"], + [245, 0, "a"], + [246, 0, "c"], + [247, 0, "k"], + [248, 0, "a"], + [249, 0, "g"], + [250, 0, "e"], + [251, 0, "["], + [252, 0, "h"], + [253, 0, "y"], + [254, 0, "p"], + [255, 0, "h"], + [256, 0, "e"], + [257, 0, "n"], + [258, 0, "b"], + [259, 0, "r"], + [260, 0, "e"], + [261, 0, "a"], + [262, 0, "k"], + [263, 0, "s"], + [264, 0, "]"], + [265, 0, "{"], + [266, 0, "b"], + [267, 0, "r"], + [268, 0, "e"], + [269, 0, "a"], + [270, 0, "k"], + [271, 0, "u"], + [272, 0, "r"], + [273, 0, "l"], + [274, 0, "}"], + [275, 0, " "], + [276, 0, "%"], + [277, 0, " "], + [278, 0, "F"], + [279, 0, "i"], + [280, 0, "x"], + [281, 0, " "], + [282, 0, "U"], + [283, 0, "R"], + [284, 0, "L"], + [285, 0, " "], + [286, 0, "l"], + [287, 0, "i"], + [288, 0, "n"], + [289, 0, "e"], + [290, 0, " "], + [291, 0, "b"], + [292, 0, "r"], + [293, 0, "e"], + [294, 0, "a"], + [295, 0, "k"], + [296, 0, "i"], + [297, 0, "n"], + [298, 0, "g"], + [299, 0, " "], + [300, 0, "w"], + [301, 0, "h"], + [302, 0, "e"], + [303, 0, "n"], + [304, 0, " "], + [305, 0, "u"], + [306, 0, "s"], + [307, 0, "i"], + [308, 0, "n"], + [309, 0, "g"], + [310, 0, " "], + [311, 0, "d"], + [312, 0, "v"], + [313, 0, "i"], + [314, 0, "p"], + [315, 0, "s"], + [316, 0, " "], + [317, 0, "("], + [318, 0, "e"], + [319, 0, "."], + [320, 0, "g"], + [321, 0, "."], + [322, 0, " "], + [323, 0, "a"], + [324, 0, "r"], + [325, 0, "x"], + [326, 0, "i"], + [327, 0, "v"], + [328, 0, "."], + [329, 0, "o"], + [330, 0, "r"], + [331, 0, "g"], + [332, 0, ")"], + [358, 1], + [357, 1], + [356, 1], + [355, 1], + [354, 1], + [353, 1], + [352, 1], + [351, 1], + [350, 1], + [349, 1], + [348, 1], + [347, 1], + [346, 1], + [345, 1], + [344, 1], + [343, 1], + [342, 1], + [341, 1], + [340, 1], + [339, 1], + [338, 1], + [337, 1], + [336, 1], + [335, 1], + [334, 1], + [333, 1], + [239, 0, "\n"], + [240, 0, "\\"], + [241, 0, "u"], + [242, 0, "s"], + [243, 0, "e"], + [244, 0, "p"], + [245, 0, "a"], + [246, 0, "c"], + [247, 0, "k"], + [248, 0, "a"], + [249, 0, "g"], + [250, 0, "e"], + [251, 0, "["], + [252, 0, "h"], + [253, 0, "y"], + [254, 0, "p"], + [255, 0, "h"], + [256, 0, "e"], + [257, 0, "n"], + [258, 0, "s"], + [259, 0, "]"], + [260, 0, "{"], + [261, 0, "u"], + [262, 0, "r"], + [263, 0, "l"], + [264, 0, "}"], + [239, 0, "\n"], + [240, 0, "\\"], + [241, 0, "u"], + [242, 0, "s"], + [243, 0, "e"], + [244, 0, "p"], + [245, 0, "a"], + [246, 0, "c"], + [247, 0, "k"], + [248, 0, "a"], + [249, 0, "g"], + [250, 0, "e"], + [251, 0, "{"], + [252, 0, "h"], + [253, 0, "y"], + [254, 0, "p"], + [255, 0, "e"], + [256, 0, "r"], + [257, 0, "r"], + [258, 0, "e"], + [259, 0, "f"], + [260, 0, "}"], + [260, 1], + [259, 1], + [258, 1], + [257, 1], + [256, 1], + [255, 1], + [254, 1], + [253, 1], + [252, 1], + [251, 1], + [250, 1], + [249, 1], + [248, 1], + [247, 1], + [246, 1], + [245, 1], + [244, 1], + [243, 1], + [242, 1], + [241, 1], + [240, 1], + [239, 1], + [46, 0, "\n"], + [47, 0, "\\"], + [48, 0, "P"], + [49, 0, "a"], + [50, 0, "s"], + [51, 0, "s"], + [52, 0, "O"], + [53, 0, "p"], + [54, 0, "t"], + [55, 0, "i"], + [56, 0, "o"], + [57, 0, "n"], + [58, 0, "s"], + [59, 0, "T"], + [60, 0, "o"], + [61, 0, "P"], + [62, 0, "a"], + [63, 0, "c"], + [64, 0, "k"], + [65, 0, "a"], + [66, 0, "g"], + [67, 0, "e"], + [68, 0, "{"], + [69, 0, "h"], + [70, 0, "y"], + [71, 0, "p"], + [72, 0, "h"], + [73, 0, "e"], + [74, 0, "n"], + [75, 0, "s"], + [76, 0, "}"], + [77, 0, "{"], + [78, 0, "u"], + [79, 0, "r"], + [80, 0, "l"], + [81, 0, "}"], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 1], + [276, 0, "\n"], + [276, 0, "\\"], + [277, 0, "u"], + [278, 0, "s"], + [279, 0, "e"], + [280, 0, "p"], + [281, 0, "a"], + [282, 0, "c"], + [283, 0, "k"], + [284, 0, "a"], + [285, 0, "g"], + [286, 0, "e"], + [287, 0, "{"], + [288, 0, "h"], + [289, 0, "y"], + [290, 0, "p"], + [291, 0, "e"], + [292, 0, "r"], + [293, 0, "r"], + [294, 0, "e"], + [295, 0, "f"], + [296, 0, "}"], + [412, 1], + [411, 1], + [410, 1], + [409, 1], + [408, 1], + [407, 1], + [406, 1], + [405, 1], + [404, 1], + [403, 1], + [402, 1], + [401, 1], + [400, 1], + [399, 1], + [398, 1], + [397, 1], + [396, 1], + [395, 1], + [394, 1], + [393, 1], + [392, 1], + [391, 1], + [13583, 0, " "], + [13584, 0, "A"], + [13585, 0, "t"], + [13586, 0, "t"], + [13587, 0, "i"], + [13588, 0, "y"], + [13589, 0, "a"], + [13590, 0, " "], + [13591, 0, "e"], + [13592, 0, "t"], + [13593, 0, " "], + [13594, 0, "a"], + [13595, 0, "l"], + [13596, 0, "."], + [13597, 0, "~"], + [13598, 0, "\\"], + [13599, 0, "c"], + [13600, 0, "i"], + [13601, 0, "t"], + [13602, 0, "e"], + [13603, 0, "{"], + [13604, 0, "A"], + [13605, 0, "t"], + [13606, 0, "t"], + [13607, 0, "i"], + [13608, 0, "y"], + [13609, 0, "a"], + [13610, 0, ":"], + [13611, 0, "2"], + [13612, 0, "0"], + [13613, 0, "1"], + [13614, 0, "6"], + [13615, 0, "k"], + [13616, 0, "h"], + [13617, 0, "}"], + [13618, 0, " "], + [13619, 0, "f"], + [13620, 0, "u"], + [13621, 0, "r"], + [13622, 0, "t"], + [13623, 0, "h"], + [13624, 0, "e"], + [13625, 0, "r"], + [13626, 0, " "], + [13627, 0, "a"], + [13628, 0, "n"], + [13629, 0, "a"], + [13630, 0, "l"], + [13631, 0, "y"], + [13632, 0, "z"], + [13633, 0, "e"], + [13634, 0, " "], + [13626, 1], + [13625, 1], + [13624, 1], + [13623, 1], + [13622, 1], + [13621, 1], + [13620, 1], + [13619, 1], + [13627, 0, "t"], + [13628, 0, "h"], + [13629, 0, "e"], + [13630, 0, " "], + [13631, 0, "p"], + [13632, 0, "r"], + [13633, 0, "o"], + [13634, 0, "b"], + [13635, 0, "l"], + [13636, 0, "e"], + [13637, 0, "m"], + [13638, 0, " "], + [13639, 0, "o"], + [13640, 0, "f"], + [13641, 0, " "], + [13642, 0, "c"], + [13643, 0, "o"], + [13644, 0, "l"], + [13645, 0, "l"], + [13646, 0, "a"], + [13647, 0, "b"], + [13648, 0, "o"], + [13649, 0, "r"], + [13650, 0, "a"], + [13651, 0, "t"], + [13652, 0, "i"], + [13653, 0, "v"], + [13654, 0, "e"], + [13655, 0, " "], + [13656, 0, "e"], + [13657, 0, "d"], + [13658, 0, "i"], + [13659, 0, "t"], + [13660, 0, "i"], + [13661, 0, "n"], + [13662, 0, "g"], + [13663, 0, " "], + [13664, 0, "o"], + [13665, 0, "f"], + [13666, 0, " "], + [13667, 0, "o"], + [13668, 0, "r"], + [13669, 0, "d"], + [13670, 0, "e"], + [13671, 0, "r"], + [13672, 0, "e"], + [13673, 0, "d"], + [13674, 0, " "], + [13675, 0, "l"], + [13676, 0, "i"], + [13677, 0, "s"], + [13678, 0, "t"], + [13679, 0, "s"], + [13680, 0, ","], + [13681, 0, " "], + [13682, 0, "a"], + [13683, 0, "n"], + [13684, 0, "d"], + [13685, 0, " "], + [13686, 0, "p"], + [13687, 0, "r"], + [13688, 0, "o"], + [13689, 0, "v"], + [13690, 0, "i"], + [13691, 0, "d"], + [13692, 0, "e"], + [13693, 0, " "], + [13694, 0, "a"], + [13695, 0, " "], + [13696, 0, "c"], + [13697, 0, "o"], + [13698, 0, "r"], + [13699, 0, "r"], + [13700, 0, "e"], + [13701, 0, "c"], + [13702, 0, "t"], + [13703, 0, "n"], + [13704, 0, "e"], + [13705, 0, "s"], + [13706, 0, "s"], + [13707, 0, " "], + [13708, 0, "p"], + [13709, 0, "r"], + [13710, 0, "o"], + [13711, 0, "o"], + [13712, 0, "f"], + [13713, 0, " "], + [13714, 0, "o"], + [13715, 0, "f"], + [13716, 0, " "], + [13717, 0, "t"], + [13718, 0, "h"], + [13719, 0, "e"], + [13720, 0, " "], + [13721, 0, "R"], + [13722, 0, "G"], + [13723, 0, "A"], + [13724, 0, " "], + [13725, 0, "p"], + [13726, 0, "r"], + [13727, 0, "o"], + [13728, 0, "t"], + [13729, 0, "o"], + [13730, 0, "c"], + [13731, 0, "o"], + [13732, 0, "l"], + [13733, 0, "."], + [13640, 1], + [13639, 1], + [13638, 1], + [13637, 1], + [13636, 1], + [13635, 1], + [13634, 1], + [13633, 1], + [13632, 1], + [13631, 1], + [13631, 0, "m"], + [13632, 0, "e"], + [13633, 0, "t"], + [13634, 0, "a"], + [13635, 0, "d"], + [13636, 0, "a"], + [13637, 0, "t"], + [13638, 0, "a"], + [13639, 0, " "], + [13640, 0, "o"], + [13641, 0, "v"], + [13642, 0, "e"], + [13643, 0, "r"], + [13644, 0, "h"], + [13645, 0, "e"], + [13646, 0, "a"], + [13647, 0, "d"], + [13648, 0, " "], + [13649, 0, "o"], + [13650, 0, "f"], + [13665, 0, "l"], + [13666, 0, "y"], + [13674, 1], + [13673, 1], + [13672, 1], + [13672, 0, "e"], + [13673, 0, "d"], + [13675, 1], + [13675, 1], + [13675, 1], + [13785, 1], + [13784, 1], + [13783, 1], + [13782, 1], + [13782, 0, "a"], + [13783, 0, "l"], + [13784, 0, "l"], + [13785, 0, " "], + [13786, 0, "o"], + [13787, 0, "f"], + [13788, 0, " "], + [13789, 0, "t"], + [13790, 0, "h"], + [13791, 0, "e"], + [13792, 0, "s"], + [13793, 0, "e"], + [13794, 0, " "], + [13795, 0, "a"], + [13796, 0, "l"], + [13797, 0, "g"], + [13798, 0, "o"], + [13799, 0, "r"], + [13800, 0, "i"], + [13801, 0, "t"], + [13802, 0, "h"], + [13803, 0, "m"], + [13804, 0, "s"], + [13793, 1], + [13792, 1], + [13792, 0, " "], + [13793, 0, "e"], + [13794, 0, "x"], + [13795, 0, "i"], + [13796, 0, "s"], + [13797, 0, "t"], + [13798, 0, "i"], + [13799, 0, "n"], + [13800, 0, "g"], + [13812, 0, " "], + [13813, 0, "f"], + [13814, 0, "o"], + [13815, 0, "r"], + [13816, 0, " "], + [13817, 0, "C"], + [13818, 0, "R"], + [13819, 0, "D"], + [13820, 0, "T"], + [13821, 0, " "], + [13822, 0, "l"], + [13823, 0, "i"], + [13824, 0, "s"], + [13825, 0, "t"], + [13826, 0, "s"], + [13827, 0, " "], + [13828, 0, "a"], + [13829, 0, "n"], + [13830, 0, "d"], + [13831, 0, " "], + [13832, 0, "m"], + [13833, 0, "a"], + [13834, 0, "p"], + [13835, 0, "s"], + [13800, 1], + [13799, 1], + [13798, 1], + [13797, 1], + [13796, 1], + [13795, 1], + [13794, 1], + [13793, 1], + [13793, 0, "a"], + [13794, 0, "f"], + [13795, 0, "o"], + [13796, 0, "r"], + [13797, 0, "e"], + [13798, 0, "m"], + [13799, 0, "e"], + [13800, 0, "n"], + [13801, 0, "t"], + [13802, 0, "i"], + [13803, 0, "o"], + [13804, 0, "n"], + [13805, 0, "e"], + [13806, 0, "d"], + [13891, 1], + [13890, 1], + [13889, 1], + [13888, 1], + [13887, 1], + [13886, 1], + [13885, 1], + [13884, 1], + [13883, 1], + [13882, 1], + [13881, 1], + [13880, 1], + [13879, 1], + [13878, 1], + [13877, 1], + [13876, 1], + [13875, 1], + [13874, 1], + [13873, 1], + [13872, 1], + [13871, 1], + [13870, 1], + [13869, 1], + [13868, 1], + [13857, 1], + [13856, 1], + [13855, 1], + [13855, 0, "e"], + [13856, 0, "a"], + [13857, 0, "c"], + [13858, 0, "h"], + [13859, 0, " "], + [13860, 0, "o"], + [13861, 0, "f"], + [13862, 0, " "], + [13863, 0, "i"], + [13864, 0, "t"], + [13865, 0, "s"], + [13878, 1], + [13877, 1], + [13876, 1], + [13876, 0, "i"], + [13877, 0, "s"], + [13878, 0, " "], + [13879, 0, "a"], + [13896, 1], + [13863, 1], + [13863, 1], + [13863, 1], + [13863, 0, "t"], + [13864, 0, "h"], + [13865, 0, "e"], + [13866, 0, "i"], + [13867, 0, "r"], + [15002, 0, "\n"], + [15003, 0, "\n"], + [15004, 0, "M"], + [15005, 0, "a"], + [15006, 0, "r"], + [15007, 0, "t"], + [15008, 0, "i"], + [15009, 0, "n"], + [15010, 0, " "], + [15011, 0, "e"], + [15012, 0, "t"], + [15013, 0, " "], + [15014, 0, "a"], + [15015, 0, "l"], + [15016, 0, "."], + [15017, 0, "~"], + [15018, 0, "\\"], + [15019, 0, "c"], + [15020, 0, "i"], + [15021, 0, "t"], + [15022, 0, "e"], + [15023, 0, "{"], + [15024, 0, "M"], + [15025, 0, "a"], + [15026, 0, "r"], + [15027, 0, "t"], + [15028, 0, "i"], + [15029, 0, "n"], + [15030, 0, ":"], + [15031, 0, "2"], + [15032, 0, "0"], + [15033, 0, "1"], + [15034, 0, "0"], + [15035, 0, "i"], + [15036, 0, "h"], + [15037, 0, "}"], + [15038, 0, " "], + [15039, 0, "g"], + [15040, 0, "e"], + [15041, 0, "n"], + [15042, 0, "e"], + [15043, 0, "r"], + [15044, 0, "a"], + [15045, 0, "l"], + [15046, 0, "i"], + [15047, 0, "z"], + [15048, 0, "e"], + [15049, 0, " "], + [15050, 0, "L"], + [15051, 0, "o"], + [15052, 0, "g"], + [15053, 0, "o"], + [15054, 0, "o"], + [15055, 0, "t"], + [15056, 0, "~"], + [15057, 0, "\\"], + [15058, 0, "c"], + [15059, 0, "i"], + [15060, 0, "t"], + [15061, 0, "e"], + [15062, 0, "{"], + [15063, 0, "W"], + [15064, 0, "e"], + [15065, 0, "i"], + [15066, 0, "s"], + [15067, 0, "s"], + [15068, 0, ":"], + [15069, 0, "2"], + [15070, 0, "0"], + [15071, 0, "1"], + [15072, 0, "0"], + [15073, 0, "h"], + [15074, 0, "x"], + [15075, 0, "}"], + [15076, 0, " "], + [15077, 0, "t"], + [15078, 0, "o"], + [15079, 0, " "], + [15080, 0, "s"], + [15081, 0, "u"], + [15082, 0, "p"], + [15083, 0, "p"], + [15084, 0, "o"], + [15085, 0, "r"], + [15086, 0, "t"], + [15087, 0, " "], + [15088, 0, "c"], + [15089, 0, "o"], + [15090, 0, "l"], + [15091, 0, "l"], + [15092, 0, "a"], + [15093, 0, "b"], + [15094, 0, "o"], + [15095, 0, "r"], + [15096, 0, "a"], + [15097, 0, "t"], + [15098, 0, "i"], + [15099, 0, "v"], + [15100, 0, "e"], + [15101, 0, " "], + [15102, 0, "e"], + [15103, 0, "d"], + [15104, 0, "i"], + [15105, 0, "t"], + [15106, 0, "i"], + [15107, 0, "n"], + [15108, 0, "g"], + [15109, 0, " "], + [15110, 0, "o"], + [15111, 0, "f"], + [15112, 0, " "], + [15113, 0, "X"], + [15114, 0, "M"], + [15115, 0, "L"], + [15116, 0, " "], + [15117, 0, "d"], + [15118, 0, "o"], + [15119, 0, "c"], + [15120, 0, "u"], + [15121, 0, "m"], + [15122, 0, "e"], + [15123, 0, "n"], + [15124, 0, "t"], + [15125, 0, "s"], + [15126, 0, "~"], + [15127, 0, "-"], + [15128, 0, "-"], + [15129, 0, " "], + [15130, 0, "t"], + [15131, 0, "h"], + [15132, 0, "a"], + [15133, 0, "t"], + [15134, 0, " "], + [15135, 0, "i"], + [15136, 0, "s"], + [15137, 0, ","], + [15138, 0, " "], + [15139, 0, "a"], + [15140, 0, " "], + [15141, 0, "t"], + [15142, 0, "r"], + [15143, 0, "e"], + [15144, 0, "e"], + [15145, 0, " "], + [15146, 0, "o"], + [15147, 0, "f"], + [15148, 0, " "], + [15149, 0, "n"], + [15150, 0, "e"], + [15151, 0, "s"], + [15152, 0, "t"], + [15153, 0, "e"], + [15154, 0, "d"], + [15155, 0, " "], + [15156, 0, "o"], + [15157, 0, "r"], + [15158, 0, "d"], + [15159, 0, "e"], + [15160, 0, "r"], + [15161, 0, "e"], + [15162, 0, "d"], + [15163, 0, " "], + [15164, 0, "l"], + [15165, 0, "i"], + [15166, 0, "s"], + [15167, 0, "t"], + [15168, 0, "s"], + [15169, 0, "."], + [15170, 0, " "], + [15171, 0, "A"], + [15172, 0, "s"], + [15173, 0, " "], + [15174, 0, "d"], + [15175, 0, "i"], + [15176, 0, "s"], + [15177, 0, "c"], + [15178, 0, "u"], + [15179, 0, "s"], + [15180, 0, "s"], + [15181, 0, "e"], + [15182, 0, "d"], + [15004, 0, "O"], + [15005, 0, "n"], + [15006, 0, " "], + [15007, 0, "t"], + [15008, 0, "h"], + [15009, 0, "e"], + [15010, 0, " "], + [15011, 0, "o"], + [15012, 0, "t"], + [15013, 0, "h"], + [15014, 0, "e"], + [15015, 0, "r"], + [15016, 0, " "], + [15017, 0, "h"], + [15018, 0, "a"], + [15019, 0, "n"], + [15020, 0, "d"], + [15021, 0, ","], + [15022, 0, " "], + [15202, 0, " "], + [15203, 0, "i"], + [15204, 0, "n"], + [15205, 0, " "], + [15206, 0, "S"], + [15207, 0, "e"], + [15208, 0, "c"], + [15209, 0, "t"], + [15210, 0, "i"], + [15211, 0, "o"], + [15212, 0, "n"], + [15213, 0, "~"], + [15214, 0, "\\"], + [15215, 0, "r"], + [15216, 0, "e"], + [15217, 0, "f"], + [15218, 0, "{"], + [15219, 0, "s"], + [15220, 0, "e"], + [15221, 0, "c"], + [15222, 0, ":"], + [15223, 0, "j"], + [15224, 0, "s"], + [15225, 0, "o"], + [15226, 0, "n"], + [15227, 0, "-"], + [15228, 0, "x"], + [15229, 0, "m"], + [15230, 0, "l"], + [15231, 0, "}"], + [15232, 0, ","], + [15233, 0, " "], + [15234, 0, "s"], + [15235, 0, "u"], + [15236, 0, "c"], + [15237, 0, "h"], + [15238, 0, " "], + [15188, 0, "~"], + [15189, 0, "-"], + [15190, 0, "-"], + [15191, 0, " "], + [15192, 0, "w"], + [15193, 0, "i"], + [15194, 0, "t"], + [15195, 0, "h"], + [15196, 0, "o"], + [15197, 0, "u"], + [15198, 0, "t"], + [15199, 0, " "], + [15200, 0, "a"], + [15201, 0, " "], + [15202, 0, "m"], + [15203, 0, "a"], + [15204, 0, "p"], + [15205, 0, " "], + [15206, 0, "d"], + [15207, 0, "a"], + [15208, 0, "t"], + [15209, 0, "a"], + [15209, 1], + [15208, 1], + [15207, 1], + [15206, 1], + [15205, 1], + [15204, 1], + [15203, 1], + [15202, 1], + [15201, 1], + [15200, 1], + [15200, 0, "n"], + [15201, 0, "e"], + [15202, 0, "s"], + [15203, 0, "t"], + [15204, 0, "e"], + [15205, 0, "d"], + [15206, 0, " "], + [15207, 0, "m"], + [15208, 0, "a"], + [15209, 0, "p"], + [15210, 0, "s"], + [15190, 1], + [15189, 1], + [15188, 1], + [15259, 0, "a"], + [15260, 0, " "], + [15261, 0, "s"], + [15262, 0, "t"], + [15263, 0, "r"], + [15264, 0, "u"], + [15265, 0, "c"], + [15266, 0, "t"], + [15267, 0, "u"], + [15268, 0, "r"], + [15269, 0, "e"], + [15270, 0, " "], + [15271, 0, "d"], + [15272, 0, "o"], + [15273, 0, "e"], + [15274, 0, "s"], + [15275, 0, " "], + [15276, 0, "n"], + [15277, 0, "o"], + [15278, 0, "t"], + [15279, 0, " "], + [15280, 0, "c"], + [15281, 0, "a"], + [15282, 0, "p"], + [15283, 0, "t"], + [15284, 0, "u"], + [15285, 0, "r"], + [15286, 0, "e"], + [15287, 0, " "], + [15288, 0, "t"], + [15289, 0, "h"], + [15290, 0, "e"], + [15291, 0, " "], + [15292, 0, "e"], + [15293, 0, "x"], + [15294, 0, "p"], + [15295, 0, "r"], + [15296, 0, "e"], + [15297, 0, "s"], + [15298, 0, "s"], + [15299, 0, "i"], + [15300, 0, "v"], + [15301, 0, "i"], + [15302, 0, "t"], + [15303, 0, "y"], + [15304, 0, " "], + [15305, 0, "o"], + [15306, 0, "f"], + [15307, 0, " "], + [15308, 0, "J"], + [15309, 0, "S"], + [15310, 0, "O"], + [15311, 0, "N"], + [15312, 0, "."], + [15303, 1], + [15302, 1], + [15301, 1], + [15301, 0, "e"], + [15302, 0, "n"], + [15303, 0, "e"], + [15304, 0, "s"], + [15305, 0, "s"], + [41134, 0, " "], + [41135, 0, "d"], + [41136, 0, "o"], + [41137, 0, " "], + [41138, 0, "n"], + [41139, 0, "o"], + [41140, 0, "t"], + [41141, 0, " "], + [41142, 0, "d"], + [41143, 0, "e"], + [41144, 0, "p"], + [41145, 0, "e"], + [41146, 0, "n"], + [41147, 0, "d"], + [41148, 0, " "], + [41149, 0, "o"], + [41150, 0, "n"], + [41151, 0, " "], + [41152, 0, "$"], + [41153, 0, "A"], + [41154, 0, "_"], + [41155, 0, "q"], + [41156, 0, "$"], + [41157, 0, " "], + [41158, 0, "("], + [41159, 0, "t"], + [41160, 0, "h"], + [41161, 0, "e"], + [41162, 0, " "], + [41163, 0, "s"], + [41164, 0, "t"], + [41165, 0, "a"], + [41166, 0, "t"], + [41167, 0, "e"], + [41168, 0, " "], + [41169, 0, "o"], + [41170, 0, "f"], + [41171, 0, " "], + [41172, 0, "a"], + [41173, 0, "n"], + [41174, 0, "y"], + [41175, 0, " "], + [41176, 0, "o"], + [41177, 0, "t"], + [41178, 0, "h"], + [41179, 0, "e"], + [41180, 0, "r"], + [41181, 0, " "], + [41182, 0, "r"], + [41183, 0, "e"], + [41184, 0, "p"], + [41185, 0, "l"], + [41186, 0, "i"], + [41187, 0, "c"], + [41188, 0, "a"], + [41189, 0, " "], + [41190, 0, "$"], + [41191, 0, "q"], + [41192, 0, "\\"], + [41192, 0, " "], + [41194, 0, "n"], + [41195, 0, "e"], + [41196, 0, "q"], + [41197, 0, " "], + [41198, 0, "q"], + [41198, 1], + [41198, 0, "p"], + [41199, 0, "$"], + [41200, 0, ")"], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [41201, 1], + [78117, 0, "\n"], + [78118, 0, "\n"], + [78119, 0, "\\"], + [78120, 0, "b"], + [78121, 0, "e"], + [78122, 0, "g"], + [78123, 0, "i"], + [78124, 0, "n"], + [78125, 0, "{"], + [78126, 0, "I"], + [78127, 0, "E"], + [78128, 0, "E"], + [78129, 0, "E"], + [78130, 0, "b"], + [78131, 0, "i"], + [78132, 0, "o"], + [78133, 0, "g"], + [78134, 0, "r"], + [78135, 0, "a"], + [78136, 0, "p"], + [78137, 0, "h"], + [78138, 0, "y"], + [78139, 0, "}"], + [78140, 0, "{"], + [78141, 0, "M"], + [78142, 0, "a"], + [78143, 0, "r"], + [78144, 0, "t"], + [78145, 0, "i"], + [78146, 0, "n"], + [78147, 0, " "], + [78148, 0, "K"], + [78149, 0, "l"], + [78150, 0, "e"], + [78151, 0, "p"], + [78152, 0, "p"], + [78153, 0, "m"], + [78154, 0, "a"], + [78155, 0, "n"], + [78156, 0, "n"], + [78157, 0, "}"], + [78158, 0, "\n"], + [78159, 0, "T"], + [78160, 0, "O"], + [78161, 0, "D"], + [78162, 0, "O"], + [78163, 0, "\n"], + [78164, 0, "\\"], + [78165, 0, "e"], + [78166, 0, "n"], + [78167, 0, "d"], + [78168, 0, "{"], + [78169, 0, "I"], + [78170, 0, "E"], + [78171, 0, "E"], + [78172, 0, "E"], + [78173, 0, "b"], + [78174, 0, "i"], + [78175, 0, "o"], + [78176, 0, "g"], + [78177, 0, "r"], + [78178, 0, "a"], + [78179, 0, "p"], + [78180, 0, "h"], + [78181, 0, "y"], + [78182, 0, "}"], + [78183, 0, "\n"], + [78184, 0, "\n"], + [78185, 0, "\\"], + [78186, 0, "b"], + [78187, 0, "e"], + [78188, 0, "g"], + [78189, 0, "i"], + [78190, 0, "n"], + [78191, 0, "{"], + [78192, 0, "I"], + [78193, 0, "E"], + [78194, 0, "E"], + [78195, 0, "E"], + [78196, 0, "b"], + [78197, 0, "i"], + [78198, 0, "o"], + [78199, 0, "g"], + [78200, 0, "r"], + [78201, 0, "a"], + [78202, 0, "p"], + [78203, 0, "h"], + [78204, 0, "y"], + [78205, 0, "}"], + [78206, 0, "{"], + [78207, 0, "A"], + [78208, 0, "l"], + [78209, 0, "a"], + [78210, 0, "s"], + [78211, 0, "t"], + [78212, 0, "a"], + [78213, 0, "i"], + [78214, 0, "r"], + [78215, 0, " "], + [78216, 0, "R"], + [78217, 0, "."], + [78218, 0, " "], + [78218, 1], + [78218, 0, "\\"], + [78219, 0, " "], + [78220, 0, "B"], + [78221, 0, "e"], + [78222, 0, "r"], + [78223, 0, "e"], + [78224, 0, "s"], + [78225, 0, "f"], + [78226, 0, "o"], + [78227, 0, "r"], + [78228, 0, "d"], + [78229, 0, "}"], + [78218, 1], + [78229, 0, "\n"], + [78230, 0, "\\"], + [78231, 0, "e"], + [78232, 0, "n"], + [78233, 0, "d"], + [78234, 0, "{"], + [78235, 0, "I"], + [78236, 0, "E"], + [78237, 0, "E"], + [78238, 0, "E"], + [78239, 0, "b"], + [78240, 0, "i"], + [78241, 0, "o"], + [78242, 0, "g"], + [78243, 0, "r"], + [78244, 0, "a"], + [78245, 0, "p"], + [78246, 0, "h"], + [78247, 0, "y"], + [78248, 0, "}"], + [78230, 0, "\n"], + [78230, 0, "T"], + [78231, 0, "O"], + [78232, 0, "D"], + [78233, 0, "O"], + [78140, 0, "["], + [78141, 0, "{"], + [78142, 0, "\\"], + [78143, 0, "i"], + [78144, 0, "n"], + [78145, 0, "c"], + [78146, 0, "l"], + [78147, 0, "u"], + [78148, 0, "d"], + [78149, 0, "e"], + [78150, 0, "g"], + [78151, 0, "r"], + [78152, 0, "a"], + [78153, 0, "p"], + [78154, 0, "h"], + [78155, 0, "i"], + [78156, 0, "c"], + [78157, 0, "s"], + [78158, 0, "["], + [78159, 0, "]"], + [78160, 0, "{"], + [78161, 0, "m"], + [78162, 0, "k"], + [78163, 0, "4"], + [78164, 0, "2"], + [78165, 0, "8"], + [78166, 0, "."], + [78167, 0, "j"], + [78168, 0, "p"], + [78169, 0, "g"], + [78170, 0, "}"], + [78171, 0, "}"], + [78172, 0, "]"], + [78159, 0, "w"], + [78160, 0, "i"], + [78161, 0, "d"], + [78162, 0, "t"], + [78163, 0, "h"], + [78164, 0, "="], + [78165, 0, "1"], + [78166, 0, "i"], + [78167, 0, "n"], + [78248, 0, "["], + [78249, 0, "]"], + [78249, 0, "{"], + [78250, 0, "}"], + [78250, 0, "\\"], + [78251, 0, "i"], + [78252, 0, "n"], + [78253, 0, "c"], + [78254, 0, "l"], + [78255, 0, "u"], + [78256, 0, "d"], + [78257, 0, "e"], + [78258, 0, "g"], + [78259, 0, "r"], + [78260, 0, "a"], + [78261, 0, "p"], + [78262, 0, "h"], + [78263, 0, "i"], + [78264, 0, "c"], + [78265, 0, "s"], + [78266, 0, "["], + [78267, 0, "w"], + [78268, 0, "i"], + [78269, 0, "d"], + [78270, 0, "t"], + [78271, 0, "h"], + [78272, 0, "="], + [78273, 0, "1"], + [78274, 0, "i"], + [78275, 0, "n"], + [78276, 0, "]"], + [78277, 0, "{"], + [78278, 0, "a"], + [78279, 0, "r"], + [78280, 0, "b"], + [78281, 0, "3"], + [78282, 0, "3"], + [78283, 0, "."], + [78284, 0, "j"], + [78285, 0, "p"], + [78286, 0, "g"], + [78287, 0, "}"], + [78287, 1], + [78287, 0, "}"], + [78317, 1], + [78316, 1], + [78315, 1], + [78314, 1], + [78314, 0, "i"], + [78315, 0, "s"], + [78316, 0, " "], + [78317, 0, "a"], + [78318, 0, " "], + [78319, 0, "s"], + [78320, 0, "e"], + [78320, 1], + [78319, 1], + [78319, 0, "S"], + [78320, 0, "e"], + [78321, 0, "n"], + [78322, 0, "i"], + [78323, 0, "o"], + [78324, 0, "r"], + [78325, 0, " "], + [78326, 0, "L"], + [78327, 0, "e"], + [78328, 0, "c"], + [78329, 0, "t"], + [78330, 0, "u"], + [78331, 0, "r"], + [78332, 0, "e"], + [78333, 0, "r"], + [78334, 0, " "], + [78335, 0, "i"], + [78336, 0, "n"], + [78337, 0, " "], + [78338, 0, "t"], + [78339, 0, "h"], + [78340, 0, "e"], + [78341, 0, " "], + [78342, 0, "C"], + [78343, 0, "o"], + [78344, 0, "m"], + [78345, 0, "p"], + [78346, 0, "u"], + [78347, 0, "t"], + [78348, 0, "e"], + [78349, 0, "r"], + [78350, 0, " "], + [78351, 0, "L"], + [78352, 0, "a"], + [78353, 0, "b"], + [78354, 0, "o"], + [78355, 0, "r"], + [78356, 0, "a"], + [78357, 0, "t"], + [78358, 0, "o"], + [78359, 0, "r"], + [78360, 0, "y"], + [78361, 0, " "], + [78362, 0, "a"], + [78363, 0, "t"], + [78364, 0, " "], + [78365, 0, "t"], + [78366, 0, "h"], + [78367, 0, "e"], + [78368, 0, " "], + [78369, 0, "U"], + [78370, 0, "n"], + [78371, 0, "i"], + [78372, 0, "v"], + [78373, 0, "e"], + [78374, 0, "r"], + [78375, 0, "s"], + [78376, 0, "i"], + [78377, 0, "t"], + [78378, 0, "y"], + [78379, 0, " "], + [78380, 0, "o"], + [78381, 0, "f"], + [78382, 0, " "], + [78383, 0, "C"], + [78384, 0, "a"], + [78385, 0, "m"], + [78386, 0, "b"], + [78387, 0, "r"], + [78388, 0, "i"], + [78389, 0, "d"], + [78390, 0, "g"], + [78391, 0, "e"], + [78392, 0, "."], + [78393, 0, " "], + [78394, 0, "H"], + [78395, 0, "e"], + [78396, 0, " "], + [78397, 0, "o"], + [78398, 0, "b"], + [78399, 0, "t"], + [78400, 0, "a"], + [78401, 0, "i"], + [78402, 0, "n"], + [78403, 0, "e"], + [78404, 0, "d"], + [78405, 0, " "], + [78406, 0, "h"], + [78407, 0, "i"], + [78408, 0, "s"], + [78409, 0, " "], + [78410, 0, "P"], + [78411, 0, "h"], + [78412, 0, "D"], + [78413, 0, " "], + [78414, 0, "f"], + [78415, 0, "r"], + [78416, 0, "o"], + [78417, 0, "m"], + [78418, 0, " "], + [78419, 0, "t"], + [78420, 0, "h"], + [78421, 0, "e"], + [78422, 0, " "], + [78423, 0, "U"], + [78424, 0, "n"], + [78425, 0, "i"], + [78426, 0, "v"], + [78427, 0, "e"], + [78428, 0, "r"], + [78429, 0, "s"], + [78430, 0, "i"], + [78431, 0, "t"], + [78432, 0, "y"], + [78433, 0, " "], + [78434, 0, "o"], + [78435, 0, "f"], + [78436, 0, " "], + [78437, 0, "C"], + [78438, 0, "a"], + [78439, 0, "m"], + [78440, 0, "b"], + [78441, 0, "r"], + [78442, 0, "i"], + [78443, 0, "d"], + [78444, 0, "g"], + [78445, 0, "e"], + [78446, 0, ","], + [78447, 0, " "], + [78448, 0, "w"], + [78449, 0, "o"], + [78450, 0, "r"], + [78451, 0, "k"], + [78452, 0, "i"], + [78453, 0, "n"], + [78454, 0, "g"], + [78455, 0, " "], + [78456, 0, "a"], + [78457, 0, "t"], + [78458, 0, " "], + [78459, 0, "t"], + [78460, 0, "h"], + [78461, 0, "e"], + [78462, 0, " "], + [78463, 0, "i"], + [78464, 0, "n"], + [78465, 0, "t"], + [78466, 0, "e"], + [78467, 0, "r"], + [78468, 0, "s"], + [78469, 0, "e"], + [78470, 0, "c"], + [78471, 0, "t"], + [78472, 0, "i"], + [78473, 0, "o"], + [78474, 0, "n"], + [78475, 0, " "], + [78476, 0, "o"], + [78477, 0, "f"], + [78478, 0, " "], + [78479, 0, "m"], + [78480, 0, "o"], + [78481, 0, "b"], + [78482, 0, "i"], + [78483, 0, "l"], + [78484, 0, "e"], + [78485, 0, " "], + [78486, 0, "c"], + [78487, 0, "o"], + [78488, 0, "m"], + [78489, 0, "p"], + [78490, 0, "u"], + [78491, 0, "t"], + [78492, 0, "i"], + [78493, 0, "n"], + [78494, 0, "g"], + [78495, 0, " "], + [78496, 0, "a"], + [78497, 0, "n"], + [78498, 0, "d"], + [78499, 0, " "], + [78500, 0, "c"], + [78501, 0, "o"], + [78502, 0, "m"], + [78503, 0, "p"], + [78504, 0, "u"], + [78505, 0, "t"], + [78506, 0, "e"], + [78507, 0, "r"], + [78508, 0, " "], + [78509, 0, "s"], + [78510, 0, "e"], + [78511, 0, "c"], + [78512, 0, "u"], + [78513, 0, "r"], + [78514, 0, "i"], + [78515, 0, "t"], + [78516, 0, "y"], + [78517, 0, "."], + [78518, 0, " "], + [78519, 0, "T"], + [78520, 0, "O"], + [78521, 0, "D"], + [78522, 0, "O"], + [78523, 0, " "], + [78524, 0, "m"], + [78525, 0, "o"], + [78526, 0, "r"], + [78527, 0, "e"], + [78528, 0, " "], + [78529, 0, "t"], + [78530, 0, "e"], + [78531, 0, "x"], + [78532, 0, "t"], + [78204, 1], + [78203, 1], + [78202, 1], + [78201, 1], + [78201, 0, "i"], + [78202, 0, "s"], + [78203, 0, " "], + [78204, 0, "a"], + [78205, 0, " "], + [78206, 0, "R"], + [78207, 0, "e"], + [78208, 0, "s"], + [78209, 0, "e"], + [78210, 0, "a"], + [78211, 0, "r"], + [78212, 0, "c"], + [78213, 0, "h"], + [78214, 0, " "], + [78215, 0, "A"], + [78216, 0, "s"], + [78217, 0, "s"], + [78218, 0, "o"], + [78219, 0, "c"], + [78220, 0, "i"], + [78221, 0, "a"], + [78222, 0, "t"], + [78223, 0, "e"], + [78224, 0, " "], + [78225, 0, "a"], + [78226, 0, "t"], + [78226, 1], + [78225, 1], + [78225, 0, "i"], + [78226, 0, "n"], + [78227, 0, " "], + [78228, 0, "t"], + [78229, 0, "h"], + [78230, 0, "e"], + [78231, 0, " "], + [78232, 0, "C"], + [78233, 0, "o"], + [78234, 0, "m"], + [78235, 0, "p"], + [78236, 0, "u"], + [78237, 0, "t"], + [78238, 0, "e"], + [78239, 0, "r"], + [78240, 0, " "], + [78241, 0, "L"], + [78242, 0, "a"], + [78243, 0, "b"], + [78244, 0, "o"], + [78245, 0, "r"], + [78246, 0, "a"], + [78247, 0, "t"], + [78248, 0, "o"], + [78249, 0, "r"], + [78250, 0, "y"], + [78251, 0, " "], + [78252, 0, "a"], + [78253, 0, "t"], + [78254, 0, " "], + [78255, 0, "t"], + [78256, 0, "h"], + [78257, 0, "e"], + [78258, 0, " "], + [78259, 0, "U"], + [78260, 0, "n"], + [78261, 0, "i"], + [78262, 0, "v"], + [78263, 0, "e"], + [78264, 0, "r"], + [78265, 0, "s"], + [78266, 0, "i"], + [78267, 0, "t"], + [78268, 0, "y"], + [78269, 0, " "], + [78270, 0, "o"], + [78271, 0, "f"], + [78272, 0, " "], + [78273, 0, "C"], + [78274, 0, "a"], + [78275, 0, "m"], + [78276, 0, "b"], + [78277, 0, "r"], + [78278, 0, "i"], + [78279, 0, "d"], + [78280, 0, "g"], + [78281, 0, "e"], + [78282, 0, "."], + [78283, 0, " "], + [78284, 0, "I"], + [78285, 0, "n"], + [78286, 0, " "], + [78287, 0, "h"], + [78288, 0, "i"], + [78289, 0, "s"], + [78290, 0, " "], + [78291, 0, "c"], + [78292, 0, "u"], + [78293, 0, "r"], + [78294, 0, "r"], + [78295, 0, "e"], + [78295, 1], + [78294, 1], + [78293, 1], + [78292, 1], + [78291, 1], + [78290, 1], + [78289, 1], + [78288, 1], + [78287, 1], + [78286, 1], + [78285, 1], + [78284, 1], + [78284, 0, "H"], + [78284, 1], + [78284, 0, "I"], + [78285, 0, "n"], + [78286, 0, " "], + [78287, 0, "t"], + [78288, 0, "h"], + [78289, 0, "i"], + [78290, 0, "s"], + [78291, 0, " "], + [78292, 0, "c"], + [78293, 0, "u"], + [78294, 0, "r"], + [78295, 0, "r"], + [78296, 0, "e"], + [78297, 0, "n"], + [78298, 0, "t"], + [78299, 0, " "], + [78300, 0, "r"], + [78301, 0, "e"], + [78302, 0, "s"], + [78303, 0, "e"], + [78304, 0, "a"], + [78305, 0, "r"], + [78306, 0, "c"], + [78307, 0, "h"], + [78308, 0, " "], + [78288, 1], + [78287, 1], + [78286, 1], + [78285, 1], + [78284, 1], + [78284, 0, "H"], + [78305, 0, "p"], + [78306, 0, "r"], + [78307, 0, "o"], + [78308, 0, "j"], + [78309, 0, "e"], + [78310, 0, "c"], + [78311, 0, "t"], + [78312, 0, ","], + [78313, 0, " "], + [78314, 0, "T"], + [78315, 0, "R"], + [78316, 0, "V"], + [78317, 0, "E"], + [78318, 0, " "], + [78319, 0, "D"], + [78320, 0, "a"], + [78321, 0, "t"], + [78322, 0, "a"], + [78323, 0, ","], + [78324, 0, " "], + [78325, 0, "i"], + [78326, 0, "s"], + [78327, 0, " "], + [78328, 0, "w"], + [78329, 0, "o"], + [78330, 0, "r"], + [78331, 0, "k"], + [78332, 0, "i"], + [78333, 0, "n"], + [78334, 0, "g"], + [78335, 0, " "], + [78336, 0, "t"], + [78337, 0, "o"], + [78338, 0, "w"], + [78339, 0, "a"], + [78340, 0, "r"], + [78341, 0, "d"], + [78342, 0, "s"], + [78343, 0, " "], + [78344, 0, "b"], + [78345, 0, "e"], + [78346, 0, "t"], + [78347, 0, "t"], + [78348, 0, "e"], + [78349, 0, "r"], + [78350, 0, " "], + [78351, 0, "s"], + [78352, 0, "e"], + [78353, 0, "c"], + [78354, 0, "u"], + [78355, 0, "r"], + [78356, 0, "i"], + [78357, 0, "t"], + [78358, 0, "y"], + [78359, 0, " "], + [78360, 0, "a"], + [78361, 0, "n"], + [78362, 0, "d"], + [78363, 0, " "], + [78364, 0, "p"], + [78365, 0, "r"], + [78366, 0, "i"], + [78367, 0, "v"], + [78368, 0, "a"], + [78369, 0, "c"], + [78370, 0, "y"], + [78371, 0, " "], + [78372, 0, "i"], + [78373, 0, "n"], + [78374, 0, " "], + [78375, 0, "c"], + [78376, 0, "l"], + [78377, 0, "o"], + [78378, 0, "u"], + [78379, 0, "d"], + [78380, 0, " "], + [78381, 0, "a"], + [78382, 0, "p"], + [78383, 0, "p"], + [78384, 0, "l"], + [78385, 0, "i"], + [78386, 0, "c"], + [78387, 0, "a"], + [78388, 0, "t"], + [78389, 0, "i"], + [78390, 0, "o"], + [78391, 0, "n"], + [78392, 0, "s"], + [78375, 0, "c"], + [78376, 0, "o"], + [78377, 0, "l"], + [78378, 0, "l"], + [78379, 0, "a"], + [78380, 0, "b"], + [78381, 0, "o"], + [78382, 0, "r"], + [78383, 0, "a"], + [78384, 0, "t"], + [78385, 0, "i"], + [78386, 0, "v"], + [78387, 0, "e"], + [78388, 0, " "], + [78326, 1], + [78325, 1], + [78324, 1], + [78331, 1], + [78330, 1], + [78329, 1], + [78329, 0, "s"], + [78402, 0, " "], + [78403, 0, "b"], + [78404, 0, "y"], + [78405, 0, " "], + [78406, 0, "a"], + [78407, 0, "p"], + [78408, 0, "p"], + [78409, 0, "l"], + [78410, 0, "y"], + [78411, 0, "i"], + [78412, 0, "n"], + [78413, 0, "g"], + [78414, 0, " "], + [78415, 0, "e"], + [78416, 0, "n"], + [78417, 0, "d"], + [78418, 0, "-"], + [78419, 0, "t"], + [78420, 0, "o"], + [78421, 0, "-"], + [78422, 0, "e"], + [78423, 0, "n"], + [78424, 0, "d"], + [78425, 0, " "], + [78426, 0, "e"], + [78427, 0, "n"], + [78428, 0, "c"], + [78429, 0, "r"], + [78430, 0, "y"], + [78431, 0, "p"], + [78432, 0, "t"], + [78433, 0, "i"], + [78434, 0, "o"], + [78435, 0, "n"], + [78436, 0, " "], + [78383, 1], + [78382, 1], + [78381, 1], + [78380, 1], + [78379, 1], + [78378, 1], + [78377, 1], + [78376, 1], + [78375, 1], + [78374, 1], + [78373, 1], + [78372, 1], + [78371, 1], + [78370, 1], + [78423, 0, "t"], + [78424, 0, "o"], + [78425, 0, " "], + [78426, 0, "c"], + [78427, 0, "o"], + [78428, 0, "l"], + [78429, 0, "l"], + [78430, 0, "a"], + [78431, 0, "b"], + [78432, 0, "o"], + [78433, 0, "r"], + [78434, 0, "a"], + [78435, 0, "t"], + [78436, 0, "i"], + [78437, 0, "v"], + [78438, 0, "e"], + [78439, 0, "l"], + [78440, 0, "y"], + [78441, 0, " "], + [78442, 0, "e"], + [78443, 0, "d"], + [78444, 0, "i"], + [78445, 0, "t"], + [78446, 0, "a"], + [78447, 0, "b"], + [78448, 0, "l"], + [78449, 0, "e"], + [78450, 0, " "], + [78391, 0, " "], + [78392, 0, "m"], + [78393, 0, "a"], + [78394, 0, "i"], + [78395, 0, "n"], + [78396, 0, "t"], + [78397, 0, "a"], + [78398, 0, "i"], + [78399, 0, "n"], + [78400, 0, "i"], + [78401, 0, "n"], + [78402, 0, "g"], + [78403, 0, " "], + [78403, 1], + [78402, 1], + [78401, 1], + [78400, 1], + [78399, 1], + [78398, 1], + [78397, 1], + [78396, 1], + [78395, 1], + [78394, 1], + [78393, 1], + [78392, 1], + [78391, 1], + [78451, 0, "a"], + [78452, 0, "p"], + [78453, 0, "p"], + [78454, 0, "l"], + [78455, 0, "i"], + [78456, 0, "c"], + [78457, 0, "a"], + [78458, 0, "t"], + [78459, 0, "i"], + [78460, 0, "o"], + [78461, 0, "n"], + [78462, 0, " "], + [78463, 0, "d"], + [78464, 0, "a"], + [78465, 0, "t"], + [78466, 0, "a"], + [78467, 0, "."], + [78468, 0, " "], + [78469, 0, "H"], + [78470, 0, "e"], + [78471, 0, " "], + [78472, 0, "p"], + [78473, 0, "r"], + [78474, 0, "e"], + [78475, 0, "v"], + [78476, 0, "i"], + [78477, 0, "o"], + [78478, 0, "u"], + [78479, 0, "s"], + [78480, 0, "l"], + [78481, 0, "y"], + [78482, 0, " "], + [78482, 1], + [78481, 1], + [78480, 1], + [78479, 1], + [78478, 1], + [78477, 1], + [78476, 1], + [78475, 1], + [78474, 1], + [78473, 1], + [78472, 1], + [78471, 1], + [78470, 1], + [78470, 0, "i"], + [78471, 0, "s"], + [78472, 0, " "], + [78473, 0, "b"], + [78474, 0, "o"], + [78475, 0, "o"], + [78476, 0, "k"], + [78477, 0, " "], + [78478, 0, "\\"], + [78479, 0, "e"], + [78480, 0, "m"], + [78481, 0, "p"], + [78482, 0, "h"], + [78483, 0, "{"], + [78484, 0, "D"], + [78485, 0, "e"], + [78486, 0, "s"], + [78487, 0, "i"], + [78488, 0, "g"], + [78489, 0, "n"], + [78490, 0, "i"], + [78491, 0, "n"], + [78492, 0, "g"], + [78493, 0, " "], + [78494, 0, "D"], + [78495, 0, "a"], + [78496, 0, "t"], + [78497, 0, "a"], + [78498, 0, "-"], + [78499, 0, "I"], + [78500, 0, "n"], + [78501, 0, "t"], + [78502, 0, "e"], + [78503, 0, "n"], + [78504, 0, "s"], + [78505, 0, "i"], + [78506, 0, "v"], + [78507, 0, "e"], + [78508, 0, " "], + [78509, 0, "A"], + [78510, 0, "p"], + [78511, 0, "p"], + [78512, 0, "l"], + [78513, 0, "i"], + [78514, 0, "c"], + [78515, 0, "a"], + [78516, 0, "t"], + [78517, 0, "i"], + [78518, 0, "o"], + [78519, 0, "n"], + [78520, 0, "s"], + [78521, 0, "}"], + [78522, 0, " "], + [78523, 0, "w"], + [78524, 0, "a"], + [78525, 0, "s"], + [78526, 0, " "], + [78527, 0, "p"], + [78528, 0, "u"], + [78529, 0, "b"], + [78530, 0, "l"], + [78531, 0, "i"], + [78532, 0, "s"], + [78533, 0, "h"], + [78534, 0, "e"], + [78535, 0, "d"], + [78536, 0, " "], + [78537, 0, "b"], + [78538, 0, "y"], + [78539, 0, " "], + [78540, 0, "O"], + [78541, 0, "'"], + [78542, 0, "R"], + [78543, 0, "e"], + [78544, 0, "i"], + [78545, 0, "l"], + [78546, 0, "l"], + [78547, 0, "y"], + [78548, 0, " "], + [78549, 0, "M"], + [78550, 0, "e"], + [78551, 0, "d"], + [78552, 0, "i"], + [78553, 0, "a"], + [78554, 0, " "], + [78555, 0, "i"], + [78556, 0, "n"], + [78557, 0, " "], + [78558, 0, "2"], + [78559, 0, "0"], + [78560, 0, "0"], + [78561, 0, "7"], + [78562, 0, "."], + [78562, 1], + [78562, 0, "."], + [78560, 1], + [78560, 0, "1"], + [78563, 0, " "], + [78564, 0, "P"], + [78565, 0, "r"], + [78566, 0, "e"], + [78567, 0, "v"], + [78568, 0, "i"], + [78569, 0, "o"], + [78570, 0, "u"], + [78571, 0, "s"], + [78572, 0, "l"], + [78573, 0, "y"], + [78574, 0, " "], + [78574, 1], + [78574, 0, ","], + [78575, 0, " "], + [78576, 0, "e"], + [78576, 1], + [78576, 0, "h"], + [78577, 0, "e"], + [78578, 0, " "], + [78579, 0, "w"], + [78580, 0, "o"], + [78581, 0, "r"], + [78582, 0, "k"], + [78583, 0, "d"], + [78583, 1], + [78583, 0, "e"], + [78584, 0, "d"], + [78585, 0, " "], + [78586, 0, "a"], + [78587, 0, "s"], + [78588, 0, " "], + [78589, 0, "a"], + [78590, 0, " "], + [78591, 0, "s"], + [78592, 0, "o"], + [78593, 0, "f"], + [78594, 0, "t"], + [78595, 0, "w"], + [78596, 0, "a"], + [78597, 0, "r"], + [78598, 0, "e"], + [78599, 0, " "], + [78600, 0, "e"], + [78601, 0, "n"], + [78602, 0, "g"], + [78603, 0, "i"], + [78604, 0, "n"], + [78605, 0, "e"], + [78606, 0, "e"], + [78607, 0, "r"], + [78608, 0, " "], + [78609, 0, "a"], + [78610, 0, "n"], + [78611, 0, "d"], + [78612, 0, " "], + [78613, 0, "e"], + [78614, 0, "n"], + [78615, 0, "t"], + [78616, 0, "r"], + [78617, 0, "e"], + [78618, 0, "p"], + [78619, 0, "r"], + [78620, 0, "e"], + [78621, 0, "n"], + [78622, 0, "e"], + [78623, 0, "u"], + [78624, 0, "r"], + [78625, 0, " "], + [78626, 0, "a"], + [78627, 0, "t"], + [78628, 0, " "], + [78629, 0, "s"], + [78630, 0, "e"], + [78631, 0, "v"], + [78632, 0, "e"], + [78633, 0, "r"], + [78634, 0, "a"], + [78635, 0, "l"], + [78636, 0, " "], + [78637, 0, "i"], + [78638, 0, "n"], + [78639, 0, "t"], + [78640, 0, "e"], + [78641, 0, "r"], + [78642, 0, "n"], + [78643, 0, "e"], + [78644, 0, "t"], + [78645, 0, " "], + [78646, 0, "c"], + [78647, 0, "o"], + [78648, 0, "m"], + [78649, 0, "p"], + [78650, 0, "a"], + [78651, 0, "n"], + [78652, 0, "i"], + [78653, 0, "e"], + [78654, 0, "s"], + [78655, 0, "."], + [79005, 0, "\n"], + [79006, 0, "\\"], + [79007, 0, "v"], + [79008, 0, "f"], + [79009, 0, "i"], + [79010, 0, "l"], + [79011, 0, "l"], + [79012, 0, "\n"], + [4295, 0, " "], + [4296, 0, "a"], + [4297, 0, "n"], + [4298, 0, "d"], + [4299, 0, " "], + [4300, 0, "e"], + [4301, 0, "r"], + [4302, 0, "r"], + [4303, 0, "o"], + [4304, 0, "r"], + [4305, 0, "-"], + [4306, 0, "p"], + [4307, 0, "r"], + [4308, 0, "o"], + [4309, 0, "n"], + [4310, 0, "e"], + [4311, 0, ","], + [8427, 0, " "], + [8428, 0, "("], + [8429, 0, "a"], + [8430, 0, " "], + [8431, 0, "r"], + [8432, 0, "e"], + [8433, 0, "q"], + [8434, 0, "u"], + [8435, 0, "i"], + [8436, 0, "r"], + [8437, 0, "e"], + [8438, 0, "m"], + [8439, 0, "e"], + [8440, 0, "n"], + [8441, 0, "t"], + [8442, 0, " "], + [8443, 0, "k"], + [8444, 0, "n"], + [8445, 0, "o"], + [8446, 0, "w"], + [8447, 0, "n"], + [8448, 0, " "], + [8449, 0, "a"], + [8450, 0, "s"], + [8451, 0, " "], + [8452, 0, "\\"], + [8453, 0, "e"], + [8454, 0, "m"], + [8455, 0, "p"], + [8456, 0, "h"], + [8457, 0, "{"], + [8458, 0, "s"], + [8459, 0, "t"], + [8460, 0, "r"], + [8461, 0, "o"], + [8462, 0, "n"], + [8463, 0, "g"], + [8464, 0, " "], + [8465, 0, "e"], + [8466, 0, "v"], + [8467, 0, "e"], + [8468, 0, "n"], + [8469, 0, "t"], + [8470, 0, "u"], + [8471, 0, "a"], + [8472, 0, "l"], + [8473, 0, " "], + [8474, 0, "c"], + [8475, 0, "o"], + [8476, 0, "n"], + [8477, 0, "s"], + [8478, 0, "i"], + [8479, 0, "s"], + [8480, 0, "t"], + [8481, 0, "e"], + [8482, 0, "n"], + [8483, 0, "c"], + [8484, 0, "y"], + [8485, 0, "}"], + [8486, 0, "~"], + [8487, 0, "\\"], + [8488, 0, "c"], + [8489, 0, "i"], + [8490, 0, "t"], + [8491, 0, "e"], + [8492, 0, "{"], + [8493, 0, "S"], + [8494, 0, "h"], + [8495, 0, "a"], + [8496, 0, "p"], + [8497, 0, "i"], + [8498, 0, "r"], + [8499, 0, "o"], + [8500, 0, ":"], + [8501, 0, "2"], + [8502, 0, "0"], + [8503, 0, "1"], + [8504, 0, "1"], + [8505, 0, "u"], + [8506, 0, "n"], + [8507, 0, "}"], + [8508, 0, ")"], + [11111, 0, ","], + [11112, 0, "M"], + [11113, 0, "e"], + [11114, 0, "h"], + [11115, 0, "d"], + [11116, 0, "i"], + [11117, 0, ":"], + [11118, 0, "2"], + [11119, 0, "0"], + [11120, 0, "1"], + [11121, 0, "1"], + [11122, 0, "k"], + [11123, 0, "e"], + [13279, 1], + [13278, 1], + [13277, 1], + [13276, 1], + [13275, 1], + [13274, 1], + [13273, 1], + [13272, 1], + [13334, 1], + [13333, 1], + [13332, 1], + [13331, 1], + [13330, 1], + [13329, 1], + [13329, 0, "e"], + [13330, 0, "l"], + [13331, 0, "l"], + [13332, 0, "-"], + [13842, 1], + [13841, 1], + [13840, 1], + [13839, 1], + [13838, 1], + [13837, 1], + [13836, 1], + [13835, 1], + [13835, 0, "a"], + [13836, 0, "l"], + [13837, 0, "g"], + [13838, 0, "o"], + [13839, 0, "r"], + [13840, 0, "i"], + [13841, 0, "t"], + [13842, 0, "h"], + [13843, 0, "m"], + [17073, 0, " "], + [17074, 0, "T"], + [17075, 0, "h"], + [17076, 0, "i"], + [17077, 0, "s"], + [17078, 0, " "], + [17079, 0, "a"], + [17080, 0, "p"], + [17081, 0, "p"], + [17082, 0, "r"], + [17083, 0, "o"], + [17084, 0, "a"], + [17085, 0, "c"], + [17086, 0, "h"], + [17087, 0, " "], + [17088, 0, "h"], + [17089, 0, "a"], + [17090, 0, "s"], + [17091, 0, " "], + [17092, 0, "t"], + [17093, 0, "h"], + [17094, 0, "e"], + [17095, 0, " "], + [17096, 0, "a"], + [17097, 0, "d"], + [17098, 0, "v"], + [17099, 0, "a"], + [17100, 0, "n"], + [17101, 0, "t"], + [17102, 0, "a"], + [17103, 0, "g"], + [17104, 0, "e"], + [17105, 0, " "], + [17106, 0, "o"], + [17107, 0, "f"], + [17108, 0, " "], + [17109, 0, "b"], + [17110, 0, "e"], + [17111, 0, "i"], + [17112, 0, "n"], + [17113, 0, "g"], + [17114, 0, " "], + [17115, 0, "a"], + [17116, 0, "b"], + [17117, 0, "l"], + [17118, 0, "e"], + [17119, 0, " "], + [17120, 0, "t"], + [17121, 0, "o"], + [17122, 0, " "], + [17123, 0, "e"], + [17124, 0, "x"], + [17125, 0, "p"], + [17126, 0, "r"], + [17127, 0, "e"], + [17128, 0, "s"], + [17129, 0, "s"], + [17130, 0, " "], + [17131, 0, "g"], + [17132, 0, "l"], + [17133, 0, "o"], + [17134, 0, "b"], + [17135, 0, "a"], + [17136, 0, "l"], + [17137, 0, " "], + [17138, 0, "i"], + [17139, 0, "n"], + [17140, 0, "v"], + [17141, 0, "a"], + [17142, 0, "r"], + [17143, 0, "i"], + [17144, 0, "a"], + [17145, 0, "n"], + [17146, 0, "t"], + [17147, 0, "s"], + [17148, 0, " "], + [17149, 0, "s"], + [17150, 0, "u"], + [17151, 0, "c"], + [17152, 0, "h"], + [17153, 0, " "], + [17154, 0, "a"], + [17155, 0, "s"], + [17156, 0, " "], + [17157, 0, "u"], + [17158, 0, "n"], + [17159, 0, "i"], + [17160, 0, "q"], + [17161, 0, "u"], + [17162, 0, "e"], + [17163, 0, "n"], + [17164, 0, "e"], + [17165, 0, "s"], + [17166, 0, "s"], + [17167, 0, " "], + [17168, 0, "c"], + [17169, 0, "o"], + [17170, 0, "n"], + [17171, 0, "s"], + [17172, 0, "t"], + [17173, 0, "r"], + [17174, 0, "a"], + [17175, 0, "i"], + [17176, 0, "n"], + [17177, 0, "t"], + [17178, 0, "s"], + [17179, 0, ","], + [17180, 0, " "], + [17181, 0, "w"], + [17182, 0, "h"], + [17183, 0, "i"], + [17184, 0, "c"], + [17185, 0, "h"], + [17186, 0, " "], + [17187, 0, "r"], + [17188, 0, "e"], + [17189, 0, "q"], + [17190, 0, "u"], + [17191, 0, "i"], + [17192, 0, "r"], + [17193, 0, "e"], + [17194, 0, " "], + [17195, 0, "s"], + [17196, 0, "e"], + [17197, 0, "r"], + [17198, 0, "i"], + [17199, 0, "a"], + [17200, 0, "l"], + [17201, 0, "i"], + [17202, 0, "z"], + [17203, 0, "a"], + [17204, 0, "t"], + [17205, 0, "i"], + [17206, 0, "o"], + [17207, 0, "n"], + [17208, 0, " "], + [17209, 0, "a"], + [17210, 0, "n"], + [17211, 0, "d"], + [17212, 0, " "], + [17213, 0, "c"], + [17214, 0, "a"], + [17215, 0, "n"], + [17216, 0, "n"], + [17217, 0, "o"], + [17218, 0, "t"], + [17219, 0, " "], + [17220, 0, "b"], + [17221, 0, "e"], + [17222, 0, " "], + [17223, 0, "e"], + [17224, 0, "x"], + [17225, 0, "p"], + [17226, 0, "r"], + [17227, 0, "e"], + [17228, 0, "s"], + [17229, 0, "s"], + [17230, 0, "e"], + [17231, 0, "d"], + [17232, 0, " "], + [17233, 0, "u"], + [17234, 0, "s"], + [17235, 0, "i"], + [17236, 0, "n"], + [17237, 0, "g"], + [17238, 0, " "], + [17239, 0, "C"], + [17240, 0, "R"], + [17241, 0, "D"], + [17242, 0, "T"], + [17243, 0, "s"], + [17244, 0, "."], + [17245, 0, " "], + [17246, 0, "H"], + [17247, 0, "o"], + [17248, 0, "w"], + [17249, 0, "e"], + [17250, 0, "v"], + [17251, 0, "e"], + [17252, 0, "r"], + [17253, 0, ","], + [17254, 0, " "], + [17255, 0, "i"], + [17256, 0, "t"], + [17257, 0, " "], + [17258, 0, "r"], + [17259, 0, "e"], + [17260, 0, "q"], + [17261, 0, "u"], + [17262, 0, "i"], + [17263, 0, "r"], + [17264, 0, "e"], + [17265, 0, "s"], + [17266, 0, " "], + [17267, 0, "a"], + [17268, 0, "t"], + [17269, 0, "o"], + [17270, 0, "m"], + [17271, 0, "i"], + [17272, 0, "c"], + [17273, 0, " "], + [17274, 0, "b"], + [17275, 0, "r"], + [17276, 0, "o"], + [17277, 0, "a"], + [17278, 0, "d"], + [17279, 0, "c"], + [17280, 0, "a"], + [17281, 0, "s"], + [17282, 0, "t"], + [17283, 0, ","], + [17284, 0, " "], + [17285, 0, "w"], + [17286, 0, "h"], + [17287, 0, "i"], + [17288, 0, "c"], + [17289, 0, "h"], + [17290, 0, " "], + [17290, 1], + [17289, 1], + [17288, 1], + [17287, 1], + [17286, 1], + [17285, 1], + [17284, 1], + [17283, 1], + [17282, 1], + [17281, 1], + [17280, 1], + [17279, 1], + [17278, 1], + [17277, 1], + [17276, 1], + [17275, 1], + [17274, 1], + [17273, 1], + [17272, 1], + [17271, 1], + [17270, 1], + [17269, 1], + [17268, 1], + [17267, 1], + [17266, 1], + [17265, 1], + [17264, 1], + [17263, 1], + [17262, 1], + [17261, 1], + [17260, 1], + [17259, 1], + [17258, 1], + [17257, 1], + [17256, 1], + [17255, 1], + [17254, 1], + [17253, 1], + [17252, 1], + [17251, 1], + [17250, 1], + [17249, 1], + [17248, 1], + [17247, 1], + [17246, 1], + [17246, 0, "T"], + [17247, 0, "h"], + [17248, 0, "e"], + [17249, 0, " "], + [17250, 0, "d"], + [17251, 0, "o"], + [17252, 0, "w"], + [17253, 0, "n"], + [17254, 0, "s"], + [17255, 0, "i"], + [17256, 0, "d"], + [17257, 0, "e"], + [17258, 0, " "], + [17259, 0, "i"], + [17260, 0, "s"], + [17261, 0, " "], + [17262, 0, "t"], + [17263, 0, "h"], + [17264, 0, "a"], + [17265, 0, "t"], + [17266, 0, " "], + [17267, 0, "t"], + [17268, 0, "e"], + [17269, 0, "n"], + [17270, 0, "t"], + [17271, 0, "a"], + [17272, 0, "t"], + [17273, 0, "i"], + [17274, 0, "v"], + [17275, 0, "e"], + [17276, 0, " "], + [17277, 0, "t"], + [17278, 0, "r"], + [17279, 0, "a"], + [17280, 0, "n"], + [17281, 0, "s"], + [17282, 0, "a"], + [17283, 0, "c"], + [17284, 0, "t"], + [17285, 0, "i"], + [17286, 0, "o"], + [17287, 0, "n"], + [17288, 0, "s"], + [17289, 0, " "], + [17290, 0, "m"], + [17291, 0, "a"], + [17292, 0, "y"], + [17293, 0, " "], + [17294, 0, "b"], + [17295, 0, "e"], + [17296, 0, " "], + [17297, 0, "r"], + [17298, 0, "o"], + [17299, 0, "l"], + [17300, 0, "l"], + [17301, 0, "e"], + [17302, 0, "d"], + [17303, 0, " "], + [17304, 0, "b"], + [17305, 0, "a"], + [17306, 0, "c"], + [17307, 0, "k"], + [17308, 0, ","], + [17309, 0, " "], + [17310, 0, "r"], + [17311, 0, "e"], + [17312, 0, "q"], + [17313, 0, "u"], + [17314, 0, "i"], + [17315, 0, "r"], + [17316, 0, "i"], + [17317, 0, "n"], + [17318, 0, "g"], + [17319, 0, " "], + [17320, 0, "t"], + [17321, 0, "h"], + [17322, 0, "e"], + [17323, 0, " "], + [17324, 0, "a"], + [17325, 0, "p"], + [17326, 0, "p"], + [17327, 0, "l"], + [17328, 0, "i"], + [17329, 0, "c"], + [17330, 0, "a"], + [17331, 0, "t"], + [17332, 0, "i"], + [17333, 0, "o"], + [17334, 0, "n"], + [17335, 0, " "], + [17336, 0, "t"], + [17337, 0, "o"], + [17338, 0, " "], + [17339, 0, "e"], + [17340, 0, "x"], + [17341, 0, "p"], + [17342, 0, "l"], + [17343, 0, "i"], + [17344, 0, "c"], + [17345, 0, "i"], + [17346, 0, "t"], + [17347, 0, "l"], + [17348, 0, "y"], + [17349, 0, " "], + [17350, 0, "h"], + [17351, 0, "a"], + [17352, 0, "n"], + [17353, 0, "d"], + [17354, 0, "l"], + [17355, 0, "e"], + [17356, 0, " "], + [17357, 0, "r"], + [17358, 0, "o"], + [17359, 0, "l"], + [17360, 0, "l"], + [17361, 0, "b"], + [17362, 0, "a"], + [17363, 0, "c"], + [17364, 0, "k"], + [17365, 0, "s"], + [17366, 0, ","], + [17367, 0, " "], + [17368, 0, "w"], + [17369, 0, "h"], + [17370, 0, "e"], + [17371, 0, "r"], + [17372, 0, "e"], + [17373, 0, "a"], + [17374, 0, "s"], + [17375, 0, " "], + [17376, 0, "C"], + [17377, 0, "R"], + [17378, 0, "D"], + [17379, 0, "T"], + [17380, 0, "s"], + [17381, 0, " "], + [17382, 0, "a"], + [17383, 0, "r"], + [17384, 0, "e"], + [17385, 0, " "], + [17386, 0, "d"], + [17387, 0, "e"], + [17388, 0, "f"], + [17389, 0, "i"], + [17390, 0, "n"], + [17391, 0, "e"], + [17392, 0, "d"], + [17393, 0, " "], + [17394, 0, "s"], + [17395, 0, "u"], + [17396, 0, "c"], + [17397, 0, "h"], + [17398, 0, " "], + [17399, 0, "t"], + [17400, 0, "h"], + [17401, 0, "a"], + [17402, 0, "t"], + [17403, 0, " "], + [17404, 0, "o"], + [17405, 0, "p"], + [17406, 0, "e"], + [17407, 0, "r"], + [17408, 0, "a"], + [17409, 0, "t"], + [17410, 0, "i"], + [17411, 0, "o"], + [17412, 0, "n"], + [17413, 0, "s"], + [17414, 0, " "], + [17415, 0, "c"], + [17416, 0, "a"], + [17417, 0, "n"], + [17418, 0, "n"], + [17419, 0, "o"], + [17420, 0, "t"], + [17421, 0, " "], + [17422, 0, "f"], + [17423, 0, "a"], + [17424, 0, "i"], + [17425, 0, "l"], + [17426, 0, " "], + [17427, 0, "a"], + [17428, 0, "f"], + [17429, 0, "t"], + [17430, 0, "e"], + [17431, 0, "r"], + [17432, 0, " "], + [17433, 0, "t"], + [17434, 0, "h"], + [17435, 0, "e"], + [17436, 0, "y"], + [17437, 0, " "], + [17438, 0, "h"], + [17439, 0, "a"], + [17440, 0, "v"], + [17441, 0, "e"], + [17442, 0, " "], + [17443, 0, "b"], + [17444, 0, "e"], + [17445, 0, "e"], + [17446, 0, "n"], + [17447, 0, " "], + [17448, 0, "p"], + [17449, 0, "e"], + [17450, 0, "r"], + [17451, 0, "f"], + [17452, 0, "o"], + [17453, 0, "r"], + [17454, 0, "m"], + [17455, 0, "e"], + [17456, 0, "d"], + [17457, 0, " "], + [17458, 0, "o"], + [17459, 0, "n"], + [17460, 0, " "], + [17461, 0, "o"], + [17462, 0, "n"], + [17463, 0, "e"], + [17464, 0, " "], + [17465, 0, "r"], + [17466, 0, "e"], + [17467, 0, "p"], + [17468, 0, "l"], + [17469, 0, "i"], + [17470, 0, "c"], + [17471, 0, "a"], + [17472, 0, "."], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17473, 1], + [17086, 1], + [17085, 1], + [17084, 1], + [17083, 1], + [17082, 1], + [17081, 1], + [17080, 1], + [17079, 1], + [17078, 1], + [17077, 1], + [17076, 1], + [17075, 1], + [17074, 1], + [17074, 0, "B"], + [17075, 0, "a"], + [17076, 0, "y"], + [17077, 0, "o"], + [17078, 0, "u"], + [17236, 0, "~"], + [17237, 0, "\\"], + [17238, 0, "c"], + [17239, 0, "i"], + [17240, 0, "t"], + [17241, 0, "e"], + [17242, 0, "{"], + [17243, 0, "B"], + [17244, 0, "a"], + [17245, 0, "i"], + [17246, 0, "l"], + [17247, 0, "i"], + [17248, 0, "s"], + [17249, 0, ":"], + [17250, 0, "2"], + [17251, 0, "0"], + [17252, 0, "1"], + [17253, 0, "4"], + [17254, 0, "t"], + [17255, 0, "h"], + [17256, 0, "}"], + [16545, 1], + [16544, 1], + [16543, 1], + [16542, 1], + [16541, 1], + [16540, 1], + [16539, 1], + [16538, 1], + [16537, 1], + [16536, 1], + [16535, 1], + [16534, 1], + [16533, 1], + [16533, 0, "L"], + [16534, 0, "W"], + [16535, 0, "W"], + [16638, 1], + [16637, 1], + [16636, 1], + [16636, 0, "I"], + [16637, 0, "t"], + [15880, 0, " "], + [15881, 0, "a"], + [15882, 0, "n"], + [15883, 0, "d"], + [15884, 0, " "], + [15885, 0, "C"], + [15886, 0, "o"], + [15887, 0, "u"], + [15888, 0, "c"], + [15889, 0, "h"], + [15890, 0, "D"], + [15891, 0, "B"], + [16645, 1], + [16644, 1], + [16643, 1], + [16642, 1], + [16641, 1], + [16640, 1], + [16639, 1], + [16638, 1], + [16637, 1], + [16636, 1], + [16635, 1], + [16634, 1], + [16633, 1], + [16632, 1], + [16631, 1], + [16630, 1], + [16629, 1], + [16628, 1], + [16627, 1], + [16626, 1], + [16625, 1], + [16624, 1], + [16623, 1], + [16622, 1], + [16621, 1], + [16620, 1], + [16619, 1], + [16618, 1], + [16617, 1], + [16616, 1], + [16615, 1], + [16614, 1], + [16613, 1], + [16612, 1], + [16611, 1], + [16610, 1], + [16609, 1], + [16608, 1], + [16607, 1], + [16606, 1], + [16605, 1], + [16604, 1], + [16603, 1], + [16602, 1], + [16601, 1], + [16600, 1], + [16599, 1], + [16598, 1], + [16597, 1], + [16596, 1], + [16595, 1], + [16594, 1], + [16593, 1], + [16592, 1], + [16591, 1], + [16590, 1], + [16589, 1], + [16588, 1], + [16587, 1], + [16586, 1], + [16585, 1], + [16584, 1], + [16583, 1], + [16582, 1], + [16581, 1], + [16580, 1], + [16579, 1], + [16578, 1], + [16578, 0, "f"], + [16579, 0, "o"], + [16580, 0, "r"], + [16581, 0, " "], + [16582, 0, "e"], + [16583, 0, "x"], + [16584, 0, "a"], + [16585, 0, "m"], + [16586, 0, "p"], + [16587, 0, "l"], + [16588, 0, "e"], + [17205, 1], + [17204, 1], + [17203, 1], + [17203, 0, "B"], + [17204, 0, "a"], + [17205, 0, "y"], + [17206, 0, "o"], + [17207, 0, "u"], + [17208, 0, "'"], + [17209, 0, "s"], + [17299, 1], + [17298, 1], + [17297, 1], + [17296, 1], + [17295, 1], + [17294, 1], + [17293, 1], + [17292, 1], + [17291, 1], + [17290, 1], + [17289, 1], + [17288, 1], + [17287, 1], + [17286, 1], + [17285, 1], + [17284, 1], + [17283, 1], + [17282, 1], + [17281, 1], + [17290, 1], + [17289, 1], + [17295, 1], + [17295, 0, "i"], + [17296, 0, "n"], + [17297, 0, "g"], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 1], + [17299, 0, "b"], + [17300, 0, "y"], + [17301, 0, " "], + [17302, 0, "t"], + [17303, 0, "h"], + [17304, 0, "e"], + [17305, 0, " "], + [17306, 0, "a"], + [17307, 0, "p"], + [17308, 0, "p"], + [17309, 0, "l"], + [17310, 0, "i"], + [17311, 0, "c"], + [17312, 0, "a"], + [17313, 0, "t"], + [17314, 0, "i"], + [17315, 0, "o"], + [17316, 0, "n"], + [78208, 1], + [78207, 1], + [78206, 1], + [78205, 1], + [78205, 0, ","], + [78219, 0, ","], + [78220, 0, " "], + [78221, 0, "a"], + [78222, 0, "n"], + [78223, 0, "d"], + [78224, 0, " "], + [78225, 0, "t"], + [78226, 0, "h"], + [78227, 0, "e"], + [78228, 0, " "], + [78229, 0, "a"], + [78230, 0, "n"], + [78231, 0, "o"], + [78232, 0, "n"], + [78233, 0, "y"], + [78234, 0, "m"], + [78235, 0, "o"], + [78236, 0, "u"], + [78237, 0, "s"], + [78238, 0, " "], + [78239, 0, "r"], + [78240, 0, "e"], + [78241, 0, "v"], + [78242, 0, "i"], + [78243, 0, "e"], + [78244, 0, "w"], + [78245, 0, "e"], + [78246, 0, "r"], + [78247, 0, "s"], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 1], + [78262, 0, "t"], + [78263, 0, "h"], + [78264, 0, "a"], + [78265, 0, "t"], + [78266, 0, " "], + [78267, 0, "i"], + [78268, 0, "m"], + [78269, 0, "p"], + [78270, 0, "r"], + [78271, 0, "o"], + [78272, 0, "v"], + [78273, 0, "e"], + [78274, 0, "d"], + [25031, 0, "\n"], + [25032, 0, "\n"], + [25033, 0, "\\"], + [25034, 0, "b"], + [25035, 0, "e"], + [25036, 0, "g"], + [25037, 0, "i"], + [25038, 0, "n"], + [25039, 0, "{"], + [25040, 0, "f"], + [25041, 0, "i"], + [25042, 0, "g"], + [25043, 0, "u"], + [25044, 0, "r"], + [25045, 0, "e"], + [25046, 0, "*"], + [25047, 0, "}"], + [25048, 0, "\n"], + [25049, 0, "\\"], + [25050, 0, "c"], + [25051, 0, "e"], + [25052, 0, "n"], + [25053, 0, "t"], + [25054, 0, "e"], + [25055, 0, "r"], + [25056, 0, "i"], + [25057, 0, "n"], + [25058, 0, "g"], + [25059, 0, "\n"], + [25060, 0, "\\"], + [25061, 0, "b"], + [25062, 0, "e"], + [25063, 0, "g"], + [25064, 0, "i"], + [25065, 0, "n"], + [25066, 0, "{"], + [25067, 0, "t"], + [25068, 0, "i"], + [25069, 0, "k"], + [25070, 0, "z"], + [25071, 0, "p"], + [25072, 0, "i"], + [25073, 0, "c"], + [25074, 0, "t"], + [25075, 0, "u"], + [25076, 0, "r"], + [25077, 0, "e"], + [25078, 0, "}"], + [25079, 0, "["], + [25080, 0, "a"], + [25081, 0, "u"], + [25082, 0, "t"], + [25083, 0, "o"], + [25084, 0, ","], + [25085, 0, "s"], + [25086, 0, "c"], + [25087, 0, "a"], + [25088, 0, "l"], + [25089, 0, "e"], + [25090, 0, "="], + [25091, 0, "0"], + [25092, 0, "."], + [25093, 0, "8"], + [25094, 0, "]"], + [25095, 0, "\n"], + [25096, 0, "\\"], + [25097, 0, "e"], + [25098, 0, "n"], + [25099, 0, "d"], + [25100, 0, "{"], + [25101, 0, "t"], + [25102, 0, "i"], + [25103, 0, "k"], + [25104, 0, "z"], + [25105, 0, "p"], + [25106, 0, "i"], + [25107, 0, "c"], + [25108, 0, "t"], + [25109, 0, "u"], + [25110, 0, "r"], + [25111, 0, "e"], + [25112, 0, "}"], + [25113, 0, "\n"], + [25114, 0, "\\"], + [25115, 0, "c"], + [25116, 0, "a"], + [25117, 0, "p"], + [25118, 0, "t"], + [25119, 0, "i"], + [25120, 0, "o"], + [25121, 0, "n"], + [25122, 0, "{"], + [25123, 0, "C"], + [25124, 0, "o"], + [25125, 0, "n"], + [25126, 0, "c"], + [25127, 0, "u"], + [25128, 0, "r"], + [25129, 0, "r"], + [25130, 0, "e"], + [25131, 0, "n"], + [25132, 0, "t"], + [25133, 0, " "], + [25134, 0, "e"], + [25135, 0, "d"], + [25136, 0, "i"], + [25137, 0, "t"], + [25138, 0, "i"], + [25139, 0, "n"], + [25140, 0, "g"], + [25141, 0, " "], + [25142, 0, "o"], + [25143, 0, "f"], + [25144, 0, " "], + [25145, 0, "a"], + [25146, 0, "n"], + [25147, 0, " "], + [25148, 0, "o"], + [25149, 0, "r"], + [25150, 0, "d"], + [25151, 0, "e"], + [25152, 0, "r"], + [25153, 0, "e"], + [25154, 0, "d"], + [25155, 0, " "], + [25156, 0, "l"], + [25157, 0, "i"], + [25158, 0, "s"], + [25159, 0, "t"], + [25160, 0, " "], + [25161, 0, "o"], + [25162, 0, "f"], + [25163, 0, " "], + [25164, 0, "c"], + [25165, 0, "h"], + [25166, 0, "a"], + [25167, 0, "r"], + [25168, 0, "a"], + [25169, 0, "c"], + [25170, 0, "t"], + [25171, 0, "e"], + [25172, 0, "r"], + [25173, 0, "s"], + [25174, 0, " "], + [25175, 0, "("], + [25176, 0, "i"], + [25177, 0, "."], + [25178, 0, "e"], + [25179, 0, "."], + [25180, 0, ","], + [25181, 0, " "], + [25182, 0, "a"], + [25183, 0, " "], + [25184, 0, "t"], + [25185, 0, "e"], + [25186, 0, "x"], + [25187, 0, "t"], + [25188, 0, " "], + [25189, 0, "d"], + [25190, 0, "o"], + [25191, 0, "c"], + [25192, 0, "u"], + [25193, 0, "m"], + [25194, 0, "e"], + [25195, 0, "n"], + [25196, 0, "t"], + [25197, 0, ")"], + [25198, 0, "."], + [25199, 0, "}"], + [25200, 0, "\n"], + [25201, 0, "\\"], + [25202, 0, "e"], + [25203, 0, "n"], + [25204, 0, "d"], + [25205, 0, "{"], + [25206, 0, "f"], + [25207, 0, "i"], + [25208, 0, "g"], + [25209, 0, "u"], + [25210, 0, "r"], + [25211, 0, "e"], + [25212, 0, "*"], + [25213, 0, "}"], + [25095, 0, "\n"], + [25096, 0, "\\"], + [25097, 0, "n"], + [25098, 0, "o"], + [25099, 0, "d"], + [25100, 0, "e"], + [25101, 0, " "], + [25102, 0, "("], + [25103, 0, "l"], + [25104, 0, "e"], + [25105, 0, "f"], + [25106, 0, "t"], + [25107, 0, "1"], + [25108, 0, ")"], + [25109, 0, " "], + [25110, 0, "a"], + [25111, 0, "t"], + [25112, 0, " "], + [25113, 0, "("], + [25114, 0, "0"], + [25115, 0, ","], + [25116, 0, "0"], + [25117, 0, ")"], + [25118, 0, " "], + [25119, 0, "["], + [25120, 0, "r"], + [25121, 0, "e"], + [25122, 0, "c"], + [25123, 0, "t"], + [25124, 0, "a"], + [25125, 0, "n"], + [25126, 0, "g"], + [25127, 0, "l"], + [25128, 0, "e"], + [25129, 0, ","], + [25130, 0, "d"], + [25131, 0, "r"], + [25132, 0, "a"], + [25133, 0, "w"], + [25134, 0, "]"], + [25135, 0, " "], + [25136, 0, "{"], + [25137, 0, "\\"], + [25138, 0, "{"], + [25139, 0, "`"], + [25140, 0, "`"], + [25141, 0, "t"], + [25142, 0, "e"], + [25143, 0, "x"], + [25144, 0, "t"], + [25145, 0, "'"], + [25146, 0, "'"], + [25147, 0, ":"], + [25148, 0, " "], + [25149, 0, "["], + [25150, 0, "z"], + [25151, 0, "z"], + [25151, 1], + [25150, 1], + [25150, 0, "`"], + [25151, 0, "`"], + [25152, 0, "h"], + [25153, 0, "'"], + [25154, 0, "'"], + [25155, 0, ","], + [25156, 0, " "], + [25157, 0, "`"], + [25158, 0, "`"], + [25159, 0, "i"], + [25160, 0, "'"], + [25161, 0, "'"], + [25162, 0, "]"], + [25163, 0, "\\"], + [25164, 0, "}"], + [25165, 0, "]"], + [25165, 1], + [25165, 0, "]"], + [25165, 1], + [25165, 0, "}"], + [25166, 0, ";"], + [25152, 1], + [25152, 0, "a"], + [25159, 1], + [25159, 0, "b"], + [25162, 0, ","], + [25163, 0, " "], + [25164, 0, "`"], + [25165, 0, "`"], + [25166, 0, "c"], + [25167, 0, "'"], + [25168, 0, "'"], + [29711, 1], + [29710, 1], + [29709, 1], + [29708, 1], + [29708, 0, "a"], + [29709, 0, "t"], + [29710, 0, "("], + [29712, 0, "$"], + [29713, 0, "n"], + [29714, 0, "$"], + [29715, 0, "\\"], + [29716, 0, "t"], + [29717, 0, "e"], + [29718, 0, "x"], + [29719, 0, "t"], + [29720, 0, "t"], + [29721, 0, "t"], + [29722, 0, "{"], + [29723, 0, ")"], + [29724, 0, "}"], + [29725, 0, " "], + [29726, 0, "&"], + [29727, 0, " "], + [29728, 0, "$"], + [29729, 0, "n"], + [29730, 0, " "], + [29731, 0, "/"], + [29732, 0, "g"], + [29733, 0, "e"], + [29733, 1], + [29732, 1], + [29731, 1], + [29731, 0, "\\"], + [29732, 0, "g"], + [29733, 0, "e"], + [29734, 0, " "], + [29735, 0, "0"], + [29736, 0, "$"], + [29769, 1], + [29768, 1], + [29767, 1], + [29766, 1], + [29765, 1], + [29764, 1], + [29763, 1], + [29762, 1], + [29761, 1], + [29760, 1], + [29759, 1], + [29758, 1], + [29757, 1], + [29756, 1], + [29755, 1], + [29754, 1], + [29753, 1], + [29752, 1], + [29751, 1], + [29750, 1], + [29749, 1], + [29748, 1], + [29747, 1], + [29746, 1], + [29745, 1], + [29744, 1], + [29743, 1], + [29742, 1], + [29741, 1], + [29740, 1], + [29620, 1], + [29620, 0, "."], + [29621, 0, "g"], + [29622, 0, "e"], + [29623, 0, "t"], + [29624, 0, "("], + [29713, 1], + [29712, 1], + [29712, 0, "i"], + [29713, 0, "d"], + [29714, 0, "x"], + [29648, 1], + [29648, 0, ")"], + [30260, 1], + [30259, 1], + [30258, 1], + [30257, 1], + [30257, 0, "h"], + [30258, 0, "e"], + [30259, 0, "a"], + [30260, 0, "d"], + [30283, 1], + [30282, 1], + [30281, 1], + [30280, 1], + [30280, 0, "i"], + [30281, 0, "d"], + [30282, 0, "x"], + [30283, 0, "("], + [30284, 0, "0"], + [30285, 0, ")"], + [30267, 1], + [30267, 0, "."], + [30268, 0, "g"], + [30269, 0, "e"], + [30270, 0, "t"], + [30271, 0, "("], + [30282, 1], + [30282, 0, ")"], + [30295, 1], + [30294, 1], + [30293, 1], + [30292, 1], + [30292, 0, "h"], + [30293, 0, "e"], + [30294, 0, "a"], + [30295, 0, "d"], + [30332, 1], + [30331, 1], + [30330, 1], + [30329, 1], + [30328, 1], + [30327, 1], + [30326, 1], + [30325, 1], + [30324, 1], + [30324, 0, "d"], + [30325, 0, "o"], + [30326, 0, "c"], + [30327, 0, "."], + [30328, 0, "g"], + [30329, 0, "e"], + [30330, 0, "t"], + [30331, 0, "("], + [30332, 0, "\""], + [30333, 0, "s"], + [30334, 0, "h"], + [30335, 0, "o"], + [30336, 0, "p"], + [30337, 0, "p"], + [30338, 0, "i"], + [30339, 0, "n"], + [30340, 0, "g"], + [30341, 0, "\""], + [30342, 0, ")"], + [30343, 0, "."], + [30344, 0, "i"], + [30345, 0, "d"], + [30346, 0, "x"], + [30347, 0, "("], + [30348, 0, "1"], + [30349, 0, ")"], + [30376, 1], + [30375, 1], + [30374, 1], + [30373, 1], + [30373, 0, "h"], + [30374, 0, "e"], + [30375, 0, "a"], + [30376, 0, "d"], + [37569, 1], + [37568, 1], + [37567, 1], + [37567, 0, "d"], + [37568, 0, "x"], + [37558, 0, "$"], + [37571, 0, "_"], + [37572, 0, "1"], + [37573, 0, "$"], + [37909, 1], + [37909, 0, "2"], + [37906, 1], + [37905, 1], + [37904, 1], + [37903, 1], + [37903, 0, "I"], + [37904, 0, "d"], + [37905, 0, "x"], + [38177, 1], + [38176, 1], + [38175, 1], + [38174, 1], + [38174, 0, "I"], + [38175, 0, "d"], + [38176, 0, "x"], + [38179, 1], + [38179, 0, "3"], + [38608, 1], + [38608, 0, "4"], + [38605, 1], + [38604, 1], + [38603, 1], + [38602, 1], + [38602, 0, "I"], + [38603, 0, "d"], + [38604, 0, "x"], + [38999, 1], + [38998, 1], + [38997, 1], + [38996, 1], + [38996, 0, "I"], + [38997, 0, "d"], + [38998, 0, "x"], + [39001, 1], + [39001, 0, "5"], + [37620, 1], + [37619, 1], + [37618, 1], + [37618, 0, "d"], + [37619, 0, "x"], + [37620, 0, "("], + [37622, 0, "n"], + [37623, 0, "\\"], + [37624, 0, "m"], + [37625, 0, "a"], + [37626, 0, "t"], + [37627, 0, "h"], + [37628, 0, "s"], + [37629, 0, "f"], + [37630, 0, "{"], + [37631, 0, ")"], + [37632, 0, "}"], + [37577, 1], + [37577, 0, "B"], + [37578, 0, "i"], + [37546, 0, "\n"], + [37547, 0, "\\"], + [37548, 0, "A"], + [37549, 0, "x"], + [37550, 0, "i"], + [37551, 0, "o"], + [37552, 0, "m"], + [37553, 0, "C"], + [37554, 0, "{"], + [37555, 0, "$"], + [37556, 0, "A"], + [37557, 0, "_"], + [37558, 0, "p"], + [37559, 0, ","], + [37560, 0, "\\"], + [37561, 0, ","], + [37562, 0, " "], + [37563, 0, "\\"], + [37564, 0, "m"], + [37565, 0, "a"], + [37566, 0, "t"], + [37567, 0, "h"], + [37568, 0, "s"], + [37569, 0, "f"], + [37570, 0, "{"], + [37571, 0, "c"], + [37572, 0, "u"], + [37573, 0, "r"], + [37574, 0, "s"], + [37575, 0, "o"], + [37576, 0, "r"], + [37577, 0, "}"], + [37578, 0, "("], + [37579, 0, "\\"], + [37580, 0, "l"], + [37581, 0, "a"], + [37582, 0, "n"], + [37583, 0, "g"], + [37584, 0, "l"], + [37585, 0, "e"], + [37586, 0, " "], + [37587, 0, "k"], + [37588, 0, "_"], + [37589, 0, "1"], + [37590, 0, ","], + [37591, 0, " "], + [37592, 0, "\\"], + [37593, 0, "d"], + [37594, 0, "o"], + [37595, 0, "t"], + [37596, 0, "s"], + [37597, 0, ","], + [37598, 0, " "], + [37599, 0, "k"], + [37600, 0, "_"], + [37601, 0, "{"], + [37602, 0, "n"], + [37603, 0, "-"], + [37604, 0, "1"], + [37605, 0, "}"], + [37606, 0, ","], + [37607, 0, " "], + [37608, 0, "\\"], + [37609, 0, "m"], + [37610, 0, "a"], + [37611, 0, "t"], + [37612, 0, "h"], + [37613, 0, "s"], + [37614, 0, "f"], + [37615, 0, "{"], + [37616, 0, "l"], + [37617, 0, "i"], + [37618, 0, "s"], + [37619, 0, "t"], + [37620, 0, "T"], + [37621, 0, "}"], + [37622, 0, "("], + [37623, 0, "k"], + [37624, 0, "_"], + [37625, 0, "n"], + [37626, 0, ")"], + [37627, 0, " "], + [37628, 0, "\\"], + [37629, 0, "r"], + [37630, 0, "a"], + [37631, 0, "n"], + [37632, 0, "g"], + [37633, 0, "l"], + [37634, 0, "e"], + [37635, 0, ","], + [37636, 0, "\\"], + [37637, 0, ","], + [37638, 0, " "], + [37639, 0, "\\"], + [37640, 0, "m"], + [37641, 0, "a"], + [37642, 0, "t"], + [37643, 0, "h"], + [37644, 0, "s"], + [37645, 0, "f"], + [37646, 0, "{"], + [37647, 0, "h"], + [37648, 0, "e"], + [37649, 0, "a"], + [37650, 0, "d"], + [37651, 0, "}"], + [37652, 0, ")"], + [37653, 0, "%"], + [37653, 1], + [37653, 0, "$"], + [37654, 0, "}"], + [37653, 0, " "], + [37654, 0, "\\"], + [37655, 0, "e"], + [37656, 0, "v"], + [37657, 0, "a"], + [37658, 0, "l"], + [37659, 0, "t"], + [37660, 0, "o"], + [37661, 0, " "], + [37653, 1], + [37653, 0, "\n"], + [37654, 0, " "], + [37655, 0, " "], + [37656, 0, " "], + [37657, 0, " "], + [37666, 0, "\\"], + [37667, 0, "m"], + [37668, 0, "a"], + [37669, 0, "t"], + [37670, 0, "h"], + [37671, 0, "i"], + [37672, 0, "t"], + [37673, 0, "{"], + [37674, 0, "c"], + [37675, 0, "u"], + [37676, 0, "r"], + [37677, 0, "}"], + [37678, 0, "'"], + [37653, 0, "."], + [37654, 0, "\\"], + [37655, 0, "m"], + [37656, 0, "a"], + [37657, 0, "t"], + [37658, 0, "h"], + [37659, 0, "s"], + [37660, 0, "f"], + [37661, 0, "{"], + [37662, 0, "i"], + [37663, 0, "d"], + [37664, 0, "x"], + [37665, 0, "("], + [37666, 0, "}"], + [37638, 0, "\n"], + [37639, 0, " "], + [37640, 0, " "], + [37641, 0, " "], + [37674, 1], + [37673, 1], + [37672, 1], + [37671, 1], + [37671, 0, "n"], + [37672, 0, "\\"], + [37673, 0, "m"], + [37674, 0, "a"], + [37675, 0, "t"], + [37676, 0, "h"], + [37677, 0, "s"], + [37678, 0, "f"], + [37679, 0, "{"], + [37680, 0, "}"], + [37680, 1], + [37680, 0, ")"], + [37681, 0, "}"], + [37802, 0, " "], + [37803, 0, "\\"], + [37804, 0, "m"], + [37805, 0, "a"], + [37806, 0, "t"], + [37807, 0, "h"], + [37808, 0, "i"], + [37809, 0, "t"], + [37810, 0, "{"], + [37811, 0, "c"], + [37812, 0, "u"], + [37813, 0, "r"], + [37814, 0, "}"], + [37815, 0, "'"], + [37816, 0, "$"], + [37817, 0, "}"], + [37914, 1], + [37913, 1], + [37912, 1], + [37911, 1], + [37910, 1], + [37909, 1], + [37908, 1], + [37907, 1], + [37906, 1], + [37905, 1], + [37904, 1], + [37903, 1], + [37902, 1], + [37901, 1], + [37900, 1], + [37899, 1], + [37898, 1], + [37897, 1], + [37896, 1], + [37895, 1], + [37894, 1], + [37893, 1], + [37892, 1], + [37891, 1], + [37890, 1], + [37889, 1], + [37888, 1], + [37887, 1], + [37886, 1], + [37885, 1], + [37884, 1], + [37883, 1], + [37882, 1], + [37881, 1], + [37880, 1], + [37879, 1], + [37878, 1], + [37877, 1], + [37876, 1], + [37875, 1], + [37874, 1], + [37873, 1], + [37872, 1], + [37871, 1], + [37870, 1], + [37869, 1], + [37868, 1], + [37867, 1], + [37866, 1], + [37865, 1], + [37864, 1], + [37863, 1], + [37862, 1], + [37861, 1], + [37860, 1], + [37859, 1], + [37858, 1], + [37857, 1], + [37856, 1], + [37855, 1], + [37854, 1], + [37853, 1], + [37852, 1], + [37851, 1], + [37850, 1], + [37849, 1], + [37848, 1], + [37847, 1], + [37846, 1], + [37845, 1], + [37844, 1], + [37843, 1], + [37842, 1], + [37841, 1], + [37840, 1], + [37839, 1], + [37838, 1], + [37837, 1], + [37836, 1], + [37835, 1], + [37834, 1], + [37833, 1], + [37832, 1], + [37831, 1], + [37830, 1], + [37829, 1], + [37828, 1], + [37827, 1], + [37826, 1], + [37825, 1], + [37824, 1], + [37823, 1], + [37822, 1], + [37821, 1], + [37820, 1], + [37819, 1], + [37818, 1], + [38048, 1], + [38047, 1], + [38046, 1], + [38045, 1], + [38045, 0, "i"], + [38046, 0, "d"], + [38047, 0, "x"], + [38048, 0, "("], + [38050, 0, "n"], + [38051, 0, "\\"], + [38052, 0, "m"], + [38053, 0, "a"], + [38054, 0, "t"], + [38055, 0, "h"], + [38056, 0, "s"], + [38057, 0, "f"], + [38058, 0, "{"], + [38059, 0, ")"], + [38060, 0, "}"], + [38018, 1], + [38017, 1], + [38016, 1], + [38016, 0, "\\"], + [38017, 0, "a"], + [38018, 0, "t"], + [38018, 1], + [38017, 1], + [38017, 0, "m"], + [38018, 0, "a"], + [38019, 0, "t"], + [38020, 0, "h"], + [38021, 0, "i"], + [38022, 0, "t"], + [38023, 0, "{"], + [38024, 0, "c"], + [38025, 0, "t"], + [38026, 0, "x"], + [38027, 0, "}"], + [38038, 1], + [38037, 1], + [38037, 0, "s"], + [38038, 0, "f"], + [38043, 1], + [38042, 1], + [38041, 1], + [38040, 1], + [38040, 0, "c"], + [38041, 0, "u"], + [38042, 0, "r"], + [38043, 0, "s"], + [38044, 0, "o"], + [38045, 0, "r"], + [37781, 1], + [37782, 0, "("], + [37784, 0, ")"], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 1], + [37785, 0, " "], + [37681, 1], + [37678, 1], + [37678, 1], + [37677, 1], + [37676, 1], + [37675, 1], + [37674, 1], + [37673, 1], + [37672, 1], + [37670, 1], + [37669, 0, "}"], + [37282, 1], + [37281, 1], + [37281, 0, "s"], + [37282, 0, "f"], + [37284, 1], + [37284, 0, "g"], + [37285, 0, "e"], + [37286, 0, "t"], + [37288, 0, "("], + [37301, 0, ")"], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [37302, 1], + [38023, 0, "("], + [38024, 0, "\\"], + [38025, 0, "l"], + [38026, 0, "a"], + [38027, 0, "n"], + [38028, 0, "g"], + [38029, 0, "l"], + [38030, 0, "e"], + [38031, 0, "\\"], + [38032, 0, "r"], + [38033, 0, "a"], + [38034, 0, "n"], + [38035, 0, "g"], + [38036, 0, "l"], + [38037, 0, "e"], + [38038, 0, ","], + [38039, 0, "\\"], + [38040, 0, ","], + [38041, 0, " "], + [38042, 0, "k"], + [38043, 0, ")"], + [38056, 1], + [38057, 0, "("], + [38058, 1], + [38058, 0, "0"], + [38056, 0, "("], + [38057, 0, "0"], + [38058, 0, ")"], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38060, 1], + [38058, 1], + [38057, 1], + [38056, 1], + [38057, 0, "("], + [38058, 0, "0"], + [38059, 0, ")"], + [38058, 1], + [38058, 0, "n"], + [37948, 1], + [37947, 1], + [37946, 1], + [37945, 1], + [37944, 1], + [37943, 1], + [37942, 1], + [37941, 1], + [37940, 1], + [37939, 1], + [37938, 1], + [37937, 1], + [37936, 1], + [37935, 1], + [37934, 1], + [37933, 1], + [37932, 1], + [37931, 1], + [37930, 1], + [37929, 1], + [37928, 1], + [37927, 1], + [37926, 1], + [37925, 1], + [37924, 1], + [37923, 1], + [37922, 1], + [37921, 1], + [37920, 1], + [37919, 1], + [37918, 1], + [37917, 1], + [37916, 1], + [37915, 1], + [37914, 1], + [37913, 1], + [37912, 1], + [37911, 1], + [37910, 1], + [37909, 1], + [37908, 1], + [37907, 1], + [37906, 1], + [37905, 1], + [37904, 1], + [37903, 1], + [37902, 1], + [37901, 1], + [37900, 1], + [37899, 1], + [37898, 1], + [37897, 1], + [37896, 1], + [37895, 1], + [37894, 1], + [37893, 1], + [37892, 1], + [37891, 1], + [37890, 1], + [37889, 1], + [37888, 1], + [37887, 1], + [37886, 1], + [37885, 1], + [37884, 1], + [37883, 1], + [37882, 1], + [37879, 1], + [37878, 1], + [37877, 1], + [37876, 1], + [37875, 1], + [37874, 1], + [37873, 1], + [37872, 1], + [37871, 1], + [37870, 1], + [37869, 1], + [37868, 1], + [37867, 1], + [37866, 1], + [37865, 1], + [37864, 1], + [37863, 1], + [37862, 1], + [37861, 1], + [37860, 1], + [37859, 1], + [37858, 1], + [37857, 1], + [37856, 1], + [37855, 1], + [37854, 1], + [37853, 1], + [37852, 1], + [37851, 1], + [37850, 1], + [37849, 1], + [37848, 1], + [37847, 1], + [37846, 1], + [37845, 1], + [37844, 1], + [37843, 1], + [37842, 1], + [37841, 1], + [37840, 1], + [37839, 1], + [37839, 0, "n"], + [37840, 0, "="], + [37841, 0, "0"], + [37963, 1], + [37963, 0, "\n"], + [37964, 0, " "], + [37965, 0, " "], + [37966, 0, " "], + [37967, 0, " "], + [37974, 1], + [37973, 1], + [37973, 0, "s"], + [37974, 0, "f"], + [37979, 0, "s"], + [37980, 0, "o"], + [37981, 0, "r"], + [37983, 1], + [37983, 0, "("], + [37984, 0, "\\"], + [37985, 0, "l"], + [37986, 0, "a"], + [37987, 0, "n"], + [37988, 0, "g"], + [37989, 0, "l"], + [37990, 0, "e"], + [37991, 0, "\\"], + [37992, 0, "r"], + [37993, 0, "a"], + [37994, 0, "n"], + [37995, 0, "g"], + [37996, 0, "l"], + [37997, 0, "e"], + [37998, 0, ","], + [37999, 0, "\\"], + [38000, 0, ","], + [38001, 0, " "], + [38002, 0, "k"], + [38003, 0, ")"], + [38041, 0, "\n"], + [38042, 0, "\\"], + [38043, 0, "A"], + [38044, 0, "x"], + [38045, 0, "i"], + [38046, 0, "o"], + [38047, 0, "m"], + [38048, 0, "C"], + [38049, 0, "{"], + [38050, 0, "$"], + [38051, 0, "\\"], + [38052, 0, "m"], + [38053, 0, "a"], + [38054, 0, "t"], + [38055, 0, "h"], + [38056, 0, "i"], + [38057, 0, "t"], + [38058, 0, "{"], + [38058, 1], + [38057, 1], + [38056, 1], + [38055, 1], + [38054, 1], + [38053, 1], + [38052, 1], + [38051, 1], + [38051, 0, "n"], + [38052, 0, ">"], + [38053, 0, "0"], + [38054, 0, "$"], + [38055, 0, "}"], + [38298, 1], + [38297, 1], + [38296, 1], + [38295, 1], + [38295, 0, "i"], + [38296, 0, "d"], + [38297, 0, "x"], + [38299, 0, "("], + [38300, 0, "n"], + [38301, 0, ")"], + [38191, 0, "\n"], + [38066, 0, "n"], + [38067, 0, ">"], + [38068, 0, "0"], + [38069, 0, " "], + [38070, 0, ","], + [38070, 1], + [38070, 0, "\\"], + [38071, 0, ","], + [38072, 0, "\n"], + [38072, 1], + [38072, 0, "\\"], + [38073, 0, "w"], + [38074, 0, "e"], + [38075, 0, "d"], + [38076, 0, "g"], + [38077, 0, "e"], + [38078, 0, "\\"], + [38079, 0, ","], + [38080, 0, " "], + [38055, 1], + [38054, 1], + [38053, 1], + [38052, 1], + [38051, 1], + [38050, 1], + [38049, 1], + [38048, 1], + [38047, 1], + [38046, 1], + [38045, 1], + [38044, 1], + [38043, 1], + [38042, 1], + [38041, 1], + [38192, 0, "\\"], + [38193, 0, "A"], + [38194, 0, "x"], + [38226, 1], + [38226, 0, "R"], + [38226, 1], + [38226, 0, "T"], + [38227, 0, "r"], + [38195, 0, "i"], + [38196, 0, "o"], + [38197, 0, "m"], + [38198, 0, "C"], + [38199, 0, "{"], + [38200, 0, "$"], + [38201, 0, "\\"], + [38202, 0, "m"], + [38203, 0, "a"], + [38204, 0, "t"], + [38205, 0, "h"], + [38206, 0, "i"], + [38207, 0, "t"], + [38208, 0, "{"], + [38209, 0, "c"], + [38210, 0, "t"], + [38211, 0, "x"], + [38212, 0, "}"], + [38213, 0, ","], + [38214, 0, "\\"], + [38215, 0, ","], + [38216, 0, " "], + [38217, 0, "\\"], + [38218, 0, "m"], + [38219, 0, "a"], + [38220, 0, "t"], + [38221, 0, "h"], + [38222, 0, "s"], + [38223, 0, "f"], + [38224, 0, "{"], + [38225, 0, "c"], + [38226, 0, "u"], + [38227, 0, "r"], + [38228, 0, "s"], + [38229, 0, "o"], + [38230, 0, "r"], + [38231, 0, "}"], + [38352, 0, " "], + [38353, 0, "\\"], + [38354, 0, "m"], + [38355, 0, "a"], + [38356, 0, "t"], + [38357, 0, "h"], + [38358, 0, "i"], + [38359, 0, "t"], + [38360, 0, "{"], + [38361, 0, "c"], + [38362, 0, "t"], + [38363, 0, "x"], + [38364, 0, "}"], + [38365, 0, "'"], + [38366, 0, "$"], + [38367, 0, "}"], + [38232, 0, "("], + [38233, 0, "\\"], + [38234, 0, "l"], + [38235, 0, "a"], + [38236, 0, "n"], + [38237, 0, "g"], + [38238, 0, "l"], + [38239, 0, "e"], + [38240, 0, "\\"], + [38241, 0, "r"], + [38242, 0, "a"], + [38243, 0, "n"], + [38244, 0, "g"], + [38245, 0, "l"], + [38246, 0, "e"], + [38247, 0, ","], + [38248, 0, "\\"], + [38249, 0, ","], + [38250, 0, " "], + [38251, 0, "k"], + [38252, 0, "'"], + [38253, 0, ")"], + [38254, 0, "."], + [38255, 0, "\\"], + [38256, 0, "m"], + [38257, 0, "a"], + [38258, 0, "t"], + [38259, 0, "h"], + [38260, 0, "s"], + [38261, 0, "f"], + [38262, 0, "{"], + [38263, 0, "i"], + [38264, 0, "d"], + [38265, 0, "x"], + [38266, 0, "}"], + [38267, 0, "("], + [38268, 0, "n"], + [38269, 0, "-"], + [38270, 0, "1"], + [38271, 0, ")"], + [38272, 0, " "], + [38273, 0, "\\"], + [38274, 0, "e"], + [38275, 0, "v"], + [38276, 0, "a"], + [38277, 0, "l"], + [38278, 0, "t"], + [38279, 0, "o"], + [38280, 0, " "], + [38281, 0, "\\"], + [38282, 0, "m"], + [38283, 0, "a"], + [38284, 0, "t"], + [38285, 0, "h"], + [38286, 0, "i"], + [38287, 0, "t"], + [38288, 0, "{"], + [38289, 0, "c"], + [38290, 0, "t"], + [38291, 0, "x"], + [38292, 0, "}"], + [38293, 0, "'"], + [38294, 0, "$"], + [38295, 0, "}"], + [38475, 1], + [38474, 1], + [38473, 1], + [38472, 1], + [38471, 1], + [38470, 1], + [38469, 1], + [38468, 1], + [38467, 1], + [38466, 1], + [38465, 1], + [38464, 1], + [38463, 1], + [38462, 1], + [38461, 1], + [38460, 1], + [38459, 1], + [38458, 1], + [38457, 1], + [38456, 1], + [38455, 1], + [38454, 1], + [38453, 1], + [38452, 1], + [38451, 1], + [38450, 1], + [38449, 1], + [38448, 1], + [38447, 1], + [38446, 1], + [38445, 1], + [38444, 1], + [38443, 1], + [38442, 1], + [38441, 1], + [38440, 1], + [38439, 1], + [38438, 1], + [38437, 1], + [38436, 1], + [38435, 1], + [38434, 1], + [38433, 1], + [38432, 1], + [37875, 1], + [37875, 1], + [37875, 0, "U"], + [37280, 1], + [37279, 1], + [37278, 1], + [37277, 1], + [37277, 0, "m"], + [37278, 0, "a"], + [37279, 0, "t"], + [37280, 0, "h"], + [38476, 0, "n"], + [38477, 0, ">"], + [38478, 0, "0"], + [38479, 0, " "], + [38480, 0, "\\"], + [38481, 0, ","], + [38482, 0, "\\"], + [38483, 0, "w"], + [38484, 0, "e"], + [38485, 0, "d"], + [38486, 0, "g"], + [38487, 0, "e"], + [38488, 0, "\\"], + [38489, 0, ","], + [38490, 0, " "], + [38687, 1], + [38686, 1], + [38685, 1], + [38684, 1], + [38684, 0, "i"], + [38685, 0, "d"], + [38686, 0, "x"], + [38688, 0, "("], + [38689, 0, "n"], + [38690, 0, "-"], + [38690, 1], + [38690, 0, ")"], + [38823, 1], + [38822, 1], + [38821, 1], + [38820, 1], + [38820, 0, "i"], + [38821, 0, "d"], + [38822, 0, "x"], + [38824, 0, "("], + [38825, 0, "n"], + [38826, 0, ")"], + [39034, 1], + [39033, 1], + [39032, 1], + [39031, 1], + [39031, 0, "i"], + [39032, 0, "d"], + [39033, 0, "x"], + [39035, 0, "("], + [39036, 0, "n"], + [39037, 0, ")"], + [39248, 1], + [39247, 1], + [39246, 1], + [39245, 1], + [39245, 0, "i"], + [39246, 0, "d"], + [39247, 0, "x"], + [39249, 0, "("], + [39250, 0, "n"], + [39251, 0, ")"], + [39250, 1], + [39250, 0, "i"], + [39036, 1], + [39036, 0, "i"], + [38825, 1], + [38825, 0, "i"], + [38689, 1], + [38689, 0, "i"], + [38405, 1], + [38405, 0, "i"], + [38267, 1], + [38267, 0, "i"], + [38476, 1], + [38476, 0, "i"], + [38050, 1], + [38050, 0, "i"], + [37952, 1], + [37952, 0, "i"], + [37839, 1], + [37839, 0, "i"], + [37768, 1], + [37768, 0, "i"], + [37665, 1], + [37665, 0, "i"], + [29718, 1], + [29718, 0, "i"], + [29734, 1], + [29734, 0, "i"], + [37810, 0, "\n"], + [37811, 0, "\n"], + [37812, 0, "\\"], + [37813, 0, "b"], + [37814, 0, "e"], + [37815, 0, "g"], + [37816, 0, "i"], + [37817, 0, "n"], + [37818, 0, "{"], + [37819, 0, "p"], + [37820, 0, "r"], + [37821, 0, "o"], + [37822, 0, "o"], + [37823, 0, "f"], + [37824, 0, "t"], + [37825, 0, "r"], + [37826, 0, "e"], + [37827, 0, "e"], + [37828, 0, "}"], + [37829, 0, "\n"], + [37830, 0, "\\"], + [37831, 0, "e"], + [37832, 0, "n"], + [37833, 0, "d"], + [37834, 0, "{"], + [37835, 0, "p"], + [37836, 0, "r"], + [37837, 0, "o"], + [37838, 0, "o"], + [37839, 0, "f"], + [37840, 0, "t"], + [37841, 0, "r"], + [37842, 0, "e"], + [37843, 0, "e"], + [37844, 0, "}"], + [37829, 0, "\n"], + [37830, 0, "\\"], + [37831, 0, "A"], + [37832, 0, "x"], + [37833, 0, "i"], + [37834, 0, "o"], + [37835, 0, "m"], + [37836, 0, "C"], + [37837, 0, "{"], + [37838, 0, "$"], + [37839, 0, "k"], + [37840, 0, "_"], + [37841, 0, "1"], + [37842, 0, " "], + [37843, 0, "\\"], + [37844, 0, "i"], + [37845, 0, "n"], + [37846, 0, " "], + [37847, 0, "\\"], + [37848, 0, "m"], + [37849, 0, "a"], + [37850, 0, "t"], + [37851, 0, "h"], + [37852, 0, "r"], + [37853, 0, "m"], + [37854, 0, "{"], + [37855, 0, "d"], + [37856, 0, "o"], + [37857, 0, "m"], + [37858, 0, "}"], + [37859, 0, "("], + [37860, 0, "\\"], + [37861, 0, "m"], + [37862, 0, "a"], + [37863, 0, "t"], + [37864, 0, "h"], + [37865, 0, "i"], + [37866, 0, "t"], + [37867, 0, "{"], + [37868, 0, "c"], + [37869, 0, "t"], + [37870, 0, "x"], + [37871, 0, "}"], + [37872, 0, ")"], + [37873, 0, "$"], + [37874, 0, "}"], + [37875, 0, "\n"], + [37876, 0, "\\"], + [37877, 0, "A"], + [37878, 0, "x"], + [37879, 0, "i"], + [37880, 0, "o"], + [37881, 0, "m"], + [37882, 0, "C"], + [37883, 0, "{"], + [37884, 0, "$"], + [37885, 0, "\\"], + [37886, 0, "m"], + [37887, 0, "a"], + [37888, 0, "t"], + [37889, 0, "h"], + [37890, 0, "i"], + [37891, 0, "t"], + [37892, 0, "{"], + [37893, 0, "c"], + [37894, 0, "t"], + [37895, 0, "x"], + [37896, 0, "}"], + [37897, 0, "("], + [37898, 0, "k"], + [37899, 0, "_"], + [37900, 0, "1"], + [37901, 0, ")"], + [37902, 0, ","], + [37903, 0, "\\"], + [37904, 0, ","], + [37905, 0, " "], + [37906, 0, "\\"], + [37907, 0, "m"], + [37908, 0, "a"], + [37909, 0, "t"], + [37910, 0, "h"], + [37911, 0, "s"], + [37912, 0, "f"], + [37913, 0, "{"], + [37914, 0, "c"], + [37915, 0, "u"], + [37916, 0, "r"], + [37917, 0, "s"], + [37918, 0, "o"], + [37919, 0, "r"], + [37920, 0, "}"], + [37921, 0, "("], + [37922, 0, "\\"], + [37923, 0, "l"], + [37924, 0, "a"], + [37925, 0, "n"], + [37926, 0, "g"], + [37927, 0, "l"], + [37928, 0, "e"], + [37929, 0, " "], + [37930, 0, "k"], + [37931, 0, "_"], + [37932, 0, "2"], + [37933, 0, ","], + [37934, 0, " "], + [37935, 0, "\\"], + [37936, 0, "d"], + [37937, 0, "o"], + [37938, 0, "t"], + [37939, 0, "s"], + [37940, 0, ","], + [37941, 0, " "], + [37942, 0, "k"], + [37943, 0, "_"], + [37944, 0, "{"], + [37945, 0, "n"], + [37946, 0, "-"], + [37947, 0, "1"], + [37948, 0, "}"], + [37949, 0, " "], + [37950, 0, "\\"], + [37951, 0, "r"], + [37952, 0, "a"], + [37953, 0, "n"], + [37954, 0, "g"], + [37955, 0, "l"], + [37956, 0, "e"], + [37957, 0, ","], + [37958, 0, "\\"], + [37959, 0, ","], + [37960, 0, " "], + [37961, 0, "k"], + [37962, 0, "_"], + [37963, 0, "n"], + [37964, 0, ")"], + [37965, 0, "."], + [37966, 0, "\\"], + [37967, 0, "m"], + [37968, 0, "a"], + [37969, 0, "t"], + [37970, 0, "h"], + [37971, 0, "s"], + [37972, 0, "f"], + [37973, 0, "{"], + [37974, 0, "i"], + [37975, 0, "d"], + [37976, 0, "x"], + [37977, 0, "}"], + [37978, 0, "("], + [37979, 0, "i"], + [37980, 0, ")"], + [37981, 0, "\n"], + [37982, 0, " "], + [37983, 0, " "], + [37984, 0, " "], + [37985, 0, " "], + [37986, 0, "\\"], + [37987, 0, "e"], + [37988, 0, "v"], + [37989, 0, "a"], + [37990, 0, "l"], + [37991, 0, "t"], + [37992, 0, "o"], + [37993, 0, " "], + [37994, 0, "\\"], + [37995, 0, "m"], + [37996, 0, "a"], + [37997, 0, "t"], + [37998, 0, "h"], + [37999, 0, "s"], + [38000, 0, "f"], + [38001, 0, "{"], + [38002, 0, "c"], + [38003, 0, "u"], + [38004, 0, "r"], + [38005, 0, "s"], + [38006, 0, "o"], + [38007, 0, "r"], + [38008, 0, "}"], + [38009, 0, "("], + [38010, 0, "\\"], + [38011, 0, "l"], + [38012, 0, "a"], + [38013, 0, "n"], + [38014, 0, "g"], + [38015, 0, "l"], + [38016, 0, "e"], + [38017, 0, " "], + [38018, 0, "k"], + [38019, 0, "_"], + [38020, 0, "2"], + [38021, 0, ","], + [38022, 0, " "], + [38023, 0, "\\"], + [38024, 0, "d"], + [38025, 0, "o"], + [38026, 0, "t"], + [38027, 0, "s"], + [38028, 0, ","], + [38029, 0, " "], + [38030, 0, "k"], + [38031, 0, "_"], + [38032, 0, "{"], + [38033, 0, "n"], + [38034, 0, "-"], + [38035, 0, "1"], + [38036, 0, "}"], + [38037, 0, " "], + [38038, 0, "\\"], + [38039, 0, "r"], + [38040, 0, "a"], + [38041, 0, "n"], + [38042, 0, "g"], + [38043, 0, "l"], + [38044, 0, "e"], + [38045, 0, ","], + [38046, 0, "\\"], + [38047, 0, ","], + [38048, 0, " "], + [38049, 0, "k"], + [38050, 0, "_"], + [38051, 0, "n"], + [38052, 0, "'"], + [38053, 0, ")"], + [38054, 0, "$"], + [38055, 0, "}"], + [38056, 0, "\n"], + [38057, 0, "\\"], + [38058, 0, "L"], + [38059, 0, "e"], + [38060, 0, "f"], + [38061, 0, "t"], + [38062, 0, "L"], + [38063, 0, "a"], + [38064, 0, "b"], + [38065, 0, "e"], + [38066, 0, "l"], + [38067, 0, "{"], + [38068, 0, "$"], + [38069, 0, "\\"], + [38070, 0, "t"], + [38071, 0, "e"], + [38072, 0, "x"], + [38073, 0, "t"], + [38074, 0, "s"], + [38075, 0, "c"], + [38076, 0, "{"], + [38077, 0, "I"], + [38078, 0, "d"], + [38079, 0, "x"], + [38080, 0, "}"], + [38081, 0, "_"], + [38082, 0, "2"], + [38083, 0, "$"], + [38084, 0, "\\"], + [38084, 1], + [38084, 0, "}"], + [38085, 0, "\n"], + [38086, 0, "\\"], + [38087, 0, "B"], + [38088, 0, "i"], + [38089, 0, "n"], + [38090, 0, "a"], + [38091, 0, "r"], + [38092, 0, "y"], + [38093, 0, "I"], + [38094, 0, "n"], + [38095, 0, "f"], + [38096, 0, "C"], + [38097, 0, "{"], + [38098, 0, "$"], + [38099, 0, "\\"], + [38100, 0, "m"], + [38101, 0, "a"], + [38102, 0, "t"], + [38103, 0, "h"], + [38104, 0, "i"], + [38105, 0, "t"], + [38106, 0, "{"], + [38107, 0, "c"], + [38108, 0, "t"], + [38109, 0, "x"], + [38110, 0, "}"], + [38111, 0, ","], + [38112, 0, "\\"], + [38113, 0, ","], + [38114, 0, " "], + [38115, 0, "\\"], + [38116, 0, "a"], + [38117, 0, "t"], + [38117, 1], + [38116, 1], + [38116, 0, "m"], + [38117, 0, "a"], + [38118, 0, "t"], + [38119, 0, "h"], + [38120, 0, "s"], + [38121, 0, "f"], + [38122, 0, "{"], + [38123, 0, "c"], + [38124, 0, "u"], + [38125, 0, "r"], + [38126, 0, "s"], + [38127, 0, "o"], + [38128, 0, "r"], + [38129, 0, "}"], + [38130, 0, "("], + [38131, 0, "\\"], + [38132, 0, "l"], + [38133, 0, "a"], + [38134, 0, "n"], + [38135, 0, "g"], + [38136, 0, "l"], + [38137, 0, "e"], + [38138, 0, " "], + [38139, 0, "k"], + [38140, 0, "1"], + [38140, 1], + [38140, 0, "_"], + [38141, 0, "1"], + [38142, 0, ","], + [38143, 0, " "], + [38144, 0, "k"], + [38145, 0, "_"], + [38146, 0, "2"], + [38147, 0, ","], + [38148, 0, " "], + [38149, 0, "\\"], + [38150, 0, "d"], + [38151, 0, "o"], + [38152, 0, "t"], + [38153, 0, "s"], + [38154, 0, ","], + [38155, 0, " "], + [38156, 0, "k"], + [38157, 0, "_"], + [38158, 0, "n"], + [38159, 0, "-"], + [38160, 0, "1"], + [38160, 1], + [38159, 1], + [38158, 1], + [38158, 0, "{"], + [38159, 0, "n"], + [38160, 0, "-"], + [38161, 0, "1"], + [38162, 0, "}"], + [38163, 0, " "], + [38164, 0, "\\"], + [38165, 0, "r"], + [38166, 0, "a"], + [38167, 0, "n"], + [38168, 0, "g"], + [38169, 0, "l"], + [38170, 0, "e"], + [38171, 0, ","], + [38172, 0, "\\"], + [38173, 0, ","], + [38174, 0, " "], + [38175, 0, "k"], + [38176, 0, "_"], + [38177, 0, "n"], + [38178, 0, ")"], + [38179, 0, "\\"], + [38179, 1], + [38179, 0, "."], + [38180, 0, "\\"], + [38181, 0, "m"], + [38182, 0, "a"], + [38183, 0, "t"], + [38184, 0, "h"], + [38185, 0, "s"], + [38186, 0, "f"], + [38187, 0, "{"], + [38188, 0, "i"], + [38189, 0, "d"], + [38190, 0, "x"], + [38191, 0, "}"], + [38192, 0, "("], + [38193, 0, "i"], + [38194, 0, ")"], + [38195, 0, "\n"], + [38196, 0, " "], + [38197, 0, " "], + [38198, 0, " "], + [38199, 0, " "], + [38200, 0, "\\"], + [38201, 0, "e"], + [38202, 0, "v"], + [38203, 0, "a"], + [38204, 0, "l"], + [38205, 0, "t"], + [38206, 0, "o"], + [38207, 0, " "], + [38208, 0, "\\"], + [38209, 0, "m"], + [38210, 0, "a"], + [38211, 0, "t"], + [38212, 0, "h"], + [38213, 0, "s"], + [38214, 0, "f"], + [38215, 0, "{"], + [38216, 0, "c"], + [38217, 0, "u"], + [38218, 0, "r"], + [38219, 0, "s"], + [38220, 0, "o"], + [38221, 0, "r"], + [38222, 0, "}"], + [38223, 0, " "], + [38223, 1], + [38223, 0, "("], + [38224, 0, "\\"], + [38225, 0, "l"], + [38226, 0, "a"], + [38227, 0, "n"], + [38228, 0, "g"], + [38229, 0, "l"], + [38230, 0, "e"], + [38231, 0, " "], + [38232, 0, "k"], + [38233, 0, "_"], + [38234, 0, "1"], + [38235, 0, ","], + [38236, 0, " "], + [38237, 0, "k"], + [38238, 0, "_"], + [38239, 0, "2"], + [38240, 0, ","], + [38241, 0, " "], + [38242, 0, "\\"], + [38243, 0, "d"], + [38244, 0, "o"], + [38245, 0, "t"], + [38246, 0, "s"], + [38247, 0, ","], + [38248, 0, " "], + [38249, 0, "k"], + [38250, 0, "_"], + [38251, 0, "{"], + [38252, 0, "n"], + [38253, 0, "-"], + [38254, 0, "1"], + [38255, 0, "}"], + [38256, 0, " "], + [38257, 0, "\\"], + [38258, 0, "r"], + [38259, 0, "a"], + [38260, 0, "n"], + [38261, 0, "g"], + [38262, 0, "l"], + [38263, 0, "e"], + [38264, 0, ","], + [38265, 0, "\\"], + [38266, 0, ","], + [38267, 0, " "], + [38268, 0, "k"], + [38269, 0, "_"], + [38270, 0, "n"], + [38271, 0, "'"], + [38272, 0, ")"], + [38273, 0, "$"], + [38274, 0, "}"], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39350, 1], + [39348, 0, "\n"], + [39349, 0, "\n"], + [39350, 0, "\\"], + [39351, 0, "b"], + [39352, 0, "e"], + [39353, 0, "g"], + [39354, 0, "i"], + [39355, 0, "n"], + [39356, 0, "{"], + [39357, 0, "p"], + [39358, 0, "r"], + [39359, 0, "o"], + [39360, 0, "o"], + [39361, 0, "f"], + [39362, 0, "t"], + [39363, 0, "r"], + [39364, 0, "e"], + [39365, 0, "e"], + [39366, 0, "}"], + [39367, 0, "\n"], + [39368, 0, "\\"], + [39369, 0, "A"], + [39370, 0, "x"], + [39371, 0, "i"], + [39372, 0, "o"], + [39373, 0, "m"], + [39374, 0, "C"], + [39375, 0, "{"], + [39376, 0, "$"], + [39377, 0, "i"], + [39378, 0, "="], + [39379, 0, "0"], + [39380, 0, "$"], + [39381, 0, "}"], + [39382, 0, "\n"], + [39383, 0, "\\"], + [39384, 0, "L"], + [39385, 0, "e"], + [39386, 0, "f"], + [39387, 0, "t"], + [39388, 0, "L"], + [39389, 0, "a"], + [39390, 0, "b"], + [39391, 0, "e"], + [39392, 0, "l"], + [39393, 0, "{"], + [39394, 0, "$"], + [39395, 0, "\\"], + [39396, 0, "t"], + [39397, 0, "e"], + [39398, 0, "x"], + [39399, 0, "t"], + [39400, 0, "s"], + [39401, 0, "c"], + [39402, 0, "{"], + [39403, 0, "I"], + [39404, 0, "d"], + [39405, 0, "x"], + [39406, 0, "}"], + [39407, 0, "_"], + [39408, 0, "5"], + [39409, 0, "$"], + [39410, 0, "}"], + [39411, 0, "\n"], + [39412, 0, "\\"], + [39413, 0, "U"], + [39414, 0, "n"], + [39415, 0, "a"], + [39416, 0, "r"], + [39417, 0, "y"], + [39418, 0, "I"], + [39419, 0, "n"], + [39420, 0, "f"], + [39421, 0, "C"], + [39422, 0, "{"], + [39423, 0, "$"], + [39424, 0, "\\"], + [39425, 0, "m"], + [39426, 0, "a"], + [39427, 0, "t"], + [39428, 0, "h"], + [39429, 0, "i"], + [39430, 0, "t"], + [39431, 0, "{"], + [39432, 0, "c"], + [39433, 0, "t"], + [39434, 0, "x"], + [39435, 0, "}"], + [39436, 0, ","], + [39437, 0, "\\"], + [39438, 0, ","], + [39439, 0, " "], + [39440, 0, "\\"], + [39441, 0, "m"], + [39442, 0, "a"], + [39443, 0, "t"], + [39444, 0, "h"], + [39445, 0, "s"], + [39446, 0, "f"], + [39447, 0, "{"], + [39448, 0, "c"], + [39449, 0, "u"], + [39450, 0, "r"], + [39451, 0, "s"], + [39452, 0, "o"], + [39453, 0, "r"], + [39454, 0, "}"], + [39455, 0, "("], + [39456, 0, "\\"], + [39457, 0, "l"], + [39458, 0, "a"], + [39459, 0, "n"], + [39460, 0, "g"], + [39461, 0, "l"], + [39462, 0, "e"], + [39463, 0, "\\"], + [39464, 0, "r"], + [39465, 0, "a"], + [39466, 0, "n"], + [39467, 0, "g"], + [39468, 0, "l"], + [39469, 0, "e"], + [39470, 0, ","], + [39471, 0, "\\"], + [39472, 0, ","], + [39473, 0, " "], + [39474, 0, "k"], + [39475, 0, ")"], + [39476, 0, "."], + [39477, 0, "\\"], + [39478, 0, "m"], + [39479, 0, "a"], + [39480, 0, "t"], + [39481, 0, "h"], + [39482, 0, "s"], + [39483, 0, "f"], + [39484, 0, "{"], + [39485, 0, "i"], + [39486, 0, "d"], + [39487, 0, "x"], + [39488, 0, "}"], + [39489, 0, "("], + [39490, 0, "i"], + [39491, 0, ")"], + [39492, 0, " "], + [39493, 0, "\\"], + [39494, 0, "e"], + [39495, 0, "v"], + [39496, 0, "a"], + [39497, 0, "l"], + [39498, 0, "t"], + [39499, 0, "o"], + [39500, 0, "\n"], + [39501, 0, " "], + [39502, 0, " "], + [39503, 0, " "], + [39504, 0, " "], + [39505, 0, "\\"], + [39506, 0, "m"], + [39507, 0, "a"], + [39508, 0, "t"], + [39509, 0, "h"], + [39510, 0, "s"], + [39511, 0, "f"], + [39512, 0, "{"], + [39513, 0, "c"], + [39514, 0, "u"], + [39515, 0, "r"], + [39516, 0, "s"], + [39517, 0, "o"], + [39518, 0, "r"], + [39519, 0, "}"], + [39520, 0, "("], + [39521, 0, "\\"], + [39522, 0, "l"], + [39523, 0, "a"], + [39524, 0, "n"], + [39525, 0, "g"], + [39526, 0, "l"], + [39527, 0, "e"], + [39528, 0, "\\"], + [39529, 0, "r"], + [39530, 0, "a"], + [39531, 0, "n"], + [39532, 0, "g"], + [39533, 0, "l"], + [39534, 0, "e"], + [39535, 0, ","], + [39536, 0, "\\"], + [39537, 0, ","], + [39538, 0, " "], + [39539, 0, "k"], + [39540, 0, ")"], + [39541, 0, "$"], + [39542, 0, "}"], + [39543, 0, "\n"], + [39544, 0, "\\"], + [39545, 0, "e"], + [39546, 0, "n"], + [39547, 0, "d"], + [39548, 0, "{"], + [39549, 0, "p"], + [39550, 0, "r"], + [39551, 0, "o"], + [39552, 0, "o"], + [39553, 0, "f"], + [39554, 0, "t"], + [39555, 0, "r"], + [39556, 0, "e"], + [39557, 0, "e"], + [39558, 0, "}"], + [38501, 1], + [38500, 1], + [38499, 1], + [38498, 1], + [38497, 1], + [38496, 1], + [38495, 1], + [38494, 1], + [38493, 1], + [38492, 1], + [38491, 1], + [38490, 1], + [38489, 1], + [38488, 1], + [38487, 1], + [38486, 1], + [38485, 1], + [38484, 1], + [38483, 1], + [38482, 1], + [38481, 1], + [38480, 1], + [38479, 1], + [38478, 1], + [38477, 1], + [38476, 1], + [38475, 1], + [38474, 1], + [38473, 1], + [38472, 1], + [38471, 1], + [38470, 1], + [38469, 1], + [38468, 1], + [38467, 1], + [38466, 1], + [38465, 1], + [38464, 1], + [38463, 1], + [38462, 1], + [38461, 1], + [38460, 1], + [38459, 1], + [38458, 1], + [38457, 1], + [38456, 1], + [38455, 1], + [38454, 1], + [38453, 1], + [38452, 1], + [38451, 1], + [38450, 1], + [38449, 1], + [38448, 1], + [38447, 1], + [38446, 1], + [38445, 1], + [38444, 1], + [38443, 1], + [38442, 1], + [38441, 1], + [38440, 1], + [38439, 1], + [38438, 1], + [38437, 1], + [38436, 1], + [38435, 1], + [38434, 1], + [38433, 1], + [38432, 1], + [38431, 1], + [38430, 1], + [38429, 1], + [38428, 1], + [38427, 1], + [38426, 1], + [38425, 1], + [38424, 1], + [38423, 1], + [38422, 1], + [38421, 1], + [38420, 1], + [38419, 1], + [38418, 1], + [38417, 1], + [38416, 1], + [38415, 1], + [38414, 1], + [38413, 1], + [38412, 1], + [38411, 1], + [38410, 1], + [38409, 1], + [38408, 1], + [38407, 1], + [38406, 1], + [38405, 1], + [38404, 1], + [38403, 1], + [38402, 1], + [38401, 1], + [38400, 1], + [38399, 1], + [38398, 1], + [38397, 1], + [38396, 1], + [38395, 1], + [38394, 1], + [38393, 1], + [38392, 1], + [38391, 1], + [38390, 1], + [38389, 1], + [38388, 1], + [38387, 1], + [38386, 1], + [38385, 1], + [38384, 1], + [38383, 1], + [38382, 1], + [38381, 1], + [38380, 1], + [38379, 1], + [38378, 1], + [38377, 1], + [38376, 1], + [38375, 1], + [38374, 1], + [38373, 1], + [38372, 1], + [38371, 1], + [38370, 1], + [38369, 1], + [38368, 1], + [38367, 1], + [38366, 1], + [38365, 1], + [38364, 1], + [38363, 1], + [38362, 1], + [38361, 1], + [38360, 1], + [38359, 1], + [38358, 1], + [38357, 1], + [38356, 1], + [38355, 1], + [38354, 1], + [38353, 1], + [38352, 1], + [38351, 1], + [38350, 1], + [38349, 1], + [38348, 1], + [38347, 1], + [38346, 1], + [38345, 1], + [38344, 1], + [38343, 1], + [38342, 1], + [38341, 1], + [38340, 1], + [38339, 1], + [38338, 1], + [38337, 1], + [38336, 1], + [38335, 1], + [38334, 1], + [38333, 1], + [38332, 1], + [38331, 1], + [38330, 1], + [38329, 1], + [38328, 1], + [38327, 1], + [38326, 1], + [38325, 1], + [38324, 1], + [38323, 1], + [38322, 1], + [38321, 1], + [38320, 1], + [38319, 1], + [38318, 1], + [38317, 1], + [38316, 1], + [38315, 1], + [38314, 1], + [38313, 1], + [38312, 1], + [38311, 1], + [38310, 1], + [38309, 1], + [38308, 1], + [38307, 1], + [38306, 1], + [38305, 1], + [38304, 1], + [38303, 1], + [38302, 1], + [38301, 1], + [38300, 1], + [38299, 1], + [38298, 1], + [38297, 1], + [38296, 1], + [38295, 1], + [38294, 1], + [38293, 1], + [38292, 1], + [38291, 1], + [33493, 0, "{"], + [33494, 0, "{"], + [33495, 0, "{"], + [33496, 0, "{"], + [33497, 0, "{"], + [33498, 0, "{"], + [33499, 0, "{"], + [33499, 1], + [33498, 1], + [33497, 1], + [33496, 1], + [33495, 1], + [33494, 1], + [33493, 1], + [30252, 0, "\n"], + [30253, 0, "d"], + [30254, 0, "o"], + [30255, 0, "c"], + [30256, 0, "."], + [30257, 0, "g"], + [30258, 0, "e"], + [30259, 0, "t"], + [30260, 0, "("], + [30261, 0, "\""], + [30262, 0, "s"], + [30263, 0, "h"], + [30264, 0, "o"], + [30265, 0, "p"], + [30266, 0, "p"], + [30267, 0, "i"], + [30268, 0, "n"], + [30269, 0, "g"], + [30270, 0, "\""], + [30271, 0, ")"], + [30272, 0, " "], + [30273, 0, ":"], + [30274, 0, "="], + [30275, 0, " "], + [30276, 0, "["], + [30277, 0, "]"], + [30278, 0, ";"], + [30347, 1], + [30346, 1], + [30345, 1], + [30344, 1], + [30344, 0, "t"], + [30345, 0, "a"], + [30346, 0, "i"], + [30347, 0, "l"], + [30382, 1], + [30381, 1], + [30380, 1], + [30379, 1], + [30379, 0, "t"], + [30380, 0, "a"], + [30381, 0, "i"], + [30382, 0, "l"], + [30423, 0, "t"], + [30424, 0, "a"], + [30425, 0, "i"], + [30426, 0, "l"], + [30427, 0, "."], + [30428, 0, "i"], + [30429, 0, "n"], + [30430, 0, "s"], + [30431, 0, "e"], + [30432, 0, "r"], + [30433, 0, "t"], + [30434, 0, "("], + [30435, 0, "\""], + [30436, 0, "m"], + [30437, 0, "i"], + [30438, 0, "l"], + [30439, 0, "k"], + [30440, 0, "\""], + [30441, 0, ")"], + [30442, 0, ";"], + [30443, 0, "\n"], + [30398, 1], + [30397, 1], + [30396, 1], + [30395, 1], + [30394, 1], + [30393, 1], + [30392, 1], + [30391, 1], + [30390, 1], + [30389, 1], + [30388, 1], + [30387, 1], + [30386, 1], + [30385, 1], + [30384, 1], + [30383, 1], + [30382, 1], + [30381, 1], + [30380, 1], + [30379, 1], + [30378, 1], + [30559, 1], + [30558, 1], + [30557, 1], + [30556, 1], + [30555, 1], + [30554, 1], + [30553, 1], + [30552, 1], + [30551, 1], + [30550, 1], + [30549, 1], + [30548, 1], + [30547, 1], + [30546, 1], + [30545, 1], + [30544, 1], + [30543, 1], + [30542, 1], + [30541, 1], + [30540, 1], + [30539, 1], + [30538, 1], + [30537, 1], + [30536, 1], + [30535, 1], + [30534, 1], + [30533, 1], + [30532, 1], + [30531, 1], + [30530, 1], + [30529, 1], + [30528, 1], + [30527, 1], + [30526, 1], + [30525, 1], + [30524, 1], + [30523, 1], + [30522, 1], + [30521, 1], + [30520, 1], + [30519, 1], + [30518, 1], + [30517, 1], + [30516, 1], + [30515, 1], + [30514, 1], + [30513, 1], + [30512, 1], + [30511, 1], + [30510, 1], + [30509, 1], + [30508, 1], + [30507, 1], + [30506, 1], + [30505, 1], + [30504, 1], + [30503, 1], + [30502, 1], + [30501, 1], + [30500, 1], + [30499, 1], + [30498, 1], + [30497, 1], + [30496, 1], + [30495, 1], + [30494, 1], + [30493, 1], + [30492, 1], + [30491, 1], + [30490, 1], + [30489, 1], + [30488, 1], + [30487, 1], + [30486, 1], + [30485, 1], + [30484, 1], + [30483, 1], + [30482, 1], + [30481, 1], + [30480, 1], + [18448, 1], + [18448, 0, "c"], + [18449, 1], + [18449, 0, "."], + [18450, 0, "g"], + [18451, 0, "e"], + [18452, 0, "t"], + [18453, 0, "("], + [18461, 1], + [18461, 0, ")"], + [18543, 1], + [18543, 0, "."], + [18544, 0, "g"], + [18545, 0, "e"], + [18546, 0, "t"], + [18547, 0, "("], + [18555, 1], + [18555, 0, ")"], + [21501, 1], + [21501, 0, "."], + [21502, 0, "g"], + [21503, 0, "e"], + [21504, 0, "t"], + [21505, 0, "("], + [21516, 1], + [21516, 1], + [21516, 0, ")"], + [21517, 0, "."], + [21518, 0, "g"], + [21519, 0, "e"], + [21520, 0, "t"], + [21521, 0, "("], + [21529, 1], + [21529, 0, ")"], + [21604, 1], + [21604, 0, "."], + [21605, 0, "g"], + [21606, 0, "e"], + [21607, 0, "t"], + [21608, 0, "("], + [21619, 1], + [21619, 0, ")"], + [21686, 1], + [21686, 0, "."], + [21687, 0, "d"], + [21688, 0, "o"], + [21688, 1], + [21687, 1], + [21687, 0, "g"], + [21688, 0, "e"], + [21689, 0, "t"], + [21690, 0, "("], + [21701, 1], + [21701, 1], + [21701, 0, ")"], + [21702, 0, "("], + [21712, 1], + [21712, 0, ")"], + [21702, 0, "."], + [21703, 0, "g"], + [21704, 0, "e"], + [21705, 0, "t"], + [21621, 0, ":"], + [21745, 0, "\n"], + [21746, 0, "n"], + [21747, 0, "o"], + [21748, 0, "d"], + [21749, 0, "e"], + [21750, 0, " "], + [21751, 0, "["], + [21752, 0, "r"], + [21753, 0, "i"], + [21754, 0, "g"], + [21755, 0, "h"], + [21756, 0, "t"], + [21757, 0, ","], + [21758, 0, "t"], + [21759, 0, "e"], + [21760, 0, "x"], + [21761, 0, "t"], + [21762, 0, " "], + [21763, 0, "w"], + [21764, 0, "i"], + [21765, 0, "d"], + [21766, 0, "t"], + [21767, 0, "h"], + [21768, 0, "="], + [21769, 0, "3"], + [21769, 1], + [21769, 0, "1"], + [21770, 0, "c"], + [21771, 0, "m"], + [21772, 0, ","], + [21773, 0, "t"], + [21774, 0, "e"], + [21775, 0, "x"], + [21776, 0, "t"], + [21777, 0, " "], + [21778, 0, "c"], + [21779, 0, "e"], + [21780, 0, "n"], + [21781, 0, "t"], + [21782, 0, "e"], + [21783, 0, "r"], + [21784, 0, "e"], + [21785, 0, "d"], + [21786, 0, "]"], + [21787, 0, " "], + [21788, 0, "{"], + [21789, 0, "d"], + [21790, 0, "o"], + [21791, 0, "c"], + [21792, 0, "."], + [21793, 0, "g"], + [21794, 0, "e"], + [21795, 0, "t"], + [21796, 0, "("], + [21797, 0, "`"], + [21798, 0, "`"], + [21799, 0, "c"], + [21800, 0, "o"], + [21801, 0, "l"], + [21802, 0, "o"], + [21803, 0, "r"], + [21804, 0, "s"], + [21805, 0, "'"], + [21806, 0, "'"], + [21807, 0, ")"], + [21808, 0, "."], + [21809, 0, "g"], + [21810, 0, "e"], + [21811, 0, "t"], + [21812, 0, "("], + [21813, 0, "`"], + [21814, 0, "`"], + [21815, 0, "g"], + [21816, 0, "r"], + [21817, 0, "e"], + [21818, 0, "e"], + [21819, 0, "n"], + [21820, 0, "'"], + [21821, 0, "'"], + [21822, 0, ")"], + [21823, 0, " "], + [21824, 0, ":"], + [21825, 0, "="], + [21826, 0, " "], + [21827, 0, "`"], + [21828, 0, "`"], + [21829, 0, "\\"], + [21830, 0, "#"], + [21831, 0, "0"], + [21832, 0, "0"], + [21833, 0, "f"], + [21834, 0, "f"], + [21835, 0, "0"], + [21836, 0, "0"], + [21837, 0, "'"], + [21838, 0, "'"], + [21839, 0, ";"], + [21840, 0, "}"], + [21735, 1], + [21734, 1], + [21733, 1], + [21732, 1], + [21731, 1], + [21730, 1], + [21729, 1], + [21728, 1], + [21727, 1], + [21726, 1], + [21725, 1], + [21724, 1], + [21723, 1], + [21722, 1], + [21721, 1], + [21720, 1], + [21719, 1], + [21718, 1], + [21717, 1], + [21716, 1], + [21715, 1], + [21714, 1], + [21713, 1], + [21712, 1], + [21711, 1], + [21710, 1], + [21709, 1], + [21708, 1], + [21707, 1], + [21706, 1], + [21705, 1], + [21704, 1], + [21703, 1], + [21702, 1], + [21701, 1], + [21700, 1], + [21699, 1], + [21698, 1], + [21697, 1], + [21696, 1], + [21695, 1], + [21694, 1], + [21693, 1], + [21692, 1], + [21691, 1], + [21690, 1], + [21689, 1], + [21688, 1], + [21687, 1], + [21686, 1], + [21685, 1], + [21684, 1], + [21683, 1], + [21682, 1], + [21681, 1], + [21680, 1], + [21679, 1], + [21678, 1], + [21677, 1], + [21676, 1], + [21675, 1], + [21674, 1], + [21673, 1], + [21672, 1], + [21671, 1], + [21670, 1], + [21669, 1], + [21719, 0, ","], + [21720, 0, "m"], + [21721, 0, "i"], + [21722, 0, "d"], + [21723, 0, "w"], + [21724, 0, "a"], + [21725, 0, "y"], + [21718, 1], + [21717, 1], + [21716, 1], + [21715, 1], + [21714, 1], + [21713, 1], + [21712, 1], + [21711, 1], + [21711, 0, "r"], + [21712, 0, "e"], + [21712, 1], + [21712, 0, "a"], + [21713, 0, "g"], + [21714, 0, "g"], + [21715, 0, "e"], + [21716, 0, "d"], + [21716, 1], + [21715, 1], + [21714, 1], + [21713, 1], + [21712, 1], + [21711, 1], + [21711, 0, "c"], + [21712, 0, "e"], + [21713, 0, "n"], + [21714, 0, "t"], + [21715, 0, "e"], + [21716, 0, "r"], + [21717, 0, "e"], + [21718, 0, "d"], + [21668, 1], + [21667, 1], + [21667, 0, "-"], + [21668, 0, "-"], + [21702, 1], + [21702, 0, "2"], + [21679, 0, " "], + [21680, 0, " "], + [21681, 0, " "], + [21682, 0, " "], + [21481, 0, "-"], + [21482, 0, "-"], + [21483, 0, " "], + [21484, 0, "("], + [21485, 0, "l"], + [21486, 0, "e"], + [21487, 0, "f"], + [21488, 0, "t"], + [21489, 0, "1"], + [21490, 0, ")"], + [21491, 0, "\n"], + [21492, 0, " "], + [21493, 0, " "], + [21494, 0, " "], + [21495, 0, " "], + [21496, 1], + [21496, 1], + [21496, 1], + [21506, 0, ","], + [21507, 0, "t"], + [21508, 0, "e"], + [21509, 0, "x"], + [21510, 0, "t"], + [21511, 0, " "], + [21512, 0, "w"], + [21513, 0, "i"], + [21514, 0, "d"], + [21515, 0, "t"], + [21516, 0, "h"], + [21517, 0, "="], + [21518, 0, "2"], + [21519, 0, "c"], + [21520, 0, "m"], + [21521, 0, ","], + [21522, 0, "t"], + [21523, 0, "e"], + [21524, 0, "x"], + [21525, 0, "t"], + [21526, 0, " "], + [21527, 0, "c"], + [21528, 0, "e"], + [21529, 0, "n"], + [21530, 0, "t"], + [21531, 0, "e"], + [21532, 0, "r"], + [21533, 0, "e"], + [21534, 0, "d"], + [21535, 0, ","], + [21536, 0, "m"], + [21537, 0, "i"], + [21538, 0, "d"], + [21539, 0, "w"], + [21540, 0, "a"], + [21541, 0, "y"], + [21603, 1], + [21602, 1], + [21601, 1], + [21600, 1], + [21599, 1], + [21598, 1], + [21597, 1], + [21596, 1], + [21762, 1], + [21761, 1], + [21760, 1], + [21759, 1], + [21758, 1], + [21757, 1], + [21756, 1], + [21755, 1], + [21755, 0, "r"], + [21756, 0, "a"], + [21757, 0, "g"], + [21758, 0, "g"], + [21759, 0, "e"], + [21760, 0, "d"], + [21760, 1], + [21759, 1], + [21758, 1], + [21757, 1], + [21756, 1], + [21755, 1], + [21755, 0, "c"], + [21756, 0, "e"], + [21757, 0, "n"], + [21758, 0, "t"], + [21759, 0, "e"], + [21760, 0, "r"], + [21761, 0, "e"], + [21762, 0, "d"], + [21746, 1], + [21746, 0, "4"], + [21518, 1], + [21518, 0, "4"], + [21747, 0, "."], + [21748, 0, "2"], + [21519, 0, "."], + [21520, 0, "2"], + [20940, 1], + [20940, 0, "6"], + [20701, 1], + [20701, 0, "8"], + [20614, 1], + [20614, 0, "8"], + [20587, 1], + [20587, 0, "8"], + [23653, 1], + [23653, 0, "."], + [23654, 0, "g"], + [23655, 0, "e"], + [23656, 0, "t"], + [23657, 0, "("], + [23734, 1], + [23734, 0, "."], + [23735, 0, "g"], + [23736, 0, "e"], + [23737, 0, "t"], + [23738, 0, "("], + [23816, 1], + [23816, 0, "."], + [23817, 0, "g"], + [23818, 0, "e"], + [23819, 0, "t"], + [23820, 0, "("], + [23913, 1], + [23913, 0, "."], + [23914, 0, "g"], + [23915, 0, "e"], + [23916, 0, "t"], + [23917, 0, "("], + [23669, 1], + [23669, 0, ")"], + [23750, 1], + [23750, 0, ")"], + [23832, 1], + [23832, 0, ")"], + [23929, 1], + [23929, 0, ")"], + [23837, 1], + [23836, 1], + [23835, 1], + [23835, 0, "d"], + [23836, 0, "x"], + [23837, 0, "("], + [23838, 0, "0"], + [23839, 0, ")"], + [23936, 1], + [23935, 1], + [23934, 1], + [23934, 0, "d"], + [23935, 0, "x"], + [23936, 0, "("], + [23937, 0, "0"], + [23938, 0, ")"], + [24015, 1], + [24014, 1], + [24013, 1], + [24012, 1], + [24012, 0, "d"], + [24013, 0, "o"], + [24014, 0, "c"], + [24015, 0, "."], + [24016, 0, "g"], + [24017, 0, "e"], + [24018, 0, "t"], + [24019, 0, "("], + [24020, 0, "`"], + [24021, 0, "`"], + [24022, 0, "g"], + [24023, 0, "r"], + [24024, 0, "o"], + [24025, 0, "c"], + [24026, 0, "e"], + [24027, 0, "r"], + [24028, 0, "y"], + [24029, 0, "'"], + [24030, 0, "'"], + [24031, 0, ")"], + [24032, 0, "."], + [24033, 0, "i"], + [24034, 0, "d"], + [24035, 0, "x"], + [24036, 0, "("], + [24037, 0, "1"], + [24038, 0, ")"], + [24113, 1], + [24112, 1], + [24111, 1], + [24110, 1], + [24110, 0, "d"], + [24111, 0, "o"], + [24112, 0, "c"], + [24113, 0, "."], + [24114, 0, "g"], + [24115, 0, "e"], + [24116, 0, "t"], + [24117, 0, "("], + [24118, 0, "z"], + [24119, 0, "`"], + [24119, 1], + [24118, 1], + [24118, 0, "`"], + [24119, 0, "`"], + [24120, 0, "g"], + [24121, 0, "r"], + [24122, 0, "o"], + [24123, 0, "c"], + [24124, 0, "y"], + [24124, 1], + [24124, 0, "e"], + [24125, 0, "r"], + [24126, 0, "y"], + [24127, 0, "'"], + [24128, 0, "'"], + [24129, 0, ")"], + [24130, 0, "."], + [24131, 0, "i"], + [24132, 0, "d"], + [24133, 0, "x"], + [24134, 0, "("], + [24135, 0, "1"], + [24136, 0, ")"], + [23797, 1], + [23796, 1], + [23796, 0, "-"], + [23797, 0, "-"], + [23798, 0, " "], + [23799, 0, "("], + [23800, 0, "l"], + [23801, 0, "e"], + [23802, 0, "f"], + [23803, 0, "t"], + [23804, 0, "2"], + [23805, 0, ")"], + [23806, 0, "\n"], + [23807, 0, " "], + [23808, 0, " "], + [23809, 0, " "], + [23821, 0, ","], + [23822, 0, "t"], + [23823, 0, "e"], + [23824, 0, "x"], + [23825, 0, "t"], + [23826, 0, " "], + [23827, 0, "w"], + [23828, 0, "i"], + [23829, 0, "d"], + [23830, 0, "h"], + [23830, 1], + [23830, 0, "t"], + [23831, 0, "h"], + [23832, 0, "="], + [23833, 0, "4"], + [23834, 0, "c"], + [23835, 0, "m"], + [23836, 0, ","], + [23837, 0, "t"], + [23838, 0, "e"], + [23839, 0, "x"], + [23840, 0, "t"], + [23841, 0, " "], + [23842, 0, "c"], + [23843, 0, "e"], + [23844, 0, "n"], + [23845, 0, "t"], + [23846, 0, "e"], + [23847, 0, "r"], + [23848, 0, "e"], + [23849, 0, "d"], + [23850, 0, ","], + [23851, 0, "m"], + [23852, 0, "i"], + [23853, 0, "d"], + [23854, 0, "w"], + [23855, 0, "a"], + [23856, 0, "y"], + [23858, 1], + [23858, 0, " "], + [23888, 0, " "], + [23915, 1], + [23914, 1], + [23913, 1], + [23912, 1], + [23911, 1], + [23910, 1], + [23909, 1], + [23908, 1], + [23936, 0, "-"], + [23937, 0, "-"], + [23938, 0, " "], + [23939, 0, "("], + [23940, 0, "r"], + [23941, 0, "i"], + [23942, 0, "g"], + [23943, 0, "h"], + [23944, 0, "t"], + [23945, 0, "2"], + [23946, 0, ")"], + [23947, 0, "\n"], + [23948, 0, " "], + [23949, 0, " "], + [23950, 0, " "], + [23951, 0, " "], + [23952, 1], + [23952, 1], + [23952, 1], + [23963, 0, ","], + [23964, 0, "t"], + [23965, 0, "e"], + [23966, 0, "x"], + [23967, 0, "t"], + [23968, 0, " "], + [23969, 0, "w"], + [23970, 0, "i"], + [23971, 0, "d"], + [23972, 0, "t"], + [23973, 0, "h"], + [23974, 0, "="], + [23975, 0, "4"], + [23976, 0, "c"], + [23977, 0, "m"], + [23978, 0, ","], + [23979, 0, "t"], + [23980, 0, "e"], + [23981, 0, "x"], + [23982, 0, "t"], + [23983, 0, " "], + [23984, 0, "c"], + [23985, 0, "e"], + [23986, 0, "n"], + [23987, 0, "t"], + [23988, 0, "e"], + [23989, 0, "r"], + [23990, 0, "e"], + [23991, 0, "d"], + [23992, 0, ","], + [23993, 0, "m"], + [23994, 0, "i"], + [23995, 0, "d"], + [23996, 0, "w"], + [23997, 0, "a"], + [23998, 0, "y"], + [24056, 1], + [24055, 1], + [24054, 1], + [24053, 1], + [24052, 1], + [24051, 1], + [24050, 1], + [24049, 1], + [24048, 1], + [24076, 0, "-"], + [24077, 0, "-"], + [24078, 0, " "], + [24079, 0, "("], + [24080, 0, "l"], + [24081, 0, "e"], + [24082, 0, "f"], + [24083, 0, "t"], + [24084, 0, "3"], + [24085, 0, ")"], + [24086, 0, "\n"], + [24087, 1], + [24087, 1], + [24087, 0, " "], + [24088, 0, " "], + [24089, 0, " "], + [24101, 0, ","], + [24102, 0, "t"], + [24103, 0, "e"], + [24104, 0, "x"], + [24105, 0, "t"], + [24106, 0, " "], + [24107, 0, "w"], + [24108, 0, "i"], + [24109, 0, "d"], + [24110, 0, "t"], + [24111, 0, "h"], + [24112, 0, "="], + [24113, 0, "3"], + [24113, 1], + [24113, 0, "4"], + [24114, 0, "c"], + [24115, 0, "m"], + [24116, 0, ","], + [24117, 0, "t"], + [24118, 0, "e"], + [24119, 0, "x"], + [24120, 0, "t"], + [24121, 0, " "], + [24122, 0, "c"], + [24123, 0, "e"], + [24124, 0, "n"], + [24125, 0, "t"], + [24126, 0, "e"], + [24127, 0, "r"], + [24128, 0, "e"], + [24129, 0, "d"], + [24130, 0, ","], + [24131, 0, "m"], + [24132, 0, "i"], + [24133, 0, "d"], + [24134, 0, "w"], + [24135, 0, "a"], + [24136, 0, "y"], + [24029, 0, " "], + [24169, 0, " "], + [24195, 1], + [24194, 1], + [24193, 1], + [24192, 1], + [24191, 1], + [24190, 1], + [24189, 1], + [24188, 1], + [24216, 0, "-"], + [24217, 0, "-"], + [24218, 0, " "], + [24219, 0, "("], + [24220, 0, "r"], + [24221, 0, "i"], + [24222, 0, "g"], + [24223, 0, "h"], + [24224, 0, "t"], + [24225, 0, "3"], + [24226, 0, ")"], + [24227, 0, "\n"], + [24228, 0, " "], + [24229, 0, " "], + [24230, 0, " "], + [24231, 0, " "], + [24232, 1], + [24232, 1], + [24232, 1], + [24243, 0, ","], + [24244, 0, "t"], + [24245, 0, "e"], + [24246, 0, "x"], + [24247, 0, "t"], + [24248, 0, " "], + [24249, 0, "w"], + [24250, 0, "i"], + [24251, 0, "d"], + [24252, 0, "t"], + [24253, 0, "h"], + [24254, 0, "="], + [24255, 0, "4"], + [24256, 0, "c"], + [24257, 0, "m"], + [24258, 0, ","], + [24259, 0, "t"], + [24260, 0, "e"], + [24261, 0, "x"], + [24262, 0, "t"], + [24263, 0, " "], + [24264, 0, "c"], + [24265, 0, "e"], + [24266, 0, "n"], + [24267, 0, "t"], + [24268, 0, "e"], + [24269, 0, "r"], + [24270, 0, "e"], + [24271, 0, "d"], + [24272, 0, ","], + [24273, 0, "m"], + [24274, 0, "i"], + [24275, 0, "d"], + [24276, 0, "w"], + [24277, 0, "a"], + [24278, 0, "y"], + [24309, 0, " "], + [24338, 1], + [24337, 1], + [24336, 1], + [24335, 1], + [24334, 1], + [24333, 1], + [24332, 1], + [24331, 1], + [24330, 1], + [20589, 1], + [20588, 1], + [20612, 1], + [20612, 0, "7"], + [20613, 0, "."], + [20614, 0, "5"], + [20701, 1], + [20701, 0, "7"], + [20702, 0, "."], + [20703, 0, "5"], + [20942, 1], + [20942, 0, "5"], + [20943, 0, "."], + [20944, 0, "5"], + [23193, 0, "."], + [23194, 0, "5"], + [23268, 0, "."], + [23269, 0, "0"], + [23354, 0, "."], + [23355, 0, "0"], + [23459, 0, "."], + [23460, 0, "0"], + [23111, 0, "."], + [23112, 0, "0"], + [23038, 0, "."], + [23039, 0, "5"], + [22972, 1], + [22972, 0, "7"], + [22973, 0, "."], + [22974, 0, "0"], + [22907, 1], + [22907, 0, "7"], + [22908, 0, "."], + [22909, 0, "0"], + [22857, 1], + [22857, 0, "9"], + [22858, 0, "."], + [22859, 0, "0"], + [22807, 1], + [22807, 0, "9"], + [22808, 0, "."], + [22809, 0, "0"], + [22779, 1], + [22779, 0, "9"], + [23281, 1], + [23281, 0, "5"], + [23206, 1], + [23205, 1], + [23204, 1], + [23204, 0, "5"], + [23205, 0, "."], + [23206, 0, "0"], + [23122, 1], + [23122, 0, "5"], + [23047, 1], + [23046, 1], + [23045, 1], + [23045, 0, "5"], + [23046, 0, "."], + [23047, 0, "0"], + [22980, 1], + [22980, 0, "5"], + [22913, 1], + [22913, 0, "5"], + [22861, 1], + [22861, 0, "5"], + [22809, 1], + [22809, 0, "5"], + [22781, 1], + [22780, 1], + [22779, 1], + [22779, 0, "1"], + [22780, 0, "0"], + [25514, 1], + [25513, 1], + [25512, 1], + [25511, 1], + [25510, 1], + [25509, 1], + [25508, 1], + [25507, 1], + [25506, 1], + [25505, 1], + [25504, 1], + [25503, 1], + [25525, 1], + [25524, 1], + [25526, 0, "\n"], + [25527, 0, "\\"], + [25528, 0, "n"], + [25529, 0, "o"], + [25530, 0, "d"], + [25531, 0, "e"], + [25532, 0, " "], + [25533, 0, "("], + [25534, 0, "r"], + [25535, 0, "i"], + [25536, 0, "g"], + [25537, 0, "h"], + [25538, 0, "t"], + [25539, 0, "1"], + [25540, 0, ")"], + [25541, 0, " "], + [25476, 0, " "], + [25543, 0, "a"], + [25544, 0, "t"], + [25545, 0, " "], + [25546, 0, "("], + [25547, 0, "8"], + [25548, 0, "."], + [25548, 1], + [25548, 0, ","], + [25549, 0, "0"], + [25550, 0, ")"], + [25551, 0, " "], + [25552, 0, "["], + [25553, 0, "r"], + [25554, 0, "e"], + [25555, 0, "c"], + [25556, 0, "t"], + [25557, 0, "a"], + [25558, 0, "n"], + [25559, 0, "g"], + [25560, 0, "l"], + [25561, 0, "e"], + [25562, 0, ","], + [25563, 0, "d"], + [25564, 0, "r"], + [25565, 0, "a"], + [25566, 0, "w"], + [25567, 0, "]"], + [25568, 0, " "], + [25569, 0, "{"], + [25570, 0, "["], + [25571, 0, "`"], + [25572, 0, "`"], + [25573, 0, "a"], + [25574, 0, "'"], + [25575, 0, "'"], + [25576, 0, ","], + [25577, 0, " "], + [25578, 0, "`"], + [25579, 0, "`"], + [25580, 0, "b"], + [25581, 0, "'"], + [25582, 0, "'"], + [25583, 0, ","], + [25584, 0, " "], + [25585, 0, "`"], + [25586, 0, "`"], + [25587, 0, "c"], + [25588, 0, "'"], + [25589, 0, "'"], + [25590, 0, "]"], + [25591, 0, "}"], + [25592, 0, ";"], + [25483, 1], + [25483, 0, "8"], + [25549, 1], + [25549, 0, "8"], + [25593, 0, "\n"], + [25594, 0, "\\"], + [25595, 0, "n"], + [25596, 0, "o"], + [25597, 0, "d"], + [25598, 0, "e"], + [25599, 0, " "], + [25600, 0, "("], + [25601, 0, "l"], + [25602, 0, "e"], + [25603, 0, "f"], + [25604, 0, "t"], + [25605, 0, "2"], + [25606, 0, ")"], + [25607, 0, " "], + [25608, 0, " "], + [25609, 0, "a"], + [25610, 0, "t"], + [25611, 0, " "], + [25612, 0, "("], + [25613, 0, "0"], + [25614, 0, ","], + [25615, 0, "6"], + [25616, 0, ")"], + [25617, 0, " "], + [25618, 0, "["], + [25619, 0, "r"], + [25620, 0, "e"], + [25621, 0, "c"], + [25622, 0, "t"], + [25623, 0, "a"], + [25624, 0, "n"], + [25625, 0, "g"], + [25626, 0, "l"], + [25627, 0, "e"], + [25628, 0, ","], + [25629, 0, "d"], + [25630, 0, "r"], + [25631, 0, "a"], + [25632, 0, "w"], + [25633, 0, "]"], + [25634, 0, " "], + [25635, 0, "{"], + [25636, 0, "["], + [25637, 0, "`"], + [25638, 0, "`"], + [25639, 0, "a"], + [25640, 0, "'"], + [25641, 0, "'"], + [25642, 0, ","], + [25643, 0, " "], + [25644, 0, "`"], + [25645, 0, "`"], + [25646, 0, "c"], + [25647, 0, "'"], + [25648, 0, "'"], + [25649, 0, "]"], + [25650, 0, "}"], + [25651, 0, ";"], + [25652, 0, "\n"], + [25653, 0, "\\"], + [25654, 0, "n"], + [25655, 0, "o"], + [25656, 0, "d"], + [25657, 0, "e"], + [25658, 0, " "], + [25659, 0, "("], + [25660, 0, "\n"], + [25661, 0, "\\"], + [25662, 0, "n"], + [25663, 0, "o"], + [25664, 0, "d"], + [25665, 0, "e"], + [25666, 0, " "], + [25667, 0, "("], + [25668, 0, "r"], + [25669, 0, "i"], + [25670, 0, "g"], + [25671, 0, "h"], + [25672, 0, "t"], + [25673, 0, "1"], + [25674, 0, ")"], + [25675, 0, " "], + [25676, 0, "a"], + [25677, 0, "t"], + [25678, 0, " "], + [25679, 0, "("], + [25680, 0, "9"], + [25680, 1], + [25680, 0, "8"], + [25681, 0, ","], + [25682, 0, "8"], + [25683, 0, ")"], + [25684, 0, " "], + [25685, 0, "["], + [25686, 0, "r"], + [25687, 0, "e"], + [25688, 0, "c"], + [25689, 0, "t"], + [25690, 0, "a"], + [25691, 0, "n"], + [25692, 0, "g"], + [25693, 0, "l"], + [25694, 0, "e"], + [25695, 0, ","], + [25696, 0, "d"], + [25697, 0, "r"], + [25698, 0, "a"], + [25699, 0, "w"], + [25700, 0, "]"], + [25701, 0, " "], + [25702, 0, "{"], + [25703, 0, "["], + [25704, 0, "`"], + [25705, 0, "`"], + [25706, 0, "a"], + [25707, 0, "'"], + [25708, 0, "'"], + [25709, 0, ","], + [25710, 0, " "], + [25711, 0, "'"], + [25712, 0, "'"], + [25712, 1], + [25711, 1], + [25711, 0, "a"], + [25712, 0, "a"], + [25713, 0, "`"], + [25713, 1], + [25712, 1], + [25711, 1], + [25711, 0, "a"], + [25711, 1], + [25711, 0, "`"], + [25712, 0, "`"], + [25713, 0, "b"], + [25714, 0, "'"], + [25715, 0, "'"], + [25716, 0, ","], + [25717, 0, " "], + [25718, 0, "`"], + [25719, 0, "`"], + [25720, 0, "c"], + [25721, 0, "'"], + [25722, 0, "'"], + [25723, 0, "]"], + [25724, 0, "}"], + [25725, 0, ";"], + [25592, 1], + [25591, 1], + [25590, 1], + [25589, 1], + [25588, 1], + [25587, 1], + [25586, 1], + [25585, 1], + [25584, 1], + [25583, 1], + [25582, 1], + [25581, 1], + [25580, 1], + [25579, 1], + [25578, 1], + [25577, 1], + [25576, 1], + [25575, 1], + [25574, 1], + [25573, 1], + [25572, 1], + [25571, 1], + [25570, 1], + [25569, 1], + [25568, 1], + [25567, 1], + [25566, 1], + [25565, 1], + [25564, 1], + [25563, 1], + [25562, 1], + [25561, 1], + [25560, 1], + [25559, 1], + [25558, 1], + [25557, 1], + [25556, 1], + [25555, 1], + [25554, 1], + [25553, 1], + [25552, 1], + [25551, 1], + [25550, 1], + [25549, 1], + [25548, 1], + [25547, 1], + [25546, 1], + [25545, 1], + [25544, 1], + [25543, 1], + [25542, 1], + [25541, 1], + [25540, 1], + [25539, 1], + [25538, 1], + [25537, 1], + [25536, 1], + [25535, 1], + [25534, 1], + [25533, 1], + [25532, 1], + [25531, 1], + [25530, 1], + [25529, 1], + [25528, 1], + [25527, 1], + [25594, 0, "l"], + [25595, 0, "e"], + [25596, 0, "f"], + [25597, 0, "t"], + [25598, 0, "3"], + [25599, 0, ")"], + [25600, 0, " "], + [25601, 0, " "], + [25602, 0, "a"], + [25603, 0, "t"], + [25604, 0, " "], + [25605, 0, "("], + [25606, 0, "0"], + [25607, 0, ","], + [25608, 0, "4"], + [25609, 0, ")"], + [25610, 0, " "], + [25611, 0, "["], + [25612, 0, "r"], + [25613, 0, "e"], + [25614, 0, "c"], + [25615, 0, "t"], + [25616, 0, "a"], + [25617, 0, "n"], + [25618, 0, "g"], + [25619, 0, "l"], + [25620, 0, "e"], + [25621, 0, ","], + [25622, 0, "d"], + [25623, 0, "r"], + [25624, 0, "a"], + [25625, 0, "w"], + [25626, 0, "]"], + [25627, 0, " "], + [25628, 0, "{"], + [25629, 0, "["], + [25630, 0, "`"], + [25631, 0, "`"], + [25632, 0, "a"], + [25633, 0, "'"], + [25634, 0, "'"], + [25635, 0, ","], + [25636, 0, " "], + [25637, 0, "`"], + [25638, 0, "`"], + [25639, 0, "x"], + [25640, 0, "'"], + [25641, 0, "'"], + [25642, 0, ","], + [25643, 0, " "], + [25644, 0, "`"], + [25645, 0, "`"], + [25646, 0, "c"], + [25647, 0, "'"], + [25648, 0, "'"], + [25649, 0, "]"], + [25650, 0, "}"], + [25651, 0, ";"], + [25718, 0, "\n"], + [25719, 0, "\\"], + [25720, 0, "n"], + [25721, 0, "o"], + [25722, 0, "d"], + [25723, 0, "e"], + [25724, 0, " "], + [25725, 0, "("], + [25726, 0, "r"], + [25727, 0, "i"], + [25728, 0, "g"], + [25729, 0, "h"], + [25730, 0, "t"], + [25731, 0, "2"], + [25732, 0, ")"], + [25733, 0, " "], + [25734, 0, "a"], + [25735, 0, "t"], + [25736, 0, " "], + [25737, 0, "("], + [25738, 0, "8"], + [25739, 0, ","], + [25740, 0, "6"], + [25741, 0, ")"], + [25742, 0, " "], + [25743, 0, "["], + [25744, 0, "r"], + [25745, 0, "e"], + [25746, 0, "c"], + [25747, 0, "t"], + [25748, 0, "a"], + [25749, 0, "n"], + [25750, 0, "g"], + [25751, 0, "l"], + [25752, 0, "e"], + [25753, 0, ","], + [25754, 0, "d"], + [25755, 0, "r"], + [25756, 0, "a"], + [25757, 0, "w"], + [25758, 0, "]"], + [25759, 0, " "], + [25760, 0, "{"], + [25761, 0, "["], + [25762, 0, "`"], + [25763, 0, "`"], + [25764, 0, "y"], + [25765, 0, "'"], + [25766, 0, "'"], + [25767, 0, ","], + [25768, 0, " "], + [25769, 0, "'"], + [25770, 0, "'"], + [25770, 1], + [25769, 1], + [25769, 0, "`"], + [25770, 0, "`"], + [25771, 0, "a"], + [25772, 0, "'"], + [25773, 0, "'"], + [25774, 0, ","], + [25775, 0, " "], + [25776, 0, "`"], + [25777, 0, "`"], + [25778, 0, "b"], + [25779, 0, "'"], + [25780, 0, "'"], + [25781, 0, ","], + [25782, 0, " "], + [25783, 0, "`"], + [25784, 0, "`"], + [25785, 0, "c"], + [25786, 0, "'"], + [25787, 0, "'"], + [25788, 0, "]"], + [25789, 0, "}"], + [25790, 0, ";"], + [25791, 0, "\n"], + [25792, 0, "\\"], + [25793, 0, "n"], + [25794, 0, "o"], + [25795, 0, "d"], + [25796, 0, "e"], + [25797, 0, " "], + [25798, 0, ")"], + [25799, 0, "("], + [25799, 1], + [25798, 1], + [25798, 0, "("], + [25799, 0, "r"], + [25800, 0, "i"], + [25801, 0, "g"], + [25802, 0, "h"], + [25803, 0, "t"], + [25804, 0, "3"], + [25805, 0, ")"], + [25806, 0, " "], + [25807, 0, "a"], + [25808, 0, "t"], + [25809, 0, " "], + [25810, 0, "("], + [25811, 0, "8"], + [25812, 0, ","], + [25813, 0, "5"], + [25813, 1], + [25813, 0, "4"], + [25814, 0, ")"], + [25815, 0, " "], + [25816, 0, "["], + [25817, 0, "r"], + [25818, 0, "e"], + [25819, 0, "c"], + [25820, 0, "t"], + [25821, 0, "a"], + [25822, 0, "n"], + [25823, 0, "g"], + [25824, 0, "l"], + [25825, 0, "e"], + [25826, 0, ","], + [25827, 0, "d"], + [25828, 0, "r"], + [25829, 0, "a"], + [25830, 0, "w"], + [25831, 0, "]"], + [25832, 0, " "], + [25833, 0, "{"], + [25834, 0, "["], + [25835, 0, "`"], + [25836, 0, "`"], + [25837, 0, "y"], + [25838, 0, "'"], + [25839, 0, "'"], + [25840, 0, ","], + [25841, 0, " "], + [25842, 0, "`"], + [25843, 0, "`"], + [25844, 0, "a"], + [25845, 0, "'"], + [25846, 0, "'"], + [25847, 0, ","], + [25848, 0, " "], + [25849, 0, "`"], + [25850, 0, "`"], + [25851, 0, "z"], + [25852, 0, "'"], + [25853, 0, "'"], + [25854, 0, " "], + [25854, 1], + [25854, 0, ","], + [25855, 0, " "], + [25856, 0, "`"], + [25857, 0, "`"], + [25858, 0, "b"], + [25859, 0, "'"], + [25860, 0, "'"], + [25861, 0, ","], + [25862, 0, " "], + [25863, 0, "`"], + [25864, 0, "`"], + [25865, 0, "c"], + [25866, 0, "'"], + [25867, 0, "'"], + [25868, 0, "]"], + [25869, 0, "}"], + [25870, 0, ";"], + [25652, 0, "\n"], + [25653, 0, "\\"], + [25654, 0, "n"], + [25655, 0, "o"], + [25656, 0, "d"], + [25657, 0, "e"], + [25658, 0, " "], + [25659, 0, "("], + [25660, 0, "l"], + [25661, 0, "e"], + [25662, 0, "f"], + [25663, 0, "t"], + [25664, 0, "4"], + [25665, 0, ")"], + [25666, 0, " "], + [25667, 0, " "], + [25668, 0, "a"], + [25669, 0, "t"], + [25670, 0, " "], + [25671, 0, "("], + [25672, 0, "0"], + [25673, 0, ","], + [25674, 0, "0"], + [25675, 0, ")"], + [25676, 0, " "], + [25677, 0, "["], + [25678, 0, "r"], + [25679, 0, "e"], + [25680, 0, "c"], + [25681, 0, "t"], + [25682, 0, "a"], + [25683, 0, "n"], + [25684, 0, "g"], + [25685, 0, "l"], + [25686, 0, "e"], + [25687, 0, ","], + [25688, 0, "d"], + [25689, 0, "r"], + [25690, 0, "a"], + [25691, 0, "w"], + [25692, 0, "]"], + [25693, 0, " "], + [25694, 0, "["], + [25694, 1], + [25694, 0, "{"], + [25695, 0, "["], + [25696, 0, "`"], + [25697, 0, "`"], + [25698, 0, "y"], + [25699, 0, "'"], + [25700, 0, "'"], + [25701, 0, ","], + [25702, 0, " "], + [25703, 0, "`"], + [25704, 0, "`"], + [25705, 0, "a"], + [25706, 0, "'"], + [25707, 0, "'"], + [25708, 0, ","], + [25709, 0, " "], + [25710, 0, "`"], + [25711, 0, "`"], + [25712, 0, "x"], + [25713, 0, "'"], + [25714, 0, "'"], + [25715, 0, ","], + [25716, 0, " "], + [25717, 0, "`"], + [25718, 0, "`"], + [25719, 0, "z"], + [25720, 0, "'"], + [25721, 0, "'"], + [25722, 0, ","], + [25723, 0, " "], + [25724, 0, "`"], + [25725, 0, "`"], + [25726, 0, "c"], + [25727, 0, "'"], + [25728, 0, "'"], + [25729, 0, "]"], + [25730, 0, "}"], + [25731, 0, ";"], + [25951, 0, "\n"], + [25952, 0, "\\"], + [25953, 0, "n"], + [25954, 0, "o"], + [25955, 0, "d"], + [25956, 0, "e"], + [25957, 0, " "], + [25958, 0, "("], + [25959, 0, "r"], + [25960, 0, "i"], + [25961, 0, "g"], + [25962, 0, "h"], + [25963, 0, "t"], + [25964, 0, "3"], + [25965, 0, ")"], + [25965, 1], + [25964, 1], + [25964, 0, "4"], + [25965, 0, ")"], + [25966, 0, " "], + [25967, 0, "a"], + [25968, 0, "t"], + [25969, 0, " "], + [25970, 0, "("], + [25971, 0, "8"], + [25972, 0, ","], + [25973, 0, "0"], + [25974, 0, ")"], + [25975, 0, " "], + [25976, 0, "["], + [25977, 0, "r"], + [25978, 0, "e"], + [25979, 0, "c"], + [25980, 0, "t"], + [25981, 0, "a"], + [25982, 0, "n"], + [25983, 0, "g"], + [25984, 0, "l"], + [25985, 0, "e"], + [25986, 0, ","], + [25987, 0, "d"], + [25988, 0, "r"], + [25989, 0, "a"], + [25990, 0, "w"], + [25991, 0, "]"], + [25992, 0, " "], + [25993, 0, "{"], + [25994, 0, "["], + [25995, 0, "`"], + [25996, 0, "`"], + [25997, 0, "y"], + [25998, 0, "'"], + [25999, 0, "'"], + [26000, 0, ","], + [26001, 0, " "], + [26002, 0, "'"], + [26002, 1], + [26002, 0, "`"], + [26003, 0, "`"], + [26004, 0, "a"], + [26005, 0, "'"], + [26006, 0, "'"], + [26007, 0, ","], + [26008, 0, " "], + [26009, 0, "`"], + [26010, 0, "`"], + [26011, 0, "x"], + [26012, 0, "'"], + [26013, 0, "'"], + [26014, 0, ","], + [26015, 0, " "], + [26016, 0, "`"], + [26017, 0, "`"], + [26018, 0, "z"], + [26019, 0, "'"], + [26020, 0, "'"], + [26021, 0, ","], + [26022, 0, " "], + [26023, 0, "`"], + [26024, 0, "`"], + [26025, 0, "c"], + [26026, 0, "'"], + [26027, 0, "'"], + [26028, 0, "]"], + [26029, 0, "}"], + [26030, 0, ";"], + [26031, 0, "\n"], + [26032, 0, "\\"], + [26033, 0, "d"], + [26034, 0, "r"], + [26035, 0, "a"], + [26036, 0, "w"], + [26037, 0, " "], + [26038, 0, "["], + [26039, 0, "t"], + [26040, 0, "h"], + [26041, 0, "i"], + [26042, 0, "c"], + [26043, 0, "k"], + [26044, 0, ","], + [26045, 0, "-"], + [26046, 0, ">"], + [26047, 0, "]"], + [26048, 0, " "], + [26049, 0, "("], + [26050, 0, "l"], + [26051, 0, "e"], + [26052, 0, "f"], + [26053, 0, "t"], + [26054, 0, "1"], + [26055, 0, ")"], + [26056, 0, " "], + [26057, 0, " "], + [26058, 0, "t"], + [26059, 0, "o"], + [26060, 0, " "], + [26061, 0, "n"], + [26062, 0, "o"], + [26063, 0, "d"], + [26064, 0, "e"], + [26065, 0, " "], + [26066, 0, "["], + [26067, 0, "l"], + [26068, 0, "e"], + [26069, 0, "f"], + [26070, 0, "t"], + [26071, 0, "]"], + [26072, 0, " "], + [26073, 0, " "], + [26074, 0, "{"], + [26075, 0, "d"], + [26076, 0, "o"], + [26077, 0, "c"], + [26078, 0, "."], + [26079, 0, "i"], + [26080, 0, "d"], + [26081, 0, "x"], + [26082, 0, "("], + [26083, 0, "2"], + [26084, 0, ")"], + [26085, 0, "."], + [26086, 0, "d"], + [26087, 0, "e"], + [26088, 0, "l"], + [26089, 0, "e"], + [26090, 0, "t"], + [26091, 0, "e"], + [26092, 0, ";"], + [26093, 0, "}"], + [26094, 0, " "], + [26095, 0, "("], + [26096, 0, "l"], + [26097, 0, "e"], + [26098, 0, "f"], + [26099, 0, "t"], + [26100, 0, "2"], + [26101, 0, ")"], + [26102, 0, ";"], + [26103, 0, "\n"], + [26104, 0, "\\"], + [26105, 0, "d"], + [26106, 0, "r"], + [26107, 0, "a"], + [26108, 0, "w"], + [26109, 0, " "], + [26110, 0, "["], + [26111, 0, "t"], + [26112, 0, "h"], + [26113, 0, "i"], + [26114, 0, "c"], + [26115, 0, "k"], + [26116, 0, ","], + [26117, 0, "-"], + [26118, 0, ">"], + [26119, 0, "]"], + [26120, 0, " "], + [26121, 0, "("], + [26122, 0, "l"], + [26123, 0, "e"], + [26124, 0, "f"], + [26125, 0, "t"], + [26126, 0, "2"], + [26127, 0, " "], + [26127, 1], + [26127, 0, ")"], + [26128, 0, " "], + [26129, 0, " "], + [26130, 0, "t"], + [26131, 0, "o"], + [26132, 0, " "], + [26133, 0, "n"], + [26134, 0, "o"], + [26135, 0, "d"], + [26136, 0, "e"], + [26137, 0, " "], + [26138, 0, "["], + [26139, 0, "l"], + [26140, 0, "e"], + [26141, 0, "f"], + [26142, 0, "t"], + [26143, 0, "]"], + [26144, 0, " "], + [26145, 0, " "], + [26146, 0, "{"], + [26147, 0, "d"], + [26148, 0, "o"], + [26149, 0, "c"], + [26150, 0, "."], + [26151, 0, "i"], + [26152, 0, "d"], + [26153, 0, "x"], + [26154, 0, "("], + [26155, 0, "1"], + [26156, 0, ")"], + [26157, 0, "."], + [26158, 0, "i"], + [26159, 0, "n"], + [26160, 0, "s"], + [26161, 0, "e"], + [26162, 0, "r"], + [26163, 0, "t"], + [26164, 0, "("], + [26165, 0, "`"], + [26166, 0, "`"], + [26167, 0, "x"], + [26168, 0, "'"], + [26169, 0, "'"], + [26170, 0, ")"], + [26171, 0, ";"], + [26172, 0, "}"], + [26173, 0, " "], + [26174, 0, "("], + [26175, 0, "l"], + [26176, 0, "e"], + [26177, 0, "f"], + [26178, 0, "t"], + [26179, 0, "3"], + [26180, 0, ")"], + [26181, 0, ";"], + [26182, 0, "\n"], + [26183, 0, "\\"], + [26184, 0, "d"], + [26185, 0, "r"], + [26186, 0, "a"], + [26187, 0, "w"], + [26188, 0, " "], + [26189, 0, "["], + [26190, 0, "t"], + [26191, 0, "h"], + [26192, 0, "i"], + [26193, 0, "c"], + [26194, 0, "k"], + [26195, 0, ","], + [26196, 0, "-"], + [26197, 0, ">"], + [26198, 0, "]"], + [26199, 0, " "], + [26200, 0, "("], + [26201, 0, "r"], + [26202, 0, "i"], + [26203, 0, "g"], + [26204, 0, "h"], + [26205, 0, "t"], + [26206, 0, "1"], + [26207, 0, ")"], + [26208, 0, " "], + [26209, 0, "t"], + [26210, 0, "o"], + [26211, 0, " "], + [26212, 0, "n"], + [26213, 0, "o"], + [26214, 0, "d"], + [26215, 0, "e"], + [26216, 0, " "], + [26217, 0, "["], + [26218, 0, "r"], + [26219, 0, "i"], + [26220, 0, "g"], + [26221, 0, "h"], + [26222, 0, "t"], + [26223, 0, "]"], + [26224, 0, " "], + [26225, 0, "{"], + [26226, 0, "d"], + [26227, 0, "o"], + [26228, 0, "c"], + [26229, 0, "."], + [26230, 0, "i"], + [26231, 0, "d"], + [26232, 0, "x"], + [26233, 0, "("], + [26234, 0, "1"], + [26234, 1], + [26234, 0, "0"], + [26235, 0, ")"], + [26236, 0, "."], + [26237, 0, "i"], + [26238, 0, "n"], + [26239, 0, "s"], + [26240, 0, "e"], + [26241, 0, "r"], + [26242, 0, "t"], + [26243, 0, "("], + [26244, 0, "`"], + [26245, 0, "`"], + [26246, 0, "y"], + [26247, 0, "'"], + [26248, 0, "'"], + [26249, 0, ")"], + [26250, 0, ";"], + [26251, 0, "}"], + [26252, 0, " "], + [26253, 0, "("], + [26254, 0, "r"], + [26255, 0, "i"], + [26256, 0, "g"], + [26257, 0, "h"], + [26258, 0, "t"], + [26259, 0, "2"], + [26260, 0, ")"], + [26261, 0, ";"], + [26262, 0, "\n"], + [26263, 0, "\\"], + [26264, 0, "d"], + [26265, 0, "r"], + [26266, 0, "a"], + [26267, 0, "w"], + [26268, 0, "["], + [26268, 1], + [26268, 0, " "], + [26269, 0, "["], + [26270, 0, "t"], + [26271, 0, "h"], + [26272, 0, "i"], + [26273, 0, "c"], + [26274, 0, "k"], + [26275, 0, ","], + [26276, 0, "-"], + [26277, 0, ">"], + [26278, 0, "]"], + [26279, 0, " "], + [26280, 0, "("], + [26281, 0, "r"], + [26282, 0, "i"], + [26283, 0, "g"], + [26284, 0, "h"], + [26285, 0, "t"], + [26286, 0, "2"], + [26287, 0, ")"], + [26288, 0, " "], + [26289, 0, "t"], + [26290, 0, "o"], + [26291, 0, " "], + [26292, 0, "n"], + [26293, 0, "o"], + [26294, 0, "d"], + [26295, 0, "e"], + [26296, 0, " "], + [26297, 0, "["], + [26298, 0, "r"], + [26299, 0, "i"], + [26300, 0, "g"], + [26301, 0, "h"], + [26302, 0, "t"], + [26303, 0, "]"], + [26304, 0, " "], + [26305, 0, "{"], + [26306, 0, "d"], + [26307, 0, "o"], + [26308, 0, "c"], + [26309, 0, "."], + [26310, 0, "i"], + [26311, 0, "d"], + [26312, 0, "x"], + [26313, 0, "("], + [26314, 0, "2"], + [26315, 0, ")"], + [26316, 0, "."], + [26317, 0, "i"], + [26318, 0, "n"], + [26319, 0, "s"], + [26320, 0, "e"], + [26321, 0, "r"], + [26322, 0, "t"], + [26323, 0, "("], + [26324, 0, "`"], + [26325, 0, "`"], + [26326, 0, "z"], + [26327, 0, "'"], + [26328, 0, "'"], + [26329, 0, ")"], + [26330, 0, ";"], + [26331, 0, "}"], + [26332, 0, " "], + [26333, 0, "("], + [26334, 0, "r"], + [26335, 0, "i"], + [26336, 0, "g"], + [26337, 0, "h"], + [26338, 0, "t"], + [26339, 0, "3"], + [26340, 0, ")"], + [26341, 0, ";"], + [25893, 1], + [25893, 0, "3"], + [25820, 1], + [25820, 0, "5"], + [25754, 1], + [25754, 0, "7"], + [25608, 1], + [25608, 0, "3"], + [25549, 1], + [25549, 0, "5"], + [25483, 1], + [25483, 0, "7"], + [26342, 0, "\n"], + [26343, 0, "\\"], + [26344, 0, "d"], + [26345, 0, "r"], + [26346, 0, "a"], + [26347, 0, "w"], + [26348, 0, " "], + [26349, 0, "["], + [26350, 0, "t"], + [26351, 0, "h"], + [26352, 0, "i"], + [26353, 0, "c"], + [26354, 0, "k"], + [26355, 0, ","], + [26356, 0, "d"], + [26357, 0, "a"], + [26358, 0, "s"], + [26359, 0, "h"], + [26360, 0, "e"], + [26361, 0, "d"], + [26362, 0, ","], + [26363, 0, "b"], + [26364, 0, "l"], + [26365, 0, "u"], + [26366, 0, "e"], + [26367, 0, ","], + [26368, 0, "-"], + [26369, 0, ">"], + [26370, 0, "]"], + [26371, 0, " "], + [26372, 0, "("], + [26373, 0, "l"], + [26374, 0, "e"], + [26375, 0, "f"], + [26376, 0, "t"], + [26377, 0, "3"], + [26378, 0, "."], + [26379, 0, "s"], + [26380, 0, "o"], + [26381, 0, "u"], + [26382, 0, "t"], + [26383, 0, "h"], + [26384, 0, ")"], + [26385, 0, " "], + [26386, 0, " "], + [26387, 0, "t"], + [26388, 0, "o"], + [26389, 0, " "], + [26390, 0, "["], + [26391, 0, "o"], + [26392, 0, "u"], + [26393, 0, "t"], + [26394, 0, "="], + [26395, 0, "2"], + [26396, 0, "7"], + [26397, 0, "0"], + [26398, 0, ","], + [26399, 0, "i"], + [26400, 0, "n"], + [26401, 0, "="], + [26402, 0, "1"], + [26403, 0, "3"], + [26404, 0, "5"], + [26405, 0, "]"], + [26406, 0, " "], + [26407, 0, "("], + [26408, 0, "r"], + [26409, 0, "i"], + [26410, 0, "g"], + [26411, 0, "h"], + [26412, 0, "t"], + [26413, 0, "4"], + [26414, 0, "."], + [26415, 0, "n"], + [26416, 0, "o"], + [26417, 0, "r"], + [26418, 0, "t"], + [26419, 0, "h"], + [26420, 0, " "], + [26421, 0, "w"], + [26422, 0, "e"], + [26423, 0, "s"], + [26424, 0, "t"], + [26425, 0, ")"], + [26426, 0, ";"], + [26427, 0, "\n"], + [26428, 0, "\\"], + [26429, 0, "d"], + [26430, 0, "r"], + [26431, 0, "a"], + [26432, 0, "w"], + [26433, 0, " "], + [26434, 0, "["], + [26435, 0, "t"], + [26436, 0, "h"], + [26437, 0, "i"], + [26438, 0, "c"], + [26439, 0, "k"], + [26440, 0, ","], + [26441, 0, "d"], + [26442, 0, "a"], + [26443, 0, "s"], + [26444, 0, "h"], + [26445, 0, "e"], + [26446, 0, "d"], + [26447, 0, ","], + [26448, 0, "b"], + [26449, 0, "l"], + [26450, 0, "u"], + [26451, 0, "e"], + [26452, 0, ","], + [26453, 0, "-"], + [26454, 0, ">"], + [26455, 0, " "], + [26456, 0, "("], + [26457, 0, "r"], + [26458, 0, "i"], + [26459, 0, "g"], + [26460, 0, "h"], + [26461, 0, "t"], + [26462, 0, "3"], + [26463, 0, "."], + [26464, 0, "s"], + [26465, 0, "o"], + [26466, 0, "u"], + [26455, 0, "]"], + [26468, 0, "t"], + [26469, 0, "h"], + [26470, 0, ")"], + [26471, 0, " "], + [26472, 0, "t"], + [26473, 0, "o"], + [26474, 0, " "], + [26475, 0, "["], + [26476, 0, "o"], + [26477, 0, "u"], + [26478, 0, "t"], + [26479, 0, "="], + [26480, 0, "2"], + [26481, 0, "7"], + [26482, 0, "0"], + [26483, 0, ","], + [26484, 0, "i"], + [26485, 0, "n"], + [26486, 0, "="], + [26487, 0, "4"], + [26488, 0, "5"], + [26489, 0, "]"], + [26490, 0, " "], + [26491, 0, " "], + [26492, 0, "("], + [26493, 0, "l"], + [26494, 0, "e"], + [26495, 0, "f"], + [26496, 0, "t"], + [26497, 0, "4"], + [26498, 0, "."], + [26499, 0, "n"], + [26500, 0, "o"], + [26501, 0, "r"], + [26502, 0, "t"], + [26503, 0, "h"], + [26504, 0, " "], + [26505, 0, "e"], + [26506, 0, "a"], + [26507, 0, "s"], + [26508, 0, "t"], + [26509, 0, ")"], + [26510, 0, ";"], + [26031, 0, "\n"], + [26032, 0, "\\"], + [26033, 0, "n"], + [26034, 0, "o"], + [26035, 0, "d"], + [26036, 0, "e"], + [26037, 0, " "], + [26038, 0, "("], + [26039, 0, "c"], + [26040, 0, "o"], + [26041, 0, "m"], + [26042, 0, "m"], + [26043, 0, "s"], + [26044, 0, ")"], + [26045, 0, " "], + [26046, 0, " "], + [26047, 0, "a"], + [26048, 0, "t"], + [26049, 0, " "], + [26050, 0, "("], + [26051, 0, "5"], + [26052, 0, ","], + [26053, 0, " "], + [26054, 0, "1"], + [26055, 0, "."], + [26056, 0, "4"], + [26057, 0, ")"], + [26058, 0, " "], + [26059, 0, "["], + [26060, 0, "t"], + [26061, 0, "e"], + [26062, 0, "x"], + [26063, 0, "t"], + [26064, 0, "="], + [26065, 0, "b"], + [26066, 0, "l"], + [26067, 0, "u"], + [26068, 0, "e"], + [26069, 0, "]"], + [26070, 0, " "], + [26071, 0, "{"], + [26072, 0, "\\"], + [26073, 0, "f"], + [26074, 0, "o"], + [26075, 0, "o"], + [26076, 0, "t"], + [26077, 0, "n"], + [26078, 0, "o"], + [26079, 0, "t"], + [26080, 0, "e"], + [26081, 0, "s"], + [26082, 0, "i"], + [26083, 0, "z"], + [26084, 0, "e"], + [26085, 0, " "], + [26086, 0, "n"], + [26087, 0, "e"], + [26088, 0, "t"], + [26089, 0, "w"], + [26090, 0, "o"], + [26091, 0, "r"], + [26092, 0, "k"], + [26093, 0, " "], + [26094, 0, "c"], + [26095, 0, "o"], + [26096, 0, "m"], + [26097, 0, "m"], + [26098, 0, "u"], + [26099, 0, "n"], + [26100, 0, "i"], + [26101, 0, "c"], + [26102, 0, "a"], + [26103, 0, "t"], + [26104, 0, "i"], + [26105, 0, "o"], + [26106, 0, "n"], + [26107, 0, "}"], + [26108, 0, ";"], + [25461, 0, "\n"], + [25462, 0, "\\"], + [25463, 0, "d"], + [25464, 0, "r"], + [25465, 0, "a"], + [25466, 0, "w"], + [25467, 0, " "], + [25468, 0, "["], + [25469, 0, "p"], + [25470, 0, "a"], + [25471, 0, "t"], + [25472, 0, "h"], + [25472, 1], + [25471, 1], + [25470, 1], + [25469, 1], + [25468, 1], + [25467, 1], + [25466, 1], + [25465, 1], + [25464, 1], + [25463, 1], + [25463, 0, "p"], + [25464, 0, "a"], + [25465, 0, "t"], + [25466, 0, "h"], + [25467, 0, " "], + [25468, 0, "["], + [25469, 0, "d"], + [25470, 0, "r"], + [25471, 0, "a"], + [25472, 0, "w"], + [25473, 0, ","], + [25474, 0, "d"], + [25475, 0, "o"], + [25476, 0, "t"], + [25477, 0, "t"], + [25478, 0, "e"], + [25479, 0, "d"], + [25480, 0, "]"], + [25481, 0, " "], + [25482, 0, "("], + [25483, 0, "4"], + [25484, 0, ","], + [25485, 0, "-"], + [25486, 0, "0"], + [25487, 0, "5"], + [25487, 1], + [25487, 0, "."], + [25488, 0, "5"], + [25489, 0, ")"], + [25490, 0, " "], + [25491, 0, "-"], + [25492, 0, "-"], + [25493, 0, " "], + [25494, 0, "("], + [25495, 0, "4"], + [25496, 0, ","], + [25497, 0, "7"], + [25498, 0, "."], + [25499, 0, "5"], + [25500, 0, ")"], + [25501, 0, ";"], + [25502, 0, "\n"], + [25503, 0, "\\"], + [25504, 0, "n"], + [25505, 0, "o"], + [25506, 0, "d"], + [25507, 0, "e"], + [25508, 0, " "], + [25509, 0, "("], + [25510, 0, "l"], + [25511, 0, "e"], + [25512, 0, "f"], + [25513, 0, "t"], + [25514, 0, "R"], + [25515, 0, ")"], + [25516, 0, " "], + [25517, 0, " "], + [25518, 0, "a"], + [25519, 0, "t"], + [25520, 0, " "], + [25521, 0, "("], + [25522, 0, "0"], + [25523, 0, ","], + [25524, 0, "8"], + [25525, 0, "."], + [25526, 0, "5"], + [25499, 1], + [25498, 1], + [25497, 1], + [25497, 0, "9"], + [25525, 0, ")"], + [25526, 0, " "], + [25527, 0, "{"], + [25528, 0, "R"], + [25529, 0, "e"], + [25530, 0, "p"], + [25531, 0, "l"], + [25532, 0, "i"], + [25533, 0, "c"], + [25534, 0, "a"], + [25535, 0, " "], + [25536, 0, "$"], + [25537, 0, "p"], + [25538, 0, "$"], + [25539, 0, ":"], + [25540, 0, "}"], + [25541, 0, ";"], + [25542, 0, "\n"], + [25543, 0, "\\"], + [25544, 0, "n"], + [25545, 0, "o"], + [25546, 0, "d"], + [25547, 0, "e"], + [25548, 0, " "], + [25549, 0, "("], + [25550, 0, "r"], + [25551, 0, "i"], + [25552, 0, "g"], + [25553, 0, "h"], + [25554, 0, "t"], + [25555, 0, "R"], + [25556, 0, ")"], + [25557, 0, " "], + [25558, 0, "a"], + [25559, 0, "t"], + [25560, 0, " "], + [25561, 0, "("], + [25562, 0, "8"], + [25563, 0, ","], + [25564, 0, "8"], + [25565, 0, "."], + [25566, 0, "5"], + [25567, 0, ")"], + [25568, 0, " "], + [25569, 0, "{"], + [25570, 0, "R"], + [25571, 0, "e"], + [25572, 0, "p"], + [25573, 0, "l"], + [25574, 0, "i"], + [25575, 0, "c"], + [25576, 0, "a"], + [25577, 0, " "], + [25578, 0, "$"], + [25579, 0, "q"], + [25580, 0, "$"], + [25581, 0, ":"], + [25582, 0, "}"], + [25583, 0, ";"], + [26931, 1], + [26931, 0, "6"], + [26932, 0, "."], + [26933, 0, "5"], + [27019, 1], + [27018, 1], + [27017, 1], + [27016, 1], + [27015, 1], + [27014, 1], + [27013, 1], + [27012, 1], + [27011, 1], + [27010, 1], + [27009, 1], + [27008, 1], + [27007, 1], + [27006, 1], + [27005, 1], + [27004, 1], + [27003, 1], + [27002, 1], + [27001, 1], + [27000, 1], + [26999, 1], + [26998, 1], + [26997, 1], + [26996, 1], + [26995, 1], + [26994, 1], + [26993, 1], + [26992, 1], + [26991, 1], + [26990, 1], + [26989, 1], + [26988, 1], + [26987, 1], + [26986, 1], + [26985, 1], + [26984, 1], + [26983, 1], + [26982, 1], + [26981, 1], + [26980, 1], + [26979, 1], + [26978, 1], + [26977, 1], + [26976, 1], + [26975, 1], + [26974, 1], + [26973, 1], + [26972, 1], + [26971, 1], + [26970, 1], + [26969, 1], + [26968, 1], + [26967, 1], + [26966, 1], + [26965, 1], + [26964, 1], + [26963, 1], + [26962, 1], + [26961, 1], + [26960, 1], + [26959, 1], + [26958, 1], + [26957, 1], + [26956, 1], + [26955, 1], + [26954, 1], + [26953, 1], + [26952, 1], + [26951, 1], + [26950, 1], + [26949, 1], + [26948, 1], + [26947, 1], + [26946, 1], + [26945, 1], + [26944, 1], + [26943, 1], + [26942, 1], + [26941, 1], + [26940, 1], + [26939, 1], + [26938, 1], + [26937, 1], + [26936, 1], + [26174, 1], + [26174, 0, "4"], + [26179, 1], + [26179, 0, "5"], + [25566, 1], + [25565, 1], + [25523, 1], + [25523, 1], + [25497, 1], + [25497, 0, "8"], + [25498, 0, "."], + [25499, 0, "5"], + [26710, 0, "\n"], + [26711, 0, "\\"], + [26712, 0, "d"], + [26713, 0, "r"], + [26713, 1], + [26712, 1], + [26711, 1], + [26710, 1], + [26541, 0, "\n"], + [26542, 0, "\\"], + [26543, 0, "d"], + [26544, 0, "r"], + [26545, 0, "a"], + [26546, 0, "w"], + [26547, 0, " "], + [26548, 0, "["], + [26549, 0, "t"], + [26550, 0, "h"], + [26551, 0, "i"], + [26552, 0, "c"], + [26553, 0, "k"], + [26554, 0, ","], + [26555, 0, "-"], + [26556, 0, ">"], + [26557, 0, " "], + [26558, 0, "("], + [26558, 1], + [26557, 1], + [26557, 0, "]"], + [26558, 0, " "], + [26559, 0, "("], + [26560, 0, "l"], + [26561, 0, "e"], + [26562, 0, "f"], + [26563, 0, "t"], + [26564, 0, "3"], + [26565, 0, ")"], + [26566, 0, " "], + [26567, 0, "t"], + [26568, 0, "o"], + [26569, 0, " "], + [26567, 0, " "], + [26571, 0, "("], + [26572, 0, "l"], + [26573, 0, "e"], + [26574, 0, "f"], + [26575, 0, "t"], + [26576, 0, "4"], + [26577, 0, ")"], + [26578, 0, ";"], + [26579, 0, "\n"], + [26580, 0, "\\"], + [26581, 0, "d"], + [26582, 0, "r"], + [26583, 0, "a"], + [26584, 0, "w"], + [26585, 0, " "], + [26586, 0, "["], + [26587, 0, "t"], + [26588, 0, "h"], + [26589, 0, "i"], + [26590, 0, "c"], + [26591, 0, "k"], + [26592, 0, ","], + [26593, 0, "-"], + [26594, 0, ">"], + [26595, 0, "]"], + [26596, 0, " "], + [26597, 0, "("], + [26598, 0, "r"], + [26599, 0, "i"], + [26600, 0, "g"], + [26601, 0, "h"], + [26602, 0, "t"], + [26603, 0, "3"], + [26604, 0, ")"], + [26605, 0, " "], + [26606, 0, "t"], + [26607, 0, "o"], + [26608, 0, " "], + [26609, 0, "("], + [26610, 0, "r"], + [26611, 0, "i"], + [26612, 0, "g"], + [26613, 0, "h"], + [26614, 0, "t"], + [26615, 0, "3"], + [26615, 1], + [26615, 0, "4"], + [26616, 0, ")"], + [26617, 0, ";"], + [27008, 1], + [27007, 1], + [27006, 1], + [27006, 0, "7"], + [27007, 0, "."], + [27008, 0, "0"], + [27796, 1], + [27796, 0, "."], + [27797, 0, "g"], + [27798, 0, "e"], + [27799, 0, "t"], + [27800, 0, "("], + [27885, 1], + [27885, 0, "."], + [27886, 0, "g"], + [27887, 0, "e"], + [27888, 0, "t"], + [27889, 0, "("], + [27809, 1], + [27809, 0, ")"], + [27810, 0, "."], + [27811, 0, "i"], + [27812, 0, "d"], + [27813, 0, "x"], + [27814, 0, "("], + [27815, 0, "1"], + [27816, 0, ")"], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27817, 1], + [27900, 1], + [27899, 1], + [27898, 1], + [27897, 1], + [27896, 1], + [27895, 1], + [27895, 0, ")"], + [27897, 0, "i"], + [27898, 0, "d"], + [27899, 0, "x"], + [27900, 0, "("], + [27901, 0, "1"], + [27902, 0, ")"], + [27903, 0, "."], + [27904, 1], + [27904, 1], + [27904, 1], + [27904, 1], + [27904, 1], + [27904, 0, "g"], + [27905, 0, "e"], + [27906, 0, "t"], + [27907, 0, "("], + [27916, 1], + [27916, 0, ")"], + [26906, 0, "\n"], + [26907, 0, "\n"], + [26908, 0, "\\"], + [26909, 0, "b"], + [26910, 0, "e"], + [26911, 0, "g"], + [26912, 0, "i"], + [26913, 0, "n"], + [26914, 0, "{"], + [26915, 0, "f"], + [26916, 0, "i"], + [26917, 0, "g"], + [26918, 0, "u"], + [26919, 0, "r"], + [26920, 0, "e"], + [26921, 0, "*"], + [26922, 0, "}"], + [26923, 0, "\n"], + [26924, 0, "\\"], + [26925, 0, "c"], + [26926, 0, "e"], + [26927, 0, "n"], + [26928, 0, "t"], + [26929, 0, "e"], + [26930, 0, "r"], + [26931, 0, "i"], + [26932, 0, "n"], + [26933, 0, "g"], + [26934, 0, "\n"], + [26935, 0, "\\"], + [26936, 0, "b"], + [26937, 0, "e"], + [26938, 0, "g"], + [26939, 0, "i"], + [26940, 0, "n"], + [26941, 0, "{"], + [26942, 0, "t"], + [26943, 0, "i"], + [26944, 0, "k"], + [26945, 0, "z"], + [26946, 0, "p"], + [26947, 0, "i"], + [26948, 0, "c"], + [26949, 0, "t"], + [26950, 0, "u"], + [26951, 0, "r"], + [26952, 0, "e"], + [26953, 0, "}"], + [26954, 0, "["], + [26955, 0, "a"], + [26956, 0, "u"], + [26957, 0, "t"], + [26958, 0, "o"], + [26959, 0, ","], + [26960, 0, "s"], + [26961, 0, "c"], + [26962, 0, "a"], + [26963, 0, "l"], + [26964, 0, "e"], + [26965, 0, "="], + [26966, 0, "0"], + [26967, 0, "."], + [26968, 0, "8"], + [26969, 0, "]"], + [26970, 0, "\n"], + [26971, 0, "\\"], + [26972, 0, "e"], + [26973, 0, "n"], + [26974, 0, "d"], + [26975, 0, "{"], + [26976, 0, "t"], + [26977, 0, "i"], + [26978, 0, "k"], + [26979, 0, "z"], + [26980, 0, "p"], + [26981, 0, "i"], + [26982, 0, "c"], + [26983, 0, "t"], + [26984, 0, "u"], + [26985, 0, "r"], + [26986, 0, "e"], + [26987, 0, "}"], + [26988, 0, "\n"], + [26989, 0, "\\"], + [26990, 0, "c"], + [26991, 0, "a"], + [26992, 0, "p"], + [26993, 0, "t"], + [26994, 0, "i"], + [26995, 0, "o"], + [26996, 0, "n"], + [26997, 0, "{"], + [26998, 0, "C"], + [26999, 0, "o"], + [27000, 0, "n"], + [27001, 0, "c"], + [27002, 0, "u"], + [27003, 0, "r"], + [27004, 0, "r"], + [27005, 0, "e"], + [27006, 0, "n"], + [27007, 0, "t"], + [27008, 0, "l"], + [27009, 0, "y"], + [27010, 0, " "], + [27011, 0, "a"], + [27012, 0, "s"], + [27013, 0, "s"], + [27014, 0, "i"], + [27015, 0, "g"], + [27016, 0, "n"], + [27017, 0, "i"], + [27018, 0, "n"], + [27019, 0, "g"], + [27020, 0, " "], + [27021, 0, "v"], + [27022, 0, "a"], + [27023, 0, "l"], + [27024, 0, "u"], + [27025, 0, "e"], + [27026, 0, "s"], + [27027, 0, " "], + [27028, 0, "o"], + [27029, 0, "f"], + [27030, 0, " "], + [27031, 0, "d"], + [27032, 0, "i"], + [27033, 0, "f"], + [27034, 0, "f"], + [27035, 0, "e"], + [27036, 0, "r"], + [27037, 0, "e"], + [27038, 0, "n"], + [27039, 0, "t"], + [27040, 0, " "], + [27041, 0, "t"], + [27042, 0, "y"], + [27043, 0, "p"], + [27044, 0, "e"], + [27045, 0, "s"], + [27046, 0, " "], + [27047, 0, "t"], + [27048, 0, "o"], + [27049, 0, " "], + [27050, 0, "t"], + [27051, 0, "h"], + [27052, 0, "e"], + [27053, 0, " "], + [27054, 0, "s"], + [27055, 0, "a"], + [27056, 0, "m"], + [27057, 0, "e"], + [27058, 0, " "], + [27059, 0, "m"], + [27060, 0, "a"], + [27061, 0, "p"], + [27062, 0, " "], + [27063, 0, "k"], + [27064, 0, "e"], + [27065, 0, "y"], + [27066, 0, "."], + [27067, 0, "}"], + [27068, 0, "\n"], + [27069, 0, "\\"], + [27070, 0, "e"], + [27071, 0, "n"], + [27072, 0, "d"], + [27073, 0, "{"], + [27074, 0, "f"], + [27075, 0, "i"], + [27076, 0, "g"], + [27077, 0, "u"], + [27078, 0, "r"], + [27079, 0, "e"], + [27080, 0, "*"], + [27081, 0, "}"], + [26970, 0, "\n"], + [26971, 0, "\\"], + [26972, 0, "p"], + [26973, 0, "a"], + [26974, 0, "t"], + [26975, 0, "h"], + [26976, 0, " "], + [26977, 0, "["], + [26978, 0, "d"], + [26979, 0, "r"], + [26980, 0, "a"], + [26981, 0, "w"], + [26982, 0, ","], + [26983, 0, "d"], + [26984, 0, "o"], + [26985, 0, "t"], + [26986, 0, "t"], + [26987, 0, "e"], + [26988, 0, "d"], + [26989, 0, "]"], + [26990, 0, " "], + [26991, 0, "("], + [26992, 0, "4"], + [26993, 0, ","], + [26994, 0, "-"], + [26995, 0, "0"], + [26996, 0, "."], + [26997, 0, "5"], + [26998, 0, ")"], + [26999, 0, " "], + [27000, 0, "-"], + [27001, 0, "-"], + [27002, 0, " "], + [27003, 0, "("], + [27004, 0, "4"], + [27005, 0, ","], + [27006, 0, "8"], + [27007, 0, "."], + [27008, 0, "5"], + [27009, 0, ")"], + [27010, 0, ";"], + [27011, 0, "\n"], + [27012, 0, "\\"], + [27013, 0, "n"], + [27014, 0, "o"], + [27015, 0, "d"], + [27016, 0, "e"], + [27017, 0, " "], + [27018, 0, "("], + [27019, 0, "l"], + [27020, 0, "e"], + [27021, 0, "f"], + [27022, 0, "t"], + [27023, 0, "1"], + [27024, 0, ")"], + [27025, 0, " "], + [27026, 0, " "], + [27027, 0, "a"], + [27028, 0, "t"], + [27029, 0, " "], + [27030, 0, "("], + [27031, 0, "0"], + [27032, 0, ","], + [27033, 0, "7"], + [27034, 0, ")"], + [27035, 0, " "], + [27036, 0, "["], + [27037, 0, "r"], + [27038, 0, "e"], + [27039, 0, "c"], + [27040, 0, "t"], + [27041, 0, "a"], + [27042, 0, "n"], + [27043, 0, "g"], + [27044, 0, "l"], + [27045, 0, "e"], + [27046, 0, ","], + [27047, 0, "d"], + [27048, 0, "r"], + [27049, 0, "a"], + [27050, 0, "w"], + [27051, 0, "}"], + [27051, 1], + [27051, 0, "]"], + [27052, 0, " "], + [27053, 0, "{"], + [27054, 0, "\\"], + [27055, 0, "{"], + [27056, 0, "\\"], + [27057, 0, "}"], + [27058, 0, "}"], + [27059, 0, ";"], + [27060, 0, "\n"], + [27061, 0, "\\"], + [27062, 0, "n"], + [27063, 0, "o"], + [27064, 0, "d"], + [27065, 0, "e"], + [27066, 0, " "], + [27067, 0, "("], + [27068, 0, "r"], + [27069, 0, "i"], + [27070, 0, "g"], + [27071, 0, "h"], + [27072, 0, "t"], + [27073, 0, "1"], + [27074, 0, ")"], + [27075, 0, " "], + [27076, 0, "a"], + [27077, 0, "t"], + [27078, 0, " "], + [27079, 0, "("], + [27080, 0, "0"], + [27080, 1], + [27080, 0, "8"], + [27081, 0, ","], + [27082, 0, "7"], + [27083, 0, ")"], + [27084, 0, " "], + [27085, 0, "["], + [27086, 0, "r"], + [27087, 0, "e"], + [27088, 0, "c"], + [27089, 0, "t"], + [27090, 0, "a"], + [27091, 0, "n"], + [27092, 0, "g"], + [27093, 0, "l"], + [27094, 0, "e"], + [27095, 0, ","], + [27096, 0, "d"], + [27097, 0, "r"], + [27098, 0, "a"], + [27099, 0, "w"], + [27100, 0, "]"], + [27101, 0, " "], + [27102, 0, "{"], + [27103, 0, "\\"], + [27104, 0, "{"], + [27105, 0, "\\"], + [27106, 0, "}"], + [27107, 0, "}"], + [27108, 0, ";"], + [27060, 0, "\n"], + [27061, 0, "\\"], + [27062, 0, "n"], + [27063, 0, "o"], + [27064, 0, "d"], + [27065, 0, "e"], + [27066, 0, " "], + [27067, 0, "("], + [27068, 0, "l"], + [27069, 0, "e"], + [27070, 0, "f"], + [27071, 0, "t"], + [27072, 0, "2"], + [27073, 0, ")"], + [27074, 0, " "], + [27075, 0, " "], + [27076, 0, "a"], + [27077, 0, "t"], + [27078, 0, " "], + [27079, 0, "("], + [27080, 0, "0"], + [27081, 0, ","], + [27082, 0, "5"], + [27083, 0, ")"], + [27084, 0, " "], + [27085, 0, "["], + [27086, 0, "r"], + [27087, 0, "e"], + [27088, 0, "c"], + [27089, 0, "t"], + [27090, 0, "a"], + [27091, 0, "n"], + [27092, 0, "g"], + [27093, 0, "l"], + [27094, 0, "e"], + [27095, 0, ","], + [27096, 0, "d"], + [27097, 0, "r"], + [27098, 0, "a"], + [27099, 0, "w"], + [27100, 0, "]"], + [27101, 0, " "], + [27102, 0, "{"], + [27103, 0, "\\"], + [27104, 0, "{"], + [27105, 0, "`"], + [27106, 0, "`"], + [27107, 0, "a"], + [27108, 0, "'"], + [27109, 0, "'"], + [27110, 0, ":"], + [27111, 0, " "], + [27112, 0, "\\"], + [27113, 0, "{"], + [27114, 0, "\\"], + [27115, 0, "}"], + [27116, 0, "\\"], + [27117, 0, "}"], + [27118, 0, "}"], + [27119, 0, ";"], + [27120, 0, "\n"], + [27121, 0, "\\"], + [27122, 0, "n"], + [27123, 0, "o"], + [27124, 0, "d"], + [27125, 0, "e"], + [27126, 0, " "], + [27127, 0, "("], + [27128, 0, "l"], + [27129, 0, "e"], + [27130, 0, "f"], + [27131, 0, "t"], + [27132, 0, "3"], + [27133, 0, ")"], + [27134, 0, " "], + [27135, 0, " "], + [27136, 0, "a"], + [27137, 0, "t"], + [27138, 0, " "], + [27139, 0, "("], + [27140, 0, "0"], + [27141, 0, ","], + [27142, 0, "4"], + [27142, 1], + [27142, 0, "3"], + [27143, 0, ")"], + [27144, 0, " "], + [27145, 0, "["], + [27146, 0, "r"], + [27147, 0, "e"], + [27148, 0, "c"], + [27149, 0, "t"], + [27150, 0, "a"], + [27151, 0, "n"], + [27152, 0, "g"], + [27153, 0, "l"], + [27154, 0, "e"], + [27155, 0, ","], + [27156, 0, "d"], + [27157, 0, "r"], + [27158, 0, "w"], + [27159, 0, "a"], + [27160, 0, "w"], + [27160, 1], + [27159, 1], + [27158, 1], + [27158, 0, "a"], + [27159, 0, "w"], + [27160, 0, "]"], + [27161, 0, " "], + [27162, 0, "{"], + [27163, 0, "\\"], + [27164, 0, "{"], + [27165, 0, "`"], + [27166, 0, "`"], + [27167, 0, "a"], + [27168, 0, "'"], + [27169, 0, "'"], + [27170, 0, ":"], + [27171, 0, " "], + [27172, 0, "\\"], + [27173, 0, "{"], + [27174, 0, "`"], + [27175, 0, "`"], + [27176, 0, "x"], + [27177, 0, "'"], + [27178, 0, "'"], + [27179, 0, ":"], + [27180, 0, " "], + [27181, 0, "`"], + [27182, 0, "`"], + [27183, 0, "y"], + [27184, 0, "'"], + [27185, 0, "'"], + [27186, 0, "\\"], + [27187, 0, "}"], + [27188, 0, "\\"], + [27189, 0, "}"], + [27190, 0, "}"], + [27191, 0, ";"], + [27241, 0, "\n"], + [27242, 0, "\\"], + [27243, 0, "n"], + [27244, 0, "o"], + [27245, 0, "d"], + [27246, 0, "e"], + [27247, 0, " "], + [27248, 0, "("], + [27249, 0, "r"], + [27250, 0, "i"], + [27251, 0, "g"], + [27252, 0, "h"], + [27253, 0, "t"], + [27254, 0, "2"], + [27255, 0, ")"], + [27256, 0, " "], + [27257, 0, "a"], + [27258, 0, "t"], + [27259, 0, " "], + [27260, 0, "("], + [27261, 0, "8"], + [27262, 0, ","], + [27263, 0, "5"], + [27264, 0, ")"], + [27265, 0, " "], + [27266, 0, "["], + [27267, 0, "r"], + [27268, 0, "e"], + [27269, 0, "c"], + [27270, 0, "t"], + [27271, 0, "a"], + [27272, 0, "n"], + [27273, 0, "g"], + [27274, 0, "l"], + [27275, 0, "e"], + [27276, 0, ","], + [27277, 0, "d"], + [27278, 0, "r"], + [27279, 0, "a"], + [27280, 0, "w"], + [27281, 0, "]"], + [27282, 0, " "], + [27283, 0, "["], + [27283, 1], + [27283, 0, "{"], + [27284, 0, "\\"], + [27285, 0, "{"], + [27286, 0, "`"], + [27287, 0, "`"], + [27288, 0, "a"], + [27289, 0, "'"], + [27290, 0, "'"], + [27291, 0, ":"], + [27292, 0, " "], + [27293, 0, "["], + [27294, 0, "]"], + [27295, 0, "\\"], + [27296, 0, "}"], + [27297, 0, "}"], + [27298, 0, ";"], + [27299, 0, "\n"], + [27300, 0, "\\"], + [27301, 0, "n"], + [27302, 0, "o"], + [27303, 0, "d"], + [27304, 0, "e"], + [27305, 0, " "], + [27306, 0, "("], + [27307, 0, "r"], + [27308, 0, "i"], + [27309, 0, "g"], + [27310, 0, "h"], + [27311, 0, "t"], + [27312, 0, "3"], + [27313, 0, ")"], + [27314, 0, " "], + [27315, 0, "a"], + [27316, 0, "t"], + [27317, 0, " "], + [27318, 0, "("], + [27319, 0, "8"], + [27320, 0, ","], + [27321, 0, "4"], + [27321, 1], + [27321, 0, "3"], + [27322, 0, ")"], + [27323, 0, " "], + [27324, 0, "["], + [27325, 0, "r"], + [27326, 0, "e"], + [27327, 0, "c"], + [27328, 0, "t"], + [27329, 0, "a"], + [27330, 0, "n"], + [27331, 0, "g"], + [27332, 0, "l"], + [27333, 0, "e"], + [27334, 0, ","], + [27335, 0, "d"], + [27336, 0, "r"], + [27337, 0, "a"], + [27338, 0, "w"], + [27339, 0, "]"], + [27340, 0, " "], + [27341, 0, "{"], + [27342, 0, "\\"], + [27343, 0, "{"], + [27344, 0, "`"], + [27345, 0, "`"], + [27346, 0, "a"], + [27347, 0, "'"], + [27348, 0, "'"], + [27349, 0, ":"], + [27350, 0, " "], + [27351, 0, "["], + [27352, 0, "`"], + [27353, 0, "`"], + [27354, 0, "z"], + [27355, 0, "'"], + [27356, 0, "'"], + [27357, 0, "]"], + [27358, 0, "\\"], + [27359, 0, "}"], + [27360, 0, "]"], + [27361, 0, ";"], + [27360, 1], + [27360, 0, "\n"], + [27360, 1], + [27360, 0, "}"], + [27192, 0, "\n"], + [27193, 0, "\\"], + [27194, 0, "n"], + [27195, 0, "o"], + [27196, 0, "d"], + [27197, 0, "e"], + [27198, 0, " "], + [27199, 0, "("], + [27200, 0, "l"], + [27201, 0, "e"], + [27202, 0, "f"], + [27203, 0, "t"], + [27204, 0, "3"], + [27204, 1], + [27204, 0, "4"], + [27205, 0, ")"], + [27206, 0, " "], + [27207, 0, " "], + [27208, 0, "a"], + [27209, 0, "t"], + [27210, 0, " "], + [27211, 0, "("], + [27212, 0, "0"], + [27213, 0, ","], + [27214, 0, "0"], + [27215, 0, ")"], + [27216, 0, " "], + [27217, 0, "["], + [27218, 0, "r"], + [27219, 0, "e"], + [27220, 0, "c"], + [27221, 0, "t"], + [27222, 0, "a"], + [27223, 0, "n"], + [27224, 0, "g"], + [27225, 0, "l"], + [27226, 0, "e"], + [27227, 0, ","], + [27228, 0, "d"], + [27229, 0, "r"], + [27230, 0, "a"], + [27231, 0, "w"], + [27232, 0, "]"], + [27233, 0, " "], + [27234, 0, "{"], + [27235, 0, "\\"], + [27236, 0, "_"], + [27236, 1], + [27236, 0, "{"], + [27237, 0, "`"], + [27238, 0, "`"], + [27239, 0, "a"], + [27240, 0, "'"], + [27237, 0, "m"], + [27238, 0, "a"], + [27239, 0, "p"], + [27240, 0, "T"], + [27241, 0, "("], + [27246, 0, "'"], + [27247, 0, ")"], + [27248, 0, ":"], + [27249, 0, " "], + [27250, 0, "\\"], + [27251, 0, "{"], + [27252, 0, "`"], + [27253, 0, "`"], + [27254, 0, "x"], + [27255, 0, "'"], + [27256, 0, "'"], + [27257, 0, ":"], + [27258, 0, " "], + [27259, 0, "`"], + [27260, 0, "`"], + [27261, 0, "y"], + [27262, 0, "'"], + [27263, 0, "'"], + [27264, 0, "\\"], + [27265, 0, "}"], + [27266, 0, ","], + [27267, 0, " "], + [27268, 0, "l"], + [27269, 0, "i"], + [27270, 0, "s"], + [27271, 0, "t"], + [27272, 0, "T"], + [27273, 0, "("], + [27274, 0, "`"], + [27275, 0, "`"], + [27276, 0, "a"], + [27277, 0, "'"], + [27278, 0, "'"], + [27278, 1], + [27278, 0, "'"], + [27279, 0, ")"], + [27280, 0, ":"], + [27281, 0, " "], + [27282, 0, "["], + [27283, 0, "`"], + [27284, 0, "`"], + [27285, 0, "z"], + [27286, 0, "'"], + [27287, 0, "'"], + [27288, 0, "]"], + [27289, 0, "\\"], + [27290, 0, "}"], + [27291, 0, "}"], + [27292, 0, ";"], + [27198, 0, " "], + [27199, 0, "["], + [27200, 0, "m"], + [27201, 0, "a"], + [27202, 0, "t"], + [27203, 0, "r"], + [27204, 0, "i"], + [27205, 0, "x"], + [27206, 0, "]"], + [27216, 1], + [27243, 0, "\n"], + [27244, 0, " "], + [27245, 0, " "], + [27246, 0, " "], + [27247, 0, " "], + [27248, 0, "\\"], + [27249, 0, "n"], + [27250, 0, "o"], + [27251, 0, "d"], + [27252, 0, "e"], + [27253, 0, " "], + [27254, 0, "{"], + [27287, 0, "}"], + [27288, 0, ";"], + [27289, 0, " "], + [27290, 0, "\\"], + [27291, 0, "\\"], + [27292, 0, "\n"], + [27293, 0, " "], + [27294, 0, " "], + [27295, 0, " "], + [27296, 0, " "], + [27297, 0, "\\"], + [27298, 0, "n"], + [27299, 0, "o"], + [27300, 0, "d"], + [27301, 0, "e"], + [27302, 0, " "], + [27303, 0, "{"], + [27304, 1], + [27329, 0, " "], + [27330, 0, "\\"], + [27331, 0, "\\"], + [27332, 0, "\n"], + [27333, 0, "}"], + [27334, 0, ";"], + [27505, 0, "\n"], + [27506, 0, "\\"], + [27507, 0, "n"], + [27508, 0, "o"], + [27509, 0, "d"], + [27510, 0, "e"], + [27511, 0, " "], + [27512, 0, "["], + [27513, 0, "m"], + [27514, 0, "a"], + [27515, 0, "t"], + [27516, 0, "r"], + [27517, 0, "i"], + [27518, 0, "x"], + [27519, 0, "]"], + [27520, 0, " "], + [27521, 0, "("], + [27522, 0, "r"], + [27523, 0, "i"], + [27524, 0, "g"], + [27525, 0, "h"], + [27526, 0, "t"], + [27527, 0, "4"], + [27528, 0, "3"], + [27528, 1], + [27528, 0, ")"], + [27529, 0, " "], + [27530, 0, "a"], + [27531, 0, "t"], + [27532, 0, " "], + [27533, 0, "("], + [27534, 0, "8"], + [27535, 0, ","], + [27536, 0, "0"], + [27537, 0, ")"], + [27538, 0, " "], + [27539, 0, "["], + [27540, 0, "r"], + [27541, 0, "e"], + [27542, 0, "c"], + [27543, 0, "t"], + [27544, 0, "a"], + [27545, 0, "n"], + [27546, 0, "g"], + [27547, 0, "l"], + [27548, 0, "e"], + [27549, 0, ","], + [27550, 0, "d"], + [27551, 0, "r"], + [27552, 0, "a"], + [27553, 0, "w"], + [27554, 0, "]"], + [27555, 0, " "], + [27556, 0, "{"], + [27557, 0, "\n"], + [27558, 0, " "], + [27559, 0, " "], + [27560, 0, " "], + [27561, 0, " "], + [27562, 0, "\\"], + [27563, 0, "n"], + [27564, 0, "o"], + [27565, 0, "d"], + [27566, 0, "e"], + [27567, 0, " "], + [27568, 0, "{"], + [27569, 0, "\\"], + [27570, 0, "{"], + [27571, 0, "m"], + [27572, 0, "a"], + [27573, 0, "p"], + [27574, 0, "T"], + [27575, 0, "("], + [27576, 0, "`"], + [27577, 0, "`"], + [27578, 0, "a"], + [27579, 0, "'"], + [27580, 0, "'"], + [27581, 0, ")"], + [27582, 0, ":"], + [27583, 0, " "], + [27584, 0, "`"], + [27585, 0, "{"], + [27585, 1], + [27584, 1], + [27584, 0, "\\"], + [27585, 0, "{"], + [27586, 0, "`"], + [27587, 0, "`"], + [27588, 0, "x"], + [27589, 0, "'"], + [27590, 0, "'"], + [27591, 0, ":"], + [27592, 0, " "], + [27593, 0, "`"], + [27594, 0, "`"], + [27595, 0, "y"], + [27596, 0, "'"], + [27597, 0, "'"], + [27598, 0, "\\"], + [27599, 0, "}"], + [27600, 0, ","], + [27601, 0, "}"], + [27602, 0, ";"], + [27603, 0, " "], + [27604, 0, "\\"], + [27605, 0, "\\"], + [27606, 0, "\n"], + [27607, 0, " "], + [27608, 0, " "], + [27609, 0, " "], + [27610, 0, " "], + [27611, 0, "\\"], + [27612, 0, "n"], + [27613, 0, "o"], + [27614, 0, "d"], + [27615, 0, "e"], + [27616, 0, " "], + [27617, 0, "{"], + [27618, 0, "l"], + [27619, 0, "i"], + [27620, 0, "s"], + [27621, 0, "t"], + [27622, 0, "T"], + [27623, 0, "("], + [27624, 0, "`"], + [27625, 0, "`"], + [27626, 0, "a"], + [27627, 0, "'"], + [27628, 0, "'"], + [27629, 0, ")"], + [27630, 0, ":"], + [27631, 0, " "], + [27632, 0, "["], + [27633, 0, "`"], + [27634, 0, "`"], + [27635, 0, "z"], + [27636, 0, "'"], + [27637, 0, "'"], + [27638, 0, "]"], + [27639, 0, "\\"], + [27640, 0, "}"], + [27641, 0, "}"], + [27642, 0, ";"], + [27643, 0, " "], + [27644, 0, "\\"], + [27645, 0, "\\"], + [27646, 0, "\n"], + [27647, 0, "}"], + [27648, 0, ";"], + [27649, 0, "\n"], + [27650, 0, "\\"], + [27651, 0, "d"], + [27652, 0, "r"], + [27653, 0, "a"], + [27654, 0, "w"], + [27655, 0, " "], + [27656, 0, "["], + [27657, 0, "t"], + [27658, 0, "h"], + [27659, 0, "i"], + [27660, 0, "c"], + [27661, 0, "k"], + [27662, 0, ","], + [27663, 0, "-"], + [27664, 0, ">"], + [27665, 0, " "], + [27665, 1], + [27665, 0, "]"], + [27666, 0, " "], + [27667, 0, "("], + [27668, 0, "l"], + [27669, 0, "e"], + [27670, 0, "f"], + [27671, 0, "t"], + [27672, 0, "1"], + [27673, 0, ")"], + [27674, 0, " "], + [27675, 0, " "], + [27676, 0, "t"], + [27677, 0, "o"], + [27678, 0, " "], + [27679, 0, "n"], + [27680, 0, "o"], + [27681, 0, "d"], + [27682, 0, "e"], + [27683, 0, " "], + [27684, 0, "["], + [27685, 0, "l"], + [27686, 0, "e"], + [27687, 0, "f"], + [27688, 0, "t"], + [27689, 0, " "], + [27689, 1], + [27689, 0, "]"], + [27690, 0, " "], + [27691, 0, " "], + [27692, 0, "{"], + [27693, 0, "d"], + [27694, 0, "o"], + [27695, 0, "c"], + [27696, 0, "."], + [27697, 0, "g"], + [27698, 0, "e"], + [27699, 0, "t"], + [27700, 0, "("], + [27701, 0, "`"], + [27702, 0, "`"], + [27703, 0, "a"], + [27704, 0, "'"], + [27705, 0, "'"], + [27706, 0, ")"], + [27707, 0, " "], + [27708, 0, ":"], + [27709, 0, "="], + [27710, 0, " "], + [27711, 0, "\\"], + [27712, 0, "{"], + [27713, 0, "\\"], + [27714, 0, "}"], + [27715, 0, ";"], + [27716, 0, "}"], + [27717, 0, " "], + [27718, 0, "("], + [27719, 0, "l"], + [27720, 0, "e"], + [27721, 0, "f"], + [27722, 0, "t"], + [27723, 0, "2"], + [27724, 0, ")"], + [27725, 0, ";"], + [27726, 0, "\n"], + [27727, 0, "\\"], + [27728, 0, "d"], + [27729, 0, "r"], + [27730, 0, "a"], + [27731, 0, "w"], + [27732, 0, " "], + [27733, 0, "["], + [27734, 0, "t"], + [27735, 0, "h"], + [27736, 0, "i"], + [27737, 0, "c"], + [27738, 0, "k"], + [27739, 0, ","], + [27740, 0, "-"], + [27741, 0, ">"], + [27742, 0, " "], + [27742, 1], + [27742, 0, "]"], + [27743, 0, " "], + [27744, 0, "("], + [27745, 0, "l"], + [27746, 0, "e"], + [27747, 0, "f"], + [27748, 0, "t"], + [27749, 0, "2"], + [27750, 0, ")"], + [27751, 0, " "], + [27752, 0, " "], + [27753, 0, "t"], + [27754, 0, "o"], + [27755, 0, " "], + [27756, 0, "n"], + [27757, 0, "o"], + [27758, 0, "d"], + [27759, 0, "e"], + [27760, 0, " "], + [27761, 0, "["], + [27762, 0, "l"], + [27763, 0, "e"], + [27764, 0, "f"], + [27765, 0, "t"], + [27766, 0, "]"], + [27767, 0, " "], + [27768, 0, " "], + [27769, 0, "("], + [27770, 0, "d"], + [27771, 0, "o"], + [27772, 0, "c"], + [27773, 0, "."], + [27774, 0, "g"], + [27775, 0, "e"], + [27776, 0, "t"], + [27777, 0, "("], + [27778, 0, "`"], + [27779, 0, "`"], + [27780, 0, "a"], + [27781, 0, "'"], + [27782, 0, "'"], + [27783, 0, ")"], + [27784, 0, "."], + [27785, 0, "g"], + [27786, 0, "e"], + [27787, 0, "t"], + [27788, 0, "("], + [27789, 0, "`"], + [27790, 0, "`"], + [27791, 0, "x"], + [27792, 0, "'"], + [27793, 0, "'"], + [27794, 0, ")"], + [27795, 0, " "], + [27796, 0, ":"], + [27797, 0, "="], + [27798, 0, " "], + [27799, 0, "`"], + [27800, 0, "`"], + [27801, 0, "y"], + [27802, 0, "'"], + [27803, 0, "'"], + [27804, 0, ";"], + [27805, 0, "}"], + [27806, 0, " "], + [27807, 0, "("], + [27808, 0, "l"], + [27809, 0, "e"], + [27810, 0, "f"], + [27811, 0, "t"], + [27812, 0, "3"], + [27813, 0, ")"], + [27814, 0, ";"], + [27815, 0, "\n"], + [27816, 0, "\\"], + [27817, 0, "d"], + [27818, 0, "r"], + [27819, 0, "a"], + [27820, 0, "w"], + [27821, 0, " "], + [27822, 0, "["], + [27823, 0, "t"], + [27824, 0, "h"], + [27825, 0, "i"], + [27826, 0, "c"], + [27827, 0, "k"], + [27828, 0, ","], + [27829, 0, "-"], + [27830, 0, ">"], + [27831, 0, " "], + [27831, 1], + [27831, 0, "]"], + [27832, 0, " "], + [27833, 0, "("], + [27834, 0, "r"], + [27835, 0, "i"], + [27836, 0, "g"], + [27837, 0, "h"], + [27838, 0, "t"], + [27839, 0, "1"], + [27840, 0, ")"], + [27841, 0, " "], + [27842, 0, "t"], + [27843, 0, "o"], + [27844, 0, " "], + [27845, 0, "n"], + [27846, 0, "o"], + [27847, 0, "d"], + [27848, 0, "e"], + [27849, 0, " "], + [27850, 0, "["], + [27851, 0, "r"], + [27852, 0, "i"], + [27853, 0, "g"], + [27854, 0, "h"], + [27855, 0, "t"], + [27856, 0, "]"], + [27857, 0, " "], + [27769, 1], + [27769, 0, "{"], + [27858, 0, "{"], + [27859, 0, "d"], + [27860, 0, "o"], + [27861, 0, "c"], + [27862, 0, "."], + [27863, 0, "g"], + [27864, 0, "e"], + [27865, 0, "t"], + [27866, 0, "("], + [27867, 0, "`"], + [27868, 0, "`"], + [27869, 0, "a"], + [27870, 0, "'"], + [27871, 0, "'"], + [27872, 0, ")"], + [27873, 0, " "], + [27874, 0, ":"], + [27875, 0, "="], + [27876, 0, " "], + [27877, 0, "["], + [27878, 0, "]"], + [27879, 0, ";"], + [27880, 0, "}"], + [27881, 0, " "], + [27882, 0, "("], + [27883, 0, "r"], + [27884, 0, "i"], + [27885, 0, "g"], + [27886, 0, "h"], + [27887, 0, "t"], + [27888, 0, "2"], + [27889, 0, ")"], + [27890, 0, ";"], + [27891, 0, "\n"], + [27892, 0, "\\"], + [27893, 0, "d"], + [27894, 0, "r"], + [27895, 0, "a"], + [27896, 0, "w"], + [27897, 0, " "], + [27898, 0, "["], + [27899, 0, "t"], + [27900, 0, "h"], + [27901, 0, "i"], + [27902, 0, "c"], + [27903, 0, "k"], + [27904, 0, ","], + [27905, 0, "-"], + [27906, 0, ">"], + [27907, 0, " "], + [27908, 0, "]"], + [27908, 1], + [27907, 1], + [27907, 0, "]"], + [27908, 0, " "], + [27909, 0, "("], + [27910, 0, "r"], + [27911, 0, "i"], + [27912, 0, "g"], + [27913, 0, "h"], + [27914, 0, "t"], + [27915, 0, "2"], + [27916, 0, ")"], + [27917, 0, " "], + [27918, 0, "t"], + [27919, 0, "o"], + [27920, 0, " "], + [27921, 0, "n"], + [27922, 0, "o"], + [27923, 0, "d"], + [27924, 0, "e"], + [27925, 0, " "], + [27926, 0, "["], + [27927, 0, "r"], + [27928, 0, "i"], + [27929, 0, "g"], + [27930, 0, "h"], + [27931, 0, "t"], + [27932, 0, "]"], + [27933, 0, " "], + [27934, 0, "{"], + [27935, 0, "d"], + [27936, 0, "o"], + [27937, 0, "c"], + [27938, 0, "."], + [27939, 0, "g"], + [27940, 0, "e"], + [27941, 0, "t"], + [27942, 0, "("], + [27943, 0, "`"], + [27944, 0, "`"], + [27945, 0, "a"], + [27946, 0, "'"], + [27947, 0, "'"], + [27948, 0, ")"], + [27949, 0, " "], + [27949, 1], + [27949, 0, "."], + [27950, 0, "i"], + [27951, 0, "d"], + [27952, 0, "x"], + [27953, 0, "("], + [27954, 0, "0"], + [27955, 0, ")"], + [27956, 0, "."], + [27957, 0, "i"], + [27958, 0, "n"], + [27959, 0, "s"], + [27960, 0, "e"], + [27961, 0, "r"], + [27962, 0, "t"], + [27963, 0, "("], + [27964, 0, "`"], + [27965, 0, "`"], + [27966, 0, "z"], + [27967, 0, "'"], + [27968, 0, "'"], + [27969, 0, ")"], + [27970, 0, ";"], + [27971, 0, "}"], + [27972, 0, " "], + [27973, 0, "("], + [27974, 0, "r"], + [27975, 0, "i"], + [27976, 0, "g"], + [27977, 0, "h"], + [27978, 0, "t"], + [27979, 0, "3"], + [27980, 0, ")"], + [27981, 0, ";"], + [27982, 0, "\n"], + [27983, 0, "\\"], + [27984, 0, "d"], + [27985, 0, "r"], + [27986, 0, "a"], + [27987, 0, "w"], + [27988, 0, " "], + [27989, 0, "["], + [27990, 0, "t"], + [27991, 0, "h"], + [27992, 0, "i"], + [27993, 0, "c"], + [27994, 0, "k"], + [27995, 0, ","], + [27996, 0, "-"], + [27997, 0, ">"], + [27998, 0, "]"], + [27999, 0, " "], + [28000, 0, "("], + [28001, 0, "l"], + [28002, 0, "e"], + [28003, 0, "f"], + [28004, 0, "t"], + [28005, 0, "3"], + [28006, 0, ")"], + [28007, 0, " "], + [28008, 0, " "], + [28009, 0, "t"], + [28010, 0, "o"], + [28011, 0, " "], + [28012, 0, "n"], + [28012, 1], + [28012, 0, "("], + [28013, 0, "l"], + [28014, 0, "e"], + [28015, 0, "f"], + [28016, 0, "t"], + [28017, 0, "4"], + [28018, 0, ")"], + [28019, 0, ";"], + [28020, 0, "\n"], + [28021, 0, "\\"], + [28022, 0, "d"], + [28023, 0, "r"], + [28024, 0, "a"], + [28025, 0, "w"], + [28026, 0, " "], + [28027, 0, "["], + [28028, 0, "t"], + [28029, 0, "h"], + [28030, 0, "i"], + [28031, 0, "c"], + [28032, 0, "k"], + [28033, 0, ","], + [28034, 0, "-"], + [28035, 0, ">"], + [28036, 0, "]"], + [28037, 0, " "], + [28038, 0, "("], + [28039, 0, "l"], + [28039, 1], + [28039, 0, "r"], + [28040, 0, "i"], + [28041, 0, "g"], + [28042, 0, "h"], + [28043, 0, "t"], + [28044, 0, "3"], + [28045, 0, ")"], + [28046, 0, " "], + [28047, 0, "t"], + [28048, 0, "o"], + [28049, 0, " "], + [28050, 0, "("], + [28051, 0, "r"], + [28052, 0, "i"], + [28053, 0, "g"], + [28054, 0, "h"], + [28055, 0, "t"], + [28056, 0, "4"], + [28057, 0, ")"], + [28058, 0, ";"], + [28059, 0, "\n"], + [28060, 0, "\\"], + [28061, 0, "d"], + [28062, 0, "r"], + [28063, 0, "a"], + [28064, 0, "w"], + [28065, 0, " "], + [28066, 0, "["], + [28067, 0, "t"], + [28068, 0, "h"], + [28069, 0, "i"], + [28070, 0, "c"], + [28071, 0, "k"], + [28072, 0, ","], + [28073, 0, "d"], + [28074, 0, "a"], + [28075, 0, "s"], + [28076, 0, "h"], + [28077, 0, "e"], + [28078, 0, "d"], + [28079, 0, ","], + [28080, 0, "b"], + [28081, 0, "l"], + [28082, 0, "u"], + [28083, 0, "e"], + [28084, 0, ","], + [28085, 0, "-"], + [28086, 0, ">"], + [28087, 0, "]"], + [28088, 0, " "], + [28089, 0, "("], + [28090, 0, "l"], + [28091, 0, "e"], + [28092, 0, "f"], + [28093, 0, "t"], + [28094, 0, "3"], + [28095, 0, "."], + [28096, 0, "s"], + [28097, 0, "o"], + [28098, 0, "u"], + [28099, 0, "t"], + [28100, 0, "h"], + [28101, 0, ")"], + [28102, 0, " "], + [28103, 0, " "], + [28104, 0, "t"], + [28105, 0, "o"], + [28106, 0, " "], + [28107, 0, "["], + [28108, 0, "o"], + [28109, 0, "u"], + [28110, 0, "t"], + [28111, 0, "="], + [28112, 0, "2"], + [28113, 0, "7"], + [28114, 0, "0"], + [28115, 0, ","], + [28116, 0, "i"], + [28117, 0, "n"], + [28118, 0, "="], + [28119, 0, "1"], + [28120, 0, "3"], + [28121, 0, "5"], + [28122, 0, "]"], + [28123, 0, " "], + [28124, 0, "("], + [28125, 0, "r"], + [28126, 0, "i"], + [28127, 0, "g"], + [28128, 0, "h"], + [28129, 0, "t"], + [28130, 0, "4"], + [28131, 0, "."], + [28132, 0, "n"], + [28133, 0, "o"], + [28134, 0, "r"], + [28135, 0, "t"], + [28136, 0, "h"], + [28137, 0, " "], + [28138, 0, "w"], + [28139, 0, "e"], + [28140, 0, "s"], + [28141, 0, "t"], + [28142, 0, ")"], + [28143, 0, ";"], + [28144, 0, "\n"], + [28145, 0, "\\"], + [28146, 0, "d"], + [28147, 0, "r"], + [28148, 0, "a"], + [28149, 0, "w"], + [28150, 0, " "], + [28151, 0, "["], + [28152, 0, "t"], + [28153, 0, "h"], + [28154, 0, "i"], + [28155, 0, "c"], + [28156, 0, "k"], + [28157, 0, ","], + [28158, 0, "d"], + [28159, 0, "a"], + [28160, 0, "s"], + [28161, 0, "h"], + [28162, 0, "e"], + [28163, 0, "d"], + [28164, 0, ","], + [28165, 0, "b"], + [28166, 0, "l"], + [28167, 0, "u"], + [28168, 0, "e"], + [28169, 0, ","], + [28170, 0, "-"], + [28171, 0, ">"], + [28172, 0, " "], + [28173, 0, "["], + [28173, 1], + [28172, 1], + [28172, 0, "]"], + [28173, 0, " "], + [28174, 0, "("], + [28175, 0, "r"], + [28176, 0, "i"], + [28177, 0, "g"], + [28178, 0, "h"], + [28179, 0, "t"], + [28180, 0, "3"], + [28181, 0, "."], + [28182, 0, "s"], + [28183, 0, "o"], + [28184, 0, "u"], + [28185, 0, "t"], + [28186, 0, "h"], + [28187, 0, ")"], + [28188, 0, " "], + [28189, 0, "t"], + [28190, 0, "o"], + [28191, 0, " "], + [28192, 0, "["], + [28193, 0, "o"], + [28194, 0, "u"], + [28195, 0, "t"], + [28196, 0, "="], + [28197, 0, "2"], + [28198, 0, "7"], + [28199, 0, "0"], + [28200, 0, ","], + [28201, 0, "i"], + [28202, 0, "n"], + [28203, 0, "="], + [28204, 0, "4"], + [28205, 0, "5"], + [28206, 0, "]"], + [28207, 0, " "], + [28208, 0, " "], + [28209, 0, "("], + [28210, 0, "l"], + [28211, 0, "e"], + [28212, 0, "f"], + [28213, 0, "t"], + [28214, 0, "4"], + [28215, 0, "."], + [28216, 0, "n"], + [28217, 0, "o"], + [28218, 0, "r"], + [28219, 0, "t"], + [28220, 0, "h"], + [28221, 0, " "], + [28222, 0, "e"], + [28223, 0, "a"], + [28224, 0, "s"], + [28225, 0, "t"], + [28226, 0, ")"], + [28227, 0, ";"], + [27006, 1], + [27006, 0, "7"], + [26997, 1], + [26996, 1], + [26995, 1], + [26995, 0, "1"], + [27647, 0, "\n"], + [27648, 0, "\\"], + [27649, 0, "n"], + [27650, 0, "o"], + [27651, 0, "d"], + [27652, 0, "e"], + [27653, 0, " "], + [27654, 0, "("], + [27655, 0, "c"], + [27656, 0, "o"], + [27657, 0, "m"], + [27658, 0, "m"], + [27659, 0, "s"], + [27660, 0, ")"], + [27661, 0, " "], + [27662, 0, " "], + [27663, 0, "a"], + [27664, 0, "t"], + [27665, 0, " "], + [27666, 0, "("], + [27667, 0, "4"], + [27668, 0, ","], + [27669, 0, "1"], + [27670, 0, "."], + [27671, 0, "5"], + [27672, 0, ")"], + [27673, 0, " "], + [27674, 0, "["], + [27675, 0, "t"], + [27676, 0, "e"], + [27677, 0, "x"], + [27678, 0, "t"], + [27679, 0, "="], + [27680, 0, "b"], + [27681, 0, "l"], + [27682, 0, "u"], + [27683, 0, "e"], + [27684, 0, "]"], + [27685, 0, " "], + [27686, 0, "{"], + [27687, 0, "\\"], + [27688, 0, "f"], + [27689, 0, "o"], + [27690, 0, "o"], + [27691, 0, "t"], + [27692, 0, "n"], + [27693, 0, "o"], + [27694, 0, "t"], + [27695, 0, "e"], + [27696, 0, "s"], + [27697, 0, "i"], + [27698, 0, "z"], + [27699, 0, "e"], + [27700, 0, " "], + [27701, 0, "n"], + [27702, 0, "e"], + [27703, 0, "t"], + [27704, 0, "w"], + [27705, 0, "o"], + [27706, 0, "r"], + [27707, 0, "k"], + [27708, 0, " "], + [27709, 0, "c"], + [27710, 0, "o"], + [27711, 0, "m"], + [27712, 0, "m"], + [27713, 0, "u"], + [27714, 0, "n"], + [27715, 0, "i"], + [27716, 0, "c"], + [27717, 0, "a"], + [27718, 0, "t"], + [27719, 0, "i"], + [27720, 0, "o"], + [27721, 0, "n"], + [27722, 0, "}"], + [27723, 0, ";"], + [27671, 1], + [27670, 1], + [27669, 1], + [27669, 0, "2"], + [27670, 0, "."], + [27671, 0, "0"], + [79206, 0, "/"], + [79207, 0, "B"], + [79208, 0, "e"], + [79209, 0, "r"], + [79210, 0, "e"], + [79211, 0, "s"], + [79212, 0, "f"], + [79213, 0, "o"], + [79214, 0, "r"], + [79215, 0, "d"], + [79216, 0, "\n"], + [79215, 1], + [79214, 1], + [79213, 1], + [79212, 1], + [79211, 1], + [79210, 1], + [79209, 1], + [79208, 1], + [79207, 1], + [79206, 1], + [79206, 1], + [82614, 0, "d"], + [82615, 0, "w"], + [82629, 1], + [82628, 1], + [82627, 1], + [82626, 1], + [82625, 1], + [82624, 1], + [82623, 1], + [82622, 1], + [82621, 1], + [82620, 1], + [82619, 1], + [82618, 1], + [82617, 1], + [82616, 1], + [82615, 1], + [82614, 1], + [82614, 0, "M"], + [82615, 0, "o"], + [82616, 0, "r"], + [82617, 0, "e"], + [82618, 0, " "], + [82619, 0, "r"], + [82620, 0, "e"], + [82621, 0, "c"], + [82622, 0, "e"], + [82623, 0, "n"], + [82624, 0, "t"], + [82625, 0, "l"], + [82626, 0, "y"], + [82627, 0, " "], + [82628, 0, "h"], + [82629, 0, "e"], + [82630, 0, " "], + [82631, 0, "h"], + [82631, 1], + [82630, 1], + [82629, 1], + [82628, 1], + [82627, 1], + [82626, 1], + [82625, 1], + [82624, 1], + [82623, 1], + [82622, 1], + [82621, 1], + [82620, 1], + [82619, 1], + [82618, 1], + [82617, 1], + [82616, 1], + [82615, 1], + [82614, 1], + [82614, 0, "H"], + [82615, 0, "i"], + [82616, 0, "s"], + [82617, 0, " "], + [82618, 0, "c"], + [82619, 0, "u"], + [82620, 0, "r"], + [82621, 0, "r"], + [82622, 0, "e"], + [82623, 0, "n"], + [82624, 0, "t"], + [82625, 0, " "], + [82626, 0, "r"], + [82627, 0, "e"], + [82628, 0, "s"], + [82629, 0, "e"], + [82630, 0, "a"], + [82631, 0, "r"], + [82632, 0, "c"], + [82633, 0, "h"], + [82634, 0, " "], + [82635, 0, "w"], + [82636, 0, "i"], + [82637, 0, "t"], + [82637, 1], + [82636, 1], + [82635, 1], + [82635, 0, "i"], + [82636, 0, "n"], + [82637, 0, "t"], + [82638, 0, "e"], + [82639, 0, "r"], + [82640, 0, "e"], + [82641, 0, "s"], + [82642, 0, "t"], + [82643, 0, "e"], + [82643, 1], + [82643, 0, "s"], + [82644, 0, " "], + [82645, 0, "c"], + [82646, 0, "o"], + [82647, 0, "v"], + [82648, 0, "e"], + [82649, 0, "r"], + [82650, 0, " "], + [82650, 1], + [82649, 1], + [82648, 1], + [82647, 1], + [82646, 1], + [82645, 1], + [82644, 1], + [82644, 0, " "], + [82645, 0, "i"], + [82646, 0, "n"], + [82647, 0, "c"], + [82648, 0, "l"], + [82649, 0, "u"], + [82650, 0, "d"], + [82651, 0, "e"], + [82651, 1], + [82650, 1], + [82649, 1], + [82648, 1], + [82647, 1], + [82646, 1], + [82646, 0, "f"], + [82647, 0, "o"], + [82647, 1], + [82646, 1], + [82645, 1], + [82644, 1], + [82643, 1], + [82642, 1], + [82641, 1], + [82640, 1], + [82639, 1], + [82638, 1], + [82637, 1], + [82636, 1], + [82635, 1], + [82635, 0, "w"], + [82636, 0, "o"], + [82637, 0, "r"], + [82638, 0, "k"], + [82639, 0, " "], + [82640, 0, "e"], + [82641, 0, "x"], + [82642, 0, "p"], + [82643, 0, "o"], + [82644, 0, "r"], + [82645, 0, "e"], + [82645, 1], + [82644, 1], + [82643, 1], + [82643, 0, "l"], + [82644, 0, "o"], + [82645, 0, "r"], + [82646, 0, "e"], + [82647, 0, "s"], + [82648, 0, " "], + [82649, 0, "t"], + [82650, 0, "h"], + [82651, 0, "e"], + [82652, 0, " "], + [82653, 0, "s"], + [82654, 0, "e"], + [82655, 0, "c"], + [82656, 0, "u"], + [82657, 0, "r"], + [82658, 0, "i"], + [82659, 0, "t"], + [82660, 0, "y"], + [82661, 0, " "], + [82662, 0, "a"], + [82663, 0, "n"], + [82664, 0, "d"], + [82665, 0, " "], + [82666, 0, "p"], + [82667, 0, "r"], + [82668, 0, "i"], + [82669, 0, "v"], + [82670, 0, "a"], + [82671, 0, "c"], + [82672, 0, "y"], + [82673, 0, " "], + [82674, 0, "o"], + [82675, 0, "f"], + [82676, 0, " "], + [82677, 0, "l"], + [82678, 0, "a"], + [82679, 0, "r"], + [82680, 0, "g"], + [82681, 0, "e"], + [82682, 0, "-"], + [82683, 0, "s"], + [82684, 0, "c"], + [82685, 0, "a"], + [82686, 0, "l"], + [82687, 0, "e"], + [82688, 0, " "], + [82689, 0, "d"], + [82690, 0, "i"], + [82691, 0, "s"], + [82692, 0, "t"], + [82693, 0, "r"], + [82694, 0, "i"], + [82695, 0, "b"], + [82696, 0, "u"], + [82697, 0, "t"], + [82698, 0, "e"], + [82699, 0, "d"], + [82700, 0, " "], + [82701, 0, "s"], + [82702, 0, "y"], + [82703, 0, "s"], + [82704, 0, "t"], + [82705, 0, "e"], + [82706, 0, "m"], + [82707, 0, "s"], + [82708, 0, ","], + [82709, 0, " "], + [82710, 0, "w"], + [82711, 0, "i"], + [82712, 0, "t"], + [82713, 0, "h"], + [82714, 0, " "], + [82715, 0, "p"], + [82715, 1], + [82715, 0, "a"], + [82716, 0, " "], + [82717, 0, "p"], + [82718, 0, "a"], + [82719, 0, "r"], + [82720, 0, "t"], + [82721, 0, "i"], + [82722, 0, "c"], + [82723, 0, "u"], + [82724, 0, "l"], + [82725, 0, "a"], + [82726, 0, "r"], + [82727, 0, " "], + [82728, 0, "f"], + [82729, 0, "o"], + [82730, 0, "c"], + [82731, 0, "u"], + [82732, 0, "s"], + [82733, 0, " "], + [82734, 0, "o"], + [82735, 0, "n"], + [82736, 0, " "], + [82737, 0, "m"], + [82738, 0, "o"], + [82739, 0, "b"], + [82740, 0, "i"], + [82740, 1], + [82739, 1], + [82738, 1], + [82737, 1], + [82737, 0, "n"], + [82738, 0, "e"], + [82739, 0, "t"], + [82740, 0, "o"], + [82741, 0, "w"], + [82742, 0, "k"], + [82743, 0, "r"], + [82743, 1], + [82742, 1], + [82741, 1], + [82740, 1], + [82740, 0, "w"], + [82741, 0, "o"], + [82742, 0, "r"], + [82743, 0, "k"], + [82744, 0, "e"], + [82745, 0, "d"], + [82746, 0, " "], + [82747, 0, "m"], + [82748, 0, "o"], + [82749, 0, "i"], + [82750, 0, "l"], + [82750, 1], + [82749, 1], + [82749, 0, "b"], + [82750, 0, "i"], + [82751, 0, "l"], + [82752, 0, "e"], + [82753, 0, " "], + [82754, 0, "d"], + [82755, 0, "e"], + [82756, 0, "v"], + [82757, 0, "i"], + [82758, 0, "c"], + [82759, 0, "e"], + [82760, 0, "s"], + [82761, 0, " "], + [82762, 0, "s"], + [82763, 0, "u"], + [82764, 0, "c"], + [82765, 0, "h"], + [82766, 0, " "], + [82767, 0, "a"], + [82768, 0, "s"], + [82769, 0, " "], + [82770, 0, "s"], + [82771, 0, "m"], + [82772, 0, "a"], + [82773, 0, "r"], + [82774, 0, "t"], + [82775, 0, "p"], + [82776, 0, "h"], + [82777, 0, "o"], + [82778, 0, "n"], + [82779, 0, "e"], + [82780, 0, "s"], + [82781, 0, " "], + [82781, 1], + [82781, 0, ","], + [82782, 0, " "], + [82783, 0, "t"], + [82784, 0, "a"], + [82785, 0, "b"], + [82786, 0, "l"], + [82787, 0, "e"], + [82788, 0, "t"], + [82789, 0, "s"], + [82790, 0, " "], + [82791, 0, "a"], + [82792, 0, "n"], + [82793, 0, "d"], + [82794, 0, " "], + [82795, 0, "l"], + [82796, 0, "a"], + [82797, 0, "b"], + [82797, 1], + [82797, 0, "p"], + [82798, 0, "t"], + [82799, 0, "o"], + [82800, 0, "p"], + [82801, 0, "s"], + [82802, 0, "."], + [82611, 1], + [82610, 1], + [82609, 1], + [82608, 1], + [82607, 1], + [82606, 1], + [82605, 1], + [82604, 1], + [82603, 1], + [82602, 1], + [82601, 1], + [82600, 1], + [82599, 1], + [82598, 1], + [82597, 1], + [82596, 1], + [82595, 1], + [82594, 1], + [82593, 1], + [82592, 1], + [82591, 1], + [82590, 1], + [82589, 1], + [82588, 1], + [82587, 1], + [82586, 1], + [82585, 1], + [82584, 1], + [82583, 1], + [82582, 1], + [82581, 1], + [82580, 1], + [82579, 1], + [82578, 1], + [82577, 1], + [82576, 1], + [82575, 1], + [82574, 1], + [82573, 1], + [82572, 1], + [82571, 1], + [82570, 1], + [82569, 1], + [82568, 1], + [82567, 1], + [82566, 1], + [82565, 1], + [82564, 1], + [82563, 1], + [82562, 1], + [82561, 1], + [82560, 1], + [82559, 1], + [82558, 1], + [82557, 1], + [82556, 1], + [82555, 1], + [82554, 1], + [82553, 1], + [82552, 1], + [82551, 1], + [82550, 1], + [82549, 1], + [82548, 1], + [82547, 1], + [82546, 1], + [82545, 1], + [82544, 1], + [82543, 1], + [82543, 0, "e"], + [82544, 0, "x"], + [82545, 0, "p"], + [82546, 0, "l"], + [82547, 0, "o"], + [82548, 0, "r"], + [82549, 0, "e"], + [82550, 0, "d"], + [82551, 0, " "], + [82552, 0, "t"], + [82553, 0, "h"], + [82554, 0, "e"], + [82555, 0, " "], + [82556, 0, "e"], + [82557, 0, "f"], + [82558, 0, "f"], + [82559, 0, "e"], + [82560, 0, "c"], + [82561, 0, "t"], + [82562, 0, "i"], + [82563, 0, "v"], + [82564, 0, "e"], + [82565, 0, "n"], + [82566, 0, "e"], + [82567, 0, "s"], + [82568, 0, "s"], + [82569, 0, " "], + [82570, 0, "o"], + [82571, 0, "f"], + [82572, 0, " "], + [82573, 0, "a"], + [82574, 0, "n"], + [82575, 0, "o"], + [82576, 0, "n"], + [82577, 0, "y"], + [82578, 0, "m"], + [82579, 0, "i"], + [82580, 0, "t"], + [82581, 0, "y"], + [82582, 0, " "], + [82583, 0, "a"], + [82584, 0, "s"], + [82585, 0, " "], + [82586, 0, "a"], + [82587, 0, " "], + [82588, 0, "m"], + [82589, 0, "e"], + [82590, 0, "a"], + [82591, 0, "n"], + [82592, 0, "s"], + [82593, 0, " "], + [82594, 0, "o"], + [82595, 0, "f"], + [82596, 0, " "], + [82597, 0, "p"], + [82598, 0, "r"], + [82599, 0, "o"], + [82600, 0, "v"], + [82601, 0, "i"], + [82602, 0, "d"], + [82603, 0, "e"], + [82603, 1], + [82603, 0, "i"], + [82604, 0, "n"], + [82605, 0, "g"], + [82606, 0, " "], + [82607, 0, "l"], + [82608, 0, "o"], + [82609, 0, "c"], + [82610, 0, "a"], + [82611, 0, "t"], + [82612, 0, "i"], + [82613, 0, "o"], + [82614, 0, "n"], + [82615, 0, " "], + [82616, 0, "p"], + [82617, 0, "r"], + [82618, 0, "o"], + [82619, 0, "v"], + [82620, 0, "a"], + [82620, 1], + [82619, 1], + [82618, 1], + [82618, 0, "i"], + [82619, 0, "v"], + [82620, 0, "a"], + [82621, 0, "c"], + [82622, 0, "y"], + [82623, 0, " "], + [82624, 0, "i"], + [82625, 0, "n"], + [82626, 0, " "], + [82627, 0, "a"], + [82628, 0, " "], + [82629, 0, "m"], + [82630, 0, "o"], + [82631, 0, "b"], + [82632, 0, "i"], + [82633, 0, "l"], + [82634, 0, "e"], + [82635, 0, " "], + [82636, 0, "c"], + [82637, 0, "o"], + [82638, 0, "m"], + [82639, 0, "p"], + [82640, 0, "u"], + [82641, 0, "t"], + [82642, 0, "i"], + [82643, 0, "n"], + [82644, 0, "g"], + [82645, 0, " "], + [82646, 0, "s"], + [82647, 0, "e"], + [82648, 0, "t"], + [82649, 0, "t"], + [82650, 0, "i"], + [82651, 0, "n"], + [82652, 0, "g"], + [82543, 0, "w"], + [82544, 0, "h"], + [82545, 0, "i"], + [82546, 0, "h"], + [82547, 0, "c"], + [82547, 1], + [82546, 1], + [82546, 0, "c"], + [82547, 0, "h"], + [82548, 0, " "], + [82659, 1], + [82658, 1], + [82657, 1], + [82656, 1], + [82655, 1], + [82654, 1], + [82653, 1], + [82652, 1], + [82651, 1], + [82650, 1], + [82649, 1], + [82648, 1], + [82647, 1], + [82646, 1], + [82645, 1], + [82644, 1], + [82643, 1], + [82642, 1], + [82641, 1], + [82640, 1], + [82639, 1], + [82638, 1], + [82637, 1], + [82636, 1], + [82635, 1], + [82634, 1], + [82633, 1], + [82632, 1], + [82631, 1], + [82630, 1], + [82629, 1], + [82628, 1], + [82627, 1], + [82626, 1], + [82625, 1], + [82624, 1], + [82623, 1], + [82622, 1], + [82621, 1], + [82620, 1], + [82619, 1], + [82618, 1], + [82617, 1], + [82616, 1], + [82615, 1], + [82614, 1], + [82613, 1], + [82612, 1], + [82611, 1], + [82610, 1], + [82609, 1], + [82608, 1], + [82607, 1], + [82606, 1], + [82605, 1], + [82604, 1], + [82603, 1], + [82602, 1], + [82601, 1], + [82600, 1], + [82599, 1], + [82598, 1], + [82597, 1], + [82596, 1], + [82595, 1], + [82594, 1], + [82593, 1], + [82592, 1], + [82591, 1], + [82590, 1], + [82589, 1], + [82588, 1], + [82587, 1], + [82586, 1], + [82585, 1], + [82584, 1], + [82583, 1], + [82582, 1], + [82581, 1], + [82580, 1], + [82579, 1], + [82578, 1], + [82577, 1], + [82576, 1], + [82575, 1], + [82574, 1], + [82573, 1], + [82572, 1], + [82571, 1], + [82570, 1], + [82569, 1], + [82568, 1], + [82567, 1], + [82566, 1], + [82565, 1], + [82564, 1], + [82563, 1], + [82562, 1], + [82561, 1], + [82560, 1], + [82559, 1], + [82558, 1], + [82557, 1], + [82556, 1], + [82555, 1], + [82554, 1], + [82553, 1], + [82552, 1], + [82551, 1], + [82550, 1], + [82549, 1], + [82548, 1], + [82547, 1], + [82546, 1], + [82545, 1], + [82544, 1], + [82543, 1], + [82542, 1], + [82541, 1], + [82540, 1], + [82539, 1], + [82538, 1], + [82537, 1], + [82536, 1], + [82535, 1], + [82534, 1], + [82533, 1], + [82532, 1], + [82531, 1], + [82530, 1], + [82529, 1], + [82528, 1], + [82527, 1], + [82526, 1], + [82525, 1], + [82524, 1], + [82523, 1], + [82522, 1], + [82521, 1], + [82520, 1], + [82519, 1], + [82518, 1], + [82517, 1], + [82516, 1], + [82515, 1], + [82514, 1], + [82513, 1], + [82512, 1], + [82511, 1], + [82510, 1], + [82509, 1], + [82508, 1], + [82507, 1], + [82506, 1], + [82505, 1], + [82504, 1], + [82503, 1], + [82502, 1], + [82501, 1], + [82500, 1], + [82499, 1], + [82498, 1], + [82497, 1], + [82496, 1], + [82495, 1], + [82494, 1], + [82493, 1], + [82492, 1], + [82491, 1], + [82490, 1], + [82489, 1], + [82488, 1], + [82499, 1], + [82498, 1], + [82497, 1], + [82496, 1], + [82495, 1], + [82494, 1], + [82493, 1], + [82492, 1], + [82670, 0, " "], + [82671, 0, "H"], + [82672, 0, "e"], + [82673, 0, " "], + [82674, 0, "l"], + [82675, 0, "o"], + [82676, 0, "o"], + [82677, 0, "k"], + [82678, 0, "s"], + [82679, 0, " "], + [82680, 0, "a"], + [82681, 0, "t"], + [82682, 0, " "], + [82683, 0, "t"], + [82684, 0, "h"], + [82685, 0, "i"], + [82686, 0, "s"], + [82687, 0, " "], + [82688, 0, "d"], + [82689, 0, "o"], + [82690, 0, "m"], + [82691, 0, "a"], + [82692, 0, "i"], + [82693, 0, "n"], + [82694, 0, " "], + [82695, 0, "f"], + [82696, 0, "r"], + [82697, 0, "e"], + [82698, 0, "o"], + [82699, 0, "m"], + [82700, 0, " "], + [82701, 0, "t"], + [82702, 0, "h"], + [82703, 0, "r"], + [82704, 0, "e"], + [82705, 0, "e"], + [82706, 0, " "], + [82707, 0, "a"], + [82708, 0, "n"], + [82709, 0, "g"], + [82710, 0, "l"], + [82711, 0, "e"], + [82712, 0, "s"], + [82712, 1], + [82711, 1], + [82710, 1], + [82709, 1], + [82708, 1], + [82707, 1], + [82706, 1], + [82705, 1], + [82704, 1], + [82703, 1], + [82702, 1], + [82701, 1], + [82700, 1], + [82699, 1], + [82698, 1], + [82697, 1], + [82696, 1], + [82695, 1], + [82694, 1], + [82693, 1], + [82692, 1], + [82691, 1], + [82690, 1], + [82689, 1], + [82688, 1], + [82687, 1], + [82686, 1], + [82685, 1], + [82685, 0, "e"], + [82686, 0, " "], + [82687, 0, "s"], + [82688, 0, "e"], + [82689, 0, "c"], + [82690, 0, "u"], + [82691, 0, "r"], + [82692, 0, "i"], + [82693, 0, "t"], + [82694, 0, "y"], + [82695, 0, " "], + [82696, 0, "a"], + [82697, 0, "n"], + [82698, 0, "d"], + [82699, 0, " "], + [82700, 0, "p"], + [82701, 0, "r"], + [82702, 0, "i"], + [82703, 0, "v"], + [82704, 0, "a"], + [82705, 0, "c"], + [82706, 0, "y"], + [82707, 0, " "], + [82708, 0, "o"], + [82709, 0, "f"], + [82710, 0, " "], + [82711, 0, "t"], + [82712, 0, "h"], + [82713, 0, "e"], + [82714, 0, " "], + [82715, 0, "d"], + [82716, 0, "e"], + [82717, 0, "v"], + [82718, 0, "i"], + [82719, 0, "c"], + [82720, 0, "e"], + [82721, 0, "s"], + [82722, 0, " "], + [82723, 0, "t"], + [82724, 0, "h"], + [82725, 0, "e"], + [82726, 0, "m"], + [82727, 0, "s"], + [82728, 0, "e"], + [82729, 0, "l"], + [82730, 0, "v"], + [82731, 0, "e"], + [82732, 0, "s"], + [82733, 0, ","], + [82734, 0, " "], + [82735, 0, "a"], + [82736, 0, "s"], + [82737, 0, " "], + [82738, 0, "w"], + [82739, 0, "e"], + [82740, 0, "l"], + [82741, 0, "l"], + [82742, 0, " "], + [82743, 0, "a"], + [82744, 0, "s"], + [82745, 0, " "], + [82746, 0, "t"], + [82747, 0, "h"], + [82748, 0, "e"], + [82749, 0, " "], + [82750, 0, "s"], + [82751, 0, "e"], + [82752, 0, "u"], + [82753, 0, "c"], + [82754, 0, "r"], + [82754, 1], + [82753, 1], + [82752, 1], + [82752, 0, "c"], + [82753, 0, "u"], + [82754, 0, "r"], + [82755, 0, "i"], + [82756, 0, "t"], + [82757, 0, "y"], + [82758, 0, " "], + [82759, 0, "a"], + [82760, 0, "n"], + [82761, 0, "d"], + [82762, 0, " "], + [82763, 0, "p"], + [82764, 0, "r"], + [82765, 0, "o"], + [82766, 0, "v"], + [82766, 1], + [82765, 1], + [82765, 0, "i"], + [82766, 0, "v"], + [82767, 0, "a"], + [82768, 0, "c"], + [82769, 0, "y"], + [82770, 0, " "], + [82771, 0, "p"], + [82772, 0, "r"], + [82773, 0, "o"], + [82774, 0, "b"], + [82775, 0, "l"], + [82776, 0, "e"], + [82777, 0, "m"], + [82778, 0, "s"], + [82779, 0, " "], + [82780, 0, "i"], + [82781, 0, "n"], + [82782, 0, "d"], + [82783, 0, "u"], + [82784, 0, "c"], + [82785, 0, "e"], + [82786, 0, "d"], + [82787, 0, " "], + [82788, 0, "b"], + [82789, 0, "y"], + [82790, 0, " "], + [82791, 0, "t"], + [82792, 0, "h"], + [82793, 0, "e"], + [82794, 0, " "], + [82795, 0, "i"], + [82796, 0, "n"], + [82797, 0, "t"], + [82798, 0, "e"], + [82799, 0, "r"], + [82800, 0, "a"], + [82801, 0, "c"], + [82802, 0, "t"], + [82803, 0, "i"], + [82804, 0, "o"], + [82805, 0, "n"], + [82806, 0, " "], + [82807, 0, "b"], + [82808, 0, "e"], + [82809, 0, "t"], + [82810, 0, "w"], + [82811, 0, "e"], + [82812, 0, "e"], + [82813, 0, "n"], + [82814, 0, " "], + [82815, 0, "m"], + [82816, 0, "o"], + [82817, 0, "b"], + [82818, 0, "i"], + [82819, 0, "l"], + [82820, 0, "e"], + [82821, 0, " "], + [82822, 0, "d"], + [82823, 0, "e"], + [82824, 0, "v"], + [82825, 0, "i"], + [82826, 0, "c"], + [82827, 0, "e"], + [82828, 0, "s"], + [82829, 0, " "], + [82830, 0, "a"], + [82831, 0, "n"], + [82832, 0, "d"], + [82833, 0, " "], + [82834, 0, "c"], + [82835, 0, "l"], + [82836, 0, "o"], + [82837, 0, "u"], + [82838, 0, "b"], + [82838, 1], + [82838, 0, "d"], + [82839, 0, "-"], + [82840, 0, "b"], + [82841, 0, "a"], + [82842, 0, "s"], + [82843, 0, "e"], + [82844, 0, "d"], + [82845, 0, " "], + [82846, 0, "I"], + [82847, 0, "n"], + [82848, 0, "t"], + [82849, 0, "e"], + [82850, 0, "r"], + [82851, 0, "n"], + [82852, 0, "e"], + [82853, 0, "t"], + [82854, 0, " "], + [82855, 0, "s"], + [82856, 0, "e"], + [82857, 0, "r"], + [82858, 0, "v"], + [82859, 0, "i"], + [82860, 0, "c"], + [82861, 0, "e"], + [82862, 0, "s"], + [82863, 0, "."], + [81968, 0, " "], + [81969, 0, "i"], + [81970, 0, "s"], + [81976, 1], + [81976, 0, "i"], + [81977, 0, "n"], + [81978, 0, "g"], + [82304, 0, ","], + [82305, 0, " "], + [82306, 0, "i"], + [82307, 0, "n"], + [82308, 0, "c"], + [82309, 0, "l"], + [82310, 0, "u"], + [82311, 0, "d"], + [82312, 0, "i"], + [82313, 0, "n"], + [82314, 0, "g"], + [82315, 0, " "], + [82316, 0, "R"], + [82317, 0, "a"], + [82318, 0, "p"], + [82319, 0, "p"], + [82320, 0, "o"], + [82321, 0, "r"], + [82322, 0, "t"], + [82323, 0, "i"], + [82324, 0, "v"], + [82325, 0, "e"], + [82326, 0, " "], + [82327, 0, "a"], + [82328, 0, "n"], + [82329, 0, "d"], + [82330, 0, " "], + [82331, 0, "L"], + [82332, 0, "i"], + [82333, 0, "n"], + [82334, 0, "k"], + [82335, 0, "e"], + [82336, 0, "d"], + [82337, 0, "I"], + [82338, 0, "n"], + [17586, 0, ","], + [17587, 0, " "], + [17588, 0, "a"], + [17589, 0, "n"], + [17590, 0, "d"], + [17591, 0, " "], + [17592, 0, "g"], + [17593, 0, "i"], + [17594, 0, "v"], + [17595, 0, "e"], + [17596, 0, " "], + [17597, 0, "s"], + [17598, 0, "o"], + [17599, 0, "m"], + [17600, 0, "e"], + [17601, 0, " "], + [17602, 0, "e"], + [17603, 0, "x"], + [17604, 0, "a"], + [17605, 0, "m"], + [17606, 0, "p"], + [17607, 0, "l"], + [17608, 0, "e"], + [17609, 0, "s"], + [17610, 0, " "], + [17611, 0, "o"], + [17612, 0, "f"], + [17613, 0, " "], + [17613, 1], + [17612, 1], + [17611, 1], + [17610, 1], + [17609, 1], + [17608, 1], + [17607, 1], + [17606, 1], + [17605, 1], + [17604, 1], + [17603, 1], + [17602, 1], + [17601, 1], + [17600, 1], + [17599, 1], + [17598, 1], + [17597, 1], + [17596, 1], + [17595, 1], + [17594, 1], + [17593, 1], + [17592, 1], + [17592, 0, "i"], + [17593, 0, "l"], + [17594, 0, "l"], + [17595, 0, "u"], + [17596, 0, "s"], + [17597, 0, "t"], + [17598, 0, "r"], + [17599, 0, "a"], + [17600, 0, "t"], + [17601, 0, "e"], + [17602, 0, " "], + [17603, 0, "s"], + [17604, 0, "o"], + [17605, 0, "m"], + [17606, 0, "e"], + [17607, 0, " "], + [17608, 0, "p"], + [17609, 0, "e"], + [17610, 0, "c"], + [17611, 0, "u"], + [17612, 0, "l"], + [17613, 0, "i"], + [17614, 0, "a"], + [17615, 0, "r"], + [17616, 0, "i"], + [17617, 0, "t"], + [17618, 0, "i"], + [17619, 0, "e"], + [17620, 0, "s"], + [17621, 0, " "], + [17622, 0, "o"], + [17623, 0, "f"], + [17624, 0, " "], + [17625, 0, "c"], + [17626, 0, "o"], + [17627, 0, "n"], + [17628, 0, "c"], + [17629, 0, "u"], + [17630, 0, "r"], + [17631, 0, "r"], + [17632, 0, "e"], + [17633, 0, "n"], + [17634, 0, "t"], + [17635, 0, " "], + [17636, 0, "n"], + [17637, 0, "e"], + [17638, 0, "s"], + [17639, 0, "t"], + [17640, 0, "e"], + [17641, 0, "d"], + [17642, 0, " "], + [17643, 0, "s"], + [17644, 0, "t"], + [17645, 0, "r"], + [17646, 0, "u"], + [17647, 0, "c"], + [17648, 0, "t"], + [17649, 0, "u"], + [17650, 0, "r"], + [17651, 0, "e"], + [17652, 0, "s"], + [17653, 0, " "], + [17654, 0, "t"], + [17655, 0, "h"], + [17656, 0, "a"], + [17657, 0, "t"], + [17658, 0, " "], + [17659, 0, "d"], + [17660, 0, "o"], + [17661, 0, " "], + [17662, 0, "n"], + [17663, 0, "o"], + [17664, 0, "t"], + [17665, 0, " "], + [17666, 0, "a"], + [17667, 0, "r"], + [17668, 0, "i"], + [17669, 0, "s"], + [17670, 0, "e"], + [17671, 0, " "], + [17672, 0, "u"], + [17673, 0, "n"], + [17674, 0, "d"], + [17675, 0, "e"], + [17676, 0, "r"], + [17677, 0, " "], + [17677, 1], + [17676, 1], + [17675, 1], + [17674, 1], + [17673, 1], + [17672, 1], + [17672, 0, "i"], + [17673, 0, "n"], + [17674, 0, " "], + [17675, 0, "s"], + [17676, 0, "e"], + [17677, 0, "q"], + [17678, 0, "u"], + [17679, 0, "e"], + [17680, 0, "n"], + [17681, 0, "t"], + [17682, 0, "i"], + [17683, 0, "a"], + [17684, 0, "l"], + [17685, 0, " "], + [17686, 0, "e"], + [17687, 0, "x"], + [17688, 0, "e"], + [17689, 0, "c"], + [17690, 0, "u"], + [17691, 0, "t"], + [17692, 0, "i"], + [17693, 0, "o"], + [17694, 0, "n"], + [17695, 0, "s"], + [17643, 0, "d"], + [17644, 0, "a"], + [17645, 0, "t"], + [17646, 0, "a"], + [17647, 0, " "], + [27007, 0, "\\"], + [27008, 0, "l"], + [27009, 0, "a"], + [27010, 0, "b"], + [27011, 0, "e"], + [27012, 0, "l"], + [27013, 0, "{"], + [27014, 0, "f"], + [27015, 0, "i"], + [27016, 0, "g"], + [27017, 0, ":"], + [27018, 0, "t"], + [27019, 0, "e"], + [27020, 0, "x"], + [27021, 0, "t"], + [27022, 0, "-"], + [27023, 0, "e"], + [27024, 0, "d"], + [27025, 0, "i"], + [27026, 0, "t"], + [27027, 0, "}"], + [28537, 0, "\\"], + [28538, 0, "l"], + [28539, 0, "a"], + [28540, 0, "b"], + [28541, 0, "e"], + [28542, 0, "l"], + [28543, 0, "{"], + [28544, 0, "f"], + [28545, 0, "i"], + [28546, 0, "g"], + [28547, 0, ";"], + [28548, 0, "t"], + [28549, 0, "y"], + [28550, 0, "p"], + [28550, 1], + [28549, 1], + [28548, 1], + [28547, 1], + [28547, 0, ":"], + [28548, 0, "t"], + [28549, 0, "y"], + [28550, 0, "p"], + [28551, 0, "e"], + [28552, 0, "-"], + [28553, 0, "c"], + [28554, 0, "l"], + [28555, 0, "a"], + [28556, 0, "s"], + [28557, 0, "h"], + [28558, 0, "}"], + [19086, 0, "\n"], + [19087, 0, "\n"], + [17700, 1], + [17699, 1], + [17698, 1], + [17697, 1], + [17696, 1], + [17695, 1], + [17694, 1], + [17693, 1], + [17692, 1], + [17691, 1], + [17690, 1], + [17689, 1], + [17688, 1], + [17687, 1], + [17686, 1], + [17685, 1], + [17684, 1], + [17683, 1], + [17682, 1], + [17681, 1], + [17680, 1], + [17679, 1], + [17678, 1], + [17677, 1], + [17676, 1], + [17675, 1], + [17674, 1], + [17673, 1], + [17672, 1], + [17671, 1], + [17670, 1], + [17669, 1], + [17668, 1], + [17667, 1], + [17666, 1], + [17665, 1], + [17664, 1], + [17663, 1], + [17662, 1], + [17661, 1], + [17660, 1], + [17659, 1], + [17658, 1], + [19044, 0, "T"], + [19045, 0, "h"], + [19046, 0, "e"], + [19047, 0, " "], + [19048, 0, "d"], + [19049, 0, "i"], + [19050, 0, "f"], + [19051, 0, "f"], + [19052, 0, "i"], + [19053, 0, "c"], + [19054, 0, "u"], + [19055, 0, "l"], + [19056, 0, "t"], + [19057, 0, "y"], + [19058, 0, " "], + [19059, 0, "o"], + [19060, 0, "f"], + [19061, 0, " "], + [19062, 0, "d"], + [19063, 0, "e"], + [19064, 0, "f"], + [19065, 0, "i"], + [19066, 0, "n"], + [19067, 0, "i"], + [19068, 0, "n"], + [19069, 0, "g"], + [19070, 0, " "], + [19071, 0, "a"], + [19072, 0, " "], + [19073, 0, "J"], + [19074, 0, "S"], + [19075, 0, "O"], + [19076, 0, "N"], + [19077, 0, " "], + [19077, 1], + [19076, 1], + [19075, 1], + [19074, 1], + [19073, 1], + [19073, 0, "C"], + [19074, 0, "R"], + [19075, 0, "D"], + [19076, 0, "T"], + [19077, 0, " "], + [19078, 0, "f"], + [19079, 0, "o"], + [19080, 0, "r"], + [19081, 0, " "], + [19082, 0, "J"], + [19083, 0, "S"], + [19084, 0, "O"], + [19085, 0, "N"], + [19086, 0, " "], + [19087, 0, "d"], + [19088, 0, "a"], + [19089, 0, "t"], + [19090, 0, "a"], + [19091, 0, " "], + [19092, 0, "i"], + [19093, 0, "s"], + [19094, 0, " "], + [19095, 0, "d"], + [19096, 0, "u"], + [19097, 0, "e"], + [19098, 0, " "], + [19099, 0, "t"], + [19100, 0, "o"], + [19101, 0, " "], + [19102, 0, "t"], + [19103, 0, "h"], + [19104, 0, "e"], + [19105, 0, " "], + [19106, 0, "i"], + [19107, 0, "n"], + [19108, 0, "t"], + [19109, 0, "e"], + [19110, 0, "r"], + [19111, 0, "a"], + [19112, 0, "c"], + [19113, 0, "t"], + [19114, 0, "i"], + [19115, 0, "o"], + [19116, 0, "n"], + [19117, 0, " "], + [19118, 0, "b"], + [19119, 0, "e"], + [19120, 0, "t"], + [19121, 0, "w"], + [19122, 0, "e"], + [19123, 0, "e"], + [19124, 0, "n"], + [19125, 0, " "], + [19043, 0, "\n"], + [19044, 0, "\n"], + [19044, 0, "T"], + [19045, 0, "h"], + [19046, 0, "e"], + [19047, 0, " "], + [19048, 0, "s"], + [19049, 0, "e"], + [19050, 0, "q"], + [19051, 0, "u"], + [19052, 0, "e"], + [19053, 0, "n"], + [19054, 0, "t"], + [19055, 0, "i"], + [19056, 0, "a"], + [19057, 0, "l"], + [19058, 0, " "], + [19059, 0, "s"], + [19060, 0, "e"], + [19061, 0, "m"], + [19062, 0, "a"], + [19063, 0, "n"], + [19064, 0, "t"], + [19065, 0, "i"], + [19066, 0, "c"], + [19067, 0, "s"], + [19068, 0, " "], + [19069, 0, "o"], + [19070, 0, "f"], + [19071, 0, " "], + [19072, 0, "e"], + [19073, 0, "d"], + [19074, 0, "i"], + [19075, 0, "t"], + [19076, 0, "i"], + [19077, 0, "n"], + [19078, 0, "g"], + [19079, 0, " "], + [19080, 0, "a"], + [19081, 0, " "], + [19082, 0, "J"], + [19083, 0, "S"], + [19084, 0, "O"], + [19085, 0, "N"], + [19086, 0, " "], + [19087, 0, "d"], + [19088, 0, "a"], + [19089, 0, "t"], + [19090, 0, "a"], + [19091, 0, " "], + [19092, 0, "s"], + [19093, 0, "t"], + [19094, 0, "r"], + [19095, 0, "u"], + [19096, 0, "c"], + [19097, 0, "t"], + [19098, 0, "u"], + [19099, 0, "r"], + [19100, 0, "e"], + [19101, 0, " "], + [19102, 0, "a"], + [19103, 0, "r"], + [19104, 0, "e"], + [19105, 0, " "], + [19106, 0, "w"], + [19107, 0, "e"], + [19108, 0, "l"], + [19109, 0, "l"], + [19110, 0, "-"], + [19111, 0, "k"], + [19112, 0, "n"], + [19113, 0, "o"], + [19114, 0, "w"], + [19115, 0, "n"], + [19116, 0, ","], + [19117, 0, " "], + [19118, 0, "a"], + [19119, 0, "n"], + [19120, 0, "d"], + [19121, 0, " "], + [19122, 0, "t"], + [19123, 0, "h"], + [19124, 0, "e"], + [19125, 0, " "], + [19126, 0, "s"], + [19127, 0, "e"], + [19128, 0, "m"], + [19129, 0, "a"], + [19130, 0, "n"], + [19131, 0, "t"], + [19132, 0, "i"], + [19133, 0, "c"], + [19134, 0, "s"], + [19135, 0, " "], + [19136, 0, "o"], + [19137, 0, "f"], + [19138, 0, " "], + [19139, 0, "c"], + [19140, 0, "o"], + [19141, 0, "n"], + [19142, 0, "c"], + [19143, 0, "u"], + [19144, 0, "r"], + [19145, 0, "r"], + [19146, 0, "e"], + [19147, 0, "n"], + [19148, 0, "t"], + [19149, 0, "l"], + [19150, 0, "y"], + [19151, 0, " "], + [19152, 0, "e"], + [19153, 0, "d"], + [19154, 0, "i"], + [19155, 0, "t"], + [19156, 0, "i"], + [19157, 0, "n"], + [19158, 0, "g"], + [19159, 0, " "], + [19160, 0, "a"], + [19161, 0, " "], + [19162, 0, "f"], + [19163, 0, "l"], + [19164, 0, "a"], + [19165, 0, "t"], + [19166, 0, " "], + [19167, 0, "m"], + [19168, 0, "a"], + [19169, 0, "p"], + [19170, 0, " "], + [19171, 0, "o"], + [19172, 0, "r"], + [19173, 0, " "], + [19174, 0, "l"], + [19175, 0, "i"], + [19176, 0, "s"], + [19177, 0, "t"], + [19178, 0, " "], + [19179, 0, "d"], + [19180, 0, "a"], + [19181, 0, "t"], + [19182, 0, "a"], + [19183, 0, " "], + [19184, 0, "s"], + [19185, 0, "t"], + [19186, 0, "r"], + [19187, 0, "u"], + [19188, 0, "c"], + [19189, 0, "t"], + [19190, 0, "u"], + [19191, 0, "r"], + [19192, 0, "e"], + [19193, 0, " "], + [19194, 0, "h"], + [19195, 0, "a"], + [19196, 0, "v"], + [19197, 0, "e"], + [19198, 0, " "], + [19199, 0, "b"], + [19200, 0, "e"], + [19201, 0, "e"], + [19202, 0, "n"], + [19203, 0, " "], + [19204, 0, "t"], + [19205, 0, "h"], + [19206, 0, "o"], + [19207, 0, "r"], + [19208, 0, "o"], + [19209, 0, "u"], + [19210, 0, "g"], + [19211, 0, "h"], + [19212, 0, "l"], + [19213, 0, "y"], + [19214, 0, " "], + [19215, 0, "e"], + [19216, 0, "x"], + [19217, 0, "p"], + [19218, 0, "l"], + [19219, 0, "o"], + [19220, 0, "r"], + [19221, 0, "e"], + [19222, 0, "d"], + [19223, 0, " "], + [19224, 0, "i"], + [19225, 0, "n"], + [19226, 0, " "], + [19227, 0, "t"], + [19228, 0, "h"], + [19229, 0, "e"], + [19230, 0, " "], + [19231, 0, "l"], + [19232, 0, "i"], + [19233, 0, "t"], + [19234, 0, "e"], + [19235, 0, "r"], + [19236, 0, "a"], + [19237, 0, "t"], + [19238, 0, "u"], + [19239, 0, "r"], + [19240, 0, "e"], + [19241, 0, " "], + [19242, 0, "("], + [19243, 0, "s"], + [19244, 0, "e"], + [19245, 0, "e"], + [19246, 0, " "], + [19247, 0, "S"], + [19248, 0, "e"], + [19249, 0, "c"], + [19250, 0, "t"], + [19251, 0, "i"], + [19252, 0, "o"], + [19253, 0, "n"], + [19254, 0, "~"], + [19255, 0, "\\"], + [19256, 0, "r"], + [19257, 0, "e"], + [19258, 0, "f"], + [19259, 0, "{"], + [19260, 0, "}"], + [19261, 0, ")"], + [19262, 0, "."], + [17828, 0, "}"], + [17829, 0, "}"], + [17829, 1], + [17828, 1], + [19260, 0, "s"], + [19261, 0, "e"], + [19262, 0, "c"], + [19263, 0, ":"], + [19264, 0, "r"], + [19265, 0, "e"], + [19266, 0, "l"], + [19267, 0, "a"], + [19268, 0, "t"], + [19269, 0, "e"], + [19270, 0, "d"], + [19274, 0, " "], + [19275, 0, "H"], + [19276, 0, "o"], + [19277, 0, "w"], + [19278, 0, "e"], + [19279, 0, "v"], + [19280, 0, "e"], + [19281, 0, "r"], + [19282, 0, ","], + [19283, 0, " "], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 1], + [19284, 0, "w"], + [19285, 0, "h"], + [19286, 0, "e"], + [19287, 0, "n"], + [19318, 0, ","], + [19319, 0, " "], + [19320, 0, "d"], + [19321, 0, "i"], + [19322, 0, "f"], + [19323, 0, "f"], + [19324, 0, "i"], + [19325, 0, "c"], + [19326, 0, "u"], + [19327, 0, "l"], + [19328, 0, "t"], + [19329, 0, "i"], + [19330, 0, "e"], + [19331, 0, "s"], + [19332, 0, " "], + [19333, 0, "a"], + [19334, 0, "r"], + [19335, 0, "i"], + [19336, 0, "s"], + [19337, 0, "e"], + [19338, 1], + [19338, 1], + [19338, 1], + [19370, 0, "c"], + [19371, 0, "o"], + [19372, 0, "n"], + [19373, 0, "c"], + [19374, 0, "u"], + [19375, 0, "r"], + [19376, 0, "r"], + [19377, 0, "e"], + [19378, 0, "n"], + [19379, 0, "c"], + [19380, 0, "y"], + [19381, 0, " "], + [19382, 0, "a"], + [19383, 0, "n"], + [19384, 0, "d"], + [19385, 0, " "], + [19386, 0, "n"], + [19387, 0, "e"], + [19388, 0, "s"], + [19389, 0, "t"], + [19390, 0, "e"], + [19391, 0, "d"], + [19392, 0, " "], + [19393, 0, "d"], + [19394, 0, "a"], + [19395, 0, "t"], + [19396, 0, "a"], + [19397, 0, " "], + [19398, 0, "s"], + [19399, 0, "t"], + [19400, 0, "r"], + [19401, 0, "u"], + [19402, 0, "c"], + [19403, 0, "t"], + [19404, 0, "u"], + [19405, 0, "r"], + [19406, 0, "e"], + [19407, 0, "s"], + [19408, 0, "."], + [19409, 0, " "], + [19409, 1], + [19411, 0, "I"], + [19412, 0, "n"], + [19413, 0, " "], + [19414, 0, "t"], + [19415, 0, "h"], + [19416, 0, " "], + [19417, 0, "e"], + [19418, 0, "f"], + [19419, 0, "o"], + [19420, 0, "l"], + [19420, 1], + [19419, 1], + [19418, 1], + [19417, 1], + [19416, 1], + [19416, 0, "e"], + [19417, 0, " "], + [19418, 0, "f"], + [19419, 0, "o"], + [19420, 0, "l"], + [19421, 0, "l"], + [19422, 0, "o"], + [19423, 0, "w"], + [19424, 0, "i"], + [19425, 0, "n"], + [19426, 0, "g"], + [19427, 0, " "], + [19428, 0, "e"], + [19429, 0, "x"], + [19430, 0, "a"], + [19431, 0, "m"], + [19432, 0, "p"], + [19433, 0, "l"], + [19434, 0, "e"], + [19435, 0, "s"], + [19436, 0, " "], + [19437, 0, "w"], + [19438, 0, "e"], + [19439, 0, " "], + [19440, 0, "i"], + [19441, 0, "l"], + [19442, 0, "l"], + [19443, 0, "u"], + [19444, 0, "s"], + [19445, 0, "t"], + [19446, 0, "r"], + [19447, 0, "a"], + [19448, 0, "t"], + [19449, 0, "e"], + [19449, 1], + [19448, 1], + [19447, 1], + [19446, 1], + [19445, 1], + [19444, 1], + [19443, 1], + [19442, 1], + [19441, 1], + [19440, 1], + [19440, 0, "s"], + [19441, 0, "h"], + [19442, 0, "o"], + [19443, 0, "w"], + [19444, 0, " "], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19445, 1], + [19449, 0, " "], + [19450, 0, "s"], + [19451, 0, "i"], + [19452, 0, "t"], + [19453, 0, "u"], + [19454, 0, "a"], + [19455, 0, "t"], + [19456, 0, "i"], + [19457, 0, "o"], + [19458, 0, "n"], + [19459, 0, "s"], + [19460, 0, " "], + [19461, 0, "t"], + [19462, 0, "h"], + [19463, 0, "a"], + [19464, 0, "t"], + [19465, 0, " "], + [19466, 0, "c"], + [19467, 0, "a"], + [19468, 0, "n"], + [19469, 0, " "], + [19470, 0, "o"], + [19471, 0, "c"], + [19472, 0, "c"], + [19473, 0, "u"], + [19474, 0, "r"], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19475, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 1], + [19523, 0, "a"], + [19524, 0, "n"], + [19525, 0, "d"], + [19526, 0, " "], + [19527, 0, "d"], + [19528, 0, "e"], + [19529, 0, "m"], + [19530, 0, "o"], + [19531, 0, "n"], + [19532, 0, "s"], + [19533, 0, "t"], + [19534, 0, "r"], + [19535, 0, "a"], + [19536, 0, "t"], + [19537, 0, "e"], + [19538, 0, " "], + [19539, 0, "h"], + [19540, 0, "o"], + [19541, 0, "w"], + [19542, 0, " "], + [19543, 0, "t"], + [19544, 0, "h"], + [19545, 0, "e"], + [19546, 0, "y"], + [19547, 0, " "], + [19548, 0, "a"], + [19549, 0, "r"], + [19550, 0, "e"], + [19551, 0, " "], + [19552, 0, "h"], + [19553, 0, "a"], + [19554, 0, "n"], + [19555, 0, "d"], + [19556, 0, "l"], + [19557, 0, "e"], + [19558, 0, "d"], + [19559, 0, " "], + [19560, 0, "i"], + [19560, 1], + [19560, 0, "b"], + [19561, 0, "y"], + [19562, 0, " "], + [19563, 0, "o"], + [19564, 0, "u"], + [19565, 0, "r"], + [19566, 0, " "], + [19567, 0, "a"], + [19568, 0, "l"], + [19569, 0, "g"], + [19570, 0, "o"], + [19571, 0, "r"], + [19572, 0, "i"], + [19573, 0, "t"], + [19574, 0, "h"], + [19575, 0, "m"], + [19361, 0, "s"], + [19469, 1], + [19468, 1], + [19467, 1], + [19467, 0, "m"], + [19468, 0, "g"], + [19469, 0, "i"], + [19469, 1], + [19468, 1], + [19468, 0, "i"], + [19469, 0, "g"], + [19470, 0, "h"], + [19471, 0, "t"], + [19734, 0, ","], + [19768, 0, " "], + [19769, 0, "a"], + [19770, 0, "r"], + [19771, 0, "e"], + [20716, 0, "\n"], + [20717, 0, "\n"], + [20715, 1], + [20715, 0, "\n"], + [20716, 0, "\n"], + [20717, 0, "A"], + [20718, 0, " "], + [20719, 0, "m"], + [20720, 0, "u"], + [20721, 0, "l"], + [20722, 0, "t"], + [20723, 0, "i"], + [20724, 0, "="], + [20724, 1], + [20724, 0, "-"], + [20725, 0, "v"], + [20726, 0, "a"], + [20727, 0, "l"], + [20728, 0, "u"], + [20729, 0, "e"], + [20730, 0, " "], + [20731, 0, "r"], + [20732, 0, "e"], + [20733, 0, "g"], + [20734, 0, "i"], + [20735, 0, "s"], + [20736, 0, "t"], + [20737, 0, "e"], + [20738, 0, "r"], + [20739, 0, " "], + [20740, 0, "i"], + [20741, 0, "s"], + [20742, 0, " "], + [20743, 0, "h"], + [20744, 0, "a"], + [20745, 0, "r"], + [20746, 0, "d"], + [20747, 0, "l"], + [20748, 0, "y"], + [20749, 0, " "], + [20750, 0, "a"], + [20751, 0, "n"], + [20752, 0, " "], + [20753, 0, "i"], + [20754, 0, "m"], + [20755, 0, "p"], + [20756, 0, "r"], + [20757, 0, "e"], + [20758, 0, "s"], + [20759, 0, "s"], + [20760, 0, "i"], + [20761, 0, "v"], + [20762, 0, "e"], + [20763, 0, " "], + [20764, 0, "C"], + [20765, 0, "R"], + [20766, 0, "D"], + [20767, 0, "T"], + [20768, 0, ","], + [20769, 0, " "], + [20770, 0, "s"], + [20771, 0, "i"], + [20772, 0, "n"], + [20773, 0, "c"], + [20774, 0, "e"], + [20775, 0, " "], + [20776, 0, "i"], + [20777, 0, "t"], + [20778, 0, " "], + [20779, 0, "d"], + [20780, 0, "o"], + [20781, 0, "e"], + [20782, 0, "s"], + [20783, 0, " "], + [20784, 0, "n"], + [20785, 0, "o"], + [20786, 0, "t"], + [20787, 0, " "], + [20788, 0, "a"], + [20789, 0, "c"], + [20790, 0, "t"], + [20791, 0, "u"], + [20792, 0, "a"], + [20793, 0, "l"], + [20794, 0, "l"], + [20795, 0, "y"], + [20796, 0, " "], + [20797, 0, "p"], + [20798, 0, "e"], + [20799, 0, "r"], + [20800, 0, "f"], + [20801, 0, "o"], + [20802, 0, "r"], + [20803, 0, "m"], + [20804, 0, " "], + [20805, 0, "a"], + [20806, 0, "n"], + [20807, 0, "y"], + [20808, 0, " "], + [20809, 0, "c"], + [20810, 0, "o"], + [20811, 0, "n"], + [20812, 0, "f"], + [20813, 0, "l"], + [20814, 0, "i"], + [20815, 0, "c"], + [20816, 0, "t"], + [20817, 0, " "], + [20818, 0, "r"], + [20819, 0, "e"], + [20820, 0, "s"], + [20821, 0, "o"], + [20822, 0, "l"], + [20823, 0, "u"], + [20824, 0, "t"], + [20825, 0, "i"], + [20826, 0, "o"], + [20827, 0, "n"], + [20828, 0, "."], + [20829, 0, " "], + [20830, 0, "I"], + [20831, 0, "t"], + [20832, 0, "s"], + [20833, 0, " "], + [20833, 1], + [20832, 1], + [20831, 1], + [20830, 1], + [20830, 0, "W"], + [20831, 0, "e"], + [20832, 0, " "], + [20833, 0, "u"], + [20834, 0, "s"], + [20835, 0, "e"], + [20836, 0, " "], + [20837, 0, "i"], + [20838, 0, "t"], + [20839, 0, " "], + [20840, 0, "o"], + [20841, 0, "n"], + [20842, 0, "l"], + [20843, 0, "y"], + [20844, 0, " "], + [20845, 0, "f"], + [20846, 0, "o"], + [20847, 0, "r"], + [20848, 0, " "], + [20849, 0, "p"], + [20850, 0, "r"], + [20851, 0, "i"], + [20852, 0, "m"], + [20853, 0, "i"], + [20854, 0, "t"], + [20855, 0, "i"], + [20856, 0, "v"], + [20857, 0, "e"], + [20858, 0, " "], + [20859, 0, "v"], + [20860, 0, "a"], + [20861, 0, "l"], + [20862, 0, "u"], + [20863, 0, "e"], + [20864, 0, "s"], + [20865, 0, " "], + [20866, 0, "f"], + [20867, 0, "o"], + [20868, 0, "r"], + [20869, 0, " "], + [20870, 0, "w"], + [20871, 0, "h"], + [20872, 0, "i"], + [20873, 0, "c"], + [20874, 0, "h"], + [20875, 0, " "], + [20876, 0, "n"], + [20877, 0, "o"], + [20878, 0, " "], + [20879, 0, "o"], + [20880, 0, "t"], + [20881, 0, "h"], + [20882, 0, "e"], + [20883, 0, "r"], + [20884, 0, " "], + [20885, 0, "m"], + [20886, 0, "e"], + [20887, 0, "r"], + [20888, 0, "g"], + [20889, 0, "e"], + [20890, 0, " "], + [20883, 1], + [20882, 1], + [20881, 1], + [20880, 1], + [20879, 1], + [20879, 0, "a"], + [20880, 0, "u"], + [20881, 0, "t"], + [20882, 0, "o"], + [20883, 0, "m"], + [20884, 0, "a"], + [20885, 0, "i"], + [20885, 1], + [20885, 0, "t"], + [20886, 0, "i"], + [20887, 0, "c"], + [20895, 0, "f"], + [20896, 0, "u"], + [20897, 0, "n"], + [20898, 0, "c"], + [20899, 0, "t"], + [20900, 0, "i"], + [20901, 0, "o"], + [20902, 0, "n"], + [20903, 0, " "], + [20904, 0, "i"], + [20905, 0, "s"], + [20906, 0, " "], + [20907, 0, "d"], + [20908, 0, "e"], + [20909, 0, "f"], + [20910, 0, "i"], + [20911, 0, "n"], + [20912, 0, "e"], + [20913, 0, "d"], + [20914, 0, "."], + [20915, 0, " "], + [20916, 0, "O"], + [20917, 0, "t"], + [20918, 0, "h"], + [20919, 0, "e"], + [20920, 0, "r"], + [20921, 0, " "], + [20922, 0, "C"], + [20923, 0, "R"], + [20924, 0, "D"], + [20925, 0, "T"], + [20926, 0, "s"], + [20927, 0, " "], + [20928, 0, "c"], + [20929, 0, "o"], + [20930, 0, "u"], + [20931, 0, "l"], + [20932, 0, "d"], + [20933, 0, " "], + [20934, 0, "b"], + [20935, 0, "e"], + [20936, 0, " "], + [20937, 0, "s"], + [20938, 0, "u"], + [20939, 0, "b"], + [20940, 0, "s"], + [20941, 0, "t"], + [20942, 0, "i"], + [20943, 0, "t"], + [20944, 0, "u"], + [20945, 0, "t"], + [20946, 0, "e"], + [20947, 0, "d"], + [20948, 0, " "], + [20949, 0, "i"], + [20950, 0, "n"], + [20951, 0, " "], + [20952, 0, "i"], + [20953, 0, "t"], + [20954, 0, "s"], + [20955, 0, " "], + [20956, 0, "p"], + [20957, 0, "l"], + [20958, 0, "a"], + [20959, 0, "c"], + [20960, 0, "e"], + [20961, 0, ":"], + [20962, 0, " "], + [20963, 0, "f"], + [20964, 0, "o"], + [20965, 0, "r"], + [20966, 0, " "], + [20967, 0, "e"], + [20968, 0, "x"], + [20969, 0, "a"], + [20970, 0, "m"], + [20971, 0, "p"], + [20972, 0, "l"], + [20973, 0, "e"], + [20974, 0, ","], + [20975, 0, " "], + [20976, 0, "a"], + [20977, 0, " "], + [20978, 0, "c"], + [20979, 0, "o"], + [20980, 0, "u"], + [20981, 0, "t"], + [20981, 1], + [20981, 0, "n"], + [20982, 0, "t"], + [20983, 0, "e"], + [20984, 0, "r"], + [20985, 0, " "], + [20986, 0, "C"], + [20987, 0, "R"], + [20988, 0, "D"], + [20989, 0, "T"], + [20990, 0, " "], + [20991, 0, "f"], + [20992, 0, "o"], + [20993, 0, "r"], + [20994, 0, " "], + [20995, 0, "a"], + [20996, 0, " "], + [20997, 0, "n"], + [20998, 0, "u"], + [20999, 0, "m"], + [21000, 0, "b"], + [21001, 0, "e"], + [21002, 0, "r"], + [21003, 0, " "], + [21004, 0, "t"], + [21005, 0, "h"], + [21006, 0, "a"], + [21007, 0, "t"], + [21008, 0, " "], + [21009, 0, "c"], + [21010, 0, "a"], + [21011, 0, "n"], + [21012, 0, " "], + [21013, 0, "o"], + [21014, 0, "n"], + [21015, 0, "l"], + [21016, 0, "y"], + [21017, 0, " "], + [21018, 0, "b"], + [21019, 0, "e"], + [21020, 0, " "], + [21021, 0, "i"], + [21022, 0, "n"], + [21023, 0, "c"], + [21024, 0, "r"], + [21025, 0, "e"], + [21026, 0, "m"], + [21027, 0, "e"], + [21028, 0, "n"], + [21029, 0, "t"], + [21030, 0, "e"], + [21031, 0, "d"], + [21032, 0, " "], + [21033, 0, "a"], + [21034, 0, "n"], + [21035, 0, "d"], + [21036, 0, " "], + [21037, 0, "d"], + [21038, 0, "e"], + [21039, 0, "c"], + [21040, 0, "r"], + [21041, 0, "e"], + [21042, 0, "m"], + [21043, 0, "e"], + [21044, 0, "n"], + [21045, 0, "t"], + [21046, 0, "e"], + [21047, 0, "d"], + [21048, 0, ","], + [21049, 0, " "], + [21050, 0, "o"], + [21051, 0, "r"], + [21052, 0, " "], + [21053, 0, "a"], + [21054, 0, "n"], + [21055, 0, " "], + [21056, 0, "o"], + [21057, 0, "r"], + [21058, 0, "d"], + [21059, 0, "e"], + [21060, 0, "r"], + [21061, 0, "e"], + [21062, 0, "d"], + [21063, 0, " "], + [21064, 0, "l"], + [21065, 0, "i"], + [21066, 0, "s"], + [21067, 0, "t"], + [21068, 0, " "], + [21069, 0, "o"], + [21070, 0, "f"], + [21071, 0, " "], + [21072, 0, "c"], + [21073, 0, "h"], + [21074, 0, "a"], + [21075, 0, "r"], + [21076, 0, "a"], + [21077, 0, "c"], + [21078, 0, "t"], + [21079, 0, "e"], + [21080, 0, "r"], + [21081, 0, "s"], + [21082, 0, " "], + [21083, 0, "f"], + [21084, 0, "o"], + [21085, 0, "r"], + [21086, 0, " "], + [21087, 0, "a"], + [21088, 0, " "], + [21089, 0, "c"], + [21090, 0, "o"], + [21091, 0, "l"], + [21092, 0, "l"], + [21093, 0, "a"], + [21094, 0, "b"], + [21095, 0, "o"], + [21096, 0, "r"], + [21097, 0, "a"], + [21098, 0, "t"], + [21099, 0, "i"], + [21100, 0, "v"], + [21101, 0, "e"], + [21102, 0, "l"], + [21103, 0, "y"], + [21104, 0, " "], + [21105, 0, "e"], + [21106, 0, "d"], + [21107, 0, "i"], + [21108, 0, "t"], + [21109, 0, "a"], + [21110, 0, "b"], + [21111, 0, "l"], + [21112, 0, "e"], + [21113, 0, " "], + [21114, 0, "s"], + [21115, 0, "t"], + [21116, 0, "r"], + [21117, 0, "i"], + [21118, 0, "n"], + [21119, 0, "g"], + [21120, 0, " "], + [21121, 0, "("], + [21122, 0, "s"], + [21123, 0, "e"], + [21124, 0, "e"], + [21125, 0, " "], + [21126, 0, "a"], + [21127, 0, "l"], + [21128, 0, "s"], + [21129, 0, "o"], + [21130, 0, " "], + [21131, 0, "F"], + [21132, 0, "i"], + [21133, 0, "g"], + [21134, 0, "u"], + [21135, 0, "r"], + [21136, 0, "e"], + [21137, 0, "~"], + [21138, 0, "\\"], + [21139, 0, "r"], + [21140, 0, "e"], + [21141, 0, "f"], + [21142, 0, "{"], + [21143, 0, "f"], + [21144, 0, "i"], + [21145, 0, "g"], + [21146, 0, ":"], + [21147, 0, "t"], + [21148, 0, "e"], + [21149, 0, "x"], + [21150, 0, "t"], + [21151, 0, "-"], + [21152, 0, "e"], + [21153, 0, "d"], + [21154, 0, "i"], + [21155, 0, "t"], + [21156, 0, "}"], + [21157, 0, ")"], + [21158, 0, "."], + [21159, 0, " "], + [21159, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21161, 1], + [21160, 1], + [21159, 1], + [18966, 1], + [18966, 0, "."], + [18967, 0, "g"], + [18968, 0, "e"], + [18969, 0, "t"], + [18970, 0, "("], + [18978, 1], + [18978, 0, ")"], + [22936, 1], + [22935, 1], + [22934, 1], + [22933, 1], + [22932, 1], + [22931, 1], + [22930, 1], + [22929, 1], + [22928, 1], + [22927, 1], + [22926, 1], + [22925, 1], + [22924, 1], + [22923, 1], + [22922, 1], + [22921, 1], + [22920, 1], + [22919, 1], + [22918, 1], + [22917, 1], + [22916, 1], + [22915, 1], + [22914, 1], + [22913, 1], + [22912, 1], + [22911, 1], + [22910, 1], + [22909, 1], + [22936, 0, " "], + [22937, 0, "g"], + [22938, 0, "i"], + [22939, 0, "v"], + [22940, 0, "e"], + [22941, 0, "s"], + [22942, 0, " "], + [22943, 0, "a"], + [22944, 0, "n"], + [22945, 0, " "], + [22946, 0, "e"], + [22947, 0, "x"], + [22948, 0, "a"], + [22949, 0, "m"], + [22950, 0, "p"], + [22951, 0, "l"], + [22952, 0, "e"], + [22953, 0, " "], + [22954, 0, "o"], + [22955, 0, "f"], + [22956, 0, " "], + [22957, 0, "c"], + [22958, 0, "o"], + [22959, 0, "n"], + [22960, 0, "c"], + [22961, 0, "u"], + [22962, 0, "r"], + [22963, 0, "r"], + [22964, 0, "e"], + [22965, 0, "n"], + [22966, 0, "t"], + [22967, 0, " "], + [22968, 0, "e"], + [22969, 0, "d"], + [22970, 0, "i"], + [22971, 0, "t"], + [22972, 0, "s"], + [22973, 0, " "], + [22974, 0, "a"], + [22975, 0, "t"], + [22976, 0, " "], + [22977, 0, "d"], + [22978, 0, "i"], + [22979, 0, "f"], + [22980, 0, "f"], + [22981, 0, "e"], + [22982, 0, "r"], + [22983, 0, "e"], + [22984, 0, "n"], + [22985, 0, "t"], + [22986, 0, " "], + [22987, 0, "l"], + [22988, 0, "e"], + [22989, 0, "v"], + [22990, 0, "e"], + [22991, 0, "l"], + [22992, 0, "s"], + [22993, 0, " "], + [22994, 0, "o"], + [22995, 0, "f"], + [22996, 0, " "], + [22997, 0, "t"], + [22998, 0, "h"], + [22999, 0, "e"], + [23000, 0, " "], + [23001, 0, "t"], + [23002, 0, "r"], + [23003, 0, "e"], + [23004, 0, "e"], + [23159, 0, " "], + [23160, 0, "I"], + [23161, 0, "n"], + [23162, 0, "s"], + [23163, 0, "t"], + [23164, 0, "e"], + [23165, 0, "a"], + [23166, 0, "d"], + [23167, 0, " "], + [23168, 0, "o"], + [23169, 0, "f"], + [23170, 0, " "], + [23171, 0, "a"], + [23172, 0, "s"], + [23173, 0, "s"], + [23174, 0, "i"], + [23175, 0, "g"], + [23176, 0, "n"], + [23177, 0, "i"], + [23178, 0, "n"], + [23179, 0, "g"], + [23180, 0, " "], + [23181, 0, "a"], + [23182, 0, "n"], + [23183, 0, " "], + [23184, 0, "e"], + [23185, 0, "m"], + [23186, 0, "p"], + [23187, 0, "t"], + [23188, 0, "y"], + [23189, 0, " "], + [23190, 0, "m"], + [23191, 0, "a"], + [23192, 0, "p"], + [23016, 1], + [23015, 1], + [23014, 1], + [23013, 1], + [23020, 0, " "], + [23021, 0, "$"], + [23022, 0, "p"], + [23023, 0, "$"], + [23090, 1], + [23089, 1], + [23088, 1], + [23087, 1], + [23086, 1], + [23085, 1], + [23084, 1], + [23083, 1], + [23082, 1], + [23081, 1], + [23080, 1], + [23079, 1], + [23078, 1], + [23077, 1], + [23076, 1], + [23064, 0, "r"], + [23065, 0, "e"], + [23066, 0, "p"], + [23067, 0, "l"], + [23068, 0, "i"], + [23069, 0, "c"], + [23070, 0, "a"], + [23071, 0, " "], + [23072, 0, "$"], + [23073, 0, "q"], + [23074, 0, "$"], + [23075, 0, " "], + [23190, 0, ","], + [23191, 0, " "], + [23192, 0, "$"], + [23193, 0, "q"], + [23194, 0, "$"], + [23195, 0, " "], + [23196, 0, "c"], + [23197, 0, "o"], + [23198, 0, "u"], + [23199, 0, "l"], + [23200, 0, "d"], + [23201, 0, " "], + [23202, 0, "e"], + [23203, 0, "q"], + [23204, 0, "u"], + [23205, 0, "i"], + [23206, 0, "v"], + [23207, 0, "a"], + [23208, 0, "l"], + [23209, 0, "e"], + [23210, 0, "n"], + [23211, 0, "t"], + [23212, 0, "l"], + [23213, 0, "y"], + [23214, 0, " "], + [23215, 0, "r"], + [23216, 0, "e"], + [23217, 0, "m"], + [23218, 0, "o"], + [23219, 0, "v"], + [23220, 0, "e"], + [23221, 0, " "], + [23222, 0, "t"], + [23223, 0, "h"], + [23224, 0, "e"], + [23225, 0, " "], + [23226, 0, "e"], + [23227, 0, "n"], + [23228, 0, "t"], + [23229, 0, "i"], + [23230, 0, "r"], + [23231, 0, "e"], + [23232, 0, " "], + [23233, 0, "k"], + [23234, 0, "e"], + [23235, 0, "y"], + [23236, 0, " "], + [23237, 0, "`"], + [23238, 0, "`"], + [23239, 0, "c"], + [23240, 0, "o"], + [23241, 0, "l"], + [23242, 0, "o"], + [23243, 0, "r"], + [23244, 0, "s"], + [23245, 0, "'"], + [23246, 0, "'"], + [23247, 0, " "], + [23248, 0, "f"], + [23249, 0, "r"], + [23250, 0, "o"], + [23251, 0, "m"], + [23252, 0, " "], + [23253, 0, "t"], + [23254, 0, "h"], + [23255, 0, "e"], + [23256, 0, " "], + [23257, 0, "o"], + [23258, 0, "u"], + [23259, 0, "t"], + [23260, 0, "e"], + [23261, 0, "r"], + [23262, 0, " "], + [23263, 0, "m"], + [23264, 0, "a"], + [23265, 0, "p"], + [23266, 0, ","], + [23267, 0, " "], + [23268, 0, "a"], + [23269, 0, "n"], + [23270, 0, "d"], + [23271, 0, " "], + [23272, 0, "t"], + [23273, 0, "h"], + [23274, 0, "e"], + [23275, 0, "n"], + [23276, 0, " "], + [23277, 0, "a"], + [23278, 0, "s"], + [23279, 0, "s"], + [23280, 0, "i"], + [23281, 0, "g"], + [23282, 0, "n"], + [23283, 0, " "], + [23284, 0, "a"], + [23285, 0, " "], + [23286, 0, "n"], + [23287, 0, "e"], + [23288, 0, "w"], + [23289, 0, " "], + [23290, 0, "e"], + [23291, 0, "m"], + [23292, 0, "p"], + [23293, 0, "t"], + [23294, 0, "y"], + [23295, 0, " "], + [23296, 0, "m"], + [23297, 0, "a"], + [23298, 0, "p"], + [23299, 0, " "], + [23300, 0, "t"], + [23301, 0, "o"], + [23302, 0, " "], + [23303, 0, "t"], + [23304, 0, "h"], + [23305, 0, "a"], + [23306, 0, "t"], + [23307, 0, " "], + [23308, 0, "k"], + [23309, 0, "e"], + [23310, 0, "y"], + [23311, 0, "."], + [23312, 0, "\n"], + [23313, 0, "\n"], + [23312, 0, " "], + [23313, 0, "T"], + [23314, 0, "h"], + [23315, 0, "e"], + [23316, 0, " "], + [23317, 0, "d"], + [23318, 0, "i"], + [23319, 0, "f"], + [23320, 0, "f"], + [23321, 0, "i"], + [23322, 0, "c"], + [23323, 0, "u"], + [23324, 0, "l"], + [23325, 0, "t"], + [23326, 0, "y"], + [23327, 0, " "], + [23328, 0, "i"], + [23329, 0, "n"], + [23330, 0, " "], + [23331, 0, "t"], + [23332, 0, "h"], + [23333, 0, "i"], + [23334, 0, "s"], + [23335, 0, " "], + [23336, 0, "e"], + [23337, 0, "x"], + [23338, 0, "a"], + [23339, 0, "m"], + [23340, 0, "p"], + [23341, 0, "l"], + [23342, 0, "e"], + [23343, 0, " "], + [23582, 0, "\n"], + [23583, 0, "\n"], + [23583, 0, "T"], + [23584, 0, "h"], + [23585, 0, "e"], + [23586, 0, " "], + [23587, 0, "b"], + [23588, 0, "e"], + [23589, 0, "h"], + [23590, 0, "a"], + [23591, 0, "v"], + [23592, 0, "i"], + [23593, 0, "o"], + [23594, 0, "r"], + [23595, 0, " "], + [23596, 0, "w"], + [23597, 0, "e"], + [23598, 0, " "], + [23599, 0, "d"], + [23600, 0, "e"], + [23601, 0, "f"], + [23602, 0, "i"], + [23603, 0, "n"], + [23604, 0, "e"], + [23605, 0, " "], + [23606, 0, "i"], + [23607, 0, "s"], + [23608, 0, " "], + [23608, 1], + [23607, 1], + [23606, 1], + [23606, 0, "m"], + [23607, 0, "a"], + [23608, 0, "t"], + [23609, 0, "c"], + [23610, 0, "h"], + [23611, 0, "e"], + [23612, 0, "s"], + [23613, 0, " "], + [23614, 0, "t"], + [23615, 0, "h"], + [23616, 0, "a"], + [23617, 0, "t"], + [23618, 0, " "], + [23619, 0, "o"], + [23620, 0, "f"], + [23621, 0, " "], + [23622, 0, "C"], + [23623, 0, "R"], + [23624, 0, "D"], + [23625, 0, "T"], + [23626, 0, " "], + [23627, 0, "m"], + [23628, 0, "a"], + [23629, 0, "p"], + [23630, 0, "s"], + [23631, 0, " "], + [23632, 0, "i"], + [23633, 0, "n"], + [23634, 0, " "], + [23635, 0, "R"], + [23636, 0, "i"], + [23637, 0, "a"], + [23638, 0, "k"], + [23639, 0, "~"], + [23640, 0, "\\"], + [23641, 0, "c"], + [23642, 0, "i"], + [23643, 0, "t"], + [23644, 0, "e"], + [23645, 0, "{"], + [23646, 0, "B"], + [23647, 0, "r"], + [23648, 0, "o"], + [23649, 0, "w"], + [23650, 0, "n"], + [23651, 0, ":"], + [23652, 0, "2"], + [23653, 0, "0"], + [23654, 0, "1"], + [23655, 0, "4"], + [23656, 0, "h"], + [23657, 0, "s"], + [23658, 0, ","], + [23659, 0, "B"], + [23660, 0, "r"], + [23661, 0, "o"], + [23662, 0, "w"], + [23663, 0, "n"], + [23664, 0, ":"], + [23665, 0, "2"], + [23666, 0, "0"], + [23667, 0, "1"], + [23668, 0, "3"], + [23669, 0, "w"], + [23670, 0, "y"], + [23671, 0, "}"], + [23672, 0, "."], + [23344, 0, "i"], + [23345, 0, "s"], + [23346, 0, " "], + [23347, 0, "t"], + [23348, 0, "h"], + [23349, 0, "a"], + [23350, 0, "t"], + [23351, 0, " "], + [23352, 0, "t"], + [23353, 0, "h"], + [23354, 0, "e"], + [23355, 0, " "], + [23356, 0, "a"], + [23357, 0, "d"], + [23358, 0, "d"], + [23359, 0, "i"], + [23360, 0, "t"], + [23361, 0, "i"], + [23362, 0, "o"], + [23363, 0, "n"], + [23364, 0, " "], + [23365, 0, "o"], + [23366, 0, "f"], + [23367, 0, " "], + [23368, 0, "`"], + [23369, 0, "`"], + [23370, 0, "r"], + [23371, 0, "e"], + [23372, 0, "d"], + [23373, 0, "'"], + [23374, 0, "'"], + [23375, 0, " "], + [23376, 0, "o"], + [23377, 0, "c"], + [23378, 0, "c"], + [23379, 0, "u"], + [23380, 0, "r"], + [23381, 0, "s"], + [23382, 0, " "], + [23383, 0, "a"], + [23384, 0, "t"], + [23385, 0, " "], + [23386, 0, "a"], + [23387, 0, " "], + [23388, 0, "l"], + [23389, 0, "o"], + [23390, 0, "w"], + [23391, 0, "e"], + [23392, 0, "r"], + [23393, 0, " "], + [23394, 0, "l"], + [23395, 0, "e"], + [23396, 0, "v"], + [23397, 0, "e"], + [23398, 0, "l"], + [23399, 0, " "], + [23400, 0, "o"], + [23401, 0, "f"], + [23402, 0, " "], + [23403, 0, "t"], + [23404, 0, "h"], + [23405, 0, "e"], + [23406, 0, " "], + [23407, 0, "t"], + [23408, 0, "r"], + [23409, 0, "e"], + [23410, 0, "e"], + [23411, 0, ","], + [23412, 0, " "], + [23413, 0, "w"], + [23414, 0, "h"], + [23415, 0, "i"], + [23416, 0, "l"], + [23417, 0, "e"], + [23418, 0, " "], + [23419, 0, "c"], + [23420, 0, "o"], + [23421, 0, "n"], + [23422, 0, "c"], + [23423, 0, "u"], + [23424, 0, "r"], + [23425, 0, "r"], + [23426, 0, "e"], + [23427, 0, "n"], + [23428, 0, "t"], + [23429, 0, "l"], + [23430, 0, "y"], + [23431, 0, " "], + [23432, 0, "t"], + [23433, 0, "h"], + [23434, 0, "e"], + [23435, 0, " "], + [23436, 0, "r"], + [23437, 0, "e"], + [23438, 0, "m"], + [23439, 0, "o"], + [23440, 0, "v"], + [23441, 0, "a"], + [23442, 0, "l"], + [23443, 0, " "], + [23444, 0, "o"], + [23445, 0, "f"], + [23446, 0, " "], + [23447, 0, "t"], + [23448, 0, "h"], + [23449, 0, "e"], + [23450, 0, " "], + [23451, 0, "m"], + [23452, 0, "a"], + [23453, 0, "p"], + [23454, 0, " "], + [23455, 0, "o"], + [23456, 0, "f"], + [23457, 0, " "], + [23458, 0, "c"], + [23459, 0, "o"], + [23460, 0, "l"], + [23461, 0, "o"], + [23462, 0, "r"], + [23463, 0, "s"], + [23464, 0, " "], + [23465, 0, "o"], + [23466, 0, "c"], + [23467, 0, "c"], + [23468, 0, "u"], + [23469, 0, "r"], + [23470, 0, "s"], + [23471, 0, " "], + [23472, 0, "a"], + [23473, 0, "t"], + [23474, 0, " "], + [23475, 0, "a"], + [23476, 0, " "], + [23477, 0, "h"], + [23478, 0, "i"], + [23479, 0, "g"], + [23480, 0, "h"], + [23481, 0, "e"], + [23482, 0, "r"], + [23483, 0, " "], + [23484, 0, "l"], + [23485, 0, "e"], + [23486, 0, "v"], + [23487, 0, "e"], + [23488, 0, "l"], + [23489, 0, " "], + [23490, 0, "o"], + [23491, 0, "f"], + [23492, 0, " "], + [23493, 0, "t"], + [23494, 0, "h"], + [23495, 0, "e"], + [23496, 0, " "], + [23497, 0, "t"], + [23498, 0, "r"], + [23499, 0, "e"], + [23500, 0, "e"], + [23501, 0, "."], + [23502, 0, "\n"], + [23503, 0, "\n"], + [23504, 0, "O"], + [23505, 0, "n"], + [23506, 0, "e"], + [23507, 0, " "], + [23508, 0, "p"], + [23509, 0, "o"], + [23510, 0, "s"], + [23511, 0, "s"], + [23512, 0, "i"], + [23513, 0, "b"], + [23514, 0, "l"], + [23515, 0, "e"], + [23516, 0, " "], + [23517, 0, "w"], + [23518, 0, "a"], + [23519, 0, "y"], + [23520, 0, " "], + [23521, 0, "o"], + [23522, 0, "f"], + [23523, 0, " "], + [23524, 0, "h"], + [23525, 0, "a"], + [23526, 0, "n"], + [23527, 0, "d"], + [23528, 0, "l"], + [23529, 0, "i"], + [23530, 0, "n"], + [23531, 0, "g"], + [23532, 0, " "], + [23533, 0, "s"], + [23534, 0, "u"], + [23535, 0, "c"], + [23536, 0, "h"], + [23537, 0, " "], + [23538, 0, "a"], + [23539, 0, " "], + [23540, 0, "c"], + [23541, 0, "o"], + [23542, 0, "n"], + [23543, 0, "f"], + [23544, 0, "l"], + [23545, 0, "i"], + [23546, 0, "c"], + [23547, 0, "t"], + [23548, 0, " "], + [23549, 0, "w"], + [23550, 0, "o"], + [23551, 0, "u"], + [23552, 0, "l"], + [23553, 0, "d"], + [23554, 0, " "], + [23555, 0, "b"], + [23556, 0, "e"], + [23557, 0, " "], + [23558, 0, "t"], + [23559, 0, "o"], + [23560, 0, " "], + [23561, 0, "l"], + [23562, 0, "e"], + [23563, 0, "t"], + [23564, 0, " "], + [23565, 0, "e"], + [23566, 0, "d"], + [23567, 0, "i"], + [23568, 0, "t"], + [23569, 0, "s"], + [23570, 0, " "], + [23571, 0, "a"], + [23572, 0, "t"], + [23573, 0, " "], + [23574, 0, "h"], + [23575, 0, "i"], + [23576, 0, "g"], + [23577, 0, "h"], + [23578, 0, "e"], + [23579, 0, "r"], + [23580, 0, " "], + [23581, 0, "l"], + [23582, 0, "e"], + [23583, 0, "v"], + [23584, 0, "e"], + [23585, 0, "l"], + [23586, 0, "s"], + [23587, 0, " "], + [23588, 0, "o"], + [23589, 0, "f"], + [23590, 0, " "], + [23591, 0, "a"], + [23592, 0, " "], + [23593, 0, "t"], + [23594, 0, "r"], + [23595, 0, "e"], + [23596, 0, "e"], + [23597, 0, " "], + [23598, 0, "a"], + [23599, 0, "l"], + [23600, 0, "w"], + [23601, 0, "a"], + [23602, 0, "y"], + [23603, 0, "s"], + [23604, 0, " "], + [23605, 0, "o"], + [23606, 0, "v"], + [23607, 0, "e"], + [23608, 0, "r"], + [23609, 0, "r"], + [23610, 0, "i"], + [23611, 0, "d"], + [23612, 0, "e"], + [23613, 0, " "], + [23614, 0, "c"], + [23615, 0, "o"], + [23616, 0, "n"], + [23617, 0, "c"], + [23618, 0, "u"], + [23619, 0, "r"], + [23620, 0, "r"], + [23621, 0, "e"], + [23622, 0, "n"], + [23623, 0, "t"], + [23624, 0, " "], + [23625, 0, "e"], + [23626, 0, "d"], + [23627, 0, "i"], + [23628, 0, "t"], + [23629, 0, "s"], + [23630, 0, " "], + [23631, 0, "w"], + [23632, 0, "i"], + [23633, 0, "t"], + [23634, 0, "h"], + [23635, 0, "i"], + [23636, 0, "n"], + [23637, 0, " "], + [23638, 0, "t"], + [23639, 0, "h"], + [23640, 0, "a"], + [23641, 0, "t"], + [23642, 0, " "], + [23643, 0, "s"], + [23644, 0, "u"], + [23645, 0, "b"], + [23646, 0, "t"], + [23647, 0, "r"], + [23648, 0, "e"], + [23649, 0, "e"], + [23650, 0, " "], + [23651, 0, "("], + [23652, 0, "i"], + [23653, 0, "n"], + [23654, 0, " "], + [23655, 0, "t"], + [23656, 0, "h"], + [23657, 0, "i"], + [23658, 0, "s"], + [23659, 0, " "], + [23660, 0, "c"], + [23661, 0, "a"], + [23662, 0, "s"], + [23663, 0, "e"], + [23664, 0, ","], + [23665, 0, " "], + [23666, 0, "t"], + [23667, 0, "h"], + [23668, 0, "a"], + [23669, 0, "t"], + [23670, 0, " "], + [23671, 0, "w"], + [23672, 0, "o"], + [23673, 0, "u"], + [23674, 0, "l"], + [23675, 0, "d"], + [23676, 0, " "], + [23677, 0, "m"], + [23678, 0, "e"], + [23679, 0, "a"], + [23680, 0, "n"], + [23681, 0, " "], + [23682, 0, "t"], + [23683, 0, "h"], + [23684, 0, "e"], + [23685, 0, " "], + [23686, 0, "a"], + [23687, 0, "d"], + [23688, 0, "d"], + [23689, 0, "i"], + [23690, 0, "t"], + [23691, 0, "i"], + [23692, 0, "o"], + [23693, 0, "n"], + [23694, 0, " "], + [23695, 0, "o"], + [23696, 0, "f"], + [23697, 0, " "], + [23698, 0, "`"], + [23699, 0, "`"], + [23700, 0, "r"], + [23701, 0, "e"], + [23702, 0, "d"], + [23703, 0, "'"], + [23704, 0, "'"], + [23705, 0, " "], + [23706, 0, "w"], + [23707, 0, "o"], + [23708, 0, "u"], + [23709, 0, "l"], + [23710, 0, "d"], + [23711, 0, " "], + [23712, 0, "b"], + [23713, 0, "e"], + [23714, 0, " "], + [23715, 0, "d"], + [23716, 0, "i"], + [23717, 0, "s"], + [23718, 0, "c"], + [23719, 0, "a"], + [23720, 0, "r"], + [23721, 0, "d"], + [23722, 0, "e"], + [23723, 0, "d"], + [23724, 0, ","], + [23725, 0, " "], + [23726, 0, "s"], + [23727, 0, "i"], + [23728, 0, "n"], + [23729, 0, "c"], + [23730, 0, "e"], + [23731, 0, " "], + [23732, 0, "i"], + [23733, 0, "t"], + [23734, 0, " "], + [23735, 0, "w"], + [23736, 0, "o"], + [23737, 0, "u"], + [23738, 0, "l"], + [23739, 0, "d"], + [23740, 0, " "], + [23741, 0, "b"], + [23742, 0, "e"], + [23743, 0, " "], + [23744, 0, "o"], + [23745, 0, "v"], + [23746, 0, "e"], + [23747, 0, "r"], + [23748, 0, "r"], + [23749, 0, "i"], + [23750, 0, "d"], + [23751, 0, "d"], + [23752, 0, "e"], + [23753, 0, "n"], + [23754, 0, " "], + [23755, 0, "b"], + [23756, 0, "y"], + [23757, 0, " "], + [23758, 0, "t"], + [23759, 0, "h"], + [23760, 0, "e"], + [23761, 0, " "], + [23762, 0, "b"], + [23763, 0, "l"], + [23764, 0, "a"], + [23765, 0, "n"], + [23766, 0, "k"], + [23767, 0, "i"], + [23768, 0, "n"], + [23769, 0, "g"], + [23770, 0, "-"], + [23771, 0, "o"], + [23772, 0, "u"], + [23773, 0, "t"], + [23774, 0, " "], + [23775, 0, "o"], + [23776, 0, "f"], + [23777, 0, " "], + [23778, 0, "t"], + [23779, 0, "h"], + [23780, 0, "e"], + [23781, 0, " "], + [23782, 0, "e"], + [23783, 0, "n"], + [23784, 0, "t"], + [23785, 0, "i"], + [23786, 0, "r"], + [23787, 0, "e"], + [23788, 0, " "], + [23789, 0, "m"], + [23790, 0, "a"], + [23791, 0, "p"], + [23792, 0, " "], + [23793, 0, "o"], + [23794, 0, "f"], + [23795, 0, " "], + [23796, 0, "c"], + [23797, 0, "o"], + [23798, 0, "l"], + [23799, 0, "o"], + [23800, 0, "r"], + [23801, 0, "s"], + [23802, 0, ")"], + [23803, 0, "."], + [23804, 0, " "], + [23805, 0, "H"], + [23806, 0, "o"], + [23807, 0, "w"], + [23808, 0, "e"], + [23809, 0, "v"], + [23810, 0, "e"], + [23811, 0, "r"], + [23812, 0, ","], + [23813, 0, " "], + [23814, 0, "t"], + [23815, 0, "h"], + [23816, 0, "a"], + [23817, 0, "t"], + [23818, 0, " "], + [23819, 0, "b"], + [23820, 0, "e"], + [23821, 0, "h"], + [23822, 0, "a"], + [23823, 0, "v"], + [23824, 0, "i"], + [23825, 0, "o"], + [23826, 0, "r"], + [23827, 0, " "], + [23828, 0, "w"], + [23829, 0, "o"], + [23830, 0, "u"], + [23831, 0, "l"], + [23832, 0, "d"], + [23833, 0, " "], + [23834, 0, "n"], + [23835, 0, "o"], + [23836, 0, "t"], + [23837, 0, " "], + [23838, 0, "m"], + [23839, 0, "e"], + [23840, 0, "e"], + [23841, 0, "t"], + [23842, 0, " "], + [23843, 0, "o"], + [23844, 0, "u"], + [23845, 0, "r"], + [23846, 0, " "], + [23847, 0, "r"], + [23848, 0, "e"], + [23849, 0, "q"], + [23850, 0, "u"], + [23851, 0, "i"], + [23852, 0, "r"], + [23853, 0, "e"], + [23854, 0, "m"], + [23855, 0, "e"], + [23856, 0, "n"], + [23857, 0, "t"], + [23858, 0, " "], + [23859, 0, "o"], + [23860, 0, "f"], + [23861, 0, " "], + [23861, 1], + [23860, 1], + [23859, 1], + [23859, 0, "t"], + [23860, 0, "h"], + [23861, 0, "a"], + [23862, 0, "t"], + [23863, 0, " "], + [23864, 0, "e"], + [23865, 0, "d"], + [23866, 0, "i"], + [23867, 0, "t"], + [23868, 0, "s"], + [23869, 0, " "], + [23869, 1], + [23868, 1], + [23867, 1], + [23866, 1], + [23865, 1], + [23864, 1], + [23864, 0, "n"], + [23865, 0, "o"], + [23866, 0, " "], + [23867, 0, "u"], + [23868, 0, "s"], + [23869, 0, "e"], + [23870, 0, "r"], + [23871, 0, " "], + [23872, 0, "i"], + [23873, 0, "n"], + [23874, 0, "p"], + [23875, 0, "u"], + [23876, 0, "t"], + [23877, 0, " "], + [23878, 0, "s"], + [23879, 0, "h"], + [23880, 0, "o"], + [23881, 0, "u"], + [23882, 0, "l"], + [23883, 0, "d"], + [23884, 0, " "], + [23885, 0, "b"], + [23886, 0, "e"], + [23887, 0, " "], + [23888, 0, "l"], + [23889, 0, "o"], + [23890, 0, "s"], + [23891, 0, "t"], + [23892, 0, " "], + [23893, 0, "d"], + [23894, 0, "u"], + [23895, 0, "e"], + [23896, 0, " "], + [23897, 0, "t"], + [23898, 0, "o"], + [23899, 0, " "], + [23900, 0, "c"], + [23901, 0, "o"], + [23902, 0, "n"], + [23903, 0, "c"], + [23904, 0, "u"], + [23905, 0, "r"], + [23906, 0, "r"], + [23907, 0, "e"], + [23908, 0, "n"], + [23909, 0, "t"], + [23910, 0, " "], + [23911, 0, "m"], + [23912, 0, "o"], + [23913, 0, "d"], + [23914, 0, "i"], + [23915, 0, "f"], + [23916, 0, "i"], + [23917, 0, "c"], + [23918, 0, "a"], + [23919, 0, "t"], + [23920, 0, "i"], + [23921, 0, "o"], + [23922, 0, "n"], + [23923, 0, "s"], + [23924, 0, "."], + [23925, 0, " "], + [23926, 0, "I"], + [23927, 0, "n"], + [23928, 0, "s"], + [23929, 0, "t"], + [23930, 0, "e"], + [23931, 0, "a"], + [23932, 0, "d"], + [23933, 0, ","], + [23934, 0, " "], + [23935, 0, "w"], + [23936, 0, "e"], + [23937, 0, " "], + [23938, 0, "d"], + [23939, 0, "e"], + [23940, 0, "f"], + [23941, 0, "i"], + [23942, 0, "n"], + [23943, 0, "e"], + [23944, 0, " "], + [23945, 0, "a"], + [23946, 0, " "], + [23947, 0, "m"], + [23947, 1], + [23946, 1], + [23945, 1], + [23945, 0, "m"], + [23946, 0, "e"], + [23947, 0, "r"], + [23948, 0, "g"], + [23949, 0, "e"], + [23950, 0, " "], + [23951, 0, "s"], + [23952, 0, "e"], + [23953, 0, "m"], + [23954, 0, "a"], + [23955, 0, "n"], + [23956, 0, "t"], + [23957, 0, "i"], + [23958, 0, "c"], + [23959, 0, "s"], + [23960, 0, " "], + [23961, 0, "t"], + [23962, 0, "h"], + [23963, 0, "a"], + [23964, 0, "t"], + [23965, 0, " "], + [23966, 0, "p"], + [23967, 0, "r"], + [23968, 0, "e"], + [23969, 0, "s"], + [23970, 0, "e"], + [23971, 0, "r"], + [23972, 0, "v"], + [23973, 0, "e"], + [23974, 0, " "], + [23975, 0, "a"], + [23976, 0, "l"], + [23977, 0, "l"], + [23978, 0, " "], + [23979, 0, "c"], + [23980, 0, "h"], + [23981, 0, "a"], + [23982, 0, "n"], + [23983, 0, "g"], + [23984, 0, "e"], + [23985, 0, "s"], + [23986, 0, ":"], + [24054, 1], + [24053, 1], + [24052, 1], + [24051, 1], + [24050, 1], + [24049, 1], + [24048, 1], + [24047, 1], + [24046, 1], + [24045, 1], + [24044, 1], + [24043, 1], + [24042, 1], + [24041, 1], + [24040, 1], + [24039, 1], + [24038, 1], + [24037, 1], + [24036, 1], + [24035, 1], + [24034, 1], + [24033, 1], + [24032, 1], + [24031, 1], + [24030, 1], + [24029, 1], + [24028, 1], + [24027, 1], + [24026, 1], + [24025, 1], + [24024, 1], + [24023, 1], + [24022, 1], + [24021, 1], + [24020, 1], + [24019, 1], + [24018, 1], + [24017, 1], + [24016, 1], + [24015, 1], + [24014, 1], + [24013, 1], + [24012, 1], + [24011, 1], + [24010, 1], + [24009, 1], + [24008, 1], + [24007, 1], + [24006, 1], + [24005, 1], + [24004, 1], + [24003, 1], + [24002, 1], + [24001, 1], + [24000, 1], + [23999, 1], + [23998, 1], + [23997, 1], + [23996, 1], + [23995, 1], + [23994, 1], + [23993, 1], + [23992, 1], + [23991, 1], + [23990, 1], + [23989, 1], + [23988, 1], + [23987, 1], + [24157, 1], + [24156, 1], + [24156, 0, " "], + [24159, 1], + [24159, 0, "i"], + [24160, 0, "s"], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 1], + [24171, 0, "m"], + [24172, 0, "a"], + [24173, 0, "t"], + [23986, 0, ","], + [23987, 0, " "], + [23988, 0, "a"], + [23989, 0, "s"], + [23990, 0, " "], + [23991, 0, "s"], + [23992, 0, "h"], + [23993, 0, "o"], + [23994, 0, "w"], + [23995, 0, "n"], + [23996, 0, " "], + [23997, 0, "i"], + [23998, 0, "n"], + [23999, 0, " "], + [24000, 0, "F"], + [24001, 0, "i"], + [24002, 0, "g"], + [24003, 0, "u"], + [24004, 0, "r"], + [24005, 0, "e"], + [24006, 0, "~"], + [24007, 0, "\\"], + [24008, 0, "r"], + [24009, 0, "e"], + [24010, 0, "f"], + [24011, 0, "{"], + [24012, 0, "f"], + [24013, 0, "i"], + [24014, 0, "g"], + [24015, 0, ":"], + [24016, 0, "m"], + [24017, 0, "a"], + [24018, 0, "p"], + [24019, 0, "-"], + [24020, 0, "r"], + [24021, 0, "e"], + [24022, 0, "m"], + [24023, 0, "o"], + [24024, 0, "v"], + [24025, 0, "e"], + [24026, 0, "}"], + [24296, 0, "["], + [24297, 0, "p"], + [24298, 0, "]"], + [21180, 0, "["], + [21181, 0, "p"], + [21182, 0, "]"], + [17817, 0, "["], + [17818, 0, "p"], + [17819, 0, "]"], + [27023, 0, "["], + [27024, 0, "p"], + [27025, 0, "]"], + [28556, 0, "["], + [28557, 0, "p"], + [28558, 0, "]"], + [30090, 0, "["], + [30091, 0, "p"], + [30092, 0, "]"], + [26002, 0, "j"], + [26003, 0, "j"], + [26004, 0, "j"], + [26005, 0, "j"], + [26005, 1], + [26002, 1], + [26002, 1], + [26002, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [26345, 1], + [30825, 0, "j"], + [30825, 1], + [30839, 0, "\n"], + [30840, 0, "\n"], + [30840, 0, "F"], + [30841, 0, "i"], + [30842, 0, "g"], + [30843, 0, "u"], + [30844, 0, "r"], + [30845, 0, "e"], + [30846, 0, "~"], + [30847, 0, "\\"], + [30848, 0, "r"], + [30849, 0, "e"], + [30850, 0, "f"], + [30851, 0, "{"], + [30852, 0, "f"], + [30853, 0, "i"], + [30854, 0, "g"], + [30855, 0, ":"], + [30856, 0, "m"], + [30857, 0, "a"], + [30858, 0, "p"], + [30859, 0, "-"], + [30860, 0, "r"], + [30861, 0, "e"], + [30862, 0, "m"], + [30863, 0, "o"], + [30864, 0, "v"], + [30865, 0, "e"], + [30866, 0, "}"], + [30867, 0, " "], + [30868, 0, "g"], + [30869, 0, "i"], + [30870, 0, "v"], + [30871, 0, "e"], + [30872, 0, "s"], + [30873, 0, " "], + [30874, 0, "a"], + [30875, 0, "n"], + [30876, 0, " "], + [30877, 0, "e"], + [30878, 0, "x"], + [30879, 0, "a"], + [30880, 0, "m"], + [30881, 0, "p"], + [30882, 0, "l"], + [30883, 0, "e"], + [30884, 0, " "], + [30885, 0, "o"], + [30886, 0, "f"], + [30887, 0, " "], + [30888, 0, "c"], + [30889, 0, "o"], + [30890, 0, "n"], + [30891, 0, "c"], + [30892, 0, "u"], + [30893, 0, "r"], + [30894, 0, "r"], + [30895, 0, "e"], + [30896, 0, "n"], + [30897, 0, "t"], + [30898, 0, " "], + [30899, 0, "e"], + [30900, 0, "d"], + [30901, 0, "i"], + [30902, 0, "t"], + [30903, 0, "s"], + [30904, 0, " "], + [30905, 0, "a"], + [30906, 0, "t"], + [30907, 0, " "], + [30908, 0, "d"], + [30909, 0, "i"], + [30910, 0, "f"], + [30911, 0, "f"], + [30912, 0, "e"], + [30913, 0, "r"], + [30914, 0, "e"], + [30915, 0, "n"], + [30916, 0, "t"], + [30917, 0, " "], + [30918, 0, "l"], + [30919, 0, "e"], + [30920, 0, "v"], + [30921, 0, "e"], + [30922, 0, "l"], + [30923, 0, "s"], + [30924, 0, " "], + [30925, 0, "o"], + [30926, 0, "f"], + [30927, 0, " "], + [30928, 0, "t"], + [30929, 0, "h"], + [30930, 0, "e"], + [30931, 0, " "], + [30932, 0, "J"], + [30933, 0, "S"], + [30934, 0, "O"], + [30935, 0, "N"], + [30936, 0, " "], + [30937, 0, "t"], + [30938, 0, "r"], + [30939, 0, "e"], + [30940, 0, "e"], + [30941, 0, "."], + [30942, 0, " "], + [30943, 0, "H"], + [30944, 0, "e"], + [30945, 0, "r"], + [30946, 0, "e"], + [30947, 0, ","], + [30948, 0, " "], + [30949, 0, "r"], + [30950, 0, "e"], + [30951, 0, "p"], + [30952, 0, "l"], + [30953, 0, "i"], + [30954, 0, "c"], + [30955, 0, "a"], + [30956, 0, " "], + [30957, 0, "$"], + [30958, 0, "p"], + [30959, 0, "$"], + [30960, 0, " "], + [30961, 0, "a"], + [30962, 0, "d"], + [30963, 0, "d"], + [30964, 0, "s"], + [30965, 0, " "], + [30966, 0, "`"], + [30967, 0, "`"], + [30968, 0, "r"], + [30969, 0, "e"], + [30970, 0, "d"], + [30971, 0, "'"], + [30972, 0, "'"], + [30973, 0, " "], + [30974, 0, "t"], + [30975, 0, "o"], + [30976, 0, " "], + [30977, 0, "a"], + [30978, 0, " "], + [30979, 0, "m"], + [30980, 0, "a"], + [30981, 0, "p"], + [30982, 0, " "], + [30983, 0, "o"], + [30984, 0, "f"], + [30985, 0, " "], + [30986, 0, "c"], + [30987, 0, "o"], + [30988, 0, "l"], + [30989, 0, "o"], + [30990, 0, "r"], + [30991, 0, "s"], + [30992, 0, ","], + [30993, 0, " "], + [30994, 0, "w"], + [30995, 0, "h"], + [30996, 0, "i"], + [30997, 0, "l"], + [30998, 0, "e"], + [30999, 0, " "], + [31000, 0, "r"], + [31001, 0, "e"], + [31002, 0, "p"], + [31003, 0, "l"], + [31004, 0, "i"], + [31005, 0, "c"], + [31006, 0, "a"], + [31007, 0, " "], + [31008, 0, "$"], + [31009, 0, "q"], + [31010, 0, "$"], + [31011, 0, " "], + [31012, 0, "c"], + [31013, 0, "o"], + [31014, 0, "n"], + [31015, 0, "c"], + [31016, 0, "u"], + [31017, 0, "r"], + [31018, 0, "r"], + [31019, 0, "e"], + [31020, 0, "n"], + [31021, 0, "t"], + [31022, 0, "l"], + [31023, 0, "y"], + [31024, 0, " "], + [31025, 0, "b"], + [31026, 0, "l"], + [31027, 0, "a"], + [31028, 0, "n"], + [31029, 0, "k"], + [31030, 0, "s"], + [31031, 0, " "], + [31032, 0, "o"], + [31033, 0, "u"], + [31034, 0, "t"], + [31035, 0, " "], + [31036, 0, "t"], + [31037, 0, "h"], + [31038, 0, "e"], + [31039, 0, " "], + [31040, 0, "e"], + [31041, 0, "n"], + [31042, 0, "t"], + [31043, 0, "i"], + [31044, 0, "r"], + [31045, 0, "e"], + [31046, 0, " "], + [31047, 0, "m"], + [31048, 0, "a"], + [31049, 0, "p"], + [31050, 0, " "], + [31051, 0, "o"], + [31052, 0, "f"], + [31053, 0, " "], + [31054, 0, "c"], + [31055, 0, "o"], + [31056, 0, "l"], + [31057, 0, "o"], + [31058, 0, "r"], + [31059, 0, "s"], + [31060, 0, ","], + [31061, 0, " "], + [31062, 0, "a"], + [31063, 0, "n"], + [31064, 0, "d"], + [31065, 0, " "], + [31066, 0, "t"], + [31067, 0, "h"], + [31068, 0, "e"], + [31069, 0, "n"], + [31070, 0, " "], + [31071, 0, "a"], + [31072, 0, "d"], + [31073, 0, "d"], + [31074, 0, "s"], + [31075, 0, " "], + [31060, 1], + [31075, 0, "`"], + [31076, 0, "`"], + [31077, 0, "g"], + [31078, 0, "r"], + [31079, 0, "e"], + [31080, 0, "e"], + [31081, 0, "n"], + [31082, 0, "'"], + [31083, 0, "'"], + [31084, 0, "."], + [31085, 0, " "], + [31086, 0, "I"], + [31087, 0, "n"], + [31088, 0, "s"], + [31089, 0, "t"], + [31090, 0, "e"], + [31091, 0, "a"], + [31092, 0, "d"], + [31093, 0, "e"], + [31093, 1], + [31093, 0, " "], + [31094, 0, "o"], + [31095, 0, "f"], + [31096, 0, " "], + [31097, 0, "a"], + [31098, 0, "s"], + [31099, 0, "s"], + [31100, 0, "i"], + [31101, 0, "g"], + [31102, 0, "n"], + [31103, 0, "i"], + [31104, 0, "n"], + [31105, 0, "g"], + [31106, 0, " "], + [31107, 0, "a"], + [31108, 0, "n"], + [31109, 0, " "], + [31110, 0, "e"], + [31111, 0, "m"], + [31112, 0, "p"], + [31113, 0, "t"], + [31114, 0, "y"], + [31115, 0, " "], + [31116, 0, "m"], + [31117, 0, "a"], + [31118, 0, "p"], + [31119, 0, ","], + [31120, 0, " "], + [31121, 0, "$"], + [31122, 0, "q"], + [31123, 0, "$"], + [31124, 0, " "], + [31125, 0, "c"], + [31126, 0, "o"], + [31127, 0, "u"], + [31128, 0, "l"], + [31129, 0, "d"], + [31130, 0, " "], + [31131, 0, "e"], + [31132, 0, "q"], + [31133, 0, "u"], + [31134, 0, "i"], + [31135, 0, "v"], + [31136, 0, "a"], + [31137, 0, "l"], + [31138, 0, "e"], + [31139, 0, "n"], + [31140, 0, "t"], + [31141, 0, "l"], + [31142, 0, "y"], + [31143, 0, " "], + [31144, 0, "r"], + [31145, 0, "e"], + [31146, 0, "m"], + [31147, 0, "o"], + [31148, 0, "v"], + [31149, 0, "e"], + [31150, 0, " "], + [31151, 0, "t"], + [31152, 0, "h"], + [31153, 0, "e"], + [31154, 0, " "], + [31155, 0, "e"], + [31156, 0, "n"], + [31157, 0, "t"], + [31158, 0, "i"], + [31159, 0, "r"], + [31160, 0, "e"], + [31161, 0, " "], + [31162, 0, "k"], + [31163, 0, "e"], + [31164, 0, "y"], + [31165, 0, " "], + [31166, 0, "`"], + [31167, 0, "`"], + [31168, 0, "c"], + [31169, 0, "o"], + [31170, 0, "l"], + [31171, 0, "o"], + [31172, 0, "r"], + [31173, 0, "s"], + [31174, 0, "'"], + [31175, 0, "'"], + [31176, 0, " "], + [31177, 0, "f"], + [31178, 0, "r"], + [31179, 0, "o"], + [31180, 0, "m"], + [31181, 0, " "], + [31182, 0, "t"], + [31183, 0, "h"], + [31184, 0, "e"], + [31185, 0, " "], + [31186, 0, "o"], + [31187, 0, "u"], + [31188, 0, "t"], + [31189, 0, "e"], + [31190, 0, "r"], + [31191, 0, " "], + [31192, 0, "m"], + [31193, 0, "a"], + [31194, 0, "p"], + [31195, 0, ","], + [31196, 0, " "], + [31197, 0, "a"], + [31198, 0, "n"], + [31199, 0, "d"], + [31200, 0, " "], + [31201, 0, "t"], + [31202, 0, "h"], + [31203, 0, "e"], + [31204, 0, "n"], + [31205, 0, " "], + [31206, 0, "a"], + [31207, 0, "s"], + [31208, 0, "s"], + [31209, 0, "i"], + [31210, 0, "g"], + [31211, 0, "n"], + [31212, 0, " "], + [31213, 0, "a"], + [31214, 0, " "], + [31215, 0, "n"], + [31216, 0, "e"], + [31217, 0, "w"], + [31218, 0, " "], + [31219, 0, "e"], + [31220, 0, "m"], + [31221, 0, "t"], + [31221, 1], + [31221, 0, "p"], + [31222, 0, "t"], + [31223, 0, "y"], + [31224, 0, " "], + [31225, 0, "m"], + [31226, 0, "a"], + [31227, 0, "p"], + [31228, 0, " "], + [31229, 0, "t"], + [31230, 0, "o"], + [31231, 0, " "], + [31232, 0, "t"], + [31233, 0, "h"], + [31234, 0, "a"], + [31235, 0, "t"], + [31236, 0, " "], + [31237, 0, "k"], + [31238, 0, "e"], + [31239, 0, "y"], + [31240, 0, "."], + [31241, 0, " "], + [31242, 0, "T"], + [31243, 0, "h"], + [31244, 0, "e"], + [31245, 0, " "], + [31246, 0, "d"], + [31247, 0, "i"], + [31248, 0, "f"], + [31249, 0, "f"], + [31250, 0, "i"], + [31251, 0, "c"], + [31252, 0, "u"], + [31253, 0, "l"], + [31254, 0, "t"], + [31255, 0, "y"], + [31256, 0, " "], + [31257, 0, "i"], + [31258, 0, "n"], + [31259, 0, " "], + [31260, 0, "t"], + [31261, 0, "h"], + [31262, 0, "i"], + [31263, 0, "s"], + [31264, 0, " "], + [31265, 0, "e"], + [31266, 0, "x"], + [31267, 0, "a"], + [31268, 0, "m"], + [31269, 0, "p"], + [31270, 0, "l"], + [31271, 0, "e"], + [31272, 0, " "], + [31273, 0, "i"], + [31274, 0, "s"], + [31275, 0, " "], + [31276, 0, "t"], + [31277, 0, "h"], + [31278, 0, "a"], + [31279, 0, "t"], + [31280, 0, " "], + [31281, 0, "t"], + [31282, 0, "h"], + [31283, 0, "e"], + [31284, 0, " "], + [31285, 0, "a"], + [31286, 0, "d"], + [31287, 0, "d"], + [31288, 0, "i"], + [31289, 0, "t"], + [31290, 0, "i"], + [31291, 0, "o"], + [31292, 0, "n"], + [31293, 0, " "], + [31294, 0, "o"], + [31295, 0, "f"], + [31296, 0, " "], + [31297, 0, "`"], + [31298, 0, "`"], + [31299, 0, "r"], + [31300, 0, "e"], + [31301, 0, "d"], + [31302, 0, "'"], + [31303, 0, "'"], + [31304, 0, " "], + [31305, 0, "o"], + [31306, 0, "c"], + [31307, 0, "c"], + [31308, 0, "u"], + [31309, 0, "r"], + [31310, 0, "s"], + [31311, 0, " "], + [31312, 0, "a"], + [31313, 0, "t"], + [31314, 0, " "], + [31315, 0, "a"], + [31316, 0, " "], + [31317, 0, "l"], + [31318, 0, "o"], + [31319, 0, "w"], + [31320, 0, "e"], + [31321, 0, "r"], + [31322, 0, " "], + [31323, 0, "l"], + [31324, 0, "e"], + [31325, 0, "v"], + [31326, 0, "e"], + [31327, 0, "l"], + [31328, 0, " "], + [31329, 0, "o"], + [31330, 0, "f"], + [31331, 0, " "], + [31332, 0, "t"], + [31333, 0, "h"], + [31334, 0, "e"], + [31335, 0, " "], + [31336, 0, "t"], + [31337, 0, "r"], + [31338, 0, "e"], + [31339, 0, "e"], + [31340, 0, ","], + [31341, 0, " "], + [31342, 0, "w"], + [31343, 0, "h"], + [31344, 0, "i"], + [31345, 0, "l"], + [31346, 0, "e"], + [31347, 0, " "], + [31348, 0, "c"], + [31349, 0, "o"], + [31350, 0, "n"], + [31351, 0, "c"], + [31352, 0, "u"], + [31353, 0, "r"], + [31354, 0, "r"], + [31355, 0, "e"], + [31356, 0, "n"], + [31357, 0, "t"], + [31358, 0, "l"], + [31359, 0, "y"], + [31360, 0, " "], + [31361, 0, "t"], + [31362, 0, "h"], + [31363, 0, "e"], + [31364, 0, " "], + [31365, 0, "r"], + [31366, 0, "e"], + [31367, 0, "m"], + [31368, 0, "o"], + [31369, 0, "v"], + [31370, 0, "a"], + [31371, 0, "l"], + [31372, 0, " "], + [31373, 0, "o"], + [31374, 0, "f"], + [31375, 0, " "], + [31376, 0, "t"], + [31377, 0, "h"], + [31378, 0, "e"], + [31379, 0, " "], + [31380, 0, "m"], + [31381, 0, "a"], + [31382, 0, "p"], + [31383, 0, " "], + [31384, 0, "o"], + [31385, 0, "f"], + [31386, 0, " "], + [31387, 0, "c"], + [31388, 0, "o"], + [31389, 0, "l"], + [31390, 0, "o"], + [31391, 0, "r"], + [31392, 0, "s"], + [31393, 0, " "], + [31394, 0, "o"], + [31395, 0, "c"], + [31396, 0, "c"], + [31397, 0, "u"], + [31398, 0, "r"], + [31399, 0, "s"], + [31400, 0, " "], + [31401, 0, "a"], + [31402, 0, "t"], + [31403, 0, " "], + [31404, 0, "a"], + [31405, 0, " "], + [31406, 0, "h"], + [31407, 0, "i"], + [31408, 0, "g"], + [31409, 0, "h"], + [31410, 0, "e"], + [31411, 0, "r"], + [31412, 0, " "], + [31413, 0, "l"], + [31414, 0, "e"], + [31415, 0, "v"], + [31416, 0, "e"], + [31417, 0, "l"], + [31418, 0, " "], + [31419, 0, "o"], + [31420, 0, "f"], + [31421, 0, " "], + [31422, 0, "t"], + [31423, 0, "h"], + [31424, 0, "e"], + [31425, 0, " "], + [31426, 0, "t"], + [31427, 0, "r"], + [31428, 0, "e"], + [31429, 0, "e"], + [31430, 0, "."], + [31431, 0, "\n"], + [31432, 0, "\n"], + [31433, 0, "O"], + [31434, 0, "n"], + [31435, 0, "e"], + [31436, 0, " "], + [31437, 0, "p"], + [31438, 0, "o"], + [31439, 0, "s"], + [31440, 0, "s"], + [31441, 0, "i"], + [31442, 0, "b"], + [31443, 0, "l"], + [31444, 0, "e"], + [31445, 0, " "], + [31446, 0, "w"], + [31447, 0, "a"], + [31448, 0, "y"], + [31449, 0, " "], + [31450, 0, "o"], + [31451, 0, "f"], + [31452, 0, " "], + [31453, 0, "h"], + [31454, 0, "a"], + [31455, 0, "n"], + [31456, 0, "d"], + [31457, 0, "l"], + [31458, 0, "i"], + [31459, 0, "n"], + [31460, 0, "g"], + [31461, 0, " "], + [31462, 0, "s"], + [31463, 0, "u"], + [31464, 0, "c"], + [31465, 0, "h"], + [31466, 0, " "], + [31467, 0, "a"], + [31468, 0, " "], + [31469, 0, "c"], + [31470, 0, "o"], + [31471, 0, "n"], + [31472, 0, "f"], + [31473, 0, "l"], + [31474, 0, "i"], + [31475, 0, "c"], + [31476, 0, "t"], + [31477, 0, " "], + [31478, 0, "w"], + [31479, 0, "o"], + [31480, 0, "u"], + [31481, 0, "l"], + [31482, 0, "d"], + [31483, 0, " "], + [31484, 0, "b"], + [31485, 0, "e"], + [31486, 0, " "], + [31487, 0, "t"], + [31488, 0, "o"], + [31489, 0, " "], + [31490, 0, "l"], + [31491, 0, "e"], + [31492, 0, "t"], + [31493, 0, " "], + [31494, 0, "e"], + [31495, 0, "d"], + [31496, 0, "i"], + [31497, 0, "t"], + [31498, 0, "s"], + [31499, 0, " "], + [31500, 0, "a"], + [31501, 0, "t"], + [31502, 0, " "], + [31503, 0, "h"], + [31504, 0, "i"], + [31505, 0, "g"], + [31506, 0, "h"], + [31507, 0, "e"], + [31508, 0, "r"], + [31509, 0, " "], + [31510, 0, "l"], + [31511, 0, "e"], + [31512, 0, "v"], + [31513, 0, "e"], + [31514, 0, "l"], + [31515, 0, "s"], + [31516, 0, " "], + [31517, 0, "o"], + [31518, 0, "f"], + [31519, 0, " "], + [31520, 0, "t"], + [31521, 0, "h"], + [31522, 0, "e"], + [31523, 0, " "], + [31524, 0, "t"], + [31525, 0, "r"], + [31526, 0, "e"], + [31527, 0, "e"], + [31528, 0, " "], + [31529, 0, "a"], + [31530, 0, "l"], + [31531, 0, "w"], + [31532, 0, "a"], + [31533, 0, "y"], + [31534, 0, "s"], + [31535, 0, " "], + [31536, 0, "o"], + [31537, 0, "v"], + [31538, 0, "e"], + [31539, 0, "r"], + [31540, 0, "r"], + [31541, 0, "i"], + [31542, 0, "d"], + [31543, 0, "e"], + [31544, 0, " "], + [31545, 0, "c"], + [31546, 0, "o"], + [31547, 0, "n"], + [31548, 0, "c"], + [31549, 0, "u"], + [31550, 0, "r"], + [31551, 0, "r"], + [31552, 0, "e"], + [31553, 0, "n"], + [31554, 0, "t"], + [31555, 0, " "], + [31556, 0, "e"], + [31557, 0, "d"], + [31558, 0, "i"], + [31559, 0, "t"], + [31560, 0, "s"], + [31561, 0, " "], + [31562, 0, "w"], + [31563, 0, "i"], + [31564, 0, "t"], + [31565, 0, "h"], + [31566, 0, "i"], + [31567, 0, "n"], + [31568, 0, " "], + [31569, 0, "t"], + [31570, 0, "h"], + [31571, 0, "a"], + [31572, 0, "t"], + [31573, 0, " "], + [31574, 0, "s"], + [31575, 0, "u"], + [31576, 0, "b"], + [31577, 0, "t"], + [31578, 0, "r"], + [31579, 0, "e"], + [31580, 0, "e"], + [31581, 0, "."], + [31582, 0, " "], + [31583, 0, "I"], + [31584, 0, "n"], + [31585, 0, " "], + [31586, 0, "t"], + [31587, 0, "h"], + [31588, 0, "i"], + [31589, 0, "s"], + [31590, 0, " "], + [31591, 0, "c"], + [31592, 0, "a"], + [31593, 0, "s"], + [31594, 0, "e"], + [31595, 0, ","], + [31596, 0, " "], + [31597, 0, "t"], + [31598, 0, "h"], + [31599, 0, "a"], + [31600, 0, "t"], + [31601, 0, " "], + [31602, 0, "w"], + [31603, 0, "o"], + [31604, 0, "u"], + [31605, 0, "l"], + [31606, 0, "d"], + [31607, 0, " "], + [31608, 0, "m"], + [31609, 0, "e"], + [31610, 0, "a"], + [31611, 0, "n"], + [31612, 0, " "], + [31613, 0, "t"], + [31614, 0, "h"], + [31615, 0, "e"], + [31616, 0, " "], + [31617, 0, "a"], + [31618, 0, "d"], + [31619, 0, "d"], + [31620, 0, "i"], + [31621, 0, "t"], + [31622, 0, "i"], + [31623, 0, "o"], + [31624, 0, "n"], + [31625, 0, " "], + [31626, 0, "o"], + [31627, 0, "f"], + [31628, 0, " "], + [31629, 0, "`"], + [31630, 0, "`"], + [31631, 0, "r"], + [31632, 0, "e"], + [31633, 0, "d"], + [31634, 0, "'"], + [31635, 0, "'"], + [31636, 0, " "], + [31637, 0, "w"], + [31638, 0, "o"], + [31639, 0, "u"], + [31640, 0, "l"], + [31641, 0, "d"], + [31642, 0, " "], + [31643, 0, "b"], + [31644, 0, "e"], + [31645, 0, " "], + [31646, 0, "d"], + [31647, 0, "i"], + [31648, 0, "s"], + [31649, 0, "c"], + [31650, 0, "a"], + [31651, 0, "r"], + [31652, 0, "d"], + [31653, 0, "e"], + [31654, 0, "d"], + [31655, 0, ","], + [31656, 0, " "], + [31657, 0, "s"], + [31658, 0, "i"], + [31659, 0, "n"], + [31660, 0, "c"], + [31661, 0, "e"], + [31662, 0, " "], + [31663, 0, "i"], + [31664, 0, "t"], + [31665, 0, " "], + [31666, 0, "w"], + [31667, 0, "o"], + [31668, 0, "u"], + [31669, 0, "l"], + [31670, 0, "d"], + [31671, 0, " "], + [31672, 0, "b"], + [31673, 0, "e"], + [31674, 0, " "], + [31675, 0, "o"], + [31676, 0, "v"], + [31677, 0, "e"], + [31678, 0, "r"], + [31679, 0, "r"], + [31680, 0, "i"], + [31681, 0, "d"], + [31682, 0, "d"], + [31683, 0, "e"], + [31684, 0, "n"], + [31685, 0, " "], + [31686, 0, "b"], + [31687, 0, "y"], + [31688, 0, " "], + [31689, 0, "t"], + [31690, 0, "h"], + [31691, 0, "e"], + [31692, 0, " "], + [31693, 0, "b"], + [31694, 0, "l"], + [31695, 0, "a"], + [31696, 0, "n"], + [31697, 0, "k"], + [31698, 0, "i"], + [31699, 0, "n"], + [31700, 0, "g"], + [31701, 0, "-"], + [31702, 0, "o"], + [31703, 0, "u"], + [31704, 0, "t"], + [31705, 0, " "], + [31706, 0, "o"], + [31707, 0, "f"], + [31708, 0, " "], + [31709, 0, "t"], + [31710, 0, "h"], + [31711, 0, "e"], + [31712, 0, " "], + [31713, 0, "e"], + [31714, 0, "n"], + [31715, 0, "t"], + [31716, 0, "i"], + [31717, 0, "r"], + [31718, 0, "e"], + [31719, 0, " "], + [31720, 0, "m"], + [31721, 0, "a"], + [31722, 0, "p"], + [31723, 0, " "], + [31724, 0, "o"], + [31725, 0, "f"], + [31726, 0, " "], + [31727, 0, "c"], + [31728, 0, "o"], + [31729, 0, "l"], + [31730, 0, "o"], + [31731, 0, "r"], + [31732, 0, "s"], + [31733, 0, "."], + [31734, 0, " "], + [31735, 0, "H"], + [31736, 0, "o"], + [31737, 0, "w"], + [31738, 0, "e"], + [31739, 0, "v"], + [31740, 0, "e"], + [31741, 0, "r"], + [31742, 0, ","], + [31743, 0, " "], + [31744, 0, "t"], + [31745, 0, "h"], + [31746, 0, "a"], + [31747, 0, "t"], + [31748, 0, " "], + [31749, 0, "b"], + [31750, 0, "e"], + [31751, 0, "h"], + [31752, 0, "a"], + [31753, 0, "v"], + [31754, 0, "i"], + [31755, 0, "o"], + [31756, 0, "r"], + [31757, 0, " "], + [31758, 0, "w"], + [31759, 0, "o"], + [31760, 0, "u"], + [31761, 0, "l"], + [31762, 0, "d"], + [31763, 0, " "], + [31764, 0, "n"], + [31765, 0, "o"], + [31766, 0, "t"], + [31767, 0, " "], + [31768, 0, "m"], + [31769, 0, "e"], + [31770, 0, "e"], + [31771, 0, "t"], + [31772, 0, " "], + [31773, 0, "o"], + [31774, 0, "u"], + [31775, 0, "r"], + [31776, 0, " "], + [31777, 0, "r"], + [31778, 0, "e"], + [31779, 0, "q"], + [31780, 0, "u"], + [31781, 0, "i"], + [31782, 0, "r"], + [31783, 0, "e"], + [31784, 0, "m"], + [31785, 0, "e"], + [31786, 0, "n"], + [31787, 0, "t"], + [31788, 0, " "], + [31789, 0, "t"], + [31790, 0, "h"], + [31791, 0, "a"], + [31792, 0, "t"], + [31793, 0, " "], + [31771, 1], + [31770, 1], + [31769, 1], + [31768, 1], + [31767, 1], + [31766, 1], + [31765, 1], + [31764, 1], + [31764, 0, "v"], + [31765, 0, "i"], + [31766, 0, "o"], + [31767, 0, "l"], + [31768, 0, "a"], + [31769, 0, "t"], + [31770, 0, "e"], + [31793, 0, "n"], + [31794, 0, "o"], + [31795, 0, " "], + [31796, 0, "u"], + [31797, 0, "s"], + [31798, 0, "e"], + [31799, 0, "r"], + [31800, 0, " "], + [31801, 0, "i"], + [31802, 0, "n"], + [31803, 0, "p"], + [31804, 0, "u"], + [31805, 0, "t"], + [31806, 0, " "], + [31807, 0, "s"], + [31808, 0, "h"], + [31809, 0, "o"], + [31810, 0, "u"], + [31811, 0, "l"], + [31812, 0, "d"], + [31813, 0, " "], + [31814, 0, "b"], + [31815, 0, "e"], + [31816, 0, " "], + [31817, 0, "l"], + [31818, 0, "o"], + [31819, 0, "s"], + [31820, 0, "t"], + [31821, 0, " "], + [31822, 0, "d"], + [31823, 0, "u"], + [31824, 0, "e"], + [31825, 0, " "], + [31826, 0, "t"], + [31827, 0, "o"], + [31828, 0, " "], + [31829, 0, "c"], + [31830, 0, "o"], + [31831, 0, "n"], + [31832, 0, "c"], + [31833, 0, "u"], + [31834, 0, "r"], + [31835, 0, "r"], + [31836, 0, "e"], + [31837, 0, "n"], + [31838, 0, "t"], + [31839, 0, " "], + [31840, 0, "m"], + [31841, 0, "o"], + [31842, 0, "d"], + [31843, 0, "i"], + [31844, 0, "f"], + [31845, 0, "i"], + [31846, 0, "c"], + [31847, 0, "a"], + [31848, 0, "t"], + [31849, 0, "i"], + [31850, 0, "o"], + [31851, 0, "n"], + [31852, 0, "s"], + [31853, 0, "."], + [31854, 0, " "], + [31855, 0, "I"], + [31856, 0, "n"], + [31857, 0, "s"], + [31858, 0, "t"], + [31859, 0, "e"], + [31860, 0, "a"], + [31861, 0, "d"], + [31862, 0, ","], + [31863, 0, " "], + [31864, 0, "w"], + [31865, 0, "e"], + [31866, 0, " "], + [31867, 0, "e"], + [31867, 1], + [31867, 0, "d"], + [31868, 0, "e"], + [31869, 0, "f"], + [31870, 0, "i"], + [31871, 0, "n"], + [31872, 0, "e"], + [31873, 0, " "], + [31874, 0, "m"], + [31875, 0, "e"], + [31876, 0, "r"], + [31877, 0, "g"], + [31878, 0, "e"], + [31879, 0, " "], + [31880, 0, "s"], + [31881, 0, "e"], + [31882, 0, "m"], + [31883, 0, "a"], + [31884, 0, "n"], + [31885, 0, "t"], + [31886, 0, "i"], + [31887, 0, "c"], + [31888, 0, "s"], + [31889, 0, " "], + [31890, 0, "t"], + [31891, 0, "h"], + [31892, 0, "a"], + [31893, 0, "t"], + [31894, 0, " "], + [31895, 0, "p"], + [31896, 0, "r"], + [31897, 0, "e"], + [31898, 0, "s"], + [31899, 0, "e"], + [31900, 0, "r"], + [31901, 0, "v"], + [31902, 0, "e"], + [31903, 0, " "], + [31904, 0, "a"], + [31905, 0, "l"], + [31906, 0, "l"], + [31907, 0, " "], + [31908, 0, "c"], + [31909, 0, "h"], + [31910, 0, "a"], + [31911, 0, "n"], + [31912, 0, "g"], + [31913, 0, "e"], + [31914, 0, "s"], + [31915, 0, ","], + [31916, 0, " "], + [31917, 0, "a"], + [31918, 0, "s"], + [31919, 0, " "], + [31920, 0, "s"], + [31921, 0, "h"], + [31922, 0, "o"], + [31923, 0, "w"], + [31924, 0, "n"], + [31925, 0, " "], + [31926, 0, "i"], + [31927, 0, "n"], + [31928, 0, " "], + [31929, 0, "F"], + [31930, 0, "i"], + [31931, 0, "g"], + [31932, 0, "u"], + [31933, 0, "r"], + [31934, 0, "e"], + [31935, 0, "~"], + [31936, 0, "\\"], + [31937, 0, "r"], + [31938, 0, "e"], + [31939, 0, "f"], + [31940, 0, "{"], + [31941, 0, "f"], + [31942, 0, "i"], + [31943, 0, "g"], + [31944, 0, ":"], + [31945, 0, "m"], + [31946, 0, "a"], + [31947, 0, "p"], + [31948, 0, "-"], + [31949, 0, "r"], + [31950, 0, "e"], + [31951, 0, "m"], + [31952, 0, "o"], + [31953, 0, "v"], + [31954, 0, "e"], + [31955, 0, "}"], + [31956, 0, ":"], + [31957, 0, " "], + [31958, 0, "`"], + [31959, 0, "`"], + [31960, 0, "b"], + [31961, 0, "l"], + [31962, 0, "u"], + [31963, 0, "e"], + [31964, 0, "'"], + [31965, 0, "'"], + [31966, 0, " "], + [31967, 0, "m"], + [31968, 0, "u"], + [31969, 0, "s"], + [31970, 0, "t"], + [31971, 0, " "], + [31972, 0, "b"], + [31973, 0, "e"], + [31974, 0, " "], + [31975, 0, "a"], + [31976, 0, "b"], + [31977, 0, "s"], + [31978, 0, "e"], + [31979, 0, "n"], + [31980, 0, "t"], + [31981, 0, " "], + [31982, 0, "f"], + [31983, 0, "r"], + [31984, 0, "o"], + [31985, 0, "m"], + [31986, 0, " "], + [31987, 0, "t"], + [31988, 0, "h"], + [31989, 0, "e"], + [31990, 0, " "], + [31991, 0, "f"], + [31992, 0, "i"], + [31993, 0, "n"], + [31994, 0, "a"], + [31995, 0, "l"], + [31996, 0, " "], + [31997, 0, "m"], + [31998, 0, "a"], + [31999, 0, "p"], + [32000, 0, ","], + [32001, 0, " "], + [32002, 0, "s"], + [32003, 0, "i"], + [32004, 0, "n"], + [32005, 0, "c"], + [32006, 0, "e"], + [32007, 0, " "], + [32008, 0, "i"], + [32009, 0, "t"], + [32010, 0, " "], + [32011, 0, "w"], + [32012, 0, "a"], + [32013, 0, "s"], + [32014, 0, " "], + [32015, 0, "r"], + [32016, 0, "e"], + [32017, 0, "m"], + [32018, 0, "o"], + [32019, 0, "v"], + [32020, 0, "e"], + [32021, 0, "d"], + [32022, 0, " "], + [32023, 0, "b"], + [32024, 0, "y"], + [32025, 0, " "], + [32026, 0, "b"], + [32027, 0, "l"], + [32028, 0, "a"], + [32029, 0, "n"], + [32030, 0, "k"], + [32031, 0, "i"], + [32032, 0, "n"], + [32033, 0, "g"], + [32034, 0, " "], + [32035, 0, "o"], + [32036, 0, "u"], + [32037, 0, "t"], + [32038, 0, " "], + [32039, 0, "t"], + [32040, 0, "h"], + [32041, 0, "e"], + [32042, 0, " "], + [32043, 0, "m"], + [32044, 0, "a"], + [32045, 0, "p"], + [32046, 0, ","], + [32047, 0, " "], + [32048, 0, "w"], + [32049, 0, "h"], + [32050, 0, "i"], + [32051, 0, "l"], + [32052, 0, "e"], + [32053, 0, " "], + [32054, 0, "`"], + [32055, 0, "`"], + [32056, 0, "r"], + [32057, 0, "e"], + [32058, 0, "d"], + [32059, 0, "'"], + [32060, 0, "'"], + [32061, 0, " "], + [32062, 0, "a"], + [32063, 0, "n"], + [32064, 0, "d"], + [32065, 0, " "], + [32066, 0, "`"], + [32067, 0, "`"], + [32068, 0, "g"], + [32069, 0, "r"], + [32070, 0, "e"], + [32071, 0, "e"], + [32072, 0, "n"], + [32073, 0, "'"], + [32074, 0, "'"], + [32075, 0, " "], + [32076, 0, "m"], + [32077, 0, "u"], + [32078, 0, "s"], + [32079, 0, "t"], + [32080, 0, " "], + [32081, 0, "b"], + [32082, 0, "e"], + [32083, 0, " "], + [32084, 0, "p"], + [32085, 0, "r"], + [32086, 0, "e"], + [32087, 0, "s"], + [32088, 0, "e"], + [32089, 0, "n"], + [32090, 0, "t"], + [32091, 0, " "], + [32091, 1], + [32091, 0, ","], + [32092, 0, " "], + [32093, 0, "s"], + [32094, 0, "i"], + [32095, 0, "n"], + [32096, 0, "c"], + [32097, 0, "e"], + [32098, 0, " "], + [32099, 0, "t"], + [32100, 0, "h"], + [32101, 0, "e"], + [32102, 0, "y"], + [32103, 0, " "], + [32104, 0, "w"], + [32105, 0, "e"], + [32106, 0, "r"], + [32107, 0, "e"], + [32108, 0, " "], + [32109, 0, "e"], + [32110, 0, "x"], + [32111, 0, "p"], + [32112, 0, "l"], + [32113, 0, "i"], + [32114, 0, "c"], + [32115, 0, "i"], + [32116, 0, "t"], + [32117, 0, "l"], + [32118, 0, "y"], + [32119, 0, " "], + [32120, 0, "a"], + [32121, 0, "d"], + [32122, 0, "d"], + [32123, 0, "e"], + [32124, 0, "d"], + [32125, 0, "."], + [32126, 0, " "], + [32127, 0, "T"], + [32128, 0, "h"], + [32129, 0, "i"], + [32130, 0, "s"], + [32131, 0, " "], + [32132, 0, "b"], + [32133, 0, "e"], + [32134, 0, "h"], + [32135, 0, "a"], + [32136, 0, "v"], + [32137, 0, "i"], + [32138, 0, "o"], + [32139, 0, "r"], + [32140, 0, " "], + [32141, 0, "m"], + [32142, 0, "a"], + [32143, 0, "t"], + [32144, 0, "c"], + [32145, 0, "h"], + [32146, 0, "e"], + [32147, 0, "s"], + [32148, 0, " "], + [32149, 0, "t"], + [32150, 0, "h"], + [32151, 0, "a"], + [32152, 0, "t"], + [32153, 0, " "], + [32154, 0, "o"], + [32155, 0, "f"], + [32156, 0, " "], + [32157, 0, "C"], + [32158, 0, "R"], + [32159, 0, "D"], + [32160, 0, "T"], + [32161, 0, " "], + [32162, 0, "m"], + [32163, 0, "a"], + [32164, 0, "p"], + [32165, 0, "s"], + [32166, 0, " "], + [32167, 0, "i"], + [32168, 0, "n"], + [32169, 0, " "], + [32170, 0, "R"], + [32171, 0, "i"], + [32172, 0, "a"], + [32173, 0, "k"], + [32174, 0, "~"], + [32175, 0, "\\"], + [32176, 0, "c"], + [32177, 0, "i"], + [32178, 0, "t"], + [32179, 0, "e"], + [32180, 0, "{"], + [32181, 0, "B"], + [32182, 0, "r"], + [32183, 0, "o"], + [32184, 0, "w"], + [32185, 0, "n"], + [32186, 0, ":"], + [32187, 0, "2"], + [32188, 0, "0"], + [32189, 0, "1"], + [32190, 0, "4"], + [32191, 0, "h"], + [32192, 0, "s"], + [32193, 0, ","], + [32194, 0, "B"], + [32195, 0, "r"], + [32196, 0, "o"], + [32197, 0, "w"], + [32198, 0, "n"], + [32199, 0, ":"], + [32200, 0, "2"], + [32201, 0, "0"], + [32202, 0, "1"], + [32203, 0, "3"], + [32204, 0, "w"], + [32205, 0, "y"], + [32206, 0, "}"], + [32207, 0, "."], + [24284, 1], + [24283, 1], + [24282, 1], + [24281, 1], + [24280, 1], + [24279, 1], + [24278, 1], + [24277, 1], + [24276, 1], + [24275, 1], + [24274, 1], + [24273, 1], + [24272, 1], + [24271, 1], + [24270, 1], + [24269, 1], + [24268, 1], + [24267, 1], + [24266, 1], + [24265, 1], + [24264, 1], + [24263, 1], + [24262, 1], + [24261, 1], + [24260, 1], + [24259, 1], + [24258, 1], + [24257, 1], + [24256, 1], + [24255, 1], + [24254, 1], + [24253, 1], + [24252, 1], + [24251, 1], + [24250, 1], + [24249, 1], + [24248, 1], + [24247, 1], + [24246, 1], + [24245, 1], + [24244, 1], + [24243, 1], + [24242, 1], + [24241, 1], + [24240, 1], + [24239, 1], + [24238, 1], + [24237, 1], + [24236, 1], + [24235, 1], + [24234, 1], + [24233, 1], + [24232, 1], + [24231, 1], + [24230, 1], + [24229, 1], + [24228, 1], + [24227, 1], + [24226, 1], + [24225, 1], + [24224, 1], + [24223, 1], + [24222, 1], + [24221, 1], + [24220, 1], + [24219, 1], + [24218, 1], + [24217, 1], + [24216, 1], + [24215, 1], + [24214, 1], + [24213, 1], + [24212, 1], + [24211, 1], + [24210, 1], + [24209, 1], + [24208, 1], + [24207, 1], + [24206, 1], + [24205, 1], + [24204, 1], + [24203, 1], + [24202, 1], + [24201, 1], + [24200, 1], + [24199, 1], + [24198, 1], + [24197, 1], + [24196, 1], + [24195, 1], + [24194, 1], + [24193, 1], + [24192, 1], + [24191, 1], + [24190, 1], + [24189, 1], + [24188, 1], + [24187, 1], + [24186, 1], + [24185, 1], + [24184, 1], + [24183, 1], + [24182, 1], + [24181, 1], + [24180, 1], + [24179, 1], + [24178, 1], + [24177, 1], + [24176, 1], + [24175, 1], + [24174, 1], + [24173, 1], + [24172, 1], + [24171, 1], + [24170, 1], + [24169, 1], + [24168, 1], + [24167, 1], + [24166, 1], + [24165, 1], + [24164, 1], + [24163, 1], + [24162, 1], + [24161, 1], + [24160, 1], + [24159, 1], + [24158, 1], + [24157, 1], + [24156, 1], + [24155, 1], + [24154, 1], + [24153, 1], + [24152, 1], + [24151, 1], + [24150, 1], + [24149, 1], + [24148, 1], + [24147, 1], + [24146, 1], + [24145, 1], + [24144, 1], + [24143, 1], + [24142, 1], + [24141, 1], + [24140, 1], + [24139, 1], + [24138, 1], + [24137, 1], + [24136, 1], + [24135, 1], + [24134, 1], + [24133, 1], + [24132, 1], + [24131, 1], + [24130, 1], + [24129, 1], + [24128, 1], + [24127, 1], + [24126, 1], + [24125, 1], + [24124, 1], + [24123, 1], + [24122, 1], + [24121, 1], + [24120, 1], + [24119, 1], + [24118, 1], + [24117, 1], + [24116, 1], + [24115, 1], + [24114, 1], + [24113, 1], + [24112, 1], + [24111, 1], + [24110, 1], + [24109, 1], + [24108, 1], + [24107, 1], + [24106, 1], + [24105, 1], + [24104, 1], + [24103, 1], + [24102, 1], + [24101, 1], + [24100, 1], + [24099, 1], + [24098, 1], + [24097, 1], + [24096, 1], + [24095, 1], + [24094, 1], + [24093, 1], + [24092, 1], + [24091, 1], + [24090, 1], + [24089, 1], + [24088, 1], + [24087, 1], + [24086, 1], + [24085, 1], + [24084, 1], + [24083, 1], + [24082, 1], + [24081, 1], + [24080, 1], + [24079, 1], + [24078, 1], + [24077, 1], + [24076, 1], + [24075, 1], + [24074, 1], + [24073, 1], + [24072, 1], + [24071, 1], + [24070, 1], + [24069, 1], + [24068, 1], + [24067, 1], + [24066, 1], + [24065, 1], + [24064, 1], + [24063, 1], + [24062, 1], + [24061, 1], + [24060, 1], + [24059, 1], + [24058, 1], + [24057, 1], + [24056, 1], + [24055, 1], + [24054, 1], + [24053, 1], + [24052, 1], + [24051, 1], + [24050, 1], + [24049, 1], + [24048, 1], + [24047, 1], + [24046, 1], + [24045, 1], + [24044, 1], + [24043, 1], + [24042, 1], + [24041, 1], + [24040, 1], + [24039, 1], + [24038, 1], + [24037, 1], + [24036, 1], + [24035, 1], + [24034, 1], + [24033, 1], + [24032, 1], + [24031, 1], + [24030, 1], + [24029, 1], + [24028, 1], + [24027, 1], + [24026, 1], + [24025, 1], + [24024, 1], + [24023, 1], + [24022, 1], + [24021, 1], + [24020, 1], + [24019, 1], + [24018, 1], + [24017, 1], + [24016, 1], + [24015, 1], + [24014, 1], + [24013, 1], + [24012, 1], + [24011, 1], + [24010, 1], + [24009, 1], + [24008, 1], + [24007, 1], + [24006, 1], + [24005, 1], + [24004, 1], + [24003, 1], + [24002, 1], + [24001, 1], + [24000, 1], + [23999, 1], + [23998, 1], + [23997, 1], + [23996, 1], + [23995, 1], + [23994, 1], + [23993, 1], + [23992, 1], + [23991, 1], + [23990, 1], + [23989, 1], + [23988, 1], + [23987, 1], + [23986, 1], + [23985, 1], + [23984, 1], + [23983, 1], + [23982, 1], + [23981, 1], + [23980, 1], + [23979, 1], + [23978, 1], + [23977, 1], + [23976, 1], + [23975, 1], + [23974, 1], + [23973, 1], + [23972, 1], + [23971, 1], + [23970, 1], + [23969, 1], + [23968, 1], + [23967, 1], + [23966, 1], + [23965, 1], + [23964, 1], + [23963, 1], + [23962, 1], + [23961, 1], + [23960, 1], + [23959, 1], + [23958, 1], + [23957, 1], + [23956, 1], + [23955, 1], + [23954, 1], + [23953, 1], + [23952, 1], + [23951, 1], + [23950, 1], + [23949, 1], + [23948, 1], + [23947, 1], + [23946, 1], + [23945, 1], + [23944, 1], + [23943, 1], + [23942, 1], + [23941, 1], + [23940, 1], + [23939, 1], + [23938, 1], + [23937, 1], + [23936, 1], + [23935, 1], + [23934, 1], + [23933, 1], + [23932, 1], + [23931, 1], + [23930, 1], + [23929, 1], + [23928, 1], + [23927, 1], + [23926, 1], + [23925, 1], + [23924, 1], + [23923, 1], + [23922, 1], + [23921, 1], + [23920, 1], + [23919, 1], + [23918, 1], + [23917, 1], + [23916, 1], + [23915, 1], + [23914, 1], + [23913, 1], + [23912, 1], + [23911, 1], + [23910, 1], + [23909, 1], + [23908, 1], + [23907, 1], + [23906, 1], + [23905, 1], + [23904, 1], + [23903, 1], + [23902, 1], + [23901, 1], + [23900, 1], + [23899, 1], + [23898, 1], + [23897, 1], + [23896, 1], + [23895, 1], + [23894, 1], + [23893, 1], + [23892, 1], + [23891, 1], + [23890, 1], + [23889, 1], + [23888, 1], + [23887, 1], + [23886, 1], + [23885, 1], + [23884, 1], + [23883, 1], + [23882, 1], + [23881, 1], + [23880, 1], + [23879, 1], + [23878, 1], + [23877, 1], + [23876, 1], + [23875, 1], + [23874, 1], + [23873, 1], + [23872, 1], + [23871, 1], + [23870, 1], + [23869, 1], + [23868, 1], + [23867, 1], + [23866, 1], + [23865, 1], + [23864, 1], + [23863, 1], + [23862, 1], + [23861, 1], + [23860, 1], + [23859, 1], + [23858, 1], + [23857, 1], + [23856, 1], + [23855, 1], + [23854, 1], + [23853, 1], + [23852, 1], + [23851, 1], + [23850, 1], + [23849, 1], + [23848, 1], + [23847, 1], + [23846, 1], + [23845, 1], + [23844, 1], + [23843, 1], + [23842, 1], + [23841, 1], + [23840, 1], + [23839, 1], + [23838, 1], + [23837, 1], + [23836, 1], + [23835, 1], + [23834, 1], + [23833, 1], + [23832, 1], + [23831, 1], + [23830, 1], + [23829, 1], + [23828, 1], + [23827, 1], + [23826, 1], + [23825, 1], + [23824, 1], + [23823, 1], + [23822, 1], + [23821, 1], + [23820, 1], + [23819, 1], + [23818, 1], + [23817, 1], + [23816, 1], + [23815, 1], + [23814, 1], + [23813, 1], + [23812, 1], + [23811, 1], + [23810, 1], + [23809, 1], + [23808, 1], + [23807, 1], + [23806, 1], + [23805, 1], + [23804, 1], + [23803, 1], + [23802, 1], + [23801, 1], + [23800, 1], + [23799, 1], + [23798, 1], + [23797, 1], + [23796, 1], + [23795, 1], + [23794, 1], + [23793, 1], + [23792, 1], + [23791, 1], + [23790, 1], + [23789, 1], + [23788, 1], + [23787, 1], + [23786, 1], + [23785, 1], + [23784, 1], + [23783, 1], + [23782, 1], + [23781, 1], + [23780, 1], + [23779, 1], + [23778, 1], + [23777, 1], + [23776, 1], + [23775, 1], + [23774, 1], + [23773, 1], + [23772, 1], + [23771, 1], + [23770, 1], + [23769, 1], + [23768, 1], + [23767, 1], + [23766, 1], + [23765, 1], + [23764, 1], + [23763, 1], + [23762, 1], + [23761, 1], + [23760, 1], + [23759, 1], + [23758, 1], + [23757, 1], + [23756, 1], + [23755, 1], + [23754, 1], + [23753, 1], + [23752, 1], + [23751, 1], + [23750, 1], + [23749, 1], + [23748, 1], + [23747, 1], + [23746, 1], + [23745, 1], + [23744, 1], + [23743, 1], + [23742, 1], + [23741, 1], + [23740, 1], + [23739, 1], + [23738, 1], + [23737, 1], + [23736, 1], + [23735, 1], + [23734, 1], + [23733, 1], + [23732, 1], + [23731, 1], + [23730, 1], + [23729, 1], + [23728, 1], + [23727, 1], + [23726, 1], + [23725, 1], + [23724, 1], + [23723, 1], + [23722, 1], + [23721, 1], + [23720, 1], + [23719, 1], + [23718, 1], + [23717, 1], + [23716, 1], + [23715, 1], + [23714, 1], + [23713, 1], + [23712, 1], + [23711, 1], + [23710, 1], + [23709, 1], + [23708, 1], + [23707, 1], + [23706, 1], + [23705, 1], + [23704, 1], + [23703, 1], + [23702, 1], + [23701, 1], + [23700, 1], + [23699, 1], + [23698, 1], + [23697, 1], + [23696, 1], + [23695, 1], + [23694, 1], + [23693, 1], + [23692, 1], + [23691, 1], + [23690, 1], + [23689, 1], + [23688, 1], + [23687, 1], + [23686, 1], + [23685, 1], + [23684, 1], + [23683, 1], + [23682, 1], + [23681, 1], + [23680, 1], + [23679, 1], + [23678, 1], + [23677, 1], + [23676, 1], + [23675, 1], + [23674, 1], + [23673, 1], + [23672, 1], + [23671, 1], + [23670, 1], + [23669, 1], + [23668, 1], + [23667, 1], + [23666, 1], + [23665, 1], + [23664, 1], + [23663, 1], + [23662, 1], + [23661, 1], + [23660, 1], + [23659, 1], + [23658, 1], + [23657, 1], + [23656, 1], + [23655, 1], + [23654, 1], + [23653, 1], + [23652, 1], + [23651, 1], + [23650, 1], + [23649, 1], + [23648, 1], + [23647, 1], + [23646, 1], + [23645, 1], + [23644, 1], + [23643, 1], + [23642, 1], + [23641, 1], + [23640, 1], + [23639, 1], + [23638, 1], + [23637, 1], + [23636, 1], + [23635, 1], + [23634, 1], + [23633, 1], + [23632, 1], + [23631, 1], + [23630, 1], + [23629, 1], + [23628, 1], + [23627, 1], + [23626, 1], + [23625, 1], + [23624, 1], + [23623, 1], + [23622, 1], + [23621, 1], + [23620, 1], + [23619, 1], + [23618, 1], + [23617, 1], + [23616, 1], + [23615, 1], + [23614, 1], + [23613, 1], + [23612, 1], + [23611, 1], + [23610, 1], + [23609, 1], + [23608, 1], + [23607, 1], + [23606, 1], + [23605, 1], + [23604, 1], + [23603, 1], + [23602, 1], + [23601, 1], + [23600, 1], + [23599, 1], + [23598, 1], + [23597, 1], + [23596, 1], + [23595, 1], + [23594, 1], + [23593, 1], + [23592, 1], + [23591, 1], + [23590, 1], + [23589, 1], + [23588, 1], + [23587, 1], + [23586, 1], + [23585, 1], + [23584, 1], + [23583, 1], + [23582, 1], + [23581, 1], + [23580, 1], + [23579, 1], + [23578, 1], + [23577, 1], + [23576, 1], + [23575, 1], + [23574, 1], + [23573, 1], + [23572, 1], + [23571, 1], + [23570, 1], + [23569, 1], + [23568, 1], + [23567, 1], + [23566, 1], + [23565, 1], + [23564, 1], + [23563, 1], + [23562, 1], + [23561, 1], + [23560, 1], + [23559, 1], + [23558, 1], + [23557, 1], + [23556, 1], + [23555, 1], + [23554, 1], + [23553, 1], + [23552, 1], + [23551, 1], + [23550, 1], + [23549, 1], + [23548, 1], + [23547, 1], + [23546, 1], + [23545, 1], + [23544, 1], + [23543, 1], + [23542, 1], + [23541, 1], + [23540, 1], + [23539, 1], + [23538, 1], + [23537, 1], + [23536, 1], + [23535, 1], + [23534, 1], + [23533, 1], + [23532, 1], + [23531, 1], + [23530, 1], + [23529, 1], + [23528, 1], + [23527, 1], + [23526, 1], + [23525, 1], + [23524, 1], + [23523, 1], + [23522, 1], + [23521, 1], + [23520, 1], + [23519, 1], + [23518, 1], + [23517, 1], + [23516, 1], + [23515, 1], + [23514, 1], + [23513, 1], + [23512, 1], + [23511, 1], + [23510, 1], + [23509, 1], + [23508, 1], + [23507, 1], + [23506, 1], + [23505, 1], + [23504, 1], + [23503, 1], + [23502, 1], + [23501, 1], + [23500, 1], + [23499, 1], + [23498, 1], + [23497, 1], + [23496, 1], + [23495, 1], + [23494, 1], + [23493, 1], + [23492, 1], + [23491, 1], + [23490, 1], + [23489, 1], + [23488, 1], + [23487, 1], + [23486, 1], + [23485, 1], + [23484, 1], + [23483, 1], + [23482, 1], + [23481, 1], + [23480, 1], + [23479, 1], + [23478, 1], + [23477, 1], + [23476, 1], + [23475, 1], + [23474, 1], + [23473, 1], + [23472, 1], + [23471, 1], + [23470, 1], + [23469, 1], + [23468, 1], + [23467, 1], + [23466, 1], + [23465, 1], + [23464, 1], + [23463, 1], + [23462, 1], + [23461, 1], + [23460, 1], + [23459, 1], + [23458, 1], + [23457, 1], + [23456, 1], + [23455, 1], + [23454, 1], + [23453, 1], + [23452, 1], + [23451, 1], + [23450, 1], + [23449, 1], + [23448, 1], + [23447, 1], + [23446, 1], + [23445, 1], + [23444, 1], + [23443, 1], + [23442, 1], + [23441, 1], + [23440, 1], + [23439, 1], + [23438, 1], + [23437, 1], + [23436, 1], + [23435, 1], + [23434, 1], + [23433, 1], + [23432, 1], + [23431, 1], + [23430, 1], + [23429, 1], + [23428, 1], + [23427, 1], + [23426, 1], + [23425, 1], + [23424, 1], + [23423, 1], + [23422, 1], + [23421, 1], + [23420, 1], + [23419, 1], + [23418, 1], + [23417, 1], + [23416, 1], + [23415, 1], + [23414, 1], + [23413, 1], + [23412, 1], + [23411, 1], + [23410, 1], + [23409, 1], + [23408, 1], + [23407, 1], + [23406, 1], + [23405, 1], + [23404, 1], + [23403, 1], + [23402, 1], + [23401, 1], + [23400, 1], + [23399, 1], + [23398, 1], + [23397, 1], + [23396, 1], + [23395, 1], + [23394, 1], + [23393, 1], + [23392, 1], + [23391, 1], + [23390, 1], + [23389, 1], + [23388, 1], + [23387, 1], + [23386, 1], + [23385, 1], + [23384, 1], + [23383, 1], + [23382, 1], + [23381, 1], + [23380, 1], + [23379, 1], + [23378, 1], + [23377, 1], + [23376, 1], + [23375, 1], + [23374, 1], + [23373, 1], + [23372, 1], + [23371, 1], + [23370, 1], + [23369, 1], + [23368, 1], + [23367, 1], + [23366, 1], + [23365, 1], + [23364, 1], + [23363, 1], + [23362, 1], + [23361, 1], + [23360, 1], + [23359, 1], + [23358, 1], + [23357, 1], + [23356, 1], + [23355, 1], + [23354, 1], + [23353, 1], + [23352, 1], + [23351, 1], + [23350, 1], + [23349, 1], + [23348, 1], + [23347, 1], + [23346, 1], + [23345, 1], + [23344, 1], + [23343, 1], + [23342, 1], + [23341, 1], + [23340, 1], + [23339, 1], + [23338, 1], + [23337, 1], + [23336, 1], + [23335, 1], + [23334, 1], + [23333, 1], + [23332, 1], + [23331, 1], + [23330, 1], + [23329, 1], + [23328, 1], + [23327, 1], + [23326, 1], + [23325, 1], + [23324, 1], + [23323, 1], + [23322, 1], + [23321, 1], + [23320, 1], + [23319, 1], + [23318, 1], + [23317, 1], + [23316, 1], + [23315, 1], + [23314, 1], + [23313, 1], + [23312, 1], + [23311, 1], + [23310, 1], + [23309, 1], + [23308, 1], + [23307, 1], + [23306, 1], + [23305, 1], + [23304, 1], + [23303, 1], + [23302, 1], + [23301, 1], + [23300, 1], + [23299, 1], + [23298, 1], + [23297, 1], + [23296, 1], + [23295, 1], + [23294, 1], + [23293, 1], + [23292, 1], + [23291, 1], + [23290, 1], + [23289, 1], + [23288, 1], + [23287, 1], + [23286, 1], + [23285, 1], + [23284, 1], + [23283, 1], + [23282, 1], + [23281, 1], + [23280, 1], + [23279, 1], + [23278, 1], + [23277, 1], + [23276, 1], + [23275, 1], + [23274, 1], + [23273, 1], + [23272, 1], + [23271, 1], + [23270, 1], + [23269, 1], + [23268, 1], + [23267, 1], + [23266, 1], + [23265, 1], + [23264, 1], + [23263, 1], + [23262, 1], + [23261, 1], + [23260, 1], + [23259, 1], + [23258, 1], + [23257, 1], + [23256, 1], + [23255, 1], + [23254, 1], + [23253, 1], + [23252, 1], + [23251, 1], + [23250, 1], + [23249, 1], + [23248, 1], + [23247, 1], + [23246, 1], + [23245, 1], + [23244, 1], + [23243, 1], + [23242, 1], + [23241, 1], + [23240, 1], + [23239, 1], + [23238, 1], + [23237, 1], + [23236, 1], + [23235, 1], + [23234, 1], + [23233, 1], + [23232, 1], + [23231, 1], + [23230, 1], + [23229, 1], + [23228, 1], + [23227, 1], + [23226, 1], + [23225, 1], + [23224, 1], + [23223, 1], + [23222, 1], + [23221, 1], + [23220, 1], + [23219, 1], + [23218, 1], + [23217, 1], + [23216, 1], + [23215, 1], + [23214, 1], + [23213, 1], + [23212, 1], + [23211, 1], + [23210, 1], + [23209, 1], + [23208, 1], + [23207, 1], + [23206, 1], + [23205, 1], + [23204, 1], + [23203, 1], + [23202, 1], + [23201, 1], + [23200, 1], + [23199, 1], + [23198, 1], + [23197, 1], + [23196, 1], + [23195, 1], + [23194, 1], + [23193, 1], + [23192, 1], + [23191, 1], + [23190, 1], + [23189, 1], + [23188, 1], + [23187, 1], + [23186, 1], + [23185, 1], + [23184, 1], + [23183, 1], + [23182, 1], + [23181, 1], + [23180, 1], + [23179, 1], + [23178, 1], + [23177, 1], + [23176, 1], + [23175, 1], + [23174, 1], + [23173, 1], + [23172, 1], + [23171, 1], + [23170, 1], + [23169, 1], + [23168, 1], + [23167, 1], + [23166, 1], + [23165, 1], + [23164, 1], + [23163, 1], + [23162, 1], + [23161, 1], + [23160, 1], + [23159, 1], + [23158, 1], + [23157, 1], + [23156, 1], + [23155, 1], + [23154, 1], + [23153, 1], + [23152, 1], + [23151, 1], + [23150, 1], + [23149, 1], + [23148, 1], + [23147, 1], + [23146, 1], + [23145, 1], + [23144, 1], + [23143, 1], + [23142, 1], + [23141, 1], + [23140, 1], + [23139, 1], + [23138, 1], + [23137, 1], + [23136, 1], + [23135, 1], + [23134, 1], + [23133, 1], + [23132, 1], + [23131, 1], + [23130, 1], + [23129, 1], + [23128, 1], + [23127, 1], + [23126, 1], + [23125, 1], + [23124, 1], + [23123, 1], + [23122, 1], + [23121, 1], + [23120, 1], + [23119, 1], + [23118, 1], + [23117, 1], + [23116, 1], + [23115, 1], + [23114, 1], + [23113, 1], + [23112, 1], + [23111, 1], + [23110, 1], + [23109, 1], + [23108, 1], + [23107, 1], + [23106, 1], + [23105, 1], + [23104, 1], + [23103, 1], + [23102, 1], + [23101, 1], + [23100, 1], + [23099, 1], + [23098, 1], + [23097, 1], + [23096, 1], + [23095, 1], + [23094, 1], + [23093, 1], + [23092, 1], + [23091, 1], + [23090, 1], + [23089, 1], + [23088, 1], + [23087, 1], + [23086, 1], + [23085, 1], + [23084, 1], + [23083, 1], + [23082, 1], + [23081, 1], + [23080, 1], + [23079, 1], + [23078, 1], + [23077, 1], + [23076, 1], + [23075, 1], + [23074, 1], + [23073, 1], + [23072, 1], + [23071, 1], + [23070, 1], + [23069, 1], + [23068, 1], + [23067, 1], + [23066, 1], + [23065, 1], + [23064, 1], + [23063, 1], + [23062, 1], + [23061, 1], + [23060, 1], + [23059, 1], + [23058, 1], + [23057, 1], + [23056, 1], + [23055, 1], + [23054, 1], + [23053, 1], + [23052, 1], + [23051, 1], + [23050, 1], + [23049, 1], + [23048, 1], + [23047, 1], + [23046, 1], + [23045, 1], + [23044, 1], + [23043, 1], + [23042, 1], + [23041, 1], + [23040, 1], + [23039, 1], + [23038, 1], + [23037, 1], + [23036, 1], + [23035, 1], + [23034, 1], + [23033, 1], + [23032, 1], + [23031, 1], + [23030, 1], + [23029, 1], + [23028, 1], + [23027, 1], + [23026, 1], + [23025, 1], + [23024, 1], + [23023, 1], + [23022, 1], + [23021, 1], + [23020, 1], + [23019, 1], + [23018, 1], + [23017, 1], + [23016, 1], + [23015, 1], + [23014, 1], + [23013, 1], + [23012, 1], + [23011, 1], + [23010, 1], + [23009, 1], + [23008, 1], + [23007, 1], + [23006, 1], + [23005, 1], + [23004, 1], + [23003, 1], + [23002, 1], + [23001, 1], + [23000, 1], + [22999, 1], + [22998, 1], + [22997, 1], + [22996, 1], + [22995, 1], + [22994, 1], + [22993, 1], + [22992, 1], + [22991, 1], + [22990, 1], + [22989, 1], + [22988, 1], + [22987, 1], + [22986, 1], + [22985, 1], + [22984, 1], + [22983, 1], + [22982, 1], + [22981, 1], + [22980, 1], + [22979, 1], + [22978, 1], + [22977, 1], + [22976, 1], + [22975, 1], + [22974, 1], + [22973, 1], + [22972, 1], + [22971, 1], + [22970, 1], + [22969, 1], + [22968, 1], + [22967, 1], + [22966, 1], + [22965, 1], + [22964, 1], + [22963, 1], + [22962, 1], + [22961, 1], + [22960, 1], + [22959, 1], + [22958, 1], + [22957, 1], + [22956, 1], + [22955, 1], + [22954, 1], + [22953, 1], + [22952, 1], + [22951, 1], + [22950, 1], + [22949, 1], + [22948, 1], + [22947, 1], + [22946, 1], + [22945, 1], + [22944, 1], + [22943, 1], + [22942, 1], + [22941, 1], + [22940, 1], + [22939, 1], + [22938, 1], + [22937, 1], + [22936, 1], + [22935, 1], + [22934, 1], + [22933, 1], + [22932, 1], + [22931, 1], + [22930, 1], + [22929, 1], + [22928, 1], + [22927, 1], + [22926, 1], + [22925, 1], + [22924, 1], + [22923, 1], + [22922, 1], + [22921, 1], + [22920, 1], + [22919, 1], + [22918, 1], + [22917, 1], + [22916, 1], + [22915, 1], + [22914, 1], + [22913, 1], + [19536, 1], + [19535, 1], + [19534, 1], + [19533, 1], + [19582, 0, ","], + [19583, 0, " "], + [19584, 0, "a"], + [19585, 0, "n"], + [19586, 0, "d"], + [19587, 0, " "], + [19588, 0, "e"], + [19589, 0, "x"], + [19590, 0, "p"], + [19591, 0, "l"], + [19592, 0, "a"], + [19593, 0, "i"], + [19594, 0, "n"], + [19595, 0, " "], + [19596, 0, "t"], + [19597, 0, "h"], + [19598, 0, "e"], + [19599, 0, " "], + [19600, 0, "r"], + [19601, 0, "a"], + [19602, 0, "t"], + [19603, 0, "i"], + [19604, 0, "o"], + [19605, 0, "n"], + [19606, 0, "a"], + [19607, 0, "l"], + [19608, 0, "e"], + [19609, 0, " "], + [19610, 0, "f"], + [19611, 0, "o"], + [19612, 0, "r"], + [19613, 0, " "], + [19614, 0, "o"], + [19615, 0, "u"], + [19616, 0, "r"], + [19617, 0, " "], + [19618, 0, "d"], + [19619, 0, "e"], + [19620, 0, "s"], + [19621, 0, "i"], + [19622, 0, "g"], + [19623, 0, "n"], + [19624, 0, " "], + [19625, 0, "d"], + [19626, 0, "e"], + [19627, 0, "c"], + [19628, 0, "i"], + [19629, 0, "s"], + [19630, 0, "i"], + [19631, 0, "o"], + [19632, 0, "n"], + [19633, 0, "s"], + [30884, 0, "\n"], + [30885, 0, "\n"], + [30886, 0, "F"], + [30887, 0, "i"], + [30888, 0, "g"], + [30889, 0, "u"], + [30890, 0, "r"], + [30891, 0, "e"], + [30892, 0, "~"], + [30893, 0, "\\"], + [30894, 0, "r"], + [30895, 0, "e"], + [30896, 0, "f"], + [30897, 0, "{"], + [30898, 0, "f"], + [30899, 0, "i"], + [30900, 0, "g"], + [30901, 0, ":"], + [30902, 0, "t"], + [30903, 0, "w"], + [30904, 0, "o"], + [30905, 0, "-"], + [30906, 0, "l"], + [30907, 0, "i"], + [30908, 0, "s"], + [30909, 0, "t"], + [30910, 0, "s"], + [30911, 0, "}"], + [30912, 0, " "], + [30913, 0, "i"], + [30914, 0, "l"], + [30915, 0, "l"], + [30916, 0, "u"], + [30917, 0, "s"], + [30918, 0, "t"], + [30919, 0, "r"], + [30920, 0, "a"], + [30921, 0, "t"], + [30922, 0, "e"], + [30923, 0, "s"], + [30924, 0, " "], + [30925, 0, "a"], + [30926, 0, "n"], + [30927, 0, "o"], + [30928, 0, "t"], + [30929, 0, "h"], + [30930, 0, "e"], + [30931, 0, "r"], + [30932, 0, " "], + [30933, 0, "p"], + [30934, 0, "r"], + [30935, 0, "o"], + [30936, 0, "b"], + [30937, 0, "l"], + [30938, 0, "e"], + [30939, 0, "m"], + [30940, 0, " "], + [30941, 0, "w"], + [30942, 0, "i"], + [30943, 0, "t"], + [30944, 0, "h"], + [30945, 0, " "], + [30946, 0, "m"], + [30947, 0, "a"], + [30948, 0, "p"], + [30949, 0, "s"], + [30950, 0, ":"], + [30951, 0, " "], + [30952, 0, "t"], + [30953, 0, "w"], + [30954, 0, "o"], + [30955, 0, " "], + [30956, 0, "r"], + [30957, 0, "e"], + [30958, 0, "p"], + [30959, 0, "l"], + [30960, 0, "i"], + [30961, 0, "c"], + [30962, 0, "a"], + [30963, 0, "s"], + [30964, 0, " "], + [30965, 0, "c"], + [30966, 0, "a"], + [30967, 0, "n"], + [30968, 0, " "], + [30969, 0, "c"], + [30970, 0, "o"], + [30971, 0, "n"], + [30972, 0, "c"], + [30973, 0, "u"], + [30974, 0, "r"], + [30975, 0, "r"], + [30976, 0, "e"], + [30977, 0, "n"], + [30978, 0, "t"], + [30979, 0, "l"], + [30980, 0, "y"], + [30981, 0, " "], + [30982, 0, "i"], + [30983, 0, "n"], + [30984, 0, "s"], + [30985, 0, "e"], + [30986, 0, "r"], + [30987, 0, "t"], + [30988, 0, " "], + [30989, 0, "t"], + [30990, 0, "h"], + [30991, 0, "e"], + [30992, 0, " "], + [30993, 0, "s"], + [30994, 0, "a"], + [30995, 0, "m"], + [30996, 0, "e"], + [30997, 0, " "], + [30998, 0, "m"], + [30999, 0, "a"], + [31000, 0, "p"], + [31001, 0, " "], + [31002, 0, "k"], + [31003, 0, "e"], + [31004, 0, "y"], + [31005, 0, "."], + [31006, 0, " "], + [31007, 0, "H"], + [31008, 0, "e"], + [31009, 0, "r"], + [31010, 0, "e"], + [31011, 0, ","], + [31012, 0, " "], + [31013, 0, "$"], + [31014, 0, "p"], + [31015, 0, "$"], + [31016, 0, " "], + [31017, 0, "a"], + [31018, 0, "n"], + [31019, 0, "d"], + [31020, 0, " "], + [31021, 0, "$"], + [31022, 0, "q"], + [31023, 0, "$"], + [31024, 0, " "], + [31025, 0, "e"], + [31026, 0, "a"], + [31027, 0, "c"], + [31028, 0, "h"], + [31029, 0, " "], + [31030, 0, "i"], + [31031, 0, "n"], + [31032, 0, "d"], + [31033, 0, "e"], + [31034, 0, "p"], + [31035, 0, "e"], + [31036, 0, "n"], + [31037, 0, "d"], + [31038, 0, "e"], + [31039, 0, "n"], + [31040, 0, "t"], + [31041, 0, "l"], + [31042, 0, "y"], + [31043, 0, " "], + [31044, 0, "c"], + [31045, 0, "r"], + [31046, 0, "e"], + [31047, 0, "a"], + [31048, 0, "t"], + [31049, 0, "e"], + [31050, 0, " "], + [31051, 0, "a"], + [31052, 0, " "], + [31053, 0, "n"], + [31054, 0, "e"], + [31055, 0, "w"], + [31056, 0, " "], + [31057, 0, "s"], + [31058, 0, "h"], + [31059, 0, "o"], + [31060, 0, "p"], + [31061, 0, "p"], + [31062, 0, "i"], + [31063, 0, "n"], + [31064, 0, "g"], + [31065, 0, " "], + [31066, 0, "l"], + [31067, 0, "i"], + [31068, 0, "s"], + [31069, 0, "t"], + [31070, 0, " "], + [31071, 0, "u"], + [31072, 0, "n"], + [31073, 0, "d"], + [31074, 0, "e"], + [31075, 0, "r"], + [31076, 0, " "], + [31077, 0, "t"], + [31078, 0, "h"], + [31079, 0, "e"], + [31080, 0, " "], + [31081, 0, "s"], + [31082, 0, "a"], + [31083, 0, "m"], + [31084, 0, "e"], + [31085, 0, " "], + [31086, 0, "m"], + [31087, 0, "a"], + [31088, 0, "p"], + [31089, 0, " "], + [31090, 0, "k"], + [31091, 0, "e"], + [31092, 0, "y"], + [31093, 0, " "], + [31094, 0, "`"], + [31095, 0, "`"], + [31096, 0, "g"], + [31097, 0, "r"], + [31098, 0, "o"], + [31099, 0, "c"], + [31100, 0, "e"], + [31101, 0, "r"], + [31102, 0, "y"], + [31103, 0, "'"], + [31104, 0, "'"], + [31105, 0, ","], + [31106, 0, " "], + [31107, 0, "a"], + [31108, 0, "n"], + [31109, 0, "d"], + [31110, 0, " "], + [31111, 0, "a"], + [31112, 0, "d"], + [31113, 0, "d"], + [31114, 0, " "], + [31115, 0, "i"], + [31116, 0, "t"], + [31117, 0, "e"], + [31118, 0, "m"], + [31119, 0, "s"], + [31120, 0, " "], + [31121, 0, "t"], + [31122, 0, "o"], + [31123, 0, " "], + [31124, 0, "t"], + [31125, 0, "h"], + [31126, 0, "e"], + [31127, 0, " "], + [31128, 0, "l"], + [31129, 0, "i"], + [31130, 0, "s"], + [31131, 0, "t"], + [31132, 0, "."], + [31133, 0, " "], + [31134, 0, "I"], + [31135, 0, "n"], + [31136, 0, " "], + [31137, 0, "t"], + [31138, 0, "h"], + [31139, 0, "e"], + [31140, 0, " "], + [31141, 0, "c"], + [31142, 0, "a"], + [31143, 0, "s"], + [31144, 0, "e"], + [31145, 0, " "], + [31146, 0, "o"], + [31147, 0, "f"], + [31148, 0, " "], + [31149, 0, "F"], + [31150, 0, "i"], + [31151, 0, "g"], + [31152, 0, "u"], + [31153, 0, "r"], + [31154, 0, "e"], + [31155, 0, "~"], + [31156, 0, "\\"], + [31157, 0, "r"], + [31158, 0, "e"], + [31159, 0, "f"], + [31160, 0, "{"], + [31161, 0, "f"], + [31162, 0, "i"], + [31163, 0, "g"], + [31164, 0, ":"], + [31165, 0, "r"], + [31166, 0, "e"], + [31167, 0, "g"], + [31168, 0, "i"], + [31169, 0, "s"], + [31170, 0, "t"], + [31171, 0, "e"], + [31172, 0, "r"], + [31173, 0, "-"], + [31174, 0, "a"], + [31175, 0, "s"], + [31176, 0, "s"], + [31177, 0, "i"], + [31178, 0, "g"], + [31179, 0, "n"], + [31180, 0, "}"], + [31181, 0, ","], + [31182, 0, " "], + [31183, 0, "c"], + [31184, 0, "o"], + [31185, 0, "n"], + [31186, 0, "c"], + [31187, 0, "u"], + [31188, 0, "r"], + [31189, 0, "r"], + [31190, 0, "e"], + [31191, 0, "n"], + [31192, 0, "t"], + [31193, 0, " "], + [31194, 0, "a"], + [31195, 0, "s"], + [31196, 0, "s"], + [31197, 0, "i"], + [31198, 0, "g"], + [31199, 0, "n"], + [31200, 0, "m"], + [31201, 0, "e"], + [31202, 0, "n"], + [31203, 0, "t"], + [31204, 0, "s"], + [31205, 0, " "], + [31206, 0, "t"], + [31207, 0, "o"], + [31208, 0, " "], + [31209, 0, "t"], + [31210, 0, "h"], + [31211, 0, "e"], + [31212, 0, " "], + [31213, 0, "s"], + [31214, 0, "a"], + [31215, 0, "m"], + [31216, 0, "e"], + [31217, 0, " "], + [31218, 0, "m"], + [31219, 0, "a"], + [31220, 0, "p"], + [31221, 0, " "], + [31222, 0, "k"], + [31223, 0, "e"], + [31224, 0, "y"], + [31225, 0, " "], + [31226, 0, "w"], + [31227, 0, "e"], + [31228, 0, "r"], + [31229, 0, "e"], + [31230, 0, " "], + [31231, 0, "l"], + [31232, 0, "e"], + [31233, 0, "f"], + [31234, 0, "t"], + [31235, 0, " "], + [31236, 0, "t"], + [31237, 0, "o"], + [31238, 0, " "], + [31239, 0, "b"], + [31240, 0, "e"], + [31241, 0, " "], + [31242, 0, "r"], + [31243, 0, "e"], + [31244, 0, "s"], + [31245, 0, "o"], + [31246, 0, "l"], + [31247, 0, "v"], + [31248, 0, "e"], + [31249, 0, "d"], + [31250, 0, " "], + [31251, 0, "b"], + [31252, 0, "y"], + [31253, 0, " "], + [31254, 0, "t"], + [31255, 0, "h"], + [31256, 0, "e"], + [31257, 0, " "], + [31258, 0, "a"], + [31259, 0, "p"], + [31260, 0, "p"], + [31261, 0, "l"], + [31262, 0, "i"], + [31263, 0, "c"], + [31264, 0, "a"], + [31265, 0, "t"], + [31266, 0, "i"], + [31267, 0, "o"], + [31268, 0, "n"], + [31269, 0, ","], + [31270, 0, " "], + [31271, 0, "b"], + [31272, 0, "u"], + [31273, 0, "t"], + [31274, 0, " "], + [31275, 0, "i"], + [31276, 0, "n"], + [31277, 0, " "], + [31278, 0, "F"], + [31279, 0, "i"], + [31280, 0, "g"], + [31281, 0, "u"], + [31282, 0, "r"], + [31283, 0, "e"], + [31284, 0, "~"], + [31285, 0, "\\"], + [31286, 0, "r"], + [31287, 0, "e"], + [31288, 0, "f"], + [31289, 0, "{"], + [31290, 0, "f"], + [31291, 0, "i"], + [31292, 0, "g"], + [31293, 0, ":"], + [31294, 0, "t"], + [31295, 0, "w"], + [31296, 0, "o"], + [31297, 0, "-"], + [31298, 0, "l"], + [31299, 0, "i"], + [31300, 0, "s"], + [31301, 0, "t"], + [31302, 0, "s"], + [31303, 0, "}"], + [31304, 0, ","], + [31305, 0, " "], + [31306, 0, "b"], + [31307, 0, "o"], + [31308, 0, "t"], + [31309, 0, "h"], + [31310, 0, " "], + [31311, 0, "v"], + [31312, 0, "a"], + [31313, 0, "l"], + [31314, 0, "u"], + [31315, 0, "e"], + [31316, 0, "s"], + [31317, 0, " "], + [31318, 0, "a"], + [31319, 0, "r"], + [31320, 0, "e"], + [31321, 0, " "], + [31322, 0, "l"], + [31323, 0, "i"], + [31324, 0, "s"], + [31325, 0, "t"], + [31326, 0, "s"], + [31327, 0, " "], + [31328, 0, "a"], + [31329, 0, "n"], + [31330, 0, "d"], + [31331, 0, " "], + [31332, 0, "s"], + [31333, 0, "o"], + [31334, 0, " "], + [31335, 0, "t"], + [31336, 0, "h"], + [31337, 0, "e"], + [31338, 0, "y"], + [31339, 0, " "], + [31340, 0, "c"], + [31341, 0, "a"], + [31342, 0, "n"], + [31343, 0, " "], + [31344, 0, "b"], + [31345, 0, "e"], + [31346, 0, " "], + [31347, 0, "m"], + [31348, 0, "e"], + [31349, 0, "r"], + [31350, 0, "g"], + [31351, 0, "e"], + [31352, 0, "d"], + [31353, 0, " "], + [31354, 0, "a"], + [31355, 0, "u"], + [31356, 0, "t"], + [31357, 0, "o"], + [31358, 0, "m"], + [31359, 0, "a"], + [31360, 0, "t"], + [31361, 0, "i"], + [31362, 0, "c"], + [31363, 0, "a"], + [31364, 0, "l"], + [31365, 0, "l"], + [31366, 0, "y"], + [31367, 0, "."], + [31368, 0, " "], + [31369, 0, "W"], + [31370, 0, "e"], + [31371, 0, " "], + [31372, 0, "p"], + [31373, 0, "r"], + [31374, 0, "e"], + [31375, 0, "s"], + [31376, 0, "e"], + [31377, 0, "r"], + [31378, 0, "v"], + [31379, 0, "e"], + [31380, 0, " "], + [31381, 0, "t"], + [31382, 0, "h"], + [31383, 0, "e"], + [31384, 0, " "], + [31385, 0, "o"], + [31386, 0, "r"], + [31387, 0, "d"], + [31388, 0, "e"], + [31389, 0, "r"], + [31390, 0, "i"], + [31391, 0, "n"], + [31392, 0, "g"], + [31393, 0, " "], + [31394, 0, "a"], + [31395, 0, "n"], + [31396, 0, "d"], + [31397, 0, " "], + [31398, 0, "a"], + [31399, 0, "d"], + [31400, 0, "j"], + [31401, 0, "a"], + [31402, 0, "c"], + [31403, 0, "e"], + [31404, 0, "n"], + [31405, 0, "c"], + [31406, 0, "y"], + [31407, 0, " "], + [31408, 0, "o"], + [31409, 0, "f"], + [31410, 0, " "], + [31411, 0, "i"], + [31412, 0, "t"], + [31413, 0, "e"], + [31414, 0, "m"], + [31415, 0, "s"], + [31416, 0, " "], + [31417, 0, "i"], + [31418, 0, "n"], + [31419, 0, "s"], + [31420, 0, "e"], + [31421, 0, "r"], + [31422, 0, "t"], + [31423, 0, "e"], + [31424, 0, "d"], + [31425, 0, " "], + [31426, 0, "a"], + [31427, 0, "t"], + [31428, 0, " "], + [31429, 0, "e"], + [31430, 0, "a"], + [31431, 0, "c"], + [31432, 0, "h"], + [31433, 0, " "], + [31434, 0, "r"], + [31435, 0, "e"], + [31436, 0, "p"], + [31437, 0, "l"], + [31438, 0, "i"], + [31439, 0, "c"], + [31440, 0, "a"], + [31441, 0, ","], + [31442, 0, " "], + [31443, 0, "s"], + [31444, 0, "o"], + [31445, 0, " "], + [31446, 0, "`"], + [31447, 0, "`"], + [31448, 0, "h"], + [31449, 0, "a"], + [31450, 0, "m"], + [31451, 0, "'"], + [31452, 0, "'"], + [31453, 0, " "], + [31454, 0, "a"], + [31455, 0, "p"], + [31456, 0, "p"], + [31457, 0, "e"], + [31458, 0, "a"], + [31459, 0, "r"], + [31460, 0, "s"], + [31461, 0, " "], + [31462, 0, "a"], + [31463, 0, "f"], + [31464, 0, "t"], + [31465, 0, "e"], + [31466, 0, "r"], + [31467, 0, " "], + [31468, 0, "`"], + [31469, 0, "`"], + [31470, 0, "e"], + [31471, 0, "g"], + [31472, 0, "g"], + [31473, 0, "s"], + [31474, 0, "'"], + [31475, 0, "'"], + [31476, 0, ","], + [31477, 0, " "], + [31478, 0, "a"], + [31479, 0, "n"], + [31480, 0, "d"], + [31481, 0, " "], + [31482, 0, "`"], + [31483, 0, "`"], + [31484, 0, "f"], + [31485, 0, "l"], + [31486, 0, "o"], + [31487, 0, "u"], + [31488, 0, "r"], + [31489, 0, "'"], + [31490, 0, "'"], + [31491, 0, " "], + [31492, 0, "a"], + [31493, 0, "p"], + [31494, 0, "p"], + [31495, 0, "e"], + [31496, 0, "a"], + [31497, 0, "r"], + [31498, 0, "s"], + [31499, 0, " "], + [31500, 0, "a"], + [31501, 0, "f"], + [31502, 0, "t"], + [31503, 0, "e"], + [31504, 0, "r"], + [31505, 0, " "], + [31506, 0, "`"], + [31507, 0, "`"], + [31508, 0, "m"], + [31509, 0, "i"], + [31510, 0, "l"], + [31511, 0, "k"], + [31512, 0, "'"], + [31513, 0, "'"], + [31514, 0, " "], + [31515, 0, "i"], + [31516, 0, "n"], + [31517, 0, " "], + [31518, 0, "t"], + [31519, 0, "h"], + [31520, 0, "e"], + [31521, 0, " "], + [31522, 0, "m"], + [31523, 0, "e"], + [31524, 0, "r"], + [31525, 0, "g"], + [31526, 0, "e"], + [31527, 0, "d"], + [31528, 0, " "], + [31529, 0, "r"], + [31530, 0, "e"], + [31531, 0, "s"], + [31532, 0, "u"], + [31533, 0, "l"], + [31534, 0, "t"], + [31535, 0, "."], + [31536, 0, " "], + [31537, 0, "T"], + [31538, 0, "h"], + [31539, 0, "e"], + [31540, 0, "r"], + [31541, 0, "e"], + [31542, 0, " "], + [31543, 0, "i"], + [31544, 0, "s"], + [31545, 0, " "], + [31546, 0, "n"], + [31547, 0, "o"], + [31548, 0, " "], + [31549, 0, "i"], + [31550, 0, "n"], + [31551, 0, "f"], + [31552, 0, "o"], + [31553, 0, "r"], + [31554, 0, "m"], + [31555, 0, "a"], + [31556, 0, "t"], + [31557, 0, "i"], + [31558, 0, "o"], + [31559, 0, "n"], + [31560, 0, " "], + [31561, 0, "o"], + [31562, 0, "n"], + [31563, 0, " "], + [31564, 0, "w"], + [31565, 0, "h"], + [31566, 0, "i"], + [31567, 0, "c"], + [31568, 0, "h"], + [31569, 0, " "], + [31570, 0, "r"], + [31571, 0, "e"], + [31572, 0, "p"], + [31573, 0, "l"], + [31574, 0, "i"], + [31575, 0, "c"], + [31576, 0, "a"], + [31577, 0, "'"], + [31578, 0, "s"], + [31579, 0, " "], + [31580, 0, "i"], + [31581, 0, "t"], + [31582, 0, "e"], + [31583, 0, "m"], + [31584, 0, "s"], + [31585, 0, " "], + [31586, 0, "s"], + [31587, 0, "h"], + [31588, 0, "o"], + [31589, 0, "u"], + [31590, 0, "l"], + [31591, 0, "d"], + [31592, 0, " "], + [31593, 0, "a"], + [31594, 0, "p"], + [31595, 0, "p"], + [31596, 0, "e"], + [31597, 0, "a"], + [31598, 0, "r"], + [31599, 0, " "], + [31600, 0, "f"], + [31601, 0, "i"], + [31602, 0, "r"], + [31603, 0, "s"], + [31604, 0, "t"], + [31605, 0, " "], + [31606, 0, "i"], + [31607, 0, "n"], + [31608, 0, " "], + [31609, 0, "t"], + [31610, 0, "h"], + [31611, 0, "e"], + [31612, 0, " "], + [31613, 0, "m"], + [31614, 0, "e"], + [31615, 0, "r"], + [31616, 0, "g"], + [31617, 0, "e"], + [31618, 0, "d"], + [31619, 0, " "], + [31620, 0, "r"], + [31621, 0, "e"], + [31622, 0, "s"], + [31623, 0, "u"], + [31624, 0, "l"], + [31625, 0, "t"], + [31626, 0, ","], + [31627, 0, " "], + [31628, 0, "s"], + [31629, 0, "o"], + [31630, 0, " "], + [31631, 0, "t"], + [31632, 0, "h"], + [31633, 0, "e"], + [31634, 0, " "], + [31635, 0, "a"], + [31636, 0, "l"], + [31637, 0, "g"], + [31638, 0, "o"], + [31639, 0, "r"], + [31640, 0, "i"], + [31641, 0, "t"], + [31642, 0, "h"], + [31643, 0, "m"], + [31644, 0, " "], + [31645, 0, "c"], + [31646, 0, "a"], + [31647, 0, "n"], + [31648, 0, " "], + [31649, 0, "m"], + [31650, 0, "a"], + [31651, 0, "k"], + [31652, 0, "e"], + [31653, 0, " "], + [31654, 0, "a"], + [31655, 0, "n"], + [31656, 0, " "], + [31657, 0, "a"], + [31658, 0, "r"], + [31659, 0, "b"], + [31660, 0, "i"], + [31661, 0, "t"], + [31662, 0, "r"], + [31663, 0, "a"], + [31664, 0, "r"], + [31665, 0, "y"], + [31666, 0, " "], + [31667, 0, "c"], + [31668, 0, "h"], + [31669, 0, "o"], + [31670, 0, "i"], + [31671, 0, "c"], + [31672, 0, "e"], + [31673, 0, " "], + [31674, 0, "b"], + [31675, 0, "e"], + [31676, 0, "t"], + [31677, 0, "w"], + [31678, 0, "e"], + [31679, 0, "e"], + [31680, 0, "n"], + [31681, 0, " "], + [31682, 0, "`"], + [31683, 0, "`"], + [31684, 0, "e"], + [31685, 0, "g"], + [31686, 0, "g"], + [31687, 0, "s"], + [31688, 0, ","], + [31689, 0, " "], + [31690, 0, "h"], + [31691, 0, "a"], + [31692, 0, "m"], + [31693, 0, ","], + [31694, 0, " "], + [31695, 0, "m"], + [31696, 0, "i"], + [31697, 0, "l"], + [31698, 0, "k"], + [31699, 0, ","], + [31700, 0, " "], + [31701, 0, "f"], + [31702, 0, "l"], + [31703, 0, "o"], + [31704, 0, "u"], + [31705, 0, "r"], + [31706, 0, "'"], + [31707, 0, "'"], + [31708, 0, " "], + [31709, 0, "a"], + [31710, 0, "n"], + [31711, 0, "d"], + [31712, 0, " "], + [31713, 0, "`"], + [31714, 0, "`"], + [31715, 0, "m"], + [31716, 0, "i"], + [31717, 0, "l"], + [31718, 0, "k"], + [31719, 0, ","], + [31720, 0, " "], + [31721, 0, "f"], + [31722, 0, "l"], + [31723, 0, "o"], + [31724, 0, "u"], + [31725, 0, "r"], + [31726, 0, ","], + [31727, 0, " "], + [31728, 0, "e"], + [31729, 0, "g"], + [31730, 0, "g"], + [31731, 0, "s"], + [31732, 0, ","], + [31733, 0, " "], + [31734, 0, "h"], + [31735, 0, "a"], + [31736, 0, "m"], + [31737, 0, "'"], + [31738, 0, "'"], + [31739, 0, ","], + [31740, 0, " "], + [31741, 0, "p"], + [31742, 0, "r"], + [31743, 0, "o"], + [31744, 0, "v"], + [31745, 0, "i"], + [31746, 0, "d"], + [31747, 0, "e"], + [31748, 0, "d"], + [31749, 0, " "], + [31750, 0, "t"], + [31751, 0, "h"], + [31752, 0, "a"], + [31753, 0, "t"], + [31754, 0, " "], + [31755, 0, "a"], + [31756, 0, "l"], + [31757, 0, "l"], + [31758, 0, " "], + [31759, 0, "r"], + [31760, 0, "e"], + [31761, 0, "p"], + [31762, 0, "l"], + [31763, 0, "i"], + [31764, 0, "c"], + [31765, 0, "a"], + [31766, 0, "s"], + [31767, 0, " "], + [31768, 0, "e"], + [31769, 0, "n"], + [31770, 0, "d"], + [31771, 0, " "], + [31772, 0, "u"], + [31773, 0, "p"], + [31774, 0, " "], + [31775, 0, "w"], + [31776, 0, "i"], + [31777, 0, "t"], + [31778, 0, "h"], + [31779, 0, " "], + [31780, 0, "t"], + [31781, 0, "h"], + [31782, 0, "e"], + [31783, 0, " "], + [31784, 0, "s"], + [31785, 0, "a"], + [31786, 0, "m"], + [31787, 0, "e"], + [31788, 0, " "], + [31789, 0, "o"], + [31790, 0, "r"], + [31791, 0, "d"], + [31792, 0, "e"], + [31793, 0, "r"], + [31794, 0, "."], + [31783, 0, " "], + [31784, 0, "i"], + [31785, 0, "t"], + [31786, 0, "e"], + [31787, 0, "m"], + [31788, 0, "s"], + [31789, 0, " "], + [31790, 0, "i"], + [31791, 0, "n"], + [31792, 0, " "], + [31793, 0, "t"], + [31794, 0, "h"], + [31795, 0, "e"], + [31808, 0, "\n"], + [31809, 0, "\n"], + [31810, 0, "F"], + [31811, 0, "i"], + [31812, 0, "g"], + [31813, 0, "u"], + [31814, 0, "r"], + [31815, 0, "e"], + [31816, 0, "~"], + [31817, 0, "\\"], + [31818, 0, "r"], + [31819, 0, "e"], + [31820, 0, "f"], + [31821, 0, "{"], + [31822, 0, "f"], + [31823, 0, "i"], + [31824, 0, "g"], + [31825, 0, ":"], + [31826, 0, "t"], + [31827, 0, "e"], + [31828, 0, "x"], + [31829, 0, "t"], + [31830, 0, "-"], + [31831, 0, "e"], + [31832, 0, "d"], + [31833, 0, "i"], + [31834, 0, "t"], + [31835, 0, "}"], + [31836, 0, " "], + [31837, 0, "s"], + [31838, 0, "h"], + [31839, 0, "o"], + [31840, 0, "w"], + [31841, 0, "s"], + [31842, 0, " "], + [31843, 0, "h"], + [31844, 0, "o"], + [31845, 0, "w"], + [31846, 0, " "], + [31847, 0, "a"], + [31848, 0, " "], + [31849, 0, "c"], + [31850, 0, "o"], + [31851, 0, "l"], + [31852, 0, "l"], + [31853, 0, "a"], + [31854, 0, "b"], + [31855, 0, "o"], + [31856, 0, "r"], + [31857, 0, "a"], + [31858, 0, "t"], + [31859, 0, "i"], + [31860, 0, "v"], + [31861, 0, "e"], + [31862, 0, " "], + [31863, 0, "t"], + [31864, 0, "e"], + [31865, 0, "x"], + [31866, 0, "t"], + [31867, 0, " "], + [31868, 0, "e"], + [31869, 0, "d"], + [31870, 0, "i"], + [31871, 0, "t"], + [31872, 0, "o"], + [31873, 0, "r"], + [31874, 0, " "], + [31875, 0, "c"], + [31876, 0, "a"], + [31877, 0, "n"], + [31878, 0, " "], + [31879, 0, "b"], + [31880, 0, "e"], + [31881, 0, " "], + [31882, 0, "i"], + [31883, 0, "m"], + [31884, 0, "p"], + [31885, 0, "l"], + [31886, 0, "e"], + [31887, 0, "m"], + [31888, 0, "e"], + [31889, 0, "n"], + [31890, 0, "t"], + [31891, 0, "e"], + [31892, 0, "d"], + [31893, 0, ","], + [31894, 0, " "], + [31895, 0, "u"], + [31896, 0, "s"], + [31897, 0, "i"], + [31898, 0, "n"], + [31899, 0, "g"], + [31900, 0, " "], + [31901, 0, "a"], + [31902, 0, " "], + [31902, 1], + [31901, 1], + [31900, 1], + [31899, 1], + [31898, 1], + [31897, 1], + [31896, 1], + [31895, 1], + [31895, 0, "b"], + [31896, 0, "y"], + [31897, 0, " "], + [31898, 0, "t"], + [31899, 0, "r"], + [31900, 0, "e"], + [31901, 0, "a"], + [31902, 0, "t"], + [31903, 0, "i"], + [31904, 0, "n"], + [31905, 0, "g"], + [31906, 0, " "], + [31907, 0, "t"], + [31908, 0, "h"], + [31909, 0, "e"], + [31910, 0, " "], + [31911, 0, "d"], + [31912, 0, "o"], + [31913, 0, "c"], + [31914, 0, "u"], + [31915, 0, "m"], + [31916, 0, "e"], + [31917, 0, "n"], + [31918, 0, "t"], + [31919, 0, " "], + [31920, 0, "a"], + [31921, 0, "s"], + [31922, 0, " "], + [31923, 0, "a"], + [31924, 0, " "], + [31925, 0, "l"], + [31926, 0, "i"], + [31927, 0, "s"], + [31928, 0, "t"], + [31929, 0, " "], + [31930, 0, "o"], + [31931, 0, "f"], + [31932, 0, " "], + [31933, 0, "c"], + [31934, 0, "h"], + [31935, 0, "a"], + [31936, 0, "r"], + [31937, 0, "a"], + [31938, 0, "c"], + [31939, 0, "t"], + [31940, 0, "e"], + [31941, 0, "r"], + [31942, 0, "s"], + [31943, 0, "."], + [31944, 0, " "], + [31945, 0, "`"], + [31946, 0, "`"], + [31947, 0, "y"], + [31948, 0, "'"], + [31949, 0, "'"], + [31950, 0, " "], + [31951, 0, "i"], + [31952, 0, "s"], + [31953, 0, " "], + [31954, 0, "i"], + [31955, 0, "n"], + [31956, 0, "s"], + [31957, 0, "e"], + [31958, 0, "r"], + [31959, 0, "t"], + [31960, 0, "e"], + [31961, 0, "d"], + [31962, 0, " "], + [31963, 0, "b"], + [31964, 0, "e"], + [31965, 0, "f"], + [31966, 0, "o"], + [31967, 0, "r"], + [31968, 0, "e"], + [31969, 0, " "], + [31970, 0, "`"], + [31971, 0, "`"], + [31972, 0, "a"], + [31973, 0, "'"], + [31974, 0, "'"], + [31975, 0, ","], + [31976, 0, " "], + [31977, 0, "`"], + [31978, 0, "`"], + [31979, 0, "b"], + [31980, 0, "'"], + [31981, 0, "'"], + [31982, 0, " "], + [31983, 0, "i"], + [31984, 0, "s"], + [31985, 0, " "], + [31986, 0, "d"], + [31987, 0, "e"], + [31988, 0, "l"], + [31989, 0, "e"], + [31990, 0, "t"], + [31991, 0, "e"], + [31992, 0, "d"], + [31993, 0, ","], + [31994, 0, " "], + [31995, 0, "a"], + [31996, 0, "n"], + [31997, 0, "d"], + [31998, 0, " "], + [31975, 1], + [31975, 0, ";"], + [31944, 0, " "], + [31945, 0, "A"], + [31946, 0, "l"], + [31947, 0, "l"], + [31948, 0, " "], + [31949, 0, "c"], + [31950, 0, "h"], + [31951, 0, "a"], + [31952, 0, "n"], + [31953, 0, "g"], + [31954, 0, "e"], + [31955, 0, "s"], + [31956, 0, " "], + [31957, 0, "a"], + [31958, 0, "r"], + [31959, 0, "e"], + [31960, 0, " "], + [31961, 0, "p"], + [31962, 0, "r"], + [31963, 0, "e"], + [31964, 0, "s"], + [31965, 0, "e"], + [31966, 0, "r"], + [31967, 0, "v"], + [31968, 0, "e"], + [31969, 0, "d"], + [31970, 0, " "], + [31971, 0, "i"], + [31972, 0, "n"], + [31973, 0, " "], + [31974, 0, "t"], + [31975, 0, "h"], + [31976, 0, "e"], + [31977, 0, " "], + [31978, 0, "m"], + [31979, 0, "e"], + [31980, 0, "r"], + [31981, 0, "g"], + [31982, 0, "e"], + [31983, 0, "d"], + [31984, 0, " "], + [31985, 0, "r"], + [31986, 0, "e"], + [31987, 0, "s"], + [31988, 0, "u"], + [31989, 0, "l"], + [31990, 0, "t"], + [31991, 0, ":"], + [32041, 1], + [32041, 0, ";"], + [32047, 0, "z"], + [32048, 0, "z"], + [32048, 1], + [32047, 1], + [32047, 0, "`"], + [32048, 0, "`"], + [32048, 1], + [32047, 1], + [32046, 1], + [32045, 1], + [32044, 1], + [32043, 1], + [32042, 1], + [32041, 1], + [32024, 0, " "], + [32025, 0, "`"], + [32026, 0, "`"], + [32027, 0, "x"], + [32028, 0, "'"], + [32029, 0, "'"], + [32030, 0, " "], + [32031, 0, "a"], + [32032, 0, "n"], + [32033, 0, "d"], + [32034, 0, " "], + [32035, 0, "`"], + [32036, 0, "`"], + [32037, 0, "z"], + [32038, 0, "'"], + [32039, 0, "'"], + [32040, 0, " "], + [32041, 0, "a"], + [32042, 0, "r"], + [32043, 0, "e"], + [32044, 0, " "], + [32045, 0, "i"], + [32046, 0, "n"], + [32047, 0, "s"], + [32048, 0, "e"], + [32049, 0, "r"], + [32050, 0, "t"], + [32051, 0, "e"], + [32052, 0, "c"], + [32053, 0, " "], + [32053, 1], + [32052, 1], + [32052, 0, "d"], + [32053, 0, " "], + [32054, 0, "b"], + [32055, 0, "e"], + [32056, 0, "t"], + [32057, 0, "w"], + [32058, 0, "e"], + [32059, 0, "e"], + [32060, 0, "n"], + [32061, 0, " "], + [32062, 0, "a"], + [32063, 0, "a"], + [32063, 1], + [32062, 1], + [32062, 0, "`"], + [32063, 0, "`"], + [32064, 0, "a"], + [32065, 0, "'"], + [32066, 0, "'"], + [32067, 0, " "], + [32068, 0, "a"], + [32069, 0, "n"], + [32070, 0, "d"], + [32071, 0, " "], + [32072, 0, "`"], + [32073, 0, "`"], + [32074, 0, "c"], + [32075, 0, "'"], + [32076, 0, "'"], + [32077, 0, ";"], + [32078, 0, " "], + [32079, 0, "a"], + [32080, 0, "n"], + [32081, 0, "d"], + [32099, 0, "."], + [32100, 0, "\n"], + [32101, 0, "\n"], + [32102, 0, "F"], + [32103, 0, "i"], + [32104, 0, "g"], + [32105, 0, "u"], + [32106, 0, "r"], + [32107, 0, "e"], + [32108, 0, "~"], + [32109, 0, "\\"], + [32110, 0, "r"], + [32111, 0, "e"], + [32112, 0, "f"], + [32113, 0, "{"], + [32114, 0, "f"], + [32115, 0, "i"], + [32116, 0, "g"], + [32117, 0, ":"], + [32118, 0, "t"], + [32119, 0, "y"], + [32120, 0, "p"], + [32121, 0, "e"], + [32122, 0, "-"], + [32123, 0, "c"], + [32124, 0, "l"], + [32125, 0, "a"], + [32126, 0, "s"], + [32127, 0, "h"], + [32128, 0, "}"], + [32129, 0, " "], + [32130, 0, "d"], + [32131, 0, "e"], + [32132, 0, "m"], + [32133, 0, "o"], + [32134, 0, "n"], + [32135, 0, "s"], + [32136, 0, "t"], + [32137, 0, "r"], + [32138, 0, "a"], + [32139, 0, "t"], + [32140, 0, "e"], + [32141, 0, "s"], + [32142, 0, " "], + [32143, 0, "a"], + [32144, 0, " "], + [32145, 0, "v"], + [32146, 0, "a"], + [32147, 0, "r"], + [32148, 0, "i"], + [32149, 0, "a"], + [32150, 0, "n"], + [32151, 0, "t"], + [32152, 0, " "], + [32153, 0, "o"], + [32154, 0, "f"], + [32155, 0, " "], + [32156, 0, "t"], + [32157, 0, "h"], + [32158, 0, "e"], + [32159, 0, " "], + [32160, 0, "s"], + [32161, 0, "i"], + [32162, 0, "t"], + [32163, 0, "u"], + [32164, 0, "a"], + [32165, 0, "t"], + [32166, 0, "i"], + [32167, 0, "o"], + [32168, 0, "n"], + [32169, 0, " "], + [32170, 0, "i"], + [32171, 0, "n"], + [32172, 0, " "], + [32173, 0, "F"], + [32174, 0, "i"], + [32175, 0, "g"], + [32176, 0, "u"], + [32177, 0, "r"], + [32178, 0, "e"], + [32179, 0, "~"], + [32180, 0, "\\"], + [32181, 0, "r"], + [32182, 0, "e"], + [32183, 0, "f"], + [32184, 0, "{"], + [32185, 0, "f"], + [32186, 0, "i"], + [32187, 0, "g"], + [32188, 0, ":"], + [32189, 0, "t"], + [32190, 0, "w"], + [32191, 0, "o"], + [32192, 0, "-"], + [32193, 0, "l"], + [32194, 0, "i"], + [32195, 0, "s"], + [32196, 0, "t"], + [32197, 0, "s"], + [32198, 0, "}"], + [32199, 0, ","], + [32200, 0, " "], + [32201, 0, "w"], + [32202, 0, "h"], + [32203, 0, "e"], + [32204, 0, "r"], + [32205, 0, "e"], + [32206, 0, " "], + [32207, 0, "$"], + [32207, 1], + [32207, 0, "t"], + [32208, 0, "w"], + [32209, 0, "o"], + [32210, 0, " "], + [32211, 0, "r"], + [32212, 0, "e"], + [32213, 0, "p"], + [32214, 0, "l"], + [32215, 0, "i"], + [32216, 0, "c"], + [32217, 0, "a"], + [32218, 0, "s"], + [32219, 0, " "], + [32220, 0, "c"], + [32221, 0, "o"], + [32222, 0, "n"], + [32223, 0, "c"], + [32224, 0, "u"], + [32225, 0, "r"], + [32226, 0, "r"], + [32227, 0, "e"], + [32228, 0, "n"], + [32229, 0, "t"], + [32230, 0, "l"], + [32231, 0, "y"], + [32232, 0, " "], + [32233, 0, "i"], + [32234, 0, "n"], + [32235, 0, "s"], + [32236, 0, "e"], + [32237, 0, "r"], + [32238, 0, "t"], + [32239, 0, " "], + [32240, 0, "t"], + [32241, 0, "h"], + [32242, 0, "e"], + [32243, 0, " "], + [32244, 0, "s"], + [32245, 0, "a"], + [32246, 0, "m"], + [32247, 0, "e"], + [32248, 0, " "], + [32249, 0, "m"], + [32250, 0, "a"], + [32251, 0, "p"], + [32252, 0, " "], + [32253, 0, "k"], + [32254, 0, "e"], + [32255, 0, "y"], + [32256, 0, ","], + [32257, 0, " "], + [32258, 0, "b"], + [32259, 0, "u"], + [32260, 0, "t"], + [32261, 0, " "], + [32262, 0, "t"], + [32263, 0, "h"], + [32264, 0, "e"], + [32265, 0, "y"], + [32266, 0, " "], + [32267, 0, "d"], + [32268, 0, "o"], + [32269, 0, " "], + [32270, 0, "s"], + [32271, 0, "o"], + [32272, 0, " "], + [32273, 0, "w"], + [32274, 0, "i"], + [32275, 0, "t"], + [32276, 0, "h"], + [32277, 0, " "], + [32278, 0, "d"], + [32279, 0, "i"], + [32280, 0, "f"], + [32281, 0, "f"], + [32282, 0, "e"], + [32283, 0, "r"], + [32284, 0, "e"], + [32285, 0, "n"], + [32286, 0, "t"], + [32287, 0, " "], + [32288, 0, "d"], + [32289, 0, "a"], + [32290, 0, "t"], + [32291, 0, "a"], + [32292, 0, "t"], + [32293, 0, "y"], + [32294, 0, "p"], + [32295, 0, "e"], + [32296, 0, "s"], + [32297, 0, " "], + [32298, 0, "a"], + [32299, 0, "s"], + [32300, 0, " "], + [32301, 0, "v"], + [32302, 0, "a"], + [32303, 0, "l"], + [32304, 0, "u"], + [32305, 0, "e"], + [32306, 0, "s"], + [32307, 0, ":"], + [32308, 0, " "], + [32309, 0, "$"], + [32310, 0, "q"], + [32310, 1], + [32310, 0, "p"], + [32311, 0, "$"], + [32312, 0, " "], + [32313, 0, "i"], + [32314, 0, "n"], + [32315, 0, "s"], + [32316, 0, "e"], + [32317, 0, "r"], + [32318, 0, "t"], + [32319, 0, "s"], + [32320, 0, " "], + [32321, 0, "a"], + [32322, 0, " "], + [32323, 0, "n"], + [32324, 0, "e"], + [32325, 0, "s"], + [32326, 0, "t"], + [32327, 0, "e"], + [32328, 0, "d"], + [32329, 0, " "], + [32330, 0, "m"], + [32331, 0, "a"], + [32332, 0, "p"], + [32333, 0, ","], + [32334, 0, " "], + [32335, 0, "w"], + [32336, 0, "h"], + [32337, 0, "e"], + [32338, 0, "r"], + [32339, 0, "e"], + [32340, 0, "a"], + [32341, 0, "s"], + [32342, 0, " "], + [32343, 0, "$"], + [32344, 0, "q"], + [32345, 0, "$"], + [32346, 0, " "], + [32347, 0, "i"], + [32348, 0, "n"], + [32349, 0, "s"], + [32350, 0, "e"], + [32351, 0, "r"], + [32352, 0, "t"], + [32353, 0, "s"], + [32354, 0, " "], + [32355, 0, "a"], + [32356, 0, " "], + [32357, 0, "l"], + [32358, 0, "i"], + [32359, 0, "s"], + [32360, 0, "t"], + [32361, 0, "."], + [32362, 0, " "], + [32363, 0, "T"], + [32364, 0, "h"], + [32365, 0, "e"], + [32366, 0, "s"], + [32367, 0, "e"], + [32368, 0, " "], + [32369, 0, "d"], + [32370, 0, "a"], + [32371, 0, "t"], + [32372, 0, "a"], + [32373, 0, "t"], + [32374, 0, "y"], + [32375, 0, "p"], + [32376, 0, "e"], + [32377, 0, "s"], + [32378, 0, " "], + [32379, 0, "c"], + [32380, 0, "a"], + [32381, 0, "n"], + [32382, 0, "n"], + [32383, 0, "o"], + [32384, 0, "t"], + [32385, 0, " "], + [32386, 0, "m"], + [32387, 0, "e"], + [32388, 0, "a"], + [32389, 0, "n"], + [32390, 0, "i"], + [32391, 0, "n"], + [32392, 0, "g"], + [32393, 0, "f"], + [32394, 0, "u"], + [32395, 0, "l"], + [32396, 0, "l"], + [32397, 0, "y"], + [32398, 0, " "], + [32399, 0, "b"], + [32400, 0, "e"], + [32401, 0, " "], + [32402, 0, "m"], + [32403, 0, "e"], + [32404, 0, "r"], + [32405, 0, "g"], + [32406, 0, "e"], + [32407, 0, "d"], + [32408, 0, ","], + [32409, 0, " "], + [32410, 0, "s"], + [32411, 0, "o"], + [32412, 0, " "], + [32413, 0, "w"], + [32414, 0, "e"], + [32415, 0, " "], + [32416, 0, "p"], + [32417, 0, "r"], + [32418, 0, "e"], + [32419, 0, "s"], + [32420, 0, "e"], + [32421, 0, "r"], + [32422, 0, "v"], + [32423, 0, "e"], + [32424, 0, " "], + [32425, 0, "b"], + [32426, 0, "o"], + [32427, 0, "t"], + [32428, 0, "h"], + [32429, 0, " "], + [32430, 0, "v"], + [32431, 0, "a"], + [32432, 0, "l"], + [32433, 0, "u"], + [32434, 0, "e"], + [32435, 0, "s"], + [32436, 0, " "], + [32437, 0, "s"], + [32438, 0, "e"], + [32439, 0, "p"], + [32440, 0, "a"], + [32441, 0, "r"], + [32442, 0, "a"], + [32443, 0, "t"], + [32444, 0, "e"], + [32445, 0, "l"], + [32446, 0, "y"], + [32447, 0, "."], + [32448, 0, " "], + [32449, 0, "W"], + [32450, 0, "e"], + [32451, 0, " "], + [32452, 0, "d"], + [32453, 0, "o"], + [32454, 0, " "], + [32455, 0, "t"], + [32456, 0, "h"], + [32457, 0, "i"], + [32458, 0, "s"], + [32459, 0, " "], + [32460, 0, "b"], + [32461, 0, "y"], + [32462, 0, " "], + [32463, 0, "a"], + [32464, 0, "d"], + [32465, 0, "d"], + [32466, 0, "i"], + [32467, 0, "n"], + [32468, 0, "g"], + [32469, 0, " "], + [32470, 0, "a"], + [32471, 0, " "], + [32472, 0, "t"], + [32473, 0, "y"], + [32474, 0, "p"], + [32475, 0, "e"], + [32476, 0, " "], + [32477, 0, "t"], + [32478, 0, "a"], + [32479, 0, "g"], + [32480, 0, " "], + [32480, 1], + [32479, 1], + [32478, 1], + [32477, 1], + [32476, 1], + [32475, 1], + [32474, 1], + [32473, 1], + [32472, 1], + [32471, 1], + [32470, 1], + [32469, 1], + [32468, 1], + [32467, 1], + [32466, 1], + [32465, 1], + [32464, 1], + [32463, 1], + [32462, 1], + [32462, 0, " "], + [32463, 0, "t"], + [32464, 0, "a"], + [32465, 0, "g"], + [32466, 0, "g"], + [32467, 0, "i"], + [32468, 0, "n"], + [32469, 0, "g"], + [32470, 0, " "], + [32471, 0, "e"], + [32472, 0, "a"], + [32473, 0, "c"], + [32474, 0, "h"], + [32475, 0, " "], + [32476, 0, "m"], + [32477, 0, "a"], + [32478, 0, "p"], + [32479, 0, " "], + [32480, 0, "k"], + [32481, 0, "e"], + [32482, 0, "y"], + [32483, 0, " "], + [32484, 0, "w"], + [32485, 0, "i"], + [32486, 0, "t"], + [32487, 0, "h"], + [32488, 0, " "], + [32489, 0, "a"], + [32490, 0, " "], + [32491, 0, "t"], + [32492, 0, "y"], + [32493, 0, "p"], + [32494, 0, "e"], + [32495, 0, " "], + [32496, 0, "a"], + [32497, 0, "n"], + [32498, 0, "n"], + [32499, 0, "o"], + [32500, 0, "t"], + [32501, 0, "a"], + [32502, 0, "t"], + [32503, 0, "i"], + [32504, 0, "o"], + [32505, 0, "n"], + [32506, 0, " "], + [32507, 0, "("], + [32508, 0, "\\"], + [32509, 0, "t"], + [32510, 0, "e"], + [32511, 0, "x"], + [32512, 0, "t"], + [32513, 0, "s"], + [32514, 0, "f"], + [32515, 0, "{"], + [32516, 0, "m"], + [32517, 0, "a"], + [32518, 0, "p"], + [32519, 0, "T"], + [32520, 0, "}"], + [32521, 0, " "], + [32522, 0, "o"], + [32523, 0, "r"], + [32524, 0, " "], + [32525, 0, "\\"], + [32526, 0, "t"], + [32527, 0, "e"], + [32528, 0, "x"], + [32529, 0, "t"], + [32530, 0, "s"], + [32531, 0, "f"], + [32532, 0, "{"], + [32533, 0, "r"], + [32534, 0, "e"], + [32534, 1], + [32533, 1], + [32533, 0, "l"], + [32534, 0, "i"], + [32535, 0, "s"], + [32536, 0, "t"], + [32537, 0, "T"], + [32538, 0, "}"], + [32523, 1], + [32522, 1], + [32521, 1], + [32521, 0, ","], + [32537, 0, ","], + [32538, 0, " "], + [32539, 0, "o"], + [32540, 0, "r"], + [32541, 0, " "], + [32542, 0, "\\"], + [32543, 0, "t"], + [32544, 0, "e"], + [32545, 0, "x"], + [32546, 0, "t"], + [32547, 0, "s"], + [32548, 0, "f"], + [32549, 0, "{"], + [32550, 0, "r"], + [32551, 0, "e"], + [32552, 0, "g"], + [32553, 0, "T"], + [32554, 0, "}"], + [32555, 0, " "], + [32556, 0, "f"], + [32557, 0, "o"], + [32558, 0, "r"], + [32559, 0, " "], + [32560, 0, "a"], + [32561, 0, " "], + [32562, 0, "m"], + [32563, 0, "a"], + [32564, 0, "p"], + [32565, 0, ","], + [32566, 0, " "], + [32567, 0, "l"], + [32568, 0, "i"], + [32569, 0, "s"], + [32570, 0, "t"], + [32571, 0, ","], + [32572, 0, " "], + [32573, 0, "o"], + [32574, 0, "r"], + [32575, 0, " "], + [32576, 0, "r"], + [32577, 0, "e"], + [32578, 0, "g"], + [32579, 0, "i"], + [32580, 0, "s"], + [32581, 0, "t"], + [32582, 0, "e"], + [32583, 0, "r"], + [32584, 0, " "], + [32585, 0, "v"], + [32586, 0, "a"], + [32587, 0, "l"], + [32588, 0, "u"], + [32589, 0, "e"], + [32590, 0, " "], + [32591, 0, "r"], + [32592, 0, "e"], + [32593, 0, "s"], + [32594, 0, "p"], + [32595, 0, "e"], + [32596, 0, "c"], + [32597, 0, "t"], + [32598, 0, "i"], + [32599, 0, "v"], + [32600, 0, "e"], + [32601, 0, "l"], + [32602, 0, "y"], + [32603, 0, ")"], + [32604, 0, ","], + [32605, 0, " "], + [32606, 0, "s"], + [32607, 0, "o"], + [32608, 0, " "], + [32609, 0, "e"], + [32610, 0, "a"], + [32611, 0, "c"], + [32612, 0, "h"], + [32613, 0, " "], + [32614, 0, "t"], + [32615, 0, "y"], + [32616, 0, "p"], + [32617, 0, "e"], + [32618, 0, " "], + [32619, 0, "i"], + [32620, 0, "n"], + [32621, 0, "h"], + [32622, 0, "a"], + [32623, 0, "b"], + [32624, 0, "i"], + [32625, 0, "t"], + [32626, 0, "s"], + [32627, 0, " "], + [32628, 0, "a"], + [32629, 0, " "], + [32630, 0, "s"], + [32631, 0, "e"], + [32632, 0, "p"], + [32633, 0, "a"], + [32634, 0, "r"], + [32635, 0, "a"], + [32636, 0, "t"], + [32637, 0, "e"], + [32638, 0, " "], + [32639, 0, "n"], + [32640, 0, "a"], + [32641, 0, "m"], + [32642, 0, "e"], + [32643, 0, "s"], + [32644, 0, "p"], + [32645, 0, "a"], + [32646, 0, "c"], + [32647, 0, "e"], + [32648, 0, "."], + [32649, 0, " "], + [32650, 0, "T"], + [32651, 0, "h"], + [32652, 0, "e"], + [32653, 0, " "], + [32654, 0, "a"], + [32655, 0, "p"], + [32656, 0, "p"], + [32656, 1], + [32655, 1], + [32654, 1], + [32653, 1], + [32652, 1], + [32651, 1], + [32650, 1], + [32649, 1], + [34419, 0, "s"], + [34430, 0, "s"], + [34451, 0, " "], + [34452, 0, "a"], + [34453, 0, "n"], + [34454, 0, "d"], + [34455, 0, "~"], + [34456, 0, "\\"], + [34457, 0, "r"], + [34458, 0, "e"], + [34459, 0, "f"], + [34460, 0, "{"], + [34461, 0, "f"], + [34462, 0, "i"], + [34463, 0, "g"], + [34464, 0, ":"], + [34465, 0, "t"], + [34466, 0, "y"], + [34467, 0, "p"], + [34468, 0, "e"], + [34469, 0, "-"], + [34470, 0, "c"], + [34471, 0, "l"], + [34472, 0, "a"], + [34473, 0, "s"], + [34474, 0, "h"], + [34475, 0, "}"], + [34419, 1], + [34418, 1], + [34417, 1], + [34416, 1], + [34415, 1], + [34414, 1], + [34413, 1], + [34412, 1], + [34412, 0, "s"], + [34413, 0, "c"], + [34414, 0, "e"], + [34415, 0, "n"], + [34416, 0, "a"], + [34417, 0, "r"], + [34418, 0, "i"], + [34419, 0, "o"], + [34420, 0, "s"], + [38114, 1], + [38113, 1], + [38112, 1], + [38111, 1], + [38110, 1], + [38109, 1], + [38108, 1], + [38107, 1], + [38106, 1], + [38105, 1], + [38122, 1], + [38122, 0, "."], + [38123, 0, "g"], + [38124, 0, "e"], + [38125, 0, "t"], + [38126, 0, "("], + [38150, 1], + [38150, 0, ")"], + [38180, 0, " "], + [38181, 0, "a"], + [38182, 0, "n"], + [38183, 0, "d"], + [38184, 0, " "], + [38184, 1], + [38196, 1], + [38195, 1], + [38194, 1], + [38193, 1], + [38193, 0, "."], + [38194, 0, "i"], + [38195, 0, "d"], + [38196, 0, "x"], + [38197, 0, "("], + [38199, 0, "$"], + [38200, 0, "\\"], + [38201, 0, "m"], + [38202, 0, "a"], + [38203, 0, "t"], + [38204, 0, "h"], + [38205, 0, "i"], + [38206, 0, "t"], + [38207, 0, "{"], + [38208, 0, "n"], + [38209, 0, "}"], + [38209, 1], + [38208, 1], + [38207, 1], + [38206, 1], + [38205, 1], + [38204, 1], + [38203, 1], + [38202, 1], + [38201, 1], + [38200, 1], + [38200, 0, "n"], + [38201, 0, "$"], + [38202, 0, "\\"], + [38203, 0, "t"], + [38204, 0, "e"], + [38205, 0, "x"], + [38206, 0, "t"], + [38207, 0, "t"], + [38208, 0, "t"], + [38209, 0, "{"], + [38210, 0, ")"], + [38211, 0, "}"], + [38212, 0, " "], + [38213, 0, "s"], + [38214, 0, "l"], + [38214, 1], + [38214, 0, "e"], + [38215, 0, "e"], + [38215, 1], + [38215, 0, "l"], + [38216, 0, "e"], + [38217, 0, "c"], + [38218, 0, "t"], + [38219, 0, "s"], + [38220, 0, " "], + [38221, 0, "t"], + [38222, 0, "h"], + [38223, 0, "e"], + [38224, 0, " "], + [38225, 0, "$"], + [38226, 0, "n"], + [38227, 0, "$"], + [38228, 0, "t"], + [38229, 0, "h"], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38231, 1], + [38258, 0, " "], + [38259, 0, "L"], + [38260, 0, "i"], + [38261, 0, "s"], + [38262, 0, "t"], + [38263, 0, "s"], + [38264, 0, " "], + [38265, 0, "a"], + [38266, 0, "r"], + [38267, 0, "e"], + [38268, 0, " "], + [38269, 0, "i"], + [38270, 0, "n"], + [38271, 0, "d"], + [38272, 0, "e"], + [38273, 0, "x"], + [38274, 0, "e"], + [38275, 0, "d"], + [38276, 0, " "], + [38277, 0, "s"], + [38278, 0, "t"], + [38279, 0, "a"], + [38280, 0, "r"], + [38281, 0, "t"], + [38282, 0, "i"], + [38283, 0, "n"], + [38284, 0, "g"], + [38285, 0, " "], + [38286, 0, "f"], + [38287, 0, "r"], + [38288, 0, "o"], + [38289, 0, "m"], + [38290, 0, " "], + [38291, 0, "1"], + [38292, 0, ","], + [38293, 0, " "], + [38294, 0, "a"], + [38295, 0, "n"], + [38296, 0, "d"], + [38297, 0, " "], + [38298, 0, "\\"], + [38299, 0, "t"], + [38300, 0, "e"], + [38301, 0, "x"], + [38302, 0, "t"], + [38303, 0, "t"], + [38304, 0, "t"], + [38305, 0, "{"], + [38306, 0, "."], + [38307, 0, "i"], + [38308, 0, "d"], + [38309, 0, "x"], + [38310, 0, "("], + [38311, 0, "0"], + [38312, 0, ")"], + [38313, 0, "}"], + [38314, 0, " "], + [38315, 0, "i"], + [38316, 0, "s"], + [38317, 0, " "], + [38318, 0, "a"], + [38319, 0, " "], + [38320, 0, "s"], + [38321, 0, "p"], + [38322, 0, "e"], + [38323, 0, "c"], + [38324, 0, "i"], + [38325, 0, "a"], + [38326, 0, "l"], + [38327, 0, " "], + [38328, 0, "c"], + [38329, 0, "u"], + [38330, 0, "r"], + [38331, 0, "s"], + [38332, 0, "o"], + [38333, 0, "r"], + [38334, 0, " "], + [38335, 0, "i"], + [38336, 0, "n"], + [38337, 0, "d"], + [38338, 0, "i"], + [38339, 0, "c"], + [38340, 0, "a"], + [38341, 0, "t"], + [38342, 0, "i"], + [38343, 0, "n"], + [38344, 0, "g"], + [38345, 0, " "], + [38346, 0, "t"], + [38347, 0, "h"], + [38348, 0, "e"], + [38349, 0, " "], + [38350, 0, "h"], + [38351, 0, "e"], + [38352, 0, "a"], + [38353, 0, "d"], + [38354, 0, " "], + [38355, 0, "o"], + [38356, 0, "f"], + [38357, 0, " "], + [38358, 0, "a"], + [38359, 0, " "], + [38360, 0, "l"], + [38361, 0, "i"], + [38362, 0, "s"], + [38363, 0, "t"], + [38364, 0, "."], + [38984, 0, " "], + [38985, 0, "p"], + [38986, 0, "l"], + [38987, 0, "a"], + [38988, 0, "c"], + [38989, 0, "e"], + [38990, 0, "s"], + [38991, 0, " "], + [38992, 0, "a"], + [38993, 0, " "], + [38994, 0, "n"], + [38995, 0, "e"], + [38996, 0, "w"], + [38997, 0, " "], + [38998, 0, "e"], + [38999, 0, "l"], + [39000, 0, "e"], + [39001, 0, "m"], + [39002, 0, "e"], + [39003, 0, "n"], + [39004, 0, "t"], + [39005, 0, " "], + [39006, 0, "a"], + [39007, 0, "f"], + [39008, 0, "t"], + [39009, 0, "e"], + [39010, 0, "r"], + [39011, 0, " "], + [39012, 0, "t"], + [39013, 0, "h"], + [39014, 0, "e"], + [39015, 0, " "], + [39016, 0, "p"], + [39017, 0, "o"], + [39018, 0, "s"], + [39019, 0, "i"], + [39020, 0, "t"], + [39021, 0, "i"], + [39022, 0, "o"], + [39023, 0, "n"], + [39024, 0, " "], + [39025, 0, "i"], + [39026, 0, "d"], + [39027, 0, "e"], + [39028, 0, "n"], + [39029, 0, "t"], + [39030, 0, "i"], + [39031, 0, "f"], + [39032, 0, "i"], + [39033, 0, "e"], + [39034, 0, "d"], + [39035, 0, " "], + [39036, 0, "b"], + [39037, 0, "y"], + [39038, 0, " "], + [39039, 0, "t"], + [39040, 0, "h"], + [39041, 0, "e"], + [39042, 0, " "], + [39043, 0, "c"], + [39044, 0, "u"], + [39045, 0, "r"], + [39046, 0, "s"], + [39047, 0, "o"], + [39048, 0, "r"], + [39049, 0, ","], + [39050, 0, " "], + [39051, 0, "a"], + [39052, 0, "n"], + [39053, 0, "d"], + [39054, 0, " "], + [39055, 0, "\\"], + [39056, 0, "t"], + [39057, 0, "e"], + [39058, 0, "x"], + [39059, 0, "t"], + [39060, 0, "t"], + [39061, 0, "t"], + [39062, 0, "{"], + [39063, 0, "."], + [39064, 0, "i"], + [39065, 0, "d"], + [39066, 0, "x"], + [39067, 0, "("], + [39068, 0, "0"], + [39069, 0, ")"], + [39070, 0, "."], + [39071, 0, "i"], + [39072, 0, "n"], + [39073, 0, "s"], + [39074, 0, "e"], + [39075, 0, "r"], + [39076, 0, "t"], + [39077, 0, "}"], + [39078, 0, " "], + [39079, 0, "i"], + [39080, 0, "n"], + [39081, 0, "s"], + [39082, 0, "e"], + [39083, 0, "r"], + [39084, 0, "t"], + [39085, 0, "s"], + [39086, 0, " "], + [39087, 0, "a"], + [39088, 0, "t"], + [39089, 0, " "], + [39090, 0, "t"], + [39091, 0, "h"], + [39092, 0, "e"], + [39093, 0, " "], + [39094, 0, "h"], + [39095, 0, "e"], + [39096, 0, "a"], + [39097, 0, "d"], + [39098, 0, " "], + [39099, 0, "o"], + [39100, 0, "f"], + [39101, 0, " "], + [39102, 0, "a"], + [39103, 0, " "], + [39104, 0, "l"], + [39105, 0, "i"], + [39106, 0, "s"], + [39107, 0, "t"], + [39174, 0, " "], + [39175, 0, "r"], + [39176, 0, "e"], + [39177, 0, "m"], + [39178, 0, "o"], + [39179, 0, "v"], + [39180, 0, "e"], + [39181, 0, "s"], + [39182, 0, " "], + [39183, 0, "t"], + [39184, 0, "h"], + [39185, 0, "e"], + [39186, 0, " "], + [39187, 0, "i"], + [39188, 0, "t"], + [39189, 0, "e"], + [39189, 1], + [39188, 1], + [39187, 1], + [39187, 0, "e"], + [39188, 0, "l"], + [39189, 0, "e"], + [39190, 0, "m"], + [39191, 0, "e"], + [39192, 0, "n"], + [39193, 0, "t"], + [39194, 0, " "], + [39195, 0, "i"], + [39196, 0, "d"], + [39197, 0, "e"], + [39198, 0, "n"], + [39199, 0, "t"], + [39200, 0, "i"], + [39201, 0, "f"], + [39202, 0, "i"], + [39203, 0, "e"], + [39204, 0, "d"], + [39205, 0, " "], + [39206, 0, "b"], + [39207, 0, "y"], + [39208, 0, " "], + [39209, 0, "t"], + [39210, 0, "h"], + [39211, 0, "e"], + [39212, 0, " "], + [39213, 0, "c"], + [39214, 0, "u"], + [39215, 0, "r"], + [39216, 0, "s"], + [39217, 0, "o"], + [39218, 0, "r"], + [38893, 1], + [38892, 1], + [38891, 1], + [38890, 1], + [38889, 1], + [38888, 1], + [38902, 1], + [38901, 1], + [38900, 1], + [38899, 1], + [38898, 1], + [38897, 1], + [38896, 1], + [38895, 1], + [38894, 1], + [38893, 1], + [38892, 1], + [38912, 0, " "], + [38913, 0, "s"], + [38914, 0, "e"], + [38915, 0, "t"], + [38916, 0, "s"], + [38917, 0, " "], + [38918, 0, "t"], + [38919, 0, "h"], + [38920, 0, "e"], + [38921, 0, " "], + [38922, 0, "v"], + [38923, 0, "a"], + [38924, 0, "l"], + [38925, 0, "u"], + [38926, 0, "e"], + [38927, 0, " "], + [38928, 0, "o"], + [38929, 0, "f"], + [38930, 0, " "], + [38931, 0, "t"], + [38932, 0, "h"], + [38933, 0, "e"], + [38934, 0, " "], + [38935, 0, "r"], + [38936, 0, "e"], + [38937, 0, "g"], + [38938, 0, "i"], + [38939, 0, "s"], + [38940, 0, "t"], + [38941, 0, "e"], + [38942, 0, "r"], + [38943, 0, " "], + [38944, 0, "i"], + [38945, 0, "d"], + [38946, 0, "e"], + [38947, 0, "n"], + [38948, 0, "t"], + [38949, 0, "i"], + [38950, 0, "f"], + [38951, 0, "i"], + [38952, 0, "e"], + [38953, 0, "d"], + [38954, 0, " "], + [38955, 0, "b"], + [38956, 0, "y"], + [38957, 0, " "], + [38958, 0, "t"], + [38959, 0, "h"], + [38960, 0, "e"], + [38961, 0, " "], + [38962, 0, "c"], + [38963, 0, "u"], + [38964, 0, "r"], + [38965, 0, "s"], + [38966, 0, "o"], + [38967, 0, "r"], + [38874, 1], + [38873, 1], + [38872, 1], + [38871, 1], + [38870, 1], + [38869, 1], + [38868, 1], + [38867, 1], + [38866, 1], + [38865, 1], + [38864, 1], + [38863, 1], + [38862, 1], + [38861, 1], + [38860, 1], + [38859, 1], + [38858, 1], + [38857, 1], + [38856, 1], + [38855, 1], + [38854, 1], + [38853, 1], + [38853, 0, "w"], + [38854, 0, "r"], + [38855, 0, "i"], + [38856, 0, "t"], + [38857, 0, "i"], + [38858, 0, "n"], + [38859, 0, "g"], + [38860, 0, " "], + [38861, 0, "t"], + [38862, 0, "o"], + [38904, 1], + [38903, 1], + [38902, 1], + [38901, 1], + [38901, 0, "a"], + [38902, 0, "s"], + [38903, 0, "s"], + [38904, 0, "i"], + [38905, 0, "g"], + [38906, 0, "n"], + [38907, 0, "s"], + [39036, 0, "\\"], + [39037, 0, "e"], + [39038, 0, "m"], + [39039, 0, "p"], + [39040, 0, "h"], + [39041, 0, "{"], + [39047, 0, "}"], + [39060, 1], + [39059, 1], + [39058, 1], + [39057, 1], + [39056, 1], + [39055, 1], + [39054, 1], + [39053, 1], + [39053, 0, "e"], + [39054, 0, "x"], + [39055, 0, "i"], + [39056, 0, "s"], + [39057, 0, "t"], + [39058, 0, "i"], + [39059, 0, "n"], + [39060, 0, "g"], + [39061, 0, " "], + [39062, 0, "l"], + [39063, 0, "i"], + [39064, 0, "s"], + [39065, 0, "t"], + [39066, 0, " "], + [39067, 0, "e"], + [39068, 0, "l"], + [39069, 0, "e"], + [39070, 0, "m"], + [39071, 0, "e"], + [39072, 0, "n"], + [39073, 0, "t"], + [39051, 1], + [39050, 1], + [39049, 1], + [39049, 0, "a"], + [39050, 0, "n"], + [39375, 1], + [39374, 1], + [39373, 1], + [39372, 1], + [39371, 1], + [39370, 1], + [39369, 1], + [39368, 1], + [39367, 1], + [39366, 1], + [39365, 1], + [39364, 1], + [39363, 1], + [39362, 1], + [39361, 1], + [39360, 1], + [39359, 1], + [39358, 1], + [39357, 1], + [39356, 1], + [39355, 1], + [39354, 1], + [39353, 1], + [39352, 1], + [39351, 1], + [39350, 1], + [39349, 1], + [39348, 1], + [39347, 1], + [39346, 1], + [39345, 1], + [39344, 1], + [39343, 1], + [39342, 1], + [39341, 1], + [39340, 1], + [39339, 1], + [39338, 1], + [39337, 1], + [39336, 1], + [39335, 1], + [39334, 1], + [39333, 1], + [39332, 1], + [39331, 1], + [39330, 1], + [39329, 1], + [39328, 1], + [39327, 1], + [39326, 1], + [39325, 1], + [39324, 1], + [39323, 1], + [39322, 1], + [39321, 1], + [39320, 1], + [39319, 1], + [39318, 1], + [39317, 1], + [39316, 1], + [39315, 1], + [39314, 1], + [39313, 1], + [39312, 1], + [39311, 1], + [39310, 1], + [39309, 1], + [39308, 1], + [39307, 1], + [39306, 1], + [39305, 1], + [39304, 1], + [39303, 1], + [39302, 1], + [39301, 1], + [39300, 1], + [39299, 1], + [39298, 1], + [39297, 1], + [39296, 1], + [39295, 1], + [39294, 1], + [39293, 1], + [39292, 1], + [39291, 1], + [39290, 1], + [39289, 1], + [39288, 1], + [39287, 1], + [39286, 1], + [39285, 1], + [39284, 1], + [39283, 1], + [39282, 1], + [39281, 1], + [39280, 1], + [39279, 1], + [39278, 1], + [39277, 1], + [39276, 1], + [39275, 1], + [39274, 1], + [39273, 1], + [39272, 1], + [39271, 1], + [39270, 1], + [39458, 0, ","], + [39459, 0, " "], + [39460, 0, "a"], + [39461, 0, "n"], + [39462, 0, "d"], + [39463, 0, " "], + [39464, 0, "t"], + [39465, 0, "h"], + [39466, 0, "e"], + [39467, 0, "n"], + [39468, 0, " "], + [39469, 0, "t"], + [39470, 0, "h"], + [39471, 0, "e"], + [39472, 0, " "], + [39473, 0, "k"], + [39474, 0, "e"], + [39475, 0, "y"], + [39476, 0, " "], + [39477, 0, "`"], + [39478, 0, "`"], + [39479, 0, "h"], + [39479, 1], + [39478, 1], + [39477, 1], + [39477, 0, "\\"], + [39478, 0, "t"], + [39479, 0, "e"], + [39480, 0, "x"], + [39481, 0, "t"], + [39482, 0, "t"], + [39483, 0, "t"], + [39484, 0, "{"], + [39485, 0, "\""], + [39486, 0, "s"], + [39487, 0, "h"], + [39488, 0, "o"], + [39489, 0, "p"], + [39490, 0, "p"], + [39491, 0, "i"], + [39492, 0, "n"], + [39493, 0, "g"], + [39494, 0, "\""], + [39495, 0, "}"], + [39495, 1], + [39495, 0, "|"], + [39484, 1], + [39483, 1], + [39482, 1], + [39481, 1], + [39480, 1], + [39479, 1], + [39478, 1], + [39478, 0, "v"], + [39479, 0, "e"], + [39480, 0, "r"], + [39481, 0, "b"], + [39482, 0, "|"], + [39494, 0, " "], + [39495, 0, "w"], + [39496, 0, "i"], + [39497, 0, "t"], + [39498, 0, "h"], + [39499, 0, "i"], + [39500, 0, "n"], + [39501, 0, " "], + [39502, 0, "t"], + [39503, 0, "h"], + [39504, 0, "a"], + [39505, 0, "t"], + [39506, 0, " "], + [39507, 0, "m"], + [39508, 0, "a"], + [39509, 0, "p"], + [39510, 0, " "], + [39511, 0, "i"], + [39512, 0, "s"], + [39513, 0, " "], + [39514, 0, "s"], + [39515, 0, "e"], + [39516, 0, "t"], + [39517, 0, " "], + [39518, 0, "t"], + [39519, 0, "o"], + [39520, 0, " "], + [39521, 0, "t"], + [39522, 0, "h"], + [39523, 0, "e"], + [39524, 0, " "], + [39525, 0, "e"], + [39526, 0, "m"], + [39527, 0, "p"], + [39528, 0, "t"], + [39529, 0, "y"], + [39530, 0, " "], + [39531, 0, "l"], + [39532, 0, "i"], + [39533, 0, "s"], + [39534, 0, "t"], + [39535, 0, " "], + [39536, 0, "\\"], + [39537, 0, "v"], + [39538, 0, "e"], + [39539, 0, "r"], + [39540, 0, "b"], + [39541, 0, "|"], + [39542, 0, "["], + [39543, 0, "]"], + [39544, 0, "|"], + [39556, 1], + [39555, 1], + [39554, 1], + [39553, 1], + [39552, 1], + [39551, 1], + [39551, 0, "t"], + [39552, 0, "h"], + [39553, 0, "i"], + [39554, 0, "r"], + [39555, 0, "d"], + [39590, 1], + [39589, 1], + [39588, 1], + [39587, 1], + [39586, 1], + [39585, 1], + [39584, 1], + [39584, 0, "v"], + [39585, 0, "e"], + [39586, 0, "r"], + [39587, 0, "b"], + [39588, 0, "|"], + [39599, 1], + [39599, 0, "|"], + [39673, 1], + [39672, 1], + [39671, 1], + [39670, 1], + [39669, 1], + [39668, 1], + [39667, 1], + [39666, 1], + [39665, 1], + [39664, 1], + [39663, 1], + [39662, 1], + [39661, 1], + [39660, 1], + [39659, 1], + [39658, 1], + [39657, 1], + [39656, 1], + [39655, 1], + [39654, 1], + [39653, 1], + [39652, 1], + [39651, 1], + [39650, 1], + [39649, 1], + [39648, 1], + [39647, 1], + [39646, 1], + [39645, 1], + [39644, 1], + [39643, 1], + [39642, 1], + [39641, 1], + [39640, 1], + [39639, 1], + [39638, 1], + [39637, 1], + [39636, 1], + [39635, 1], + [39634, 1], + [39633, 1], + [39632, 1], + [39631, 1], + [39630, 1], + [39629, 1], + [39628, 1], + [39627, 1], + [39626, 1], + [39625, 1], + [39624, 1], + [39623, 1], + [39622, 1], + [39621, 1], + [39620, 1], + [39619, 1], + [39618, 1], + [39617, 1], + [39616, 1], + [39615, 1], + [39614, 1], + [39613, 1], + [39612, 1], + [39611, 1], + [39610, 1], + [39609, 1], + [39608, 1], + [39607, 1], + [39606, 1], + [39605, 1], + [39604, 1], + [39603, 1], + [39602, 1], + [39601, 1], + [39714, 1], + [39713, 1], + [39712, 1], + [39711, 1], + [39710, 1], + [39709, 1], + [39708, 1], + [39707, 1], + [39706, 1], + [39705, 1], + [39704, 1], + [39703, 1], + [39702, 1], + [39701, 1], + [39700, 1], + [39699, 1], + [39698, 1], + [39697, 1], + [39696, 1], + [39695, 1], + [39694, 1], + [39693, 1], + [39692, 1], + [39691, 1], + [39690, 1], + [39689, 1], + [39688, 1], + [39687, 1], + [39686, 1], + [39685, 1], + [39684, 1], + [39683, 1], + [39682, 1], + [39681, 1], + [39680, 1], + [39679, 1], + [39678, 1], + [39677, 1], + [39676, 1], + [39675, 1], + [39674, 1], + [39673, 1], + [39672, 1], + [39671, 1], + [39670, 1], + [39669, 1], + [39668, 1], + [39667, 1], + [39666, 1], + [39665, 1], + [39664, 1], + [39663, 1], + [39662, 1], + [39661, 1], + [39660, 1], + [39659, 1], + [39658, 1], + [39657, 1], + [39656, 1], + [39655, 1], + [39654, 1], + [39653, 1], + [39652, 1], + [39651, 1], + [39650, 1], + [39649, 1], + [39648, 1], + [39647, 1], + [39646, 1], + [39645, 1], + [39644, 1], + [39643, 1], + [39642, 1], + [39641, 1], + [39640, 1], + [39639, 1], + [39638, 1], + [39637, 1], + [39636, 1], + [39635, 1], + [39634, 1], + [39633, 1], + [39633, 0, ","], + [39634, 0, " "], + [39635, 0, "p"], + [39636, 0, "l"], + [39637, 0, "a"], + [39638, 0, "c"], + [39639, 0, "i"], + [39640, 0, "n"], + [39641, 0, "g"], + [39642, 0, " "], + [39643, 0, "t"], + [39644, 0, "h"], + [39645, 0, "e"], + [39646, 0, " "], + [39647, 0, "c"], + [39648, 0, "u"], + [39649, 0, "r"], + [39650, 0, "s"], + [39651, 0, "o"], + [39652, 0, "r"], + [39653, 0, " "], + [39654, 0, "i"], + [39655, 0, "n"], + [39656, 0, " "], + [39657, 0, "a"], + [39658, 0, " "], + [39659, 0, "v"], + [39660, 0, "a"], + [39661, 0, "r"], + [39662, 0, "i"], + [39663, 0, "a"], + [39664, 0, "b"], + [39665, 0, "l"], + [39666, 0, "e"], + [39667, 0, " "], + [39668, 0, "c"], + [39669, 0, "a"], + [39670, 0, "l"], + [39671, 0, "l"], + [39672, 0, "e"], + [39673, 0, "d"], + [39674, 0, " "], + [39675, 0, "\\"], + [39676, 0, "t"], + [39677, 0, "e"], + [39678, 0, "x"], + [39679, 0, "t"], + [39680, 0, "t"], + [39681, 0, "t"], + [39682, 0, "{"], + [39683, 0, "h"], + [39684, 0, "e"], + [39685, 0, "a"], + [39686, 0, "d"], + [39687, 0, "}"], + [39689, 0, "\n"], + [39690, 0, "\n"], + [39689, 0, " "], + [39690, 0, "T"], + [39691, 0, "h"], + [39692, 0, "e"], + [39693, 0, " "], + [39694, 0, "l"], + [39695, 0, "i"], + [39696, 0, "s"], + [39697, 0, "t"], + [39698, 0, " "], + [39699, 0, "e"], + [39700, 0, "l"], + [39701, 0, "e"], + [39702, 0, "m"], + [39703, 0, "e"], + [39704, 0, "n"], + [39705, 0, "t"], + [39706, 0, " "], + [39707, 0, "`"], + [39708, 0, "`"], + [39709, 0, "e"], + [39710, 0, "g"], + [39711, 0, "g"], + [39712, 0, "s"], + [39713, 0, "'"], + [39714, 0, "'"], + [39715, 0, " "], + [39716, 0, "i"], + [39717, 0, "s"], + [39718, 0, " "], + [39719, 0, "i"], + [39720, 0, "n"], + [39721, 0, "s"], + [39722, 0, "e"], + [39723, 0, "r"], + [39724, 0, "t"], + [39725, 0, "e"], + [39726, 0, "d"], + [39727, 0, " "], + [39728, 0, "a"], + [39729, 0, "t"], + [39730, 0, " "], + [39731, 0, "t"], + [39732, 0, "h"], + [39733, 0, "e"], + [39734, 0, " "], + [39735, 0, "h"], + [39736, 0, "e"], + [39737, 0, "a"], + [39738, 0, "d"], + [39739, 0, " "], + [39740, 0, "o"], + [39741, 0, "f"], + [39742, 0, " "], + [39743, 0, "t"], + [39744, 0, "h"], + [39745, 0, "e"], + [39746, 0, " "], + [39747, 0, "l"], + [39748, 0, "i"], + [39749, 0, "s"], + [39750, 0, "t"], + [39751, 0, "."], + [39752, 0, " "], + [39753, 0, "I"], + [39754, 0, "n"], + [39755, 0, " "], + [39756, 0, "l"], + [39757, 0, "i"], + [39758, 0, "n"], + [39759, 0, "e"], + [39760, 0, " "], + [39761, 0, "5"], + [39762, 0, ","], + [39763, 0, " "], + [24204, 0, "A"], + [24205, 0, "f"], + [24206, 0, "t"], + [24207, 0, "e"], + [24208, 0, "r"], + [24350, 0, "A"], + [24351, 0, "f"], + [24352, 0, "t"], + [24353, 0, "e"], + [24354, 0, "r"], + [24495, 0, "A"], + [24496, 0, "f"], + [24497, 0, "t"], + [24498, 0, "e"], + [24499, 0, "r"], + [24640, 0, "A"], + [24641, 0, "f"], + [24642, 0, "t"], + [24643, 0, "e"], + [24644, 0, "r"], + [26008, 0, "A"], + [26009, 0, "F"], + [26010, 0, "t"], + [26011, 0, "e"], + [26012, 0, "r"], + [26012, 1], + [26011, 1], + [26010, 1], + [26009, 1], + [26009, 0, "f"], + [26010, 0, "t"], + [26011, 0, "e"], + [26012, 0, "r"], + [26092, 0, "A"], + [26093, 0, "f"], + [26094, 0, "t"], + [26095, 0, "e"], + [26096, 0, "r"], + [26177, 0, "A"], + [26178, 0, "f"], + [26179, 0, "t"], + [26180, 0, "e"], + [26181, 0, "r"], + [27722, 0, "A"], + [27723, 0, "f"], + [27724, 0, "t"], + [27725, 0, "e"], + [27726, 0, "r"], + [35302, 0, "A"], + [35303, 0, "f"], + [35304, 0, "t"], + [35305, 0, "e"], + [35306, 0, "r"], + [36258, 0, "A"], + [36259, 0, "f"], + [36260, 0, "t"], + [36261, 0, "e"], + [36262, 0, "r"], + [36323, 0, "A"], + [36324, 0, "f"], + [36325, 0, "t"], + [36326, 0, "e"], + [36327, 0, "r"], + [36351, 0, "A"], + [36352, 0, "f"], + [36353, 0, "t"], + [36354, 0, "e"], + [36355, 0, "r"], + [39073, 0, "A"], + [39074, 0, "f"], + [39075, 0, "t"], + [39076, 0, "e"], + [39077, 0, "r"], + [39101, 1], + [39101, 1], + [39101, 1], + [39101, 1], + [39101, 1], + [39101, 1], + [39106, 1], + [39184, 0, "A"], + [39185, 0, "f"], + [39186, 0, "t"], + [39187, 0, "e"], + [39188, 0, "r"], + [32425, 0, "b"], + [32425, 1], + [32425, 0, " "], + [32426, 0, "b"], + [32427, 0, "e"], + [32441, 1], + [32441, 1], + [32441, 1], + [38424, 0, " "], + [38425, 0, "("], + [38426, 0, "a"], + [38427, 0, " "], + [38428, 0, "v"], + [38429, 0, "i"], + [38430, 0, "r"], + [38431, 0, "t"], + [38432, 0, "u"], + [38433, 0, "a"], + [38434, 0, "l"], + [38435, 0, " "], + [38436, 0, "p"], + [38437, 0, "o"], + [38438, 0, "s"], + [38439, 0, "i"], + [38440, 0, "t"], + [38441, 0, "i"], + [38442, 0, "o"], + [38443, 0, "n"], + [38444, 0, " "], + [38445, 0, "b"], + [38446, 0, "e"], + [38447, 0, "f"], + [38448, 0, "o"], + [38449, 0, "r"], + [38450, 0, "e"], + [38451, 0, " "], + [38452, 0, "t"], + [38453, 0, "h"], + [38454, 0, "e"], + [38455, 0, " "], + [38456, 0, "f"], + [38457, 0, "i"], + [38458, 0, "r"], + [38459, 0, "s"], + [38460, 0, "t"], + [38461, 0, " "], + [38462, 0, "l"], + [38463, 0, "i"], + [38464, 0, "s"], + [38465, 0, "t"], + [38466, 0, " "], + [38467, 0, "e"], + [38468, 0, "l"], + [38469, 0, "e"], + [38470, 0, "m"], + [38471, 0, "e"], + [38472, 0, "n"], + [38473, 0, "t"], + [38474, 0, ")"], + [39159, 1], + [39158, 1], + [39158, 0, "t"], + [39159, 0, "h"], + [39160, 0, "e"], + [39879, 0, "t"], + [39880, 0, "h"], + [39881, 0, "e"], + [39882, 0, " "], + [39883, 0, "v"], + [39884, 0, "a"], + [39885, 0, "r"], + [39886, 0, "i"], + [39887, 0, "a"], + [39888, 0, "b"], + [39889, 0, "l"], + [39890, 0, "e"], + [39891, 0, " "], + [39892, 0, "\\"], + [39893, 0, "t"], + [39894, 0, "e"], + [39895, 0, "x"], + [39896, 0, "t"], + [39897, 0, "t"], + [39898, 0, "t"], + [39899, 0, "{"], + [39900, 0, "t"], + [39901, 0, "a"], + [39902, 0, "i"], + [39903, 0, "l"], + [39904, 0, "}"], + [39905, 0, " "], + [39906, 0, "i"], + [39907, 0, "s"], + [39908, 0, " "], + [39909, 0, "s"], + [39910, 0, "e"], + [39911, 0, "t"], + [39912, 0, " "], + [39913, 0, "t"], + [39914, 0, "o"], + [39915, 0, " "], + [39916, 0, "a"], + [39917, 0, " "], + [39918, 0, "c"], + [39919, 0, "u"], + [39920, 0, "r"], + [39921, 0, "s"], + [39922, 0, "o"], + [39923, 0, "r"], + [39924, 0, " "], + [39925, 0, "p"], + [39926, 0, "o"], + [39927, 0, "i"], + [39928, 0, "n"], + [39929, 0, "t"], + [39930, 0, "i"], + [39931, 0, "n"], + [39932, 0, "g"], + [39933, 0, " "], + [39934, 0, "a"], + [39935, 0, "t"], + [39936, 0, " "], + [39937, 0, "t"], + [39938, 0, "h"], + [39939, 0, "e"], + [39940, 0, " "], + [39941, 0, "l"], + [39942, 0, "i"], + [39943, 0, "s"], + [39944, 0, "t"], + [39945, 0, " "], + [39946, 0, "e"], + [39947, 0, "l"], + [39948, 0, "e"], + [39949, 0, "m"], + [39950, 0, "e"], + [39951, 0, "n"], + [39952, 0, "t"], + [39953, 0, " "], + [39954, 0, "`"], + [39955, 0, "`"], + [39956, 0, "e"], + [39957, 0, "g"], + [39958, 0, "g"], + [39959, 0, "s"], + [39960, 0, "'"], + [39961, 0, "'"], + [39962, 0, "."], + [39963, 0, " "], + [36280, 1], + [36279, 1], + [36278, 1], + [36277, 1], + [36277, 0, "e"], + [36278, 0, "g"], + [36279, 0, "g"], + [36280, 0, "s"], + [36343, 1], + [36342, 1], + [36341, 1], + [36340, 1], + [36340, 0, "e"], + [36341, 0, "g"], + [36342, 0, "g"], + [36343, 0, "s"], + [39903, 1], + [39902, 1], + [39901, 1], + [39900, 1], + [39900, 0, "e"], + [39901, 0, "g"], + [39902, 0, "g"], + [39903, 0, "s"], + [39964, 0, "T"], + [39965, 0, "h"], + [39966, 0, "e"], + [39967, 0, "n"], + [39968, 0, " "], + [39969, 0, "t"], + [39970, 0, "w"], + [39971, 0, "o"], + [39972, 0, " "], + [39973, 0, "m"], + [39974, 0, "o"], + [39975, 0, "r"], + [39976, 0, "e"], + [39977, 0, " "], + [39978, 0, "l"], + [39979, 0, "i"], + [39980, 0, "s"], + [39981, 0, "t"], + [39982, 0, " "], + [39983, 0, "e"], + [39984, 0, "l"], + [39985, 0, "e"], + [39986, 0, "m"], + [39987, 0, "e"], + [39988, 0, "n"], + [39989, 0, "t"], + [39990, 0, "s"], + [39991, 0, " "], + [39992, 0, "a"], + [39993, 0, "r"], + [39994, 0, "e"], + [39995, 0, " "], + [39996, 0, "i"], + [39997, 0, "n"], + [39998, 0, "s"], + [39999, 0, "e"], + [40000, 0, "r"], + [40001, 0, "t"], + [40002, 0, "e"], + [40003, 0, "d"], + [40004, 0, ":"], + [40005, 0, " "], + [40006, 0, "`"], + [40007, 0, "`"], + [40008, 0, "c"], + [40009, 0, "h"], + [40010, 0, "e"], + [40011, 0, "e"], + [40012, 0, "s"], + [40013, 0, "e"], + [40014, 0, "'"], + [40015, 0, "'"], + [40016, 0, " "], + [40017, 0, "i"], + [40018, 0, "s"], + [40019, 0, " "], + [40020, 0, "i"], + [40021, 0, "n"], + [40022, 0, "s"], + [40023, 0, "e"], + [40024, 0, "r"], + [40024, 1], + [40023, 1], + [40022, 1], + [40021, 1], + [40020, 1], + [40019, 1], + [40018, 1], + [40017, 1], + [40017, 0, "a"], + [40018, 0, "t"], + [40019, 0, " "], + [40020, 0, "t"], + [40021, 0, "h"], + [40022, 0, "e"], + [40023, 0, " "], + [40024, 0, "h"], + [40025, 0, "e"], + [40026, 0, "a"], + [40027, 0, "d"], + [40028, 0, ","], + [40029, 0, " "], + [40030, 0, "a"], + [40031, 0, "n"], + [40032, 0, "d"], + [40033, 0, " "], + [40034, 0, "`"], + [40035, 0, "`"], + [40036, 0, "m"], + [40037, 0, "i"], + [40038, 0, "l"], + [40039, 0, "k"], + [40040, 0, "'"], + [40041, 0, "'"], + [40042, 0, " "], + [40043, 0, "a"], + [40044, 0, "f"], + [40045, 0, "t"], + [40046, 0, "e"], + [40047, 0, "r"], + [40048, 0, " "], + [40049, 0, "`"], + [40050, 0, "`"], + [40051, 0, "e"], + [40052, 0, "g"], + [40053, 0, "g"], + [40054, 0, "s"], + [40055, 0, "'"], + [40056, 0, "'"], + [40057, 0, "."], + [40058, 0, " "], + [40059, 0, "N"], + [40060, 0, "o"], + [40061, 0, "t"], + [40062, 0, "e"], + [40063, 0, " "], + [40064, 0, "t"], + [40065, 0, "h"], + [40066, 0, "a"], + [40067, 0, "t"], + [40068, 0, " "], + [40069, 0, "t"], + [40070, 0, "h"], + [40071, 0, "e"], + [40072, 0, " "], + [40073, 0, "c"], + [40074, 0, "u"], + [40075, 0, "r"], + [40076, 0, "s"], + [40077, 0, "o"], + [40078, 0, "r"], + [40079, 0, " "], + [40080, 0, "i"], + [40081, 0, "d"], + [40082, 0, "e"], + [40083, 0, "n"], + [40084, 0, "t"], + [40085, 0, "i"], + [40085, 1], + [40084, 1], + [40083, 1], + [40082, 1], + [40081, 1], + [40080, 1], + [40080, 0, "\\"], + [40081, 0, "t"], + [40082, 0, "e"], + [40083, 0, "x"], + [40084, 0, "t"], + [40085, 0, "t"], + [40086, 0, "t"], + [40087, 0, "{"], + [40088, 0, "e"], + [40089, 0, "g"], + [40090, 0, "g"], + [40091, 0, "s"], + [40092, 0, "}"], + [40093, 0, " "], + [40094, 0, "i"], + [40095, 0, "d"], + [40096, 0, "e"], + [40097, 0, "n"], + [40098, 0, "t"], + [40099, 0, "i"], + [40100, 0, "f"], + [40101, 0, "i"], + [40102, 0, "e"], + [40103, 0, "s"], + [40104, 0, " "], + [40105, 0, "t"], + [40106, 0, "h"], + [40107, 0, "e"], + [40108, 0, " "], + [40109, 0, "l"], + [40110, 0, "i"], + [40111, 0, "s"], + [40112, 0, "t"], + [40113, 0, " "], + [40114, 0, "e"], + [40115, 0, "l"], + [40116, 0, "e"], + [40117, 0, "m"], + [40118, 0, "e"], + [40119, 0, "n"], + [40120, 0, "t"], + [40121, 0, " "], + [40122, 0, "b"], + [40123, 0, "y"], + [40124, 0, " "], + [40125, 0, "i"], + [40126, 0, "d"], + [40127, 0, "e"], + [40128, 0, "n"], + [40129, 0, "t"], + [40130, 0, "i"], + [40131, 0, "t"], + [40132, 0, "y"], + [40133, 0, ","], + [40134, 0, " "], + [40135, 0, "n"], + [40136, 0, "o"], + [40137, 0, "t"], + [40138, 0, " "], + [40139, 0, "b"], + [40140, 0, "y"], + [40141, 0, " "], + [40142, 0, "i"], + [40143, 0, "t"], + [40144, 0, "s"], + [40145, 0, " "], + [40146, 0, "i"], + [40147, 0, "n"], + [40148, 0, "d"], + [40149, 0, "e"], + [40150, 0, "x"], + [40151, 0, ":"], + [40152, 0, " "], + [40153, 0, "a"], + [40154, 0, "f"], + [40155, 0, "t"], + [40156, 0, "e"], + [40157, 0, "r"], + [40158, 0, " "], + [40159, 0, "t"], + [40160, 0, "h"], + [40161, 0, "e"], + [40162, 0, " "], + [40163, 0, "i"], + [40164, 0, "n"], + [40165, 0, "s"], + [40166, 0, "e"], + [40167, 0, "r"], + [40168, 0, "t"], + [40169, 0, "i"], + [40170, 0, "o"], + [40171, 0, "n"], + [40172, 0, " "], + [40173, 0, "o"], + [40174, 0, "f"], + [40175, 0, " "], + [40176, 0, "`"], + [40177, 0, "`"], + [40178, 0, "c"], + [40179, 0, "h"], + [40180, 0, "e"], + [40181, 0, "e"], + [40182, 0, "s"], + [40183, 0, "e"], + [40184, 0, "'"], + [40185, 0, "'"], + [40186, 0, ","], + [40187, 0, " "], + [40188, 0, "t"], + [40189, 0, "h"], + [40190, 0, "e"], + [40191, 0, " "], + [40192, 0, "e"], + [40193, 0, "l"], + [40194, 0, "e"], + [40195, 0, "m"], + [40196, 0, "e"], + [40197, 0, "n"], + [40198, 0, "t"], + [40199, 0, " "], + [40200, 0, "`"], + [40201, 0, "`"], + [40202, 0, "e"], + [40203, 0, "g"], + [40204, 0, "g"], + [40205, 0, "s"], + [40206, 0, "'"], + [40207, 0, "'"], + [40208, 0, " "], + [40209, 0, "h"], + [40210, 0, "a"], + [40211, 0, "s"], + [40212, 0, " "], + [40213, 0, "i"], + [40214, 0, "n"], + [40215, 0, "d"], + [40216, 0, "e"], + [40217, 0, "x"], + [40218, 0, " "], + [40219, 0, "2"], + [40220, 0, ","], + [40221, 0, " "], + [40222, 0, "b"], + [40223, 0, "u"], + [40224, 0, "t"], + [40225, 0, " "], + [40226, 0, "t"], + [40227, 0, "h"], + [40228, 0, "e"], + [40229, 0, " "], + [40229, 1], + [40228, 1], + [40227, 1], + [40226, 1], + [40226, 0, "`"], + [40227, 0, "`"], + [40228, 0, "m"], + [40229, 0, "i"], + [40230, 0, "l"], + [40231, 0, "k"], + [40232, 0, "'"], + [40233, 0, "'"], + [40234, 0, " "], + [40235, 0, "i"], + [40236, 0, "s"], + [40237, 0, " "], + [40238, 0, "n"], + [40239, 0, "e"], + [40240, 0, "v"], + [40241, 0, "e"], + [40242, 0, "r"], + [40243, 0, "t"], + [40244, 0, "h"], + [40245, 0, "e"], + [40246, 0, "l"], + [40247, 0, "e"], + [40248, 0, "s"], + [40249, 0, "s"], + [40250, 0, " "], + [40251, 0, "a"], + [40252, 0, "f"], + [40252, 1], + [40251, 1], + [40251, 0, "i"], + [40252, 0, "n"], + [40253, 0, "s"], + [40254, 0, "e"], + [40255, 0, "r"], + [40256, 0, "t"], + [40257, 0, "e"], + [40258, 0, "d"], + [40259, 0, " "], + [40260, 0, "a"], + [40261, 0, "f"], + [40262, 0, "t"], + [40263, 0, "e"], + [40264, 0, "r"], + [40265, 0, " "], + [40266, 0, "`"], + [40267, 0, "`"], + [40268, 0, "e"], + [40269, 0, "g"], + [40270, 0, "g"], + [40271, 0, "s"], + [40272, 0, "'"], + [40273, 0, "'"], + [40274, 0, "."], + [40058, 1], + [40058, 0, "\n"], + [40059, 0, "\n"], + [40276, 0, " "], + [40277, 0, "T"], + [40278, 0, "h"], + [40279, 0, "i"], + [40280, 0, "s"], + [40281, 0, " "], + [40281, 1], + [40280, 1], + [40279, 1], + [40278, 1], + [40277, 1], + [40277, 0, "A"], + [40278, 0, "s"], + [40279, 0, " "], + [40280, 0, "w"], + [40281, 0, "e"], + [40282, 0, " "], + [40283, 0, "s"], + [40284, 0, "h"], + [40285, 0, "a"], + [40286, 0, "l"], + [40287, 0, "l"], + [40288, 0, " "], + [40289, 0, "s"], + [40290, 0, "e"], + [40291, 0, "e"], + [40292, 0, " "], + [40293, 0, "l"], + [40294, 0, "a"], + [40295, 0, "t"], + [40296, 0, "e"], + [40297, 0, "r"], + [40298, 0, ","], + [40299, 0, " "], + [40300, 0, "t"], + [40301, 0, "h"], + [40302, 0, "i"], + [40303, 0, "s"], + [40304, 0, " "], + [40305, 0, "f"], + [40306, 0, "e"], + [40307, 0, "a"], + [40308, 0, "t"], + [40309, 0, "u"], + [40310, 0, "r"], + [40311, 0, "e"], + [40312, 0, " "], + [40313, 0, "i"], + [40314, 0, "s"], + [40315, 0, " "], + [40316, 0, "h"], + [40317, 0, "e"], + [40318, 0, "l"], + [40319, 0, "p"], + [40320, 0, "f"], + [40321, 0, "u"], + [40322, 0, "l"], + [40323, 0, " "], + [40324, 0, "f"], + [40325, 0, "o"], + [40326, 0, "r"], + [40327, 0, " "], + [40328, 0, "a"], + [40329, 0, "c"], + [40330, 0, "h"], + [40331, 0, "i"], + [40332, 0, "e"], + [40333, 0, "v"], + [40334, 0, "i"], + [40335, 0, "n"], + [40336, 0, "g"], + [40337, 0, " "], + [40338, 0, "d"], + [40339, 0, "e"], + [40340, 0, "s"], + [40341, 0, "i"], + [40342, 0, "r"], + [40343, 0, "a"], + [40344, 0, "b"], + [40345, 0, "l"], + [40346, 0, "e"], + [40347, 0, " "], + [40348, 0, "s"], + [40349, 0, "e"], + [40350, 0, "m"], + [40351, 0, "a"], + [40352, 0, "n"], + [40353, 0, "t"], + [40354, 0, "i"], + [40355, 0, "c"], + [40356, 0, "s"], + [40357, 0, " "], + [40358, 0, "i"], + [40359, 0, "n"], + [40360, 0, " "], + [40361, 0, "t"], + [40362, 0, "h"], + [40363, 0, "e"], + [40364, 0, " "], + [40365, 0, "p"], + [40366, 0, "r"], + [40367, 0, "e"], + [40368, 0, "s"], + [40369, 0, "e"], + [40370, 0, "n"], + [40371, 0, "c"], + [40372, 0, "e"], + [40373, 0, " "], + [40374, 0, "o"], + [40375, 0, "f"], + [40376, 0, " "], + [40377, 0, "c"], + [40378, 0, "o"], + [40379, 0, "n"], + [40380, 0, "c"], + [40381, 0, "u"], + [40382, 0, "r"], + [40383, 0, "r"], + [40384, 0, "e"], + [40385, 0, "n"], + [40386, 0, "t"], + [40387, 0, " "], + [40388, 0, "m"], + [40389, 0, "o"], + [40390, 0, "d"], + [40391, 0, "i"], + [40392, 0, "f"], + [40393, 0, "i"], + [40394, 0, "c"], + [40395, 0, "a"], + [40396, 0, "t"], + [40397, 0, "i"], + [40398, 0, "o"], + [40399, 0, "n"], + [40400, 0, "s"], + [40401, 0, "."], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40404, 1], + [40212, 1], + [40211, 1], + [40210, 1], + [40210, 0, "m"], + [40211, 0, "o"], + [40212, 0, "v"], + [40213, 0, "e"], + [40214, 0, "s"], + [40215, 0, " "], + [40216, 0, "f"], + [40217, 0, "r"], + [40218, 0, "o"], + [40219, 0, "m"], + [40220, 0, " "], + [40221, 0, "i"], + [40222, 0, "n"], + [40223, 0, "d"], + [40224, 0, "e"], + [40225, 0, "x"], + [40226, 0, " "], + [40227, 0, "1"], + [40228, 0, " "], + [40229, 0, "t"], + [40230, 0, "o"], + [40232, 1], + [40232, 1], + [40232, 1], + [40232, 1], + [40232, 1], + [40232, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [40416, 1], + [47380, 0, "H"], + [47380, 1], + [47380, 0, "W"], + [47381, 0, "e"], + [47382, 0, " "], + [47383, 0, "n"], + [47384, 0, "o"], + [47385, 0, "w"], + [47386, 0, " "], + [47387, 0, "e"], + [47388, 0, "x"], + [47389, 0, "p"], + [47390, 0, "l"], + [47391, 0, "a"], + [47392, 0, "i"], + [47393, 0, "n"], + [47394, 0, " "], + [47395, 0, "f"], + [47396, 0, "o"], + [47397, 0, "r"], + [47398, 0, "m"], + [47399, 0, "a"], + [47400, 0, "l"], + [47401, 0, "l"], + [47402, 0, "y"], + [47403, 0, " "], + [47404, 0, "h"], + [47405, 0, "o"], + [47406, 0, "w"], + [47407, 0, " "], + [47408, 0, "t"], + [47409, 0, "o"], + [47410, 0, " "], + [47411, 0, "a"], + [47412, 0, "c"], + [47413, 0, "h"], + [47414, 0, "i"], + [47415, 0, "e"], + [47416, 0, "v"], + [47417, 0, "e"], + [47418, 0, " "], + [47419, 0, "t"], + [47420, 0, "h"], + [47421, 0, "e"], + [47422, 0, " "], + [47423, 0, "c"], + [47424, 0, "o"], + [47425, 0, "n"], + [47426, 0, "c"], + [47427, 0, "u"], + [47428, 0, "r"], + [47429, 0, "r"], + [47430, 0, "e"], + [47431, 0, "n"], + [47432, 0, "t"], + [47433, 0, " "], + [47434, 0, "s"], + [47435, 0, "e"], + [47436, 0, "m"], + [47437, 0, "a"], + [47438, 0, "n"], + [47439, 0, "t"], + [47440, 0, "i"], + [47441, 0, "c"], + [47442, 0, "s"], + [47443, 0, " "], + [47444, 0, "o"], + [47445, 0, "u"], + [47446, 0, "t"], + [47447, 0, "l"], + [47448, 0, "i"], + [47449, 0, "n"], + [47450, 0, "e"], + [47451, 0, "d"], + [47452, 0, " "], + [47453, 0, "i"], + [47454, 0, "n"], + [47455, 0, " "], + [47456, 0, "S"], + [47457, 0, "e"], + [47458, 0, "c"], + [47459, 0, "t"], + [47460, 0, "i"], + [47461, 0, "o"], + [47462, 0, "n"], + [47463, 0, "~"], + [47464, 0, "\\"], + [47465, 0, "r"], + [47466, 0, "e"], + [47467, 0, "f"], + [47468, 0, "{"], + [47469, 0, "s"], + [47470, 0, "e"], + [47471, 0, "c"], + [47472, 0, ":"], + [47473, 0, "c"], + [47474, 0, "o"], + [47475, 0, "m"], + [47476, 0, "p"], + [47477, 0, "o"], + [47478, 0, "s"], + [47479, 0, "i"], + [47480, 0, "n"], + [47481, 0, "g"], + [47482, 0, "}"], + [47483, 0, "."], + [47484, 0, " "], + [41974, 1], + [41973, 1], + [41972, 1], + [41971, 1], + [41970, 1], + [41969, 1], + [41968, 1], + [41967, 1], + [41966, 1], + [41965, 1], + [41964, 1], + [41963, 1], + [41962, 1], + [41961, 1], + [41960, 1], + [41959, 1], + [41958, 1], + [41957, 1], + [41956, 1], + [41955, 1], + [41954, 1], + [41953, 1], + [41952, 1], + [41951, 1], + [41950, 1], + [41949, 1], + [41948, 1], + [41947, 1], + [41946, 1], + [41945, 1], + [41944, 1], + [41943, 1], + [41942, 1], + [41941, 1], + [41940, 1], + [41939, 1], + [41938, 1], + [41937, 1], + [41936, 1], + [41935, 1], + [41934, 1], + [41933, 1], + [41932, 1], + [41931, 1], + [41930, 1], + [41929, 1], + [41928, 1], + [41927, 1], + [41926, 1], + [41925, 1], + [41924, 1], + [41923, 1], + [41922, 1], + [41921, 1], + [41920, 1], + [41919, 1], + [41918, 1], + [41917, 1], + [41916, 1], + [41915, 1], + [41914, 1], + [41913, 1], + [41912, 1], + [41911, 1], + [41910, 1], + [41909, 1], + [41908, 1], + [41907, 1], + [41906, 1], + [41905, 1], + [41904, 1], + [41903, 1], + [41902, 1], + [41901, 1], + [41900, 1], + [41899, 1], + [41898, 1], + [41897, 1], + [41896, 1], + [41895, 1], + [41894, 1], + [41893, 1], + [41892, 1], + [41891, 1], + [41890, 1], + [41889, 1], + [41888, 1], + [41887, 1], + [41886, 1], + [41885, 1], + [41884, 1], + [41883, 1], + [41882, 1], + [41881, 1], + [41880, 1], + [41879, 1], + [41878, 1], + [41877, 1], + [41876, 1], + [41875, 1], + [41874, 1], + [41873, 1], + [41872, 1], + [41871, 1], + [41870, 1], + [41869, 1], + [41868, 1], + [41867, 1], + [41866, 1], + [41865, 1], + [41864, 1], + [41863, 1], + [41862, 1], + [41861, 1], + [41860, 1], + [41859, 1], + [41858, 1], + [41857, 1], + [41856, 1], + [41855, 1], + [41854, 1], + [41853, 1], + [41852, 1], + [41851, 1], + [41850, 1], + [41849, 1], + [41848, 1], + [41847, 1], + [41846, 1], + [41845, 1], + [41844, 1], + [41843, 1], + [41842, 1], + [41841, 1], + [41840, 1], + [41839, 1], + [41838, 1], + [41837, 1], + [41836, 1], + [41835, 1], + [41834, 1], + [41833, 1], + [41832, 1], + [41831, 1], + [41830, 1], + [41829, 1], + [41828, 1], + [41827, 1], + [41826, 1], + [41825, 1], + [41824, 1], + [41823, 1], + [41822, 1], + [41821, 1], + [41820, 1], + [41819, 1], + [41818, 1], + [41817, 1], + [41816, 1], + [41815, 1], + [41814, 1], + [41813, 1], + [41812, 1], + [41811, 1], + [41810, 1], + [41809, 1], + [41808, 1], + [41807, 1], + [41806, 1], + [41805, 1], + [41804, 1], + [41803, 1], + [41802, 1], + [41801, 1], + [41800, 1], + [41799, 1], + [41798, 1], + [41797, 1], + [41796, 1], + [41795, 1], + [41794, 1], + [41793, 1], + [41792, 1], + [41791, 1], + [41790, 1], + [41789, 1], + [41788, 1], + [41787, 1], + [41786, 1], + [41785, 1], + [41784, 1], + [41783, 1], + [41782, 1], + [41781, 1], + [41780, 1], + [41779, 1], + [41778, 1], + [41777, 1], + [41776, 1], + [41775, 1], + [41774, 1], + [41773, 1], + [41772, 1], + [41771, 1], + [41770, 1], + [41769, 1], + [41768, 1], + [41767, 1], + [41766, 1], + [41765, 1], + [41764, 1], + [41763, 1], + [41762, 1], + [41761, 1], + [41760, 1], + [41759, 1], + [41758, 1], + [41757, 1], + [41756, 1], + [41755, 1], + [41754, 1], + [41753, 1], + [41752, 1], + [41751, 1], + [41750, 1], + [41749, 1], + [41748, 1], + [41747, 1], + [41746, 1], + [41745, 1], + [41744, 1], + [41743, 1], + [41742, 1], + [41741, 1], + [41740, 1], + [41739, 1], + [41738, 1], + [41737, 1], + [41736, 1], + [41735, 1], + [41734, 1], + [41733, 1], + [41732, 1], + [41731, 1], + [41730, 1], + [41729, 1], + [41728, 1], + [41727, 1], + [41726, 1], + [41725, 1], + [41724, 1], + [41723, 1], + [41722, 1], + [41721, 1], + [41720, 1], + [41719, 1], + [41718, 1], + [41717, 1], + [41716, 1], + [41715, 1], + [41714, 1], + [41713, 1], + [41712, 1], + [41711, 1], + [41710, 1], + [41709, 1], + [41708, 1], + [41707, 1], + [41706, 1], + [41705, 1], + [41704, 1], + [41703, 1], + [41702, 1], + [41701, 1], + [41700, 1], + [41699, 1], + [41698, 1], + [41697, 1], + [41696, 1], + [41695, 1], + [41694, 1], + [41693, 1], + [41692, 1], + [41691, 1], + [41690, 1], + [41689, 1], + [41688, 1], + [41687, 1], + [41686, 1], + [41685, 1], + [41684, 1], + [41683, 1], + [41682, 1], + [41681, 1], + [41680, 1], + [41679, 1], + [41678, 1], + [41677, 1], + [41676, 1], + [41675, 1], + [41674, 1], + [41673, 1], + [41672, 1], + [41671, 1], + [41670, 1], + [41669, 1], + [41668, 1], + [41667, 1], + [41666, 1], + [41665, 1], + [41664, 1], + [41663, 1], + [41662, 1], + [41661, 1], + [41660, 1], + [41659, 1], + [41658, 1], + [41657, 1], + [41656, 1], + [41655, 1], + [41654, 1], + [41653, 1], + [41652, 1], + [41651, 1], + [41650, 1], + [41649, 1], + [41648, 1], + [41647, 1], + [41646, 1], + [41645, 1], + [41644, 1], + [41643, 1], + [41642, 1], + [41641, 1], + [41640, 1], + [41639, 1], + [41638, 1], + [41637, 1], + [41636, 1], + [41635, 1], + [41634, 1], + [41633, 1], + [41632, 1], + [41631, 1], + [41630, 1], + [41629, 1], + [41628, 1], + [41627, 1], + [41626, 1], + [41625, 1], + [41624, 1], + [41623, 1], + [41622, 1], + [41621, 1], + [41620, 1], + [41619, 1], + [41618, 1], + [41617, 1], + [41616, 1], + [41615, 1], + [41614, 1], + [41613, 1], + [41612, 1], + [41611, 1], + [41610, 1], + [41609, 1], + [41608, 1], + [41607, 1], + [41606, 1], + [41605, 1], + [41604, 1], + [41603, 1], + [41602, 1], + [41601, 1], + [41600, 1], + [41599, 1], + [41598, 1], + [41597, 1], + [41596, 1], + [41595, 1], + [41594, 1], + [41593, 1], + [41592, 1], + [41591, 1], + [41590, 1], + [41589, 1], + [41588, 1], + [41587, 1], + [41586, 1], + [41585, 1], + [41584, 1], + [41583, 1], + [41582, 1], + [41581, 1], + [41580, 1], + [41579, 1], + [41578, 1], + [41577, 1], + [41576, 1], + [41575, 1], + [41574, 1], + [41573, 1], + [41572, 1], + [41571, 1], + [41570, 1], + [41569, 1], + [41568, 1], + [41567, 1], + [41566, 1], + [41565, 1], + [41564, 1], + [41563, 1], + [41562, 1], + [41561, 1], + [41560, 1], + [41559, 1], + [41558, 1], + [41557, 1], + [41556, 1], + [41555, 1], + [41554, 1], + [41553, 1], + [41552, 1], + [41551, 1], + [41550, 1], + [41549, 1], + [41548, 1], + [41547, 1], + [41546, 1], + [41545, 1], + [41544, 1], + [41543, 1], + [41542, 1], + [41541, 1], + [41540, 1], + [41539, 1], + [41538, 1], + [41537, 1], + [41536, 1], + [41535, 1], + [41534, 1], + [41533, 1], + [41532, 1], + [41531, 1], + [41530, 1], + [41529, 1], + [41528, 1], + [41527, 1], + [41526, 1], + [41525, 1], + [41524, 1], + [41523, 1], + [41522, 1], + [41521, 1], + [41520, 1], + [41519, 1], + [41518, 1], + [41517, 1], + [41516, 1], + [41515, 1], + [41514, 1], + [41513, 1], + [41512, 1], + [41511, 1], + [41510, 1], + [41509, 1], + [41508, 1], + [41507, 1], + [41506, 1], + [41505, 1], + [41504, 1], + [41503, 1], + [41502, 1], + [41501, 1], + [41500, 1], + [41499, 1], + [41498, 1], + [41497, 1], + [41496, 1], + [41495, 1], + [41494, 1], + [41493, 1], + [41492, 1], + [41491, 1], + [41490, 1], + [41489, 1], + [41488, 1], + [41487, 1], + [41486, 1], + [41485, 1], + [41484, 1], + [41483, 1], + [41482, 1], + [41481, 1], + [41480, 1], + [41479, 1], + [41478, 1], + [41477, 1], + [41476, 1], + [41475, 1], + [41474, 1], + [41473, 1], + [41472, 1], + [41471, 1], + [41470, 1], + [41469, 1], + [41468, 1], + [41467, 1], + [41466, 1], + [41465, 1], + [41464, 1], + [41463, 1], + [41462, 1], + [41461, 1], + [41460, 1], + [41459, 1], + [41458, 1], + [41457, 1], + [41456, 1], + [41455, 1], + [41454, 1], + [41453, 1], + [41452, 1], + [41451, 1], + [41450, 1], + [41449, 1], + [41448, 1], + [41447, 1], + [41446, 1], + [41445, 1], + [41444, 1], + [41443, 1], + [41442, 1], + [41441, 1], + [41440, 1], + [41439, 1], + [41438, 1], + [41437, 1], + [41436, 1], + [41435, 1], + [41434, 1], + [41433, 1], + [41432, 1], + [41431, 1], + [41430, 1], + [41429, 1], + [41428, 1], + [41427, 1], + [41426, 1], + [41425, 1], + [41424, 1], + [41423, 1], + [41422, 1], + [41421, 1], + [41420, 1], + [41419, 1], + [41418, 1], + [41417, 1], + [41416, 1], + [41415, 1], + [41414, 1], + [41413, 1], + [41412, 1], + [41411, 1], + [41410, 1], + [41409, 1], + [41408, 1], + [41407, 1], + [41406, 1], + [41405, 1], + [41404, 1], + [41403, 1], + [41402, 1], + [41401, 1], + [41400, 1], + [41399, 1], + [41398, 1], + [41397, 1], + [41396, 1], + [41395, 1], + [41394, 1], + [41393, 1], + [41392, 1], + [41391, 1], + [41390, 1], + [41389, 1], + [41388, 1], + [41387, 1], + [41386, 1], + [41385, 1], + [41384, 1], + [41383, 1], + [41382, 1], + [41381, 1], + [41380, 1], + [41379, 1], + [41378, 1], + [41377, 1], + [41376, 1], + [41375, 1], + [41374, 1], + [41373, 1], + [41372, 1], + [41371, 1], + [41370, 1], + [41369, 1], + [41368, 1], + [41367, 1], + [41366, 1], + [41365, 1], + [41364, 1], + [41363, 1], + [41362, 1], + [41361, 1], + [41360, 1], + [41359, 1], + [41358, 1], + [41357, 1], + [41356, 1], + [41355, 1], + [41354, 1], + [41353, 1], + [41352, 1], + [41351, 1], + [41350, 1], + [41349, 1], + [41348, 1], + [41347, 1], + [41346, 1], + [41345, 1], + [41344, 1], + [41343, 1], + [41342, 1], + [41341, 1], + [41340, 1], + [41339, 1], + [41338, 1], + [41337, 1], + [41336, 1], + [41335, 1], + [41334, 1], + [41333, 1], + [41332, 1], + [41331, 1], + [41330, 1], + [41329, 1], + [41328, 1], + [41327, 1], + [41326, 1], + [41325, 1], + [41324, 1], + [41323, 1], + [41322, 1], + [41321, 1], + [41320, 1], + [41319, 1], + [41318, 1], + [41317, 1], + [41316, 1], + [41315, 1], + [41314, 1], + [41313, 1], + [41312, 1], + [41311, 1], + [41310, 1], + [41309, 1], + [41308, 1], + [41307, 1], + [41306, 1], + [41305, 1], + [41304, 1], + [41303, 1], + [41302, 1], + [41301, 1], + [41300, 1], + [41299, 1], + [41298, 1], + [41297, 1], + [41296, 1], + [41295, 1], + [41294, 1], + [41293, 1], + [41292, 1], + [41291, 1], + [41290, 1], + [41289, 1], + [41288, 1], + [41287, 1], + [41286, 1], + [41285, 1], + [41284, 1], + [41283, 1], + [41282, 1], + [41281, 1], + [41280, 1], + [41279, 1], + [41278, 1], + [41277, 1], + [41276, 1], + [41275, 1], + [41274, 1], + [41273, 1], + [41272, 1], + [41271, 1], + [41270, 1], + [41269, 1], + [41268, 1], + [41267, 1], + [41266, 1], + [41265, 1], + [41264, 1], + [41263, 1], + [41262, 1], + [41261, 1], + [41260, 1], + [41259, 1], + [41258, 1], + [41257, 1], + [41256, 1], + [41255, 1], + [41254, 1], + [41253, 1], + [41252, 1], + [41251, 1], + [41250, 1], + [41249, 1], + [41248, 1], + [41247, 1], + [41246, 1], + [41245, 1], + [41244, 1], + [41243, 1], + [41242, 1], + [41241, 1], + [41240, 1], + [41239, 1], + [41238, 1], + [41237, 1], + [41236, 1], + [41235, 1], + [41234, 1], + [41233, 1], + [41232, 1], + [41231, 1], + [41230, 1], + [41229, 1], + [41228, 1], + [41227, 1], + [41226, 1], + [41225, 1], + [41224, 1], + [41223, 1], + [41222, 1], + [41221, 1], + [41220, 1], + [41219, 1], + [41218, 1], + [41217, 1], + [41216, 1], + [41215, 1], + [41214, 1], + [41213, 1], + [41212, 1], + [41211, 1], + [41210, 1], + [41209, 1], + [41208, 1], + [41207, 1], + [41206, 1], + [41205, 1], + [41204, 1], + [41203, 1], + [41202, 1], + [41201, 1], + [41200, 1], + [41199, 1], + [41198, 1], + [41197, 1], + [41196, 1], + [41195, 1], + [41194, 1], + [41193, 1], + [41192, 1], + [41191, 1], + [41190, 1], + [41189, 1], + [41188, 1], + [41187, 1], + [41186, 1], + [41185, 1], + [41184, 1], + [41183, 1], + [41182, 1], + [41181, 1], + [41180, 1], + [41179, 1], + [41178, 1], + [41177, 1], + [41176, 1], + [41175, 1], + [41174, 1], + [41173, 1], + [41172, 1], + [41171, 1], + [41170, 1], + [41169, 1], + [41168, 1], + [41167, 1], + [41166, 1], + [41165, 1], + [41164, 1], + [41163, 1], + [41162, 1], + [41161, 1], + [41160, 1], + [41159, 1], + [41158, 1], + [41157, 1], + [41156, 1], + [41155, 1], + [41154, 1], + [41153, 1], + [41152, 1], + [41151, 1], + [41150, 1], + [41149, 1], + [41148, 1], + [41147, 1], + [41146, 1], + [41145, 1], + [41144, 1], + [41143, 1], + [41142, 1], + [41141, 1], + [41140, 1], + [41139, 1], + [41138, 1], + [41137, 1], + [41136, 1], + [41135, 1], + [41134, 1], + [41133, 1], + [41132, 1], + [41131, 1], + [41130, 1], + [41129, 1], + [41128, 1], + [41127, 1], + [41126, 1], + [41125, 1], + [41124, 1], + [41123, 1], + [41122, 1], + [41121, 1], + [41120, 1], + [41119, 1], + [41118, 1], + [41117, 1], + [41116, 1], + [41115, 1], + [41114, 1], + [41113, 1], + [41112, 1], + [41111, 1], + [41110, 1], + [41109, 1], + [41108, 1], + [41107, 1], + [41106, 1], + [41105, 1], + [41104, 1], + [41103, 1], + [41102, 1], + [41101, 1], + [41100, 1], + [41099, 1], + [41098, 1], + [41097, 1], + [41096, 1], + [41095, 1], + [41094, 1], + [41093, 1], + [41092, 1], + [41091, 1], + [41090, 1], + [41089, 1], + [41088, 1], + [41087, 1], + [41086, 1], + [41085, 1], + [41084, 1], + [41083, 1], + [41082, 1], + [41081, 1], + [41080, 1], + [41079, 1], + [41078, 1], + [41077, 1], + [41076, 1], + [41075, 1], + [41074, 1], + [41073, 1], + [41072, 1], + [41071, 1], + [41070, 1], + [41069, 1], + [41068, 1], + [41067, 1], + [41066, 1], + [41065, 1], + [41064, 1], + [41063, 1], + [41062, 1], + [41061, 1], + [41060, 1], + [41059, 1], + [41058, 1], + [41057, 1], + [41056, 1], + [41055, 1], + [41054, 1], + [41053, 1], + [41052, 1], + [41051, 1], + [41050, 1], + [41049, 1], + [41048, 1], + [41047, 1], + [41046, 1], + [41045, 1], + [41044, 1], + [41043, 1], + [41042, 1], + [41041, 1], + [41040, 1], + [41039, 1], + [41038, 1], + [41037, 1], + [41036, 1], + [41035, 1], + [41034, 1], + [41033, 1], + [41032, 1], + [41031, 1], + [41030, 1], + [41029, 1], + [41028, 1], + [41027, 1], + [41026, 1], + [41025, 1], + [41024, 1], + [41023, 1], + [41022, 1], + [41021, 1], + [41020, 1], + [41019, 1], + [41018, 1], + [41017, 1], + [41016, 1], + [41015, 1], + [41014, 1], + [41013, 1], + [41012, 1], + [41011, 1], + [41010, 1], + [41009, 1], + [41008, 1], + [41007, 1], + [41006, 1], + [41005, 1], + [41004, 1], + [41003, 1], + [41002, 1], + [41001, 1], + [41000, 1], + [40999, 1], + [40998, 1], + [40997, 1], + [40996, 1], + [40995, 1], + [40994, 1], + [40993, 1], + [40992, 1], + [40991, 1], + [40990, 1], + [40989, 1], + [40988, 1], + [40987, 1], + [40986, 1], + [40985, 1], + [40984, 1], + [40983, 1], + [40982, 1], + [40981, 1], + [40980, 1], + [40979, 1], + [40978, 1], + [40977, 1], + [40976, 1], + [40975, 1], + [40974, 1], + [40973, 1], + [40972, 1], + [40971, 1], + [40970, 1], + [40969, 1], + [40968, 1], + [40967, 1], + [40966, 1], + [40965, 1], + [40964, 1], + [40963, 1], + [40962, 1], + [40961, 1], + [40960, 1], + [40959, 1], + [40958, 1], + [40957, 1], + [40956, 1], + [40955, 1], + [40954, 1], + [40953, 1], + [40952, 1], + [40951, 1], + [40950, 1], + [40949, 1], + [40948, 1], + [40947, 1], + [40946, 1], + [40945, 1], + [40944, 1], + [40943, 1], + [40942, 1], + [40941, 1], + [40940, 1], + [40939, 1], + [40938, 1], + [40937, 1], + [40936, 1], + [40935, 1], + [40934, 1], + [40933, 1], + [40932, 1], + [40931, 1], + [40930, 1], + [40929, 1], + [40928, 1], + [40927, 1], + [40926, 1], + [40925, 1], + [40924, 1], + [40923, 1], + [40922, 1], + [40921, 1], + [40920, 1], + [40919, 1], + [40918, 1], + [40917, 1], + [40916, 1], + [40915, 1], + [40914, 1], + [40913, 1], + [40912, 1], + [40911, 1], + [40910, 1], + [40909, 1], + [40908, 1], + [40907, 1], + [40906, 1], + [40905, 1], + [40904, 1], + [40903, 1], + [40902, 1], + [40901, 1], + [40900, 1], + [40899, 1], + [40898, 1], + [40897, 1], + [40896, 1], + [40895, 1], + [40894, 1], + [40893, 1], + [40892, 1], + [40891, 1], + [40890, 1], + [40889, 1], + [40888, 1], + [40887, 1], + [40886, 1], + [40885, 1], + [40884, 1], + [40883, 1], + [40882, 1], + [40881, 1], + [40880, 1], + [40879, 1], + [40878, 1], + [40877, 1], + [40876, 1], + [40875, 1], + [40874, 1], + [40873, 1], + [40872, 1], + [40871, 1], + [40870, 1], + [40869, 1], + [40868, 1], + [40867, 1], + [40866, 1], + [40865, 1], + [40864, 1], + [40863, 1], + [40862, 1], + [40861, 1], + [40860, 1], + [40859, 1], + [40858, 1], + [40857, 1], + [40856, 1], + [40855, 1], + [40854, 1], + [40853, 1], + [40852, 1], + [40851, 1], + [40850, 1], + [40849, 1], + [40848, 1], + [40847, 1], + [40846, 1], + [40845, 1], + [40844, 1], + [40843, 1], + [40842, 1], + [40841, 1], + [40840, 1], + [40839, 1], + [40838, 1], + [40837, 1], + [40836, 1], + [40835, 1], + [40834, 1], + [40833, 1], + [40832, 1], + [40831, 1], + [40830, 1], + [40829, 1], + [40828, 1], + [40827, 1], + [40826, 1], + [40825, 1], + [40824, 1], + [40823, 1], + [40822, 1], + [40821, 1], + [40820, 1], + [40819, 1], + [40818, 1], + [40817, 1], + [40816, 1], + [40815, 1], + [40814, 1], + [40813, 1], + [40812, 1], + [40811, 1], + [40810, 1], + [40809, 1], + [40808, 1], + [40807, 1], + [40806, 1], + [40805, 1], + [40804, 1], + [40803, 1], + [40802, 1], + [40801, 1], + [40800, 1], + [40799, 1], + [40798, 1], + [40797, 1], + [40796, 1], + [40795, 1], + [40794, 1], + [40793, 1], + [40792, 1], + [40791, 1], + [40790, 1], + [40789, 1], + [40788, 1], + [40787, 1], + [40786, 1], + [40785, 1], + [40784, 1], + [40783, 1], + [40782, 1], + [40781, 1], + [40780, 1], + [40779, 1], + [40778, 1], + [40777, 1], + [40776, 1], + [40775, 1], + [40774, 1], + [40773, 1], + [40772, 1], + [40771, 1], + [40770, 1], + [40769, 1], + [40768, 1], + [40767, 1], + [40766, 1], + [40765, 1], + [40764, 1], + [40763, 1], + [40762, 1], + [40761, 1], + [40760, 1], + [40759, 1], + [40758, 1], + [40757, 1], + [40756, 1], + [40755, 1], + [40754, 1], + [40753, 1], + [40752, 1], + [40751, 1], + [40750, 1], + [40749, 1], + [40748, 1], + [40747, 1], + [40746, 1], + [40745, 1], + [40744, 1], + [40743, 1], + [40742, 1], + [40741, 1], + [40740, 1], + [40739, 1], + [40738, 1], + [40737, 1], + [40736, 1], + [40735, 1], + [40734, 1], + [40733, 1], + [40732, 1], + [40731, 1], + [40730, 1], + [40729, 1], + [40728, 1], + [40727, 1], + [40726, 1], + [40725, 1], + [40724, 1], + [40723, 1], + [40722, 1], + [40721, 1], + [40720, 1], + [40719, 1], + [40718, 1], + [40717, 1], + [40716, 1], + [40715, 1], + [40714, 1], + [40713, 1], + [40712, 1], + [40711, 1], + [40710, 1], + [40709, 1], + [40708, 1], + [40707, 1], + [40706, 1], + [40705, 1], + [40704, 1], + [40703, 1], + [40702, 1], + [40701, 1], + [40700, 1], + [40699, 1], + [40698, 1], + [40697, 1], + [40696, 1], + [40695, 1], + [40694, 1], + [40693, 1], + [40692, 1], + [40691, 1], + [40690, 1], + [40689, 1], + [40688, 1], + [40687, 1], + [40686, 1], + [40685, 1], + [40684, 1], + [40683, 1], + [40682, 1], + [40681, 1], + [40680, 1], + [40679, 1], + [40678, 1], + [40677, 1], + [40676, 1], + [40675, 1], + [40674, 1], + [40673, 1], + [40672, 1], + [40671, 1], + [40670, 1], + [40669, 1], + [40668, 1], + [40667, 1], + [40666, 1], + [40665, 1], + [40664, 1], + [40663, 1], + [40662, 1], + [40661, 1], + [40660, 1], + [40659, 1], + [40658, 1], + [40657, 1], + [40656, 1], + [40655, 1], + [40654, 1], + [40653, 1], + [40652, 1], + [40651, 1], + [40650, 1], + [40649, 1], + [40648, 1], + [40647, 1], + [40646, 1], + [40645, 1], + [40644, 1], + [40643, 1], + [40642, 1], + [40641, 1], + [40640, 1], + [40639, 1], + [40638, 1], + [40637, 1], + [40636, 1], + [40635, 1], + [40634, 1], + [40633, 1], + [40632, 1], + [40631, 1], + [40630, 1], + [40629, 1], + [40628, 1], + [40627, 1], + [40626, 1], + [40625, 1], + [40624, 1], + [40623, 1], + [40622, 1], + [40621, 1], + [40620, 1], + [40619, 1], + [40618, 1], + [40617, 1], + [40616, 1], + [40615, 1], + [40614, 1], + [40613, 1], + [40612, 1], + [40611, 1], + [40610, 1], + [40609, 1], + [40608, 1], + [40607, 1], + [40606, 1], + [40605, 1], + [40604, 1], + [40603, 1], + [40602, 1], + [40601, 1], + [40600, 1], + [40599, 1], + [40598, 1], + [40597, 1], + [40596, 1], + [40595, 1], + [40594, 1], + [40593, 1], + [40592, 1], + [40591, 1], + [40590, 1], + [40589, 1], + [40588, 1], + [40587, 1], + [40586, 1], + [40585, 1], + [40584, 1], + [40583, 1], + [40582, 1], + [40581, 1], + [40580, 1], + [40579, 1], + [40578, 1], + [40577, 1], + [40576, 1], + [40575, 1], + [40574, 1], + [40573, 1], + [40572, 1], + [40571, 1], + [40570, 1], + [40569, 1], + [40568, 1], + [40567, 1], + [40566, 1], + [40565, 1], + [40564, 1], + [40563, 1], + [40562, 1], + [40561, 1], + [40560, 1], + [40559, 1], + [40558, 1], + [40557, 1], + [40556, 1], + [40555, 1], + [40554, 1], + [40553, 1], + [40552, 1], + [40551, 1], + [40550, 1], + [40549, 1], + [40548, 1], + [40547, 1], + [40546, 1], + [40545, 1], + [40544, 1], + [40543, 1], + [40542, 1], + [40541, 1], + [40540, 1], + [40539, 1], + [40538, 1], + [40537, 1], + [40536, 1], + [40535, 1], + [40534, 1], + [40533, 1], + [40532, 1], + [40531, 1], + [40530, 1], + [40529, 1], + [40528, 1], + [40527, 1], + [40526, 1], + [40525, 1], + [40524, 1], + [40523, 1], + [40522, 1], + [40521, 1], + [40520, 1], + [40519, 1], + [40518, 1], + [40517, 1], + [40516, 1], + [40515, 1], + [40514, 1], + [40513, 1], + [40512, 1], + [40511, 1], + [40510, 1], + [40509, 1], + [40508, 1], + [40507, 1], + [40506, 1], + [40505, 1], + [40504, 1], + [40503, 1], + [40502, 1], + [40501, 1], + [40500, 1], + [40499, 1], + [40498, 1], + [40497, 1], + [40496, 1], + [40495, 1], + [40494, 1], + [40493, 1], + [40492, 1], + [40491, 1], + [40490, 1], + [40489, 1], + [40488, 1], + [40487, 1], + [40486, 1], + [40485, 1], + [40484, 1], + [40483, 1], + [40482, 1], + [40481, 1], + [40480, 1], + [40479, 1], + [40478, 1], + [40477, 1], + [40476, 1], + [40475, 1], + [40474, 1], + [40473, 1], + [40472, 1], + [40471, 1], + [40470, 1], + [40469, 1], + [40468, 1], + [40467, 1], + [40466, 1], + [40465, 1], + [40464, 1], + [40463, 1], + [40462, 1], + [40461, 1], + [40460, 1], + [40459, 1], + [40458, 1], + [40457, 1], + [40456, 1], + [40455, 1], + [40454, 1], + [40453, 1], + [40452, 1], + [40451, 1], + [40450, 1], + [40449, 1], + [40448, 1], + [40447, 1], + [40446, 1], + [40445, 1], + [40444, 1], + [40443, 1], + [40442, 1], + [40441, 1], + [40440, 1], + [40439, 1], + [40438, 1], + [40437, 1], + [40436, 1], + [40435, 1], + [40434, 1], + [40433, 1], + [40432, 1], + [40431, 1], + [40430, 1], + [40429, 1], + [40428, 1], + [40427, 1], + [40426, 1], + [40425, 1], + [40424, 1], + [40423, 1], + [40422, 1], + [40421, 1], + [40420, 1], + [40419, 1], + [40418, 1], + [40417, 1], + [40416, 1], + [40415, 1], + [45818, 0, "\n"], + [45819, 0, "\n"], + [45820, 0, "\\"], + [45821, 0, "s"], + [45822, 0, "e"], + [45823, 0, "c"], + [45824, 0, "t"], + [45825, 0, "i"], + [45826, 0, "o"], + [45827, 0, "n"], + [45828, 0, "{"], + [45829, 0, "F"], + [45830, 0, "o"], + [45831, 0, "r"], + [45832, 0, "m"], + [45833, 0, "a"], + [45834, 0, "l"], + [45835, 0, " "], + [45836, 0, "s"], + [45837, 0, "e"], + [45838, 0, "m"], + [45839, 0, "a"], + [45840, 0, "n"], + [45841, 0, "t"], + [45842, 0, "i"], + [45843, 0, "c"], + [45844, 0, "s"], + [45845, 0, "}"], + [45846, 0, "\\"], + [45847, 0, "l"], + [45848, 0, "a"], + [45849, 0, "b"], + [45850, 0, "e"], + [45851, 0, "l"], + [45852, 0, "{"], + [45853, 0, "s"], + [45854, 0, "e"], + [45855, 0, "c"], + [45856, 0, ":"], + [45857, 0, "s"], + [45858, 0, "e"], + [45859, 0, "m"], + [45860, 0, "a"], + [45861, 0, "n"], + [45862, 0, "t"], + [45863, 0, "i"], + [45864, 0, "c"], + [45865, 0, "s"], + [45866, 0, "}"], + [45836, 1], + [45836, 0, "S"], + [5276, 1], + [5276, 0, "D"], + [5281, 1], + [5281, 0, "M"], + [6964, 1], + [6964, 0, "C"], + [6973, 1], + [6973, 0, "R"], + [8789, 1], + [8789, 0, "C"], + [10189, 1], + [10189, 0, "W"], + [10361, 1], + [10361, 0, "T"], + [15659, 1], + [15659, 0, " "], + [15660, 1], + [15660, 0, "A"], + [17446, 1], + [17446, 0, "D"], + [17451, 1], + [17451, 0, "S"], + [17763, 1], + [17763, 0, "E"], + [17771, 1], + [17771, 0, "E"], + [33575, 1], + [33575, 0, "V"], + [35042, 1], + [35042, 0, "E"], + [47234, 1], + [47234, 0, "E"], + [51434, 1], + [51434, 0, "O"], + [51993, 1], + [51993, 0, "T"], + [53963, 1], + [53963, 0, "S"], + [55789, 1], + [55789, 0, "G"], + [55800, 1], + [55800, 0, "O"], + [61177, 0, "o"], + [61177, 1], + [61177, 1], + [61177, 0, "O"], + [69734, 1], + [69734, 0, "P"], + [69740, 1], + [69740, 0, "S"], + [80585, 1], + [80585, 0, "F"], + [80593, 1], + [80593, 0, "W"], + [84376, 1], + [84376, 0, "C"], + [47208, 1], + [47207, 1], + [47206, 1], + [47205, 1], + [47204, 1], + [47203, 1], + [47202, 1], + [47201, 1], + [47200, 1], + [47199, 1], + [47198, 1], + [47197, 1], + [47196, 1], + [47195, 1], + [47194, 1], + [47193, 1], + [47192, 1], + [47191, 1], + [47190, 1], + [47189, 1], + [47188, 1], + [47187, 1], + [47186, 1], + [47185, 1], + [47184, 1], + [47183, 1], + [47182, 1], + [47181, 1], + [47180, 1], + [47179, 1], + [47178, 1], + [47177, 1], + [47176, 1], + [47175, 1], + [47174, 1], + [47173, 1], + [47172, 1], + [47171, 1], + [47170, 1], + [47169, 1], + [47168, 1], + [47167, 1], + [47166, 1], + [47165, 1], + [47164, 1], + [47163, 1], + [47162, 1], + [47161, 1], + [47160, 1], + [47159, 1], + [47158, 1], + [47157, 1], + [47156, 1], + [47155, 1], + [47154, 1], + [47153, 1], + [47152, 1], + [47151, 1], + [47150, 1], + [47149, 1], + [47148, 1], + [47147, 1], + [47146, 1], + [47145, 1], + [47144, 1], + [47143, 1], + [47142, 1], + [47141, 1], + [47140, 1], + [47139, 1], + [47138, 1], + [47137, 1], + [47136, 1], + [47135, 1], + [47134, 1], + [47133, 1], + [47132, 1], + [47131, 1], + [47130, 1], + [47129, 1], + [47128, 1], + [47127, 1], + [47126, 1], + [47125, 1], + [47124, 1], + [47123, 1], + [47122, 1], + [47121, 1], + [47120, 1], + [47119, 1], + [47118, 1], + [47117, 1], + [47116, 1], + [47115, 1], + [47114, 1], + [47113, 1], + [47112, 1], + [47111, 1], + [47110, 1], + [47109, 1], + [47108, 1], + [47107, 1], + [47106, 1], + [47105, 1], + [47104, 1], + [47103, 1], + [47102, 1], + [47101, 1], + [47100, 1], + [47099, 1], + [47098, 1], + [47097, 1], + [47096, 1], + [47095, 1], + [47094, 1], + [47093, 1], + [47092, 1], + [47091, 1], + [47090, 1], + [47089, 1], + [47088, 1], + [47087, 1], + [47086, 1], + [47085, 1], + [47084, 1], + [47083, 1], + [47082, 1], + [47081, 1], + [47080, 1], + [47079, 1], + [47078, 1], + [47077, 1], + [47076, 1], + [47075, 1], + [47074, 1], + [47073, 1], + [47072, 1], + [47071, 1], + [47070, 1], + [47069, 1], + [47068, 1], + [47067, 1], + [47066, 1], + [47065, 1], + [47064, 1], + [47063, 1], + [47062, 1], + [47061, 1], + [47060, 1], + [47059, 1], + [47058, 1], + [47057, 1], + [47056, 1], + [47055, 1], + [47054, 1], + [47053, 1], + [47052, 1], + [47051, 1], + [47050, 1], + [47049, 1], + [47048, 1], + [47047, 1], + [47046, 1], + [47045, 1], + [47044, 1], + [47043, 1], + [47042, 1], + [47041, 1], + [47040, 1], + [47039, 1], + [47038, 1], + [47037, 1], + [47036, 1], + [47035, 1], + [47034, 1], + [47033, 1], + [47032, 1], + [47031, 1], + [47030, 1], + [47029, 1], + [47028, 1], + [47027, 1], + [47026, 1], + [47025, 1], + [47024, 1], + [47023, 1], + [47022, 1], + [47021, 1], + [47020, 1], + [47019, 1], + [47018, 1], + [47017, 1], + [47016, 1], + [47015, 1], + [47014, 1], + [47013, 1], + [47012, 1], + [47011, 1], + [47010, 1], + [47009, 1], + [47008, 1], + [47007, 1], + [47006, 1], + [47005, 1], + [47004, 1], + [47003, 1], + [47002, 1], + [47001, 1], + [47000, 1], + [46999, 1], + [46998, 1], + [46997, 1], + [46996, 1], + [46995, 1], + [46994, 1], + [46993, 1], + [46992, 1], + [46991, 1], + [46990, 1], + [46989, 1], + [46988, 1], + [46987, 1], + [46986, 1], + [46985, 1], + [46984, 1], + [46983, 1], + [46982, 1], + [46981, 1], + [46980, 1], + [46979, 1], + [46978, 1], + [46977, 1], + [46976, 1], + [46975, 1], + [46974, 1], + [46973, 1], + [46972, 1], + [46971, 1], + [46970, 1], + [46969, 1], + [46968, 1], + [46967, 1], + [46966, 1], + [46965, 1], + [46964, 1], + [46963, 1], + [46962, 1], + [46961, 1], + [46960, 1], + [46959, 1], + [46958, 1], + [46957, 1], + [46956, 1], + [46955, 1], + [46954, 1], + [46953, 1], + [46952, 1], + [46951, 1], + [46950, 1], + [46949, 1], + [46948, 1], + [46947, 1], + [46946, 1], + [46945, 1], + [46944, 1], + [46943, 1], + [46942, 1], + [46941, 1], + [46940, 1], + [46939, 1], + [46938, 1], + [46937, 1], + [46936, 1], + [46935, 1], + [46934, 1], + [46933, 1], + [46932, 1], + [46931, 1], + [46930, 1], + [46929, 1], + [46928, 1], + [46927, 1], + [46926, 1], + [46925, 1], + [46924, 1], + [46923, 1], + [46922, 1], + [46921, 1], + [46920, 1], + [46919, 1], + [46918, 1], + [46917, 1], + [46916, 1], + [46915, 1], + [46914, 1], + [46913, 1], + [46912, 1], + [46911, 1], + [46910, 1], + [46909, 1], + [46908, 1], + [46907, 1], + [46906, 1], + [46905, 1], + [46904, 1], + [46903, 1], + [46902, 1], + [46901, 1], + [46900, 1], + [46899, 1], + [46898, 1], + [46897, 1], + [46896, 1], + [46895, 1], + [46894, 1], + [46893, 1], + [46892, 1], + [46891, 1], + [46890, 1], + [46889, 1], + [46888, 1], + [46887, 1], + [46886, 1], + [46885, 1], + [46884, 1], + [46883, 1], + [46882, 1], + [46881, 1], + [46880, 1], + [46879, 1], + [46878, 1], + [46877, 1], + [46876, 1], + [46875, 1], + [46874, 1], + [46873, 1], + [46872, 1], + [46871, 1], + [46870, 1], + [46869, 1], + [46868, 1], + [46867, 1], + [46866, 1], + [46865, 1], + [46864, 1], + [46863, 1], + [46862, 1], + [46861, 1], + [46860, 1], + [46859, 1], + [46858, 1], + [46857, 1], + [46856, 1], + [46855, 1], + [46854, 1], + [46853, 1], + [46852, 1], + [46851, 1], + [46850, 1], + [46849, 1], + [46848, 1], + [46847, 1], + [46846, 1], + [46845, 1], + [46844, 1], + [46843, 1], + [46842, 1], + [46841, 1], + [46840, 1], + [46839, 1], + [46838, 1], + [46837, 1], + [46836, 1], + [46835, 1], + [46834, 1], + [46833, 1], + [46832, 1], + [46831, 1], + [46830, 1], + [46829, 1], + [46828, 1], + [46827, 1], + [46826, 1], + [46825, 1], + [46824, 1], + [46823, 1], + [46822, 1], + [46821, 1], + [46820, 1], + [46819, 1], + [46818, 1], + [46817, 1], + [46816, 1], + [46815, 1], + [46814, 1], + [46813, 1], + [46812, 1], + [46811, 1], + [46810, 1], + [46809, 1], + [46808, 1], + [46807, 1], + [46806, 1], + [46805, 1], + [46804, 1], + [46803, 1], + [46802, 1], + [46801, 1], + [46800, 1], + [46799, 1], + [46798, 1], + [46797, 1], + [46796, 1], + [46795, 1], + [46794, 1], + [46793, 1], + [46792, 1], + [46791, 1], + [46790, 1], + [46789, 1], + [46788, 1], + [46787, 1], + [46786, 1], + [46785, 1], + [46784, 1], + [46783, 1], + [46782, 1], + [46781, 1], + [46780, 1], + [46779, 1], + [46778, 1], + [46777, 1], + [46776, 1], + [46775, 1], + [46774, 1], + [46773, 1], + [46772, 1], + [46771, 1], + [46770, 1], + [46769, 1], + [46768, 1], + [46767, 1], + [46766, 1], + [46765, 1], + [46764, 1], + [46763, 1], + [46762, 1], + [46761, 1], + [46760, 1], + [46759, 1], + [46758, 1], + [46757, 1], + [46756, 1], + [46755, 1], + [46754, 1], + [46753, 1], + [46752, 1], + [46751, 1], + [46750, 1], + [46749, 1], + [46748, 1], + [46747, 1], + [46746, 1], + [46745, 1], + [46744, 1], + [46743, 1], + [46742, 1], + [46741, 1], + [46740, 1], + [46739, 1], + [46738, 1], + [46737, 1], + [46736, 1], + [46735, 1], + [46734, 1], + [46733, 1], + [46732, 1], + [46731, 1], + [46730, 1], + [46729, 1], + [46728, 1], + [46727, 1], + [46726, 1], + [46725, 1], + [46724, 1], + [46723, 1], + [46722, 1], + [46721, 1], + [46720, 1], + [46719, 1], + [46718, 1], + [46717, 1], + [46716, 1], + [46715, 1], + [46714, 1], + [46713, 1], + [46712, 1], + [46711, 1], + [46710, 1], + [46709, 1], + [46708, 1], + [46707, 1], + [46706, 1], + [46705, 1], + [46704, 1], + [46703, 1], + [46702, 1], + [46701, 1], + [46700, 1], + [46699, 1], + [46698, 1], + [46697, 1], + [46696, 1], + [46695, 1], + [46694, 1], + [46693, 1], + [46692, 1], + [46691, 1], + [46690, 1], + [46689, 1], + [46688, 1], + [46687, 1], + [46686, 1], + [46685, 1], + [46684, 1], + [46683, 1], + [46682, 1], + [46681, 1], + [46680, 1], + [46679, 1], + [46678, 1], + [46677, 1], + [46676, 1], + [46675, 1], + [46674, 1], + [46673, 1], + [46672, 1], + [46671, 1], + [46670, 1], + [46669, 1], + [46668, 1], + [46667, 1], + [46666, 1], + [46665, 1], + [46664, 1], + [46663, 1], + [46662, 1], + [46661, 1], + [46660, 1], + [46659, 1], + [46658, 1], + [46657, 1], + [46656, 1], + [46655, 1], + [46654, 1], + [46653, 1], + [46652, 1], + [46651, 1], + [46650, 1], + [46649, 1], + [46648, 1], + [46647, 1], + [46646, 1], + [46645, 1], + [46644, 1], + [46643, 1], + [46642, 1], + [46641, 1], + [46640, 1], + [46639, 1], + [46638, 1], + [46637, 1], + [46636, 1], + [46635, 1], + [46634, 1], + [46633, 1], + [46632, 1], + [46631, 1], + [46630, 1], + [46629, 1], + [46628, 1], + [46627, 1], + [46626, 1], + [46625, 1], + [46624, 1], + [46623, 1], + [46622, 1], + [46621, 1], + [46620, 1], + [46619, 1], + [46618, 1], + [46617, 1], + [46616, 1], + [46615, 1], + [46614, 1], + [46613, 1], + [46612, 1], + [46611, 1], + [46610, 1], + [46609, 1], + [46608, 1], + [46607, 1], + [46606, 1], + [46605, 1], + [46604, 1], + [46603, 1], + [46602, 1], + [46601, 1], + [46600, 1], + [46599, 1], + [46598, 1], + [46597, 1], + [46596, 1], + [46595, 1], + [46594, 1], + [46593, 1], + [46592, 1], + [46591, 1], + [46590, 1], + [46589, 1], + [46588, 1], + [46587, 1], + [46586, 1], + [46585, 1], + [46584, 1], + [46583, 1], + [46582, 1], + [46581, 1], + [46580, 1], + [46579, 1], + [46578, 1], + [46577, 1], + [46576, 1], + [46575, 1], + [46574, 1], + [46573, 1], + [46572, 1], + [46571, 1], + [46570, 1], + [46569, 1], + [46568, 1], + [46567, 1], + [46566, 1], + [46565, 1], + [46564, 1], + [46563, 1], + [46562, 1], + [46561, 1], + [46560, 1], + [46559, 1], + [46558, 1], + [46557, 1], + [46556, 1], + [46555, 1], + [46554, 1], + [46553, 1], + [46552, 1], + [46551, 1], + [46550, 1], + [46549, 1], + [46548, 1], + [46547, 1], + [46546, 1], + [46545, 1], + [46544, 1], + [46543, 1], + [46542, 1], + [46541, 1], + [46540, 1], + [46539, 1], + [46538, 1], + [46537, 1], + [46536, 1], + [46535, 1], + [46534, 1], + [46533, 1], + [46532, 1], + [46531, 1], + [46530, 1], + [46529, 1], + [46528, 1], + [46527, 1], + [46526, 1], + [46525, 1], + [46524, 1], + [46523, 1], + [46522, 1], + [46521, 1], + [46520, 1], + [46519, 1], + [46518, 1], + [46517, 1], + [46516, 1], + [46515, 1], + [46514, 1], + [46513, 1], + [46512, 1], + [46511, 1], + [46510, 1], + [46509, 1], + [46508, 1], + [46507, 1], + [46506, 1], + [46505, 1], + [46504, 1], + [46503, 1], + [46502, 1], + [46501, 1], + [46500, 1], + [46499, 1], + [46498, 1], + [46497, 1], + [46496, 1], + [46495, 1], + [46494, 1], + [46493, 1], + [46492, 1], + [46491, 1], + [46490, 1], + [46489, 1], + [46488, 1], + [46487, 1], + [46486, 1], + [46485, 1], + [46484, 1], + [46483, 1], + [46482, 1], + [46481, 1], + [46480, 1], + [46479, 1], + [46478, 1], + [46477, 1], + [46476, 1], + [46475, 1], + [46474, 1], + [46473, 1], + [46472, 1], + [46471, 1], + [46470, 1], + [46469, 1], + [46468, 1], + [46467, 1], + [46466, 1], + [46465, 1], + [46464, 1], + [46463, 1], + [46462, 1], + [46461, 1], + [46460, 1], + [46459, 1], + [46458, 1], + [46457, 1], + [46456, 1], + [46455, 1], + [46454, 1], + [46453, 1], + [46452, 1], + [46451, 1], + [46450, 1], + [46449, 1], + [46448, 1], + [46447, 1], + [46446, 1], + [46445, 1], + [46444, 1], + [46443, 1], + [46442, 1], + [46441, 1], + [46440, 1], + [46439, 1], + [46438, 1], + [46437, 1], + [46436, 1], + [46435, 1], + [46434, 1], + [46433, 1], + [46432, 1], + [46431, 1], + [46430, 1], + [46429, 1], + [46428, 1], + [46427, 1], + [46426, 1], + [46425, 1], + [46424, 1], + [46423, 1], + [46422, 1], + [46421, 1], + [46420, 1], + [46419, 1], + [46418, 1], + [46417, 1], + [46416, 1], + [46415, 1], + [46414, 1], + [46413, 1], + [46412, 1], + [46411, 1], + [47619, 0, " "], + [47620, 0, "l"], + [47621, 0, "o"], + [47622, 0, "c"], + [47623, 0, "a"], + [47624, 0, "l"], + [47625, 0, " "], + [47626, 0, "r"], + [47627, 0, "e"], + [47628, 0, "p"], + [47629, 0, "l"], + [47630, 0, "i"], + [47631, 0, "c"], + [47632, 0, "a"], + [47633, 0, " "], + [47634, 0, "s"], + [47635, 0, "t"], + [47636, 0, "a"], + [47637, 0, "t"], + [47638, 0, "e"], + [47649, 0, " "], + [47650, 0, "$"], + [47651, 0, "A"], + [47652, 0, "_"], + [47653, 0, "p"], + [47654, 0, "$"], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [47655, 1], + [51491, 1], + [51491, 0, "I"], + [51498, 0, ","], + [51499, 0, " "], + [51500, 0, "w"], + [51501, 0, "h"], + [51502, 0, "e"], + [51503, 0, "n"], + [51504, 0, "e"], + [51505, 0, "v"], + [51506, 0, "e"], + [51507, 0, "r"], + [51508, 0, " "], + [51509, 0, "a"], + [51510, 0, "n"], + [51511, 0, " "], + [51512, 0, "e"], + [51513, 0, "l"], + [51514, 0, "e"], + [51515, 0, "m"], + [51516, 0, "e"], + [51517, 0, "n"], + [51518, 0, "t"], + [51519, 0, " "], + [51520, 0, "i"], + [51521, 0, "s"], + [51522, 0, " "], + [51523, 0, "i"], + [51524, 0, "n"], + [51525, 0, "s"], + [51526, 0, "e"], + [51527, 0, "r"], + [51528, 0, "t"], + [51529, 0, "e"], + [51530, 0, "d"], + [51531, 0, " "], + [51532, 0, "i"], + [51533, 0, "n"], + [51534, 0, "t"], + [51535, 0, "o"], + [51536, 0, " "], + [51537, 0, "a"], + [51538, 0, " "], + [51539, 0, "l"], + [51540, 0, "i"], + [51541, 0, "s"], + [51542, 0, "t"], + [51543, 0, " "], + [51544, 0, "o"], + [51545, 0, "r"], + [51546, 0, " "], + [51547, 0, "a"], + [51548, 0, " "], + [51549, 0, "v"], + [51550, 0, "a"], + [51551, 0, "l"], + [51552, 0, "u"], + [51553, 0, "e"], + [51554, 0, " "], + [51555, 0, "i"], + [51556, 0, "s"], + [51557, 0, " "], + [51558, 0, "a"], + [51559, 0, "s"], + [51560, 0, "s"], + [51561, 0, "i"], + [51562, 0, "g"], + [51563, 0, "n"], + [51564, 0, "e"], + [51565, 0, "d"], + [51566, 0, " "], + [51567, 0, "t"], + [51568, 0, "o"], + [51569, 0, " "], + [51570, 0, "a"], + [51571, 0, " "], + [51572, 0, "r"], + [51573, 0, "e"], + [51574, 0, "g"], + [51575, 0, "i"], + [51576, 0, "s"], + [51577, 0, "t"], + [51578, 0, "e"], + [51579, 0, "r"], + [51580, 0, ","], + [51581, 0, " "], + [51582, 0, "t"], + [51583, 0, "h"], + [51584, 0, "e"], + [51585, 0, " "], + [51586, 0, "o"], + [51587, 0, "p"], + [51588, 0, "e"], + [51589, 0, "r"], + [51590, 0, "a"], + [51591, 0, "t"], + [51592, 0, "i"], + [51593, 0, "o"], + [51594, 0, "n"], + [51595, 0, " "], + [51595, 1], + [51594, 1], + [51593, 1], + [51592, 1], + [51591, 1], + [51590, 1], + [51589, 1], + [51588, 1], + [51587, 1], + [51586, 1], + [51586, 0, "n"], + [51587, 0, "e"], + [51588, 0, "w"], + [51589, 0, " "], + [51590, 0, "l"], + [51591, 0, "i"], + [51592, 0, "s"], + [51593, 0, "t"], + [51594, 0, " "], + [51595, 0, "e"], + [51596, 0, "l"], + [51597, 0, "e"], + [51598, 0, "m"], + [51599, 0, "e"], + [51600, 0, "n"], + [51601, 0, "t"], + [51602, 0, " "], + [51603, 0, "o"], + [51604, 0, "r"], + [51605, 0, " "], + [51606, 0, "r"], + [51607, 0, "e"], + [51608, 0, "g"], + [51609, 0, "i"], + [51610, 0, "s"], + [51611, 0, "t"], + [51612, 0, "e"], + [51613, 0, "r"], + [51614, 0, " "], + [51615, 0, "v"], + [51616, 0, "a"], + [51617, 0, "l"], + [51618, 0, "u"], + [51619, 0, "e"], + [51620, 0, " "], + [51621, 0, "i"], + [51622, 0, "s"], + [51623, 0, " "], + [51624, 0, "i"], + [51625, 0, "d"], + [51626, 0, "e"], + [51627, 0, "n"], + [51628, 0, "t"], + [51629, 0, "i"], + [51630, 0, "f"], + [51631, 0, "i"], + [51632, 0, "e"], + [51633, 0, "d"], + [51634, 0, " "], + [51635, 0, "b"], + [51636, 0, "y"], + [51637, 0, " "], + [51638, 0, "t"], + [51639, 0, "h"], + [51640, 0, "e"], + [51641, 0, " "], + [51642, 0, "i"], + [51643, 0, "d"], + [51644, 0, "e"], + [51645, 0, "n"], + [51646, 0, "t"], + [51647, 0, "i"], + [51648, 0, "f"], + [51649, 0, "i"], + [51650, 0, "e"], + [51651, 0, "r"], + [51652, 0, " "], + [51653, 0, "o"], + [51654, 0, "f"], + [51655, 0, " "], + [51656, 0, "t"], + [51657, 0, "h"], + [51658, 0, "e"], + [51659, 0, " "], + [51660, 0, "o"], + [51661, 0, "p"], + [51662, 0, "e"], + [51663, 0, "r"], + [51664, 0, "a"], + [51665, 0, "t"], + [51666, 0, "i"], + [51667, 0, "o"], + [51668, 0, "n"], + [51669, 0, " "], + [51670, 0, "t"], + [51671, 0, "h"], + [51672, 0, "a"], + [51673, 0, "t"], + [51674, 0, " "], + [51675, 0, "c"], + [51676, 0, "r"], + [51677, 0, "e"], + [51678, 0, "a"], + [51679, 0, "t"], + [51680, 0, "e"], + [51681, 0, "d"], + [51682, 0, " "], + [51683, 0, "i"], + [51684, 0, "t"], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51685, 1], + [51500, 1], + [51500, 0, "W"], + [51499, 1], + [51498, 1], + [51497, 1], + [51496, 1], + [51495, 1], + [51494, 1], + [51493, 1], + [51492, 1], + [51491, 1], + [51490, 1], + [51489, 1], + [51488, 1], + [51487, 1], + [51486, 1], + [51485, 1], + [51484, 1], + [51483, 1], + [51482, 1], + [51481, 1], + [51480, 1], + [51479, 1], + [51478, 1], + [51477, 1], + [51476, 1], + [51475, 1], + [51474, 1], + [51473, 1], + [51472, 1], + [51471, 1], + [51470, 1], + [51469, 1], + [51468, 1], + [51467, 1], + [51466, 1], + [51465, 1], + [51464, 1], + [51463, 1], + [51462, 1], + [51461, 1], + [51460, 1], + [51459, 1], + [51458, 1], + [51457, 1], + [51456, 1], + [51455, 1], + [51454, 1], + [51453, 1], + [51452, 1], + [51451, 1], + [51450, 1], + [51449, 1], + [51448, 1], + [51447, 1], + [51446, 1], + [51445, 1], + [51444, 1], + [51443, 1], + [51442, 1], + [51441, 1], + [51440, 1], + [51439, 1], + [51438, 1], + [51437, 1], + [51436, 1], + [51435, 1], + [51434, 1], + [51433, 1], + [51432, 1], + [51431, 1], + [51430, 1], + [51429, 1], + [51428, 1], + [51427, 1], + [51426, 1], + [51425, 1], + [51424, 1], + [51423, 1], + [51422, 1], + [51421, 1], + [51420, 1], + [51419, 1], + [51418, 1], + [51417, 1], + [51416, 1], + [51415, 1], + [51414, 1], + [51413, 1], + [51412, 1], + [51411, 1], + [51410, 1], + [51409, 1], + [51408, 1], + [51407, 1], + [51406, 1], + [51405, 1], + [51404, 1], + [51403, 1], + [51402, 1], + [51401, 1], + [51400, 1], + [51399, 1], + [51398, 1], + [51397, 1], + [51396, 1], + [51395, 1], + [51394, 1], + [51393, 1], + [51392, 1], + [51391, 1], + [51390, 1], + [51389, 1], + [51388, 1], + [51387, 1], + [51386, 1], + [51385, 1], + [51384, 1], + [51383, 1], + [51382, 1], + [51381, 1], + [51380, 1], + [51379, 1], + [51378, 1], + [51377, 1], + [51376, 1], + [51375, 1], + [51374, 1], + [51373, 1], + [51372, 1], + [51371, 1], + [51370, 1], + [51369, 1], + [51368, 1], + [51367, 1], + [51366, 1], + [51365, 1], + [51364, 1], + [51363, 1], + [51362, 1], + [51361, 1], + [51360, 1], + [51359, 1], + [51358, 1], + [51357, 1], + [51356, 1], + [51355, 1], + [51354, 1], + [51353, 1], + [51352, 1], + [51351, 1], + [51350, 1], + [51349, 1], + [51348, 1], + [51347, 1], + [51346, 1], + [51345, 1], + [51344, 1], + [51343, 1], + [51342, 1], + [51341, 1], + [51340, 1], + [51339, 1], + [51338, 1], + [51337, 1], + [51336, 1], + [51335, 1], + [51334, 1], + [51333, 1], + [51332, 1], + [51331, 1], + [51330, 1], + [51329, 1], + [51328, 1], + [51327, 1], + [51326, 1], + [51325, 1], + [51324, 1], + [51323, 1], + [51322, 1], + [51321, 1], + [51320, 1], + [51319, 1], + [51318, 1], + [51317, 1], + [51316, 1], + [51315, 1], + [51314, 1], + [51313, 1], + [51312, 1], + [51311, 1], + [51310, 1], + [51309, 1], + [51308, 1], + [48640, 1], + [48640, 0, "."], + [48641, 0, "g"], + [48642, 0, "e"], + [48643, 0, "t"], + [48644, 0, "("], + [48655, 1], + [48655, 0, ")"], + [48844, 1], + [48844, 0, "."], + [48845, 0, "g"], + [48846, 0, "e"], + [48847, 0, "t"], + [48848, 0, "("], + [48852, 1], + [48852, 0, ")"], + [46817, 1], + [46816, 1], + [46815, 1], + [46814, 1], + [46813, 1], + [46812, 1], + [46811, 1], + [46811, 0, "."], + [46812, 0, " "], + [46813, 0, "T"], + [46811, 0, " "], + [46812, 0, "("], + [46813, 0, "t"], + [46814, 0, "h"], + [46815, 0, "e"], + [46816, 0, " "], + [46817, 0, "n"], + [46818, 0, "o"], + [46819, 0, "t"], + [46820, 0, "a"], + [46821, 0, "t"], + [46822, 0, "i"], + [46823, 0, "o"], + [46824, 0, "n"], + [46825, 0, " "], + [46826, 0, "$"], + [46827, 0, "A"], + [46828, 0, "_"], + [46829, 0, "p"], + [46830, 0, "["], + [46831, 0, "\\"], + [46832, 0, ","], + [46833, 0, "x"], + [46834, 0, " "], + [46835, 0, "\\"], + [46836, 0, ","], + [46837, 0, "\\"], + [46838, 0, "m"], + [46839, 0, "a"], + [46840, 0, "p"], + [46841, 0, "s"], + [46842, 0, "t"], + [46843, 0, "o"], + [46844, 0, "\\"], + [46845, 0, ","], + [46846, 0, " "], + [46847, 0, "\\"], + [46848, 0, "m"], + [46849, 0, "a"], + [46850, 0, "t"], + [46851, 0, "h"], + [46852, 0, "i"], + [46853, 0, "t"], + [46854, 0, "{"], + [46855, 0, "c"], + [46856, 0, "u"], + [46857, 0, "r"], + [46858, 0, "}"], + [46859, 0, "\\"], + [46860, 0, ","], + [46861, 0, "]"], + [46862, 0, "$"], + [46863, 0, " "], + [46864, 0, "d"], + [46865, 0, "e"], + [46866, 0, "n"], + [46867, 0, "o"], + [46868, 0, "t"], + [46869, 0, "e"], + [46870, 0, "s"], + [46871, 0, " "], + [46872, 0, "a"], + [46873, 0, " "], + [46874, 0, "p"], + [46875, 0, "a"], + [46876, 0, "r"], + [46877, 0, "t"], + [46878, 0, "i"], + [46879, 0, "a"], + [46880, 0, "l"], + [46881, 0, " "], + [46882, 0, "f"], + [46883, 0, "u"], + [46884, 0, "n"], + [46885, 0, "c"], + [46886, 0, "t"], + [46887, 0, "i"], + [46888, 0, "o"], + [46889, 0, "n"], + [46890, 0, " "], + [46891, 0, "t"], + [46892, 0, "h"], + [46893, 0, "a"], + [46894, 0, "t"], + [46895, 0, " "], + [46896, 0, "i"], + [46897, 0, "s"], + [46898, 0, " "], + [46899, 0, "t"], + [46900, 0, "h"], + [46901, 0, "e"], + [46902, 0, " "], + [46903, 0, "s"], + [46904, 0, "a"], + [46905, 0, "m"], + [46906, 0, "e"], + [46907, 0, " "], + [46908, 0, "a"], + [46909, 0, "s"], + [46910, 0, " "], + [46911, 0, "$"], + [46912, 0, "A"], + [46913, 0, "_"], + [46914, 0, "p"], + [46915, 0, "$"], + [46916, 0, ","], + [46917, 0, " "], + [46918, 0, "e"], + [46919, 0, "x"], + [46920, 0, "c"], + [46921, 0, "e"], + [46922, 0, "p"], + [46923, 0, "t"], + [46924, 0, " "], + [46925, 0, "t"], + [46926, 0, "h"], + [46927, 0, "a"], + [46928, 0, "t"], + [46929, 0, " "], + [46930, 0, "$"], + [46931, 0, "A"], + [46932, 0, "_"], + [46933, 0, "p"], + [46934, 0, "("], + [46935, 0, "x"], + [46936, 0, ")"], + [46937, 0, " "], + [46938, 0, "="], + [46939, 0, " "], + [46940, 0, "\\"], + [46941, 0, "m"], + [46942, 0, "a"], + [46943, 0, "t"], + [46944, 0, "h"], + [46945, 0, "i"], + [46946, 0, "t"], + [46947, 0, "{"], + [46948, 0, "c"], + [46949, 0, "u"], + [46950, 0, "r"], + [46951, 0, "}"], + [46952, 0, "$"], + [46953, 0, ")"], + [47071, 0, " "], + [47072, 0, "f"], + [47073, 0, "o"], + [47074, 0, "l"], + [47075, 0, "l"], + [47076, 0, "o"], + [47077, 0, "w"], + [47078, 0, "i"], + [47079, 0, "n"], + [47080, 0, "g"], + [51355, 0, "\\"], + [51356, 0, "l"], + [51357, 0, "a"], + [51358, 0, "b"], + [51359, 0, "e"], + [51360, 0, "l"], + [51361, 0, "{"], + [51362, 0, "s"], + [51363, 0, "e"], + [51364, 0, "c"], + [51365, 0, ":"], + [51366, 0, "l"], + [51367, 0, "a"], + [51368, 0, "m"], + [51369, 0, "p"], + [51370, 0, "o"], + [51371, 0, "r"], + [51372, 0, "t"], + [51373, 0, "}"], + [51373, 0, "-"], + [51374, 0, "t"], + [51375, 0, "s"], + [47723, 0, ","], + [47724, 0, " "], + [47725, 0, "a"], + [47726, 0, "s"], + [47727, 0, "s"], + [47728, 0, "u"], + [47729, 0, "m"], + [47730, 0, "i"], + [47731, 0, "n"], + [47732, 0, "g"], + [47733, 0, " "], + [47734, 0, "t"], + [47735, 0, "h"], + [47736, 0, "a"], + [47737, 0, "t"], + [47738, 0, " "], + [47739, 0, "$"], + [47740, 0, "\\"], + [47741, 0, "m"], + [47742, 0, "a"], + [47743, 0, "t"], + [47744, 0, "h"], + [47745, 0, "i"], + [47746, 0, "t"], + [47747, 0, "{"], + [47748, 0, "i"], + [47749, 0, "d"], + [47750, 0, "}"], + [47751, 0, "_"], + [47752, 0, "1"], + [47753, 0, "$"], + [47754, 0, " "], + [47755, 0, "i"], + [47756, 0, "s"], + [47757, 0, " "], + [47758, 0, "t"], + [47759, 0, "h"], + [47760, 0, "e"], + [47761, 0, " "], + [47762, 0, "u"], + [47763, 0, "n"], + [47764, 0, "i"], + [47765, 0, "q"], + [47766, 0, "u"], + [47767, 0, "e"], + [47768, 0, " "], + [47769, 0, "i"], + [47770, 0, "d"], + [47771, 0, "e"], + [47772, 0, "n"], + [47773, 0, "t"], + [47774, 0, "i"], + [47775, 0, "f"], + [47776, 0, "i"], + [47777, 0, "e"], + [47778, 0, "r"], + [47779, 0, " "], + [47780, 0, "o"], + [47781, 0, "f"], + [47782, 0, " "], + [47783, 0, "t"], + [47784, 0, "h"], + [47785, 0, "e"], + [47786, 0, " "], + [47787, 0, "o"], + [47788, 0, "p"], + [47789, 0, "e"], + [47790, 0, "r"], + [47791, 0, "a"], + [47792, 0, "t"], + [47793, 0, "i"], + [47794, 0, "o"], + [47795, 0, "n"], + [47796, 0, " "], + [47797, 0, "t"], + [47798, 0, "h"], + [47799, 0, "a"], + [47800, 0, "t"], + [47801, 0, " "], + [47802, 0, "i"], + [47803, 0, "n"], + [47804, 0, "s"], + [47805, 0, "e"], + [47806, 0, "r"], + [47807, 0, "t"], + [47808, 0, "e"], + [47809, 0, "d"], + [47810, 0, " "], + [47811, 0, "t"], + [47812, 0, "h"], + [47813, 0, "i"], + [47814, 0, "s"], + [47815, 0, " "], + [47816, 0, "l"], + [47817, 0, "i"], + [47818, 0, "s"], + [47819, 0, "t"], + [47820, 0, " "], + [47821, 0, "e"], + [47822, 0, "l"], + [47823, 0, "e"], + [47824, 0, "m"], + [47825, 0, "e"], + [47826, 0, "n"], + [47827, 0, "t"], + [47828, 0, " "], + [47829, 0, "("], + [47830, 0, "w"], + [47831, 0, "e"], + [47832, 0, " "], + [47833, 0, "w"], + [47834, 0, "i"], + [47835, 0, "l"], + [47836, 0, "l"], + [47837, 0, " "], + [47838, 0, "d"], + [47839, 0, "i"], + [47840, 0, "s"], + [47841, 0, "c"], + [47842, 0, "u"], + [47843, 0, "s"], + [47844, 0, "s"], + [47845, 0, " "], + [47846, 0, "i"], + [47847, 0, "n"], + [47848, 0, " "], + [47849, 0, "S"], + [47850, 0, "e"], + [47851, 0, "c"], + [47852, 0, "t"], + [47853, 0, "i"], + [47854, 0, "o"], + [47855, 0, "n"], + [47856, 0, "~"], + [47857, 0, "\\"], + [47858, 0, "r"], + [47859, 0, "e"], + [47860, 0, "f"], + [47861, 0, "{"], + [47862, 0, "s"], + [47863, 0, "e"], + [47864, 0, "c"], + [47865, 0, ":"], + [47866, 0, "l"], + [47867, 0, "a"], + [47868, 0, "m"], + [47869, 0, "p"], + [47870, 0, "o"], + [47871, 0, "r"], + [47872, 0, "t"], + [47873, 0, "-"], + [47874, 0, "t"], + [47875, 0, "s"], + [47876, 0, "}"], + [47877, 0, " "], + [47878, 0, "h"], + [47879, 0, "o"], + [47880, 0, "w"], + [47881, 0, " "], + [47882, 0, "t"], + [47883, 0, "o"], + [47884, 0, " "], + [47885, 0, "g"], + [47886, 0, "e"], + [47887, 0, "n"], + [47888, 0, "e"], + [47889, 0, "r"], + [47890, 0, "a"], + [47891, 0, "t"], + [47892, 0, "e"], + [47893, 0, " "], + [47894, 0, "t"], + [47895, 0, "h"], + [47896, 0, "e"], + [47897, 0, "s"], + [47898, 0, "e"], + [47899, 0, " "], + [47900, 0, "i"], + [47901, 0, "d"], + [47902, 0, "e"], + [47903, 0, "n"], + [47904, 0, "t"], + [47905, 0, "i"], + [47906, 0, "f"], + [47907, 0, "i"], + [47908, 0, "e"], + [47909, 0, "r"], + [47910, 0, "s"], + [47911, 0, ")"], + [47914, 1], + [47914, 1], + [47914, 0, "T"], + [47915, 0, "h"], + [47916, 0, "e"], + [47917, 0, " "], + [47918, 0, "c"], + [47919, 0, "u"], + [47920, 0, "r"], + [47921, 0, "s"], + [47922, 0, "o"], + [47923, 0, "r"], + [48186, 1], + [48185, 1], + [48184, 1], + [48183, 1], + [48183, 0, "t"], + [48184, 0, "h"], + [48185, 0, "a"], + [48186, 0, "t"], + [48187, 0, " "], + [48188, 0, "h"], + [48189, 0, "a"], + [48190, 0, "s"], + [48629, 0, " "], + [48630, 0, "b"], + [48631, 0, "e"], + [48632, 0, "i"], + [48633, 0, "n"], + [48634, 0, "g"], + [48635, 0, " "], + [48636, 0, "t"], + [48637, 0, "r"], + [48638, 0, "a"], + [48639, 0, "v"], + [48640, 0, "e"], + [48641, 0, "r"], + [48642, 0, "s"], + [48643, 0, "e"], + [48644, 0, "d"], + [49333, 0, " "], + [49334, 0, "r"], + [49335, 0, "u"], + [49336, 0, "l"], + [49337, 0, "e"], + [49338, 0, "s"], + [49340, 0, "$"], + [49353, 0, "="], + [49354, 0, "="], + [49354, 1], + [49353, 1], + [49352, 1], + [49351, 1], + [49350, 1], + [49350, 0, "d"], + [49351, 0, "x"], + [49353, 0, "_"], + [49354, 0, "{"], + [49355, 0, "1"], + [49356, 0, "\\"], + [49356, 1], + [49356, 0, " "], + [49357, 0, "\\"], + [49358, 0, "d"], + [49359, 0, "o"], + [49360, 0, "t"], + [49361, 0, "s"], + [49362, 0, " "], + [49363, 0, "5"], + [49364, 0, "}"], + [49365, 0, "$"], + [49366, 0, " "], + [49367, 0, "d"], + [49368, 0, "e"], + [49369, 0, "f"], + [49370, 0, "i"], + [49371, 0, "n"], + [49372, 0, "e"], + [49373, 0, " "], + [49374, 0, "h"], + [49375, 0, "o"], + [49376, 0, "w"], + [49377, 0, " "], + [49378, 0, "t"], + [49379, 0, "o"], + [49380, 0, " "], + [49381, 0, "e"], + [49382, 0, "v"], + [49383, 0, "a"], + [49384, 0, "l"], + [49385, 0, "u"], + [49386, 0, "a"], + [49387, 0, "t"], + [49388, 0, "e"], + [49389, 0, " "], + [49390, 0, "t"], + [49391, 0, "h"], + [49392, 0, "e"], + [49393, 0, " "], + [49394, 0, "e"], + [49395, 0, "x"], + [49396, 0, "p"], + [49397, 0, "r"], + [49398, 0, "e"], + [49399, 0, "s"], + [49400, 0, "s"], + [49401, 0, "i"], + [49402, 0, "o"], + [49403, 0, "n"], + [49404, 0, " "], + [49405, 0, "\\"], + [49406, 0, "v"], + [49407, 0, "e"], + [49408, 0, "r"], + [49409, 0, "b"], + [49410, 0, "|"], + [49411, 0, "d"], + [49412, 0, "o"], + [49413, 0, "c"], + [49414, 0, "."], + [49415, 0, "i"], + [49416, 0, "d"], + [49417, 0, "x"], + [49418, 0, "("], + [49419, 0, "|"], + [49420, 0, "$"], + [49421, 0, "n"], + [49422, 0, "$"], + [49422, 1], + [49422, 0, "$"], + [49423, 0, "\\"], + [49424, 0, "v"], + [49425, 0, "e"], + [49426, 0, "r"], + [49427, 0, "b"], + [49428, 0, "|"], + [49429, 0, ")"], + [49430, 0, "|"], + [49431, 0, "\n"], + [49432, 0, "\n"], + [49431, 0, ","], + [49432, 0, " "], + [49433, 0, "m"], + [49434, 0, "o"], + [49435, 0, "v"], + [49436, 0, "i"], + [49437, 0, "n"], + [49438, 0, "g"], + [49439, 0, " "], + [49440, 0, "t"], + [49441, 0, "h"], + [49442, 0, "e"], + [49443, 0, " "], + [49444, 0, "c"], + [49445, 0, "u"], + [49446, 0, "r"], + [49447, 0, "s"], + [49448, 0, "o"], + [49449, 0, "r"], + [49450, 0, " "], + [49451, 0, "t"], + [49452, 0, "o"], + [49453, 0, " "], + [49454, 0, "a"], + [49455, 0, " "], + [49456, 0, "p"], + [49457, 0, "a"], + [49458, 0, "r"], + [49459, 0, "t"], + [49460, 0, "i"], + [49461, 0, "c"], + [49462, 0, "u"], + [49463, 0, "l"], + [49464, 0, "a"], + [49465, 0, "r"], + [49466, 0, " "], + [49467, 0, "e"], + [49468, 0, "l"], + [49469, 0, "e"], + [49470, 0, "m"], + [49471, 0, "e"], + [49472, 0, "n"], + [49473, 0, "t"], + [49474, 0, " "], + [49475, 0, "o"], + [49476, 0, "f"], + [49477, 0, " "], + [49478, 0, "a"], + [49479, 0, " "], + [49480, 0, "l"], + [49481, 0, "i"], + [49482, 0, "s"], + [49483, 0, "t"], + [49484, 0, "."], + [49485, 0, " "], + [49486, 0, "F"], + [49487, 0, "i"], + [49488, 0, "r"], + [49489, 0, "s"], + [49490, 0, "t"], + [49491, 0, ","], + [49492, 0, " "], + [49493, 0, "\\"], + [49493, 1], + [49493, 0, "$"], + [49494, 0, "\\"], + [49495, 0, "t"], + [49496, 0, "e"], + [49497, 0, "x"], + [49498, 0, "t"], + [49499, 0, "s"], + [49500, 0, "c"], + [49501, 0, "{"], + [49502, 0, "I"], + [49503, 0, "d"], + [49504, 0, "x"], + [49505, 0, "}"], + [49506, 0, "_"], + [49507, 0, "1"], + [49508, 0, "$"], + [49509, 0, " "], + [49510, 0, "c"], + [49511, 0, "o"], + [49512, 0, "n"], + [49513, 0, "s"], + [49514, 0, "t"], + [49515, 0, "r"], + [49516, 0, "u"], + [49517, 0, "c"], + [49518, 0, "t"], + [49519, 0, "s"], + [49520, 0, " "], + [49521, 0, "a"], + [49522, 0, " "], + [49523, 0, "c"], + [49524, 0, "u"], + [49525, 0, "r"], + [49526, 0, "s"], + [49527, 0, "o"], + [49528, 0, "r"], + [49529, 0, " "], + [49530, 0, "r"], + [49531, 0, "e"], + [49532, 0, "p"], + [49533, 0, "r"], + [49534, 0, "e"], + [49535, 0, "s"], + [49536, 0, "e"], + [49537, 0, "n"], + [49538, 0, "t"], + [49539, 0, "i"], + [49540, 0, "n"], + [49541, 0, "g"], + [49542, 0, " "], + [49543, 0, "t"], + [49544, 0, "h"], + [49545, 0, "e"], + [49546, 0, " "], + [49547, 0, "h"], + [49548, 0, "e"], + [49549, 0, "a"], + [49550, 0, "d"], + [49551, 0, " "], + [49552, 0, "o"], + [49553, 0, "f"], + [49554, 0, " "], + [49555, 0, "t"], + [49556, 0, "h"], + [49557, 0, "e"], + [49558, 0, " "], + [49559, 0, "l"], + [49560, 0, "i"], + [49561, 0, "s"], + [49562, 0, "t"], + [49563, 0, ","], + [49564, 0, " "], + [49492, 1], + [49491, 1], + [49490, 1], + [49489, 1], + [49488, 1], + [49487, 1], + [49486, 1], + [49558, 0, "a"], + [49559, 0, "n"], + [49560, 0, "d"], + [49561, 0, " "], + [49562, 0, "d"], + [49563, 0, "e"], + [49564, 0, "l"], + [49565, 0, "e"], + [49566, 0, "g"], + [49567, 0, "a"], + [49568, 0, "t"], + [49569, 0, "e"], + [49570, 0, "s"], + [49571, 0, " "], + [49572, 0, "t"], + [49573, 0, "o"], + [49574, 0, " "], + [49575, 0, "t"], + [49576, 0, "h"], + [49577, 0, "e"], + [49578, 0, " "], + [49579, 0, "s"], + [49580, 0, "u"], + [49581, 0, "b"], + [49582, 0, "s"], + [49583, 0, "e"], + [49584, 0, "q"], + [49585, 0, "u"], + [49586, 0, "e"], + [49587, 0, "n"], + [49588, 0, "t"], + [49589, 0, " "], + [49590, 0, "r"], + [49591, 0, "u"], + [49592, 0, "l"], + [49593, 0, "e"], + [49594, 0, "s"], + [49595, 0, " "], + [49596, 0, "t"], + [49597, 0, "o"], + [49598, 0, " "], + [49599, 0, "s"], + [49600, 0, "c"], + [49601, 0, "a"], + [49602, 0, "n"], + [49603, 0, " "], + [49604, 0, "o"], + [49605, 0, "v"], + [49606, 0, "e"], + [49607, 0, "r"], + [49608, 0, " "], + [49609, 0, "t"], + [49610, 0, "h"], + [49611, 0, "e"], + [49612, 0, " "], + [49613, 0, "l"], + [49614, 0, "i"], + [49615, 0, "s"], + [49616, 0, "t"], + [49617, 0, "."], + [49618, 0, " "], + [49619, 0, "$"], + [49620, 0, "\\"], + [49621, 0, "t"], + [49622, 0, "e"], + [49623, 0, "x"], + [49624, 0, "t"], + [49625, 0, "s"], + [49626, 0, "c"], + [49627, 0, "{"], + [49628, 0, "I"], + [49629, 0, "d"], + [49630, 0, "x"], + [49631, 0, "}"], + [49632, 0, "_"], + [49633, 0, "2"], + [49634, 0, "$"], + [49635, 0, " "], + [49636, 0, "r"], + [49637, 0, "e"], + [49638, 0, "c"], + [49639, 0, "u"], + [49640, 0, "r"], + [49641, 0, "s"], + [49642, 0, "i"], + [49643, 0, "v"], + [49644, 0, "e"], + [49645, 0, "l"], + [49646, 0, "y"], + [49647, 0, " "], + [49648, 0, "d"], + [49649, 0, "e"], + [49650, 0, "s"], + [49651, 0, "c"], + [49652, 0, "e"], + [49653, 0, "n"], + [49654, 0, "d"], + [49655, 0, "s"], + [49656, 0, " "], + [49657, 0, "t"], + [49658, 0, "h"], + [49659, 0, "e"], + [49660, 0, " "], + [49661, 0, "l"], + [49662, 0, "o"], + [49663, 0, "c"], + [49664, 0, "a"], + [49665, 0, "l"], + [49666, 0, " "], + [49667, 0, "s"], + [49668, 0, "t"], + [49669, 0, "a"], + [49670, 0, "t"], + [49671, 0, "e"], + [49672, 0, " "], + [49673, 0, "a"], + [49674, 0, "c"], + [49675, 0, "c"], + [49676, 0, "o"], + [49677, 0, "r"], + [49678, 0, "d"], + [49679, 0, "i"], + [49680, 0, "n"], + [49681, 0, "g"], + [49682, 0, " "], + [49683, 0, "t"], + [49684, 0, "o"], + [49685, 0, " "], + [49686, 0, "t"], + [49687, 0, "h"], + [49688, 0, "e"], + [49689, 0, " "], + [49690, 0, "v"], + [49691, 0, "e"], + [49692, 0, "c"], + [49693, 0, "t"], + [49694, 0, "o"], + [49695, 0, "r"], + [49696, 0, " "], + [49697, 0, "o"], + [49698, 0, "f"], + [49699, 0, " "], + [49700, 0, "k"], + [49701, 0, "e"], + [49702, 0, "y"], + [49703, 0, "s"], + [49704, 0, " "], + [49705, 0, "i"], + [49706, 0, "n"], + [49707, 0, " "], + [49708, 0, "t"], + [49709, 0, "h"], + [49710, 0, "e"], + [49711, 0, " "], + [49712, 0, "c"], + [49713, 0, "u"], + [49714, 0, "r"], + [49715, 0, "s"], + [49716, 0, "o"], + [49717, 0, "r"], + [49718, 0, "."], + [49719, 0, " "], + [49720, 0, "W"], + [49721, 0, "h"], + [49722, 0, "e"], + [49723, 0, "n"], + [49724, 0, " "], + [49725, 0, "t"], + [49726, 0, "h"], + [49727, 0, "e"], + [49728, 0, " "], + [49729, 0, "v"], + [49730, 0, "e"], + [49731, 0, "c"], + [49732, 0, "t"], + [49733, 0, "o"], + [49734, 0, "r"], + [49735, 0, " "], + [49736, 0, "o"], + [49737, 0, "f"], + [49738, 0, " "], + [49739, 0, "k"], + [49740, 0, "e"], + [49741, 0, "y"], + [49742, 0, "s"], + [49743, 0, " "], + [49744, 0, "i"], + [49745, 0, "s"], + [49746, 0, " "], + [49747, 0, "e"], + [49748, 0, "m"], + [49749, 0, "p"], + [49750, 0, "t"], + [49751, 0, "y"], + [49752, 0, ","], + [49753, 0, " "], + [49754, 0, "t"], + [49755, 0, "h"], + [49756, 0, "e"], + [49757, 0, " "], + [49758, 0, "c"], + [49759, 0, "o"], + [49760, 0, "n"], + [49761, 0, "t"], + [49762, 0, "e"], + [49763, 0, "x"], + [49764, 0, "t"], + [49765, 0, " "], + [49766, 0, "$"], + [49767, 0, "\\"], + [49768, 0, "m"], + [49769, 0, "a"], + [49770, 0, "t"], + [49771, 0, "h"], + [49772, 0, "i"], + [49773, 0, "t"], + [49774, 0, "{"], + [49775, 0, "c"], + [49776, 0, "t"], + [49777, 0, "x"], + [49778, 0, "}"], + [49779, 0, "$"], + [49780, 0, " "], + [49781, 0, "i"], + [49782, 0, "s"], + [49783, 0, " "], + [49784, 0, "t"], + [49785, 0, "h"], + [49786, 0, "e"], + [49787, 0, " "], + [49788, 0, "s"], + [49789, 0, "u"], + [49790, 0, "b"], + [49791, 0, "t"], + [49792, 0, "r"], + [49793, 0, "e"], + [49794, 0, "e"], + [49795, 0, " "], + [49796, 0, "o"], + [49797, 0, "f"], + [49798, 0, " "], + [49799, 0, "$"], + [49800, 0, "A"], + [49801, 0, "_"], + [49802, 0, "p"], + [49803, 0, "$"], + [49804, 0, " "], + [49805, 0, "r"], + [49806, 0, "e"], + [49807, 0, "p"], + [49808, 0, "r"], + [49809, 0, "e"], + [49810, 0, "s"], + [49811, 0, "e"], + [49812, 0, "n"], + [49813, 0, "t"], + [49814, 0, "i"], + [49815, 0, "n"], + [49816, 0, "g"], + [49817, 0, " "], + [49817, 1], + [49816, 1], + [49815, 1], + [49814, 1], + [49813, 1], + [49812, 1], + [49811, 1], + [49810, 1], + [49809, 1], + [49808, 1], + [49807, 1], + [49806, 1], + [49805, 1], + [49805, 0, "t"], + [49806, 0, "h"], + [49807, 0, "a"], + [49808, 0, "t"], + [49809, 0, " "], + [49810, 0, "s"], + [49811, 0, "t"], + [49812, 0, "o"], + [49813, 0, "r"], + [49814, 0, "e"], + [49815, 0, "s"], + [49816, 0, " "], + [49817, 0, "t"], + [49818, 0, "h"], + [49819, 0, "e"], + [49820, 0, " "], + [49821, 0, "l"], + [49822, 0, "i"], + [49823, 0, "s"], + [49824, 0, "t"], + [49825, 0, " "], + [49826, 0, "i"], + [49827, 0, "n"], + [49828, 0, " "], + [49829, 0, "q"], + [49830, 0, "u"], + [49831, 0, "e"], + [49832, 0, "s"], + [49833, 0, "t"], + [49834, 0, "i"], + [49835, 0, "o"], + [49836, 0, "n"], + [49837, 0, ","], + [49838, 0, " "], + [49839, 0, "a"], + [49840, 0, "n"], + [49841, 0, "d"], + [49842, 0, " "], + [49843, 0, "t"], + [49844, 0, "h"], + [49845, 0, "e"], + [49846, 0, " "], + [49847, 0, "r"], + [49848, 0, "u"], + [49849, 0, "l"], + [49850, 0, "e"], + [49851, 0, "s"], + [49852, 0, " "], + [49853, 0, "$"], + [49854, 0, "\\"], + [49855, 0, "t"], + [49856, 0, "e"], + [49857, 0, "x"], + [49858, 0, "t"], + [49859, 0, "s"], + [49860, 0, "c"], + [49861, 0, "{"], + [49862, 0, "I"], + [49863, 0, "d"], + [49864, 0, "x"], + [49865, 0, "}"], + [49866, 0, "_"], + [49867, 0, "{"], + [49868, 0, "3"], + [49869, 0, ","], + [49870, 0, "4"], + [49871, 0, ","], + [49872, 0, "5"], + [49873, 0, "}"], + [49874, 0, "$"], + [49875, 0, " "], + [49876, 0, "i"], + [49877, 0, "t"], + [49878, 0, "e"], + [49879, 0, "r"], + [49880, 0, "a"], + [49881, 0, "t"], + [49882, 0, "e"], + [49883, 0, " "], + [49884, 0, "o"], + [49885, 0, "v"], + [49886, 0, "e"], + [49887, 0, "r"], + [49888, 0, " "], + [49889, 0, "t"], + [49890, 0, "h"], + [49891, 0, "a"], + [49892, 0, "t"], + [49893, 0, " "], + [49894, 0, "l"], + [49895, 0, "i"], + [49896, 0, "s"], + [49897, 0, "t"], + [49898, 0, " "], + [49899, 0, "u"], + [49900, 0, "n"], + [49901, 0, "t"], + [49902, 0, "i"], + [49903, 0, "l"], + [49904, 0, " "], + [49905, 0, "t"], + [49906, 0, "h"], + [49907, 0, "e"], + [49908, 0, " "], + [49909, 0, "d"], + [49910, 0, "e"], + [49911, 0, "s"], + [49912, 0, "i"], + [49913, 0, "r"], + [49914, 0, "e"], + [49915, 0, "d"], + [49916, 0, " "], + [49917, 0, "e"], + [49918, 0, "l"], + [49919, 0, "e"], + [49920, 0, "m"], + [49921, 0, "e"], + [49922, 0, "n"], + [49923, 0, "t"], + [49924, 0, " "], + [49925, 0, "i"], + [49926, 0, "s"], + [49927, 0, " "], + [49928, 0, "f"], + [49929, 0, "i"], + [49930, 0, "n"], + [49930, 1], + [49929, 1], + [49929, 0, "o"], + [49930, 0, "u"], + [49931, 0, "n"], + [49932, 0, "d"], + [49933, 0, "."], + [49934, 0, "\n"], + [49935, 0, "\n"], + [49936, 0, "$"], + [49937, 0, "\\"], + [49938, 0, "t"], + [49939, 0, "e"], + [49940, 0, "x"], + [49941, 0, "t"], + [49942, 0, "s"], + [49943, 0, "c"], + [49944, 0, "{"], + [49945, 0, "I"], + [49946, 0, "d"], + [49947, 0, "x"], + [49948, 0, "}"], + [49949, 0, "_"], + [49950, 0, "5"], + [49951, 0, "$"], + [49952, 0, " "], + [49953, 0, "t"], + [49954, 0, "e"], + [49955, 0, "r"], + [49956, 0, "m"], + [49957, 0, "i"], + [49958, 0, "n"], + [49959, 0, "a"], + [49960, 0, "t"], + [49961, 0, "e"], + [49962, 0, "s"], + [49963, 0, " "], + [49964, 0, "t"], + [49965, 0, "h"], + [49966, 0, "e"], + [49967, 0, " "], + [49968, 0, "i"], + [49969, 0, "t"], + [49970, 0, "e"], + [49971, 0, "r"], + [49972, 0, "a"], + [49973, 0, "t"], + [49974, 0, "i"], + [49975, 0, "o"], + [49976, 0, "n"], + [49977, 0, " "], + [49978, 0, "w"], + [49979, 0, "h"], + [49980, 0, "e"], + [49981, 0, "n"], + [49982, 0, " "], + [49983, 0, "t"], + [49984, 0, "h"], + [49985, 0, "e"], + [49986, 0, " "], + [49987, 0, "i"], + [49988, 0, "n"], + [49989, 0, "d"], + [49990, 0, "e"], + [49991, 0, "x"], + [49992, 0, " "], + [49993, 0, "r"], + [49994, 0, "e"], + [49995, 0, "a"], + [49996, 0, "c"], + [49997, 0, "h"], + [49998, 0, "e"], + [49999, 0, "s"], + [50000, 0, " "], + [50001, 0, "z"], + [50002, 0, "e"], + [50003, 0, "r"], + [50004, 0, "o"], + [50005, 0, ","], + [50006, 0, " "], + [50007, 0, "w"], + [50008, 0, "h"], + [50009, 0, "i"], + [50010, 0, "l"], + [50011, 0, "e"], + [50012, 0, " "], + [50013, 0, "$"], + [50014, 0, "\\"], + [50015, 0, "t"], + [50016, 0, "e"], + [50017, 0, "x"], + [50018, 0, "t"], + [50019, 0, "s"], + [50020, 0, "c"], + [50021, 0, "{"], + [50022, 0, "I"], + [50023, 0, "d"], + [50024, 0, "x"], + [50025, 0, "}"], + [50026, 0, "_"], + [50027, 0, "3"], + [50028, 0, "$"], + [50029, 0, " "], + [50030, 0, "m"], + [50031, 0, "o"], + [50032, 0, "v"], + [50033, 0, "e"], + [50034, 0, "s"], + [50035, 0, " "], + [50036, 0, "t"], + [50037, 0, "o"], + [50038, 0, " "], + [50039, 0, "t"], + [50040, 0, "h"], + [50041, 0, "e"], + [50042, 0, " "], + [50043, 0, "n"], + [50044, 0, "e"], + [50045, 0, "x"], + [50046, 0, "t"], + [50047, 0, " "], + [50048, 0, "e"], + [50049, 0, "l"], + [50050, 0, "e"], + [50051, 0, "m"], + [50052, 0, "e"], + [50053, 0, "n"], + [50054, 0, "t"], + [50055, 0, " "], + [50056, 0, "a"], + [50057, 0, "n"], + [50058, 0, "d"], + [50059, 0, " "], + [50060, 0, "d"], + [50061, 0, "e"], + [50062, 0, "c"], + [50063, 0, "r"], + [50064, 0, "e"], + [50065, 0, "m"], + [50066, 0, "e"], + [50067, 0, "n"], + [50068, 0, "t"], + [50069, 0, "s"], + [50070, 0, " "], + [50071, 0, "t"], + [50072, 0, "h"], + [50073, 0, "e"], + [50074, 0, " "], + [50075, 0, "i"], + [50076, 0, "n"], + [50077, 0, "d"], + [50078, 0, "e"], + [50079, 0, "x"], + [50080, 0, ","], + [50081, 0, " "], + [50082, 0, "a"], + [50083, 0, "n"], + [50084, 0, "d"], + [50085, 0, " "], + [50086, 0, "$"], + [50087, 0, "\\"], + [50088, 0, "t"], + [50089, 0, "e"], + [50090, 0, "x"], + [50091, 0, "t"], + [50092, 0, "s"], + [50093, 0, "c"], + [50094, 0, "{"], + [50095, 0, "I"], + [50096, 0, "d"], + [50097, 0, "x"], + [50098, 0, "}"], + [50099, 0, "_"], + [50100, 0, "4"], + [50101, 0, "$"], + [50102, 0, " "], + [50103, 0, "s"], + [50104, 0, "k"], + [50105, 0, "i"], + [50106, 0, "p"], + [50107, 0, "s"], + [50108, 0, " "], + [50109, 0, "o"], + [50110, 0, "v"], + [50111, 0, "e"], + [50112, 0, "r"], + [50113, 0, " "], + [50114, 0, "d"], + [50115, 0, "e"], + [50116, 0, "l"], + [50117, 0, "e"], + [50118, 0, "t"], + [50119, 0, "e"], + [50120, 0, "d"], + [50121, 0, " "], + [50122, 0, "l"], + [50123, 0, "i"], + [50124, 0, "s"], + [50125, 0, "t"], + [50126, 0, " "], + [50127, 0, "e"], + [50128, 0, "l"], + [50129, 0, "e"], + [50130, 0, "m"], + [50131, 0, "e"], + [50132, 0, "n"], + [50133, 0, "t"], + [50134, 0, "s"], + [50135, 0, "."], + [50136, 0, " "], + [50137, 0, "T"], + [50138, 0, "h"], + [50139, 0, "e"], + [50140, 0, " "], + [50141, 0, "l"], + [50142, 0, "i"], + [50143, 0, "s"], + [50144, 0, "t"], + [50145, 0, " "], + [50146, 0, "s"], + [50147, 0, "t"], + [50148, 0, "r"], + [50149, 0, "u"], + [50150, 0, "c"], + [50151, 0, "t"], + [50152, 0, "u"], + [50153, 0, "r"], + [50154, 0, "e"], + [50155, 0, " "], + [50156, 0, "r"], + [50157, 0, "e"], + [50158, 0, "s"], + [50159, 0, "e"], + [50160, 0, "m"], + [50161, 0, "b"], + [50162, 0, "l"], + [50163, 0, "e"], + [50164, 0, "d"], + [50164, 1], + [50164, 0, "s"], + [50165, 0, " "], + [50166, 0, "a"], + [50167, 0, " "], + [50168, 0, "l"], + [50169, 0, "i"], + [50170, 0, "n"], + [50171, 0, "k"], + [50172, 0, "e"], + [50173, 0, "d"], + [50174, 0, " "], + [50175, 0, "l"], + [50176, 0, "i"], + [50177, 0, "s"], + [50178, 0, "t"], + [50145, 1], + [50144, 1], + [50143, 1], + [50142, 1], + [50141, 1], + [50174, 0, ":"], + [50175, 0, " "], + [50176, 0, "e"], + [50177, 0, "a"], + [50178, 0, "c"], + [50179, 0, "h"], + [50180, 0, " "], + [50181, 0, "l"], + [50182, 0, "i"], + [50183, 0, "s"], + [50184, 0, "t"], + [50185, 0, " "], + [50186, 0, "e"], + [50187, 0, "l"], + [50188, 0, "e"], + [50189, 0, "m"], + [50190, 0, "e"], + [50191, 0, "n"], + [50192, 0, "t"], + [50193, 0, " "], + [50194, 0, "h"], + [50195, 0, "a"], + [50196, 0, "s"], + [50197, 0, " "], + [50198, 0, "a"], + [50199, 0, " "], + [50200, 0, "u"], + [50201, 0, "n"], + [50202, 0, "i"], + [50203, 0, "q"], + [50204, 0, "u"], + [50205, 0, "e"], + [50206, 0, " "], + [50207, 0, "i"], + [50208, 0, "d"], + [50209, 0, "e"], + [50210, 0, "n"], + [50211, 0, "t"], + [50212, 0, "i"], + [50213, 0, "f"], + [50214, 0, "i"], + [50215, 0, "e"], + [50216, 0, "r"], + [50217, 0, " "], + [50218, 0, "$"], + [50219, 0, "k"], + [50220, 0, "$"], + [50221, 0, ","], + [50222, 0, " "], + [50223, 0, "a"], + [50224, 0, "n"], + [50225, 0, "d"], + [50226, 0, " "], + [50227, 0, "t"], + [50228, 0, "h"], + [50229, 0, "e"], + [50230, 0, " "], + [50231, 0, "p"], + [50232, 0, "a"], + [50233, 0, "r"], + [50234, 0, "t"], + [50235, 0, "i"], + [50236, 0, "a"], + [50237, 0, "l"], + [50238, 0, " "], + [50239, 0, "f"], + [50240, 0, "u"], + [50241, 0, "n"], + [50242, 0, "c"], + [50243, 0, "t"], + [50244, 0, "i"], + [50245, 0, "o"], + [50246, 0, "n"], + [50247, 0, " "], + [50248, 0, "r"], + [50249, 0, "e"], + [50250, 0, "p"], + [50251, 0, "r"], + [50252, 0, "e"], + [50253, 0, "s"], + [50254, 0, "e"], + [50255, 0, "n"], + [50256, 0, "t"], + [50257, 0, "i"], + [50258, 0, "n"], + [50259, 0, "g"], + [50260, 0, " "], + [50261, 0, "l"], + [50262, 0, "o"], + [50263, 0, "c"], + [50264, 0, "a"], + [50265, 0, "l"], + [50266, 0, " "], + [50267, 0, "s"], + [50268, 0, "t"], + [50269, 0, "a"], + [50270, 0, "t"], + [50271, 0, "e"], + [50272, 0, " "], + [50273, 0, "m"], + [50274, 0, "a"], + [50275, 0, "s"], + [50275, 1], + [50275, 0, "p"], + [50276, 0, "s"], + [50277, 0, " "], + [50278, 0, "$"], + [50279, 0, "\\"], + [50280, 0, "m"], + [50281, 0, "a"], + [50282, 0, "t"], + [50283, 0, "h"], + [50284, 0, "s"], + [50285, 0, "f"], + [50286, 0, "{"], + [50287, 0, "n"], + [50288, 0, "e"], + [50289, 0, "x"], + [50290, 0, "t"], + [50291, 0, "}"], + [50292, 0, "("], + [50293, 0, "k"], + [50294, 0, ")"], + [50295, 0, "$"], + [50296, 0, " "], + [50297, 0, "t"], + [50298, 0, "o"], + [50299, 0, " "], + [50300, 0, "t"], + [50301, 0, "h"], + [50302, 0, "e"], + [50303, 0, " "], + [50304, 0, "I"], + [50305, 0, "D"], + [50306, 0, " "], + [50307, 0, "o"], + [50308, 0, "f"], + [50309, 0, " "], + [50310, 0, "t"], + [50311, 0, "h"], + [50312, 0, "e"], + [50313, 0, " "], + [50314, 0, "l"], + [50315, 0, "i"], + [50316, 0, "s"], + [50317, 0, "t"], + [50318, 0, " "], + [50319, 0, "e"], + [50320, 0, "l"], + [50321, 0, "e"], + [50322, 0, "m"], + [50323, 0, "e"], + [50324, 0, "n"], + [50325, 0, "t"], + [50326, 0, " "], + [50327, 0, "t"], + [50328, 0, "h"], + [50329, 0, "a"], + [50330, 0, "t"], + [50331, 0, " "], + [50332, 0, "f"], + [50333, 0, "o"], + [50334, 0, "l"], + [50335, 0, "l"], + [50336, 0, "o"], + [50337, 0, "w"], + [50338, 0, "s"], + [50339, 0, " "], + [50340, 0, "$"], + [50341, 0, "k"], + [50342, 0, "$"], + [50343, 0, "."], + [50344, 0, " "], + [50345, 0, "W"], + [50346, 0, "h"], + [50347, 0, "e"], + [50348, 0, "n"], + [50349, 0, " "], + [50350, 0, "a"], + [50351, 0, " "], + [50352, 0, "l"], + [50353, 0, "i"], + [50354, 0, "s"], + [50355, 0, "t"], + [50356, 0, " "], + [50356, 1], + [50355, 1], + [50354, 1], + [50353, 1], + [50352, 1], + [50351, 1], + [50350, 1], + [50349, 1], + [50348, 1], + [50347, 1], + [50346, 1], + [50345, 1], + [50345, 0, "E"], + [50346, 0, "a"], + [50347, 0, "c"], + [50348, 0, "h"], + [50349, 0, " "], + [50350, 0, "l"], + [50351, 0, "i"], + [50352, 0, "s"], + [50353, 0, "t"], + [50354, 0, " "], + [50355, 0, "e"], + [50356, 0, "l"], + [50357, 0, "e"], + [50358, 0, "m"], + [50359, 0, "m"], + [50360, 0, "e"], + [50361, 0, "n"], + [50362, 0, "t"], + [50362, 1], + [50361, 1], + [50360, 1], + [50359, 1], + [50359, 0, "e"], + [50360, 0, "n"], + [50361, 0, "b"], + [50362, 0, "t"], + [50363, 0, " "], + [50363, 1], + [50362, 1], + [50361, 1], + [50361, 0, "t"], + [50362, 0, " "], + [50363, 0, "a"], + [50364, 0, "l"], + [50365, 0, "s"], + [50366, 0, "o"], + [50367, 0, " "], + [50368, 0, "h"], + [50369, 0, "a"], + [50370, 0, "s"], + [50371, 0, " "], + [50121, 1], + [50120, 1], + [50119, 1], + [50118, 1], + [50117, 1], + [50116, 1], + [50115, 1], + [50114, 1], + [50127, 0, " "], + [50128, 0, "t"], + [50129, 0, "h"], + [50130, 0, "a"], + [50131, 0, "t"], + [50132, 0, " "], + [50133, 0, "a"], + [50134, 0, "r"], + [50135, 0, "e"], + [50136, 0, " "], + [50137, 0, "m"], + [50138, 0, "a"], + [50139, 0, "r"], + [50140, 0, "k"], + [50141, 0, "e"], + [50142, 0, "d"], + [50143, 0, " "], + [50144, 0, "a"], + [50145, 0, "s"], + [50146, 0, " "], + [50147, 0, "d"], + [50148, 0, "e"], + [50149, 0, "l"], + [50150, 0, "e"], + [50151, 0, "t"], + [50152, 0, "e"], + [50153, 0, "d"], + [50363, 0, " "], + [50364, 0, "D"], + [50365, 0, "e"], + [50366, 0, "l"], + [50367, 0, "e"], + [50368, 0, "t"], + [50369, 0, "e"], + [50370, 0, "d"], + [50371, 0, " "], + [50372, 0, "l"], + [50373, 0, "i"], + [50374, 0, "s"], + [50375, 0, "t"], + [50376, 0, " "], + [50377, 0, "e"], + [50378, 0, "l"], + [50379, 0, "e"], + [50380, 0, "m"], + [50381, 0, "e"], + [50382, 0, "n"], + [50383, 0, "t"], + [50384, 0, "s"], + [50385, 0, " "], + [50386, 0, "a"], + [50387, 0, "r"], + [50388, 0, "e"], + [50389, 0, " "], + [50390, 0, "n"], + [50391, 0, "e"], + [50392, 0, "v"], + [50393, 0, "e"], + [50394, 0, "r"], + [50395, 0, " "], + [50396, 0, "r"], + [50397, 0, "e"], + [50398, 0, "m"], + [50399, 0, "o"], + [50400, 0, "v"], + [50401, 0, "e"], + [50402, 0, "d"], + [50403, 0, " "], + [50404, 0, "f"], + [50405, 0, "r"], + [50406, 0, "o"], + [50407, 0, "m"], + [50408, 0, " "], + [50409, 0, "t"], + [50410, 0, "h"], + [50411, 0, "e"], + [50375, 1], + [50374, 1], + [50373, 1], + [50372, 1], + [50371, 1], + [50407, 0, " "], + [50408, 0, "l"], + [50409, 0, "i"], + [50410, 0, "n"], + [50411, 0, "k"], + [50412, 0, "e"], + [50413, 0, "d"], + [50414, 0, " "], + [50415, 0, "l"], + [50416, 0, "i"], + [50417, 0, "s"], + [50418, 0, "t"], + [50419, 0, " "], + [50420, 0, "s"], + [50421, 0, "t"], + [50422, 0, "r"], + [50423, 0, "u"], + [50424, 0, "c"], + [50425, 0, "t"], + [50426, 0, "u"], + [50427, 0, "r"], + [50428, 0, "e"], + [50363, 1], + [50363, 0, "\n"], + [50364, 0, "\n"], + [50457, 1], + [50456, 1], + [50455, 1], + [50454, 1], + [50453, 1], + [50452, 1], + [50451, 1], + [50450, 1], + [50449, 1], + [50448, 1], + [50447, 1], + [50446, 1], + [50445, 1], + [50444, 1], + [50443, 1], + [50442, 1], + [50441, 1], + [50440, 1], + [50439, 1], + [50438, 1], + [50437, 1], + [50436, 1], + [50435, 1], + [50434, 1], + [50433, 1], + [50432, 1], + [50431, 1], + [50430, 1], + [50430, 0, ","], + [50431, 0, " "], + [50432, 0, "b"], + [50433, 0, "u"], + [50434, 0, "t"], + [50435, 0, " "], + [50436, 0, "o"], + [50437, 0, "n"], + [50438, 0, "l"], + [50439, 0, "y"], + [50440, 0, " "], + [50441, 0, "m"], + [50442, 0, "a"], + [50443, 0, "r"], + [50444, 0, "k"], + [50445, 0, "e"], + [50446, 0, "d"], + [50447, 0, " "], + [50448, 0, "a"], + [50449, 0, "s"], + [50450, 0, " "], + [50451, 0, "d"], + [50452, 0, "e"], + [50453, 0, "l"], + [50454, 0, "e"], + [50455, 0, "t"], + [50456, 0, "e"], + [50457, 0, "d"], + [50458, 0, "."], + [50459, 0, " "], + [50460, 0, "T"], + [50461, 0, "o"], + [50462, 0, " "], + [50463, 0, "t"], + [50464, 0, "h"], + [50465, 0, "i"], + [50466, 0, "s"], + [50467, 0, " "], + [50468, 0, "e"], + [50469, 0, "n"], + [50470, 0, "d"], + [50471, 0, ","], + [50472, 0, " "], + [50473, 0, "t"], + [50474, 0, "h"], + [50475, 0, "e"], + [50476, 0, " "], + [50477, 0, "l"], + [50478, 0, "o"], + [50479, 0, "c"], + [50480, 0, "a"], + [50481, 0, "l"], + [50482, 0, " "], + [50483, 0, "s"], + [50484, 0, "t"], + [50485, 0, "a"], + [50486, 0, "t"], + [50487, 0, "e"], + [50488, 0, " "], + [50489, 0, "c"], + [50490, 0, "o"], + [50491, 0, "n"], + [50492, 0, "t"], + [50493, 0, "a"], + [50494, 0, "i"], + [50495, 0, "n"], + [50496, 0, "s"], + [50497, 0, " "], + [50498, 0, "a"], + [50499, 0, " "], + [50500, 0, "\\"], + [50501, 0, "e"], + [50502, 0, "m"], + [50503, 0, "p"], + [50504, 0, "h"], + [50505, 0, "{"], + [50506, 0, "p"], + [50507, 0, "r"], + [50508, 0, "e"], + [50509, 0, "s"], + [50510, 0, "e"], + [50511, 0, "n"], + [50512, 0, "c"], + [50513, 0, "e"], + [50514, 0, " "], + [50515, 0, "s"], + [50516, 0, "e"], + [50517, 0, "t"], + [50518, 0, "}"], + [50519, 0, " "], + [50520, 0, "$"], + [50521, 0, "\\"], + [50522, 0, "m"], + [50523, 0, "a"], + [50524, 0, "t"], + [50525, 0, "h"], + [50526, 0, "s"], + [50527, 0, "f"], + [50528, 0, "{"], + [50529, 0, "p"], + [50530, 0, "r"], + [50531, 0, "e"], + [50532, 0, "s"], + [50533, 0, "}"], + [50534, 0, "("], + [50535, 0, "k"], + [50536, 0, ")"], + [50537, 0, "$"], + [50538, 0, " "], + [50539, 0, "f"], + [50540, 0, "o"], + [50541, 0, "r"], + [50542, 0, " "], + [50543, 0, "e"], + [50544, 0, "a"], + [50545, 0, "c"], + [50546, 0, "h"], + [50547, 0, " "], + [50548, 0, "l"], + [50549, 0, "i"], + [50550, 0, "s"], + [50551, 0, "t"], + [50552, 0, " "], + [50553, 0, "e"], + [50554, 0, "l"], + [50555, 0, "e"], + [50556, 0, "m"], + [50557, 0, "e"], + [50558, 0, "n"], + [50559, 0, "t"], + [50560, 0, " "], + [50561, 0, "w"], + [50562, 0, "i"], + [50563, 0, "t"], + [50564, 0, "h"], + [50565, 0, " "], + [50566, 0, "I"], + [50567, 0, "D"], + [50568, 0, " "], + [50569, 0, "$"], + [50570, 0, "k"], + [50571, 0, "$"], + [50572, 0, "."], + [50546, 1], + [50545, 1], + [50544, 1], + [50543, 1], + [50543, 0, "a"], + [50489, 1], + [50489, 1], + [50489, 1], + [50489, 0, "m"], + [50490, 0, "a"], + [50491, 0, "i"], + [50492, 0, "n"], + [50544, 1], + [50544, 0, "t"], + [50545, 0, "h"], + [50546, 0, "e"], + [50573, 0, " "], + [50574, 0, "T"], + [50575, 0, "h"], + [50576, 0, "i"], + [50577, 0, "s"], + [50578, 0, " "], + [50579, 0, "s"], + [50579, 1], + [50578, 1], + [50577, 1], + [50576, 1], + [50575, 1], + [50574, 1], + [50574, 0, "T"], + [50575, 0, "h"], + [50575, 1], + [50574, 1], + [50573, 1], + [50573, 0, " "], + [50574, 0, "I"], + [50575, 0, "t"], + [50576, 0, " "], + [50577, 0, "i"], + [50578, 0, "s"], + [50579, 0, " "], + [50580, 0, "t"], + [50581, 0, "h"], + [50582, 0, "e"], + [50583, 0, " "], + [50584, 0, "s"], + [50585, 0, "e"], + [50586, 0, "t"], + [50587, 0, " "], + [50588, 0, "o"], + [50589, 0, "f"], + [50590, 0, " "], + [50591, 0, "a"], + [50592, 0, "l"], + [50593, 0, "l"], + [50594, 0, " "], + [50595, 0, "o"], + [50596, 0, "p"], + [50597, 0, "e"], + [50598, 0, "r"], + [50599, 0, "a"], + [50600, 0, "t"], + [50601, 0, "i"], + [50602, 0, "o"], + [50603, 0, "n"], + [50604, 0, "s"], + [50605, 0, " "], + [50606, 0, "t"], + [50607, 0, "h"], + [50608, 0, "a"], + [50609, 0, "t"], + [50610, 0, " "], + [50611, 0, "h"], + [50612, 0, "a"], + [50613, 0, "v"], + [50614, 0, "e"], + [50615, 0, " "], + [50616, 0, "a"], + [50617, 0, "s"], + [50618, 0, "s"], + [50619, 0, "e"], + [50620, 0, "r"], + [50621, 0, "t"], + [50622, 0, "e"], + [50623, 0, "d"], + [50624, 0, " "], + [50625, 0, "t"], + [50626, 0, "h"], + [50627, 0, "e"], + [50628, 0, " "], + [50629, 0, "e"], + [50630, 0, "x"], + [50631, 0, "i"], + [50632, 0, "s"], + [50633, 0, "t"], + [50634, 0, "e"], + [50635, 0, "n"], + [50636, 0, "c"], + [50637, 0, "e"], + [50638, 0, " "], + [50639, 0, "o"], + [50640, 0, "f"], + [50641, 0, " "], + [50642, 0, "t"], + [50643, 0, "h"], + [50644, 0, "e"], + [50645, 0, " "], + [50646, 0, "l"], + [50647, 0, "i"], + [50648, 0, "s"], + [50649, 0, "t"], + [50650, 0, " "], + [50651, 0, "e"], + [50652, 0, "l"], + [50653, 0, "e"], + [50654, 0, "m"], + [50655, 0, "e"], + [50656, 0, "n"], + [50657, 0, "t"], + [50658, 0, "."], + [50659, 0, " "], + [50660, 0, "W"], + [50661, 0, "h"], + [50662, 0, "e"], + [50663, 0, "n"], + [50664, 0, " "], + [50665, 0, "a"], + [50666, 0, " "], + [50667, 0, "l"], + [50668, 0, "i"], + [50669, 0, "s"], + [50670, 0, "t"], + [50671, 0, " "], + [50672, 0, "e"], + [50673, 0, "l"], + [50674, 0, "e"], + [50675, 0, "m"], + [50676, 0, "e"], + [50677, 0, "n"], + [50678, 0, "t"], + [50679, 0, " "], + [50680, 0, "i"], + [50681, 0, "s"], + [50682, 0, " "], + [50683, 0, "d"], + [50684, 0, "e"], + [50685, 0, "l"], + [50686, 0, "e"], + [50687, 0, "t"], + [50688, 0, "e"], + [50689, 0, "d"], + [50690, 0, ","], + [50691, 0, " "], + [50692, 0, "t"], + [50693, 0, "h"], + [50694, 0, "e"], + [50695, 0, " "], + [50696, 0, "p"], + [50697, 0, "r"], + [50698, 0, "e"], + [50699, 0, "c"], + [50700, 0, "e"], + [50700, 1], + [50699, 1], + [50699, 0, "s"], + [50700, 0, "e"], + [50701, 0, "n"], + [50702, 0, "c"], + [50703, 0, "e"], + [50704, 0, " "], + [50705, 0, "s"], + [50706, 0, "e"], + [50707, 0, "t"], + [50708, 0, " "], + [50709, 0, "i"], + [50710, 0, "s"], + [50711, 0, " "], + [50712, 0, "s"], + [50713, 0, "e"], + [50714, 0, "t"], + [50715, 0, " "], + [50716, 0, "t"], + [50717, 0, "o"], + [50718, 0, " "], + [50719, 0, "t"], + [50720, 0, "h"], + [50721, 0, "e"], + [50722, 0, " "], + [50723, 0, "e"], + [50724, 0, "m"], + [50725, 0, "p"], + [50726, 0, "t"], + [50727, 0, "y"], + [50728, 0, " "], + [50729, 0, "s"], + [50730, 0, "e"], + [50731, 0, "t"], + [50732, 0, ","], + [50733, 0, " "], + [50734, 0, "m"], + [50735, 0, "a"], + [50736, 0, "r"], + [50737, 0, "k"], + [50738, 0, "i"], + [50739, 0, "n"], + [50740, 0, "g"], + [50741, 0, " "], + [50742, 0, "i"], + [50743, 0, "t"], + [50744, 0, " "], + [50745, 0, "a"], + [50746, 0, "s"], + [50747, 0, " "], + [50748, 0, "d"], + [50749, 0, "e"], + [50750, 0, "l"], + [50751, 0, "e"], + [50752, 0, "t"], + [50753, 0, "e"], + [50754, 0, "d"], + [50755, 0, ";"], + [50756, 0, " "], + [50757, 0, "h"], + [50758, 0, "o"], + [50759, 0, "w"], + [50760, 0, "e"], + [50761, 0, "v"], + [50762, 0, "e"], + [50763, 0, "r"], + [50764, 0, ","], + [50765, 0, " "], + [50766, 0, "a"], + [50767, 0, " "], + [50768, 0, "c"], + [50769, 0, "o"], + [50770, 0, "n"], + [50771, 0, "c"], + [50772, 0, "u"], + [50773, 0, "r"], + [50774, 0, "r"], + [50775, 0, "e"], + [50776, 0, "n"], + [50777, 0, "t"], + [50778, 0, " "], + [50779, 0, "o"], + [50780, 0, "p"], + [50781, 0, "e"], + [50782, 0, "r"], + [50783, 0, "a"], + [50784, 0, "t"], + [50785, 0, "i"], + [50786, 0, "o"], + [50787, 0, "n"], + [50788, 0, " "], + [50789, 0, "t"], + [50790, 0, "h"], + [50791, 0, "a"], + [50792, 0, "t"], + [50793, 0, " "], + [50794, 0, "r"], + [50795, 0, "e"], + [50796, 0, "f"], + [50797, 0, "e"], + [50798, 0, "r"], + [50799, 0, "e"], + [50800, 0, "n"], + [50801, 0, "c"], + [50802, 0, "e"], + [50803, 0, "s"], + [50804, 0, " "], + [50805, 0, "t"], + [50806, 0, "h"], + [50807, 0, "e"], + [50808, 0, " "], + [50809, 0, "l"], + [50810, 0, "i"], + [50811, 0, "s"], + [50812, 0, "t"], + [50813, 0, " "], + [50814, 0, "e"], + [50815, 0, "l"], + [50816, 0, "e"], + [50817, 0, "m"], + [50818, 0, "e"], + [50819, 0, "n"], + [50820, 0, "t"], + [50821, 0, " "], + [50822, 0, "c"], + [50823, 0, "a"], + [50824, 0, "n"], + [50825, 0, " "], + [50826, 0, "c"], + [50827, 0, "a"], + [50828, 0, "u"], + [50829, 0, "s"], + [50830, 0, "e"], + [50831, 0, " "], + [50832, 0, "t"], + [50833, 0, "h"], + [50834, 0, "e"], + [50835, 0, " "], + [50836, 0, "p"], + [50837, 0, "r"], + [50838, 0, "e"], + [50839, 0, "s"], + [50840, 0, "e"], + [50841, 0, "n"], + [50842, 0, "c"], + [50843, 0, "e"], + [50844, 0, " "], + [50845, 0, "s"], + [50846, 0, "e"], + [50847, 0, "t"], + [50848, 0, " "], + [50849, 0, "t"], + [50850, 0, "o"], + [50851, 0, " "], + [50852, 0, "b"], + [50853, 0, "e"], + [50854, 0, " "], + [50855, 0, "c"], + [50856, 0, "o"], + [50857, 0, "m"], + [50858, 0, "e"], + [50859, 0, " "], + [50860, 0, "n"], + [50861, 0, "o"], + [50862, 0, "n"], + [50863, 0, "-"], + [50864, 0, "e"], + [50865, 0, "m"], + [50866, 0, "p"], + [50867, 0, "t"], + [50868, 0, "y"], + [50869, 0, " "], + [50870, 0, "a"], + [50871, 0, "g"], + [50872, 0, "a"], + [50873, 0, "i"], + [50874, 0, "n"], + [50875, 0, " "], + [50876, 0, "("], + [50877, 0, "l"], + [50878, 0, "e"], + [50879, 0, "a"], + [50880, 0, "d"], + [50881, 0, "i"], + [50882, 0, "n"], + [50883, 0, "g"], + [50884, 0, " "], + [50885, 0, "t"], + [50886, 0, "o"], + [50887, 0, " "], + [50888, 0, "t"], + [50889, 0, "h"], + [50890, 0, "e"], + [50891, 0, " "], + [50892, 0, "s"], + [50893, 0, "i"], + [50894, 0, "t"], + [50895, 0, "u"], + [50896, 0, "a"], + [50897, 0, "t"], + [50898, 0, "i"], + [50899, 0, "o"], + [50900, 0, "n"], + [50901, 0, "s"], + [50902, 0, " "], + [50903, 0, "i"], + [50904, 0, "n"], + [50905, 0, " "], + [50906, 0, "F"], + [50907, 0, "i"], + [50908, 0, "g"], + [50909, 0, "u"], + [50910, 0, "r"], + [50911, 0, "e"], + [50912, 0, "s"], + [50913, 0, "~"], + [50914, 0, "\\"], + [50915, 0, "r"], + [50916, 0, "e"], + [50917, 0, "f"], + [50918, 0, "{"], + [50919, 0, "f"], + [50920, 0, "i"], + [50921, 0, "g"], + [50922, 0, ":"], + [50923, 0, "m"], + [50924, 0, "a"], + [50925, 0, "p"], + [50926, 0, "-"], + [50927, 0, "r"], + [50928, 0, "e"], + [50929, 0, "m"], + [50930, 0, "o"], + [50931, 0, "v"], + [50932, 0, "e"], + [50933, 0, "}"], + [50934, 0, " "], + [50935, 0, "a"], + [50936, 0, "n"], + [50937, 0, "d"], + [50938, 0, " "], + [50938, 1], + [50938, 0, "~"], + [50939, 0, "\\"], + [50940, 0, "r"], + [50941, 0, "e"], + [50942, 0, "f"], + [50943, 0, "{"], + [50944, 0, "f"], + [50945, 0, "i"], + [50946, 0, "g"], + [50947, 0, ":"], + [50948, 0, "t"], + [50949, 0, "o"], + [50950, 0, "d"], + [50951, 0, "o"], + [50952, 0, "-"], + [50953, 0, "i"], + [50954, 0, "t"], + [50955, 0, "e"], + [50956, 0, "m"], + [50957, 0, "}"], + [50958, 0, ")"], + [50959, 0, "."], + [50575, 1], + [50574, 1], + [50573, 1], + [50572, 1], + [50572, 0, ","], + [50573, 0, " "], + [50574, 0, "w"], + [50575, 0, "h"], + [50576, 0, "i"], + [50577, 0, "c"], + [50578, 0, "h"], + [50647, 1], + [50647, 0, "i"], + [50648, 0, "s"], + [50744, 1], + [50743, 1], + [50742, 1], + [50742, 0, "s"], + [50738, 0, "w"], + [50739, 0, "h"], + [50740, 0, "i"], + [50741, 0, "c"], + [50742, 0, "h"], + [50743, 0, " "], + [50968, 0, " "], + [50969, 0, "$"], + [50969, 1], + [50969, 0, "R"], + [50970, 0, "u"], + [50971, 0, "l"], + [50972, 0, "e"], + [50973, 0, " "], + [50974, 0, "$"], + [50975, 0, "\\"], + [50976, 0, "t"], + [50977, 0, "e"], + [50978, 0, "x"], + [50979, 0, "t"], + [50980, 0, "s"], + [50981, 0, "c"], + [50982, 0, "{"], + [50983, 0, "I"], + [50984, 0, "d"], + [50985, 0, "x"], + [50986, 0, "}"], + [50987, 0, "_"], + [50988, 0, "4"], + [50989, 0, "$"], + [50990, 0, " "], + [50991, 0, "h"], + [50992, 0, "a"], + [50993, 0, "n"], + [50994, 0, "d"], + [50995, 0, "l"], + [50996, 0, "e"], + [50997, 0, "s"], + [50998, 0, " "], + [50999, 0, "l"], + [51000, 0, "i"], + [51001, 0, "s"], + [51002, 0, "t"], + [51003, 0, " "], + [51004, 0, "e"], + [51005, 0, "l"], + [51006, 0, "e"], + [51007, 0, "m"], + [51008, 0, "e"], + [51009, 0, "n"], + [51010, 0, "t"], + [51011, 0, " "], + [51011, 1], + [51011, 0, "s"], + [51012, 0, " "], + [51013, 0, "w"], + [51014, 0, "i"], + [51015, 0, "t"], + [51016, 0, "h"], + [51017, 0, " "], + [51018, 0, "e"], + [51019, 0, "m"], + [51020, 0, "p"], + [51021, 0, "t"], + [51022, 0, "y"], + [51023, 0, " "], + [51024, 0, "p"], + [51025, 0, "r"], + [51026, 0, "e"], + [51027, 0, "s"], + [51028, 0, "e"], + [51029, 0, "n"], + [51030, 0, "c"], + [51031, 0, "e"], + [51018, 0, "a"], + [51019, 0, "n"], + [51020, 0, " "], + [51035, 0, " "], + [51036, 0, "s"], + [51037, 0, "e"], + [51038, 0, "t"], + [51039, 0, " "], + [51040, 0, "b"], + [51041, 0, "y"], + [51042, 0, " "], + [51043, 0, "m"], + [51044, 0, "o"], + [51045, 0, "v"], + [51046, 0, "i"], + [51047, 0, "n"], + [51048, 0, "g"], + [51049, 0, " "], + [51050, 0, "t"], + [51051, 0, "o"], + [51052, 0, " "], + [51053, 0, "t"], + [51054, 0, "h"], + [51055, 0, "e"], + [51056, 0, " "], + [51057, 0, "n"], + [51058, 0, "e"], + [51059, 0, "x"], + [51060, 0, "t"], + [51061, 0, " "], + [51062, 0, "l"], + [51063, 0, "i"], + [51064, 0, "s"], + [51065, 0, "t"], + [51066, 0, " "], + [51067, 0, "e"], + [51068, 0, "l"], + [51069, 0, "e"], + [51070, 0, "m"], + [51071, 0, "e"], + [51072, 0, "n"], + [51073, 0, "t"], + [51074, 0, " "], + [51075, 0, "w"], + [51076, 0, "i"], + [51077, 0, "t"], + [51078, 0, "h"], + [51079, 0, "o"], + [51080, 0, "u"], + [51081, 0, "t"], + [51082, 0, " "], + [51083, 0, "d"], + [51084, 0, "e"], + [51085, 0, "c"], + [51086, 0, "r"], + [51087, 0, "e"], + [51088, 0, "m"], + [51089, 0, "e"], + [51090, 0, "n"], + [51091, 0, "t"], + [51092, 0, "i"], + [51093, 0, "n"], + [51094, 0, "g"], + [51095, 0, " "], + [51096, 0, "t"], + [51097, 0, "h"], + [51098, 0, "e"], + [51099, 0, " "], + [51100, 0, "i"], + [51101, 0, "n"], + [51102, 0, "d"], + [51103, 0, "e"], + [51104, 0, "x"], + [51105, 0, "."], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [51108, 1], + [47846, 0, "t"], + [47847, 0, "h"], + [47848, 0, "e"], + [47849, 0, "s"], + [47850, 0, "e"], + [47851, 0, " "], + [47852, 0, "i"], + [47853, 0, "d"], + [47854, 0, "e"], + [47855, 0, "n"], + [47856, 0, "t"], + [47857, 0, "i"], + [47858, 0, "f"], + [47859, 0, "i"], + [47860, 0, "e"], + [47861, 0, "r"], + [47862, 0, "s"], + [47863, 0, " "], + [47928, 1], + [47927, 1], + [47926, 1], + [47925, 1], + [47924, 1], + [47923, 1], + [47922, 1], + [47921, 1], + [47920, 1], + [47919, 1], + [47918, 1], + [47917, 1], + [47916, 1], + [47915, 1], + [47914, 1], + [47913, 1], + [47912, 1], + [47911, 1], + [47910, 1], + [47909, 1], + [47908, 1], + [47907, 1], + [47906, 1], + [47905, 1], + [47904, 1], + [47903, 1], + [47902, 1], + [47901, 1], + [47900, 1], + [47899, 1], + [47898, 1], + [47897, 1], + [47896, 1], + [47895, 1], + [49397, 1], + [49396, 1], + [49395, 1], + [51086, 0, ","], + [51087, 0, " "], + [51088, 0, "i"], + [51089, 0, "."], + [51090, 0, "e"], + [51091, 0, "."], + [51092, 0, " "], + [51093, 0, "n"], + [51094, 0, "o"], + [51095, 0, "t"], + [51096, 0, " "], + [51097, 0, "c"], + [51098, 0, "o"], + [51099, 0, "u"], + [51100, 0, "n"], + [51101, 0, "t"], + [51102, 0, "i"], + [51103, 0, "n"], + [51104, 0, "g"], + [51105, 0, " "], + [51106, 0, "t"], + [51107, 0, "h"], + [51108, 0, "e"], + [51109, 0, "m"], + [51110, 0, " "], + [51111, 0, "a"], + [51112, 0, "s"], + [51113, 0, " "], + [51114, 0, "l"], + [51115, 0, "i"], + [51116, 0, "s"], + [51117, 0, "t"], + [51118, 0, " "], + [51119, 0, "e"], + [51120, 0, "l"], + [51121, 0, "e"], + [51122, 0, "m"], + [51123, 0, "e"], + [51124, 0, "n"], + [51125, 0, "t"], + [51126, 0, "s"], + [51588, 1], + [51587, 1], + [51586, 1], + [51585, 1], + [51585, 0, "I"], + [51586, 0, "d"], + [51587, 0, "x"], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [51679, 1], + [52207, 0, "s"], + [52208, 0, "a"], + [52209, 0, "m"], + [52210, 0, "e"], + [52211, 0, " "], + [52415, 1], + [52414, 1], + [52413, 1], + [52412, 1], + [52411, 1], + [52410, 1], + [52409, 1], + [52408, 1], + [52407, 1], + [52406, 1], + [52405, 1], + [52404, 1], + [52403, 1], + [52402, 1], + [52401, 1], + [52400, 1], + [52399, 1], + [52398, 1], + [52397, 1], + [52396, 1], + [52395, 1], + [52394, 1], + [52393, 1], + [52392, 1], + [52391, 1], + [52390, 1], + [52389, 1], + [52388, 1], + [52387, 1], + [52386, 1], + [52385, 1], + [52384, 1], + [52383, 1], + [52382, 1], + [52381, 1], + [52380, 1], + [52379, 1], + [52378, 1], + [52377, 1], + [52376, 1], + [52375, 1], + [52374, 1], + [52373, 1], + [52372, 1], + [52371, 1], + [52370, 1], + [52369, 1], + [52368, 1], + [52367, 1], + [52366, 1], + [52365, 1], + [52364, 1], + [52363, 1], + [52362, 1], + [52361, 1], + [52360, 1], + [52359, 1], + [52358, 1], + [52357, 1], + [52356, 1], + [52355, 1], + [52354, 1], + [52353, 1], + [52352, 1], + [52351, 1], + [52350, 1], + [52349, 1], + [52348, 1], + [52347, 1], + [52346, 1], + [52345, 1], + [52344, 1], + [52343, 1], + [52342, 1], + [52341, 1], + [52340, 1], + [52339, 1], + [52338, 1], + [52337, 1], + [52336, 1], + [52335, 1], + [52334, 1], + [52333, 1], + [52332, 1], + [52331, 1], + [52330, 1], + [52329, 1], + [52328, 1], + [52327, 1], + [52326, 1], + [52325, 1], + [52324, 1], + [52323, 1], + [52322, 1], + [52321, 1], + [52320, 1], + [52319, 1], + [52318, 1], + [52317, 1], + [52316, 1], + [52315, 1], + [52314, 1], + [52313, 1], + [52312, 1], + [52311, 1], + [52310, 1], + [52309, 1], + [52308, 1], + [52307, 1], + [52306, 1], + [52305, 1], + [52304, 1], + [52303, 1], + [52302, 1], + [52301, 1], + [52300, 1], + [52299, 1], + [52298, 1], + [52297, 1], + [52296, 1], + [52295, 1], + [52294, 1], + [52293, 1], + [52292, 1], + [52291, 1], + [52290, 1], + [52289, 1], + [52288, 1], + [52287, 1], + [52286, 1], + [52285, 1], + [52284, 1], + [52283, 1], + [52282, 1], + [52281, 1], + [52280, 1], + [52279, 1], + [52278, 1], + [52277, 1], + [52488, 0, ","], + [54900, 0, "\\"], + [54901, 0, "e"], + [54902, 0, "m"], + [54903, 0, "p"], + [54904, 0, "h"], + [54905, 0, "{"], + [54925, 0, "}"], + [54943, 0, "."], + [54944, 0, " "], + [54945, 0, "A"], + [54946, 0, " "], + [54947, 0, "c"], + [54947, 1], + [54946, 1], + [54946, 0, " "], + [54947, 0, "c"], + [54948, 0, "a"], + [54949, 0, "u"], + [54950, 0, "s"], + [54951, 0, "a"], + [54952, 0, "l"], + [54953, 0, " "], + [54954, 0, "d"], + [54955, 0, "e"], + [54956, 0, "p"], + [54957, 0, "e"], + [54958, 0, "n"], + [54959, 0, "d"], + [54960, 0, "e"], + [54961, 0, "n"], + [54962, 0, "c"], + [54963, 0, "y"], + [54964, 0, " "], + [54965, 0, "i"], + [54966, 0, "s"], + [54967, 0, " "], + [54967, 1], + [54966, 1], + [54965, 1], + [54965, 0, "o"], + [54966, 0, "f"], + [54967, 0, " "], + [54968, 0, "o"], + [54969, 0, "p"], + [54970, 0, "e"], + [54971, 0, "r"], + [54972, 0, "a"], + [54973, 0, "t"], + [54974, 0, "i"], + [54975, 0, "o"], + [54976, 0, "n"], + [54977, 0, " "], + [54978, 0, "$"], + [54979, 0, "o"], + [54980, 0, "_"], + [54981, 0, "2"], + [54982, 0, "$"], + [54983, 0, " "], + [54984, 0, "i"], + [54985, 0, "s"], + [54986, 0, " "], + [54987, 0, "a"], + [54988, 0, "n"], + [54989, 0, "y"], + [54990, 0, " "], + [54991, 0, "o"], + [54992, 0, "p"], + [54993, 0, "e"], + [54994, 0, "r"], + [54995, 0, "a"], + [54996, 0, "t"], + [54997, 0, "i"], + [54998, 0, "o"], + [54999, 0, "n"], + [55000, 0, " "], + [55001, 0, "$"], + [55002, 0, "o"], + [55003, 0, "_"], + [55004, 0, "1"], + [55005, 0, "$"], + [55006, 0, " "], + [55007, 0, "t"], + [55008, 0, "h"], + [55009, 0, "a"], + [55010, 0, "t"], + [55011, 0, " "], + [55012, 0, "h"], + [55013, 0, "a"], + [55014, 0, "d"], + [55015, 0, " "], + [55016, 0, "b"], + [55017, 0, "e"], + [55018, 0, "e"], + [55019, 0, "n"], + [55020, 0, " "], + [55021, 0, "a"], + [55022, 0, "p"], + [55023, 0, "p"], + [55024, 0, "l"], + [55025, 0, "i"], + [55026, 0, "e"], + [55027, 0, "d"], + [55028, 0, " "], + [55029, 0, "a"], + [55030, 0, "t"], + [55031, 0, " "], + [55032, 0, "t"], + [55033, 0, "h"], + [55034, 0, "e"], + [55035, 0, " "], + [55036, 0, "r"], + [55037, 0, "e"], + [55038, 0, "p"], + [55039, 0, "l"], + [55040, 0, "i"], + [55041, 0, "c"], + [55042, 0, "a"], + [55043, 0, " "], + [55044, 0, "w"], + [55045, 0, "h"], + [55046, 0, "e"], + [55047, 0, "r"], + [55048, 0, "e"], + [55049, 0, " "], + [55050, 0, "$"], + [55051, 0, "o"], + [55052, 0, "_"], + [55053, 0, "2"], + [55054, 0, "$"], + [55055, 0, " "], + [55056, 0, "w"], + [55057, 0, "a"], + [55058, 0, "s"], + [55059, 0, " "], + [55015, 0, " "], + [55016, 0, "a"], + [55017, 0, "l"], + [55018, 0, "r"], + [55019, 0, "e"], + [55020, 0, "a"], + [55021, 0, "d"], + [55022, 0, "y"], + [54944, 0, " "], + [54945, 0, "I"], + [54946, 0, "f"], + [54947, 0, " "], + [54948, 0, "o"], + [54949, 0, "p"], + [54950, 0, "e"], + [54951, 0, "r"], + [54952, 0, "a"], + [54953, 0, "t"], + [54954, 0, "i"], + [54955, 0, "o"], + [54956, 0, "n"], + [54957, 0, " "], + [54958, 0, "$"], + [54959, 0, "o"], + [54960, 0, "_"], + [54961, 0, "2"], + [54962, 0, "$"], + [54963, 0, " "], + [54964, 0, "w"], + [54965, 0, "a"], + [54966, 0, "s"], + [54967, 0, " "], + [54968, 0, "g"], + [54969, 0, "e"], + [54970, 0, "n"], + [54971, 0, "e"], + [54972, 0, "r"], + [54973, 0, "a"], + [54974, 0, "t"], + [54975, 0, "e"], + [54976, 0, "d"], + [54977, 0, " "], + [54978, 0, "b"], + [54979, 0, "y"], + [54980, 0, " "], + [54981, 0, "r"], + [54982, 0, "e"], + [54983, 0, "p"], + [54984, 0, "l"], + [54985, 0, "i"], + [54986, 0, "c"], + [54987, 0, "a"], + [54988, 0, " "], + [54989, 0, "$"], + [54990, 0, "p"], + [54991, 0, "$"], + [54992, 0, ","], + [54993, 0, " "], + [54994, 0, "t"], + [54995, 0, "h"], + [54996, 0, "e"], + [54997, 0, "n"], + [54999, 1], + [54999, 0, "a"], + [55030, 1], + [55029, 1], + [55028, 1], + [55027, 1], + [55026, 1], + [55025, 1], + [55024, 1], + [55023, 1], + [55022, 1], + [55021, 1], + [55080, 0, " "], + [55081, 0, "o"], + [55082, 0, "n"], + [55083, 0, " "], + [55084, 0, "$"], + [55085, 0, "p"], + [55086, 0, "$"], + [55087, 0, " "], + [55088, 0, "a"], + [55089, 0, "t"], + [55090, 0, " "], + [55091, 0, "t"], + [55092, 0, "h"], + [55093, 0, "e"], + [55094, 0, " "], + [55095, 0, "t"], + [55096, 0, "i"], + [55097, 0, "m"], + [55098, 0, "e"], + [55099, 0, " "], + [55100, 0, "w"], + [55101, 0, "h"], + [55102, 0, "e"], + [55103, 0, "n"], + [55104, 0, " "], + [55105, 0, "$"], + [55106, 0, "o"], + [55107, 0, "_"], + [55108, 0, "2"], + [55109, 0, "$"], + [55110, 0, " "], + [55111, 0, "w"], + [55112, 0, "a"], + [55113, 0, "s"], + [55114, 0, " "], + [55115, 0, "g"], + [55116, 0, "e"], + [55117, 0, "n"], + [55118, 0, "e"], + [55119, 0, "r"], + [55120, 0, "a"], + [55121, 0, "t"], + [55122, 0, "e"], + [55123, 0, "d"], + [55124, 0, "."], + [55125, 0, " "], + [55126, 0, "I"], + [55127, 0, "n"], + [55128, 0, " "], + [55129, 0, "t"], + [55130, 0, "h"], + [55131, 0, "i"], + [55132, 0, "s"], + [55133, 0, " "], + [55134, 0, "p"], + [55135, 0, "a"], + [55136, 0, "p"], + [55137, 0, "e"], + [55138, 0, "r"], + [55139, 0, ","], + [55140, 0, " "], + [55141, 0, "w"], + [55142, 0, "e"], + [55143, 0, " "], + [55144, 0, "d"], + [55145, 0, "e"], + [55146, 0, "f"], + [55147, 0, "i"], + [55148, 0, "n"], + [55149, 0, "e"], + [55150, 0, "d"], + [55150, 1], + [55150, 0, " "], + [55151, 0, "t"], + [55152, 0, "h"], + [55153, 0, "e"], + [55154, 0, " "], + [55154, 1], + [55153, 1], + [55152, 1], + [55151, 1], + [55151, 0, "\\"], + [55152, 0, "m"], + [55153, 0, "a"], + [55153, 1], + [55152, 1], + [55151, 1], + [55151, 0, "$"], + [55152, 0, "\\"], + [55153, 0, "m"], + [55154, 0, "a"], + [55155, 0, "t"], + [55156, 0, "h"], + [55157, 0, "i"], + [55158, 0, "t"], + [55159, 0, "{"], + [55160, 0, "d"], + [55161, 0, "e"], + [55162, 0, "p"], + [55163, 0, "s"], + [55164, 0, "}"], + [55165, 0, "$"], + [55166, 0, " "], + [55167, 0, "a"], + [55168, 0, "s"], + [55169, 0, " "], + [55170, 0, "t"], + [55171, 0, "h"], + [55172, 0, "e"], + [55173, 0, " "], + [55174, 0, "s"], + [55175, 0, "e"], + [55176, 0, "t"], + [55177, 0, " "], + [55178, 0, "o"], + [55179, 0, "f"], + [55180, 0, " "], + [55181, 0, "L"], + [55182, 0, "a"], + [55183, 0, "m"], + [55184, 0, "p"], + [55185, 0, "o"], + [55186, 0, "r"], + [55187, 0, "t"], + [55188, 0, " "], + [55189, 0, "t"], + [55190, 0, "i"], + [55191, 0, "m"], + [55192, 0, "e"], + [55193, 0, "s"], + [55194, 0, "t"], + [55195, 0, "a"], + [55196, 0, "m"], + [55197, 0, "p"], + [55198, 0, "s"], + [55199, 0, " "], + [55200, 0, "o"], + [55201, 0, "f"], + [55202, 0, " "], + [55203, 0, "a"], + [55204, 0, "l"], + [55205, 0, "l"], + [55206, 0, " "], + [55207, 0, "c"], + [55208, 0, "a"], + [55209, 0, "u"], + [55210, 0, "s"], + [55211, 0, "a"], + [55212, 0, "l"], + [55213, 0, " "], + [55214, 0, "d"], + [55215, 0, "e"], + [55216, 0, "p"], + [55217, 0, "e"], + [55218, 0, "n"], + [55219, 0, "d"], + [55220, 0, "e"], + [55221, 0, "n"], + [55222, 0, "c"], + [55223, 0, "i"], + [55224, 0, "e"], + [55225, 0, "s"], + [55226, 0, "."], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [55228, 1], + [54944, 0, " "], + [54945, 0, "I"], + [54946, 0, "t"], + [54947, 0, " "], + [54948, 0, "i"], + [54949, 0, "s"], + [54950, 0, " "], + [54951, 0, "d"], + [54952, 0, "e"], + [54953, 0, "f"], + [54954, 0, "i"], + [54955, 0, "n"], + [54956, 0, "e"], + [54957, 0, "d"], + [54958, 0, " "], + [54959, 0, "a"], + [54960, 0, "s"], + [54961, 0, " "], + [54962, 0, "f"], + [54963, 0, "o"], + [54964, 0, "l"], + [54965, 0, "l"], + [54966, 0, "o"], + [54967, 0, "w"], + [54968, 0, "s"], + [54969, 0, ":"], + [54971, 1], + [54971, 0, "i"], + [56788, 0, "A"], + [56789, 0, "f"], + [56790, 0, "t"], + [56791, 0, "e"], + [56792, 0, "r"], + [78015, 1], + [78014, 1], + [78013, 1], + [78012, 1], + [78012, 0, "I"], + [78013, 0, "d"], + [78014, 0, "x"], + [78085, 1], + [78084, 1], + [78083, 1], + [78082, 1], + [78082, 0, "i"], + [78083, 0, "d"], + [78084, 0, "x"], + [78074, 0, "$"], + [78087, 0, "("], + [78088, 0, "n"], + [78089, 0, ")"], + [78090, 0, "$"], + [78079, 1], + [78078, 1], + [78077, 1], + [78076, 1], + [78075, 1], + [78075, 0, "\\"], + [78076, 0, "m"], + [78077, 0, "a"], + [78078, 0, "t"], + [78079, 0, "h"], + [78079, 1], + [78078, 1], + [78077, 1], + [78076, 1], + [78076, 0, "t"], + [78077, 0, "e"], + [78078, 0, "x"], + [78078, 1], + [78077, 1], + [78076, 1], + [78076, 0, "m"], + [78077, 0, "a"], + [78078, 0, "t"], + [78079, 0, "h"], + [78019, 1], + [78018, 1], + [78019, 0, ","], + [78020, 0, "4"], + [88740, 1], + [88740, 1], + [88740, 1], + [88740, 1], + [88740, 0, "I"], + [88741, 0, "d"], + [88742, 0, "x"], + [78131, 0, " "], + [78132, 0, "b"], + [78133, 0, "e"], + [78134, 0, "c"], + [78135, 0, "a"], + [78136, 0, "u"], + [78137, 0, "s"], + [78138, 0, "e"], + [78139, 0, " "], + [78140, 0, "$"], + [78141, 0, "n"], + [78142, 0, "$"], + [78143, 0, " "], + [78144, 0, "i"], + [78145, 0, "s"], + [78146, 0, " "], + [78147, 0, "g"], + [78148, 0, "r"], + [78149, 0, "e"], + [78150, 0, "a"], + [78151, 0, "t"], + [78152, 0, "e"], + [78153, 0, "r"], + [78154, 0, " "], + [78155, 0, "t"], + [78156, 0, "h"], + [78157, 0, "a"], + [78158, 0, "n"], + [78159, 0, " "], + [78160, 0, "t"], + [78161, 0, "h"], + [78162, 0, "e"], + [78163, 0, " "], + [78164, 0, "n"], + [78165, 0, "u"], + [78166, 0, "m"], + [78167, 0, "b"], + [78168, 0, "e"], + [78169, 0, "r"], + [78170, 0, " "], + [78171, 0, "o"], + [78172, 0, "f"], + [78173, 0, " "], + [78174, 0, "n"], + [78175, 0, "o"], + [78176, 0, "n"], + [78177, 0, "-"], + [78178, 0, "d"], + [78179, 0, "e"], + [78180, 0, "l"], + [78181, 0, "e"], + [78182, 0, "t"], + [78183, 0, "e"], + [78184, 0, "d"], + [78185, 0, " "], + [78186, 0, "e"], + [78187, 0, "l"], + [78188, 0, "e"], + [78189, 0, "m"], + [78190, 0, "e"], + [78191, 0, "n"], + [78192, 0, "t"], + [78193, 0, "s"], + [78194, 0, " "], + [78195, 0, "i"], + [78196, 0, "n"], + [78197, 0, " "], + [78198, 0, "t"], + [78199, 0, "h"], + [78200, 0, "e"], + [78201, 0, " "], + [78202, 0, "l"], + [78203, 0, "i"], + [78204, 0, "s"], + [78205, 0, "t"], + [78138, 1], + [78137, 1], + [78136, 1], + [78135, 1], + [78134, 1], + [78133, 1], + [78132, 1], + [78131, 1], + [78131, 0, ","], + [78132, 0, " "], + [78133, 0, "w"], + [78134, 0, "h"], + [78135, 0, "i"], + [78136, 0, "c"], + [78137, 0, "h"], + [78138, 0, " "], + [78139, 0, "w"], + [78140, 0, "o"], + [78141, 0, "u"], + [78142, 0, "l"], + [78143, 0, "d"], + [78144, 0, " "], + [78145, 0, "h"], + [78146, 0, "a"], + [78147, 0, "p"], + [78148, 0, "p"], + [78149, 0, "e"], + [78150, 0, "n"], + [78151, 0, " "], + [78152, 0, "i"], + [78153, 0, "f"], + [51086, 1], + [51086, 0, " "], + [51087, 1], + [51087, 0, "("], + [51092, 0, ","], + [51128, 0, ")"], + [56024, 1], + [56025, 0, "("], + [56030, 0, ","], + [56067, 1], + [56067, 0, ")"], + [56067, 0, " "], + [56068, 0, "i"], + [56069, 0, "n"], + [56070, 0, " "], + [56071, 0, "e"], + [56072, 0, "i"], + [56073, 0, "t"], + [56074, 0, "h"], + [56075, 0, "e"], + [56076, 0, "r"], + [56077, 0, " "], + [56078, 0, "d"], + [56079, 0, "i"], + [56080, 0, "r"], + [56081, 0, "e"], + [56082, 0, "c"], + [56083, 0, "t"], + [56084, 0, "i"], + [56085, 0, "o"], + [56086, 0, "n"], + [68783, 1], + [68782, 1], + [68781, 1], + [68780, 1], + [68780, 0, "w"], + [68781, 0, "h"], + [68782, 0, "i"], + [68783, 0, "c"], + [68784, 0, "h"], + [68785, 0, " "], + [68786, 0, "i"], + [68787, 0, "s"], + [68788, 0, " "], + [68789, 0, "t"], + [68790, 0, "h"], + [68791, 0, "e"], + [68792, 0, " "], + [68793, 0, "c"], + [68794, 0, "a"], + [68795, 0, "s"], + [68796, 0, "e"], + [59857, 1], + [59856, 1], + [59855, 1], + [59854, 1], + [59853, 1], + [59852, 1], + [59851, 1], + [59850, 1], + [59849, 1], + [59848, 1], + [59847, 1], + [59846, 1], + [59845, 1], + [59845, 0, "i"], + [59846, 0, "t"], + [59847, 0, "s"], + [59847, 1], + [59846, 1], + [59845, 1], + [59845, 0, "t"], + [59846, 0, "h"], + [59847, 0, "e"], + [61346, 1], + [61345, 1], + [61344, 1], + [61343, 1], + [61342, 1], + [61341, 1], + [61340, 1], + [61339, 1], + [61338, 1], + [61337, 1], + [61335, 1], + [61334, 1], + [61333, 1], + [61333, 0, "i"], + [61334, 0, "t"], + [61335, 0, "s"], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [60398, 1], + [61440, 1], + [61439, 1], + [61438, 1], + [61437, 1], + [61436, 1], + [61435, 1], + [61434, 1], + [61433, 1], + [61432, 1], + [61431, 1], + [61431, 0, "a"], + [61432, 0, "p"], + [61433, 0, "p"], + [61434, 0, "l"], + [61435, 0, "y"], + [61436, 0, "i"], + [61437, 0, "n"], + [61438, 0, "g"], + [61250, 1], + [61249, 1], + [61248, 1], + [61247, 1], + [61246, 1], + [61245, 1], + [61244, 1], + [61243, 1], + [61242, 1], + [61242, 0, "a"], + [61243, 0, "p"], + [61244, 0, "p"], + [61245, 0, "l"], + [61246, 0, "i"], + [61247, 0, "e"], + [61248, 0, "s"], + [67605, 1], + [67604, 1], + [67603, 1], + [67602, 1], + [67601, 1], + [67600, 1], + [67599, 1], + [67598, 1], + [67598, 0, "a"], + [67599, 0, "p"], + [67600, 0, "p"], + [67601, 0, "l"], + [67602, 0, "y"], + [67636, 1], + [67635, 1], + [67634, 1], + [67633, 1], + [67632, 1], + [67631, 1], + [67631, 0, "t"], + [67632, 0, "o"], + [67662, 1], + [67661, 1], + [67660, 1], + [67659, 1], + [67666, 1], + [67666, 0, "i"], + [67667, 0, "n"], + [67668, 0, "g"], + [67964, 1], + [67963, 1], + [67970, 0, "'"], + [67971, 0, "s"], + [67972, 0, " "], + [67973, 0, "v"], + [67974, 0, "e"], + [67975, 0, "c"], + [67976, 0, "t"], + [67977, 0, "o"], + [67978, 0, "r"], + [67979, 0, " "], + [67980, 0, "o"], + [67981, 0, "f"], + [67982, 0, " "], + [67983, 0, "k"], + [67984, 0, "e"], + [67985, 0, "y"], + [67986, 0, "s"], + [67987, 0, " "], + [67988, 0, "i"], + [67989, 0, "s"], + [67990, 0, " "], + [67991, 0, "n"], + [67992, 0, "o"], + [67993, 0, "n"], + [67994, 0, "-"], + [67995, 0, "e"], + [67996, 0, "m"], + [67997, 0, "p"], + [67998, 0, "t"], + [67999, 0, "y"], + [68000, 0, ","], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68002, 1], + [68135, 1], + [68134, 1], + [68133, 1], + [68132, 1], + [68131, 1], + [68130, 1], + [68129, 1], + [68128, 1], + [68127, 1], + [68126, 1], + [68125, 1], + [68124, 1], + [68123, 1], + [68122, 1], + [68121, 1], + [68120, 1], + [68119, 1], + [68118, 1], + [68117, 1], + [68116, 1], + [68115, 1], + [68114, 1], + [68113, 1], + [68112, 1], + [68111, 1], + [68110, 1], + [68109, 1], + [68108, 1], + [68107, 1], + [68106, 1], + [68105, 1], + [68104, 1], + [68103, 1], + [68102, 1], + [68101, 1], + [68100, 1], + [68099, 1], + [68098, 1], + [68097, 1], + [68096, 1], + [68095, 1], + [68094, 1], + [68093, 1], + [68092, 1], + [68091, 1], + [68090, 1], + [68089, 1], + [68088, 1], + [68087, 1], + [68086, 1], + [68085, 1], + [68085, 0, "b"], + [68086, 0, "y"], + [68087, 0, " "], + [68088, 0, "f"], + [68089, 0, "o"], + [68090, 0, "l"], + [68091, 0, "l"], + [68092, 0, "o"], + [68093, 0, "w"], + [68094, 0, "i"], + [68095, 0, "n"], + [68096, 0, "g"], + [68097, 0, " "], + [68098, 0, "t"], + [68099, 0, "h"], + [68100, 0, "e"], + [68101, 0, " "], + [68102, 0, "p"], + [68103, 0, "a"], + [68104, 0, "t"], + [68105, 0, "h"], + [68106, 0, " "], + [68107, 0, "d"], + [68108, 0, "e"], + [68109, 0, "s"], + [68110, 0, "c"], + [68111, 0, "r"], + [68112, 0, "i"], + [68113, 0, "b"], + [68114, 0, "e"], + [68115, 0, "d"], + [68116, 0, " "], + [68117, 0, "b"], + [68118, 0, "y"], + [68119, 0, " "], + [68120, 0, "t"], + [68121, 0, "h"], + [68122, 0, "e"], + [68123, 0, "s"], + [68124, 0, "e"], + [68125, 0, " "], + [68126, 0, "k"], + [68127, 0, "e"], + [68128, 0, "y"], + [68129, 0, "s"], + [68124, 1], + [68123, 1], + [76500, 0, ","], + [81608, 0, "\n"], + [81609, 0, "\n"], + [81608, 0, "a"], + [81609, 0, "r"], + [81610, 0, "e"], + [81611, 0, " "], + [81612, 0, "a"], + [81613, 0, "l"], + [81614, 0, "s"], + [81615, 0, "o"], + [81616, 0, " "], + [81617, 0, "w"], + [81618, 0, "o"], + [81619, 0, "r"], + [81620, 0, "k"], + [81621, 0, "i"], + [81622, 0, "n"], + [81623, 0, "g"], + [81624, 0, " "], + [81625, 0, "o"], + [81626, 0, "n"], + [81627, 0, " "], + [81628, 0, "a"], + [81629, 0, " "], + [81630, 0, "p"], + [81631, 0, "r"], + [81632, 0, "a"], + [81633, 0, "c"], + [81634, 0, "t"], + [81635, 0, "i"], + [81636, 0, "c"], + [81637, 0, "a"], + [81638, 0, "l"], + [81639, 0, " "], + [81640, 0, "i"], + [81641, 0, "m"], + [81642, 0, "p"], + [81643, 0, "l"], + [81644, 0, "e"], + [81645, 0, "m"], + [81646, 0, "e"], + [81647, 0, "n"], + [81648, 0, "t"], + [81649, 0, "a"], + [81650, 0, "t"], + [81651, 0, "i"], + [81652, 0, "o"], + [81653, 0, "n"], + [81654, 0, " "], + [81655, 0, "o"], + [81656, 0, "f"], + [81657, 0, " "], + [81658, 0, "t"], + [81659, 0, "h"], + [81660, 0, "e"], + [81661, 0, " "], + [81662, 0, "a"], + [81663, 0, "l"], + [81664, 0, "g"], + [81665, 0, "o"], + [81666, 0, "r"], + [81667, 0, "i"], + [81668, 0, "t"], + [81669, 0, "h"], + [81670, 0, "m"], + [81671, 0, ","], + [81672, 0, " "], + [81673, 0, "a"], + [81674, 0, "n"], + [81675, 0, "d"], + [81676, 0, " "], + [81677, 0, "w"], + [81678, 0, "i"], + [81679, 0, "l"], + [81680, 0, "l"], + [81681, 0, " "], + [81682, 0, "r"], + [81683, 0, "e"], + [81684, 0, "p"], + [81685, 0, "o"], + [81686, 0, "r"], + [81687, 0, "t"], + [81688, 0, " "], + [81689, 0, "o"], + [81690, 0, "n"], + [81691, 0, " "], + [81692, 0, "i"], + [81693, 0, "t"], + [81694, 0, "s"], + [81695, 0, " "], + [81696, 0, "p"], + [81697, 0, "e"], + [81698, 0, "r"], + [81699, 0, "f"], + [81700, 0, "o"], + [81701, 0, "r"], + [81702, 0, "m"], + [81703, 0, "a"], + [81704, 0, "n"], + [81705, 0, "c"], + [81706, 0, "e"], + [81707, 0, " "], + [81708, 0, "c"], + [81709, 0, "h"], + [81710, 0, "a"], + [81711, 0, "r"], + [81712, 0, "a"], + [81713, 0, "c"], + [81714, 0, "t"], + [81715, 0, "e"], + [81716, 0, "r"], + [81717, 0, "i"], + [81718, 0, "s"], + [81719, 0, "t"], + [81720, 0, "i"], + [81721, 0, "c"], + [81722, 0, "s"], + [81723, 0, " "], + [81724, 0, "i"], + [81725, 0, "n"], + [81726, 0, " "], + [81727, 0, "f"], + [81728, 0, "o"], + [81729, 0, "l"], + [81730, 0, "l"], + [81731, 0, "o"], + [81732, 0, "w"], + [81733, 0, "-"], + [81734, 0, "o"], + [81735, 0, "n"], + [81736, 0, " "], + [81737, 0, "w"], + [81738, 0, "o"], + [81739, 0, "r"], + [81740, 0, "k"], + [81741, 0, "."], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [81744, 1], + [50439, 0, " "], + [50440, 0, "("], + [50441, 0, "t"], + [50442, 0, "h"], + [50443, 0, "i"], + [50444, 0, "s"], + [50445, 0, " "], + [50445, 1], + [50444, 1], + [50443, 1], + [50442, 1], + [50441, 1], + [50441, 0, "t"], + [50442, 0, "h"], + [50443, 0, "e"], + [50444, 0, "y"], + [50445, 0, " "], + [50446, 0, "b"], + [50447, 0, "e"], + [50448, 0, "c"], + [50449, 0, "o"], + [50450, 0, "m"], + [50451, 0, "e"], + [50452, 0, " "], + [50453, 0, "\\"], + [50454, 0, "e"], + [50455, 0, "m"], + [50456, 0, "p"], + [50457, 0, "h"], + [50458, 0, "{"], + [50459, 0, "t"], + [50460, 0, "o"], + [50461, 0, "m"], + [50462, 0, "b"], + [50463, 0, "s"], + [50464, 0, "t"], + [50465, 0, "o"], + [50466, 0, "n"], + [50467, 0, "e"], + [50468, 0, "s"], + [50469, 0, "}"], + [50470, 0, ")"], + [50453, 0, "s"], + [50454, 0, "o"], + [50455, 0, "-"], + [50456, 0, "c"], + [50456, 1], + [50455, 0, "c"], + [50455, 1], + [50456, 0, "c"], + [50457, 0, "a"], + [50458, 0, "l"], + [50459, 0, "l"], + [50460, 0, "e"], + [50461, 0, "d"], + [50462, 0, " "], + [51273, 1], + [51272, 1], + [51271, 1], + [51270, 1], + [51269, 1], + [51268, 1], + [51267, 1], + [51266, 1], + [51265, 1], + [51264, 1], + [51263, 1], + [51262, 1], + [51261, 1], + [51260, 1], + [51259, 1], + [51258, 1], + [51257, 1], + [81843, 0, "a"], + [81844, 0, "t"], + [81845, 0, " "], + [81846, 0, "f"], + [81847, 0, "i"], + [81848, 0, "r"], + [81849, 0, "s"], + [81850, 0, "t"], + [81851, 0, " "], + [81852, 0, "g"], + [81853, 0, "l"], + [81854, 0, "a"], + [81855, 0, "n"], + [81856, 0, "c"], + [81857, 0, "e"], + [81858, 0, " "], + [81859, 0, "t"], + [81860, 0, "o"], + [81861, 0, " "], + [81862, 0, "b"], + [81863, 0, "e"], + [81864, 0, " "], + [82145, 0, ","], + [83232, 0, "\n"], + [83233, 0, "\\"], + [83234, 0, "v"], + [83235, 0, "f"], + [83236, 0, "i"], + [83237, 0, "l"], + [83238, 0, "l"], + [83231, 1], + [83238, 0, "\n"], + [84410, 1], + [84409, 1], + [84408, 1], + [84407, 1], + [84406, 1], + [84405, 1], + [84404, 1], + [84403, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 1], + [12217, 0, "q"], + [12218, 0, "u"], + [12219, 0, "o"], + [12220, 0, "r"], + [12221, 0, "u"], + [12222, 0, "m"], + [12474, 0, "s"], + [12475, 0, "t"], + [12476, 0, "r"], + [12477, 0, "u"], + [12478, 0, "g"], + [12479, 0, "g"], + [12480, 0, "l"], + [12481, 0, "e"], + [12482, 0, " "], + [12483, 0, "t"], + [12484, 0, "o"], + [12485, 0, " "], + [12486, 0, "r"], + [12487, 0, "e"], + [12488, 0, "a"], + [12489, 0, "c"], + [12490, 0, "h"], + [12491, 0, " "], + [12492, 0, "a"], + [12493, 0, " "], + [12494, 0, "q"], + [12495, 0, "u"], + [12496, 0, "o"], + [12497, 0, "r"], + [12498, 0, "u"], + [12499, 0, "m"], + [12500, 0, " "], + [12501, 0, "a"], + [12502, 0, "n"], + [12503, 0, "d"], + [12504, 0, " "], + [12412, 1], + [12411, 1], + [12410, 1], + [12409, 1], + [12408, 1], + [12407, 1], + [12406, 1], + [12405, 1], + [12404, 1], + [12403, 1], + [12402, 1], + [12401, 1], + [12400, 1], + [12399, 1], + [12398, 1], + [12397, 1], + [12396, 1], + [12395, 1], + [12394, 1], + [12393, 1], + [12393, 0, "e"], + [12394, 0, " "], + [12395, 0, "o"], + [12396, 0, "f"], + [12397, 0, "f"], + [12398, 0, "l"], + [12399, 0, "i"], + [12400, 0, "n"], + [12401, 0, "e"], + [12402, 0, " "], + [12403, 0, "a"], + [12404, 0, "t"], + [12405, 0, " "], + [12406, 0, "a"], + [12407, 0, "n"], + [12408, 0, "y"], + [12409, 0, " "], + [12410, 0, "o"], + [12411, 0, "n"], + [12412, 0, "e"], + [12376, 1], + [12375, 1], + [12374, 1], + [12373, 1], + [12372, 1], + [12371, 1], + [12370, 1], + [12369, 1], + [12368, 1], + [12367, 1], + [12366, 1], + [12365, 1], + [12364, 1], + [12363, 1], + [12362, 1], + [12361, 1], + [12360, 1], + [12359, 1], + [12359, 0, "m"], + [12360, 0, "a"], + [12361, 0, "n"], + [12362, 0, "y"], + [12511, 0, "W"], + [12512, 0, "i"], + [12513, 0, "t"], + [12514, 0, "h"], + [12515, 0, "o"], + [12516, 0, "u"], + [12517, 0, "t"], + [12518, 0, " "], + [12519, 0, "q"], + [12520, 0, "u"], + [12521, 0, "o"], + [12522, 0, "r"], + [12523, 0, "u"], + [12524, 0, "m"], + [12525, 0, "s"], + [12526, 0, ","], + [12527, 0, " "], + [12528, 1], + [12528, 0, "t"], + [12556, 1], + [12555, 1], + [12554, 1], + [12553, 1], + [12552, 1], + [12006, 0, " "], + [12007, 0, "w"], + [12008, 0, "i"], + [12009, 0, "t"], + [12010, 0, "h"], + [12011, 0, "o"], + [12012, 0, "u"], + [12013, 0, "t"], + [12014, 0, " "], + [12015, 0, "u"], + [12016, 0, "s"], + [12017, 0, "i"], + [12018, 0, "n"], + [12019, 0, "g"], + [12020, 0, " "], + [12021, 0, "a"], + [12022, 0, " "], + [12023, 0, "s"], + [12024, 0, "i"], + [12025, 0, "n"], + [12026, 0, "g"], + [12027, 0, "l"], + [12028, 0, "e"], + [12029, 0, " "], + [12030, 0, "s"], + [12031, 0, "e"], + [12032, 0, "r"], + [12033, 0, "v"], + [12034, 0, "e"], + [12035, 0, "r"], + [12137, 1], + [12136, 1], + [12135, 1], + [12134, 1], + [12133, 1], + [12132, 1], + [12131, 1], + [12130, 1], + [12129, 1], + [12128, 1], + [12127, 1], + [12126, 1], + [12125, 1], + [12124, 1], + [12123, 1], + [12122, 1], + [12121, 1], + [12120, 1], + [12119, 1], + [12118, 1], + [12117, 1], + [12116, 1], + [12115, 1], + [12114, 1], + [12113, 1], + [12112, 1], + [12111, 1], + [12110, 1], + [12109, 1], + [12108, 1], + [12107, 1], + [12106, 1], + [12105, 1], + [12104, 1], + [12103, 1], + [12102, 1], + [12101, 1], + [12100, 1], + [12099, 1], + [12098, 1], + [12097, 1], + [12242, 1], + [12241, 1], + [12240, 1], + [12239, 1], + [12238, 1], + [12237, 1], + [12236, 1], + [12235, 1], + [12234, 1], + [12233, 1], + [12232, 1], + [12300, 0, " "], + [12301, 0, "p"], + [12302, 0, "a"], + [12303, 0, "r"], + [12304, 0, "t"], + [12305, 0, "i"], + [12306, 0, "c"], + [12307, 0, "i"], + [12308, 0, "p"], + [12309, 0, "a"], + [12310, 0, "n"], + [12311, 0, "t"], + [12312, 0, "s"], + [12313, 1], + [12313, 1], + [12313, 1], + [12391, 1], + [12390, 1], + [12389, 1], + [12388, 1], + [12387, 1], + [12386, 1], + [12385, 1], + [12384, 1], + [12383, 1], + [12382, 1], + [12381, 1], + [12380, 1], + [12379, 1], + [12378, 1], + [12377, 1], + [12376, 1], + [12367, 1], + [12366, 1], + [12365, 1], + [12364, 1], + [12363, 1], + [12362, 1], + [12361, 1], + [12360, 1], + [12359, 1], + [12358, 1], + [12357, 1], + [12356, 1], + [12355, 1], + [12354, 1], + [12353, 1], + [12352, 1], + [12351, 1], + [12350, 1], + [12349, 1], + [12348, 1], + [12347, 1], + [12346, 1], + [12345, 1], + [12344, 1], + [12343, 1], + [12342, 1], + [12341, 1], + [12340, 1], + [12339, 1], + [12338, 1], + [12337, 1], + [12336, 1], + [12335, 1], + [12334, 1], + [12333, 1], + [12332, 1], + [16660, 0, "\n"], + [16661, 0, "\n"], + [16662, 0, "R"], + [16663, 0, "e"], + [16664, 0, "s"], + [16665, 0, "o"], + [16666, 0, "l"], + [16667, 0, "v"], + [16668, 0, "i"], + [16669, 0, "n"], + [16670, 0, "g"], + [16671, 0, " "], + [16672, 0, "c"], + [16673, 0, "o"], + [16674, 0, "n"], + [16675, 0, "c"], + [16676, 0, "u"], + [16677, 0, "r"], + [16678, 0, "r"], + [16679, 0, "e"], + [16680, 0, "n"], + [16681, 0, "t"], + [16682, 0, " "], + [16683, 0, "u"], + [16684, 0, "p"], + [16685, 0, "d"], + [16686, 0, "a"], + [16687, 0, "t"], + [16688, 0, "e"], + [16689, 0, "s"], + [16690, 0, " "], + [16691, 0, "o"], + [16692, 0, "n"], + [16693, 0, " "], + [16694, 0, "t"], + [16695, 0, "r"], + [16696, 0, "e"], + [16697, 0, "e"], + [16698, 0, " "], + [16699, 0, "s"], + [16700, 0, "t"], + [16701, 0, "r"], + [16702, 0, "u"], + [16703, 0, "c"], + [16704, 0, "t"], + [16705, 0, "u"], + [16706, 0, "r"], + [16707, 0, "e"], + [16708, 0, "s"], + [16709, 0, " "], + [16710, 0, "h"], + [16711, 0, "a"], + [16712, 0, "s"], + [16713, 0, " "], + [16714, 0, "b"], + [16715, 0, "e"], + [16716, 0, "e"], + [16717, 0, "n"], + [16718, 0, " "], + [16719, 0, "s"], + [16720, 0, "t"], + [16721, 0, "u"], + [16722, 0, "d"], + [16723, 0, "i"], + [16724, 0, "e"], + [16725, 0, "d"], + [16726, 0, " "], + [16727, 0, "i"], + [16728, 0, "n"], + [16729, 0, " "], + [16730, 0, "t"], + [16731, 0, "h"], + [16732, 0, "e"], + [16733, 0, " "], + [16734, 0, "c"], + [16735, 0, "o"], + [16736, 0, "n"], + [16737, 0, "t"], + [16738, 0, "e"], + [16739, 0, "x"], + [16740, 0, "t"], + [16741, 0, " "], + [16742, 0, "o"], + [16743, 0, "f"], + [16744, 0, " "], + [16745, 0, "f"], + [16746, 0, "i"], + [16747, 0, "l"], + [16748, 0, "e"], + [16749, 0, "s"], + [16750, 0, "y"], + [16751, 0, "s"], + [16752, 0, "t"], + [16753, 0, "e"], + [16754, 0, "m"], + [16755, 0, " "], + [16756, 0, "s"], + [16757, 0, "y"], + [16758, 0, "n"], + [16759, 0, "c"], + [16760, 0, "h"], + [16761, 0, "r"], + [16762, 0, "o"], + [16763, 0, "n"], + [16764, 0, "i"], + [16765, 0, "z"], + [16766, 0, "a"], + [16767, 0, "t"], + [16768, 0, "i"], + [16769, 0, "o"], + [16770, 0, "n"], + [16771, 0, "~"], + [16772, 0, "\\"], + [16773, 0, "c"], + [16774, 0, "i"], + [16775, 0, "t"], + [16776, 0, "e"], + [16777, 0, "{"], + [16778, 0, "B"], + [16779, 0, "a"], + [16780, 0, "l"], + [16781, 0, "a"], + [16782, 0, "s"], + [16783, 0, "u"], + [16784, 0, "b"], + [16785, 0, "r"], + [16786, 0, "a"], + [16787, 0, "m"], + [16788, 0, "a"], + [16789, 0, "n"], + [16790, 0, "i"], + [16791, 0, "a"], + [16792, 0, "m"], + [16793, 0, ":"], + [16794, 0, "1"], + [16795, 0, "9"], + [16796, 0, "9"], + [16797, 0, "8"], + [16798, 0, "j"], + [16799, 0, "h"], + [16800, 0, ","], + [16801, 0, "R"], + [16802, 0, "a"], + [16803, 0, "m"], + [16804, 0, "s"], + [16805, 0, "e"], + [16806, 0, "y"], + [16807, 0, ":"], + [16808, 0, "2"], + [16809, 0, "0"], + [16810, 0, "0"], + [16811, 0, "1"], + [16812, 0, "c"], + [16813, 0, "e"], + [16814, 0, ","], + [16814, 1], + [16814, 0, "}"], + [16815, 0, "."], + [16754, 1], + [16753, 1], + [16752, 1], + [16751, 1], + [16750, 1], + [16749, 1], + [13003, 1], + [13003, 1], + [13003, 1], + [13003, 1], + [13003, 1], + [13121, 1], + [13120, 1], + [13119, 1], + [13118, 1], + [13031, 1], + [13030, 1], + [13029, 1], + [13028, 1], + [13027, 1], + [13733, 1], + [13732, 1], + [13731, 1], + [13730, 1], + [13729, 1], + [13728, 1], + [13727, 1], + [13726, 1], + [13602, 0, ","], + [13263, 0, ","], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [13865, 1], + [4817, 1], + [4816, 1], + [4816, 0, "i"], + [4817, 0, "s"], + [60611, 0, "s"], + [61308, 1], + [82969, 0, " "], + [2167, 0, " "], + [2168, 0, "("], + [2169, 0, "a"], + [2170, 0, " "], + [2171, 0, "c"], + [2172, 0, "o"], + [2173, 0, "n"], + [2174, 0, "f"], + [2175, 0, "l"], + [2176, 0, "i"], + [2177, 0, "c"], + [2178, 0, "t"], + [2179, 0, "-"], + [2180, 0, "f"], + [2181, 0, "r"], + [2182, 0, "e"], + [2183, 0, "e"], + [2184, 0, " "], + [2185, 0, "r"], + [2186, 0, "e"], + [2187, 0, "p"], + [2188, 0, "l"], + [2189, 0, "i"], + [2190, 0, "c"], + [2191, 0, "a"], + [2192, 0, "t"], + [2193, 0, "e"], + [2194, 0, "d"], + [2195, 0, " "], + [2196, 0, "d"], + [2197, 0, "a"], + [2198, 0, "t"], + [2199, 0, "a"], + [2200, 0, "t"], + [2201, 0, "y"], + [2202, 0, "p"], + [2203, 0, "e"], + [2204, 0, " "], + [2205, 0, "o"], + [2206, 0, "r"], + [2207, 0, " "], + [2208, 0, "C"], + [2209, 0, "R"], + [2210, 0, "D"], + [2211, 0, "T"], + [2212, 0, ")"] +]; +const finalText = "\\documentclass[10pt,journal,compsoc]{IEEEtran}\n\\PassOptionsToPackage{hyphens}{url}\n\\usepackage[utf8]{inputenc}\n\\usepackage{amsmath} % align environment\n\\usepackage{amssymb} % mathbb\n\\usepackage{bussproofs} % notation for inference rules\n\\usepackage{rotating} % sidewaysfigure\n\\usepackage{hyperref}\n\\usepackage[hyphenbreaks]{breakurl} % Fix URL line breaking when using dvips (e.g. arxiv.org)\n\\usepackage[nocompress]{cite}\n\n% Theorem environments\n\\usepackage{amsthm}\n\\newtheorem{definition}{Definition}\n\\newtheorem{theorem}{Theorem}\n\\newtheorem{lemma}[theorem]{Lemma}\n\\newtheorem*{convergence-thm}{Theorem}\n\n% Diagrams\n\\usepackage{tikz}\n\\usetikzlibrary{arrows}\n\n\\hyphenation{da-ta-cen-ter da-ta-cen-ters net-works time-stamp}\n\n\\newif\\ifincludeappendix\n\\includeappendixtrue\n\n\\newcommand{\\evalto}{\\;\\Longrightarrow\\;}\n\n% Placeholder character like \\textvisiblespace, but works in math mode\n\\newcommand{\\placeholder}{%\n \\makebox[0.7em]{%\n \\kern.07em\n \\vrule height.3ex\n \\hrulefill\n \\vrule height.3ex\n \\kern.07em\n }%\n}\n\n% Span multiple columns within an alignat math environment\n\\newcommand{\\multialign}[2]{%\n \\multispan{#1}\\mbox{$\\displaystyle{}#2$}%\n}\n\n\\begin{document}\n\\sloppy\n\\title{A Conflict-Free Replicated JSON Datatype}\n\\author{Martin Kleppmann and Alastair R. Beresford\n\\thanks{M. Kleppmann and A.R. Beresford are with the University of Cambridge Computer Laboratory, Cambridge, UK.\\protect\\\\Email: \\url{mk428@cl.cam.ac.uk}, \\url{arb33@cl.cam.ac.uk}.}}\n\n\\IEEEtitleabstractindextext{%\n\\begin{abstract}\n% abstract word limit: 100-200 words\nMany applications model their data in a general-purpose storage format such as JSON. This data structure is modified by the application as a result of user input. Such modifications are well understood if performed sequentially on a single copy of the data, but if the data is replicated and modified concurrently on multiple devices, it is unclear what the semantics should be. In this paper we present an algorithm and formal semantics for a JSON data structure that automatically resolves concurrent modifications such that no updates are lost, and such that all replicas converge towards the same state (a conflict-free replicated datatype or CRDT). It supports arbitrarily nested list and map types, which can be modified by insertion, deletion and assignment. The algorithm performs all merging client-side and does not depend on ordering guarantees from the network, making it suitable for deployment on mobile devices with poor network connectivity, in peer-to-peer networks, and in messaging systems with end-to-end encryption.\n\\end{abstract}\n\n\\begin{IEEEkeywords}\nCRDTs, Collaborative Editing, P2P, JSON, Optimistic Replication, Operational Semantics, Eventual Consistency.\n\\end{IEEEkeywords}}\n\\maketitle\n\n\\IEEEraisesectionheading{\\section{Introduction}\\label{sec:introduction}}\n\n\\IEEEPARstart{U}{sers} of mobile devices, such as smartphones, expect applications to continue working while the device is offline or has poor network connectivity, and to synchronize its state with the user's other devices when the network is available. Examples of such applications include calendars, address books, note-taking tools, to-do lists, and password managers. Similarly, collaborative work often requires several people to simultaneously edit the same text document, spreadsheet, presentation, graphic, and other kinds of document, with each person's edits reflected on the other collaborators' copies of the document with minimal delay.\n\nWhat these applications have in common is that the application state needs to be replicated to several devices, each of which may modify the state locally. The traditional approach to concurrency control, serializability, would cause the application to become unusable at times of poor network connectivity~\\cite{Davidson:1985hv}. If we require that applications work regardless of network availability, we must assume that users can make arbitrary modifications concurrently on different devices, and that any resulting conflicts must be resolved.\n\nThe simplest way to resolve conflicts is to discard some modifications when a conflict occurs, for example using a ``last writer wins'' policy. However, this approach is undesirable as it incurs data loss. An alternative is to let the user manually resolve the conflict, which is tedious and error-prone, and therefore should be avoided whenever possible.\n\nCurrent applications solve this problem with a range of ad-hoc and application-specific mechanisms. In this paper we present a general-purpose datatype that provides the full expressiveness of the JSON data model, and supports concurrent modifications without loss of information. As we shall see later, our approach typically supports the automatic merging of concurrent modifications into a JSON data structure. We introduce a single, general mechanism (a multi-value register) into our model to record conflicting updates to leaf nodes in the JSON data structure. This mechanism then provides a consistent basis on which applications can resolve any remaining conflicts through programmatic means, or via further user input. We expect that implementations of this datatype will drastically simplify the development of collaborative and state-synchronizing applications for mobile devices.\n\n\\subsection{JSON Data Model}\n\nJSON is a popular general-purpose data encoding format, used in many databases and web services. It has similarities to XML, and we compare them in Section~\\ref{sec:json-xml}. The structure of a JSON document can optionally be constrained by a schema; however, for simplicity, this paper discusses only untyped JSON without an explicit schema.\n\nA JSON document is a tree containing two types of branch node:\n\n\\begin{description}\n\\item[Map:] A node whose children have no defined order, and where each child is labelled with a string \\emph{key}. A key uniquely identifies one of the children. We treat keys as immutable, but values as mutable, and key-value mappings can be added and removed from the map. A JSON map is also known as an \\emph{object}.\n\\item[List:] A node whose children have an order defined by the application. The list can be mutated by inserting or deleting list elements. A JSON list is also known as an \\emph{array}.\n\\end{description}\n\nA child of a branch node can be either another branch node, or a leaf node. A leaf of the tree contains a primitive value (string, number, boolean, or null). We treat primitive values as immutable, but allow the value of a leaf node to be modified by treating it as a \\emph{register} that can be assigned a new value.\n\nThis model is sufficient to express the state of a wide range of applications. For example, a text document can be represented by a list of single-character strings; character-by-character edits are then expressed as insertions and deletions of list elements. In Section~\\ref{sec:examples} we describe four more complex examples of using JSON to model application data.\n\n\\subsection{Replication and Conflict Resolution}\\label{sec:intro-replication}\n\nWe consider systems in which a full copy of the JSON document is replicated on several devices. Those devices could be servers in datacenters, but we focus on mobile devices such as smartphones and laptops, which have intermittent network connectivity. We do not distinguish between devices owned by the same user and different users. Our model allows each device to optimistically modify its local replica of the document, and to asynchronously propagate those edits to other replicas.\n\nOur only requirement of the network is that messages sent by one replica are eventually delivered to all other replicas, by retrying if delivery fails. We assume the network may arbitrarily delay, reorder and duplicate messages.\n\nOur algorithm works client-side and does not depend on any server to transform or process messages. This approach allows messages to be delivered via a peer-to-peer network as well as a secure messaging protocol with end-to-end encryption~\\cite{Unger:2015kg}. The details of the network implementation and cryptographic protocols are outside of the scope of this paper.\n\nIn Section~\\ref{sec:semantics} we define formal semantics describing how conflicts are resolved when a JSON document is concurrently modified on different devices. Our design is based on three simple principles:\n\\begin{enumerate}\n\\item All replicas of the data structure should automatically converge towards the same state (a requirement known as \\emph{strong eventual consistency}~\\cite{Shapiro:2011un}).\n\\item No user input should be lost due to concurrent modifications.\n\\item If all sequential permutations of a set of updates lead to the same state, then concurrent execution of those updates also leads to the same state~\\cite{Bieniusa:2012gt}.\n\\end{enumerate}\n\n\\subsection{Our Contributions}\n\nOur main contribution in this work is to define an algorithm and formal semantics for collaborative, concurrent editing of JSON data structures with automatic conflict resolution. Although similar algorithms have previously been defined for lists, maps and registers individually (see Section~\\ref{sec:related}), to our knowledge this paper is the first to integrate all of these structures into an arbitrarily composable datatype that can be deployed on any network topology.\n\nA key requirement of conflict resolution is that after any sequence of concurrent modifications, all replicas eventually converge towards the same state. In Section~\\ref{sec:convergence} and the appendix we prove a theorem to show that our algorithm satisfies this requirement.\n\nComposing maps and lists into arbitrarily nested structures opens up subtle challenges that do not arise in flat structures, due to the possibility of concurrent edits at different levels of the tree. We illustrate some of those challenges by example in Section~\\ref{sec:examples}. Nested structures are an important requirement for many applications. Consequently, the long-term goal of our work is to simplify the development of applications that use optimistic replication by providing a general algorithm for conflict resolution whose details can largely be hidden inside an easy-to-use software library.\n\n\\section{Related Work}\\label{sec:related}\n\nIn this section we discuss existing approaches to optimistic replication, collaborative editing and conflict resolution.\n\n\\subsection{Operational Transformation}\\label{sec:related-ot}\n\nAlgorithms based on \\emph{operational transformation} (OT) have long been used for collaborative editing applications~\\cite{Ellis:1989ue,Ressel:1996wx,Sun:1998vf,Nichols:1995fd}. Most of them treat a document as a single ordered list (of characters, for example) and do not support nested tree structures that are required by many applications. Some algorithms generalize OT to editing XML documents~\\cite{Davis:2002iv,Ignat:2003jy,Wang:2015vo}, which provides nesting of ordered lists, but these algorithms do not support key-value maps as defined in this paper (see Section~\\ref{sec:json-xml}). The performance of OT algorithms degrades rapidly as the number of concurrent operations increases~\\cite{Li:2006kd,Mehdi:2011ke}.\n\nMost deployed OT collaboration systems, including Google Docs~\\cite{DayRichter:2010tt}, Etherpad~\\cite{Etherpad:2011um}, Novell Vibe~\\cite{Spiewak:2010vw} and Apache Wave (formerly Google Wave~\\cite{Wang:2015vo}), rely on a single server to decide on a total ordering of operations~\\cite{Lemonik:2016wh}, a design decision inherited from the Jupiter system~\\cite{Nichols:1995fd}. This approach has the advantage of making the transformation functions simpler and less error-prone~\\cite{Imine:2003ks}, but it does not meet our requirements, since we want to support peer-to-peer collaboration without requiring a single server.\n\nMany secure messaging protocols, which we plan to use for encrypted collaboration, do not guarantee that different recipients will see messages in the same order~\\cite{Unger:2015kg}. Although it is possible to decide on a total ordering of operations without using a single server by using an atomic broadcast protocol~\\cite{Defago:2004ji}, such protocols are equivalent to consensus~\\cite{Chandra:1996cp}, so they can only safely make progress if a quorum of participants are reachable. We expect that in peer-to-peer systems of mobile devices participants will frequently be offline, and so any algorithm requiring atomic broadcast would struggle to reach a quorum and become unavailable. Without quorums, the strongest guarantee a system can give is causal ordering~\\cite{Attiya:2015dm}.\n\nThe Google Realtime API~\\cite{Google:2015vk} is to our knowledge the only implementation of OT that supports arbitrary nesting of lists and maps. Like Google Docs, it relies on a single server~\\cite{Lemonik:2016wh}. As a proprietary product, details of its algorithms have not been published.\n\n\\subsection{CRDTs}\\label{sec:related-crdts}\n\nConflict-free replicated datatypes (CRDTs) are a family of data structures that support concurrent modification and guarantee convergence of concurrent updates. They work by attaching additional metadata to the data structure, making modification operations commutative by construction. The JSON datatype described in this paper is a CRDT.\n\nCRDTs for registers, counters, maps, and sets are well-known~\\cite{Shapiro:2011un,Shapiro:2011wy}, and have been implemented in various deployed systems such as Riak~\\cite{Brown:2014hs,Brown:2013wy}. For ordered lists, various algorithms have been proposed, including WOOT~\\cite{Oster:2006wj}, RGA~\\cite{Roh:2011dw}, Treedoc~\\cite{Preguica:2009fz}, Logoot~\\cite{Weiss:2010hx}, and LSEQ~\\cite{Nedelec:2013ky}. Attiya et al.~\\cite{Attiya:2016kh} analyze the metadata overhead of collaboratively edited lists, and provide a correctness proof of the RGA algorithm. However, none of them support nesting: all of the aforementioned algorithms assume that each of their elements is a primitive value, not another CRDT.\n\nThe problem of nesting one CRDT inside another (also known as \\emph{composition} or \\emph{embedding}) has only been studied more recently. Riak allows nesting of counters and registers inside maps, and of maps within other maps~\\cite{Brown:2014hs,Brown:2013wy}. Embedding counters inside maps raises questions of semantics, which have been studied by Baquero, Almeida and Lerche~\\cite{Baquero:2016iv}. Almeida et al.~\\cite{Almeida:2016tk} also define delta mutations for nested maps, and Baquero et al.~\\cite{Baquero:2015tm} define a theoretical framework for composition of state-based CRDTs, based on lattices. None of this work integrates CRDTs for ordered lists, but the treatment of causality in these datatypes forms a basis for the semantics developed in this paper.\n\nBurckhardt et al.~\\cite{Burckhardt:2012jy} define \\emph{cloud types}, which are similar to CRDTs and can be composed. They define \\emph{cloud arrays}, which behave similarly to our map datatype, and \\emph{entities}, which are like unordered sets or relations; ordered lists are not defined in this framework.\n\nOn the other hand, Martin et al.~\\cite{Martin:2010ih} generalize Logoot~\\cite{Weiss:2010hx} to support collaborative editing of XML documents~-- that is, a tree of nested ordered lists without nested maps. As discussed in Section~\\ref{sec:json-xml}, such a structure does not capture the expressiveness of JSON.\n\nAlthough CRDTs for registers, maps and ordered lists have existed for years in isolation, we are not aware of any prior work that allows them all to be composed into an arbitrarily nested CRDT with a JSON-like structure.\n\n\\subsection{Other Approaches}\\label{sec:related-other}\n\nMany replicated data systems need to deal with the problem of concurrent, conflicting modifications, but the solutions are often ad-hoc. For example, in Dynamo~\\cite{DeCandia:2007ui} and CouchDB, if several values are concurrently written to the same key, the database preserves all of these values, and leaves conflict resolution to application code -- in other words, the only datatype it supports is a multi-value register. Naively chosen merge functions often exhibit anomalies such as deleted items reappearing~\\cite{DeCandia:2007ui}. We believe that conflict resolution is not a simple matter that can reasonably be left to application programmers.\n\nAnother frequently-used approach to conflict resolution is \\emph{last writer wins} (LWW), which arbitrarily chooses one among several concurrent writes as ``winner'' and discards the others. LWW is used in Apache Cassandra, for example. It does not meet our requirements, since we want no user input to be lost due to concurrent modifications.\n\nResolving concurrent updates on tree structures has been studied in the context of file synchronization~\\cite{Balasubramaniam:1998jh,Ramsey:2001ce}.\n\nFinally, systems such as Bayou~\\cite{Terry:1995dn} allow offline nodes to execute transactions tentatively, and confirm them when they are next online. This approach relies on all servers executing transactions in the same serial order, and deciding whether a transaction was successful depending on its preconditions. Bayou has the advantage of being able to express global invariants such as uniqueness constraints, which require serialization and cannot be expressed using CRDTs~\\cite{Bailis:2014th}. Bayou's downside is that tentative transactions may be rolled back, requiring explicit handling by the application, whereas CRDTs are defined such that operations cannot fail after they have been performed on one replica.\n\n\n\\section{Composing Data Structures}\\label{sec:composing}\n\nIn this section we informally introduce our approach to collaborative editing of JSON data structures, and illustrate some peculiarities of concurrent nested data structures. A formal presentation of the algorithm follows in Section~\\ref{sec:semantics}.\n\n\\subsection{Concurrent Editing Examples}\\label{sec:examples}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,6.5);\n\\node (leftR) at (0,6) {Replica $p$:};\n\\node (rightR) at (8,6) {Replica $q$:};\n\\node (left0) at (0,5) [rectangle,draw] {\\{``key'': ``A''\\}};\n\\node (right0) at (8,5) [rectangle,draw] {\\{``key'': ``A''\\}};\n\\node (left1) at (0,3) [rectangle,draw] {\\{``key'': ``B''\\}};\n\\node (right1) at (8,3) [rectangle,draw] {\\{``key'': ``C''\\}};\n\\node (left2) at (0,0) [rectangle,draw] {\\{``key'': \\{``B'', ``C''\\}\\}};\n\\node (right2) at (8,0) [rectangle,draw] {\\{``key'': \\{``B'', ``C''\\}\\}};\n\\node (comms) at (4,1.6) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left,inner sep=8pt] {doc.get(``key'') := ``B'';} (left1);\n\\draw [thick,->] (right0) to node [right,inner sep=8pt] {doc.get(``key'') := ``C'';} (right1);\n\\draw [thick,->] (left1) -- (left2);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right2.north west);\n\\draw [thick,dashed,blue,->] (right1.south) to [out=270,in=45] (left2.north east);\n\\draw [thick,->] (right1) -- (right2);\n\\end{tikzpicture}\n\\caption{Concurrent assignment to the register at doc.get(``key'') by replicas $p$ and $q$.}\\label{fig:register-assign}\n\\end{figure*}\n\nThe sequential semantics of editing a JSON data structure are well-known, and the semantics of concurrently editing a flat map or list data structure have been thoroughly explored in the literature (see Section~\\ref{sec:related}). However, when defining a CRDT for JSON data, difficulties arise due to the interactions between concurrency and nested data structures.\n\nIn the following examples we show some situations that might occur when JSON documents are concurrently modified, demonstrate how they are handled by our algorithm, and explain the rationale for our design decisions. In all examples we assume two replicas, labelled $p$ (drawn on the left-hand side) and $q$ (right-hand side). Local state for a replica is drawn in boxes, and modifications to local state are shown with labelled solid arrows; time runs down the page. Since replicas only mutate local state, we make communication of state changes between replicas explicit in our model. Network communication is depicted with dashed arrows.\n\nOur first example is shown in Figure~\\ref{fig:register-assign}. In a document that maps ``key'' to a register with value ``A'', replica $p$ sets the value of the register to ``B'', while replica $q$ concurrently sets it to ``C''. As the replicas subsequently exchange edits via network communication, they detect the conflict. Since we do not want to simply discard one of the edits, and the strings ``B'' and ``C'' cannot be meaningfully merged, the system must preserve both concurrent updates. This datatype is known as a \\emph{multi-value register}: although a replica can only assign a single value to the register, reading the register may return a set of multiple values that were concurrently written.\n\nA multi-value register is hardly an impressive CRDT, since it does not actually perform any conflict resolution. We use it only for primitive values for which no automatic merge function is defined. Other CRDTs could be substituted in its place: for example, a counter CRDT for a number that can only be incremented and decremented, or an ordered list of characters for a collaboratively editable string (see also Figure~\\ref{fig:text-edit}).\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-1) -- (4,8);\n\\node (left0) at (0,7.5) [rectangle,draw] {\\{``colors'': \\{``blue'': ``\\#0000ff''\\}\\}};\n\\node (right0) at (8,7.5) [rectangle,draw] {\\{``colors'': \\{``blue'': ``\\#0000ff''\\}\\}};\n\\node [matrix] (left1) at (0,4) [rectangle,draw] {\n \\node {\\{``colors'': \\{``blue'': ``\\#0000ff'',}; \\\\\n \\node {``red'': ``\\#ff0000''\\}\\}}; \\\\\n};\n\\node (right1) at (8,5.5) [rectangle,draw] {\\{``colors'': \\{\\}\\}};\n\\node (right2) at (8,3) [rectangle,draw] {\\{``colors'': \\{``green'': ``\\#00ff00''\\}\\}};\n\\node [matrix] (left2) at (0,0) [rectangle,draw] {\n \\node {\\{``colors'': \\{``red'': ``\\#ff0000'',}; \\\\\n \\node {``green'': ``\\#00ff00''\\}\\}}; \\\\\n};\n\\node [matrix] (right3) at (8,0) [rectangle,draw] {\n \\node {\\{``colors'': \\{``red'': ``\\#ff0000'',}; \\\\\n \\node {``green'': ``\\#00ff00''\\}\\}}; \\\\\n};\n\\node (comms) at (4,2.1) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) -- (left1)\n node [left,text width=4.2cm,text centered,midway] {doc.get(``colors'').get(``red'') := ``\\#ff0000'';};\n\\draw [thick,->] (right0) to node [right] {doc.get(``colors'') := \\{\\};} (right1);\n\\draw [thick,->] (right1) -- (right2)\n node [right,text width=4.2cm,text centered,midway] {doc.get(``colors'').get(``green'') := ``\\#00ff00'';};\n\\draw [thick,->] (left1) to (left2);\n\\draw [thick,->] (right2) to (right3);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right3.north west);\n\\draw [thick,dashed,blue,->] (right2.south) to [out=270,in=45] (left2.north east);\n\\end{tikzpicture}\n\\caption{Modifying the contents of a nested map while concurrently the entire map is overwritten.}\\label{fig:map-remove}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (5,-0.5) -- (5,10);\n\\node (left0) at (0,9.5) [rectangle,draw] {\\{\\}};\n\\node (right0) at (10,9.5) [rectangle,draw] {\\{\\}};\n\\node (left1) at (0,7.5) [rectangle,draw] {\\{``grocery'': []\\}};\n\\node (right1) at (10,7.5) [rectangle,draw] {\\{``grocery'': []\\}};\n\\node (left2) at (0,5.0) [rectangle,draw] {\\{``grocery'': [``eggs'']\\}};\n\\node (left3) at (0,2.5) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'']\\}};\n\\node (right2) at (10,5.0) [rectangle,draw] {\\{``grocery'': [``milk'']\\}};\n\\node (right3) at (10,2.5) [rectangle,draw] {\\{``grocery'': [``milk'', ``flour'']\\}};\n\\node (left4) at (0,0.0) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'', ``milk'', ``flour'']\\}};\n\\node (right4) at (10,0.0) [rectangle,draw] {\\{``grocery'': [``eggs'', ``ham'', ``milk'', ``flour'']\\}};\n\\node (comms) at (5,1.4) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left] {doc.get(``grocery'') := [];} (left1);\n\\draw [thick,->] (right0) to node [right] {doc.get(``grocery'') := [];} (right1);\n\\draw [thick,->] (left1) -- (left2)\n node [left,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(0) .insertAfter(``eggs'');};\n\\draw [thick,->] (right1) -- (right2)\n node [right,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(0) .insertAfter(``milk'');};\n\\draw [thick,->] (left2) -- (left3)\n node [left,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(1) .insertAfter(``ham'');};\n\\draw [thick,->] (right2) -- (right3)\n node [right,text width=4cm,text centered,midway] {doc.get(``grocery'').idx(1) .insertAfter(``flour'');};\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Two replicas concurrently create ordered lists under the same map key.}\\label{fig:two-lists}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,8.5);\n\\node (leftR) at (0,8) {Replica $p$:};\n\\node (rightR) at (8,8) {Replica $q$:};\n\\node (left1) at (0,7) [rectangle,draw] {[``a'', ``b'', ``c'']};\n\\node (left2) at (0,5) [rectangle,draw] {[``a'', ``c'']};\n\\node (left3) at (0,3) [rectangle,draw] {[``a'', ``x'', ``c'']};\n\\node (left4) at (0,0) [rectangle,draw] {[``y'', ``a'', ``x'', ``z'', ``c'']};\n\\node (right1) at (8,7) [rectangle,draw] {[``a'', ``b'', ``c'']};\n\\node (right2) at (8,5) [rectangle,draw] {[``y'', ``a'', ``b'', ``c'']};\n\\node (right3) at (8,3) [rectangle,draw] {[``y'', ``a'', ``z'', ``b'', ``c'']};\n\\node (right4) at (8,0) [rectangle,draw] {[``y'', ``a'', ``x'', ``z'', ``c'']};\n\\node (comms) at (4, 1.5) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left1) to node [left] {doc.idx(2).delete;} (left2);\n\\draw [thick,->] (left2) to node [left] {doc.idx(1).insertAfter(``x'');} (left3);\n\\draw [thick,->] (right1) to node [right] {doc.idx(0).insertAfter(``y'');} (right2);\n\\draw [thick,->] (right2) to node [right] {doc.idx(2).insertAfter(``z'');} (right3);\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Concurrent editing of an ordered list of characters (i.e., a text document).}\\label{fig:text-edit}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-1) -- (4,7.5);\n\\node (left1) at (0,7) [rectangle,draw] {\\{\\}};\n\\node (left2) at (0,5) [rectangle,draw] {\\{``a'': \\{\\}\\}};\n\\node (left3) at (0,3) [rectangle,draw] {\\{``a'': \\{``x'': ``y''\\}\\}};\n\\node [matrix] (left4) at (0,0) [rectangle,draw] {\n \\node {\\{mapT(``a''): \\{``x'': ``y''\\},}; \\\\\n \\node {listT(``a''): [``z'']\\}}; \\\\\n};\n\\node (right1) at (8,7) [rectangle,draw] {\\{\\}};\n\\node (right2) at (8,5) [rectangle,draw] {\\{``a'': []\\}};\n\\node (right3) at (8,3) [rectangle,draw] {\\{``a'': [``z'']\\}};\n\\node [matrix] (right4) at (8,0) [rectangle,draw] {\n \\node {\\{mapT(``a''): \\{``x'': ``y''\\},}; \\\\\n \\node {listT(``a''): [``z'']\\}}; \\\\\n};\n\\node (comms) at (4,2.0) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left1) to node [left] {doc.get(``a'') := \\{\\};} (left2);\n\\draw [thick,->] (left2) to node [left] {doc.get(``a'').get(``x'') := ``y'';} (left3);\n\\draw [thick,->] (right1) to node [right] {doc.get(``a'') := [];} (right2);\n\\draw [thick,->] (right2) to node [right] {doc.get(``a'').idx(0).insertAfter(``z'');} (right3);\n\\draw [thick,->] (left3) to (left4);\n\\draw [thick,->] (right3) to (right4);\n\\draw [thick,dashed,blue,->] (left3.south) to [out=270,in=135] (right4.north west);\n\\draw [thick,dashed,blue,->] (right3.south) to [out=270,in=45] (left4.north east);\n\\end{tikzpicture}\n\\caption{Concurrently assigning values of different types to the same map key.}\\label{fig:type-clash}\n\\end{figure*}\n\n\\begin{figure*}[p]\n\\centering\n\\begin{tikzpicture}[auto,scale=0.8]\n\\path [draw,dotted] (4,-0.5) -- (4,7.0);\n\\node [matrix] (left0) at (0,6) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': false\\}]\\}}; \\\\\n};\n\\node [matrix] (right0) at (8,6) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': false\\}]\\}}; \\\\\n};\n\\node (left1) at (0,3) [rectangle,draw] {\\{``todo'': []\\}};\n\\node [matrix] (right1) at (8,3) [rectangle,draw] {\n \\node {\\{``todo'': [\\{``title'': ``buy milk'',}; \\\\\n \\node {``done'': true\\}]\\}}; \\\\\n};\n\\node (left2) at (0,0) [rectangle,draw] {\\{``todo'': [\\{``done'': true\\}]\\}};\n\\node (right2) at (8,0) [rectangle,draw] {\\{``todo'': [\\{``done'': true\\}]\\}};\n\\node (comms) at (4,1.6) [text=blue] {\\footnotesize network communication};\n\\draw [thick,->] (left0) to node [left] {doc.get(``todo'').idx(1).delete;} (left1);\n\\draw [thick,->] (right0) to node [right] {doc.get(``todo'').idx(1).get(``done'') := true;} (right1);\n\\draw [thick,->] (left1) to (left2);\n\\draw [thick,->] (right1) to (right2);\n\\draw [thick,dashed,blue,->] (left1.south) to [out=270,in=135] (right2.north west);\n\\draw [thick,dashed,blue,->] (right1.south) to [out=270,in=45] (left2.north east);\n\\end{tikzpicture}\n\\caption{One replica removes a list element, while another concurrently updates its contents.}\\label{fig:todo-item}\n\\end{figure*}\n\nFigure~\\ref{fig:map-remove} gives an example of concurrent edits at different levels of the JSON tree. Here, replica $p$ adds ``red'' to a map of colors, while replica $q$ concurrently blanks out the entire map of colors and then adds ``green''. Instead of assigning an empty map, $q$ could equivalently remove the entire key ``colors'' from the outer map, and then assign a new empty map to that key. The difficulty in this example is that the addition of ``red'' occurs at a lower level of the tree, while concurrently the removal of the map of colors occurs at a higher level of the tree.\n\nOne possible way of handling such a conflict would be to let edits at higher levels of the tree always override concurrent edits within that subtree. In this case, that would mean the addition of ``red'' would be discarded, since it would be overridden by the blanking-out of the entire map of colors. However, that behavior would violate our requirement that no user input should be lost due to concurrent modifications. Instead, we define merge semantics that preserve all changes, as shown in Figure~\\ref{fig:map-remove}: ``blue'' must be absent from the final map, since it was removed by blanking out the map, while ``red'' and ``green'' must be present, since they were explicitly added. This behavior matches that of CRDT maps in Riak~\\cite{Brown:2014hs,Brown:2013wy}.\n\nFigure~\\ref{fig:two-lists} illustrates another problem with maps: two replicas can concurrently insert the same map key. Here, $p$ and $q$ each independently create a new shopping list under the same map key ``grocery'', and add items to the list. In the case of Figure~\\ref{fig:register-assign}, concurrent assignments to the same map key were left to be resolved by the application, but in Figure~\\ref{fig:two-lists}, both values are lists and so they can be merged automatically. We preserve the ordering and adjacency of items inserted at each replica, so ``ham'' appears after ``eggs'', and ``flour'' appears after ``milk'' in the merged result. There is no information on which replica's items should appear first in the merged result, so the algorithm can make an arbitrary choice between ``eggs, ham, milk, flour'' and ``milk, flour, eggs, ham'', provided that all replicas end up with the items in the same order.\n\nFigure~\\ref{fig:text-edit} shows how a collaborative text editor can be implemented, by treating the document as a list of characters. All changes are preserved in the merged result: ``y'' is inserted before ``a''; ``x'' and ``z'' are inserted between ``a'' and ``c''; and ``b'' is deleted.\n\nFigure~\\ref{fig:type-clash} demonstrates a variant of the situation in Figure~\\ref{fig:two-lists}, where two replicas concurrently insert the same map key, but they do so with different datatypes as values: $p$ inserts a nested map, whereas $q$ inserts a list. These datatypes cannot be meaningfully merged, so we preserve both values separately. We do this by tagging each map key with a type annotation (\\textsf{mapT}, \\textsf{listT}, or \\textsf{regT} for a map, list, or register value respectively), so each type inhabits a separate namespace.\n\nFinally, Figure~\\ref{fig:todo-item} shows a limitation of the principle of preserving all user input. In a to-do list application, one replica removes a to-do item from the list, while another replica concurrently marks the same item as done. As the changes are merged, the update of the map key ``done'' effectively causes the list item to be resurrected on replica $p$, leaving a to-do item without a title (since the title was deleted as part of deleting the list item). This behavior is consistent with the example in Figure~\\ref{fig:map-remove}, but it is perhaps surprising. In this case it may be more desirable to discard one of the concurrent updates, and thus preserve the implicit schema that a to-do item has both a ``title'' and a ``done'' field. We leave the analysis of developer expectations and the development of a schema language for future work.\n\n\\subsection{JSON Versus XML}\\label{sec:json-xml}\n\nThe most common alternative to JSON is XML, and collaborative editing of XML documents has been previously studied~\\cite{Davis:2002iv,Ignat:2003jy,Wang:2015vo}. Besides the superficial syntactical differences, the tree structure of XML and JSON appears quite similar. However, there is an important difference that we should highlight.\n\nJSON has two collection constructs that can be arbitrarily nested: maps for unordered key-value pairs, and lists for ordered sequences. In XML, the children of an element form an ordered sequence, while the attributes of an element are unordered key-value pairs. However, XML does not allow nested elements inside attributes -- the value of an attribute can only be a primitive datatype. Thus, XML supports maps within lists, but not lists within maps. In this regard, XML is less expressive than JSON: the scenarios in Figures~\\ref{fig:two-lists} and~\\ref{fig:type-clash} cannot occur in XML.\n\nSome applications may attach map-like semantics to the children of an XML document, for example by interpreting the child element name as key. However, this key-value structure is not part of XML itself, and would not be enforced by existing collaborative editing algorithms for XML. If multiple children with the same key are concurrently created, existing algorithms would create duplicate children with the same key rather than merging them like in Figure~\\ref{fig:two-lists}.\n\n\\subsection{Document Editing API}\\label{sec:editing-api}\n\n\\begin{figure}\n\\centering\n\\begin{tabular}{rcll}\nCMD & ::= & \\texttt{let} $x$ \\texttt{=} EXPR & $x \\in \\mathrm{VAR}$ \\\\\n& $|$ & $\\mathrm{EXPR}$ \\texttt{:=} $v$ & $v \\in \\mathrm{VAL}$ \\\\\n& $|$ & $\\mathrm{EXPR}$\\texttt{.insertAfter(}$v$\\texttt{)} & $v \\in \\mathrm{VAL}$ \\\\\n& $|$ & $\\mathrm{EXPR}$\\texttt{.delete} \\\\\n& $|$ & \\texttt{yield} \\\\\n& $|$ & CMD\\texttt{;} CMD \\vspace{0.5em}\\\\\nEXPR & ::= & \\texttt{doc} \\\\\n& $|$ & $x$ & $x \\in \\mathrm{VAR}$ \\\\\n& $|$ & EXPR\\texttt{.get(}$\\mathit{key}$\\texttt{)} & $\\mathit{key} \\in \\mathrm{String}$ \\\\\n& $|$ & EXPR\\texttt{.idx(}$i$\\texttt{)} & $i \\ge 0$ \\\\\n& $|$ & EXPR\\texttt{.keys} \\\\\n& $|$ & EXPR\\texttt{.values} \\vspace{0.5em}\\\\\nVAR & ::= & $x$ & $x \\in \\mathrm{VarString}$\\\\\nVAL & ::= & $n$ & $n \\in \\mathrm{Number}$ \\\\\n& $|$ & $\\mathit{str}$ & $\\mathit{str} \\in \\mathrm{String}$ \\\\\n& $|$ & \\texttt{true} $|$ \\texttt{false} $|$ \\texttt{null} \\\\\n& $|$ & \\verb|{}| $|$ \\verb|[]|\n\\end{tabular}\n\\caption{Syntax of command language for querying and modifying a document.}\\label{fig:local-syntax}\n\\end{figure}\n\n\\begin{figure}\n\\centering\n\\begin{verbatim}\ndoc := {};\ndoc.get(\"shopping\") := [];\nlet head = doc.get(\"shopping\").idx(0);\nhead.insertAfter(\"eggs\");\nlet eggs = doc.get(\"shopping\").idx(1);\nhead.insertAfter(\"cheese\");\neggs.insertAfter(\"milk\");\n\n// Final state:\n{\"shopping\": [\"cheese\", \"eggs\", \"milk\"]}\n\\end{verbatim}\n\\caption{Example of programmatically constructing a JSON document.}\\label{fig:make-doc}\n\\end{figure}\n\nTo define the semantics for collaboratively editable data structures, we first define a simple command language that is executed locally at any of the replicas, and which allows that replica's local copy of the document to be queried and modified. Performing read-only queries has no side-effects, but modifying the document has the effect of producing \\emph{operations} describing the mutation. Those operations are immediately applied to the local copy of the document, and also enqueued for asynchronous broadcasting to other replicas.\n\nThe syntax of the command language is given in Figure~\\ref{fig:local-syntax}. It is not a full programming language, but rather an API through which the document state is queried and modified. We assume that the program accepts user input and issues a (possibly infinite) sequence of commands to the API. We model only the semantics of those commands, and do not assume anything about the program in which the command language is embedded. The API differs slightly from the JSON libraries found in many programming languages, in order to allow us to define consistent merge semantics.\n\nWe first explain the language informally, before giving its formal semantics. The expression construct EXPR is used to construct a \\emph{cursor} which identifies a position in the document. An expression starts with either the special token \\texttt{doc}, identifying the root of the JSON document tree, or a variable $x$ that was previously defined in a \\texttt{let} command. The expression defines, left to right, the path the cursor takes as it navigates through the tree towards the leaves: the operator \\texttt{.get(}$\\mathit{key}$\\texttt{)} selects a key within a map, and \\texttt{.idx(}$n$\\texttt{)} selects the $n$th element of an ordered list. Lists are indexed starting from 1, and \\texttt{.idx(0)} is a special cursor indicating the head of a list (a virtual position before the first list element).\n\nThe expression construct EXPR can also query the state of the document: \\texttt{keys} returns the set of keys in the map at the current cursor, and \\texttt{values} returns the contents of the multi-value register at the current cursor. (\\texttt{values} is not defined if the cursor refers to a map or list.)\n\nA command CMD either sets the value of a local variable (\\texttt{let}), performs network communication (\\texttt{yield}), or modifies the document. A document can be modified by writing to a register (the operator \\texttt{:=} assigns the value of the register identified by the cursor), by inserting an element into a list (\\texttt{insertAfter} places a new element after the existing list element identified by the cursor, and \\texttt{.idx(0).insertAfter} inserts at the head of a list), or by deleting an element from a list or a map (\\texttt{delete} removes the element identified by the cursor).\n\nFigure~\\ref{fig:make-doc} shows an example sequence of commands that constructs a new document representing a shopping list. First \\texttt{doc} is set to \\verb|{}|, the empty map literal, and then the key \\verb|\"shopping\"| within that map is set to the empty list \\verb|[]|. The third line navigates to the key \\verb|\"shopping\"| and selects the head of the list, placing the cursor in a variable called \\texttt{head}. The list element ``eggs'' is inserted at the head of the list. In line 5, the variable \\texttt{eggs} is set to a cursor pointing at the list element ``eggs''. Then two more list elements are inserted: ``cheese'' at the head, and ``milk'' after ``eggs''.\n\nNote that the cursor \\texttt{eggs} identifies the list element by identity, not by its index: after the insertion of ``cheese'', the element ``eggs'' moves from index 1 to 2, but ``milk'' is nevertheless inserted after ``eggs''. As we shall see later, this feature is helpful for achieving desirable semantics in the presence of concurrent modifications.\n\n\n\\begin{figure*}\n\\begin{center}\n\\AxiomC{$\\mathit{cmd}_1 \\mathbin{:} \\mathrm{CMD}$}\n\\AxiomC{$A_p,\\, \\mathit{cmd}_1 \\evalto A_p'$}\n\\LeftLabel{\\textsc{Exec}}\n\\BinaryInfC{$A_p,\\, \\langle \\mathit{cmd}_1 \\mathbin{;} \\mathit{cmd}_2 \\mathbin{;} \\dots \\rangle\n \\evalto A_p',\\, \\langle \\mathit{cmd}_2 \\mathbin{;} \\dots \\rangle$}\n\\DisplayProof\\hspace{4em}\n%\n\\AxiomC{}\n\\LeftLabel{\\textsc{Doc}}\n\\UnaryInfC{$A_p,\\, \\mathsf{doc} \\evalto \\mathsf{cursor}(\\langle\\rangle,\\, \\mathsf{doc})$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\n\n\\begin{center}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\LeftLabel{\\textsc{Let}}\n\\UnaryInfC{$A_p,\\, \\mathsf{let}\\; x = \\mathit{expr} \\evalto A_p[\\,x \\,\\mapsto\\, \\mathit{cur}\\,]$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$x \\in \\mathrm{dom}(A_p)$}\n\\LeftLabel{\\textsc{Var}}\n\\UnaryInfC{$A_p,\\, x \\evalto A_p(x)$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$}\n\\AxiomC{$k_n \\not= \\mathsf{head}$}\n\\LeftLabel{\\textsc{Get}}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{get}(\\mathit{key}) \\evalto\n \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1}, \\mathsf{mapT}(k_n) \\rangle,\\, \\mathit{key})$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$}\n\\AxiomC{$A_p,\\, \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1}, \\mathsf{listT}(k_n) \\rangle,\\,\n \\mathsf{head}).\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\LeftLabel{$\\textsc{Idx}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{idx}(i)\n \\evalto \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n')$}\n\\LeftLabel{$\\textsc{Idx}_2$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{idx}(i)\n \\evalto \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n')$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i>0 \\,\\wedge\\, \\mathit{ctx}(\\mathsf{next}(k)) = k' \\,\\wedge\\, k' \\not= \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{pres}(k')) \\not= \\{\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k').\\mathsf{idx}(i-1) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Idx}_3$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i>0 \\,\\wedge\\, \\mathit{ctx}(\\mathsf{next}(k)) = k' \\,\\wedge\\, k' \\not= \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{pres}(k')) = \\{\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k').\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\LeftLabel{$\\textsc{Idx}_4$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto \\mathit{cur}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$i=0$}\n\\LeftLabel{$\\textsc{Idx}_5$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{idx}(i) \\evalto\n \\mathsf{cursor}(\\langle\\rangle,\\, k)$}\n\\end{prooftree}\n\n\\[ \\mathrm{keys}(\\mathit{ctx}) = \\{\\; k \\mid\n \\mathsf{mapT}(k) \\in \\mathrm{dom}(\\mathit{ctx}) \\,\\vee\\,\n \\mathsf{listT}(k) \\in \\mathrm{dom}(\\mathit{ctx}) \\,\\vee\\,\n \\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})\n\\;\\} \\]\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathit{cur}.\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\LeftLabel{$\\textsc{Keys}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{map} = \\mathit{ctx}(\\mathsf{mapT}(k))$}\n\\AxiomC{$\\mathit{keys} = \\{\\; k \\mid k \\in \\mathrm{keys}(\\mathit{map}) \\,\\wedge\\,\n \\mathit{map}(\\mathsf{pres}(k)) \\not= \\{\\} \\;\\}$}\n\\LeftLabel{$\\textsc{Keys}_2$}\n\\BinaryInfC{$A_p,\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{keys} \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{keys}\n \\evalto \\mathit{keys}$}\n\\LeftLabel{$\\textsc{Keys}_3$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{keys}\n \\evalto \\mathit{keys}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathit{cur}.\\mathsf{values} \\evalto \\mathit{val}$}\n\\LeftLabel{$\\textsc{Val}_1$}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{values} \\evalto \\mathit{val}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{val} = \\mathrm{range}(\\mathit{ctx}(\\mathsf{regT}(k)))$}\n\\LeftLabel{$\\textsc{Val}_2$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle\\rangle,\\, k).\\mathsf{values} \\evalto \\mathit{val}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k_1 \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(k_1),\\, \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{values}\n \\evalto \\mathit{val}$}\n\\LeftLabel{$\\textsc{Val}_3$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n).\\mathsf{values}\n \\evalto \\mathit{val}$}\n\\end{prooftree}\n\\caption{Rules for evaluating expressions.}\\label{fig:expr-rules}\n\\end{figure*}\n\n\\section{Formal Semantics}\\label{sec:semantics}\n\nWe now explain formally how to achieve the concurrent semantics outlined in Section~\\ref{sec:composing}. The state of replica $p$ is described by $A_p$, a finite partial function. The evaluation rules of the command language inspect and modify this local state $A_p$, and they do not depend on $A_q$ (the state of any other replica $q \\neq p$). The only communication between replicas occurs in the evaluation of the \\textsf{yield} command, which we discuss later. For now, we concentrate on the execution of commands at a single replica $p$.\n\n\\subsection{Expression Evaluation}\n\nFigure~\\ref{fig:expr-rules} gives the rules for evaluating EXPR expressions in the command language, which are evaluated in the context of the local replica state $A_p$. The \\textsc{Exec} rule formalizes the assumption that commands are executed sequentially. The \\textsc{Let} rule allows the program to define a local variable, which is added to the local state (the notation $A_p[\\,x \\,\\mapsto\\, \\mathit{cur}\\,]$ denotes a partial function that is the same as $A_p$, except that $A_p(x) = \\mathit{cur}$). The corresponding \\textsc{Var} rule allows the program to retrieve the value of a previously defined variable.\n\nThe following rules in Figure~\\ref{fig:expr-rules} show how an expression is evaluated to a cursor, which unambiguously identifies a particular position in a JSON document by describing a path from the root of the document tree to some branch or leaf node. A cursor consists only of immutable keys and identifiers, so it can be sent over the network to another replica, where it can be used to locate the same position in the document.\n\nFor example,\n\\[ \\mathsf{cursor}(\\langle \\mathsf{mapT}(\\mathsf{doc}), \\mathsf{listT}(\\text{``shopping''}) \\rangle,\\, \\mathit{id}_1) \\]\nis a cursor representing the list element \\verb|\"eggs\"| in Figure~\\ref{fig:make-doc}, assuming that $\\mathit{id}_1$ is the unique identifier of the operation that inserted this list element (we will discuss these identifiers in Section~\\ref{sec:lamport-ts}). The cursor can be interpreted as a path through the local replica state structure $A_p$, read from left to right: starting from the \\textsf{doc} map at the root, it traverses through the map entry ``shopping'' of type \\textsf{listT}, and finishes with the list element that has identifier $\\mathit{id}_1$.\n\nIn general, $\\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n)$ consists of a (possibly empty) vector of keys $\\langle k_1, \\dots, k_{n-1} \\rangle$, and a final key $k_n$ which is always present. $k_n$ can be thought of as the final element of the vector, with the distinction that it is not tagged with a datatype, whereas the elements of the vector are tagged with the datatype of the branch node being traversed, either \\textsf{mapT} or \\textsf{listT}.\n\nThe \\textsc{Doc} rule in Figure~\\ref{fig:expr-rules} defines the simplest cursor $\\mathsf{cursor}(\\langle\\rangle,\\, \\mathsf{doc})$, referencing the root of the document using the special atom \\textsf{doc}. The \\textsc{Get} rule navigates a cursor to a particular key within a map. For example, the expression \\verb|doc.get(\"shopping\")| evaluates to $\\mathsf{cursor}(\\langle \\mathsf{mapT}(\\mathsf{doc}) \\rangle,\\, \\text{``shopping''})$ by applying the \\textsc{Doc} and \\textsc{Get} rules. Note that the expression \\verb|doc.get(...)| implicitly asserts that \\textsf{doc} is of type \\textsf{mapT}, and this assertion is encoded in the cursor.\n\nThe rules $\\textsc{Idx}_{1 \\dots 5}$ define how to evaluate the expression \\verb|.idx(|$n$\\verb|)|, moving the cursor to a particular element of a list. $\\textsc{Idx}_1$ constructs a cursor representing the head of the list, and delegates to the subsequent rules to scan over the list. $\\textsc{Idx}_2$ recursively descends the local state according to the vector of keys in the cursor. When the vector of keys is empty, the context $\\mathit{ctx}$ is the subtree of $A_p$ that stores the list in question, and the rules $\\textsc{Idx}_{3,4,5}$ iterate over that list until the desired element is found.\n\n$\\textsc{Idx}_5$ terminates the iteration when the index reaches zero, while $\\textsc{Idx}_3$ moves to the next element and decrements the index, and $\\textsc{Idx}_4$ skips over list elements that are marked as deleted. The structure resembles a linked list: each list element has a unique identifier $k$, and the partial function representing local state maps $\\mathsf{next}(k)$ to the ID of the list element that follows $k$.\n\nDeleted elements are never removed from the linked list structure, but only marked as deleted (they become so-called \\emph{tombstones}). To this end, the local state maintains a \\emph{presence set} $\\mathsf{pres}(k)$ for the list element with ID $k$, which is the set of all operations that have asserted the existence of this list element. When a list element is deleted, the presence set is set to the empty set, which marks it as deleted; however, a concurrent operation that references the list element can cause the presence set to be come non-empty again (leading to the situations in Figures~\\ref{fig:map-remove} and~\\ref{fig:todo-item}). Rule $\\textsc{Idx}_4$ handles list elements with an empty presence set by moving to the next list element without decrementing the index (i.e., not counting them as list elements).\n\nThe $\\textsc{Keys}_{1,2,3}$ rules allow the application to inspect the set of keys in a map. This set is determined by examining the local state, and excluding any keys for which the presence set is empty (indicating that the key has been deleted).\n\nFinally, the $\\textsc{Val}_{1,2,3}$ rules allow the application to read the contents of a register at a particular cursor position, using a similar recursive rule structure as the \\textsc{Idx} rules. A register is expressed using the \\textsf{regT} type annotation in the local state. Although a replica can only assign a single value to a register, a register can nevertheless contain multiple values if multiple replicas concurrently assign values to it.\n\n\\subsection{Generating Operations}\n\nWhen commands mutate the state of the document, they generate \\emph{operations} that describe the mutation. In our semantics, a command never directly modifies the local replica state $A_p$, but only generates an operation. That operation is then immediately applied to $A_p$ so that it takes effect locally, and the same operation is also asynchronously broadcast to the other replicas.\n\n\\subsubsection{Lamport Timestamps}\\label{sec:lamport-ts}\n\nEvery operation in our model is given a unique identifier, which is used in the local state and in cursors. Whenever an element is inserted into a list, or a value is assigned to a register, the new list element or register value is identified by the identifier of the operation that created it.\n\nIn order to generate globally unique operation identifiers without requiring synchronous coordination between replicas we use Lamport timestamps~\\cite{Lamport:1978jq}. A Lamport timestamp is a pair $(c, p)$ where $p \\in \\mathrm{ReplicaID}$ is the unique identifier of the replica on which the edit is made (for example, a hash of its public key), and $c \\in \\mathbb{N}$ is a counter that is stored at each replica and incremented for every operation. Since each replica generates a strictly monotonically increasing sequence of counter values $c$, the pair $(c, p)$ is unique.\n\nIf a replica receives an operation with a counter value $c$ that is greater than the locally stored counter value, the local counter is increased to the value of the incoming counter. This ensures that if operation $o_1$ causally happened before $o_2$ (that is, the replica that generated $o_2$ had received and processed $o_1$ before $o_2$ was generated), then $o_2$ must have a greater counter value than $o_1$. Only concurrent operations can have equal counter values.\n\nWe can thus define a total ordering $<$ for Lamport timestamps:\n\\[ (c_1, p_1) < (c_2, p_2) \\;\\text{ iff }\\; (c_1 < c_2) \\vee (c_1 = c_2 \\wedge p_1 < p_2). \\]\nIf one operation happened before another, this ordering is consistent with causality (the earlier operation has a lower timestamp). If two operations are concurrent, their order according to $<$ is arbitrary but deterministic. This ordering property is important for our definition of the semantics of ordered lists.\n\n\\subsubsection{Operation Structure}\n\nAn operation is a tuple of the form\n\\begin{alignat*}{3}\n& \\mathsf{op}( \\\\\n&& \\mathit{id} &: \\mathbb{N} \\times \\mathrm{ReplicaID}, \\\\\n&& \\mathit{deps} &: \\mathcal{P}(\\mathbb{N} \\times \\mathrm{ReplicaID}), \\\\\n&& \\mathit{cur} &: \\mathsf{cursor}(\\langle k_1, \\dots, k_{n-1} \\rangle,\\, k_n), \\\\\n&& \\mathit{mut} &: \\mathsf{insert}(v) \\mid \\mathsf{delete} \\mid \\mathsf{assign}(v) && \\quad v: \\mathrm{VAL} \\\\\n& )\n\\end{alignat*}\nwhere $\\mathit{id}$ is the Lamport timestamp that uniquely identifies the operation, $\\mathit{cur}$ is the cursor describing the position in the document being modified, and $\\mathit{mut}$ is the mutation that was requested at the specified position.\n\n$\\mathit{deps}$ is the set of \\emph{causal dependencies} of the operation. It is defined as follows: if operation $o_2$ was generated by replica $p$, then a causal dependency of $o_2$ is any operation $o_1$ that had already been applied on $p$ at the time when $o_2$ was generated. In this paper, we define $\\mathit{deps}$ as the set of Lamport timestamps of all causal dependencies. In a real implementation, this set would become impracticably large, so a compact representation of causal history would be used instead -- for example, version vectors~\\cite{ParkerJr:1983jb}, state vectors~\\cite{Ellis:1989ue}, or dotted version vectors~\\cite{Preguica:2012fx}. However, to avoid ambiguity in our semantics we give the dependencies as a simple set of operation IDs.\n\nThe purpose of the causal dependencies $\\mathit{deps}$ is to impose a partial ordering on operations: an operation can only be applied after all operations that ``happened before'' it have been applied. In particular, this means that the sequence of operations generated at one particular replica will be applied in the same order at every other replica. Operations that are concurrent (i.e., where there is no causal dependency in either direction) can be applied in any order.\n\n\\subsubsection{Semantics of Generating Operations}\n\n\\begin{figure*}\n\\centering\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$\\mathit{val}: \\mathrm{VAL}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{assign}(\\mathit{val})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Assign}}\n\\TrinaryInfC{$A_p,\\, \\mathit{expr} \\,\\text{ := }\\, \\mathit{val} \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$\\mathit{val}: \\mathrm{VAL}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{insert}(\\mathit{val})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Insert}}\n\\TrinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{insertAfter}(\\mathit{val}) \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{expr} \\evalto \\mathit{cur}$}\n\\AxiomC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathsf{delete}) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Delete}}\n\\BinaryInfC{$A_p,\\, \\mathit{expr}.\\mathsf{delete} \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctr} = \\mathrm{max}(\\{0\\} \\,\\cup\\, \\{ c_i \\mid (c_i, p_i) \\in A_p(\\mathsf{ops}) \\}$}\n\\AxiomC{$A_p,\\, \\mathsf{apply}(\\mathsf{op}((\\mathit{ctr} + 1, p), A_p(\\mathsf{ops}),\n \\mathit{cur}, \\mathit{mut})) \\evalto A_p'$}\n\\LeftLabel{\\textsc{Make-Op}}\n\\BinaryInfC{$A_p,\\, \\mathsf{makeOp}(\\mathit{cur}, \\mathit{mut}) \\evalto A_p'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathit{op} \\evalto A_p'$}\n\\LeftLabel{\\textsc{Apply-Local}}\n\\UnaryInfC{$A_p,\\, \\mathsf{apply}(\\mathit{op}) \\evalto A_p'[\\,\n \\mathsf{queue} \\,\\mapsto\\, A_p'(\\mathsf{queue}) \\,\\cup\\, \\{\\mathit{op}\\},\\;\n \\mathsf{ops} \\,\\mapsto\\, A_p'(\\mathsf{ops}) \\,\\cup\\, \\{\\mathit{op.id}\\}\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{op} \\in A_p(\\mathsf{recv})$}\n\\AxiomC{$\\mathit{op.id} \\notin A_p(\\mathsf{ops})$}\n\\AxiomC{$\\mathit{op.deps} \\subseteq A_p(\\mathsf{ops})$}\n\\AxiomC{$A_p,\\, \\mathit{op} \\evalto A_p'$}\n\\LeftLabel{\\textsc{Apply-Remote}}\n\\QuaternaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p'[\\,\\mathsf{ops} \\,\\mapsto\\, A_p'(\\mathsf{ops}) \\,\\cup\\, \\{\\mathit{op.id}\\}\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{}\n\\LeftLabel{\\textsc{Send}}\n\\UnaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p[\\,\\mathsf{send} \\,\\mapsto\\, A_p(\\mathsf{send}) \\,\\cup\\, A_p(\\mathsf{queue})\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$q: \\mathrm{ReplicaID}$}\n\\LeftLabel{\\textsc{Recv}}\n\\UnaryInfC{$A_p,\\, \\mathsf{yield} \\evalto\n A_p[\\,\\mathsf{recv} \\,\\mapsto\\, A_p(\\mathsf{recv}) \\,\\cup\\, A_q(\\mathsf{send})\\,]$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$A_p,\\, \\mathsf{yield} \\evalto A_p'$}\n\\AxiomC{$A_p',\\, \\mathsf{yield} \\evalto A_p''$}\n\\LeftLabel{\\textsc{Yield}}\n\\BinaryInfC{$A_p,\\, \\mathsf{yield} \\evalto A_p''$}\n\\end{prooftree}\n\\caption{Rules for generating, sending, and receiving operations.}\n\\label{fig:send-recv}\n\\end{figure*}\n\nThe evaluation rules for commands are given in Figure~\\ref{fig:send-recv}. The \\textsc{Make-Assign}, \\textsc{Make-Insert} and \\textsc{Make-Delete} rules define how these respective commands mutate the document: all three delegate to the \\textsc{Make-Op} rule to generate and apply the operation. \\textsc{Make-Op} generates a new Lamport timestamp by choosing a counter value that is 1 greater than any existing counter in $A_p(\\mathsf{ops})$, the set of all operation IDs that have been applied to replica $p$.\n\n\\textsc{Make-Op} constructs an \\textsf{op()} tuple of the form described above, and delegates to the \\textsc{Apply-Local} rule to process the operation. \\textsc{Apply-Local} does three things: it evaluates the operation to produce a modified local state $A_p'$, it adds the operation to the queue of generated operations $A_p(\\mathsf{queue})$, and it adds the ID to the set of processed operations $A_p(\\mathsf{ops})$.\n\nThe \\textsf{yield} command, inspired by Burckhardt et al.~\\cite{Burckhardt:2012jy}, performs network communication: sending and receiving operations to and from other replicas, and applying operations from remote replicas. The rules \\textsc{Apply-Remote}, \\textsc{Send}, \\textsc{Recv} and \\textsc{Yield} define the semantics of \\textsf{yield}. Since any of these rules can be used to evaluate \\textsf{yield}, their effect is nondeterministic, which models the asynchronicity of the network: a message sent by one replica arrives at another replica at some arbitrarily later point in time, and there is no message ordering guarantee in the network.\n\nThe \\textsc{Send} rule takes any operations that were placed in $A_p(\\mathsf{queue})$ by \\textsc{Apply-Local} and adds them to a send buffer $A_p(\\mathsf{send})$. Correspondingly, the \\textsc{Recv} rule takes operations in the send buffer of replica $q$ and adds them to the receive buffer $A_p(\\mathsf{recv})$ of replica $p$. This is the only rule that involves more than one replica, and it models all network communication.\n\nOnce an operation appears in the receive buffer $A_p(\\mathsf{recv})$, the rule \\textsc{Apply-Remote} may apply. Under the preconditions that the operation has not already been processed and that its causal dependencies are satisfied, \\textsc{Apply-Remote} applies the operation in the same way as \\textsc{Apply-Local}, and adds its ID to the set of processed operations $A_p(\\mathsf{ops})$.\n\nThe actual document modifications are performed by applying the operations, which we discuss next.\n\n\\subsection{Applying Operations}\n\n\\begin{sidewaysfigure*}\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, k_1 \\evalto \\mathit{child}$}\n\\AxiomC{$\\mathit{child},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle k_2, \\dots, k_{n-1} \\rangle,\\, k_n), \\mathit{mut}) \\evalto \\mathit{child}'$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{addId}(k_1, \\mathit{id}, \\mathit{mut}) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{\\textsc{Descend}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle k_1, k_2, \\dots, k_{n-1} \\rangle,\\, k_n), \\mathit{mut}) \\evalto\n \\mathit{ctx}' [\\, k_1 \\,\\mapsto\\, \\mathit{child}' \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$k \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Get}}\n\\UnaryInfC{$\\mathit{ctx},\\, k \\evalto \\mathit{ctx}(k)$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{mapT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Map}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{mapT}(k) \\evalto \\{\\}$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{listT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-List}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{listT}(k) \\evalto\n \\{\\,\\mathsf{next}(\\mathsf{head}) \\,\\mapsto\\, \\mathsf{tail} \\,\\}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$\\mathsf{regT}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Child-Reg}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{regT}(k) \\evalto \\{\\}$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{pres}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Presence}_1$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\mathit{ctx}(\\mathsf{pres}(k))$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathsf{pres}(k) \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Presence}_2$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\{\\}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{center}\n\\AxiomC{$\\mathit{mut} \\not= \\mathsf{delete}$}\n\\AxiomC{$k_\\mathit{tag} \\in \\{\\mathsf{mapT}(k), \\mathsf{listT}(k), \\mathsf{regT}(k)\\}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{pres}(k) \\evalto \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Add-ID}_1$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{addId}(k_\\mathit{tag}, \\mathit{id}, \\mathit{mut}) \\evalto\n \\mathit{ctx}[\\, \\mathsf{pres}(k) \\,\\mapsto\\, \\mathit{pres} \\,\\cup\\, \\{\\mathit{id}\\} \\,]$}\n\\DisplayProof\\hspace{3em}\n%\n\\AxiomC{$\\mathit{mut} = \\mathsf{delete}$}\n\\LeftLabel{$\\textsc{Add-ID}_2$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{addId}(k_\\mathit{tag}, \\mathit{id}, \\mathit{mut}) \\evalto \\mathit{ctx}$}\n\\DisplayProof\\proofSkipAmount\n\\end{center}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} \\not= \\texttt{[]} \\,\\wedge\\, \\mathit{val} \\not= \\texttt{\\string{\\string}}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{regT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{regT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Assign}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{regT}(k) \\,\\mapsto\\,\n \\mathit{child}[\\, \\mathit{id} \\,\\mapsto\\, \\mathit{val} \\,]\\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} = \\texttt{\\string{\\string}}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{mapT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{mapT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Empty-Map}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{mapT}(k) \\,\\mapsto\\, \\mathit{child} \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{val} = \\texttt{[]}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{addId}(\\mathsf{listT}(k), \\mathit{id}, \\mathsf{assign}(\\mathit{val}))\n \\evalto \\mathit{ctx}''$}\n\\AxiomC{$\\mathit{ctx}'',\\, \\mathsf{listT}(k) \\evalto \\mathit{child}$}\n\\LeftLabel{\\textsc{Empty-List}}\n\\QuaternaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{assign}(\\mathit{val})) \\evalto\n \\mathit{ctx}''[\\, \\mathsf{listT}(k) \\,\\mapsto\\, \\mathit{child} \\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{next}(\\mathit{prev})) = \\mathit{next}$}\n\\AxiomC{$\\mathit{next} < \\mathit{id} \\,\\vee\\, \\mathit{next} = \\mathsf{tail}$}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{id}), \\mathsf{assign}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Insert}_1$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{prev}), \\mathsf{insert}(\\mathit{val})) \\evalto\n \\mathit{ctx}'[\\,\\mathsf{next}(\\mathit{prev}) \\,\\mapsto\\, \\mathit{id},\\;\n \\mathsf{next}(\\mathit{id}) \\,\\mapsto\\, \\mathit{next}\\,]$}\n\\end{prooftree}\\vspace{6pt}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{next}(\\mathit{prev})) = \\mathit{next}$}\n\\AxiomC{$\\mathit{id} < \\mathit{next}$}\n\\AxiomC{$ctx,\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{next}), \\mathsf{insert}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\LeftLabel{$\\textsc{Insert}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, \\mathit{prev}), \\mathsf{insert}(\\mathit{val})) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\\caption{Rules for applying insertion and assignment operations to update the state of a replica.}\\label{fig:operation-rules}\n\\end{sidewaysfigure*}\n\nFigure~\\ref{fig:operation-rules} gives the rules that apply an operation $\\mathsf{op}$ to a context $\\mathit{ctx}$, producing an updated context $\\mathit{ctx}'$. The context is initially the replica state $A_p$, but may refer to subtrees of the state as rules are recursively applied. These rules are used by \\textsc{Apply-Local} and \\textsc{Apply-Remote} to perform the state updates on a document.\n\nWhen the operation cursor's vector of keys is non-empty, the \\textsc{Descend} rule first applies. It recursively descends the document tree by following the path described by the keys. If the tree node already exists in the local replica state, \\textsc{Child-Get} finds it, otherwise \\textsc{Child-Map} and \\textsc{Child-List} create an empty map or list respectively.\n\nThe \\textsc{Descend} rule also invokes $\\textsc{Add-ID}_{1,2}$ at each tree node along the path described by the cursor, adding the operation ID to the presence set $\\mathsf{pres}(k)$ to indicate that the subtree includes a mutation made by this operation.\n\nThe remaining rules in Figure~\\ref{fig:operation-rules} apply when the vector of keys in the cursor is empty, which is the case when descended to the context of the tree node to which the mutation applies. The \\textsc{Assign} rule handles assignment of a primitive value to a register, \\textsc{Empty-Map} handles assignment where the value is the empty map literal \\verb|{}|, and \\textsc{Empty-List} handles assignment of the empty list \\verb|[]|. These three rules for \\textsf{assign} have a similar structure: first clearing the prior value at the cursor (as discussed in the next section), then adding the operation ID to the presence set, and finally incorporating the new value into the tree of local state.\n\nThe $\\textsc{Insert}_{1,2}$ rules handle insertion of a new element into an ordered list. In this case, the cursor refers to the list element $\\mathit{prev}$, and the new element is inserted after that position in the list. $\\textsc{Insert}_1$ performs the insertion by manipulating the linked list structure. $\\textsc{Insert}_2$ handles the case of multiple replicas concurrently inserting list elements at the same position, and uses the ordering relation $<$ on Lamport timestamps to consistently determine the insertion point. Our approach for handling insertions is based on the RGA algorithm~\\cite{Roh:2011dw}. We show later that these rules ensure all replicas converge towards the same state.\n\n\\subsubsection{Clearing Prior State}\n\n\\begin{figure*}\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto \\mathit{ctx}',\\, \\mathit{pres}$}\n\\LeftLabel{\\textsc{Delete}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{op}(\\mathit{id}, \\mathit{deps},\n \\mathsf{cursor}(\\langle\\rangle,\\, k), \\mathsf{delete}) \\evalto \\mathit{ctx}'$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{ctx},\\, \\mathsf{clearAny}(\\mathit{deps}, k) \\evalto \\mathit{ctx}', \\mathit{pres}_1$}\n\\AxiomC{$\\mathit{ctx}',\\, \\mathsf{pres}(k) \\evalto \\mathit{pres}_2$}\n\\AxiomC{$\\mathit{pres}_3 = \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2 \\setminus \\mathit{deps}$}\n\\LeftLabel{\\textsc{Clear-Elem}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}' [\\, \\mathsf{pres}(k) \\,\\mapsto\\, \\mathit{pres}_3 \\,],\\, \\mathit{pres}_3$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{mapT}(k)) \\\\\n \\evalto \\mathit{ctx}_1,\\, \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}_1,\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{listT}(k)) \\\\\n \\evalto \\mathit{ctx}_2,\\, \\mathit{pres}_2 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}_2,\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\\\\n \\evalto \\mathit{ctx}_3,\\, \\mathit{pres}_3 \\end{matrix}$}\n\\LeftLabel{\\textsc{Clear-Any}}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearAny}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}_3,\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2 \\,\\cup\\, \\mathit{pres}_3$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k \\notin \\mathrm{dom}(\\mathit{ctx})$}\n\\LeftLabel{\\textsc{Clear-None}}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, k) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{regT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{concurrent} = \\{ \\mathit{id} \\mapsto v \\mid\n (\\mathit{id} \\mapsto v) \\in \\mathit{ctx}(\\mathsf{regT}(k))\n \\,\\wedge\\, \\mathit{id} \\notin \\mathit{deps} \\}$}\n\\LeftLabel{\\textsc{Clear-Reg}}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{regT}(k)) \\evalto\n \\mathit{ctx}[\\, \\mathsf{regT}(k) \\,\\mapsto\\, \\mathit{concurrent} \\,],\\, \\mathrm{dom}(\\mathit{concurrent})$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{mapT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{mapT}(k)),\\, \\mathsf{clearMap}(\\mathit{deps}, \\{\\}) \\evalto\n \\mathit{cleared},\\, \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Clear-Map}_1$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{mapT}(k)) \\evalto\n \\mathit{ctx} [\\, \\mathsf{mapT}(k) \\,\\mapsto\\, \\mathit{cleared} \\,],\\, \\mathit{pres}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n k \\in \\mathrm{keys}(\\mathit{ctx}) \\\\\n \\wedge\\, k \\notin \\mathit{done} \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\\\\n \\evalto \\mathit{ctx}', \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}',\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done} \\cup \\{k\\}) \\\\\n \\evalto \\mathit{ctx}'',\\, \\mathit{pres}_2 \\end{matrix}$}\n\\LeftLabel{$\\textsc{Clear-Map}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done})\n \\evalto \\mathit{ctx}'',\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathit{done} = \\mathrm{keys}(\\mathit{ctx})$}\n\\LeftLabel{$\\textsc{Clear-Map}_3$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clearMap}(\\mathit{deps}, \\mathit{done}) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\mathsf{listT}(k) \\in \\mathrm{dom}(\\mathit{ctx})$}\n\\AxiomC{$\\mathit{ctx}(\\mathsf{listT}(k)),\\, \\mathsf{clearList}(\\mathit{deps}, \\mathsf{head})\n \\evalto \\mathit{cleared},\\, \\mathit{pres}$}\n\\LeftLabel{$\\textsc{Clear-List}_1$}\n\\BinaryInfC{$\\mathit{ctx},\\, \\mathsf{clear}(\\mathit{deps}, \\mathsf{listT}(k)) \\evalto\n \\mathit{ctx}[\\, \\mathsf{listT}(k) \\,\\mapsto\\, \\mathit{cleared} \\,],\\, \\mathit{pres}$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$\\begin{matrix}\n k \\not= \\mathsf{tail} \\,\\wedge\\\\\n \\mathit{ctx}(\\mathsf{next}(k)) = \\mathit{next} \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx},\\, \\mathsf{clearElem}(\\mathit{deps}, k) \\\\\n \\evalto \\mathit{ctx}', \\mathit{pres}_1 \\end{matrix}$}\n\\AxiomC{$\\begin{matrix}\n \\mathit{ctx}',\\, \\mathsf{clearList}(\\mathit{deps}, \\mathit{next}) \\\\\n \\evalto \\mathit{ctx}'', \\mathit{pres}_2 \\end{matrix}$}\n\\LeftLabel{$\\textsc{Clear-List}_2$}\n\\TrinaryInfC{$\\mathit{ctx},\\, \\mathsf{clearList}(\\mathit{deps}, k) \\evalto\n \\mathit{ctx}'',\\, \\mathit{pres}_1 \\,\\cup\\, \\mathit{pres}_2$}\n\\end{prooftree}\n\n\\begin{prooftree}\n\\AxiomC{$k = \\mathsf{tail}$}\n\\LeftLabel{$\\textsc{Clear-List}_3$}\n\\UnaryInfC{$\\mathit{ctx},\\, \\mathsf{clearList}(\\mathit{deps}, k) \\evalto \\mathit{ctx},\\, \\{\\}$}\n\\end{prooftree}\n\\caption{Rules for applying deletion operations to update the state of a replica.}\\label{fig:clear-rules}\n\\end{figure*}\n\nAssignment and deletion operations require that prior state (the value being overwritten or deleted) is cleared, while also ensuring that concurrent modifications are not lost, as illustrated in Figure~\\ref{fig:map-remove}. The rules to handle this clearing process are given in Figure~\\ref{fig:clear-rules}. Intuitively, the effect of clearing something is to reset it to its empty state by undoing any operations that causally precede the current operation, while leaving the effect of any concurrent operations untouched.\n\nA \\textsf{delete} operation can be used to delete either an element from an ordered list or a key from a map, depending on what the cursor refers to. The \\textsc{Delete} rule shows how this operation is evaluated by delegating to \\textsc{Clear-Elem}. In turn, \\textsc{Clear-Elem} uses \\textsc{Clear-Any} to clear out any data with a given key, regardless of whether it is of type \\textsf{mapT}, \\textsf{listT} or \\textsf{regT}, and also updates the presence set to include any nested operation IDs, but exclude any operations in $\\mathit{deps}$.\n\nThe premises of \\textsc{Clear-Any} are satisfied by $\\textsc{Clear-Map}_1$, $\\textsc{Clear-List}_1$ and \\textsc{Clear-Reg} if the respective key appears in $\\mathit{ctx}$, or by \\textsc{Clear-None} (which does nothing) if the key is absent.\n\nAs defined by the \\textsc{Assign} rule, a register maintains a mapping from operation IDs to values. \\textsc{Clear-Reg} updates a register by removing all operation IDs that appear in $\\mathit{deps}$ (i.e., which causally precede the clearing operation), but retaining all operation IDs that do not appear in $\\mathit{deps}$ (from assignment operations that are concurrent with the clearing operation).\n\nClearing maps and lists takes a similar approach: each element of the map or list is recursively cleared using \\textsf{clearElem}, and presence sets are updated to exclude $\\mathit{deps}$. Thus, any list elements or map entries whose modifications causally precede the clearing operation will end up with empty presence sets, and thus be considered deleted. Any map or list elements containing operations that are concurrent with the clearing operation are preserved.\n\n\\subsection{Convergence}\\label{sec:convergence}\n\nAs outlined in Section~\\ref{sec:intro-replication}, we require that all replicas automatically converge towards the same state -- a key requirement of a CRDT. We now formalize this notion, and show that the rules in Figures~\\ref{fig:expr-rules} to~\\ref{fig:clear-rules} satisfy this requirement.\n\n\\begin{definition}[valid execution]\\label{def:valid-exec}\nA \\emph{valid execution} is a set of operations generated by a set of replicas $\\{p_1, \\dots, p_k\\}$, each reducing a sequence of commands $\\langle \\mathit{cmd}_1 \\mathbin{;} \\dots \\mathbin{;} \\mathit{cmd}_n \\rangle$ without getting stuck.\n\\end{definition}\n\nA reduction gets stuck if there is no application of rules in which all premises are satisfied. For example, the $\\textsc{Idx}_{3,4}$ rules in Figure~\\ref{fig:expr-rules} get stuck if $\\mathsf{idx}(n)$ tries to iterate past the end of a list, which would happen if $n$ is greater than the number of non-deleted elements in the list; in a real implementation this would be a runtime error. By constraining valid executions to those that do not get stuck, we ensure that operations only refer to list elements that actually exist.\n\nNote that it is valid for an execution to never perform any network communication, either because it never invokes the \\textsf{yield} command, or because the nondeterministic execution of \\textsf{yield} never applies the \\textsc{Recv} rule. We need only a replica's local state to determine whether reduction gets stuck.\n\n\\begin{definition}[history]\\label{def:history}\nA \\emph{history} is a sequence of operations in the order it was applied at one particular replica $p$ by application of the rules \\textsc{Apply-Local} and \\textsc{Apply-Remote}.\n\\end{definition}\n\nSince the evaluation rules sequentially apply one operation at a time at a given replica, the order is well-defined. Even if two replicas $p$ and $q$ applied the same set of operations, i.e. if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, they may have applied any concurrent operations in a different order. Due to the premise $\\mathit{op.deps} \\subseteq A_p(\\mathsf{ops})$ in \\textsc{Apply-Remote}, histories are consistent with causality: if an operation has causal dependencies, it appears at some point after those dependencies in the history.\n\n\\begin{definition}[document state]\\label{def:doc-state}\nThe \\emph{document state} of a replica $p$ is the subtree of $A_p$ containing the document: that is, $A_p(\\mathsf{mapT}(\\mathsf{doc}))$ or $A_p(\\mathsf{listT}(\\mathsf{doc}))$ or $A_p(\\mathsf{regT}(\\mathsf{doc}))$, whichever is defined.\n\\end{definition}\n\n$A_p$ contains variables defined with \\textsf{let}, which are local to one replica, and not part of the replicated state. The definition of document state excludes these variables.\n\n\\begin{convergence-thm}\nFor any two replicas $p$ and $q$ that participated in a valid execution, if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, then $p$ and $q$ have the same document state.\n\\end{convergence-thm}\n\nThis theorem is proved in the appendix. It formalizes the safety property of convergence: if two replicas have processed the same set of operations, possibly in a different order, then they are in the same state. In combination with a liveness property, namely that every replica eventually processes all operations, we obtain the desired notion of convergence: all replicas eventually end up in the same state.\n\nThe liveness property depends on assumptions of replicas invoking \\textsf{yield} sufficiently often, and all nondeterministic rules for \\textsf{yield} being chosen fairly. We will not formalize the liveness property in this paper, but assert that it can usually be provided in practice, as network interruptions are usually of finite duration.\n\n\\section{Conclusions and Further Work}\n\nIn this paper we demonstrated how to compose CRDTs for ordered lists, maps and registers into a compound CRDT with a JSON data model. It supports arbitrarily nested lists and maps, and it allows replicas to make arbitrary changes to the data without waiting for network communication. Replicas asynchronously send mutations to other replicas in the form of operations. Concurrent operations are commutative, which ensures that replicas converge towards the same state without requiring application-specific conflict resolution logic.\n\nThis work focused on the formal semantics of the JSON CRDT, represented as a mathematical model. We are also working on a practical implementation of the algorithm, and will report on its performance characteristics in follow-on work.\n\nOur principle of not losing input due to concurrent modifications appears at first glance to be reasonable, but as illustrated in Figure~\\ref{fig:todo-item}, it leads to merged document states that may be surprising to application programmers who are more familiar with sequential programs. Further work will be needed to understand the expectations of application programmers, and to design data structures that are minimally surprising under concurrent modification. It may turn out that a schema language will be required to support more complex applications. A schema language could also support semantic annotations, such as indicating that a number should be treated as a counter rather than a register.\n\nThe CRDT defined in this paper supports insertion, deletion and assignment operations. In addition to these, it would be useful to support a \\emph{move} operation (to change the order of elements in an ordered list, or to move a subtree from one position in a document to another) and an \\emph{undo} operation. Moreover, garbage collection (tombstone removal) is required in order to prevent unbounded growth of the data structure. We plan to address these missing features in future work.\n\n\\section*{Acknowledgements}\n\nThis research was supported by a grant from The Boeing Company. Thank you to Dominic Orchard, Diana Vasile, and the anonymous reviewers for comments that improved this paper.\n\n\\bibliographystyle{IEEEtran}\n\\bibliography{references}{}\n\\vfill\n\n\\begin{IEEEbiography}[{\\includegraphics[width=1in]{mk428.jpg}}]{Martin Kleppmann}\nis a Research Associate in the Computer Laboratory at the University of Cambridge. His current research project, TRVE Data, is working towards better security and privacy in cloud applications by applying end-to-end encryption to collaboratively editable application data. His book \\emph{Designing Data-Intensive Applications} was published by O'Reilly Media in 2017. Previously, he worked as a software engineer and entrepreneur at several internet companies, including Rapportive and LinkedIn.\n\\end{IEEEbiography}\n\n\\begin{IEEEbiography}[{\\includegraphics[width=1in]{arb33.jpg}}]{Alastair R. Beresford}\nis a Senior Lecturer in the Computer Laboratory at the University of Cambridge. His research work explores the security and privacy of large-scale distributed systems, with a particular focus on networked mobile devices such as smartphones, tablets and laptops. He looks at the security and privacy of the devices themselves, as well as the security and privacy problems induced by the interaction between mobile devices and cloud-based Internet services.\n\\end{IEEEbiography}\n\n\\ifincludeappendix\n\\clearpage\n\\appendix[Proof of Convergence]\\label{sec:proof}\n\n\\begin{theorem}\\label{thm:convergence}\nFor any two replicas $p$ and $q$ that participated in a valid execution, if $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$, then $p$ and $q$ have the same document state.\n\\end{theorem}\n\n\\begin{proof}\nConsider the histories $H_p$ and $H_q$ at $p$ and $q$ respectively (see Definition~\\ref{def:history}). The rules \\textsc{Apply-Local} and \\textsc{Apply-Remote} maintain the invariant that an operation is added to $A_p(\\mathsf{ops})$ or $A_q(\\mathsf{ops})$ if and only if it was applied to the document state at $p$ or $q$. Thus, $A_p(\\mathsf{ops}) = A_q(\\mathsf{ops})$ iff $H_p$ and $H_q$ contain the same set of operations (potentially ordered differently).\n\nThe history $H_p$ at replica $p$ is a sequence of $n$ operations: $H_p = \\langle o_1, \\dots, o_n \\rangle$, and the document state at $p$ is derived from $H_p$ by starting in the empty state and applying the operations in order. Likewise, the document state at $q$ is derived from $H_q$, which is a permutation of $H_p$. Both histories must be consistent with causality, i.e. for all $i$ with $1 \\le i \\le n$, we require $o_i.\\mathit{deps} \\subseteq \\{o_j.\\mathit{id} \\mid 1 \\le j < i\\}$. The causality invariant is maintained by the \\textsc{Apply-*} rules.\n\nWe can prove the theorem by induction over the length of history $n$.\n\n\\emph{Base case:} An empty history with $n=0$ describes the empty document state. The empty document is always the same, and so any two replicas that have not executed any operations are by definition in the same state.\n\n\\emph{Induction step:} Given histories $H_p$ and $H_q$ of length $n$, such that $H_p = \\langle o_1, \\dots, o_n \\rangle$ and $H_q$ is a permutation of $H_p$, and such that applying $H_p$ results in the same document state as applying $H_q$, we can construct new histories $H_p'$ and $H_q'$ of length $n+1$ by inserting a new operation $o_{n+1}$ at any causally ready position in $H_p$ or $H_q$ respectively. We must then show that for all the histories $H_p'$ and $H_q'$ constructed this way, applying the sequence of operations in order results in the same document state.\n\nIn order to prove the induction step, we examine the insertion of $o_{n+1}$ into $H_p$ and $H_q$. Each history can be split into a prefix, which is the minimal subsequence $\\langle o_1, \\dots, o_j \\rangle$ such that $o_{n+1}.\\mathit{deps} \\subseteq \\{o_1.\\mathit{id}, \\dots, o_j.\\mathit{id}\\}$, and a suffix, which is the remaining subsequence $\\langle o_{j+1}, \\dots, o_n \\rangle$. The prefix contains all operations that causally precede $o_{n+1}$, and possibly some operations that are concurrent with $o_{n+1}$; the suffix contains only operations that are concurrent with $o_{n+1}$. The earliest position where $o_{n+1}$ can be inserted into the history is between the prefix and the suffix; the latest position is at the end of the suffix; or it could be inserted at any point within the suffix.\n\nWe need to show that the effect on the document state is the same, regardless of the position at which $o_{n+1}$ is inserted, and regardless of whether it is inserted into $H_p$ or $H_q$. We do this in Lemma~\\ref{lem:op-commute} by showing that $o_{n+1}$ is commutative with respect to all operations in the suffix, i.e. with respect to any operations that are concurrent to $o_{n+1}$.\n\\end{proof}\n\nBefore we can prove the commutativity of operations, we must first define some more terms and prove some preliminary lemmas.\n\n\\begin{definition}[appearing after]\nIn the ordered list $\\mathit{ctx}$, list element $k_j$ \\emph{appears after} list element $k_1$ if there exists a (possibly empty) sequence of list elements $k_2, \\dots, k_{j-1}$ such that for all $i$ with $1 \\le i < j$, $\\mathit{ctx}(\\mathsf{next}(k_i)) = k_{i+1}$. Moreover, we say $k_j$ appears \\emph{immediately after} $k_1$ if that sequence is empty, i.e. if $\\mathit{ctx}(\\mathsf{next}(k_1)) = k_j$.\n\\end{definition}\n\nThe definition of \\emph{appearing after} corresponds to the order in which the \\textsc{Idx} rules iterate over the list.\n\n\\begin{lemma}\\label{lem:list-after}\nIf $k_2$ appears after $k_1$ in an ordered list, and the list is mutated according to the evaluation rules, $k_2$ also appears after $k_1$ in all later document states.\n\\end{lemma}\n\n\\begin{proof}\nThe only rule that modifies the \\textsf{next} pointers in the context is $\\textsc{Insert}_1$, and it inserts a new list element between two existing list elements (possibly \\textsf{head} and/or \\textsf{tail}). This modification preserves the appears-after relationship between any two existing list elements. Since no other rule affects the list order, appears-after is always preserved.\n\\end{proof}\n\nNote that deletion of an element from a list does not remove it from the sequence of \\textsf{next} pointers, but only clears its presence set $\\mathsf{pres}(k)$.\n\n\\begin{lemma}\\label{lem:insert-between}\nIf one replica inserts a list element $k_\\mathit{new}$ between $k_1$ and $k_2$, i.e. if $k_\\mathit{new}$ appears after $k_1$ in the list and $k_2$ appears after $k_\\mathit{new}$ in the list on the source replica after applying \\textsc{Apply-Local}, then $k_\\mathit{new}$ appears after $k_1$ and $k_2$ appears after $k_\\mathit{new}$ on every other replica where that operation is applied.\n\\end{lemma}\n\n\\begin{proof}\nThe rules for generating list operations ensure that $k_1$ is either \\textsf{head} or an operation identifier, and $k_2$ is either \\textsf{tail} or an operation identifier.\n\nWhen the insertion operation is generated using the \\textsc{Make-Op} rule, its operation identifier is given a counter value $\\mathit{ctr}$ that is greater than the counter of any existing operation ID in $A_p(\\mathsf{ops})$. If $k_2$ is an operation identifier, we must have $k_2 \\in A_p(\\mathsf{ops})$, since both \\textsc{Apply-Local} and \\textsc{Apply-Remote} add operation IDs to $A_p(\\mathsf{ops})$ when applying an insertion. Thus, either $k_2 < k_\\mathit{new}$ under the ordering relation $<$ for Lamport timestamps, or $k_2 = \\mathsf{tail}$.\n\nWhen the insertion operation is applied on another replica using \\textsc{Apply-Remote} and $\\textsc{Insert}_{1,2}$, $k_2$ appears after $k_1$ on that replica (by Lemma~\\ref{lem:list-after} and causality). The cursor of the operation is $\\mathsf{cursor}(\\langle\\dots\\rangle, k_1)$, so the rules start iterating the list at $k_1$, and therefore $k_\\mathit{new}$ is inserted at some position after $k_1$.\n\nIf other concurrent insertions occurred between $k_1$ and $k_2$, their operation ID may be greater than or less than $k_\\mathit{new}$, and thus either $\\textsc{Insert}_1$ or $\\textsc{Insert}_2$ may apply. In particular, $\\textsc{Insert}_2$ skips over any list elements whose Lamport timestamp is greater than $k_\\mathit{new}$. However, we know that $k_2 < k_\\mathit{new} \\vee k_2 = \\mathsf{tail}$, and so $\\textsc{Insert}_1$ will apply with $\\mathit{next}=k_2$ at the latest. The $\\textsc{Insert}_{1,2}$ rules thus never iterate past $k_2$, and thus $k_\\mathit{new}$ is never inserted at a list position that appears after $k_2$.\n\\end{proof}\n\n\\begin{definition}[common ancestor]\\label{def:common-ancestor}\nIn a history $H$, the \\emph{common ancestor} of two concurrent operations $o_r$ and $o_s$ is the latest document state that causally precedes both $o_r$ and $o_s$.\n\\end{definition}\n\nThe common ancestor of $o_r$ and $o_s$ can be defined more formally as the document state resulting from applying a sequence of operations $\\langle o_1, \\dots, o_j \\rangle$ that is the shortest prefix of $H$ that satisfies $(o_r.\\mathit{deps} \\cap o_s.\\mathit{deps}) \\subseteq \\{o_1.\\mathit{id}, \\dots, o_j.\\mathit{id}\\}$.\n\n\\begin{definition}[insertion interval]\\label{def:insert-interval}\nGiven two concurrent operations $o_r$ and $o_s$ that insert into the same list, the \\emph{insertion interval} of $o_r$ is the pair of keys $(k_r^\\mathrm{before}, k_r^\\mathrm{after})$ such that $o_r.\\mathit{id}$ appears after $k_r^\\mathrm{before}$ when $o_r$ has been applied, $k_r^\\mathrm{after}$ appears after $o_r.\\mathit{id}$ when $o_r$ has been applied, and $k_r^\\mathrm{after}$ appears immediately after $k_r^\\mathrm{before}$ in the common ancestor of $o_r$ and $o_s$. The insertion interval of $o_s$ is the pair of keys $(k_s^\\mathrm{before}, k_s^\\mathrm{after})$ defined similarly.\n\\end{definition}\n\nIt may be the case that $k_r^\\mathrm{before}$ or $k_s^\\mathrm{before}$ is \\textsf{head}, and that $k_r^\\mathrm{after}$ or $k_s^\\mathrm{after}$ is \\textsf{tail}.\n\n\\begin{lemma}\\label{lem:insert-conflict}\nFor any two concurrent insertion operations $o_r, o_s$ in a history $H$, if $o_r.\\mathit{cur} = o_s.\\mathit{cur}$, then the order at which the inserted elements appear in the list after applying $H$ is deterministic and independent of the order of $o_r$ and $o_s$ in $H$.\n\\end{lemma}\n\n\\begin{proof}\nWithout loss of generality, assume that $o_r.\\mathit{id} < o_s.\\mathit{id}$ according to the ordering relation on Lamport timestamps. (If the operation ID of $o_r$ is greater than that of $o_s$, the two operations can be swapped in this proof.) We now distinguish the two possible orders of applying the operations:\n\n\\begin{enumerate}\n\\item $o_r$ is applied before $o_s$ in $H$. Thus, at the time when $o_s$ is applied, $o_r$ has already been applied. When applying $o_s$, since $o_r$ has a lesser operation ID, the rule $\\textsc{Insert}_1$ applies with $\\mathit{next} = o_r.\\mathit{id}$ at the latest, so the insertion position of $o_s$ must appear before $o_r$. It is not possible for $\\textsc{Insert}_2$ to skip past $o_r$.\n\n\\item $o_s$ is applied before $o_r$ in $H$. Thus, at the time when $o_r$ is applied, $o_s$ has already been applied. When applying $o_r$, the rule $\\textsc{Insert}_2$ applies with $\\mathit{next} = o_s.\\mathit{id}$, so the rule skips past $o_s$ and inserts $o_r$ at a position after $o_s$. Moreover, any list elements that appear between $o_s.\\mathit{cur}$ and $o_s$ at the time of inserting $o_r$ must have a Lamport timestamp greater than $o_s.\\mathit{id}$, so $\\textsc{Insert}_2$ also skips over those list elements when inserting $o_r$. Thus, the insertion position of $o_r$ must be after $o_s$.\n\\end{enumerate}\n\nThus, the insertion position of $o_r$ appears after the insertion position of $o_s$, regardless of the order in which the two operations are applied. The ordering depends only on the operation IDs, and since these IDs are fixed at the time the operations are generated, the list order is determined by the IDs.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:insert-reorder}\nIn an operation history $H$, an insertion operation is commutative with respect to concurrent insertion operations to the same list.\n\\end{lemma}\n\n\\begin{proof}\nGiven any two concurrent insertion operations $o_r, o_s$ in $H$, we must show that the document state does not depend on the order in which $o_r$ and $o_s$ are applied.\n\nEither $o_r$ and $o_s$ have the same insertion interval as defined in Definition~\\ref{def:insert-interval}, or they have different insertion intervals. If the insertion intervals are different, then by Lemma~\\ref{lem:insert-between} the operations cannot affect each other, and so they have the same effect regardless of their order. So we need only analyze the case in which they have the same insertion interval $(k^\\mathrm{before}, k^\\mathrm{after})$.\n\nIf $o_r.\\mathit{cur} = o_s.\\mathit{cur}$, then by Lemma~\\ref{lem:insert-conflict}, the operation with the greater operation ID appears first in the list, regardless of the order in which the operations are applied. If $o_r.\\mathit{cur} \\not= o_s.\\mathit{cur}$, then one or both of the cursors must refer to a list element that appears between $k^\\mathrm{before}$ and $k^\\mathrm{after}$, and that did not yet exist in the common ancestor (Definition~\\ref{def:common-ancestor}).\n\nTake a cursor that differs from $k^\\mathrm{before}$: the list element it refers to was inserted by a prior operation, whose cursor in turn refers to another prior operation, and so on. Following this chain of cursors for a finite number of steps leads to an operation $o_\\mathrm{first}$ whose cursor refers to $k^\\mathrm{before}$ (since an insertion operation always inserts at a position after the cursor).\n\nNote that all of the operations in this chain are causally dependent on $o_\\mathrm{first}$, and so they must have a Lamport timestamp greater than $o_\\mathrm{first}$. Thus, we can apply the same argument as in Lemma~\\ref{lem:insert-conflict}: if $\\textsc{Insert}_2$ skips over the list element inserted by $o_\\mathrm{first}$, it will also skip over all of the list elements that are causally dependent on it; if $\\textsc{Insert}_1$ inserts a new element before $o_\\mathrm{first}$, it is also inserted before the chain of operations that is based on it.\n\nTherefore, the order of $o_r$ and $o_s$ in the final list is determined by the Lamport timestamps of the first insertions into the insertion interval after their common ancestor, in the chains of cursor references of the two operations. Since the argument above applies to all pairs of concurrent operations $o_r, o_s$ in $H$, we deduce that the final order of elements in the list depends only on the operation IDs but not the order of application, which shows that concurrent insertions to the same list are commutative.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:delete-commute}\nIn a history $H$, a deletion operation is commutative with respect to concurrent operations.\n\\end{lemma}\n\n\\begin{proof}\nGiven a deletion operation $o_d$ and any other concurrent operation $o_c$, we must show that the document state after applying both operations does not depend on the order in which $o_d$ and $o_c$ were applied.\n\nThe rules in Figure~\\ref{fig:clear-rules} define how a deletion operation $o_d$ is applied: starting at the cursor in the operation, they recursively descend the subtree, removing $o_d.\\mathit{deps}$ from the presence set $\\mathsf{pres}(k)$ at all branch nodes in the subtree, and updating all registers to remove any values written by operations in $o_d.\\mathit{deps}$.\n\nIf $o_c$ is an assignment or insertion operation, the \\textsc{Assign} rule adds $o_c.\\mathit{id}$ to the mapping from operation ID to value for a register, and the \\textsc{Descend}, \\textsc{Assign}, \\textsc{Empty-Map} and \\textsc{Empty-List} rules add $o_c.\\mathit{id}$ to the presence sets $\\mathsf{pres}(k)$ along the path through the document tree described by the cursor.\n\nIf $o_d.\\mathit{cur}$ is not a prefix of $o_c.\\mathit{cur}$, the operations affect disjoint subtrees of the document, and so they are trivially commutative. Any state changes by \\textsc{Descend} and $\\textsc{Add-ID}_1$ along the shared part of the cursor path are applied using the set union operator $\\cup$, which is commutative.\n\nNow consider the case where $o_d.\\mathit{cur}$ is a prefix of $o_c.\\mathit{cur}$. Since $o_c$ is concurrent with $o_d$, we know that $o_c.\\mathit{id} \\notin o_d.\\mathit{deps}$. Therefore, if $o_c$ is applied before $o_d$ in the history, the \\textsc{Clear-*} rules evaluating $o_d$ will leave any occurrences of $o_c.\\mathit{id}$ in the document state undisturbed, while removing any occurrences of operations in $o_d.\\mathit{deps}$.\n\nIf $o_d$ is applied before $o_c$, the effect on presence sets and registers is the same as if they had been applied in the reverse order. Moreover, $o_c$ applies in the same way as if $o_d$ had not been applied previously, because applying a deletion only modifies presence sets and registers, without actually removing map keys or list elements, and because the rules for applying an operation are not conditional on the previous content of presence sets and registers.\n\nThus, the effect of applying $o_c$ before $o_d$ is the same as applying $o_d$ before $o_c$, so the operations commute.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:assign-commute}\nIn a history $H$, an assignment operation is commutative with respect to concurrent operations.\n\\end{lemma}\n\n\\begin{proof}\nGiven an assignment $o_a$ and any other concurrent operation $o_c$, we must show that the document state after applying both operations does not depend on the order in which $o_a$ and $o_c$ were applied.\n\nThe rules \\textsc{Assign}, \\textsc{Empty-Map} and \\textsc{Empty-List} define how an assignment operation $o_a$ is applied, depending on the value being assigned. All three rules first clear any causally prior state from the cursor at which the assignment is occurring; by Lemma~\\ref{lem:delete-commute}, this clearing operation is commutative with concurrent operations, and leaves updates by concurrent operations untouched.\n\nThe rules also add $o_a.\\mathit{id}$ to the presence set identified by the cursor, and \\textsc{Descend} adds $o_a.\\mathit{id}$ to the presence sets on the path from the root of the document tree described by the cursor. These state changes are applied using the set union operator $\\cup$, which is commutative.\n\nFinally, in the case where value assigned by $o_a$ is a primitive and the \\textsc{Assign} rule applies, the mapping from operation ID to value is added to the register by the expression $\\mathit{child}[\\,\\mathit{id} \\mapsto \\mathit{val}\\,]$. If $o_c$ is not an assignment operation or if $o_a.\\mathit{cursor} \\not= o_c.\\mathit{cursor}$, the operations are independent and thus trivially commutative.\n\nIf $o_a$ and $o_c$ are assignments to the same cursor, we use the commutativity of updates to a partial function: $\\mathit{child}[\\,\\mathit{id}_1 \\mapsto \\mathit{val}_1\\,]\\,[\\,\\mathit{id}_2 \\mapsto \\mathit{val}_2\\,] = \\mathit{child}[\\,\\mathit{id}_2 \\mapsto \\mathit{val}_2\\,]\\,[\\,\\mathit{id}_1 \\mapsto \\mathit{val}_1\\,]$ provided that $\\mathit{id}_1 \\not= \\mathit{id}_2$. Since operation IDs (Lamport timestamps) are unique, two concurrent assignments add two different keys to the mapping, and their order is immaterial.\n\nThus, all parts of the process of applying $o_a$ have the same effect on the document state, regardless of whether $o_c$ is applied before or after $o_a$, so the operations commute.\n\\end{proof}\n\n\\begin{lemma}\\label{lem:op-commute}\nGiven an operation history $H=\\langle o_1, \\dots, o_n \\rangle$ from a valid execution, a new operation $o_{n+1}$ from that execution can be inserted at any point in $H$ after $o_{n+1}.\\mathit{deps}$ have been applied. For all histories $H'$ that can be constructed this way, the document state resulting from applying the operations in $H'$ in order is the same, and independent of the ordering of any concurrent operations in $H$.\n\\end{lemma}\n\n\\begin{proof}\n$H$ can be split into a prefix and a suffix, as described in the proof of Theorem~\\ref{thm:convergence}. The suffix contains only operations that are concurrent with $o_{n+1}$, and we allow $o_{n+1}$ to be inserted at any point after the prefix. We then prove the lemma case-by-case, depending on the type of mutation in $o_{n+1}$. \n\nIf $o_{n+1}$ is a deletion, by Lemma~\\ref{lem:delete-commute} it is commutative with all operations in the suffix, and so $o_{n+1}$ can be inserted at any point within, before, or after the suffix without changing its effect on the final document state. Similarly, if $o_{n+1}$ is an assignment, by Lemma~\\ref{lem:assign-commute} it is commutative with all operations in the suffix.\n\nIf $o_{n+1}$ is an insertion, let $o_c$ be any operation in the suffix, and consider the cases of $o_{n+1}$ being inserted before and after $o_c$ in the history. If $o_c$ is a deletion or assignment, it is commutative with $o_{n+1}$ by Lemma~\\ref{lem:delete-commute} or Lemma~\\ref{lem:assign-commute} respectively. If $o_c$ is an insertion into the same list as $o_{n+1}$, then by Lemma~\\ref{lem:insert-reorder} the operations are commutative. If $o_c$ is an insertion into a different list in the document, its effect is independent from $o_{n+1}$ and so the two operations can be applied in any order.\n\nThus, $o_{n+1}$ is commutative with respect to any concurrent operation in $H$. Therefore, $o_{n+1}$ can be inserted into $H$ at any point after its causal dependencies, and the effect on the final document state is independent of the position at which the operation is inserted.\n\\end{proof}\n\nThis completes the induction step in the proof of Theorem~\\ref{thm:convergence}, and thus proves convergence of our datatype.\n\n\\fi % includeappendix\n\\end{document}\n"; + +if (typeof module === 'object') module.exports = { edits, finalText } diff --git a/perf/edits.json b/rust/edit-trace/edits.json similarity index 100% rename from perf/edits.json rename to rust/edit-trace/edits.json diff --git a/rust/edit-trace/package.json b/rust/edit-trace/package.json new file mode 100644 index 00000000..acd37ac0 --- /dev/null +++ b/rust/edit-trace/package.json @@ -0,0 +1,12 @@ +{ + "name": "edit-trace", + "version": "1.0.0", + "main": "wasm-text.js", + "license": "MIT", + "scripts": { + "wasm": "0x -D prof automerge-wasm.js" + }, + "devDependencies": { + "0x": "^5.4.1" + } +} diff --git a/rust/edit-trace/src/main.rs b/rust/edit-trace/src/main.rs new file mode 100644 index 00000000..9724a109 --- /dev/null +++ b/rust/edit-trace/src/main.rs @@ -0,0 +1,46 @@ +use automerge::ObjType; +use automerge::ReadDoc; +use automerge::{transaction::Transactable, Automerge, AutomergeError, ROOT}; +use std::time::Instant; + +fn main() -> Result<(), AutomergeError> { + let contents = include_str!("../edits.json"); + let edits = json::parse(contents).expect("cant parse edits"); + let mut commands = vec![]; + for i in 0..edits.len() { + let pos: usize = edits[i][0].as_usize().unwrap(); + let del: usize = edits[i][1].as_usize().unwrap(); + let mut vals = String::new(); + for j in 2..edits[i].len() { + let v = edits[i][j].as_str().unwrap(); + vals.push_str(v); + } + commands.push((pos, del, vals)); + } + let mut doc = Automerge::new(); + + let now = Instant::now(); + let mut tx = doc.transaction(); + let text = tx.put_object(ROOT, "text", ObjType::Text).unwrap(); + for (i, (pos, del, vals)) in commands.into_iter().enumerate() { + if i % 1000 == 0 { + println!("Processed {} edits in {} ms", i, now.elapsed().as_millis()); + } + tx.splice_text(&text, pos, del, &vals)?; + } + tx.commit(); + println!("Done in {} ms", now.elapsed().as_millis()); + let save = Instant::now(); + let bytes = doc.save(); + println!("Saved in {} ms", save.elapsed().as_millis()); + + let load = Instant::now(); + let _ = Automerge::load(&bytes).unwrap(); + println!("Loaded in {} ms", load.elapsed().as_millis()); + + let get_txt = Instant::now(); + doc.text(&text)?; + println!("Text in {} ms", get_txt.elapsed().as_millis()); + + Ok(()) +} diff --git a/scripts/ci/advisory b/scripts/ci/advisory new file mode 100755 index 00000000..6da4a578 --- /dev/null +++ b/scripts/ci/advisory @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -eoux pipefail + +cd rust +cargo deny --version +cargo deny check advisories +cargo deny check licenses +cargo deny check bans +cargo deny check sources diff --git a/scripts/ci/build-test b/scripts/ci/build-test new file mode 100755 index 00000000..de592f7e --- /dev/null +++ b/scripts/ci/build-test @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -eoux pipefail + +cd rust +cargo build --workspace --all-features + +RUST_LOG=error cargo test --workspace --all-features diff --git a/scripts/ci/cmake-build b/scripts/ci/cmake-build new file mode 100755 index 00000000..25a69756 --- /dev/null +++ b/scripts/ci/cmake-build @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eoux pipefail + +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +# \note CMake's default build types are "Debug", "MinSizeRel", "Release" and +# "RelWithDebInfo" but custom ones can also be defined so we pass it verbatim. +BUILD_TYPE=$1; +LIB_TYPE=$2; +if [ "$(echo "${LIB_TYPE}" | tr '[:upper:]' '[:lower:]')" == "shared" ]; then + SHARED_TOGGLE="ON" +else + SHARED_TOGGLE="OFF" +fi +C_PROJECT=$THIS_SCRIPT/../../rust/automerge-c; +mkdir -p $C_PROJECT/build; +cd $C_PROJECT/build; +cmake --log-level=ERROR -B . -S .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SHARED_LIBS=$SHARED_TOGGLE; +cmake --build . --target automerge_test; diff --git a/scripts/ci/deno_tests b/scripts/ci/deno_tests new file mode 100755 index 00000000..9f297557 --- /dev/null +++ b/scripts/ci/deno_tests @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -eou pipefail +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +WASM_PROJECT=$THIS_SCRIPT/../../rust/automerge-wasm; +JS_PROJECT=$THIS_SCRIPT/../../javascript; +E2E_PROJECT=$THIS_SCRIPT/../../javascript/e2e; + +echo "building wasm and js" +yarn --cwd $E2E_PROJECT install; +yarn --cwd $E2E_PROJECT e2e buildjs; +cp $WASM_PROJECT/index.d.ts $WASM_PROJECT/deno/; +sed -i '1i /// ' $WASM_PROJECT/deno/automerge_wasm.js; + +echo "Running Wasm Deno tests"; +deno test $WASM_PROJECT/deno-tests/deno.ts --allow-read; + +echo "Running JS Deno tests"; +ROOT_MODULE=$WASM_PROJECT/deno yarn --cwd $JS_PROJECT deno:build; +yarn --cwd $JS_PROJECT deno:test; + diff --git a/scripts/ci/fmt b/scripts/ci/fmt new file mode 100755 index 00000000..27235f92 --- /dev/null +++ b/scripts/ci/fmt @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -eoux pipefail + +cd rust +cargo fmt -- --check diff --git a/scripts/ci/fmt_js b/scripts/ci/fmt_js new file mode 100755 index 00000000..8f387b6a --- /dev/null +++ b/scripts/ci/fmt_js @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -eoux pipefail + +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +yarn --cwd $THIS_SCRIPT/../../javascript prettier -c . + diff --git a/scripts/ci/js_tests b/scripts/ci/js_tests new file mode 100755 index 00000000..68205a33 --- /dev/null +++ b/scripts/ci/js_tests @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -eoux pipefail + +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +WASM_PROJECT=$THIS_SCRIPT/../../rust/automerge-wasm; +JS_PROJECT=$THIS_SCRIPT/../../javascript; +E2E_PROJECT=$THIS_SCRIPT/../../javascript/e2e; + +yarn --cwd $E2E_PROJECT install; +# This will build the automerge-wasm project, publish it to a local NPM +# repository, then run `yarn build` in the `javascript` directory with +# the local registry +yarn --cwd $E2E_PROJECT e2e buildjs; +yarn --cwd $JS_PROJECT test diff --git a/scripts/ci/lint b/scripts/ci/lint new file mode 100755 index 00000000..87a16765 --- /dev/null +++ b/scripts/ci/lint @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -eoux pipefail + +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +cd $THIS_SCRIPT/../../rust +# Force clippy to consider all local sources +# https://github.com/rust-lang/rust-clippy/issues/4612 +find . -name "*.rs" -not -path "./target/*" -exec touch "{}" + +cargo clippy --all-targets --all-features -- -D warnings diff --git a/scripts/ci/run b/scripts/ci/run new file mode 100755 index 00000000..aebfe4c4 --- /dev/null +++ b/scripts/ci/run @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -eou pipefail + +./scripts/ci/fmt +./scripts/ci/fmt_js +./scripts/ci/lint +./scripts/ci/build-test +./scripts/ci/rust-docs +./scripts/ci/advisory +./scripts/ci/wasm_tests +./scripts/ci/deno_tests +./scripts/ci/js_tests +./scripts/ci/cmake-build Release static diff --git a/scripts/ci/rust-docs b/scripts/ci/rust-docs new file mode 100755 index 00000000..4be0ed9a --- /dev/null +++ b/scripts/ci/rust-docs @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -eoux pipefail + +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +cd $THIS_SCRIPT/../../rust +RUSTDOCFLAGS="-D rustdoc::broken-intra-doc-links -D warnings" \ +cargo doc --no-deps --workspace --document-private-items diff --git a/scripts/ci/wasm_tests b/scripts/ci/wasm_tests new file mode 100755 index 00000000..fac344d8 --- /dev/null +++ b/scripts/ci/wasm_tests @@ -0,0 +1,7 @@ +# see https://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself +THIS_SCRIPT="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +WASM_PROJECT=$THIS_SCRIPT/../../rust/automerge-wasm; + +yarn --cwd $WASM_PROJECT install; +yarn --cwd $WASM_PROJECT build; +yarn --cwd $WASM_PROJECT test;