diff --git a/.github/workflows/advisory-cron.yaml b/.github/workflows/advisory-cron.yaml deleted file mode 100644 index 31bac5a3..00000000 --- a/.github/workflows/advisory-cron.yaml +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 8519ac5e..00000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,177 +0,0 @@ -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 deleted file mode 100644 index b501d526..00000000 --- a/.github/workflows/docs.yaml +++ /dev/null @@ -1,52 +0,0 @@ -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 deleted file mode 100644 index 762671ff..00000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,214 +0,0 @@ -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 f77865d0..d5e150a5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ -/.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 new file mode 100644 index 00000000..44b6aab5 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,2 @@ +group_imports = "StdExternalCrate" +imports_granularity = "Crate" diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..7fd26c8a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,74 @@ +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 12 + +jobs: + allow_failures: + - rust: nightly + fast_finish: true + include: + - name: Stable - Format, Clippy and Docs + rust: stable + script: + - cargo fmt --all -- --check + - cargo clippy --all-targets --all-features -- -D warnings + - cargo doc --workspace --all-features + - 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 dev + - yarn test:js + + - name: Beta - Format, Clippy and Docs + rust: beta + script: + - cargo fmt --all -- --check + - cargo clippy --all-targets --all-features -- -D warnings + - cargo doc --workspace --all-features + - 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 dev + - yarn test:js + + - name: Nightly - Format, Clippy and Docs + rust: nightly + script: + - cargo fmt --all -- --check + - cargo clippy --all-targets --all-features -- -D warnings + - cargo doc --workspace --all-features + - 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 dev + - yarn test:js diff --git a/Cargo.nix b/Cargo.nix new file mode 100644 index 00000000..7cd85208 --- /dev/null +++ b/Cargo.nix @@ -0,0 +1,6844 @@ + +# 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-c-v2" = rec { + packageId = "automerge-c-v2"; + build = internal.buildRustCrateWithFeatures { + packageId = "automerge-c-v2"; + }; + + # 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-fuzz" = rec { + packageId = "automerge-fuzz"; + build = internal.buildRustCrateWithFeatures { + packageId = "automerge-fuzz"; + }; + + # 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; }; + }; + "perf" = rec { + packageId = "perf"; + build = internal.buildRustCrateWithFeatures { + packageId = "perf"; + }; + + # 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.18"; + edition = "2018"; + sha256 = "0vv50b3nvkhyy7x7ip19qnsq11bqlnffkmj2yx2xlyk5wzawydqy"; + libName = "aho_corasick"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + name = "memchr"; + packageId = "memchr"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "memchr/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.41"; + edition = "2018"; + sha256 = "0qaa0vgsa7ybq7wqk57508l52l1lr3sbx49vk9hf43w9yql2dbqm"; + authors = [ + "David Tolnay " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "arbitrary" = rec { + crateName = "arbitrary"; + version = "1.0.1"; + edition = "2018"; + sha256 = "14a6r7q9b1kf1m7810p8bcl51q11mrwc5z7fjkz0lx6kdvyk0x13"; + authors = [ + "The Rust-Fuzz Project Developers" + "Nick Fitzgerald " + "Manish Goregaokar " + "Simonas Kazlauskas " + "Brian L. Troutwine " + "Corey Farwell " + ]; + dependencies = [ + { + name = "derive_arbitrary"; + packageId = "derive_arbitrary"; + optional = true; + } + ]; + features = { + "derive" = [ "derive_arbitrary" ]; + }; + resolvedDefaultFeatures = [ "derive" "derive_arbitrary" ]; + }; + "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 = "maplit"; + packageId = "maplit"; + } + { + name = "pretty_assertions"; + packageId = "pretty_assertions"; + } + { + name = "rand"; + packageId = "rand 0.8.4"; + } + { + name = "smol_str"; + packageId = "smol_str"; + } + { + 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 = "nonzero_ext"; + packageId = "nonzero_ext"; + } + { + 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 = "smol_str"; + packageId = "smol_str"; + } + { + 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 = "pretty_assertions"; + packageId = "pretty_assertions"; + } + { + 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.3"; + 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-c-v2" = rec { + crateName = "automerge-c-v2"; + version = "0.1.0"; + edition = "2018"; + src = lib.cleanSourceWith { filter = sourceFilter; src = ./automerge-c-v2; };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 = "rmp"; + packageId = "rmp"; + } + { + name = "rmp-serde"; + packageId = "rmp-serde"; + } + { + name = "serde"; + packageId = "serde"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + ]; + 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 = "arbitrary"; + packageId = "arbitrary"; + optional = true; + features = [ "derive" ]; + } + { + name = "automerge-protocol"; + packageId = "automerge-protocol"; + } + { + name = "futures"; + packageId = "futures 0.3.15"; + } + { + name = "getrandom"; + packageId = "getrandom 0.2.3"; + 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 = "smol_str"; + packageId = "smol_str"; + } + { + 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 = "pretty_assertions"; + packageId = "pretty_assertions"; + } + { + name = "rand"; + packageId = "rand 0.8.4"; + } + { + name = "wasm-bindgen-test"; + packageId = "wasm-bindgen-test"; + } + ]; + features = { + "default" = [ "std" ]; + "derive-arbitrary" = [ "arbitrary" "smol_str/arbitrary" ]; + }; + resolvedDefaultFeatures = [ "arbitrary" "default" "derive-arbitrary" "std" ]; + }; + "automerge-fuzz" = rec { + crateName = "automerge-fuzz"; + version = "0.0.0"; + edition = "2018"; + crateBin = [ + { name = "backend_load"; path = "src/backend_load.rs"; } + ]; + src = lib.cleanSourceWith { filter = sourceFilter; src = ./fuzz; }; + authors = [ + "Automatically generated" + ]; + dependencies = [ + { + name = "automerge-backend"; + packageId = "automerge-backend"; + } + { + name = "libfuzzer-sys"; + packageId = "libfuzzer-sys"; + } + ]; + + }; + "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 = "arbitrary"; + packageId = "arbitrary"; + optional = true; + features = [ "derive" ]; + } + { + name = "hex"; + packageId = "hex"; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "smol_str"; + packageId = "smol_str"; + features = [ "serde" ]; + } + { + name = "strum"; + packageId = "strum"; + features = [ "derive" ]; + } + { + name = "thiserror"; + packageId = "thiserror"; + } + { + name = "uuid"; + packageId = "uuid"; + features = [ "v4" ]; + } + ]; + devDependencies = [ + { + name = "maplit"; + packageId = "maplit"; + } + { + name = "proptest"; + packageId = "proptest"; + } + { + name = "rmp"; + packageId = "rmp"; + } + { + name = "rmp-serde"; + packageId = "rmp-serde"; + } + { + name = "serde_json"; + packageId = "serde_json"; + features = [ "float_roundtrip" ]; + } + ]; + features = { + "derive-arbitrary" = [ "arbitrary" ]; + }; + resolvedDefaultFeatures = [ "arbitrary" "derive-arbitrary" ]; + }; + "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.16"; + edition = "2018"; + sha256 = "0y8jy9kcqn1myzxjx7c73rbv4amfw08n936ycqz3glrsc66jqs4h"; + 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/std" ]; + "unicode" = [ "lazy_static" "regex-automata" ]; + }; + resolvedDefaultFeatures = [ "default" "lazy_static" "regex-automata" "serde" "serde1" "serde1-nostd" "std" "unicode" ]; + }; + "bumpalo" = rec { + crateName = "bumpalo"; + version = "3.7.0"; + edition = "2018"; + sha256 = "0ccn025n0x1gc0ijjlabin2xs7dkx5yfagkskr93yw9c06pyfncw"; + 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.6"; + edition = "2018"; + sha256 = "0x2khql6m1d970ps8b6qb6yjb6gplw0n3ayw8i6wpmmaa1fzmkap"; + 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" ]; + }; + "cc" = rec { + crateName = "cc"; + version = "1.0.68"; + edition = "2018"; + crateBin = []; + sha256 = "11ypa8b7iwhjf5fg5j3hvbn2116h9g8v67vyd9s7ljgzq52c4wja"; + authors = [ + "Alex Crichton " + ]; + features = { + "parallel" = [ "jobserver" ]; + }; + }; + "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.6.0"; + edition = "2018"; + sha256 = "1ymj18i7r3qzm7ddvi0kcvhn1klrnqxk2fxmjbj8fsq024dprm52"; + 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.1"; + } + { + 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.5"; + edition = "2018"; + sha256 = "1zdpfd6hjf944dr5pb7h7rkiccbwksc958x4mp1y4d56384jxh2f"; + 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.5"; + edition = "2018"; + sha256 = "1ny481cx8a5pdknypb41jqym03dl8x26i2ldyyp3yb3zrq8zqb6q"; + authors = [ + "The Crossbeam Project Developers" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if 1.0.0"; + } + { + name = "lazy_static"; + packageId = "lazy_static"; + optional = true; + } + ]; + 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" ]; + } + ]; + + }; + "derive_arbitrary" = rec { + crateName = "derive_arbitrary"; + version = "1.0.1"; + edition = "2018"; + sha256 = "0nig0iydva7a9h9i9qyi6an9w5qjafmn3qlzvdqqiw0x2kp824jz"; + procMacro = true; + authors = [ + "The Rust-Fuzz Project Developers" + "Nick Fitzgerald " + "Manish Goregaokar " + "Andre Bogus " + "Corey Farwell " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + features = [ "derive" ]; + } + ]; + + }; + "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.4"; + edition = "2018"; + sha256 = "1qzw8g11dbdfi7ixm44ldykwcqsxqkh8vx5cgpd88zmclgz8g4d1"; + 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.15" = rec { + crateName = "futures"; + version = "0.3.15"; + edition = "2018"; + sha256 = "09zwmmfi8d1glhi0bz2didagjyqz3q9gxa7nq4vzmqns0fl46zhf"; + 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" ]; + "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.15"; + edition = "2018"; + sha256 = "1qki53g079ymjkgdxg3rlh5yivys8qvdqhy18l2xz0m8565sd0p6"; + 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" ]; + "default" = [ "std" ]; + "sink" = [ "futures-sink" ]; + "std" = [ "alloc" "futures-core/std" ]; + }; + resolvedDefaultFeatures = [ "alloc" "futures-sink" "sink" "std" ]; + }; + "futures-core" = rec { + crateName = "futures-core"; + version = "0.3.15"; + edition = "2018"; + sha256 = "1lbrw5087ndaqvbjrckbz9ld4ya67k72d6w87c22d6m8v1jzf0h4"; + authors = [ + "Alex Crichton " + ]; + features = { + "default" = [ "std" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "std" ]; + }; + "futures-executor" = rec { + crateName = "futures-executor"; + version = "0.3.15"; + edition = "2018"; + sha256 = "0ydbmzg6ig9gankp2nspaq668r3ngzss4806dliygjgs16lsdnms"; + 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.15"; + edition = "2018"; + sha256 = "1899vd5yri6zv88by53pzxb1h4x96mc42riziy6qyd1vzgg9ki5c"; + authors = [ + "Alex Crichton " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; + "futures-macro" = rec { + crateName = "futures-macro"; + version = "0.3.15"; + edition = "2018"; + sha256 = "08fixp6b34lr58cs85kacp3h599bi63njvfd03655pvc92c05i54"; + 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" ]; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg"; + } + ]; + + }; + "futures-sink" = rec { + crateName = "futures-sink"; + version = "0.3.15"; + edition = "2018"; + sha256 = "10j21j3k358512qyglqpfyxj309kr6bcspj6izg6s3gzrv8flyx5"; + authors = [ + "Alex Crichton " + ]; + features = { + "default" = [ "std" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "std" ]; + }; + "futures-task" = rec { + crateName = "futures-task"; + version = "0.3.15"; + edition = "2018"; + sha256 = "1bixscylw61w61dizqxhrdlnb8mv7yg9h775pssxsk8szkwvw5la"; + authors = [ + "Alex Crichton " + ]; + features = { + "default" = [ "std" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "std" ]; + }; + "futures-util" = rec { + crateName = "futures-util"; + version = "0.3.15"; + edition = "2018"; + sha256 = "0rqr36zy4na270kn9fwk866adx1xkv1b49zxzm7zjavys8wc5dgy"; + 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; + } + ]; + buildDependencies = [ + { + name = "autocfg"; + packageId = "autocfg"; + } + ]; + features = { + "alloc" = [ "futures-core/alloc" "futures-task/alloc" ]; + "async-await-macro" = [ "async-await" "futures-macro" "proc-macro-hack" "proc-macro-nested" ]; + "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.3" = rec { + crateName = "getrandom"; + version = "0.2.3"; + edition = "2018"; + sha256 = "0lr7mnkvnzdh1xxmwmhhbm4gwg29k3m2rzhpjmjm4k2jcfa9kkbz"; + 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.3"; + edition = "2018"; + sha256 = "0b0kkr790p66lvzn9nsmfjvydrbmh9z5gb664jchwgw64vxiwqkd"; + authors = [ + "Without Boats " + ]; + dependencies = [ + { + name = "unicode-segmentation"; + packageId = "unicode-segmentation"; + } + ]; + + }; + "hermit-abi" = rec { + crateName = "hermit-abi"; + version = "0.1.19"; + edition = "2018"; + sha256 = "0cxcm8093nf5fyn114w8vxbrbcyvv91d4015rdnlgfll7cs6gd32"; + 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.1" = rec { + crateName = "itertools"; + version = "0.10.1"; + edition = "2018"; + sha256 = "1bsyxnm20x05rwc5qskrqy4cfswrcadzlwc26dkqml6hz64vipb9"; + 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.51"; + edition = "2018"; + sha256 = "0qkhnsidcx4vkgacn4hhl6bf6lxhc3lljfzpad11ms50wfngpgc3"; + 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.97"; + edition = "2015"; + sha256 = "1dlgdziv6nkabx287jjmghnlgc5dqv6fgpvh9n7ibpr0synsvf0j"; + authors = [ + "The Rust Project Developers" + ]; + features = { + "default" = [ "std" ]; + "rustc-dep-of-std" = [ "align" "rustc-std-workspace-core" ]; + "use_std" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "libfuzzer-sys" = rec { + crateName = "libfuzzer-sys"; + version = "0.4.2"; + edition = "2018"; + sha256 = "1cyyy436zamxlrvygjlg90c2m6ibvdgfada2n3pxymcbdr5aia9n"; + authors = [ + "The rust-fuzz Project Developers" + ]; + dependencies = [ + { + name = "arbitrary"; + packageId = "arbitrary"; + } + { + name = "once_cell"; + packageId = "once_cell"; + } + ]; + buildDependencies = [ + { + name = "cc"; + packageId = "cc"; + } + ]; + features = { + "arbitrary-derive" = [ "arbitrary/derive" ]; + }; + }; + "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.4.0"; + edition = "2018"; + sha256 = "1p478fqf4nia2ma0kv4npb8x1hli0zz6k16517ikb51jkryx8sxi"; + authors = [ + "Andrew Gallant " + "bluss" + ]; + features = { + "default" = [ "std" ]; + "use_std" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" "use_std" ]; + }; + "memoffset" = rec { + crateName = "memoffset"; + version = "0.6.4"; + edition = "2015"; + sha256 = "1yfx2v8kmkhr2d4gwk8ghihdwg73vapn3vvp0im06f0kgx8crb2r"; + 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" ]; + }; + }; + "nonzero_ext" = rec { + crateName = "nonzero_ext"; + version = "0.2.0"; + edition = "2015"; + sha256 = "0i7lhlzfv62756q2zwsqiqr3wdh37yy0rbv0x9ivmfpak43jk8a4"; + authors = [ + "Andreas Fuchs " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "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.8.0"; + edition = "2018"; + sha256 = "0mkbbxg6416z11r2yzsq91cqrkj9w1iyx5hakq15h5sbnriwnbv9"; + 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" ]; + } + ]; + + }; + "perf" = rec { + crateName = "perf"; + version = "0.1.0"; + edition = "2018"; + crateBin = [ + { name = "perf"; path = "src/main.rs"; } + ]; + src = lib.cleanSourceWith { filter = sourceFilter; src = ./perf; }; + dependencies = [ + { + name = "automerge"; + packageId = "automerge"; + } + { + name = "automerge-frontend"; + packageId = "automerge-frontend"; + } + { + name = "automerge-protocol"; + packageId = "automerge-protocol"; + } + { + name = "maplit"; + packageId = "maplit"; + } + { + name = "rand"; + packageId = "rand 0.8.4"; + } + { + name = "serde"; + packageId = "serde"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "smol_str"; + packageId = "smol_str"; + } + { + name = "unicode-segmentation"; + packageId = "unicode-segmentation"; + } + ]; + + }; + "pest" = rec { + crateName = "pest"; + version = "2.1.3"; + edition = "2015"; + sha256 = "0lry80bm90x47nq71wxq83kjrm9ashpz4kbm92p90ysdx4m8gx0h"; + authors = [ + "Dragoș Tiselice " + ]; + dependencies = [ + { + name = "ucd-trie"; + packageId = "ucd-trie"; + } + ]; + features = { + "pretty-print" = [ "serde" "serde_json" ]; + }; + }; + "pin-project-lite" = rec { + crateName = "pin-project-lite"; + version = "0.2.7"; + edition = "2018"; + sha256 = "0hwl8iyx3h9i3i3jr2vqj07nf4ay1v1w1ga29cbjmdd6d4fd2ccd"; + 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.1"; + edition = "2018"; + sha256 = "0akgmm5kqghl2b1q1qkzjggiqnb9smaz54fd5374k5qbqfggv8rj"; + 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" "ttf-parser" "lazy_static" "pathfinder_geometry" ]; + }; + 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.2"; + edition = "2018"; + sha256 = "12yris0ni87wvzhj23a5nnz7amskvahhnpikx5snhdyg09y0xaqw"; + 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.27"; + edition = "2018"; + sha256 = "0f3h0zl5w5090ajmmvpmhkpr4iwqnn5rip3afacabhc657vwmn7h"; + 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.4" = rec { + crateName = "rand"; + version = "0.8.4"; + edition = "2018"; + sha256 = "1n5wska2fbfj4dsfz8mc0pd0dgjlrb6c9anpk5mwym345rip6x9f"; + 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.1"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (!(target."os" == "emscripten")); + } + { + name = "rand_core"; + packageId = "rand_core 0.6.3"; + } + { + name = "rand_hc"; + packageId = "rand_hc 0.3.1"; + optional = true; + target = { target, features }: (target."os" == "emscripten"); + } + ]; + devDependencies = [ + { + name = "rand_hc"; + packageId = "rand_hc 0.3.1"; + } + ]; + features = { + "alloc" = [ "rand_core/alloc" ]; + "default" = [ "std" "std_rng" ]; + "getrandom" = [ "rand_core/getrandom" ]; + "serde1" = [ "serde" "rand_core/serde1" ]; + "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.1" = rec { + crateName = "rand_chacha"; + version = "0.3.1"; + edition = "2018"; + sha256 = "123x2adin558xbhvqb8w4f6syjsdkmqff8cxwhmjacpsl1ihmhg6"; + 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.3"; + } + ]; + features = { + "default" = [ "std" ]; + "serde1" = [ "serde" ]; + "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.3" = rec { + crateName = "rand_core"; + version = "0.6.3"; + edition = "2018"; + sha256 = "1rxlxc3bpzgwphcg9c9yasvv9idipcg2z2y4j0vlb52jyl418kyk"; + authors = [ + "The Rand Project Developers" + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "getrandom"; + packageId = "getrandom 0.2.3"; + 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.1" = rec { + crateName = "rand_hc"; + version = "0.3.1"; + edition = "2018"; + sha256 = "1rwpykyvhkxs4jvqdja3mzp9dqaqamzn113cxaigs9z2dmcry7nm"; + authors = [ + "The Rand Project Developers" + ]; + dependencies = [ + { + name = "rand_core"; + packageId = "rand_core 0.6.3"; + } + ]; + + }; + "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.1"; + edition = "2018"; + sha256 = "143dl2453bazgk7rwjrickmyqd0ks3q69nfz8axcins19n0clsn0"; + 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.1"; + edition = "2018"; + sha256 = "13kdcnqp2p1a5a3amamfjpnm7ay463vq4dfxy4rrh9shr3i210fp"; + 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.9"; + edition = "2018"; + sha256 = "1vpyfnfrw5ki262720yks8m7vn1a2mg89s4rqi5ir7izvyx9md2s"; + libName = "syscall"; + authors = [ + "Jeremy Soller " + ]; + dependencies = [ + { + name = "bitflags"; + packageId = "bitflags"; + } + ]; + + }; + "regex" = rec { + crateName = "regex"; + version = "1.5.4"; + edition = "2018"; + sha256 = "0qf479kjbmb582h4d1d6gfl75h0j8aq2nrdi5wg6zdcy6llqcynh"; + 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.10"; + edition = "2015"; + sha256 = "0ci1hvbzhrfby5fdpf4ganhf7kla58acad9i1ff1p34dzdrhs8vc"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + 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.25"; + edition = "2018"; + sha256 = "16y87hz1bxmmz6kk360cxwfm3jnbsxb3x4zw9x1gzz7khic2i5zl"; + 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" ]; + } + ]; + + }; + "rmp" = rec { + crateName = "rmp"; + version = "0.8.10"; + edition = "2018"; + sha256 = "1mksma1b18yps1s64qx2f4bhg4z19wmfvbjx3zfxbi262kxfamag"; + authors = [ + "Evgeny Safronov " + ]; + dependencies = [ + { + name = "byteorder"; + packageId = "byteorder"; + } + { + name = "num-traits"; + packageId = "num-traits"; + } + ]; + + }; + "rmp-serde" = rec { + crateName = "rmp-serde"; + version = "0.15.5"; + edition = "2018"; + sha256 = "178f4qlicldm9iy74q4wdqldk5i11p1ad30wzs9avx04mpwwygkj"; + authors = [ + "Evgeny Safronov " + ]; + dependencies = [ + { + name = "byteorder"; + packageId = "byteorder"; + } + { + name = "rmp"; + packageId = "rmp"; + } + { + name = "serde"; + packageId = "serde"; + } + ]; + features = { + }; + }; + "rustc_version" = rec { + crateName = "rustc_version"; + version = "0.3.3"; + edition = "2018"; + sha256 = "1vjmw7xcdri0spsf24mkpwpph853wrbqppihhw061i2igh4f5pzh"; + 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.11.0"; + edition = "2015"; + sha256 = "1dn6064fipjymnmjccyjhb70miyvqvp08gvw1wbg8vbg4c8ay0gk"; + authors = [ + "Steve Klabnik " + "The Rust Project Developers" + ]; + dependencies = [ + { + name = "semver-parser"; + packageId = "semver-parser"; + } + ]; + features = { + "ci" = [ "serde" "diesel/sqlite" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "semver-parser" = rec { + crateName = "semver-parser"; + version = "0.10.2"; + edition = "2018"; + crateBin = []; + sha256 = "1xqijhqhx3bn77xnl1mlcp032hz8nv7n2fbdacbdzq7rnzsvxc00"; + authors = [ + "Steve Klabnik " + ]; + dependencies = [ + { + name = "pest"; + packageId = "pest"; + } + ]; + + }; + "serde" = rec { + crateName = "serde"; + version = "1.0.126"; + edition = "2015"; + sha256 = "00vdk7y3j8h2xv28a2i2ad1d19g5iwrdknbq8yp79v6axamhaxgc"; + 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.126"; + edition = "2015"; + sha256 = "0hsdh39qj0g187nwndfzg67q4qajbm5g6x0fr5xarblmk2y7sfln"; + 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.5"; + edition = "2018"; + sha256 = "07ix5fsdnpf2xsb0k5rbiwlmsicm2237fcx7blirp9p7pljr5mhn"; + 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.3"; + edition = "2015"; + sha256 = "09v57dmy9gnfcj3c6gywp7wi09zywxf0ppj07w02hfvy38ysqwzi"; + authors = [ + "Carl Lerche " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "smallvec" = rec { + crateName = "smallvec"; + version = "1.6.1"; + edition = "2018"; + sha256 = "0kk08axr0ybfbjzk65a41k84mb6sfhyajmfndaka9igkx34kf3zy"; + authors = [ + "The Servo Project Developers" + ]; + features = { + }; + }; + "smol_str" = rec { + crateName = "smol_str"; + version = "0.1.18"; + edition = "2018"; + sha256 = "1c53aiylg3h1b4wfn2xbv8md8cqmf2pwg5qw5hkr8mchj2gff0xj"; + authors = [ + "Aleksey Kladov " + ]; + dependencies = [ + { + name = "arbitrary"; + packageId = "arbitrary"; + optional = true; + } + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } + ]; + devDependencies = [ + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + ]; + + resolvedDefaultFeatures = [ "arbitrary" "serde" ]; + }; + "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 " + ]; + + }; + "strum" = rec { + crateName = "strum"; + version = "0.21.0"; + edition = "2018"; + sha256 = "1qnd2by1zrwgx7li0hmwy7jbzjwz1ky697qjg85nga8zzny6py5a"; + authors = [ + "Peter Glotfelty " + ]; + dependencies = [ + { + name = "strum_macros"; + packageId = "strum_macros"; + optional = true; + } + ]; + devDependencies = [ + { + name = "strum_macros"; + packageId = "strum_macros"; + } + ]; + features = { + "derive" = [ "strum_macros" ]; + }; + resolvedDefaultFeatures = [ "derive" "strum_macros" ]; + }; + "strum_macros" = rec { + crateName = "strum_macros"; + version = "0.21.1"; + edition = "2018"; + sha256 = "1v55b1in7dn07s6vxr8dajqpvxkxjbfq6qamnjgcbnq9x3pawsnh"; + procMacro = true; + authors = [ + "Peter Glotfelty " + ]; + dependencies = [ + { + name = "heck"; + packageId = "heck"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn"; + features = [ "parsing" "extra-traits" ]; + } + ]; + + }; + "syn" = rec { + crateName = "syn"; + version = "1.0.73"; + edition = "2018"; + sha256 = "1ixw4lscc7009ibaic8g5bvnc94hdcr62ksjk3jjl38363zqj57p"; + 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.4"; + } + { + 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.25"; + edition = "2018"; + sha256 = "1ip9j8riar3xffp261yls4phpasz768xhnafxdz4qlargx2pcvzs"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "thiserror-impl"; + packageId = "thiserror-impl"; + } + ]; + + }; + "thiserror-impl" = rec { + crateName = "thiserror-impl"; + version = "1.0.25"; + edition = "2018"; + sha256 = "139i3bxidyncjd1sphkn4c577nkba8lzmphhr9gb26xz1y67cdla"; + 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.26"; + edition = "2018"; + sha256 = "17dqjhixmnbrk0c99ydb3b9pygjnzfb7yhlasb6134s4jy6fpb89"; + 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.18"; + edition = "2018"; + sha256 = "0lm0li6lx75jgbbgxsb45439257sqb0j7828caf2hjqsigwi9zx9"; + 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.19"; + edition = "2018"; + sha256 = "0j6yg01c5zir4x6qmz9k491vaa254msjnbf6wf5xk97w86bh2sdb"; + 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 = { + }; + }; + "ucd-trie" = rec { + crateName = "ucd-trie"; + version = "0.1.3"; + edition = "2018"; + sha256 = "072cblf8v3wzyaz3lhbpzgil4s03dpzg1ppy3gqx2l4v622y3pjn"; + authors = [ + "Andrew Gallant " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "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.2"; + edition = "2015"; + sha256 = "1wrkgcw557v311dkdb6n2hrix9dm2qdsb1zpw7pn79l03zb85jwc"; + authors = [ + "erick.tryzelaar " + "kwantam " + "Manish Goregaokar " + ]; + 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.3"; + 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.74"; + edition = "2018"; + sha256 = "1zcp57mwb47vdw3r594cl7vbj6pwd503xrkq8a3phvs8xpaf2knm"; + 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.74"; + edition = "2018"; + sha256 = "005ra6jc8pm1y2wi6swkvn34r2is3knv5f2dv59ymkscd6hgccrv"; + 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.24" = rec { + crateName = "wasm-bindgen-futures"; + version = "0.4.24"; + edition = "2018"; + sha256 = "1wb75qgv91qjblv685hnka2fn3w4fp0wi05cs3i3rmbrqrw7kfjz"; + 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.74"; + edition = "2018"; + sha256 = "1m4bn6wlzc2rkp693zgnn7kh05r5fm4w55l0igjy23s3c756k088"; + 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.74"; + edition = "2018"; + sha256 = "15vsk3q4jfk8ax4walc8vy3fgvrpkg86vjz2ym0z5ngk5xa428my"; + 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.74"; + edition = "2018"; + sha256 = "0ksbnhjzvnsmzc1n18bs98swnrzrwxjrpx3clrsyv3pip1vgikyp"; + authors = [ + "The wasm-bindgen Developers" + ]; + + }; + "wasm-bindgen-test" = rec { + crateName = "wasm-bindgen-test"; + version = "0.3.24"; + edition = "2018"; + sha256 = "1s5sw7aaq65pndcrvp0bisq4cc63n1ajvn9fi316814pkdm43awc"; + 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.24"; + } + { + name = "wasm-bindgen-test-macro"; + packageId = "wasm-bindgen-test-macro"; + } + ]; + + }; + "wasm-bindgen-test-macro" = rec { + crateName = "wasm-bindgen-test-macro"; + version = "0.3.24"; + edition = "2018"; + sha256 = "10p7s3zg8pinmb99yi5sgrnqbgf69h821xwbv7q1wm7kdky46ifx"; + 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.51"; + edition = "2018"; + sha256 = "10p514z7zmwzxqll0z0zqhlswv3hadbrwais3l8zfgcz6xxl2a78"; + 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 new file mode 100644 index 00000000..8d2584f9 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] + +members = [ + "automerge", + "automerge-c", + "automerge-c-v2", + "automerge-backend", + "automerge-backend-wasm", + "automerge-frontend", + "automerge-cli", + "automerge-protocol", + "fuzz", + "perf", +] + +[profile.release] +lto = true diff --git a/LICENSE b/LICENSE index 18812465..dfa2838f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,19 +1,7 @@ -Copyright (c) 2019-2021 the Automerge contributors +Copyright 2019 Alex Good -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/Makefile b/Makefile new file mode 100644 index 00000000..f77cf889 --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +.PHONY: all +all: ci + +.PHONY: fmt +fmt: + cargo fmt --all -- --check + +.PHONY: clippy +clippy: + cargo clippy --all-targets --all-features -- -D warnings + +.PHONY: doc +doc: + cargo doc --workspace --all-features + +.PHONY: build +build: + cargo build --all-targets --workspace + +.PHONY: build-wasm +build-wasm: + cd automerge-backend-wasm && yarn dev + +.PHONY: test +test: test-rust test-wasm test-js + cargo test --workspace + +.PHONY: test-rust +test-rust: + cargo test --workspace + +.PHONY: test-wasm +test-wasm: + wasm-pack test automerge-frontend --node + +.PHONY: test-js +test-js: build-wasm + cd automerge-backend-wasm && yarn test:js + +.PHONY: ci +ci: fmt clippy doc build test diff --git a/README.md b/README.md index ad174da4..7668a018 100644 --- a/README.md +++ b/README.md @@ -1,147 +1,55 @@ # Automerge -Automerge logo +[![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) -[![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 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. -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. +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. -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. -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/ +## Using automerge-backend-wasm with automerge -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) +This backend is tracking the [performance branch of automerge](https://github.com/automerge/automerge/tree/performance) -## Status - -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 -``` - -If your build fails to find `cmocka.h` you may need to teach it about homebrew's -installation location: +To build the wasm backend you'll need to install [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/). Then: ``` -export CPATH=/opt/homebrew/include -export LIBRARY_PATH=/opt/homebrew/lib -./scripts/ci/run + $ cd automerge-backend-wasm + $ yarn release ``` -## Contributing +Once it is built set the new default backend in your js application like this. + +```js + const wasmBackend = require(path.resolve(WASM_BACKEND_PATH)) + Automerge.setDefaultBackend(wasmBackend) +``` + +## 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. =) + + -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 new file mode 100644 index 00000000..b4fa7794 --- /dev/null +++ b/automerge-backend-wasm/.gitignore @@ -0,0 +1,7 @@ +node_modules +/wasm-pack.log +/build +/dev + +# Used for js-interop tests +/automerge-js-temp diff --git a/rust/automerge-wasm/Cargo.toml b/automerge-backend-wasm/Cargo.toml similarity index 59% rename from rust/automerge-wasm/Cargo.toml rename to automerge-backend-wasm/Cargo.toml index b6055a7d..9b37a4b8 100644 --- a/rust/automerge-wasm/Cargo.toml +++ b/automerge-backend-wasm/Cargo.toml @@ -1,15 +1,14 @@ # You must change these to your own details. [package] -name = "automerge-wasm" +name = "automerge-backend-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 = "2021" +edition = "2018" license = "MIT" -rust-version = "1.57.0" [lib] crate-type = ["cdylib","rlib"] @@ -22,30 +21,19 @@ default = ["console_error_panic_hook"] [dependencies] console_error_panic_hook = { version = "^0.1", optional = true } # wee_alloc = { version = "^0.4", optional = true } -automerge = { path = "../automerge", features=["wasm"] } +automerge-backend = { path = "../automerge-backend" } +automerge-protocol = { path = "../automerge-protocol" } js-sys = "^0.3" serde = "^1.0" serde_json = "^1.0" -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" +getrandom = { version = "0.2.2", features=["js"] } +uuid = { version = "^0.8.2", features=["v4", "wasm-bindgen", "serde"] } +serde-wasm-bindgen = "0.1.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.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 +version = "^0.2" +features = ["serde-serialize"] # The `web-sys` crate allows you to interact with the various browser APIs, # like the DOM. @@ -54,9 +42,7 @@ version = "0.3.22" features = ["console"] - [dev-dependencies] futures = "^0.1" -proptest = { version = "^1.0.0", default-features = false, features = ["std"] } -wasm-bindgen-futures = "^0.4" +wasm-bindgen-futures = "^0.3" wasm-bindgen-test = "^0.3" diff --git a/automerge-backend-wasm/GOALS_AND_ISSUES.md b/automerge-backend-wasm/GOALS_AND_ISSUES.md new file mode 100644 index 00000000..ee9b5096 --- /dev/null +++ b/automerge-backend-wasm/GOALS_AND_ISSUES.md @@ -0,0 +1,78 @@ + +# 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 new file mode 100644 index 00000000..592e2105 --- /dev/null +++ b/automerge-backend-wasm/LICENSE @@ -0,0 +1,20 @@ +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 new file mode 100644 index 00000000..71f47ae2 --- /dev/null +++ b/automerge-backend-wasm/README.md @@ -0,0 +1,22 @@ +## 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 new file mode 100644 index 00000000..d1bc9178 --- /dev/null +++ b/automerge-backend-wasm/package.json @@ -0,0 +1,38 @@ +{ + "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", + "cjs": "wasm-pack build --target nodejs --dev --out-name index -d build/cjs && rm build/cjs/package.json", + "mjs": "wasm-pack build --target bundler --dev --out-name index -d build/mjs && cp package.mjs.json build/mjs/package.json", + "dev": "yarn cjs && yarn mjs && 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 new file mode 100644 index 00000000..3dbc1ca5 --- /dev/null +++ b/automerge-backend-wasm/package.mjs.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/automerge-backend-wasm/package.pkg.json b/automerge-backend-wasm/package.pkg.json new file mode 100644 index 00000000..208b16d0 --- /dev/null +++ b/automerge-backend-wasm/package.pkg.json @@ -0,0 +1,35 @@ +{ + "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 new file mode 100755 index 00000000..f10e607c --- /dev/null +++ b/automerge-backend-wasm/scripts/js_tests.sh @@ -0,0 +1,41 @@ +#! /usr/bin/env bash +set -e + +ORIGINAL_PWD=$PWD +if [[ -z $AUTOMERGE_JS_DIR ]]; then + COMMIT_HASH=ee09eead68d572725b344bd7ab94bfa3d6d29889 + 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 + git fetch --all + 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/automerge/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 dev' or '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 new file mode 100644 index 00000000..e9196092 --- /dev/null +++ b/automerge-backend-wasm/src/lib.rs @@ -0,0 +1,404 @@ +//#![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(|_| AutomergeError::DecodeFailed)?; + 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 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 new file mode 100644 index 00000000..37e70eee --- /dev/null +++ b/automerge-backend-wasm/src/types.rs @@ -0,0 +1,102 @@ +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 new file mode 100644 index 00000000..27e810a2 --- /dev/null +++ b/automerge-backend-wasm/test/backend_test.js @@ -0,0 +1,52 @@ +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 new file mode 100644 index 00000000..feb9721d --- /dev/null +++ b/automerge-backend-wasm/test/mocha.opts @@ -0,0 +1,3 @@ +--use_strict +--watch-extensions js +test/*test*.js diff --git a/rust/automerge/src/storage/change/op_with_change_actors.rs b/automerge-backend-wasm/tests/app.rs similarity index 100% rename from rust/automerge/src/storage/change/op_with_change_actors.rs rename to automerge-backend-wasm/tests/app.rs diff --git a/automerge-backend-wasm/yarn.lock b/automerge-backend-wasm/yarn.lock new file mode 100644 index 00000000..f44ff394 --- /dev/null +++ b/automerge-backend-wasm/yarn.lock @@ -0,0 +1,735 @@ +# 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 new file mode 100644 index 00000000..1d28a451 --- /dev/null +++ b/automerge-backend/Cargo.toml @@ -0,0 +1,40 @@ +[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" +smol_str = "0.1.17" + +[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 new file mode 100644 index 00000000..b7e703df --- /dev/null +++ b/automerge-backend/TODO.md @@ -0,0 +1,9 @@ + + +### 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 new file mode 100644 index 00000000..fac5586a --- /dev/null +++ b/automerge-backend/src/actor_map.rs @@ -0,0 +1,130 @@ +use std::cmp::Ordering; + +use automerge_protocol as amp; +use smol_str::SmolStr; + +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.clone()), + 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) -> SmolStr { + SmolStr::new(format!( + "{}@{}", + id.0, + self.export_actor(id.1).to_hex_string() + )) + } + + pub fn elementid_to_string(&self, eid: &ElementId) -> SmolStr { + match eid { + ElementId::Head => "_head".into(), + ElementId::Id(id) => self.opid_to_string(id), + } + } + + pub fn key_to_string(&self, key: &Key) -> SmolStr { + 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 new file mode 100644 index 00000000..9623a8ef --- /dev/null +++ b/automerge-backend/src/backend.rs @@ -0,0 +1,640 @@ +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}, + 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, + 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, + }) + } + + /// This loads changes into the backend but does not produce a patch and does not go through + /// the queue. + /// + /// Generating the patch can itself be expensive and not always required, for instance when + /// loading a new backend from bytes. + /// + /// The changes should be in causal order as per the document's binary format. + pub fn load_changes(&mut self, changes: Vec) -> Result<(), AutomergeError> { + let mut patch = IncrementalPatch::new(); + + for change in changes { + self.apply_change(change, &mut patch)?; + } + + 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.swap_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 amp::SortedVec; + 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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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 new file mode 100644 index 00000000..536eaf90 --- /dev/null +++ b/automerge-backend/src/change.rs @@ -0,0 +1,1354 @@ +//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, SortedVec}; +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, DepsIterator, 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 hasher = Sha256::new(); + + let mut deps = change.deps.clone(); + deps.sort_unstable(); + + let mut chunk = encode_chunk(change, &deps); + + let mut bytes = Vec::with_capacity(MAGIC_BYTES.len() + 4 + chunk.bytes.len()); + + 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::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[..]); + 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, + message: Range, + actors: Vec, + pub deps: Vec, + ops: HashMap>, + 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 + } + + 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: impl Iterator, + actors: &[amp::ActorId], +) -> SortedVec { + pred.map(|(ctr, actor)| amp::OpId(ctr, actors[actor].clone())) + .collect() +} + +fn doc_changes_to_uncompressed_changes<'a>( + changes: impl Iterator + 'a, + actors: &'a [amp::ActorId], +) -> impl Iterator + 'a { + changes.map(move |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, + operations: change + .ops + .into_iter() + .map(|op| amp::Op { + action: (&op.action).into(), + insert: op.insert, + key: op.key, + obj: op.obj, + // we've already confirmed that all op.actor's are valid + pred: pred_into(op.pred.into_iter(), actors), + }) + .collect(), + deps: Vec::new(), + extra_bytes: change.extra_bytes, + }) +} + +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)?; + + 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 = ChangeIterator::new(bytes, &changes_data).collect::>(); + let doc_changes_deps = DepsIterator::new(bytes, &changes_data); + + let doc_changes_len = doc_changes.len(); + + 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 uncompressed_changes = + doc_changes_to_uncompressed_changes(doc_changes.into_iter(), &actors); + + let changes = compress_doc_changes(uncompressed_changes, doc_changes_deps, doc_changes_len) + .ok_or(decoding::Error::NoDocChanges)?; + + let mut calculated_heads = HashSet::new(); + for change in &changes { + for dep in &change.deps { + calculated_heads.remove(dep); + } + calculated_heads.insert(change.hash); + } + + if calculated_heads != heads.into_iter().collect::>() { + return Err(decoding::Error::MismatchedHeads); + } + + Ok(changes) +} + +fn compress_doc_changes( + uncompressed_changes: impl Iterator, + doc_changes_deps: impl Iterator>, + num_changes: usize, +) -> Option> { + let mut changes: Vec = Vec::with_capacity(num_changes); + + // fill out the hashes as we go + for (deps, mut uncompressed_change) in doc_changes_deps.zip_eq(uncompressed_changes) { + for idx in deps { + uncompressed_change.deps.push(changes.get(idx)?.hash); + } + changes.push(uncompressed_change.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()].into(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Counter(-11)), + key: key2.clone(), + obj: obj1.clone(), + insert, + pred: vec![opid1.clone(), opid2.clone()].into(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Timestamp(20)), + key: key3, + obj: obj1, + insert, + pred: vec![opid1.clone(), opid2].into(), + }, + 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()].into(), + }, + amp::Op { + action: amp::OpType::Make(amp::ObjType::Map), + key: key2.clone(), + obj: obj2.clone(), + insert, + pred: vec![opid3.clone(), opid4.clone()].into(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Str("val1".into())), + key: head.clone(), + obj: obj3.clone(), + insert: true, + pred: vec![opid3, opid4.clone()].into(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Str("val2".into())), + key: head, + obj: obj3.clone(), + insert: true, + pred: vec![opid4.clone(), opid5.clone()].into(), + }, + amp::Op { + action: amp::OpType::Inc(10), + key: key2, + obj: obj2, + insert, + pred: vec![opid1.clone(), opid5.clone()].into(), + }, + amp::Op { + action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), + obj: obj3.clone(), + key: keyseq1, + insert: true, + pred: vec![opid4.clone(), opid5.clone()].into(), + }, + amp::Op { + action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), + obj: obj3.clone(), + key: keyseq2, + insert: true, + pred: vec![opid4, opid5].into(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Cursor(opid1)), + obj: obj3, + key: "somekey".into(), + insert: false, + pred: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + amp::Op { + action: amp::OpType::Make(amp::ObjType::List), + obj: amp::ObjectId::Root, + key: "somelist".into(), + insert: false, + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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 new file mode 100644 index 00000000..edeea2b5 --- /dev/null +++ b/automerge-backend/src/columnar.rs @@ -0,0 +1,1360 @@ +use core::fmt::Debug; +use std::{ + borrow::Cow, + cmp::Ordering, + collections::HashMap, + io, + io::{Read, Write}, + ops::Range, + str, +}; + +use amp::SortedVec; +use automerge_protocol as amp; +use flate2::bufread::DeflateDecoder; +use smol_str::SmolStr; +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()?; + 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) 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), + 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 extra_bytes = self.extra.next().unwrap_or_else(Vec::new); + Some(DocChange { + actor, + seq, + max_op, + time, + message, + 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>, +} + +impl<'a> DepsIterator<'a> { + pub fn new(bytes: &'a [u8], ops: &'a HashMap>) -> Self { + Self { + num: col_iter(bytes, ops, DOC_DEPS_NUM), + dep: col_iter(bytes, ops, DOC_DEPS_INDEX), + } + } +} + +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, SmolStr>, +} + +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 = SortedVec; + 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(SortedVec::from(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(SmolStr::new(s))) + } + 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 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 { + const COLUMNS: usize = 4; + + 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 { + const COLUMNS: usize = 3; + + fn new() -> KeyEncoder { + KeyEncoder { + actor: RleEncoder::new(), + ctr: DeltaEncoder::new(), + str: RleEncoder::new(), + } + } + + fn append(&mut self, key: amp::Key, actors: &mut Vec) { + match key { + amp::Key::Map(s) => { + self.actor.append_null(); + self.ctr.append_null(); + self.str.append_value(s); + } + 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 { + const COLUMNS: usize = 3; + + fn new() -> PredEncoder { + PredEncoder { + num: RleEncoder::new(), + actor: RleEncoder::new(), + ctr: DeltaEncoder::new(), + } + } + + fn append(&mut self, pred: &SortedVec, 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 { + const COLUMNS: usize = 2; + + 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_unstable_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, 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(&mut self, ops: I, actors: &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_unstable_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>) { } + +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(); + e.encode(ops, 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 op in ops { + self.append(op, actors); + } + } + + fn append<'a>(&mut self, op: ExpandedOp<'a>, actors: &mut Vec) { + self.obj.append(&op.obj, actors); + self.key.append(op.key.into_owned(), actors); + self.insert.append(op.insert); + + 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>) { + // allocate for the exact number of columns + let mut coldata = Vec::with_capacity( + 2 + ObjEncoder::COLUMNS + + KeyEncoder::COLUMNS + + ValEncoder::COLUMNS + + PredEncoder::COLUMNS, + ); + coldata.push(self.insert.finish(COL_INSERT)); + coldata.push(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_unstable_by(|a, b| a.col.cmp(&b.col)); + + let non_empty_column_count = coldata.iter().filter(|&d| !d.data.is_empty()).count(); + let data_len: usize = coldata.iter().map(|d| d.data.len()).sum(); + // 1 for the non_empty_column_count, 2 for each non_empty column (encode_col_len), data_len + // for all the actual data + let mut data = Vec::with_capacity(1 + (non_empty_column_count * 2) + data_len); + + non_empty_column_count.encode(&mut data).ok(); + for d in &mut coldata { + d.encode_col_len(&mut data).ok(); + } + + let mut rangemap = HashMap::with_capacity(non_empty_column_count); + 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 = ExpandedOp { + action: InternalOpType::Set(ScalarValue::Null), + obj: Cow::Owned(amp::ObjectId::Root), + key: Cow::Owned(Key::Map("r".into())), + pred: Cow::Owned(vec![actor.op_id_at(1), actor2.op_id_at(1)].into()), + insert: false, + }; + + let mut column_encoder = ColumnEncoder::new(); + column_encoder.encode(vec![col_op], &mut actors); + let (bytes, _) = column_encoder.finish(); + + let col_op2 = ExpandedOp { + action: InternalOpType::Set(ScalarValue::Null), + obj: Cow::Owned(amp::ObjectId::Root), + key: Cow::Owned(Key::Map("r".into())), + pred: Cow::Owned(vec![actor2.op_id_at(1), actor.op_id_at(1)].into()), + 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 new file mode 100644 index 00000000..b36caa8e --- /dev/null +++ b/automerge-backend/src/concurrent_operations.rs @@ -0,0 +1,70 @@ +use std::ops::Deref; + +use crate::{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) -> (OpHandle, Vec) { + if new_op.is_inc() { + for op in &mut self.ops { + if op.maybe_increment(&new_op) { + return (op.clone(), Vec::new()); + } + } + (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()); + } + _ => {} + } + + (new_op, overwritten_ops) + } + } +} diff --git a/rust/automerge/src/decoding.rs b/automerge-backend/src/decoding.rs similarity index 76% rename from rust/automerge/src/decoding.rs rename to automerge-backend/src/decoding.rs index cd938a3c..fc2d0b69 100644 --- a/rust/automerge/src/decoding.rs +++ b/automerge-backend/src/decoding.rs @@ -1,10 +1,7 @@ use core::fmt::Debug; -use std::num::NonZeroU64; -use std::{borrow::Cow, io, io::Read, str}; +use std::{borrow::Cow, convert::TryFrom, io, io::Read, str}; -use crate::error; -use crate::legacy as amp; -use crate::ActorId; +use automerge_protocol as amp; use smol_str::SmolStr; /// The error type for decoding operations. @@ -23,7 +20,7 @@ pub enum Error { )] WrongType { expected_one_of: Vec, found: u8 }, #[error("Bad change format: {0}")] - BadChangeFormat(#[source] error::InvalidChangeHashSlice), + BadChangeFormat(#[source] amp::error::InvalidChangeHashSlice), #[error("Not enough bytes")] NotEnoughBytes, #[error("Found the wrong magic bytes in the document")] @@ -52,60 +49,7 @@ pub enum Error { Io(#[from] io::Error), } -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)] +#[derive(thiserror::Error, Debug)] pub enum InvalidChangeError { #[error("Change contained an operation with action 'set' which did not have a 'value'")] SetOpWithoutValue, @@ -114,24 +58,24 @@ pub enum InvalidChangeError { #[error("Change contained an invalid object id: {}", source.0)] InvalidObjectId { #[from] - source: error::InvalidObjectId, + source: amp::error::InvalidObjectId, }, #[error("Change contained an invalid hash: {:?}", source.0)] InvalidChangeHash { #[from] - source: error::InvalidChangeHashSlice, + source: amp::error::InvalidChangeHashSlice, }, } #[derive(Clone, Debug)] pub(crate) struct Decoder<'a> { - pub(crate) offset: usize, - pub(crate) last_read: usize, + pub offset: usize, + pub last_read: usize, data: Cow<'a, [u8]>, } impl<'a> Decoder<'a> { - pub(crate) fn new(data: Cow<'a, [u8]>) -> Self { + pub fn new(data: Cow<'a, [u8]>) -> Self { Decoder { offset: 0, last_read: 0, @@ -139,7 +83,7 @@ impl<'a> Decoder<'a> { } } - pub(crate) fn read(&mut self) -> Result { + pub 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)?; @@ -153,7 +97,7 @@ impl<'a> Decoder<'a> { } } - pub(crate) fn read_bytes(&mut self, index: usize) -> Result<&[u8], Error> { + pub fn read_bytes(&mut self, index: usize) -> Result<&[u8], Error> { if self.offset + index > self.data.len() { Err(Error::TryingToReadPastEnd) } else { @@ -164,12 +108,12 @@ impl<'a> Decoder<'a> { } } - pub(crate) fn done(&self) -> bool { + pub fn done(&self) -> bool { self.offset >= self.data.len() } } -/// See discussion on [`crate::encoding::BooleanEncoder`] for the format data is stored in. +/// See discussion on [`BooleanEncoder`] for the format data is stored in. pub(crate) struct BooleanDecoder<'a> { decoder: Decoder<'a>, last_value: bool, @@ -209,10 +153,10 @@ impl<'a> Iterator for BooleanDecoder<'a> { } } -/// See discussion on [`crate::encoding::RleEncoder`] for the format data is stored in. +/// See discussion on [`RleEncoder`] for the format data is stored in. #[derive(Debug)] pub(crate) struct RleDecoder<'a, T> { - pub(crate) decoder: Decoder<'a>, + pub decoder: Decoder<'a>, last_value: Option, count: isize, literal: bool, @@ -277,7 +221,7 @@ where } } -/// See discussion on [`crate::encoding::DeltaEncoder`] for the format data is stored in. +/// See discussion on [`DeltaEncoder`] for the format data is stored in. pub(crate) struct DeltaDecoder<'a> { rle: RleDecoder<'a, i64>, absolute_val: u64, @@ -407,15 +351,6 @@ 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 @@ -464,7 +399,7 @@ impl Decodable for Option { } } -impl Decodable for ActorId { +impl Decodable for amp::ActorId { fn decode(bytes: &mut R) -> Option where R: Read, diff --git a/automerge-backend/src/encoding.rs b/automerge-backend/src/encoding.rs new file mode 100644 index 00000000..89a8eec6 --- /dev/null +++ b/automerge-backend/src/encoding.rs @@ -0,0 +1,376 @@ +use core::fmt::Debug; +use std::{ + io, + io::{Read, Write}, + mem, +}; + +use automerge_protocol as amp; +use flate2::{bufread::DeflateEncoder, Compression}; +use smol_str::SmolStr; + +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 { + let mut v = Vec::with_capacity(2); + v.push(other); + RleState::LiteralRun(value, v) + } + } + 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 SmolStr { + 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 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::default()); + //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 new file mode 100644 index 00000000..b64a9325 --- /dev/null +++ b/automerge-backend/src/error.rs @@ -0,0 +1,67 @@ +//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 new file mode 100644 index 00000000..3e3febb7 --- /dev/null +++ b/automerge-backend/src/event_handlers.rs @@ -0,0 +1,72 @@ +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 new file mode 100644 index 00000000..7f14ed46 --- /dev/null +++ b/automerge-backend/src/expanded_op.rs @@ -0,0 +1,310 @@ +use std::borrow::Cow; + +use amp::{ActorId, ElementId, Key, OpId, SortedVec}; +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, SortedVec>, + 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.get(0).unwrap().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].into()), + 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, SortedVec}; + 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: SortedVec::new(), + 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(SortedVec::new()), + 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(SortedVec::new()), + 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(SortedVec::new()), + 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: SortedVec::new(), + 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: SortedVec::new(), + 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(SortedVec::new()), + 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(SortedVec::new()), + 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(SortedVec::new()), + insert: true + }, + ExpandedOp { + action: InternalOpType::Set(ScalarValue::Str("hi".into())), + obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), + key: Cow::Owned(Key::Seq(ElementId::Id(OpId(4, actor.clone())))), + pred: Cow::Owned(SortedVec::new()), + insert: true + }, + ExpandedOp { + action: InternalOpType::Set(ScalarValue::Str("world".into())), + obj: Cow::Owned(ObjectId::Id(OpId(1, actor.clone()))), + key: Cow::Owned(Key::Seq(ElementId::Id(OpId(5, actor)))), + pred: Cow::Owned(SortedVec::new()), + 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].into(), + 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())].into()), + 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())].into()), + 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)].into()), + insert: true + }, + ] + ); + } +} diff --git a/automerge-backend/src/internal.rs b/automerge-backend/src/internal.rs new file mode 100644 index 00000000..f7624792 --- /dev/null +++ b/automerge-backend/src/internal.rs @@ -0,0 +1,102 @@ +use automerge_protocol as amp; +use nonzero_ext::nonzero; +use smol_str::SmolStr; + +#[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(SmolStr), + 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 new file mode 100644 index 00000000..d3c07c7d --- /dev/null +++ b/automerge-backend/src/lib.rs @@ -0,0 +1,75 @@ +#![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; + +// 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 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/object_store.rs b/automerge-backend/src/object_store.rs new file mode 100644 index 00000000..2241706a --- /dev/null +++ b/automerge-backend/src/object_store.rs @@ -0,0 +1,111 @@ +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 new file mode 100644 index 00000000..8db8bc10 --- /dev/null +++ b/automerge-backend/src/op_handle.rs @@ -0,0 +1,111 @@ +use std::{ + borrow::Cow, + 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; + let actor = actors.import_actor(change.actor_id()); + change + .iter_ops() + .map(|op| { + let internal_op = actors.import_op(op); + let id = OpId(opnum, actor); + 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) -> Cow { + if self.insert { + Cow::Owned(self.id.into()) + } else { + Cow::Borrowed(&self.key) + } + } + + 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 new file mode 100644 index 00000000..fe2c5424 --- /dev/null +++ b/automerge-backend/src/op_set.rs @@ -0,0 +1,353 @@ +//! 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 smol_str::SmolStr; +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().into_owned()) + .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) -> SmolStr { + 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 new file mode 100644 index 00000000..d1b2f70f --- /dev/null +++ b/automerge-backend/src/ordered_set.rs @@ -0,0 +1,897 @@ +#![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 new file mode 100644 index 00000000..f32e9089 --- /dev/null +++ b/automerge-backend/src/patches.rs @@ -0,0 +1,10 @@ +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 new file mode 100644 index 00000000..0778aa97 --- /dev/null +++ b/automerge-backend/src/patches/edits.rs @@ -0,0 +1,98 @@ +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 new file mode 100644 index 00000000..7fbcc2c4 --- /dev/null +++ b/automerge-backend/src/patches/from_scratch_diff.rs @@ -0,0 +1,201 @@ +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 new file mode 100644 index 00000000..e0c4500c --- /dev/null +++ b/automerge-backend/src/patches/gen_value_diff.rs @@ -0,0 +1,19 @@ +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 new file mode 100644 index 00000000..87338bdf --- /dev/null +++ b/automerge-backend/src/patches/incremental_diff.rs @@ -0,0 +1,457 @@ +use std::{ + borrow::Cow, + 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) -> Cow { + match self { + Self::SeqInsert(op, ..) + | Self::SeqUpdate(op, ..) + | Self::SeqRemove(op, ..) + | Self::Set(op) => op.operation_key(), + Self::CursorChange(k) => Cow::Borrowed(k), + } + } +} + +/// `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) { + // 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 mut props = HashMap::with_capacity(keys.len()); + 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 { + // 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(); + let mut props = HashMap::with_capacity(keys.len()); + 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 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"), + }; + opid_to_value.insert(workshop.make_external_opid(&op.id), value); + } + 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 new file mode 100644 index 00000000..edf1ad55 --- /dev/null +++ b/automerge-backend/src/patches/patch_workshop.rs @@ -0,0 +1,23 @@ +use automerge_protocol as amp; +use smol_str::SmolStr; + +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) -> SmolStr; + 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 new file mode 100644 index 00000000..9eef767d --- /dev/null +++ b/automerge-backend/src/sync.rs @@ -0,0 +1,367 @@ +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() { + 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/rust/automerge/src/sync/bloom.rs b/automerge-backend/src/sync/bloom.rs similarity index 56% rename from rust/automerge/src/sync/bloom.rs rename to automerge-backend/src/sync/bloom.rs index 8523061e..1fe5ef5d 100644 --- a/rust/automerge/src/sync/bloom.rs +++ b/automerge-backend/src/sync/bloom.rs @@ -1,7 +1,8 @@ -use std::borrow::Borrow; +use std::{borrow::Cow, convert::TryFrom}; -use crate::storage::parse; -use crate::ChangeHash; +use automerge_protocol::ChangeHash; + +use crate::{decoding, decoding::Decoder, encoding, encoding::Encodable}; // 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 @@ -9,7 +10,7 @@ use crate::ChangeHash; const BITS_PER_ENTRY: u32 = 10; const NUM_PROBES: u32 = 7; -#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)] +#[derive(Default, Debug, Clone)] pub struct BloomFilter { num_entries: u32, num_bits_per_entry: u32, @@ -17,52 +18,17 @@ 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 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())) + pub fn into_bytes(self) -> Result, encoding::Error> { + if self.num_entries == 0 { + Ok(Vec::new()) } else { - 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(), - }, - )) + 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) } } @@ -79,8 +45,7 @@ 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::with_capacity(self.num_probes as usize); - probes.push(x); + let mut probes = vec![x]; for _ in 1..self.num_probes { x = (x + y) % modulo; y = (y + z) % modulo; @@ -121,23 +86,6 @@ impl BloomFilter { true } } - - 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)]; - let mut filter = Self { - num_entries, - num_bits_per_entry, - num_probes, - bits, - }; - for hash in hashes { - filter.add_hash(hash.borrow()); - } - filter - } } fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize { @@ -145,16 +93,44 @@ fn bits_capacity(num_entries: u32, num_bits_per_entry: u32) -> usize { f as usize } -#[derive(thiserror::Error, Debug)] -#[error("{0}")] -pub struct DecodeError(String); - -impl TryFrom<&[u8]> for BloomFilter { - type Error = DecodeError; - - fn try_from(bytes: &[u8]) -> Result { - Self::parse(parse::Input::new(bytes)) - .map(|(_, b)| b) - .map_err(|e| DecodeError(e.to_string())) +impl From<&[ChangeHash]> for BloomFilter { + fn from(hashes: &[ChangeHash]) -> 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 mut filter = Self { + num_entries, + num_bits_per_entry, + num_probes, + bits, + }; + for hash in hashes { + filter.add_hash(hash); + } + filter + } +} + +impl TryFrom<&[u8]> for BloomFilter { + type Error = decoding::Error; + + 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(), + }) + } } } diff --git a/automerge-backend/src/sync/state.rs b/automerge-backend/src/sync/state.rs new file mode 100644 index 00000000..8552a93e --- /dev/null +++ b/automerge-backend/src/sync/state.rs @@ -0,0 +1,67 @@ +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 new file mode 100644 index 00000000..f5a6e087 --- /dev/null +++ b/automerge-backend/tests/apply_change.rs @@ -0,0 +1,1435 @@ +extern crate automerge_backend; +use std::{convert::TryInto, num::NonZeroU32, str::FromStr}; + +use amp::{RootDiff, SortedVec}; +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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + }], + 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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + 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: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set(ScalarValue::F64(3.0)), + obj: ObjectId::from(actor.op_id_at(1)), + key: "wrens".into(), + pred: SortedVec::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: SortedVec::new(), + insert: false, + }, + Op { + obj: ObjectId::from(actor.op_id_at(1)), + action: amp::OpType::Set(ScalarValue::F64(3.0)), + key: "wrens".into(), + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set("chaffinch".into()), + obj: ObjectId::from(actor.op_id_at(1)), + key: ElementId::Head.into(), + pred: SortedVec::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)].into(), + 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: SortedVec::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: SortedVec::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)].into(), + 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: SortedVec::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: SortedVec::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)].into(), + 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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + insert: false, + }, + Op { + action: amp::OpType::Set("buy milk".into()), + obj: actor1.op_id_at(3).into(), + key: "title".into(), + pred: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set(false.into()), + obj: actor1.op_id_at(3).into(), + key: "done".into(), + pred: SortedVec::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)].into(), + insert: false, + }, + Op { + action: amp::OpType::Set("water plants".into()), + obj: actor2.op_id_at(3).into(), + key: "title".into(), + pred: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set(false.into()), + obj: actor2.op_id_at(3).into(), + key: "done".into(), + pred: SortedVec::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)].into(), + 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".into() => 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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + Op { + action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), + obj: ObjectId::Root, + key: "cursor".into(), + insert: false, + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + Op { + action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(2))), + obj: ObjectId::Root, + key: "cursor".into(), + insert: false, + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + Op { + action: amp::OpType::Set(ScalarValue::Cursor(actor.op_id_at(3))), + obj: ObjectId::Root, + key: "cursor".into(), + insert: false, + pred: SortedVec::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)].into(), + }], + 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 new file mode 100644 index 00000000..b64e2889 --- /dev/null +++ b/automerge-backend/tests/apply_local_change.rs @@ -0,0 +1,611 @@ +extern crate automerge_backend; +use std::{collections::HashSet, convert::TryInto, num::NonZeroU32}; + +use amp::{RootDiff, SortedVec}; +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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + }], + 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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + 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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + }, + 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)].into(), + }, + ], + 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: SortedVec::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: SortedVec::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)].into(), + 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)].into(), + 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: SortedVec::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: SortedVec::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)].into(), + }, + ], + 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: SortedVec::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: SortedVec::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)].into(), + 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 new file mode 100644 index 00000000..8d0e0184 --- /dev/null +++ b/automerge-backend/tests/get_changes.rs @@ -0,0 +1,33 @@ +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 new file mode 100644 index 00000000..48eecb3e --- /dev/null +++ b/automerge-backend/tests/get_patch.rs @@ -0,0 +1,690 @@ +extern crate automerge_backend; +use std::{convert::TryInto, num::NonZeroU32}; + +use amp::{RootDiff, SortedVec}; +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: SortedVec::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)].into(), + 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: SortedVec::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: SortedVec::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: SortedVec::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)].into(), + 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: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set(ScalarValue::F64(3.0)), + key: "wrens".into(), + obj: ObjectId::from(actor.op_id_at(1)), + pred: SortedVec::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)].into(), + insert: false, + }, + Op { + obj: ObjectId::from(actor.op_id_at(1)), + action: amp::OpType::Set(ScalarValue::F64(15.0)), + key: "sparrows".into(), + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + Op { + obj: ObjectId::from(actor.op_id_at(2)), + action: amp::OpType::Set("water plants".into()), + key: "title".into(), + pred: SortedVec::new(), + insert: false, + }, + Op { + obj: ObjectId::from(actor.op_id_at(2)), + action: amp::OpType::Set(false.into()), + key: "done".into(), + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + insert: false, + }, + Op { + action: amp::OpType::Set("local".into()), + obj: local_actor.op_id_at(1).into(), + key: amp::ElementId::Head.into(), + pred: SortedVec::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)].into(), + 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)].into(), + 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 new file mode 100644 index 00000000..7d291f7b --- /dev/null +++ b/automerge-backend/tests/load.rs @@ -0,0 +1,52 @@ +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 new file mode 100644 index 00000000..0ae7bbac --- /dev/null +++ b/automerge-c-v2/.gitignore @@ -0,0 +1,2 @@ +automerge +automerge.o diff --git a/automerge-c-v2/Cargo.toml b/automerge-c-v2/Cargo.toml new file mode 100644 index 00000000..1d678a49 --- /dev/null +++ b/automerge-c-v2/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "automerge-c-v2" +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" +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 new file mode 100644 index 00000000..f71b1b8a --- /dev/null +++ b/automerge-c-v2/Makefile @@ -0,0 +1,30 @@ + +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 new file mode 100644 index 00000000..12df1cbd --- /dev/null +++ b/automerge-c-v2/automerge.c @@ -0,0 +1,271 @@ + +#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 new file mode 100644 index 00000000..d4b00f4a --- /dev/null +++ b/automerge-c-v2/automerge.h @@ -0,0 +1,214 @@ +#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 new file mode 100644 index 00000000..4a0d0155 --- /dev/null +++ b/automerge-c-v2/build.rs @@ -0,0 +1,16 @@ +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 new file mode 100644 index 00000000..a0ea9e1e --- /dev/null +++ b/automerge-c-v2/cbindgen.toml @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..e25f50bf --- /dev/null +++ b/automerge-c-v2/src/lib.rs @@ -0,0 +1,735 @@ +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 new file mode 100644 index 00000000..0ae7bbac --- /dev/null +++ b/automerge-c/.gitignore @@ -0,0 +1,2 @@ +automerge +automerge.o diff --git a/automerge-c/Cargo.toml b/automerge-c/Cargo.toml new file mode 100644 index 00000000..082f59ba --- /dev/null +++ b/automerge-c/Cargo.toml @@ -0,0 +1,22 @@ +[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 new file mode 100644 index 00000000..f71b1b8a --- /dev/null +++ b/automerge-c/Makefile @@ -0,0 +1,30 @@ + +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 new file mode 100644 index 00000000..d4ceb901 --- /dev/null +++ b/automerge-c/automerge.c @@ -0,0 +1,258 @@ + +#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 new file mode 100644 index 00000000..97fbc4fd --- /dev/null +++ b/automerge-c/automerge.h @@ -0,0 +1,189 @@ +#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 new file mode 100644 index 00000000..4a0d0155 --- /dev/null +++ b/automerge-c/build.rs @@ -0,0 +1,16 @@ +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 new file mode 100644 index 00000000..a0ea9e1e --- /dev/null +++ b/automerge-c/cbindgen.toml @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..3f5b1c89 --- /dev/null +++ b/automerge-c/src/lib.rs @@ -0,0 +1,573 @@ +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 new file mode 100644 index 00000000..ba9d5b18 --- /dev/null +++ b/automerge-cli/Cargo.toml @@ -0,0 +1,28 @@ +[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/rust/automerge-cli/IDEAS.md b/automerge-cli/IDEAS.md similarity index 100% rename from rust/automerge-cli/IDEAS.md rename to automerge-cli/IDEAS.md diff --git a/rust/automerge-cli/src/change.rs b/automerge-cli/src/change.rs similarity index 89% rename from rust/automerge-cli/src/change.rs rename to automerge-cli/src/change.rs index eef6aade..914bdfbb 100644 --- a/rust/automerge-cli/src/change.rs +++ b/automerge-cli/src/change.rs @@ -1,4 +1,5 @@ -use automerge as am; +use automerge_backend as amb; +use automerge_frontend as amf; use combine::{parser::char as charparser, EasyParser, ParseError, Parser}; use thiserror::Error; @@ -14,7 +15,12 @@ pub enum ChangeError { #[error("Error loading changes: {:?}", source)] ErrApplyingInitialChanges { #[source] - source: am::AutomergeError, + source: amb::AutomergeError, + }, + #[error("Some changes were invalid: {:?}", source)] + InvalidChangeRequest { + #[from] + source: amf::InvalidChangeRequest, }, #[error("Error writing changes to output file: {:?}", source)] ErrWritingChanges { @@ -134,7 +140,7 @@ where op_parser() .skip(charparser::spaces()) .skip(charparser::string("$")) - .and(path_segment_parser(am::Path::root())), + .and(path_segment_parser(amf::Path::root())), ) .skip(charparser::spaces()) .then(|(operation, path)| { @@ -169,17 +175,29 @@ 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 backend = am::Automerge::load(&buf) + let changes = amb::Change::load_document(&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/examine.rs b/automerge-cli/src/examine.rs similarity index 71% rename from rust/automerge-cli/src/examine.rs rename to automerge-cli/src/examine.rs index 0ee102fb..9c1ae2b3 100644 --- a/rust/automerge-cli/src/examine.rs +++ b/automerge-cli/src/examine.rs @@ -1,8 +1,7 @@ -use automerge as am; +use automerge_backend as amb; +use automerge_protocol as amp; use thiserror::Error; -use crate::{color_json::print_colored_json, SkipVerifyFlag}; - #[derive(Error, Debug)] pub enum ExamineError { #[error("Error reading change file: {:?}", source)] @@ -13,7 +12,7 @@ pub enum ExamineError { #[error("Error loading changes: {:?}", source)] ApplyingInitialChanges { #[source] - source: am::AutomergeError, + source: amb::AutomergeError, }, #[error("Error writing to output: {:?}", source)] WritingToOutput { @@ -22,29 +21,21 @@ pub enum ExamineError { }, } -pub(crate) fn examine( +pub 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::ReadingChanges { source: e })?; - let doc = skip - .load(&buf) + let changes = amb::Change::load_document(&buf) .map_err(|e| ExamineError::ApplyingInitialChanges { source: e })?; - let uncompressed_changes: Vec<_> = doc - .get_changes(&[]) - .unwrap() - .iter() - .map(|c| c.decode()) - .collect(); + let uncompressed_changes: Vec = changes.iter().map(|c| c.decode()).collect(); if is_tty { let json_changes = serde_json::to_value(uncompressed_changes).unwrap(); - print_colored_json(&json_changes).unwrap(); - writeln!(output).unwrap(); + colored_json::write_colored_json(&json_changes, &mut output).unwrap(); } else { let json_changes = serde_json::to_string_pretty(&uncompressed_changes).unwrap(); output diff --git a/automerge-cli/src/export.rs b/automerge-cli/src/export.rs new file mode 100644 index 00000000..07e25378 --- /dev/null +++ b/automerge-cli/src/export.rs @@ -0,0 +1,93 @@ +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 new file mode 100644 index 00000000..16d5ab9a --- /dev/null +++ b/automerge-cli/src/import.rs @@ -0,0 +1,23 @@ +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 new file mode 100644 index 00000000..db1fb590 --- /dev/null +++ b/automerge-cli/src/main.rs @@ -0,0 +1,182 @@ +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/rust/automerge-cli/tests/integration.rs b/automerge-cli/tests/integration.rs similarity index 54% rename from rust/automerge-cli/tests/integration.rs rename to automerge-cli/tests/integration.rs index 87e30db7..dc391ace 100644 --- a/rust/automerge-cli/tests/integration.rs +++ b/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,7 +61,6 @@ fn import_export_isomorphic() { assert_eq!(stdout, json_bytes); } -/* #[test] fn import_change_export() { let bin = env!("CARGO_BIN_EXE_automerge"); @@ -90,4 +89,3 @@ fn import_change_export() { }); assert_eq!(result, expected); } -*/ diff --git a/automerge-frontend/.gitignore b/automerge-frontend/.gitignore new file mode 100644 index 00000000..e420ee4b --- /dev/null +++ b/automerge-frontend/.gitignore @@ -0,0 +1 @@ +target/* diff --git a/automerge-frontend/Cargo.toml b/automerge-frontend/Cargo.toml new file mode 100644 index 00000000..a4e731b0 --- /dev/null +++ b/automerge-frontend/Cargo.toml @@ -0,0 +1,48 @@ +[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 } +smol_str = "0.1.18" + +[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", "smol_str/arbitrary"] +std = [] diff --git a/automerge-frontend/README.md b/automerge-frontend/README.md new file mode 100644 index 00000000..6e167d8c --- /dev/null +++ b/automerge-frontend/README.md @@ -0,0 +1,4 @@ +# 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 new file mode 100644 index 00000000..86e812ee --- /dev/null +++ b/automerge-frontend/benches/change.rs @@ -0,0 +1,41 @@ +use automerge_frontend::{Frontend, InvalidChangeRequest, LocalChange, Path, Value}; +use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; +use rand::{thread_rng, Rng}; +use smol_str::SmolStr; +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: SmolStr = 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.into()).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 new file mode 100644 index 00000000..3e3ea556 --- /dev/null +++ b/automerge-frontend/benches/statetree_apply_diff.rs @@ -0,0 +1,133 @@ +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".into() => 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".into() => 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".into())), + }], + }) + } + }, + }, + }); + } + 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".into())), + }); + } + 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".into() => 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 new file mode 100644 index 00000000..9cea5e84 --- /dev/null +++ b/automerge-frontend/src/error.rs @@ -0,0 +1,117 @@ +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 new file mode 100644 index 00000000..129ebe14 --- /dev/null +++ b/automerge-frontend/src/lib.rs @@ -0,0 +1,523 @@ +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: &[u8]) -> 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().as_bytes()) + } + + pub fn new_with_timestamper_and_actor_id( + t: Box Option>, + actor_id: &[u8], + ) -> Self { + let root_state = state_tree::StateTree::new(); + Frontend { + actor_id: ActorId::from_bytes(actor_id), + 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, + &::Key::Map(k.clone()), + 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 new file mode 100644 index 00000000..31df7985 --- /dev/null +++ b/automerge-frontend/src/mutation.rs @@ -0,0 +1,697 @@ +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.clone()), 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.clone(), 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.clone(), 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.clone(), 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).ok_or_else(|| { + InvalidChangeRequest::NoSuchPathError { + path: change.path.clone(), + } + })?; + (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).ok_or_else(|| { + InvalidChangeRequest::NoSuchPathError { + path: change.path.clone(), + } + })?; + (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).ok_or_else(|| { + InvalidChangeRequest::NoSuchPathError { + path: change.path.clone(), + } + })?; + (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 new file mode 100644 index 00000000..5018eca4 --- /dev/null +++ b/automerge-frontend/src/path.rs @@ -0,0 +1,60 @@ +use std::fmt; + +use smol_str::SmolStr; + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub(crate) enum PathElement { + Key(SmolStr), + 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 new file mode 100644 index 00000000..7e1f3241 --- /dev/null +++ b/automerge-frontend/src/state_tree/diffable_sequence.rs @@ -0,0 +1,511 @@ +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 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 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 new file mode 100644 index 00000000..806538d2 --- /dev/null +++ b/automerge-frontend/src/state_tree/mod.rs @@ -0,0 +1,876 @@ +use std::{collections::HashMap, convert::TryInto}; + +use amp::{ElementId, SortedVec}; +use automerge_protocol as amp; +use automerge_protocol::RootDiff; +use diffable_sequence::DiffableSequence; +use multivalue::NewValueRequest; +use smol_str::SmolStr; + +use crate::{error, 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 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().clone()) + .collect(), + ), + } + } + + 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) -> SortedVec { + self.props + .get(key) + .map(|v| vec![v.default_opid()].into()) + .unwrap_or_else(SortedVec::new) + } + + 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) -> SortedVec { + self.props + .get(key) + .map(|v| vec![v.default_opid()].into()) + .unwrap_or_else(SortedVec::new) + } + + 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, &SmolStr), 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) -> SortedVec { + self.graphemes + .get(index.try_into().unwrap()) + .map(|v| vec![v.1.default_opid().clone()].into()) + .unwrap_or_else(SortedVec::new) + } + + 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) -> SortedVec { + self.elements + .get(index.try_into().unwrap()) + .map(|v| vec![v.1.default_opid()].into()) + .unwrap_or_else(SortedVec::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 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); + } + } + } +} diff --git a/automerge-frontend/src/state_tree/multivalue.rs b/automerge-frontend/src/state_tree/multivalue.rs new file mode 100644 index 00000000..8d5ef572 --- /dev/null +++ b/automerge-frontend/src/state_tree/multivalue.rs @@ -0,0 +1,740 @@ +use std::{cmp::Ordering, collections::HashMap, iter::Iterator}; + +use amp::SortedVec; +use automerge_protocol as amp; +use smol_str::SmolStr; +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: SortedVec, +} + +/// 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: SortedVec, + ) -> 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() + } + + 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 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, SmolStr), + conflicts: HashMap, +} + +impl MultiGrapheme { + pub(super) fn new_from_grapheme_cluster(opid: amp::OpId, s: SmolStr) -> 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: SmolStr) { + 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) -> &SmolStr { + &self.winning_value.1 + } + + 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 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: SortedVec, +} + +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: SortedVec::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: SortedVec::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: SortedVec::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 new file mode 100644 index 00000000..e0a2d628 --- /dev/null +++ b/automerge-frontend/src/state_tree/resolved_path.rs @@ -0,0 +1,1040 @@ +use std::{ + convert::TryInto, + mem::{discriminant, Discriminant}, + num::NonZeroU32, +}; + +use amp::SortedVec; +use automerge_protocol as amp; +use smol_str::SmolStr; + +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().clone(), + )), + } + } + + 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(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: SmolStr, + payload: SetOrInsertPayload, + ) -> (Option, LocalOperationResult) { + let newvalue = MultiValue::new_from_value_2(NewValueRequest { + actor: payload.actor, + start_op: payload.start_op, + key: amp::Key::Map(key.clone()), + parent_obj: &::ObjectId::Root, + value: payload.value, + insert: false, + pred: self + .root + .get(&key) + .map(|mv| vec![mv.default_opid()].into()) + .unwrap_or_else(SortedVec::new), + }); + let (multivalue, new_ops, _new_cursors) = newvalue.finish(); + let old = self.root.root_props.insert(key, multivalue); + (old, LocalOperationResult { new_ops }) + } + + pub(crate) fn delete_key(&mut self, key: &str) -> Option<(MultiValue, LocalOperationResult)> { + let existing_value = self.root.get(key); + let pred = existing_value + .map(|v| vec![v.default_opid()].into()) + .unwrap_or_else(SortedVec::new); + let op_result = LocalOperationResult { + new_ops: vec![amp::Op { + action: amp::OpType::Del(NonZeroU32::new(1).unwrap()), + obj: amp::ObjectId::Root, + key: key.into(), + insert: false, + pred, + }], + }; + self.root.remove(key).map(|old| (old, op_result)) + } + + pub(crate) fn rollback_set(&mut self, key: SmolStr, 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: SmolStr, 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()].into(), + }], + } + } + + 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: SmolStr, + 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: amp::Key::Map(key.clone()), + 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, multivalue); + (old, LocalOperationResult { new_ops }) + } + + pub(crate) fn delete_key(&mut self, key: &str) -> Option<(MultiValue, LocalOperationResult)> { + let state_tree_map = match self.multivalue.default_statetree_value_mut() { + StateTreeValue::Composite(StateTreeComposite::Map(map)) => map, + _ => unreachable!(), + }; + let op_result = 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), + }], + }; + state_tree_map.props.remove(key).map(|old| (old, op_result)) + } + + pub(crate) fn rollback_set(&mut self, key: SmolStr, 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: SmolStr, 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: SmolStr, + 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: amp::Key::Map(key.clone()), + 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, multivalue); + (old, LocalOperationResult { new_ops }) + } + + pub(crate) fn delete_key(&mut self, key: &str) -> Option<(MultiValue, LocalOperationResult)> { + let state_tree_table = match self.multivalue.default_statetree_value_mut() { + StateTreeValue::Composite(StateTreeComposite::Table(map)) => map, + _ => unreachable!(), + }; + let op_result = 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), + }], + }; + state_tree_table + .props + .remove(key) + .map(|old| (old, op_result)) + } + + pub(crate) fn rollback_set(&mut self, key: SmolStr, 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: SmolStr, 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: SortedVec::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.clone())); + 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: SortedVec::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: SortedVec::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: SortedVec::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 { + if ops.len() == 1 { + // nothing to condense + return ops; + } + let ops_len = ops.len(); + let mut op_iter = ops.into_iter(); + if let Some(v) = op_iter.next() { + let mut new_ops = Vec::with_capacity(ops_len); + 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.into(), + 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.into(), + 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 new file mode 100644 index 00000000..13165391 --- /dev/null +++ b/automerge-frontend/src/value.rs @@ -0,0 +1,424 @@ +use std::{borrow::Cow, collections::HashMap}; + +use amp::SortedVec; +use automerge_protocol as amp; +use serde::Serialize; +use smol_str::SmolStr; + +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(SmolStr), + 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(SmolStr::new(s))) + } +} + +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(SmolStr::new(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: AsRef, +{ + fn from(h: HashMap) -> Self { + Value::Map( + h.into_iter() + .map(|(k, v)| (SmolStr::new(k), 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)| (SmolStr::new(k), 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(SmolStr::new(s))), + 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.to_string(), v.to_json())) + .collect(); + serde_json::Value::Object(result) + } + Value::Table(map) => { + let result: serde_json::map::Map = map + .iter() + .map(|(k, v)| (k.to_string(), 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: SortedVec::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: SortedVec::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.clone())), + obj: amp::ObjectId::from(make_text_op.clone()), + key: last_elemid.clone().into(), + insert: true, + pred: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::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".into() => Value::Primitive(Primitive::Str("world".into())), + "again".into() => 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".into() + )))) + ); + 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 new file mode 100644 index 00000000..e4b42edb --- /dev/null +++ b/automerge-frontend/tests/test_apply_patch.rs @@ -0,0 +1,1047 @@ +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".into()), "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".into()), "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".into()), "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.into()).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".into())), + } + ], + }) + } + }, + }, + }; + + frontend.apply_patch(patch2).unwrap(); + + assert_eq!( + frontend.state(), + &Into::::into( + hashmap! {"name" => Value::Text("bi".graphemes(true).map(|s|s.into()).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".into() => 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".into() => Value::Text(Vec::new())},), + ); +} diff --git a/automerge-frontend/tests/test_backend_concurrency.rs b/automerge-frontend/tests/test_backend_concurrency.rs new file mode 100644 index 00000000..513c8cde --- /dev/null +++ b/automerge-frontend/tests/test_backend_concurrency.rs @@ -0,0 +1,732 @@ +use amp::{RootDiff, SortedVec}; +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: SortedVec::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".into() => 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".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: 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".into() => 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: SortedVec::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)].into(), + }], + 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)].into(), + }], + 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)].into(), + }], + 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)].into(), + }], + 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)].into(), + }], + 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 new file mode 100644 index 00000000..b221206d --- /dev/null +++ b/automerge-frontend/tests/test_cursor.rs @@ -0,0 +1,291 @@ +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.into()).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.into()).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.into()).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".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, 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".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("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".into() => 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".into() => 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.into()).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".into())), +// ))?; +// d.add_change(LocalChange::insert( +// Path::root().key("list").index(0), +// Value::Primitive(Primitive::Str("1".into())), +// ))?; +// 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.into()).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 new file mode 100644 index 00000000..266b20ce --- /dev/null +++ b/automerge-frontend/tests/test_frontend.rs @@ -0,0 +1,909 @@ +use std::{convert::TryInto, num::NonZeroU32}; + +use amp::SortedVec; +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".into())), + ))?; + 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".into())), + obj: "_root".try_into().unwrap(), + key: "bird".into(), + insert: false, + pred: SortedVec::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: SortedVec::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: SortedVec::new(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::F64(3.0)), + obj: birds_id, + key: "wrens".into(), + insert: false, + pred: SortedVec::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: SortedVec::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)].into(), + }], + 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: SortedVec::new(), + }, + amp::Op { + action: amp::OpType::Set("chaffinch".into()), + obj: birds_id, + key: amp::ElementId::Head.into(), + insert: true, + pred: SortedVec::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)].into(), + }], + 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)].into(), + }], + 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: SortedVec::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)].into(), + }], + 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: SortedVec::new(), + }, + amp::Op { + action: amp::OpType::Set(amp::ScalarValue::Counter(1)), + obj: counts_id.clone(), + key: amp::ElementId::Head.into(), + insert: true, + pred: SortedVec::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)].into(), + }], + 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.into()).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)].into(), + }], + 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".into(), "a".into(), "m".into(), "e".into()]), + }); + 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.into()).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: SortedVec::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".into(), "h".into(), "a".into(), "m".into(), "e".into()]), + }); + 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: SortedVec::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".into()]), + }); + 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: SortedVec::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: SortedVec::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 new file mode 100644 index 00000000..76c5195c --- /dev/null +++ b/automerge-frontend/tests/test_mutation.rs @@ -0,0 +1,211 @@ +use std::{collections::HashMap, convert::TryInto}; + +use amp::SortedVec; +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: SortedVec::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: SortedVec::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: SortedVec::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: SortedVec::new(), + insert: true, + action: amp::OpType::Make(amp::ObjType::Map), + }, + amp::Op { + key: "test".into(), + obj: actor.op_id_at(2).into(), + pred: SortedVec::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: SortedVec::new(), + insert: true, + action: amp::OpType::Make(amp::ObjType::Map), + }, + amp::Op { + key: "test".into(), + obj: actor.op_id_at(4).into(), + pred: SortedVec::new(), + insert: false, + action: amp::OpType::Set("test2".into()), + } + ] + } + ); +} + +#[test] +fn test_delete_non_existent_root_key() { + let mut frontend = Frontend::new(); + let path = Path::root().key("missing"); + let cr = frontend + .change::<_, _, InvalidChangeRequest>(None, |doc| { + doc.add_change(LocalChange::delete(path.clone()))?; + Ok(()) + }) + .unwrap_err(); + + assert_eq!(cr, InvalidChangeRequest::NoSuchPathError { path }) +} + +#[test] +fn test_delete_non_existent_map_key() { + let mut frontend = Frontend::new(); + let path = Path::root().key("a").key("missing"); + let cr = frontend + .change::<_, _, InvalidChangeRequest>(None, |doc| { + doc.add_change(LocalChange::set( + Path::root().key("a"), + Value::Map(HashMap::new()), + ))?; + doc.add_change(LocalChange::delete(path.clone()))?; + Ok(()) + }) + .unwrap_err(); + + assert_eq!(cr, InvalidChangeRequest::NoSuchPathError { path }) +} diff --git a/automerge-frontend/tests/test_wasm.rs b/automerge-frontend/tests/test_wasm.rs new file mode 100644 index 00000000..73bc6f73 --- /dev/null +++ b/automerge-frontend/tests/test_wasm.rs @@ -0,0 +1,15 @@ +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 new file mode 100644 index 00000000..f1546730 --- /dev/null +++ b/automerge-protocol/Cargo.toml @@ -0,0 +1,28 @@ +[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 } +smol_str = { version = "0.1.18", features = ["serde"] } + +[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 new file mode 100644 index 00000000..0d207f02 --- /dev/null +++ b/automerge-protocol/src/error.rs @@ -0,0 +1,40 @@ +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 new file mode 100644 index 00000000..28abb683 --- /dev/null +++ b/automerge-protocol/src/lib.rs @@ -0,0 +1,834 @@ +pub mod error; +mod serde_impls; +mod utility_impls; +use std::{ + collections::HashMap, + convert::{TryFrom, TryInto}, + fmt, + iter::FromIterator, + num::NonZeroU32, + slice::Iter, +}; + +use error::InvalidScalarValues; +use serde::{ + de::{Error, MapAccess, Unexpected}, + Deserialize, Serialize, +}; +use smol_str::SmolStr; +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(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(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, + } + } +} + +#[derive(Serialize, PartialEq, Debug, Clone, EnumDiscriminants)] +#[strum_discriminants(name(ScalarValueKind))] +#[serde(untagged)] +pub enum ScalarValue { + Bytes(Vec), + Str(SmolStr), + 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(Debug, Default, Clone, 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) -> impl Iterator { + 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::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/rust/automerge/src/legacy/serde_impls/actor_id.rs b/automerge-protocol/src/serde_impls/actor_id.rs similarity index 100% rename from rust/automerge/src/legacy/serde_impls/actor_id.rs rename to automerge-protocol/src/serde_impls/actor_id.rs diff --git a/rust/automerge/src/legacy/serde_impls/change_hash.rs b/automerge-protocol/src/serde_impls/change_hash.rs similarity index 93% rename from rust/automerge/src/legacy/serde_impls/change_hash.rs rename to automerge-protocol/src/serde_impls/change_hash.rs index 04b876af..4d637909 100644 --- a/rust/automerge/src/legacy/serde_impls/change_hash.rs +++ b/automerge-protocol/src/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/cursor_diff.rs b/automerge-protocol/src/serde_impls/cursor_diff.rs new file mode 100644 index 00000000..d0154d4f --- /dev/null +++ b/automerge-protocol/src/serde_impls/cursor_diff.rs @@ -0,0 +1,17 @@ +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 new file mode 100644 index 00000000..c0e5fc8f --- /dev/null +++ b/automerge-protocol/src/serde_impls/diff.rs @@ -0,0 +1,417 @@ +use std::{collections::HashMap, fmt}; + +use serde::{ + de, + de::{Error, MapAccess}, + ser::SerializeStruct, + Deserialize, Deserializer, Serialize, Serializer, +}; +use smol_str::SmolStr; + +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".into() => 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/rust/automerge/src/legacy/serde_impls/element_id.rs b/automerge-protocol/src/serde_impls/element_id.rs similarity index 95% rename from rust/automerge/src/legacy/serde_impls/element_id.rs rename to automerge-protocol/src/serde_impls/element_id.rs index abc1f964..dd354b6f 100644 --- a/rust/automerge/src/legacy/serde_impls/element_id.rs +++ b/automerge-protocol/src/serde_impls/element_id.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::legacy::ElementId; +use crate::ElementId; impl Serialize for ElementId { fn serialize(&self, serializer: S) -> Result diff --git a/rust/automerge/src/legacy/serde_impls/mod.rs b/automerge-protocol/src/serde_impls/mod.rs similarity index 89% rename from rust/automerge/src/legacy/serde_impls/mod.rs rename to automerge-protocol/src/serde_impls/mod.rs index 11915020..5b92b372 100644 --- a/rust/automerge/src/legacy/serde_impls/mod.rs +++ b/automerge-protocol/src/serde_impls/mod.rs @@ -5,11 +5,15 @@ use serde::{ mod actor_id; mod change_hash; +mod cursor_diff; +mod diff; mod element_id; +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/multi_element_insert.rs b/automerge-protocol/src/serde_impls/multi_element_insert.rs new file mode 100644 index 00000000..ce2148ee --- /dev/null +++ b/automerge-protocol/src/serde_impls/multi_element_insert.rs @@ -0,0 +1,84 @@ +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/rust/automerge/src/legacy/serde_impls/object_id.rs b/automerge-protocol/src/serde_impls/object_id.rs similarity index 96% rename from rust/automerge/src/legacy/serde_impls/object_id.rs rename to automerge-protocol/src/serde_impls/object_id.rs index ba989eb7..6b29cdb8 100644 --- a/rust/automerge/src/legacy/serde_impls/object_id.rs +++ b/automerge-protocol/src/serde_impls/object_id.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::legacy::{ObjectId, OpId}; +use crate::{ObjectId, OpId}; impl Serialize for ObjectId { fn serialize(&self, serializer: S) -> Result diff --git a/rust/automerge/src/legacy/serde_impls/op.rs b/automerge-protocol/src/serde_impls/op.rs similarity index 72% rename from rust/automerge/src/legacy/serde_impls/op.rs rename to automerge-protocol/src/serde_impls/op.rs index a3719fd6..c8f42769 100644 --- a/rust/automerge/src/legacy/serde_impls/op.rs +++ b/automerge-protocol/src/serde_impls/op.rs @@ -1,3 +1,5 @@ +use std::num::NonZeroU32; + use serde::{ de::{Error, MapAccess, Unexpected, Visitor}, ser::SerializeStruct, @@ -5,7 +7,9 @@ use serde::{ }; use super::read_field; -use crate::legacy::{DataType, Key, ObjType, ObjectId, Op, OpId, OpType, ScalarValue, SortedVec}; +use crate::{ + DataType, Key, ObjType, ObjectId, Op, OpId, OpType, ScalarValue, ScalarValues, SortedVec, +}; impl Serialize for Op { fn serialize(&self, serializer: S) -> Result @@ -19,7 +23,8 @@ impl Serialize for Op { } let numerical_datatype = match &self.action { - OpType::Put(value) => value.as_numerical_datatype(), + OpType::Set(value) => value.as_numerical_datatype(), + OpType::MultiSet(values) => values.as_numerical_datatype(), _ => None, }; @@ -47,10 +52,11 @@ impl Serialize for Op { op.serialize_field("datatype", &datatype)?; } match &self.action { - 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)?, - _ => {} + 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(..) => {} } op.serialize_field("pred", &self.pred)?; op.end() @@ -63,7 +69,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(crate) enum RawOpType { +pub enum RawOpType { MakeMap, MakeTable, MakeList, @@ -104,8 +110,6 @@ 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)?; @@ -132,7 +136,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") } @@ -147,9 +151,9 @@ impl<'de> Deserialize<'de> for Op { 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)?, @@ -172,9 +176,9 @@ impl<'de> Deserialize<'de> for Op { "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)), } } @@ -188,37 +192,52 @@ 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::Delete, + RawOpType::Del => OpType::Del( + multi_op + .map(|i| NonZeroU32::new(i).unwrap()) + .unwrap_or_else(|| NonZeroU32::new(1).unwrap()), + ), RawOpType::Set => { - 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(), - ) - })? + if let Some(values) = values { + let values = + ScalarValues::from_values_and_datatype::(values, datatype)?; + OpType::MultiSet(values) } else { - value - .ok_or_else(|| Error::missing_field("value"))? - .unwrap_or(ScalarValue::Null) - }; - OpType::Put(value) + 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) + } } RawOpType::Inc => match value.flatten() { - 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::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::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")) } @@ -228,6 +247,10 @@ 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")), }?, }; @@ -246,13 +269,13 @@ impl<'de> Deserialize<'de> for Op { #[cfg(test)] mod tests { - use std::str::FromStr; + use std::{convert::TryInto, 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, @@ -270,7 +293,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Uint(123)), + action: OpType::Set(ScalarValue::Uint(123)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -288,7 +311,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Int(-123)), + action: OpType::Set(ScalarValue::Int(-123)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -306,7 +329,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::F64(-123.0)), + action: OpType::Set(ScalarValue::F64(-123.0)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -323,7 +346,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Str("somestring".into())), + action: OpType::Set(ScalarValue::Str("somestring".into())), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -340,7 +363,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::F64(1.23)), + action: OpType::Set(ScalarValue::F64(1.23)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -357,7 +380,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Boolean(true)), + action: OpType::Set(ScalarValue::Boolean(true)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -386,7 +409,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Counter(123.into())), + action: OpType::Set(ScalarValue::Counter(123)), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -434,7 +457,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -451,7 +474,7 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -478,13 +501,92 @@ mod tests { "pred": [] }), expected: Ok(Op { - action: OpType::Put(ScalarValue::Null), + action: OpType::Set(ScalarValue::Null), obj: ObjectId::Root, key: "somekey".into(), insert: false, 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: SortedVec::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: SortedVec::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() { @@ -525,7 +627,7 @@ mod tests { "pred": [] })) .unwrap(); - assert_eq!(root.obj, amp::ObjectId::Root); + assert_eq!(root.obj, crate::ObjectId::Root); let opid: Op = serde_json::from_value(serde_json::json!({ "action": "inc", @@ -537,7 +639,7 @@ mod tests { .unwrap(); assert_eq!( opid.obj, - amp::ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap() + crate::ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap() ); let invalid: Result = serde_json::from_value(serde_json::json!({ @@ -556,7 +658,7 @@ mod tests { #[test] fn test_serialize_key() { let map_key = Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, @@ -567,7 +669,7 @@ mod tests { assert_eq!(json.as_object().unwrap().get("key"), Some(&expected)); let elemid_key = Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::Root, key: OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716") .unwrap() @@ -584,35 +686,35 @@ mod tests { fn test_round_trips() { let testcases = vec![ Op { - action: OpType::Put(ScalarValue::Uint(12)), + action: OpType::Set(ScalarValue::Uint(12)), obj: ObjectId::Root, key: "somekey".into(), insert: false, pred: SortedVec::new(), }, Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: "somekey".into(), insert: false, pred: SortedVec::new(), }, Op { - action: OpType::Put(ScalarValue::Uint(12)), + action: OpType::Set(ScalarValue::Uint(12)), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: "somekey".into(), insert: false, pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()].into(), }, Op { - action: OpType::Increment(12), + action: OpType::Inc(12), obj: ObjectId::Root, key: "somekey".into(), insert: false, pred: SortedVec::new(), }, Op { - action: OpType::Put("seomthing".into()), + action: OpType::Set("seomthing".into()), obj: ObjectId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap(), key: OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716") .unwrap() @@ -620,6 +722,19 @@ mod tests { insert: false, pred: vec![OpId::from_str("1@7ef48769b04d47e9a88e98a134d62716").unwrap()].into(), }, + 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: SortedVec::new(), + }, ]; for (testcase_num, testcase) in testcases.iter().enumerate() { #[allow(clippy::expect_fun_call)] diff --git a/rust/automerge/src/legacy/serde_impls/op_type.rs b/automerge-protocol/src/serde_impls/op_type.rs similarity index 80% rename from rust/automerge/src/legacy/serde_impls/op_type.rs rename to automerge-protocol/src/serde_impls/op_type.rs index b054bad7..3f38f339 100644 --- a/rust/automerge/src/legacy/serde_impls/op_type.rs +++ b/automerge-protocol/src/serde_impls/op_type.rs @@ -15,9 +15,10 @@ impl Serialize for OpType { OpType::Make(ObjType::Table) => RawOpType::MakeTable, OpType::Make(ObjType::List) => RawOpType::MakeList, OpType::Make(ObjType::Text) => RawOpType::MakeText, - OpType::Delete => RawOpType::Del, - OpType::Increment(_) => RawOpType::Inc, - OpType::Put(_) => RawOpType::Set, + OpType::Del(..) => RawOpType::Del, + OpType::Inc(_) => RawOpType::Inc, + OpType::Set(_) => RawOpType::Set, + OpType::MultiSet(..) => RawOpType::Set, }; raw_type.serialize(serializer) } diff --git a/rust/automerge/src/legacy/serde_impls/opid.rs b/automerge-protocol/src/serde_impls/opid.rs similarity index 96% rename from rust/automerge/src/legacy/serde_impls/opid.rs rename to automerge-protocol/src/serde_impls/opid.rs index 06792cd4..e071b8a7 100644 --- a/rust/automerge/src/legacy/serde_impls/opid.rs +++ b/automerge-protocol/src/serde_impls/opid.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use crate::legacy::OpId; +use crate::OpId; impl<'de> Deserialize<'de> for OpId { fn deserialize(deserializer: D) -> Result diff --git a/automerge-protocol/src/serde_impls/root_diff.rs b/automerge-protocol/src/serde_impls/root_diff.rs new file mode 100644 index 00000000..febd04c7 --- /dev/null +++ b/automerge-protocol/src/serde_impls/root_diff.rs @@ -0,0 +1,103 @@ +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/rust/automerge/src/legacy/serde_impls/scalar_value.rs b/automerge-protocol/src/serde_impls/scalar_value.rs similarity index 96% rename from rust/automerge/src/legacy/serde_impls/scalar_value.rs rename to automerge-protocol/src/serde_impls/scalar_value.rs index b2a559ea..c04d359a 100644 --- a/rust/automerge/src/legacy/serde_impls/scalar_value.rs +++ b/automerge-protocol/src/serde_impls/scalar_value.rs @@ -1,7 +1,7 @@ use serde::{de, Deserialize, Deserializer}; use smol_str::SmolStr; -use crate::types::ScalarValue; +use crate::ScalarValue; impl<'de> Deserialize<'de> for ScalarValue { fn deserialize(deserializer: D) -> Result @@ -12,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") } diff --git a/automerge-protocol/src/utility_impls/actor_id.rs b/automerge-protocol/src/utility_impls/actor_id.rs new file mode 100644 index 00000000..cafb5544 --- /dev/null +++ b/automerge-protocol/src/utility_impls/actor_id.rs @@ -0,0 +1,39 @@ +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 new file mode 100644 index 00000000..8cae3bd9 --- /dev/null +++ b/automerge-protocol/src/utility_impls/change_hash.rs @@ -0,0 +1,17 @@ +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 new file mode 100644 index 00000000..7c6ba6b9 --- /dev/null +++ b/automerge-protocol/src/utility_impls/diff.rs @@ -0,0 +1,19 @@ +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/rust/automerge/src/legacy/utility_impls/element_id.rs b/automerge-protocol/src/utility_impls/element_id.rs similarity index 91% rename from rust/automerge/src/legacy/utility_impls/element_id.rs rename to automerge-protocol/src/utility_impls/element_id.rs index 623234f5..512c1794 100644 --- a/rust/automerge/src/legacy/utility_impls/element_id.rs +++ b/automerge-protocol/src/utility_impls/element_id.rs @@ -1,10 +1,10 @@ use std::{ cmp::{Ordering, PartialOrd}, + convert::TryFrom, str::FromStr, }; -use crate::error::InvalidElementId; -use crate::legacy::{ElementId, OpId}; +use crate::{error::InvalidElementId, 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), + ElementId::Id(id) => write!(f, "{}", id.to_string()), } } } diff --git a/rust/automerge/src/legacy/utility_impls/key.rs b/automerge-protocol/src/utility_impls/key.rs similarity index 95% rename from rust/automerge/src/legacy/utility_impls/key.rs rename to automerge-protocol/src/utility_impls/key.rs index ab9769f1..0b7cdd80 100644 --- a/rust/automerge/src/legacy/utility_impls/key.rs +++ b/automerge-protocol/src/utility_impls/key.rs @@ -2,7 +2,7 @@ use std::cmp::{Ordering, PartialOrd}; use smol_str::SmolStr; -use crate::legacy::{ElementId, Key, OpId}; +use crate::{ElementId, Key, OpId}; impl PartialOrd for Key { fn partial_cmp(&self, other: &Self) -> Option { diff --git a/automerge-protocol/src/utility_impls/mod.rs b/automerge-protocol/src/utility_impls/mod.rs new file mode 100644 index 00000000..837432ca --- /dev/null +++ b/automerge-protocol/src/utility_impls/mod.rs @@ -0,0 +1,10 @@ +mod actor_id; +mod change_hash; +mod diff; +mod element_id; +mod key; +mod object_id; +mod opid; +mod scalar_value; +mod scalar_value_kind; +mod scalar_values; diff --git a/rust/automerge/src/legacy/utility_impls/object_id.rs b/automerge-protocol/src/utility_impls/object_id.rs similarity index 95% rename from rust/automerge/src/legacy/utility_impls/object_id.rs rename to automerge-protocol/src/utility_impls/object_id.rs index c4f20f8c..27bebcf4 100644 --- a/rust/automerge/src/legacy/utility_impls/object_id.rs +++ b/automerge-protocol/src/utility_impls/object_id.rs @@ -1,11 +1,11 @@ use std::{ cmp::{Ordering, PartialOrd}, + convert::TryFrom, fmt, str::FromStr, }; -use crate::error::InvalidObjectId; -use crate::legacy::{ObjectId, OpId}; +use crate::{error::InvalidObjectId, ObjectId, OpId}; impl PartialOrd for ObjectId { fn partial_cmp(&self, other: &Self) -> Option { diff --git a/rust/automerge/src/legacy/utility_impls/opid.rs b/automerge-protocol/src/utility_impls/opid.rs similarity index 95% rename from rust/automerge/src/legacy/utility_impls/opid.rs rename to automerge-protocol/src/utility_impls/opid.rs index aabdc67c..f3ee9c43 100644 --- a/rust/automerge/src/legacy/utility_impls/opid.rs +++ b/automerge-protocol/src/utility_impls/opid.rs @@ -1,11 +1,11 @@ use core::fmt; use std::{ cmp::{Ordering, PartialOrd}, + convert::TryFrom, str::FromStr, }; -use crate::error::InvalidOpId; -use crate::legacy::{ActorId, OpId}; +use crate::{error::InvalidOpId, ActorId, OpId}; impl Ord for OpId { fn cmp(&self, other: &Self) -> Ordering { diff --git a/automerge-protocol/src/utility_impls/scalar_value.rs b/automerge-protocol/src/utility_impls/scalar_value.rs new file mode 100644 index 00000000..94733993 --- /dev/null +++ b/automerge-protocol/src/utility_impls/scalar_value.rs @@ -0,0 +1,58 @@ +use std::fmt; + +use smol_str::SmolStr; + +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(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::Cursor(elemid) => write!(f, "Cursor: {}", elemid), + } + } +} diff --git a/automerge-protocol/src/utility_impls/scalar_value_kind.rs b/automerge-protocol/src/utility_impls/scalar_value_kind.rs new file mode 100644 index 00000000..03e91c07 --- /dev/null +++ b/automerge-protocol/src/utility_impls/scalar_value_kind.rs @@ -0,0 +1,9 @@ +use std::fmt; + +use crate::ScalarValueKind; + +impl fmt::Display for ScalarValueKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} diff --git a/automerge-protocol/src/utility_impls/scalar_values.rs b/automerge-protocol/src/utility_impls/scalar_values.rs new file mode 100644 index 00000000..bb5e4143 --- /dev/null +++ b/automerge-protocol/src/utility_impls/scalar_values.rs @@ -0,0 +1,30 @@ +use std::convert::TryFrom; + +use crate::{InvalidScalarValues, ScalarValue, ScalarValueKind, ScalarValues}; + +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, + } + } +} diff --git a/automerge-protocol/tests/serde_round_trip.rs b/automerge-protocol/tests/serde_round_trip.rs new file mode 100644 index 00000000..154a1337 --- /dev/null +++ b/automerge-protocol/tests/serde_round_trip.rs @@ -0,0 +1,61 @@ +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 new file mode 100644 index 00000000..0a784da0 --- /dev/null +++ b/automerge-protocol/tests/serde_round_trip_proptest.proptest-regressions @@ -0,0 +1,8 @@ +# 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 new file mode 100644 index 00000000..33de52b8 --- /dev/null +++ b/automerge-protocol/tests/serde_round_trip_proptest.rs @@ -0,0 +1,128 @@ +extern crate automerge_protocol as amp; +use std::num::NonZeroU32; + +use amp::SortedVec; +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(|s| amp::ScalarValue::Str(s.into())), + 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(|s| amp::Key::Map(s.into())), + 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: SortedVec::from(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 new file mode 100644 index 00000000..2f7896d1 --- /dev/null +++ b/automerge/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/automerge/Cargo.toml b/automerge/Cargo.toml new file mode 100644 index 00000000..9957cad0 --- /dev/null +++ b/automerge/Cargo.toml @@ -0,0 +1,49 @@ +[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" +smol_str = "0.1.17" +anyhow = "1.0.41" + +[[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 new file mode 100644 index 00000000..93e0d98f --- /dev/null +++ b/automerge/benches/crdt_benchmarks.rs @@ -0,0 +1,195 @@ +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 smol_str::SmolStr; +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: SmolStr = thread_rng() + .sample_iter(&rand::distributions::Alphanumeric) + .take(6000) + .map(char::from) + .collect(); + let chars: Vec<_> = random_string.graphemes(true).map(|s| s.into()).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 new file mode 100644 index 00000000..4f1c425b --- /dev/null +++ b/automerge/benches/save_load.rs @@ -0,0 +1,242 @@ +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".into())), + ))?; + 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}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Str("".into())), + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + 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}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Null), + Value::Primitive(Primitive::Uint(0)), + Value::Primitive(Primitive::Str("".into())), + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + ]), + ), + ( + "\u{0}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + 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("".into())), + 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("".into())), + ]), + ), + ( + "".into(), + 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("".into())), + 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}".into(), + Value::Table( + vec![("".into(), 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.as_bytes()); + 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.as_bytes()); + 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 new file mode 100644 index 00000000..4eb36697 --- /dev/null +++ b/automerge/benches/sync.rs @@ -0,0 +1,120 @@ +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/examples/cards.rs b/automerge/examples/cards.rs new file mode 100644 index 00000000..76e4feb4 --- /dev/null +++ b/automerge/examples/cards.rs @@ -0,0 +1,126 @@ +use anyhow::Result; +use automerge::{ + Backend, Change, Frontend, InvalidChangeRequest, LocalChange, MutableDocument, Path, Primitive, + Value, +}; +use serde_json::json; + +#[derive(Default)] +pub struct Automerge { + backend: Backend, + frontend: Frontend, + stream: Vec, +} + +impl Automerge { + pub fn apply_changes(&mut self, changes: &[Change]) -> Result<()> { + for change in changes { + let patch = self.backend.apply_changes(vec![change.clone()])?; + self.frontend.apply_patch(patch)?; + } + Ok(()) + } + + pub fn change(&mut self, msg: &'static str, cb: F) -> Result + where + F: FnOnce(&mut dyn MutableDocument) -> Result, + { + let (output, change) = self.frontend.change(Some(msg.to_string()), cb)?; + if let Some(change) = change { + let (patch, change) = self.backend.apply_local_change(change)?; + self.frontend.apply_patch(patch)?; + self.stream.push(change); + } + Ok(output) + } + + pub fn state(&mut self) -> &Value { + self.frontend.state() + } + + pub fn changes(&self) -> &[Change] { + &self.stream + } +} + +fn main() -> Result<()> { + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .init(); + + // Let's say doc1 is the application state on device 1. + // Further down we'll simulate a second device. + // We initialize the document to initially contain an empty list of cards. + let mut doc1 = Automerge::default(); + doc1.change("Initial state", |doc| { + doc.add_change(LocalChange::set( + Path::root(), + Value::from_json(&json!({ "cards": [] })), + )) + })?; + + // To change it, you need to call `change` with a callback in which you can + // mutate the state. You can also include a human-readable description of the + // change, like a commit message, which is stored in the change history (see below). + + doc1.change("Add card", |doc| { + doc.add_change(LocalChange::insert( + Path::root().key("cards").index(0), + Value::from_json(&json!({ "title": "Rewrite everything in Clojure", "done": false })), + )) + })?; + + // Now the state of doc1 is: + // { cards: [ { title: 'Rewrite everything in Clojure', done: false } ] } + + doc1.change("Add another card", |doc| { + doc.add_change(LocalChange::insert( + Path::root().key("cards").index(0), + Value::from_json(&json!({ "title": "Rewrite everything in Haskell", "done": false })), + )) + })?; + + // { cards: + // [ { title: 'Rewrite everything in Haskell', done: false }, + // { title: 'Rewrite everything in Clojure', done: false } ] } + + // Now let's simulate another device, whose application state is doc2. We + // initialise it separately, and merge doc1 into it. After merging, doc2 has + // a copy of all the cards in doc1. + + let mut doc2 = Automerge::default(); + + doc2.apply_changes(doc1.changes())?; + + // Now make a change on device 1: + doc1.change("Mark card as done", |doc| { + doc.add_change(LocalChange::set( + Path::root().key("cards").index(0).key("done"), + Value::Primitive(Primitive::Boolean(true)), + )) + })?; + + // { cards: + // [ { title: 'Rewrite everything in Haskell', done: true }, + // { title: 'Rewrite everything in Clojure', done: false } ] } + + // And, unbeknownst to device 1, also make a change on device 2: + doc2.change("Delete card", |doc| { + doc.add_change(LocalChange::delete(Path::root().key("cards").index(1))) + })?; + + // { cards: [ { title: 'Rewrite everything in Haskell', done: false } ] } + + // Now comes the moment of truth. Let's merge the changes from device 2 back + // into device 1. You can also do the merge the other way round, and you'll get + // the same result. The merged result remembers that 'Rewrite everything in + // Haskell' was set to true, and that 'Rewrite everything in Clojure' was + // deleted: + + doc1.apply_changes(doc2.changes())?; + + // { cards: [ { title: 'Rewrite everything in Haskell', done: true } ] } + println!("{}", doc1.state().to_json()); + + Ok(()) +} diff --git a/automerge/src/lib.rs b/automerge/src/lib.rs new file mode 100644 index 00000000..958aabb4 --- /dev/null +++ b/automerge/src/lib.rs @@ -0,0 +1,5 @@ +pub use automerge_backend::{Backend, Change}; +pub use automerge_frontend::{ + Frontend, InvalidChangeRequest, LocalChange, MutableDocument, 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 new file mode 100644 index 00000000..a167b66b --- /dev/null +++ b/automerge/tests/frontend_backend_roundtrip.rs @@ -0,0 +1,246 @@ +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".into(), + 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".into(), + 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".into()), + pred: vec![].into(), + insert: false, + }, + Op { + action: OpType::Make(ObjType::List), + obj: actor.op_id_at(1).into(), + key: Key::Seq(ElementId::Head), + pred: vec![].into(), + 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![].into(), + 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![].into(), + 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".into() => 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.as_bytes()); + + 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".into() => Value::Map( + hashmap! {}, + ), + "a".into() => Value::Map( + hashmap!{ + "b".into() => 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".into() => 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); + } + } +} + +#[test] +fn test_delete_key_in_map() { + let new = Value::Map(hashmap! {"".into()=> Value::Map(hashmap!{})}); + let old = Value::Map( + hashmap! {"".into()=> Value::Map(hashmap!{"".into()=> Value::Primitive(Primitive::Null)})}, + ); + let change = LocalChange::delete(Path::root().key("").key("")); + + let mut b = automerge::Backend::new(); + // new with old value + let (mut f, c) = automerge::Frontend::new_with_initial_state(old).unwrap(); + let (p, _) = b.apply_local_change(c).unwrap(); + f.apply_patch(p).unwrap(); + + // apply changes to reach new value + let ((), c) = f + .change::<_, _, InvalidChangeRequest>(None, |d| { + d.add_change(change.clone())?; + Ok(()) + }) + .unwrap(); + if let Some(c) = c { + let (p, _) = b.apply_local_change(c).unwrap(); + f.apply_patch(p).unwrap(); + } + + let val = f.get_value(&Path::root()).unwrap(); + assert_eq!(val, new); +} diff --git a/automerge/tests/save_load.rs b/automerge/tests/save_load.rs new file mode 100644 index 00000000..cfd7572d --- /dev/null +++ b/automerge/tests/save_load.rs @@ -0,0 +1,694 @@ +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}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Str("".into())), + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + 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}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Null), + Value::Primitive(Primitive::Uint(0)), + Value::Primitive(Primitive::Str("".into())), + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + ]), + ), + ( + "\u{0}".into(), + Value::Sequence(vec![ + Value::Primitive(Primitive::Counter(0)), + Value::Primitive(Primitive::Str("".into())), + 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("".into())), + 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("".into())), + ]), + ), + ( + "".into(), + 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("".into())), + 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}".into(), + Value::Table( + vec![("".into(), 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.as_bytes()); + 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.as_bytes()); + 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".into()), + pred: vec![].into(), + insert: false, + }, + Op { + action: OpType::Set(ScalarValue::Null), + obj: ObjectId::Id(OpId(1, actor_id.clone())), + key: Key::Seq(ElementId::Head), + pred: vec![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + insert: true, + }, + Op { + action: OpType::Make(ObjType::List), + obj: ObjectId::Root, + key: Key::Map("\u{0}".into()), + pred: vec![].into(), + insert: false, + }, + Op { + action: OpType::Set(ScalarValue::Null), + obj: ObjectId::Id(OpId(17, actor_id.clone())), + key: Key::Seq(ElementId::Head), + pred: vec![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + 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![].into(), + insert: true, + }, + Op { + action: OpType::Make(ObjType::Map), + obj: ObjectId::Root, + key: Key::Map("\u{1}".into()), + pred: vec![].into(), + insert: false, + }, + Op { + action: OpType::Set(ScalarValue::Null), + obj: ObjectId::Id(OpId(67, actor_id.clone())), + key: Key::Map("a".into()), + pred: vec![].into(), + insert: false, + }, + ], + actor_id, + hash: None, + seq: 1, + start_op: 1, + time: 0, + message: Some("".into()), + 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 new file mode 100644 index 00000000..400e81f6 --- /dev/null +++ b/automerge/tests/text_grapheme_clusters.rs @@ -0,0 +1,16 @@ +use smol_str::SmolStr; +use unicode_segmentation::UnicodeSegmentation; + +#[test] +fn create_frontend_with_grapheme_clusters() { + let mut hm = std::collections::HashMap::new(); + hm.insert( + SmolStr::default(), + automerge::Value::Text("\u{80}".graphemes(true).map(|s| s.into()).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 a052776b..401f1fd6 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "flake-utils": { "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "lastModified": 1619345332, + "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", "owner": "numtide", "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", "type": "github" }, "original": { @@ -17,11 +17,11 @@ }, "flake-utils_2": { "locked": { - "lastModified": 1659877975, - "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", "owner": "numtide", "repo": "flake-utils", - "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", "type": "github" }, "original": { @@ -32,11 +32,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1669542132, - "narHash": "sha256-DRlg++NJAwPh8io3ExBJdNW7Djs3plVI5jgYQ+iXAZQ=", + "lastModified": 1620340338, + "narHash": "sha256-Op/4K0+Z9Sp5jtFH0s/zMM4H7VFZxrekcAmjQ6JpQ4w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a115bb9bd56831941be3776c8a94005867f316a7", + "rev": "63586475587d7e0e078291ad4b49b6f6a6885100", "type": "github" }, "original": { @@ -48,16 +48,15 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1665296151, - "narHash": "sha256-uOB0oxqxN9K7XGF1hcnY+PQnlQJ+3bP2vCn/+Ru/bbc=", - "owner": "NixOS", + "lastModified": 1617325113, + "narHash": "sha256-GksR0nvGxfZ79T91UUtWjjccxazv6Yh/MvEJ82v1Xmw=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "14ccaaedd95a488dd7ae142757884d8e125b3363", + "rev": "54c1e44240d8a527a8f4892608c4bce5440c3ecb", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -75,11 +74,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1669775522, - "narHash": "sha256-6xxGArBqssX38DdHpDoPcPvB/e79uXyQBwpBcaO/BwY=", + "lastModified": 1620355527, + "narHash": "sha256-mUTnUODiAtxH83gbv7uuvCbqZ/BNkYYk/wa3MkwrskE=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "3158e47f6b85a288d12948aeb9a048e0ed4434d6", + "rev": "d8efe70dc561c4bea0b7bf440d36ce98c497e054", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 37835738..5f22c33e 100644 --- a/flake.nix +++ b/flake.nix @@ -3,67 +3,102 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; + flake-utils = { + url = "github:numtide/flake-utils"; + inputs.nixpkgs.follows = "nixpkgs"; + }; 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.overlays.default]; - inherit system; - }; - rust = pkgs.rust-bin.stable.latest.default; - in { - formatter = pkgs.alejandra; + (system: + let + pkgs = import nixpkgs { + overlays = [ rust-overlay.overlay ]; + inherit system; + }; + lib = pkgs.lib; + rust = pkgs.rust-bin.nightly.latest.rust; + cargoNix = pkgs.callPackage ./Cargo.nix { + inherit pkgs; + release = true; + }; + debugCargoNix = pkgs.callPackage ./Cargo.nix { + inherit pkgs; + release = false; + }; + in + { + packages = lib.attrsets.mapAttrs + (name: value: value.build) + cargoNix.workspaceMembers; - packages = { - deadnix = pkgs.runCommand "deadnix" {} '' - ${pkgs.deadnix}/bin/deadnix --fail ${./.} - mkdir $out - ''; - }; + defaultPackage = self.packages.${system}.automerge; - checks = { - inherit (self.packages.${system}) deadnix; - }; + apps = { + automerge-cli = flake-utils.lib.mkApp { + name = "automerge"; + drv = self.packages.${system}.automerge-cli; + }; + }; - 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 + checks = lib.attrsets.mapAttrs + (name: value: value.build.override { + runTests = true; + }) + debugCargoNix.workspaceMembers // + { + automerge-cli = + cargoNix.workspaceMembers.automerge-cli.build.override { + # FIXME(jeffas): issues with 'environment variable + # `CARGO_BIN_EXE_automerge` not defined' + runTests = false; + }; - nodejs - yarn - deno + automerge-fuzz = + cargoNix.workspaceMembers.automerge-fuzz.build.override { + # FIXME(jeffas): tests shouldn't be run directly but invoked + # with cargo fuzz, I thought test=false in the Cargo.toml for + # this would have some effect but clearly not. Ideally fix this + # in the Cargo.toml or in crate2nix. + runTests = false; + }; - # c deps - cmake - cmocka - doxygen + format = pkgs.runCommand "format" + { + src = ./.; + buildInputs = [ rust ]; + } '' + mkdir $out + cd $src + cargo fmt -- --check + ''; + }; - rnix-lsp - nixpkgs-fmt - ]; - }; - }); + 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 + + nodejs + yarn + + rnix-lsp + nixpkgs-fmt + ]; + }; + }); } diff --git a/rust/automerge/fuzz/.gitignore b/fuzz/.gitignore similarity index 56% rename from rust/automerge/fuzz/.gitignore rename to fuzz/.gitignore index 2eb15f8e..572e03bd 100644 --- a/rust/automerge/fuzz/.gitignore +++ b/fuzz/.gitignore @@ -1,3 +1,4 @@ + target corpus -coverage +artifacts diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 00000000..3955ae21 --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,20 @@ + +[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 new file mode 100644 index 00000000..d0f436f9 --- /dev/null +++ b/fuzz/src/backend_load.rs @@ -0,0 +1,6 @@ +#![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 deleted file mode 100644 index 56e1c82d..00000000 Binary files a/img/brandmark.png and /dev/null differ diff --git a/img/brandmark.svg b/img/brandmark.svg deleted file mode 100644 index 1347dfac..00000000 --- a/img/brandmark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico deleted file mode 100644 index 90486824..00000000 Binary files a/img/favicon.ico and /dev/null differ diff --git a/img/lockup.png b/img/lockup.png deleted file mode 100644 index 94e63a48..00000000 Binary files a/img/lockup.png and /dev/null differ diff --git a/img/lockup.svg b/img/lockup.svg deleted file mode 100644 index 34297ecf..00000000 --- a/img/lockup.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/img/sign.png b/img/sign.png deleted file mode 100644 index 772396cb..00000000 Binary files a/img/sign.png and /dev/null differ diff --git a/img/sign.svg b/img/sign.svg deleted file mode 100644 index df31316e..00000000 --- a/img/sign.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/javascript/.denoifyrc.json b/javascript/.denoifyrc.json deleted file mode 100644 index 9453a31f..00000000 --- a/javascript/.denoifyrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "replacer": "scripts/denoify-replacer.mjs" -} diff --git a/javascript/.eslintignore b/javascript/.eslintignore deleted file mode 100644 index 4d6880d3..00000000 --- a/javascript/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -examples diff --git a/javascript/.eslintrc.cjs b/javascript/.eslintrc.cjs deleted file mode 100644 index 88776271..00000000 --- a/javascript/.eslintrc.cjs +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index f98d9db2..00000000 --- a/javascript/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/node_modules -/yarn.lock -dist -docs/ -.vim -deno_dist/ diff --git a/javascript/.prettierignore b/javascript/.prettierignore deleted file mode 100644 index 6ab2f796..00000000 --- a/javascript/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -e2e/verdacciodb -dist -docs -deno_dist diff --git a/javascript/.prettierrc b/javascript/.prettierrc deleted file mode 100644 index 18b9c97f..00000000 --- a/javascript/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "semi": false, - "arrowParens": "avoid" -} diff --git a/javascript/HACKING.md b/javascript/HACKING.md deleted file mode 100644 index b7e92eef..00000000 --- a/javascript/HACKING.md +++ /dev/null @@ -1,39 +0,0 @@ -## 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 deleted file mode 100644 index 63b21502..00000000 --- a/javascript/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index af8306ac..00000000 --- a/javascript/README.md +++ /dev/null @@ -1,109 +0,0 @@ -## 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 deleted file mode 100644 index 0b135067..00000000 --- a/javascript/config/cjs.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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 deleted file mode 100644 index 7c1df687..00000000 --- a/javascript/config/declonly.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "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 deleted file mode 100644 index ecf3ce36..00000000 --- a/javascript/config/mjs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "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 deleted file mode 100644 index fc0a4dad..00000000 --- a/javascript/deno-tests/deno.ts +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 3021843a..00000000 --- a/javascript/e2e/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -verdacciodb/ -htpasswd diff --git a/javascript/e2e/README.md b/javascript/e2e/README.md deleted file mode 100644 index 9dcee471..00000000 --- a/javascript/e2e/README.md +++ /dev/null @@ -1,70 +0,0 @@ -#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 deleted file mode 100644 index fb0b1599..00000000 --- a/javascript/e2e/index.ts +++ /dev/null @@ -1,534 +0,0 @@ -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 deleted file mode 100644 index 7bb80852..00000000 --- a/javascript/e2e/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "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 deleted file mode 100644 index a2109873..00000000 --- a/javascript/e2e/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "types": ["node"] - }, - "module": "nodenext" -} diff --git a/javascript/e2e/verdaccio.yaml b/javascript/e2e/verdaccio.yaml deleted file mode 100644 index 865f5f05..00000000 --- a/javascript/e2e/verdaccio.yaml +++ /dev/null @@ -1,25 +0,0 @@ -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 deleted file mode 100644 index 46e2abf2..00000000 --- a/javascript/e2e/yarn.lock +++ /dev/null @@ -1,2130 +0,0 @@ -# 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 deleted file mode 100644 index c2658d7d..00000000 --- a/javascript/examples/create-react-app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/javascript/examples/create-react-app/README.md b/javascript/examples/create-react-app/README.md deleted file mode 100644 index baa135ac..00000000 --- a/javascript/examples/create-react-app/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# 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 deleted file mode 100644 index 489dad8f..00000000 --- a/javascript/examples/create-react-app/craco.config.js +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 273d277b..00000000 --- a/javascript/examples/create-react-app/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "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 deleted file mode 100644 index a11777cc..00000000 Binary files a/javascript/examples/create-react-app/public/favicon.ico and /dev/null differ diff --git a/javascript/examples/create-react-app/public/index.html b/javascript/examples/create-react-app/public/index.html deleted file mode 100644 index aa069f27..00000000 --- a/javascript/examples/create-react-app/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - React App - - - -
- - - diff --git a/javascript/examples/create-react-app/public/logo192.png b/javascript/examples/create-react-app/public/logo192.png deleted file mode 100644 index fc44b0a3..00000000 Binary files a/javascript/examples/create-react-app/public/logo192.png and /dev/null differ diff --git a/javascript/examples/create-react-app/public/logo512.png b/javascript/examples/create-react-app/public/logo512.png deleted file mode 100644 index a4e47a65..00000000 Binary files a/javascript/examples/create-react-app/public/logo512.png and /dev/null differ diff --git a/javascript/examples/create-react-app/public/manifest.json b/javascript/examples/create-react-app/public/manifest.json deleted file mode 100644 index 080d6c77..00000000 --- a/javascript/examples/create-react-app/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "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 deleted file mode 100644 index e9e57dc4..00000000 --- a/javascript/examples/create-react-app/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# 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 deleted file mode 100644 index 74b5e053..00000000 --- a/javascript/examples/create-react-app/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.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 deleted file mode 100644 index 7cfe997b..00000000 --- a/javascript/examples/create-react-app/src/App.js +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index ea796120..00000000 --- a/javascript/examples/create-react-app/src/App.test.js +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 4a1df4db..00000000 --- a/javascript/examples/create-react-app/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 58c21edc..00000000 --- a/javascript/examples/create-react-app/src/index.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 9dfc1c05..00000000 --- a/javascript/examples/create-react-app/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ 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 deleted file mode 100644 index eee308db..00000000 --- a/javascript/examples/create-react-app/src/reportWebVitals.js +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 6a0fd123..00000000 --- a/javascript/examples/create-react-app/src/setupTests.js +++ /dev/null @@ -1,5 +0,0 @@ -// 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 deleted file mode 100644 index ec83af3b..00000000 --- a/javascript/examples/create-react-app/yarn.lock +++ /dev/null @@ -1,9120 +0,0 @@ -# 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 deleted file mode 100644 index 23d67fc1..00000000 --- a/javascript/examples/vite/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -yarn.lock diff --git a/javascript/examples/vite/README.md b/javascript/examples/vite/README.md deleted file mode 100644 index c84594f5..00000000 --- a/javascript/examples/vite/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# 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 deleted file mode 100644 index f86e483c..00000000 --- a/javascript/examples/vite/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + TS - - -
- - - diff --git a/javascript/examples/vite/main.ts b/javascript/examples/vite/main.ts deleted file mode 100644 index 0ba18f48..00000000 --- a/javascript/examples/vite/main.ts +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index d9a13681..00000000 --- a/javascript/examples/vite/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "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 deleted file mode 100644 index e7b8dfb1..00000000 --- a/javascript/examples/vite/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/javascript/examples/vite/src/counter.ts b/javascript/examples/vite/src/counter.ts deleted file mode 100644 index 3e516b6d..00000000 --- a/javascript/examples/vite/src/counter.ts +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 8dc8f92c..00000000 --- a/javascript/examples/vite/src/main.ts +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index ac37d84b..00000000 --- a/javascript/examples/vite/src/style.css +++ /dev/null @@ -1,97 +0,0 @@ -: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 deleted file mode 100644 index d91c910c..00000000 --- a/javascript/examples/vite/src/typescript.svg +++ /dev/null @@ -1 +0,0 @@ - \ 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 deleted file mode 100644 index 11f02fe2..00000000 --- a/javascript/examples/vite/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/javascript/examples/vite/tsconfig.json b/javascript/examples/vite/tsconfig.json deleted file mode 100644 index fbd02253..00000000 --- a/javascript/examples/vite/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "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 deleted file mode 100644 index d80981bf..00000000 --- a/javascript/examples/vite/vite.config.js +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index da9d3ff5..00000000 --- a/javascript/examples/webpack/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -yarn.lock -node_modules -public/*.wasm -public/main.js -dist diff --git a/javascript/examples/webpack/README.md b/javascript/examples/webpack/README.md deleted file mode 100644 index 7563f27d..00000000 --- a/javascript/examples/webpack/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# 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 deleted file mode 100644 index 2b63e7cc..00000000 --- a/javascript/examples/webpack/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "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 deleted file mode 100644 index 5003393a..00000000 --- a/javascript/examples/webpack/public/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Simple Webpack for automerge-wasm - - - - - diff --git a/javascript/examples/webpack/src/index.js b/javascript/examples/webpack/src/index.js deleted file mode 100644 index 3a9086e4..00000000 --- a/javascript/examples/webpack/src/index.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 51fd5127..00000000 --- a/javascript/examples/webpack/webpack.config.js +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index 79309907..00000000 --- a/javascript/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "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 deleted file mode 100644 index 28544102..00000000 --- a/javascript/scripts/deno-prefixer.mjs +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index e183ba0d..00000000 --- a/javascript/scripts/denoify-replacer.mjs +++ /dev/null @@ -1,42 +0,0 @@ -// @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 deleted file mode 100644 index 52af23e1..00000000 --- a/javascript/src/conflicts.ts +++ /dev/null @@ -1,100 +0,0 @@ -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 deleted file mode 100644 index 7b714772..00000000 --- a/javascript/src/constants.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 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 deleted file mode 100644 index 88adb840..00000000 --- a/javascript/src/counter.ts +++ /dev/null @@ -1,107 +0,0 @@ -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 deleted file mode 100644 index bf84c68d..00000000 --- a/javascript/src/index.ts +++ /dev/null @@ -1,242 +0,0 @@ -/** - * # 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 deleted file mode 100644 index f3da49b1..00000000 --- a/javascript/src/internal_state.ts +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index f44f3a32..00000000 --- a/javascript/src/low_level.ts +++ /dev/null @@ -1,58 +0,0 @@ -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 deleted file mode 100644 index 7ad95998..00000000 --- a/javascript/src/numbers.ts +++ /dev/null @@ -1,54 +0,0 @@ -// 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 deleted file mode 100644 index 54a8dd71..00000000 --- a/javascript/src/proxies.ts +++ /dev/null @@ -1,1005 +0,0 @@ -/* 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 deleted file mode 100644 index 7fc02084..00000000 --- a/javascript/src/raw_string.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class RawString { - val: string - constructor(val: string) { - this.val = val - } -} diff --git a/javascript/src/stable.ts b/javascript/src/stable.ts deleted file mode 100644 index e83b127f..00000000 --- a/javascript/src/stable.ts +++ /dev/null @@ -1,944 +0,0 @@ -/** @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 deleted file mode 100644 index b01bd7db..00000000 --- a/javascript/src/text.ts +++ /dev/null @@ -1,224 +0,0 @@ -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 deleted file mode 100644 index beb5cf70..00000000 --- a/javascript/src/types.ts +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index 7c73afb9..00000000 --- a/javascript/src/unstable.ts +++ /dev/null @@ -1,294 +0,0 @@ -/** - * # 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 deleted file mode 100644 index 071e2cc4..00000000 --- a/javascript/src/unstable_types.ts +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index 04c9b93d..00000000 --- a/javascript/src/uuid.deno.ts +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 421ddf9d..00000000 --- a/javascript/src/uuid.ts +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index e34484c4..00000000 --- a/javascript/test/basic_test.ts +++ /dev/null @@ -1,488 +0,0 @@ -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 deleted file mode 100644 index 84fa4c39..00000000 --- a/javascript/test/extra_api_tests.ts +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index df76e558..00000000 --- a/javascript/test/helpers.ts +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 6a9b5874..00000000 --- a/javascript/test/legacy/columnar.js +++ /dev/null @@ -1,1315 +0,0 @@ -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 deleted file mode 100644 index 7668e982..00000000 --- a/javascript/test/legacy/common.js +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100644 index f7650faf..00000000 --- a/javascript/test/legacy/encoding.js +++ /dev/null @@ -1,1321 +0,0 @@ -/** - * 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 deleted file mode 100644 index 233c4292..00000000 --- a/javascript/test/legacy/sync.js +++ /dev/null @@ -1,566 +0,0 @@ -/** - * 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 deleted file mode 100644 index 8c2e552e..00000000 --- a/javascript/test/legacy_tests.ts +++ /dev/null @@ -1,1874 +0,0 @@ -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 deleted file mode 100644 index dc57f338..00000000 --- a/javascript/test/stable_unstable_interop.ts +++ /dev/null @@ -1,99 +0,0 @@ -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 deleted file mode 100644 index 5724985c..00000000 --- a/javascript/test/sync_test.ts +++ /dev/null @@ -1,1064 +0,0 @@ -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 deleted file mode 100644 index 518c7d2b..00000000 --- a/javascript/test/text_test.ts +++ /dev/null @@ -1,111 +0,0 @@ -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 deleted file mode 100644 index b111530f..00000000 --- a/javascript/test/text_v1.ts +++ /dev/null @@ -1,281 +0,0 @@ -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 deleted file mode 100644 index f6a0bde4..00000000 --- a/javascript/test/uuid_test.ts +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 628aea8e..00000000 --- a/javascript/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "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 deleted file mode 100644 index f7bb7a71..00000000 --- a/javascript/tslint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "tslint:recommended" -} diff --git a/perf/Cargo.toml b/perf/Cargo.toml new file mode 100644 index 00000000..4e89ecac --- /dev/null +++ b/perf/Cargo.toml @@ -0,0 +1,17 @@ +[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" +smol_str = "0.1.17" diff --git a/rust/edit-trace/edits.json b/perf/edits.json similarity index 100% rename from rust/edit-trace/edits.json rename to perf/edits.json diff --git a/perf/final.json b/perf/final.json new file mode 100644 index 00000000..5748ef19 --- /dev/null +++ b/perf/final.json @@ -0,0 +1 @@ +"\\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 new file mode 100644 index 00000000..bccbcbcb --- /dev/null +++ b/perf/src/main.rs @@ -0,0 +1,362 @@ +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; +use smol_str::SmolStr; + +fn f() { + let mut doc = Frontend::new(); + let mut backend = Backend::new(); + + let start = Instant::now(); + + let m = hashmap! { + "a".into() => + Value::Map(hashmap!{ + "b".into()=> + Value::Map( + hashmap! { + "abc".into() => Value::Primitive(Primitive::Str("hello world".into())) + }, + ), + "d".into() => 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: SmolStr = 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(SmolStr::new(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 deleted file mode 100644 index f859e0a3..00000000 --- a/rust/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/target -/.direnv -perf.* -/Cargo.lock -build/ -.vim/* diff --git a/rust/Cargo.toml b/rust/Cargo.toml deleted file mode 100644 index 5d29fc9f..00000000 --- a/rust/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[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 deleted file mode 100644 index dbf16c21..00000000 --- a/rust/automerge-c/.clang-format +++ /dev/null @@ -1,250 +0,0 @@ ---- -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 deleted file mode 100644 index 14d74973..00000000 --- a/rust/automerge-c/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 0c35eebd..00000000 --- a/rust/automerge-c/CMakeLists.txt +++ /dev/null @@ -1,305 +0,0 @@ -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 deleted file mode 100644 index 95a3a29c..00000000 --- a/rust/automerge-c/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[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 deleted file mode 100644 index 1fbca3df..00000000 --- a/rust/automerge-c/README.md +++ /dev/null @@ -1,207 +0,0 @@ -# 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 deleted file mode 100644 index bf12a105..00000000 --- a/rust/automerge-c/build.rs +++ /dev/null @@ -1,21 +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) { - // \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 deleted file mode 100644 index 21eaaadd..00000000 --- a/rust/automerge-c/cbindgen.toml +++ /dev/null @@ -1,48 +0,0 @@ -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 deleted file mode 100644 index 781e2fef..00000000 --- a/rust/automerge-c/cmake/Cargo.toml.in +++ /dev/null @@ -1,22 +0,0 @@ -[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 deleted file mode 100644 index fd39aee6..00000000 --- a/rust/automerge-c/cmake/automerge-c-config.cmake.in +++ /dev/null @@ -1,99 +0,0 @@ -@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 deleted file mode 100644 index 5122b75c..00000000 --- a/rust/automerge-c/cmake/cbindgen.toml.in +++ /dev/null @@ -1,48 +0,0 @@ -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 deleted file mode 100644 index 40482cb9..00000000 --- a/rust/automerge-c/cmake/config.h.in +++ /dev/null @@ -1,35 +0,0 @@ -#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 deleted file mode 100644 index 77080e8d..00000000 --- a/rust/automerge-c/cmake/enum-string-functions-gen.cmake +++ /dev/null @@ -1,183 +0,0 @@ -# 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 deleted file mode 100644 index 09005bc2..00000000 --- a/rust/automerge-c/cmake/file-regex-replace.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# 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 deleted file mode 100644 index 2c196755..00000000 --- a/rust/automerge-c/cmake/file-touch.cmake +++ /dev/null @@ -1,35 +0,0 @@ -# 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 deleted file mode 100644 index 1d94c872..00000000 --- a/rust/automerge-c/docs/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -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 deleted file mode 100644 index 56e1c82d..00000000 Binary files a/rust/automerge-c/docs/img/brandmark.png and /dev/null differ diff --git a/rust/automerge-c/examples/CMakeLists.txt b/rust/automerge-c/examples/CMakeLists.txt deleted file mode 100644 index f080237b..00000000 --- a/rust/automerge-c/examples/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index 17e69412..00000000 --- a/rust/automerge-c/examples/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# 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 deleted file mode 100644 index ab6769ef..00000000 --- a/rust/automerge-c/examples/quickstart.c +++ /dev/null @@ -1,129 +0,0 @@ -#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 deleted file mode 100644 index ab8a2f93..00000000 --- a/rust/automerge-c/include/automerge-c/utils/result.h +++ /dev/null @@ -1,30 +0,0 @@ -#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 deleted file mode 100644 index a8e9fd08..00000000 --- a/rust/automerge-c/include/automerge-c/utils/stack.h +++ /dev/null @@ -1,130 +0,0 @@ -#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 deleted file mode 100644 index 6f9f1edb..00000000 --- a/rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +++ /dev/null @@ -1,53 +0,0 @@ -#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 deleted file mode 100644 index 4d61c2e9..00000000 --- a/rust/automerge-c/include/automerge-c/utils/string.h +++ /dev/null @@ -1,29 +0,0 @@ -#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 deleted file mode 100644 index 5a28959e..00000000 --- a/rust/automerge-c/src/actor_id.rs +++ /dev/null @@ -1,193 +0,0 @@ -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 deleted file mode 100644 index 5855cfc7..00000000 --- a/rust/automerge-c/src/byte_span.rs +++ /dev/null @@ -1,223 +0,0 @@ -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 deleted file mode 100644 index 8529ed94..00000000 --- a/rust/automerge-c/src/change.rs +++ /dev/null @@ -1,356 +0,0 @@ -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 deleted file mode 100644 index 82f52bf7..00000000 --- a/rust/automerge-c/src/doc.rs +++ /dev/null @@ -1,915 +0,0 @@ -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 deleted file mode 100644 index c4503322..00000000 --- a/rust/automerge-c/src/doc/list.rs +++ /dev/null @@ -1,636 +0,0 @@ -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 deleted file mode 100644 index b2f7db02..00000000 --- a/rust/automerge-c/src/doc/map.rs +++ /dev/null @@ -1,552 +0,0 @@ -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 deleted file mode 100644 index ce465b84..00000000 --- a/rust/automerge-c/src/doc/utils.rs +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index f1ea153b..00000000 --- a/rust/automerge-c/src/index.rs +++ /dev/null @@ -1,84 +0,0 @@ -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 deleted file mode 100644 index 94735464..00000000 --- a/rust/automerge-c/src/item.rs +++ /dev/null @@ -1,1963 +0,0 @@ -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 deleted file mode 100644 index 361078b3..00000000 --- a/rust/automerge-c/src/items.rs +++ /dev/null @@ -1,401 +0,0 @@ -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 deleted file mode 100644 index 1ee1a85d..00000000 --- a/rust/automerge-c/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index 3d52286c..00000000 --- a/rust/automerge-c/src/obj.rs +++ /dev/null @@ -1,216 +0,0 @@ -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 deleted file mode 100644 index 2975f38b..00000000 --- a/rust/automerge-c/src/result.rs +++ /dev/null @@ -1,660 +0,0 @@ -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 deleted file mode 100644 index fe0332a1..00000000 --- a/rust/automerge-c/src/sync.rs +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 37d2031f..00000000 --- a/rust/automerge-c/src/sync/have.rs +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100644 index bdb1db34..00000000 --- a/rust/automerge-c/src/sync/message.rs +++ /dev/null @@ -1,166 +0,0 @@ -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 deleted file mode 100644 index 1d85ed98..00000000 --- a/rust/automerge-c/src/sync/state.rs +++ /dev/null @@ -1,262 +0,0 @@ -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 deleted file mode 100644 index f922ca31..00000000 --- a/rust/automerge-c/src/utils/result.c +++ /dev/null @@ -1,33 +0,0 @@ -#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 deleted file mode 100644 index 2cad7c5c..00000000 --- a/rust/automerge-c/src/utils/stack.c +++ /dev/null @@ -1,106 +0,0 @@ -#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 deleted file mode 100644 index f1e988d8..00000000 --- a/rust/automerge-c/src/utils/stack_callback_data.c +++ /dev/null @@ -1,9 +0,0 @@ -#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 deleted file mode 100644 index a0d1ebe3..00000000 --- a/rust/automerge-c/src/utils/string.c +++ /dev/null @@ -1,46 +0,0 @@ -#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 deleted file mode 100644 index 1759f140..00000000 --- a/rust/automerge-c/test/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 918d6213..00000000 --- a/rust/automerge-c/test/actor_id_tests.c +++ /dev/null @@ -1,140 +0,0 @@ -#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 deleted file mode 100644 index 53325a99..00000000 --- a/rust/automerge-c/test/base_state.c +++ /dev/null @@ -1,17 +0,0 @@ -#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 deleted file mode 100644 index 3c4ff01b..00000000 --- a/rust/automerge-c/test/base_state.h +++ /dev/null @@ -1,39 +0,0 @@ -#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 deleted file mode 100644 index 0b1c86a1..00000000 --- a/rust/automerge-c/test/byte_span_tests.c +++ /dev/null @@ -1,119 +0,0 @@ -#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 deleted file mode 100644 index 37c57fb1..00000000 --- a/rust/automerge-c/test/cmocka_utils.c +++ /dev/null @@ -1,88 +0,0 @@ -#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 deleted file mode 100644 index b6611bcc..00000000 --- a/rust/automerge-c/test/cmocka_utils.h +++ /dev/null @@ -1,42 +0,0 @@ -#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 deleted file mode 100644 index 3cbece50..00000000 --- a/rust/automerge-c/test/doc_state.c +++ /dev/null @@ -1,27 +0,0 @@ -#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 deleted file mode 100644 index 525a49fa..00000000 --- a/rust/automerge-c/test/doc_state.h +++ /dev/null @@ -1,17 +0,0 @@ -#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 deleted file mode 100644 index c1d21928..00000000 --- a/rust/automerge-c/test/doc_tests.c +++ /dev/null @@ -1,231 +0,0 @@ -#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 deleted file mode 100644 index 11131e43..00000000 --- a/rust/automerge-c/test/enum_string_tests.c +++ /dev/null @@ -1,148 +0,0 @@ -#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 deleted file mode 100644 index a30b0556..00000000 --- a/rust/automerge-c/test/item_tests.c +++ /dev/null @@ -1,94 +0,0 @@ -#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 deleted file mode 100644 index 723dd038..00000000 --- a/rust/automerge-c/test/list_tests.c +++ /dev/null @@ -1,515 +0,0 @@ -#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 deleted file mode 100644 index 3a546eb5..00000000 --- a/rust/automerge-c/test/macro_utils.c +++ /dev/null @@ -1,38 +0,0 @@ -#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 deleted file mode 100644 index e4c2c5b9..00000000 --- a/rust/automerge-c/test/macro_utils.h +++ /dev/null @@ -1,23 +0,0 @@ -#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 deleted file mode 100644 index 2996c9b3..00000000 --- a/rust/automerge-c/test/main.c +++ /dev/null @@ -1,28 +0,0 @@ -#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 deleted file mode 100644 index 2ee2e69a..00000000 --- a/rust/automerge-c/test/map_tests.c +++ /dev/null @@ -1,1582 +0,0 @@ -#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 deleted file mode 100644 index b83ff132..00000000 --- a/rust/automerge-c/test/ported_wasm/basic_tests.c +++ /dev/null @@ -1,1642 +0,0 @@ -#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 deleted file mode 100644 index 440ed899..00000000 --- a/rust/automerge-c/test/ported_wasm/suite.c +++ /dev/null @@ -1,15 +0,0 @@ -#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 deleted file mode 100644 index 099f8dbf..00000000 --- a/rust/automerge-c/test/ported_wasm/sync_tests.c +++ /dev/null @@ -1,1282 +0,0 @@ -#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 deleted file mode 100644 index 2937217a..00000000 --- a/rust/automerge-c/test/str_utils.c +++ /dev/null @@ -1,15 +0,0 @@ -#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 deleted file mode 100644 index 14a4af73..00000000 --- a/rust/automerge-c/test/str_utils.h +++ /dev/null @@ -1,17 +0,0 @@ -#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 deleted file mode 100644 index eb5a316c..00000000 --- a/rust/automerge-cli/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target diff --git a/rust/automerge-cli/Cargo.toml b/rust/automerge-cli/Cargo.toml deleted file mode 100644 index 430090a6..00000000 --- a/rust/automerge-cli/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[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/rust/automerge-cli/src/color_json.rs b/rust/automerge-cli/src/color_json.rs deleted file mode 100644 index 9514da22..00000000 --- a/rust/automerge-cli/src/color_json.rs +++ /dev/null @@ -1,370 +0,0 @@ -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/rust/automerge-cli/src/examine_sync.rs b/rust/automerge-cli/src/examine_sync.rs deleted file mode 100644 index c0d5df97..00000000 --- a/rust/automerge-cli/src/examine_sync.rs +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index 45f39101..00000000 --- a/rust/automerge-cli/src/export.rs +++ /dev/null @@ -1,163 +0,0 @@ -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 deleted file mode 100644 index a9556071..00000000 --- a/rust/automerge-cli/src/import.rs +++ /dev/null @@ -1,108 +0,0 @@ -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 deleted file mode 100644 index 8f3f816d..00000000 --- a/rust/automerge-cli/src/main.rs +++ /dev/null @@ -1,240 +0,0 @@ -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 deleted file mode 100644 index 936af246..00000000 --- a/rust/automerge-cli/src/merge.rs +++ /dev/null @@ -1,58 +0,0 @@ -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/rust/automerge-test/Cargo.toml b/rust/automerge-test/Cargo.toml deleted file mode 100644 index 9290d7ac..00000000 --- a/rust/automerge-test/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[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 deleted file mode 100644 index 2cadabbb..00000000 --- a/rust/automerge-test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `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 deleted file mode 100644 index a1d4ea89..00000000 --- a/rust/automerge-test/src/lib.rs +++ /dev/null @@ -1,496 +0,0 @@ -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 deleted file mode 100644 index 7cd573e3..00000000 --- a/rust/automerge-wasm/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -web -nodejs -examples diff --git a/rust/automerge-wasm/.eslintrc.cjs b/rust/automerge-wasm/.eslintrc.cjs deleted file mode 100644 index 80e08d55..00000000 --- a/rust/automerge-wasm/.eslintrc.cjs +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 77c11e08..00000000 --- a/rust/automerge-wasm/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/node_modules -/bundler -/nodejs -/deno -Cargo.lock -yarn.lock diff --git a/rust/automerge-wasm/LICENSE b/rust/automerge-wasm/LICENSE deleted file mode 100644 index 63b21502..00000000 --- a/rust/automerge-wasm/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 20256313..00000000 --- a/rust/automerge-wasm/README.md +++ /dev/null @@ -1,469 +0,0 @@ -## 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 deleted file mode 100644 index b346435a..00000000 --- a/rust/automerge-wasm/deno-tests/deno.ts +++ /dev/null @@ -1,8 +0,0 @@ -// @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 deleted file mode 100644 index d5f19d89..00000000 --- a/rust/automerge-wasm/examples/cra/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -package-lock.json diff --git a/rust/automerge-wasm/examples/cra/README.md b/rust/automerge-wasm/examples/cra/README.md deleted file mode 100644 index 0b1e4ca5..00000000 --- a/rust/automerge-wasm/examples/cra/README.md +++ /dev/null @@ -1,22 +0,0 @@ -## 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 deleted file mode 100644 index 0b465b94..00000000 --- a/rust/automerge-wasm/examples/cra/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "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 deleted file mode 100644 index a11777cc..00000000 Binary files a/rust/automerge-wasm/examples/cra/public/favicon.ico and /dev/null differ diff --git a/rust/automerge-wasm/examples/cra/public/index.html b/rust/automerge-wasm/examples/cra/public/index.html deleted file mode 100644 index aa069f27..00000000 --- a/rust/automerge-wasm/examples/cra/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - React App - - - -
- - - diff --git a/rust/automerge-wasm/examples/cra/public/logo192.png b/rust/automerge-wasm/examples/cra/public/logo192.png deleted file mode 100644 index fc44b0a3..00000000 Binary files a/rust/automerge-wasm/examples/cra/public/logo192.png and /dev/null differ diff --git a/rust/automerge-wasm/examples/cra/public/logo512.png b/rust/automerge-wasm/examples/cra/public/logo512.png deleted file mode 100644 index a4e47a65..00000000 Binary files a/rust/automerge-wasm/examples/cra/public/logo512.png and /dev/null differ diff --git a/rust/automerge-wasm/examples/cra/public/manifest.json b/rust/automerge-wasm/examples/cra/public/manifest.json deleted file mode 100644 index 080d6c77..00000000 --- a/rust/automerge-wasm/examples/cra/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "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 deleted file mode 100644 index e9e57dc4..00000000 --- a/rust/automerge-wasm/examples/cra/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# 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 deleted file mode 100644 index 74b5e053..00000000 --- a/rust/automerge-wasm/examples/cra/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.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 deleted file mode 100644 index 2a68616d..00000000 --- a/rust/automerge-wasm/examples/cra/src/App.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 177f50bd..00000000 --- a/rust/automerge-wasm/examples/cra/src/App.tsx +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100644 index ec2585e8..00000000 --- a/rust/automerge-wasm/examples/cra/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index d84251d4..00000000 --- a/rust/automerge-wasm/examples/cra/src/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 9dfc1c05..00000000 --- a/rust/automerge-wasm/examples/cra/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ 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 deleted file mode 100644 index 6431bc5f..00000000 --- a/rust/automerge-wasm/examples/cra/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts b/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts deleted file mode 100644 index 49a2a16e..00000000 --- a/rust/automerge-wasm/examples/cra/src/reportWebVitals.ts +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 8f2609b7..00000000 --- a/rust/automerge-wasm/examples/cra/src/setupTests.ts +++ /dev/null @@ -1,5 +0,0 @@ -// 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 deleted file mode 100644 index a273b0cf..00000000 --- a/rust/automerge-wasm/examples/cra/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "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 deleted file mode 100644 index da9d3ff5..00000000 --- a/rust/automerge-wasm/examples/webpack/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 4abcd1c6..00000000 --- a/rust/automerge-wasm/examples/webpack/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "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 deleted file mode 100644 index 5003393a..00000000 --- a/rust/automerge-wasm/examples/webpack/public/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - 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 deleted file mode 100644 index bab417f5..00000000 --- a/rust/automerge-wasm/examples/webpack/src/index.js +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 3ab0e798..00000000 --- a/rust/automerge-wasm/examples/webpack/webpack.config.js +++ /dev/null @@ -1,35 +0,0 @@ -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 deleted file mode 100644 index be12e4c1..00000000 --- a/rust/automerge-wasm/index.d.ts +++ /dev/null @@ -1,238 +0,0 @@ -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 deleted file mode 100644 index 80b39fd4..00000000 --- a/rust/automerge-wasm/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "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 deleted file mode 100644 index 1546ff10..00000000 --- a/rust/automerge-wasm/src/interop.rs +++ /dev/null @@ -1,1478 +0,0 @@ -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 deleted file mode 100644 index 09072ca7..00000000 --- a/rust/automerge-wasm/src/lib.rs +++ /dev/null @@ -1,1155 +0,0 @@ -#![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 deleted file mode 100644 index 2351c762..00000000 --- a/rust/automerge-wasm/src/observer.rs +++ /dev/null @@ -1,518 +0,0 @@ -#![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 deleted file mode 100644 index 91b183a2..00000000 --- a/rust/automerge-wasm/src/sequence_tree.rs +++ /dev/null @@ -1,617 +0,0 @@ -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 deleted file mode 100644 index c4fd4a86..00000000 --- a/rust/automerge-wasm/src/sync.rs +++ /dev/null @@ -1,65 +0,0 @@ -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 deleted file mode 100644 index 643e2881..00000000 --- a/rust/automerge-wasm/src/value.rs +++ /dev/null @@ -1,161 +0,0 @@ -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 deleted file mode 100644 index 453b4c26..00000000 --- a/rust/automerge-wasm/test/apply.ts +++ /dev/null @@ -1,229 +0,0 @@ - -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 deleted file mode 100644 index 8d266f5b..00000000 --- a/rust/automerge-wasm/test/helpers/columnar.js +++ /dev/null @@ -1,1415 +0,0 @@ -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 deleted file mode 100644 index b41cadc8..00000000 --- a/rust/automerge-wasm/test/helpers/common.js +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index 92b62df6..00000000 --- a/rust/automerge-wasm/test/helpers/encoding.js +++ /dev/null @@ -1,1209 +0,0 @@ -/** - * 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 deleted file mode 100644 index ce265ef4..00000000 --- a/rust/automerge-wasm/test/helpers/sync.js +++ /dev/null @@ -1,481 +0,0 @@ -/** - * 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 deleted file mode 100644 index e5823556..00000000 --- a/rust/automerge-wasm/test/readme.ts +++ /dev/null @@ -1,244 +0,0 @@ -/* 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 deleted file mode 100644 index bb4f71e3..00000000 --- a/rust/automerge-wasm/test/test.ts +++ /dev/null @@ -1,2173 +0,0 @@ -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 deleted file mode 100644 index 339eab93..00000000 --- a/rust/automerge-wasm/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "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 deleted file mode 100644 index 96ef6c0b..00000000 --- a/rust/automerge/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -Cargo.lock diff --git a/rust/automerge/Cargo.toml b/rust/automerge/Cargo.toml deleted file mode 100644 index 0c10cc2b..00000000 --- a/rust/automerge/Cargo.toml +++ /dev/null @@ -1,62 +0,0 @@ -[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 deleted file mode 100644 index 97dbe4f8..00000000 --- a/rust/automerge/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index fcf3bfa3..00000000 --- a/rust/automerge/benches/map.rs +++ /dev/null @@ -1,268 +0,0 @@ -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 deleted file mode 100644 index 008ae159..00000000 --- a/rust/automerge/benches/range.rs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 13965792..00000000 --- a/rust/automerge/benches/sync.rs +++ /dev/null @@ -1,95 +0,0 @@ -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 deleted file mode 100644 index c9a9630e..00000000 --- a/rust/automerge/examples/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Automerge examples - -## Quickstart - -```shell -cargo run --example quickstart -``` diff --git a/rust/automerge/examples/quickstart.rs b/rust/automerge/examples/quickstart.rs deleted file mode 100644 index fcb23d5e..00000000 --- a/rust/automerge/examples/quickstart.rs +++ /dev/null @@ -1,57 +0,0 @@ -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 deleted file mode 100644 index 4cd8f4ea..00000000 --- a/rust/automerge/examples/watch.rs +++ /dev/null @@ -1,106 +0,0 @@ -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/rust/automerge/fuzz/Cargo.toml b/rust/automerge/fuzz/Cargo.toml deleted file mode 100644 index 3461e9f3..00000000 --- a/rust/automerge/fuzz/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[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 deleted file mode 100644 index 0dea2624..00000000 --- a/rust/automerge/fuzz/fuzz_targets/load.rs +++ /dev/null @@ -1,37 +0,0 @@ -#![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 deleted file mode 100644 index ae28596e..00000000 --- a/rust/automerge/src/autocommit.rs +++ /dev/null @@ -1,672 +0,0 @@ -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 deleted file mode 100644 index 0dd82253..00000000 --- a/rust/automerge/src/automerge.rs +++ /dev/null @@ -1,1452 +0,0 @@ -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 deleted file mode 100644 index 3f7f4afc..00000000 --- a/rust/automerge/src/automerge/current_state.rs +++ /dev/null @@ -1,915 +0,0 @@ -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 deleted file mode 100644 index 3511c4ed..00000000 --- a/rust/automerge/src/automerge/tests.rs +++ /dev/null @@ -1,1554 +0,0 @@ -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 deleted file mode 100644 index ccfc6ae6..00000000 --- a/rust/automerge/src/autoserde.rs +++ /dev/null @@ -1,124 +0,0 @@ -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 deleted file mode 100644 index be467a84..00000000 --- a/rust/automerge/src/change.rs +++ /dev/null @@ -1,402 +0,0 @@ -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 deleted file mode 100644 index 01d269d8..00000000 --- a/rust/automerge/src/change_graph.rs +++ /dev/null @@ -1,344 +0,0 @@ -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 deleted file mode 100644 index 64d00fcf..00000000 --- a/rust/automerge/src/clock.rs +++ /dev/null @@ -1,161 +0,0 @@ -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 deleted file mode 100644 index bb727626..00000000 --- a/rust/automerge/src/columnar.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! 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 deleted file mode 100644 index 5762ed14..00000000 --- a/rust/automerge/src/columnar/column_range.rs +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 3cefaf0d..00000000 --- a/rust/automerge/src/columnar/column_range/boolean.rs +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index 9dae43b8..00000000 --- a/rust/automerge/src/columnar/column_range/delta.rs +++ /dev/null @@ -1,152 +0,0 @@ -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 deleted file mode 100644 index 1956acd1..00000000 --- a/rust/automerge/src/columnar/column_range/deps.rs +++ /dev/null @@ -1,123 +0,0 @@ -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 deleted file mode 100644 index 03a0e362..00000000 --- a/rust/automerge/src/columnar/column_range/generic.rs +++ /dev/null @@ -1,91 +0,0 @@ -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 deleted file mode 100644 index b1392428..00000000 --- a/rust/automerge/src/columnar/column_range/generic/group.rs +++ /dev/null @@ -1,138 +0,0 @@ -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 deleted file mode 100644 index 9eb3c177..00000000 --- a/rust/automerge/src/columnar/column_range/generic/simple.rs +++ /dev/null @@ -1,76 +0,0 @@ -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 deleted file mode 100644 index 70ea8e1e..00000000 --- a/rust/automerge/src/columnar/column_range/key.rs +++ /dev/null @@ -1,258 +0,0 @@ -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 deleted file mode 100644 index d282563e..00000000 --- a/rust/automerge/src/columnar/column_range/obj_id.rs +++ /dev/null @@ -1,202 +0,0 @@ -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 deleted file mode 100644 index d2cdce79..00000000 --- a/rust/automerge/src/columnar/column_range/opid.rs +++ /dev/null @@ -1,210 +0,0 @@ -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 deleted file mode 100644 index 6a9c8a38..00000000 --- a/rust/automerge/src/columnar/column_range/opid_list.rs +++ /dev/null @@ -1,329 +0,0 @@ -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 deleted file mode 100644 index 3520a89a..00000000 --- a/rust/automerge/src/columnar/column_range/raw.rs +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index c500a7f4..00000000 --- a/rust/automerge/src/columnar/column_range/rle.rs +++ /dev/null @@ -1,216 +0,0 @@ -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 deleted file mode 100644 index 03a5aa60..00000000 --- a/rust/automerge/src/columnar/column_range/value.rs +++ /dev/null @@ -1,547 +0,0 @@ -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 deleted file mode 100644 index c9435448..00000000 --- a/rust/automerge/src/columnar/encoding.rs +++ /dev/null @@ -1,65 +0,0 @@ -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 deleted file mode 100644 index 26cb1838..00000000 --- a/rust/automerge/src/columnar/encoding/boolean.rs +++ /dev/null @@ -1,131 +0,0 @@ -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 deleted file mode 100644 index 089556b6..00000000 --- a/rust/automerge/src/columnar/encoding/col_error.rs +++ /dev/null @@ -1,88 +0,0 @@ -#[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 deleted file mode 100644 index 8e3237fb..00000000 --- a/rust/automerge/src/columnar/encoding/column_decoder.rs +++ /dev/null @@ -1,157 +0,0 @@ -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 deleted file mode 100644 index 26425f15..00000000 --- a/rust/automerge/src/columnar/encoding/decodable_impls.rs +++ /dev/null @@ -1,175 +0,0 @@ -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 deleted file mode 100644 index 6234875b..00000000 --- a/rust/automerge/src/columnar/encoding/delta.rs +++ /dev/null @@ -1,95 +0,0 @@ -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 deleted file mode 100644 index a1b5d8ce..00000000 --- a/rust/automerge/src/columnar/encoding/encodable_impls.rs +++ /dev/null @@ -1,200 +0,0 @@ -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 deleted file mode 100644 index cbb82c31..00000000 --- a/rust/automerge/src/columnar/encoding/leb128.rs +++ /dev/null @@ -1,82 +0,0 @@ -/// 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 deleted file mode 100644 index 30f1169d..00000000 --- a/rust/automerge/src/columnar/encoding/properties.rs +++ /dev/null @@ -1,178 +0,0 @@ -//! 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 deleted file mode 100644 index b86443e5..00000000 --- a/rust/automerge/src/columnar/encoding/raw.rs +++ /dev/null @@ -1,97 +0,0 @@ -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 deleted file mode 100644 index 26a16899..00000000 --- a/rust/automerge/src/columnar/encoding/rle.rs +++ /dev/null @@ -1,239 +0,0 @@ -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 deleted file mode 100644 index 54d5f478..00000000 --- a/rust/automerge/src/columnar/splice_error.rs +++ /dev/null @@ -1,47 +0,0 @@ -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 deleted file mode 100644 index a99f96a1..00000000 --- a/rust/automerge/src/convert.rs +++ /dev/null @@ -1,102 +0,0 @@ -//! 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/rust/automerge/src/error.rs b/rust/automerge/src/error.rs deleted file mode 100644 index 62a7b72f..00000000 --- a/rust/automerge/src/error.rs +++ /dev/null @@ -1,107 +0,0 @@ -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 deleted file mode 100644 index 3a5a2ca2..00000000 --- a/rust/automerge/src/exid.rs +++ /dev/null @@ -1,224 +0,0 @@ -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 deleted file mode 100644 index b907a6f1..00000000 --- a/rust/automerge/src/indexed_cache.rs +++ /dev/null @@ -1,137 +0,0 @@ -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 deleted file mode 100644 index 838015ef..00000000 --- a/rust/automerge/src/keys.rs +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index fd747bbc..00000000 --- a/rust/automerge/src/keys_at.rs +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index 6e6acec5..00000000 --- a/rust/automerge/src/legacy/mod.rs +++ /dev/null @@ -1,276 +0,0 @@ -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/rust/automerge/src/legacy/utility_impls/mod.rs b/rust/automerge/src/legacy/utility_impls/mod.rs deleted file mode 100644 index 99fa1750..00000000 --- a/rust/automerge/src/legacy/utility_impls/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod element_id; -mod key; -mod object_id; -mod opid; diff --git a/rust/automerge/src/lib.rs b/rust/automerge/src/lib.rs deleted file mode 100644 index cbb535af..00000000 --- a/rust/automerge/src/lib.rs +++ /dev/null @@ -1,301 +0,0 @@ -//! # 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 deleted file mode 100644 index a043da72..00000000 --- a/rust/automerge/src/list_range.rs +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index ce8f5a46..00000000 --- a/rust/automerge/src/list_range_at.rs +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index ad33ebf5..00000000 --- a/rust/automerge/src/map_range.rs +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index 8d008e89..00000000 --- a/rust/automerge/src/map_range_at.rs +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index 5b33c21f..00000000 --- a/rust/automerge/src/op_observer.rs +++ /dev/null @@ -1,392 +0,0 @@ -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 deleted file mode 100644 index 92fe3b1e..00000000 --- a/rust/automerge/src/op_observer/compose.rs +++ /dev/null @@ -1,102 +0,0 @@ -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 deleted file mode 100644 index aab8ce74..00000000 --- a/rust/automerge/src/op_set.rs +++ /dev/null @@ -1,405 +0,0 @@ -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 deleted file mode 100644 index e14f46b7..00000000 --- a/rust/automerge/src/op_set/load.rs +++ /dev/null @@ -1,52 +0,0 @@ -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 deleted file mode 100644 index 7de00dc3..00000000 --- a/rust/automerge/src/op_tree.rs +++ /dev/null @@ -1,373 +0,0 @@ -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 deleted file mode 100644 index 0b19f359..00000000 --- a/rust/automerge/src/op_tree/iter.rs +++ /dev/null @@ -1,442 +0,0 @@ -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 deleted file mode 100644 index ed1b7646..00000000 --- a/rust/automerge/src/op_tree/node.rs +++ /dev/null @@ -1,492 +0,0 @@ -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 deleted file mode 100644 index e1c5cc66..00000000 --- a/rust/automerge/src/parents.rs +++ /dev/null @@ -1,121 +0,0 @@ -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 deleted file mode 100644 index 640ecf8d..00000000 --- a/rust/automerge/src/query.rs +++ /dev/null @@ -1,362 +0,0 @@ -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 deleted file mode 100644 index cb559216..00000000 --- a/rust/automerge/src/query/elem_id_pos.rs +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 0dc0e98d..00000000 --- a/rust/automerge/src/query/insert.rs +++ /dev/null @@ -1,125 +0,0 @@ -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 deleted file mode 100644 index edda4fe9..00000000 --- a/rust/automerge/src/query/keys.rs +++ /dev/null @@ -1,54 +0,0 @@ -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 deleted file mode 100644 index bf5b5e0e..00000000 --- a/rust/automerge/src/query/keys_at.rs +++ /dev/null @@ -1,61 +0,0 @@ -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 deleted file mode 100644 index 9134b11f..00000000 --- a/rust/automerge/src/query/len.rs +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 9380501e..00000000 --- a/rust/automerge/src/query/len_at.rs +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100644 index d01082ab..00000000 --- a/rust/automerge/src/query/list_range.rs +++ /dev/null @@ -1,67 +0,0 @@ -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 deleted file mode 100644 index 33cdf548..00000000 --- a/rust/automerge/src/query/list_range_at.rs +++ /dev/null @@ -1,70 +0,0 @@ -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 deleted file mode 100644 index 6c056621..00000000 --- a/rust/automerge/src/query/list_vals.rs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 57c7596b..00000000 --- a/rust/automerge/src/query/list_vals_at.rs +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100644 index 909312db..00000000 --- a/rust/automerge/src/query/map_range.rs +++ /dev/null @@ -1,106 +0,0 @@ -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 deleted file mode 100644 index c5c5af06..00000000 --- a/rust/automerge/src/query/map_range_at.rs +++ /dev/null @@ -1,119 +0,0 @@ -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 deleted file mode 100644 index ed374b9b..00000000 --- a/rust/automerge/src/query/nth.rs +++ /dev/null @@ -1,127 +0,0 @@ -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 deleted file mode 100644 index e193ca03..00000000 --- a/rust/automerge/src/query/nth_at.rs +++ /dev/null @@ -1,67 +0,0 @@ -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 deleted file mode 100644 index 3d4c8b24..00000000 --- a/rust/automerge/src/query/opid.rs +++ /dev/null @@ -1,54 +0,0 @@ -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 deleted file mode 100644 index c0d2cc89..00000000 --- a/rust/automerge/src/query/opid_vis.rs +++ /dev/null @@ -1,62 +0,0 @@ -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 deleted file mode 100644 index d2a11361..00000000 --- a/rust/automerge/src/query/prop.rs +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100644 index f0c2eedc..00000000 --- a/rust/automerge/src/query/prop_at.rs +++ /dev/null @@ -1,63 +0,0 @@ -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 deleted file mode 100644 index 2ed875d2..00000000 --- a/rust/automerge/src/query/seek_op.rs +++ /dev/null @@ -1,247 +0,0 @@ -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 deleted file mode 100644 index cd30f5bb..00000000 --- a/rust/automerge/src/query/seek_op_with_patch.rs +++ /dev/null @@ -1,291 +0,0 @@ -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 deleted file mode 100644 index 6d479718..00000000 --- a/rust/automerge/src/read.rs +++ /dev/null @@ -1,199 +0,0 @@ -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 deleted file mode 100644 index 5b3d03a7..00000000 --- a/rust/automerge/src/storage.rs +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 61db0b00..00000000 --- a/rust/automerge/src/storage/change.rs +++ /dev/null @@ -1,511 +0,0 @@ -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 deleted file mode 100644 index 61f1221d..00000000 --- a/rust/automerge/src/storage/change/change_actors.rs +++ /dev/null @@ -1,304 +0,0 @@ -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 deleted file mode 100644 index 86ec59c2..00000000 --- a/rust/automerge/src/storage/change/change_op_columns.rs +++ /dev/null @@ -1,499 +0,0 @@ -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 deleted file mode 100644 index 55d56ffb..00000000 --- a/rust/automerge/src/storage/change/compressed.rs +++ /dev/null @@ -1,51 +0,0 @@ -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/rust/automerge/src/storage/chunk.rs b/rust/automerge/src/storage/chunk.rs deleted file mode 100644 index d0048528..00000000 --- a/rust/automerge/src/storage/chunk.rs +++ /dev/null @@ -1,293 +0,0 @@ -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 deleted file mode 100644 index 2ff6fa1f..00000000 --- a/rust/automerge/src/storage/columns.rs +++ /dev/null @@ -1,355 +0,0 @@ -/// 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 deleted file mode 100644 index 6f834439..00000000 --- a/rust/automerge/src/storage/columns/column.rs +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100644 index 5cc41a21..00000000 --- a/rust/automerge/src/storage/columns/column_builder.rs +++ /dev/null @@ -1,199 +0,0 @@ -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 deleted file mode 100644 index 5bde0e7a..00000000 --- a/rust/automerge/src/storage/columns/column_specification.rs +++ /dev/null @@ -1,285 +0,0 @@ -/// 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 deleted file mode 100644 index ac9a5759..00000000 --- a/rust/automerge/src/storage/columns/raw_column.rs +++ /dev/null @@ -1,272 +0,0 @@ -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 deleted file mode 100644 index 48f83d03..00000000 --- a/rust/automerge/src/storage/convert.rs +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 00b5e940..00000000 --- a/rust/automerge/src/storage/convert/op_as_changeop.rs +++ /dev/null @@ -1,128 +0,0 @@ -/// 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 deleted file mode 100644 index 8d237354..00000000 --- a/rust/automerge/src/storage/convert/op_as_docop.rs +++ /dev/null @@ -1,145 +0,0 @@ -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 deleted file mode 100644 index ecef0bfd..00000000 --- a/rust/automerge/src/storage/document.rs +++ /dev/null @@ -1,343 +0,0 @@ -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 deleted file mode 100644 index 2f0e96ce..00000000 --- a/rust/automerge/src/storage/document/compression.rs +++ /dev/null @@ -1,356 +0,0 @@ -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 deleted file mode 100644 index 93fa28e3..00000000 --- a/rust/automerge/src/storage/document/doc_change_columns.rs +++ /dev/null @@ -1,339 +0,0 @@ -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 deleted file mode 100644 index 82de17eb..00000000 --- a/rust/automerge/src/storage/document/doc_op_columns.rs +++ /dev/null @@ -1,450 +0,0 @@ -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 deleted file mode 100644 index 80ab3d82..00000000 --- a/rust/automerge/src/storage/load.rs +++ /dev/null @@ -1,120 +0,0 @@ -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 deleted file mode 100644 index d05367a9..00000000 --- a/rust/automerge/src/storage/load/change_collector.rs +++ /dev/null @@ -1,222 +0,0 @@ -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 deleted file mode 100644 index 44ace72a..00000000 --- a/rust/automerge/src/storage/load/reconstruct_document.rs +++ /dev/null @@ -1,391 +0,0 @@ -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 deleted file mode 100644 index 6751afb4..00000000 --- a/rust/automerge/src/storage/parse.rs +++ /dev/null @@ -1,595 +0,0 @@ -//! 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 deleted file mode 100644 index 9f5e72a2..00000000 --- a/rust/automerge/src/storage/parse/leb128.rs +++ /dev/null @@ -1,302 +0,0 @@ -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 deleted file mode 100644 index 4921bd35..00000000 --- a/rust/automerge/src/storage/save.rs +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index f27d920d..00000000 --- a/rust/automerge/src/storage/save/document.rs +++ /dev/null @@ -1,146 +0,0 @@ -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 deleted file mode 100644 index d6dc2580..00000000 --- a/rust/automerge/src/sync.rs +++ /dev/null @@ -1,963 +0,0 @@ -//! # 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/rust/automerge/src/sync/state.rs b/rust/automerge/src/sync/state.rs deleted file mode 100644 index 354c605f..00000000 --- a/rust/automerge/src/sync/state.rs +++ /dev/null @@ -1,110 +0,0 @@ -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 deleted file mode 100644 index b513bc63..00000000 --- a/rust/automerge/src/transaction.rs +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index d2873af3..00000000 --- a/rust/automerge/src/transaction/commit.rs +++ /dev/null @@ -1,32 +0,0 @@ -/// 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 deleted file mode 100644 index 0fe735d5..00000000 --- a/rust/automerge/src/transaction/inner.rs +++ /dev/null @@ -1,731 +0,0 @@ -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 deleted file mode 100644 index fa5f6340..00000000 --- a/rust/automerge/src/transaction/manual_transaction.rs +++ /dev/null @@ -1,348 +0,0 @@ -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 deleted file mode 100644 index 53723711..00000000 --- a/rust/automerge/src/transaction/observation.rs +++ /dev/null @@ -1,80 +0,0 @@ -//! 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 deleted file mode 100644 index 5327ff44..00000000 --- a/rust/automerge/src/transaction/result.rs +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 05c48c79..00000000 --- a/rust/automerge/src/transaction/transactable.rs +++ /dev/null @@ -1,93 +0,0 @@ -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 deleted file mode 100644 index 468986ec..00000000 --- a/rust/automerge/src/types.rs +++ /dev/null @@ -1,844 +0,0 @@ -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 deleted file mode 100644 index a81ccb36..00000000 --- a/rust/automerge/src/types/opids.rs +++ /dev/null @@ -1,198 +0,0 @@ -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 deleted file mode 100644 index be128787..00000000 --- a/rust/automerge/src/value.rs +++ /dev/null @@ -1,748 +0,0 @@ -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 deleted file mode 100644 index 15ccb4cb..00000000 --- a/rust/automerge/src/values.rs +++ /dev/null @@ -1,57 +0,0 @@ -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 deleted file mode 100644 index 31e9bbdb..00000000 --- a/rust/automerge/src/visualisation.rs +++ /dev/null @@ -1,280 +0,0 @@ -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 deleted file mode 100644 index 700342a2..00000000 Binary files a/rust/automerge/tests/fixtures/64bit_obj_id_change.automerge and /dev/null differ diff --git a/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge b/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge deleted file mode 100644 index 6beb57fe..00000000 Binary files a/rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge and /dev/null 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 deleted file mode 100644 index 2290b446..00000000 Binary files a/rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge and /dev/null differ diff --git a/rust/automerge/tests/fixtures/counter_value_is_ok.automerge b/rust/automerge/tests/fixtures/counter_value_is_ok.automerge deleted file mode 100644 index fdc59896..00000000 Binary files a/rust/automerge/tests/fixtures/counter_value_is_ok.automerge and /dev/null differ diff --git a/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge b/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge deleted file mode 100644 index 831346f7..00000000 Binary files a/rust/automerge/tests/fixtures/counter_value_is_overlong.automerge and /dev/null differ diff --git a/rust/automerge/tests/fixtures/two_change_chunks.automerge b/rust/automerge/tests/fixtures/two_change_chunks.automerge deleted file mode 100644 index 1a84b363..00000000 Binary files a/rust/automerge/tests/fixtures/two_change_chunks.automerge and /dev/null differ diff --git a/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge b/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge deleted file mode 100644 index 9e3f305f..00000000 Binary files a/rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge and /dev/null 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 deleted file mode 100644 index 9ba0355f..00000000 Binary files a/rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/action-is-48.automerge b/rust/automerge/tests/fuzz-crashers/action-is-48.automerge deleted file mode 100644 index 16e6f719..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/action-is-48.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 b/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 deleted file mode 100644 index bcb12cdd..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge b/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge deleted file mode 100644 index 05cc2c82..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge b/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge deleted file mode 100644 index 21e869eb..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_actor.automerge b/rust/automerge/tests/fuzz-crashers/missing_actor.automerge deleted file mode 100644 index cc8c61b1..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/missing_actor.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps.automerge deleted file mode 100644 index 8a57a0f4..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/missing_deps.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge deleted file mode 100644 index 2c7b123b..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/missing_deps_compressed.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge b/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge deleted file mode 100644 index 2fe439af..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/missing_deps_subsequent.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge b/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge deleted file mode 100644 index 45771f34..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge b/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge deleted file mode 100644 index 657ce993..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/too_many_deps.automerge and /dev/null differ diff --git a/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge b/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge deleted file mode 100644 index 661258b0..00000000 Binary files a/rust/automerge/tests/fuzz-crashers/too_many_ops.automerge and /dev/null differ diff --git a/rust/automerge/tests/test.rs b/rust/automerge/tests/test.rs deleted file mode 100644 index 3be6725e..00000000 --- a/rust/automerge/tests/test.rs +++ /dev/null @@ -1,1499 +0,0 @@ -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 deleted file mode 100644 index 473cdae8..00000000 --- a/rust/deny.toml +++ /dev/null @@ -1,216 +0,0 @@ -# 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 deleted file mode 100644 index 55778aca..00000000 --- a/rust/edit-trace/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/target -Cargo.lock -node_modules -yarn.lock -flamegraph.svg -/prof diff --git a/rust/edit-trace/Cargo.toml b/rust/edit-trace/Cargo.toml deleted file mode 100644 index eaebde46..00000000 --- a/rust/edit-trace/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[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 deleted file mode 100644 index e0e77643..00000000 --- a/rust/edit-trace/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -.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 deleted file mode 100644 index aabe83dc..00000000 --- a/rust/edit-trace/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# 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 deleted file mode 100644 index 49a423a4..00000000 --- a/rust/edit-trace/automerge-1.0.js +++ /dev/null @@ -1,26 +0,0 @@ - -// 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 deleted file mode 100644 index 2956d5d5..00000000 --- a/rust/edit-trace/automerge-js.js +++ /dev/null @@ -1,29 +0,0 @@ -// 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 deleted file mode 100644 index 8f6f51af..00000000 --- a/rust/edit-trace/automerge-wasm.js +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index b99f0ae7..00000000 --- a/rust/edit-trace/baseline.js +++ /dev/null @@ -1,23 +0,0 @@ -// 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 deleted file mode 100644 index 00028945..00000000 --- a/rust/edit-trace/benches/main.rs +++ /dev/null @@ -1,122 +0,0 @@ -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 deleted file mode 100644 index aadf32ad..00000000 --- a/rust/edit-trace/editing-trace.js +++ /dev/null @@ -1,259783 +0,0 @@ -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/rust/edit-trace/package.json b/rust/edit-trace/package.json deleted file mode 100644 index acd37ac0..00000000 --- a/rust/edit-trace/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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 deleted file mode 100644 index 9724a109..00000000 --- a/rust/edit-trace/src/main.rs +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100755 index 6da4a578..00000000 --- a/scripts/ci/advisory +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 deleted file mode 100755 index de592f7e..00000000 --- a/scripts/ci/build-test +++ /dev/null @@ -1,7 +0,0 @@ -#!/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 deleted file mode 100755 index 25a69756..00000000 --- a/scripts/ci/cmake-build +++ /dev/null @@ -1,19 +0,0 @@ -#!/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 deleted file mode 100755 index 9f297557..00000000 --- a/scripts/ci/deno_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/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 deleted file mode 100755 index 27235f92..00000000 --- a/scripts/ci/fmt +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -eoux pipefail - -cd rust -cargo fmt -- --check diff --git a/scripts/ci/fmt_js b/scripts/ci/fmt_js deleted file mode 100755 index 8f387b6a..00000000 --- a/scripts/ci/fmt_js +++ /dev/null @@ -1,7 +0,0 @@ -#!/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 deleted file mode 100755 index 68205a33..00000000 --- a/scripts/ci/js_tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/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 deleted file mode 100755 index 87a16765..00000000 --- a/scripts/ci/lint +++ /dev/null @@ -1,11 +0,0 @@ -#!/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 deleted file mode 100755 index aebfe4c4..00000000 --- a/scripts/ci/run +++ /dev/null @@ -1,13 +0,0 @@ -#!/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 deleted file mode 100755 index 4be0ed9a..00000000 --- a/scripts/ci/rust-docs +++ /dev/null @@ -1,8 +0,0 @@ -#!/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 deleted file mode 100755 index fac344d8..00000000 --- a/scripts/ci/wasm_tests +++ /dev/null @@ -1,7 +0,0 @@ -# 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;